1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
22 #include <TParameter.h>
24 #include <TParticle.h>
27 #include "AliAnalysisTaskESDfilter.h"
28 #include "AliAnalysisManager.h"
29 #include "AliESDEvent.h"
30 #include "AliESDRun.h"
32 #include "AliAODEvent.h"
33 #include "AliMCEvent.h"
34 #include "AliMCEventHandler.h"
35 #include "AliESDInputHandler.h"
36 #include "AliAODHandler.h"
37 #include "AliAODMCParticle.h"
38 #include "AliAnalysisFilter.h"
39 #include "AliESDMuonTrack.h"
40 #include "AliESDVertex.h"
41 #include "AliCentrality.h"
42 #include "AliEventplane.h"
44 #include "AliESDkink.h"
45 #include "AliESDcascade.h"
46 #include "AliESDPmdTrack.h"
47 #include "AliESDCaloCluster.h"
48 #include "AliESDCaloCells.h"
49 #include "AliMultiplicity.h"
51 #include "AliCodeTimer.h"
52 #include "AliESDtrackCuts.h"
53 #include "AliESDpid.h"
54 #include "AliAODHMPIDrings.h"
55 #include "AliV0vertexer.h"
56 #include "AliCascadeVertexer.h"
57 #include "Riostream.h"
58 #include "AliExternalTrackParam.h"
59 #include "AliTrackerBase.h"
61 #include "AliTPCdEdxInfo.h"
65 ClassImp(AliAnalysisTaskESDfilter)
67 ////////////////////////////////////////////////////////////////////////
69 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
77 fEnableFillAOD(kTRUE),
86 fNumberOfPositiveTracks(0),
91 fOldESDformat(kFALSE),
93 fTPCConstrainedFilterMask(0),
94 fHybridFilterMaskTPCCG(0),
95 fWriteHybridTPCCOnly(kFALSE),
96 fGlobalConstrainedFilterMask(0),
97 fHybridFilterMaskGCG(0),
98 fWriteHybridGCOnly(kFALSE),
99 fIsVZEROEnabled(kTRUE),
100 fIsTZEROEnabled(kTRUE),
101 fIsZDCEnabled(kTRUE),
102 fIsHMPIDEnabled(kTRUE),
103 fIsV0CascadeRecoEnabled(kFALSE),
104 fAreCascadesEnabled(kTRUE),
105 fAreV0sEnabled(kTRUE),
106 fAreKinksEnabled(kTRUE),
107 fAreTracksEnabled(kTRUE),
108 fArePmdClustersEnabled(kTRUE),
109 fAreCaloClustersEnabled(kTRUE),
110 fAreEMCALCellsEnabled(kTRUE),
111 fArePHOSCellsEnabled(kTRUE),
112 fAreEMCALTriggerEnabled(kTRUE),
113 fArePHOSTriggerEnabled(kTRUE),
114 fAreTrackletsEnabled(kTRUE),
117 fTPCaloneTrackCuts(0),
118 fDoPropagateTrackToEMCal(kTRUE)
120 // Default constructor
121 fV0Cuts[0] = 33. ; // max allowed chi2
122 fV0Cuts[1] = 0.1 ; // min allowed impact parameter for the 1st daughter
123 fV0Cuts[2] = 0.1 ; // min allowed impact parameter for the 2nd daughter
124 fV0Cuts[3] = 1. ; // max allowed DCA between the daughter tracks
125 fV0Cuts[4] = .998; // min allowed cosine of V0's pointing angle
126 fV0Cuts[5] = 0.9 ; // min radius of the fiducial volume
127 fV0Cuts[6] = 100. ; // max radius of the fiducial volume
129 fCascadeCuts[0] = 33. ; // max allowed chi2 (same as PDC07)
130 fCascadeCuts[1] = 0.05 ; // min allowed V0 impact parameter
131 fCascadeCuts[2] = 0.008; // "window" around the Lambda mass
132 fCascadeCuts[3] = 0.03 ; // min allowed bachelor's impact parameter
133 fCascadeCuts[4] = 0.3 ; // max allowed DCA between the V0 and the bachelor
134 fCascadeCuts[5] = 0.999; // min allowed cosine of the cascade pointing angle
135 fCascadeCuts[6] = 0.9 ; // min radius of the fiducial volume
136 fCascadeCuts[7] = 100. ; // max radius of the fiducial volume
139 //______________________________________________________________________________
140 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
141 AliAnalysisTaskSE(name),
148 fEnableFillAOD(kTRUE),
157 fNumberOfPositiveTracks(0),
159 fNumberOfVertices(0),
160 fNumberOfCascades(0),
162 fOldESDformat(kFALSE),
164 fTPCConstrainedFilterMask(0),
165 fHybridFilterMaskTPCCG(0),
166 fWriteHybridTPCCOnly(kFALSE),
167 fGlobalConstrainedFilterMask(0),
168 fHybridFilterMaskGCG(0),
169 fWriteHybridGCOnly(kFALSE),
170 fIsVZEROEnabled(kTRUE),
171 fIsTZEROEnabled(kTRUE),
172 fIsZDCEnabled(kTRUE),
173 fIsHMPIDEnabled(kTRUE),
174 fIsV0CascadeRecoEnabled(kFALSE),
175 fAreCascadesEnabled(kTRUE),
176 fAreV0sEnabled(kTRUE),
177 fAreKinksEnabled(kTRUE),
178 fAreTracksEnabled(kTRUE),
179 fArePmdClustersEnabled(kTRUE),
180 fAreCaloClustersEnabled(kTRUE),
181 fAreEMCALCellsEnabled(kTRUE),
182 fArePHOSCellsEnabled(kTRUE),
183 fAreEMCALTriggerEnabled(kTRUE),
184 fArePHOSTriggerEnabled(kTRUE),
185 fAreTrackletsEnabled(kTRUE),
188 fTPCaloneTrackCuts(0),
189 fDoPropagateTrackToEMCal(kTRUE)
193 fV0Cuts[0] = 33. ; // max allowed chi2
194 fV0Cuts[1] = 0.1 ; // min allowed impact parameter for the 1st daughter
195 fV0Cuts[2] = 0.1 ; // min allowed impact parameter for the 2nd daughter
196 fV0Cuts[3] = 1. ; // max allowed DCA between the daughter tracks
197 fV0Cuts[4] = .998; // min allowed cosine of V0's pointing angle
198 fV0Cuts[5] = 0.9 ; // min radius of the fiducial volume
199 fV0Cuts[6] = 100. ; // max radius of the fiducial volume
201 fCascadeCuts[0] = 33. ; // max allowed chi2 (same as PDC07)
202 fCascadeCuts[1] = 0.05 ; // min allowed V0 impact parameter
203 fCascadeCuts[2] = 0.008; // "window" around the Lambda mass
204 fCascadeCuts[3] = 0.03 ; // min allowed bachelor's impact parameter
205 fCascadeCuts[4] = 0.3 ; // max allowed DCA between the V0 and the bachelor
206 fCascadeCuts[5] = 0.999; // min allowed cosine of the cascade pointing angle
207 fCascadeCuts[6] = 0.9 ; // min radius of the fiducial volume
208 fCascadeCuts[7] = 100. ; // max radius of the fiducial volume
213 AliAnalysisTaskESDfilter::~AliAnalysisTaskESDfilter(){
214 if(fIsPidOwner) delete fESDpid;
216 //______________________________________________________________________________
217 void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
220 // Create Output Objects conenct filter to outputtree
224 OutputTree()->GetUserInfo()->Add(fTrackFilter);
228 AliError("No OutputTree() for adding the track filter");
230 fTPCaloneTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
233 //______________________________________________________________________________
234 void AliAnalysisTaskESDfilter::Init()
237 if (fDebug > 1) AliInfo("Init() \n");
238 // Call configuration file
241 //______________________________________________________________________________
242 Bool_t AliAnalysisTaskESDfilter::Notify()
245 AddMetadataToUserInfo();
249 //______________________________________________________________________________
250 Bool_t AliAnalysisTaskESDfilter::AddMetadataToUserInfo()
252 // Copy metadata to AOD user info.
253 static Bool_t copyFirst = kFALSE;
255 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
257 AliError("AliAnalysisTaskESDfilter::AddMetadataToUserInfo() : No analysis manager !");
260 TTree *esdTree = mgr->GetTree()->GetTree();
261 if (!esdTree) return kFALSE;
262 TNamed *alirootVersion = (TNamed*)esdTree->GetUserInfo()->FindObject("alirootVersion");
263 if (!alirootVersion) return kFALSE;
264 AliAODHandler *aodHandler = dynamic_cast<AliAODHandler*>(mgr->GetOutputEventHandler());
265 if (!aodHandler) return kFALSE;
266 TTree *aodTree = aodHandler->GetTree();
267 if (!aodTree) return kFALSE;
268 aodTree->GetUserInfo()->Add(new TNamed(*alirootVersion));
274 //______________________________________________________________________________
275 void AliAnalysisTaskESDfilter::PrintTask(Option_t *option, Int_t indent) const
277 // Print selection task information
280 AliAnalysisTaskSE::PrintTask(option,indent);
282 TString spaces(' ',indent+3);
284 cout << spaces.Data() << Form("Cascades are %s",fAreCascadesEnabled ? "ENABLED":"DISABLED") << endl;
285 cout << spaces.Data() << Form("V0s are %s",fAreV0sEnabled ? "ENABLED":"DISABLED") << endl;
286 cout << spaces.Data() << Form("Kinks are %s",fAreKinksEnabled ? "ENABLED":"DISABLED") << endl;
287 cout << spaces.Data() << Form("Tracks are %s",fAreTracksEnabled ? "ENABLED":"DISABLED") << endl;
288 cout << spaces.Data() << Form("PmdClusters are %s",fArePmdClustersEnabled ? "ENABLED":"DISABLED") << endl;
289 cout << spaces.Data() << Form("CaloClusters are %s",fAreCaloClustersEnabled ? "ENABLED":"DISABLED") << endl;
290 cout << spaces.Data() << Form("EMCAL cells are %s",fAreEMCALCellsEnabled ? "ENABLED":"DISABLED") << endl;
291 cout << spaces.Data() << Form("EMCAL triggers are %s",fAreEMCALTriggerEnabled ? "ENABLED":"DISABLED") << endl;
292 cout << spaces.Data() << Form("PHOS triggers are %s",fArePHOSTriggerEnabled ? "ENABLED":"DISABLED") << endl;
293 cout << spaces.Data() << Form("Tracklets are %s",fAreTrackletsEnabled ? "ENABLED":"DISABLED") << endl;
294 cout << spaces.Data() << Form("PropagateTrackToEMCal is %s", fDoPropagateTrackToEMCal ? "ENABLED":"DISABLED") << endl;
297 //______________________________________________________________________________
298 void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
300 // Execute analysis for current event
303 Long64_t ientry = Entry();
306 printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
307 if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
308 if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
310 // Filters must explicitely enable AOD filling in their UserExec (AG)
311 if (!AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()) AliFatal("Cannot run ESD filter without an output event handler");
313 AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
314 AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillExtension(kTRUE);
319 //______________________________________________________________________________
320 TClonesArray& AliAnalysisTaskESDfilter::Cascades()
322 return *(AODEvent()->GetCascades());
325 //______________________________________________________________________________
326 TClonesArray& AliAnalysisTaskESDfilter::Tracks()
328 return *(AODEvent()->GetTracks());
331 //______________________________________________________________________________
332 TClonesArray& AliAnalysisTaskESDfilter::V0s()
334 return *(AODEvent()->GetV0s());
337 //______________________________________________________________________________
338 TClonesArray& AliAnalysisTaskESDfilter::Vertices()
340 return *(AODEvent()->GetVertices());
343 //______________________________________________________________________________
344 AliAODHeader* AliAnalysisTaskESDfilter::ConvertHeader(const AliESDEvent& esd)
346 // Convert header information
348 AliCodeTimerAuto("",0);
350 AliAODHeader* header = AODEvent()->GetHeader();
352 header->SetRunNumber(esd.GetRunNumber());
353 header->SetOfflineTrigger(fInputHandler->IsEventSelected()); // propagate the decision of the physics selection
355 TTree* tree = fInputHandler->GetTree();
357 TFile* file = tree->GetCurrentFile();
358 if (file) header->SetESDFileName(file->GetName());
362 header->SetBunchCrossNumber(0);
363 header->SetOrbitNumber(0);
364 header->SetPeriodNumber(0);
365 header->SetEventType(0);
366 header->SetMuonMagFieldScale(-999.);
367 header->SetCentrality(0);
368 header->SetEventplane(0);
370 header->SetBunchCrossNumber(esd.GetBunchCrossNumber());
371 header->SetOrbitNumber(esd.GetOrbitNumber());
372 header->SetPeriodNumber(esd.GetPeriodNumber());
373 header->SetEventType(esd.GetEventType());
375 header->SetEventNumberESDFile(esd.GetHeader()->GetEventNumberInFile());
376 if(const_cast<AliESDEvent&>(esd).GetCentrality()){
377 header->SetCentrality(const_cast<AliESDEvent&>(esd).GetCentrality());
380 header->SetCentrality(0);
382 if(const_cast<AliESDEvent&>(esd).GetEventplane()){
383 header->SetEventplane(const_cast<AliESDEvent&>(esd).GetEventplane());
386 header->SetEventplane(0);
391 header->SetFiredTriggerClasses(esd.GetFiredTriggerClasses());
392 header->SetTriggerMask(esd.GetTriggerMask());
393 header->SetTriggerCluster(esd.GetTriggerCluster());
394 header->SetL0TriggerInputs(esd.GetHeader()->GetL0TriggerInputs());
395 header->SetL1TriggerInputs(esd.GetHeader()->GetL1TriggerInputs());
396 header->SetL2TriggerInputs(esd.GetHeader()->GetL2TriggerInputs());
398 header->SetMagneticField(esd.GetMagneticField());
399 header->SetMuonMagFieldScale(esd.GetCurrentDip()/6000.);
400 header->SetZDCN1Energy(esd.GetZDCN1Energy());
401 header->SetZDCP1Energy(esd.GetZDCP1Energy());
402 header->SetZDCN2Energy(esd.GetZDCN2Energy());
403 header->SetZDCP2Energy(esd.GetZDCP2Energy());
404 header->SetZDCEMEnergy(esd.GetZDCEMEnergy(0),esd.GetZDCEMEnergy(1));
406 header->SetIRInt2InteractionMap(esd.GetHeader()->GetIRInt2InteractionMap());
407 header->SetIRInt1InteractionMap(esd.GetHeader()->GetIRInt1InteractionMap());
409 // ITS Cluster Multiplicty
410 const AliMultiplicity *mult = esd.GetMultiplicity();
411 for (Int_t ilay = 0; ilay < 6; ilay++) header->SetITSClusters(ilay, mult->GetNumberOfITSClusters(ilay));
413 // TPC only Reference Multiplicty
414 Int_t refMult = fTPCaloneTrackCuts ? (Short_t)fTPCaloneTrackCuts->GetReferenceMultiplicity(&esd, kTRUE) : -1;
415 header->SetTPConlyRefMultiplicity(refMult);
417 AliESDtrackCuts::MultEstTrackType estType = esd.GetPrimaryVertexTracks()->GetStatus() ? AliESDtrackCuts::kTrackletsITSTPC : AliESDtrackCuts::kTracklets;
418 header->SetRefMultiplicityComb05(AliESDtrackCuts::GetReferenceMultiplicity(&esd,estType,0.5));
419 header->SetRefMultiplicityComb08(AliESDtrackCuts::GetReferenceMultiplicity(&esd,estType,0.8));
421 Float_t diamxy[2]={esd.GetDiamondX(),esd.GetDiamondY()};
423 esd.GetDiamondCovXY(diamcov);
424 header->SetDiamond(diamxy,diamcov);
425 header->SetDiamondZ(esd.GetDiamondZ(),esd.GetSigma2DiamondZ());
427 // VZERO channel equalization factors for event-plane reconstruction
428 header->SetVZEROEqFactors(esd.GetVZEROEqFactors());
430 // T0 Resolution information
431 const AliESDRun* esdRun = esd.GetESDRun();
432 for (Int_t i=0;i<AliESDRun::kT0spreadSize;i++) header->SetT0spread(i,esdRun->GetT0spread(i));
437 //______________________________________________________________________________
438 void AliAnalysisTaskESDfilter::ConvertCascades(const AliESDEvent& esd)
441 // Convert the cascades part of the ESD.
442 // Return the number of cascades
444 AliCodeTimerAuto("",0);
446 // Create vertices starting from the most complex objects
449 const AliESDVertex* vtx = esd.GetPrimaryVertex();
450 Double_t pos[3] = { 0. };
451 Double_t covVtx[6] = { 0. };
452 Double_t momBach[3]={0.};
453 Double_t covTr[21]={0.};
454 Double_t pid[10]={0.};
455 AliAODPid* detpid(0x0);
456 AliAODVertex* vV0FromCascade(0x0);
457 AliAODv0* aodV0(0x0);
458 AliAODcascade* aodCascade(0x0);
459 AliAODTrack* aodTrack(0x0);
460 Double_t momPos[3]={0.};
461 Double_t momNeg[3] = { 0. };
462 Double_t momPosAtV0vtx[3]={0.};
463 Double_t momNegAtV0vtx[3]={0.};
465 TClonesArray& verticesArray = Vertices();
466 TClonesArray& tracksArray = Tracks();
467 TClonesArray& cascadesArray = Cascades();
469 // Cascades (Modified by A.Maire - February 2009)
470 for (Int_t nCascade = 0; nCascade < esd.GetNumberOfCascades(); ++nCascade) {
474 AliESDcascade *esdCascade = esd.GetCascade(nCascade);
475 Int_t idxPosFromV0Dghter = esdCascade->GetPindex();
476 Int_t idxNegFromV0Dghter = esdCascade->GetNindex();
477 Int_t idxBachFromCascade = esdCascade->GetBindex();
479 AliESDtrack *esdCascadePos = esd.GetTrack( idxPosFromV0Dghter);
480 AliESDtrack *esdCascadeNeg = esd.GetTrack( idxNegFromV0Dghter);
481 AliESDtrack *esdCascadeBach = esd.GetTrack( idxBachFromCascade);
483 // Identification of the V0 within the esdCascade (via both daughter track indices)
484 AliESDv0 * currentV0 = 0x0;
485 Int_t idxV0FromCascade = -1;
487 for (Int_t iV0=0; iV0<esd.GetNumberOfV0s(); ++iV0) {
489 currentV0 = esd.GetV0(iV0);
490 Int_t posCurrentV0 = currentV0->GetPindex();
491 Int_t negCurrentV0 = currentV0->GetNindex();
493 if (posCurrentV0==idxPosFromV0Dghter && negCurrentV0==idxNegFromV0Dghter) {
494 idxV0FromCascade = iV0;
499 if(idxV0FromCascade < 0){
500 printf("Cascade - no matching for the V0 (index V0 = -1) ! Skip ... \n");
502 }// a priori, useless check, but safer ... in case of pb with tracks "out of bounds"
504 AliESDv0 *esdV0FromCascade = esd.GetV0(idxV0FromCascade);
506 // 1 - Cascade selection
508 // AliESDVertex *esdPrimVtx = new AliESDVertex(*(esd.GetPrimaryVertex()));
509 // TList cascadeObjects;
510 // cascadeObjects.AddAt(esdV0FromCascade, 0);
511 // cascadeObjects.AddAt(esdCascadePos, 1);
512 // cascadeObjects.AddAt(esdCascadeNeg, 2);
513 // cascadeObjects.AddAt(esdCascade, 3);
514 // cascadeObjects.AddAt(esdCascadeBach, 4);
515 // cascadeObjects.AddAt(esdPrimVtx, 5);
517 // UInt_t selectCascade = 0;
518 // if (fCascadeFilter) {
519 // // selectCascade = fCascadeFilter->IsSelected(&cascadeObjects);
520 // // FIXME AliESDCascadeCuts to be implemented ...
522 // // Here we may encounter a moot point at the V0 level
523 // // between the cascade selections and the V0 ones :
524 // // the V0 selected along with the cascade (secondary V0) may
525 // // usually be removed from the dedicated V0 selections (prim V0) ...
526 // // -> To be discussed !
528 // // this is a little awkward but otherwise the
529 // // list wants to access the pointer (delete it)
530 // // again when going out of scope
531 // delete cascadeObjects.RemoveAt(5); // esdPrimVtx created via copy construct
533 // if (!selectCascade)
537 // delete cascadeObjects.RemoveAt(5); // esdPrimVtx created via copy construct
541 // 2 - Add the cascade vertex
543 esdCascade->GetXYZcascade(pos[0], pos[1], pos[2]);
544 esdCascade->GetPosCovXi(covVtx);
545 chi2 = esdCascade->GetChi2Xi();
547 AliAODVertex *vCascade = new(verticesArray[fNumberOfVertices++]) AliAODVertex( pos,
549 chi2, // FIXME = Chi2/NDF will be needed
552 AliAODVertex::kCascade);
553 fPrimaryVertex->AddDaughter(vCascade);
556 // printf("---- Cascade / Cascade Vertex (AOD) : \n");
557 // vCascade->Print();
560 // if(esd.GetTOFHeader() && fIsPidOwner) fESDpid->SetTOFResponse(const_cast<AliESDEvent*>(&esd), (AliESDpid::EStartTimeType_t)fTimeZeroType); //in case of AOD production starting form LHC10e without Tender.
563 // 3 - Add the bachelor track from the cascade
565 if (!fUsedTrack[idxBachFromCascade]) {
567 esdCascadeBach->GetPxPyPz(momBach);
568 esdCascadeBach->GetXYZ(pos);
569 esdCascadeBach->GetCovarianceXYZPxPyPz(covTr);
570 esdCascadeBach->GetESDpid(pid);
572 fUsedTrack[idxBachFromCascade] = kTRUE;
573 UInt_t selectInfo = 0;
574 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeBach);
575 if (fMChandler) fMChandler->SelectParticle(esdCascadeBach->GetLabel());
576 aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack(esdCascadeBach->GetID(),
577 esdCascadeBach->GetLabel(),
581 kFALSE, // Why kFALSE for "isDCA" ? FIXME
583 (Short_t)esdCascadeBach->GetSign(),
584 esdCascadeBach->GetITSClusterMap(),
587 kTRUE, // usedForVtxFit = kFALSE ? FIXME
588 vtx->UsesTrack(esdCascadeBach->GetID()),
589 AliAODTrack::kSecondary,
591 aodTrack->SetTPCFitMap(esdCascadeBach->GetTPCFitMap());
592 aodTrack->SetTPCClusterMap(esdCascadeBach->GetTPCClusterMap());
593 aodTrack->SetTPCSharedMap (esdCascadeBach->GetTPCSharedMap());
594 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeBach));
595 aodTrack->SetTPCPointsF(esdCascadeBach->GetTPCNclsF());
596 aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadeBach->GetTPCCrossedRows()));
597 aodTrack->SetIntegratedLength(esdCascadeBach->GetIntegratedLength());
598 fAODTrackRefs->AddAt(aodTrack,idxBachFromCascade);
600 if (esdCascadeBach->GetSign() > 0) ++fNumberOfPositiveTracks;
601 aodTrack->ConvertAliPIDtoAODPID();
602 aodTrack->SetFlags(esdCascadeBach->GetStatus());
603 SetAODPID(esdCascadeBach,aodTrack,detpid);
606 aodTrack = static_cast<AliAODTrack*>( fAODTrackRefs->At(idxBachFromCascade) );
609 vCascade->AddDaughter(aodTrack);
612 // printf("---- Cascade / bach dghter : \n");
613 // aodTrack->Print();
617 // 4 - Add the V0 from the cascade.
618 // = V0vtx + both pos and neg daughter tracks + the aodV0 itself
621 if ( !fUsedV0[idxV0FromCascade] ) {
622 // 4.A - if VO structure hasn't been created yet
624 // 4.A.1 - Create the V0 vertex of the cascade
626 esdV0FromCascade->GetXYZ(pos[0], pos[1], pos[2]);
627 esdV0FromCascade->GetPosCov(covVtx);
628 chi2 = esdV0FromCascade->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3 ?
630 vV0FromCascade = new(verticesArray[fNumberOfVertices++]) AliAODVertex(pos,
634 idxV0FromCascade, //id of ESDv0
637 // one V0 can be used by several cascades.
638 // So, one AOD V0 vtx can have several parent vtx.
639 // This is not directly allowed by AliAODvertex.
640 // Setting the parent vtx (here = param "vCascade") doesn't lead to a crash
641 // but to a problem of consistency within AODEvent.
642 // -> See below paragraph 4.B, for the proposed treatment of such a case.
644 // Add the vV0FromCascade to the aodVOVtxRefs
645 fAODV0VtxRefs->AddAt(vV0FromCascade,idxV0FromCascade);
648 // 4.A.2 - Add the positive tracks from the V0
650 esdCascadePos->GetPxPyPz(momPos);
651 esdCascadePos->GetXYZ(pos);
652 esdCascadePos->GetCovarianceXYZPxPyPz(covTr);
653 esdCascadePos->GetESDpid(pid);
656 if (!fUsedTrack[idxPosFromV0Dghter]) {
657 fUsedTrack[idxPosFromV0Dghter] = kTRUE;
659 UInt_t selectInfo = 0;
660 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadePos);
661 if(fMChandler) fMChandler->SelectParticle(esdCascadePos->GetLabel());
662 aodTrack = new(tracksArray[fNumberOfTracks++])
663 AliAODTrack( esdCascadePos->GetID(),
664 esdCascadePos->GetLabel(),
668 kFALSE, // Why kFALSE for "isDCA" ? FIXME
670 (Short_t)esdCascadePos->GetSign(),
671 esdCascadePos->GetITSClusterMap(),
674 kTRUE, // usedForVtxFit = kFALSE ? FIXME
675 vtx->UsesTrack(esdCascadePos->GetID()),
676 AliAODTrack::kSecondary,
678 aodTrack->SetTPCFitMap(esdCascadePos->GetTPCFitMap());
679 aodTrack->SetTPCClusterMap(esdCascadePos->GetTPCClusterMap());
680 aodTrack->SetTPCSharedMap (esdCascadePos->GetTPCSharedMap());
681 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadePos));
682 aodTrack->SetTPCPointsF(esdCascadePos->GetTPCNclsF());
683 aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadePos->GetTPCCrossedRows()));
684 aodTrack->SetIntegratedLength(esdCascadePos->GetIntegratedLength());
685 fAODTrackRefs->AddAt(aodTrack,idxPosFromV0Dghter);
687 if (esdCascadePos->GetSign() > 0) ++fNumberOfPositiveTracks;
688 aodTrack->ConvertAliPIDtoAODPID();
689 aodTrack->SetFlags(esdCascadePos->GetStatus());
690 SetAODPID(esdCascadePos,aodTrack,detpid);
693 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxPosFromV0Dghter));
695 vV0FromCascade->AddDaughter(aodTrack);
698 // 4.A.3 - Add the negative tracks from the V0
700 esdCascadeNeg->GetPxPyPz(momNeg);
701 esdCascadeNeg->GetXYZ(pos);
702 esdCascadeNeg->GetCovarianceXYZPxPyPz(covTr);
703 esdCascadeNeg->GetESDpid(pid);
706 if (!fUsedTrack[idxNegFromV0Dghter]) {
707 fUsedTrack[idxNegFromV0Dghter] = kTRUE;
709 UInt_t selectInfo = 0;
710 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeNeg);
711 if(fMChandler)fMChandler->SelectParticle(esdCascadeNeg->GetLabel());
712 aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack( esdCascadeNeg->GetID(),
713 esdCascadeNeg->GetLabel(),
717 kFALSE, // Why kFALSE for "isDCA" ? FIXME
719 (Short_t)esdCascadeNeg->GetSign(),
720 esdCascadeNeg->GetITSClusterMap(),
723 kTRUE, // usedForVtxFit = kFALSE ? FIXME
724 vtx->UsesTrack(esdCascadeNeg->GetID()),
725 AliAODTrack::kSecondary,
727 aodTrack->SetTPCFitMap(esdCascadeNeg->GetTPCFitMap());
728 aodTrack->SetTPCClusterMap(esdCascadeNeg->GetTPCClusterMap());
729 aodTrack->SetTPCSharedMap (esdCascadeNeg->GetTPCSharedMap());
730 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeNeg));
731 aodTrack->SetTPCPointsF(esdCascadeNeg->GetTPCNclsF());
732 aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadeNeg->GetTPCCrossedRows()));
733 aodTrack->SetIntegratedLength(esdCascadeNeg->GetIntegratedLength());
734 fAODTrackRefs->AddAt(aodTrack,idxNegFromV0Dghter);
736 if (esdCascadeNeg->GetSign() > 0) ++fNumberOfPositiveTracks;
737 aodTrack->ConvertAliPIDtoAODPID();
738 aodTrack->SetFlags(esdCascadeNeg->GetStatus());
739 SetAODPID(esdCascadeNeg,aodTrack,detpid);
742 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxNegFromV0Dghter));
745 vV0FromCascade->AddDaughter(aodTrack);
748 // 4.A.4 - Add the V0 from cascade to the V0 array
750 Double_t dcaV0Daughters = esdV0FromCascade->GetDcaV0Daughters();
751 Double_t dcaV0ToPrimVertex = esdV0FromCascade->GetD( esd.GetPrimaryVertex()->GetX(),
752 esd.GetPrimaryVertex()->GetY(),
753 esd.GetPrimaryVertex()->GetZ() );
754 esdV0FromCascade->GetPPxPyPz( momPosAtV0vtx[0],momPosAtV0vtx[1],momPosAtV0vtx[2] );
755 esdV0FromCascade->GetNPxPyPz( momNegAtV0vtx[0],momNegAtV0vtx[1],momNegAtV0vtx[2] );
757 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = DCA in (x,y) for Pos and ..[1] = Neg
758 dcaDaughterToPrimVertex[0] = TMath::Abs(esdCascadePos->GetD( esd.GetPrimaryVertex()->GetX(),
759 esd.GetPrimaryVertex()->GetY(),
760 esd.GetMagneticField()) );
761 dcaDaughterToPrimVertex[1] = TMath::Abs(esdCascadeNeg->GetD( esd.GetPrimaryVertex()->GetX(),
762 esd.GetPrimaryVertex()->GetY(),
763 esd.GetMagneticField()) );
765 aodV0 = new(V0s()[fNumberOfV0s++]) AliAODv0( vV0FromCascade,
770 dcaDaughterToPrimVertex);
771 // set the aod v0 on-the-fly status
772 aodV0->SetOnFlyStatus(esdV0FromCascade->GetOnFlyStatus());
774 // Add the aodV0 to the aodVORefs
775 fAODV0Refs->AddAt(aodV0,idxV0FromCascade);
777 fUsedV0[idxV0FromCascade] = kTRUE;
780 // 4.B - if V0 structure already used
783 // one V0 can be used by several cascades (frequent in PbPb evts) :
784 // same V0 which used but attached to different bachelor tracks
785 // -> aodVORefs and fAODV0VtxRefs are needed.
786 // Goal : avoid a redundancy of the info in "Vertices" and "v0s" clones array.
788 vV0FromCascade = static_cast<AliAODVertex*>( fAODV0VtxRefs->At(idxV0FromCascade) );
789 aodV0 = static_cast<AliAODv0*> ( fAODV0Refs ->At(idxV0FromCascade) );
791 // - Treatment of the parent for such a "re-used" V0 :
792 // Insert the cascade that reuses the V0 vertex in the lineage chain
793 // Before : vV0 -> vCascade1 -> vPrimary
794 // - Hyp : cascade2 uses the same V0 as cascade1
795 // After : vV0 -> vCascade2 -> vCascade1 -> vPrimary
797 AliAODVertex *vCascadePreviousParent = static_cast<AliAODVertex*> (vV0FromCascade->GetParent());
798 vV0FromCascade->SetParent(vCascade);
799 vCascade ->SetParent(vCascadePreviousParent);
802 // printf("---- Cascade / Lineage insertion\n"
803 // "Parent of V0 vtx = Cascade vtx %p\n"
804 // "Parent of the cascade vtx = Cascade vtx %p\n"
805 // "Parent of the parent cascade vtx = Cascade vtx %p\n",
806 // static_cast<void*> (vV0FromCascade->GetParent()),
807 // static_cast<void*> (vCascade->GetParent()),
808 // static_cast<void*> (vCascadePreviousParent->GetParent()) );
810 }// end if V0 structure already used
813 // printf("---- Cascade / V0 vertex: \n");
814 // vV0FromCascade->Print();
818 // printf("---- Cascade / pos dghter : \n");
819 // aodTrack->Print();
820 // printf("---- Cascade / neg dghter : \n");
821 // aodTrack->Print();
822 // printf("---- Cascade / aodV0 : \n");
826 // In any case (used V0 or not), add the V0 vertex to the cascade one.
827 vCascade->AddDaughter(vV0FromCascade);
830 // 5 - Add the primary track of the cascade (if any)
833 // 6 - Add the cascade to the AOD array of cascades
835 Double_t dcaBachToPrimVertexXY = TMath::Abs(esdCascadeBach->GetD(esd.GetPrimaryVertex()->GetX(),
836 esd.GetPrimaryVertex()->GetY(),
837 esd.GetMagneticField()) );
839 Double_t momBachAtCascadeVtx[3]={0.};
841 esdCascade->GetBPxPyPz(momBachAtCascadeVtx[0], momBachAtCascadeVtx[1], momBachAtCascadeVtx[2]);
843 aodCascade = new(cascadesArray[fNumberOfCascades++]) AliAODcascade( vCascade,
844 esdCascade->Charge(),
845 esdCascade->GetDcaXiDaughters(),
847 // DCAXiToPrimVtx -> needs to be calculated ----|
848 // doesn't exist at ESD level;
849 // See AODcascade::DcaXiToPrimVertex(Double, Double, Double)
850 dcaBachToPrimVertexXY,
855 printf("---- Cascade / AOD cascade : \n\n");
856 aodCascade->PrintXi(fPrimaryVertex->GetX(), fPrimaryVertex->GetY(), fPrimaryVertex->GetZ());
859 } // end of the loop on cascades
861 Cascades().Expand(fNumberOfCascades);
864 //______________________________________________________________________________
865 void AliAnalysisTaskESDfilter::ConvertV0s(const AliESDEvent& esd)
867 // Access to the AOD container of V0s
869 AliCodeTimerAuto("",0);
875 Double_t pos[3] = { 0. };
877 Double_t covVtx[6] = { 0. };
878 Double_t momPos[3]={0.};
879 Double_t covTr[21]={0.};
880 Double_t pid[10]={0.};
881 AliAODTrack* aodTrack(0x0);
882 AliAODPid* detpid(0x0);
883 Double_t momNeg[3]={0.};
884 Double_t momPosAtV0vtx[3]={0.};
885 Double_t momNegAtV0vtx[3]={0.};
887 for (Int_t nV0 = 0; nV0 < esd.GetNumberOfV0s(); ++nV0)
889 if (fUsedV0[nV0]) continue; // skip if already added to the AOD
891 AliESDv0 *v0 = esd.GetV0(nV0);
892 Int_t posFromV0 = v0->GetPindex();
893 Int_t negFromV0 = v0->GetNindex();
897 AliESDVertex *esdVtx = new AliESDVertex(*(esd.GetPrimaryVertex()));
898 AliESDtrack *esdV0Pos = esd.GetTrack(posFromV0);
899 AliESDtrack *esdV0Neg = esd.GetTrack(negFromV0);
901 v0objects.AddAt(v0, 0);
902 v0objects.AddAt(esdV0Pos, 1);
903 v0objects.AddAt(esdV0Neg, 2);
904 v0objects.AddAt(esdVtx, 3);
907 selectV0 = fV0Filter->IsSelected(&v0objects);
908 // this is a little awkward but otherwise the
909 // list wants to access the pointer (delete it)
910 // again when going out of scope
911 delete v0objects.RemoveAt(3); // esdVtx created via copy construct
917 delete v0objects.RemoveAt(3); // esdVtx created via copy construct
921 v0->GetXYZ(pos[0], pos[1], pos[2]);
923 if (!fOldESDformat) {
924 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
925 v0->GetPosCov(covVtx);
928 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
933 new(Vertices()[fNumberOfVertices++]) AliAODVertex(pos,
939 fPrimaryVertex->AddDaughter(vV0);
942 // Add the positive tracks from the V0
945 esdV0Pos->GetPxPyPz(momPos);
946 esdV0Pos->GetXYZ(pos);
947 esdV0Pos->GetCovarianceXYZPxPyPz(covTr);
948 esdV0Pos->GetESDpid(pid);
950 const AliESDVertex *vtx = esd.GetPrimaryVertex();
952 if (!fUsedTrack[posFromV0]) {
953 fUsedTrack[posFromV0] = kTRUE;
954 UInt_t selectInfo = 0;
955 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);
956 if(fMChandler)fMChandler->SelectParticle(esdV0Pos->GetLabel());
957 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdV0Pos->GetID(),
958 esdV0Pos->GetLabel(),
964 (Short_t)esdV0Pos->GetSign(),
965 esdV0Pos->GetITSClusterMap(),
968 kTRUE, // check if this is right
969 vtx->UsesTrack(esdV0Pos->GetID()),
970 AliAODTrack::kSecondary,
972 aodTrack->SetTPCFitMap(esdV0Pos->GetTPCFitMap());
973 aodTrack->SetTPCClusterMap(esdV0Pos->GetTPCClusterMap());
974 aodTrack->SetTPCSharedMap (esdV0Pos->GetTPCSharedMap());
975 aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Pos));
976 aodTrack->SetTPCPointsF(esdV0Pos->GetTPCNclsF());
977 aodTrack->SetTPCNCrossedRows(UShort_t(esdV0Pos->GetTPCCrossedRows()));
978 aodTrack->SetIntegratedLength(esdV0Pos->GetIntegratedLength());
979 fAODTrackRefs->AddAt(aodTrack,posFromV0);
980 // if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());
981 if (esdV0Pos->GetSign() > 0) ++fNumberOfPositiveTracks;
982 aodTrack->ConvertAliPIDtoAODPID();
983 aodTrack->SetFlags(esdV0Pos->GetStatus());
984 SetAODPID(esdV0Pos,aodTrack,detpid);
987 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(posFromV0));
988 // if (fDebug > 0) printf("-------------------Bo pos track from refArray pt %.3f \n",aodTrack->Pt());
990 vV0->AddDaughter(aodTrack);
992 // Add the negative tracks from the V0
994 esdV0Neg->GetPxPyPz(momNeg);
995 esdV0Neg->GetXYZ(pos);
996 esdV0Neg->GetCovarianceXYZPxPyPz(covTr);
997 esdV0Neg->GetESDpid(pid);
999 if (!fUsedTrack[negFromV0]) {
1000 fUsedTrack[negFromV0] = kTRUE;
1001 UInt_t selectInfo = 0;
1002 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);
1003 if(fMChandler)fMChandler->SelectParticle(esdV0Neg->GetLabel());
1004 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdV0Neg->GetID(),
1005 esdV0Neg->GetLabel(),
1011 (Short_t)esdV0Neg->GetSign(),
1012 esdV0Neg->GetITSClusterMap(),
1015 kTRUE, // check if this is right
1016 vtx->UsesTrack(esdV0Neg->GetID()),
1017 AliAODTrack::kSecondary,
1019 aodTrack->SetTPCFitMap(esdV0Neg->GetTPCFitMap());
1020 aodTrack->SetTPCClusterMap(esdV0Neg->GetTPCClusterMap());
1021 aodTrack->SetTPCSharedMap (esdV0Neg->GetTPCSharedMap());
1022 aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Neg));
1023 aodTrack->SetTPCPointsF(esdV0Neg->GetTPCNclsF());
1024 aodTrack->SetTPCNCrossedRows(UShort_t(esdV0Neg->GetTPCCrossedRows()));
1025 aodTrack->SetIntegratedLength(esdV0Neg->GetIntegratedLength());
1026 fAODTrackRefs->AddAt(aodTrack,negFromV0);
1027 // if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());
1028 if (esdV0Neg->GetSign() > 0) ++fNumberOfPositiveTracks;
1029 aodTrack->ConvertAliPIDtoAODPID();
1030 aodTrack->SetFlags(esdV0Neg->GetStatus());
1031 SetAODPID(esdV0Neg,aodTrack,detpid);
1034 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(negFromV0));
1035 // if (fDebug > 0) printf("-------------------Bo neg track from refArray pt %.3f \n",aodTrack->Pt());
1037 vV0->AddDaughter(aodTrack);
1040 // Add the V0 the V0 array as well
1042 Double_t dcaV0Daughters = v0->GetDcaV0Daughters();
1043 Double_t dcaV0ToPrimVertex = v0->GetD(esd.GetPrimaryVertex()->GetX(),
1044 esd.GetPrimaryVertex()->GetY(),
1045 esd.GetPrimaryVertex()->GetZ());
1047 v0->GetPPxPyPz(momPosAtV0vtx[0],momPosAtV0vtx[1],momPosAtV0vtx[2]);
1048 v0->GetNPxPyPz(momNegAtV0vtx[0],momNegAtV0vtx[1],momNegAtV0vtx[2]);
1050 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = DCA in (x,y) for Pos and ..[1] = Neg
1051 dcaDaughterToPrimVertex[0] = TMath::Abs(esdV0Pos->GetD( esd.GetPrimaryVertex()->GetX(),
1052 esd.GetPrimaryVertex()->GetY(),
1053 esd.GetMagneticField()) );
1054 dcaDaughterToPrimVertex[1] = TMath::Abs(esdV0Neg->GetD( esd.GetPrimaryVertex()->GetX(),
1055 esd.GetPrimaryVertex()->GetY(),
1056 esd.GetMagneticField()) );
1058 AliAODv0* aodV0 = new(V0s()[fNumberOfV0s++]) AliAODv0(vV0,
1063 dcaDaughterToPrimVertex);
1065 // set the aod v0 on-the-fly status
1066 aodV0->SetOnFlyStatus(v0->GetOnFlyStatus());
1067 }//End of loop on V0s
1069 V0s().Expand(fNumberOfV0s);
1072 //______________________________________________________________________________
1073 void AliAnalysisTaskESDfilter::ConvertTPCOnlyTracks(const AliESDEvent& esd)
1075 // Convert TPC only tracks
1076 // Here we have wo hybrid appraoch to remove fakes
1077 // ******* ITSTPC ********
1078 // Uses a cut on the ITS properties to select global tracks
1079 // which are than marked as HybdridITSTPC for the remainder
1080 // the TPC only tracks are flagged as HybridITSTPConly.
1081 // Note, in order not to get fakes back in the TPC cuts, one needs
1082 // two "ITS" cuts one tight (1) (to throw out fakes) and one lose (2) (to NOT flag the trakcs in the TPC only)
1083 // using cut number (3)
1084 // so fHybridFilterMask == (1)|(2) fTPCFilterMask = (3), Usercode needs to slect with mask = (1)|(3) and track->IsHybridITSTPC()
1085 // ******* TPC ********
1086 // Here, only TPC tracks are flagged that pass the tight ITS cuts and tracks that pass the TPC cuts and NOT the loose ITS cuts
1087 // the ITS cuts neeed to be added to the filter as extra cuts, since here the selections info is reset in the global and put to the TPC only track
1089 AliCodeTimerAuto("",0);
1091 // Loop over the tracks and extract and mask out all aod tracks that pass the selections for AODt racks
1092 for(int it = 0;it < fNumberOfTracks;++it)
1094 AliAODTrack *tr = (AliAODTrack*)(Tracks().At(it));
1096 UInt_t map = tr->GetFilterMap();
1097 if(map&fTPCConstrainedFilterMask){
1098 // we only reset the track select ionfo, no deletion...
1099 tr->SetFilterMap(map&~fTPCConstrainedFilterMask);
1101 if(map&fHybridFilterMaskTPCCG){
1102 // this is one part of the hybrid tracks
1103 // the others not passing the selection will be TPC only selected below
1104 tr->SetIsHybridTPCConstrainedGlobal(kTRUE);
1107 // Loop over the ESD trcks and pick out the tracks passing TPC only cuts
1110 const AliESDVertex *vtxSPD = esd.GetPrimaryVertexSPD();
1111 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1113 Double_t pos[3] = { 0. };
1114 Double_t covTr[21]={0.};
1115 Double_t pid[10]={0.};
1118 Double_t p[3] = { 0. };
1120 Double_t pDCA[3] = { 0. }; // momentum at DCA
1121 Double_t rDCA[3] = { 0. }; // position at DCA
1122 Float_t dDCA[2] = {0.}; // DCA to the vertex d and z
1123 Float_t cDCA[3] = {0.}; // covariance of impact parameters
1126 AliAODTrack* aodTrack(0x0);
1127 // AliAODPid* detpid(0x0);
1129 // account for change in pT after the constraint
1130 Float_t ptMax = 1E10;
1132 for(int i = 0;i<32;i++){
1133 if(fTPCConstrainedFilterMask&(1<<i)){
1134 AliESDtrackCuts*cuts = (AliESDtrackCuts*)fTrackFilter->GetCuts()->At(i);
1135 Float_t tmp1= 0,tmp2 = 0;
1136 cuts->GetPtRange(tmp1,tmp2);
1137 if(tmp1>ptMin)ptMin=tmp1;
1138 if(tmp2<ptMax)ptMax=tmp2;
1142 for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack)
1144 AliESDtrack* esdTrack = esd.GetTrack(nTrack); //carefull do not modify it othwise need to work with a copy
1146 UInt_t selectInfo = 0;
1147 Bool_t isHybridITSTPC = false;
1151 selectInfo = fTrackFilter->IsSelected(esdTrack);
1154 if(!(selectInfo&fHybridFilterMaskTPCCG)){
1155 // not already selected tracks, use second part of hybrid tracks
1156 isHybridITSTPC = true;
1157 // too save space one could only store these...
1160 selectInfo &= fTPCConstrainedFilterMask;
1161 if (!selectInfo)continue;
1162 if (fWriteHybridTPCCOnly&&!isHybridITSTPC)continue; // write only complementary tracks
1163 // create a tpc only tracl
1164 AliESDtrack *track = AliESDtrackCuts::GetTPCOnlyTrack(const_cast<AliESDEvent*>(&esd),esdTrack->GetID());
1165 if(!track) continue;
1169 // only constrain tracks above threshold
1170 AliExternalTrackParam exParam;
1171 // take the B-field from the ESD, no 3D fieldMap available at this point
1172 Bool_t relate = false;
1173 relate = track->RelateToVertexTPC(vtxSPD,esd.GetMagneticField(),kVeryBig,&exParam);
1178 // fetch the track parameters at the DCA (unconstraint)
1179 if(track->GetTPCInnerParam()){
1180 track->GetTPCInnerParam()->GetPxPyPz(pDCA);
1181 track->GetTPCInnerParam()->GetXYZ(rDCA);
1183 // get the DCA to the vertex:
1184 track->GetImpactParametersTPC(dDCA,cDCA);
1185 // set the constrained parameters to the track
1186 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
1189 track->GetPxPyPz(p);
1191 Float_t pT = track->Pt();
1192 if(pT<ptMin||pT>ptMax){
1201 track->GetCovarianceXYZPxPyPz(covTr);
1202 esdTrack->GetESDpid(pid);// original PID
1204 if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
1205 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack((track->GetID()+1)*-1,
1212 (Short_t)track->GetSign(),
1213 track->GetITSClusterMap(),
1216 kTRUE, // check if this is right
1217 vtx->UsesTrack(track->GetID()),
1218 AliAODTrack::kPrimary,
1220 aodTrack->SetIsHybridTPCConstrainedGlobal(isHybridITSTPC);
1221 aodTrack->SetTPCFitMap(track->GetTPCFitMap());
1222 aodTrack->SetTPCClusterMap(track->GetTPCClusterMap());
1223 aodTrack->SetTPCSharedMap (track->GetTPCSharedMap());
1224 aodTrack->SetIsTPCConstrained(kTRUE);
1225 aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack)); // original track
1226 // set the DCA values to the AOD track
1227 aodTrack->SetPxPyPzAtDCA(pDCA[0],pDCA[1],pDCA[2]);
1228 aodTrack->SetXYAtDCA(rDCA[0],rDCA[1]);
1229 aodTrack->SetDCA(dDCA[0],dDCA[1]);
1231 aodTrack->SetFlags(track->GetStatus());
1232 aodTrack->SetTPCPointsF(track->GetTPCNclsF());
1233 aodTrack->SetTPCNCrossedRows(UShort_t(track->GetTPCCrossedRows()));
1234 aodTrack->SetIntegratedLength(track->GetIntegratedLength());
1236 //Perform progagation of tracks if needed
1237 if(fDoPropagateTrackToEMCal) PropagateTrackToEMCal(esdTrack);
1238 aodTrack->SetTrackPhiEtaOnEMCal(esdTrack->GetTrackPhiOnEMCal(),esdTrack->GetTrackEtaOnEMCal());
1240 // do not duplicate PID information
1241 // aodTrack->ConvertAliPIDtoAODPID();
1242 // SetAODPID(esdTrack,aodTrack,detpid);
1245 } // end of loop on tracks
1249 //______________________________________________________________________________
1250 void AliAnalysisTaskESDfilter::ConvertGlobalConstrainedTracks(const AliESDEvent& esd)
1253 // Here we have the option to store the complement from global constraint information
1254 // to tracks passing tight cuts (1) in order not to get fakes back in, one needs
1255 // two sets of cuts one tight (1) (to throw out fakes) and one lose (2) (fakes/bad tracks would pass (2) but not (1))
1256 // using cut number (3) selects the tracks that complement (1) e.g. tracks witout ITS refit or cluster requirement
1259 AliCodeTimerAuto("",0);
1261 // Loop over the tracks and extract and mask out all aod tracks that pass the selections for AODt racks
1262 for(int it = 0;it < fNumberOfTracks;++it)
1264 AliAODTrack *tr = (AliAODTrack*)(Tracks().At(it));
1266 UInt_t map = tr->GetFilterMap();
1267 if(map&fGlobalConstrainedFilterMask){
1268 // we only reset the track select info, no deletion...
1269 // mask reset mask in case track is already taken
1270 tr->SetFilterMap(map&~fGlobalConstrainedFilterMask);
1272 if(map&fHybridFilterMaskGCG){
1273 // this is one part of the hybrid tracks
1274 // the others not passing the selection will be the ones selected below
1275 tr->SetIsHybridGlobalConstrainedGlobal(kTRUE);
1278 // Loop over the ESD trcks and pick out the tracks passing the GlobalConstraint cuts
1281 Double_t pos[3] = { 0. };
1282 Double_t covTr[21]={0.};
1283 Double_t pid[10]={0.};
1284 Double_t p[3] = { 0. };
1286 Double_t pDCA[3] = { 0. }; // momentum at DCA
1287 Double_t rDCA[3] = { 0. }; // position at DCA
1288 Float_t dDCA[2] = {0.}; // DCA to the vertex d and z
1289 Float_t cDCA[3] = {0.}; // covariance of impact parameters
1292 AliAODTrack* aodTrack(0x0);
1293 AliAODPid* detpid(0x0);
1294 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1296 // account for change in pT after the constraint
1297 Float_t ptMax = 1E10;
1299 for(int i = 0;i<32;i++){
1300 if(fGlobalConstrainedFilterMask&(1<<i)){
1301 AliESDtrackCuts*cuts = (AliESDtrackCuts*)fTrackFilter->GetCuts()->At(i);
1302 Float_t tmp1= 0,tmp2 = 0;
1303 cuts->GetPtRange(tmp1,tmp2);
1304 if(tmp1>ptMin)ptMin=tmp1;
1305 if(tmp2<ptMax)ptMax=tmp2;
1311 for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack)
1313 AliESDtrack* esdTrack = esd.GetTrack(nTrack); //carefull do not modify it othwise need to work with a copy
1314 const AliExternalTrackParam * exParamGC = esdTrack->GetConstrainedParam();
1315 if(!exParamGC)continue;
1317 UInt_t selectInfo = 0;
1318 Bool_t isHybridGC = false;
1323 selectInfo = fTrackFilter->IsSelected(esdTrack);
1327 if(!(selectInfo&fHybridFilterMaskGCG))isHybridGC = true;
1328 if (fWriteHybridGCOnly&&!isHybridGC)continue; // write only complementary tracks
1330 selectInfo &= fGlobalConstrainedFilterMask;
1331 if (!selectInfo)continue;
1332 // fetch the track parameters at the DCA (unconstrained)
1333 esdTrack->GetPxPyPz(pDCA);
1334 esdTrack->GetXYZ(rDCA);
1335 // get the DCA to the vertex:
1336 esdTrack->GetImpactParameters(dDCA,cDCA);
1338 if (!esdTrack->GetConstrainedPxPyPz(p)) continue;
1341 Float_t pT = exParamGC->Pt();
1342 if(pT<ptMin||pT>ptMax){
1347 esdTrack->GetConstrainedXYZ(pos);
1348 exParamGC->GetCovarianceXYZPxPyPz(covTr);
1349 esdTrack->GetESDpid(pid);
1350 if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
1351 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack((esdTrack->GetID()+1)*-1,
1352 esdTrack->GetLabel(),
1358 (Short_t)esdTrack->GetSign(),
1359 esdTrack->GetITSClusterMap(),
1362 kTRUE, // check if this is right
1363 vtx->UsesTrack(esdTrack->GetID()),
1364 AliAODTrack::kPrimary,
1366 aodTrack->SetIsHybridGlobalConstrainedGlobal(isHybridGC);
1367 aodTrack->SetIsGlobalConstrained(kTRUE);
1368 aodTrack->SetTPCFitMap(esdTrack->GetTPCFitMap());
1369 aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());
1370 aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());
1371 aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));
1374 // set the DCA values to the AOD track
1375 aodTrack->SetPxPyPzAtDCA(pDCA[0],pDCA[1],pDCA[2]);
1376 aodTrack->SetXYAtDCA(rDCA[0],rDCA[1]);
1377 aodTrack->SetDCA(dDCA[0],dDCA[1]);
1379 aodTrack->SetFlags(esdTrack->GetStatus());
1380 aodTrack->SetTPCPointsF(esdTrack->GetTPCNclsF());
1381 aodTrack->SetTPCNCrossedRows(UShort_t(esdTrack->GetTPCCrossedRows()));
1382 aodTrack->SetIntegratedLength(esdTrack->GetIntegratedLength());
1385 // only copy AOD information for hybrid, no duplicate information
1386 aodTrack->ConvertAliPIDtoAODPID();
1387 SetAODPID(esdTrack,aodTrack,detpid);
1390 //Perform progagation of tracks if needed
1391 if(fDoPropagateTrackToEMCal) PropagateTrackToEMCal(esdTrack);
1392 aodTrack->SetTrackPhiEtaOnEMCal(esdTrack->GetTrackPhiOnEMCal(),esdTrack->GetTrackEtaOnEMCal());
1393 } // end of loop on tracks
1398 //______________________________________________________________________________
1399 void AliAnalysisTaskESDfilter::ConvertTracks(const AliESDEvent& esd)
1401 // Tracks (primary and orphan)
1403 AliCodeTimerAuto("",0);
1405 AliDebug(1,Form("NUMBER OF ESD TRACKS %5d\n", esd.GetNumberOfTracks()));
1407 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1408 Double_t p[3] = { 0. };
1409 Double_t pos[3] = { 0. };
1410 Double_t covTr[21] = { 0. };
1411 Double_t pid[10] = { 0. };
1412 AliAODTrack* aodTrack(0x0);
1413 AliAODPid* detpid(0x0);
1415 for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack)
1417 if (fUsedTrack[nTrack]) continue;
1419 AliESDtrack *esdTrack = esd.GetTrack(nTrack);
1420 UInt_t selectInfo = 0;
1424 selectInfo = fTrackFilter->IsSelected(esdTrack);
1425 if (!selectInfo && !vtx->UsesTrack(esdTrack->GetID())) continue;
1429 esdTrack->GetPxPyPz(p);
1430 esdTrack->GetXYZ(pos);
1431 esdTrack->GetCovarianceXYZPxPyPz(covTr);
1432 esdTrack->GetESDpid(pid);
1433 if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
1434 fPrimaryVertex->AddDaughter(aodTrack =
1435 new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrack->GetID(),
1436 esdTrack->GetLabel(),
1442 (Short_t)esdTrack->GetSign(),
1443 esdTrack->GetITSClusterMap(),
1446 kTRUE, // check if this is right
1447 vtx->UsesTrack(esdTrack->GetID()),
1448 AliAODTrack::kPrimary,
1451 aodTrack->SetTPCFitMap(esdTrack->GetTPCFitMap());
1452 aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());
1453 aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());
1454 aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));
1455 aodTrack->SetTPCPointsF(esdTrack->GetTPCNclsF());
1456 aodTrack->SetTPCNCrossedRows(UShort_t(esdTrack->GetTPCCrossedRows()));
1457 aodTrack->SetIntegratedLength(esdTrack->GetIntegratedLength());
1458 if(esdTrack->IsEMCAL()) aodTrack->SetEMCALcluster(esdTrack->GetEMCALcluster());
1459 if(esdTrack->IsPHOS()) aodTrack->SetPHOScluster(esdTrack->GetPHOScluster());
1461 //Perform progagation of tracks if needed
1462 if(fDoPropagateTrackToEMCal) PropagateTrackToEMCal(esdTrack);
1463 aodTrack->SetTrackPhiEtaOnEMCal(esdTrack->GetTrackPhiOnEMCal(),esdTrack->GetTrackEtaOnEMCal());
1465 fAODTrackRefs->AddAt(aodTrack, nTrack);
1468 if (esdTrack->GetSign() > 0) ++fNumberOfPositiveTracks;
1469 aodTrack->SetFlags(esdTrack->GetStatus());
1470 aodTrack->ConvertAliPIDtoAODPID();
1471 SetAODPID(esdTrack,aodTrack,detpid);
1472 } // end of loop on tracks
1475 //______________________________________________________________________________
1476 void AliAnalysisTaskESDfilter::PropagateTrackToEMCal(AliESDtrack *esdTrack)
1478 Double_t trkPos[3] = {0.,0.,0.};
1479 Double_t EMCalEta=-999, EMCalPhi=-999;
1480 Double_t trkphi = esdTrack->Phi()*TMath::RadToDeg();
1481 if(TMath::Abs(esdTrack->Eta())<0.9 && trkphi > 10 && trkphi < 250 )
1483 AliExternalTrackParam *trkParam = const_cast<AliExternalTrackParam*>(esdTrack->GetInnerParam());
1486 AliExternalTrackParam trkParamTmp(*trkParam);
1487 if(AliTrackerBase::PropagateTrackToBxByBz(&trkParamTmp, 430, esdTrack->GetMass(), 20, kTRUE, 0.8, -1))
1489 trkParamTmp.GetXYZ(trkPos);
1490 TVector3 trkPosVec(trkPos[0],trkPos[1],trkPos[2]);
1491 EMCalEta = trkPosVec.Eta();
1492 EMCalPhi = trkPosVec.Phi();
1493 if(EMCalPhi<0) EMCalPhi += 2*TMath::Pi();
1494 esdTrack->SetTrackPhiEtaOnEMCal(EMCalPhi,EMCalEta);
1500 //______________________________________________________________________________
1501 void AliAnalysisTaskESDfilter::ConvertPmdClusters(const AliESDEvent& esd)
1503 // Convert PMD Clusters
1504 AliCodeTimerAuto("",0);
1505 Int_t jPmdClusters=0;
1506 // Access to the AOD container of PMD clusters
1507 TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
1508 for (Int_t iPmd = 0; iPmd < esd.GetNumberOfPmdTracks(); ++iPmd) {
1509 // file pmd clusters, to be revised!
1510 AliESDPmdTrack *pmdTrack = esd.GetPmdTrack(iPmd);
1513 Double_t posPmd[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ()};
1514 Double_t pidPmd[13] = { 0.}; // to be revised!
1516 // assoc cluster not set
1517 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), posPmd, pidPmd);
1522 //______________________________________________________________________________
1523 void AliAnalysisTaskESDfilter::ConvertCaloClusters(const AliESDEvent& esd)
1525 // Convert Calorimeter Clusters
1526 AliCodeTimerAuto("",0);
1528 // Access to the AOD container of clusters
1529 TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
1532 for (Int_t iClust=0; iClust<esd.GetNumberOfCaloClusters(); ++iClust) {
1534 AliESDCaloCluster * cluster = esd.GetCaloCluster(iClust);
1536 Int_t id = cluster->GetID();
1537 Int_t nLabel = cluster->GetNLabels();
1538 Int_t *labels = cluster->GetLabels();
1540 for(int i = 0;i < nLabel;++i){
1541 if(fMChandler)fMChandler->SelectParticle(labels[i]);
1545 Float_t energy = cluster->E();
1546 Float_t posF[3] = { 0.};
1547 cluster->GetPosition(posF);
1549 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
1555 cluster->GetType(),0);
1557 caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
1558 cluster->GetDispersion(),
1559 cluster->GetM20(), cluster->GetM02(),
1560 cluster->GetEmcCpvDistance(),
1561 cluster->GetNExMax(),cluster->GetTOF()) ;
1563 caloCluster->SetPIDFromESD(cluster->GetPID());
1564 caloCluster->SetNCells(cluster->GetNCells());
1565 caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
1566 caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
1568 caloCluster->SetTrackDistance(cluster->GetTrackDx(), cluster->GetTrackDz());
1570 Int_t nMatchCount = 0;
1571 TArrayI* matchedT = cluster->GetTracksMatched();
1572 if (fNumberOfTracks>0 && matchedT && cluster->GetTrackMatchedIndex() >= 0) {
1573 for (Int_t im = 0; im < matchedT->GetSize(); im++) {
1574 Int_t iESDtrack = matchedT->At(im);;
1575 if (fAODTrackRefs->At(iESDtrack) != 0) {
1576 caloCluster->AddTrackMatched((AliAODTrack*)fAODTrackRefs->At(iESDtrack));
1582 caloCluster->SetTrackDistance(-999,-999);
1585 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
1588 //______________________________________________________________________________
1589 void AliAnalysisTaskESDfilter::ConvertCaloTrigger(TString calo, const AliESDEvent& esd)
1591 AliCodeTimerAuto("",0);
1595 AliAODCaloTrigger &aodTrigger = *(AODEvent()->GetCaloTrigger(calo));
1596 AliESDCaloTrigger &esdTrigger = *(esd.GetCaloTrigger(calo));
1598 aodTrigger.Allocate(esdTrigger.GetEntries());
1604 while (esdTrigger.Next()) {
1605 esdTrigger.GetPosition(tmod,tabsId);
1606 esdTrigger.GetAmplitude(a);
1607 aodTrigger.Add(tmod,tabsId,a,0.,(Int_t*)NULL,0,0,0);
1613 AliAODHandler *aodHandler = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
1617 TTree *aodTree = aodHandler->GetTree();
1621 Int_t *type = esd.GetCaloTriggerType();
1623 for (Int_t i = 0; i < 15; i++)
1625 aodTree->GetUserInfo()->Add(new TParameter<int>(Form("EMCALCaloTrigger%d",i), type[i]));
1630 AliAODCaloTrigger &aodTrigger = *(AODEvent()->GetCaloTrigger(calo));
1632 AliESDCaloTrigger &esdTrigger = *(esd.GetCaloTrigger(calo));
1634 aodTrigger.Allocate(esdTrigger.GetEntries());
1637 while (esdTrigger.Next())
1639 Int_t px, py, ts, nTimes, times[10], b;
1642 esdTrigger.GetPosition(px, py);
1644 esdTrigger.GetAmplitude(a);
1645 esdTrigger.GetTime(t);
1647 esdTrigger.GetL0Times(times);
1648 esdTrigger.GetNL0Times(nTimes);
1650 esdTrigger.GetL1TimeSum(ts);
1652 esdTrigger.GetTriggerBits(b);
1654 aodTrigger.Add(px, py, a, t, times, nTimes, ts, b);
1657 for (int i = 0; i < 4; i++) aodTrigger.SetL1Threshold(i, esdTrigger.GetL1Threshold(i));
1661 esdTrigger.GetL1V0(0),
1662 esdTrigger.GetL1V0(1)
1665 aodTrigger.SetL1V0(v0);
1666 aodTrigger.SetL1FrameMask(esdTrigger.GetL1FrameMask());
1669 //______________________________________________________________________________
1670 void AliAnalysisTaskESDfilter::ConvertEMCALCells(const AliESDEvent& esd)
1672 // Convert EMCAL Cells
1673 AliCodeTimerAuto("",0);
1674 // fill EMCAL cell info
1675 if (esd.GetEMCALCells()) { // protection against missing ESD information
1676 AliESDCaloCells &esdEMcells = *(esd.GetEMCALCells());
1677 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
1679 AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
1680 aodEMcells.CreateContainer(nEMcell);
1681 aodEMcells.SetType(AliAODCaloCells::kEMCALCell);
1682 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
1683 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell),
1684 esdEMcells.GetTime(iCell), esdEMcells.GetMCLabel(iCell), esdEMcells.GetEFraction(iCell));
1690 //______________________________________________________________________________
1691 void AliAnalysisTaskESDfilter::ConvertPHOSCells(const AliESDEvent& esd)
1693 // Convert PHOS Cells
1694 AliCodeTimerAuto("",0);
1695 // fill PHOS cell info
1696 if (esd.GetPHOSCells()) { // protection against missing ESD information
1697 AliESDCaloCells &esdPHcells = *(esd.GetPHOSCells());
1698 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
1700 AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
1701 aodPHcells.CreateContainer(nPHcell);
1702 aodPHcells.SetType(AliAODCaloCells::kPHOSCell);
1703 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
1704 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell),
1705 esdPHcells.GetTime(iCell), esdPHcells.GetMCLabel(iCell), esdPHcells.GetEFraction(iCell));
1711 //______________________________________________________________________________
1712 void AliAnalysisTaskESDfilter::ConvertTracklets(const AliESDEvent& esd)
1715 AliCodeTimerAuto("",0);
1717 AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
1718 const AliMultiplicity *mult = esd.GetMultiplicity();
1720 if (mult->GetNumberOfTracklets()>0) {
1721 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
1723 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
1725 fMChandler->SelectParticle(mult->GetLabel(n, 0));
1726 fMChandler->SelectParticle(mult->GetLabel(n, 1));
1728 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0),mult->GetLabel(n, 1));
1732 //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
1736 //______________________________________________________________________________
1737 void AliAnalysisTaskESDfilter::ConvertKinks(const AliESDEvent& esd)
1739 AliCodeTimerAuto("",0);
1741 // Kinks: it is a big mess the access to the information in the kinks
1742 // The loop is on the tracks in order to find the mother and daugther of each kink
1744 Double_t covTr[21]={0.};
1745 Double_t pid[10]={0.};
1746 AliAODPid* detpid(0x0);
1748 fNumberOfKinks = esd.GetNumberOfKinks();
1750 const AliESDVertex* vtx = esd.GetPrimaryVertex();
1752 for (Int_t iTrack=0; iTrack<esd.GetNumberOfTracks(); ++iTrack)
1754 AliESDtrack * esdTrack = esd.GetTrack(iTrack);
1756 Int_t ikink = esdTrack->GetKinkIndex(0);
1758 if (ikink && fNumberOfKinks) {
1759 // Negative kink index: mother, positive: daughter
1761 // Search for the second track of the kink
1763 for (Int_t jTrack = iTrack+1; jTrack<esd.GetNumberOfTracks(); ++jTrack) {
1765 AliESDtrack * esdTrack1 = esd.GetTrack(jTrack);
1767 Int_t jkink = esdTrack1->GetKinkIndex(0);
1769 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
1771 // The two tracks are from the same kink
1773 if (fUsedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
1776 Int_t idaughter = -1;
1778 if (ikink<0 && jkink>0) {
1783 else if (ikink>0 && jkink<0) {
1789 // cerr << "Error: Wrong combination of kink indexes: "
1790 // << ikink << " " << jkink << endl;
1794 // Add the mother track if it passed primary track selection cuts
1796 AliAODTrack * mother = NULL;
1798 UInt_t selectInfo = 0;
1800 selectInfo = fTrackFilter->IsSelected(esd.GetTrack(imother));
1801 if (!selectInfo) continue;
1804 if (!fUsedTrack[imother]) {
1806 fUsedTrack[imother] = kTRUE;
1808 AliESDtrack *esdTrackM = esd.GetTrack(imother);
1809 Double_t p[3] = { 0. };
1810 Double_t pos[3] = { 0. };
1811 esdTrackM->GetPxPyPz(p);
1812 esdTrackM->GetXYZ(pos);
1813 esdTrackM->GetCovarianceXYZPxPyPz(covTr);
1814 esdTrackM->GetESDpid(pid);
1815 if(fMChandler)fMChandler->SelectParticle(esdTrackM->GetLabel());
1817 new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrackM->GetID(),
1818 esdTrackM->GetLabel(),
1824 (Short_t)esdTrackM->GetSign(),
1825 esdTrackM->GetITSClusterMap(),
1828 kTRUE, // check if this is right
1829 vtx->UsesTrack(esdTrack->GetID()),
1830 AliAODTrack::kPrimary,
1832 mother->SetTPCFitMap(esdTrackM->GetTPCFitMap());
1833 mother->SetTPCClusterMap(esdTrackM->GetTPCClusterMap());
1834 mother->SetTPCSharedMap (esdTrackM->GetTPCSharedMap());
1835 mother->SetChi2perNDF(Chi2perNDF(esdTrackM));
1836 mother->SetTPCPointsF(esdTrackM->GetTPCNclsF());
1837 mother->SetTPCNCrossedRows(UShort_t(esdTrackM->GetTPCCrossedRows()));
1838 mother->SetIntegratedLength(esdTrackM->GetIntegratedLength());
1840 fAODTrackRefs->AddAt(mother, imother);
1842 if (esdTrackM->GetSign() > 0) ++fNumberOfPositiveTracks;
1843 mother->SetFlags(esdTrackM->GetStatus());
1844 mother->ConvertAliPIDtoAODPID();
1845 fPrimaryVertex->AddDaughter(mother);
1846 mother->ConvertAliPIDtoAODPID();
1847 SetAODPID(esdTrackM,mother,detpid);
1850 // cerr << "Error: event " << esd.GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
1851 // << " track " << imother << " has already been used!" << endl;
1854 // Add the kink vertex
1855 AliESDkink * kink = esd.GetKink(TMath::Abs(ikink)-1);
1857 AliAODVertex * vkink =
1858 new(Vertices()[fNumberOfVertices++]) AliAODVertex(kink->GetPosition(),
1862 esdTrack->GetID(), // This is the track ID of the mother's track!
1863 AliAODVertex::kKink);
1864 // Add the daughter track
1866 AliAODTrack * daughter = NULL;
1868 if (!fUsedTrack[idaughter]) {
1870 fUsedTrack[idaughter] = kTRUE;
1872 AliESDtrack *esdTrackD = esd.GetTrack(idaughter);
1873 Double_t p[3] = { 0. };
1874 Double_t pos[3] = { 0. };
1876 esdTrackD->GetPxPyPz(p);
1877 esdTrackD->GetXYZ(pos);
1878 esdTrackD->GetCovarianceXYZPxPyPz(covTr);
1879 esdTrackD->GetESDpid(pid);
1881 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);
1882 if(fMChandler)fMChandler->SelectParticle(esdTrackD->GetLabel());
1884 new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrackD->GetID(),
1885 esdTrackD->GetLabel(),
1891 (Short_t)esdTrackD->GetSign(),
1892 esdTrackD->GetITSClusterMap(),
1895 kTRUE, // check if this is right
1896 vtx->UsesTrack(esdTrack->GetID()),
1897 AliAODTrack::kSecondary,
1899 daughter->SetTPCFitMap(esdTrackD->GetTPCFitMap());
1900 daughter->SetTPCClusterMap(esdTrackD->GetTPCClusterMap());
1901 daughter->SetTPCSharedMap (esdTrackD->GetTPCSharedMap());
1902 daughter->SetTPCPointsF(esdTrackD->GetTPCNclsF());
1903 daughter->SetTPCNCrossedRows(UShort_t(esdTrackD->GetTPCCrossedRows()));
1904 daughter->SetIntegratedLength(esdTrackD->GetIntegratedLength());
1905 fAODTrackRefs->AddAt(daughter, idaughter);
1907 if (esdTrackD->GetSign() > 0) ++fNumberOfPositiveTracks;
1908 daughter->SetFlags(esdTrackD->GetStatus());
1909 daughter->ConvertAliPIDtoAODPID();
1910 vkink->AddDaughter(daughter);
1911 daughter->ConvertAliPIDtoAODPID();
1912 SetAODPID(esdTrackD,daughter,detpid);
1915 // cerr << "Error: event " << esd.GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
1916 // << " track " << idaughter << " has already been used!" << endl;
1924 //______________________________________________________________________________
1925 void AliAnalysisTaskESDfilter::ConvertPrimaryVertices(const AliESDEvent& esd)
1927 AliCodeTimerAuto("",0);
1929 // Access to the AOD container of vertices
1930 fNumberOfVertices = 0;
1932 Double_t pos[3] = { 0. };
1933 Double_t covVtx[6] = { 0. };
1935 // Add primary vertex. The primary tracks will be defined
1936 // after the loops on the composite objects (V0, cascades, kinks)
1937 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1939 vtx->GetXYZ(pos); // position
1940 vtx->GetCovMatrix(covVtx); //covariance matrix
1942 fPrimaryVertex = new(Vertices()[fNumberOfVertices++])
1943 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
1944 fPrimaryVertex->SetName(vtx->GetName());
1945 fPrimaryVertex->SetTitle(vtx->GetTitle());
1946 fPrimaryVertex->SetBC(vtx->GetBC());
1948 TString vtitle = vtx->GetTitle();
1949 if (!vtitle.Contains("VertexerTracks"))
1950 fPrimaryVertex->SetNContributors(vtx->GetNContributors());
1952 if (fDebug > 0) fPrimaryVertex->Print();
1954 // Add SPD "main" vertex
1955 const AliESDVertex *vtxS = esd.GetPrimaryVertexSPD();
1956 vtxS->GetXYZ(pos); // position
1957 vtxS->GetCovMatrix(covVtx); //covariance matrix
1958 AliAODVertex * mVSPD = new(Vertices()[fNumberOfVertices++])
1959 AliAODVertex(pos, covVtx, vtxS->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainSPD);
1960 mVSPD->SetName(vtxS->GetName());
1961 mVSPD->SetTitle(vtxS->GetTitle());
1962 mVSPD->SetNContributors(vtxS->GetNContributors());
1964 // Add SPD pileup vertices
1965 for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesSPD(); ++iV)
1967 const AliESDVertex *vtxP = esd.GetPileupVertexSPD(iV);
1968 vtxP->GetXYZ(pos); // position
1969 vtxP->GetCovMatrix(covVtx); //covariance matrix
1970 AliAODVertex * pVSPD = new(Vertices()[fNumberOfVertices++])
1971 AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupSPD);
1972 pVSPD->SetName(vtxP->GetName());
1973 pVSPD->SetTitle(vtxP->GetTitle());
1974 pVSPD->SetNContributors(vtxP->GetNContributors());
1975 pVSPD->SetBC(vtxP->GetBC());
1978 // Add TRK pileup vertices
1979 for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesTracks(); ++iV)
1981 const AliESDVertex *vtxP = esd.GetPileupVertexTracks(iV);
1982 vtxP->GetXYZ(pos); // position
1983 vtxP->GetCovMatrix(covVtx); //covariance matrix
1984 AliAODVertex * pVTRK = new(Vertices()[fNumberOfVertices++])
1985 AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupTracks);
1986 pVTRK->SetName(vtxP->GetName());
1987 pVTRK->SetTitle(vtxP->GetTitle());
1988 pVTRK->SetNContributors(vtxP->GetNContributors());
1989 pVTRK->SetBC(vtxP->GetBC());
1992 // Add TPC "main" vertex
1993 const AliESDVertex *vtxT = esd.GetPrimaryVertexTPC();
1994 vtxT->GetXYZ(pos); // position
1995 vtxT->GetCovMatrix(covVtx); //covariance matrix
1996 AliAODVertex * mVTPC = new(Vertices()[fNumberOfVertices++])
1997 AliAODVertex(pos, covVtx, vtxT->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainTPC);
1998 mVTPC->SetName(vtxT->GetName());
1999 mVTPC->SetTitle(vtxT->GetTitle());
2000 mVTPC->SetNContributors(vtxT->GetNContributors());
2005 //______________________________________________________________________________
2006 void AliAnalysisTaskESDfilter::ConvertVZERO(const AliESDEvent& esd)
2008 // Convert VZERO data
2009 AliAODVZERO* vzeroData = AODEvent()->GetVZEROData();
2010 *vzeroData = *(esd.GetVZEROData());
2013 //______________________________________________________________________________
2014 void AliAnalysisTaskESDfilter::ConvertTZERO(const AliESDEvent& esd)
2016 // Convert TZERO data
2017 const AliESDTZERO* esdTzero = esd.GetESDTZERO();
2018 AliAODTZERO* aodTzero = AODEvent()->GetTZEROData();
2020 for (Int_t icase=0; icase<3; icase++){
2021 aodTzero->SetT0TOF( icase, esdTzero->GetT0TOF(icase));
2022 aodTzero->SetT0TOFbest(icase, esdTzero->GetT0TOFbest(icase));
2024 aodTzero->SetBackgroundFlag(esdTzero->GetBackgroundFlag());
2025 aodTzero->SetPileupFlag(esdTzero->GetPileupFlag());
2026 aodTzero->SetSatelliteFlag(esdTzero->GetSatellite());
2028 Float_t rawTime[24];
2029 for(Int_t ipmt=0; ipmt<24; ipmt++)
2030 rawTime[ipmt] = esdTzero->GetTimeFull(ipmt,0);
2032 Int_t idxOfFirstPmtA = -1, idxOfFirstPmtC = -1;
2033 Float_t timeOfFirstPmtA = 9999, timeOfFirstPmtC = 9999;
2034 for(int ipmt=0; ipmt<12; ipmt++){
2035 if( rawTime[ipmt] > -200 && rawTime[ipmt] < timeOfFirstPmtC && rawTime[ipmt]!=0){
2036 timeOfFirstPmtC = rawTime[ipmt];
2037 idxOfFirstPmtC = ipmt;
2040 for(int ipmt=12; ipmt<24; ipmt++){
2041 if( rawTime[ipmt] > -200 && rawTime[ipmt] < timeOfFirstPmtA && rawTime[ipmt]!=0 ){
2042 timeOfFirstPmtA = rawTime[ipmt];
2043 idxOfFirstPmtA = ipmt;
2047 if(idxOfFirstPmtA != -1 && idxOfFirstPmtC != -1){
2048 //speed of light in cm/ns TMath::C()*1e-7
2049 Float_t vertexraw = TMath::C()*1e-7 * (rawTime[idxOfFirstPmtA] - rawTime[idxOfFirstPmtC])/2;
2050 aodTzero->SetT0VertexRaw( vertexraw );
2052 aodTzero->SetT0VertexRaw(99999);
2055 aodTzero->SetT0zVertex(esdTzero->GetT0zVertex());
2059 //______________________________________________________________________________
2060 void AliAnalysisTaskESDfilter::ConvertZDC(const AliESDEvent& esd)
2063 AliESDZDC* esdZDC = esd.GetZDCData();
2065 const Double_t zem1Energy = esdZDC->GetZEM1Energy();
2066 const Double_t zem2Energy = esdZDC->GetZEM2Energy();
2068 const Double_t *towZNC = esdZDC->GetZNCTowerEnergy();
2069 const Double_t *towZPC = esdZDC->GetZPCTowerEnergy();
2070 const Double_t *towZNA = esdZDC->GetZNATowerEnergy();
2071 const Double_t *towZPA = esdZDC->GetZPATowerEnergy();
2072 const Double_t *towZNCLG = esdZDC->GetZNCTowerEnergyLR();
2073 const Double_t *towZNALG = esdZDC->GetZNATowerEnergyLR();
2075 AliAODZDC* zdcAOD = AODEvent()->GetZDCData();
2077 zdcAOD->SetZEM1Energy(zem1Energy);
2078 zdcAOD->SetZEM2Energy(zem2Energy);
2079 zdcAOD->SetZNCTowers(towZNC, towZNCLG);
2080 zdcAOD->SetZNATowers(towZNA, towZNALG);
2081 zdcAOD->SetZPCTowers(towZPC);
2082 zdcAOD->SetZPATowers(towZPA);
2084 zdcAOD->SetZDCParticipants(esdZDC->GetZDCParticipants(), esdZDC->GetZDCPartSideA(), esdZDC->GetZDCPartSideC());
2085 zdcAOD->SetZDCImpactParameter(esdZDC->GetImpactParameter(), esdZDC->GetImpactParamSideA(),
2086 esdZDC->GetImpactParamSideC());
2087 zdcAOD->SetZDCTDCSum(esdZDC->GetZNTDCSum(0));
2088 zdcAOD->SetZDCTDCDiff(esdZDC->GetZNTDCDiff(0));
2089 if(esdZDC->IsZNChit()) zdcAOD->SetZNCTDC(esdZDC->GetZDCTDCCorrected(10,0));
2090 if(esdZDC->IsZNAhit()) zdcAOD->SetZNATDC(esdZDC->GetZDCTDCCorrected(12,0));
2093 //_______________________________________________________________________________________________________________________________________
2094 Int_t AliAnalysisTaskESDfilter::ConvertHMPID(const AliESDEvent& esd) // clm
2097 // Convtert ESD HMPID info to AOD and return the number of good tracks with HMPID signal.
2098 // We need to return an int since there is no signal counter in the ESD.
2101 AliCodeTimerAuto("",0);
2103 Int_t cntHmpidGoodTracks = 0;
2112 Float_t thetaTrk = 0;
2115 Double_t hmpPid[5]={0};
2116 Double_t hmpMom[3]={0};
2118 TClonesArray &hmpidRings = *(AODEvent()->GetHMPIDrings());
2120 for (Int_t iTrack=0; iTrack<esd.GetNumberOfTracks(); ++iTrack)
2122 if(! esd.GetTrack(iTrack) ) continue;
2124 if(esd.GetTrack(iTrack)->GetHMPIDsignal() > -20 ) { //
2126 (esd.GetTrack(iTrack))->GetHMPIDmip(xMip, yMip, qMip, nphMip); // Get MIP properties
2127 (esd.GetTrack(iTrack))->GetHMPIDtrk(xTrk,yTrk,thetaTrk,phiTrk);
2128 (esd.GetTrack(iTrack))->GetHMPIDpid(hmpPid);
2129 if((esd.GetTrack(iTrack))->GetOuterHmpParam()) (esd.GetTrack(iTrack))->GetOuterHmpPxPyPz(hmpMom);
2131 if(esd.GetTrack(iTrack)->GetHMPIDsignal() == 0 && thetaTrk == 0 && qMip == 0 && nphMip ==0 ) continue; //
2133 new(hmpidRings[cntHmpidGoodTracks++]) AliAODHMPIDrings(
2134 (esd.GetTrack(iTrack))->GetID(), // Unique track id to attach the ring to
2135 1000000*nphMip+qMip, // MIP charge and number of photons
2136 (esd.GetTrack(iTrack))->GetHMPIDcluIdx(), // 1000000*chamber id + cluster idx of the assigned MIP cluster
2137 thetaTrk, // track inclination angle theta
2138 phiTrk, // track inclination angle phi
2139 (esd.GetTrack(iTrack))->GetHMPIDsignal(), // Cherenkov angle
2140 (esd.GetTrack(iTrack))->GetHMPIDoccupancy(), // Occupancy claculated for the given chamber
2141 (esd.GetTrack(iTrack))->GetHMPIDchi2(), // Ring resolution squared
2142 xTrk, // Track x coordinate (LORS)
2143 yTrk, // Track y coordinate (LORS)
2144 xMip, // MIP x coordinate (LORS)
2145 yMip, // MIP y coordinate (LORS)
2146 hmpPid, // PID probablities from ESD, remove later once it is in CombinedPid
2147 hmpMom // Track momentum in HMPID at ring reconstruction
2150 // Printf(Form("+++++++++ yes/no: %d %lf %lf %lf %lf %lf %lf ",(esd.GetTrack(iTrack))->IsHMPID(),thetaTrk, (esd.GetTrack(iTrack))->GetHMPIDchi2(),xTrk, yTrk , xMip, yMip));
2153 }// HMPID signal > -20
2154 }//___esd track loop
2156 return cntHmpidGoodTracks;
2159 //______________________________________________________________________________
2160 void AliAnalysisTaskESDfilter::ConvertESDtoAOD()
2162 // ESD Filter analysis task executed for each event
2164 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
2168 AliCodeTimerAuto("",0);
2170 fOldESDformat = ( esd->GetAliESDOld() != 0x0 );
2172 // Reconstruct cascades and V0 here
2173 if (fIsV0CascadeRecoEnabled) {
2174 esd->ResetCascades();
2177 AliV0vertexer lV0vtxer;
2178 AliCascadeVertexer lCascVtxer;
2180 lV0vtxer.SetCuts(fV0Cuts);
2181 lCascVtxer.SetCuts(fCascadeCuts);
2184 lV0vtxer.Tracks2V0vertices(esd);
2185 lCascVtxer.V0sTracks2CascadeVertices(esd);
2189 fNumberOfTracks = 0;
2190 fNumberOfPositiveTracks = 0;
2192 fNumberOfVertices = 0;
2193 fNumberOfCascades = 0;
2196 AliAODHeader* header = ConvertHeader(*esd);
2198 if ( fIsVZEROEnabled ) ConvertVZERO(*esd);
2199 if ( fIsTZEROEnabled ) ConvertTZERO(*esd);
2201 // Fetch Stack for debuggging if available
2205 fMChandler = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
2208 // loop over events and fill them
2209 // Multiplicity information needed by the header (to be revised!)
2210 Int_t nTracks = esd->GetNumberOfTracks();
2211 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) esd->GetTrack(iTrack)->SetESDEvent(esd);
2213 // Update the header
2215 Int_t nV0s = esd->GetNumberOfV0s();
2216 Int_t nCascades = esd->GetNumberOfCascades();
2217 Int_t nKinks = esd->GetNumberOfKinks();
2218 Int_t nVertices = nV0s + nCascades /*V0 wihtin cascade already counted*/+ nKinks + 1 /* = prim. vtx*/;
2219 Int_t nPileSPDVertices=1+esd->GetNumberOfPileupVerticesSPD(); // also SPD main vertex
2220 Int_t nPileTrkVertices=esd->GetNumberOfPileupVerticesTracks();
2221 nVertices+=nPileSPDVertices;
2222 nVertices+=nPileTrkVertices;
2224 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
2226 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
2227 Int_t nHmpidRings = 0;
2229 AliDebug(1,Form(" NV0=%d NCASCADES=%d NKINKS=%d", nV0s, nCascades, nKinks));
2231 AODEvent()->ResetStd(nTracks, nVertices, nV0s, nCascades, nJets, nCaloClus, nFmdClus, nPmdClus,nHmpidRings);
2235 // RefArray to store a mapping between esd V0 number and newly created AOD-Vertex V0
2236 fAODV0VtxRefs = new TRefArray(nV0s);
2237 // RefArray to store the mapping between esd V0 number and newly created AOD-V0
2238 fAODV0Refs = new TRefArray(nV0s);
2239 // Array to take into account the V0s already added to the AOD (V0 within cascades)
2240 fUsedV0 = new Bool_t[nV0s];
2241 for (Int_t iV0=0; iV0<nV0s; ++iV0) fUsedV0[iV0]=kFALSE;
2246 // RefArray to store the mapping between esd track number and newly created AOD-Track
2248 fAODTrackRefs = new TRefArray(nTracks);
2250 // Array to take into account the tracks already added to the AOD
2251 fUsedTrack = new Bool_t[nTracks];
2252 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) fUsedTrack[iTrack]=kFALSE;
2255 // Array to take into account the kinks already added to the AOD
2258 fUsedKink = new Bool_t[nKinks];
2259 for (Int_t iKink=0; iKink<nKinks; ++iKink) fUsedKink[iKink]=kFALSE;
2262 ConvertPrimaryVertices(*esd);
2264 //setting best TOF PID
2265 AliESDInputHandler* esdH = dynamic_cast<AliESDInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
2267 fESDpid = esdH->GetESDpid();
2269 if (fIsPidOwner && fESDpid){
2274 { //in case of no Tender attached
2275 fESDpid = new AliESDpid;
2276 fIsPidOwner = kTRUE;
2279 if(!esd->GetTOFHeader())
2280 { //protection in case the pass2 LHC10b,c,d have been processed without tender.
2281 Float_t t0spread[10];
2282 Float_t intrinsicTOFres=100; //ps ok for LHC10b,c,d pass2!!
2283 for (Int_t i=0; i<10; i++) t0spread[i] = (TMath::Sqrt(esd->GetSigma2DiamondZ()))/0.03; //0.03 to convert from cm to ps
2284 fESDpid->GetTOFResponse().SetT0resolution(t0spread);
2285 fESDpid->GetTOFResponse().SetTimeResolution(intrinsicTOFres);
2286 // fESDpid->SetTOFResponse(esd, (AliESDpid::EStartTimeType_t)fTimeZeroType);
2287 AliTOFHeader tmpTOFHeader(0,t0spread[0],0,NULL,NULL,NULL,intrinsicTOFres,t0spread[0]);
2288 AODEvent()->SetTOFHeader(&tmpTOFHeader); // write dummy TOF header in AOD
2290 AODEvent()->SetTOFHeader(esd->GetTOFHeader()); // write TOF header in AOD
2293 // if(esd->GetTOFHeader() && fIsPidOwner) fESDpid->SetTOFResponse(esd, (AliESDpid::EStartTimeType_t)fTimeZeroType); //in case of AOD production strating form LHC10e without Tender.
2295 if ( fAreCascadesEnabled ) ConvertCascades(*esd);
2297 if ( fAreV0sEnabled ) ConvertV0s(*esd);
2299 if ( fAreKinksEnabled ) ConvertKinks(*esd);
2301 if ( fAreTracksEnabled ) ConvertTracks(*esd);
2303 // Update number of AOD tracks in header at the end of track loop (M.G.)
2304 header->SetRefMultiplicity(fNumberOfTracks);
2305 header->SetRefMultiplicityPos(fNumberOfPositiveTracks);
2306 header->SetRefMultiplicityNeg(fNumberOfTracks - fNumberOfPositiveTracks);
2308 if ( fTPCConstrainedFilterMask ) ConvertTPCOnlyTracks(*esd);
2309 if( fGlobalConstrainedFilterMask) ConvertGlobalConstrainedTracks(*esd);
2311 if ( fArePmdClustersEnabled ) ConvertPmdClusters(*esd);
2313 if ( fAreCaloClustersEnabled ) ConvertCaloClusters(*esd);
2315 if ( fAreEMCALCellsEnabled )ConvertEMCALCells(*esd);
2317 if ( fArePHOSCellsEnabled )ConvertPHOSCells(*esd);
2319 if ( fAreEMCALTriggerEnabled )ConvertCaloTrigger(TString("EMCAL"), *esd);
2321 if ( fArePHOSTriggerEnabled )ConvertCaloTrigger(TString("PHOS"), *esd);
2323 if ( fAreTrackletsEnabled ) ConvertTracklets(*esd);
2324 if ( fIsZDCEnabled ) ConvertZDC(*esd);
2326 if(fIsHMPIDEnabled) nHmpidRings = ConvertHMPID(*esd);
2328 delete fAODTrackRefs; fAODTrackRefs=0x0;
2329 delete fAODV0VtxRefs; fAODV0VtxRefs=0x0;
2330 delete fAODV0Refs; fAODV0Refs=0x0;
2332 delete[] fUsedTrack; fUsedTrack=0x0;
2333 delete[] fUsedV0; fUsedV0=0x0;
2334 delete[] fUsedKink; fUsedKink=0x0;
2345 //______________________________________________________________________________
2346 void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid)
2349 // Setter for the raw PID detector signals
2352 // Save PID object for candidate electrons
2353 Bool_t pidSave = kFALSE;
2355 Bool_t selectInfo = fTrackFilter->IsSelected((char*) "Electrons");
2356 if (selectInfo) pidSave = kTRUE;
2360 // Tracks passing pt cut
2361 if(esdtrack->Pt()>fHighPthreshold) {
2365 if(esdtrack->Pt()> fPtshape->GetXmin()){
2366 Double_t y = fPtshape->Eval(esdtrack->Pt())/fPtshape->Eval(fHighPthreshold);
2367 if(gRandom->Rndm(0)<1./y){
2371 }//end if p function
2375 if(!aodtrack->GetDetPid()){// prevent memory leak when calling SetAODPID twice for the same track
2376 detpid = new AliAODPid();
2377 SetDetectorRawSignals(detpid,esdtrack);
2378 aodtrack->SetDetPID(detpid);
2383 //______________________________________________________________________________
2384 void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtrack *track)
2387 //assignment of the detector signals (AliXXXesdPID inspired)
2390 AliInfo("no ESD track found. .....exiting");
2394 const AliExternalTrackParam *in=track->GetInnerParam();
2396 aodpid->SetTPCmomentum(in->GetP());
2398 aodpid->SetTPCmomentum(-1.);
2402 aodpid->SetITSsignal(track->GetITSsignal());
2403 Double_t itsdedx[4]; // dE/dx samples for individual ITS layers
2404 track->GetITSdEdxSamples(itsdedx);
2405 aodpid->SetITSdEdxSamples(itsdedx);
2407 aodpid->SetTPCsignal(track->GetTPCsignal());
2408 aodpid->SetTPCsignalN(track->GetTPCsignalN());
2409 if(track->GetTPCdEdxInfo()) aodpid->SetTPCdEdxInfo(track->GetTPCdEdxInfo());
2412 Int_t nslices = track->GetNumberOfTRDslices()*6;
2413 TArrayD trdslices(nslices);
2414 for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) {
2415 for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);
2419 for(Int_t iPl=0;iPl<6;iPl++){
2420 Double_t trdmom=track->GetTRDmomentum(iPl);
2421 aodpid->SetTRDmomentum(iPl,trdmom);
2424 aodpid->SetTRDslices(track->GetNumberOfTRDslices()*6,trdslices.GetArray());
2425 aodpid->SetTRDsignal(track->GetTRDsignal());
2427 //TRD clusters and tracklets
2428 aodpid->SetTRDncls(track->GetTRDncls());
2429 aodpid->SetTRDntrackletsPID(track->GetTRDntrackletsPID());
2431 aodpid->SetTRDChi2(track->GetTRDchi2());
2434 Double_t times[AliPID::kSPECIES]; track->GetIntegratedTimes(times);
2435 aodpid->SetIntegratedTimes(times);
2437 // Float_t tzeroTrack = fESDpid->GetTOFResponse().GetStartTime(track->P());
2438 // aodpid->SetTOFsignal(track->GetTOFsignal()-tzeroTrack);
2439 aodpid->SetTOFsignal(track->GetTOFsignal());
2442 for (Int_t iMass=0; iMass<5; iMass++){
2443 // tofRes[iMass]=(Double_t)fESDpid->GetTOFResponse().GetExpectedSigma(track->P(), times[iMass], AliPID::ParticleMass(iMass));
2444 tofRes[iMass]=0; //backward compatibility
2446 aodpid->SetTOFpidResolution(tofRes);
2448 // aodpid->SetHMPIDsignal(0); // set to zero for compression but it will be removed later
2452 Double_t AliAnalysisTaskESDfilter::Chi2perNDF(AliESDtrack* track)
2454 // Calculate chi2 per ndf for track
2455 Int_t nClustersTPC = track->GetTPCNcls();
2457 if ( nClustersTPC > 5) {
2458 return (track->GetTPCchi2()/Float_t(nClustersTPC - 5));
2465 //______________________________________________________________________________
2466 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
2468 // Terminate analysis
2470 if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");
2473 //______________________________________________________________________________
2474 void AliAnalysisTaskESDfilter::PrintMCInfo(AliStack *pStack,Int_t label){
2477 label = TMath::Abs(label);
2478 TParticle *part = pStack->Particle(label);
2479 Printf("########################");
2480 Printf("%s:%d %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,label,part->GetUniqueID(),part->GetPdgCode(),part->P());
2482 TParticle* mother = part;
2483 Int_t imo = part->GetFirstMother();
2484 Int_t nprim = pStack->GetNprimary();
2485 // while((imo >= nprim) && (mother->GetUniqueID() == 4)) {
2486 while((imo >= nprim)) {
2487 mother = pStack->Particle(imo);
2488 Printf("Mother %s:%d Label %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,imo,mother->GetUniqueID(),mother->GetPdgCode(),mother->P());
2490 imo = mother->GetFirstMother();
2492 Printf("########################");
2495 //______________________________________________________