]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisTaskESDfilter.cxx
Using GRP instead of local setters
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisTaskESDfilter.cxx
index b742da591f4bd7d5c275fcc8dd404d566af77003..30a02e972a8cc438489caf861db072f92a173f0e 100644 (file)
 /* $Id: AliAnalysisTaskESDfilter.cxx 24535 2008-03-16 22:43:30Z fca $ */
  
 #include <TChain.h>
+#include <TTree.h>
 #include <TList.h>
-#include <TFile.h>
 #include <TArrayI.h>
 #include <TRandom.h>
+#include <TParticle.h>
 
 #include "AliAnalysisTaskESDfilter.h"
 #include "AliAnalysisManager.h"
 #include "AliESDEvent.h"
+#include "AliStack.h"
 #include "AliAODEvent.h"
+#include "AliMCEvent.h"
+#include "AliMCEventHandler.h"
 #include "AliESDInputHandler.h"
 #include "AliAODHandler.h"
+#include "AliAODMCParticle.h"
 #include "AliAnalysisFilter.h"
 #include "AliESDMuonTrack.h"
 #include "AliESDVertex.h"
@@ -49,7 +54,7 @@ AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
     fKinkFilter(0x0),
     fV0Filter(0x0),
     fHighPthreshold(0),
-    fPtshape(0x0)     
+    fPtshape(0x0)
 {
   // Default constructor
 }
@@ -88,14 +93,23 @@ void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
   if (fDebug > 0) printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
   if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
   if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
+
   ConvertESDtoAOD();
 }
 
 void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     // ESD Filter analysis task executed for each event
+
     AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
     AliESD* old = esd->GetAliESDOld();
-    
+
+    // Fetch Stack for debuggging if available 
+    AliStack *pStack = 0;
+    AliMCEventHandler *mcH = 0;
+    if(MCEvent()){
+      pStack = MCEvent()->Stack();
+      mcH = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler()); 
+    }
     // set arrays and pointers
     Float_t posF[3];
     Double_t pos[3];
@@ -112,9 +126,9 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     for (Int_t i = 0; i < 21; i++) covTr [i] = 0.;
 
     
-  // loop over events and fill them
-  
-  // Multiplicity information needed by the header (to be revised!)
+    // loop over events and fill them
+    
+    // Multiplicity information needed by the header (to be revised!)
     Int_t nTracks    = esd->GetNumberOfTracks();
     //    if (fDebug > 0) printf("-------------------Bo: Number of ESD tracks %d \n",nTracks);
 
@@ -150,6 +164,9 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     header->SetZDCN2Energy(esd->GetZDCN2Energy());
     header->SetZDCP2Energy(esd->GetZDCP2Energy());
     header->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
+    Float_t diamxy[2]={esd->GetDiamondX(),esd->GetDiamondY()};
+    Float_t diamcov[3]; esd->GetDiamondCovXY(diamcov);
+    header->SetDiamond(diamxy,diamcov);
 //
 //    
     Int_t nV0s      = esd->GetNumberOfV0s();
@@ -171,9 +188,9 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     Double_t timezero = 0; //TO BE FIXED
     AliAODv0    *aodV0    = 0x0;
 
-    // RefArray to take into account the tracks associated to V0s
-    TRefArray   *v0DaughterTracks = NULL;
-    if (nTracks>0) v0DaughterTracks = new TRefArray(nTracks);
+    // RefArray to store the mapping between esd track number and newly created AOD-Track
+    TRefArray   *aodRefs = NULL;
+    if (nTracks > 0) aodRefs = new TRefArray(nTracks);
 
     // Array to take into account the tracks already added to the AOD
     Bool_t * usedTrack = NULL;
@@ -215,6 +232,9 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     
     AliAODVertex * primary = new(vertices[jVertices++])
        AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
+    primary->SetName(vtx->GetName());
+    primary->SetTitle(vtx->GetTitle());
+
     if (fDebug > 0) primary->Print();
 
     // Create vertices starting from the most complex objects
@@ -331,6 +351,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                selectInfo = fTrackFilter->IsSelected(esdTrack);
            }
            
