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 **************************************************************************/
18 #include <Riostream.h>
23 #include <TParameter.h>
25 #include <TParticle.h>
29 #include "AliAnalysisTaskESDfilter.h"
30 #include "AliAnalysisManager.h"
31 #include "AliESDEvent.h"
32 #include "AliESDRun.h"
34 #include "AliAODEvent.h"
35 #include "AliMCEvent.h"
36 #include "AliMCEventHandler.h"
37 #include "AliESDInputHandler.h"
38 #include "AliAODHandler.h"
39 #include "AliAODMCParticle.h"
40 #include "AliAnalysisFilter.h"
41 #include "AliESDMuonTrack.h"
42 #include "AliESDVertex.h"
43 #include "AliCentrality.h"
44 #include "AliEventplane.h"
46 #include "AliESDkink.h"
47 #include "AliESDcascade.h"
48 #include "AliESDPmdTrack.h"
49 #include "AliESDCaloCluster.h"
50 #include "AliESDCaloCells.h"
51 #include "AliMultiplicity.h"
53 #include "AliCodeTimer.h"
54 #include "AliESDtrackCuts.h"
55 #include "AliESDpid.h"
56 #include "AliAODHMPIDrings.h"
57 #include "AliV0vertexer.h"
58 #include "AliCascadeVertexer.h"
59 #include "AliExternalTrackParam.h"
60 #include "AliTrackerBase.h"
61 #include "AliTPCdEdxInfo.h"
63 #include "AliESDTrdTrack.h"
64 #include "AliESDTrdTracklet.h"
65 #include "AliAODTrdTrack.h"
66 #include "AliAODTrdTracklet.h"
67 #include "AliEMCALRecoUtils.h"
68 #include "AliESDUtils.h"
72 ClassImp(AliAnalysisTaskESDfilter)
74 ////////////////////////////////////////////////////////////////////////
76 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
84 fEnableFillAOD(kTRUE),
94 fNumberOfPositiveTracks(0),
99 fOldESDformat(kFALSE),
101 fTPCConstrainedFilterMask(0),
102 fHybridFilterMaskTPCCG(0),
103 fWriteHybridTPCCOnly(kFALSE),
104 fGlobalConstrainedFilterMask(0),
105 fHybridFilterMaskGCG(0),
106 fWriteHybridGCOnly(kFALSE),
107 fIsVZEROEnabled(kTRUE),
108 fIsTZEROEnabled(kTRUE),
109 fIsZDCEnabled(kTRUE),
110 fIsHMPIDEnabled(kTRUE),
111 fIsV0CascadeRecoEnabled(kFALSE),
112 fAreCascadesEnabled(kTRUE),
113 fAreV0sEnabled(kTRUE),
114 fAreKinksEnabled(kTRUE),
115 fAreTracksEnabled(kTRUE),
116 fArePmdClustersEnabled(kTRUE),
117 fAreCaloClustersEnabled(kTRUE),
118 fAreEMCALCellsEnabled(kTRUE),
119 fArePHOSCellsEnabled(kTRUE),
120 fAreEMCALTriggerEnabled(kTRUE),
121 fArePHOSTriggerEnabled(kTRUE),
122 fAreTrackletsEnabled(kTRUE),
123 fIsTRDEnabled(kTRUE),
126 fTPCaloneTrackCuts(0),
127 fDoPropagateTrackToEMCal(kTRUE),
128 fEMCalSurfaceDistance(440),
129 fRefitVertexTracks(-1),
130 fRefitVertexTracksNCuts(0),
131 fRefitVertexTracksCuts(0)
133 // Default constructor
134 fV0Cuts[0] = 33. ; // max allowed chi2
135 fV0Cuts[1] = 0.1 ; // min allowed impact parameter for the 1st daughter
136 fV0Cuts[2] = 0.1 ; // min allowed impact parameter for the 2nd daughter
137 fV0Cuts[3] = 1. ; // max allowed DCA between the daughter tracks
138 fV0Cuts[4] = .998; // min allowed cosine of V0's pointing angle
139 fV0Cuts[5] = 0.9 ; // min radius of the fiducial volume
140 fV0Cuts[6] = 100. ; // max radius of the fiducial volume
142 fCascadeCuts[0] = 33. ; // max allowed chi2 (same as PDC07)
143 fCascadeCuts[1] = 0.05 ; // min allowed V0 impact parameter
144 fCascadeCuts[2] = 0.008; // "window" around the Lambda mass
145 fCascadeCuts[3] = 0.03 ; // min allowed bachelor's impact parameter
146 fCascadeCuts[4] = 0.3 ; // max allowed DCA between the V0 and the bachelor
147 fCascadeCuts[5] = 0.999; // min allowed cosine of the cascade pointing angle
148 fCascadeCuts[6] = 0.9 ; // min radius of the fiducial volume
149 fCascadeCuts[7] = 100. ; // max radius of the fiducial volume
152 //______________________________________________________________________________
153 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
154 AliAnalysisTaskSE(name),
161 fEnableFillAOD(kTRUE),
171 fNumberOfPositiveTracks(0),
173 fNumberOfVertices(0),
174 fNumberOfCascades(0),
176 fOldESDformat(kFALSE),
178 fTPCConstrainedFilterMask(0),
179 fHybridFilterMaskTPCCG(0),
180 fWriteHybridTPCCOnly(kFALSE),
181 fGlobalConstrainedFilterMask(0),
182 fHybridFilterMaskGCG(0),
183 fWriteHybridGCOnly(kFALSE),
184 fIsVZEROEnabled(kTRUE),
185 fIsTZEROEnabled(kTRUE),
186 fIsZDCEnabled(kTRUE),
187 fIsHMPIDEnabled(kTRUE),
188 fIsV0CascadeRecoEnabled(kFALSE),
189 fAreCascadesEnabled(kTRUE),
190 fAreV0sEnabled(kTRUE),
191 fAreKinksEnabled(kTRUE),
192 fAreTracksEnabled(kTRUE),
193 fArePmdClustersEnabled(kTRUE),
194 fAreCaloClustersEnabled(kTRUE),
195 fAreEMCALCellsEnabled(kTRUE),
196 fArePHOSCellsEnabled(kTRUE),
197 fAreEMCALTriggerEnabled(kTRUE),
198 fArePHOSTriggerEnabled(kTRUE),
199 fAreTrackletsEnabled(kTRUE),
200 fIsTRDEnabled(kTRUE),
203 fTPCaloneTrackCuts(0),
204 fDoPropagateTrackToEMCal(kTRUE),
205 fEMCalSurfaceDistance(440),
206 fRefitVertexTracks(-1),
207 fRefitVertexTracksNCuts(0),
208 fRefitVertexTracksCuts(0)
212 fV0Cuts[0] = 33. ; // max allowed chi2
213 fV0Cuts[1] = 0.1 ; // min allowed impact parameter for the 1st daughter
214 fV0Cuts[2] = 0.1 ; // min allowed impact parameter for the 2nd daughter
215 fV0Cuts[3] = 1. ; // max allowed DCA between the daughter tracks
216 fV0Cuts[4] = .998; // min allowed cosine of V0's pointing angle
217 fV0Cuts[5] = 0.9 ; // min radius of the fiducial volume
218 fV0Cuts[6] = 100. ; // max radius of the fiducial volume
220 fCascadeCuts[0] = 33. ; // max allowed chi2 (same as PDC07)
221 fCascadeCuts[1] = 0.05 ; // min allowed V0 impact parameter
222 fCascadeCuts[2] = 0.008; // "window" around the Lambda mass
223 fCascadeCuts[3] = 0.03 ; // min allowed bachelor's impact parameter
224 fCascadeCuts[4] = 0.3 ; // max allowed DCA between the V0 and the bachelor
225 fCascadeCuts[5] = 0.999; // min allowed cosine of the cascade pointing angle
226 fCascadeCuts[6] = 0.9 ; // min radius of the fiducial volume
227 fCascadeCuts[7] = 100. ; // max radius of the fiducial volume
230 AliAnalysisTaskESDfilter::~AliAnalysisTaskESDfilter()
232 if(fIsPidOwner) delete fESDpid;
233 delete[] fRefitVertexTracksCuts;
236 //______________________________________________________________________________
237 void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
240 // Create Output Objects conenct filter to outputtree
244 OutputTree()->GetUserInfo()->Add(fTrackFilter);
248 AliError("No OutputTree() for adding the track filter");
250 fTPCaloneTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
253 //______________________________________________________________________________
254 void AliAnalysisTaskESDfilter::Init()
257 if (fDebug > 1) AliInfo("Init() \n");
260 //______________________________________________________________________________
261 Bool_t AliAnalysisTaskESDfilter::Notify()
264 AddMetadataToUserInfo();
268 //______________________________________________________________________________
269 Bool_t AliAnalysisTaskESDfilter::AddMetadataToUserInfo()
271 // Copy metadata to AOD user info.
272 static Bool_t copyFirst = kFALSE;
274 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
276 AliError("AliAnalysisTaskESDfilter::AddMetadataToUserInfo() : No analysis manager !");
279 TTree *esdTree = mgr->GetTree()->GetTree();
280 if (!esdTree) return kFALSE;
281 TNamed *alirootVersion = (TNamed*)esdTree->GetUserInfo()->FindObject("alirootVersion");
282 if (!alirootVersion) return kFALSE;
283 AliAODHandler *aodHandler = dynamic_cast<AliAODHandler*>(mgr->GetOutputEventHandler());
284 if (!aodHandler) return kFALSE;
285 TTree *aodTree = aodHandler->GetTree();
286 if (!aodTree) return kFALSE;
287 aodTree->GetUserInfo()->Add(new TNamed(*alirootVersion));
293 //______________________________________________________________________________
294 void AliAnalysisTaskESDfilter::PrintTask(Option_t *option, Int_t indent) const
296 // Print selection task information
299 AliAnalysisTaskSE::PrintTask(option,indent);
301 TString spaces(' ',indent+3);
303 cout << spaces.Data() << Form("Cascades are %s",fAreCascadesEnabled ? "ENABLED":"DISABLED") << endl;
304 cout << spaces.Data() << Form("V0s are %s",fAreV0sEnabled ? "ENABLED":"DISABLED") << endl;
305 cout << spaces.Data() << Form("Kinks are %s",fAreKinksEnabled ? "ENABLED":"DISABLED") << endl;
306 cout << spaces.Data() << Form("Tracks are %s",fAreTracksEnabled ? "ENABLED":"DISABLED") << endl;
307 cout << spaces.Data() << Form("PmdClusters are %s",fArePmdClustersEnabled ? "ENABLED":"DISABLED") << endl;
308 cout << spaces.Data() << Form("CaloClusters are %s",fAreCaloClustersEnabled ? "ENABLED":"DISABLED") << endl;
309 cout << spaces.Data() << Form("EMCAL cells are %s",fAreEMCALCellsEnabled ? "ENABLED":"DISABLED") << endl;
310 cout << spaces.Data() << Form("EMCAL triggers are %s",fAreEMCALTriggerEnabled ? "ENABLED":"DISABLED") << endl;
311 cout << spaces.Data() << Form("PHOS triggers are %s",fArePHOSTriggerEnabled ? "ENABLED":"DISABLED") << endl;
312 cout << spaces.Data() << Form("Tracklets are %s",fAreTrackletsEnabled ? "ENABLED":"DISABLED") << endl;
313 cout << spaces.Data() << Form("PropagateTrackToEMCal is %s", fDoPropagateTrackToEMCal ? "ENABLED":"DISABLED") << endl;
314 if (fRefitVertexTracks<0) cout << spaces.Data() << Form("RefitVerteTracks is DISABLED") << endl;
315 else cout << spaces.Data() << Form("RefitVerteTracks is ENABLED to %d",fRefitVertexTracks) << endl;
318 //______________________________________________________________________________
319 void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
321 // Execute analysis for current event
323 Long64_t ientry = Entry();
325 printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
326 if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
327 if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
329 // Filters must explicitely enable AOD filling in their UserExec (AG)
330 if (!AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler())
331 AliFatal("Cannot run ESD filter without an output event handler");
333 AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
334 AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillExtension(kTRUE);
339 //______________________________________________________________________________
340 TClonesArray& AliAnalysisTaskESDfilter::Cascades()
342 return *(AODEvent()->GetCascades());
345 //______________________________________________________________________________
346 TClonesArray& AliAnalysisTaskESDfilter::Tracks()
348 return *(AODEvent()->GetTracks());
351 //______________________________________________________________________________
352 TClonesArray& AliAnalysisTaskESDfilter::V0s()
354 return *(AODEvent()->GetV0s());
357 //______________________________________________________________________________
358 TClonesArray& AliAnalysisTaskESDfilter::Vertices()
360 return *(AODEvent()->GetVertices());
363 //______________________________________________________________________________
364 AliAODHeader* AliAnalysisTaskESDfilter::ConvertHeader(const AliESDEvent& esd)
366 // Convert header information
368 AliCodeTimerAuto("",0);
370 AliAODHeader* header = AODEvent()->GetHeader();
372 header->SetRunNumber(esd.GetRunNumber());
373 header->SetOfflineTrigger(fInputHandler->IsEventSelected()); // propagate the decision of the physics selection
374 header->SetNumberOfESDTracks(esd.GetNumberOfTracks());
376 TTree* tree = fInputHandler->GetTree();
378 TFile* file = tree->GetCurrentFile();
379 if (file) header->SetESDFileName(file->GetName());
383 header->SetBunchCrossNumber(0);
384 header->SetOrbitNumber(0);
385 header->SetPeriodNumber(0);
386 header->SetEventType(0);
387 header->SetMuonMagFieldScale(-999.);
388 header->SetCentrality(0);
389 header->SetEventplane(0);
391 header->SetBunchCrossNumber(esd.GetBunchCrossNumber());
392 header->SetOrbitNumber(esd.GetOrbitNumber());
393 header->SetPeriodNumber(esd.GetPeriodNumber());
394 header->SetEventType(esd.GetEventType());
396 header->SetEventNumberESDFile(esd.GetHeader()->GetEventNumberInFile());
397 if(const_cast<AliESDEvent&>(esd).GetCentrality()){
398 header->SetCentrality(const_cast<AliESDEvent&>(esd).GetCentrality());
401 header->SetCentrality(0);
403 if(const_cast<AliESDEvent&>(esd).GetEventplane()){
404 header->SetEventplane(const_cast<AliESDEvent&>(esd).GetEventplane());
407 header->SetEventplane(0);
412 header->SetFiredTriggerClasses(esd.GetFiredTriggerClasses());
413 header->SetTriggerMask(esd.GetTriggerMask());
414 header->SetTriggerCluster(esd.GetTriggerCluster());
415 header->SetL0TriggerInputs(esd.GetHeader()->GetL0TriggerInputs());
416 header->SetL1TriggerInputs(esd.GetHeader()->GetL1TriggerInputs());
417 header->SetL2TriggerInputs(esd.GetHeader()->GetL2TriggerInputs());
419 header->SetMagneticField(esd.GetMagneticField());
420 header->SetMuonMagFieldScale(esd.GetCurrentDip()/6000.);
421 header->SetZDCN1Energy(esd.GetZDCN1Energy());
422 header->SetZDCP1Energy(esd.GetZDCP1Energy());
423 header->SetZDCN2Energy(esd.GetZDCN2Energy());
424 header->SetZDCP2Energy(esd.GetZDCP2Energy());
425 header->SetZDCEMEnergy(esd.GetZDCEMEnergy(0),esd.GetZDCEMEnergy(1));
427 header->SetIRInt2InteractionMap(esd.GetHeader()->GetIRInt2InteractionMap());
428 header->SetIRInt1InteractionMap(esd.GetHeader()->GetIRInt1InteractionMap());
430 // ITS Cluster Multiplicty
431 const AliMultiplicity *mult = esd.GetMultiplicity();
432 for (Int_t ilay = 0; ilay < 6; ilay++) header->SetITSClusters(ilay, mult->GetNumberOfITSClusters(ilay));
434 // TPC only Reference Multiplicty
435 Int_t refMult = fTPCaloneTrackCuts ? (Short_t)fTPCaloneTrackCuts->GetReferenceMultiplicity(&esd, kTRUE) : -1;
436 header->SetTPConlyRefMultiplicity(refMult);
438 AliESDtrackCuts::MultEstTrackType estType = esd.GetPrimaryVertexTracks()->GetStatus() ? AliESDtrackCuts::kTrackletsITSTPC : AliESDtrackCuts::kTracklets;
439 header->SetRefMultiplicityComb05(AliESDtrackCuts::GetReferenceMultiplicity(&esd,estType,0.5));
440 header->SetRefMultiplicityComb08(AliESDtrackCuts::GetReferenceMultiplicity(&esd,estType,0.8));
442 Float_t diamxy[2]={(Float_t)esd.GetDiamondX(),(Float_t)esd.GetDiamondY()};
444 esd.GetDiamondCovXY(diamcov);
445 header->SetDiamond(diamxy,diamcov);
446 header->SetDiamondZ(esd.GetDiamondZ(),esd.GetSigma2DiamondZ());
448 // VZERO channel equalization factors for event-plane reconstruction
449 header->SetVZEROEqFactors(esd.GetVZEROEqFactors());
451 // T0 Resolution information
452 const AliESDRun* esdRun = esd.GetESDRun();
453 for (Int_t i=0;i<AliESDRun::kT0spreadSize;i++) header->SetT0spread(i,esdRun->GetT0spread(i));
458 //______________________________________________________________________________
459 void AliAnalysisTaskESDfilter::ConvertCascades(const AliESDEvent& esd)
461 // Convert the cascades part of the ESD.
462 // Return the number of cascades
464 AliCodeTimerAuto("",0);
466 // Create vertices starting from the most complex objects
469 const AliESDVertex* vtx = esd.GetPrimaryVertex();
470 Double_t pos[3] = { 0. };
471 Double_t covVtx[6] = { 0. };
472 Double_t momBach[3]={0.};
473 Double_t covTr[21]={0.};
474 // Double_t pid[10]={0.};
475 AliAODPid* detpid(0x0);
476 AliAODVertex* vV0FromCascade(0x0);
477 AliAODv0* aodV0(0x0);
478 AliAODcascade* aodCascade(0x0);
479 AliAODTrack* aodTrack(0x0);
480 Double_t momPos[3]={0.};
481 Double_t momNeg[3] = { 0. };
482 Double_t momPosAtV0vtx[3]={0.};
483 Double_t momNegAtV0vtx[3]={0.};
484 Int_t tofLabel[3] = {0};
485 TClonesArray& verticesArray = Vertices();
486 TClonesArray& tracksArray = Tracks();
487 TClonesArray& cascadesArray = Cascades();
489 // Cascades (Modified by A.Maire - February 2009)
490 for (Int_t nCascade = 0; nCascade < esd.GetNumberOfCascades(); ++nCascade) {
494 AliESDcascade *esdCascade = esd.GetCascade(nCascade);
495 Int_t idxPosFromV0Dghter = esdCascade->GetPindex();
496 Int_t idxNegFromV0Dghter = esdCascade->GetNindex();
497 Int_t idxBachFromCascade = esdCascade->GetBindex();
499 AliESDtrack *esdCascadePos = esd.GetTrack( idxPosFromV0Dghter);
500 AliESDtrack *esdCascadeNeg = esd.GetTrack( idxNegFromV0Dghter);
501 AliESDtrack *esdCascadeBach = esd.GetTrack( idxBachFromCascade);
503 // Identification of the V0 within the esdCascade (via both daughter track indices)
504 AliESDv0 * currentV0 = 0x0;
505 Int_t idxV0FromCascade = -1;
507 for (Int_t iV0=0; iV0<esd.GetNumberOfV0s(); ++iV0) {
509 currentV0 = esd.GetV0(iV0);
510 Int_t posCurrentV0 = currentV0->GetPindex();
511 Int_t negCurrentV0 = currentV0->GetNindex();
513 if (posCurrentV0==idxPosFromV0Dghter && negCurrentV0==idxNegFromV0Dghter) {
514 idxV0FromCascade = iV0;
519 if(idxV0FromCascade < 0){
520 printf("Cascade - no matching for the V0 (index V0 = -1) ! Skip ... \n");
522 }// a priori, useless check, but safer ... in case of pb with tracks "out of bounds"
524 AliESDv0 *esdV0FromCascade = esd.GetV0(idxV0FromCascade);
526 // 1 - Cascade selection
528 // AliESDVertex *esdPrimVtx = new AliESDVertex(*(esd.GetPrimaryVertex()));
529 // TList cascadeObjects;
530 // cascadeObjects.AddAt(esdV0FromCascade, 0);
531 // cascadeObjects.AddAt(esdCascadePos, 1);
532 // cascadeObjects.AddAt(esdCascadeNeg, 2);
533 // cascadeObjects.AddAt(esdCascade, 3);
534 // cascadeObjects.AddAt(esdCascadeBach, 4);
535 // cascadeObjects.AddAt(esdPrimVtx, 5);
537 // UInt_t selectCascade = 0;
538 // if (fCascadeFilter) {
539 // // selectCascade = fCascadeFilter->IsSelected(&cascadeObjects);
540 // // FIXME AliESDCascadeCuts to be implemented ...
542 // // Here we may encounter a moot point at the V0 level
543 // // between the cascade selections and the V0 ones :
544 // // the V0 selected along with the cascade (secondary V0) may
545 // // usually be removed from the dedicated V0 selections (prim V0) ...
546 // // -> To be discussed !
548 // // this is a little awkward but otherwise the
549 // // list wants to access the pointer (delete it)
550 // // again when going out of scope
551 // delete cascadeObjects.RemoveAt(5); // esdPrimVtx created via copy construct
553 // if (!selectCascade)
557 // delete cascadeObjects.RemoveAt(5); // esdPrimVtx created via copy construct
561 // 2 - Add the cascade vertex
563 esdCascade->GetXYZcascade(pos[0], pos[1], pos[2]);
564 esdCascade->GetPosCovXi(covVtx);
565 chi2 = esdCascade->GetChi2Xi();
567 AliAODVertex *vCascade = new(verticesArray[fNumberOfVertices++]) AliAODVertex(pos,
569 chi2, // FIXME = Chi2/NDF will be needed
572 AliAODVertex::kCascade);
573 fPrimaryVertex->AddDaughter(vCascade);
575 // 3 - Add the bachelor track from the cascade
577 if (!fUsedTrack[idxBachFromCascade]) {
579 esdCascadeBach->GetPxPyPz(momBach);
580 esdCascadeBach->GetXYZ(pos);
581 esdCascadeBach->GetCovarianceXYZPxPyPz(covTr);
582 // esdCascadeBach->GetESDpid(pid);
583 esdCascadeBach->GetTOFLabel(tofLabel);
585 fUsedTrack[idxBachFromCascade] = kTRUE;
586 UInt_t selectInfo = 0;
587 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeBach);
588 if (fMChandler) fMChandler->SelectParticle(esdCascadeBach->GetLabel());
589 aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack(esdCascadeBach->GetID(),
590 esdCascadeBach->GetLabel(),
594 kFALSE, // Why kFALSE for "isDCA" ? FIXME
596 (Short_t)esdCascadeBach->GetSign(),
597 esdCascadeBach->GetITSClusterMap(),
600 kTRUE, // usedForVtxFit = kFALSE ? FIXME
601 vtx->UsesTrack(esdCascadeBach->GetID()),
602 AliAODTrack::kSecondary,
604 aodTrack->SetPIDForTracking(esdCascadeBach->GetPIDForTracking());
605 aodTrack->SetTPCFitMap(esdCascadeBach->GetTPCFitMap());
606 aodTrack->SetTPCClusterMap(esdCascadeBach->GetTPCClusterMap());
607 aodTrack->SetTPCSharedMap (esdCascadeBach->GetTPCSharedMap());
608 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeBach));
609 aodTrack->SetTPCPointsF(esdCascadeBach->GetTPCNclsF());
610 aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadeBach->GetTPCCrossedRows()));
611 aodTrack->SetIntegratedLength(esdCascadeBach->GetIntegratedLength());
612 aodTrack->SetTOFLabel(tofLabel);
613 CopyCaloProps(esdCascadeBach,aodTrack);
614 fAODTrackRefs->AddAt(aodTrack,idxBachFromCascade);
616 if (esdCascadeBach->GetSign() > 0) ++fNumberOfPositiveTracks;
617 aodTrack->ConvertAliPIDtoAODPID();
618 aodTrack->SetFlags(esdCascadeBach->GetStatus());
619 SetAODPID(esdCascadeBach,aodTrack,detpid);
622 aodTrack = static_cast<AliAODTrack*>( fAODTrackRefs->At(idxBachFromCascade) );
625 vCascade->AddDaughter(aodTrack);
627 // 4 - Add the V0 from the cascade.
628 // = V0vtx + both pos and neg daughter tracks + the aodV0 itself
631 if ( !fUsedV0[idxV0FromCascade] ) {
632 // 4.A - if VO structure hasn't been created yet
634 // 4.A.1 - Create the V0 vertex of the cascade
635 esdV0FromCascade->GetXYZ(pos[0], pos[1], pos[2]);
636 esdV0FromCascade->GetPosCov(covVtx);
637 chi2 = esdV0FromCascade->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3 ?
639 vV0FromCascade = new(verticesArray[fNumberOfVertices++]) AliAODVertex(pos,
643 idxV0FromCascade, //id of ESDv0
646 // one V0 can be used by several cascades.
647 // So, one AOD V0 vtx can have several parent vtx.
648 // This is not directly allowed by AliAODvertex.
649 // Setting the parent vtx (here = param "vCascade") doesn't lead to a crash
650 // but to a problem of consistency within AODEvent.
651 // -> See below paragraph 4.B, for the proposed treatment of such a case.
653 // Add the vV0FromCascade to the aodVOVtxRefs
654 fAODV0VtxRefs->AddAt(vV0FromCascade,idxV0FromCascade);
656 // 4.A.2 - Add the positive tracks from the V0
658 esdCascadePos->GetPxPyPz(momPos);
659 esdCascadePos->GetXYZ(pos);
660 esdCascadePos->GetCovarianceXYZPxPyPz(covTr);
661 // esdCascadePos->GetESDpid(pid);
662 esdCascadePos->GetTOFLabel(tofLabel);
664 if (!fUsedTrack[idxPosFromV0Dghter]) {
665 fUsedTrack[idxPosFromV0Dghter] = kTRUE;
667 UInt_t selectInfo = 0;
668 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadePos);
669 if(fMChandler) fMChandler->SelectParticle(esdCascadePos->GetLabel());
670 aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack(esdCascadePos->GetID(),
671 esdCascadePos->GetLabel(),
675 kFALSE, // Why kFALSE for "isDCA" ? FIXME
677 (Short_t)esdCascadePos->GetSign(),
678 esdCascadePos->GetITSClusterMap(),
681 kTRUE, // usedForVtxFit = kFALSE ? FIXME
682 vtx->UsesTrack(esdCascadePos->GetID()),
683 AliAODTrack::kSecondary,
685 aodTrack->SetPIDForTracking(esdCascadePos->GetPIDForTracking());
686 aodTrack->SetTPCFitMap(esdCascadePos->GetTPCFitMap());
687 aodTrack->SetTPCClusterMap(esdCascadePos->GetTPCClusterMap());
688 aodTrack->SetTPCSharedMap (esdCascadePos->GetTPCSharedMap());
689 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadePos));
690 aodTrack->SetTPCPointsF(esdCascadePos->GetTPCNclsF());
691 aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadePos->GetTPCCrossedRows()));
692 aodTrack->SetIntegratedLength(esdCascadePos->GetIntegratedLength());
693 aodTrack->SetTOFLabel(tofLabel);
694 CopyCaloProps(esdCascadePos,aodTrack);
695 fAODTrackRefs->AddAt(aodTrack,idxPosFromV0Dghter);
697 if (esdCascadePos->GetSign() > 0) ++fNumberOfPositiveTracks;
698 aodTrack->ConvertAliPIDtoAODPID();
699 aodTrack->SetFlags(esdCascadePos->GetStatus());
700 SetAODPID(esdCascadePos,aodTrack,detpid);
703 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxPosFromV0Dghter));
705 vV0FromCascade->AddDaughter(aodTrack);
707 // 4.A.3 - Add the negative tracks from the V0
709 esdCascadeNeg->GetPxPyPz(momNeg);
710 esdCascadeNeg->GetXYZ(pos);
711 esdCascadeNeg->GetCovarianceXYZPxPyPz(covTr);
712 // esdCascadeNeg->GetESDpid(pid);
713 esdCascadeNeg->GetTOFLabel(tofLabel);
715 if (!fUsedTrack[idxNegFromV0Dghter]) {
716 fUsedTrack[idxNegFromV0Dghter] = kTRUE;
718 UInt_t selectInfo = 0;
719 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeNeg);
721 fMChandler->SelectParticle(esdCascadeNeg->GetLabel());
722 aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack(esdCascadeNeg->GetID(),
723 esdCascadeNeg->GetLabel(),
727 kFALSE, // Why kFALSE for "isDCA" ? FIXME
729 (Short_t)esdCascadeNeg->GetSign(),
730 esdCascadeNeg->GetITSClusterMap(),
733 kTRUE, // usedForVtxFit = kFALSE ? FIXME
734 vtx->UsesTrack(esdCascadeNeg->GetID()),
735 AliAODTrack::kSecondary,
737 aodTrack->SetPIDForTracking(esdCascadeNeg->GetPIDForTracking());
738 aodTrack->SetTPCFitMap(esdCascadeNeg->GetTPCFitMap());
739 aodTrack->SetTPCClusterMap(esdCascadeNeg->GetTPCClusterMap());
740 aodTrack->SetTPCSharedMap (esdCascadeNeg->GetTPCSharedMap());
741 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeNeg));
742 aodTrack->SetTPCPointsF(esdCascadeNeg->GetTPCNclsF());
743 aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadeNeg->GetTPCCrossedRows()));
744 aodTrack->SetIntegratedLength(esdCascadeNeg->GetIntegratedLength());
745 aodTrack->SetTOFLabel(tofLabel);
746 CopyCaloProps(esdCascadeNeg,aodTrack);
747 fAODTrackRefs->AddAt(aodTrack,idxNegFromV0Dghter);
749 if (esdCascadeNeg->GetSign() > 0) ++fNumberOfPositiveTracks;
750 aodTrack->ConvertAliPIDtoAODPID();
751 aodTrack->SetFlags(esdCascadeNeg->GetStatus());
752 SetAODPID(esdCascadeNeg,aodTrack,detpid);
755 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxNegFromV0Dghter));
758 vV0FromCascade->AddDaughter(aodTrack);
760 // 4.A.4 - Add the V0 from cascade to the V0 array
762 Double_t dcaV0Daughters = esdV0FromCascade->GetDcaV0Daughters();
763 Double_t dcaV0ToPrimVertex = esdV0FromCascade->GetD(esd.GetPrimaryVertex()->GetX(),
764 esd.GetPrimaryVertex()->GetY(),
765 esd.GetPrimaryVertex()->GetZ() );
766 esdV0FromCascade->GetPPxPyPz( momPosAtV0vtx[0],momPosAtV0vtx[1],momPosAtV0vtx[2] );
767 esdV0FromCascade->GetNPxPyPz( momNegAtV0vtx[0],momNegAtV0vtx[1],momNegAtV0vtx[2] );
769 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = DCA in (x,y) for Pos and ..[1] = Neg
770 dcaDaughterToPrimVertex[0] = TMath::Abs(esdCascadePos->GetD(esd.GetPrimaryVertex()->GetX(),
771 esd.GetPrimaryVertex()->GetY(),
772 esd.GetMagneticField()) );
773 dcaDaughterToPrimVertex[1] = TMath::Abs(esdCascadeNeg->GetD(esd.GetPrimaryVertex()->GetX(),
774 esd.GetPrimaryVertex()->GetY(),
775 esd.GetMagneticField()) );
777 aodV0 = new(V0s()[fNumberOfV0s++]) AliAODv0(vV0FromCascade,
782 dcaDaughterToPrimVertex);
783 // set the aod v0 on-the-fly status
784 aodV0->SetOnFlyStatus(esdV0FromCascade->GetOnFlyStatus());
786 // Add the aodV0 to the aodVORefs
787 fAODV0Refs->AddAt(aodV0,idxV0FromCascade);
789 fUsedV0[idxV0FromCascade] = kTRUE;
792 // 4.B - if V0 structure already used
795 // one V0 can be used by several cascades (frequent in PbPb evts) :
796 // same V0 which used but attached to different bachelor tracks
797 // -> aodVORefs and fAODV0VtxRefs are needed.
798 // Goal : avoid a redundancy of the info in "Vertices" and "v0s" clones array.
800 vV0FromCascade = static_cast<AliAODVertex*>(fAODV0VtxRefs->At(idxV0FromCascade));
801 aodV0 = static_cast<AliAODv0*> (fAODV0Refs ->At(idxV0FromCascade));
803 // - Treatment of the parent for such a "re-used" V0 :
804 // Insert the cascade that reuses the V0 vertex in the lineage chain
805 // Before : vV0 -> vCascade1 -> vPrimary
806 // - Hyp : cascade2 uses the same V0 as cascade1
807 // After : vV0 -> vCascade2 -> vCascade1 -> vPrimary
809 AliAODVertex *vCascadePreviousParent = static_cast<AliAODVertex*> (vV0FromCascade->GetParent());
810 vV0FromCascade->SetParent(vCascade);
811 vCascade ->SetParent(vCascadePreviousParent);
813 }// end if V0 structure already used
815 // In any case (used V0 or not), add the V0 vertex to the cascade one.
816 vCascade->AddDaughter(vV0FromCascade);
818 // 5 - Add the primary track of the cascade (if any)
820 // 6 - Add the cascade to the AOD array of cascades
821 Double_t dcaBachToPrimVertexXY = TMath::Abs(esdCascadeBach->GetD(esd.GetPrimaryVertex()->GetX(),
822 esd.GetPrimaryVertex()->GetY(),
823 esd.GetMagneticField()) );
825 Double_t momBachAtCascadeVtx[3]={0.};
827 esdCascade->GetBPxPyPz(momBachAtCascadeVtx[0], momBachAtCascadeVtx[1], momBachAtCascadeVtx[2]);
829 aodCascade = new(cascadesArray[fNumberOfCascades++]) AliAODcascade(vCascade,
830 esdCascade->Charge(),
831 esdCascade->GetDcaXiDaughters(),
833 // DCAXiToPrimVtx -> needs to be calculated ----|
834 // doesn't exist at ESD level;
835 // See AODcascade::DcaXiToPrimVertex(Double, Double, Double)
836 dcaBachToPrimVertexXY,
840 printf("---- Cascade / AOD cascade : \n\n");
841 aodCascade->PrintXi(fPrimaryVertex->GetX(), fPrimaryVertex->GetY(), fPrimaryVertex->GetZ());
844 } // end of the loop on cascades
846 Cascades().Expand(fNumberOfCascades);
849 //______________________________________________________________________________
850 void AliAnalysisTaskESDfilter::ConvertV0s(const AliESDEvent& esd)
852 // Access to the AOD container of V0s
854 AliCodeTimerAuto("",0);
859 Double_t pos[3] = { 0. };
861 Double_t covVtx[6] = { 0. };
862 Double_t momPos[3]={0.};
863 Double_t covTr[21]={0.};
864 // Double_t pid[10]={0.};
865 AliAODTrack* aodTrack(0x0);
866 AliAODPid* detpid(0x0);
867 Double_t momNeg[3]={0.};
868 Double_t momPosAtV0vtx[3]={0.};
869 Double_t momNegAtV0vtx[3]={0.};
870 Int_t tofLabel[3] = {0};
871 for (Int_t nV0 = 0; nV0 < esd.GetNumberOfV0s(); ++nV0) {
872 if (fUsedV0[nV0]) continue; // skip if already added to the AOD
874 AliESDv0 *v0 = esd.GetV0(nV0);
875 Int_t posFromV0 = v0->GetPindex();
876 Int_t negFromV0 = v0->GetNindex();
880 AliESDVertex *esdVtx = new AliESDVertex(*(esd.GetPrimaryVertex()));
881 AliESDtrack *esdV0Pos = esd.GetTrack(posFromV0);
882 AliESDtrack *esdV0Neg = esd.GetTrack(negFromV0);
884 v0objects.AddAt(v0, 0);
885 v0objects.AddAt(esdV0Pos, 1);
886 v0objects.AddAt(esdV0Neg, 2);
887 v0objects.AddAt(esdVtx, 3);
890 selectV0 = fV0Filter->IsSelected(&v0objects);
891 // this is a little awkward but otherwise the
892 // list wants to access the pointer (delete it)
893 // again when going out of scope
894 delete v0objects.RemoveAt(3); // esdVtx created via copy construct
899 delete v0objects.RemoveAt(3); // esdVtx created via copy construct
903 v0->GetXYZ(pos[0], pos[1], pos[2]);
905 if (!fOldESDformat) {
906 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
907 v0->GetPosCov(covVtx);
910 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
915 new(Vertices()[fNumberOfVertices++]) AliAODVertex(pos,
921 fPrimaryVertex->AddDaughter(vV0);
924 // Add the positive tracks from the V0
926 esdV0Pos->GetPxPyPz(momPos);
927 esdV0Pos->GetXYZ(pos);
928 esdV0Pos->GetCovarianceXYZPxPyPz(covTr);
929 // esdV0Pos->GetESDpid(pid);
930 esdV0Pos->GetTOFLabel(tofLabel);
932 const AliESDVertex *vtx = esd.GetPrimaryVertex();
934 if (!fUsedTrack[posFromV0]) {
935 fUsedTrack[posFromV0] = kTRUE;
936 UInt_t selectInfo = 0;
937 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);
938 if(fMChandler)fMChandler->SelectParticle(esdV0Pos->GetLabel());
939 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdV0Pos->GetID(),
940 esdV0Pos->GetLabel(),
946 (Short_t)esdV0Pos->GetSign(),
947 esdV0Pos->GetITSClusterMap(),
950 kTRUE, // check if this is right
951 vtx->UsesTrack(esdV0Pos->GetID()),
952 AliAODTrack::kSecondary,
954 aodTrack->SetPIDForTracking(esdV0Pos->GetPIDForTracking());
955 aodTrack->SetTPCFitMap(esdV0Pos->GetTPCFitMap());
956 aodTrack->SetTPCClusterMap(esdV0Pos->GetTPCClusterMap());
957 aodTrack->SetTPCSharedMap (esdV0Pos->GetTPCSharedMap());
958 aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Pos));
959 aodTrack->SetTPCPointsF(esdV0Pos->GetTPCNclsF());
960 aodTrack->SetTPCNCrossedRows(UShort_t(esdV0Pos->GetTPCCrossedRows()));
961 aodTrack->SetIntegratedLength(esdV0Pos->GetIntegratedLength());
962 aodTrack->SetTOFLabel(tofLabel);
963 CopyCaloProps(esdV0Pos,aodTrack);
964 fAODTrackRefs->AddAt(aodTrack,posFromV0);
965 if (esdV0Pos->GetSign() > 0) ++fNumberOfPositiveTracks;
966 aodTrack->ConvertAliPIDtoAODPID();
967 aodTrack->SetFlags(esdV0Pos->GetStatus());
968 SetAODPID(esdV0Pos,aodTrack,detpid);
970 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(posFromV0));
972 vV0->AddDaughter(aodTrack);
974 // Add the negative tracks from the V0
975 esdV0Neg->GetPxPyPz(momNeg);
976 esdV0Neg->GetXYZ(pos);
977 esdV0Neg->GetCovarianceXYZPxPyPz(covTr);
978 // esdV0Neg->GetESDpid(pid);
979 esdV0Neg->GetTOFLabel(tofLabel);
981 if (!fUsedTrack[negFromV0]) {
982 fUsedTrack[negFromV0] = kTRUE;
983 UInt_t selectInfo = 0;
984 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);
985 if(fMChandler)fMChandler->SelectParticle(esdV0Neg->GetLabel());
986 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdV0Neg->GetID(),
987 esdV0Neg->GetLabel(),
993 (Short_t)esdV0Neg->GetSign(),
994 esdV0Neg->GetITSClusterMap(),
997 kTRUE, // check if this is right
998 vtx->UsesTrack(esdV0Neg->GetID()),
999 AliAODTrack::kSecondary,
1001 aodTrack->SetPIDForTracking(esdV0Neg->GetPIDForTracking());
1002 aodTrack->SetTPCFitMap(esdV0Neg->GetTPCFitMap());
1003 aodTrack->SetTPCClusterMap(esdV0Neg->GetTPCClusterMap());
1004 aodTrack->SetTPCSharedMap (esdV0Neg->GetTPCSharedMap());
1005 aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Neg));
1006 aodTrack->SetTPCPointsF(esdV0Neg->GetTPCNclsF());
1007 aodTrack->SetTPCNCrossedRows(UShort_t(esdV0Neg->GetTPCCrossedRows()));
1008 aodTrack->SetIntegratedLength(esdV0Neg->GetIntegratedLength());
1009 aodTrack->SetTOFLabel(tofLabel);
1010 CopyCaloProps(esdV0Neg,aodTrack);
1011 fAODTrackRefs->AddAt(aodTrack,negFromV0);
1012 if (esdV0Neg->GetSign() > 0) ++fNumberOfPositiveTracks;
1013 aodTrack->ConvertAliPIDtoAODPID();
1014 aodTrack->SetFlags(esdV0Neg->GetStatus());
1015 SetAODPID(esdV0Neg,aodTrack,detpid);
1017 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(negFromV0));
1019 vV0->AddDaughter(aodTrack);
1021 // Add the V0 the V0 array as well
1022 Double_t dcaV0Daughters = v0->GetDcaV0Daughters();
1023 Double_t dcaV0ToPrimVertex = v0->GetD(esd.GetPrimaryVertex()->GetX(),
1024 esd.GetPrimaryVertex()->GetY(),
1025 esd.GetPrimaryVertex()->GetZ());
1027 v0->GetPPxPyPz(momPosAtV0vtx[0],momPosAtV0vtx[1],momPosAtV0vtx[2]);
1028 v0->GetNPxPyPz(momNegAtV0vtx[0],momNegAtV0vtx[1],momNegAtV0vtx[2]);
1030 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = DCA in (x,y) for Pos and ..[1] = Neg
1031 dcaDaughterToPrimVertex[0] = TMath::Abs(esdV0Pos->GetD( esd.GetPrimaryVertex()->GetX(),
1032 esd.GetPrimaryVertex()->GetY(),
1033 esd.GetMagneticField()) );
1034 dcaDaughterToPrimVertex[1] = TMath::Abs(esdV0Neg->GetD( esd.GetPrimaryVertex()->GetX(),
1035 esd.GetPrimaryVertex()->GetY(),
1036 esd.GetMagneticField()) );
1038 AliAODv0* aodV0 = new(V0s()[fNumberOfV0s++]) AliAODv0(vV0,
1043 dcaDaughterToPrimVertex);
1045 // set the aod v0 on-the-fly status
1046 aodV0->SetOnFlyStatus(v0->GetOnFlyStatus());
1047 }//End of loop on V0s
1049 V0s().Expand(fNumberOfV0s);
1052 //______________________________________________________________________________
1053 void AliAnalysisTaskESDfilter::ConvertTPCOnlyTracks(const AliESDEvent& esd)
1055 // Convert TPC only tracks
1056 // Here we have wo hybrid appraoch to remove fakes
1057 // ******* ITSTPC ********
1058 // Uses a cut on the ITS properties to select global tracks
1059 // which are than marked as HybdridITSTPC for the remainder
1060 // the TPC only tracks are flagged as HybridITSTPConly.
1061 // Note, in order not to get fakes back in the TPC cuts, one needs
1062 // two "ITS" cuts one tight (1) (to throw out fakes) and one lose (2) (to NOT flag the trakcs in the TPC only)
1063 // using cut number (3)
1064 // so fHybridFilterMask == (1)|(2) fTPCFilterMask = (3), Usercode needs to slect with mask = (1)|(3) and track->IsHybridITSTPC()
1065 // ******* TPC ********
1066 // 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
1067 // 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
1069 AliCodeTimerAuto("",0);
1071 // Loop over the tracks and extract and mask out all aod tracks that pass the selections for AODt racks
1072 for(int it = 0;it < fNumberOfTracks;++it)
1074 AliAODTrack *tr = (AliAODTrack*)(Tracks().At(it));
1076 UInt_t map = tr->GetFilterMap();
1077 if(map&fTPCConstrainedFilterMask){
1078 // we only reset the track select ionfo, no deletion...
1079 tr->SetFilterMap(map&~fTPCConstrainedFilterMask);
1081 if(map&fHybridFilterMaskTPCCG){
1082 // this is one part of the hybrid tracks
1083 // the others not passing the selection will be TPC only selected below
1084 tr->SetIsHybridTPCConstrainedGlobal(kTRUE);
1088 // Loop over the ESD trcks and pick out the tracks passing TPC only cuts
1089 const AliESDVertex *vtxSPD = esd.GetPrimaryVertexSPD();
1090 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1092 Double_t pos[3] = { 0. };
1093 Double_t covTr[21]={0.};
1094 // Double_t pid[10]={0.};
1095 Double_t p[3] = { 0. };
1096 Double_t pDCA[3] = { 0. }; // momentum at DCA
1097 Double_t rDCA[3] = { 0. }; // position at DCA
1098 Float_t dDCA[2] = {0.}; // DCA to the vertex d and z
1099 Float_t cDCA[3] = {0.}; // covariance of impact parameters
1100 Int_t tofLabel[3] = {0};
1102 AliAODTrack* aodTrack(0x0);
1104 // account for change in pT after the constraint
1105 Float_t ptMax = 1E10;
1107 for(int i = 0;i<32;i++){
1108 if(fTPCConstrainedFilterMask&(1<<i)){
1109 AliESDtrackCuts*cuts = (AliESDtrackCuts*)fTrackFilter->GetCuts()->At(i);
1110 Float_t tmp1= 0,tmp2 = 0;
1111 cuts->GetPtRange(tmp1,tmp2);
1112 if(tmp1>ptMin)ptMin=tmp1;
1113 if(tmp2<ptMax)ptMax=tmp2;
1117 for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack)
1119 AliESDtrack* esdTrack = esd.GetTrack(nTrack); //carefull do not modify it othwise need to work with a copy
1121 UInt_t selectInfo = 0;
1122 Bool_t isHybridITSTPC = false;
1126 selectInfo = fTrackFilter->IsSelected(esdTrack);
1129 if(!(selectInfo&fHybridFilterMaskTPCCG)){
1130 // not already selected tracks, use second part of hybrid tracks
1131 isHybridITSTPC = true;
1132 // too save space one could only store these...
1135 selectInfo &= fTPCConstrainedFilterMask;
1136 if (!selectInfo) continue;
1137 if (fWriteHybridTPCCOnly&&!isHybridITSTPC) continue; // write only complementary tracks
1138 // create a tpc only tracl
1139 AliESDtrack *track = AliESDtrackCuts::GetTPCOnlyTrack(const_cast<AliESDEvent*>(&esd),esdTrack->GetID());
1140 if (!track) continue;
1142 if (track->Pt()>0.) {
1143 // only constrain tracks above threshold
1144 AliExternalTrackParam exParam;
1145 // take the B-field from the ESD, no 3D fieldMap available at this point
1146 Bool_t relate = false;
1147 relate = track->RelateToVertexTPC(vtxSPD,esd.GetMagneticField(),kVeryBig,&exParam);
1152 // fetch the track parameters at the DCA (unconstraint)
1153 if(track->GetTPCInnerParam()){
1154 track->GetTPCInnerParam()->GetPxPyPz(pDCA);
1155 track->GetTPCInnerParam()->GetXYZ(rDCA);
1157 // get the DCA to the vertex:
1158 track->GetImpactParametersTPC(dDCA,cDCA);
1159 // set the constrained parameters to the track
1160 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
1163 track->GetPxPyPz(p);
1165 Float_t pT = track->Pt();
1166 if(pT<ptMin||pT>ptMax){
1172 track->GetCovarianceXYZPxPyPz(covTr);
1173 // esdTrack->GetESDpid(pid);// original PID
1174 esdTrack->GetTOFLabel(tofLabel);
1175 if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
1176 fUsedTrackCopy[nTrack] |= selectInfo;
1177 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack((track->GetID()+1)*-1,
1184 (Short_t)track->GetSign(),
1185 track->GetITSClusterMap(),
1188 kTRUE, // check if this is right
1189 vtx->UsesTrack(track->GetID()),
1190 AliAODTrack::kPrimary,
1192 aodTrack->SetPIDForTracking(track->GetPIDForTracking());
1193 aodTrack->SetIsHybridTPCConstrainedGlobal(isHybridITSTPC);
1194 aodTrack->SetTPCFitMap(track->GetTPCFitMap());
1195 aodTrack->SetTPCClusterMap(track->GetTPCClusterMap());
1196 aodTrack->SetTPCSharedMap (track->GetTPCSharedMap());
1197 aodTrack->SetIsTPCConstrained(kTRUE);
1198 aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack)); // original track
1199 // set the DCA values to the AOD track
1200 aodTrack->SetPxPyPzAtDCA(pDCA[0],pDCA[1],pDCA[2]);
1201 aodTrack->SetXYAtDCA(rDCA[0],rDCA[1]);
1202 aodTrack->SetDCA(dDCA[0],dDCA[1]);
1203 aodTrack->SetFlags(track->GetStatus());
1204 aodTrack->SetTPCPointsF(track->GetTPCNclsF());
1205 aodTrack->SetTPCNCrossedRows(UShort_t(track->GetTPCCrossedRows()));
1206 aodTrack->SetIntegratedLength(track->GetIntegratedLength());
1207 aodTrack->SetTOFLabel(tofLabel);
1208 CopyCaloProps(track,aodTrack);
1209 // do not duplicate PID information
1210 // aodTrack->ConvertAliPIDtoAODPID();
1211 // SetAODPID(esdTrack,aodTrack,detpid);
1213 } // end of loop on tracks
1216 //______________________________________________________________________________
1217 void AliAnalysisTaskESDfilter::ConvertGlobalConstrainedTracks(const AliESDEvent& esd)
1219 // Here we have the option to store the complement from global constraint information
1220 // to tracks passing tight cuts (1) in order not to get fakes back in, one needs
1221 // two sets of cuts one tight (1) (to throw out fakes) and one lose (2) (fakes/bad tracks would pass (2) but not (1))
1222 // using cut number (3) selects the tracks that complement (1) e.g. tracks witout ITS refit or cluster requirement
1224 AliCodeTimerAuto("",0);
1226 // Loop over the tracks and extract and mask out all aod tracks that pass the selections for AODt racks
1227 for(int it = 0;it < fNumberOfTracks;++it)
1229 AliAODTrack *tr = (AliAODTrack*)(Tracks().At(it));
1231 UInt_t map = tr->GetFilterMap();
1232 if(map&fGlobalConstrainedFilterMask){
1233 // we only reset the track select info, no deletion...
1234 // mask reset mask in case track is already taken
1235 tr->SetFilterMap(map&~fGlobalConstrainedFilterMask);
1237 if(map&fHybridFilterMaskGCG){
1238 // this is one part of the hybrid tracks
1239 // the others not passing the selection will be the ones selected below
1240 tr->SetIsHybridGlobalConstrainedGlobal(kTRUE);
1243 // Loop over the ESD trcks and pick out the tracks passing the GlobalConstraint cuts
1245 Double_t pos[3] = { 0. };
1246 Double_t covTr[21]={0.};
1247 // Double_t pid[10]={0.};
1248 Double_t p[3] = { 0. };
1250 Double_t pDCA[3] = { 0. }; // momentum at DCA
1251 Double_t rDCA[3] = { 0. }; // position at DCA
1252 Float_t dDCA[2] = {0.}; // DCA to the vertex d and z
1253 Float_t cDCA[3] = {0.}; // covariance of impact parameters
1254 Int_t tofLabel[3] = {0};
1256 AliAODTrack* aodTrack(0x0);
1257 AliAODPid* detpid(0x0);
1258 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1260 // account for change in pT after the constraint
1261 Float_t ptMax = 1E10;
1263 for(int i = 0;i<32;i++){
1264 if(fGlobalConstrainedFilterMask&(1<<i)){
1265 AliESDtrackCuts*cuts = (AliESDtrackCuts*)fTrackFilter->GetCuts()->At(i);
1266 Float_t tmp1= 0,tmp2 = 0;
1267 cuts->GetPtRange(tmp1,tmp2);
1268 if(tmp1>ptMin)ptMin=tmp1;
1269 if(tmp2<ptMax)ptMax=tmp2;
1273 for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack)
1275 AliESDtrack* esdTrack = esd.GetTrack(nTrack); //carefull do not modify it othwise need to work with a copy
1276 const AliExternalTrackParam * exParamGC = esdTrack->GetConstrainedParam();
1277 if(!exParamGC)continue;
1279 UInt_t selectInfo = 0;
1280 Bool_t isHybridGC = false;
1285 selectInfo = fTrackFilter->IsSelected(esdTrack);
1288 if (!(selectInfo&fHybridFilterMaskGCG)) isHybridGC = true;
1289 if (fWriteHybridGCOnly&&!isHybridGC) continue; // write only complementary tracks
1291 selectInfo &= fGlobalConstrainedFilterMask;
1292 if (!selectInfo) continue;
1293 // fetch the track parameters at the DCA (unconstrained)
1294 esdTrack->GetPxPyPz(pDCA);
1295 esdTrack->GetXYZ(rDCA);
1296 // get the DCA to the vertex:
1297 esdTrack->GetImpactParameters(dDCA,cDCA);
1298 if (!esdTrack->GetConstrainedPxPyPz(p)) continue;
1300 Float_t pT = exParamGC->Pt();
1301 if(pT<ptMin||pT>ptMax){
1305 esdTrack->GetConstrainedXYZ(pos);
1306 exParamGC->GetCovarianceXYZPxPyPz(covTr);
1307 // esdTrack->GetESDpid(pid);
1308 esdTrack->GetTOFLabel(tofLabel);
1309 if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
1310 fUsedTrackCopy[nTrack] |= selectInfo;
1311 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack((esdTrack->GetID()+1)*-1,
1312 esdTrack->GetLabel(),
1318 (Short_t)esdTrack->GetSign(),
1319 esdTrack->GetITSClusterMap(),
1322 kTRUE, // check if this is right
1323 vtx->UsesTrack(esdTrack->GetID()),
1324 AliAODTrack::kPrimary,
1326 aodTrack->SetPIDForTracking(esdTrack->GetPIDForTracking());
1327 aodTrack->SetIsHybridGlobalConstrainedGlobal(isHybridGC);
1328 aodTrack->SetIsGlobalConstrained(kTRUE);
1329 aodTrack->SetTPCFitMap(esdTrack->GetTPCFitMap());
1330 aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());
1331 aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());
1332 aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));
1334 // set the DCA values to the AOD track
1335 aodTrack->SetPxPyPzAtDCA(pDCA[0],pDCA[1],pDCA[2]);
1336 aodTrack->SetXYAtDCA(rDCA[0],rDCA[1]);
1337 aodTrack->SetDCA(dDCA[0],dDCA[1]);
1338 aodTrack->SetFlags(esdTrack->GetStatus());
1339 aodTrack->SetTPCPointsF(esdTrack->GetTPCNclsF());
1340 aodTrack->SetTPCNCrossedRows(UShort_t(esdTrack->GetTPCCrossedRows()));
1341 aodTrack->SetIntegratedLength(esdTrack->GetIntegratedLength());
1342 aodTrack->SetTOFLabel(tofLabel);
1343 CopyCaloProps(esdTrack,aodTrack);
1345 // only copy AOD information for hybrid, no duplicate information
1346 aodTrack->ConvertAliPIDtoAODPID();
1347 SetAODPID(esdTrack,aodTrack,detpid);
1349 } // end of loop on tracks
1352 //______________________________________________________________________________
1353 void AliAnalysisTaskESDfilter::ConvertTracks(const AliESDEvent& esd)
1355 // Tracks (primary and orphan)
1357 AliCodeTimerAuto("",0);
1359 AliDebug(1,Form("NUMBER OF ESD TRACKS %5d\n", esd.GetNumberOfTracks()));
1361 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1362 Double_t p[3] = { 0. };
1363 Double_t pos[3] = { 0. };
1364 Double_t covTr[21] = { 0. };
1365 // Double_t pid[10] = { 0. };
1366 Int_t tofLabel[3] = {0};
1367 AliAODTrack* aodTrack(0x0);
1368 AliAODPid* detpid(0x0);
1370 for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack)
1372 if (fUsedTrack[nTrack]) continue;
1374 AliESDtrack *esdTrack = esd.GetTrack(nTrack);
1375 UInt_t selectInfo = 0;
1379 selectInfo = fTrackFilter->IsSelected(esdTrack);
1380 if (!selectInfo && !vtx->UsesTrack(esdTrack->GetID())) continue;
1383 esdTrack->GetPxPyPz(p);
1384 esdTrack->GetXYZ(pos);
1385 esdTrack->GetCovarianceXYZPxPyPz(covTr);
1386 // esdTrack->GetESDpid(pid);
1387 esdTrack->GetTOFLabel(tofLabel);
1388 if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
1389 fUsedTrack[nTrack] = kTRUE;
1390 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrack->GetID(),
1391 esdTrack->GetLabel(),
1397 (Short_t)esdTrack->GetSign(),
1398 esdTrack->GetITSClusterMap(),
1401 kTRUE, // check if this is right
1402 vtx->UsesTrack(esdTrack->GetID()),
1403 AliAODTrack::kPrimary,
1405 fPrimaryVertex->AddDaughter(aodTrack);
1406 aodTrack->SetPIDForTracking(esdTrack->GetPIDForTracking());
1407 aodTrack->SetTPCFitMap(esdTrack->GetTPCFitMap());
1408 aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());
1409 aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());
1410 aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));
1411 aodTrack->SetTPCPointsF(esdTrack->GetTPCNclsF());
1412 aodTrack->SetTPCNCrossedRows(UShort_t(esdTrack->GetTPCCrossedRows()));
1413 aodTrack->SetIntegratedLength(esdTrack->GetIntegratedLength());
1414 aodTrack->SetTOFLabel(tofLabel);
1415 CopyCaloProps(esdTrack,aodTrack);
1416 fAODTrackRefs->AddAt(aodTrack, nTrack);
1417 if (esdTrack->GetSign() > 0) ++fNumberOfPositiveTracks;
1418 aodTrack->SetFlags(esdTrack->GetStatus());
1419 aodTrack->ConvertAliPIDtoAODPID();
1420 SetAODPID(esdTrack,aodTrack,detpid);
1421 } // end of loop on tracks
1424 //______________________________________________________________________________
1425 void AliAnalysisTaskESDfilter::ConvertPmdClusters(const AliESDEvent& esd)
1427 // Convert PMD Clusters
1428 AliCodeTimerAuto("",0);
1429 Int_t jPmdClusters=0;
1430 // Access to the AOD container of PMD clusters
1431 TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
1432 for (Int_t iPmd = 0; iPmd < esd.GetNumberOfPmdTracks(); ++iPmd) {
1433 // file pmd clusters, to be revised!
1434 AliESDPmdTrack *pmdTrack = esd.GetPmdTrack(iPmd);
1437 Double_t posPmd[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ()};
1438 Double_t pidPmd[13] = { 0.}; // to be revised!
1440 // assoc cluster not set
1441 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), posPmd, pidPmd);
1445 //______________________________________________________________________________
1446 void AliAnalysisTaskESDfilter::ConvertCaloClusters(const AliESDEvent& esd)
1448 // Convert Calorimeter Clusters
1449 AliCodeTimerAuto("",0);
1451 // Access to the AOD container of clusters
1452 TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
1455 for (Int_t iClust=0; iClust<esd.GetNumberOfCaloClusters(); ++iClust) {
1456 AliESDCaloCluster * cluster = esd.GetCaloCluster(iClust);
1458 Int_t id = cluster->GetID();
1459 Int_t nLabel = cluster->GetNLabels();
1460 Int_t *labels = cluster->GetLabels();
1462 for(int i = 0;i < nLabel;++i) {
1463 if(fMChandler)fMChandler->SelectParticle(labels[i]);
1467 Float_t energy = cluster->E();
1468 Float_t posF[3] = { 0.};
1469 cluster->GetPosition(posF);
1471 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
1477 cluster->GetType(),0);
1479 caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
1480 cluster->GetDispersion(),
1481 cluster->GetM20(), cluster->GetM02(),
1482 cluster->GetEmcCpvDistance(),
1483 cluster->GetNExMax(),cluster->GetTOF()) ;
1484 caloCluster->SetPIDFromESD(cluster->GetPID());
1485 caloCluster->SetNCells(cluster->GetNCells());
1486 caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
1487 caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
1488 caloCluster->SetTrackDistance(cluster->GetTrackDx(), cluster->GetTrackDz());
1490 Int_t nMatchCount = 0;
1491 TArrayI* matchedT = cluster->GetTracksMatched();
1492 if (fNumberOfTracks>0 && matchedT && cluster->GetTrackMatchedIndex() >= 0) {
1493 for (Int_t im = 0; im < matchedT->GetSize(); im++) {
1494 Int_t iESDtrack = matchedT->At(im);;
1495 if (fAODTrackRefs->At(iESDtrack) != 0) {
1496 caloCluster->AddTrackMatched((AliAODTrack*)fAODTrackRefs->At(iESDtrack));
1502 caloCluster->SetTrackDistance(-999,-999);
1505 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
1508 //______________________________________________________________________________
1509 void AliAnalysisTaskESDfilter::ConvertCaloTrigger(TString calo, const AliESDEvent& esd)
1511 AliCodeTimerAuto("",0);
1513 if (calo == "PHOS") {
1514 AliAODCaloTrigger &aodTrigger = *(AODEvent()->GetCaloTrigger(calo));
1515 AliESDCaloTrigger &esdTrigger = *(esd.GetCaloTrigger(calo));
1517 aodTrigger.Allocate(esdTrigger.GetEntries());
1522 while (esdTrigger.Next()) {
1523 esdTrigger.GetPosition(tmod,tabsId);
1524 esdTrigger.GetAmplitude(a);
1525 aodTrigger.Add(tmod,tabsId,a,0.,(Int_t*)NULL,0,0,0);
1530 AliAODHandler *aodHandler = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
1532 TTree *aodTree = aodHandler->GetTree();
1534 Int_t *type = esd.GetCaloTriggerType();
1535 for (Int_t i = 0; i < 15; i++) {
1536 aodTree->GetUserInfo()->Add(new TParameter<int>(Form("EMCALCaloTrigger%d",i), type[i]));
1541 AliAODCaloTrigger &aodTrigger = *(AODEvent()->GetCaloTrigger(calo));
1542 AliESDCaloTrigger &esdTrigger = *(esd.GetCaloTrigger(calo));
1543 aodTrigger.Allocate(esdTrigger.GetEntries());
1546 while (esdTrigger.Next()) {
1547 Int_t px, py, ts, nTimes, times[10], b;
1549 esdTrigger.GetPosition(px, py);
1550 esdTrigger.GetAmplitude(a);
1551 esdTrigger.GetTime(t);
1552 esdTrigger.GetL0Times(times);
1553 esdTrigger.GetNL0Times(nTimes);
1554 esdTrigger.GetL1TimeSum(ts);
1555 esdTrigger.GetTriggerBits(b);
1556 aodTrigger.Add(px, py, a, t, times, nTimes, ts, b);
1559 for (int i = 0; i < 4; i++) aodTrigger.SetL1Threshold(i, esdTrigger.GetL1Threshold(i));
1561 esdTrigger.GetL1V0(0),
1562 esdTrigger.GetL1V0(1)
1564 aodTrigger.SetL1V0(v0);
1565 aodTrigger.SetL1FrameMask(esdTrigger.GetL1FrameMask());
1568 //______________________________________________________________________________
1569 void AliAnalysisTaskESDfilter::ConvertEMCALCells(const AliESDEvent& esd)
1571 // Convert EMCAL Cells
1572 AliCodeTimerAuto("",0);
1574 // fill EMCAL cell info
1575 if (esd.GetEMCALCells()) { // protection against missing ESD information
1576 AliESDCaloCells &esdEMcells = *(esd.GetEMCALCells());
1577 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
1578 AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
1579 aodEMcells.CreateContainer(nEMcell);
1580 aodEMcells.SetType(AliAODCaloCells::kEMCALCell);
1581 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
1582 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell),
1583 esdEMcells.GetTime(iCell), esdEMcells.GetMCLabel(iCell), esdEMcells.GetEFraction(iCell),
1584 esdEMcells.GetHighGain(iCell) );
1590 //______________________________________________________________________________
1591 void AliAnalysisTaskESDfilter::ConvertPHOSCells(const AliESDEvent& esd)
1593 // Convert PHOS Cells
1594 AliCodeTimerAuto("",0);
1596 // fill PHOS cell info
1597 if (esd.GetPHOSCells()) { // protection against missing ESD information
1598 AliESDCaloCells &esdPHcells = *(esd.GetPHOSCells());
1599 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
1601 AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
1602 aodPHcells.CreateContainer(nPHcell);
1603 aodPHcells.SetType(AliAODCaloCells::kPHOSCell);
1604 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
1605 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell),
1606 esdPHcells.GetTime(iCell), esdPHcells.GetMCLabel(iCell), esdPHcells.GetEFraction(iCell),
1607 esdPHcells.GetHighGain(iCell) );
1613 //______________________________________________________________________________
1614 void AliAnalysisTaskESDfilter::ConvertTracklets(const AliESDEvent& esd)
1617 AliCodeTimerAuto("",0);
1619 AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
1620 const AliMultiplicity *mult = esd.GetMultiplicity();
1622 if (mult->GetNumberOfTracklets()>0) {
1623 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
1624 SPDTracklets.SetScaleDThetaBySin2T(mult->GetScaleDThetaBySin2T());
1625 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
1627 fMChandler->SelectParticle(mult->GetLabel(n, 0));
1628 fMChandler->SelectParticle(mult->GetLabel(n, 1));
1630 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0),mult->GetLabel(n, 1));
1634 //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
1638 //______________________________________________________________________________
1639 void AliAnalysisTaskESDfilter::ConvertKinks(const AliESDEvent& esd)
1641 AliCodeTimerAuto("",0);
1643 // Kinks: it is a big mess the access to the information in the kinks
1644 // The loop is on the tracks in order to find the mother and daugther of each kink
1646 Double_t covTr[21]={0.};
1647 // Double_t pid[10]={0.};
1648 AliAODPid* detpid(0x0);
1649 Int_t tofLabel[3] = {0};
1651 fNumberOfKinks = esd.GetNumberOfKinks();
1653 const AliESDVertex* vtx = esd.GetPrimaryVertex();
1655 for (Int_t iTrack=0; iTrack<esd.GetNumberOfTracks(); ++iTrack)
1657 AliESDtrack * esdTrack = esd.GetTrack(iTrack);
1659 Int_t ikink = esdTrack->GetKinkIndex(0);
1661 if (ikink && fNumberOfKinks) {
1662 // Negative kink index: mother, positive: daughter
1663 // Search for the second track of the kink
1665 for (Int_t jTrack = iTrack+1; jTrack<esd.GetNumberOfTracks(); ++jTrack) {
1666 AliESDtrack * esdTrack1 = esd.GetTrack(jTrack);
1667 Int_t jkink = esdTrack1->GetKinkIndex(0);
1669 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
1670 // The two tracks are from the same kink
1671 if (fUsedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
1674 Int_t idaughter = -1;
1676 if (ikink<0 && jkink>0) {
1679 } else if (ikink>0 && jkink<0) {
1683 //cerr << "Error: Wrong combination of kink indexes: "
1684 // << ikink << " " << jkink << endl;
1688 // Add the mother track if it passed primary track selection cuts
1689 AliAODTrack * mother = NULL;
1691 UInt_t selectInfo = 0;
1693 selectInfo = fTrackFilter->IsSelected(esd.GetTrack(imother));
1694 if (!selectInfo) continue;
1697 if (!fUsedTrack[imother]) {
1698 fUsedTrack[imother] = kTRUE;
1699 AliESDtrack *esdTrackM = esd.GetTrack(imother);
1700 Double_t p[3] = { 0. };
1701 Double_t pos[3] = { 0. };
1702 esdTrackM->GetPxPyPz(p);
1703 esdTrackM->GetXYZ(pos);
1704 esdTrackM->GetCovarianceXYZPxPyPz(covTr);
1705 // esdTrackM->GetESDpid(pid);
1706 esdTrackM->GetTOFLabel(tofLabel);
1707 if(fMChandler)fMChandler->SelectParticle(esdTrackM->GetLabel());
1708 mother = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrackM->GetID(),
1709 esdTrackM->GetLabel(),
1715 (Short_t)esdTrackM->GetSign(),
1716 esdTrackM->GetITSClusterMap(),
1719 kTRUE, // check if this is right
1720 vtx->UsesTrack(esdTrack->GetID()),
1721 AliAODTrack::kPrimary,
1723 mother->SetPIDForTracking(esdTrackM->GetPIDForTracking());
1724 mother->SetTPCFitMap(esdTrackM->GetTPCFitMap());
1725 mother->SetTPCClusterMap(esdTrackM->GetTPCClusterMap());
1726 mother->SetTPCSharedMap (esdTrackM->GetTPCSharedMap());
1727 mother->SetChi2perNDF(Chi2perNDF(esdTrackM));
1728 mother->SetTPCPointsF(esdTrackM->GetTPCNclsF());
1729 mother->SetTPCNCrossedRows(UShort_t(esdTrackM->GetTPCCrossedRows()));
1730 mother->SetIntegratedLength(esdTrackM->GetIntegratedLength());
1731 mother->SetTOFLabel(tofLabel);
1732 CopyCaloProps(esdTrackM,mother);
1733 fAODTrackRefs->AddAt(mother, imother);
1734 if (esdTrackM->GetSign() > 0) ++fNumberOfPositiveTracks;
1735 mother->SetFlags(esdTrackM->GetStatus());
1736 mother->ConvertAliPIDtoAODPID();
1737 fPrimaryVertex->AddDaughter(mother);
1738 mother->ConvertAliPIDtoAODPID();
1739 SetAODPID(esdTrackM,mother,detpid);
1742 //cerr << "Error: event " << esd.GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
1743 // << " track " << imother << " has already been used!" << endl;
1746 // Add the kink vertex
1747 AliESDkink * kink = esd.GetKink(TMath::Abs(ikink)-1);
1749 AliAODVertex * vkink = new(Vertices()[fNumberOfVertices++]) AliAODVertex(kink->GetPosition(),
1753 esdTrack->GetID(), // ID of mother's track!
1754 AliAODVertex::kKink);
1755 // Add the daughter track
1756 AliAODTrack * daughter = NULL;
1757 if (!fUsedTrack[idaughter]) {
1758 fUsedTrack[idaughter] = kTRUE;
1759 AliESDtrack *esdTrackD = esd.GetTrack(idaughter);
1760 Double_t p[3] = { 0. };
1761 Double_t pos[3] = { 0. };
1762 esdTrackD->GetPxPyPz(p);
1763 esdTrackD->GetXYZ(pos);
1764 esdTrackD->GetCovarianceXYZPxPyPz(covTr);
1765 // esdTrackD->GetESDpid(pid);
1766 esdTrackD->GetTOFLabel(tofLabel);
1768 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);
1769 if(fMChandler)fMChandler->SelectParticle(esdTrackD->GetLabel());
1770 daughter = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrackD->GetID(),
1771 esdTrackD->GetLabel(),
1777 (Short_t)esdTrackD->GetSign(),
1778 esdTrackD->GetITSClusterMap(),
1781 kTRUE, // check if this is right
1782 vtx->UsesTrack(esdTrack->GetID()),
1783 AliAODTrack::kSecondary,
1785 daughter->SetPIDForTracking(esdTrackD->GetPIDForTracking());
1786 daughter->SetTPCFitMap(esdTrackD->GetTPCFitMap());
1787 daughter->SetTPCClusterMap(esdTrackD->GetTPCClusterMap());
1788 daughter->SetTPCSharedMap (esdTrackD->GetTPCSharedMap());
1789 daughter->SetTPCPointsF(esdTrackD->GetTPCNclsF());
1790 daughter->SetTPCNCrossedRows(UShort_t(esdTrackD->GetTPCCrossedRows()));
1791 daughter->SetIntegratedLength(esdTrackD->GetIntegratedLength());
1792 daughter->SetTOFLabel(tofLabel);
1793 CopyCaloProps(esdTrackD,daughter);
1794 fAODTrackRefs->AddAt(daughter, idaughter);
1795 if (esdTrackD->GetSign() > 0) ++fNumberOfPositiveTracks;
1796 daughter->SetFlags(esdTrackD->GetStatus());
1797 daughter->ConvertAliPIDtoAODPID();
1798 vkink->AddDaughter(daughter);
1799 daughter->ConvertAliPIDtoAODPID();
1800 SetAODPID(esdTrackD,daughter,detpid);
1802 //cerr << "Error: event " << esd.GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
1803 // << " track " << idaughter << " has already been used!" << endl;
1811 //______________________________________________________________________________
1812 void AliAnalysisTaskESDfilter::ConvertPrimaryVertices(const AliESDEvent& esd)
1814 AliCodeTimerAuto("",0);
1816 // Access to the AOD container of vertices
1817 fNumberOfVertices = 0;
1819 Double_t pos[3] = { 0. };
1820 Double_t covVtx[6] = { 0. };
1822 // Add primary vertex. The primary tracks will be defined
1823 // after the loops on the composite objects (V0, cascades, kinks)
1824 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1826 vtx->GetXYZ(pos); // position
1827 vtx->GetCovMatrix(covVtx); //covariance matrix
1829 fPrimaryVertex = new(Vertices()[fNumberOfVertices++])
1830 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
1831 fPrimaryVertex->SetName(vtx->GetName());
1832 fPrimaryVertex->SetTitle(vtx->GetTitle());
1833 fPrimaryVertex->SetBC(vtx->GetBC());
1835 TString vtitle = vtx->GetTitle();
1836 if (!vtitle.Contains("VertexerTracks"))
1837 fPrimaryVertex->SetNContributors(vtx->GetNContributors());
1839 if (fDebug > 0) fPrimaryVertex->Print();
1841 // Add SPD "main" vertex
1842 const AliESDVertex *vtxS = esd.GetPrimaryVertexSPD();
1843 vtxS->GetXYZ(pos); // position
1844 vtxS->GetCovMatrix(covVtx); //covariance matrix
1845 AliAODVertex * mVSPD = new(Vertices()[fNumberOfVertices++])
1846 AliAODVertex(pos, covVtx, vtxS->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainSPD);
1847 mVSPD->SetName(vtxS->GetName());
1848 mVSPD->SetTitle(vtxS->GetTitle());
1849 mVSPD->SetNContributors(vtxS->GetNContributors());
1851 // Add SPD pileup vertices
1852 for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesSPD(); ++iV) {
1853 const AliESDVertex *vtxP = esd.GetPileupVertexSPD(iV);
1854 vtxP->GetXYZ(pos); // position
1855 vtxP->GetCovMatrix(covVtx); //covariance matrix
1856 AliAODVertex * pVSPD = new(Vertices()[fNumberOfVertices++])
1857 AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupSPD);
1858 pVSPD->SetName(vtxP->GetName());
1859 pVSPD->SetTitle(vtxP->GetTitle());
1860 pVSPD->SetNContributors(vtxP->GetNContributors());
1861 pVSPD->SetBC(vtxP->GetBC());
1864 // Add TRK pileup vertices
1865 for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesTracks(); ++iV) {
1866 const AliESDVertex *vtxP = esd.GetPileupVertexTracks(iV);
1867 vtxP->GetXYZ(pos); // position
1868 vtxP->GetCovMatrix(covVtx); //covariance matrix
1869 AliAODVertex * pVTRK = new(Vertices()[fNumberOfVertices++])
1870 AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupTracks);
1871 pVTRK->SetName(vtxP->GetName());
1872 pVTRK->SetTitle(vtxP->GetTitle());
1873 pVTRK->SetNContributors(vtxP->GetNContributors());
1874 pVTRK->SetBC(vtxP->GetBC());
1877 // Add TPC "main" vertex
1878 const AliESDVertex *vtxT = esd.GetPrimaryVertexTPC();
1879 vtxT->GetXYZ(pos); // position
1880 vtxT->GetCovMatrix(covVtx); //covariance matrix
1881 AliAODVertex * mVTPC = new(Vertices()[fNumberOfVertices++])
1882 AliAODVertex(pos, covVtx, vtxT->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainTPC);
1883 mVTPC->SetName(vtxT->GetName());
1884 mVTPC->SetTitle(vtxT->GetTitle());
1885 mVTPC->SetNContributors(vtxT->GetNContributors());
1888 //______________________________________________________________________________
1889 void AliAnalysisTaskESDfilter::ConvertVZERO(const AliESDEvent& esd)
1891 // Convert VZERO data
1892 AliAODVZERO* vzeroData = AODEvent()->GetVZEROData();
1893 *vzeroData = *(esd.GetVZEROData());
1896 //______________________________________________________________________________
1897 void AliAnalysisTaskESDfilter::ConvertTZERO(const AliESDEvent& esd)
1899 // Convert TZERO data
1900 const AliESDTZERO* esdTzero = esd.GetESDTZERO();
1901 AliAODTZERO* aodTzero = AODEvent()->GetTZEROData();
1903 for (Int_t icase=0; icase<3; icase++){
1904 aodTzero->SetT0TOF( icase, esdTzero->GetT0TOF(icase));
1905 aodTzero->SetT0TOFbest(icase, esdTzero->GetT0TOFbest(icase));
1907 aodTzero->SetBackgroundFlag(esdTzero->GetBackgroundFlag());
1908 aodTzero->SetPileupFlag(esdTzero->GetPileupFlag());
1909 aodTzero->SetSatelliteFlag(esdTzero->GetSatellite());
1911 Float_t rawTime[24];
1912 for(Int_t ipmt=0; ipmt<24; ipmt++)
1913 rawTime[ipmt] = esdTzero->GetTimeFull(ipmt,0);
1915 Int_t idxOfFirstPmtA = -1, idxOfFirstPmtC = -1;
1916 Float_t timeOfFirstPmtA = 9999, timeOfFirstPmtC = 9999;
1917 for(int ipmt=0; ipmt<12; ipmt++){
1918 if( rawTime[ipmt] > -2 && rawTime[ipmt] < timeOfFirstPmtC && rawTime[ipmt]!=0){
1919 timeOfFirstPmtC = rawTime[ipmt];
1920 idxOfFirstPmtC = ipmt;
1923 for(int ipmt=12; ipmt<24; ipmt++){
1924 if( rawTime[ipmt] > -2 && rawTime[ipmt] < timeOfFirstPmtA && rawTime[ipmt]!=0 ){
1925 timeOfFirstPmtA = rawTime[ipmt];
1926 idxOfFirstPmtA = ipmt;
1930 if(idxOfFirstPmtA != -1 && idxOfFirstPmtC != -1){
1931 //speed of light in cm/ns TMath::C()*1e-7
1932 Float_t vertexraw = TMath::C()*1e-7 * (rawTime[idxOfFirstPmtA] - rawTime[idxOfFirstPmtC])/2;
1933 aodTzero->SetT0VertexRaw( vertexraw );
1935 aodTzero->SetT0VertexRaw(99999);
1938 aodTzero->SetT0zVertex(esdTzero->GetT0zVertex());
1941 const Double32_t *amp=esdTzero->GetT0amplitude();
1942 for(int ipmt=0; ipmt<24; ipmt++)
1943 aodTzero->SetAmp(ipmt, amp[ipmt]);
1944 aodTzero->SetAmp(24,esdTzero->GetMultC() );
1945 aodTzero->SetAmp(25,esdTzero->GetMultA() );
1948 //______________________________________________________________________________
1949 void AliAnalysisTaskESDfilter::ConvertZDC(const AliESDEvent& esd)
1952 AliESDZDC* esdZDC = esd.GetZDCData();
1954 const Double_t zem1Energy = esdZDC->GetZEM1Energy();
1955 const Double_t zem2Energy = esdZDC->GetZEM2Energy();
1957 const Double_t *towZNC = esdZDC->GetZNCTowerEnergy();
1958 const Double_t *towZPC = esdZDC->GetZPCTowerEnergy();
1959 const Double_t *towZNA = esdZDC->GetZNATowerEnergy();
1960 const Double_t *towZPA = esdZDC->GetZPATowerEnergy();
1961 const Double_t *towZNCLG = esdZDC->GetZNCTowerEnergyLR();
1962 const Double_t *towZNALG = esdZDC->GetZNATowerEnergyLR();
1964 AliAODZDC* zdcAOD = AODEvent()->GetZDCData();
1966 zdcAOD->SetZEM1Energy(zem1Energy);
1967 zdcAOD->SetZEM2Energy(zem2Energy);
1968 zdcAOD->SetZNCTowers(towZNC, towZNCLG);
1969 zdcAOD->SetZNATowers(towZNA, towZNALG);
1970 zdcAOD->SetZPCTowers(towZPC);
1971 zdcAOD->SetZPATowers(towZPA);
1973 zdcAOD->SetZDCParticipants(esdZDC->GetZDCParticipants(), esdZDC->GetZDCPartSideA(), esdZDC->GetZDCPartSideC());
1974 zdcAOD->SetZDCImpactParameter(esdZDC->GetImpactParameter(), esdZDC->GetImpactParamSideA(), esdZDC->GetImpactParamSideC());
1975 zdcAOD->SetZDCTDCSum(esdZDC->GetZNTDCSum(0));
1976 zdcAOD->SetZDCTDCDiff(esdZDC->GetZNTDCDiff(0));
1977 if(esdZDC->IsZNChit()) zdcAOD->SetZNCTDC(esdZDC->GetZDCTDCCorrected(10,0));
1978 if(esdZDC->IsZNAhit()) zdcAOD->SetZNATDC(esdZDC->GetZDCTDCCorrected(12,0));
1981 //_____________________________________________________________________________
1982 Int_t AliAnalysisTaskESDfilter::ConvertHMPID(const AliESDEvent& esd) // clm
1985 // Convtert ESD HMPID info to AOD and return the number of good tracks with HMPID signal.
1986 // We need to return an int since there is no signal counter in the ESD.
1989 AliCodeTimerAuto("",0);
1991 Int_t cntHmpidGoodTracks = 0;
2000 Float_t thetaTrk = 0;
2003 Double_t hmpPid[5]={0};
2004 Double_t hmpMom[3]={0};
2006 TClonesArray &hmpidRings = *(AODEvent()->GetHMPIDrings());
2008 for (Int_t iTrack=0; iTrack<esd.GetNumberOfTracks(); ++iTrack) {
2009 if(! esd.GetTrack(iTrack) ) continue;
2011 if(esd.GetTrack(iTrack)->GetHMPIDsignal() > -20 ) { //
2012 (esd.GetTrack(iTrack))->GetHMPIDmip(xMip, yMip, qMip, nphMip); // Get MIP properties
2013 (esd.GetTrack(iTrack))->GetHMPIDtrk(xTrk,yTrk,thetaTrk,phiTrk);
2014 (esd.GetTrack(iTrack))->GetHMPIDpid(hmpPid);
2015 if((esd.GetTrack(iTrack))->GetOuterHmpParam()) (esd.GetTrack(iTrack))->GetOuterHmpPxPyPz(hmpMom);
2017 if(esd.GetTrack(iTrack)->GetHMPIDsignal() == 0 && thetaTrk == 0 && qMip == 0 && nphMip ==0 ) continue; //
2019 new(hmpidRings[cntHmpidGoodTracks++]) AliAODHMPIDrings((esd.GetTrack(iTrack))->GetID(), // Unique track id to attach the ring to
2020 1000000*nphMip+qMip, // MIP charge and number of photons
2021 (esd.GetTrack(iTrack))->GetHMPIDcluIdx(), // 1000000*chamber id + cluster idx of assigned MIP cluster
2022 thetaTrk, // track inclination angle theta
2023 phiTrk, // track inclination angle phi
2024 (esd.GetTrack(iTrack))->GetHMPIDsignal(), // Cherenkov angle
2025 (esd.GetTrack(iTrack))->GetHMPIDoccupancy(), // Occupancy claculated for the given chamber
2026 (esd.GetTrack(iTrack))->GetHMPIDchi2(), // Ring resolution squared
2027 xTrk, // Track x coordinate (LORS)
2028 yTrk, // Track y coordinate (LORS)
2029 xMip, // MIP x coordinate (LORS)
2030 yMip, // MIP y coordinate (LORS)
2031 hmpPid, // PID probablities from ESD, remove once it is CombinedPid
2032 hmpMom // Track momentum in HMPID at ring reconstruction
2037 return cntHmpidGoodTracks;
2040 void AliAnalysisTaskESDfilter::ConvertTRD(const AliESDEvent& esd)
2042 // fill TRD on-line tracks with assiocated tracklets
2043 // as used for the TRD level-1 triggers
2045 const Int_t nTrdTracks = esd.GetNumberOfTrdTracks();
2046 const Int_t nLayers = 6;
2048 for (Int_t iTrdTrack = 0; iTrdTrack < nTrdTracks; ++iTrdTrack) {
2049 // copy information from ESD track to AOD track
2050 const AliESDTrdTrack *esdTrdTrk = esd.GetTrdTrack(iTrdTrack);
2051 AliAODTrdTrack &aodTrdTrk = AODEvent()->AddTrdTrack(esdTrdTrk);
2053 // copy the contributing tracklets
2054 for (Int_t iTracklet = 0; iTracklet < nLayers; ++iTracklet) {
2055 if (const AliESDTrdTracklet *esdTrdTrkl = esdTrdTrk->GetTracklet(iTracklet))
2056 aodTrdTrk.AddTracklet(*esdTrdTrkl, iTracklet);
2059 // add the reference to the matched global track
2060 AliAODTrack *aodTrkMatch = 0x0;
2061 AliESDtrack *esdTrkMatch = (AliESDtrack*) esdTrdTrk->GetTrackMatch();
2063 Int_t idx = esdTrkMatch->GetID();
2066 AliError("track has a matched track that was not found");
2067 else if (esdTrkMatch != esd.GetTrack(idx))
2068 AliError("wrong track found for ESD track index");
2070 UInt_t selectInfo = fTrackFilter ? fTrackFilter->IsSelected(esdTrkMatch) : 0;
2072 if (fUsedTrack[idx]) {
2073 aodTrkMatch = (AliAODTrack*) (*fAODTrackRefs)[idx];
2074 AliDebug(2, Form("event %lld: existing track (idx %i, pt = %f) matched to TRD track (idx %i, pt = %f), cut flags: 0x%08x",
2075 Entry(), idx, esdTrkMatch->Pt(), iTrdTrack, esdTrdTrk->Pt(),
2078 if (selectInfo & fUsedTrackCopy[idx]) {
2079 // mask filter bits already used in track copies
2080 selectInfo &= ~fUsedTrackCopy[idx];
2081 AliWarning(Form("event %lld: copied track (idx %i, pt = %f) matched to TRD track (idx %i, pt = %f), cut flags: 0x%08x -> 0x%08x",
2082 Entry(), idx, esdTrkMatch->Pt(), iTrdTrack, esdTrdTrk->Pt(),
2083 fTrackFilter->IsSelected(esdTrkMatch), selectInfo));
2085 AliDebug(2, Form("event %lld: unused track (idx %i, pt = %f) matched to TRD track (idx %i, pt = %f), cut flags: 0x%08x -> 0x%08x",
2086 Entry(), idx, esdTrkMatch->Pt(), iTrdTrack, esdTrdTrk->Pt(),
2087 fTrackFilter->IsSelected(esdTrkMatch), selectInfo));
2089 Double_t mom[3]={0.};
2090 Double_t pos[3]={0.};
2091 Double_t covTr[21]={0.};
2092 // Double_t pid[10]={0.};
2094 esdTrkMatch->GetPxPyPz(mom);
2095 esdTrkMatch->GetXYZ(pos);
2096 esdTrkMatch->GetCovarianceXYZPxPyPz(covTr);
2097 // esdTrkMatch->GetESDpid(pid);
2098 const AliESDVertex* vtx = esd.GetPrimaryVertex();
2100 fUsedTrack[idx] = kTRUE;
2101 if(fMChandler) fMChandler->SelectParticle(esdTrkMatch->GetLabel());
2103 aodTrkMatch = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrkMatch->GetID(),
2104 esdTrkMatch->GetLabel(),
2110 (Short_t)esdTrkMatch->GetSign(),
2111 esdTrkMatch->GetITSClusterMap(),
2115 vtx->UsesTrack(esdTrkMatch->GetID()),
2116 AliAODTrack::kUndef,
2118 aodTrkMatch->SetPIDForTracking(esdTrkMatch->GetPIDForTracking());
2119 aodTrkMatch->SetTPCFitMap(esdTrkMatch->GetTPCFitMap());
2120 aodTrkMatch->SetTPCClusterMap(esdTrkMatch->GetTPCClusterMap());
2121 aodTrkMatch->SetTPCSharedMap (esdTrkMatch->GetTPCSharedMap());
2122 aodTrkMatch->SetChi2perNDF(Chi2perNDF(esdTrkMatch));
2123 aodTrkMatch->SetTPCPointsF(esdTrkMatch->GetTPCNclsF());
2124 aodTrkMatch->SetTPCNCrossedRows(UShort_t(esdTrkMatch->GetTPCCrossedRows()));
2125 aodTrkMatch->SetIntegratedLength(esdTrkMatch->GetIntegratedLength());
2126 CopyCaloProps(esdTrkMatch,aodTrkMatch);
2127 fAODTrackRefs->AddAt(aodTrkMatch,idx);
2128 if (esdTrkMatch->GetSign() > 0) ++fNumberOfPositiveTracks;
2129 aodTrkMatch->ConvertAliPIDtoAODPID();
2130 aodTrkMatch->SetFlags(esdTrkMatch->GetStatus());
2134 aodTrdTrk.SetTrackMatchReference(aodTrkMatch);
2138 //______________________________________________________________________________
2139 void AliAnalysisTaskESDfilter::ConvertESDtoAOD()
2141 // ESD Filter analysis task executed for each event
2143 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
2147 AliCodeTimerAuto("",0);
2149 if (fRefitVertexTracks>=0) AliESDUtils::RefitESDVertexTracks(esd,fRefitVertexTracks,
2150 fRefitVertexTracksNCuts ? fRefitVertexTracksCuts:0);
2152 fOldESDformat = ( esd->GetAliESDOld() != 0x0 );
2154 // Reconstruct cascades and V0 here
2155 if (fIsV0CascadeRecoEnabled) {
2156 esd->ResetCascades();
2159 AliV0vertexer lV0vtxer;
2160 AliCascadeVertexer lCascVtxer;
2162 lV0vtxer.SetCuts(fV0Cuts);
2163 lCascVtxer.SetCuts(fCascadeCuts);
2166 lV0vtxer.Tracks2V0vertices(esd);
2167 lCascVtxer.V0sTracks2CascadeVertices(esd);
2170 // Perform progagation of tracks if needed
2171 if (fDoPropagateTrackToEMCal) {
2172 const Int_t ntrack = esd->GetNumberOfTracks();
2173 for (Int_t i=0;i<ntrack;++i) {
2174 AliESDtrack *t = esd->GetTrack(i);
2175 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(t,fEMCalSurfaceDistance);
2179 fNumberOfTracks = 0;
2180 fNumberOfPositiveTracks = 0;
2182 fNumberOfVertices = 0;
2183 fNumberOfCascades = 0;
2186 AliAODHeader* header = ConvertHeader(*esd);
2188 if ( fIsVZEROEnabled ) ConvertVZERO(*esd);
2189 if ( fIsTZEROEnabled ) ConvertTZERO(*esd);
2191 // Fetch Stack for debuggging if available
2194 fMChandler = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
2197 // loop over events and fill them
2198 // Multiplicity information needed by the header (to be revised!)
2199 Int_t nTracks = esd->GetNumberOfTracks();
2201 // The line below should not be needed anymore (tracks already connected)
2202 // for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) esd->GetTrack(iTrack)->SetESDEvent(esd);
2204 // Update the header
2205 Int_t nV0s = esd->GetNumberOfV0s();
2206 Int_t nCascades = esd->GetNumberOfCascades();
2207 Int_t nKinks = esd->GetNumberOfKinks();
2208 Int_t nVertices = nV0s + nCascades /*V0 wihtin cascade already counted*/+ nKinks + 1 /* = prim. vtx*/;
2209 Int_t nPileSPDVertices=1+esd->GetNumberOfPileupVerticesSPD(); // also SPD main vertex
2210 Int_t nPileTrkVertices=esd->GetNumberOfPileupVerticesTracks();
2211 nVertices+=nPileSPDVertices;
2212 nVertices+=nPileTrkVertices;
2214 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
2216 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
2217 Int_t nHmpidRings = 0;
2219 AliDebug(1,Form(" NV0=%d NCASCADES=%d NKINKS=%d", nV0s, nCascades, nKinks));
2221 AODEvent()->ResetStd(nTracks, nVertices, nV0s, nCascades, nJets, nCaloClus, nFmdClus, nPmdClus, nHmpidRings);
2224 // RefArray to store a mapping between esd V0 number and newly created AOD-Vertex V0
2225 fAODV0VtxRefs = new TRefArray(nV0s);
2226 // RefArray to store the mapping between esd V0 number and newly created AOD-V0
2227 fAODV0Refs = new TRefArray(nV0s);
2228 // Array to take into account the V0s already added to the AOD (V0 within cascades)
2229 fUsedV0 = new Bool_t[nV0s];
2230 for (Int_t iV0=0; iV0<nV0s; ++iV0) fUsedV0[iV0]=kFALSE;
2234 // RefArray to store the mapping between esd track number and newly created AOD-Track
2236 fAODTrackRefs = new TRefArray(nTracks);
2238 // Array to take into account the tracks already added to the AOD
2239 fUsedTrack = new Bool_t[nTracks];
2240 fUsedTrackCopy = new UInt_t[nTracks];
2241 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
2242 fUsedTrack[iTrack]=kFALSE;
2243 fUsedTrackCopy[iTrack] = 0;
2247 // Array to take into account the kinks already added to the AOD
2249 fUsedKink = new Bool_t[nKinks];
2250 for (Int_t iKink=0; iKink<nKinks; ++iKink) fUsedKink[iKink]=kFALSE;
2253 ConvertPrimaryVertices(*esd);
2255 //setting best TOF PID
2256 AliESDInputHandler* esdH = dynamic_cast<AliESDInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
2258 fESDpid = esdH->GetESDpid();
2260 if (fIsPidOwner && fESDpid) {
2264 if (!fESDpid) { //in case of no Tender attached
2265 fESDpid = new AliESDpid;
2266 fIsPidOwner = kTRUE;
2269 if (!esd->GetTOFHeader()) { //protection in case the pass2 LHC10b,c,d have been processed without tender.
2270 Float_t t0spread[10];
2271 Float_t intrinsicTOFres=100; //ps ok for LHC10b,c,d pass2!!
2272 for (Int_t i=0; i<10; i++) t0spread[i] = (TMath::Sqrt(esd->GetSigma2DiamondZ()))/0.03; //0.03 to convert from cm to ps
2273 fESDpid->GetTOFResponse().SetT0resolution(t0spread);
2274 fESDpid->GetTOFResponse().SetTimeResolution(intrinsicTOFres);
2275 // fESDpid->SetTOFResponse(esd, (AliESDpid::EStartTimeType_t)fTimeZeroType);
2276 AliTOFHeader tmpTOFHeader(0,t0spread[0],0,NULL,NULL,NULL,intrinsicTOFres,t0spread[0]);
2277 AODEvent()->SetTOFHeader(&tmpTOFHeader); // write dummy TOF header in AOD
2279 AODEvent()->SetTOFHeader(esd->GetTOFHeader()); // write TOF header in AOD
2282 // In case of AOD production strating form LHC10e without Tender.
2283 //if(esd->GetTOFHeader() && fIsPidOwner) fESDpid->SetTOFResponse(esd, (AliESDpid::EStartTimeType_t)fTimeZeroType);
2285 if (fAreCascadesEnabled) ConvertCascades(*esd);
2286 if (fAreV0sEnabled) ConvertV0s(*esd);
2287 if (fAreKinksEnabled) ConvertKinks(*esd);
2288 if (fAreTracksEnabled) ConvertTracks(*esd);
2290 // Update number of AOD tracks in header at the end of track loop (M.G.)
2291 header->SetRefMultiplicity(fNumberOfTracks);
2292 header->SetRefMultiplicityPos(fNumberOfPositiveTracks);
2293 header->SetRefMultiplicityNeg(fNumberOfTracks - fNumberOfPositiveTracks);
2295 if (fTPCConstrainedFilterMask) ConvertTPCOnlyTracks(*esd);
2296 if (fGlobalConstrainedFilterMask) ConvertGlobalConstrainedTracks(*esd);
2297 if (fArePmdClustersEnabled) ConvertPmdClusters(*esd);
2298 if (fAreCaloClustersEnabled) ConvertCaloClusters(*esd);
2299 if (fAreEMCALCellsEnabled) ConvertEMCALCells(*esd);
2300 if (fArePHOSCellsEnabled) ConvertPHOSCells(*esd);
2301 if (fAreEMCALTriggerEnabled) ConvertCaloTrigger(TString("EMCAL"), *esd);
2302 if (fArePHOSTriggerEnabled) ConvertCaloTrigger(TString("PHOS"), *esd);
2303 if (fAreTrackletsEnabled) ConvertTracklets(*esd);
2304 if (fIsZDCEnabled) ConvertZDC(*esd);
2305 if (fIsHMPIDEnabled) nHmpidRings = ConvertHMPID(*esd);
2306 if (fIsTRDEnabled) ConvertTRD(*esd);
2308 delete fAODTrackRefs; fAODTrackRefs=0x0;
2309 delete fAODV0VtxRefs; fAODV0VtxRefs=0x0;
2310 delete fAODV0Refs; fAODV0Refs=0x0;
2311 delete[] fUsedTrack; fUsedTrack=0x0;
2312 delete[] fUsedTrackCopy; fUsedTrackCopy=0x0;
2313 delete[] fUsedV0; fUsedV0=0x0;
2314 delete[] fUsedKink; fUsedKink=0x0;
2320 AODEvent()->ConnectTracks();
2323 //______________________________________________________________________________
2324 void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid)
2327 // Setter for the raw PID detector signals
2330 // Save PID object for candidate electrons
2331 Bool_t pidSave = kFALSE;
2333 Bool_t selectInfo = fTrackFilter->IsSelected((char*) "Electrons");
2334 if (selectInfo) pidSave = kTRUE;
2337 // Tracks passing pt cut
2338 if(esdtrack->Pt()>fHighPthreshold) {
2342 if(esdtrack->Pt()> fPtshape->GetXmin()){
2343 Double_t y = fPtshape->Eval(esdtrack->Pt())/fPtshape->Eval(fHighPthreshold);
2344 if(gRandom->Rndm(0)<1./y){
2348 }//end if p function
2352 if(!aodtrack->GetDetPid()){// prevent memory leak when calling SetAODPID twice for the same track
2353 detpid = new AliAODPid();
2354 SetDetectorRawSignals(detpid,esdtrack);
2355 aodtrack->SetDetPID(detpid);
2360 //______________________________________________________________________________
2361 void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtrack *track)
2363 // Assignment of the detector signals (AliXXXesdPID inspired)
2366 AliInfo("no ESD track found. .....exiting");
2371 aodpid->SetTPCmomentum(track->GetTPCmomentum());
2372 aodpid->SetTPCTgl(track->GetTPCTgl());
2373 aodpid->SetITSsignal(track->GetITSsignal());
2374 Double_t itsdedx[4]; // dE/dx samples for individual ITS layers
2375 track->GetITSdEdxSamples(itsdedx);
2376 aodpid->SetITSdEdxSamples(itsdedx);
2378 aodpid->SetTPCsignal(track->GetTPCsignal());
2379 aodpid->SetTPCsignalN(track->GetTPCsignalN());
2380 if (track->GetTPCdEdxInfo()) aodpid->SetTPCdEdxInfo(track->GetTPCdEdxInfo());
2383 Int_t nslices = track->GetNumberOfTRDslices()*6;
2384 TArrayD trdslices(nslices);
2385 for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) {
2386 for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);
2390 for(Int_t iPl=0;iPl<6;iPl++){
2391 Double_t trdmom=track->GetTRDmomentum(iPl);
2392 aodpid->SetTRDmomentum(iPl,trdmom);
2395 aodpid->SetTRDslices(track->GetNumberOfTRDslices()*6,trdslices.GetArray());
2396 aodpid->SetTRDsignal(track->GetTRDsignal());
2398 //TRD clusters and tracklets
2399 aodpid->SetTRDncls(track->GetTRDncls());
2400 aodpid->SetTRDntrackletsPID(track->GetTRDntrackletsPID());
2402 aodpid->SetTRDChi2(track->GetTRDchi2());
2405 Double_t times[AliPID::kSPECIESC]; track->GetIntegratedTimes(times,AliPID::kSPECIESC);
2406 aodpid->SetIntegratedTimes(times);
2408 // Float_t tzeroTrack = fESDpid->GetTOFResponse().GetStartTime(track->P());
2409 // aodpid->SetTOFsignal(track->GetTOFsignal()-tzeroTrack);
2410 aodpid->SetTOFsignal(track->GetTOFsignal());
2413 for (Int_t iMass=0; iMass<5; iMass++){
2414 // tofRes[iMass]=(Double_t)fESDpid->GetTOFResponse().GetExpectedSigma(track->P(), times[iMass], AliPID::ParticleMass(iMass));
2415 tofRes[iMass]=0; //backward compatibility
2417 aodpid->SetTOFpidResolution(tofRes);
2418 //aodpid->SetHMPIDsignal(0); // set to zero for compression but it will be removed later
2421 Double_t AliAnalysisTaskESDfilter::Chi2perNDF(AliESDtrack* track)
2423 // Calculate chi2 per ndf for track
2425 Int_t nClustersTPC = track->GetTPCNcls();
2426 if ( nClustersTPC > 5) {
2427 return (track->GetTPCchi2()/Float_t(nClustersTPC - 5));
2433 //______________________________________________________________________________
2434 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
2436 // Terminate analysis
2438 if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");
2441 //______________________________________________________________________________
2442 void AliAnalysisTaskESDfilter::PrintMCInfo(AliStack *pStack,Int_t label)
2445 if (!pStack) return;
2446 label = TMath::Abs(label);
2447 TParticle *part = pStack->Particle(label);
2448 Printf("########################");
2449 Printf("%s:%d %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,label,part->GetUniqueID(),part->GetPdgCode(),part->P());
2451 TParticle* mother = part;
2452 Int_t imo = part->GetFirstMother();
2453 Int_t nprim = pStack->GetNprimary();
2454 // while((imo >= nprim) && (mother->GetUniqueID() == 4)) {
2455 while((imo >= nprim)) {
2456 mother = pStack->Particle(imo);
2457 Printf("Mother %s:%d Label %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,imo,mother->GetUniqueID(),mother->GetPdgCode(),mother->P());
2459 imo = mother->GetFirstMother();
2461 Printf("########################");
2464 //______________________________________________________________________________
2465 void AliAnalysisTaskESDfilter::CopyCaloProps(AliESDtrack *tre, AliAODTrack *tra)
2467 // Copy calo properties from ESD track to AOD track
2468 tra->SetTrackPhiEtaPtOnEMCal(tre->GetTrackPhiOnEMCal(),tre->GetTrackEtaOnEMCal(),tre->GetTrackPtOnEMCal());
2469 if (tre->IsEMCAL()) tra->SetEMCALcluster(tre->GetEMCALcluster());
2470 if (tre->IsPHOS()) tra->SetPHOScluster(tre->GetPHOScluster());
2473 //______________________________________________________________________________
2474 void AliAnalysisTaskESDfilter::SetRefitVertexTracks(Int_t algo, Double_t* cuts)
2476 // request vertexTrack reprocessing from ESDtracks
2477 // if algo>=0 and cuts==0 then algo is interpreted as the algorithm ID to be run with default cuts
2478 // otherwise it is number of cuts to digest
2479 fRefitVertexTracks = algo;
2480 if (algo>0 && cuts) {
2481 fRefitVertexTracksCuts = new Double_t[fRefitVertexTracks];
2482 for (int i=fRefitVertexTracks;i--;) fRefitVertexTracksCuts[i] = cuts[i];
2483 fRefitVertexTracksNCuts = fRefitVertexTracks;