]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliReconstruction.cxx
Fixed missing class
[u/mrichter/AliRoot.git] / STEER / AliReconstruction.cxx
index f90c2124effc02202b6e5657fc0b5a6f3cad4753..2b8b33dda968a21b9d59e055096ffac4c66eedb7 100644 (file)
 #include "AliVertexerTracks.h"
 #include "AliTriggerRunScalers.h"
 #include "AliCTPTimeParams.h" 
-
+#include "AliESDHLTDecision.h"
+#include "AliTriggerInput.h"
 ClassImp(AliReconstruction)
 
 //_____________________________________________________________________________
@@ -276,7 +277,9 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   fhltesd(NULL),
   fesdf(NULL),
   ffile(NULL),
+  ffileF(NULL),
   ftree(NULL),
+  ftreeF(NULL),
   fhlttree(NULL),
   ftVertexer(NULL),
   fIsNewRunLoader(kFALSE),
@@ -378,7 +381,9 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   fhltesd(NULL),
   fesdf(NULL),
   ffile(NULL),
+  ffileF(NULL),
   ftree(NULL),
+  ftreeF(NULL),
   fhlttree(NULL),
   ftVertexer(NULL),
   fIsNewRunLoader(rec.fIsNewRunLoader),
@@ -524,7 +529,9 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   fhltesd  = NULL;
   fesdf    = NULL;
   ffile    = NULL;
+  ffileF   = NULL;
   ftree    = NULL;
+  ftreeF   = NULL;
   fhlttree = NULL;
   ftVertexer = NULL;
   fIsNewRunLoader = rec.fIsNewRunLoader;
@@ -985,8 +992,6 @@ Bool_t AliReconstruction::InitGRP() {
     AliError("GRP/GRP/Data entry:  missing value for the beam energy ! Using 0");
     beamEnergy = 0;
   }
-  // LHC: "multiply by 120 to get the energy in MeV"
-  beamEnergy *= 0.120;
 
   TString runType = fGRPData->GetRunType();
   if (runType==AliGRPObject::GetInvalidString()) {
@@ -1033,6 +1038,9 @@ Bool_t AliReconstruction::InitGRP() {
     }
   }
 