+           if(mcH)mcH->SelectParticle(esdTrack->GetLabel());
            vV0FromCascade->AddDaughter(aodTrack =
                                        new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                                                           esdTrack->GetLabel(), 
@@ -344,10 +365,12 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                           pid,
                                                                           vV0FromCascade,
                                                                           kTRUE,  // check if this is right
-                                                                          kFALSE, // check if this is right
+                                                                          vtx->UsesTrack(esdTrack->GetID()),
                                                                           AliAODTrack::kSecondary,
                                                                           selectInfo)
                                        );
+           aodRefs->AddAt(aodTrack, posFromV0);
+           
        if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
            aodTrack->SetFlags(esdTrack->GetStatus());
@@ -371,7 +394,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
            esdTrack->GetESDpid(pid);
            UInt_t selectInfo = 0;
            if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);      
-
+           if(mcH)mcH->SelectParticle(esdTrack->GetLabel());
            vV0FromCascade->AddDaughter(aodTrack =
                                        new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                                                           esdTrack->GetLabel(),
@@ -385,10 +408,11 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                           pid,
                                                                           vV0FromCascade,
                                                                           kTRUE,  // check if this is right
-                                                                          kFALSE, // check if this is right
+                                                                          vtx->UsesTrack(esdTrack->GetID()),
                                                                           AliAODTrack::kSecondary,
                                                                           selectInfo)
                                        );
+           aodRefs->AddAt(aodTrack, negFromV0);
 
        if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
@@ -420,7 +444,8 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
            esdTrack->GetESDpid(pid);
            UInt_t selectInfo = 0;
            if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);
-           
+
+           if(mcH)mcH->SelectParticle(esdTrack->GetLabel());
            vcascade->AddDaughter(aodTrack =
                                  new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                                                     esdTrack->GetLabel(),
@@ -434,10 +459,11 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                     pid,
                                                                     vcascade,
                                                                     kTRUE,  // check if this is right
-                                                                    kFALSE, // check if this is right
+                                                                    vtx->UsesTrack(esdTrack->GetID()),
                                                                     AliAODTrack::kSecondary,
                                                                     selectInfo)
                                  );
+           aodRefs->AddAt(aodTrack, bachelor);
        if (esdTrack->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
            aodTrack->SetFlags(esdTrack->GetStatus());
@@ -468,7 +494,6 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        // V0 selection 
        //
        AliESDVertex *esdVtx = new AliESDVertex(*(esd->GetPrimaryVertex()));
-       
        AliESDtrack *esdV0Pos = esd->GetTrack(posFromV0);
        AliESDtrack *esdV0Neg = esd->GetTrack(negFromV0);
        TList v0objects;
@@ -480,13 +505,16 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        if (fV0Filter) {
          selectV0 = fV0Filter->IsSelected(&v0objects);
          // this is a little awkward but otherwise the 
-         // list wants to access the pointer again when going out of scope
-         delete v0objects.RemoveAt(3);
+         // list wants to access the pointer (delete it) 
+         // again when going out of scope
+         delete v0objects.RemoveAt(3); // esdVtx created via copy construct
+         esdVtx = 0;
          if (!selectV0) 
            continue;
        }
        else{
-         delete v0objects.RemoveAt(3);
+         delete v0objects.RemoveAt(3); // esdVtx created via copy construct
+         esdVtx = 0;
        }
     
        v0->GetXYZ(pos[0], pos[1], pos[2]);
@@ -515,8 +543,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = Pos and ..[1] = Neg
        
        Double_t  dcaV0Daughters      = v0->GetDcaV0Daughters();
-       Double_t  dcaV0ToPrimVertex   = v0->GetD();
-
+       Double_t  dcaV0ToPrimVertex   = v0->GetD(esd->GetPrimaryVertex()->GetX(),esd->GetPrimaryVertex()->GetY(),esd->GetPrimaryVertex()->GetZ());
        v0->GetPPxPyPz(p_pos_atv0[0],p_pos_atv0[1],p_pos_atv0[2]); 
        v0->GetNPxPyPz(p_neg_atv0[0],p_neg_atv0[1],p_neg_atv0[2]); 
 
@@ -532,6 +559,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
            usedTrack[posFromV0] = kTRUE;
            UInt_t selectInfo = 0;
            if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);
+           if(mcH)mcH->SelectParticle(esdV0Pos->GetLabel());
            aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Pos->GetID(),
                                                          esdV0Pos->GetLabel(), 
                                                          p_pos, 
