]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG4/PartCorrBase/AliCaloTrackAODReader.cxx
Moving aod cleanup to earlier point to prevent reuse of same particle
[u/mrichter/AliRoot.git] / PWG4 / PartCorrBase / AliCaloTrackAODReader.cxx
index 7e3c3e3cbab7c9c4fa35aedcbf7f9f381cd48da6..fcf61923da3e59d6fd1282d7ccdccbaf800c8527 100755 (executable)
@@ -18,7 +18,7 @@
 //_________________________________________________________________________
 // Class for reading data (AODs) in order to do prompt gamma
 //  or other particle identification and correlations.
-// Mixing analysis can be done, input AOD with events
+// This part is commented: Mixing analysis can be done, input AOD with events
 // is opened in the AliCaloTrackReader::Init()
 // 
 //
 
 //---- ANALYSIS system ----
 #include "AliCaloTrackAODReader.h" 
-#include "AliAODEvent.h"
-#include "AliAODCaloCluster.h"
-#include "AliAODTrack.h"
-#include "AliESDtrack.h"
-#include "AliFidutialCut.h"
+#include "AliAODInputHandler.h"
+#include "AliMultiEventInputHandler.h"
+#include "AliAnalysisManager.h"
+#include "AliMixedEvent.h"
 
 ClassImp(AliCaloTrackAODReader)
 
 //____________________________________________________________________________
 AliCaloTrackAODReader::AliCaloTrackAODReader() : 
-  AliCaloTrackReader(), fWriteOutputAOD(kFALSE)
+  AliCaloTrackReader(), fOrgInputEvent(0x0)
 {
   //Default Ctor
   
@@ -49,277 +48,91 @@ AliCaloTrackAODReader::AliCaloTrackAODReader() :
   fDataType=kAOD;
   fReadStack          = kTRUE;
   fReadAODMCParticles = kFALSE;
-  //We want tracks fitted in the detectors:
-  fTrackStatus=AliESDtrack::kTPCrefit;
-  fTrackStatus|=AliESDtrack::kITSrefit;
-
 }
 
 //____________________________________________________________________________
-AliCaloTrackAODReader::AliCaloTrackAODReader(const AliCaloTrackAODReader & aodr) :   
-  AliCaloTrackReader(aodr),fWriteOutputAOD(aodr.fWriteOutputAOD)
-{
-  // cpy ctor
-}
-
-//_________________________________________________________________________
-//AliCaloTrackAODReader & AliCaloTrackAODReader::operator = (const AliCaloTrackAODReader & source)
-//{
-//  // assignment operator
-//
-//  if(&source == this) return *this;
-//
-//  return *this;
+//void AliCaloTrackAODReader::GetSecondInputAODVertex(Double_t  v[3]) const {
+//     //Return vertex position of second AOD input
+//     
+//     fSecondInputAODEvent->GetPrimaryVertex()->GetXYZ(v);
 //
 //}
 
 //____________________________________________________________________________