+  // Additional check if ITS is on
+  fRunVertexFinder = fRunLocalReconstruction && IsSelected("ITS",fRunLocalReconstruction);
+
   AliInfo("===================================================================================");
   AliInfo(Form("Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data()));
   AliInfo(Form("Running tracking for detectors: %s",fRunTracking.Data()));
@@ -1496,29 +1504,24 @@ void AliReconstruction::SlaveBegin(TTree*)
   ftree = new TTree("esdTree", "Tree with ESD objects");
   fesd = new AliESDEvent();
   fesd->CreateStdContent();
+  // add a so far non-std object to the ESD, this will
+  // become part of the std content
+  fesd->AddObject(new AliESDHLTDecision);
 
   fesd->WriteToTree(ftree);
   if (fWriteESDfriend) {
-    // careful:
-    // Since we add the branch manually we must 
-    // book and add it after WriteToTree
-    // otherwise it is created twice,
-    // once via writetotree and once here.
-    // The case for AliESDfriend is now 
-    // caught also in AlIESDEvent::WriteToTree but 
-    // be careful when changing the name (AliESDfriend is not 
-    // a TNamed so we had to hardwire it)
-    fesdf = new AliESDfriend();
-    TBranch *br=ftree->Branch("ESDfriend.","AliESDfriend", &fesdf);
-    br->SetFile("AliESDfriends.root");
+    ffileF = TFile::Open("AliESDfriends.root", "RECREATE");
+    ftreeF = new TTree("esdFriendTree", "Tree with ESD Friend objects");
+    fesdf  = new AliESDfriend();
+    ftreeF->Branch("ESDfriend.","AliESDfriend", &fesdf);
     fesd->AddObject(fesdf);
+    ffile->cd();
   }
   ftree->GetUserInfo()->Add(fesd);
 
   fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
   fhltesd = new AliESDEvent();
   fhltesd->CreateStdContent();
-
   // read the ESD template from CDB
   // HLT is allowed to put non-std content to its ESD, the non-std
   // objects need to be created before invocation of WriteToTree in
@@ -1603,8 +1606,18 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
   // run the reconstruction over a single event
   // The event loop is steered in Run method
 
+
+  static Long_t oldMres=0;
+  static Long_t oldMvir=0;
+  static Float_t oldCPU=0;
+  static Long_t aveDMres=0;
+  static Long_t aveDMvir=0;
+  static Float_t aveDCPU=0;
+
   AliCodeTimerAuto("",0);
 
+  AliESDpid PID;
+
   if (iEvent >= fRunLoader->GetNumberOfEvents()) {
     fRunLoader->SetEventNumber(iEvent);
     fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(), 
@@ -1618,14 +1631,21 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
     return kTRUE;
   }
 
-  AliInfo(Form("processing event %d", iEvent));
 
   fRunLoader->GetEvent(iEvent);
 
   // Fill Event-info object
   GetEventInfo();
   fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
-  AliInfo(Form("Current event specie: %s",fRecoParam.PrintEventSpecie()));
+  
+  ProcInfo_t procInfo;
+  if(iEvent==fFirstEvent) {
+    gSystem->GetProcInfo(&procInfo);
+    oldMres=procInfo.fMemResident;
+    oldMvir=procInfo.fMemVirtual;
+    oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
+  }
+  AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
 
   // Set the reco-params
   {
@@ -1636,13 +1656,19 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
         const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
         reconstructor->SetRecoParam(par);
+       reconstructor->GetPidSettings(&PID);
        reconstructor->SetEventInfo(&fEventInfo);
         if (fRunQA) {
           AliQAManager::QAManager()->SetRecoParam(iDet, par) ; 
-          AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
+          if (par) AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
         }
       }
     }
+    if (fRunQA) {
+      const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors);
+      AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ; 
+      AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ;
+    }
   }
 
     // QA on single raw 
@@ -1662,10 +1688,18 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       detectors=fRunLocalReconstruction;
       detectors.ReplaceAll("HLT", "");
       if (!RunLocalEventReconstruction(detectors)) {
-       if (fStopOnError) {CleanUp(); return kFALSE;}
+        if (fStopOnError) {
+          CleanUp(); 
+          return kFALSE;
+        }
       }
     }
 
+  
+    // fill Event header information from the RawEventHeader
+    if (fRawReader){FillRawEventHeaderESD(fesd);}
+    if (fRawReader){FillRawEventHeaderESD(fhltesd);}
+
     fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
     fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
     fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
@@ -1678,6 +1712,9 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
     fesd->SetMagneticField(AliTracker::GetBz());
     fhltesd->SetMagneticField(AliTracker::GetBz());
     //
+    ((AliESDRun*)fesd->GetESDRun())->SetBeamEnergyIsSqrtSHalfGeV();
+    ((AliESDRun*)fhltesd->GetESDRun())->SetBeamEnergyIsSqrtSHalfGeV();
+    //
     AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
     if (fld) { // set info needed for field initialization
       fesd->SetCurrentL3(fld->GetCurrentSol());
@@ -1728,7 +1765,7 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
 
     // barrel tracking
     if (!fRunTracking.IsNull()) {
-      if (!RunTracking(fesd)) {
+      if (!RunTracking(fesd,PID)) {
        if (fStopOnError) {CleanUp(); return kFALSE;}
       }
     }
@@ -1756,13 +1793,9 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
        if (fStopOnError) {CleanUp(); return kFALSE;}
       }
     }
-  
-    // fill Event header information from the RawEventHeader
-    if (fRawReader){FillRawEventHeaderESD(fesd);}
-    if (fRawReader){FillRawEventHeaderESD(fhltesd);}
-
     // combined PID
