Index: /trunk/Mars/mcore/zfits.h
===================================================================
--- /trunk/Mars/mcore/zfits.h	(revision 16854)
+++ /trunk/Mars/mcore/zfits.h	(revision 16855)
@@ -15,12 +15,4 @@
 
 
-#define FACT_RAW       0x0
-#define FACT_SMOOTHING 0x1
-#define FACT_HUFFMAN16 0x2
-
-#define FACT_COL_MAJOR 'C'
-#define FACT_ROW_MAJOR 'R'
-
-
 #ifndef __MARS__
 namespace std
@@ -35,7 +27,4 @@
     zfits(const string& fname, const string& tableName="",
           bool force=false) : fits(fname, tableName, force),
-        fBuffer(0),
-        fTransposedBuffer(0),
-        fCompressedBuffer(0),
         fNumTiles(0),
         fNumRowsPerTile(0),
@@ -50,7 +39,4 @@
     zfits(const string& fname, const string& fout, const string& tableName,
           bool force=false) : fits(fname, fout, tableName, force),
-              fBuffer(0),
-              fTransposedBuffer(0),
-              fCompressedBuffer(0),
               fNumTiles(0),
               fNumRowsPerTile(0),
@@ -87,7 +73,7 @@
 
 private:
-
+#ifndef __CINT__
     //Structure helper for reading tiles headers
-    typedef struct TileHeader
+    struct TileHeader
     {
       char     id[4];
@@ -102,8 +88,8 @@
                                  size(s)
       { };
-    } __attribute__((__packed__)) TileHeader;
+    } __attribute__((__packed__));
 
     //Structure helper for reading blocks headers and compresion schemes
-    typedef struct BlockHeader
+    struct BlockHeader
     {
         uint64_t      size;
@@ -113,11 +99,11 @@
 
         BlockHeader(uint64_t      s=0,
-                    char          o=FACT_ROW_MAJOR,
+                    char          o='R'/*FACT_ROW_MAJOR*/,
                     unsigned char n=1) : size(s),
                                          ordering(o),
                                          numProcs(n)
         {}
-    } __attribute__((__packed__)) BlockHeader;
-
+    } __attribute__((__packed__));
+#endif
     // Do what it takes to initialize the compressed structured
     void InitCompressionReading()
