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),
119 fEMCalSurfaceDistance(440)
121 // Default constructor
122 fV0Cuts[0] = 33. ; // max allowed chi2
123 fV0Cuts[1] = 0.1 ; // min allowed impact parameter for the 1st daughter
124 fV0Cuts[2] = 0.1 ; // min allowed impact parameter for the 2nd daughter
125 fV0Cuts[3] = 1. ; // max allowed DCA between the daughter tracks
126 fV0Cuts[4] = .998; // min allowed cosine of V0's pointing angle
127 fV0Cuts[5] = 0.9 ; // min radius of the fiducial volume
128 fV0Cuts[6] = 100. ; // max radius of the fiducial volume
130 fCascadeCuts[0] = 33. ; // max allowed chi2 (same as PDC07)
131 fCascadeCuts[1] = 0.05 ; // min allowed V0 impact parameter
132 fCascadeCuts[2] = 0.008; // "window" around the Lambda mass
133 fCascadeCuts[3] = 0.03 ; // min allowed bachelor's impact parameter
134 fCascadeCuts[4] = 0.3 ; // max allowed DCA between the V0 and the bachelor
135 fCascadeCuts[5] = 0.999; // min allowed cosine of the cascade pointing angle
136 fCascadeCuts[6] = 0.9 ; // min radius of the fiducial volume
137 fCascadeCuts[7] = 100. ; // max radius of the fiducial volume
140 //______________________________________________________________________________
141 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
142 AliAnalysisTaskSE(name),
149 fEnableFillAOD(kTRUE),
158 fNumberOfPositiveTracks(0),
160 fNumberOfVertices(0),
161 fNumberOfCascades(0),
163 fOldESDformat(kFALSE),
165 fTPCConstrainedFilterMask(0),
166 fHybridFilterMaskTPCCG(0),
167 fWriteHybridTPCCOnly(kFALSE),
168 fGlobalConstrainedFilterMask(0),
169 fHybridFilterMaskGCG(0),
170 fWriteHybridGCOnly(kFALSE),
171 fIsVZEROEnabled(kTRUE),
172 fIsTZEROEnabled(kTRUE),
173 fIsZDCEnabled(kTRUE),
174 fIsHMPIDEnabled(kTRUE),
175 fIsV0CascadeRecoEnabled(kFALSE),
176 fAreCascadesEnabled(kTRUE),
177 fAreV0sEnabled(kTRUE),
178 fAreKinksEnabled(kTRUE),
179 fAreTracksEnabled(kTRUE),
180 fArePmdClustersEnabled(kTRUE),
181 fAreCaloClustersEnabled(kTRUE),
182 fAreEMCALCellsEnabled(kTRUE),
183 fArePHOSCellsEnabled(kTRUE),
184 fAreEMCALTriggerEnabled(kTRUE),
185 fArePHOSTriggerEnabled(kTRUE),
186 fAreTrackletsEnabled(kTRUE),
189 fTPCaloneTrackCuts(0),
190 fDoPropagateTrackToEMCal(kTRUE),
191 fEMCalSurfaceDistance(440)
195 fV0Cuts[0] = 33. ; // max allowed chi2
196 fV0Cuts[1] = 0.1 ; // min allowed impact parameter for the 1st daughter
197 fV0Cuts[2] = 0.1 ; // min allowed impact parameter for the 2nd daughter
198 fV0Cuts[3] = 1. ; // max allowed DCA between the daughter tracks
199 fV0Cuts[4] = .998; // min allowed cosine of V0's pointing angle
200 fV0Cuts[5] = 0.9 ; // min radius of the fiducial volume
201 fV0Cuts[6] = 100. ; // max radius of the fiducial volume
203 fCascadeCuts[0] = 33. ; // max allowed chi2 (same as PDC07)
204 fCascadeCuts[1] = 0.05 ; // min allowed V0 impact parameter
205 fCascadeCuts[2] = 0.008; // "window" around the Lambda mass
206 fCascadeCuts[3] = 0.03 ; // min allowed bachelor's impact parameter
207 fCascadeCuts[4] = 0.3 ; // max allowed DCA between the V0 and the bachelor
208 fCascadeCuts[5] = 0.999; // min allowed cosine of the cascade pointing angle
209 fCascadeCuts[6] = 0.9 ; // min radius of the fiducial volume
210 fCascadeCuts[7] = 100. ; // max radius of the fiducial volume
215 AliAnalysisTaskESDfilter::~AliAnalysisTaskESDfilter(){
216 if(fIsPidOwner) delete fESDpid;
218 //______________________________________________________________________________
219 void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
222 // Create Output Objects conenct filter to outputtree
226 OutputTree()->GetUserInfo()->Add(fTrackFilter);
230 AliError("No OutputTree() for adding the track filter");
232 fTPCaloneTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
235 //______________________________________________________________________________
236 void AliAnalysisTaskESDfilter::Init()
239 if (fDebug > 1) AliInfo("Init() \n");
240 // Call configuration file
243 //______________________________________________________________________________
244 Bool_t AliAnalysisTaskESDfilter::Notify()
247 AddMetadataToUserInfo();
251 //______________________________________________________________________________
252 Bool_t AliAnalysisTaskESDfilter::AddMetadataToUserInfo()
254 // Copy metadata to AOD user info.
255 static Bool_t copyFirst = kFALSE;
257 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
259 AliError("AliAnalysisTaskESDfilter::AddMetadataToUserInfo() : No analysis manager !");
262 TTree *esdTree = mgr->GetTree()->GetTree();
263 if (!esdTree) return kFALSE;
264 TNamed *alirootVersion = (TNamed*)esdTree->GetUserInfo()->FindObject("alirootVersion");
265 if (!alirootVersion) return kFALSE;
266 AliAODHandler *aodHandler = dynamic_cast<AliAODHandler*>(mgr->GetOutputEventHandler());
267 if (!aodHandler) return kFALSE;
268 TTree *aodTree = aodHandler->GetTree();
269 if (!aodTree) return kFALSE;
270 aodTree->GetUserInfo()->Add(new TNamed(*alirootVersion));
276 //______________________________________________________________________________
277 void AliAnalysisTaskESDfilter::PrintTask(Option_t *option, Int_t indent) const
279 // Print selection task information
282 AliAnalysisTaskSE::PrintTask(option,indent);
284 TString spaces(' ',indent+3);
286 cout << spaces.Data() << Form("Cascades are %s",fAreCascadesEnabled ? "ENABLED":"DISABLED") << endl;
287 cout << spaces.Data() << Form("V0s are %s",fAreV0sEnabled ? "ENABLED":"DISABLED") << endl;
288 cout << spaces.Data() << Form("Kinks are %s",fAreKinksEnabled ? "ENABLED":"DISABLED") << endl;
289 cout << spaces.Data() << Form("Tracks are %s",fAreTracksEnabled ? "ENABLED":"DISABLED") << endl;
290 cout << spaces.Data() << Form("PmdClusters are %s",fArePmdClustersEnabled ? "ENABLED":"DISABLED") << endl;
291 cout << spaces.Data() << Form("CaloClusters are %s",fAreCaloClustersEnabled ? "ENABLED":"DISABLED") << endl;
292 cout << spaces.Data() << Form("EMCAL cells are %s",fAreEMCALCellsEnabled ? "ENABLED":"DISABLED") << endl;
293 cout << spaces.Data() << Form("EMCAL triggers are %s",fAreEMCALTriggerEnabled ? "ENABLED":"DISABLED") << endl;
294 cout << spaces.Data() << Form("PHOS triggers are %s",fArePHOSTriggerEnabled ? "ENABLED":"DISABLED") << endl;
295 cout << spaces.Data() << Form("Tracklets are %s",fAreTrackletsEnabled ? "ENABLED":"DISABLED") << endl;
296 cout << spaces.Data() << Form("PropagateTrackToEMCal is %s", fDoPropagateTrackToEMCal ? "ENABLED":"DISABLED") << endl;
299 //______________________________________________________________________________
300 void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
302 // Execute analysis for current event
305 Long64_t ientry = Entry();
308 printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
309 if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
310 if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
312 // Filters must explicitely enable AOD filling in their UserExec (AG)
313 if (!AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()) AliFatal("Cannot run ESD filter without an output event handler");
315 AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
316 AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillExtension(kTRUE);
321 //______________________________________________________________________________
322 TClonesArray& AliAnalysisTaskESDfilter::Cascades()
324 return *(AODEvent()->GetCascades());
327 //______________________________________________________________________________
328 TClonesArray& AliAnalysisTaskESDfilter::Tracks()
330 return *(AODEvent()->GetTracks());
333 //______________________________________________________________________________
334 TClonesArray& AliAnalysisTaskESDfilter::V0s()
336 return *(AODEvent()->GetV0s());
339 //______________________________________________________________________________
340 TClonesArray& AliAnalysisTaskESDfilter::Vertices()
342 return *(AODEvent()->GetVertices());
345 //______________________________________________________________________________
346 AliAODHeader* AliAnalysisTaskESDfilter::ConvertHeader(const AliESDEvent& esd)
348 // Convert header information
350 AliCodeTimerAuto("",0);
352 AliAODHeader* header = AODEvent()->GetHeader();
354 header->SetRunNumber(esd.GetRunNumber());
355 header->SetOfflineTrigger(fInputHandler->IsEventSelected()); // propagate the decision of the physics selection
356 header->SetNumberOfESDTracks(esd.GetNumberOfTracks());
358 TTree* tree = fInputHandler->GetTree();
360 TFile* file = tree->GetCurrentFile();
361 if (file) header->SetESDFileName(file->GetName());
365 header->SetBunchCrossNumber(0);
366 header->SetOrbitNumber(0);
367 header->SetPeriodNumber(0);
368 header->SetEventType(0);
369 header->SetMuonMagFieldScale(-999.);
370 header->SetCentrality(0);
371 header->SetEventplane(0);
373 header->SetBunchCrossNumber(esd.GetBunchCrossNumber());
374 header->SetOrbitNumber(esd.GetOrbitNumber());
375 header->SetPeriodNumber(esd.GetPeriodNumber());
376 header->SetEventType(esd.GetEventType());
378 header->SetEventNumberESDFile(esd.GetHeader()->GetEventNumberInFile());
379 if(const_cast<AliESDEvent&>(esd).GetCentrality()){
380 header->SetCentrality(const_cast<AliESDEvent&>(esd).GetCentrality());
383 header->SetCentrality(0);
385 if(const_cast<AliESDEvent&>(esd).GetEventplane()){
386 header->SetEventplane(const_cast<AliESDEvent&>(esd).GetEventplane());
389 header->SetEventplane(0);
394 header->SetFiredTriggerClasses(esd.GetFiredTriggerClasses());
395 header->SetTriggerMask(esd.GetTriggerMask());
396 header->SetTriggerCluster(esd.GetTriggerCluster());
397 header->SetL0TriggerInputs(esd.GetHeader()->GetL0TriggerInputs());
398 header->SetL1TriggerInputs(esd.GetHeader()->GetL1TriggerInputs());
399 header->SetL2TriggerInputs(esd.GetHeader()->GetL2TriggerInputs());
401 header->SetMagneticField(esd.GetMagneticField());
402 header->SetMuonMagFieldScale(esd.GetCurrentDip()/6000.);
403 header->SetZDCN1Energy(esd.GetZDCN1Energy());
404 header->SetZDCP1Energy(esd.GetZDCP1Energy());
405 header->SetZDCN2Energy(esd.GetZDCN2Energy());
406 header->SetZDCP2Energy(esd.GetZDCP2Energy());
407 header->SetZDCEMEnergy(esd.GetZDCEMEnergy(0),esd.GetZDCEMEnergy(1));
409 header->SetIRInt2InteractionMap(esd.GetHeader()->GetIRInt2InteractionMap());
410 header->SetIRInt1InteractionMap(esd.GetHeader()->GetIRInt1InteractionMap());
412 // ITS Cluster Multiplicty
413 const AliMultiplicity *mult = esd.GetMultiplicity();
414 for (Int_t ilay = 0; ilay < 6; ilay++) header->SetITSClusters(ilay, mult->GetNumberOfITSClusters(ilay));
416 // TPC only Reference Multiplicty
417 Int_t refMult = fTPCaloneTrackCuts ? (Short_t)fTPCaloneTrackCuts->GetReferenceMultiplicity(&esd, kTRUE) : -1;
418 header->SetTPConlyRefMultiplicity(refMult);
420 AliESDtrackCuts::MultEstTrackType estType = esd.GetPrimaryVertexTracks()->GetStatus() ? AliESDtrackCuts::kTrackletsITSTPC : AliESDtrackCuts::kTracklets;
421 header->SetRefMultiplicityComb05(AliESDtrackCuts::GetReferenceMultiplicity(&esd,estType,0.5));
422 header->SetRefMultiplicityComb08(AliESDtrackCuts::GetReferenceMultiplicity(&esd,estType,0.8));
424 Float_t diamxy[2]={esd.GetDiamondX(),esd.GetDiamondY()};
426 esd.GetDiamondCovXY(diamcov);
427 header->SetDiamond(diamxy,diamcov);
428 header->SetDiamondZ(esd.GetDiamondZ(),esd.GetSigma2DiamondZ());
430 // VZERO channel equalization factors for event-plane reconstruction
431 header->SetVZEROEqFactors(esd.GetVZEROEqFactors());
433 // T0 Resolution information
434 const AliESDRun* esdRun = esd.GetESDRun();
435 for (Int_t i=0;i<AliESDRun::kT0spreadSize;i++) header->SetT0spread(i,esdRun->GetT0spread(i));
440 //______________________________________________________________________________
441 void AliAnalysisTaskESDfilter::ConvertCascades(const AliESDEvent& esd)
444 // Convert the cascades part of the ESD.
445 // Return the number of cascades
447 AliCodeTimerAuto("",0);
449 // Create vertices starting from the most complex objects
452 const AliESDVertex* vtx = esd.GetPrimaryVertex();
453 Double_t pos[3] = { 0. };
454 Double_t covVtx[6] = { 0. };
455 Double_t momBach[3]={0.};
456 Double_t covTr[21]={0.};
457 Double_t pid[10]={0.};
458 AliAODPid* detpid(0x0);
459 AliAODVertex* vV0FromCascade(0x0);
460 AliAODv0* aodV0(0x0);
461 AliAODcascade* aodCascade(0x0);
462 AliAODTrack* aodTrack(0x0);
463 Double_t momPos[3]={0.};
464 Double_t momNeg[3] = { 0. };
465 Double_t momPosAtV0vtx[3]={0.};
466 Double_t momNegAtV0vtx[3]={0.};
468 TClonesArray& verticesArray = Vertices();
469 TClonesArray& tracksArray = Tracks();
470 TClonesArray& cascadesArray = Cascades();
472 // Cascades (Modified by A.Maire - February 2009)
473 for (Int_t nCascade = 0; nCascade < esd.GetNumberOfCascades(); ++nCascade) {
477 AliESDcascade *esdCascade = esd.GetCascade(nCascade);
478 Int_t idxPosFromV0Dghter = esdCascade->GetPindex();
479 Int_t idxNegFromV0Dghter = esdCascade->GetNindex();
480 Int_t idxBachFromCascade = esdCascade->GetBindex();
482 AliESDtrack *esdCascadePos = esd.GetTrack( idxPosFromV0Dghter);
483 AliESDtrack *esdCascadeNeg = esd.GetTrack( idxNegFromV0Dghter);
484 AliESDtrack *esdCascadeBach = esd.GetTrack( idxBachFromCascade);
486 // Identification of the V0 within the esdCascade (via both daughter track indices)
487 AliESDv0 * currentV0 = 0x0;
488 Int_t idxV0FromCascade = -1;
490 for (Int_t iV0=0; iV0<esd.GetNumberOfV0s(); ++iV0) {
492 currentV0 = esd.GetV0(iV0);
493 Int_t posCurrentV0 = currentV0->GetPindex();
494 Int_t negCurrentV0 = currentV0->GetNindex();
496 if (posCurrentV0==idxPosFromV0Dghter && negCurrentV0==idxNegFromV0Dghter) {
497 idxV0FromCascade = iV0;
502 if(idxV0FromCascade < 0){
503 printf("Cascade - no matching for the V0 (index V0 = -1) ! Skip ... \n");
505 }// a priori, useless check, but safer ... in case of pb with tracks "out of bounds"
507 AliESDv0 *esdV0FromCascade = esd.GetV0(idxV0FromCascade);
509 // 1 - Cascade selection
511 // AliESDVertex *esdPrimVtx = new AliESDVertex(*(esd.GetPrimaryVertex()));
512 // TList cascadeObjects;
513 // cascadeObjects.AddAt(esdV0FromCascade, 0);
514 // cascadeObjects.AddAt(esdCascadePos, 1);
515 // cascadeObjects.AddAt(esdCascadeNeg, 2);
516 // cascadeObjects.AddAt(esdCascade, 3);
517 // cascadeObjects.AddAt(esdCascadeBach, 4);
518 // cascadeObjects.AddAt(esdPrimVtx, 5);
520 // UInt_t selectCascade = 0;
521 // if (fCascadeFilter) {
522 // // selectCascade = fCascadeFilter->IsSelected(&cascadeObjects);
523 // // FIXME AliESDCascadeCuts to be implemented ...
525 // // Here we may encounter a moot point at the V0 level
526 // // between the cascade selections and the V0 ones :
527 // // the V0 selected along with the cascade (secondary V0) may
528 // // usually be removed from the dedicated V0 selections (prim V0) ...
529 // // -> To be discussed !
531 // // this is a little awkward but otherwise the
532 // // list wants to access the pointer (delete it)
533 // // again when going out of scope
534 // delete cascadeObjects.RemoveAt(5); // esdPrimVtx created via copy construct
536 // if (!selectCascade)
540 // delete cascadeObjects.RemoveAt(5); // esdPrimVtx created via copy construct
544 // 2 - Add the cascade vertex
546 esdCascade->GetXYZcascade(pos[0], pos[1], pos[2]);
547 esdCascade->GetPosCovXi(covVtx);
548 chi2 = esdCascade->GetChi2Xi();
550 AliAODVertex *vCascade = new(verticesArray[fNumberOfVertices++]) AliAODVertex( pos,
552 chi2, // FIXME = Chi2/NDF will be needed
555 AliAODVertex::kCascade);
556 fPrimaryVertex->AddDaughter(vCascade);
559 // printf("---- Cascade / Cascade Vertex (AOD) : \n");
560 // vCascade->Print();
563 // if(esd.GetTOFHeader() && fIsPidOwner) fESDpid->SetTOFResponse(const_cast<AliESDEvent*>(&esd), (AliESDpid::EStartTimeType_t)fTimeZeroType); //in case of AOD production starting form LHC10e without Tender.
566 // 3 - Add the bachelor track from the cascade
568 if (!fUsedTrack[idxBachFromCascade]) {
570 esdCascadeBach->GetPxPyPz(momBach);
571 esdCascadeBach->GetXYZ(pos);
572 esdCascadeBach->GetCovarianceXYZPxPyPz(covTr);
573 esdCascadeBach->GetESDpid(pid);
575 fUsedTrack[idxBachFromCascade] = kTRUE;
576 UInt_t selectInfo = 0;
577 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeBach);
578 if (fMChandler) fMChandler->SelectParticle(esdCascadeBach->GetLabel());
579 aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack(esdCascadeBach->GetID(),
580 esdCascadeBach->GetLabel(),
584 kFALSE, // Why kFALSE for "isDCA" ? FIXME
586 (Short_t)esdCascadeBach->GetSign(),
587 esdCascadeBach->GetITSClusterMap(),
590 kTRUE, // usedForVtxFit = kFALSE ? FIXME
591 vtx->UsesTrack(esdCascadeBach->GetID()),
592 AliAODTrack::kSecondary,
594 aodTrack->SetTPCFitMap(esdCascadeBach->GetTPCFitMap());
595 aodTrack->SetTPCClusterMap(esdCascadeBach->GetTPCClusterMap());
596 aodTrack->SetTPCSharedMap (esdCascadeBach->GetTPCSharedMap());
597 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeBach));
598 aodTrack->SetTPCPointsF(esdCascadeBach->GetTPCNclsF());
599 aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadeBach->GetTPCCrossedRows()));
600 aodTrack->SetIntegratedLength(esdCascadeBach->GetIntegratedLength());
601 fAODTrackRefs->AddAt(aodTrack,idxBachFromCascade);
603 if (esdCascadeBach->GetSign() > 0) ++fNumberOfPositiveTracks;
604 aodTrack->ConvertAliPIDtoAODPID();
605 aodTrack->SetFlags(esdCascadeBach->GetStatus());
606 SetAODPID(esdCascadeBach,aodTrack,detpid);
609 aodTrack = static_cast<AliAODTrack*>( fAODTrackRefs->At(idxBachFromCascade) );
612 vCascade->AddDaughter(aodTrack);
615 // printf("---- Cascade / bach dghter : \n");
616 // aodTrack->Print();
620 // 4 - Add the V0 from the cascade.
621 // = V0vtx + both pos and neg daughter tracks + the aodV0 itself
624 if ( !fUsedV0[idxV0FromCascade] ) {
625 // 4.A - if VO structure hasn't been created yet
627 // 4.A.1 - Create the V0 vertex of the cascade
629 esdV0FromCascade->GetXYZ(pos[0], pos[1], pos[2]);
630 esdV0FromCascade->GetPosCov(covVtx);
631 chi2 = esdV0FromCascade->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3 ?
633 vV0FromCascade = new(verticesArray[fNumberOfVertices++]) AliAODVertex(pos,
637 idxV0FromCascade, //id of ESDv0
640 // one V0 can be used by several cascades.
641 // So, one AOD V0 vtx can have several parent vtx.
642 // This is not directly allowed by AliAODvertex.
643 // Setting the parent vtx (here = param "vCascade") doesn't lead to a crash
644 // but to a problem of consistency within AODEvent.
645 // -> See below paragraph 4.B, for the proposed treatment of such a case.
647 // Add the vV0FromCascade to the aodVOVtxRefs
648 fAODV0VtxRefs->AddAt(vV0FromCascade,idxV0FromCascade);
651 // 4.A.2 - Add the positive tracks from the V0
653 esdCascadePos->GetPxPyPz(momPos);
654 esdCascadePos->GetXYZ(pos);
655 esdCascadePos->GetCovarianceXYZPxPyPz(covTr);
656 esdCascadePos->GetESDpid(pid);
659 if (!fUsedTrack[idxPosFromV0Dghter]) {
660 fUsedTrack[idxPosFromV0Dghter] = kTRUE;
662 UInt_t selectInfo = 0;
663 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadePos);
664 if(fMChandler) fMChandler->SelectParticle(esdCascadePos->GetLabel());
665 aodTrack = new(tracksArray[fNumberOfTracks++])
666 AliAODTrack( esdCascadePos->GetID(),
667 esdCascadePos->GetLabel(),
671 kFALSE, // Why kFALSE for "isDCA" ? FIXME
673 (Short_t)esdCascadePos->GetSign(),
674 esdCascadePos->GetITSClusterMap(),
677 kTRUE, // usedForVtxFit = kFALSE ? FIXME
678 vtx->UsesTrack(esdCascadePos->GetID()),
679 AliAODTrack::kSecondary,
681 aodTrack->SetTPCFitMap(esdCascadePos->GetTPCFitMap());
682 aodTrack->SetTPCClusterMap(esdCascadePos->GetTPCClusterMap());
683 aodTrack->SetTPCSharedMap (esdCascadePos->GetTPCSharedMap());
684 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadePos));
685 aodTrack->SetTPCPointsF(esdCascadePos->GetTPCNclsF());
686 aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadePos->GetTPCCrossedRows()));
687 aodTrack->SetIntegratedLength(esdCascadePos->GetIntegratedLength());
688 fAODTrackRefs->AddAt(aodTrack,idxPosFromV0Dghter);
690 if (esdCascadePos->GetSign() > 0) ++fNumberOfPositiveTracks;
691 aodTrack->ConvertAliPIDtoAODPID();
692 aodTrack->SetFlags(esdCascadePos->GetStatus());
693 SetAODPID(esdCascadePos,aodTrack,detpid);
696 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxPosFromV0Dghter));
698 vV0FromCascade->AddDaughter(aodTrack);
701 // 4.A.3 - Add the negative tracks from the V0
703 esdCascadeNeg->GetPxPyPz(momNeg);
704 esdCascadeNeg->GetXYZ(pos);
705 esdCascadeNeg->GetCovarianceXYZPxPyPz(covTr);
706 esdCascadeNeg->GetESDpid(pid);
709 if (!fUsedTrack[idxNegFromV0Dghter]) {
710 fUsedTrack[idxNegFromV0Dghter] = kTRUE;
712 UInt_t selectInfo = 0;
713 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeNeg);
714 if(fMChandler)fMChandler->SelectParticle(esdCascadeNeg->GetLabel());
715 aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack( esdCascadeNeg->GetID(),
716 esdCascadeNeg->GetLabel(),
720 kFALSE, // Why kFALSE for "isDCA" ? FIXME
722 (Short_t)esdCascadeNeg->GetSign(),
723 esdCascadeNeg->GetITSClusterMap(),
726 kTRUE, // usedForVtxFit = kFALSE ? FIXME
727 vtx->UsesTrack(esdCascadeNeg->GetID()),
728 AliAODTrack::kSecondary,
730 aodTrack->SetTPCFitMap(esdCascadeNeg->GetTPCFitMap());
731 aodTrack->SetTPCClusterMap(esdCascadeNeg->GetTPCClusterMap());
732 aodTrack->SetTPCSharedMap (esdCascadeNeg->GetTPCSharedMap());
733 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeNeg));
734 aodTrack->SetTPCPointsF(esdCascadeNeg->GetTPCNclsF());
735 aodTrack->SetTPCNCrossedRows(UShort_t(esdCascadeNeg->GetTPCCrossedRows()));
736 aodTrack->SetIntegratedLength(esdCascadeNeg->GetIntegratedLength());
737 fAODTrackRefs->AddAt(aodTrack,idxNegFromV0Dghter);
739 if (esdCascadeNeg->GetSign() > 0) ++fNumberOfPositiveTracks;
740 aodTrack->ConvertAliPIDtoAODPID();
741 aodTrack->SetFlags(esdCascadeNeg->GetStatus());
742 SetAODPID(esdCascadeNeg,aodTrack,detpid);
745 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxNegFromV0Dghter));
748 vV0FromCascade->AddDaughter(aodTrack);
751 // 4.A.4 - Add the V0 from cascade to the V0 array
753 Double_t dcaV0Daughters = esdV0FromCascade->GetDcaV0Daughters();
754 Double_t dcaV0ToPrimVertex = esdV0FromCascade->GetD( esd.GetPrimaryVertex()->GetX(),
755 esd.GetPrimaryVertex()->GetY(),
756 esd.GetPrimaryVertex()->GetZ() );
757 esdV0FromCascade->GetPPxPyPz( momPosAtV0vtx[0],momPosAtV0vtx[1],momPosAtV0vtx[2] );
758 esdV0FromCascade->GetNPxPyPz( momNegAtV0vtx[0],momNegAtV0vtx[1],momNegAtV0vtx[2] );
760 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = DCA in (x,y) for Pos and ..[1] = Neg
761 dcaDaughterToPrimVertex[0] = TMath::Abs(esdCascadePos->GetD( esd.GetPrimaryVertex()->GetX(),
762 esd.GetPrimaryVertex()->GetY(),
763 esd.GetMagneticField()) );
764 dcaDaughterToPrimVertex[1] = TMath::Abs(esdCascadeNeg->GetD( esd.GetPrimaryVertex()->GetX(),
765 esd.GetPrimaryVertex()->GetY(),
766 esd.GetMagneticField()) );
768 aodV0 = new(V0s()[fNumberOfV0s++]) AliAODv0( vV0FromCascade,
773 dcaDaughterToPrimVertex);
774 // set the aod v0 on-the-fly status
775 aodV0->SetOnFlyStatus(esdV0FromCascade->GetOnFlyStatus());
777 // Add the aodV0 to the aodVORefs
778 fAODV0Refs->AddAt(aodV0,idxV0FromCascade);
780 fUsedV0[idxV0FromCascade] = kTRUE;
783 // 4.B - if V0 structure already used
786 // one V0 can be used by several cascades (frequent in PbPb evts) :
787 // same V0 which used but attached to different bachelor tracks
788 // -> aodVORefs and fAODV0VtxRefs are needed.
789 // Goal : avoid a redundancy of the info in "Vertices" and "v0s" clones array.
791 vV0FromCascade = static_cast<AliAODVertex*>( fAODV0VtxRefs->At(idxV0FromCascade) );
792 aodV0 = static_cast<AliAODv0*> ( fAODV0Refs ->At(idxV0FromCascade) );
794 // - Treatment of the parent for such a "re-used" V0 :
795 // Insert the cascade that reuses the V0 vertex in the lineage chain
796 // Before : vV0 -> vCascade1 -> vPrimary
797 // - Hyp : cascade2 uses the same V0 as cascade1
798 // After : vV0 -> vCascade2 -> vCascade1 -> vPrimary
800 AliAODVertex *vCascadePreviousParent = static_cast<AliAODVertex*> (vV0FromCascade->GetParent());
801 vV0FromCascade->SetParent(vCascade);
802 vCascade ->SetParent(vCascadePreviousParent);
805 // printf("---- Cascade / Lineage insertion\n"
806 // "Parent of V0 vtx = Cascade vtx %p\n"
807 // "Parent of the cascade vtx = Cascade vtx %p\n"
808 // "Parent of the parent cascade vtx = Cascade vtx %p\n",
809 // static_cast<void*> (vV0FromCascade->GetParent()),
810 // static_cast<void*> (vCascade->GetParent()),
811 // static_cast<void*> (vCascadePreviousParent->GetParent()) );
813 }// end if V0 structure already used
816 // printf("---- Cascade / V0 vertex: \n");
817 // vV0FromCascade->Print();
821 // printf("---- Cascade / pos dghter : \n");
822 // aodTrack->Print();
823 // printf("---- Cascade / neg dghter : \n");
824 // aodTrack->Print();
825 // printf("---- Cascade / aodV0 : \n");
829 // In any case (used V0 or not), add the V0 vertex to the cascade one.
830 vCascade->AddDaughter(vV0FromCascade);
833 // 5 - Add the primary track of the cascade (if any)
836 // 6 - Add the cascade to the AOD array of cascades
838 Double_t dcaBachToPrimVertexXY = TMath::Abs(esdCascadeBach->GetD(esd.GetPrimaryVertex()->GetX(),
839 esd.GetPrimaryVertex()->GetY(),
840 esd.GetMagneticField()) );
842 Double_t momBachAtCascadeVtx[3]={0.};
844 esdCascade->GetBPxPyPz(momBachAtCascadeVtx[0], momBachAtCascadeVtx[1], momBachAtCascadeVtx[2]);
846 aodCascade = new(cascadesArray[fNumberOfCascades++]) AliAODcascade( vCascade,
847 esdCascade->Charge(),
848 esdCascade->GetDcaXiDaughters(),
850 // DCAXiToPrimVtx -> needs to be calculated ----|
851 // doesn't exist at ESD level;
852 // See AODcascade::DcaXiToPrimVertex(Double, Double, Double)
853 dcaBachToPrimVertexXY,
858 printf("---- Cascade / AOD cascade : \n\n");
859 aodCascade->PrintXi(fPrimaryVertex->GetX(), fPrimaryVertex->GetY(), fPrimaryVertex->GetZ());
862 } // end of the loop on cascades
864 Cascades().Expand(fNumberOfCascades);
867 //______________________________________________________________________________
868 void AliAnalysisTaskESDfilter::ConvertV0s(const AliESDEvent& esd)
870 // Access to the AOD container of V0s
872 AliCodeTimerAuto("",0);
878 Double_t pos[3] = { 0. };
880 Double_t covVtx[6] = { 0. };
881 Double_t momPos[3]={0.};
882 Double_t covTr[21]={0.};
883 Double_t pid[10]={0.};
884 AliAODTrack* aodTrack(0x0);
885 AliAODPid* detpid(0x0);
886 Double_t momNeg[3]={0.};
887 Double_t momPosAtV0vtx[3]={0.};
888 Double_t momNegAtV0vtx[3]={0.};
890 for (Int_t nV0 = 0; nV0 < esd.GetNumberOfV0s(); ++nV0)
892 if (fUsedV0[nV0]) continue; // skip if already added to the AOD
894 AliESDv0 *v0 = esd.GetV0(nV0);
895 Int_t posFromV0 = v0->GetPindex();
896 Int_t negFromV0 = v0->GetNindex();
900 AliESDVertex *esdVtx = new AliESDVertex(*(esd.GetPrimaryVertex()));
901 AliESDtrack *esdV0Pos = esd.GetTrack(posFromV0);
902 AliESDtrack *esdV0Neg = esd.GetTrack(negFromV0);
904 v0objects.AddAt(v0, 0);
905 v0objects.AddAt(esdV0Pos, 1);
906 v0objects.AddAt(esdV0Neg, 2);
907 v0objects.AddAt(esdVtx, 3);
910 selectV0 = fV0Filter->IsSelected(&v0objects);
911 // this is a little awkward but otherwise the
912 // list wants to access the pointer (delete it)
913 // again when going out of scope
914 delete v0objects.RemoveAt(3); // esdVtx created via copy construct
920 delete v0objects.RemoveAt(3); // esdVtx created via copy construct
924 v0->GetXYZ(pos[0], pos[1], pos[2]);
926 if (!fOldESDformat) {
927 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
928 v0->GetPosCov(covVtx);
931 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
936 new(Vertices()[fNumberOfVertices++]) AliAODVertex(pos,
942 fPrimaryVertex->AddDaughter(vV0);
945 // Add the positive tracks from the V0
948 esdV0Pos->GetPxPyPz(momPos);
949 esdV0Pos->GetXYZ(pos);
950 esdV0Pos->GetCovarianceXYZPxPyPz(covTr);
951 esdV0Pos->GetESDpid(pid);
953 const AliESDVertex *vtx = esd.GetPrimaryVertex();
955 if (!fUsedTrack[posFromV0]) {
956 fUsedTrack[posFromV0] = kTRUE;
957 UInt_t selectInfo = 0;
958 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);
959 if(fMChandler)fMChandler->SelectParticle(esdV0Pos->GetLabel());
960 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdV0Pos->GetID(),
961 esdV0Pos->GetLabel(),
967 (Short_t)esdV0Pos->GetSign(),
968 esdV0Pos->GetITSClusterMap(),
971 kTRUE, // check if this is right
972 vtx->UsesTrack(esdV0Pos->GetID()),
973 AliAODTrack::kSecondary,
975 aodTrack->SetTPCFitMap(esdV0Pos->GetTPCFitMap());
976 aodTrack->SetTPCClusterMap(esdV0Pos->GetTPCClusterMap());
977 aodTrack->SetTPCSharedMap (esdV0Pos->GetTPCSharedMap());
978 aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Pos));
979 aodTrack->SetTPCPointsF(esdV0Pos->GetTPCNclsF());
980 aodTrack->SetTPCNCrossedRows(UShort_t(esdV0Pos->GetTPCCrossedRows()));
981 aodTrack->SetIntegratedLength(esdV0Pos->GetIntegratedLength());
982 fAODTrackRefs->AddAt(aodTrack,posFromV0);
983 // if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());
984 if (esdV0Pos->GetSign() > 0) ++fNumberOfPositiveTracks;
985 aodTrack->ConvertAliPIDtoAODPID();
986 aodTrack->SetFlags(esdV0Pos->GetStatus());
987 SetAODPID(esdV0Pos,aodTrack,detpid);
990 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(posFromV0));
991 // if (fDebug > 0) printf("-------------------Bo pos track from refArray pt %.3f \n",aodTrack->Pt());
993 vV0->AddDaughter(aodTrack);
995 // Add the negative tracks from the V0
997 esdV0Neg->GetPxPyPz(momNeg);
998 esdV0Neg->GetXYZ(pos);
999 esdV0Neg->GetCovarianceXYZPxPyPz(covTr);
1000 esdV0Neg->GetESDpid(pid);
1002 if (!fUsedTrack[negFromV0]) {
1003 fUsedTrack[negFromV0] = kTRUE;
1004 UInt_t selectInfo = 0;
1005 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);
1006 if(fMChandler)fMChandler->SelectParticle(esdV0Neg->GetLabel());
1007 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdV0Neg->GetID(),
1008 esdV0Neg->GetLabel(),
1014 (Short_t)esdV0Neg->GetSign(),
1015 esdV0Neg->GetITSClusterMap(),
1018 kTRUE, // check if this is right
1019 vtx->UsesTrack(esdV0Neg->GetID()),
1020 AliAODTrack::kSecondary,
1022 aodTrack->SetTPCFitMap(esdV0Neg->GetTPCFitMap());
1023 aodTrack->SetTPCClusterMap(esdV0Neg->GetTPCClusterMap());
1024 aodTrack->SetTPCSharedMap (esdV0Neg->GetTPCSharedMap());
1025 aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Neg));
1026 aodTrack->SetTPCPointsF(esdV0Neg->GetTPCNclsF());
1027 aodTrack->SetTPCNCrossedRows(UShort_t(esdV0Neg->GetTPCCrossedRows()));
1028 aodTrack->SetIntegratedLength(esdV0Neg->GetIntegratedLength());
1029 fAODTrackRefs->AddAt(aodTrack,negFromV0);
1030 // if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());
1031 if (esdV0Neg->GetSign() > 0) ++fNumberOfPositiveTracks;
1032 aodTrack->ConvertAliPIDtoAODPID();
1033 aodTrack->SetFlags(esdV0Neg->GetStatus());
1034 SetAODPID(esdV0Neg,aodTrack,detpid);
1037 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(negFromV0));
1038 // if (fDebug > 0) printf("-------------------Bo neg track from refArray pt %.3f \n",aodTrack->Pt());
1040 vV0->AddDaughter(aodTrack);
1043 // Add the V0 the V0 array as well
1045 Double_t dcaV0Daughters = v0->GetDcaV0Daughters();
1046 Double_t dcaV0ToPrimVertex = v0->GetD(esd.GetPrimaryVertex()->GetX(),
1047 esd.GetPrimaryVertex()->GetY(),
1048 esd.GetPrimaryVertex()->GetZ());
1050 v0->GetPPxPyPz(momPosAtV0vtx[0],momPosAtV0vtx[1],momPosAtV0vtx[2]);
1051 v0->GetNPxPyPz(momNegAtV0vtx[0],momNegAtV0vtx[1],momNegAtV0vtx[2]);
1053 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = DCA in (x,y) for Pos and ..[1] = Neg
1054 dcaDaughterToPrimVertex[0] = TMath::Abs(esdV0Pos->GetD( esd.GetPrimaryVertex()->GetX(),
1055 esd.GetPrimaryVertex()->GetY(),
1056 esd.GetMagneticField()) );
1057 dcaDaughterToPrimVertex[1] = TMath::Abs(esdV0Neg->GetD( esd.GetPrimaryVertex()->GetX(),
1058 esd.GetPrimaryVertex()->GetY(),
1059 esd.GetMagneticField()) );
1061 AliAODv0* aodV0 = new(V0s()[fNumberOfV0s++]) AliAODv0(vV0,
1066 dcaDaughterToPrimVertex);
1068 // set the aod v0 on-the-fly status
1069 aodV0->SetOnFlyStatus(v0->GetOnFlyStatus());
1070 }//End of loop on V0s
1072 V0s().Expand(fNumberOfV0s);
1075 //______________________________________________________________________________
1076 void AliAnalysisTaskESDfilter::ConvertTPCOnlyTracks(const AliESDEvent& esd)
1078 // Convert TPC only tracks
1079 // Here we have wo hybrid appraoch to remove fakes
1080 // ******* ITSTPC ********
1081 // Uses a cut on the ITS properties to select global tracks
1082 // which are than marked as HybdridITSTPC for the remainder
1083 // the TPC only tracks are flagged as HybridITSTPConly.
1084 // Note, in order not to get fakes back in the TPC cuts, one needs
1085 // two "ITS" cuts one tight (1) (to throw out fakes) and one lose (2) (to NOT flag the trakcs in the TPC only)
1086 // using cut number (3)
1087 // so fHybridFilterMask == (1)|(2) fTPCFilterMask = (3), Usercode needs to slect with mask = (1)|(3) and track->IsHybridITSTPC()
1088 // ******* TPC ********
1089 // 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
1090 // 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
1092 AliCodeTimerAuto("",0);
1094 // Loop over the tracks and extract and mask out all aod tracks that pass the selections for AODt racks
1095 for(int it = 0;it < fNumberOfTracks;++it)
1097 AliAODTrack *tr = (AliAODTrack*)(Tracks().At(it));
1099 UInt_t map = tr->GetFilterMap();
1100 if(map&fTPCConstrainedFilterMask){
1101 // we only reset the track select ionfo, no deletion...
1102 tr->SetFilterMap(map&~fTPCConstrainedFilterMask);
1104 if(map&fHybridFilterMaskTPCCG){
1105 // this is one part of the hybrid tracks
1106 // the others not passing the selection will be TPC only selected below
1107 tr->SetIsHybridTPCConstrainedGlobal(kTRUE);
1110 // Loop over the ESD trcks and pick out the tracks passing TPC only cuts
1113 const AliESDVertex *vtxSPD = esd.GetPrimaryVertexSPD();
1114 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1116 Double_t pos[3] = { 0. };
1117 Double_t covTr[21]={0.};
1118 Double_t pid[10]={0.};
1121 Double_t p[3] = { 0. };
1123 Double_t pDCA[3] = { 0. }; // momentum at DCA
1124 Double_t rDCA[3] = { 0. }; // position at DCA
1125 Float_t dDCA[2] = {0.}; // DCA to the vertex d and z
1126 Float_t cDCA[3] = {0.}; // covariance of impact parameters
1129 AliAODTrack* aodTrack(0x0);
1130 // AliAODPid* detpid(0x0);
1132 // account for change in pT after the constraint
1133 Float_t ptMax = 1E10;
1135 for(int i = 0;i<32;i++){
1136 if(fTPCConstrainedFilterMask&(1<<i)){
1137 AliESDtrackCuts*cuts = (AliESDtrackCuts*)fTrackFilter->GetCuts()->At(i);
1138 Float_t tmp1= 0,tmp2 = 0;
1139 cuts->GetPtRange(tmp1,tmp2);
1140 if(tmp1>ptMin)ptMin=tmp1;
1141 if(tmp2<ptMax)ptMax=tmp2;
1145 for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack)
1147 AliESDtrack* esdTrack = esd.GetTrack(nTrack); //carefull do not modify it othwise need to work with a copy
1149 UInt_t selectInfo = 0;
1150 Bool_t isHybridITSTPC = false;
1154 selectInfo = fTrackFilter->IsSelected(esdTrack);
1157 if(!(selectInfo&fHybridFilterMaskTPCCG)){
1158 // not already selected tracks, use second part of hybrid tracks
1159 isHybridITSTPC = true;
1160 // too save space one could only store these...
1163 selectInfo &= fTPCConstrainedFilterMask;
1164 if (!selectInfo)continue;
1165 if (fWriteHybridTPCCOnly&&!isHybridITSTPC)continue; // write only complementary tracks
1166 // create a tpc only tracl
1167 AliESDtrack *track = AliESDtrackCuts::GetTPCOnlyTrack(const_cast<AliESDEvent*>(&esd),esdTrack->GetID());
1168 if(!track) continue;
1172 // only constrain tracks above threshold
1173 AliExternalTrackParam exParam;
1174 // take the B-field from the ESD, no 3D fieldMap available at this point
1175 Bool_t relate = false;
1176 relate = track->RelateToVertexTPC(vtxSPD,esd.GetMagneticField(),kVeryBig,&exParam);
1181 // fetch the track parameters at the DCA (unconstraint)
1182 if(track->GetTPCInnerParam()){
1183 track->GetTPCInnerParam()->GetPxPyPz(pDCA);
1184 track->GetTPCInnerParam()->GetXYZ(rDCA);
1186 // get the DCA to the vertex:
1187 track->GetImpactParametersTPC(dDCA,cDCA);
1188 // set the constrained parameters to the track
1189 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
1192 track->GetPxPyPz(p);
1194 Float_t pT = track->Pt();
1195 if(pT<ptMin||pT>ptMax){
1204 track->GetCovarianceXYZPxPyPz(covTr);
1205 esdTrack->GetESDpid(pid);// original PID
1207 if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
1208 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack((track->GetID()+1)*-1,
1215 (Short_t)track->GetSign(),
1216 track->GetITSClusterMap(),
1219 kTRUE, // check if this is right
1220 vtx->UsesTrack(track->GetID()),
1221 AliAODTrack::kPrimary,
1223 aodTrack->SetIsHybridTPCConstrainedGlobal(isHybridITSTPC);
1224 aodTrack->SetTPCFitMap(track->GetTPCFitMap());
1225 aodTrack->SetTPCClusterMap(track->GetTPCClusterMap());
1226 aodTrack->SetTPCSharedMap (track->GetTPCSharedMap());
1227 aodTrack->SetIsTPCConstrained(kTRUE);
1228 aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack)); // original track
1229 // set the DCA values to the AOD track
1230 aodTrack->SetPxPyPzAtDCA(pDCA[0],pDCA[1],pDCA[2]);
1231 aodTrack->SetXYAtDCA(rDCA[0],rDCA[1]);
1232 aodTrack->SetDCA(dDCA[0],dDCA[1]);
1234 aodTrack->SetFlags(track->GetStatus());
1235 aodTrack->SetTPCPointsF(track->GetTPCNclsF());
1236 aodTrack->SetTPCNCrossedRows(UShort_t(track->GetTPCCrossedRows()));
1237 aodTrack->SetIntegratedLength(track->GetIntegratedLength());
1239 //Perform progagation of tracks if needed
1240 if(fDoPropagateTrackToEMCal) PropagateTrackToEMCal(esdTrack);
1241 aodTrack->SetTrackPhiEtaPtOnEMCal(esdTrack->GetTrackPhiOnEMCal(),esdTrack->GetTrackEtaOnEMCal(),esdTrack->GetTrackPtOnEMCal());
1243 // do not duplicate PID information
1244 // aodTrack->ConvertAliPIDtoAODPID();
1245 // SetAODPID(esdTrack,aodTrack,detpid);
1248 } // end of loop on tracks
1252 //______________________________________________________________________________
1253 void AliAnalysisTaskESDfilter::ConvertGlobalConstrainedTracks(const AliESDEvent& esd)
1256 // Here we have the option to store the complement from global constraint information
1257 // to tracks passing tight cuts (1) in order not to get fakes back in, one needs
1258 // two sets of cuts one tight (1) (to throw out fakes) and one lose (2) (fakes/bad tracks would pass (2) but not (1))
1259 // using cut number (3) selects the tracks that complement (1) e.g. tracks witout ITS refit or cluster requirement
1262 AliCodeTimerAuto("",0);
1264 // Loop over the tracks and extract and mask out all aod tracks that pass the selections for AODt racks
1265 for(int it = 0;it < fNumberOfTracks;++it)
1267 AliAODTrack *tr = (AliAODTrack*)(Tracks().At(it));
1269 UInt_t map = tr->GetFilterMap();
1270 if(map&fGlobalConstrainedFilterMask){
1271 // we only reset the track select info, no deletion...
1272 // mask reset mask in case track is already taken
1273 tr->SetFilterMap(map&~fGlobalConstrainedFilterMask);
1275 if(map&fHybridFilterMaskGCG){
1276 // this is one part of the hybrid tracks
1277 // the others not passing the selection will be the ones selected below
1278 tr->SetIsHybridGlobalConstrainedGlobal(kTRUE);
1281 // Loop over the ESD trcks and pick out the tracks passing the GlobalConstraint cuts
1284 Double_t pos[3] = { 0. };
1285 Double_t covTr[21]={0.};
1286 Double_t pid[10]={0.};
1287 Double_t p[3] = { 0. };
1289 Double_t pDCA[3] = { 0. }; // momentum at DCA
1290 Double_t rDCA[3] = { 0. }; // position at DCA
1291 Float_t dDCA[2] = {0.}; // DCA to the vertex d and z
1292 Float_t cDCA[3] = {0.}; // covariance of impact parameters
1295 AliAODTrack* aodTrack(0x0);
1296 AliAODPid* detpid(0x0);
1297 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1299 // account for change in pT after the constraint
1300 Float_t ptMax = 1E10;
1302 for(int i = 0;i<32;i++){
1303 if(fGlobalConstrainedFilterMask&(1<<i)){
1304 AliESDtrackCuts*cuts = (AliESDtrackCuts*)fTrackFilter->GetCuts()->At(i);
1305 Float_t tmp1= 0,tmp2 = 0;
1306 cuts->GetPtRange(tmp1,tmp2);
1307 if(tmp1>ptMin)ptMin=tmp1;
1308 if(tmp2<ptMax)ptMax=tmp2;
1314 for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack)
1316 AliESDtrack* esdTrack = esd.GetTrack(nTrack); //carefull do not modify it othwise need to work with a copy
1317 const AliExternalTrackParam * exParamGC = esdTrack->GetConstrainedParam();
1318 if(!exParamGC)continue;
1320 UInt_t selectInfo = 0;
1321 Bool_t isHybridGC = false;
1326 selectInfo = fTrackFilter->IsSelected(esdTrack);
1330 if(!(selectInfo&fHybridFilterMaskGCG))isHybridGC = true;
1331 if (fWriteHybridGCOnly&&!isHybridGC)continue; // write only complementary tracks
1333 selectInfo &= fGlobalConstrainedFilterMask;
1334 if (!selectInfo)continue;
1335 // fetch the track parameters at the DCA (unconstrained)
1336 esdTrack->GetPxPyPz(pDCA);
1337 esdTrack->GetXYZ(rDCA);
1338 // get the DCA to the vertex:
1339 esdTrack->GetImpactParameters(dDCA,cDCA);
1341 if (!esdTrack->GetConstrainedPxPyPz(p)) continue;
1344 Float_t pT = exParamGC->Pt();
1345 if(pT<ptMin||pT>ptMax){
1350 esdTrack->GetConstrainedXYZ(pos);
1351 exParamGC->GetCovarianceXYZPxPyPz(covTr);
1352 esdTrack->GetESDpid(pid);
1353 if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
1354 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack((esdTrack->GetID()+1)*-1,
1355 esdTrack->GetLabel(),
1361 (Short_t)esdTrack->GetSign(),
1362 esdTrack->GetITSClusterMap(),
1365 kTRUE, // check if this is right
1366 vtx->UsesTrack(esdTrack->GetID()),
1367 AliAODTrack::kPrimary,
1369 aodTrack->SetIsHybridGlobalConstrainedGlobal(isHybridGC);
1370 aodTrack->SetIsGlobalConstrained(kTRUE);
1371 aodTrack->SetTPCFitMap(esdTrack->GetTPCFitMap());
1372 aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());
1373 aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());
1374 aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));
1377 // set the DCA values to the AOD track
1378 aodTrack->SetPxPyPzAtDCA(pDCA[0],pDCA[1],pDCA[2]);
1379 aodTrack->SetXYAtDCA(rDCA[0],rDCA[1]);
1380 aodTrack->SetDCA(dDCA[0],dDCA[1]);
1382 aodTrack->SetFlags(esdTrack->GetStatus());
1383 aodTrack->SetTPCPointsF(esdTrack->GetTPCNclsF());
1384 aodTrack->SetTPCNCrossedRows(UShort_t(esdTrack->GetTPCCrossedRows()));
1385 aodTrack->SetIntegratedLength(esdTrack->GetIntegratedLength());
1388 // only copy AOD information for hybrid, no duplicate information
1389 aodTrack->ConvertAliPIDtoAODPID();
1390 SetAODPID(esdTrack,aodTrack,detpid);
1393 //Perform progagation of tracks if needed
1394 if(fDoPropagateTrackToEMCal) PropagateTrackToEMCal(esdTrack);
1395 aodTrack->SetTrackPhiEtaPtOnEMCal(esdTrack->GetTrackPhiOnEMCal(),esdTrack->GetTrackEtaOnEMCal(),esdTrack->GetTrackPtOnEMCal());
1396 } // end of loop on tracks
1401 //______________________________________________________________________________
1402 void AliAnalysisTaskESDfilter::ConvertTracks(const AliESDEvent& esd)
1404 // Tracks (primary and orphan)
1406 AliCodeTimerAuto("",0);
1408 AliDebug(1,Form("NUMBER OF ESD TRACKS %5d\n", esd.GetNumberOfTracks()));
1410 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1411 Double_t p[3] = { 0. };
1412 Double_t pos[3] = { 0. };
1413 Double_t covTr[21] = { 0. };
1414 Double_t pid[10] = { 0. };
1415 AliAODTrack* aodTrack(0x0);
1416 AliAODPid* detpid(0x0);
1418 for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack)
1420 if (fUsedTrack[nTrack]) continue;
1422 AliESDtrack *esdTrack = esd.GetTrack(nTrack);
1423 UInt_t selectInfo = 0;
1427 selectInfo = fTrackFilter->IsSelected(esdTrack);
1428 if (!selectInfo && !vtx->UsesTrack(esdTrack->GetID())) continue;
1432 esdTrack->GetPxPyPz(p);
1433 esdTrack->GetXYZ(pos);
1434 esdTrack->GetCovarianceXYZPxPyPz(covTr);
1435 esdTrack->GetESDpid(pid);
1436 if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
1437 fPrimaryVertex->AddDaughter(aodTrack =
1438 new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrack->GetID(),
1439 esdTrack->GetLabel(),
1445 (Short_t)esdTrack->GetSign(),
1446 esdTrack->GetITSClusterMap(),
1449 kTRUE, // check if this is right
1450 vtx->UsesTrack(esdTrack->GetID()),
1451 AliAODTrack::kPrimary,
1454 aodTrack->SetTPCFitMap(esdTrack->GetTPCFitMap());
1455 aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());
1456 aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());
1457 aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));
1458 aodTrack->SetTPCPointsF(esdTrack->GetTPCNclsF());
1459 aodTrack->SetTPCNCrossedRows(UShort_t(esdTrack->GetTPCCrossedRows()));
1460 aodTrack->SetIntegratedLength(esdTrack->GetIntegratedLength());
1461 if(esdTrack->IsEMCAL()) aodTrack->SetEMCALcluster(esdTrack->GetEMCALcluster());
1462 if(esdTrack->IsPHOS()) aodTrack->SetPHOScluster(esdTrack->GetPHOScluster());
1464 //Perform progagation of tracks if needed
1465 if(fDoPropagateTrackToEMCal) PropagateTrackToEMCal(esdTrack);
1466 aodTrack->SetTrackPhiEtaPtOnEMCal(esdTrack->GetTrackPhiOnEMCal(),esdTrack->GetTrackEtaOnEMCal(),esdTrack->GetTrackPtOnEMCal());
1468 fAODTrackRefs->AddAt(aodTrack, nTrack);
1471 if (esdTrack->GetSign() > 0) ++fNumberOfPositiveTracks;
1472 aodTrack->SetFlags(esdTrack->GetStatus());
1473 aodTrack->ConvertAliPIDtoAODPID();
1474 SetAODPID(esdTrack,aodTrack,detpid);
1475 } // end of loop on tracks
1478 //______________________________________________________________________________
1479 void AliAnalysisTaskESDfilter::PropagateTrackToEMCal(AliESDtrack *esdTrack)
1481 Double_t trkPos[3] = {0.,0.,0.};
1482 Double_t EMCalEta=-999, EMCalPhi=-999, EMCalPt=-999;
1483 Double_t trkphi = esdTrack->Phi()*TMath::RadToDeg();
1484 if(TMath::Abs(esdTrack->Eta())<0.9 && trkphi > 10 && trkphi < 250 )
1486 AliExternalTrackParam *trkParam = const_cast<AliExternalTrackParam*>(esdTrack->GetInnerParam());
1489 AliExternalTrackParam trkParamTmp(*trkParam);
1490 if(AliTrackerBase::PropagateTrackToBxByBz(&trkParamTmp, fEMCalSurfaceDistance, esdTrack->GetMass(), 20, kTRUE, 0.8, -1))
1492 trkParamTmp.GetXYZ(trkPos);
1493 TVector3 trkPosVec(trkPos[0],trkPos[1],trkPos[2]);
1494 EMCalEta = trkPosVec.Eta();
1495 EMCalPhi = trkPosVec.Phi();
1496 EMCalPt = trkParamTmp.Pt();
1497 if(EMCalPhi<0) EMCalPhi += 2*TMath::Pi();
1498 esdTrack->SetTrackPhiEtaPtOnEMCal(EMCalPhi,EMCalEta,EMCalPt);
1504 //______________________________________________________________________________
1505 void AliAnalysisTaskESDfilter::ConvertPmdClusters(const AliESDEvent& esd)
1507 // Convert PMD Clusters
1508 AliCodeTimerAuto("",0);
1509 Int_t jPmdClusters=0;
1510 // Access to the AOD container of PMD clusters
1511 TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
1512 for (Int_t iPmd = 0; iPmd < esd.GetNumberOfPmdTracks(); ++iPmd) {
1513 // file pmd clusters, to be revised!
1514 AliESDPmdTrack *pmdTrack = esd.GetPmdTrack(iPmd);
1517 Double_t posPmd[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ()};
1518 Double_t pidPmd[13] = { 0.}; // to be revised!
1520 // assoc cluster not set
1521 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), posPmd, pidPmd);
1526 //______________________________________________________________________________
1527 void AliAnalysisTaskESDfilter::ConvertCaloClusters(const AliESDEvent& esd)
1529 // Convert Calorimeter Clusters
1530 AliCodeTimerAuto("",0);
1532 // Access to the AOD container of clusters
1533 TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
1536 for (Int_t iClust=0; iClust<esd.GetNumberOfCaloClusters(); ++iClust) {
1538 AliESDCaloCluster * cluster = esd.GetCaloCluster(iClust);
1540 Int_t id = cluster->GetID();
1541 Int_t nLabel = cluster->GetNLabels();
1542 Int_t *labels = cluster->GetLabels();
1544 for(int i = 0;i < nLabel;++i){
1545 if(fMChandler)fMChandler->SelectParticle(labels[i]);
1549 Float_t energy = cluster->E();
1550 Float_t posF[3] = { 0.};
1551 cluster->GetPosition(posF);
1553 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
1559 cluster->GetType(),0);
1561 caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
1562 cluster->GetDispersion(),
1563 cluster->GetM20(), cluster->GetM02(),
1564 cluster->GetEmcCpvDistance(),
1565 cluster->GetNExMax(),cluster->GetTOF()) ;
1567 caloCluster->SetPIDFromESD(cluster->GetPID());
1568 caloCluster->SetNCells(cluster->GetNCells());
1569 caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
1570 caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
1572 caloCluster->SetTrackDistance(cluster->GetTrackDx(), cluster->GetTrackDz());
1574 Int_t nMatchCount = 0;
1575 TArrayI* matchedT = cluster->GetTracksMatched();
1576 if (fNumberOfTracks>0 && matchedT && cluster->GetTrackMatchedIndex() >= 0) {
1577 for (Int_t im = 0; im < matchedT->GetSize(); im++) {
1578 Int_t iESDtrack = matchedT->At(im);;
1579 if (fAODTrackRefs->At(iESDtrack) != 0) {
1580 caloCluster->AddTrackMatched((AliAODTrack*)fAODTrackRefs->At(iESDtrack));
1586 caloCluster->SetTrackDistance(-999,-999);
1589 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
1592 //______________________________________________________________________________
1593 void AliAnalysisTaskESDfilter::ConvertCaloTrigger(TString calo, const AliESDEvent& esd)
1595 AliCodeTimerAuto("",0);
1599 AliAODCaloTrigger &aodTrigger = *(AODEvent()->GetCaloTrigger(calo));
1600 AliESDCaloTrigger &esdTrigger = *(esd.GetCaloTrigger(calo));
1602 aodTrigger.Allocate(esdTrigger.GetEntries());
1608 while (esdTrigger.Next()) {
1609 esdTrigger.GetPosition(tmod,tabsId);
1610 esdTrigger.GetAmplitude(a);
1611 aodTrigger.Add(tmod,tabsId,a,0.,(Int_t*)NULL,0,0,0);
1617 AliAODHandler *aodHandler = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
1621 TTree *aodTree = aodHandler->GetTree();
1625 Int_t *type = esd.GetCaloTriggerType();
1627 for (Int_t i = 0; i < 15; i++)
1629 aodTree->GetUserInfo()->Add(new TParameter<int>(Form("EMCALCaloTrigger%d",i), type[i]));
1634 AliAODCaloTrigger &aodTrigger = *(AODEvent()->GetCaloTrigger(calo));
1636 AliESDCaloTrigger &esdTrigger = *(esd.GetCaloTrigger(calo));
1638 aodTrigger.Allocate(esdTrigger.GetEntries());
1641 while (esdTrigger.Next())
1643 Int_t px, py, ts, nTimes, times[10], b;
1646 esdTrigger.GetPosition(px, py);
1648 esdTrigger.GetAmplitude(a);
1649 esdTrigger.GetTime(t);
1651 esdTrigger.GetL0Times(times);
1652 esdTrigger.GetNL0Times(nTimes);
1654 esdTrigger.GetL1TimeSum(ts);
1656 esdTrigger.GetTriggerBits(b);
1658 aodTrigger.Add(px, py, a, t, times, nTimes, ts, b);
1661 for (int i = 0; i < 4; i++) aodTrigger.SetL1Threshold(i, esdTrigger.GetL1Threshold(i));
1665 esdTrigger.GetL1V0(0),
1666 esdTrigger.GetL1V0(1)
1669 aodTrigger.SetL1V0(v0);
1670 aodTrigger.SetL1FrameMask(esdTrigger.GetL1FrameMask());
1673 //______________________________________________________________________________
1674 void AliAnalysisTaskESDfilter::ConvertEMCALCells(const AliESDEvent& esd)
1676 // Convert EMCAL Cells
1677 AliCodeTimerAuto("",0);
1678 // fill EMCAL cell info
1679 if (esd.GetEMCALCells()) { // protection against missing ESD information
1680 AliESDCaloCells &esdEMcells = *(esd.GetEMCALCells());
1681 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
1683 AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
1684 aodEMcells.CreateContainer(nEMcell);
1685 aodEMcells.SetType(AliAODCaloCells::kEMCALCell);
1686 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
1687 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell),
1688 esdEMcells.GetTime(iCell), esdEMcells.GetMCLabel(iCell), esdEMcells.GetEFraction(iCell));
1694 //______________________________________________________________________________
1695 void AliAnalysisTaskESDfilter::ConvertPHOSCells(const AliESDEvent& esd)
1697 // Convert PHOS Cells
1698 AliCodeTimerAuto("",0);
1699 // fill PHOS cell info
1700 if (esd.GetPHOSCells()) { // protection against missing ESD information
1701 AliESDCaloCells &esdPHcells = *(esd.GetPHOSCells());
1702 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
1704 AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
1705 aodPHcells.CreateContainer(nPHcell);
1706 aodPHcells.SetType(AliAODCaloCells::kPHOSCell);
1707 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
1708 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell),
1709 esdPHcells.GetTime(iCell), esdPHcells.GetMCLabel(iCell), esdPHcells.GetEFraction(iCell));
1715 //______________________________________________________________________________
1716 void AliAnalysisTaskESDfilter::ConvertTracklets(const AliESDEvent& esd)
1719 AliCodeTimerAuto("",0);
1721 AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
1722 const AliMultiplicity *mult = esd.GetMultiplicity();
1724 if (mult->GetNumberOfTracklets()>0) {
1725 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
1727 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
1729 fMChandler->SelectParticle(mult->GetLabel(n, 0));
1730 fMChandler->SelectParticle(mult->GetLabel(n, 1));
1732 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0),mult->GetLabel(n, 1));
1736 //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
1740 //______________________________________________________________________________
1741 void AliAnalysisTaskESDfilter::ConvertKinks(const AliESDEvent& esd)
1743 AliCodeTimerAuto("",0);
1745 // Kinks: it is a big mess the access to the information in the kinks
1746 // The loop is on the tracks in order to find the mother and daugther of each kink
1748 Double_t covTr[21]={0.};
1749 Double_t pid[10]={0.};
1750 AliAODPid* detpid(0x0);
1752 fNumberOfKinks = esd.GetNumberOfKinks();
1754 const AliESDVertex* vtx = esd.GetPrimaryVertex();
1756 for (Int_t iTrack=0; iTrack<esd.GetNumberOfTracks(); ++iTrack)
1758 AliESDtrack * esdTrack = esd.GetTrack(iTrack);
1760 Int_t ikink = esdTrack->GetKinkIndex(0);
1762 if (ikink && fNumberOfKinks) {
1763 // Negative kink index: mother, positive: daughter
1765 // Search for the second track of the kink
1767 for (Int_t jTrack = iTrack+1; jTrack<esd.GetNumberOfTracks(); ++jTrack) {
1769 AliESDtrack * esdTrack1 = esd.GetTrack(jTrack);
1771 Int_t jkink = esdTrack1->GetKinkIndex(0);
1773 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
1775 // The two tracks are from the same kink
1777 if (fUsedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
1780 Int_t idaughter = -1;
1782 if (ikink<0 && jkink>0) {
1787 else if (ikink>0 && jkink<0) {
1793 // cerr << "Error: Wrong combination of kink indexes: "
1794 // << ikink << " " << jkink << endl;
1798 // Add the mother track if it passed primary track selection cuts
1800 AliAODTrack * mother = NULL;
1802 UInt_t selectInfo = 0;
1804 selectInfo = fTrackFilter->IsSelected(esd.GetTrack(imother));
1805 if (!selectInfo) continue;
1808 if (!fUsedTrack[imother]) {
1810 fUsedTrack[imother] = kTRUE;
1812 AliESDtrack *esdTrackM = esd.GetTrack(imother);
1813 Double_t p[3] = { 0. };
1814 Double_t pos[3] = { 0. };
1815 esdTrackM->GetPxPyPz(p);
1816 esdTrackM->GetXYZ(pos);
1817 esdTrackM->GetCovarianceXYZPxPyPz(covTr);
1818 esdTrackM->GetESDpid(pid);
1819 if(fMChandler)fMChandler->SelectParticle(esdTrackM->GetLabel());
1821 new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrackM->GetID(),
1822 esdTrackM->GetLabel(),
1828 (Short_t)esdTrackM->GetSign(),
1829 esdTrackM->GetITSClusterMap(),
1832 kTRUE, // check if this is right
1833 vtx->UsesTrack(esdTrack->GetID()),
1834 AliAODTrack::kPrimary,
1836 mother->SetTPCFitMap(esdTrackM->GetTPCFitMap());
1837 mother->SetTPCClusterMap(esdTrackM->GetTPCClusterMap());
1838 mother->SetTPCSharedMap (esdTrackM->GetTPCSharedMap());
1839 mother->SetChi2perNDF(Chi2perNDF(esdTrackM));
1840 mother->SetTPCPointsF(esdTrackM->GetTPCNclsF());
1841 mother->SetTPCNCrossedRows(UShort_t(esdTrackM->GetTPCCrossedRows()));
1842 mother->SetIntegratedLength(esdTrackM->GetIntegratedLength());
1844 fAODTrackRefs->AddAt(mother, imother);
1846 if (esdTrackM->GetSign() > 0) ++fNumberOfPositiveTracks;
1847 mother->SetFlags(esdTrackM->GetStatus());
1848 mother->ConvertAliPIDtoAODPID();
1849 fPrimaryVertex->AddDaughter(mother);
1850 mother->ConvertAliPIDtoAODPID();
1851 SetAODPID(esdTrackM,mother,detpid);
1854 // cerr << "Error: event " << esd.GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
1855 // << " track " << imother << " has already been used!" << endl;
1858 // Add the kink vertex
1859 AliESDkink * kink = esd.GetKink(TMath::Abs(ikink)-1);
1861 AliAODVertex * vkink =
1862 new(Vertices()[fNumberOfVertices++]) AliAODVertex(kink->GetPosition(),
1866 esdTrack->GetID(), // This is the track ID of the mother's track!
1867 AliAODVertex::kKink);
1868 // Add the daughter track
1870 AliAODTrack * daughter = NULL;
1872 if (!fUsedTrack[idaughter]) {
1874 fUsedTrack[idaughter] = kTRUE;
1876 AliESDtrack *esdTrackD = esd.GetTrack(idaughter);
1877 Double_t p[3] = { 0. };
1878 Double_t pos[3] = { 0. };
1880 esdTrackD->GetPxPyPz(p);
1881 esdTrackD->GetXYZ(pos);
1882 esdTrackD->GetCovarianceXYZPxPyPz(covTr);
1883 esdTrackD->GetESDpid(pid);
1885 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);
1886 if(fMChandler)fMChandler->SelectParticle(esdTrackD->GetLabel());
1888 new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrackD->GetID(),
1889 esdTrackD->GetLabel(),
1895 (Short_t)esdTrackD->GetSign(),
1896 esdTrackD->GetITSClusterMap(),
1899 kTRUE, // check if this is right
1900 vtx->UsesTrack(esdTrack->GetID()),
1901 AliAODTrack::kSecondary,
1903 daughter->SetTPCFitMap(esdTrackD->GetTPCFitMap());
1904 daughter->SetTPCClusterMap(esdTrackD->GetTPCClusterMap());
1905 daughter->SetTPCSharedMap (esdTrackD->GetTPCSharedMap());
1906 daughter->SetTPCPointsF(esdTrackD->GetTPCNclsF());
1907 daughter->SetTPCNCrossedRows(UShort_t(esdTrackD->GetTPCCrossedRows()));
1908 daughter->SetIntegratedLength(esdTrackD->GetIntegratedLength());
1909 fAODTrackRefs->AddAt(daughter, idaughter);
1911 if (esdTrackD->GetSign() > 0) ++fNumberOfPositiveTracks;
1912 daughter->SetFlags(esdTrackD->GetStatus());
1913 daughter->ConvertAliPIDtoAODPID();
1914 vkink->AddDaughter(daughter);
1915 daughter->ConvertAliPIDtoAODPID();
1916 SetAODPID(esdTrackD,daughter,detpid);
1919 // cerr << "Error: event " << esd.GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
1920 // << " track " << idaughter << " has already been used!" << endl;
1928 //______________________________________________________________________________
1929 void AliAnalysisTaskESDfilter::ConvertPrimaryVertices(const AliESDEvent& esd)
1931 AliCodeTimerAuto("",0);
1933 // Access to the AOD container of vertices
1934 fNumberOfVertices = 0;
1936 Double_t pos[3] = { 0. };
1937 Double_t covVtx[6] = { 0. };
1939 // Add primary vertex. The primary tracks will be defined
1940 // after the loops on the composite objects (V0, cascades, kinks)
1941 const AliESDVertex *vtx = esd.GetPrimaryVertex();
1943 vtx->GetXYZ(pos); // position
1944 vtx->GetCovMatrix(covVtx); //covariance matrix
1946 fPrimaryVertex = new(Vertices()[fNumberOfVertices++])
1947 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
1948 fPrimaryVertex->SetName(vtx->GetName());
1949 fPrimaryVertex->SetTitle(vtx->GetTitle());
1950 fPrimaryVertex->SetBC(vtx->GetBC());
1952 TString vtitle = vtx->GetTitle();
1953 if (!vtitle.Contains("VertexerTracks"))
1954 fPrimaryVertex->SetNContributors(vtx->GetNContributors());
1956 if (fDebug > 0) fPrimaryVertex->Print();
1958 // Add SPD "main" vertex
1959 const AliESDVertex *vtxS = esd.GetPrimaryVertexSPD();
1960 vtxS->GetXYZ(pos); // position
1961 vtxS->GetCovMatrix(covVtx); //covariance matrix
1962 AliAODVertex * mVSPD = new(Vertices()[fNumberOfVertices++])
1963 AliAODVertex(pos, covVtx, vtxS->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainSPD);
1964 mVSPD->SetName(vtxS->GetName());
1965 mVSPD->SetTitle(vtxS->GetTitle());
1966 mVSPD->SetNContributors(vtxS->GetNContributors());
1968 // Add SPD pileup vertices
1969 for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesSPD(); ++iV)
1971 const AliESDVertex *vtxP = esd.GetPileupVertexSPD(iV);
1972 vtxP->GetXYZ(pos); // position
1973 vtxP->GetCovMatrix(covVtx); //covariance matrix
1974 AliAODVertex * pVSPD = new(Vertices()[fNumberOfVertices++])
1975 AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupSPD);
1976 pVSPD->SetName(vtxP->GetName());
1977 pVSPD->SetTitle(vtxP->GetTitle());
1978 pVSPD->SetNContributors(vtxP->GetNContributors());
1979 pVSPD->SetBC(vtxP->GetBC());
1982 // Add TRK pileup vertices
1983 for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesTracks(); ++iV)
1985 const AliESDVertex *vtxP = esd.GetPileupVertexTracks(iV);
1986 vtxP->GetXYZ(pos); // position
1987 vtxP->GetCovMatrix(covVtx); //covariance matrix
1988 AliAODVertex * pVTRK = new(Vertices()[fNumberOfVertices++])
1989 AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupTracks);
1990 pVTRK->SetName(vtxP->GetName());
1991 pVTRK->SetTitle(vtxP->GetTitle());
1992 pVTRK->SetNContributors(vtxP->GetNContributors());
1993 pVTRK->SetBC(vtxP->GetBC());
1996 // Add TPC "main" vertex
1997 const AliESDVertex *vtxT = esd.GetPrimaryVertexTPC();
1998 vtxT->GetXYZ(pos); // position
1999 vtxT->GetCovMatrix(covVtx); //covariance matrix
2000 AliAODVertex * mVTPC = new(Vertices()[fNumberOfVertices++])
2001 AliAODVertex(pos, covVtx, vtxT->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainTPC);
2002 mVTPC->SetName(vtxT->GetName());
2003 mVTPC->SetTitle(vtxT->GetTitle());
2004 mVTPC->SetNContributors(vtxT->GetNContributors());
2009 //______________________________________________________________________________
2010 void AliAnalysisTaskESDfilter::ConvertVZERO(const AliESDEvent& esd)
2012 // Convert VZERO data
2013 AliAODVZERO* vzeroData = AODEvent()->GetVZEROData();
2014 *vzeroData = *(esd.GetVZEROData());
2017 //______________________________________________________________________________
2018 void AliAnalysisTaskESDfilter::ConvertTZERO(const AliESDEvent& esd)
2020 // Convert TZERO data
2021 const AliESDTZERO* esdTzero = esd.GetESDTZERO();
2022 AliAODTZERO* aodTzero = AODEvent()->GetTZEROData();
2024 for (Int_t icase=0; icase<3; icase++){
2025 aodTzero->SetT0TOF( icase, esdTzero->GetT0TOF(icase));
2026 aodTzero->SetT0TOFbest(icase, esdTzero->GetT0TOFbest(icase));
2028 aodTzero->SetBackgroundFlag(esdTzero->GetBackgroundFlag());
2029 aodTzero->SetPileupFlag(esdTzero->GetPileupFlag());
2030 aodTzero->SetSatelliteFlag(esdTzero->GetSatellite());
2032 Float_t rawTime[24];
2033 for(Int_t ipmt=0; ipmt<24; ipmt++)
2034 rawTime[ipmt] = esdTzero->GetTimeFull(ipmt,0);
2036 Int_t idxOfFirstPmtA = -1, idxOfFirstPmtC = -1;
2037 Float_t timeOfFirstPmtA = 9999, timeOfFirstPmtC = 9999;
2038 for(int ipmt=0; ipmt<12; ipmt++){
2039 if( rawTime[ipmt] > -200 && rawTime[ipmt] < timeOfFirstPmtC && rawTime[ipmt]!=0){
2040 timeOfFirstPmtC = rawTime[ipmt];
2041 idxOfFirstPmtC = ipmt;
2044 for(int ipmt=12; ipmt<24; ipmt++){
2045 if( rawTime[ipmt] > -200 && rawTime[ipmt] < timeOfFirstPmtA && rawTime[ipmt]!=0 ){
2046 timeOfFirstPmtA = rawTime[ipmt];
2047 idxOfFirstPmtA = ipmt;
2051 if(idxOfFirstPmtA != -1 && idxOfFirstPmtC != -1){
2052 //speed of light in cm/ns TMath::C()*1e-7
2053 Float_t vertexraw = TMath::C()*1e-7 * (rawTime[idxOfFirstPmtA] - rawTime[idxOfFirstPmtC])/2;
2054 aodTzero->SetT0VertexRaw( vertexraw );
2056 aodTzero->SetT0VertexRaw(99999);
2059 aodTzero->SetT0zVertex(esdTzero->GetT0zVertex());
2062 const Double32_t *amp=esdTzero->GetT0amplitude();
2063 for(int ipmt=0; ipmt<24; ipmt++)
2064 aodTzero->SetAmp(ipmt, amp[ipmt]);
2065 aodTzero->SetAmp(24,esdTzero->GetMultC() );
2066 aodTzero->SetAmp(25,esdTzero->GetMultA() );
2071 //______________________________________________________________________________
2072 void AliAnalysisTaskESDfilter::ConvertZDC(const AliESDEvent& esd)
2075 AliESDZDC* esdZDC = esd.GetZDCData();
2077 const Double_t zem1Energy = esdZDC->GetZEM1Energy();
2078 const Double_t zem2Energy = esdZDC->GetZEM2Energy();
2080 const Double_t *towZNC = esdZDC->GetZNCTowerEnergy();
2081 const Double_t *towZPC = esdZDC->GetZPCTowerEnergy();
2082 const Double_t *towZNA = esdZDC->GetZNATowerEnergy();
2083 const Double_t *towZPA = esdZDC->GetZPATowerEnergy();
2084 const Double_t *towZNCLG = esdZDC->GetZNCTowerEnergyLR();
2085 const Double_t *towZNALG = esdZDC->GetZNATowerEnergyLR();
2087 AliAODZDC* zdcAOD = AODEvent()->GetZDCData();
2089 zdcAOD->SetZEM1Energy(zem1Energy);
2090 zdcAOD->SetZEM2Energy(zem2Energy);
2091 zdcAOD->SetZNCTowers(towZNC, towZNCLG);
2092 zdcAOD->SetZNATowers(towZNA, towZNALG);
2093 zdcAOD->SetZPCTowers(towZPC);
2094 zdcAOD->SetZPATowers(towZPA);
2096 zdcAOD->SetZDCParticipants(esdZDC->GetZDCParticipants(), esdZDC->GetZDCPartSideA(), esdZDC->GetZDCPartSideC());
2097 zdcAOD->SetZDCImpactParameter(esdZDC->GetImpactParameter(), esdZDC->GetImpactParamSideA(),
2098 esdZDC->GetImpactParamSideC());
2099 zdcAOD->SetZDCTDCSum(esdZDC->GetZNTDCSum(0));
2100 zdcAOD->SetZDCTDCDiff(esdZDC->GetZNTDCDiff(0));
2101 if(esdZDC->IsZNChit()) zdcAOD->SetZNCTDC(esdZDC->GetZDCTDCCorrected(10,0));
2102 if(esdZDC->IsZNAhit()) zdcAOD->SetZNATDC(esdZDC->GetZDCTDCCorrected(12,0));
2105 //_______________________________________________________________________________________________________________________________________
2106 Int_t AliAnalysisTaskESDfilter::ConvertHMPID(const AliESDEvent& esd) // clm
2109 // Convtert ESD HMPID info to AOD and return the number of good tracks with HMPID signal.
2110 // We need to return an int since there is no signal counter in the ESD.
2113 AliCodeTimerAuto("",0);
2115 Int_t cntHmpidGoodTracks = 0;
2124 Float_t thetaTrk = 0;
2127 Double_t hmpPid[5]={0};
2128 Double_t hmpMom[3]={0};
2130 TClonesArray &hmpidRings = *(AODEvent()->GetHMPIDrings());
2132 for (Int_t iTrack=0; iTrack<esd.GetNumberOfTracks(); ++iTrack)
2134 if(! esd.GetTrack(iTrack) ) continue;
2136 if(esd.GetTrack(iTrack)->GetHMPIDsignal() > -20 ) { //
2138 (esd.GetTrack(iTrack))->GetHMPIDmip(xMip, yMip, qMip, nphMip); // Get MIP properties
2139 (esd.GetTrack(iTrack))->GetHMPIDtrk(xTrk,yTrk,thetaTrk,phiTrk);
2140 (esd.GetTrack(iTrack))->GetHMPIDpid(hmpPid);
2141 if((esd.GetTrack(iTrack))->GetOuterHmpParam()) (esd.GetTrack(iTrack))->GetOuterHmpPxPyPz(hmpMom);
2143 if(esd.GetTrack(iTrack)->GetHMPIDsignal() == 0 && thetaTrk == 0 && qMip == 0 && nphMip ==0 ) continue; //
2145 new(hmpidRings[cntHmpidGoodTracks++]) AliAODHMPIDrings(
2146 (esd.GetTrack(iTrack))->GetID(), // Unique track id to attach the ring to
2147 1000000*nphMip+qMip, // MIP charge and number of photons
2148 (esd.GetTrack(iTrack))->GetHMPIDcluIdx(), // 1000000*chamber id + cluster idx of the assigned MIP cluster
2149 thetaTrk, // track inclination angle theta
2150 phiTrk, // track inclination angle phi
2151 (esd.GetTrack(iTrack))->GetHMPIDsignal(), // Cherenkov angle
2152 (esd.GetTrack(iTrack))->GetHMPIDoccupancy(), // Occupancy claculated for the given chamber
2153 (esd.GetTrack(iTrack))->GetHMPIDchi2(), // Ring resolution squared
2154 xTrk, // Track x coordinate (LORS)
2155 yTrk, // Track y coordinate (LORS)
2156 xMip, // MIP x coordinate (LORS)
2157 yMip, // MIP y coordinate (LORS)
2158 hmpPid, // PID probablities from ESD, remove later once it is in CombinedPid
2159 hmpMom // Track momentum in HMPID at ring reconstruction
2162 // Printf(Form("+++++++++ yes/no: %d %lf %lf %lf %lf %lf %lf ",(esd.GetTrack(iTrack))->IsHMPID(),thetaTrk, (esd.GetTrack(iTrack))->GetHMPIDchi2(),xTrk, yTrk , xMip, yMip));
2165 }// HMPID signal > -20
2166 }//___esd track loop
2168 return cntHmpidGoodTracks;
2171 //______________________________________________________________________________
2172 void AliAnalysisTaskESDfilter::ConvertESDtoAOD()
2174 // ESD Filter analysis task executed for each event
2176 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
2180 AliCodeTimerAuto("",0);
2182 fOldESDformat = ( esd->GetAliESDOld() != 0x0 );
2184 // Reconstruct cascades and V0 here
2185 if (fIsV0CascadeRecoEnabled) {
2186 esd->ResetCascades();
2189 AliV0vertexer lV0vtxer;
2190 AliCascadeVertexer lCascVtxer;
2192 lV0vtxer.SetCuts(fV0Cuts);
2193 lCascVtxer.SetCuts(fCascadeCuts);
2196 lV0vtxer.Tracks2V0vertices(esd);
2197 lCascVtxer.V0sTracks2CascadeVertices(esd);
2201 fNumberOfTracks = 0;
2202 fNumberOfPositiveTracks = 0;
2204 fNumberOfVertices = 0;
2205 fNumberOfCascades = 0;
2208 AliAODHeader* header = ConvertHeader(*esd);
2210 if ( fIsVZEROEnabled ) ConvertVZERO(*esd);
2211 if ( fIsTZEROEnabled ) ConvertTZERO(*esd);
2213 // Fetch Stack for debuggging if available
2217 fMChandler = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
2220 // loop over events and fill them
2221 // Multiplicity information needed by the header (to be revised!)
2222 Int_t nTracks = esd->GetNumberOfTracks();
2223 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) esd->GetTrack(iTrack)->SetESDEvent(esd);
2225 // Update the header
2227 Int_t nV0s = esd->GetNumberOfV0s();
2228 Int_t nCascades = esd->GetNumberOfCascades();
2229 Int_t nKinks = esd->GetNumberOfKinks();
2230 Int_t nVertices = nV0s + nCascades /*V0 wihtin cascade already counted*/+ nKinks + 1 /* = prim. vtx*/;
2231 Int_t nPileSPDVertices=1+esd->GetNumberOfPileupVerticesSPD(); // also SPD main vertex
2232 Int_t nPileTrkVertices=esd->GetNumberOfPileupVerticesTracks();
2233 nVertices+=nPileSPDVertices;
2234 nVertices+=nPileTrkVertices;
2236 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
2238 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
2239 Int_t nHmpidRings = 0;
2241 AliDebug(1,Form(" NV0=%d NCASCADES=%d NKINKS=%d", nV0s, nCascades, nKinks));
2243 AODEvent()->ResetStd(nTracks, nVertices, nV0s, nCascades, nJets, nCaloClus, nFmdClus, nPmdClus,nHmpidRings);
2247 // RefArray to store a mapping between esd V0 number and newly created AOD-Vertex V0
2248 fAODV0VtxRefs = new TRefArray(nV0s);
2249 // RefArray to store the mapping between esd V0 number and newly created AOD-V0
2250 fAODV0Refs = new TRefArray(nV0s);
2251 // Array to take into account the V0s already added to the AOD (V0 within cascades)
2252 fUsedV0 = new Bool_t[nV0s];
2253 for (Int_t iV0=0; iV0<nV0s; ++iV0) fUsedV0[iV0]=kFALSE;
2258 // RefArray to store the mapping between esd track number and newly created AOD-Track
2260 fAODTrackRefs = new TRefArray(nTracks);
2262 // Array to take into account the tracks already added to the AOD
2263 fUsedTrack = new Bool_t[nTracks];
2264 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) fUsedTrack[iTrack]=kFALSE;
2267 // Array to take into account the kinks already added to the AOD
2270 fUsedKink = new Bool_t[nKinks];
2271 for (Int_t iKink=0; iKink<nKinks; ++iKink) fUsedKink[iKink]=kFALSE;
2274 ConvertPrimaryVertices(*esd);
2276 //setting best TOF PID
2277 AliESDInputHandler* esdH = dynamic_cast<AliESDInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
2279 fESDpid = esdH->GetESDpid();
2281 if (fIsPidOwner && fESDpid){
2286 { //in case of no Tender attached
2287 fESDpid = new AliESDpid;
2288 fIsPidOwner = kTRUE;
2291 if(!esd->GetTOFHeader())
2292 { //protection in case the pass2 LHC10b,c,d have been processed without tender.
2293 Float_t t0spread[10];
2294 Float_t intrinsicTOFres=100; //ps ok for LHC10b,c,d pass2!!
2295 for (Int_t i=0; i<10; i++) t0spread[i] = (TMath::Sqrt(esd->GetSigma2DiamondZ()))/0.03; //0.03 to convert from cm to ps
2296 fESDpid->GetTOFResponse().SetT0resolution(t0spread);
2297 fESDpid->GetTOFResponse().SetTimeResolution(intrinsicTOFres);
2298 // fESDpid->SetTOFResponse(esd, (AliESDpid::EStartTimeType_t)fTimeZeroType);
2299 AliTOFHeader tmpTOFHeader(0,t0spread[0],0,NULL,NULL,NULL,intrinsicTOFres,t0spread[0]);
2300 AODEvent()->SetTOFHeader(&tmpTOFHeader); // write dummy TOF header in AOD
2302 AODEvent()->SetTOFHeader(esd->GetTOFHeader()); // write TOF header in AOD
2305 // if(esd->GetTOFHeader() && fIsPidOwner) fESDpid->SetTOFResponse(esd, (AliESDpid::EStartTimeType_t)fTimeZeroType); //in case of AOD production strating form LHC10e without Tender.
2307 if ( fAreCascadesEnabled ) ConvertCascades(*esd);
2309 if ( fAreV0sEnabled ) ConvertV0s(*esd);
2311 if ( fAreKinksEnabled ) ConvertKinks(*esd);
2313 if ( fAreTracksEnabled ) ConvertTracks(*esd);
2315 // Update number of AOD tracks in header at the end of track loop (M.G.)
2316 header->SetRefMultiplicity(fNumberOfTracks);
2317 header->SetRefMultiplicityPos(fNumberOfPositiveTracks);
2318 header->SetRefMultiplicityNeg(fNumberOfTracks - fNumberOfPositiveTracks);
2320 if ( fTPCConstrainedFilterMask ) ConvertTPCOnlyTracks(*esd);
2321 if( fGlobalConstrainedFilterMask) ConvertGlobalConstrainedTracks(*esd);
2323 if ( fArePmdClustersEnabled ) ConvertPmdClusters(*esd);
2325 if ( fAreCaloClustersEnabled ) ConvertCaloClusters(*esd);
2327 if ( fAreEMCALCellsEnabled )ConvertEMCALCells(*esd);
2329 if ( fArePHOSCellsEnabled )ConvertPHOSCells(*esd);
2331 if ( fAreEMCALTriggerEnabled )ConvertCaloTrigger(TString("EMCAL"), *esd);
2333 if ( fArePHOSTriggerEnabled )ConvertCaloTrigger(TString("PHOS"), *esd);
2335 if ( fAreTrackletsEnabled ) ConvertTracklets(*esd);
2336 if ( fIsZDCEnabled ) ConvertZDC(*esd);
2338 if(fIsHMPIDEnabled) nHmpidRings = ConvertHMPID(*esd);
2340 delete fAODTrackRefs; fAODTrackRefs=0x0;
2341 delete fAODV0VtxRefs; fAODV0VtxRefs=0x0;
2342 delete fAODV0Refs; fAODV0Refs=0x0;
2344 delete[] fUsedTrack; fUsedTrack=0x0;
2345 delete[] fUsedV0; fUsedV0=0x0;
2346 delete[] fUsedKink; fUsedKink=0x0;
2357 //______________________________________________________________________________
2358 void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid)
2361 // Setter for the raw PID detector signals
2364 // Save PID object for candidate electrons
2365 Bool_t pidSave = kFALSE;
2367 Bool_t selectInfo = fTrackFilter->IsSelected((char*) "Electrons");
2368 if (selectInfo) pidSave = kTRUE;
2372 // Tracks passing pt cut
2373 if(esdtrack->Pt()>fHighPthreshold) {
2377 if(esdtrack->Pt()> fPtshape->GetXmin()){
2378 Double_t y = fPtshape->Eval(esdtrack->Pt())/fPtshape->Eval(fHighPthreshold);
2379 if(gRandom->Rndm(0)<1./y){
2383 }//end if p function
2387 if(!aodtrack->GetDetPid()){// prevent memory leak when calling SetAODPID twice for the same track
2388 detpid = new AliAODPid();
2389 SetDetectorRawSignals(detpid,esdtrack);
2390 aodtrack->SetDetPID(detpid);
2395 //______________________________________________________________________________
2396 void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtrack *track)
2399 //assignment of the detector signals (AliXXXesdPID inspired)
2402 AliInfo("no ESD track found. .....exiting");
2406 aodpid->SetTPCmomentum(track->GetTPCmomentum());
2407 aodpid->SetTPCTgl(track->GetTPCTgl());
2408 // const AliExternalTrackParam *in=track->GetInnerParam();
2410 // aodpid->SetTPCmomentum(in->GetP());
2412 // aodpid->SetTPCmomentum(-1.);
2416 aodpid->SetITSsignal(track->GetITSsignal());
2417 Double_t itsdedx[4]; // dE/dx samples for individual ITS layers
2418 track->GetITSdEdxSamples(itsdedx);
2419 aodpid->SetITSdEdxSamples(itsdedx);
2421 aodpid->SetTPCsignal(track->GetTPCsignal());
2422 aodpid->SetTPCsignalN(track->GetTPCsignalN());
2423 if(track->GetTPCdEdxInfo()) aodpid->SetTPCdEdxInfo(track->GetTPCdEdxInfo());
2426 Int_t nslices = track->GetNumberOfTRDslices()*6;
2427 TArrayD trdslices(nslices);
2428 for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) {
2429 for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);
2433 for(Int_t iPl=0;iPl<6;iPl++){
2434 Double_t trdmom=track->GetTRDmomentum(iPl);
2435 aodpid->SetTRDmomentum(iPl,trdmom);
2438 aodpid->SetTRDslices(track->GetNumberOfTRDslices()*6,trdslices.GetArray());
2439 aodpid->SetTRDsignal(track->GetTRDsignal());
2441 //TRD clusters and tracklets
2442 aodpid->SetTRDncls(track->GetTRDncls());
2443 aodpid->SetTRDntrackletsPID(track->GetTRDntrackletsPID());
2445 aodpid->SetTRDChi2(track->GetTRDchi2());
2448 Double_t times[AliPID::kSPECIES]; track->GetIntegratedTimes(times);
2449 aodpid->SetIntegratedTimes(times);
2451 // Float_t tzeroTrack = fESDpid->GetTOFResponse().GetStartTime(track->P());
2452 // aodpid->SetTOFsignal(track->GetTOFsignal()-tzeroTrack);
2453 aodpid->SetTOFsignal(track->GetTOFsignal());
2456 for (Int_t iMass=0; iMass<5; iMass++){
2457 // tofRes[iMass]=(Double_t)fESDpid->GetTOFResponse().GetExpectedSigma(track->P(), times[iMass], AliPID::ParticleMass(iMass));
2458 tofRes[iMass]=0; //backward compatibility
2460 aodpid->SetTOFpidResolution(tofRes);
2462 // aodpid->SetHMPIDsignal(0); // set to zero for compression but it will be removed later
2466 Double_t AliAnalysisTaskESDfilter::Chi2perNDF(AliESDtrack* track)
2468 // Calculate chi2 per ndf for track
2469 Int_t nClustersTPC = track->GetTPCNcls();
2471 if ( nClustersTPC > 5) {
2472 return (track->GetTPCchi2()/Float_t(nClustersTPC - 5));
2479 //______________________________________________________________________________
2480 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
2482 // Terminate analysis
2484 if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");
2487 //______________________________________________________________________________
2488 void AliAnalysisTaskESDfilter::PrintMCInfo(AliStack *pStack,Int_t label){
2491 label = TMath::Abs(label);
2492 TParticle *part = pStack->Particle(label);
2493 Printf("########################");
2494 Printf("%s:%d %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,label,part->GetUniqueID(),part->GetPdgCode(),part->P());
2496 TParticle* mother = part;
2497 Int_t imo = part->GetFirstMother();
2498 Int_t nprim = pStack->GetNprimary();
2499 // while((imo >= nprim) && (mother->GetUniqueID() == 4)) {
2500 while((imo >= nprim)) {
2501 mother = pStack->Particle(imo);
2502 Printf("Mother %s:%d Label %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,imo,mother->GetUniqueID(),mother->GetPdgCode(),mother->P());
2504 imo = mother->GetFirstMother();
2506 Printf("########################");
2509 //______________________________________________________