]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - RAW/AliMDC.cxx
In AliMUONQADataMakerRec:
[u/mrichter/AliRoot.git] / RAW / AliMDC.cxx
index c0fead6f177ecbe479d4519ff2b68225047028f8..724c235e63a394c891f70bda83c29e1e2cfd23a8 100644 (file)
@@ -1,4 +1,4 @@
-// @(#)alimdc:$Name$:$Id$
+// @(#)alimdc:$Name:  $:$Id$
 // Author: Fons Rademakers  26/11/99
 // Updated: Dario Favretto  15/04/2003
 
@@ -33,8 +33,6 @@
 // AliRawRFIODB or via rootd using AliRawRootdDB or to CASTOR via       //
 // rootd using AliRawCastorDB (and for performance testing there is     //
 // also AliRawNullDB).                                                  //
-// The AliRunDB class provides the interface to the run and file        //
-// catalogues (AliEn or plain MySQL).                                   //
 // The AliStats class provides statics information that is added as     //
 // a single keyed object to each raw file.                              //
 // The AliTagDB provides an interface to a TAG database.                //
 #include <TSystem.h>
 #include <TROOT.h>
 #include <TStopwatch.h>
+#include <TPluginManager.h>
 
 #include <sys/uio.h>
 #ifdef USE_EB
 #include "libDateEb.h"
 #endif
 
+#include "AliMDC.h"
+
 #include <AliLog.h>
-#include <AliESD.h>
+#include <AliESDEvent.h>
 
 #include "AliRawEvent.h"
 #include "AliRawEventHeaderBase.h"
 #include "AliRawRootdDB.h"
 #include "AliRawNullDB.h"
 #include "AliTagDB.h"
-#include "AliRunDB.h"
+#include "AliRawEventTag.h"
 #include "AliFilter.h"
 
-#include "AliMDC.h"
+
 
 ClassImp(AliMDC)
 
@@ -85,23 +86,25 @@ const char* const AliMDC::fgkFilterName[kNFilters] = {"AliHoughFilter"};
 
 //______________________________________________________________________________
 AliMDC::AliMDC(Int_t compress, Bool_t deleteFiles, EFilterMode filterMode, 
-              const char* localRunDB, Bool_t rdbmsRunDB,
-              const char* alienHostRunDB, const char* alienDirRunDB,
-              Double_t maxSizeTagDB, const char* fileNameTagDB) :
+              Double_t maxSizeTagDB, const char* fileNameTagDB,
+              const char *guidFileFolder,
+              Int_t basketsize) :
   fEvent(new AliRawEvent),
   fESD(NULL),
   fStats(NULL),
   fRawDB(NULL),
-  fRunDB(new AliRunDB(localRunDB, rdbmsRunDB, alienHostRunDB, alienDirRunDB)),
   fTagDB(NULL),
+  fEventTag(new AliRawEventTag),
   fCompress(compress),
+  fBasketSize(basketsize),
   fDeleteFiles(deleteFiles),
   fFilterMode(filterMode),
   fFilters(),
   fStop(kFALSE),
   fIsTagDBCreated(kFALSE),
   fMaxSizeTagDB(maxSizeTagDB),