@@ -544,10 +572,10 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                          pid,
                                                          vV0,
                                                          kTRUE,  // check if this is right
-                                                         kFALSE, // check if this is right
+                                                         vtx->UsesTrack(esdV0Pos->GetID()),
                                                          AliAODTrack::kSecondary,
                                                          selectInfo);
-           v0DaughterTracks->AddAt(aodTrack,posFromV0);
+           aodRefs->AddAt(aodTrack,posFromV0);
            //      if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());
            if (esdV0Pos->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
@@ -555,7 +583,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
             SetAODPID(esdV0Pos,aodTrack,detpid,timezero);
        }
        else {
-           aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(posFromV0));
+           aodTrack = dynamic_cast<AliAODTrack*>(aodRefs->At(posFromV0));
            //      if (fDebug > 0) printf("-------------------Bo pos track from refArray pt %.3f \n",aodTrack->Pt());
        }
        vV0->AddDaughter(aodTrack);
@@ -572,6 +600,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
            usedTrack[negFromV0] = kTRUE;
            UInt_t selectInfo = 0;
            if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);
+           if(mcH)mcH->SelectParticle(esdV0Neg->GetLabel());
            aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Neg->GetID(),
                                                          esdV0Neg->GetLabel(),
                                                          p_neg,
@@ -584,11 +613,11 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                          pid,
                                                          vV0,
                                                          kTRUE,  // check if this is right
-                                                         kFALSE, // check if this is right
+                                                         vtx->UsesTrack(esdV0Neg->GetID()),
                                                          AliAODTrack::kSecondary,
                                                          selectInfo);
            
-           v0DaughterTracks->AddAt(aodTrack,negFromV0);
+           aodRefs->AddAt(aodTrack,negFromV0);
            //      if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());
            if (esdV0Neg->GetSign() > 0) nPosTracks++;
            aodTrack->ConvertAliPIDtoAODPID();
@@ -596,7 +625,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
             SetAODPID(esdV0Neg,aodTrack,detpid,timezero);
        }
        else {
-           aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(negFromV0));
+           aodTrack = dynamic_cast<AliAODTrack*>(aodRefs->At(negFromV0));
            //      if (fDebug > 0) printf("-------------------Bo neg track from refArray pt %.3f \n",aodTrack->Pt());
        }
        vV0->AddDaughter(aodTrack);
@@ -680,7 +709,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                        esdTrackM->GetXYZ(pos);
                        esdTrackM->GetCovarianceXYZPxPyPz(covTr);
                        esdTrackM->GetESDpid(pid);
-                       
+                       if(mcH)mcH->SelectParticle(esdTrackM->GetLabel());
                        mother = 
                            new(tracks[jTracks++]) AliAODTrack(esdTrackM->GetID(),
                                                               esdTrackM->GetLabel(),
@@ -694,9 +723,11 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                               pid,
                                                               primary,
                                                               kTRUE, // check if this is right
-                                                              kTRUE, // check if this is right
+                                                              vtx->UsesTrack(esdTrack->GetID()),
                                                               AliAODTrack::kPrimary,
                                                               selectInfo);
+                       aodRefs->AddAt(mother, imother);
+                       
                        if (esdTrackM->GetSign() > 0) nPosTracks++;
                        mother->SetFlags(esdTrackM->GetStatus());
                        mother->ConvertAliPIDtoAODPID();
@@ -734,6 +765,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                        esdTrackD->GetESDpid(pid);
                        selectInfo = 0;
                        if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);
+                       if(mcH)mcH->SelectParticle(esdTrackD->GetLabel());
                        daughter = 
                            new(tracks[jTracks++]) AliAODTrack(esdTrackD->GetID(),
                                                               esdTrackD->GetLabel(),
@@ -747,10 +779,12 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                               pid,
                                                               vkink,
                                                               kTRUE, // check if this is right
-                                                              kTRUE, // check if this is right
+                                                              vtx->UsesTrack(esdTrack->GetID()),
                                                               AliAODTrack::kSecondary,
                                                               selectInfo);
-
+                       
+                       aodRefs->AddAt(daughter, idaughter);
+                       
                        if (esdTrackD->GetSign() > 0) nPosTracks++;
                        daughter->SetFlags(esdTrackD->GetStatus());
                        daughter->ConvertAliPIDtoAODPID();
