optimizations after profiling
authorjgrosseo <jgrosseo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 4 May 2011 23:06:43 +0000 (23:06 +0000)
committerjgrosseo <jgrosseo@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 4 May 2011 23:06:43 +0000 (23:06 +0000)
event mixing optional
fixed species dependent efficiencies for esd analysis

PWG4/JetTasks/AliAnalyseLeadingTrackUE.cxx
PWG4/JetTasks/AliAnalysisTaskPhiCorrelations.cxx
PWG4/JetTasks/AliAnalysisTaskPhiCorrelations.h
PWG4/JetTasks/AliTHn.cxx
PWG4/JetTasks/AliTHn.h
PWG4/JetTasks/AliUEHistograms.cxx
PWG4/JetTasks/AliUEHistograms.h
PWG4/macros/AddTaskPhiCorrelations.C

index a29283b..cdeb849 100644 (file)
@@ -180,8 +180,12 @@ TObjArray* AliAnalyseLeadingTrackUE::GetAcceptedParticles(TObject* obj, TObject*
   TObjArray* tracks = new TObjArray;
   
   // for TPC only tracks
+  Bool_t hasOwnership = kFALSE;
   if (fFilterBit == 128 && obj->InheritsFrom("AliESDEvent"))
-    tracks->SetOwner(kTRUE);
+    hasOwnership = kTRUE;
+  
+  if (!arrayMC)
+    tracks->SetOwner(hasOwnership);
  
   // Loop over tracks or jets
   for (Int_t ipart=0; ipart<nTracks; ++ipart) {
@@ -192,10 +196,12 @@ TObjArray* AliAnalyseLeadingTrackUE::GetAcceptedParticles(TObject* obj, TObject*
       if (TMath::Abs(part->Eta()) > fTrackEtaCut || part->Pt() < fTrackPtMin)
         continue;
     
-    if (arrayMC && arrayMC->InheritsFrom("TClonesArray") && obj->InheritsFrom("AliAODEvent")) {
-      Int_t label = ((AliAODTrack*)part)->GetLabel();
+    if (arrayMC) {
+      Int_t label = part->GetLabel();
+      if (hasOwnership)
+       delete part;
       // re-define part as the matched MC particle
-      part = (AliAODMCParticle*)ParticleWithCuts(arrayMC, TMath::Abs(label),onlyprimaries, particleSpecies);
+      part = ParticleWithCuts(arrayMC, TMath::Abs(label),onlyprimaries, particleSpecies);
       if (!part)continue;
     }
     
@@ -364,7 +370,58 @@ AliVParticle*  AliAnalyseLeadingTrackUE::ParticleWithCuts(TObject* obj, Int_t ip
                 if (!isHadron) return 0;                                 
                }
        */
-
+       if (particleSpecies != -1) {
+                // find the primary mother
+                AliMCParticle* mother = (AliMCParticle*) part;
+//             Printf("");
+                while (!mcEvent->IsPhysicalPrimary(mother->GetLabel()))
+                {
+//               Printf("pdg = %d; mother = %d", mother->PdgCode(), mother->GetMother());
+                  if (mother->GetMother() < 0)
+                  {
+                    mother = 0;
+                    break;
+                  }
+                    
+                  mother = (AliMCParticle*) mcEvent->GetTrack(mother->GetMother());
+                  if (!mother)
+                    break;
+                }
+                
+                if (mother)
+                {
+                  Int_t pdgCode = mother->PdgCode();
+                  if (particleSpecies == 0 && TMath::Abs(pdgCode)!=211)
+                          return 0;
+                  if (particleSpecies == 1 && TMath::Abs(pdgCode)!=321)
+                          return 0;
+                  if (particleSpecies == 2 && TMath::Abs(pdgCode)!=2212)
+                          return 0;
+                  if (particleSpecies == 3 && (TMath::Abs(pdgCode)==211 || TMath::Abs(pdgCode)==321 || TMath::Abs(pdgCode)==2212))
+                          return 0;
+                }
+                else
+                {
+                  // if mother not found, accept particle only in case of particleSpecies == 3. To include it in all or no sample is no solution
+                  Printf("WARNING: No mother found for particle %d:", part->GetLabel());
+                  //part->Dump();
+                  //part->Print();
+  
+                  /*
+                  // this code prints the details of the mother that is missing in the AOD
+                  AliMCEventHandler* fMcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
+  
+                  AliMCEvent* fMcEvent = fMcHandler->MCEvent();
+                  
+                  fMcEvent->Stack()->Particle(fMcEvent->Stack()->Particle(part->GetLabel())->GetMother(0))->Print();
+                  fMcEvent->Stack()->Particle(fMcEvent->Stack()->Particle(fMcEvent->Stack()->Particle(part->GetLabel())->GetMother(0))->GetMother(0))->Print();
+                  Printf("eta = %f", fMcEvent->Stack()->Particle(fMcEvent->Stack()->Particle(fMcEvent->Stack()->Particle(part->GetLabel())->GetMother(0))->GetMother(0))->Eta());
+                  */
+                  
+                  if (particleSpecies != 3)
+                    return 0;
+                }
+        }
   }else if (obj->InheritsFrom("AliAODEvent")){ // RECO AOD TRACKS
        AliAODEvent *aodEvent = static_cast<AliAODEvent*>(obj);
         part = aodEvent->GetTrack(ipart);
index e7ed8d0..75697da 100644 (file)
@@ -81,6 +81,7 @@ AliAnalysisTask(name,""),
 fDebug(0),
 fMode(0),
 fReduceMemoryFootprint(kFALSE),
+fFillMixed(kTRUE),
 // pointers to UE classes
 fAnalyseUE(0x0),
 fHistos(0x0),
@@ -357,7 +358,9 @@ void  AliAnalysisTaskPhiCorrelations::AnalyseCorrectionMode()
       
         fHistos->FillTrackingEfficiency(primMCParticles, primRecoTracksMatched, allRecoTracksMatched, particleSpecies, centrality);
         
-        delete primMCParticles;
+//     Printf("%d --> %d %d %d", particleSpecies, primMCParticles->GetEntries(), primRecoTracksMatched->GetEntries(), allRecoTracksMatched->GetEntries());
+
+       delete primMCParticles;
         delete primRecoTracksMatched;
         delete allRecoTracksMatched;
       }
@@ -510,56 +513,59 @@ void  AliAnalysisTaskPhiCorrelations::AnalyseDataMode()
   TObjArray* tracks = fAnalyseUE->GetAcceptedParticles(inputEvent, 0, kTRUE, -1, kTRUE);
   //Printf("Accepted %d tracks", tracks->GetEntries());
   
-  // event mixing
-  
-  // 1. First get an event pool corresponding in mult (cent) and
-  //    zvertex to the current event. Once initialized, the pool
-  //    should contain nMix (reduced) events. This routine does not
-  //    pre-scan the chain. The first several events of every chain
-  //    will be skipped until the needed pools are filled to the
-  //    specified depth. If the pool categories are not too rare, this
-  //    should not be a problem. If they are rare, you could lose
-  //    statistics.
-
-  // 2. Collect the whole pool's content of tracks into one TObjArray
-  //    (bgTracks), which is effectively a single background super-event.
-
-  // 3. The reduced and bgTracks arrays must both be passed into
-  //    FillCorrelations(). Also nMix should be passed in, so a weight
-  //    of 1./nMix can be applied.
-
   const AliVVertex* vertex = inputEvent->GetPrimaryVertex();
   Double_t zVtx = vertex->GetZ();
   
-  AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
-  
-  if (!pool)
-    AliFatal(Form("No pool found for centrality = %f, zVtx = %f", centrality, zVtx));
-  
-  //pool->SetDebug(1);
-    
   // Fill containers at STEP 6 (reconstructed)
   fHistos->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks);
   
-  if (pool->IsReady()) 
+  if (fFillMixed)
   {
+    // event mixing
     
-    Int_t nMix = pool->GetCurrentNEvents();
-    //cout << "nMix = " << nMix << endl;
-  
-    // Fill mixed-event histos here  
-    for (Int_t jMix=0; jMix<nMix; jMix++) {
-      TObjArray* bgTracks = pool->GetEvent(jMix);
-      fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, bgTracks, 1.0 / nMix, (jMix == 0));
+    // 1. First get an event pool corresponding in mult (cent) and
+    //    zvertex to the current event. Once initialized, the pool
+    //    should contain nMix (reduced) events. This routine does not
+    //    pre-scan the chain. The first several events of every chain
+    //    will be skipped until the needed pools are filled to the
+    //    specified depth. If the pool categories are not too rare, this
+    //    should not be a problem. If they are rare, you could lose
+    //    statistics.
+
+    // 2. Collect the whole pool's content of tracks into one TObjArray
+    //    (bgTracks), which is effectively a single background super-event.
+
+    // 3. The reduced and bgTracks arrays must both be passed into
+    //    FillCorrelations(). Also nMix should be passed in, so a weight
+    //    of 1./nMix can be applied.
+
+    AliEventPool* pool = fPoolMgr->GetEventPool(centrality, zVtx);
+    
+    if (!pool)
+      AliFatal(Form("No pool found for centrality = %f, zVtx = %f", centrality, zVtx));
+    
+    //pool->SetDebug(1);
+      
+    if (pool->IsReady()) 
+    {
+      
+      Int_t nMix = pool->GetCurrentNEvents();
+      //cout << "nMix = " << nMix << endl;
+    
+      // Fill mixed-event histos here  
+      for (Int_t jMix=0; jMix<nMix; jMix++) {
+       TObjArray* bgTracks = pool->GetEvent(jMix);
+       fHistosMixed->FillCorrelations(centrality, zVtx, AliUEHist::kCFStepReconstructed, tracks, bgTracks, 1.0 / nMix, (jMix == 0));
+      }
     }
+    
+    // clone and give ownership to event pool
+    TObjArray* tracksClone = (TObjArray*) tracks->Clone();
+    tracksClone->SetOwner(kTRUE);
+    
+    pool->UpdatePool(tracksClone);
+    //pool->PrintInfo();
   }
-  
-  // clone and give ownership to event pool
-  TObjArray* tracksClone = (TObjArray*) tracks->Clone();
-  tracksClone->SetOwner(kTRUE);
-  
-  pool->UpdatePool(tracksClone);
-  //pool->PrintInfo();
 
   delete tracks;
 }
index 8fa096a..217a5b7 100644 (file)
@@ -62,6 +62,7 @@ class  AliAnalysisTaskPhiCorrelations : public AliAnalysisTask
     virtual     void    SetDebugLevel( Int_t level )  { fDebug = level; }
     virtual     void    SetMode(Int_t mode)           { fMode  = mode;  }
     virtual     void    SetReduceMemoryFootprint(Bool_t flag) { fReduceMemoryFootprint = flag; }
+    virtual    void    SetEventMixing(Bool_t flag) { fFillMixed = flag; }
     
     // histogram settings
     void SetTrackingEfficiency( const TH1D* hist) { fkTrackingEfficiency = hist; }
@@ -97,6 +98,7 @@ class  AliAnalysisTaskPhiCorrelations : public AliAnalysisTask
     Int_t              fMode;            //  fMode = 0: data-like analysis 
                                          //  fMode = 1: corrections analysis   
     Bool_t              fReduceMemoryFootprint; // reduce memory consumption by writing less debug histograms
+    Bool_t             fFillMixed;             // enable event mixing (default: ON)
     
     // Pointers to external UE classes
     AliAnalyseLeadingTrackUE*     fAnalyseUE;      //! points to class containing common analysis algorithms
index 11cd36d..32ce5a7 100644 (file)
@@ -42,7 +42,8 @@ AliTHn::AliTHn() :
   fNVars(0),
   fNSteps(0),
   fValues(0),
-  fSumw2(0)
+  fSumw2(0),
+  axisCache(0)
 {
   // Constructor
 }
@@ -53,7 +54,8 @@ AliTHn::AliTHn(const Char_t* name, const Char_t* title,const Int_t nSelStep, con
   fNVars(nVarIn),
   fNSteps(nSelStep),
   fValues(0),
-  fSumw2(0)
+  fSumw2(0),
+  axisCache(0)
 {
   // Constructor
 
@@ -84,7 +86,8 @@ AliTHn::AliTHn(const AliTHn &c) :
   fNVars(0),
   fNSteps(0),
   fValues(0),
-  fSumw2(0)
+  fSumw2(0),
+  axisCache(0)
 {
   //
   // AliTHn copy constructor
@@ -101,15 +104,21 @@ AliTHn::~AliTHn()
   
   if (fValues)
   {
-    delete fValues;
+    delete[] fValues;
     fValues = 0;
   }
 
   if (fSumw2)
   {
-    delete fSumw2;
+    delete[] fSumw2;
     fSumw2 = 0;
   }
+  
+  if (axisCache)
+  {
+    delete[] axisCache;
+    axisCache = 0;
+  }
 }
 
 void AliTHn::DeleteContainers()
@@ -228,16 +237,24 @@ void AliTHn::Fill(const Double_t *var, Int_t istep, Double_t weight)
 {
   // fills an entry
 
+  // fill axis cache
+  if (!axisCache)
+  {
+    axisCache = new TAxis*[fNVars];
+    for (Int_t i=0; i<fNVars; i++)
+      axisCache[i] = GetAxis(i, 0);
+  }
+
   // calculate global bin index
   Long64_t bin = 0;
   for (Int_t i=0; i<fNVars; i++)
   {
-    bin *= GetAxis(i, 0)->GetNbins();
+    bin *= axisCache[i]->GetNbins();
     
-    Int_t tmpBin = GetAxis(i, 0)->FindBin(var[i]);
+    Int_t tmpBin = axisCache[i]->FindBin(var[i]);
 //     Printf("%d", tmpBin);
     // under/overflow not supported
-    if (tmpBin < 1 || tmpBin > GetAxis(i, 0)->GetNbins())
+    if (tmpBin < 1 || tmpBin > axisCache[i]->GetNbins())
       return;
     
     // bins start from 0 here
index 07fda1a..7096a0f 100644 (file)
@@ -45,8 +45,9 @@ protected:
   Int_t    fNSteps;  // number of selection steps
   TArrayF **fValues; //[fNSteps] data container
   TArrayF **fSumw2;  //[fNSteps] data container
+  TAxis** axisCache; //! cache axis pointers (about 50% of the time in Fill is spent in GetAxis otherwise)
   
-  ClassDef(AliTHn, 2) // THn like container
+  ClassDef(AliTHn, 3) // THn like container
 };
 
 #endif
index ca31849..3767136 100644 (file)
@@ -383,7 +383,7 @@ void AliUEHistograms::Fill(AliVParticle* leadingMC, AliVParticle* leadingReco)
 }
 
 //____________________________________________________________________
-void AliUEHistograms::FillCorrelations(Double_t centrality, Float_t zVtx, AliUEHist::CFStep step, TSeqCollection* particles, TSeqCollection* mixed, Float_t weight, Bool_t firstTime)
+void AliUEHistograms::FillCorrelations(Double_t centrality, Float_t zVtx, AliUEHist::CFStep step, TObjArray* particles, TObjArray* mixed, Float_t weight, Bool_t firstTime)
 {
   // fills the fNumberDensityPhi histogram
   //
@@ -391,21 +391,31 @@ void AliUEHistograms::FillCorrelations(Double_t centrality, Float_t zVtx, AliUEH
   //
   // if mixed is non-0, mixed events are filled, the trigger particle is from particles, the associated from mixed
   
+  // Eta() is extremely time consuming, therefore cache it for the inner loop here:
+  TObjArray* input = (mixed) ? mixed : particles;
+  TArrayF eta(input->GetEntriesFast());
+  for (Int_t i=0; i<input->GetEntriesFast(); i++)
+    eta[i] = ((AliVParticle*) input->At(i))->Eta();
+  
   // if particles is not set, just fill event statistics
   if (particles)
   {
-    for (Int_t i=0; i<particles->GetEntries(); i++)
+    Int_t jMax = particles->GetEntriesFast();
+    if (mixed)
+      jMax = mixed->GetEntriesFast();
+    
+    for (Int_t i=0; i<particles->GetEntriesFast(); i++)
     {
       AliVParticle* triggerParticle = (AliVParticle*) particles->At(i);
-      Int_t jMax = particles->GetEntries();
-      if (mixed)
-        jMax = mixed->GetEntries();
+      
+      // some optimization
+      Float_t triggerEta = triggerParticle->Eta();
         
       if (!mixed)
       {
         // QA
         fCorrelationpT->Fill(centrality, triggerParticle->Pt());
-        fCorrelationEta->Fill(centrality, triggerParticle->Eta());
+        fCorrelationEta->Fill(centrality, triggerEta);
         fCorrelationPhi->Fill(centrality, triggerParticle->Phi());
 /*        if (dynamic_cast<AliAODTrack*>(triggerParticle))
           fITSClusterMap->Fill(((AliAODTrack*) triggerParticle)->GetITSClusterMap(), centrality, triggerParticle->Pt());*/
@@ -441,7 +451,7 @@ void AliUEHistograms::FillCorrelations(Double_t centrality, Float_t zVtx, AliUEH
         }
         
         Double_t vars[6];
-        vars[0] = triggerParticle->Eta() - particle->Eta();
+        vars[0] = triggerEta - eta[j];
         vars[1] = particle->Pt();
         vars[2] = triggerParticle->Pt();
         vars[3] = centrality;
@@ -490,7 +500,7 @@ void AliUEHistograms::FillTrackingEfficiency(TObjArray* mc, TObjArray* recoPrim,
     else if (step == 2)
       list = recoAll;
       
-    for (Int_t i=0; i<list->GetEntries(); i++)
+    for (Int_t i=0; i<list->GetEntriesFast(); i++)
     {
       AliVParticle* particle = (AliVParticle*) list->At(i);
       Double_t vars[4];
index a40004d..11d01d3 100644 (file)
@@ -15,6 +15,7 @@ class AliVParticle;
 
 class TList;
 class TSeqCollection;
+class TObjArray;
 class TH1F;
 class TH2F;
 class TH3F;
@@ -26,7 +27,7 @@ class AliUEHistograms : public TNamed
   virtual ~AliUEHistograms();
   
   void Fill(Int_t eventType, Float_t zVtx, AliUEHist::CFStep step, AliVParticle* leading, TList* toward, TList* away, TList* min, TList* max);
-  void FillCorrelations(Double_t centrality, Float_t zVtx, AliUEHist::CFStep step, TSeqCollection* particles, TSeqCollection* mixed = 0, Float_t weight = 1, Bool_t firstTime = kTRUE);
+  void FillCorrelations(Double_t centrality, Float_t zVtx, AliUEHist::CFStep step, TObjArray* particles, TObjArray* mixed = 0, Float_t weight = 1, Bool_t firstTime = kTRUE);
   void Fill(AliVParticle* leadingMC, AliVParticle* leadingReco);
   void FillEvent(Int_t eventType, Int_t step);
   void FillEvent(Double_t centrality, Int_t step);
index 04fa848..c6028c2 100644 (file)
@@ -34,6 +34,8 @@ AliAnalysisTaskPhiCorrelations *AddTaskPhiCorrelations(Int_t analysisMode = 0, B
   ana->SetReduceMemoryFootprint(kTRUE);\r
   //ana->SetSelectCharge(2);\r
   \r
+  ana->SetEventMixing(kFALSE);\r
+  \r
   if (0)\r
   {\r
     Printf("AddTaskPhiCorrelations:\n\n\n++++++++++ Using SPD centrality selection ++++++++++++\n\n\n");\r