]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Update of the code used for muon-tracklet analysis
authorekryshen <evgeny.kryshen@cern.ch>
Tue, 24 Jun 2014 13:29:57 +0000 (15:29 +0200)
committerekryshen <evgeny.kryshen@cern.ch>
Tue, 24 Jun 2014 13:29:57 +0000 (15:29 +0200)
PWGCF/Correlations/Base/AliAnalysisTaskCFTree.cxx
PWGCF/Correlations/Base/AliAnalysisTaskCFTree.h

index b3d304a081918d9bb396039bb033ed3fc2eafc60..c8af7bfda035cb56feae76a3a36e5693faaf9324 100644 (file)
 #include "AliESDEvent.h"
 #include "AliAODEvent.h"
 #include "AliMCEvent.h"
-#include "AliHeader.h"
-#include "AliESDHeader.h"
-#include "AliAODHeader.h"
-#include "AliAODMCHeader.h"
-#include "AliGenEventHeader.h"
-#include "AliGenCocktailEventHeader.h"
 #include "AliAODTrack.h"
 #include "AliESDtrack.h"
-#include "AliMCParticle.h"
-#include "AliAODMCParticle.h"
 #include "AliExternalTrackParam.h"
 #include "AliCentrality.h"
 #include "AliAnalysisFilter.h"
-#include "AliPIDResponse.h"
-#include "AliTPCPIDResponse.h"
-#include "AliAODTracklets.h"
+#include "AliVMultiplicity.h"
+#include "AliAnalysisUtils.h"
 // root
 #include "TMath.h"
 #include "TFile.h"
@@ -52,34 +43,31 @@ ClassImp(AliAnalysisTaskCFTree)
 
 //-----------------------------------------------------------------------------
 AliAnalysisTaskCFTree::AliAnalysisTaskCFTree(const char* name) :
-  AliAnalysisTask(name,""),
-  fDebug(0),
-  fMode(0),
-  fIsAOD(1),
-  fInputHandler(0x0),
-  fMcHandler(0x0),
+  AliAnalysisTaskSE(name),
   fTrackFilter(0x0),
   fHybridConstrainedMask(0),
   fTPConlyConstrainedMask(0),
-  fPIDResponse(0x0),
+  fUtils(0x0),
   fListOfHistos(0x0),
   fEventStatistics(0x0),
   fTree(0x0),
-  fParticles(0x0),
+  fTracks(0x0),
   fTracklets(0x0),
   fMuons(0x0),
+  fMcParticles(0x0),
   fField(0),
-  fCentrality(0),
-  fZvtx(0),
-  fRunNumber(0),
+  fCentrality(),
+  fVtxZ(0),
+  fVtxTPConly(0),
+  fVtxContributors(0),
   fPeriod(0),
   fOrbit(),
   fBc(),
   fSelectMask(0),
-  fSelectBit(AliVEvent::kMB),
+  fIsPileupSPD(0),
+  fIsPileupMV(0),
+  fSelectBit(AliVEvent::kAny),
   fZVertexCut(10.),
-  fnTracksVertex(1),
-  fCentralityMethod("V0M"),
   fTrackFilterBit(0xffffffff),
   fTrackEtaCut(1.0),
   fPtMin(0.15),
@@ -89,27 +77,22 @@ AliAnalysisTaskCFTree::AliAnalysisTaskCFTree(const char* name) :
   fDphiCut(1.e9),
   fStoreTracks(0),
   fStoreTracklets(0),
-  fStoreMuons(0)
+  fStoreMuons(0),
+  fStoreMcTracks(0),
+  fStoreMcTracklets(0),
+  fStoreMcMuons(0),
+  fStorePidInfo(0)
 {
   Info("AliAnalysisTaskCFTree","Calling Constructor");
   DefineInput(0,TChain::Class());
-  DefineOutput(0,TList::Class());
-  DefineOutput(1,TTree::Class());
+  DefineOutput(1,TList::Class());
+  DefineOutput(2,TTree::Class());
 }
 //-----------------------------------------------------------------------------
 
 
 //-----------------------------------------------------------------------------
