]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - FMD/AliFMDInput.cxx
Coverity 16763 Out-of-bounds access corrected.
[u/mrichter/AliRoot.git] / FMD / AliFMDInput.cxx
index d1c8daa5257d469d42401b50305bf02183fec6f0..1f31bbeba3ac94ff2399bb428cd339de0be7f6f3 100644 (file)
@@ -44,6 +44,7 @@
 #include "AliFMDSDigit.h"      // ALIFMDDigit_H
 #include "AliFMDRecPoint.h"    // ALIFMDRECPOINT_H
 #include "AliFMDRawReader.h"    // ALIFMDRAWREADER_H
+#include "AliFMDGeometry.h"
 #include <AliESD.h>
 #include <AliESDFMD.h>
 #include <AliESDEvent.h>
@@ -104,7 +105,8 @@ AliFMDInput::AliFMDInput()
     fTreeMask(0), 
     fRawFile(""),
     fIsInit(kFALSE),
-    fEventCount(0)
+    fEventCount(0), 
+    fNEvents(-1)
 {
 
   // Constructor of an FMD input object.  Specify what data to read in
@@ -148,7 +150,8 @@ AliFMDInput::AliFMDInput(const char* gAliceFile)
     fTreeMask(0), 
     fRawFile(""),
     fIsInit(kFALSE),
-    fEventCount(0)
+    fEventCount(0),
+    fNEvents(-1)
 {
   
   // Constructor of an FMD input object.  Specify what data to read in
@@ -191,7 +194,6 @@ AliFMDInput::Init()
        "\tRaw:           %d\n"
        "\tRawCalib:      %d\n"
        "\tGeometry:      %d\n"
-       "\tTracks:        %d\n"
        "\tTracksRefs:    %d",
        fTreeMask,
        TESTBIT(fTreeMask, kHits),
@@ -204,14 +206,12 @@ AliFMDInput::Init()
        TESTBIT(fTreeMask, kRaw),
        TESTBIT(fTreeMask, kRawCalib),
        TESTBIT(fTreeMask, kGeometry),
-       TESTBIT(fTreeMask, kTracks),
        TESTBIT(fTreeMask, kTrackRefs));
   // Get the run 
   if (TESTBIT(fTreeMask, kDigits)     ||
       TESTBIT(fTreeMask, kSDigits)    || 
       TESTBIT(fTreeMask, kKinematics) || 
       TESTBIT(fTreeMask, kTrackRefs)  || 
-      TESTBIT(fTreeMask, kTracks)     || 
       TESTBIT(fTreeMask, kHeader)) {
     if (!gSystem->FindFile(".:/", fGAliceFile)) {
       AliWarning(Form("Cannot find file %s in .:/", fGAliceFile.Data()));
@@ -293,23 +293,21 @@ AliFMDInput::Init()
   
   // Optionally, get the geometry 
   if (TESTBIT(fTreeMask, kGeometry)) {
+    TString fname;
     if (fRun) {
-      TString fname(fRun->GetGeometryFileName());
-      if (fname.IsNull()) {
-       Warning("Init", "No file name for the geometry from AliRun");
-       fname = gSystem->DirName(fGAliceFile);
-       fname.Append("/geometry.root");
-      }
-      fGeoManager = TGeoManager::Import(fname.Data());
-      if (!fGeoManager) {
-       Fatal("Init", "No geometry manager found");
-       return kFALSE;
-      }
-    }
-    else { 
-      AliGeomManager::LoadGeometry();
+      fname = gSystem->DirName(fGAliceFile);
+      fname.Append("/geometry.root");
     }
+    if (!gSystem->AccessPathName(fname.Data())) 
+      fname = "";
     AliCDBManager* cdb   = AliCDBManager::Instance();
+    if (!cdb->IsDefaultStorageSet()) {
+      cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
+      cdb->SetRun(0);
+    }
+
+    AliGeomManager::LoadGeometry(fname.IsNull() ? 0 : fname.Data());
+
     AliCDBEntry*   align = cdb->Get("FMD/Align/Data");
     if (align) {
       AliInfo("Got alignment data from CDB");
@@ -328,6 +326,9 @@ AliFMDInput::Init()
        }
       }
     }
+    AliFMDGeometry* geom = AliFMDGeometry::Instance();
+    geom->Init();
+    geom->InitTransformations();
   }
 
   fEventCount = 0;
@@ -352,17 +353,16 @@ AliFMDInput::Begin(Int_t event)
 
   // Get the event 
   if (fLoader && fLoader->GetEvent(event)) return kFALSE;
-  AliInfo(Form("Now in event %8d/%8d", event, NEvents()));
 
   // Possibly load global kinematics information 
-  if (TESTBIT(fTreeMask, kKinematics) || TESTBIT(fTreeMask, kTracks)) {
+  if (TESTBIT(fTreeMask, kKinematics)) {
     // AliInfo("Getting kinematics");
     if (fLoader->LoadKinematics("READ")) return kFALSE;
     fStack = fLoader->Stack();
   }
 
   // Possibly load FMD Hit information 
-  if (TESTBIT(fTreeMask, kHits) || TESTBIT(fTreeMask, kTracks)) {
+  if (TESTBIT(fTreeMask, kHits)) {
     // AliInfo("Getting FMD hits");
     if (!fFMDLoader || fFMDLoader->LoadHits("READ")) return kFALSE;
     fTreeH = fFMDLoader->TreeH();
@@ -370,7 +370,7 @@ AliFMDInput::Begin(Int_t event)
   }
   
   // Possibly load FMD TrackReference information 
-  if (TESTBIT(fTreeMask, kTrackRefs) || TESTBIT(fTreeMask, kTracks)) {
+  if (TESTBIT(fTreeMask, kTrackRefs)) {
     // AliInfo("Getting FMD hits");
     if (!fLoader || fLoader->LoadTrackRefs("READ")) return kFALSE;
     fTreeTR = fLoader->TreeTR();
@@ -426,18 +426,6 @@ AliFMDInput::Begin(Int_t event)
     if (read <= 0) return kFALSE;
     fESD = fESDEvent->GetFMDData();
     if (!fESD) return kFALSE;
-#if 0
-    TFile* f = fChainE->GetFile();
-    if (f) {
-      TObject* o = f->GetStreamerInfoList()->FindObject("AliFMDMap");
-      if (o) {
-       TStreamerInfo* info = static_cast<TStreamerInfo*>(o);
-       std::cout << "AliFMDMap class version read is " 
-                 <<  info->GetClassVersion() << std::endl;
-      }
-    }
-    // fESD->CheckNeedUShort(fChainE->GetFile());
-#endif
   }
 
   // Possibly load FMD Digit information 
@@ -481,26 +469,18 @@ AliFMDInput::Event()
   //   -  ProcessRecPoints  if the reconstructed points are loaded. 
   //   -  ProcessESD        if the event summary data is loaded
   // 
-  if (TESTBIT(fTreeMask, kHits)) 
-    if (!ProcessHits()) return kFALSE; 
-  if (TESTBIT(fTreeMask, kTrackRefs)) 
-    if (!ProcessTrackRefs()) return kFALSE; 
-  if (TESTBIT(fTreeMask, kTracks)) 
-    if (!ProcessTracks()) return kFALSE; 
-  if (TESTBIT(fTreeMask, kSDigits)) 
-    if (!ProcessSDigits()) return kFALSE;
-  if (TESTBIT(fTreeMask, kDigits)) 
-    if (!ProcessDigits()) return kFALSE;
-  if (TESTBIT(fTreeMask, kRaw)) 
-    if (!ProcessRawDigits()) return kFALSE;
-  if (TESTBIT(fTreeMask, kRawCalib)) 
-    if (!ProcessRawCalibDigits()) return kFALSE;
-  if (TESTBIT(fTreeMask, kRecPoints)) 
-    if (!ProcessRecPoints()) return kFALSE;
-  if (TESTBIT(fTreeMask, kESD))
-    if (!ProcessESDs()) return kFALSE;
-  if (TESTBIT(fTreeMask, kUser))
-    if (!ProcessUsers()) return kFALSE;
+  if (TESTBIT(fTreeMask, kHits))     if (!ProcessHits())      return kFALSE; 
+  if (TESTBIT(fTreeMask, kTrackRefs))if (!ProcessTrackRefs()) return kFALSE; 
+  if (TESTBIT(fTreeMask, kKinematics) && 
+      TESTBIT(fTreeMask, kHits))     if (!ProcessTracks())    return kFALSE; 
+  if (TESTBIT(fTreeMask, kKinematics))if (!ProcessStack())     return kFALSE; 
+  if (TESTBIT(fTreeMask, kSDigits))  if (!ProcessSDigits())   return kFALSE;
+  if (TESTBIT(fTreeMask, kDigits))   if (!ProcessDigits())    return kFALSE;
+  if (TESTBIT(fTreeMask, kRaw))      if (!ProcessRawDigits()) return kFALSE;
+  if (TESTBIT(fTreeMask, kRawCalib)) if (!ProcessRawCalibDigits())return kFALSE;
+  if (TESTBIT(fTreeMask, kRecPoints))if (!ProcessRecPoints()) return kFALSE;
+  if (TESTBIT(fTreeMask, kESD))      if (!ProcessESDs())      return kFALSE;
+  if (TESTBIT(fTreeMask, kUser))     if (!ProcessUsers())     return kFALSE;
   
   return kTRUE;
 }
@@ -563,9 +543,10 @@ AliFMDInput::ProcessTrackRefs()
     if (trRead <= 0) continue;
     Int_t nTrackRefs = fArrayTR->GetEntries();
     for (Int_t j = 0; j < nTrackRefs; j++) {
-      AliTrackReference* trackRef = static_cast<AliTrackReference*>(fArrayTR->At(j));
+      AliTrackReference* trackRef = 
+       static_cast<AliTrackReference*>(fArrayTR->At(j));
       if (!trackRef) continue;
-      if (trackRef->DetectorId() != AliTrackReference::kFMD) continue;
+      // if (trackRef->DetectorId() != AliTrackReference::kFMD) continue;
       TParticle* track = 0;
       if (TESTBIT(fTreeMask, kKinematics) && fStack) {
        Int_t trackno = trackRef->GetTrack();
@@ -619,7 +600,26 @@ AliFMDInput::ProcessTracks()
   }
   return kTRUE;
 }
+//____________________________________________________________________
+Bool_t 
+AliFMDInput::ProcessStack()
+{
+  // Read the hit tree, and pass each hit to the member function
+  // ProcessTrack.
+  if (!fStack) {
+    AliError("No track tree defined");
+    return kFALSE;
+  }
+  Int_t nTracks = fStack->GetNtrack();
+  for (Int_t i = 0; i < nTracks; i++) {
+    Int_t      trackno = nTracks - i - 1;
+    TParticle* track   = fStack->Particle(trackno);
+    if (!track) continue;
 
+    if (!ProcessParticle(trackno, track)) return kFALSE;
+  }
+  return kTRUE;
+}
 //____________________________________________________________________
 Bool_t 
 AliFMDInput::ProcessDigits()
@@ -822,13 +822,13 @@ AliFMDInput::End()
     return fIsInit;
   }
   // Possibly unload global kinematics information 
-  if (TESTBIT(fTreeMask, kKinematics) || TESTBIT(fTreeMask, kTracks)) {
+  if (TESTBIT(fTreeMask, kKinematics)) {
     fLoader->UnloadKinematics();
     // fTreeK = 0;
     fStack = 0;
   }
   // Possibly unload FMD Hit information 
-  if (TESTBIT(fTreeMask, kHits) || TESTBIT(fTreeMask, kTracks)) {
+  if (TESTBIT(fTreeMask, kHits)) {
     fFMDLoader->UnloadHits();
     fTreeH = 0;
   }
@@ -853,19 +853,25 @@ AliFMDInput::End()
 
 //____________________________________________________________________
 Bool_t
-AliFMDInput::Run()
+AliFMDInput::Run(UInt_t maxEvents)
 {
   // Run over all events and files references in galice.root 
 
   Bool_t retval;
   if (!(retval = Init())) return retval;
 
-  Int_t nEvents = NEvents();
-  for (Int_t event = 0; nEvents < 0 || event < nEvents; event++) {
+  fNEvents = NEvents();
+  if (fNEvents < 0)       fNEvents = maxEvents;
+  else if (maxEvents > 0) fNEvents = TMath::Min(fNEvents,Int_t(maxEvents));
+
+  Int_t event = 0;
+  for (; fNEvents < 0 || event < fNEvents; event++) {
+    printf("\rEvent %8d/%8d ...", event, fNEvents);
     if (!(retval = Begin(event))) break;
     if (!(retval = Event())) break;
     if (!(retval = End())) break;
   }
+  printf("Looped over %8d events\n", event+1);
   if (!retval) return retval;
   retval = Finish();
   return retval;