1 #include "AliAnalysisTaskHighPtDeDx.h"
12 #include <AliAnalysisManager.h>
13 #include <AliAnalysisFilter.h>
14 #include <AliESDInputHandler.h>
15 #include <AliESDEvent.h>
16 #include <AliESDVertex.h>
18 #include <AliExternalTrackParam.h>
19 #include <AliESDtrackCuts.h>
20 #include <AliESDVZERO.h>
21 #include <AliAODVZERO.h>
23 #include <AliMCEventHandler.h>
24 #include <AliMCEvent.h>
27 #include <TTreeStream.h>
29 #include <AliHeader.h>
30 #include <AliGenPythiaEventHeader.h>
31 #include <AliGenDPMjetEventHeader.h>
33 #include "AliCentrality.h"
35 #include <AliAODTrack.h>
36 #include <AliAODPid.h>
37 #include <AliAODMCHeader.h>
47 // Alexandru Dobrin (Wayne State)
48 // Peter Christiansen (Lund)
54 Separate the code into two
61 ClassImp(AliAnalysisTaskHighPtDeDx)
63 const Double_t AliAnalysisTaskHighPtDeDx::fgkClight = 2.99792458e-2;
65 //_____________________________________________________________________________
66 AliAnalysisTaskHighPtDeDx::AliAnalysisTaskHighPtDeDx():
74 fTrackFilterGolden(0x0),
78 fAnalysisPbPb(kFALSE),
84 fTrackArrayGlobalPar(0x0),
85 fTrackArrayTPCPar(0x0),
96 fTriggeredEventMB(-999),
103 fEvents(0x0), fVtx(0x0), fVtxMC(0x0), fVtxBeforeCuts(0x0), fVtxAfterCuts(0x0),
111 // Default constructor (should not be used)
113 // fRandom = new TRandom(0); // 0 means random seed
116 //______________________________________________________________________________
117 AliAnalysisTaskHighPtDeDx::AliAnalysisTaskHighPtDeDx(const char *name):
118 AliAnalysisTaskSE(name),
125 fTrackFilterGolden(0x0),
126 fTrackFilterTPC(0x0),
127 fAnalysisType("ESD"),
129 fAnalysisPbPb(kFALSE),
135 fTrackArrayGlobalPar(0x0),
140 fLowPtFraction(0.01),
142 fMcProcessType(-999),
143 fTriggeredEventMB(-999),
150 fEvents(0x0), fVtx(0x0), fVtxMC(0x0), fVtxBeforeCuts(0x0), fVtxAfterCuts(0x0),
159 // Output slot #1 writes into a TList
160 DefineOutput(1, TList::Class());
163 //_____________________________________________________________________________
164 AliAnalysisTaskHighPtDeDx::~AliAnalysisTaskHighPtDeDx()
167 // histograms are in the output list and deleted when the output
168 // list is deleted by the TSelector dtor
169 if (fListOfObjects && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
170 delete fListOfObjects;
173 if (fRandom) delete fRandom;
176 // //for proof running; I cannot create tree do to memory limitations -> work with THnSparse
177 // if (fListOfObjects && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fOutputList;
183 //______________________________________________________________________________
184 void AliAnalysisTaskHighPtDeDx::UserCreateOutputObjects()
186 // This method is called once per worker node
187 // Here we define the output: histograms and debug tree if requested
188 // We also create the random generator here so it might get different seeds...
189 fRandom = new TRandom(0); // 0 means random seed
192 fListOfObjects = new TList();
193 fListOfObjects->SetOwner();
198 fEvents = new TH1I("fEvents","Number of analyzed events; Events; Counts", 3, 0, 3);
199 fListOfObjects->Add(fEvents);
201 fn1=new TH1F("fn1","fn1",5001,-1,5000);
202 fListOfObjects->Add(fn1);
204 fn2=new TH1F("fn2","fn2",5001,-1,5000);
205 fListOfObjects->Add(fn2);
207 fcent=new TH1F("fcent","fcent",104,-2,102);
208 fListOfObjects->Add(fcent);
210 fVtx = new TH1I("fVtx","Vtx info (0=no, 1=yes); Vtx; Counts", 2, -0.5, 1.5);
211 fListOfObjects->Add(fVtx);
213 fVtxBeforeCuts = new TH1F("fVtxBeforeCuts", "Vtx distribution (before cuts); Vtx z [cm]; Counts", 120, -30, 30);
214 fListOfObjects->Add(fVtxBeforeCuts);
216 fVtxAfterCuts = new TH1F("fVtxAfterCuts", "Vtx distribution (before cuts); Vtx z [cm]; Counts", 120, -30, 30);
217 fListOfObjects->Add(fVtxAfterCuts);
220 fVtxMC = new TH1I("fVtxMC","Vtx info - no trigger cut (0=no, 1=yes); Vtx; Counts", 2, -0.5, 1.5);
221 fListOfObjects->Add(fVtxMC);
226 fTree = new TTree("tree","Event data");
227 fEvent = new DeDxEvent();
228 fTree->Branch("event", &fEvent);
230 fTrackArrayGlobalPar = new TClonesArray("DeDxTrack", 1000);
231 fTree->Bronch("trackGlobalPar", "TClonesArray", &fTrackArrayGlobalPar);
233 fTrackArrayTPCPar = new TClonesArray("DeDxTrack", 1000);
234 fTree->Bronch("trackTPCPar", "TClonesArray", &fTrackArrayTPCPar);
237 fVZEROArray = new TClonesArray("VZEROCell", 1000);
238 fTree->Bronch("cellVZERO", "TClonesArray", &fVZEROArray);
241 fTrackArrayMC = new TClonesArray("DeDxTrackMC", 1000);
242 fTree->Bronch("trackMC", "TClonesArray", &fTrackArrayMC);
245 fTree->SetDirectory(0);
247 fListOfObjects->Add(fTree);
252 PostData(1, fListOfObjects);
255 //______________________________________________________________________________
256 void AliAnalysisTaskHighPtDeDx::UserExec(Option_t *)
261 // First we make sure that we have valid input(s)!
263 AliVEvent *event = InputEvent();
265 Error("UserExec", "Could not retrieve event");
270 if (fAnalysisType == "ESD"){
271 fESD = dynamic_cast<AliESDEvent*>(event);
273 Printf("%s:%d ESDEvent not found in Input Manager",(char*)__FILE__,__LINE__);
278 fAOD = dynamic_cast<AliAODEvent*>(event);
280 Printf("%s:%d AODEvent not found in Input Manager",(char*)__FILE__,__LINE__);
290 if (fAnalysisType == "ESD"){
291 fMC = dynamic_cast<AliMCEvent*>(MCEvent());
293 Printf("%s:%d MCEvent not found in Input Manager",(char*)__FILE__,__LINE__);
298 fMCStack = fMC->Stack();
301 Printf("%s:%d MCStack not found in Input Manager",(char*)__FILE__,__LINE__);
307 fMC = dynamic_cast<AliMCEvent*>(MCEvent());
311 fMCArray = (TClonesArray*)fAOD->FindListObject("mcparticles");
313 Printf("%s:%d AOD MC array not found in Input Manager",(char*)__FILE__,__LINE__);
321 // Get trigger decision
322 fTriggeredEventMB = 0; //init
325 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
326 ->IsEventSelected() & ftrigBit1 ){
328 fTriggeredEventMB = 1; //event triggered as minimum bias
330 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
331 ->IsEventSelected() & ftrigBit2 ){
333 // kINT7 = BIT(1), // V0AND trigger, offline V0 selection
334 fTriggeredEventMB += 2;
339 // Get process type for MC
340 fMcProcessType = 0; // -1=invalid, 0=data, 1=ND, 2=SD, 3=DD
342 // real data that are not triggered we skip
343 if(!fAnalysisMC && !fTriggeredEventMB)
348 if (fAnalysisType == "ESD"){
350 AliHeader* headerMC = fMC->Header();
353 AliGenEventHeader* genHeader = headerMC->GenEventHeader();
354 TArrayF vtxMC(3); // primary vertex MC
355 vtxMC[0]=9999; vtxMC[1]=9999; vtxMC[2]=9999; //initialize with dummy
357 genHeader->PrimaryVertex(vtxMC);
362 AliGenPythiaEventHeader* pythiaGenHeader =
363 dynamic_cast<AliGenPythiaEventHeader*>(headerMC->GenEventHeader());
364 if (pythiaGenHeader) { //works only for pythia
365 fMcProcessType = GetPythiaEventProcessType(pythiaGenHeader->ProcessType());
368 AliGenDPMjetEventHeader* dpmJetGenHeader =
369 dynamic_cast<AliGenDPMjetEventHeader*>(headerMC->GenEventHeader());
370 if (dpmJetGenHeader) {
371 fMcProcessType = GetDPMjetEventProcessType(dpmJetGenHeader->ProcessType());
376 AliAODMCHeader* mcHeader = dynamic_cast<AliAODMCHeader*>(fAOD->FindListObject("mcHeader"));
378 fZvtxMC = mcHeader->GetVtxZ();
380 if(strstr(mcHeader->GetGeneratorName(), "Pythia")) {
381 fMcProcessType = GetPythiaEventProcessType(mcHeader->GetEventType());
383 fMcProcessType = GetDPMjetEventProcessType(mcHeader->GetEventType());
390 // Vertex: NO - status -1
391 // Vertex: YES : outside cut - status 0
392 // : inside cut - status 1
393 // We have to be careful how we normalize because we probably want to
395 // Nevents=(No vertex + outside + inside)/(out + in)*in
398 if (fAnalysisType == "ESD")
399 fZvtx = GetVertex(fESD);
401 fZvtx = GetVertex(fAOD);
408 if(fTriggeredEventMB)
414 if(fTriggeredEventMB)
418 fVtxBeforeCuts->Fill(fZvtx);
420 if (TMath::Abs(fZvtx) < fVtxCut) {
421 fVtxAfterCuts->Fill(fZvtx);
426 // store MC event data no matter what
429 if (fAnalysisType == "ESD") {
438 Float_t centrality = -10;
439 // only analyze triggered events
440 if(fTriggeredEventMB) {
442 if (fAnalysisType == "ESD"){
444 AliCentrality *centObject = fESD->GetCentrality();
445 centrality = centObject->GetCentralityPercentile("V0M");
446 if((centrality>fMaxCent)||(centrality<fMinCent))return;
448 fcent->Fill(centrality);
452 AliCentrality *centObject = fAOD->GetCentrality();
454 centrality = centObject->GetCentralityPercentile("V0M");
455 if((centrality>fMaxCent)||(centrality<fMinCent))return;
457 fcent->Fill(centrality);
464 fEvent->process = fMcProcessType;
465 fEvent->trig = fTriggeredEventMB;
466 fEvent->zvtxMC = fZvtxMC;
467 fEvent->cent = centrality;
470 fTrackArrayGlobalPar->Clear();
472 fTrackArrayTPCPar->Clear();
473 fVZEROArray->Clear();
476 fTrackArrayMC->Clear();
480 PostData(1, fListOfObjects);
483 //________________________________________________________________________
484 void AliAnalysisTaskHighPtDeDx::AnalyzeESD(AliESDEvent* esdEvent)
486 fRun = esdEvent->GetRunNumber();
488 if(esdEvent->GetHeader())
489 fEventId = GetEventIdAsLong(esdEvent->GetHeader());
491 Short_t isPileup = esdEvent->IsPileupFromSPD();
493 // Int_t event = esdEvent->GetEventNumberInFile();
494 UInt_t time = esdEvent->GetTimeStamp();
495 // ULong64_t trigger = esdEvent->GetTriggerMask();
496 Float_t magf = esdEvent->GetMagneticField();
502 if(fTriggeredEventMB) {// Only MC case can we have not triggered events
508 if(fVtxStatus!=1) return; // accepted vertex
509 Int_t nESDTracks = esdEvent->GetNumberOfTracks();
511 if(nESDTracks<1)return;
512 cout<<"Multiplicity="<<nESDTracks<<endl;
514 ProduceArrayTrksESD( esdEvent, kGlobalTrk );//produce array with global track parameters
516 ProduceArrayTrksESD( esdEvent, kTPCTrk );//array with tpc track parametes
519 AliESDVZERO *esdV0 = esdEvent->GetVZEROData();// loop sobre canales del V0 para obtener las multiplicidad
521 for (Int_t iCh=0; iCh<64; ++iCh) {
522 Float_t multv=esdV0->GetMultiplicity(iCh);
524 VZEROCell* cellv0 = new((*fVZEROArray)[iCh]) VZEROCell();
525 cellv0->cellindex=intexv;
526 cellv0->cellmult= multv;
531 } // end if triggered
536 fEvent->eventid = fEventId;
538 //fEvent->cent = centrality;
540 fEvent->zvtx = fZvtx;
541 fEvent->vtxstatus = fVtxStatus;
542 fEvent->pileup = isPileup;
551 //________________________________________________________________________
552 void AliAnalysisTaskHighPtDeDx::AnalyzeAOD(AliAODEvent* aodEvent)
554 fRun = aodEvent->GetRunNumber();
556 if(aodEvent->GetHeader())
557 fEventId = GetEventIdAsLong(aodEvent->GetHeader());
559 UInt_t time = 0; // Missing AOD info? aodEvent->GetTimeStamp();
560 Float_t magf = aodEvent->GetMagneticField();
562 //Int_t trackmult = 0; // no pt cuts
565 Short_t isPileup = aodEvent->IsPileupFromSPD();
570 if(fTriggeredEventMB) {// Only MC case can we have not triggered events
575 if(fVtxStatus!=1) return; // accepted vertex
576 Int_t nAODTracks = aodEvent->GetNumberOfTracks();
577 if(nAODTracks<1)return;
579 ProduceArrayTrksAOD( aodEvent, kGlobalTrk );
581 ProduceArrayTrksAOD( aodEvent, kTPCTrk );
584 AliAODVZERO *esdV0 = aodEvent->GetVZEROData();// loop sobre canales del V0 para obtener las multiplicidad
586 for (Int_t iCh=0; iCh<64; ++iCh) {
587 Float_t multv=esdV0->GetMultiplicity(iCh);
589 VZEROCell* cellv0 = new((*fVZEROArray)[iCh]) VZEROCell();
590 cellv0->cellindex=intexv;
591 cellv0->cellmult= multv;
597 } // end if triggered
601 //Sort(fTrackArrayGlobalPar, kFALSE);
604 fEvent->eventid = fEventId;
606 //fEvent->cent = centrality;
608 fEvent->zvtx = fZvtx;
609 fEvent->vtxstatus = fVtxStatus;
610 //fEvent->trackmult = trackmult;
611 //fEvent->n = nadded;
612 fEvent->pileup = isPileup;
616 //_____________________________________________________________________________
617 Float_t AliAnalysisTaskHighPtDeDx::GetVertex(const AliVEvent* event) const
621 const AliVVertex* primaryVertex = event->GetPrimaryVertex();
623 if(primaryVertex->GetNContributors()>0)
624 zvtx = primaryVertex->GetZ();
629 //_____________________________________________________________________________
630 Short_t AliAnalysisTaskHighPtDeDx::GetPidCode(Int_t pdgCode) const
632 // return our internal code for pions, kaons, and protons
636 switch (TMath::Abs(pdgCode)) {
644 pidCode = 3; // proton
647 pidCode = 4; // electron
653 pidCode = 6; // something else?
660 //_____________________________________________________________________________
661 void AliAnalysisTaskHighPtDeDx::ProcessMCTruthESD()
663 // Fill the special MC histogram with the MC truth info
665 Short_t trackmult = 0;
667 const Int_t nTracksMC = fMCStack->GetNtrack();
669 for (Int_t iTracks = 0; iTracks < nTracksMC; iTracks++) {
672 if(!(fMCStack->IsPhysicalPrimary(iTracks)))
675 TParticle* trackMC = fMCStack->Particle(iTracks);
677 Double_t chargeMC = trackMC->GetPDG()->Charge();
681 if (TMath::Abs(trackMC->Eta()) > fEtaCut )
686 // "charge:pt:p:eta:phi:pidCode"
687 Float_t ptMC = trackMC->Pt();
688 Float_t pMC = trackMC->P();
689 Float_t etaMC = trackMC->Eta();
690 Float_t phiMC = trackMC->Phi();
692 Int_t pdgCode = trackMC->GetPdgCode();
693 Short_t pidCodeMC = 0;
694 pidCodeMC = GetPidCode(pdgCode);
696 // Here we want to add some of the MC histograms!
698 // And therefore we first cut here!
699 if (trackMC->Pt() < fMinPt) {
701 // Keep small fraction of low pT tracks
702 if(fRandom->Rndm() > fLowPtFraction)
705 // Here we want to add the high pt part of the MC histograms!
710 DeDxTrackMC* track = new((*fTrackArrayMC)[nadded]) DeDxTrackMC();
715 track->etaMC = etaMC;
716 track->phiMC = phiMC;
717 track->qMC = Short_t(chargeMC);
718 track->pidMC = pidCodeMC;
719 track->pdgMC = pdgCode;
726 Sort(fTrackArrayMC, kTRUE);
728 fEvent->trackmultMC = trackmult;
729 fEvent->nMC = nadded;
734 //_____________________________________________________________________________
735 void AliAnalysisTaskHighPtDeDx::ProcessMCTruthAOD()
737 // Fill the special MC histogram with the MC truth info
739 Short_t trackmult = 0;
741 const Int_t nTracksMC = fMCArray->GetEntriesFast();
743 for (Int_t iTracks = 0; iTracks < nTracksMC; iTracks++) {
745 AliAODMCParticle* trackMC = dynamic_cast<AliAODMCParticle*>(fMCArray->At(iTracks));
748 if(!(trackMC->IsPhysicalPrimary()))
752 Double_t chargeMC = trackMC->Charge();
756 if (TMath::Abs(trackMC->Eta()) > fEtaCut )
761 // "charge:pt:p:eta:phi:pidCode"
762 Float_t ptMC = trackMC->Pt();
763 Float_t pMC = trackMC->P();
764 Float_t etaMC = trackMC->Eta();
765 Float_t phiMC = trackMC->Phi();
767 Int_t pdgCode = trackMC->PdgCode();
768 Short_t pidCodeMC = 0;
769 pidCodeMC = GetPidCode(pdgCode);
771 // Here we want to add some of the MC histograms!
773 // And therefore we first cut here!
774 if (trackMC->Pt() < fMinPt) {
776 // Keep small fraction of low pT tracks
777 if(fRandom->Rndm() > fLowPtFraction)
780 // Here we want to add the high pt part of the MC histograms!
785 DeDxTrackMC* track = new((*fTrackArrayMC)[nadded]) DeDxTrackMC();
790 track->etaMC = etaMC;
791 track->phiMC = phiMC;
792 track->qMC = Short_t(chargeMC);
793 track->pidMC = pidCodeMC;
794 track->pdgMC = pdgCode;
801 Sort(fTrackArrayMC, kTRUE);
803 fEvent->trackmultMC = trackmult;
804 fEvent->nMC = nadded;
809 //_____________________________________________________________________________
810 Short_t AliAnalysisTaskHighPtDeDx::GetPythiaEventProcessType(Int_t pythiaType) {
812 // Get the process type of the event. PYTHIA
816 Short_t globalType = -1; //init
818 if(pythiaType==92||pythiaType==93){
819 globalType = 2; //single diffractive
821 else if(pythiaType==94){
822 globalType = 3; //double diffractive
824 //else if(pythiaType != 91){ // also exclude elastic to be sure... CKB??
826 globalType = 1; //non diffractive
831 //_____________________________________________________________________________
832 Short_t AliAnalysisTaskHighPtDeDx::GetDPMjetEventProcessType(Int_t dpmJetType) {
834 // get the process type of the event. PHOJET
837 // can only read pythia headers, either directly or from cocktalil header
838 Short_t globalType = -1;
840 if (dpmJetType == 1 || dpmJetType == 4) { // explicitly inelastic plus central diffraction
843 else if (dpmJetType==5 || dpmJetType==6) {
846 else if (dpmJetType==7) {
852 //_____________________________________________________________________________
853 ULong64_t AliAnalysisTaskHighPtDeDx::GetEventIdAsLong(AliVHeader* header) const
855 // To have a unique id for each event in a run!
856 // Modified from AliRawReader.h
857 return ((ULong64_t)header->GetBunchCrossNumber()+
858 (ULong64_t)header->GetOrbitNumber()*3564+
859 (ULong64_t)header->GetPeriodNumber()*16777215*3564);
863 //____________________________________________________________________
864 TParticle* AliAnalysisTaskHighPtDeDx::FindPrimaryMother(AliStack* stack, Int_t label)
867 // Finds the first mother among the primary particles of the particle identified by <label>,
868 // i.e. the primary that "caused" this particle
870 // Taken from AliPWG0Helper class
873 Int_t motherLabel = FindPrimaryMotherLabel(stack, label);
877 return stack->Particle(motherLabel);
880 //____________________________________________________________________
881 Int_t AliAnalysisTaskHighPtDeDx::FindPrimaryMotherLabel(AliStack* stack, Int_t label)
884 // Finds the first mother among the primary particles of the particle identified by <label>,
885 // i.e. the primary that "caused" this particle
889 // Taken from AliPWG0Helper class
891 const Int_t nPrim = stack->GetNprimary();
893 while (label >= nPrim) {
895 //printf("Particle %d (pdg %d) is not a primary. Let's check its mother %d\n", label, mother->GetPdgCode(), mother->GetMother(0));
897 TParticle* particle = stack->Particle(label);
900 AliDebugGeneral("FindPrimaryMotherLabel", AliLog::kError, Form("UNEXPECTED: particle with label %d not found in stack.", label));
905 if (particle->GetMother(0) < 0) {
907 AliDebugGeneral("FindPrimaryMotherLabel", AliLog::kError, Form("UNEXPECTED: Could not find mother of secondary particle %d.", label));
911 label = particle->GetMother(0);
917 //____________________________________________________________________
918 AliAODMCParticle* AliAnalysisTaskHighPtDeDx::FindPrimaryMotherAOD(AliAODMCParticle* startParticle)
921 // Finds the first mother among the primary particles of the particle identified by <label>,
922 // i.e. the primary that "caused" this particle
924 // Taken from AliPWG0Helper class
927 AliAODMCParticle* mcPart = startParticle;
932 if(mcPart->IsPrimary())
935 Int_t mother = mcPart->GetMother();
937 mcPart = dynamic_cast<AliAODMCParticle*>(fMCArray->At(mother));
943 //_____________________________________________________________________________
944 void AliAnalysisTaskHighPtDeDx::Sort(TClonesArray* array, Bool_t isMC)
946 const Int_t n = array->GetEntriesFast();
960 for(Int_t i = 0; i < n; i++) {
964 DeDxTrackMC* track = (DeDxTrackMC*)array->At(i);
967 DeDxTrack* track = (DeDxTrack*)array->At(i);
974 TMath::Sort(n, ptArray, indexArray);
978 DeDxTrackMC* track = (DeDxTrackMC*)array->At(indexArray[0]);
979 fEvent->ptmaxMC = track->ptMC;
981 DeDxTrack* track = (DeDxTrack*)array->At(indexArray[0]);
982 fEvent->ptmax = track->pt;
985 // set order of each track
986 for(Int_t i = 0; i < n; i++) {
989 DeDxTrackMC* track = (DeDxTrackMC*)array->At(indexArray[i]);
992 DeDxTrack* track = (DeDxTrack*)array->At(indexArray[i]);
997 //__________________________________________________________________
998 void AliAnalysisTaskHighPtDeDx::ProduceArrayTrksESD( AliESDEvent *ESDevent, AnalysisMode analysisMode ){
1000 const Int_t nESDTracks = ESDevent->GetNumberOfTracks();
1003 if( analysisMode == kGlobalTrk ){
1004 if(fTrackArrayGlobalPar)
1005 fTrackArrayGlobalPar->Clear();
1006 } else if( analysisMode == kTPCTrk ){
1007 if(fTrackArrayTPCPar)
1008 fTrackArrayTPCPar->Clear();
1011 if( analysisMode==kGlobalTrk ){
1013 for(Int_t iT = 0; iT < nESDTracks; iT++) {
1015 AliESDtrack* esdTrack = ESDevent->GetTrack(iT);
1018 if(TMath::Abs(esdTrack->Eta()) > fEtaCut)
1021 UShort_t filterFlag = 0;
1022 Bool_t filterCut_Set1 = kFALSE;//parameters from global tracks, with TPC cuts (filter bit =1 in AOD)
1023 Bool_t filterCut_Set2 = kFALSE;//parameters from global tracks, cuts tpc+its 2010 W/O golden cuts
1024 Bool_t filterCut_Set3 = kFALSE;//parameters from global tracks, cuts its+tpc 2010 WITH golden cuts
1026 UInt_t selectDebug = 0;
1027 if (fTrackFilterGolden) {
1028 selectDebug = fTrackFilterGolden->IsSelected(esdTrack);
1031 filterCut_Set3=kTRUE;
1035 if (fTrackFilterTPC) {
1037 selectDebug = fTrackFilterTPC->IsSelected(esdTrack);
1038 if (selectDebug){//only tracks which pass the TPC-only track cuts
1041 filterCut_Set1=kTRUE;
1048 selectDebug = fTrackFilter->IsSelected(esdTrack);
1050 filterCut_Set2=kTRUE;
1060 // Track was accepted
1063 // Here we want to add histograms!
1065 if (esdTrack->Pt() < fMinPt) {
1067 // Keep small fraction of low pT tracks
1068 if(fRandom->Rndm() > fLowPtFraction)
1071 // Here we want to add the high pt part of the histograms!
1074 Short_t charge = esdTrack->Charge();
1075 Float_t pt = esdTrack->Pt();
1076 Float_t p = esdTrack->P();
1077 Float_t eta = esdTrack->Eta();
1078 Float_t phi = esdTrack->Phi();
1079 Short_t ncl = esdTrack->GetTPCsignalN();
1080 Short_t neff = Short_t(esdTrack->GetTPCClusterInfo(2, 1)); // effective track length for pT res
1081 // Short_t nclf = esdTrack->GetTPCNclsF();
1082 Float_t dedx = esdTrack->GetTPCsignal();
1084 if(esdTrack->GetTPCNcls() > 0)
1085 tpcchi = esdTrack->GetTPCchi2()/Float_t(esdTrack->GetTPCNcls());
1088 esdTrack->GetImpactParameters(b,bCov);
1089 Float_t dcaxy = b[0];
1090 Float_t dcaz = b[1];
1091 Double_t p_con[3] = {0, 0, 0};
1092 esdTrack->GetConstrainedPxPyPz(p_con);
1095 // Float_t pt_con = (Float_t)TMath::Sqrt(p_con[0]*p_con[0] + p_con[1]*p_con[1]);
1096 // const AliExternalTrackParam* tpcParam = esdTrack->GetTPCInnerParam();
1097 // Float_t pttpc = tpcParam->Pt();
1098 // Float_t ptpc = tpcParam->P();
1101 Short_t pidCode = 0; // 0 = real data / no mc track!
1102 Short_t primaryFlag = 0; // 0 = real data / not primary mc track
1103 Int_t pdgMother = 0;
1106 //with Globaltrack parameters????
1109 const Int_t label = TMath::Abs(esdTrack->GetLabel());
1110 TParticle* mcTrack = fMCStack->Particle(label);
1113 if(fMCStack->IsPhysicalPrimary(label))
1116 Int_t pdgCode = mcTrack->GetPdgCode();
1117 pidCode = GetPidCode(pdgCode);
1119 ptMC = mcTrack->Pt();
1121 TParticle* mother = FindPrimaryMother(fMCStack, label);
1122 pdgMother = mother->GetPdgCode();
1129 if (esdTrack->GetStatus()&AliESDtrack::kTOFpid){
1130 if ((esdTrack->GetIntegratedLength() != 0) && (esdTrack->GetTOFsignal() != 0))
1131 beta = esdTrack->GetIntegratedLength()/esdTrack->GetTOFsignal()/fgkClight;
1136 DeDxTrack* track = new((*fTrackArrayGlobalPar)[nadded]) DeDxTrack();
1141 // track->ptcon = pt_con;
1142 // track->tpcchi = tpcchi;
1146 track->filter = filterFlag;
1151 track->dcaxy = dcaxy;
1153 track->pid = pidCode;
1154 track->primary = primaryFlag;
1155 track->pttrue = ptMC;
1156 track->mother = pdgMother;
1157 track->filterset1 = filterCut_Set1;
1158 track->filterset2 = filterCut_Set2;
1159 track->filterset3 = filterCut_Set3;
1163 }//end of track loop
1167 else if( analysisMode==kTPCTrk ){
1168 const AliESDVertex *vtxSPD = ESDevent->GetPrimaryVertexSPD();
1169 if( vtxSPD->GetNContributors() < 1 || TMath::Abs(vtxSPD->GetZ()) > 10.0 ) return;
1172 for(Int_t iT = 0; iT < nESDTracks; iT++) {
1174 AliESDtrack* esdTrack = ESDevent->GetTrack(iT);
1176 AliESDtrack *trackTPC = AliESDtrackCuts::GetTPCOnlyTrack(dynamic_cast<AliESDEvent*>(ESDevent),esdTrack->GetID());
1178 if(!trackTPC) continue;
1180 UInt_t selectDebug = 0;
1181 selectDebug = fTrackFilterTPC->IsSelected(trackTPC);
1182 if(selectDebug==0) continue;
1184 if(trackTPC->Pt()>0.){
1185 // only constrain tracks above threshold
1186 AliExternalTrackParam exParam;
1187 // take the B-field from the ESD, no 3D fieldMap available at this point
1188 Bool_t relate = false;
1189 relate = trackTPC->RelateToVertexTPC(vtxSPD,ESDevent->GetMagneticField(),
1195 trackTPC->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),
1196 exParam.GetCovariance());
1203 if(TMath::Abs(trackTPC->Eta()) > fEtaCut)
1207 // Track was accepted
1210 // Here we want to add histograms!
1212 if (trackTPC->Pt() < fMinPt) {
1214 // Keep small fraction of low pT tracks
1215 if(fRandom->Rndm() > fLowPtFraction)
1218 // Here we want to add the high pt part of the histograms!
1221 Short_t charge = trackTPC->Charge();
1222 Float_t pt = trackTPC->Pt();
1223 Float_t p = trackTPC->P();
1224 Float_t eta = trackTPC->Eta();
1225 Float_t phi = trackTPC->Phi();
1226 Short_t ncl = trackTPC->GetTPCsignalN();
1227 Short_t neff = Short_t(trackTPC->GetTPCClusterInfo(2, 1)); // effective track length for pT res
1228 // Short_t nclf = esdTrack->GetTPCNclsF();
1229 Float_t dedx = trackTPC->GetTPCsignal();
1231 if(trackTPC->GetTPCNcls() > 0)
1232 tpcchi = trackTPC->GetTPCchi2()/Float_t(trackTPC->GetTPCNcls());
1235 //trackTPC->GetImpactParameters(b,bCov);
1236 //Float_t dcaxy = b[0];
1237 //Float_t dcaz = b[1];
1241 trackTPC->GetImpactParameters(dcaxy,dcaz);
1244 Double_t p_con[3] = {0, 0, 0};
1245 trackTPC->GetConstrainedPxPyPz(p_con);
1248 // Float_t pt_con = (Float_t)TMath::Sqrt(p_con[0]*p_con[0] + p_con[1]*p_con[1]);
1249 // const AliExternalTrackParam* tpcParam = esdTrack->GetTPCInnerParam();
1250 // Float_t pttpc = tpcParam->Pt();
1251 // Float_t ptpc = tpcParam->P();
1254 Short_t pidCode = 0; // 0 = real data / no mc track!
1255 Short_t primaryFlag = 0; // 0 = real data / not primary mc track
1256 Int_t pdgMother = 0;
1259 //with Globaltrack parameters????
1262 const Int_t label = TMath::Abs(esdTrack->GetLabel());
1263 TParticle* mcTrack = fMCStack->Particle(label);
1266 if(fMCStack->IsPhysicalPrimary(label))
1269 Int_t pdgCode = mcTrack->GetPdgCode();
1270 pidCode = GetPidCode(pdgCode);
1272 ptMC = mcTrack->Pt();
1274 TParticle* mother = FindPrimaryMother(fMCStack, label);
1275 pdgMother = mother->GetPdgCode();
1282 if (esdTrack->GetStatus()&AliESDtrack::kTOFpid){
1283 if ((esdTrack->GetIntegratedLength() != 0) && (esdTrack->GetTOFsignal() != 0))
1284 beta = esdTrack->GetIntegratedLength()/esdTrack->GetTOFsignal()/fgkClight;
1289 DeDxTrack* tracktpc = new((*fTrackArrayTPCPar)[nadded]) DeDxTrack();
1294 // track->ptcon = pt_con;
1295 // track->tpcchi = tpcchi;
1296 tracktpc->eta = eta;
1297 tracktpc->phi = phi;
1298 tracktpc->q = charge;
1299 tracktpc->filter = 1;
1300 tracktpc->ncl = ncl;
1301 tracktpc->neff = neff;
1302 tracktpc->dedx = dedx;
1303 tracktpc->beta = beta;//computed with Global tracks
1304 tracktpc->dcaxy = dcaxy;
1305 tracktpc->dcaz = dcaz;
1306 tracktpc->pid = pidCode;
1307 tracktpc->primary = primaryFlag;
1308 tracktpc->pttrue = ptMC;
1309 tracktpc->mother = pdgMother;
1310 tracktpc->filterset1 = 0;
1311 tracktpc->filterset2 = 0;
1312 tracktpc->filterset3 = 0;
1321 }//end of track loop
1323 }//end of: if isglobal==kFALSE
1328 if( analysisMode==kGlobalTrk ){
1329 Sort(fTrackArrayGlobalPar, kFALSE);
1331 fEvent->trackmult = trackmult;
1334 else if( analysisMode==kTPCTrk ){
1335 Sort(fTrackArrayTPCPar, kFALSE);
1342 //__________________________________________________________________
1343 void AliAnalysisTaskHighPtDeDx::ProduceArrayTrksAOD( AliAODEvent *AODevent, AnalysisMode analysisMode ){
1346 Int_t trackmult = 0; // no pt cuts
1348 Int_t nAODTracks = AODevent->GetNumberOfTracks();
1349 if( analysisMode == kGlobalTrk ){
1351 if(fTrackArrayGlobalPar)
1352 fTrackArrayGlobalPar->Clear();
1355 if( analysisMode == kTPCTrk ){
1356 if(fTrackArrayTPCPar)
1357 fTrackArrayTPCPar->Clear();
1363 //const AliAODVertex* vertexSPD= (AliAODVertex*)AODevent->GetPrimaryVertexSPD();//GetPrimaryVertex()
1364 //if( vertexSPD->GetNContributors() < 1 || TMath::Abs( vertexSPD->GetZ()) > 10.0 ) return;
1368 if( analysisMode==kGlobalTrk ){
1371 const AliAODVertex* vertex = AODevent->GetPrimaryVertex();
1372 for(Int_t iT = 0; iT < nAODTracks; iT++) {
1374 AliAODTrack* aodTrack = AODevent->GetTrack(iT);
1378 UShort_t filterFlag = 0;
1379 Bool_t filterCut_Set1 = kFALSE;//parameters from global tracks, with TPC cuts (filter bit =1 in AOD)
1380 Bool_t filterCut_Set2 = kFALSE;//parameters from global tracks, cuts tpc+its 2010 W/O golden cuts
1381 Bool_t filterCut_Set3 = kFALSE;//parameters from global tracks, cuts its+tpc 2010 WITH golden cuts
1385 if (fTrackFilterGolden) {
1387 // ITSTPC2010 cuts is bit 32 according to above macro, new versions of aliroot includes the golden cuts
1388 if(aodTrack->TestFilterBit(32)) {
1390 filterCut_Set3 = kTRUE;
1395 if (fTrackFilterTPC) {
1396 // TPC only cuts is bit 1 according to above macro
1397 // Alex always uses 128, NOTE: FILTER 128 ARE TPC TRACKS (TPC PARAMETERS) CONTRAINED TO THE SPD VERTEX,
1398 if(aodTrack->TestFilterBit(1)){
1400 filterCut_Set1 = kTRUE;
1412 Double_t b[2], cov[3];
1413 if (!(aodTrack->PropagateToDCA(vertex, AODevent->GetMagneticField(), kVeryBig, b, cov)))
1414 filterFlag = 32; // propagation failed!!!!!;
1415 Float_t dcaxy = b[0];
1416 Float_t dcaz = b[1];
1422 // As I understand this routine recalculates the momentum so it should be called first!
1423 //Double_t b[2], cov[3];
1426 //if(!aodTrack->PropagateToDCA(vertex, AODevent->GetMagneticField(), kVeryBig, b, cov))
1427 // filterFlag = 32; // propagation failed!!!!!
1429 if(TMath::Abs(aodTrack->Eta()) > fEtaCut)
1431 if (aodTrack->Pt() < fMinPt) {
1433 // Keep small fraction of low pT tracks
1434 if(fRandom->Rndm() > fLowPtFraction)
1437 // Here we want to add the high pt part of the histograms!
1443 Short_t charge = aodTrack->Charge();
1444 Float_t pt = aodTrack->Pt();
1445 Float_t p = aodTrack->P();
1446 Float_t eta = aodTrack->Eta();
1447 Float_t phi = aodTrack->Phi();
1448 AliAODPid* aodPid = aodTrack->GetDetPid();
1450 Short_t neff = 0; // This is not yet there! Short_t(aodTrack->GetTPCClusterInfo(2, 1)); // effective track length for pT res
1451 // Short_t nclf = aodTrack->GetTPCNclsF();
1455 ncl = aodPid->GetTPCsignalN();
1456 dedx = aodPid->GetTPCsignal();
1458 if (aodTrack->GetStatus()&AliESDtrack::kTOFpid){
1460 aodPid->GetIntegratedTimes(tof);
1461 beta = tof[0]/aodPid->GetTOFsignal();
1464 // Float_t tpcchi = aodTrack->Chi2perNDF();
1466 // Double_t p_con[3] = {0, 0, 0};
1467 // aodTrack->GetConstrainedPxPyPz(p_con);
1468 // Float_t pt_con = 0; // This is not there! (Float_t)TMath::Sqrt(p_con[0]*p_con[0] + p_con[1]*p_con[1]);
1469 // const AliExternalTrackParam* tpcParam = aodTrack->GetTPCInnerParam();
1470 // Float_t pttpc = tpcParam->Pt();
1471 // Float_t ptpc = tpcParam->P();
1474 Short_t pidCode = 0; // 0 = real data / no mc track!
1475 Short_t primaryFlag = 0; // 0 = real data / not primary mc track
1476 Int_t pdgMother = 0;
1480 const Int_t label = TMath::Abs(aodTrack->GetLabel());
1482 AliAODMCParticle* mcTrack = dynamic_cast<AliAODMCParticle*>(fMCArray->At(label));
1485 if(mcTrack->IsPhysicalPrimary())
1488 Int_t pdgCode = mcTrack->GetPdgCode();
1489 pidCode = GetPidCode(pdgCode);
1491 ptMC = mcTrack->Pt();
1493 AliAODMCParticle* mother = FindPrimaryMotherAOD(mcTrack);
1494 pdgMother = mother->GetPdgCode();
1501 DeDxTrack* track = new((*fTrackArrayGlobalPar)[nadded]) DeDxTrack();
1506 // track->ptcon = pt_con;
1507 // track->tpcchi = tpcchi;
1511 track->filter = filterFlag;
1516 track->dcaxy = dcaxy;
1518 track->pid = pidCode;
1519 track->primary = primaryFlag;
1520 track->pttrue = ptMC;
1521 track->mother = pdgMother;
1522 track->filterset1 = filterCut_Set1;
1523 track->filterset2 = filterCut_Set2;
1524 track->filterset3 = filterCut_Set3;
1526 }//end of track loop
1530 }//end of global track analysis
1534 else if( analysisMode==kTPCTrk ){
1536 const AliAODVertex* vertexSPD= (AliAODVertex*)AODevent->GetPrimaryVertexSPD();//GetPrimaryVertex()
1537 if( vertexSPD->GetNContributors() < 1 || TMath::Abs(vertexSPD->GetZ()) > 10.0 ) return;
1540 //const AliAODVertex* vertex = AODevent->GetPrimaryVertex();
1541 for(Int_t iT = 0; iT < nAODTracks; iT++) {
1543 AliAODTrack* aodTrack = AODevent->GetTrack(iT);
1547 UShort_t filterFlag = 0;
1548 Bool_t filterCut_Set1 = kFALSE;//parameters from global tracks, with TPC cuts (filter bit =1 in AOD)
1549 Bool_t filterCut_Set2 = kFALSE;//parameters from global tracks, cuts tpc+its 2010 W/O golden cuts
1550 Bool_t filterCut_Set3 = kFALSE;//parameters from global tracks, cuts its+tpc 2010 WITH golden cuts
1554 // TPC only cuts is bit 1 according to above macro
1555 // Alex always uses 128, NOTE: FILTER 128 ARE TPC TRACKS (TPC PARAMETERS) CONTRAINED TO THE SPD VERTEX,
1556 if(aodTrack->TestFilterBit(128)){
1566 Double_t b[2], cov[3];
1567 //AliAODVertex* vertex = AODevent->GetPrimaryVertex();
1568 //Double_t b[2] = {-99., -99.};
1569 //Double_t bCov[3] = {-99., -99., -99.};
1570 //aodTrack->PropagateToDCA(aod->GetPrimaryVertex(), aod->GetMagneticField(), 100., b, bCov);
1571 if (!(aodTrack->PropagateToDCA(vertexSPD, AODevent->GetMagneticField(), kVeryBig, b, cov)))
1572 filterFlag = 32; // propagation failed!!!!!;
1573 Float_t dcaxy = b[0];
1574 Float_t dcaz = b[1];
1579 // As I understand this routine recalculates the momentum so it should be called first!
1580 //Double_t b[2], cov[3];
1583 //if(!aodTrack->PropagateToDCA(vertex, AODevent->GetMagneticField(), kVeryBig, b, cov))
1584 // filterFlag = 32; // propagation failed!!!!!
1586 if(TMath::Abs(aodTrack->Eta()) > fEtaCut)
1588 if (aodTrack->Pt() < fMinPt) {
1590 // Keep small fraction of low pT tracks
1591 if(fRandom->Rndm() > fLowPtFraction)
1594 // Here we want to add the high pt part of the histograms!
1600 Short_t charge = aodTrack->Charge();
1601 Float_t pt = aodTrack->Pt();
1602 Float_t p = aodTrack->P();
1603 Float_t eta = aodTrack->Eta();
1604 Float_t phi = aodTrack->Phi();
1605 AliAODPid* aodPid = aodTrack->GetDetPid();
1607 Short_t neff = 0; // This is not yet there! Short_t(aodTrack->GetTPCClusterInfo(2, 1)); // effective track length for pT res
1608 // Short_t nclf = aodTrack->GetTPCNclsF();
1612 ncl = aodPid->GetTPCsignalN();
1613 dedx = aodPid->GetTPCsignal();
1615 if (aodTrack->GetStatus()&AliESDtrack::kTOFpid){
1617 aodPid->GetIntegratedTimes(tof);
1618 beta = tof[0]/aodPid->GetTOFsignal();
1621 // Float_t tpcchi = aodTrack->Chi2perNDF();
1623 // Double_t p_con[3] = {0, 0, 0};
1624 // aodTrack->GetConstrainedPxPyPz(p_con);
1625 // Float_t pt_con = 0; // This is not there! (Float_t)TMath::Sqrt(p_con[0]*p_con[0] + p_con[1]*p_con[1]);
1626 // const AliExternalTrackParam* tpcParam = aodTrack->GetTPCInnerParam();
1627 // Float_t pttpc = tpcParam->Pt();
1628 // Float_t ptpc = tpcParam->P();
1631 Short_t pidCode = 0; // 0 = real data / no mc track!
1632 Short_t primaryFlag = 0; // 0 = real data / not primary mc track
1633 Int_t pdgMother = 0;
1637 const Int_t label = TMath::Abs(aodTrack->GetLabel());
1639 AliAODMCParticle* mcTrack = dynamic_cast<AliAODMCParticle*>(fMCArray->At(label));
1642 if(mcTrack->IsPhysicalPrimary())
1645 Int_t pdgCode = mcTrack->GetPdgCode();
1646 pidCode = GetPidCode(pdgCode);
1648 ptMC = mcTrack->Pt();
1650 AliAODMCParticle* mother = FindPrimaryMotherAOD(mcTrack);
1651 pdgMother = mother->GetPdgCode();
1658 DeDxTrack* tracktpc = new((*fTrackArrayTPCPar)[nadded]) DeDxTrack();
1663 // track->ptcon = pt_con;
1664 // track->tpcchi = tpcchi;
1665 tracktpc->eta = eta;
1666 tracktpc->phi = phi;
1667 tracktpc->q = charge;
1668 tracktpc->filter = filterFlag;
1669 tracktpc->ncl = ncl;
1670 tracktpc->neff = neff;
1671 tracktpc->dedx = dedx;
1672 tracktpc->beta = beta;
1673 tracktpc->dcaxy = dcaxy;
1674 tracktpc->dcaz = dcaz;
1675 tracktpc->pid = pidCode;
1676 tracktpc->primary = primaryFlag;
1677 tracktpc->pttrue = ptMC;
1678 tracktpc->mother = pdgMother;
1679 tracktpc->filterset1 = filterCut_Set1;
1680 tracktpc->filterset2 = filterCut_Set2;
1681 tracktpc->filterset3 = filterCut_Set3;
1683 }//end of track loop
1686 }//end of global track analysis
1691 if( analysisMode==kGlobalTrk ){
1692 Sort(fTrackArrayGlobalPar, kFALSE);
1694 fEvent->trackmult = trackmult;
1699 if( analysisMode==kTPCTrk ){
1700 Sort(fTrackArrayTPCPar, kFALSE);