@@ -134,8 +120,9 @@
             if (it->comp != FACT)
             {
+                    clear(rdstate()|ios::badbit);
 #ifdef __EXCEPTIONS
-                    throw runtime_error("ERROR: Only the FACT compression scheme is handled by this reader.");
+                    throw runtime_error("Only the FACT compression scheme is handled by this reader.");
 #else
-                    gLog << ___err___ << "ERROR: Only the FACT compression scheme is handled by this reader." << endl;
+                    gLog << ___err___ << "ERROR - Only the FACT compression scheme is handled by this reader." << endl;
                     return;
 #endif
@@ -144,5 +131,6 @@
         fColumnOrdering.resize(fTable.sortedCols.size());
         for (auto it=fColumnOrdering.begin(); it != fColumnOrdering.end(); it++)
-            (*it) = FACT_ROW_MAJOR;
+            (*it) = 'R';//FACT_ROW_MAJOR;
+
         //Get compressed specific keywords
         fNumTiles       = fTable.isCompressed ? GetInt("NAXIS2") : 0;
@@ -273,5 +261,4 @@
         const uint32_t requestedTile = rowNum/fNumRowsPerTile;
         const uint32_t currentTile   = fCurrentRow/fNumRowsPerTile;
-        const size_t   previousRow   = fCurrentRow;
 
         fCurrentRow = rowNum;
@@ -285,4 +272,5 @@
             //skip to the beginning of the tile
             seekg(fHeapOff+fCatalog[requestedTile][0].second - sizeof(TileHeader));
+
             TileHeader tHead;
             read((char*)(&tHead), sizeof(TileHeader));
@@ -317,5 +305,5 @@
                 switch (fColumnOrdering[i])
                 {
-                    case FACT_ROW_MAJOR:
+                case 'R': //FACT_ROW_MAJOR:
                         // regular, "semi-transposed" copy
                         for (char *dest=buffer; dest<buffer+thisRoundNumRows*fTable.bytes_per_row; dest+=fTable.bytes_per_row) // row-by-row
@@ -326,5 +314,5 @@
                     break;
 
-                    case FACT_COL_MAJOR:
+                case 'C'://FACT_COL_MAJOR:
                         // transposed copy
                         for (char *elem=buffer; elem<buffer+it->bytes; elem+=it->size) // element-by-element (arrays)
@@ -338,9 +326,10 @@
                     break;
                     default:
+                        clear(rdstate()|ios::badbit);
     #ifdef __EXCEPTIONS
                         throw runtime_error("Unkown column ordering scheme");
     #else
                         gLog << ___err___ << "ERROR - unkown column ordering scheme" << endl;
-                        return;
+                        return false;
     #endif
                     break;
@@ -417,10 +406,10 @@
             const int64_t compressedOffset = fTileOffsets[catalogCurrentRow][i];
 
-            BlockHeader* head = reinterpret_cast<BlockHeader*>(&fCompressedBuffer[compressedOffset]);
+            const BlockHeader* head = reinterpret_cast<BlockHeader*>(&fCompressedBuffer[compressedOffset]);
 
             fColumnOrdering[i] = head->ordering;
 
-            uint32_t numRows = (head->ordering==FACT_ROW_MAJOR) ? thisRoundNumRows : col.num;
-            uint32_t numCols = (head->ordering==FACT_COL_MAJOR) ? thisRoundNumRows : col.num;
+            const uint32_t numRows = (head->ordering=='R'/*FACT_ROW_MAJOR*/) ? thisRoundNumRows : col.num;
+            const uint32_t numCols = (head->ordering=='C'/*FACT_COL_MAJOR*/) ? thisRoundNumRows : col.num;
 
             const char *src = fCompressedBuffer.data()+compressedOffset+sizeof(BlockHeader)+sizeof(uint16_t)*head->numProcs;
@@ -432,14 +421,15 @@
                 switch (head->processings[j])
                 {
-                    case FACT_RAW:
+                case 0x0://FACT_RAW:
                             sizeWritten = UncompressUNCOMPRESSED(dest, src, numRows*numCols, col.size);
                     break;
-                    case FACT_SMOOTHING:
+                case 0x1://FACT_SMOOTHING:
                             sizeWritten = UnApplySMOOTHING(reinterpret_cast<int16_t*>(dest), numRows*numCols);
                     break;
-                    case FACT_HUFFMAN16:
+                case 0x2://FACT_HUFFMAN16:
                             sizeWritten = UncompressHUFFMAN16(dest, src, numRows);
                     break;
                     default:
+                        clear(rdstate()|ios::badbit);
 #ifdef __EXCEPTIONS
                     throw runtime_error("Unknown processing applied to data. Aborting");
@@ -448,5 +438,4 @@
                     return;
 #endif
-                    break;
                 }
                 //increment destination counter only when processing done.
@@ -481,10 +470,9 @@
                 break;
             //padding or corrupt data
-            if (tileHead.id[0] != 'T' || tileHead.id[1] != 'I' ||
-                tileHead.id[2] != 'L' || tileHead.id[3] != 'E')
+            if (memcmp(tileHead.id, "TILE", 4))
                 break;
 
             //a new tile begins here
-            catalog.push_back(vector<pair<int64_t, int64_t> >(0));
+            catalog.emplace_back(0);//push_back(vector<pair<int64_t, int64_t> >(0));
             offsetInHeap += sizeof(TileHeader);
 
@@ -495,5 +483,5 @@
                 if (fTable.sortedCols[i].num == 0)
                 {
-                    catalog.back().push_back(make_pair(0,0));
+                    catalog.back().emplace_back(0,0);
                     continue;
                 }
@@ -503,5 +491,5 @@
                 if (!good())
                     break;
-                catalog.back().emplace_back(make_pair((int64_t)(columnHead.size),offsetInHeap));
+                catalog.back().emplace_back(int64_t(columnHead.size),offsetInHeap);
                 offsetInHeap += columnHead.size;
                 seekg(fHeapOff+offsetInHeap);
@@ -522,6 +510,7 @@
             numRows        != fTable.num_rows)
         {
+                    clear(rdstate()|ios::badbit);
 #ifdef __EXCEPTIONS
-                    throw runtime_error("Heap data does not agree with header. Aborting");
+                    throw runtime_error("Heap data does not agree with header.");
 #else
                     gLog << ___err___ << "ERROR - Heap data does not agree with header." << endl;
@@ -536,6 +525,7 @@
                     catalog[i][j].second != fCatalog[i][j].second)
                 {
+                    clear(rdstate()|ios::badbit);
 #ifdef __EXCEPTIONS
-                    throw runtime_error("Heap data does not agree with header. Aborting");
+                    throw runtime_error("Heap data does not agree with header.");
 #else
                     gLog << ___err___ << "ERROR - Heap data does not agree with header." << endl;
