Index: trunk/Mars/mcore/zfits.h
===================================================================
--- trunk/Mars/mcore/zfits.h	(revision 16820)
+++ trunk/Mars/mcore/zfits.h	(revision 16825)
@@ -123,4 +123,7 @@
     void InitCompressionReading()
     {
+        if (!fTable.isCompressed)
+            return;
+
         //The constructor may have failed
         if (!good())
@@ -151,4 +154,7 @@
         //read the file's catalog
         ReadCatalog();
+
+        //check that heap agrees with head
+        //CheckIfFileIsConsistent();
     }
 
@@ -183,7 +189,4 @@
     void AllocateBuffers()
     {
-        if (!fTable.isCompressed)
-            return;
-
         fBuffer.resize(fTable.bytes_per_row*fNumRowsPerTile);
 
@@ -195,7 +198,4 @@
     void ReadCatalog()
     {
-        if (!fTable.isCompressed)
-            return;
-
         char readBuf[16];
         fCatalog.resize(fNumTiles);
@@ -455,4 +455,96 @@
     }
 
+    void CheckIfFileIsConsistent()
+    {
+        //goto start of heap
+        streamoff whereAreWe = tellg();
+        seekg(fHeapOff);
+
+        //init number of rows to zero
+        uint64_t numRows = 0;
+
+        //get number of columns from header
+        size_t numCols = fTable.num_cols;
+
+        vector<vector<pair<int64_t, int64_t> > > catalog;
+
+        TileHeader tileHead;
+        BlockHeader columnHead;
+        streamoff offsetInHeap = 0;
+        //skip through the heap
+        while (true)
+        {
+            read((char*)(&tileHead), sizeof(TileHeader));
+            //end of file
+            if (!good())
+                break;
+            //padding or corrupt data
+            if (tileHead.id[0] != 'T' || tileHead.id[1] != 'I' ||
+                tileHead.id[2] != 'L' || tileHead.id[3] != 'E')
+                break;
+
+            //a new tile begins here
+            catalog.push_back(vector<pair<int64_t, int64_t> >(0));
+            offsetInHeap += sizeof(TileHeader);
+
+            //skip through the columns
+            for (size_t i=0;i<numCols;i++)
+            {
+                //zero sized column do not have headers. Skip it
+                if (fTable.sortedCols[i].num == 0)
+                {
+                    catalog.back().push_back(make_pair(0,0));
+                    continue;
+                }
+                //read column header
+                read((char*)(&columnHead), sizeof(BlockHeader));
+                //corrupted tile
+                if (!good())
+                    break;
+                catalog.back().push_back(make_pair((int64_t)(columnHead.size),offsetInHeap));
+                offsetInHeap += columnHead.size;
+                seekg(fHeapOff+offsetInHeap);
+            }
+
+            //if we ain't good, this means that something went wrong inside the current tile.
+            if (!good())
+            {
+                break;
+                catalog.pop_back();
+            }
+
+            //current tile is complete. Add rows
+            numRows += tileHead.numRows;
+        }
+
+        if (catalog.size() != fCatalog.size() ||
+            numRows        != fTable.num_rows)
+        {
+#ifdef __EXCEPTIONS
+                    throw runtime_error("Heap data does not agree with header. Aborting");
+#else
+                    gLog << ___err___ << "ERROR - Heap data does not agree with header." << endl;
+                    return;
+#endif
+        }
+
+        for (uint32_t i=0;i<catalog.size(); i++)
+            for (uint32_t j=0;j<numCols;j++)
+            {
+                if (catalog[i][j].first  != fCatalog[i][j].first ||
+                    catalog[i][j].second != fCatalog[i][j].second)
+                {
+#ifdef __EXCEPTIONS
+                    throw runtime_error("Heap data does not agree with header. Aborting");
+#else
+                    gLog << ___err___ << "ERROR - Heap data does not agree with header." << endl;
+                    return;
+#endif
+                }
+            }
+        //go back to start of heap
+        seekg(whereAreWe);
+    }
+
 };//class zfits
 
