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 **************************************************************************/
16 /* $Id: AliAnalysisTaskESDfilter.cxx 24535 2008-03-16 22:43:30Z fca $ */
24 #include "AliAnalysisTaskESDfilter.h"
25 #include "AliAnalysisManager.h"
26 #include "AliESDEvent.h"
27 #include "AliAODEvent.h"
28 #include "AliESDInputHandler.h"
29 #include "AliAODHandler.h"
30 #include "AliAnalysisFilter.h"
31 #include "AliESDMuonTrack.h"
32 #include "AliESDVertex.h"
34 #include "AliESDkink.h"
35 #include "AliESDcascade.h"
36 #include "AliESDPmdTrack.h"
37 #include "AliESDCaloCluster.h"
38 #include "AliESDCaloCells.h"
39 #include "AliMultiplicity.h"
42 ClassImp(AliAnalysisTaskESDfilter)
44 ////////////////////////////////////////////////////////////////////////
46 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
54 // Default constructor
57 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
58 AliAnalysisTaskSE(name),
68 void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
70 // Create the output container
71 OutputTree()->GetUserInfo()->Add(fTrackFilter);
74 void AliAnalysisTaskESDfilter::Init()
77 if (fDebug > 1) AliInfo("Init() \n");
78 // Call configuration file
82 void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
84 // Execute analysis for current event
87 Long64_t ientry = Entry();
88 if (fDebug > 0) printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
89 if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
90 if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
94 void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
95 // ESD Filter analysis task executed for each event
96 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
97 AliESD* old = esd->GetAliESDOld();
99 // set arrays and pointers
105 Double_t p_pos_atv0[3];
106 Double_t p_neg_atv0[3];
111 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
112 for (Int_t i = 0; i < 21; i++) covTr [i] = 0.;
115 // loop over events and fill them
117 // Multiplicity information needed by the header (to be revised!)
118 Int_t nTracks = esd->GetNumberOfTracks();
119 // if (fDebug > 0) printf("-------------------Bo: Number of ESD tracks %d \n",nTracks);
121 Int_t nPosTracks = 0;
122 // for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack)
123 // if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
127 AliAODHeader* header = AODEvent()->GetHeader();
128 header->SetRunNumber(esd->GetRunNumber());
130 header->SetBunchCrossNumber(0);
131 header->SetOrbitNumber(0);
132 header->SetPeriodNumber(0);
133 header->SetEventType(0);
134 header->SetMuonMagFieldScale(-999.); // FIXME
135 header->SetCentrality(-999.); // FIXME
137 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
138 header->SetOrbitNumber(esd->GetOrbitNumber());
139 header->SetPeriodNumber(esd->GetPeriodNumber());
140 header->SetEventType(esd->GetEventType());
141 header->SetMuonMagFieldScale(-999.); // FIXME
142 header->SetCentrality(-999.); // FIXME
145 header->SetTriggerMask(esd->GetTriggerMask());
146 header->SetTriggerCluster(esd->GetTriggerCluster());
147 header->SetMagneticField(esd->GetMagneticField());
148 header->SetZDCN1Energy(esd->GetZDCN1Energy());
149 header->SetZDCP1Energy(esd->GetZDCP1Energy());
150 header->SetZDCN2Energy(esd->GetZDCN2Energy());
151 header->SetZDCP2Energy(esd->GetZDCP2Energy());
152 header->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
155 Int_t nV0s = esd->GetNumberOfV0s();
156 Int_t nCascades = esd->GetNumberOfCascades();
157 Int_t nKinks = esd->GetNumberOfKinks();
158 Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;
160 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
162 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
165 printf(" NV0=%d NCASCADES=%d NKINKS=%d\n", nV0s, nCascades, nKinks);
167 AODEvent()->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
169 AliAODTrack *aodTrack = 0x0;
170 AliAODPid *detpid = 0x0;
171 Double_t timezero = 0; //TO BE FIXED
172 AliAODv0 *aodV0 = 0x0;
174 // RefArray to store the mapping between esd track number and newly created AOD-Track
175 TRefArray *aodRefs = NULL;
176 if (nTracks > 0) aodRefs = new TRefArray(nTracks);
178 // Array to take into account the tracks already added to the AOD
179 Bool_t * usedTrack = NULL;
181 usedTrack = new Bool_t[nTracks];
182 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
184 // Array to take into account the V0s already added to the AOD
185 Bool_t * usedV0 = NULL;
187 usedV0 = new Bool_t[nV0s];
188 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
190 // Array to take into account the kinks already added to the AOD
191 Bool_t * usedKink = NULL;
193 usedKink = new Bool_t[nKinks];
194 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
197 // Access to the AOD container of vertices
198 TClonesArray &vertices = *(AODEvent()->GetVertices());
201 // Access to the AOD container of tracks
202 TClonesArray &tracks = *(AODEvent()->GetTracks());
205 // Access to the AOD container of V0s
206 TClonesArray &V0s = *(AODEvent()->GetV0s());
209 // Add primary vertex. The primary tracks will be defined
210 // after the loops on the composite objects (V0, cascades, kinks)
211 const AliESDVertex *vtx = esd->GetPrimaryVertex();
213 vtx->GetXYZ(pos); // position
214 vtx->GetCovMatrix(covVtx); //covariance matrix
216 AliAODVertex * primary = new(vertices[jVertices++])
217 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
218 if (fDebug > 0) primary->Print();
220 // Create vertices starting from the most complex objects
224 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
225 AliESDcascade *cascade = esd->GetCascade(nCascade);
227 cascade->GetXYZ(pos[0], pos[1], pos[2]);
230 chi2 = cascade->GetChi2Xi(); // = chi2/NDF since NDF = 2*2-3
231 cascade->GetPosCovXi(covVtx);
234 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
236 // Add the cascade vertex
237 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
242 AliAODVertex::kCascade);
244 primary->AddDaughter(vcascade);
246 // Add the V0 from the cascade. The ESD class have to be optimized...
247 // Now we have to search for the corresponding Vo in the list of V0s
248 // using the indeces of the positive and negative tracks
250 Int_t posFromV0 = cascade->GetPindex();
251 Int_t negFromV0 = cascade->GetNindex();
257 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
259 v0 = esd->GetV0(iV0);
260 Int_t posV0 = v0->GetPindex();
261 Int_t negV0 = v0->GetNindex();
263 if (posV0==posFromV0 && negV0==negFromV0) {
269 AliAODVertex * vV0FromCascade = 0x0;
271 if (indV0>-1 && !usedV0[indV0] ) {
273 // the V0 exists in the array of V0s and is not used
275 usedV0[indV0] = kTRUE;
277 v0->GetXYZ(pos[0], pos[1], pos[2]);
279 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
280 v0->GetPosCov(covVtx);
283 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
286 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
294 // the V0 doesn't exist in the array of V0s or was used
295 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
296 // << " The V0 " << indV0
297 // << " doesn't exist in the array of V0s or was used!" << endl;
299 cascade->GetXYZ(pos[0], pos[1], pos[2]);
302 chi2 = v0->GetChi2V0();
303 cascade->GetPosCov(covVtx);
306 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
309 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
311 chi2, // = chi2/NDF since NDF = 2*2-3 (AM)
315 vcascade->AddDaughter(vV0FromCascade);
318 // Add the positive tracks from the V0
320 if (posFromV0>-1 && !usedTrack[posFromV0]) {
322 usedTrack[posFromV0] = kTRUE;
324 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
325 esdTrack->GetPxPyPz(p_pos);
326 esdTrack->GetXYZ(pos);
327 esdTrack->GetCovarianceXYZPxPyPz(covTr);
328 esdTrack->GetESDpid(pid);
329 UInt_t selectInfo = 0;
331 selectInfo = fTrackFilter->IsSelected(esdTrack);
334 vV0FromCascade->AddDaughter(aodTrack =
335 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
336 esdTrack->GetLabel(),
342 (Short_t)esdTrack->GetSign(),
343 esdTrack->GetITSClusterMap(),
346 kTRUE, // check if this is right
347 kFALSE, // check if this is right
348 AliAODTrack::kSecondary,
351 aodRefs->AddAt(aodTrack, posFromV0);
353 if (esdTrack->GetSign() > 0) nPosTracks++;
354 aodTrack->ConvertAliPIDtoAODPID();
355 aodTrack->SetFlags(esdTrack->GetStatus());
356 SetAODPID(esdTrack,aodTrack,detpid,timezero);
359 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
360 // << " track " << posFromV0 << " has already been used!" << endl;
363 // Add the negative tracks from the V0
365 if (negFromV0>-1 && !usedTrack[negFromV0]) {
367 usedTrack[negFromV0] = kTRUE;
369 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
370 esdTrack->GetPxPyPz(p_neg);
371 esdTrack->GetXYZ(pos);
372 esdTrack->GetCovarianceXYZPxPyPz(covTr);
373 esdTrack->GetESDpid(pid);
374 UInt_t selectInfo = 0;
375 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);
377 vV0FromCascade->AddDaughter(aodTrack =
378 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
379 esdTrack->GetLabel(),
385 (Short_t)esdTrack->GetSign(),
386 esdTrack->GetITSClusterMap(),
389 kTRUE, // check if this is right
390 kFALSE, // check if this is right
391 AliAODTrack::kSecondary,
394 aodRefs->AddAt(aodTrack, negFromV0);
396 if (esdTrack->GetSign() > 0) nPosTracks++;
397 aodTrack->ConvertAliPIDtoAODPID();
398 aodTrack->SetFlags(esdTrack->GetStatus());
399 SetAODPID(esdTrack,aodTrack,detpid,timezero);
402 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
403 // << " track " << negFromV0 << " has already been used!" << endl;
406 // add it to the V0 array as well
407 Double_t d0[2] = { -999., -99.};
408 // counting is probably wrong
409 new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
411 // Add the bachelor track from the cascade
413 Int_t bachelor = cascade->GetBindex();
415 if(bachelor>-1 && !usedTrack[bachelor]) {
417 usedTrack[bachelor] = kTRUE;
419 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
420 esdTrack->GetPxPyPz(p);
421 esdTrack->GetXYZ(pos);
422 esdTrack->GetCovarianceXYZPxPyPz(covTr);
423 esdTrack->GetESDpid(pid);
424 UInt_t selectInfo = 0;
425 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrack);
427 vcascade->AddDaughter(aodTrack =
428 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
429 esdTrack->GetLabel(),
435 (Short_t)esdTrack->GetSign(),
436 esdTrack->GetITSClusterMap(),
439 kTRUE, // check if this is right
440 kFALSE, // check if this is right
441 AliAODTrack::kSecondary,
444 aodRefs->AddAt(aodTrack, bachelor);
445 if (esdTrack->GetSign() > 0) nPosTracks++;
446 aodTrack->ConvertAliPIDtoAODPID();
447 aodTrack->SetFlags(esdTrack->GetStatus());
448 SetAODPID(esdTrack,aodTrack,detpid,timezero);
451 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
452 // << " track " << bachelor << " has already been used!" << endl;
455 // Add the primary track of the cascade (if any)
457 } // end of the loop on cascades
463 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
465 if (usedV0[nV0]) continue; // skip if already added to the AOD
467 AliESDv0 *v0 = esd->GetV0(nV0);
468 Int_t posFromV0 = v0->GetPindex();
469 Int_t negFromV0 = v0->GetNindex();
470 if (posFromV0 < 0 || negFromV0 < 0) continue;
474 AliESDVertex *esdVtx = new AliESDVertex(*(esd->GetPrimaryVertex()));
476 AliESDtrack *esdV0Pos = esd->GetTrack(posFromV0);
477 AliESDtrack *esdV0Neg = esd->GetTrack(negFromV0);
479 v0objects.AddAt(v0, 0);
480 v0objects.AddAt(esdV0Pos, 1);
481 v0objects.AddAt(esdV0Neg, 2);
482 v0objects.AddAt(esdVtx, 3);
485 selectV0 = fV0Filter->IsSelected(&v0objects);
486 // this is a little awkward but otherwise the
487 // list wants to access the pointer again when going out of scope
488 delete v0objects.RemoveAt(3);
493 delete v0objects.RemoveAt(3);
496 v0->GetXYZ(pos[0], pos[1], pos[2]);
499 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
500 v0->GetPosCov(covVtx);
503 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
508 new(vertices[jVertices++]) AliAODVertex(pos,
514 primary->AddDaughter(vV0);
517 Float_t dcaPosToPrimVertexXYZ[2] = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
518 Float_t dcaNegToPrimVertexXYZ[2] = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
519 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = Pos and ..[1] = Neg
521 Double_t dcaV0Daughters = v0->GetDcaV0Daughters();
522 Double_t dcaV0ToPrimVertex = v0->GetD();
524 v0->GetPPxPyPz(p_pos_atv0[0],p_pos_atv0[1],p_pos_atv0[2]);
525 v0->GetNPxPyPz(p_neg_atv0[0],p_neg_atv0[1],p_neg_atv0[2]);
527 // Add the positive tracks from the V0
530 esdV0Pos->GetPxPyPz(p_pos);
531 esdV0Pos->GetXYZ(pos);
532 esdV0Pos->GetCovarianceXYZPxPyPz(covTr);
533 esdV0Pos->GetESDpid(pid);
534 esdV0Pos->GetImpactParameters(dcaPosToPrimVertexXYZ[0],dcaPosToPrimVertexXYZ[1]);
535 if (!usedTrack[posFromV0]) {
536 usedTrack[posFromV0] = kTRUE;
537 UInt_t selectInfo = 0;
538 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Pos);
539 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Pos->GetID(),
540 esdV0Pos->GetLabel(),
546 (Short_t)esdV0Pos->GetSign(),
547 esdV0Pos->GetITSClusterMap(),
550 kTRUE, // check if this is right
551 kFALSE, // check if this is right
552 AliAODTrack::kSecondary,
554 aodRefs->AddAt(aodTrack,posFromV0);
555 // if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());
556 if (esdV0Pos->GetSign() > 0) nPosTracks++;
557 aodTrack->ConvertAliPIDtoAODPID();
558 aodTrack->SetFlags(esdV0Pos->GetStatus());
559 SetAODPID(esdV0Pos,aodTrack,detpid,timezero);
562 aodTrack = dynamic_cast<AliAODTrack*>(aodRefs->At(posFromV0));
563 // if (fDebug > 0) printf("-------------------Bo pos track from refArray pt %.3f \n",aodTrack->Pt());
565 vV0->AddDaughter(aodTrack);
567 // Add the negative tracks from the V0
569 esdV0Neg->GetPxPyPz(p_neg);
570 esdV0Neg->GetXYZ(pos);
571 esdV0Neg->GetCovarianceXYZPxPyPz(covTr);
572 esdV0Neg->GetESDpid(pid);
573 esdV0Neg->GetImpactParameters(dcaNegToPrimVertexXYZ[0],dcaNegToPrimVertexXYZ[1]);
575 if (!usedTrack[negFromV0]) {
576 usedTrack[negFromV0] = kTRUE;
577 UInt_t selectInfo = 0;
578 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdV0Neg);
579 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdV0Neg->GetID(),
580 esdV0Neg->GetLabel(),
586 (Short_t)esdV0Neg->GetSign(),
587 esdV0Neg->GetITSClusterMap(),
590 kTRUE, // check if this is right
591 kFALSE, // check if this is right
592 AliAODTrack::kSecondary,
595 aodRefs->AddAt(aodTrack,negFromV0);
596 // if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());
597 if (esdV0Neg->GetSign() > 0) nPosTracks++;
598 aodTrack->ConvertAliPIDtoAODPID();
599 aodTrack->SetFlags(esdV0Neg->GetStatus());
600 SetAODPID(esdV0Neg,aodTrack,detpid,timezero);
603 aodTrack = dynamic_cast<AliAODTrack*>(aodRefs->At(negFromV0));
604 // if (fDebug > 0) printf("-------------------Bo neg track from refArray pt %.3f \n",aodTrack->Pt());
606 vV0->AddDaughter(aodTrack);
607 dcaDaughterToPrimVertex[0] =
608 TMath::Sqrt(dcaPosToPrimVertexXYZ[0]*dcaPosToPrimVertexXYZ[0]
609 +dcaPosToPrimVertexXYZ[1]*dcaPosToPrimVertexXYZ[1]);
610 dcaDaughterToPrimVertex[1] =
611 TMath::Sqrt(dcaNegToPrimVertexXYZ[0]*dcaNegToPrimVertexXYZ[0]
612 +dcaNegToPrimVertexXYZ[1]*dcaNegToPrimVertexXYZ[1]);
613 // add it to the V0 array as well
614 aodV0 = new(V0s[jV0s++])
615 AliAODv0(vV0, dcaV0Daughters, dcaV0ToPrimVertex, p_pos_atv0, p_neg_atv0, dcaDaughterToPrimVertex); // to be refined
616 // set the aod v0 on-the-fly status
617 aodV0->SetOnFlyStatus(v0->GetOnFlyStatus());
620 // end of the loop on V0s
622 // Kinks: it is a big mess the access to the information in the kinks
623 // The loop is on the tracks in order to find the mother and daugther of each kink
626 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
628 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
630 Int_t ikink = esdTrack->GetKinkIndex(0);
632 if (ikink && nKinks) {
633 // Negative kink index: mother, positive: daughter
635 // Search for the second track of the kink
637 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
639 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
641 Int_t jkink = esdTrack1->GetKinkIndex(0);
643 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
645 // The two tracks are from the same kink
647 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
650 Int_t idaughter = -1;
652 if (ikink<0 && jkink>0) {
657 else if (ikink>0 && jkink<0) {
663 // cerr << "Error: Wrong combination of kink indexes: "
664 // << ikink << " " << jkink << endl;
668 // Add the mother track if it passed primary track selection cuts
670 AliAODTrack * mother = NULL;
672 UInt_t selectInfo = 0;
674 selectInfo = fTrackFilter->IsSelected(esd->GetTrack(imother));
675 if (!selectInfo) continue;
678 if (!usedTrack[imother]) {
680 usedTrack[imother] = kTRUE;
682 AliESDtrack *esdTrackM = esd->GetTrack(imother);
683 esdTrackM->GetPxPyPz(p);
684 esdTrackM->GetXYZ(pos);
685 esdTrackM->GetCovarianceXYZPxPyPz(covTr);
686 esdTrackM->GetESDpid(pid);
689 new(tracks[jTracks++]) AliAODTrack(esdTrackM->GetID(),
690 esdTrackM->GetLabel(),
696 (Short_t)esdTrackM->GetSign(),
697 esdTrackM->GetITSClusterMap(),
700 kTRUE, // check if this is right
701 kTRUE, // check if this is right
702 AliAODTrack::kPrimary,
704 aodRefs->AddAt(mother, imother);
706 if (esdTrackM->GetSign() > 0) nPosTracks++;
707 mother->SetFlags(esdTrackM->GetStatus());
708 mother->ConvertAliPIDtoAODPID();
709 primary->AddDaughter(mother);
710 mother->ConvertAliPIDtoAODPID();
711 SetAODPID(esdTrackM,mother,detpid,timezero);
714 // cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
715 // << " track " << imother << " has already been used!" << endl;
718 // Add the kink vertex
719 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
721 AliAODVertex * vkink =
722 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
726 esdTrack->GetID(), // This is the track ID of the mother's track!
727 AliAODVertex::kKink);
728 // Add the daughter track
730 AliAODTrack * daughter = NULL;
732 if (!usedTrack[idaughter]) {
734 usedTrack[idaughter] = kTRUE;
736 AliESDtrack *esdTrackD = esd->GetTrack(idaughter);
737 esdTrackD->GetPxPyPz(p);
738 esdTrackD->GetXYZ(pos);
739 esdTrackD->GetCovarianceXYZPxPyPz(covTr);
740 esdTrackD->GetESDpid(pid);
742 if (fTrackFilter) selectInfo = fTrackFilter->IsSelected(esdTrackD);
744 new(tracks[jTracks++]) AliAODTrack(esdTrackD->GetID(),
745 esdTrackD->GetLabel(),
751 (Short_t)esdTrackD->GetSign(),
752 esdTrackD->GetITSClusterMap(),
755 kTRUE, // check if this is right
756 kTRUE, // check if this is right
757 AliAODTrack::kSecondary,
760 aodRefs->AddAt(daughter, idaughter);
762 if (esdTrackD->GetSign() > 0) nPosTracks++;
763 daughter->SetFlags(esdTrackD->GetStatus());
764 daughter->ConvertAliPIDtoAODPID();
765 vkink->AddDaughter(daughter);
766 daughter->ConvertAliPIDtoAODPID();
767 SetAODPID(esdTrackD,daughter,detpid,timezero);
770 // cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
771 // << " track " << idaughter << " has already been used!" << endl;
779 // Tracks (primary and orphan)
781 if (fDebug > 0) printf("NUMBER OF ESD TRACKS %5d\n", nTracks);
783 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
786 if (usedTrack[nTrack]) continue;
788 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
789 UInt_t selectInfo = 0;
793 selectInfo = fTrackFilter->IsSelected(esdTrack);
794 if (!selectInfo) continue;
798 esdTrack->GetPxPyPz(p);
799 esdTrack->GetXYZ(pos);
800 esdTrack->GetCovarianceXYZPxPyPz(covTr);
801 esdTrack->GetESDpid(pid);
804 primary->AddDaughter(aodTrack =
805 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
806 esdTrack->GetLabel(),
812 (Short_t)esdTrack->GetSign(),
813 esdTrack->GetITSClusterMap(),
816 kTRUE, // check if this is right
817 kTRUE, // check if this is right
818 AliAODTrack::kPrimary,
821 aodRefs->AddAt(aodTrack, nTrack);
823 if (esdTrack->GetSign() > 0) nPosTracks++;
824 aodTrack->SetFlags(esdTrack->GetStatus());
825 aodTrack->ConvertAliPIDtoAODPID();
826 SetAODPID(esdTrack,aodTrack,detpid,timezero);
827 } // end of loop on tracks
829 // Update number of AOD tracks in header at the end of track loop (M.G.)
830 header->SetRefMultiplicity(jTracks);
831 header->SetRefMultiplicityPos(nPosTracks);
832 header->SetRefMultiplicityNeg(jTracks - nPosTracks);
834 printf(" NAODTRACKS=%d NPOS=%d NNEG=%d\n", jTracks, nPosTracks, jTracks - nPosTracks);
835 // Do not shrink the array of tracks - other filters may add to it (M.G)
836 // tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
838 // Access to the AOD container of PMD clusters
839 TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
840 Int_t jPmdClusters=0;
842 for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
843 // file pmd clusters, to be revised!
844 AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
847 Double_t posPmd[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ()};
848 Double_t pidPmd[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
850 // assoc cluster not set
851 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), posPmd, pidPmd);
854 // Access to the AOD container of clusters
855 TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
858 for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
860 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
862 Int_t id = cluster->GetID();
863 Int_t nLabel = cluster->GetNLabels();
864 TArrayI* labels = cluster->GetLabels();
866 if (labels) label = (cluster->GetLabels())->GetArray();
868 Float_t energy = cluster->E();
869 cluster->GetPosition(posF);
870 Char_t ttype = AliAODCluster::kUndef;
872 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
873 ttype=AliAODCluster::kPHOSNeutral;
875 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
876 ttype = AliAODCluster::kEMCALClusterv1;
880 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
888 caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
889 cluster->GetClusterDisp(),
890 cluster->GetM20(), cluster->GetM02(),
891 cluster->GetEmcCpvDistance(),
892 cluster->GetNExMax(),cluster->GetTOF()) ;
894 caloCluster->SetPIDFromESD(cluster->GetPid());
895 caloCluster->SetNCells(cluster->GetNCells());
896 caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
897 caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
899 TArrayI* matchedT = cluster->GetTracksMatched();
900 if (matchedT && cluster->GetTrackMatched() >= 0) {
901 for (Int_t im = 0; im < matchedT->GetSize(); im++) {
902 Int_t iESDtrack = matchedT->At(im);;
903 if (aodRefs->At(iESDtrack) != 0) {
904 caloCluster->AddTrackMatched((AliAODTrack*)aodRefs->At(iESDtrack));
910 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
911 // end of loop on calo clusters
913 // fill EMCAL cell info
914 if (esd->GetEMCALCells()) { // protection against missing ESD information
915 AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
916 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
918 AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
919 aodEMcells.CreateContainer(nEMcell);
920 aodEMcells.SetType(AliAODCaloCells::kEMCAL);
921 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
922 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
927 // fill PHOS cell info
928 if (esd->GetPHOSCells()) { // protection against missing ESD information
929 AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
930 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
932 AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
933 aodPHcells.CreateContainer(nPHcell);
934 aodPHcells.SetType(AliAODCaloCells::kPHOS);
935 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
936 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
942 AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
943 const AliMultiplicity *mult = esd->GetMultiplicity();
945 if (mult->GetNumberOfTracklets()>0) {
946 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
948 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
949 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0), mult->GetLabel(n, 1));
953 //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
964 void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid, Double_t timezero)
967 // Setter for the raw PID detector signals
970 if(esdtrack->Pt()>fHighPthreshold) {
971 detpid = new AliAODPid();
972 SetDetectorRawSignals(detpid,esdtrack,timezero);
973 aodtrack->SetDetPID(detpid);
976 if(esdtrack->Pt()> fPtshape->GetXmin()){
977 Double_t y = fPtshape->Eval(esdtrack->Pt())/fPtshape->Eval(fHighPthreshold);
978 if(gRandom->Rndm(0)<1./y){
979 detpid = new AliAODPid();
980 SetDetectorRawSignals(detpid,esdtrack,timezero);
981 aodtrack->SetDetPID(detpid);
988 void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtrack *track, Double_t timezero)
991 //assignment of the detector signals (AliXXXesdPID inspired)
994 AliInfo("no ESD track found. .....exiting");
998 aodpid->SetITSsignal(track->GetITSsignal());
999 aodpid->SetTPCsignal(track->GetTPCsignal());
1002 Int_t nslices = track->GetNumberOfTRDslices()*6;
1003 Double_t *trdslices = new Double_t[nslices];
1004 for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) {
1005 for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);
1009 aodpid->SetTRDsignal(track->GetNumberOfTRDslices()*6,trdslices);
1010 Double_t times[AliAODPid::kSPECIES]; track->GetIntegratedTimes(times);
1011 aodpid->SetIntegratedTimes(times);
1013 aodpid->SetTOFsignal(track->GetTOFsignal()-timezero); // to be fixed
1014 aodpid->SetHMPIDsignal(track->GetHMPIDsignal());
1017 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
1019 // Terminate analysis
1021 if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");