-void AliCaloTrackAODReader::FillInputCTS() {
-  //Return array with Central Tracking System (CTS) tracks
-
-  Int_t nTracks   = fInputEvent->GetNumberOfTracks() ;
-  Int_t naod = 0;
-  Double_t p[3];
-  for (Int_t itrack =  0; itrack <  nTracks; itrack++) {////////////// track loop
-    AliAODTrack * track = ((AliAODEvent*)fInputEvent)->GetTrack(itrack) ; // retrieve track from esd
-         
-    //Select tracks under certain conditions, TPCrefit, ITSrefit ... check the set bits
-       if (fTrackStatus && !((track->GetStatus() & fTrackStatus) == fTrackStatus)) continue ;
-    
-    track->GetPxPyPz(p) ;
-    TLorentzVector momentum(p[0],p[1],p[2],0);
-    
-    if(fCTSPtMin < momentum.Pt() && fFidutialCut->IsInFidutialCut(momentum,"CTS")){
-      
-      if(fDebug > 2 && momentum.Pt() > 0.1) printf("AliCaloTrackAODReader::FillInputCTS() - Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
-                                                 momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
-         
-         if(fWriteOutputAOD){
-                  AliAODTrack* newtrack = new((*(fOutputEvent->GetTracks()))[naod++]) AliAODTrack(*track);
-                  fAODCTS->Add(newtrack); //Use AOD stored in output for references.
-         }
-         else fAODCTS->Add(track);
-    }//Pt and Fidutial cut passed. 
-  }// track loop
-       
-  fAODCTSNormalInputEntries = fAODCTS->GetEntriesFast();
-  if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputCTS()   - aod entries %d\n", fAODCTSNormalInputEntries);
-
-  //If second input event available, add the clusters.
-  if(fSecondInputAODTree && fSecondInputAODEvent){
-         nTracks   = fSecondInputAODEvent->GetNumberOfTracks() ;
-         if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputCTS()   - Add second input tracks, entries %d\n", nTracks) ;
-         for (Int_t itrack =  0; itrack <  nTracks; itrack++) {////////////// track loop
-                 AliAODTrack * track = ((AliAODEvent*)fSecondInputAODEvent)->GetTrack(itrack) ; // retrieve track from esd
-                 
-                 //Select tracks under certain conditions, TPCrefit, ITSrefit ... check the set bits
-                 if (fTrackStatus && !((track->GetStatus() & fTrackStatus) == fTrackStatus)) continue ;
-                 
-                 track->GetPxPyPz(p) ;
-                 TLorentzVector momentum(p[0],p[1],p[2],0);
-                 
-                 if(fCTSPtMin < momentum.Pt() && fFidutialCut->IsInFidutialCut(momentum,"CTS")){
-                         
-                         if(fDebug > 2 && momentum.Pt() > 0.1) printf("AliCaloTrackAODReader::FillInputCTS() - Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
-                                                                                                                  momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
-                         
-                         if(fWriteOutputAOD){
-                                 AliAODTrack* newtrack = new((*(fOutputEvent->GetTracks()))[naod++]) AliAODTrack(*track);
-                                 fAODCTS->Add(newtrack); //Use AOD stored in output for references.
-                         }
-                         else fAODCTS->Add(track);
-                         
-                 }//Pt and Fidutial cut passed. 
-         }// track loop
-         
-         if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputCTS()   - aod normal entries %d, after second input %d\n", fAODCTSNormalInputEntries, fAODCTS->GetEntriesFast());
-  }    //second input loop
-       
-}
-
-//____________________________________________________________________________
-void AliCaloTrackAODReader::FillInputEMCAL() {
-  //Return array with EMCAL clusters in aod format
-  
-  //Get vertex for momentum calculation  
-  Double_t v[3] ; //vertex ;
-  GetVertex(v);
-
-  Int_t naod =  (fOutputEvent->GetCaloClusters())->GetEntriesFast();
-  //Loop to select clusters in fidutial cut and fill container with aodClusters
-  Int_t nclusters = ((AliAODEvent*)fInputEvent)->GetNCaloClusters();
-  for (Int_t iclus =  0; iclus <  nclusters; iclus++) {
-    AliAODCaloCluster * clus = 0;
-    if ( (clus = ((AliAODEvent*)fInputEvent)->GetCaloCluster(iclus)) ) {
-      if (clus->IsEMCALCluster()){
-       TLorentzVector momentum ;
-       clus->GetMomentum(momentum, v);      
-       
-       if(fEMCALPtMin < momentum.Pt() && fFidutialCut->IsInFidutialCut(momentum,"EMCAL")){
-    
-         if(fDebug > 2 && momentum.E() > 0.1) printf("AliCaloTrackAODReader::FillInputEMCAL() - Selected clusters E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
-                                                    momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
-         
-         if(fWriteOutputAOD){
-               AliAODCaloCluster * newclus = new((*(fOutputEvent->GetCaloClusters()))[naod++])AliAODCaloCluster(*clus);
-               fAODEMCAL->Add(newclus);        
-         }
-         else fAODEMCAL->Add(clus);    
-       }//Pt and Fidutial cut passed.
-      }//EMCAL cluster
-    }// cluster exists
-  }// cluster loop
-       
-  fAODEMCALNormalInputEntries = fAODEMCAL->GetEntriesFast();
-  if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputEMCAL() - aod entries %d\n", fAODEMCALNormalInputEntries);
-
-  //If second input event available, add the clusters.
-  if(fSecondInputAODTree && fSecondInputAODEvent){
-         nclusters = ((AliAODEvent*)fSecondInputAODEvent)->GetNCaloClusters();
-         if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputEMCAL() - Add second input clusters, entries %d\n", nclusters) ;
-               for (Int_t iclus =  0; iclus < nclusters; iclus++) {
-                       AliAODCaloCluster * clus = 0;
-                       if ( (clus = ((AliAODEvent*)fSecondInputAODEvent)->GetCaloCluster(iclus)) ) {
-                               if (clus->IsEMCALCluster()){
-                                       TLorentzVector momentum ;
-                                       clus->GetMomentum(momentum, v);      
-                                       
-                                       if(fEMCALPtMin < momentum.Pt() && fFidutialCut->IsInFidutialCut(momentum,"EMCAL")){
-                                               
-                                               if(fDebug > 2 && momentum.E() > 0.1) printf("AliCaloTrackAODReader::FillInputEMCAL() - Selected clusters E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
-                                                                                                                                       momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
-                                               if(fWriteOutputAOD){
-                                                       AliAODCaloCluster * newclus = new((*(fOutputEvent->GetCaloClusters()))[naod++])AliAODCaloCluster(*clus);
-                                                   fAODEMCAL->Add(newclus);    
-                                               }
-                                               else fAODEMCAL->Add(clus);      
-                                       }//Pt and Fidutial cut passed.
-                               }//EMCAL cluster
-                       }// cluster exists
-               }// cluster loop
-               
-         if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputEMCAL() - aod normal entries %d, after second input %d\n", fAODEMCALNormalInputEntries, fAODEMCAL->GetEntriesFast());
-
-       } //second input loop
-}
-
-//____________________________________________________________________________
-void AliCaloTrackAODReader::FillInputPHOS() {
-  //Return array with PHOS clusters in aod format
-  
-  //Get vertex for momentum calculation  
-  Double_t v[3] ; //vertex ;
-  GetVertex(v);
-       
-  Int_t naod =  (fOutputEvent->GetCaloClusters())->GetEntriesFast();
-  //Loop to select clusters in fidutial cut and fill container with aodClusters
-  Int_t nclusters = ((AliAODEvent*)fInputEvent)->GetNCaloClusters();
-  for (Int_t iclus =  0; iclus < nclusters; iclus++) {
-    AliAODCaloCluster * clus = 0;
-    if ( (clus = ((AliAODEvent*)fInputEvent)->GetCaloCluster(iclus)) ) {
-      if (clus->IsPHOSCluster()){
-       TLorentzVector momentum ;
-       clus->GetMomentum(momentum, v);      
-       
-       if(fPHOSPtMin < momentum.Pt() && fFidutialCut->IsInFidutialCut(momentum,"PHOS")){
-         
-         if(fDebug > 2 && momentum.E() > 0.1) printf("AliCaloTrackAODReader::FillInputPHOS() - Selected clusters E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
-                                                    momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
-
-               if(fWriteOutputAOD){
-                       AliAODCaloCluster * newclus = new((*(fOutputEvent->GetCaloClusters()))[naod++])AliAODCaloCluster(*clus);
-                       fAODPHOS->Add(newclus); 
-               }
-               else fAODPHOS->Add(clus);       
-       }//Pt and Fidutial cut passed.
-      }//PHOS cluster
-    }//cluster exists
-  }//esd cluster loop
-       
-  fAODPHOSNormalInputEntries = fAODPHOS->GetEntriesFast() ;
-  if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputPHOS()  - aod entries %d\n", fAODPHOSNormalInputEntries);
-
-  //If second input event available, add the clusters.
-  if(fSecondInputAODTree && fSecondInputAODEvent){
-         nclusters = ((AliAODEvent*)fSecondInputAODEvent)->GetNCaloClusters();
-         if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputPHOS()  - Add second input clusters, entries %d\n", nclusters);
-               for (Int_t iclus =  0; iclus < nclusters; iclus++) {
-                       AliAODCaloCluster * clus = 0;
-                       if ( (clus = ((AliAODEvent*)fSecondInputAODEvent)->GetCaloCluster(iclus)) ) {
-                               if (clus->IsPHOSCluster()){
-                                       TLorentzVector momentum ;
-                                       clus->GetMomentum(momentum, v);      
-                                       
-                                       if(fPHOSPtMin < momentum.Pt() && fFidutialCut->IsInFidutialCut(momentum,"PHOS")){
-                                               
-                                               if(fDebug > 2 && momentum.E() > 0.1) printf("AliCaloTrackAODReader::FillInputPHOS() - Selected clusters E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
-                                                                                                                                       momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
-                                               if(fWriteOutputAOD){
-                                                       AliAODCaloCluster * newclus = new((*(fOutputEvent->GetCaloClusters()))[naod++])AliAODCaloCluster(*clus);
-                                                   fAODPHOS->Add(newclus);     
-                                               }
-                                               else fAODPHOS->Add(clus);       
-                                       }//Pt and Fidutial cut passed.
-                               }//PHOS cluster
-                       }// cluster exists
-               }// cluster loop
-               if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputPHOS()  - aod normal entries %d, after second input %d\n", fAODPHOSNormalInputEntries, fAODPHOS->GetEntriesFast());
-  }    //second input loop
-
-}
-
-//____________________________________________________________________________
-void AliCaloTrackAODReader::FillInputEMCALCells() {
-  //Return array with EMCAL cells in aod format
-
-  fEMCALCells = (TNamed*) ((AliAODEvent*)fInputEvent)->GetEMCALCells(); 
-
-}
-
-//____________________________________________________________________________
-void AliCaloTrackAODReader::FillInputPHOSCells() {
-  //Return array with PHOS cells in aod format
-
-  fPHOSCells = (TNamed*) ((AliAODEvent*)fInputEvent)->GetPHOSCells(); 
-
-}
-
-//____________________________________________________________________________
-void AliCaloTrackAODReader::GetVertex(Double_t  v[3]) const {
-  //Return vertex position
-
-  v[0] = ((AliAODEvent*)fInputEvent)->GetVertex(0)->GetX() ;//CHECK!!!
-  v[1] = ((AliAODEvent*)fInputEvent)->GetVertex(0)->GetY() ;//CHECK!!!
-  v[2] = ((AliAODEvent*)fInputEvent)->GetVertex(0)->GetZ() ;//CHECK!!!
+AliCentrality* AliCaloTrackAODReader::GetCentrality() const {
+  // recover centrality object.
+  AliAODEvent* event    = dynamic_cast<AliAODEvent*> (fInputEvent);
+  AliAODEvent* orgevent = dynamic_cast<AliAODEvent*> (fOrgInputEvent);
+
+  if(event && !fSelectEmbeddedClusters) {
+    //Normal AOD event
+    return event->GetHeader()->GetCentralityP() ;
+  }
+  else if(fSelectEmbeddedClusters && orgevent) {
+    // centrality in AOD from input, not in embedded event
+    // temporary fix until this object is copied to the output event in embedding analysis
+    return orgevent->GetHeader()->GetCentralityP();
+  }
+  else {
+    return 0x0 ; 
+  }
 }
 
-//____________________________________________________________________________
-Double_t AliCaloTrackAODReader::GetBField() const {
-  //Return magnetic field
-
-  Double_t bfield =  ((AliAODEvent*)fInputEvent)->GetMagneticField();
-
-  return bfield;
-
-}
 
 //____________________________________________________________________________
 void AliCaloTrackAODReader::SetInputOutputMCEvent(AliVEvent* input, AliAODEvent* aod, AliMCEvent* mc) {
   // Connect the data pointers
   // If input is AOD, do analysis with input, if not, do analysis with the output aod.
-  if(!strcmp(input->GetName(),"AliESDEvent"))   {
+
+  //printf("AODInputHandler %p, MergeEvents %d \n",aodIH, aodIH->GetMergeEvents());
+
+  Bool_t tesd = kFALSE ; 
+  Bool_t taod = kTRUE ; 
+  if ( strcmp(input->GetName(), "AliMixedEvent") == 0 ) {
+    AliMultiEventInputHandler* multiEH = dynamic_cast<AliMultiEventInputHandler*>((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
+    if(multiEH){
+      if (multiEH->GetFormat() == 0 ) {
+        tesd = kTRUE ; 
+      } else if (multiEH->GetFormat() == 1) {
+        taod = kTRUE ; 
+      }
+    }
+    else{
+      printf("AliCaloTrackAODReader::SetInputOutputMCEvent() - MultiEventHandler is NULL");
+      abort();
+    }
+  }
+  if (strcmp(input->GetName(),"AliESDEvent") == 0) {
+    tesd = kTRUE ; 
+  } else if (strcmp(input->GetName(),"AliAODEvent") == 0) {
+    taod = kTRUE ; 
+  }
+  
+
+  if(tesd)   {
     SetInputEvent(aod);
     SetOutputEvent(aod);
+    fOrgInputEvent = input;
   }
-  else if(!strcmp(input->GetName(),"AliAODEvent")){
-    SetInputEvent(input);
-    SetOutputEvent(aod);
+  else if(taod){
+    AliAODInputHandler* aodIH = dynamic_cast<AliAODInputHandler*>((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
+         if (aodIH && aodIH->GetMergeEvents()) {
+                 //Merged events, use output AOD.
+                 SetInputEvent(aod);
+                 SetOutputEvent(aod);
+      fOrgInputEvent = input;
+         }
+         else{
+                 SetInputEvent(input);
+                 SetOutputEvent(aod);
+         }
   }
   else{ 
-    printf("AliCaloTrackAODReader::SetInputOutputMCEvent() - STOP : Wrong data format: %s\n",input->GetName());
-    abort();
+    AliFatal(Form("AliCaloTrackAODReader::SetInputOutputMCEvent() - STOP : Wrong data format: %s\n",input->GetName()));
   }
   
   SetMC(mc);
   
 }
+