-    AliESDpid::MakePID(fesd);
+    PID.MakePID(fesd);
 
     if (fFillTriggerESD) {
       if (!FillTriggerESD(fesd)) {
@@ -1915,16 +1948,25 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       qadm->Exec(AliQAv1::kESDS, fesd);
   }
 
-    if (fWriteESDfriend) {
-      //      fesdf->~AliESDfriend();
-      //  new (fesdf) AliESDfriend(); // Reset...
+  // copy HLT decision from HLTesd to esd
+  // the most relevant information is stored in a reduced container in the esd,
+  // while the full information can be found in the HLTesd
+  TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name());
+  TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name());
+  if (pHLTSrc && pHLTTgt) {
+    pHLTSrc->Copy(*pHLTTgt);
+  }
+
+    if (fWriteESDfriend) 
       fesd->GetESDfriend(fesdf);
-    }
+
     ftree->Fill();
+    if (fWriteESDfriend) ftreeF->Fill();
 
     // Auto-save the ESD tree in case of prompt reco @P2
     if (fRawReader && fRawReader->UseAutoSaveESD()) {
       ftree->AutoSave("SaveSelf");
+      if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
       TFile *friendfile = (TFile *)(gROOT->GetListOfFiles()->FindObject("AliESDfriends.root"));
       if (friendfile) friendfile->Save();
     }
@@ -1942,9 +1984,18 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       new (fesdf) AliESDfriend(); // Reset...
     }
  
-    ProcInfo_t procInfo;
     gSystem->GetProcInfo(&procInfo);
-    AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, procInfo.fMemResident, procInfo.fMemVirtual));
+    Long_t dMres=(procInfo.fMemResident-oldMres)/1024;
+    Long_t dMvir=(procInfo.fMemVirtual-oldMvir)/1024;
+    Float_t dCPU=procInfo.fCpuUser+procInfo.fCpuSys-oldCPU;
+    aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
+    aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
+    aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
+    AliInfo(Form("======================= End Event %d: Res %d(%3d <%3d>) Vir %d(%3d <%3d>) CPU %5.2f <%5.2f> ===================",
+                iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU));
+    oldMres=procInfo.fMemResident;
+    oldMvir=procInfo.fMemVirtual;
+    oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
   
     fEventInfo.Reset();
     for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
@@ -2007,12 +2058,15 @@ void AliReconstruction::SlaveTerminate()
 
   ffile->cd();
 
-  if (fWriteESDfriend)
-    ftree->SetBranchStatus("ESDfriend*",0);
   // we want to have only one tree version number
   ftree->Write(ftree->GetName(),TObject::kOverwrite);
   fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite);
 
+  if (fWriteESDfriend) {
+    ffileF->cd();
+    ftreeF->Write(ftreeF->GetName(),TObject::kOverwrite);
+  }
+
 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
   if (fRunPlaneEff && !FinishPlaneEff()) {
    AliWarning("Finish PlaneEff evaluation failed");
@@ -2143,7 +2197,8 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
       TTree* digitsTree = loader->TreeD();
       if (!digitsTree) {
         AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
-        if (fStopOnError) return kFALSE;
+        if (fStopOnError) 
+          return kFALSE;
       } else {
         reconstructor->Reconstruct(digitsTree, clustersTree);
         if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) {
@@ -2161,10 +2216,12 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
     loader->UnloadRecPoints();
     AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
   }
+  IsSelected("CTP", detStr);
   if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
     AliError(Form("the following detectors were not found: %s",
                   detStr.Data()));
-    if (fStopOnError) return kFALSE;
+    if (fStopOnError) 
+      return kFALSE;
   }
   eventNr++;
   return kTRUE;
@@ -2207,7 +2264,7 @@ Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
     fSPDTrackleter->SetVertex(vtxPos, vtxErr);
     // run trackleting
     if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
-      AliError("AliITSTrackleterSPDEff Clusters2Tracks failed");
+      AliWarning("AliITSTrackleterSPDEff Clusters2Tracks failed");
      // fLoader[0]->UnloadRecPoints();
       return kFALSE;
     }