-  fFileNameTagDB(fileNameTagDB)
+  fFileNameTagDB(fileNameTagDB),
+  fGuidFileFolder(guidFileFolder)
 {
   // Create MDC processor object.
   // compress is the file compression mode.
@@ -111,33 +114,38 @@ AliMDC::AliMDC(Int_t compress, Bool_t deleteFiles, EFilterMode filterMode,
   // kFilterTransparent the algorthims will be run but no events will be
   // rejected, if it is kFilterOn the filters will be run and the event will
   // be rejected if all filters return kFALSE.
-  // localRunDB is the file name of the local run DB; if NULL no local run DB
-  // will be created.
-  // The filling of a MySQL run DB can be switch on or off with rdbmsRunDB.
-  // The host and directory name of the alien run DB can be specified by
-  // alienHostRunDB and alienDirRunDB; if NULL no alien DB will be filled.
   // If maxSizeTagDB is greater than 0 it determines the maximal size of the
   // tag DB and then fileNameTagDB is the directory name for the tag DB.
   // Otherwise fileNameTagDB is the file name of the tag DB. If it is NULL
   // no tag DB will be created.
+  // Optional 'guidFileFolder' specifies the folder in which *.guid files
+  // will be stored. In case this option is not given, the *.guid files
+  // will be written to the same folder as the raw-data files.
+
+  // Set the maximum tree size to 19GB
+  // in order to allow big raw data files
+  TTree::SetMaxTreeSize(20000000000LL);
  
+  // This line is needed in case of a stand-alone application w/o
+  // $ROOTSYS/etc/system.rootrc file
+  gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
+                                       "*",
+                                       "TStreamerInfo",
+                                       "RIO",
+                                       "TStreamerInfo()");
 
   if (fFilterMode != kFilterOff) {
-    fESD = new AliESD;
+    fESD = new AliESDEvent();
   }
 
-// Tag DB is now created at the point where the header version is
-// already known
-//   if (fileNameTagDB) {
-//     if (maxSizeTagDB > 0) {
-//       fTagDB = new AliTagDB(fEvent->GetHeader(), NULL);
-//       fTagDB->SetMaxSize(maxSizeTagDB);
-//       fTagDB->SetFS(fileNameTagDB);
-//       fTagDB->Create();
-//     } else {
-//       fTagDB = new AliTagDB(fEvent->GetHeader(), fileNameTagDB);
-//     }
-//   }
+  // Create the guid files folder if it does not exist
+  if (!fGuidFileFolder.IsNull()) {
+    gSystem->ResetErrno();
+    gSystem->MakeDirectory(fGuidFileFolder.Data());
+    if (gSystem->GetErrno() && gSystem->GetErrno() != EEXIST) {
+      SysError("AliMDC", "mkdir %s", fGuidFileFolder.Data());
+    }
+  }
 
   // install SIGUSR1 handler to allow clean interrupts
   gSystem->AddSignalHandler(new AliMDCInterruptHandler(this));
@@ -167,46 +175,30 @@ AliMDC::~AliMDC()
 
   fFilters.Delete();
   if(fTagDB) delete fTagDB;
-  delete fRunDB;
   delete fRawDB;
   delete fStats;
   delete fESD;
   delete fEvent;
+  delete fEventTag;
 }
  
 //______________________________________________________________________________