-void AliAnalysisTaskCFTree::ConnectInputData(Option_t* /*option*/){
-  fInputHandler = dynamic_cast<AliInputEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
-  fMcHandler    = dynamic_cast<AliInputEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
-  if (fInputHandler) fInputHandler->SetNeedField();
-}
-//-----------------------------------------------------------------------------
-
-
-//-----------------------------------------------------------------------------
-void AliAnalysisTaskCFTree::CreateOutputObjects(){
+void AliAnalysisTaskCFTree::UserCreateOutputObjects(){
   fListOfHistos = new TList();
   fListOfHistos->SetOwner();
   fEventStatistics = new TH1I("fEventStatistics","",10,0,10);
@@ -117,272 +100,231 @@ void AliAnalysisTaskCFTree::CreateOutputObjects(){
 
   fListOfHistos->Add(fEventStatistics);
 
-  if (fStoreTracks)    fParticles = new TClonesArray("AliCFParticle",2000);
-  if (fStoreTracklets) fTracklets = new TClonesArray("AliCFParticle",100);
-  if (fStoreMuons)     fMuons     = new TClonesArray("AliCFParticle",100);
+  if (fStoreTracks)    fTracks      = new TClonesArray("AliCFParticle",2000);
+  if (fStoreTracklets) fTracklets   = new TClonesArray("AliCFParticle",2000);
+  if (fStoreMuons)     fMuons       = new TClonesArray("AliCFParticle",2000);
+  if (fStoreMcTracks)  fMcParticles = new TClonesArray("AliCFParticle",2000);
   // create file-resident tree
   TDirectory *owd = gDirectory;
   OpenFile(1);
   fTree = new TTree("events","events");
   owd->cd();
-  fTree->Branch("cent",&fCentrality);
-  fTree->Branch("zvtx",&fZvtx);
+  fTree->Branch("cent",&fCentrality,"fCentrality[6]/F");
+  fTree->Branch("vtxz",&fVtxZ);
+  fTree->Branch("vtxTPConly",&fVtxTPConly);
+  fTree->Branch("vtxContributors",&fVtxContributors);
   fTree->Branch("field",&fField);
-  fTree->Branch("run",&fRunNumber);
+  fTree->Branch("run",&fCurrentRunNumber);
   fTree->Branch("period",&fPeriod);
   fTree->Branch("orbit",&fOrbit);
   fTree->Branch("bc",&fBc);
   fTree->Branch("mask",&fSelectMask);
-  if (fStoreTracks)    fTree->Branch("particles",&fParticles);
-  if (fStoreTracklets) fTree->Branch("tracklets",&fTracklets);
-  if (fStoreMuons)     fTree->Branch("muons",&fMuons);
-  PostData(0,fListOfHistos);
-  PostData(1,fTree);
+  fTree->Branch("pileupspd",&fIsPileupSPD);
+  fTree->Branch("pileupmv",&fIsPileupMV);
+  if (fTracks)      fTree->Branch("tracks",&fTracks);
+  if (fTracklets)   fTree->Branch("tracklets",&fTracklets);
+  if (fMuons)       fTree->Branch("muons",&fMuons);
+  if (fMcParticles) fTree->Branch("mcparticles",&fMcParticles);
+
+  fUtils = new AliAnalysisUtils();
+
+  PostData(1,fListOfHistos);
+  PostData(2,fTree);
 }
 //-----------------------------------------------------------------------------
 
 
 //-----------------------------------------------------------------------------
-void AliAnalysisTaskCFTree::Exec(Option_t *){
-  if (fParticles) fParticles->Clear();
-  if (fTracklets) fTracklets->Clear();
-  if (fMuons)     fMuons->Clear();
-  
+void AliAnalysisTaskCFTree::UserExec(Option_t *){
   fEventStatistics->Fill("before cuts",1);
   
-  AliVEvent* event = fInputHandler->GetEvent();
-  if (!event) return;
+  if (!fInputEvent) return;
   fEventStatistics->Fill("after event check",1);
   
-  fPIDResponse = fInputHandler->GetPIDResponse();
+  // TODO
+  //  TString classes = fInputEvent->GetFiredTriggerClasses();
+  //  fClassesFired = 0;
+  //  fClassesFired |= (classes.Contains("CINT7-S-") << 0);
+  //  fClassesFired |= (classes.Contains("CINT7-B-") << 0);
+  //  fClassesFired |= (classes.Contains("CSHM8-S-") << 1);
+  //  fClassesFired |= (classes.Contains("CSHM8-B-") << 1);
+  //  fClassesFired |= (classes.Contains("CMSL7-S-") << 2);
+  //  fClassesFired |= (classes.Contains("CMSL7-B-") << 2);
+  //  fClassesFired |= (classes.Contains("CMSH7-S-") << 3);
+  //  fClassesFired |= (classes.Contains("CMSH7-B-") << 3);
+  //  fClassesFired |= (classes.Contains("CMUL7-S-") << 4);
+  //  fClassesFired |= (classes.Contains("CMUL7-B-") << 4);
+  //  fClassesFired |= (classes.Contains("CMLL7-S-") << 5);
+  //  fClassesFired |= (classes.Contains("CMLL7-B-") << 5);
+  //  fClassesFired |= (classes.Contains("CINT8-S-") << 6);
+  //  fClassesFired |= (classes.Contains("CSPI7-S-") << 7);
+  //  fClassesFired |= (classes.Contains("CSPI8-S-") << 8);
+  //  fClassesFired |= (classes.Contains("CMSL8-S-") << 9);
+  //  fClassesFired |= (classes.Contains("CMSH8-S-") <<10);
+  //  fClassesFired |= (classes.Contains("CMUL8-S-") <<11);
+  //  fClassesFired |= (classes.Contains("CMLL8-S-") <<12);
+  //  fClassesFired |= (classes.Contains("C0MUL-SA") <<13);
+  //  fClassesFired |= (classes.Contains("C0MUL-SC") <<14);
+  //  if (!fClassesFired) return;
+  //  fEventStatistics->Fill("after trigger check",1);
   
   fSelectMask = fInputHandler->IsEventSelected();
   if (!(fSelectMask & fSelectBit)) return;
-  fEventStatistics->Fill("after trigger selection",1);
-  fRunNumber  = event->GetRunNumber();
-  fPeriod     = event->GetPeriodNumber();
-  fOrbit      = event->GetOrbitNumber();
-  fBc         = event->GetBunchCrossNumber();
-  fField      = event->GetMagneticField();
-  fCentrality = event->GetCentrality()->GetCentralityPercentile(fCentralityMethod);
   
-  if (fMode==0){ // Data analysis
-    const AliVVertex* vertex  = event->GetPrimaryVertex();
-    if (!vertex) return;
-    fZvtx  = vertex->GetZ();
-    TString name(vertex->GetName());
-    if (name.CompareTo("PrimaryVertex") && name.CompareTo("SPDVertex")) return; // Reject TPC only vertex
-    fEventStatistics->Fill("after rejection of TPC only vertex",1);
-    if (TMath::Abs(fZvtx) >= fZVertexCut || vertex->GetNContributors()<fnTracksVertex)  return;
-    fEventStatistics->Fill("after vertex selection",1);
-    
-    if (fParticles) {
-      for (Int_t ipart=0;ipart<event->GetNumberOfTracks();ipart++){
-        AliVTrack* track = (AliVTrack*) event->GetTrack(ipart);
-        if (!track) continue;
-        UInt_t mask = GetFilterMap(track);
-        if (!(mask & fTrackFilterBit)) continue;
+  fEventStatistics->Fill("after physics selection",1);
+  
+  fPeriod        = fInputEvent->GetPeriodNumber();
+  fOrbit         = fInputEvent->GetOrbitNumber();
+  fBc            = fInputEvent->GetBunchCrossNumber();
+  fField         = fInputEvent->GetMagneticField();
+  fCentrality[0] = fInputEvent->GetCentrality()->GetCentralityPercentile("V0M");
+  fCentrality[1] = fInputEvent->GetCentrality()->GetCentralityPercentile("V0A");
+  fCentrality[2] = fInputEvent->GetCentrality()->GetCentralityPercentile("V0C");
+  fCentrality[3] = fInputEvent->GetCentrality()->GetCentralityPercentile("CL1");
+  fCentrality[4] = fInputEvent->GetCentrality()->GetCentralityPercentile("ZNA");
+  fCentrality[5] = fInputEvent->GetCentrality()->GetCentralityPercentile("ZNC");
+  fIsPileupSPD   = fUtils->IsPileUpSPD(fInputEvent);
+  fIsPileupMV    = fUtils->IsPileUpMV(fInputEvent);
+//  fNofITSClusters[i] = esd->GetMultiplicity()->GetNumberOfITSClusters(i);
+  
+  const AliVVertex* vertex  = fInputEvent->GetPrimaryVertex();
+  fVtxZ  = vertex->GetZ();
+  fVtxTPConly = TString(vertex->GetName()).CompareTo("PrimaryVertex") && TString(vertex->GetName()).CompareTo("SPDVertex");
+  fVtxContributors = vertex->GetNContributors();
+  if (TMath::Abs(fVtxZ) >= fZVertexCut)  return;
+  fEventStatistics->Fill("after vertex cut",1);
+  
+  if (fTracks) {
+    fTracks->Clear();
+    for (Int_t ipart=0;ipart<fInputEvent->GetNumberOfTracks();ipart++){
+      AliVTrack* track = (AliVTrack*) fInputEvent->GetTrack(ipart);
+      if (!track) continue;
+      UInt_t mask = GetFilterMap(track);
+      if (!(mask & fTrackFilterBit)) continue;
 
-        if (track->InheritsFrom("AliAODTrack")) AddTrack(track,mask,0);
-        else if (track->InheritsFrom("AliESDtrack")) {
-          if (mask)                           AddTrack(track,mask,1);
-          if (mask & fHybridConstrainedMask)  AddTrack(track,mask,2);
-          if (mask & fTPConlyConstrainedMask) AddTrack(track,mask,3);
-        }
-      }
-    }
-    if (fIsAOD){
-      AliAODEvent* aod = (AliAODEvent*) event;
-      
-      if (fStoreTracklets){
-        AliAODTracklets* tracklets = aod->GetTracklets();
-        Int_t nTracklets = tracklets->GetNumberOfTracklets();
-        for (Int_t i=0;i<nTracklets;i++){
-          Float_t phi   = tracklets->GetPhi(i);
-          Float_t theta = tracklets->GetTheta(i);
-          Float_t dphi  = tracklets->GetDeltaPhi(i);
-          if (TMath::Abs(dphi)>fDphiCut) continue;
-          new ((*fTracklets)[fTracklets->GetEntriesFast()]) AliCFParticle(dphi,-TMath::Log(TMath::Tan(theta/2)),phi,0,0);
-        }
-      }
-      
-      if (fStoreMuons){
-        for (Int_t iTrack = 0; iTrack < aod->GetNTracks(); iTrack++) {
-          AliAODTrack* track = aod->GetTrack(iTrack);
-          if (!track->IsMuonTrack()) continue;
-          Float_t pt     = track->Pt();
-          Float_t eta    = track->Eta();
-          Float_t phi    = track->Phi();
-          Short_t charge = track->Charge();
-          Float_t dca    = track->DCA();
-          Float_t chi2   = track->Chi2perNDF();
-          Float_t rabs   = track->GetRAtAbsorberEnd();
-          Int_t   mask   = track->GetMatchTrigger();
-          if (rabs < 17.6 || rabs > 89.5) continue;
-          if (eta < -4 || eta > -2.5) continue;
-          AliCFParticle* part = new ((*fMuons)[fMuons->GetEntriesFast()]) AliCFParticle(pt,eta,phi,charge,mask,3);
-          part->SetAt(dca,0);
-          part->SetAt(chi2,1);
-          part->SetAt(rabs,2);
-        }
+      if (track->InheritsFrom("AliAODTrack")) AddTrack(track,mask,0);
+      else if (track->InheritsFrom("AliESDtrack")) {
+        if (mask)                           AddTrack(track,mask,1);
+        if (mask & fHybridConstrainedMask)  AddTrack(track,mask,2);
+        if (mask & fTPConlyConstrainedMask) AddTrack(track,mask,3);
       }
     }
   }
   
-  else { // MC analysis
-    AliMCEvent* mcEvent = fMcHandler ? fMcHandler->MCEvent() : 0;
-    TClonesArray* mcTracks = dynamic_cast<TClonesArray*>(event->FindListObject(AliAODMCParticle::StdBranchName()));
-    if (!mcEvent && !mcTracks) { printf("No mc object found\n"); return; }
-    fEventStatistics->Fill("after mc objects check",1);
-
-    Int_t nPrimGen = 0;
-    Int_t nProduced = 0;
-    if (mcEvent) { // ESD
-      AliHeader* header = (AliHeader*) mcEvent->Header();
-      AliGenCocktailEventHeader* cocktailHeader = dynamic_cast<AliGenCocktailEventHeader*> (header->GenEventHeader());
-      AliGenEventHeader* mcHeader = dynamic_cast<AliGenEventHeader*> (cocktailHeader ? cocktailHeader->GetHeaders()->First() : header->GenEventHeader());
-      if (!mcHeader) { printf("mc header not found\n"); return; }
-      nProduced = mcEvent->GetNumberOfTracks();
-      nPrimGen = mcHeader->NProduced();
-      fZvtx = mcEvent->GetPrimaryVertex()->GetZ();
-    } else { // AOD
-      AliAODMCHeader* mcHeader = (AliAODMCHeader*) event->FindListObject(AliAODMCHeader::StdBranchName());
-      if (!mcHeader) { printf("AliAODMCHeader not found\n"); return; }
-      if (mcHeader->GetCocktailHeaders()) {
-        nProduced = mcTracks->GetEntriesFast();
-        AliGenEventHeader* header0 =  mcHeader->GetCocktailHeader(0);
-        if (!header0) { printf("first header expected but not found\n"); return; }
-        nPrimGen = header0->NProduced();
-      } else  nPrimGen = nProduced;
-      fZvtx = mcHeader->GetVtxZ();
+  if (fTracklets){
+    fTracklets->Clear();
+    AliVMultiplicity* mult = fInputEvent->GetMultiplicity();
+    Int_t nTracklets = mult->GetNumberOfTracklets();
+    for (Int_t i=0;i<nTracklets;i++){
+      Float_t phi   = mult->GetPhi(i);
+      Float_t eta   = -TMath::Log(TMath::Tan(mult->GetTheta(i)/2));
+      Float_t dphi  = mult->GetDeltaPhi(i);
+      if (TMath::Abs(dphi)>fDphiCut) continue;
+      AliCFParticle* tracklet = new ((*fTracklets)[fTracklets->GetEntriesFast()]) AliCFParticle(dphi,eta,phi,0,0,fStoreMcTracklets?4:0);
+      if (!fStoreMcTracklets || !fMCEvent) continue;
+      Int_t label1 = mult->GetLabel(i,0);
+      Int_t label2 = mult->GetLabel(i,1);
+      if (label1!=label2) continue;
+      AliVParticle* particle = fMCEvent->GetTrack(label1);
+      if (!particle) continue;
+      Short_t charge = particle->Charge();
+      Float_t ptMC   = particle->Pt();
+      Float_t etaMC  = particle->Eta();
+      Float_t phiMC  = particle->Phi();
+      Float_t pdg    = particle->PdgCode();
+      tracklet->SetCharge(charge);
+      tracklet->SetAt(ptMC,0);
+      tracklet->SetAt(etaMC,1);
+      tracklet->SetAt(phiMC,2);
+      tracklet->SetAt(pdg,3);
     }
-    fEventStatistics->Fill("after mc header check",1);
-
-    if (TMath::Abs(fZvtx)>fZVertexCut) return;
-    fEventStatistics->Fill("after MC vertex cut",1);
-
-    const AliVVertex* vertex = event->GetPrimaryVertex();
-    if (!vertex) return;
-    fEventStatistics->Fill("after check for vertex object",1);
-    TString name(vertex->GetName());
-    if (name.CompareTo("PrimaryVertex") && name.CompareTo("SPDVertex")) fZvtx=1000; // Reject TPC only vertex
-    fEventStatistics->Fill("after rejection of TPC only vertex",1);
-    if (vertex->GetNContributors()<fnTracksVertex)  fZvtx=-1000;
-    fEventStatistics->Fill("after check for vertex contributors",1);
-    
-    if (fParticles) {
-      UInt_t* masks = new UInt_t[nProduced];
-      for (Int_t i=0;i<nProduced;i++) masks[i]=0;
-      
-      // Loop over reconstructed tracks to set masks
-      for (Int_t ipart=0;ipart<event->GetNumberOfTracks();ipart++){
-        AliVTrack* part = (AliVTrack*) event->GetTrack(ipart);
-        if (!part) continue;
-        Int_t label = TMath::Abs(part->GetLabel());
-        if (label>=nProduced) continue;
-        masks[label] |= GetFilterMap(part);
-      }
-      
-      // Loop over mc tracks to be stored
-      for (Int_t ipart=0;ipart<nProduced;ipart++){
-        AliVParticle* part = 0;
-        Bool_t isPrimary = 0;
-        if (mcTracks) { // AOD analysis
-          AliAODMCParticle* particle = (AliAODMCParticle*) mcTracks->At(ipart);
-          if (!particle) continue;
-          // skip injected signals
-          AliAODMCParticle* mother = particle;
-          while (!mother->IsPrimary()) mother = (AliAODMCParticle*) mcTracks->At(mother->GetMother());
-          if (mother->GetLabel()>=nPrimGen) continue;
-          part = particle;
-          // check for primary
-          isPrimary = particle->IsPhysicalPrimary();
-        } else { // ESD analysis
-          AliMCParticle* particle = (AliMCParticle*) mcEvent->GetTrack(ipart);
-          if (!particle) continue;
-          // skip injected signals
-          AliMCParticle* mother = particle;
-          while (mother->GetMother()>=0) mother = (AliMCParticle*) mcEvent->GetTrack(mother->GetMother());
-          if (mother->GetLabel()>=nPrimGen) continue;
-          part = particle;
-          // check for primary
-          isPrimary = mcEvent->IsPhysicalPrimary(ipart);
-        }
-        
-        // store only primaries and all reconstructed (non-zero mask)
-        Int_t mask = masks[ipart];
-        if (isPrimary) mask |= (1 << 30);
-        if (!mask) continue; 
-        AddTrack(part,mask);
+  }
+  
+  AliAODEvent* aod = dynamic_cast<AliAODEvent*> (fInputEvent);
+  if (fMuons && aod){ // aod only
+    fMuons->Clear();
+    for (Int_t iTrack = 0; iTrack < aod->GetNTracks(); iTrack++) {
+      AliAODTrack* track = aod->GetTrack(iTrack);
+      if (!track->IsMuonTrack()) continue;
+      Float_t pt     = track->Pt();
+      Float_t eta    = track->Eta();
+      Float_t phi    = track->Phi();
+      Short_t charge = track->Charge();
+      Float_t dca    = track->DCA();
+      Float_t chi2   = track->Chi2perNDF();
+      Float_t rabs   = track->GetRAtAbsorberEnd();
+      Int_t   mask   = track->GetMatchTrigger();
+      if (rabs < 17.6 || rabs > 89.5) continue;
+      if (eta < -4 || eta > -2.5) continue;
+      AliCFParticle* part = new ((*fMuons)[fMuons->GetEntriesFast()]) AliCFParticle(pt,eta,phi,charge,mask,fStoreMcMuons?11:3);
+      part->SetAt(dca,0);
+      part->SetAt(chi2,1);
+      part->SetAt(rabs,2);
+      if (!fStoreMcMuons || !fMCEvent) continue;
+      Int_t label = TMath::Abs(track->GetLabel()); 
+      AliVParticle* mcpart = fMCEvent->GetTrack(label);
+      if (!mcpart) continue;
+      Int_t mcpdg = mcpart->PdgCode();
+      Float_t mcpt  = mcpart->Pt();
+      Float_t mceta = mcpart->Eta();
+      Float_t mcphi = mcpart->Phi();
+      part->SetAt(mcpt,3);
+      part->SetAt(mceta,4);
+      part->SetAt(mcphi,5);
+      part->SetAt(mcpdg,6);
+      part->SetAt(0,10);
+      Bool_t isPrimary = fMCEvent->IsPhysicalPrimary(label);
+      if (isPrimary) continue;
+      label = mcpart->GetMother();
+      while (!isPrimary && label>=0) {
+        mcpart = (AliVParticle*) fMCEvent->GetTrack(label);
+        label = mcpart->GetMother();
+        isPrimary = fMCEvent->IsPhysicalPrimary(label);
       }
-      delete[] masks;
+      if (!mcpart) continue;
+      Float_t mcprimarypt  = mcpart->Pt();
+      Float_t mcprimaryeta = mcpart->Eta();
+      Float_t mcprimaryphi = mcpart->Phi();
+      Int_t   mcprimarypdg = mcpart->PdgCode();
+      part->SetAt(mcprimarypt,7);
+      part->SetAt(mcprimaryeta,8);
+      part->SetAt(mcprimaryphi,9);
+      part->SetAt(mcprimarypdg,10);
     }
-    
-    if (fIsAOD){
-      AliAODEvent* aod = (AliAODEvent*) event;
-    
-      if (fTracklets) {
-        AliAODTracklets* tracklets = aod->GetTracklets();
-        Int_t nTracklets = tracklets->GetNumberOfTracklets();
-        for (Int_t i=0;i<nTracklets;i++){
-          Float_t phi   = tracklets->GetPhi(i);
-          Float_t theta = tracklets->GetTheta(i);
-          Float_t dphi  = tracklets->GetDeltaPhi(i);
-          if (TMath::Abs(dphi)>fDphiCut) continue;
-          AliCFParticle* tracklet = new ((*fTracklets)[fTracklets->GetEntriesFast()]) AliCFParticle(dphi,-TMath::Log(TMath::Tan(theta/2)),phi,0,0,4);
-          Int_t label1 = tracklets->GetLabel(i,0);
-          Int_t label2 = tracklets->GetLabel(i,1);
-          if (label1!=label2) continue;
-          if (!mcTracks) continue;
-          AliAODMCParticle* particle = (AliAODMCParticle*) mcTracks->At(label1);
-          if (!particle) continue;
-          Short_t charge = particle->Charge();
-          Float_t ptMC   = particle->Pt();
-          Float_t etaMC  = particle->Eta();
-          Float_t phiMC  = particle->Phi();
-          Float_t pdg    = particle->PdgCode();
-          tracklet->SetCharge(charge);
-          tracklet->SetAt(ptMC,0);
-          tracklet->SetAt(etaMC,1);
-          tracklet->SetAt(phiMC,2);
-          tracklet->SetAt(pdg,3);
-        }
-      }
+  }
 
-      if (fMuons){
-        for (Int_t iTrack = 0; iTrack < aod->GetNTracks(); iTrack++) {
-          AliAODTrack* track = aod->GetTrack(iTrack);
-          if (!track->IsMuonTrack()) continue;
-          Float_t pt     = track->Pt();
-          Float_t eta    = track->Eta();
-          Float_t phi    = track->Phi();
-          Short_t charge = track->Charge();
-          Float_t dca    = track->DCA();
-          Float_t chi2   = track->Chi2perNDF();
-          Float_t rabs   = track->GetRAtAbsorberEnd();
-          Int_t   mask   = track->GetMatchTrigger();
-          if (rabs < 17.6 || rabs > 89.5) continue;
-          if (eta < -4 || eta > -2.5) continue;
-          AliCFParticle* part = new ((*fMuons)[fMuons->GetEntriesFast()]) AliCFParticle(pt,eta,phi,charge,mask,3);
-          part->SetAt(dca,0);
-          part->SetAt(chi2,1);
-          part->SetAt(rabs,2);
-        }
-      }
+  if (fMcParticles && fMCEvent) {
+    fMcParticles->Clear();
+    TString gen;
+    for (Int_t ipart=0;ipart<fMCEvent->GetNumberOfTracks();ipart++){
+      AliVParticle* part = fMCEvent->GetTrack(ipart);
+      Bool_t isCocktail = fMCEvent->GetCocktailGenerator(ipart,gen);
+      if (isCocktail && !gen.Contains("Pythia") && !gen.Contains("Hijing") && !gen.Contains("AMPT") && !gen.Contains("DPMJET")) continue;
+      Float_t pt     = part->Pt();
+      Float_t eta    = part->Eta();
+      Float_t phi    = part->Phi();
+      Char_t  charge = part->Charge();
+      Int_t   mask   = part->PdgCode();
+      // TODO
+      //  Bool_t isPrimary = fMCEvent->IsPhysicalPrimary(ipart);
+      // if (pt < fMcPtMin) continue;
+      // if (TMath::Abs(eta) > fMcTrackEtaCut) continue;
+      new ((*fMcParticles)[fMcParticles->GetEntriesFast()]) AliCFParticle(pt,eta,phi,charge,mask);
     }
   }
+
   fTree->Fill();
-  PostData(0,fListOfHistos);
-  PostData(1,fTree);
+  PostData(1,fListOfHistos);
+  PostData(2,fTree);
 }
 //-----------------------------------------------------------------------------
 
 
 //-----------------------------------------------------------------------------
-UInt_t AliAnalysisTaskCFTree::GetFilterMap(AliVParticle* particle){
+UInt_t AliAnalysisTaskCFTree::GetFilterMap(AliVTrack* track){
   UInt_t mask = 0;
-  if (particle->InheritsFrom("AliAODTrack")) {
-    AliAODTrack* part = (AliAODTrack*) particle;
+  if (track->InheritsFrom("AliAODTrack")) {
+    AliAODTrack* part = (AliAODTrack*) track;
     mask = part->GetFilterMap();
     Double_t nCrossedRaws      = part->GetTPCNCrossedRows();
     Double_t nFindableClusters = part->GetTPCNclsF();
@@ -394,8 +336,8 @@ UInt_t AliAnalysisTaskCFTree::GetFilterMap(AliVParticle* particle){
     if (itsRefit)                                           mask |= (1 << 28);
     if (nSharedClusters/nClusters<=fSharedClusterCut)       mask |= (1 << 29);
     if (part->GetLabel()<0)                                 mask |= (1 << 31);
-  } else if (particle->InheritsFrom("AliESDtrack")){
-    AliESDtrack* part = (AliESDtrack*) particle;
+  } else if (track->InheritsFrom("AliESDtrack")){
+    AliESDtrack* part = (AliESDtrack*) track;
     if (!fTrackFilter) AliFatal("Track filter undefined");
     mask |= fTrackFilter->IsSelected(part);
   }
@@ -406,34 +348,34 @@ UInt_t AliAnalysisTaskCFTree::GetFilterMap(AliVParticle* particle){
 
 
 //-----------------------------------------------------------------------------
-AliCFParticle* AliAnalysisTaskCFTree::AddTrack(AliVParticle* part, UInt_t mask, UInt_t flag){
+AliCFParticle* AliAnalysisTaskCFTree::AddTrack(AliVTrack* track, UInt_t mask, UInt_t flag){
 
-  // skip neutral mc particles
-  Char_t charge = part->Charge();
+  // skip neutral mc trackicles
+  Char_t charge = track->Charge();
   if (charge==0) return NULL;
   
   // set pt,eta,phi
   Float_t pt=0,eta=0,phi=0;
-  if (flag==0 || flag==1){ // AOD, MC or Global ESD tracks
-    pt  = part->Pt();
-    eta = part->Eta();
-    phi = part->Phi();
+  if (flag==0 || flag==1){ // AOD or Global ESD tracks
+    pt  = track->Pt();
+    eta = track->Eta();
+    phi = track->Phi();
     if  (flag==1) mask &= (~fHybridConstrainedMask) & (~fTPConlyConstrainedMask);
   } 
   else if (flag==2) { // Hybrid constrained tracks (ESD)
-    AliESDtrack* track = (AliESDtrack*) part;
-    const AliExternalTrackParam* param = track->GetConstrainedParam();
+    AliESDtrack* part = (AliESDtrack*) track;
+    const AliExternalTrackParam* param = part->GetConstrainedParam();
     pt  = param->Pt();
     eta = param->Eta();
     phi = param->Phi();
     mask &= fHybridConstrainedMask;
   } 
   else if (flag==3) { // TPC only constrained tracks (ESD)
-    AliESDtrack* track = (AliESDtrack*) part;
+    AliESDtrack* part = (AliESDtrack*) track;
     AliESDtrack tpcTrack;
-    if (!track->FillTPCOnlyTrack(tpcTrack)) return NULL;
+    if (!part->FillTPCOnlyTrack(tpcTrack)) return NULL;
     AliExternalTrackParam param;
-    const AliESDVertex* vtxSPD = ((AliESDEvent*) fInputHandler->GetEvent())->GetPrimaryVertexSPD();
+    const AliESDVertex* vtxSPD = ((AliESDEvent*) fInputEvent)->GetPrimaryVertexSPD();
     if (!tpcTrack.RelateToVertexTPC(vtxSPD,fField,1.e30,&param)) return NULL;
     pt  = param.Pt();
     eta = param.Eta();
@@ -444,11 +386,9 @@ AliCFParticle* AliAnalysisTaskCFTree::AddTrack(AliVParticle* part, UInt_t mask,
   // kinematic cuts
   if (pt < fPtMin || TMath::Abs(eta) > fTrackEtaCut) return NULL;
 
-  
-  AliCFParticle* cfpart = new ((*fParticles)[fParticles->GetEntriesFast()]) AliCFParticle(pt,eta,phi,charge,mask,3);
+  AliCFParticle* cftrack = new ((*fTracks)[fTracks->GetEntriesFast()]) AliCFParticle(pt,eta,phi,charge,mask,fStorePidInfo ? 3: 0);
 
-  AliVTrack* track = dynamic_cast<AliVTrack*> (part);
-  if (!track) return cfpart;
+  if (!fStorePidInfo) return cftrack;
   Float_t ncl  = track->GetTPCsignalN();
   Float_t dedx = track->GetTPCsignalTunedOnData(); if (dedx<=0) dedx = track->GetTPCsignal();
   Float_t beta = -99;
@@ -457,8 +397,8 @@ AliCFParticle* AliAnalysisTaskCFTree::AddTrack(AliVParticle* part, UInt_t mask,
     track->GetIntegratedTimes(tof);
     beta = tof[0]/track->GetTOFsignal();
   }
-  cfpart->SetAt(ncl,0);
-  cfpart->SetAt(dedx,1);
-  cfpart->SetAt(beta,2);
-  return cfpart;
+  cftrack->SetAt(ncl,0);
+  cftrack->SetAt(dedx,1);
+  cftrack->SetAt(beta,2);
+  return cftrack;
 }
index d14b83f52ab1be0c8a7b00bb6ea6edbca0bc911a..1ea96e700fa5ef863a487976a959c3f00ffd15c8 100644 (file)
@@ -7,36 +7,29 @@
 // Analysis task to produce trees of lightweight events
 // evgeny.kryshen@cern.ch
 
-#include "AliAnalysisTask.h"
-class AliInputEventHandler;
+#include "AliAnalysisTaskSE.h"
 class TList;
 class TH1I;
 class TTree;
 class TClonesArray;
 class AliAnalysisFilter;
-class AliPIDResponse;
-class AliVParticle;
+class AliVTrack;
 class AliCFParticle;
+class AliAnalysisUtils;
 
-class AliAnalysisTaskCFTree : public AliAnalysisTask {
+class AliAnalysisTaskCFTree : public AliAnalysisTaskSE {
  public:
   AliAnalysisTaskCFTree(const char* name="AliAnalysisTaskCFTree");
   virtual ~AliAnalysisTaskCFTree(){};
-  virtual void ConnectInputData(Option_t *);
-  virtual void CreateOutputObjects();
-  virtual void Exec(Option_t *option);
+  virtual void UserCreateOutputObjects();
+  virtual void UserExec(Option_t *option);
 
   void SetTrackFilter(AliAnalysisFilter* filter) { fTrackFilter = filter; }
   void SetHybridConstrainedMask(UInt_t mask)  { fHybridConstrainedMask = mask; }
   void SetTPConlyConstrainedMask(UInt_t mask) { fTPConlyConstrainedMask = mask; }
-  void SetDebug(Int_t val)              { fDebug = val; }
-  void SetMode(Int_t val)               { fMode = val; }
-  void SetAOD(Bool_t val)               { fIsAOD = val; }
   // Event cut setters
   void SetEventSelectionBit(UInt_t val) { fSelectBit = val; }
   void SetZVertex(Float_t val)          { fZVertexCut = val; }
-  void SetTracksInVertex(Int_t val)     { fnTracksVertex = val; }
-  void SetCentralityMethod(char* val)   { fCentralityMethod = val; }
   // Track cut setters
   void SetTrackFilterBit(UInt_t val)    { fTrackFilterBit = val; }
   void SetTrackEtaCut(Float_t val)      { fTrackEtaCut = val; }
@@ -46,46 +39,48 @@ class AliAnalysisTaskCFTree : public AliAnalysisTask {
   void SetFoundFractionCut(Float_t val) { fFoundFractionCut = val;  }
   void SetDphiCut(Float_t val)          { fDphiCut = val; }
   // Switchers for additional data to be stored
-  void SetStoreTracks(Bool_t val=kTRUE)    { fStoreTracks    = val; }
-  void SetStoreTracklets(Bool_t val=kTRUE) { fStoreTracklets = val; }
-  void SetStoreMuons(Bool_t val=kTRUE)     { fStoreMuons     = val; }
+  void SetStoreTracks(Bool_t val=kTRUE)      { fStoreTracks      = val; }
+  void SetStoreTracklets(Bool_t val=kTRUE)   { fStoreTracklets   = val; }
+  void SetStoreMuons(Bool_t val=kTRUE)       { fStoreMuons       = val; }
+  void SetStoreMcTracks(Bool_t val=kTRUE)    { fStoreMcTracks    = val; }
+  void SetStoreMcTracklets(Bool_t val=kTRUE) { fStoreMcTracklets = val; }
+  void SetStoreMcMuons(Bool_t val=kTRUE)     { fStoreMcMuons     = val; }
+  void SetStorePidInfo(Bool_t val=kTRUE)     { fStorePidInfo     = val; }
 
  protected:
   AliAnalysisTaskCFTree(const  AliAnalysisTaskCFTree &task);
   AliAnalysisTaskCFTree& operator=(const  AliAnalysisTaskCFTree &task);
 
-  UInt_t GetFilterMap(AliVParticle* part);
-  AliCFParticle* AddTrack(AliVParticle* track, UInt_t mask, UInt_t flag=0);
+  UInt_t GetFilterMap(AliVTrack* part);
+  AliCFParticle* AddTrack(AliVTrack* track, UInt_t mask, UInt_t flag=0);
 
-  Int_t fDebug;               // debug level
-  Int_t fMode;                // Analysis mode: 0 - data, 1 - mc
-  Bool_t fIsAOD;              // kTRUE - AOD
-  AliInputEventHandler* fInputHandler; // AOD or ESD input handler 
-  AliInputEventHandler* fMcHandler;    // MC input handler (ESD)
-  AliAnalysisFilter* fTrackFilter;     // track filter used in ESD analysis
+  AliAnalysisFilter* fTrackFilter; // track filter used in ESD analysis
   UInt_t fHybridConstrainedMask;       // Filter mask for hybrid constrained tracks (ESD analysis)
   UInt_t fTPConlyConstrainedMask;      // Filter mask for TPConly constrained tracks (ESD analysis)
-  AliPIDResponse* fPIDResponse;        //!
+  AliAnalysisUtils* fUtils;   //! analysis utils to detect pileup
   TList* fListOfHistos;       //! list of output histograms
   TH1I*  fEventStatistics;    //! cut-by-cut counter of events
   TTree* fTree;               //! output tree
   // Tree variables
-  TClonesArray* fParticles;   //! tree var: selected AliCFParticles
+  TClonesArray* fTracks;      //! tree var: selected AliCFParticles
   TClonesArray* fTracklets;   //! tree var: selected tracklets (stored if fStoreTracklets=kTRUE)
   TClonesArray* fMuons;       //! tree var: selected muons (stored if fStoreMuons=kTRUE)
+  TClonesArray* fMcParticles; //! tree var: MC particles
   Float_t fField;             //  tree var: magnetic field value
-  Float_t fCentrality;        //  tree var: centrality
-  Float_t fZvtx;              //  tree var: z-vertex
-  Int_t fRunNumber;           //  tree var: run number
+  Float_t fCentrality[6];     //  tree var: centrality
+  Float_t fVtxZ;              //  tree var: z-vertex
+  Bool_t fVtxTPConly;         //  tree var: is vertex TPC only
+  UInt_t fVtxContributors;    //  tree var: number of vertex contributors
   UInt_t fPeriod;             //  tree var: period
   UInt_t fOrbit;              //  tree var: orbit
   UShort_t fBc;               //  tree var: bunch crossing
   UInt_t fSelectMask;         //  tree var: physics selection mask
+  Bool_t fIsPileupSPD;        //  tree var: is pileup from SPD flag
+  Bool_t fIsPileupMV;         //  tree var: is pileup from MV flag
+
   // Event cuts
   UInt_t fSelectBit;          // event selection bit
   Float_t fZVertexCut;        // Z-vertex cut
-  Int_t fnTracksVertex;       // min number of vertex contributors
-  TString  fCentralityMethod; // method to determine centrality
   // Track cuts
   UInt_t fTrackFilterBit;     // track filter bits to be stored
   Float_t fTrackEtaCut;       // maximum abs(eta) cut
@@ -98,7 +93,11 @@ class AliAnalysisTaskCFTree : public AliAnalysisTask {
   Bool_t fStoreTracks;        // if kTRUE - Barrel tracks will be stored as AliCFParticles
   Bool_t fStoreTracklets;     // if kTRUE - SPD tracklets will be stored as AliCFParticles
   Bool_t fStoreMuons;         // if kTRUE - muon tracks will be stored as AliCFParticles
-  ClassDef(AliAnalysisTaskCFTree,3);
+  Bool_t fStoreMcTracks;      // if kTRUE - mc particles will be stored as AliCFParticles
+  Bool_t fStoreMcTracklets;   // if kTRUE - Store Monte-Carlo info for tracklets
+  Bool_t fStoreMcMuons;       // if kTRUE - Store Monte-Carlo info for muons
+  Bool_t fStorePidInfo;       // if kTRUE - Store PID info for tracks
+  ClassDef(AliAnalysisTaskCFTree,4);
 };
 #endif