1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
21 #include <TArrayI.h>
\r
22 #include <TRandom.h>
\r
23 #include <TParticle.h>
\r
26 #include "AliAnalysisTaskESDfilter.h"
\r
27 #include "AliAnalysisManager.h"
\r
28 #include "AliESDEvent.h"
\r
29 #include "AliESDRun.h"
\r
30 #include "AliStack.h"
\r
31 #include "AliAODEvent.h"
\r
32 #include "AliMCEvent.h"
\r
33 #include "AliMCEventHandler.h"
\r
34 #include "AliESDInputHandler.h"
\r
35 #include "AliAODHandler.h"
\r
36 #include "AliAODMCParticle.h"
\r
37 #include "AliAnalysisFilter.h"
\r
38 #include "AliESDMuonTrack.h"
\r
39 #include "AliESDVertex.h"
\r
40 #include "AliCentrality.h"
\r
41 #include "AliESDv0.h"
\r
42 #include "AliESDkink.h"
\r
43 #include "AliESDcascade.h"
\r
44 #include "AliESDPmdTrack.h"
\r
45 #include "AliESDCaloCluster.h"
\r
46 #include "AliESDCaloCells.h"
\r
47 #include "AliMultiplicity.h"
\r
49 #include "AliCodeTimer.h"
\r
50 #include "AliESDtrackCuts.h"
\r
51 #include "AliESDpid.h"
\r
52 #include "Riostream.h"
\r
54 ClassImp(AliAnalysisTaskESDfilter)
\r
56 ////////////////////////////////////////////////////////////////////////
\r
58 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
\r
59 AliAnalysisTaskSE(),
\r
63 fCascadeFilter(0x0),
\r
66 fEnableFillAOD(kTRUE),
\r
75 fNumberOfPositiveTracks(0),
\r
77 fNumberOfVertices(0),
\r
78 fNumberOfCascades(0),
\r
80 fOldESDformat(kFALSE),
\r
81 fPrimaryVertex(0x0),
\r
82 fTPCOnlyFilterMask(0),
\r
83 fIsVZEROEnabled(kTRUE),
\r
84 fAreCascadesEnabled(kTRUE),
\r
85 fAreV0sEnabled(kTRUE),
\r
86 fAreKinksEnabled(kTRUE),
\r
87 fAreTracksEnabled(kTRUE),
\r
88 fArePmdClustersEnabled(kTRUE),
\r
89 fAreCaloClustersEnabled(kTRUE),
\r
90 fAreEMCALCellsEnabled(kTRUE),
\r
91 fArePHOSCellsEnabled(kTRUE),
\r
92 fAreTrackletsEnabled(kTRUE),
\r
94 fIsPidOwner(kFALSE),
\r
95 fTimeZeroType(AliESDpid::kTOF_T0)
\r
97 // Default constructor
\r
100 //______________________________________________________________________________
\r
101 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
\r
102 AliAnalysisTaskSE(name),
\r
106 fCascadeFilter(0x0),
\r
107 fHighPthreshold(0),
\r
109 fEnableFillAOD(kTRUE),
\r
113 fAODTrackRefs(0x0),
\r
114 fAODV0VtxRefs(0x0),
\r
117 fNumberOfTracks(0),
\r
118 fNumberOfPositiveTracks(0),
\r
120 fNumberOfVertices(0),
\r
121 fNumberOfCascades(0),
\r
123 fOldESDformat(kFALSE),
\r
124 fPrimaryVertex(0x0),
\r
125 fTPCOnlyFilterMask(0),
\r
126 fIsVZEROEnabled(kTRUE),
\r
127 fAreCascadesEnabled(kTRUE),
\r
128 fAreV0sEnabled(kTRUE),
\r
129 fAreKinksEnabled(kTRUE),
\r
130 fAreTracksEnabled(kTRUE),
\r
131 fArePmdClustersEnabled(kTRUE),
\r
132 fAreCaloClustersEnabled(kTRUE),
\r
133 fAreEMCALCellsEnabled(kTRUE),
\r
134 fArePHOSCellsEnabled(kTRUE),
\r
135 fAreTrackletsEnabled(kTRUE),
\r
137 fIsPidOwner(kFALSE),
\r
138 fTimeZeroType(AliESDpid::kTOF_T0)
\r
143 //______________________________________________________________________________
\r
144 void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
\r
147 // Create Output Objects conenct filter to outputtree
\r
151 OutputTree()->GetUserInfo()->Add(fTrackFilter);
\r
155 AliError("No OutputTree() for adding the track filter");
\r
159 //______________________________________________________________________________
\r
160 void AliAnalysisTaskESDfilter::Init()
\r
163 if (fDebug > 1) AliInfo("Init() \n");
\r
164 // Call configuration file
\r
167 //______________________________________________________________________________
\r
168 void AliAnalysisTaskESDfilter::PrintTask(Option_t *option, Int_t indent) const
\r
172 AliAnalysisTaskSE::PrintTask(option,indent);
\r
174 TString spaces(' ',indent+3);
\r
176 cout << spaces.Data() << Form("Cascades are %s",fAreCascadesEnabled ? "ENABLED":"DISABLED") << endl;
\r
177 cout << spaces.Data() << Form("V0s are %s",fAreV0sEnabled ? "ENABLED":"DISABLED") << endl;
\r
178 cout << spaces.Data() << Form("Kinks are %s",fAreKinksEnabled ? "ENABLED":"DISABLED") << endl;
\r
179 cout << spaces.Data() << Form("Tracks are %s",fAreTracksEnabled ? "ENABLED":"DISABLED") << endl;
\r
180 cout << spaces.Data() << Form("PmdClusters are %s",fArePmdClustersEnabled ? "ENABLED":"DISABLED") << endl;
\r
181 cout << spaces.Data() << Form("CaloClusters are %s",fAreCaloClustersEnabled ? "ENABLED":"DISABLED") << endl;
\r
182 cout << spaces.Data() << Form("EMCAL cells are %s",fAreEMCALCellsEnabled ? "ENABLED":"DISABLED") << endl;
\r
183 cout << spaces.Data() << Form("Tracklets are %s",fAreTrackletsEnabled ? "ENABLED":"DISABLED") << endl;
\r
186 //______________________________________________________________________________
\r
187 void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
\r
189 // Execute analysis for current event
\r
192 Long64_t ientry = Entry();
\r
195 printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
\r
196 if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
\r
197 if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
\r
199 // Filters must explicitely enable AOD filling in their UserExec (AG)
\r
200 if (!AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()) AliFatal("Cannot run ESD filter without an output event handler");
\r
201 if(fEnableFillAOD) AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
\r
206 //______________________________________________________________________________
\r
207 TClonesArray& AliAnalysisTaskESDfilter::Cascades()
\r
209 return *(AODEvent()->GetCascades());
\r
212 //______________________________________________________________________________
\r
213 TClonesArray& AliAnalysisTaskESDfilter::Tracks()
\r
215 return *(AODEvent()->GetTracks());
\r
218 //______________________________________________________________________________
\r
219 TClonesArray& AliAnalysisTaskESDfilter::V0s()
\r
221 return *(AODEvent()->GetV0s());
\r
224 //______________________________________________________________________________
\r
225 TClonesArray& AliAnalysisTaskESDfilter::Vertices()
\r
227 return *(AODEvent()->GetVertices());
\r
230 //______________________________________________________________________________
\r
231 AliAODHeader* AliAnalysisTaskESDfilter::ConvertHeader(const AliESDEvent& esd)
\r
233 AliCodeTimerAuto("",0);
\r
235 AliAODHeader* header = AODEvent()->GetHeader();
\r
237 header->SetRunNumber(esd.GetRunNumber());
\r
238 header->SetOfflineTrigger(fInputHandler->IsEventSelected()); // propagate the decision of the physics selection
\r
240 TTree* tree = fInputHandler->GetTree();
\r
242 TFile* file = tree->GetCurrentFile();
\r
243 if (file) header->SetESDFileName(file->GetName());
\r
246 if (fOldESDformat) {
\r
247 header->SetBunchCrossNumber(0);
\r
248 header->SetOrbitNumber(0);
\r
249 header->SetPeriodNumber(0);
\r
250 header->SetEventType(0);
\r
251 header->SetMuonMagFieldScale(-999.);
\r
252 header->SetCentrality(0);
\r
254 header->SetBunchCrossNumber(esd.GetBunchCrossNumber());
\r
255 header->SetOrbitNumber(esd.GetOrbitNumber());
\r
256 header->SetPeriodNumber(esd.GetPeriodNumber());
\r
257 header->SetEventType(esd.GetEventType());
\r
259 header->SetEventNumberESDFile(esd.GetHeader()->GetEventNumberInFile());
\r
260 if(const_cast<AliESDEvent&>(esd).GetCentrality()){
\r
261 header->SetCentrality(new AliCentrality(*(const_cast<AliESDEvent&>(esd).GetCentrality())));
\r
264 header->SetCentrality(0);
\r
269 header->SetFiredTriggerClasses(esd.GetFiredTriggerClasses());
\r
270 header->SetTriggerMask(esd.GetTriggerMask());
\r
271 header->SetTriggerCluster(esd.GetTriggerCluster());
\r
272 header->SetL0TriggerInputs(esd.GetHeader()->GetL0TriggerInputs());
\r
273 header->SetL1TriggerInputs(esd.GetHeader()->GetL1TriggerInputs());
\r
274 header->SetL2TriggerInputs(esd.GetHeader()->GetL2TriggerInputs());
\r
276 header->SetMagneticField(esd.GetMagneticField());
\r
277 header->SetMuonMagFieldScale(esd.GetCurrentDip()/6000.);
\r
278 header->SetZDCN1Energy(esd.GetZDCN1Energy());
\r
279 header->SetZDCP1Energy(esd.GetZDCP1Energy());
\r
280 header->SetZDCN2Energy(esd.GetZDCN2Energy());
\r
281 header->SetZDCP2Energy(esd.GetZDCP2Energy());
\r
282 header->SetZDCEMEnergy(esd.GetZDCEMEnergy(0),esd.GetZDCEMEnergy(1));
\r
285 Float_t diamxy[2]={esd.GetDiamondX(),esd.GetDiamondY()};
\r
286 Float_t diamcov[3];
\r
287 esd.GetDiamondCovXY(diamcov);
\r
288 header->SetDiamond(diamxy,diamcov);
\r
289 header->SetDiamondZ(esd.GetDiamondZ(),esd.GetSigma2DiamondZ());
\r
294 //______________________________________________________________________________
\r
295 void AliAnalysisTaskESDfilter::ConvertCascades(const AliESDEvent& esd)
\r
297 // Convert the cascades part of the ESD.
\r
298 // Return the number of cascades
\r
300 AliCodeTimerAuto("",0);
\r
302 // Create vertices starting from the most complex objects
\r
303 Double_t chi2 = 0.;
\r
305 const AliESDVertex* vtx = esd.GetPrimaryVertex();
\r
306 Double_t pos[3] = { 0. };
\r
307 Double_t covVtx[6] = { 0. };
\r
308 Double_t momBach[3]={0.};
\r
309 Double_t covTr[21]={0.};
\r
310 Double_t pid[10]={0.};
\r
311 AliAODPid* detpid(0x0);
\r
312 AliAODVertex* vV0FromCascade(0x0);
\r
313 AliAODv0* aodV0(0x0);
\r
314 AliAODcascade* aodCascade(0x0);
\r
315 AliAODTrack* aodTrack(0x0);
\r
316 Double_t momPos[3]={0.};
\r
317 Double_t momNeg[3] = { 0. };
\r
318 Double_t momPosAtV0vtx[3]={0.};
\r
319 Double_t momNegAtV0vtx[3]={0.};
\r
321 TClonesArray& verticesArray = Vertices();
\r
322 TClonesArray& tracksArray = Tracks();
\r
323 TClonesArray& cascadesArray = Cascades();
\r
325 // Cascades (Modified by A.Maire - February 2009)
\r
326 for (Int_t nCascade = 0; nCascade < esd.GetNumberOfCascades(); ++nCascade) {
\r
330 AliESDcascade *esdCascade = esd.GetCascade(nCascade);
\r
331 Int_t idxPosFromV0Dghter = esdCascade->GetPindex();
\r
332 Int_t idxNegFromV0Dghter = esdCascade->GetNindex();
\r
333 Int_t idxBachFromCascade = esdCascade->GetBindex();
\r
335 AliESDtrack *esdCascadePos = esd.GetTrack( idxPosFromV0Dghter);
\r
336 AliESDtrack *esdCascadeNeg = esd.GetTrack( idxNegFromV0Dghter);
\r
337 AliESDtrack *esdCascadeBach = esd.GetTrack( idxBachFromCascade);
\r
339 // Identification of the V0 within the esdCascade (via both daughter track indices)
\r
340 AliESDv0 * currentV0 = 0x0;
\r
341 Int_t idxV0FromCascade = -1;
\r
343 for (Int_t iV0=0; iV0<esd.GetNumberOfV0s(); ++iV0) {
\r
345 currentV0 = esd.GetV0(iV0);
\r
346 Int_t posCurrentV0 = currentV0->GetPindex();
\r
347 Int_t negCurrentV0 = currentV0->GetNindex();
\r
349 if (posCurrentV0==idxPosFromV0Dghter && negCurrentV0==idxNegFromV0Dghter) {
\r
350 idxV0FromCascade = iV0;
\r
355 if(idxV0FromCascade < 0){
\r
356 printf("Cascade - no matching for the V0 (index V0 = -1) ! Skip ... \n");
\r
358 }// a priori, useless check, but safer ... in case of pb with tracks "out of bounds"
\r
360 AliESDv0 *esdV0FromCascade = esd.GetV0(idxV0FromCascade);
\r
362 // 1 - Cascade selection
\r
364 // AliESDVertex *esdPrimVtx = new AliESDVertex(*(esd.GetPrimaryVertex()));
\r
365 // TList cascadeObjects;
\r
366 // cascadeObjects.AddAt(esdV0FromCascade, 0);
\r
367 // cascadeObjects.AddAt(esdCascadePos, 1);
\r
368 // cascadeObjects.AddAt(esdCascadeNeg, 2);
\r
369 // cascadeObjects.AddAt(esdCascade, 3);
\r
370 // cascadeObjects.AddAt(esdCascadeBach, 4);
\r
371 // cascadeObjects.AddAt(esdPrimVtx, 5);
\r
373 // UInt_t selectCascade = 0;
\r
374 // if (fCascadeFilter) {
\r
375 // // selectCascade = fCascadeFilter->IsSelected(&cascadeObjects);
\r
376 // // FIXME AliESDCascadeCuts to be implemented ...
\r
378 // // Here we may encounter a moot point at the V0 level
\r
379 // // between the cascade selections and the V0 ones :
\r
380 // // the V0 selected along with the cascade (secondary V0) may
\r
381 // // usually be removed from the dedicated V0 selections (prim V0) ...
\r
382 // // -> To be discussed !
\r
384 // // this is a little awkward but otherwise the
\r
385 // // list wants to access the pointer (delete it)
\r
386 // // again when going out of scope
\r
387 // delete cascadeObjects.RemoveAt(5); // esdPrimVtx created via copy construct
\r
389 // if (!selectCascade)
\r
393 // delete cascadeObjects.RemoveAt(5); // esdPrimVtx created via copy construct
\r
397 // 2 - Add the cascade vertex
\r
399 esdCascade->GetXYZcascade(pos[0], pos[1], pos[2]);
\r
400 esdCascade->GetPosCovXi(covVtx);
\r
401 chi2 = esdCascade->GetChi2Xi();
\r
403 AliAODVertex *vCascade = new(verticesArray[fNumberOfVertices++]) AliAODVertex( pos,
\r
405 chi2, // FIXME = Chi2/NDF will be needed
\r
408 AliAODVertex::kCascade);
\r
409 fPrimaryVertex->AddDaughter(vCascade);
\r
411 // if (fDebug > 2) {
\r
412 // printf("---- Cascade / Cascade Vertex (AOD) : \n");
\r
413 // vCascade->Print();
\r
416 if(esd.GetTOFHeader() && fIsPidOwner) fESDpid->SetTOFResponse(const_cast<AliESDEvent*>(&esd), AliESDpid::kBest_T0); //in case of AOD production strating form LHC10e without Tender.
\r
419 // 3 - Add the bachelor track from the cascade
\r
421 if (!fUsedTrack[idxBachFromCascade]) {
\r
423 esdCascadeBach->GetPxPyPz(momBach);
\r
424 esdCascadeBach->GetXYZ(pos);
\r
425 esdCascadeBach->GetCovarianceXYZPxPyPz(covTr);
\r
426 esdCascadeBach->GetESDpid(pid);
\r
428 fUsedTrack[idxBachFromCascade] = kTRUE;
\r
429 UInt_t selectInfo = 0;
\r
430 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeBach);
\r
431 if (fMChandler) fMChandler->SelectParticle(esdCascadeBach->GetLabel());
\r
432 aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack(esdCascadeBach->GetID(),
\r
433 esdCascadeBach->GetLabel(),
\r
437 kFALSE, // Why kFALSE for "isDCA" ? FIXME
\r
439 (Short_t)esdCascadeBach->GetSign(),
\r
440 esdCascadeBach->GetITSClusterMap(),
\r
443 kTRUE, // usedForVtxFit = kFALSE ? FIXME
\r
444 vtx->UsesTrack(esdCascadeBach->GetID()),
\r
445 AliAODTrack::kSecondary,
\r
447 aodTrack->SetTPCClusterMap(esdCascadeBach->GetTPCClusterMap());
\r
448 aodTrack->SetTPCSharedMap (esdCascadeBach->GetTPCSharedMap());
\r
449 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeBach));
\r
450 fAODTrackRefs->AddAt(aodTrack,idxBachFromCascade);
\r
452 if (esdCascadeBach->GetSign() > 0) ++fNumberOfPositiveTracks;
\r
453 aodTrack->ConvertAliPIDtoAODPID();
\r
454 aodTrack->SetFlags(esdCascadeBach->GetStatus());
\r
455 SetAODPID(esdCascadeBach,aodTrack,detpid,esd.GetMagneticField());
\r
458 aodTrack = static_cast<AliAODTrack*>( fAODTrackRefs->At(idxBachFromCascade) );
\r
461 vCascade->AddDaughter(aodTrack);
\r
463 // if (fDebug > 4) {
\r
464 // printf("---- Cascade / bach dghter : \n");
\r
465 // aodTrack->Print();
\r
469 // 4 - Add the V0 from the cascade.
\r
470 // = V0vtx + both pos and neg daughter tracks + the aodV0 itself
\r
473 if ( !fUsedV0[idxV0FromCascade] ) {
\r
474 // 4.A - if VO structure hasn't been created yet
\r
476 // 4.A.1 - Create the V0 vertex of the cascade
\r
478 esdV0FromCascade->GetXYZ(pos[0], pos[1], pos[2]);
\r
479 esdV0FromCascade->GetPosCov(covVtx);
\r
480 chi2 = esdV0FromCascade->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3 ?
\r
482 vV0FromCascade = new(verticesArray[fNumberOfVertices++]) AliAODVertex(pos,
\r
486 idxV0FromCascade, //id of ESDv0
\r
487 AliAODVertex::kV0);
\r
489 // one V0 can be used by several cascades.
\r
490 // So, one AOD V0 vtx can have several parent vtx.
\r
491 // This is not directly allowed by AliAODvertex.
\r
492 // Setting the parent vtx (here = param "vCascade") doesn't lead to a crash
\r
493 // but to a problem of consistency within AODEvent.
\r
494 // -> See below paragraph 4.B, for the proposed treatment of such a case.
\r
496 // Add the vV0FromCascade to the aodVOVtxRefs
\r
497 fAODV0VtxRefs->AddAt(vV0FromCascade,idxV0FromCascade);
\r
500 // 4.A.2 - Add the positive tracks from the V0
\r
502 esdCascadePos->GetPxPyPz(momPos);
\r
503 esdCascadePos->GetXYZ(pos);
\r
504 esdCascadePos->GetCovarianceXYZPxPyPz(covTr);
\r
505 esdCascadePos->GetESDpid(pid);
\r
508 if (!fUsedTrack[idxPosFromV0Dghter]) {
\r
509 fUsedTrack[idxPosFromV0Dghter] = kTRUE;
\r
511 UInt_t selectInfo = 0;
\r
512 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadePos);
\r
513 if(fMChandler) fMChandler->SelectParticle(esdCascadePos->GetLabel());
\r
514 aodTrack = new(tracksArray[fNumberOfTracks++])
\r
515 AliAODTrack( esdCascadePos->GetID(),
\r
516 esdCascadePos->GetLabel(),
\r
520 kFALSE, // Why kFALSE for "isDCA" ? FIXME
\r
522 (Short_t)esdCascadePos->GetSign(),
\r
523 esdCascadePos->GetITSClusterMap(),
\r
526 kTRUE, // usedForVtxFit = kFALSE ? FIXME
\r
527 vtx->UsesTrack(esdCascadePos->GetID()),
\r
528 AliAODTrack::kSecondary,
\r
530 aodTrack->SetTPCClusterMap(esdCascadePos->GetTPCClusterMap());
\r
531 aodTrack->SetTPCSharedMap (esdCascadePos->GetTPCSharedMap());
\r
532 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadePos));
\r
533 fAODTrackRefs->AddAt(aodTrack,idxPosFromV0Dghter);
\r
535 if (esdCascadePos->GetSign() > 0) ++fNumberOfPositiveTracks;
\r
536 aodTrack->ConvertAliPIDtoAODPID();
\r
537 aodTrack->SetFlags(esdCascadePos->GetStatus());
\r
538 SetAODPID(esdCascadePos,aodTrack,detpid,esd.GetMagneticField());
\r
541 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxPosFromV0Dghter));
\r
543 vV0FromCascade->AddDaughter(aodTrack);
\r
546 // 4.A.3 - Add the negative tracks from the V0
\r
548 esdCascadeNeg->GetPxPyPz(momNeg);
\r
549 esdCascadeNeg->GetXYZ(pos);
\r
550 esdCascadeNeg->GetCovarianceXYZPxPyPz(covTr);
\r
551 esdCascadeNeg->GetESDpid(pid);
\r
554 if (!fUsedTrack[idxNegFromV0Dghter]) {
\r
555 fUsedTrack[idxNegFromV0Dghter] = kTRUE;
\r
557 UInt_t selectInfo = 0;
\r
558 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdCascadeNeg);
\r
559 if(fMChandler)fMChandler->SelectParticle(esdCascadeNeg->GetLabel());
\r
560 aodTrack = new(tracksArray[fNumberOfTracks++]) AliAODTrack( esdCascadeNeg->GetID(),
\r
561 esdCascadeNeg->GetLabel(),
\r
565 kFALSE, // Why kFALSE for "isDCA" ? FIXME
\r
567 (Short_t)esdCascadeNeg->GetSign(),
\r
568 esdCascadeNeg->GetITSClusterMap(),
\r
571 kTRUE, // usedForVtxFit = kFALSE ? FIXME
\r
572 vtx->UsesTrack(esdCascadeNeg->GetID()),
\r
573 AliAODTrack::kSecondary,
\r
575 aodTrack->SetTPCClusterMap(esdCascadeNeg->GetTPCClusterMap());
\r
576 aodTrack->SetTPCSharedMap (esdCascadeNeg->GetTPCSharedMap());
\r
577 aodTrack->SetChi2perNDF(Chi2perNDF(esdCascadeNeg));
\r
578 fAODTrackRefs->AddAt(aodTrack,idxNegFromV0Dghter);
\r
580 if (esdCascadeNeg->GetSign() > 0) ++fNumberOfPositiveTracks;
\r
581 aodTrack->ConvertAliPIDtoAODPID();
\r
582 aodTrack->SetFlags(esdCascadeNeg->GetStatus());
\r
583 SetAODPID(esdCascadeNeg,aodTrack,detpid,esd.GetMagneticField());
\r
586 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(idxNegFromV0Dghter));
\r
589 vV0FromCascade->AddDaughter(aodTrack);
\r
592 // 4.A.4 - Add the V0 from cascade to the V0 array
\r
594 Double_t dcaV0Daughters = esdV0FromCascade->GetDcaV0Daughters();
\r
595 Double_t dcaV0ToPrimVertex = esdV0FromCascade->GetD( esd.GetPrimaryVertex()->GetX(),
\r
596 esd.GetPrimaryVertex()->GetY(),
\r
597 esd.GetPrimaryVertex()->GetZ() );
\r
598 esdV0FromCascade->GetPPxPyPz( momPosAtV0vtx[0],momPosAtV0vtx[1],momPosAtV0vtx[2] );
\r
599 esdV0FromCascade->GetNPxPyPz( momNegAtV0vtx[0],momNegAtV0vtx[1],momNegAtV0vtx[2] );
\r
601 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = DCA in (x,y) for Pos and ..[1] = Neg
\r
602 dcaDaughterToPrimVertex[0] = TMath::Abs(esdCascadePos->GetD( esd.GetPrimaryVertex()->GetX(),
\r
603 esd.GetPrimaryVertex()->GetY(),
\r
604 esd.GetMagneticField()) );
\r
605 dcaDaughterToPrimVertex[1] = TMath::Abs(esdCascadeNeg->GetD( esd.GetPrimaryVertex()->GetX(),
\r
606 esd.GetPrimaryVertex()->GetY(),
\r
607 esd.GetMagneticField()) );
\r
609 aodV0 = new(V0s()[fNumberOfV0s++]) AliAODv0( vV0FromCascade,
\r
611 dcaV0ToPrimVertex,
\r
614 dcaDaughterToPrimVertex);
\r
615 // set the aod v0 on-the-fly status
\r
616 aodV0->SetOnFlyStatus(esdV0FromCascade->GetOnFlyStatus());
\r
618 // Add the aodV0 to the aodVORefs
\r
619 fAODV0Refs->AddAt(aodV0,idxV0FromCascade);
\r
621 fUsedV0[idxV0FromCascade] = kTRUE;
\r
624 // 4.B - if V0 structure already used
\r
627 // one V0 can be used by several cascades (frequent in PbPb evts) :
\r
628 // same V0 which used but attached to different bachelor tracks
\r
629 // -> aodVORefs and fAODV0VtxRefs are needed.
\r
630 // Goal : avoid a redundancy of the info in "Vertices" and "v0s" clones array.
\r
632 vV0FromCascade = static_cast<AliAODVertex*>( fAODV0VtxRefs->At(idxV0FromCascade) );
\r
633 aodV0 = static_cast<AliAODv0*> ( fAODV0Refs ->At(idxV0FromCascade) );
\r
635 // - Treatment of the parent for such a "re-used" V0 :
\r
636 // Insert the cascade that reuses the V0 vertex in the lineage chain
\r
637 // Before : vV0 -> vCascade1 -> vPrimary
\r
638 // - Hyp : cascade2 uses the same V0 as cascade1
\r
639 // After : vV0 -> vCascade2 -> vCascade1 -> vPrimary
\r
641 AliAODVertex *vCascadePreviousParent = static_cast<AliAODVertex*> (vV0FromCascade->GetParent());
\r
642 vV0FromCascade->SetParent(vCascade);
\r
643 vCascade ->SetParent(vCascadePreviousParent);
\r
646 // printf("---- Cascade / Lineage insertion\n"
\r
647 // "Parent of V0 vtx = Cascade vtx %p\n"
\r
648 // "Parent of the cascade vtx = Cascade vtx %p\n"
\r
649 // "Parent of the parent cascade vtx = Cascade vtx %p\n",
\r
650 // static_cast<void*> (vV0FromCascade->GetParent()),
\r
651 // static_cast<void*> (vCascade->GetParent()),
\r
652 // static_cast<void*> (vCascadePreviousParent->GetParent()) );
\r
654 }// end if V0 structure already used
\r
656 // if (fDebug > 2) {
\r
657 // printf("---- Cascade / V0 vertex: \n");
\r
658 // vV0FromCascade->Print();
\r
661 // if (fDebug > 4) {
\r
662 // printf("---- Cascade / pos dghter : \n");
\r
663 // aodTrack->Print();
\r
664 // printf("---- Cascade / neg dghter : \n");
\r
665 // aodTrack->Print();
\r
666 // printf("---- Cascade / aodV0 : \n");
\r
670 // In any case (used V0 or not), add the V0 vertex to the cascade one.
\r
671 vCascade->AddDaughter(vV0FromCascade);
\r
674 // 5 - Add the primary track of the cascade (if any)
\r
677 // 6 - Add the cascade to the AOD array of cascades
\r
679 Double_t dcaBachToPrimVertexXY = TMath::Abs(esdCascadeBach->GetD(esd.GetPrimaryVertex()->GetX(),
\r
680 esd.GetPrimaryVertex()->GetY(),
\r
681 esd.GetMagneticField()) );
\r
683 Double_t momBachAtCascadeVtx[3]={0.};
\r
685 esdCascade->GetBPxPyPz(momBachAtCascadeVtx[0], momBachAtCascadeVtx[1], momBachAtCascadeVtx[2]);
\r
687 aodCascade = new(cascadesArray[fNumberOfCascades++]) AliAODcascade( vCascade,
\r
688 esdCascade->Charge(),
\r
689 esdCascade->GetDcaXiDaughters(),
\r
691 // DCAXiToPrimVtx -> needs to be calculated ----|
\r
692 // doesn't exist at ESD level;
\r
693 // See AODcascade::DcaXiToPrimVertex(Double, Double, Double)
\r
694 dcaBachToPrimVertexXY,
\r
695 momBachAtCascadeVtx,
\r
698 // if (fDebug > 3) {
\r
699 // printf("---- Cascade / AOD cascade : \n\n");
\r
700 // aodCascade->PrintXi(fPrimaryVertex->GetX(), fPrimaryVertex->GetY(), fPrimaryVertex->GetZ());
\r
703 } // end of the loop on cascades
\r
705 Cascades().Expand(fNumberOfCascades);
\r
708 //______________________________________________________________________________
\r
709 void AliAnalysisTaskESDfilter::ConvertV0s(const AliESDEvent& esd)
\r
711 // Access to the AOD container of V0s
\r
713 AliCodeTimerAuto("",0);
\r
719 Double_t pos[3] = { 0. };
\r
720 Double_t chi2(0.0);
\r
721 Double_t covVtx[6] = { 0. };
\r
722 Double_t momPos[3]={0.};
\r
723 Double_t covTr[21]={0.};
\r
724 Double_t pid[10]={0.};
\r
725 AliAODTrack* aodTrack(0x0);
\r
726 AliAODPid* detpid(0x0);
\r
727 Double_t momNeg[3]={0.};
\r
728 Double_t momPosAtV0vtx[3]={0.};
\r
729 Double_t momNegAtV0vtx[3]={0.};
\r
731 for (Int_t nV0 = 0; nV0 < esd.GetNumberOfV0s(); ++nV0)
\r
733 if (fUsedV0[nV0]) continue; // skip if already added to the AOD
\r
735 AliESDv0 *v0 = esd.GetV0(nV0);
\r
736 Int_t posFromV0 = v0->GetPindex();
\r
737 Int_t negFromV0 = v0->GetNindex();
\r
741 AliESDVertex *esdVtx = new AliESDVertex(*(esd.GetPrimaryVertex()));
\r
742 AliESDtrack *esdV0Pos = esd.GetTrack(posFromV0);
\r
743 AliESDtrack *esdV0Neg = esd.GetTrack(negFromV0);
\r
745 v0objects.AddAt(v0, 0);
\r
746 v0objects.AddAt(esdV0Pos, 1);
\r
747 v0objects.AddAt(esdV0Neg, 2);
\r
748 v0objects.AddAt(esdVtx, 3);
\r
749 UInt_t selectV0 = 0;
\r
751 selectV0 = fV0Filter->IsSelected(&v0objects);
\r
752 // this is a little awkward but otherwise the
\r
753 // list wants to access the pointer (delete it)
\r
754 // again when going out of scope
\r
755 delete v0objects.RemoveAt(3); // esdVtx created via copy construct
\r
761 delete v0objects.RemoveAt(3); // esdVtx created via copy construct
\r
765 v0->GetXYZ(pos[0], pos[1], pos[2]);
\r
767 if (!fOldESDformat) {
\r
768 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
\r
769 v0->GetPosCov(covVtx);
\r
772 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
\r
776 AliAODVertex * vV0 =
\r
777 new(Vertices()[fNumberOfVertices++]) AliAODVertex(pos,
\r
782 AliAODVertex::kV0);
\r
783 fPrimaryVertex->AddDaughter(vV0);
\r
786 // Add the positive tracks from the V0
\r
789 esdV0Pos->GetPxPyPz(momPos);
\r
790 esdV0Pos->GetXYZ(pos);
\r
791 esdV0Pos->GetCovarianceXYZPxPyPz(covTr);
\r
792 esdV0Pos->GetESDpid(pid);
\r
794 const AliESDVertex *vtx = esd.GetPrimaryVertex();
\r
796 if (!fUsedTrack[posFromV0]) {
\r
797 fUsedTrack[posFromV0] = kTRUE;
\r
798 UInt_t selectInfo = 0;
\r
799 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);
\r
800 if(fMChandler)fMChandler->SelectParticle(esdV0Pos->GetLabel());
\r
801 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdV0Pos->GetID(),
\r
802 esdV0Pos->GetLabel(),
\r
808 (Short_t)esdV0Pos->GetSign(),
\r
809 esdV0Pos->GetITSClusterMap(),
\r
812 kTRUE, // check if this is right
\r
813 vtx->UsesTrack(esdV0Pos->GetID()),
\r
814 AliAODTrack::kSecondary,
\r
816 aodTrack->SetTPCClusterMap(esdV0Pos->GetTPCClusterMap());
\r
817 aodTrack->SetTPCSharedMap (esdV0Pos->GetTPCSharedMap());
\r
818 aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Pos));
\r
819 fAODTrackRefs->AddAt(aodTrack,posFromV0);
\r
820 // if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());
\r
821 if (esdV0Pos->GetSign() > 0) ++fNumberOfPositiveTracks;
\r
822 aodTrack->ConvertAliPIDtoAODPID();
\r
823 aodTrack->SetFlags(esdV0Pos->GetStatus());
\r
824 SetAODPID(esdV0Pos,aodTrack,detpid,esd.GetMagneticField());
\r
827 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(posFromV0));
\r
828 // if (fDebug > 0) printf("-------------------Bo pos track from refArray pt %.3f \n",aodTrack->Pt());
\r
830 vV0->AddDaughter(aodTrack);
\r
832 // Add the negative tracks from the V0
\r
834 esdV0Neg->GetPxPyPz(momNeg);
\r
835 esdV0Neg->GetXYZ(pos);
\r
836 esdV0Neg->GetCovarianceXYZPxPyPz(covTr);
\r
837 esdV0Neg->GetESDpid(pid);
\r
839 if (!fUsedTrack[negFromV0]) {
\r
840 fUsedTrack[negFromV0] = kTRUE;
\r
841 UInt_t selectInfo = 0;
\r
842 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);
\r
843 if(fMChandler)fMChandler->SelectParticle(esdV0Neg->GetLabel());
\r
844 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdV0Neg->GetID(),
\r
845 esdV0Neg->GetLabel(),
\r
851 (Short_t)esdV0Neg->GetSign(),
\r
852 esdV0Neg->GetITSClusterMap(),
\r
855 kTRUE, // check if this is right
\r
856 vtx->UsesTrack(esdV0Neg->GetID()),
\r
857 AliAODTrack::kSecondary,
\r
859 aodTrack->SetTPCClusterMap(esdV0Neg->GetTPCClusterMap());
\r
860 aodTrack->SetTPCSharedMap (esdV0Neg->GetTPCSharedMap());
\r
861 aodTrack->SetChi2perNDF(Chi2perNDF(esdV0Neg));
\r
863 fAODTrackRefs->AddAt(aodTrack,negFromV0);
\r
864 // if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());
\r
865 if (esdV0Neg->GetSign() > 0) ++fNumberOfPositiveTracks;
\r
866 aodTrack->ConvertAliPIDtoAODPID();
\r
867 aodTrack->SetFlags(esdV0Neg->GetStatus());
\r
868 SetAODPID(esdV0Neg,aodTrack,detpid,esd.GetMagneticField());
\r
871 aodTrack = static_cast<AliAODTrack*>(fAODTrackRefs->At(negFromV0));
\r
872 // if (fDebug > 0) printf("-------------------Bo neg track from refArray pt %.3f \n",aodTrack->Pt());
\r
874 vV0->AddDaughter(aodTrack);
\r
877 // Add the V0 the V0 array as well
\r
879 Double_t dcaV0Daughters = v0->GetDcaV0Daughters();
\r
880 Double_t dcaV0ToPrimVertex = v0->GetD(esd.GetPrimaryVertex()->GetX(),
\r
881 esd.GetPrimaryVertex()->GetY(),
\r
882 esd.GetPrimaryVertex()->GetZ());
\r
884 v0->GetPPxPyPz(momPosAtV0vtx[0],momPosAtV0vtx[1],momPosAtV0vtx[2]);
\r
885 v0->GetNPxPyPz(momNegAtV0vtx[0],momNegAtV0vtx[1],momNegAtV0vtx[2]);
\r
887 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = DCA in (x,y) for Pos and ..[1] = Neg
\r
888 dcaDaughterToPrimVertex[0] = TMath::Abs(esdV0Pos->GetD( esd.GetPrimaryVertex()->GetX(),
\r
889 esd.GetPrimaryVertex()->GetY(),
\r
890 esd.GetMagneticField()) );
\r
891 dcaDaughterToPrimVertex[1] = TMath::Abs(esdV0Neg->GetD( esd.GetPrimaryVertex()->GetX(),
\r
892 esd.GetPrimaryVertex()->GetY(),
\r
893 esd.GetMagneticField()) );
\r
895 AliAODv0* aodV0 = new(V0s()[fNumberOfV0s++]) AliAODv0(vV0,
\r
900 dcaDaughterToPrimVertex);
\r
902 // set the aod v0 on-the-fly status
\r
903 aodV0->SetOnFlyStatus(v0->GetOnFlyStatus());
\r
904 }//End of loop on V0s
\r
906 V0s().Expand(fNumberOfV0s);
\r
909 //______________________________________________________________________________
\r
910 void AliAnalysisTaskESDfilter::ConvertTPCOnlyTracks(const AliESDEvent& esd)
\r
912 // Convert TPC only tracks
\r
914 AliCodeTimerAuto("",0);
\r
916 // Loop over the tracks and extract and mask out all aod tracks that pass the selections for AODt racks
\r
917 for(int it = 0;it < fNumberOfTracks;++it)
\r
919 AliAODTrack *tr = (AliAODTrack*)(Tracks().At(it));
\r
921 UInt_t map = tr->GetFilterMap();
\r
922 if(map&fTPCOnlyFilterMask){
\r
923 // we only reset the track select ionfo, no deletion...
\r
924 tr->SetFilterMap(map&~fTPCOnlyFilterMask);
\r
927 // Loop over the ESD trcks and pick out the tracks passing TPC only cuts
\r
930 const AliESDVertex *vtxSPD = esd.GetPrimaryVertexSPD();
\r
931 const AliESDVertex *vtx = esd.GetPrimaryVertex();
\r
933 Double_t pos[3] = { 0. };
\r
934 Double_t covTr[21]={0.};
\r
935 Double_t pid[10]={0.};
\r
936 Double_t p[3] = { 0. };
\r
937 AliAODTrack* aodTrack(0x0);
\r
939 for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack)
\r
941 AliESDtrack* esdTrack = esd.GetTrack(nTrack); //carefull do not modify it othwise need to work with a copy
\r
943 UInt_t selectInfo = 0;
\r
946 if (fTrackFilter) {
\r
947 selectInfo = fTrackFilter->IsSelected(esdTrack);
\r
949 selectInfo &= fTPCOnlyFilterMask;
\r
950 if (!selectInfo)continue;
\r
952 // create a tpc only tracl
\r
953 AliESDtrack *track = AliESDtrackCuts::GetTPCOnlyTrack(const_cast<AliESDEvent*>(&esd),esdTrack->GetID());
\r
954 if(!track) continue;
\r
958 // only constrain tracks above threshold
\r
959 AliExternalTrackParam exParam;
\r
960 // take the B-field from the ESD, no 3D fieldMap available at this point
\r
961 Bool_t relate = false;
\r
962 relate = track->RelateToVertex(vtxSPD,esd.GetMagneticField(),kVeryBig,&exParam);
\r
967 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
\r
970 track->GetPxPyPz(p);
\r
971 track->GetXYZ(pos);
\r
972 track->GetCovarianceXYZPxPyPz(covTr);
\r
973 track->GetESDpid(pid);
\r
974 if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
\r
975 aodTrack = new(Tracks()[fNumberOfTracks++]) AliAODTrack((track->GetID()+1)*-1,
\r
982 (Short_t)track->GetSign(),
\r
983 track->GetITSClusterMap(),
\r
986 kTRUE, // check if this is right
\r
987 vtx->UsesTrack(track->GetID()),
\r
988 AliAODTrack::kPrimary,
\r
990 aodTrack->SetTPCClusterMap(track->GetTPCClusterMap());
\r
991 aodTrack->SetTPCSharedMap (track->GetTPCSharedMap());
\r
992 aodTrack->SetChi2perNDF(Chi2perNDF(track));
\r
993 aodTrack->SetFlags(track->GetStatus());
\r
996 } // end of loop on tracks
\r
1000 //______________________________________________________________________________
\r
1001 void AliAnalysisTaskESDfilter::ConvertTracks(const AliESDEvent& esd)
\r
1003 // Tracks (primary and orphan)
\r
1005 AliCodeTimerAuto("",0);
\r
1007 AliDebug(1,Form("NUMBER OF ESD TRACKS %5d\n", esd.GetNumberOfTracks()));
\r
1009 const AliESDVertex *vtx = esd.GetPrimaryVertex();
\r
1010 Double_t p[3] = { 0. };
\r
1011 Double_t pos[3] = { 0. };
\r
1012 Double_t covTr[21] = { 0. };
\r
1013 Double_t pid[10] = { 0. };
\r
1014 AliAODTrack* aodTrack(0x0);
\r
1015 AliAODPid* detpid(0x0);
\r
1017 for (Int_t nTrack = 0; nTrack < esd.GetNumberOfTracks(); ++nTrack)
\r
1019 if (fUsedTrack[nTrack]) continue;
\r
1021 AliESDtrack *esdTrack = esd.GetTrack(nTrack);
\r
1022 UInt_t selectInfo = 0;
\r
1024 // Track selection
\r
1025 if (fTrackFilter) {
\r
1026 selectInfo = fTrackFilter->IsSelected(esdTrack);
\r
1027 if (!selectInfo && !vtx->UsesTrack(esdTrack->GetID())) continue;
\r
1031 esdTrack->GetPxPyPz(p);
\r
1032 esdTrack->GetXYZ(pos);
\r
1033 esdTrack->GetCovarianceXYZPxPyPz(covTr);
\r
1034 esdTrack->GetESDpid(pid);
\r
1035 if(fMChandler)fMChandler->SelectParticle(esdTrack->GetLabel());
\r
1036 fPrimaryVertex->AddDaughter(aodTrack =
\r
1037 new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrack->GetID(),
\r
1038 esdTrack->GetLabel(),
\r
1044 (Short_t)esdTrack->GetSign(),
\r
1045 esdTrack->GetITSClusterMap(),
\r
1048 kTRUE, // check if this is right
\r
1049 vtx->UsesTrack(esdTrack->GetID()),
\r
1050 AliAODTrack::kPrimary,
\r
1053 aodTrack->SetTPCClusterMap(esdTrack->GetTPCClusterMap());
\r
1054 aodTrack->SetTPCSharedMap (esdTrack->GetTPCSharedMap());
\r
1055 aodTrack->SetChi2perNDF(Chi2perNDF(esdTrack));
\r
1057 fAODTrackRefs->AddAt(aodTrack, nTrack);
\r
1060 if (esdTrack->GetSign() > 0) ++fNumberOfPositiveTracks;
\r
1061 aodTrack->SetFlags(esdTrack->GetStatus());
\r
1062 aodTrack->ConvertAliPIDtoAODPID();
\r
1063 SetAODPID(esdTrack,aodTrack,detpid,esd.GetMagneticField());
\r
1064 } // end of loop on tracks
\r
1067 //______________________________________________________________________________
\r
1068 void AliAnalysisTaskESDfilter::ConvertPmdClusters(const AliESDEvent& esd)
\r
1070 AliCodeTimerAuto("",0);
\r
1071 Int_t jPmdClusters=0;
\r
1072 // Access to the AOD container of PMD clusters
\r
1073 TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
\r
1074 for (Int_t iPmd = 0; iPmd < esd.GetNumberOfPmdTracks(); ++iPmd) {
\r
1075 // file pmd clusters, to be revised!
\r
1076 AliESDPmdTrack *pmdTrack = esd.GetPmdTrack(iPmd);
\r
1078 Int_t *label = 0x0;
\r
1079 Double_t posPmd[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ()};
\r
1080 Double_t pidPmd[13] = { 0.}; // to be revised!
\r
1082 // assoc cluster not set
\r
1083 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), posPmd, pidPmd);
\r
1087 //______________________________________________________________________________
\r
1088 void AliAnalysisTaskESDfilter::ConvertCaloClusters(const AliESDEvent& esd)
\r
1090 AliCodeTimerAuto("",0);
\r
1092 // Access to the AOD container of clusters
\r
1093 TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
\r
1094 Int_t jClusters(0);
\r
1096 for (Int_t iClust=0; iClust<esd.GetNumberOfCaloClusters(); ++iClust) {
\r
1098 AliESDCaloCluster * cluster = esd.GetCaloCluster(iClust);
\r
1100 Int_t id = cluster->GetID();
\r
1101 Int_t nLabel = cluster->GetNLabels();
\r
1102 Int_t *labels = cluster->GetLabels();
\r
1104 for(int i = 0;i < nLabel;++i){
\r
1105 if(fMChandler)fMChandler->SelectParticle(labels[i]);
\r
1109 Float_t energy = cluster->E();
\r
1110 Float_t posF[3] = { 0.};
\r
1111 cluster->GetPosition(posF);
\r
1113 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
\r
1119 cluster->GetType(),0);
\r
1121 caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
\r
1122 cluster->GetDispersion(),
\r
1123 cluster->GetM20(), cluster->GetM02(),
\r
1124 cluster->GetEmcCpvDistance(),
\r
1125 cluster->GetNExMax(),cluster->GetTOF()) ;
\r
1127 caloCluster->SetPIDFromESD(cluster->GetPID());
\r
1128 caloCluster->SetNCells(cluster->GetNCells());
\r
1129 caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
\r
1130 caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
\r
1132 TArrayI* matchedT = cluster->GetTracksMatched();
\r
1133 if (fNumberOfTracks>0 && matchedT && cluster->GetTrackMatchedIndex() >= 0) {
\r
1134 for (Int_t im = 0; im < matchedT->GetSize(); im++) {
\r
1135 Int_t iESDtrack = matchedT->At(im);;
\r
1136 if (fAODTrackRefs->At(iESDtrack) != 0) {
\r
1137 caloCluster->AddTrackMatched((AliAODTrack*)fAODTrackRefs->At(iESDtrack));
\r
1143 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
\r
1146 //______________________________________________________________________________
\r
1147 void AliAnalysisTaskESDfilter::ConvertEMCALCells(const AliESDEvent& esd)
\r
1149 AliCodeTimerAuto("",0);
\r
1150 // fill EMCAL cell info
\r
1151 if (esd.GetEMCALCells()) { // protection against missing ESD information
\r
1152 AliESDCaloCells &esdEMcells = *(esd.GetEMCALCells());
\r
1153 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
\r
1155 AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
\r
1156 aodEMcells.CreateContainer(nEMcell);
\r
1157 aodEMcells.SetType(AliAODCaloCells::kEMCALCell);
\r
1158 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
\r
1159 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
\r
1161 aodEMcells.Sort();
\r
1165 //______________________________________________________________________________
\r
1166 void AliAnalysisTaskESDfilter::ConvertPHOSCells(const AliESDEvent& esd)
\r
1168 AliCodeTimerAuto("",0);
\r
1169 // fill PHOS cell info
\r
1170 if (esd.GetPHOSCells()) { // protection against missing ESD information
\r
1171 AliESDCaloCells &esdPHcells = *(esd.GetPHOSCells());
\r
1172 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
\r
1174 AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
\r
1175 aodPHcells.CreateContainer(nPHcell);
\r
1176 aodPHcells.SetType(AliAODCaloCells::kPHOSCell);
\r
1177 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
\r
1178 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
\r
1180 aodPHcells.Sort();
\r
1184 //______________________________________________________________________________
\r
1185 void AliAnalysisTaskESDfilter::ConvertTracklets(const AliESDEvent& esd)
\r
1188 AliCodeTimerAuto("",0);
\r
1190 AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
\r
1191 const AliMultiplicity *mult = esd.GetMultiplicity();
\r
1193 if (mult->GetNumberOfTracklets()>0) {
\r
1194 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
\r
1196 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
\r
1198 fMChandler->SelectParticle(mult->GetLabel(n, 0));
\r
1199 fMChandler->SelectParticle(mult->GetLabel(n, 1));
\r
1201 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0),mult->GetLabel(n, 1));
\r
1205 //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
\r
1209 //______________________________________________________________________________
\r
1210 void AliAnalysisTaskESDfilter::ConvertKinks(const AliESDEvent& esd)
\r
1212 AliCodeTimerAuto("",0);
\r
1214 // Kinks: it is a big mess the access to the information in the kinks
\r
1215 // The loop is on the tracks in order to find the mother and daugther of each kink
\r
1217 Double_t covTr[21]={0.};
\r
1218 Double_t pid[10]={0.};
\r
1219 AliAODPid* detpid(0x0);
\r
1221 fNumberOfKinks = esd.GetNumberOfKinks();
\r
1223 const AliESDVertex* vtx = esd.GetPrimaryVertex();
\r
1225 for (Int_t iTrack=0; iTrack<esd.GetNumberOfTracks(); ++iTrack)
\r
1227 AliESDtrack * esdTrack = esd.GetTrack(iTrack);
\r
1229 Int_t ikink = esdTrack->GetKinkIndex(0);
\r
1231 if (ikink && fNumberOfKinks) {
\r
1232 // Negative kink index: mother, positive: daughter
\r
1234 // Search for the second track of the kink
\r
1236 for (Int_t jTrack = iTrack+1; jTrack<esd.GetNumberOfTracks(); ++jTrack) {
\r
1238 AliESDtrack * esdTrack1 = esd.GetTrack(jTrack);
\r
1240 Int_t jkink = esdTrack1->GetKinkIndex(0);
\r
1242 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
\r
1244 // The two tracks are from the same kink
\r
1246 if (fUsedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
\r
1248 Int_t imother = -1;
\r
1249 Int_t idaughter = -1;
\r
1251 if (ikink<0 && jkink>0) {
\r
1254 idaughter = jTrack;
\r
1256 else if (ikink>0 && jkink<0) {
\r
1259 idaughter = iTrack;
\r
1262 // cerr << "Error: Wrong combination of kink indexes: "
\r
1263 // << ikink << " " << jkink << endl;
\r
1267 // Add the mother track if it passed primary track selection cuts
\r
1269 AliAODTrack * mother = NULL;
\r
1271 UInt_t selectInfo = 0;
\r
1272 if (fTrackFilter) {
\r
1273 selectInfo = fTrackFilter->IsSelected(esd.GetTrack(imother));
\r
1274 if (!selectInfo) continue;
\r
1277 if (!fUsedTrack[imother]) {
\r
1279 fUsedTrack[imother] = kTRUE;
\r
1281 AliESDtrack *esdTrackM = esd.GetTrack(imother);
\r
1282 Double_t p[3] = { 0. };
\r
1283 Double_t pos[3] = { 0. };
\r
1284 esdTrackM->GetPxPyPz(p);
\r
1285 esdTrackM->GetXYZ(pos);
\r
1286 esdTrackM->GetCovarianceXYZPxPyPz(covTr);
\r
1287 esdTrackM->GetESDpid(pid);
\r
1288 if(fMChandler)fMChandler->SelectParticle(esdTrackM->GetLabel());
\r
1290 new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrackM->GetID(),
\r
1291 esdTrackM->GetLabel(),
\r
1297 (Short_t)esdTrackM->GetSign(),
\r
1298 esdTrackM->GetITSClusterMap(),
\r
1301 kTRUE, // check if this is right
\r
1302 vtx->UsesTrack(esdTrack->GetID()),
\r
1303 AliAODTrack::kPrimary,
\r
1305 mother->SetTPCClusterMap(esdTrackM->GetTPCClusterMap());
\r
1306 mother->SetTPCSharedMap (esdTrackM->GetTPCSharedMap());
\r
1307 mother->SetChi2perNDF(Chi2perNDF(esdTrackM));
\r
1309 fAODTrackRefs->AddAt(mother, imother);
\r
1311 if (esdTrackM->GetSign() > 0) ++fNumberOfPositiveTracks;
\r
1312 mother->SetFlags(esdTrackM->GetStatus());
\r
1313 mother->ConvertAliPIDtoAODPID();
\r
1314 fPrimaryVertex->AddDaughter(mother);
\r
1315 mother->ConvertAliPIDtoAODPID();
\r
1316 SetAODPID(esdTrackM,mother,detpid,esd.GetMagneticField());
\r
1319 // cerr << "Error: event " << esd.GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
\r
1320 // << " track " << imother << " has already been used!" << endl;
\r
1323 // Add the kink vertex
\r
1324 AliESDkink * kink = esd.GetKink(TMath::Abs(ikink)-1);
\r
1326 AliAODVertex * vkink =
\r
1327 new(Vertices()[fNumberOfVertices++]) AliAODVertex(kink->GetPosition(),
\r
1331 esdTrack->GetID(), // This is the track ID of the mother's track!
\r
1332 AliAODVertex::kKink);
\r
1333 // Add the daughter track
\r
1335 AliAODTrack * daughter = NULL;
\r
1337 if (!fUsedTrack[idaughter]) {
\r
1339 fUsedTrack[idaughter] = kTRUE;
\r
1341 AliESDtrack *esdTrackD = esd.GetTrack(idaughter);
\r
1342 Double_t p[3] = { 0. };
\r
1343 Double_t pos[3] = { 0. };
\r
1345 esdTrackD->GetPxPyPz(p);
\r
1346 esdTrackD->GetXYZ(pos);
\r
1347 esdTrackD->GetCovarianceXYZPxPyPz(covTr);
\r
1348 esdTrackD->GetESDpid(pid);
\r
1350 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);
\r
1351 if(fMChandler)fMChandler->SelectParticle(esdTrackD->GetLabel());
\r
1353 new(Tracks()[fNumberOfTracks++]) AliAODTrack(esdTrackD->GetID(),
\r
1354 esdTrackD->GetLabel(),
\r
1360 (Short_t)esdTrackD->GetSign(),
\r
1361 esdTrackD->GetITSClusterMap(),
\r
1364 kTRUE, // check if this is right
\r
1365 vtx->UsesTrack(esdTrack->GetID()),
\r
1366 AliAODTrack::kSecondary,
\r
1368 daughter->SetTPCClusterMap(esdTrackD->GetTPCClusterMap());
\r
1369 daughter->SetTPCSharedMap (esdTrackD->GetTPCSharedMap());
\r
1370 fAODTrackRefs->AddAt(daughter, idaughter);
\r
1372 if (esdTrackD->GetSign() > 0) ++fNumberOfPositiveTracks;
\r
1373 daughter->SetFlags(esdTrackD->GetStatus());
\r
1374 daughter->ConvertAliPIDtoAODPID();
\r
1375 vkink->AddDaughter(daughter);
\r
1376 daughter->ConvertAliPIDtoAODPID();
\r
1377 SetAODPID(esdTrackD,daughter,detpid,esd.GetMagneticField());
\r
1380 // cerr << "Error: event " << esd.GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
\r
1381 // << " track " << idaughter << " has already been used!" << endl;
\r
1389 //______________________________________________________________________________
\r
1390 void AliAnalysisTaskESDfilter::ConvertPrimaryVertices(const AliESDEvent& esd)
\r
1392 AliCodeTimerAuto("",0);
\r
1394 // Access to the AOD container of vertices
\r
1395 fNumberOfVertices = 0;
\r
1397 Double_t pos[3] = { 0. };
\r
1398 Double_t covVtx[6] = { 0. };
\r
1400 // Add primary vertex. The primary tracks will be defined
\r
1401 // after the loops on the composite objects (V0, cascades, kinks)
\r
1402 const AliESDVertex *vtx = esd.GetPrimaryVertex();
\r
1404 vtx->GetXYZ(pos); // position
\r
1405 vtx->GetCovMatrix(covVtx); //covariance matrix
\r
1407 fPrimaryVertex = new(Vertices()[fNumberOfVertices++])
\r
1408 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
\r
1409 fPrimaryVertex->SetName(vtx->GetName());
\r
1410 fPrimaryVertex->SetTitle(vtx->GetTitle());
\r
1412 TString vtitle = vtx->GetTitle();
\r
1413 if (!vtitle.Contains("VertexerTracks"))
\r
1414 fPrimaryVertex->SetNContributors(vtx->GetNContributors());
\r
1416 if (fDebug > 0) fPrimaryVertex->Print();
\r
1418 // Add SPD "main" vertex
\r
1419 const AliESDVertex *vtxS = esd.GetPrimaryVertexSPD();
\r
1420 vtxS->GetXYZ(pos); // position
\r
1421 vtxS->GetCovMatrix(covVtx); //covariance matrix
\r
1422 AliAODVertex * mVSPD = new(Vertices()[fNumberOfVertices++])
\r
1423 AliAODVertex(pos, covVtx, vtxS->GetChi2toNDF(), NULL, -1, AliAODVertex::kMainSPD);
\r
1424 mVSPD->SetName(vtxS->GetName());
\r
1425 mVSPD->SetTitle(vtxS->GetTitle());
\r
1426 mVSPD->SetNContributors(vtxS->GetNContributors());
\r
1428 // Add SPD pileup vertices
\r
1429 for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesSPD(); ++iV)
\r
1431 const AliESDVertex *vtxP = esd.GetPileupVertexSPD(iV);
\r
1432 vtxP->GetXYZ(pos); // position
\r
1433 vtxP->GetCovMatrix(covVtx); //covariance matrix
\r
1434 AliAODVertex * pVSPD = new(Vertices()[fNumberOfVertices++])
\r
1435 AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupSPD);
\r
1436 pVSPD->SetName(vtxP->GetName());
\r
1437 pVSPD->SetTitle(vtxP->GetTitle());
\r
1438 pVSPD->SetNContributors(vtxP->GetNContributors());
\r
1441 // Add TRK pileup vertices
\r
1442 for(Int_t iV=0; iV<esd.GetNumberOfPileupVerticesTracks(); ++iV)
\r
1444 const AliESDVertex *vtxP = esd.GetPileupVertexTracks(iV);
\r
1445 vtxP->GetXYZ(pos); // position
\r
1446 vtxP->GetCovMatrix(covVtx); //covariance matrix
\r
1447 AliAODVertex * pVTRK = new(Vertices()[fNumberOfVertices++])
\r
1448 AliAODVertex(pos, covVtx, vtxP->GetChi2toNDF(), NULL, -1, AliAODVertex::kPileupTracks);
\r
1449 pVTRK->SetName(vtxP->GetName());
\r
1450 pVTRK->SetTitle(vtxP->GetTitle());
\r
1451 pVTRK->SetNContributors(vtxP->GetNContributors());
\r
1455 //______________________________________________________________________________
\r
1456 void AliAnalysisTaskESDfilter::ConvertVZERO(const AliESDEvent& esd)
\r
1458 // Convert VZERO data
\r
1459 AliAODVZERO* vzeroData = AODEvent()->GetVZEROData();
\r
1460 *vzeroData = *(esd.GetVZEROData());
\r
1463 //______________________________________________________________________________
\r
1464 void AliAnalysisTaskESDfilter::ConvertESDtoAOD()
\r
1466 // ESD Filter analysis task executed for each event
\r
1468 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
\r
1472 AliCodeTimerAuto("",0);
\r
1474 fOldESDformat = ( esd->GetAliESDOld() != 0x0 );
\r
1476 fNumberOfTracks = 0;
\r
1477 fNumberOfPositiveTracks = 0;
\r
1479 fNumberOfVertices = 0;
\r
1480 fNumberOfCascades = 0;
\r
1481 fNumberOfKinks = 0;
\r
1483 AliAODHeader* header = ConvertHeader(*esd);
\r
1485 if ( fIsVZEROEnabled ) ConvertVZERO(*esd);
\r
1487 // Fetch Stack for debuggging if available
\r
1491 fMChandler = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler());
\r
1494 // loop over events and fill them
\r
1495 // Multiplicity information needed by the header (to be revised!)
\r
1496 Int_t nTracks = esd->GetNumberOfTracks();
\r
1497 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) esd->GetTrack(iTrack)->SetESDEvent(esd);
\r
1499 // Update the header
\r
1501 Int_t nV0s = esd->GetNumberOfV0s();
\r
1502 Int_t nCascades = esd->GetNumberOfCascades();
\r
1503 Int_t nKinks = esd->GetNumberOfKinks();
\r
1504 Int_t nVertices = nV0s + nCascades /*V0 wihtin cascade already counted*/+ nKinks + 1 /* = prim. vtx*/;
\r
1505 Int_t nPileSPDVertices=1+esd->GetNumberOfPileupVerticesSPD(); // also SPD main vertex
\r
1506 Int_t nPileTrkVertices=esd->GetNumberOfPileupVerticesTracks();
\r
1507 nVertices+=nPileSPDVertices;
\r
1508 nVertices+=nPileTrkVertices;
\r
1510 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
\r
1511 Int_t nFmdClus = 0;
\r
1512 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
\r
1514 AliDebug(1,Form(" NV0=%d NCASCADES=%d NKINKS=%d", nV0s, nCascades, nKinks));
\r
1516 AODEvent()->ResetStd(nTracks, nVertices, nV0s, nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
\r
1520 // RefArray to store a mapping between esd V0 number and newly created AOD-Vertex V0
\r
1521 fAODV0VtxRefs = new TRefArray(nV0s);
\r
1522 // RefArray to store the mapping between esd V0 number and newly created AOD-V0
\r
1523 fAODV0Refs = new TRefArray(nV0s);
\r
1524 // Array to take into account the V0s already added to the AOD (V0 within cascades)
\r
1525 fUsedV0 = new Bool_t[nV0s];
\r
1526 for (Int_t iV0=0; iV0<nV0s; ++iV0) fUsedV0[iV0]=kFALSE;
\r
1531 // RefArray to store the mapping between esd track number and newly created AOD-Track
\r
1533 fAODTrackRefs = new TRefArray(nTracks);
\r
1535 // Array to take into account the tracks already added to the AOD
\r
1536 fUsedTrack = new Bool_t[nTracks];
\r
1537 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) fUsedTrack[iTrack]=kFALSE;
\r
1540 // Array to take into account the kinks already added to the AOD
\r
1543 fUsedKink = new Bool_t[nKinks];
\r
1544 for (Int_t iKink=0; iKink<nKinks; ++iKink) fUsedKink[iKink]=kFALSE;
\r
1547 ConvertPrimaryVertices(*esd);
\r
1549 //setting best TOF PID
\r
1550 fESDpid = dynamic_cast<AliESDInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler())->GetESDpid();
\r
1552 if ( fIsPidOwner) delete fESDpid;
\r
1555 { //in case of no Tender attached
\r
1556 fESDpid = new AliESDpid;
\r
1557 fIsPidOwner = kTRUE;
\r
1560 if(!esd->GetTOFHeader())
\r
1561 { //protection in case the pass2 LHC10b,c,d have been processed without tender.
\r
1562 Float_t t0spread[10];
\r
1563 Float_t intrinsicTOFres=100; //ps ok for LHC10b,c,d pass2!!
\r
1564 for (Int_t i=0; i<10; i++) t0spread[i] = (TMath::Sqrt(esd->GetSigma2DiamondZ()))/0.03; //0.03 to convert from cm to ps
\r
1565 fESDpid->GetTOFResponse().SetT0resolution(t0spread);
\r
1566 fESDpid->GetTOFResponse().SetTimeResolution(intrinsicTOFres);
\r
1568 fESDpid->SetTOFResponse(esd, (AliESDpid::EStartTimeType_t)fTimeZeroType);
\r
1571 if(esd->GetTOFHeader() && fIsPidOwner) fESDpid->SetTOFResponse(esd, (AliESDpid::EStartTimeType_t)fTimeZeroType); //in case of AOD production strating form LHC10e without Tender.
\r
1573 if ( fAreCascadesEnabled ) ConvertCascades(*esd);
\r
1575 if ( fAreV0sEnabled ) ConvertV0s(*esd);
\r
1577 if ( fAreKinksEnabled ) ConvertKinks(*esd);
\r
1579 if ( fAreTracksEnabled ) ConvertTracks(*esd);
\r
1581 // Update number of AOD tracks in header at the end of track loop (M.G.)
\r
1582 header->SetRefMultiplicity(fNumberOfTracks);
\r
1583 header->SetRefMultiplicityPos(fNumberOfPositiveTracks);
\r
1584 header->SetRefMultiplicityNeg(fNumberOfTracks - fNumberOfPositiveTracks);
\r
1586 if ( fTPCOnlyFilterMask ) ConvertTPCOnlyTracks(*esd);
\r
1588 if ( fArePmdClustersEnabled ) ConvertPmdClusters(*esd);
\r
1590 if ( fAreCaloClustersEnabled ) ConvertCaloClusters(*esd);
\r
1592 if ( fAreEMCALCellsEnabled )ConvertEMCALCells(*esd);
\r
1594 if ( fArePHOSCellsEnabled )ConvertPHOSCells(*esd);
\r
1596 if ( fAreTrackletsEnabled ) ConvertTracklets(*esd);
\r
1598 delete fAODTrackRefs; fAODTrackRefs=0x0;
\r
1599 delete fAODV0VtxRefs; fAODV0VtxRefs=0x0;
\r
1600 delete fAODV0Refs; fAODV0Refs=0x0;
\r
1602 delete[] fUsedTrack; fUsedTrack=0x0;
\r
1603 delete[] fUsedV0; fUsedV0=0x0;
\r
1604 delete[] fUsedKink; fUsedKink=0x0;
\r
1608 //______________________________________________________________________________
\r
1609 void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid, Double_t bfield)
\r
1612 // Setter for the raw PID detector signals
\r
1615 // Save PID object for candidate electrons
\r
1616 Bool_t pidSave = kFALSE;
\r
1617 if (fTrackFilter) {
\r
1618 Bool_t selectInfo = fTrackFilter->IsSelected((char*) "Electrons");
\r
1619 if (selectInfo) pidSave = kTRUE;
\r
1623 // Tracks passing pt cut
\r
1624 if(esdtrack->Pt()>fHighPthreshold) {
\r
1628 if(esdtrack->Pt()> fPtshape->GetXmin()){
\r
1629 Double_t y = fPtshape->Eval(esdtrack->Pt())/fPtshape->Eval(fHighPthreshold);
\r
1630 if(gRandom->Rndm(0)<1./y){
\r
1633 }//end if p < pmin
\r
1634 }//end if p function
\r
1638 if(!aodtrack->GetDetPid()){// prevent memory leak when calling SetAODPID twice for the same track
\r
1639 detpid = new AliAODPid();
\r
1640 SetDetectorRawSignals(detpid,esdtrack, bfield);
\r
1641 aodtrack->SetDetPID(detpid);
\r
1646 //______________________________________________________________________________
\r
1647 void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtrack *track, Double_t bfield)
\r
1650 //assignment of the detector signals (AliXXXesdPID inspired)
\r
1653 AliInfo("no ESD track found. .....exiting");
\r
1657 const AliExternalTrackParam *in=track->GetInnerParam();
\r
1659 aodpid->SetTPCmomentum(in->GetP());
\r
1661 aodpid->SetTPCmomentum(-1.);
\r
1665 aodpid->SetITSsignal(track->GetITSsignal());
\r
1666 aodpid->SetTPCsignal(track->GetTPCsignal());
\r
1667 aodpid->SetTPCsignalN(track->GetTPCsignalN());
\r
1669 //n TRD planes = 6
\r
1670 Int_t nslices = track->GetNumberOfTRDslices()*6;
\r
1671 Double_t *trdslices = new Double_t[nslices];
\r
1672 for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) {
\r
1673 for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);
\r
1677 for(Int_t iPl=0;iPl<6;iPl++){
\r
1678 Double_t trdmom=track->GetTRDmomentum(iPl);
\r
1679 aodpid->SetTRDmomentum(iPl,trdmom);
\r
1682 aodpid->SetTRDsignal(track->GetNumberOfTRDslices()*6,trdslices);
\r
1685 Double_t times[AliAODPid::kSPECIES]; track->GetIntegratedTimes(times);
\r
1686 aodpid->SetIntegratedTimes(times);
\r
1688 Float_t tzeroTrack = fESDpid->GetTOFResponse().GetStartTime(track->P());
\r
1689 aodpid->SetTOFsignal(track->GetTOFsignal()-tzeroTrack);
\r
1691 Double_t tofRes[5];
\r
1692 for (Int_t iMass=0; iMass<5; iMass++){
\r
1693 tofRes[iMass]=(Double_t)fESDpid->GetTOFResponse().GetExpectedSigma(track->P(), times[iMass], AliPID::ParticleMass(iMass));
\r
1695 aodpid->SetTOFpidResolution(tofRes);
\r
1697 aodpid->SetHMPIDsignal(track->GetHMPIDsignal());
\r
1699 //Extrapolate track to EMCAL surface for AOD-level track-cluster matching
\r
1700 Double_t emcpos[3] = {0.,0.,0.};
\r
1701 Double_t emcmom[3] = {0.,0.,0.};
\r
1702 aodpid->SetEMCALPosition(emcpos);
\r
1703 aodpid->SetEMCALMomentum(emcmom);
\r
1705 AliExternalTrackParam *outerparam = (AliExternalTrackParam*)track->GetOuterParam();
\r
1706 if(!outerparam) return;
\r
1708 //To be replaced by call to AliEMCALGeoUtils when the class becomes available
\r
1709 Double_t radius = 441.0; //[cm] EMCAL radius +13cm
\r
1711 Bool_t okpos = outerparam->GetXYZAt(radius,bfield,emcpos);
\r
1712 Bool_t okmom = outerparam->GetPxPyPzAt(radius,bfield,emcmom);
\r
1713 if(!(okpos && okmom)) return;
\r
1715 aodpid->SetEMCALPosition(emcpos);
\r
1716 aodpid->SetEMCALMomentum(emcmom);
\r
1720 Double_t AliAnalysisTaskESDfilter::Chi2perNDF(AliESDtrack* track)
\r
1722 // Calculate chi2 per ndf for track
\r
1723 Int_t nClustersTPC = track->GetTPCNcls();
\r
1725 if ( nClustersTPC > 5) {
\r
1726 return (track->GetTPCchi2()/Float_t(nClustersTPC - 5));
\r
1733 //______________________________________________________________________________
\r
1734 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
\r
1736 // Terminate analysis
\r
1738 if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");
\r
1741 //______________________________________________________________________________
\r
1742 void AliAnalysisTaskESDfilter::PrintMCInfo(AliStack *pStack,Int_t label){
\r
1743 if(!pStack)return;
\r
1744 label = TMath::Abs(label);
\r
1745 TParticle *part = pStack->Particle(label);
\r
1746 Printf("########################");
\r
1747 Printf("%s:%d %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,label,part->GetUniqueID(),part->GetPdgCode(),part->P());
\r
1749 TParticle* mother = part;
\r
1750 Int_t imo = part->GetFirstMother();
\r
1751 Int_t nprim = pStack->GetNprimary();
\r
1752 // while((imo >= nprim) && (mother->GetUniqueID() == 4)) {
\r
1753 while((imo >= nprim)) {
\r
1754 mother = pStack->Particle(imo);
\r
1755 Printf("Mother %s:%d Label %d UniqueID %d PDG %d P %3.3f",(char*)__FILE__,__LINE__,imo,mother->GetUniqueID(),mother->GetPdgCode(),mother->P());
\r
1757 imo = mother->GetFirstMother();
\r
1759 Printf("########################");
\r