-AliMDC::AliMDC(const AliMDC& mdc): TObject(mdc)
-{
-// copy constructor
-
-  Fatal("AliMDC", "copy constructor not implemented");
-}
-
-//______________________________________________________________________________
-AliMDC& AliMDC::operator = (const AliMDC& /*mdc*/)
-{
-// assignment operator
-
-  Fatal("operator =", "assignment operator not implemented");
-  return *this;
-}
-
-
-//______________________________________________________________________________
-Int_t AliMDC::Open(EWriteMode mode, const char* fileName)
+Int_t AliMDC::Open(EWriteMode mode, const char* fileName,
+                  Double_t maxFileSize,
+                  const char* fs1, const char* fs2)
 {
 // open a new raw DB file
 
   if (mode == kRFIO)
-    fRawDB = new AliRawRFIODB(fEvent, fESD, fCompress, fileName);
+    fRawDB = new AliRawRFIODB(fEvent, fESD, fCompress, fileName, fBasketSize);
   else if (mode == kROOTD)
-    fRawDB = new AliRawRootdDB(fEvent, fESD, fCompress, fileName);
+    fRawDB = new AliRawRootdDB(fEvent, fESD, fCompress, fileName, fBasketSize);
   else if (mode == kCASTOR)
-    fRawDB = new AliRawCastorDB(fEvent, fESD, fCompress, fileName);
+    fRawDB = new AliRawCastorDB(fEvent, fESD, fCompress, fileName, fBasketSize);
   else if (mode == kDEVNULL)
-    fRawDB = new AliRawNullDB(fEvent, fESD, fCompress, fileName);
+    fRawDB = new AliRawNullDB(fEvent, fESD, fCompress, fileName, fBasketSize);
   else
-    fRawDB = new AliRawDB(fEvent, fESD, fCompress, fileName);
+    fRawDB = new AliRawDB(fEvent, fESD, fCompress, fileName, fBasketSize);
   fRawDB->SetDeleteFiles(fDeleteFiles);
 
   if (fRawDB->IsZombie()) {
@@ -214,6 +206,23 @@ Int_t AliMDC::Open(EWriteMode mode, const char* fileName)
     fRawDB = NULL;
     return -1;
   }
+
+  if (fileName == NULL) {
+    fRawDB->SetMaxSize(maxFileSize);
+    fRawDB->SetFS(fs1, fs2);
+    if (!fRawDB->Create()) {
+      delete fRawDB;
+      fRawDB = NULL;
+      return -1;
+    }
+  }
+
+  if (!fRawDB->WriteGuidFile(fGuidFileFolder)) {
+    delete fRawDB;
+    fRawDB = NULL;
+    return -2;
+  }
+
   Info("Open", "Filling raw DB %s\n", fRawDB->GetDBName());
 
   // Create AliStats object
@@ -231,11 +240,12 @@ Int_t AliMDC::ProcessEvent(void* event, Bool_t isIovecArray)
 // or, if isIovecArray is kTRUE, a pointer to an array of iovecs with one
 // iovec per subevent (used by the event builder).
 // The return value is the number of written bytes or an error code
-  const UInt_t kFileSizeErrorLevel   = 1900000000;
+  const Long64_t kFileSizeErrorLevel   = 19000000000LL;
 
-  UInt_t currentFileSize = GetTotalSize();
+  Long64_t currentFileSize = GetTotalSize();
+  AliDebug(1,Form("current file size is %lld bytes",currentFileSize));
   if(currentFileSize > kFileSizeErrorLevel) {
-    Error("ProcessEvent", "file size (%u) exceeds the limit "
+    Error("ProcessEvent", "file size (%lu) exceeds the limit "
          , currentFileSize);
     return kErrFileSize;
   }
@@ -338,13 +348,14 @@ Int_t AliMDC::ProcessEvent(void* event, Bool_t isIovecArray)
        }
 
       } else {  // Read only raw data but no equipment header
-       AliRawEquipment &equipment = *subEvent->NextEquipment();
-       AliRawData &subRaw = *equipment.GetRawData();
-       if ((status = ReadRawData(subRaw, rawSize, data)) != rawSize) {
-         return kErrEquipment;
+       if (rawSize) {
+         AliRawEquipment &equipment = *subEvent->NextEquipment();
+         AliRawData &subRaw = *equipment.GetRawData();
+         if ((status = ReadRawData(subRaw, rawSize, data)) != rawSize) {
+           return kErrEquipment;
+         }
+         toRead  -= rawSize;
        }
-       toRead  -= rawSize;
-
       }
 
       nsub++;
@@ -374,23 +385,29 @@ Int_t AliMDC::ProcessEvent(void* event, Bool_t isIovecArray)
   // Store raw event in tree
   Int_t nBytes = fRawDB->Fill();
 
+  // Fill the event tag object
+  fEventTag->SetHeader(fEvent->GetHeader());
+  fEventTag->SetGUID(fRawDB->GetDB()->GetUUID().AsString());
+  fEventTag->SetEventNumber(fRawDB->GetEvents()-1);
+
   // Create Tag DB here only after the raw data header
   // version was already identified
   if (!fIsTagDBCreated) {
-    if (fFileNameTagDB) {
+    if (!fFileNameTagDB.IsNull()) {
       if (fMaxSizeTagDB > 0) {
-       fTagDB = new AliTagDB(fEvent->GetHeader(), NULL);
+       fTagDB = new AliTagDB(fEventTag, NULL);
        fTagDB->SetMaxSize(fMaxSizeTagDB);
-       fTagDB->SetFS(fFileNameTagDB);
-       fTagDB->Create();
+       fTagDB->SetFS(fFileNameTagDB.Data());
+       if (!fTagDB->Create()) return kErrTagFile;
       } else {
-       fTagDB = new AliTagDB(fEvent->GetHeader(), fFileNameTagDB);
+       fTagDB = new AliTagDB(fEventTag, fFileNameTagDB.Data());
+       if (fTagDB->IsZombie()) return kErrTagFile;
       }
     }
     fIsTagDBCreated = kTRUE;
   }
 
-  // Store header in tree
+  // Store event tag in tree
   if (fTagDB) fTagDB->Fill();
 
   // Make top event object ready for next event data
@@ -405,7 +422,7 @@ Int_t AliMDC::ProcessEvent(void* event, Bool_t isIovecArray)
 }
 
 //______________________________________________________________________________
-Int_t AliMDC::GetTotalSize()
+Long64_t AliMDC::GetTotalSize()
 {
 // return the total current raw DB file size
 
@@ -415,15 +432,14 @@ Int_t AliMDC::GetTotalSize()
 }
 
 //______________________________________________________________________________
-Int_t AliMDC::Close()
+Long64_t AliMDC::Close()
 {
 // close the current raw DB file
 
   if (!fRawDB) return -1;
 
   fRawDB->WriteStats(fStats);
-  fRunDB->Update(fStats);
-  Int_t filesize = fRawDB->Close();
+  Long64_t filesize = fRawDB->Close();
   delete fRawDB;
   fRawDB = NULL;
   delete fStats;
@@ -431,6 +447,17 @@ Int_t AliMDC::Close()
   return filesize;
 }
 
+//______________________________________________________________________________
+Long64_t AliMDC::AutoSave()
+{
+  // Auto-save the raw-data
+  // and esd (if any) trees
+
+  if (!fRawDB) return -1;
+
+  return fRawDB->AutoSave();
+}
+
 //______________________________________________________________________________
 Int_t AliMDC::Run(const char* inputFile, Bool_t loop,
                  EWriteMode mode, Double_t maxFileSize, 
@@ -470,32 +497,8 @@ Int_t AliMDC::Run(const char* inputFile, Bool_t loop,
 
   // Create new raw DB.
   if (fRawDB) Close();
-  if (mode == kRFIO) {
-    fRawDB = new AliRawRFIODB(fEvent, fESD, fCompress, NULL);
-  } else if (mode == kROOTD) {
-    fRawDB = new AliRawRootdDB(fEvent, fESD, fCompress, NULL);
-  } else if (mode == kCASTOR) {
-    fRawDB = new AliRawCastorDB(fEvent, fESD, fCompress, NULL);
-  } else if (mode == kDEVNULL) {
-    fRawDB = new AliRawNullDB(fEvent, fESD, fCompress, NULL);
-  } else {
-    fRawDB = new AliRawDB(fEvent, fESD, fCompress, NULL);
-  }
-  fRawDB->SetMaxSize(maxFileSize);
-  fRawDB->SetFS(fs1, fs2);
-  fRawDB->SetDeleteFiles(fDeleteFiles);
-  fRawDB->Create();
-
-  if (fRawDB->IsZombie()) {
-    delete fRawDB;
-    fRawDB = NULL;
-    return 1;
-  }
-  printf("Filling raw DB %s\n", fRawDB->GetDBName());
 
-  // Create AliStats object
-  fStats = new AliStats(fRawDB->GetDBName(), fCompress, 
-                       fFilterMode != kFilterOff);
+  if (Open(mode,NULL,maxFileSize,fs1,fs2) < 0) return 1;
 
   // Process input stream
 #ifdef USE_EB
@@ -583,7 +586,7 @@ Int_t AliMDC::Run(const char* inputFile, Bool_t loop,
        eventSize = 2 * hdr->GetEventSize();
        event = new char[eventSize];
       }
-      memcpy(event, hdr->HeaderBaseBegin(), hdr->HeaderBaseSize());
+      memcpy(event, header.HeaderBaseBegin(), header.HeaderBaseSize());
       memcpy(event+hdr->HeaderBaseSize(), hdr->HeaderBegin(), hdr->HeaderSize());
       if (hdr->GetExtendedDataSize() != 0)
        memcpy(event+hdr->HeaderBaseSize()+hdr->HeaderSize(),
@@ -628,7 +631,6 @@ Int_t AliMDC::Run(const char* inputFile, Bool_t loop,
 
        // Write stats object to raw db, run db, MySQL and AliEn
        fRawDB->WriteStats(fStats);
-       if (fRunDB) fRunDB->Update(fStats);
        delete fStats;
        fStats = NULL;
 
@@ -769,24 +771,3 @@ void AliMDC::Stop()
 }
 
 
-//______________________________________________________________________________
-AliMDC::AliMDCInterruptHandler::AliMDCInterruptHandler(const 
-                                                      AliMDCInterruptHandler&
-                                                      handler): 
-  TSignalHandler(handler) 
-{
-// copy constructor
-
-  Fatal("AliMDCInterruptHandler", "copy constructor not implemented");
-}
-
-//______________________________________________________________________________
-AliMDC::AliMDCInterruptHandler& 
-  AliMDC::AliMDCInterruptHandler::operator = (const AliMDCInterruptHandler& 
-                                             /*handler*/)
-{
-// assignment operator
-
-  Fatal("operator =", "assignment operator not implemented");
-  return *this;
-}