1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //-----------------------------------------------------------------
19 // Implementation of the ESD class
20 // This is the class to deal with during the phisical analysis of data
21 // This class is generated directly by the reconstruction methods
22 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
23 //-----------------------------------------------------------------
26 #include "AliESDfriend.h"
30 //______________________________________________________________________________
32 fEventNumberInFile(0),
54 fTracks("AliESDtrack",15000),
55 fHLTConfMapTracks("AliESDHLTtrack",25000),
56 fHLTHoughTracks("AliESDHLTtrack",15000),
57 fMuonTracks("AliESDMuonTrack",30),
58 fPmdTracks("AliESDPmdTrack",3000),
59 fTrdTracks("AliESDTrdTrack",300),
61 fCascades("AliESDcascade",20),
62 fKinks("AliESDkink",4000),
63 fCaloClusters("AliESDCaloCluster",10000),
65 fFirstEMCALCluster(-1),
66 fEMCALTriggerPosition(0x0),
67 fEMCALTriggerAmplitudes(0x0),
69 fFirstPHOSCluster(-1),
70 fPHOSTriggerPosition(0x0),
71 fPHOSTriggerAmplitudes(0x0),
74 fErrorLogs("AliRawDataErrorLog",5)
77 for (Int_t i=0; i<24; i++) {
81 for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
82 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=0.;
85 //______________________________________________________________________________
86 AliESD::AliESD(const AliESD& esd):
88 fEventNumberInFile(esd.fEventNumberInFile),
89 fBunchCrossNumber(esd.fBunchCrossNumber),
90 fOrbitNumber(esd.fOrbitNumber),
91 fPeriodNumber(esd.fPeriodNumber),
92 fRunNumber(esd.fRunNumber),
93 fTimeStamp(esd.fTimeStamp),
94 fEventType(esd.fEventType),
95 fTriggerMask(esd.fTriggerMask),
96 fTriggerCluster(esd.fTriggerCluster),
97 fRecoVersion(esd.fRecoVersion),
98 fMagneticField(esd.fMagneticField),
99 fZDCN1Energy(esd.fZDCN1Energy),
100 fZDCP1Energy(esd.fZDCP1Energy),
101 fZDCN2Energy(esd.fZDCN2Energy),
102 fZDCP2Energy(esd.fZDCP2Energy),
103 fZDCEMEnergy(esd.fZDCEMEnergy),
104 fZDCParticipants(esd.fZDCParticipants),
105 fT0zVertex(esd.fT0zVertex),
106 fSPDVertex(esd.fSPDVertex),
107 fPrimaryVertex(esd.fPrimaryVertex),
108 fSPDMult(esd.fSPDMult),
109 fT0timeStart(esd.fT0timeStart),
110 fTracks(*((TClonesArray*)esd.fTracks.Clone())),
111 fHLTConfMapTracks(*((TClonesArray*)esd.fHLTConfMapTracks.Clone())),
112 fHLTHoughTracks(*((TClonesArray*)esd.fHLTHoughTracks.Clone())),
113 fMuonTracks(*((TClonesArray*)esd.fMuonTracks.Clone())),
114 fPmdTracks(*((TClonesArray*)esd.fPmdTracks.Clone())),
115 fTrdTracks(*((TClonesArray*)esd.fTrdTracks.Clone())),
116 fV0s(*((TClonesArray*)esd.fV0s.Clone())),
117 fCascades(*((TClonesArray*)esd.fCascades.Clone())),
118 fKinks(*((TClonesArray*)esd.fKinks.Clone())),
119 fCaloClusters(*((TClonesArray*)esd.fCaloClusters.Clone())),
120 fEMCALClusters(esd.fEMCALClusters),
121 fFirstEMCALCluster(esd.fFirstEMCALCluster),
122 fEMCALTriggerPosition(esd. fEMCALTriggerPosition),
123 fEMCALTriggerAmplitudes(esd.fEMCALTriggerAmplitudes),
124 fPHOSClusters(esd.fPHOSClusters),
125 fFirstPHOSCluster(esd.fFirstPHOSCluster),
126 fPHOSTriggerPosition(esd.fPHOSTriggerPosition),
127 fPHOSTriggerAmplitudes(esd.fPHOSTriggerAmplitudes),
128 fESDFMD(esd.fESDFMD),
129 fESDVZERO(esd.fESDVZERO),
130 fErrorLogs(*((TClonesArray*)esd.fErrorLogs.Clone()))
132 for (Int_t i=0; i<24; i++) {
133 fT0time[i] = esd.fT0time[i];
134 fT0amplitude[i] = esd.fT0amplitude[i];
136 for (Int_t i=0; i<2; i++) fDiamondXY[i]=esd.fDiamondXY[i];
137 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
140 //______________________________________________________________________________
144 // Standard destructor
147 fHLTConfMapTracks.Delete();
148 fHLTHoughTracks.Delete();
149 fMuonTracks.Delete();
155 fCaloClusters.Delete();
158 // fEMCALTriggerPosition->Delete();
159 // fEMCALTriggerAmplitudes->Delete();
160 // fPHOSTriggerPosition->Delete();
161 // fPHOSTriggerAmplitudes->Delete();
162 // delete fEMCALTriggerPosition;
163 // delete fEMCALTriggerAmplitudes;
164 // delete fPHOSTriggerPosition;
165 // delete fPHOSTriggerAmplitudes;
170 //______________________________________________________________________________
173 fEventNumberInFile=0;
192 new (&fSPDVertex) AliESDVertex();
193 new (&fPrimaryVertex) AliESDVertex();
194 new (&fSPDMult) AliMultiplicity();
196 fHLTConfMapTracks.Clear();
197 fHLTHoughTracks.Clear();
203 fCaloClusters.Clear();
205 fFirstEMCALCluster=-1;
207 fFirstPHOSCluster=-1;
208 if (fESDFMD) fESDFMD->Clear();
209 // fEMCALTriggerPosition->Clear();
210 // fEMCALTriggerAmplitudes->Clear();
211 // fPHOSTriggerPosition->Clear();
212 // fPHOSTriggerAmplitudes->Clear();
217 Bool_t AliESD::RemoveKink(Int_t rm) {
218 // ---------------------------------------------------------
219 // Remove a kink candidate and references to it from ESD,
220 // if this candidate does not come from a reconstructed decay
221 // Not yet implemented...
222 // ---------------------------------------------------------
223 Int_t last=GetNumberOfKinks()-1;
224 if ((rm<0)||(rm>last)) return kFALSE;
229 Bool_t AliESD::RemoveV0(Int_t rm) {
230 // ---------------------------------------------------------
231 // Remove a V0 candidate and references to it from ESD,
232 // if this candidate does not come from a reconstructed decay
233 // ---------------------------------------------------------
234 Int_t last=GetNumberOfV0s()-1;
235 if ((rm<0)||(rm>last)) return kFALSE;
237 AliESDv0 *v0=GetV0(rm);
238 Int_t idxP=v0->GetPindex(), idxN=v0->GetNindex();
241 Int_t lastIdxP=v0->GetPindex(), lastIdxN=v0->GetNindex();
245 // Check if this V0 comes from a reconstructed decay
246 Int_t ncs=GetNumberOfCascades();
247 for (Int_t n=0; n<ncs; n++) {
248 AliESDcascade *cs=GetCascade(n);
250 Int_t csIdxP=cs->GetPindex();
251 Int_t csIdxN=cs->GetNindex();
254 if (idxN==csIdxN) return kFALSE;
256 if (csIdxP==lastIdxP)
257 if (csIdxN==lastIdxN) used++;
260 //Replace the removed V0 with the last V0
261 TClonesArray &a=fV0s;
262 delete a.RemoveAt(rm);
264 if (rm==last) return kTRUE;
266 //v0 is pointing to the last V0 candidate...
267 new (a[rm]) AliESDv0(*v0);
268 delete a.RemoveAt(last);
270 if (!used) return kTRUE;
273 // Remap the indices of the daughters of reconstructed decays
274 for (Int_t n=0; n<ncs; n++) {
275 AliESDcascade *cs=GetCascade(n);
278 Int_t csIdxP=cs->GetPindex();
279 Int_t csIdxN=cs->GetNindex();
281 if (csIdxP==lastIdxP)
282 if (csIdxN==lastIdxN) {
283 cs->AliESDv0::SetIndex(1,idxP);
284 cs->AliESDv0::SetIndex(0,idxN);
286 if (!used) return kTRUE;
293 Bool_t AliESD::RemoveTrack(Int_t rm) {
294 // ---------------------------------------------------------
295 // Remove a track and references to it from ESD,
296 // if this track does not come from a reconstructed decay
297 // ---------------------------------------------------------
298 Int_t last=GetNumberOfTracks()-1;
299 if ((rm<0)||(rm>last)) return kFALSE;
303 // Check if this track comes from a reconstructed decay
304 Int_t nv0=GetNumberOfV0s();
305 for (Int_t n=0; n<nv0; n++) {
306 AliESDv0 *v0=GetV0(n);
308 Int_t idx=v0->GetNindex();
309 if (rm==idx) return kFALSE;
310 if (idx==last) used++;
313 if (rm==idx) return kFALSE;
314 if (idx==last) used++;
317 Int_t ncs=GetNumberOfCascades();
318 for (Int_t n=0; n<ncs; n++) {
319 AliESDcascade *cs=GetCascade(n);
321 Int_t idx=cs->GetIndex();
322 if (rm==idx) return kFALSE;
323 if (idx==last) used++;
326 Int_t nkn=GetNumberOfKinks();
327 for (Int_t n=0; n<nkn; n++) {
328 AliESDkink *kn=GetKink(n);
330 Int_t idx=kn->GetIndex(0);
331 if (rm==idx) return kFALSE;
332 if (idx==last) used++;
335 if (rm==idx) return kFALSE;
336 if (idx==last) used++;
340 //Replace the removed track with the last track
341 TClonesArray &a=fTracks;
342 delete a.RemoveAt(rm);
344 if (rm==last) return kTRUE;
346 AliESDtrack *t=GetTrack(last);
348 new (a[rm]) AliESDtrack(*t);
349 delete a.RemoveAt(last);
351 if (!used) return kTRUE;
354 // Remap the indices of the daughters of reconstructed decays
355 for (Int_t n=0; n<nv0; n++) {
356 AliESDv0 *v0=GetV0(n);
357 if (v0->GetIndex(0)==last) {
360 if (!used) return kTRUE;
362 if (v0->GetIndex(1)==last) {
365 if (!used) return kTRUE;
369 for (Int_t n=0; n<ncs; n++) {
370 AliESDcascade *cs=GetCascade(n);
371 if (cs->GetIndex()==last) {
374 if (!used) return kTRUE;
378 for (Int_t n=0; n<nkn; n++) {
379 AliESDkink *kn=GetKink(n);
380 if (kn->GetIndex(0)==last) {
383 if (!used) return kTRUE;
385 if (kn->GetIndex(1)==last) {
388 if (!used) return kTRUE;
396 Bool_t AliESD::Clean(Float_t *cleanPars) {
398 // Remove the data which are not needed for the physics analysis.
400 // 1) Cleaning the V0 candidates
401 // ---------------------------
402 // If the cosine of the V0 pointing angle "csp" and
403 // the DCA between the daughter tracks "dca" does not satisfy
406 // csp > cleanPars[1] + dca/cleanPars[0]*(1.- cleanPars[1])
408 // an attempt to remove this V0 candidate from ESD is made.
410 // The V0 candidate gets removed if it does not belong to any
411 // recosntructed cascade decay
413 // 12.11.2007, optimal values: cleanPars[0]=0.5, cleanPars[1]=0.999
415 // 2) Cleaning the tracks
416 // ----------------------
417 // If track's transverse parameter is larger than cleanPars[2]
419 // track's longitudinal parameter is larger than cleanPars[3]
420 // an attempt to remove this track from ESD is made.
422 // The track gets removed if it does not come
423 // from a reconstructed decay
427 Float_t dcaMax=cleanPars[0];
428 Float_t cspMin=cleanPars[1];
430 Int_t nV0s=GetNumberOfV0s();
431 for (Int_t i=nV0s-1; i>=0; i--) {
432 AliESDv0 *v0=GetV0(i);
434 Float_t dca=v0->GetDcaV0Daughters();
435 Float_t csp=v0->GetV0CosineOfPointingAngle();
436 Float_t cspcut=cspMin + dca/dcaMax*(1.-cspMin);
437 if (csp > cspcut) continue;
439 if (RemoveV0(i)) rc=kTRUE;
443 Float_t dmax=cleanPars[2], zmax=cleanPars[3];
445 const AliESDVertex *vertex=GetVertex();
446 Bool_t vtxOK=vertex->GetStatus();
448 Int_t nTracks=GetNumberOfTracks();
449 for (Int_t i=nTracks-1; i>=0; i--) {
450 AliESDtrack *track=GetTrack(i);
451 Float_t xy,z; track->GetImpactParameters(xy,z);
452 if ((TMath::Abs(xy) > dmax) || (vtxOK && (TMath::Abs(z) > zmax))) {
453 if (RemoveTrack(i)) rc=kTRUE;
460 Int_t AliESD::AddV0(const AliESDv0 *v) {
464 Int_t idx=fV0s.GetEntriesFast();
465 new(fV0s[idx]) AliESDv0(*v);
469 //______________________________________________________________________________
470 void AliESD::Print(Option_t *) const
473 // Print header information of the event
475 printf("ESD run information\n");
476 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
477 GetEventNumberInFile(),
478 GetBunchCrossNumber(),
483 GetMagneticField() );
484 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
485 fPrimaryVertex.GetXv(), fPrimaryVertex.GetXRes(),
486 fPrimaryVertex.GetYv(), fPrimaryVertex.GetYRes(),
487 fPrimaryVertex.GetZv(), fPrimaryVertex.GetZRes());
488 printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
489 GetDiamondX(),GetDiamondY());
490 printf("SPD Multiplicity. Number of tracklets %d \n",
491 fSPDMult.GetNumberOfTracklets());
492 printf("Event from reconstruction version %d \n",fRecoVersion);
493 printf("Number of tracks: \n");
494 printf(" charged %d\n", GetNumberOfTracks());
495 printf(" hlt CF %d\n", GetNumberOfHLTConfMapTracks());
496 printf(" hlt HT %d\n", GetNumberOfHLTHoughTracks());
497 printf(" muon %d\n", GetNumberOfMuonTracks());
498 printf(" pmd %d\n", GetNumberOfPmdTracks());
499 printf(" trd %d\n", GetNumberOfTrdTracks());
500 printf(" v0 %d\n", GetNumberOfV0s());
501 printf(" cascades %d\n", GetNumberOfCascades());
502 printf(" kinks %d\n", GetNumberOfKinks());
503 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
504 printf(" phos %d\n", GetNumberOfPHOSClusters());
505 printf(" emcal %d\n", GetNumberOfEMCALClusters());
506 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
507 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
510 void AliESD::SetESDfriend(const AliESDfriend *ev) {
512 // Attaches the complementary info to the ESD
516 Int_t ntrk=ev->GetNumberOfTracks();
518 for (Int_t i=0; i<ntrk; i++) {
519 const AliESDfriendTrack *f=ev->GetTrack(i);
520 GetTrack(i)->SetFriendTrack(f);
524 void AliESD::GetESDfriend(AliESDfriend *ev) const {
526 // Extracts the complementary info from the ESD
530 Int_t ntrk=GetNumberOfTracks();
532 for (Int_t i=0; i<ntrk; i++) {
533 AliESDtrack *t=GetTrack(i);
534 const AliESDfriendTrack *f=t->GetFriendTrack();
537 t->ReleaseESDfriendTrack();// Not to have two copies of "friendTrack"