Index: /trunk/Mars/mcorsika/MCorsikaFormat.cc
===================================================================
--- /trunk/Mars/mcorsika/MCorsikaFormat.cc	(revision 19328)
+++ /trunk/Mars/mcorsika/MCorsikaFormat.cc	(revision 19329)
@@ -40,7 +40,4 @@
 
 
-const unsigned int MCorsikaFormat::kMagicNumber = 0x5994;
-const unsigned int MCorsikaFormat::kSyncMarker  = 0xd41f8a37;
-
 // --------------------------------------------------------------------------
 //
@@ -58,33 +55,35 @@
     }
 
-    char *buffer = new char[5];
-    memset(buffer, 0, 5);
-    fileIn->read(buffer, 4);
+    uint32_t magic = 0;
+    fileIn->read((char*)&magic, 4);
+
+    uint32_t blocklength = 0;
 
     // This seems to be a new corsika binary identifier
-    const bool hasMagicNumber = *reinterpret_cast<unsigned int*>(buffer) == kMagicNumber;
-    if (hasMagicNumber)
-        fileIn->read(buffer, 4);
-
+    if (magic==kBlockLengthRaw || magic==kBlockLengthThin)
+    {
+        blocklength = magic;
+        fileIn->read((char*)&magic, 4);
+    }
+
+    // Jump back that the "RUNH" is can be read again
     fileIn->seekg(-4, ios::cur);
 
-    if (strcmp(buffer, "RUNH") == 0)
-    {
-        delete [] buffer;
-        gLog << inf2 << "Corsika RAW format detected." << endl;
-        return new MCorsikaFormatRaw(fileIn, hasMagicNumber);
-    }
-
-    if (*reinterpret_cast<unsigned int*>(buffer) == kSyncMarker)
-    {
-        delete [] buffer;
+    if (magic==kRUNH)
+    {
+        gLog << inf2 << "Corsika RAW" << (blocklength==kBlockLengthThin?"(+THIN)":"") << " format detected." << endl;
+        return new MCorsikaFormatRaw(fileIn, blocklength);
+    }
+
+    if (magic==kSyncMarker)
+    {
         gLog << inf2 << "Corsika EventIO format detected." << endl;
         return new MCorsikaFormatEventIO(fileIn);
     }
 
-    gLog << err << "File " << fileName <<
-            " is neither a CORSIKA raw nor EventIO file" << endl;
+    gLog << err << "File " << fileName << Form(" (%08x) ", magic);
+    gLog << "is neither a CORSIKA raw nor EventIO file" << endl;
+
     delete fileIn;
-    delete [] buffer;
 
     return NULL;
@@ -124,6 +123,6 @@
 {
 
-    int blockHeader = 22932;
-    while (blockHeader==22932)
+    uint32_t blockHeader = fBlockLength;
+    while (blockHeader==fBlockLength)
     {
         fIn->read((char*)&blockHeader, 4);
@@ -134,15 +133,19 @@
     blockVersion = 0;
     blockIdentifier = 0;
-    blockLength     = 272 * 4;
+    blockLength     = fBlockLength/21 - 4;
+
+//    cout << "P=" << fIn->tellg() << " L=" <<blockLength << " " << hex << blockHeader << dec << " " << fIn->eof() << endl;
 
     switch(blockHeader)
       {
-      case 1213093202 : // RUNH
+      case kRUNH:
          blockType = 1200;
          break;
-      case 1162761554 : // RUNE
+
+      case kRUNE:
          blockType = 1210;
          break;
-      case 1213486661 : // EVTH
+
+      case kEVTH:
          if (readState != 10)
             blockType = 1202;     // event header (where readstate := 2)
@@ -154,7 +157,9 @@
             }
          break;
-      case 1163155013 : // EVTE
+
+      case kEVTE:
          blockType = 1209;
          break;
+
       default:          // the events, they don't have a specific header
          blockType = 1105;                  // raw data
@@ -168,13 +173,21 @@
 Bool_t MCorsikaFormatRaw::SeekEvtEnd()
 {
+    const uint32_t step   = fBlockLength/21;
+    const uint32_t offset = fBlockLength?4:0;
+
+//    cout << fIn->bad() << " " << fIn->eof() << " " << fIn->tellg() << endl;
+
     // Search subblockwise backward (Block: 5733*4 = 21*273*4)
-    for (int i=1; i<22; i++)
-    {
-        fIn->seekg(-i*273*4-(fHasMagicNumber?4:0), ios::end);
-
-        char runh[5]="\0\0\0\0";
-        fIn->read(runh, 4);
-
-        if (!strcmp(runh, "RUNE"))
+    for (uint32_t i=1; i<22; i++)
+    {
+        const int32_t L = i*step + offset;
+        fIn->seekg(-L, ios::end);
+
+        uint32_t magic = 0;
+        fIn->read((char*)&magic, 4);
+
+//        cout << dec << L << " " << fIn->tellg() << " " << hex << magic << endl;
+
+        if (magic==kRUNE)
         {
 //            fIn->seekg(-4, ios::cur);