@@ -783,7 +817,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        // Track selection
        if (fTrackFilter) {
            selectInfo = fTrackFilter->IsSelected(esdTrack);
-           if (!selectInfo) continue;
+           if (!selectInfo && !vtx->UsesTrack(esdTrack->GetID())) continue;
        }
        
        //
@@ -791,8 +825,7 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        esdTrack->GetXYZ(pos);
        esdTrack->GetCovarianceXYZPxPyPz(covTr);
        esdTrack->GetESDpid(pid);
-       
-           
+       if(mcH)mcH->SelectParticle(esdTrack->GetLabel());
        primary->AddDaughter(aodTrack =
                             new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
                                                                esdTrack->GetLabel(),
@@ -806,10 +839,12 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
                                                                pid,
                                                                primary,
                                                                kTRUE, // check if this is right
-                                                               kTRUE, // check if this is right
+                                                               vtx->UsesTrack(esdTrack->GetID()),
                                                                AliAODTrack::kPrimary, 
                                                                selectInfo)
-           );
+                            );
+       aodRefs->AddAt(aodTrack, nTrack);
+       
        if (esdTrack->GetSign() > 0) nPosTracks++;
        aodTrack->SetFlags(esdTrack->GetStatus());
        aodTrack->ConvertAliPIDtoAODPID();
@@ -853,7 +888,12 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
       Int_t nLabel    = cluster->GetNLabels();
       TArrayI* labels = cluster->GetLabels();
       Int_t *label = 0;
-      if (labels) label = (cluster->GetLabels())->GetArray();
+      if (labels){
+       label = (cluster->GetLabels())->GetArray();
+       for(int i = 0;i < labels->GetSize();++i){
+         if(mcH)mcH->SelectParticle(label[i]);
+       }
+      }     
 
       Float_t energy = cluster->E();
       cluster->GetPosition(posF);
@@ -889,10 +929,13 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
       TArrayI* matchedT =      cluster->GetTracksMatched();
       if (matchedT && cluster->GetTrackMatched() >= 0) {       
        for (Int_t im = 0; im < matchedT->GetSize(); im++) {
-         caloCluster->AddTrackMatched((esd->GetTrack(im)));
+           Int_t iESDtrack = matchedT->At(im);;
+           if (aodRefs->At(iESDtrack) != 0) {
+               caloCluster->AddTrackMatched((AliAODTrack*)aodRefs->At(iESDtrack));
+           }
        }
       }
-
+      
     } 
     caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters   
     // end of loop on calo clusters
@@ -933,7 +976,11 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
        SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
 
        for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
-         SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0), mult->GetLabel(n, 1));
+         if(mcH){
+           mcH->SelectParticle(mult->GetLabel(n, 0));
+           mcH->SelectParticle(mult->GetLabel(n, 1));
+         }
+         SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0),mult->GetLabel(n, 1));
        }
       }
     } else {
@@ -943,11 +990,12 @@ void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
     delete [] usedTrack;
     delete [] usedV0;
     delete [] usedKink;
-    delete    v0DaughterTracks;
+    delete    aodRefs;
 
     return;
 }
 
+
 void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid, Double_t timezero)
 {
   //
@@ -1001,6 +1049,7 @@ void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtr
  aodpid->SetHMPIDsignal(track->GetHMPIDsignal());
 
 }
+
 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
 {
 // Terminate analysis
@@ -1008,3 +1057,22 @@ void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
     if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");
 }
 
+void  AliAnalysisTaskESDfilter::PrintMCInfo(AliStack *pStack,Int_t label){
+  if(!pStack)return;
+  label = TMath::Abs(label);
+  TParticle *part = pStack->Particle(label);
+  Printf("########################");
+  Printf("%s:%d %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,label,part->GetUniqueID(),part->GetPdgCode(),part->P());
+  part->Print();
+  TParticle* mother = part;
+  Int_t imo = part->GetFirstMother();
+  Int_t nprim = pStack->GetNprimary();
+  //  while((imo >= nprim) && (mother->GetUniqueID() == 4)) {
+  while((imo >= nprim)) {
+    mother =  pStack->Particle(imo);
+    Printf("Mother %s:%d Label %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,imo,mother->GetUniqueID(),mother->GetPdgCode(),mother->P());
+    mother->Print();
+    imo =  mother->GetFirstMother();
+  }
+  Printf("########################");
+}