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 $ */
23 #include "AliAnalysisTaskESDfilter.h"
24 #include "AliAnalysisManager.h"
25 #include "AliESDEvent.h"
26 #include "AliAODEvent.h"
27 #include "AliESDInputHandler.h"
28 #include "AliAODHandler.h"
29 #include "AliAnalysisFilter.h"
30 #include "AliESDMuonTrack.h"
31 #include "AliESDVertex.h"
33 #include "AliESDkink.h"
34 #include "AliESDcascade.h"
35 #include "AliESDPmdTrack.h"
36 #include "AliESDCaloCluster.h"
37 #include "AliESDCaloCells.h"
38 #include "AliMultiplicity.h"
41 ClassImp(AliAnalysisTaskESDfilter)
43 ////////////////////////////////////////////////////////////////////////
45 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter():
53 // Default constructor
56 AliAnalysisTaskESDfilter::AliAnalysisTaskESDfilter(const char* name):
57 AliAnalysisTaskSE(name),
67 void AliAnalysisTaskESDfilter::UserCreateOutputObjects()
69 // Create the output container
70 OutputTree()->GetUserInfo()->Add(fTrackFilter);
73 void AliAnalysisTaskESDfilter::Init()
76 if (fDebug > 1) AliInfo("Init() \n");
77 // Call configuration file
81 void AliAnalysisTaskESDfilter::UserExec(Option_t */*option*/)
83 // Execute analysis for current event
86 Long64_t ientry = Entry();
87 if (fDebug > 0) printf("Filter: Analysing event # %5d\n", (Int_t) ientry);
88 if (fHighPthreshold == 0) AliInfo("detector PID signals are stored in each track");
89 if (!fPtshape) AliInfo("detector PID signals are not stored below the pt threshold");
93 void AliAnalysisTaskESDfilter::ConvertESDtoAOD() {
94 // ESD Filter analysis task executed for each event
95 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
96 AliESD* old = esd->GetAliESDOld();
98 // set arrays and pointers
104 Double_t p_pos_atv0[3];
105 Double_t p_neg_atv0[3];
110 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
111 for (Int_t i = 0; i < 21; i++) covTr [i] = 0.;
114 // loop over events and fill them
116 // Multiplicity information needed by the header (to be revised!)
117 Int_t nTracks = esd->GetNumberOfTracks();
118 // if (fDebug > 0) printf("-------------------Bo: Number of ESD tracks %d \n",nTracks);
120 Int_t nPosTracks = 0;
121 // for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack)
122 // if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
126 AliAODHeader* header = AODEvent()->GetHeader();
127 header->SetRunNumber(esd->GetRunNumber());
129 header->SetBunchCrossNumber(0);
130 header->SetOrbitNumber(0);
131 header->SetPeriodNumber(0);
132 header->SetEventType(0);
133 header->SetMuonMagFieldScale(-999.); // FIXME
134 header->SetCentrality(-999.); // FIXME
136 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
137 header->SetOrbitNumber(esd->GetOrbitNumber());
138 header->SetPeriodNumber(esd->GetPeriodNumber());
139 header->SetEventType(esd->GetEventType());
140 header->SetMuonMagFieldScale(-999.); // FIXME
141 header->SetCentrality(-999.); // FIXME
144 header->SetTriggerMask(esd->GetTriggerMask());
145 header->SetTriggerCluster(esd->GetTriggerCluster());
146 header->SetMagneticField(esd->GetMagneticField());
147 header->SetZDCN1Energy(esd->GetZDCN1Energy());
148 header->SetZDCP1Energy(esd->GetZDCP1Energy());
149 header->SetZDCN2Energy(esd->GetZDCN2Energy());
150 header->SetZDCP2Energy(esd->GetZDCP2Energy());
151 header->SetZDCEMEnergy(esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
154 Int_t nV0s = esd->GetNumberOfV0s();
155 Int_t nCascades = esd->GetNumberOfCascades();
156 Int_t nKinks = esd->GetNumberOfKinks();
157 Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;
159 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
161 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
164 printf(" NV0=%d NCASCADES=%d NKINKS=%d\n", nV0s, nCascades, nKinks);
166 AODEvent()->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
168 AliAODTrack *aodTrack = 0x0;
169 AliAODPid *detpid = 0x0;
170 Double_t timezero = 0; //TO BE FIXED
171 AliAODv0 *aodV0 = 0x0;
173 // RefArray to take into account the tracks associated to V0s
174 TRefArray *v0DaughterTracks = NULL;
175 if (nTracks>0) v0DaughterTracks = new TRefArray(nTracks);
177 // Array to take into account the tracks already added to the AOD
178 Bool_t * usedTrack = NULL;
180 usedTrack = new Bool_t[nTracks];
181 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
183 // Array to take into account the V0s already added to the AOD
184 Bool_t * usedV0 = NULL;
186 usedV0 = new Bool_t[nV0s];
187 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
189 // Array to take into account the kinks already added to the AOD
190 Bool_t * usedKink = NULL;
192 usedKink = new Bool_t[nKinks];
193 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
196 // Access to the AOD container of vertices
197 TClonesArray &vertices = *(AODEvent()->GetVertices());
200 // Access to the AOD container of tracks
201 TClonesArray &tracks = *(AODEvent()->GetTracks());
204 // Access to the AOD container of V0s
205 TClonesArray &V0s = *(AODEvent()->GetV0s());
208 // Add primary vertex. The primary tracks will be defined
209 // after the loops on the composite objects (V0, cascades, kinks)
210 const AliESDVertex *vtx = esd->GetPrimaryVertex();
212 vtx->GetXYZ(pos); // position
213 vtx->GetCovMatrix(covVtx); //covariance matrix
215 AliAODVertex * primary = new(vertices[jVertices++])
216 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
217 if (fDebug > 0) primary->Print();
219 // Create vertices starting from the most complex objects
223 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
224 AliESDcascade *cascade = esd->GetCascade(nCascade);
226 cascade->GetXYZ(pos[0], pos[1], pos[2]);
229 chi2 = cascade->GetChi2Xi(); // = chi2/NDF since NDF = 2*2-3
230 cascade->GetPosCovXi(covVtx);
233 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
235 // Add the cascade vertex
236 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
241 AliAODVertex::kCascade);
243 primary->AddDaughter(vcascade);
245 // Add the V0 from the cascade. The ESD class have to be optimized...
246 // Now we have to search for the corresponding Vo in the list of V0s
247 // using the indeces of the positive and negative tracks
249 Int_t posFromV0 = cascade->GetPindex();
250 Int_t negFromV0 = cascade->GetNindex();
256 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
258 v0 = esd->GetV0(iV0);
259 Int_t posV0 = v0->GetPindex();
260 Int_t negV0 = v0->GetNindex();
262 if (posV0==posFromV0 && negV0==negFromV0) {
268 AliAODVertex * vV0FromCascade = 0x0;
270 if (indV0>-1 && !usedV0[indV0] ) {
272 // the V0 exists in the array of V0s and is not used
274 usedV0[indV0] = kTRUE;
276 v0->GetXYZ(pos[0], pos[1], pos[2]);
278 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
279 v0->GetPosCov(covVtx);
282 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
285 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
293 // the V0 doesn't exist in the array of V0s or was used
294 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
295 // << " The V0 " << indV0
296 // << " doesn't exist in the array of V0s or was used!" << endl;
298 cascade->GetXYZ(pos[0], pos[1], pos[2]);
301 chi2 = v0->GetChi2V0();
302 cascade->GetPosCov(covVtx);
305 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
308 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
310 chi2, // = chi2/NDF since NDF = 2*2-3 (AM)
314 vcascade->AddDaughter(vV0FromCascade);
317 // Add the positive tracks from the V0
319 if (posFromV0>-1 && !usedTrack[posFromV0]) {
321 usedTrack[posFromV0] = kTRUE;
323 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
324 esdTrack->GetPxPyPz(p_pos);
325 esdTrack->GetXYZ(pos);
326 esdTrack->GetCovarianceXYZPxPyPz(covTr);
327 esdTrack->GetESDpid(pid);
328 UInt_t selectInfo = fTrackFilter->IsSelected(esdTrack);
330 vV0FromCascade->AddDaughter(aodTrack =
331 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
332 esdTrack->GetLabel(),
338 (Short_t)esdTrack->GetSign(),
339 esdTrack->GetITSClusterMap(),
342 kTRUE, // check if this is right
343 kFALSE, // check if this is right
344 AliAODTrack::kSecondary,
347 if (esdTrack->GetSign() > 0) nPosTracks++;
348 aodTrack->ConvertAliPIDtoAODPID();
349 aodTrack->SetFlags(esdTrack->GetStatus());
350 SetAODPID(esdTrack,aodTrack,detpid,timezero);
353 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
354 // << " track " << posFromV0 << " has already been used!" << endl;
357 // Add the negative tracks from the V0
359 if (negFromV0>-1 && !usedTrack[negFromV0]) {
361 usedTrack[negFromV0] = kTRUE;
363 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
364 esdTrack->GetPxPyPz(p_neg);
365 esdTrack->GetXYZ(pos);
366 esdTrack->GetCovarianceXYZPxPyPz(covTr);
367 esdTrack->GetESDpid(pid);
368 UInt_t selectInfo = fTrackFilter->IsSelected(esdTrack);
370 vV0FromCascade->AddDaughter(aodTrack =
371 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
372 esdTrack->GetLabel(),
378 (Short_t)esdTrack->GetSign(),
379 esdTrack->GetITSClusterMap(),
382 kTRUE, // check if this is right
383 kFALSE, // check if this is right
384 AliAODTrack::kSecondary,
388 if (esdTrack->GetSign() > 0) nPosTracks++;
389 aodTrack->ConvertAliPIDtoAODPID();
390 aodTrack->SetFlags(esdTrack->GetStatus());
391 SetAODPID(esdTrack,aodTrack,detpid,timezero);
394 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
395 // << " track " << negFromV0 << " has already been used!" << endl;
398 // add it to the V0 array as well
399 Double_t d0[2] = { -999., -99.};
400 // counting is probably wrong
401 new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
403 // Add the bachelor track from the cascade
405 Int_t bachelor = cascade->GetBindex();
407 if(bachelor>-1 && !usedTrack[bachelor]) {
409 usedTrack[bachelor] = kTRUE;
411 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
412 esdTrack->GetPxPyPz(p);
413 esdTrack->GetXYZ(pos);
414 esdTrack->GetCovarianceXYZPxPyPz(covTr);
415 esdTrack->GetESDpid(pid);
416 UInt_t selectInfo = fTrackFilter->IsSelected(esdTrack);
418 vcascade->AddDaughter(aodTrack =
419 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
420 esdTrack->GetLabel(),
426 (Short_t)esdTrack->GetSign(),
427 esdTrack->GetITSClusterMap(),
430 kTRUE, // check if this is right
431 kFALSE, // check if this is right
432 AliAODTrack::kSecondary,
435 if (esdTrack->GetSign() > 0) nPosTracks++;
436 aodTrack->ConvertAliPIDtoAODPID();
437 aodTrack->SetFlags(esdTrack->GetStatus());
438 SetAODPID(esdTrack,aodTrack,detpid,timezero);
441 // cerr << "Error: event " << esd->GetEventNumberInFile() << " cascade " << nCascade
442 // << " track " << bachelor << " has already been used!" << endl;
445 // Add the primary track of the cascade (if any)
447 } // end of the loop on cascades
451 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
453 if (usedV0[nV0]) continue; // skip if already added to the AOD
455 AliESDv0 *v0 = esd->GetV0(nV0);
457 v0->GetXYZ(pos[0], pos[1], pos[2]);
460 chi2 = v0->GetChi2V0(); // = chi2/NDF since NDF = 2*2-3
461 v0->GetPosCov(covVtx);
464 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
469 new(vertices[jVertices++]) AliAODVertex(pos,
475 primary->AddDaughter(vV0);
477 Int_t posFromV0 = v0->GetPindex();
478 Int_t negFromV0 = v0->GetNindex();
480 Float_t dcaPosToPrimVertexXYZ[2] = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
481 Float_t dcaNegToPrimVertexXYZ[2] = { 999., 999.}; // ..[0] = in XY plane and ..[1] = in Z
482 Double_t dcaDaughterToPrimVertex[2] = { 999., 999.}; // ..[0] = Pos and ..[1] = Neg
484 Double_t dcaV0Daughters = v0->GetDcaV0Daughters();
485 Double_t dcaV0ToPrimVertex = v0->GetD();
487 v0->GetPPxPyPz(p_pos_atv0[0],p_pos_atv0[1],p_pos_atv0[2]);
488 v0->GetNPxPyPz(p_neg_atv0[0],p_neg_atv0[1],p_neg_atv0[2]);
490 // Add the positive tracks from the V0
493 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
494 esdTrack->GetPxPyPz(p_pos);
495 esdTrack->GetXYZ(pos);
496 esdTrack->GetCovarianceXYZPxPyPz(covTr);
497 esdTrack->GetESDpid(pid);
498 esdTrack->GetImpactParameters(dcaPosToPrimVertexXYZ[0],dcaPosToPrimVertexXYZ[1]);
499 if (!usedTrack[posFromV0]) {
500 usedTrack[posFromV0] = kTRUE;
501 UInt_t selectInfo = fTrackFilter->IsSelected(esdTrack);
502 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
503 esdTrack->GetLabel(),
509 (Short_t)esdTrack->GetSign(),
510 esdTrack->GetITSClusterMap(),
513 kTRUE, // check if this is right
514 kFALSE, // check if this is right
515 AliAODTrack::kSecondary,
517 v0DaughterTracks->AddAt(aodTrack,posFromV0);
518 // if (fDebug > 0) printf("-------------------Bo: pos track from original pt %.3f \n",aodTrack->Pt());
519 if (esdTrack->GetSign() > 0) nPosTracks++;
520 aodTrack->ConvertAliPIDtoAODPID();
521 aodTrack->SetFlags(esdTrack->GetStatus());
522 SetAODPID(esdTrack,aodTrack,detpid,timezero);
525 aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(posFromV0));
526 // if (fDebug > 0) printf("-------------------Bo pos track from refArray pt %.3f \n",aodTrack->Pt());
528 vV0->AddDaughter(aodTrack);
531 // Add the negative tracks from the V0
534 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
535 esdTrack->GetPxPyPz(p_neg);
536 esdTrack->GetXYZ(pos);
537 esdTrack->GetCovarianceXYZPxPyPz(covTr);
538 esdTrack->GetESDpid(pid);
539 esdTrack->GetImpactParameters(dcaNegToPrimVertexXYZ[0],dcaNegToPrimVertexXYZ[1]);
541 if (!usedTrack[negFromV0]) {
542 usedTrack[negFromV0] = kTRUE;
543 UInt_t selectInfo = fTrackFilter->IsSelected(esdTrack);
544 aodTrack = new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
545 esdTrack->GetLabel(),
551 (Short_t)esdTrack->GetSign(),
552 esdTrack->GetITSClusterMap(),
555 kTRUE, // check if this is right
556 kFALSE, // check if this is right
557 AliAODTrack::kSecondary,
560 v0DaughterTracks->AddAt(aodTrack,negFromV0);
561 // if (fDebug > 0) printf("-------------------Bo: neg track from original pt %.3f \n",aodTrack->Pt());
562 if (esdTrack->GetSign() > 0) nPosTracks++;
563 aodTrack->ConvertAliPIDtoAODPID();
564 aodTrack->SetFlags(esdTrack->GetStatus());
565 SetAODPID(esdTrack,aodTrack,detpid,timezero);
568 aodTrack = dynamic_cast<AliAODTrack*>(v0DaughterTracks->At(negFromV0));
569 // if (fDebug > 0) printf("-------------------Bo neg track from refArray pt %.3f \n",aodTrack->Pt());
571 vV0->AddDaughter(aodTrack);
573 dcaDaughterToPrimVertex[0] =
574 TMath::Sqrt(dcaPosToPrimVertexXYZ[0]*dcaPosToPrimVertexXYZ[0]
575 +dcaPosToPrimVertexXYZ[1]*dcaPosToPrimVertexXYZ[1]);
576 dcaDaughterToPrimVertex[1] =
577 TMath::Sqrt(dcaNegToPrimVertexXYZ[0]*dcaNegToPrimVertexXYZ[0]
578 +dcaNegToPrimVertexXYZ[1]*dcaNegToPrimVertexXYZ[1]);
579 // add it to the V0 array as well
580 aodV0 = new(V0s[jV0s++])
581 AliAODv0(vV0, dcaV0Daughters, dcaV0ToPrimVertex, p_pos_atv0, p_neg_atv0, dcaDaughterToPrimVertex); // to be refined
582 // set the aod v0 on-the-fly status
583 aodV0->SetOnFlyStatus(v0->GetOnFlyStatus());
585 // printf("-------------------Bo: In the v0 loop: onFlyStatus=%d,dcaV0Daughters=%.3f dcaV0ToPrimVertex=%.3f dcaDaughterToPrimVertex=[%.3f,%.3f]\n",
586 // aodV0->GetOnFlyStatus(), aodV0->DcaV0Daughters(), aodV0->DcaV0ToPrimVertex(),
587 // aodV0->DcaPosToPrimVertex(),aodV0->DcaNegToPrimVertex());
590 // end of the loop on V0s
592 // Kinks: it is a big mess the access to the information in the kinks
593 // The loop is on the tracks in order to find the mother and daugther of each kink
596 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
598 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
600 Int_t ikink = esdTrack->GetKinkIndex(0);
602 if (ikink && nKinks) {
603 // Negative kink index: mother, positive: daughter
605 // Search for the second track of the kink
607 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
609 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
611 Int_t jkink = esdTrack1->GetKinkIndex(0);
613 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
615 // The two tracks are from the same kink
617 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
620 Int_t idaughter = -1;
622 if (ikink<0 && jkink>0) {
627 else if (ikink>0 && jkink<0) {
633 // cerr << "Error: Wrong combination of kink indexes: "
634 // << ikink << " " << jkink << endl;
638 // Add the mother track
640 AliAODTrack * mother = NULL;
642 if (!usedTrack[imother]) {
644 usedTrack[imother] = kTRUE;
646 AliESDtrack *esdTrackM = esd->GetTrack(imother);
647 esdTrackM->GetPxPyPz(p);
648 esdTrackM->GetXYZ(pos);
649 esdTrackM->GetCovarianceXYZPxPyPz(covTr);
650 esdTrackM->GetESDpid(pid);
651 UInt_t selectInfo = fTrackFilter->IsSelected(esdTrackM);
653 new(tracks[jTracks++]) AliAODTrack(esdTrackM->GetID(),
654 esdTrackM->GetLabel(),
660 (Short_t)esdTrackM->GetSign(),
661 esdTrackM->GetITSClusterMap(),
664 kTRUE, // check if this is right
665 kTRUE, // check if this is right
666 AliAODTrack::kPrimary,
668 if (esdTrackM->GetSign() > 0) nPosTracks++;
669 mother->SetFlags(esdTrackM->GetStatus());
670 mother->ConvertAliPIDtoAODPID();
671 primary->AddDaughter(mother);
672 mother->ConvertAliPIDtoAODPID();
673 SetAODPID(esdTrackM,mother,detpid,timezero);
676 // cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
677 // << " track " << imother << " has already been used!" << endl;
680 // Add the kink vertex
681 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
683 AliAODVertex * vkink =
684 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
688 esdTrack->GetID(), // This is the track ID of the mother's track!
689 AliAODVertex::kKink);
690 // Add the daughter track
692 AliAODTrack * daughter = NULL;
694 if (!usedTrack[idaughter]) {
696 usedTrack[idaughter] = kTRUE;
698 AliESDtrack *esdTrackD = esd->GetTrack(idaughter);
699 esdTrackD->GetPxPyPz(p);
700 esdTrackD->GetXYZ(pos);
701 esdTrackD->GetCovarianceXYZPxPyPz(covTr);
702 esdTrackD->GetESDpid(pid);
703 UInt_t selectInfo = fTrackFilter->IsSelected(esdTrackD);
705 new(tracks[jTracks++]) AliAODTrack(esdTrackD->GetID(),
706 esdTrackD->GetLabel(),
712 (Short_t)esdTrackD->GetSign(),
713 esdTrackD->GetITSClusterMap(),
716 kTRUE, // check if this is right
717 kTRUE, // check if this is right
718 AliAODTrack::kSecondary,
721 if (esdTrackD->GetSign() > 0) nPosTracks++;
722 daughter->SetFlags(esdTrackD->GetStatus());
723 daughter->ConvertAliPIDtoAODPID();
724 vkink->AddDaughter(daughter);
725 daughter->ConvertAliPIDtoAODPID();
726 SetAODPID(esdTrackD,daughter,detpid,timezero);
729 // cerr << "Error: event " << esd->GetEventNumberInFile() << " kink " << TMath::Abs(ikink)-1
730 // << " track " << idaughter << " has already been used!" << endl;
738 // Tracks (primary and orphan)
740 if (fDebug > 0) printf("NUMBER OF ESD TRACKS %5d\n", nTracks);
742 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
745 if (usedTrack[nTrack]) continue;
747 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
748 UInt_t selectInfo = 0;
752 selectInfo = fTrackFilter->IsSelected(esdTrack);
753 if (!selectInfo) continue;
757 esdTrack->GetPxPyPz(p);
758 esdTrack->GetXYZ(pos);
759 esdTrack->GetCovarianceXYZPxPyPz(covTr);
760 esdTrack->GetESDpid(pid);
762 Float_t impactXY, impactZ;
764 esdTrack->GetImpactParameters(impactXY,impactZ);
767 // track inside the beam pipe
769 primary->AddDaughter(aodTrack =
770 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
771 esdTrack->GetLabel(),
777 (Short_t)esdTrack->GetSign(),
778 esdTrack->GetITSClusterMap(),
781 kTRUE, // check if this is right
782 kTRUE, // check if this is right
783 AliAODTrack::kPrimary,
786 if (esdTrack->GetSign() > 0) nPosTracks++;
787 aodTrack->SetFlags(esdTrack->GetStatus());
788 aodTrack->ConvertAliPIDtoAODPID();
789 SetAODPID(esdTrack,aodTrack,detpid,timezero);
792 // outside the beam pipe: orphan track
793 // Don't write them anymore!
797 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
798 esdTrack->GetLabel(),
804 (Short_t)esdTrack->GetSign(),
805 esdTrack->GetITSClusterMap(),
808 kFALSE, // check if this is right
809 kFALSE, // check if this is right
810 AliAODTrack::kOrphan,
812 if (esdTrack->GetSign() > 0) nPosTracks++;
813 aodTrack->SetFlags(esdTrack->GetStatus());
814 aodTrack->ConvertAliPIDtoAODPID();
817 } // end of loop on tracks
819 // Update number of AOD tracks in header at the end of track loop (M.G.)
820 header->SetRefMultiplicity(jTracks);
821 header->SetRefMultiplicityPos(nPosTracks);
822 header->SetRefMultiplicityNeg(jTracks - nPosTracks);
824 printf(" NAODTRACKS=%d NPOS=%d NNEG=%d\n", jTracks, nPosTracks, jTracks - nPosTracks);
825 // Do not shrink the array of tracks - other filters may add to it (M.G)
826 // tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
828 // Access to the AOD container of PMD clusters
829 TClonesArray &pmdClusters = *(AODEvent()->GetPmdClusters());
830 Int_t jPmdClusters=0;
832 for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
833 // file pmd clusters, to be revised!
834 AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
837 Double_t posPmd[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ()};
838 Double_t pidPmd[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
840 // assoc cluster not set
841 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), posPmd, pidPmd);
844 // Access to the AOD container of clusters
845 TClonesArray &caloClusters = *(AODEvent()->GetCaloClusters());
848 for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
850 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
852 Int_t id = cluster->GetID();
853 Int_t nLabel = cluster->GetNLabels();
854 TArrayI* labels = cluster->GetLabels();
856 if (labels) label = (cluster->GetLabels())->GetArray();
858 Float_t energy = cluster->E();
859 cluster->GetPosition(posF);
860 Char_t ttype = AliAODCluster::kUndef;
862 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
863 ttype=AliAODCluster::kPHOSNeutral;
865 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
866 ttype = AliAODCluster::kEMCALClusterv1;
870 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
878 caloCluster->SetCaloCluster(cluster->GetDistanceToBadChannel(),
879 cluster->GetClusterDisp(),
880 cluster->GetM20(), cluster->GetM02(),
881 cluster->GetEmcCpvDistance(),
882 cluster->GetNExMax(),cluster->GetTOF()) ;
884 caloCluster->SetPIDFromESD(cluster->GetPid());
885 caloCluster->SetNCells(cluster->GetNCells());
886 caloCluster->SetCellsAbsId(cluster->GetCellsAbsId());
887 caloCluster->SetCellsAmplitudeFraction(cluster->GetCellsAmplitudeFraction());
889 TArrayI* matchedT = cluster->GetTracksMatched();
890 if (matchedT && cluster->GetTrackMatched() >= 0) {
891 for (Int_t im = 0; im < matchedT->GetSize(); im++) {
892 caloCluster->AddTrackMatched((esd->GetTrack(im)));
897 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
898 // end of loop on calo clusters
900 // fill EMCAL cell info
901 if (esd->GetEMCALCells()) { // protection against missing ESD information
902 AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
903 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
905 AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
906 aodEMcells.CreateContainer(nEMcell);
907 aodEMcells.SetType(AliAODCaloCells::kEMCAL);
908 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
909 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
914 // fill PHOS cell info
915 if (esd->GetPHOSCells()) { // protection against missing ESD information
916 AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
917 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
919 AliAODCaloCells &aodPHcells = *(AODEvent()->GetPHOSCells());
920 aodPHcells.CreateContainer(nPHcell);
921 aodPHcells.SetType(AliAODCaloCells::kPHOS);
922 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
923 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
929 AliAODTracklets &SPDTracklets = *(AODEvent()->GetTracklets());
930 const AliMultiplicity *mult = esd->GetMultiplicity();
932 if (mult->GetNumberOfTracklets()>0) {
933 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
935 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
936 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n, 0), mult->GetLabel(n, 1));
940 //Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
946 delete v0DaughterTracks;
951 void AliAnalysisTaskESDfilter::SetAODPID(AliESDtrack *esdtrack, AliAODTrack *aodtrack, AliAODPid *detpid, Double_t timezero)
954 // Setter for the raw PID detector signals
957 if(esdtrack->Pt()>fHighPthreshold) {
958 detpid = new AliAODPid();
959 SetDetectorRawSignals(detpid,esdtrack,timezero);
960 aodtrack->SetDetPID(detpid);
963 if(esdtrack->Pt()> fPtshape->GetXmin()){
964 Double_t y = fPtshape->Eval(esdtrack->Pt())/fPtshape->Eval(fHighPthreshold);
965 if(gRandom->Rndm(0)<1./y){
966 detpid = new AliAODPid();
967 SetDetectorRawSignals(detpid,esdtrack,timezero);
968 aodtrack->SetDetPID(detpid);
975 void AliAnalysisTaskESDfilter::SetDetectorRawSignals(AliAODPid *aodpid, AliESDtrack *track, Double_t timezero)
978 //assignment of the detector signals (AliXXXesdPID inspired)
981 AliInfo("no ESD track found. .....exiting");
985 aodpid->SetITSsignal(track->GetITSsignal());
986 aodpid->SetTPCsignal(track->GetTPCsignal());
989 Int_t nslices = track->GetNumberOfTRDslices()*6;
990 Double_t *trdslices = new Double_t[nslices];
991 for(Int_t iSl =0; iSl < track->GetNumberOfTRDslices(); iSl++) {
992 for(Int_t iPl =0; iPl<6; iPl++) trdslices[iPl*track->GetNumberOfTRDslices()+iSl] = track->GetTRDslice(iPl,iSl);
996 aodpid->SetTRDsignal(track->GetNumberOfTRDslices()*6,trdslices);
997 Double_t times[AliAODPid::kSPECIES]; track->GetIntegratedTimes(times);
998 aodpid->SetIntegratedTimes(times);
1000 aodpid->SetTOFsignal(track->GetTOFsignal()-timezero); // to be fixed
1001 aodpid->SetHMPIDsignal(track->GetHMPIDsignal());
1004 void AliAnalysisTaskESDfilter::Terminate(Option_t */*option*/)
1006 // Terminate analysis
1008 if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n");