@@ -2389,7 +2446,7 @@ Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
 
 
 //_____________________________________________________________________________
-Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
+Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd,AliESDpid &PID)
 {
 // run the barrel tracking
   static Int_t eventNr=0;
@@ -2439,7 +2496,7 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
     // preliminary PID in TPC needed by the ITS tracker
     if (iDet == 1) {
       GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
-      AliESDpid::MakePID(esd);
+      PID.MakePID(esd,kTRUE);
     } 
     AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
   }
@@ -2490,8 +2547,9 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
     }
     // updated PID in TPC needed by the ITS tracker -MI
     if (iDet == 1) {
-      GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
-      AliESDpid::MakePID(esd);
+      //GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
+      //AliESDpid::MakePID(esd);
+      PID.MakePID(esd,kTRUE);
     }
     AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
   }
@@ -2582,6 +2640,7 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
     static Int_t eventNr=0; 
   TString detStr = detectors;
   
+  AliSysInfo::AddStamp(Form("FillESDb%d",eventNr), -19,-19, eventNr);
   for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
   if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
     AliReconstructor* reconstructor = GetReconstructor(iDet);
@@ -2617,13 +2676,14 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
       fLoader[iDet]->UnloadRecPoints();
     }
   }
-
+  
+  IsSelected("CTP", detStr);
   if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
     AliError(Form("the following detectors were not found: %s", 
                   detStr.Data()));
     if (fStopOnError) return kFALSE;
   }
-  AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
+  AliSysInfo::AddStamp(Form("FillESDe%d",eventNr), -20,-20, eventNr);
   eventNr++;
   return kTRUE;
 }
@@ -3249,21 +3309,7 @@ Bool_t AliReconstruction::SetRunQA(TString detAndAction)
        }
        Int_t colon = detAndAction.Index(":") ; 
        fQADetectors = detAndAction(0, colon) ; 
-       if (fQADetectors.Contains("ALL") ){
-    TString tmp = fFillESD ;
-    Int_t minus = fQADetectors.Last('-') ; 
-    TString toKeep = fFillESD ; 
-    TString toRemove("") ;
-    while (minus >= 0) {
-      toRemove = fQADetectors(minus+1, fQADetectors.Length()) ; 
-      toRemove = toRemove.Strip() ; 
-      toKeep.ReplaceAll(toRemove, "") ; 
-      fQADetectors.ReplaceAll(Form("-%s", toRemove.Data()), "") ; 
-      minus = fQADetectors.Last('-') ; 
-    }
-    fQADetectors = toKeep ; 
-  }  
-  fQATasks   = detAndAction(colon+1, detAndAction.Sizeof() ) ; 
+       fQATasks   = detAndAction(colon+1, detAndAction.Sizeof() ) ; 
        if (fQATasks.Contains("ALL") ) {
                fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ; 
        } else {
@@ -3459,6 +3505,21 @@ Bool_t AliReconstruction::GetEventInfo()
   }
   fEventInfo.SetTriggerClasses(trclasses);
 
+  // Write names of active trigger inputs in ESD Header
+  const TObjArray& inputsArray = config->GetInputs(); 
+  Int_t ninputs = inputsArray.GetEntriesFast();
+  for( Int_t iinput=0; iinput < ninputs; iinput++ ) {
+    AliTriggerInput* trginput = (AliTriggerInput*)inputsArray.At(iinput);
+    if (trginput) {
+      Int_t inputIndex = (Int_t)TMath::Nint(TMath::Log2(trginput->GetMask()));
+      AliESDHeader* headeresd = fesd->GetHeader();
+      Int_t trglevel = (Int_t)trginput->GetLevel();
+      if (trglevel == 0) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex);
+      if (trglevel == 1) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+24);
+      if (trglevel == 2) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+48);
+    }
+  }
+
   // Set the information in ESD
   fesd->SetTriggerMask(trmask);
   fesd->SetTriggerCluster(clustmask);