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();
216 Bool_t AliESD::RemoveTrack(Int_t rm) {
217 // ---------------------------------------------------------
218 // Remove a track and references to it from ESD,
219 // if this track does not come from a reconstructed decay
220 // ---------------------------------------------------------
221 Int_t last=GetNumberOfTracks()-1;
222 if ((rm<0)||(rm>last)) return kFALSE;
226 // Check if this track comes from a reconstructed decay
227 Int_t nv0=GetNumberOfV0s();
228 for (Int_t n=0; n<nv0; n++) {
229 AliESDv0 *v0=GetV0(n);
231 Int_t idx=v0->GetNindex();
232 if (rm==idx) return kFALSE;
233 if (idx==last) used++;
236 if (rm==idx) return kFALSE;
237 if (idx==last) used++;
240 Int_t ncs=GetNumberOfCascades();
241 for (Int_t n=0; n<ncs; n++) {
242 AliESDcascade *cs=GetCascade(n);
244 Int_t idx=cs->GetIndex();
245 if (rm==idx) return kFALSE;
246 if (idx==last) used++;
249 Int_t nkn=GetNumberOfKinks();
250 for (Int_t n=0; n<nkn; n++) {
251 AliESDkink *kn=GetKink(n);
253 Int_t idx=kn->GetIndex(0);
254 if (rm==idx) return kFALSE;
255 if (idx==last) used++;
258 if (rm==idx) return kFALSE;
259 if (idx==last) used++;
263 //Replace the removed track with the last track
264 TClonesArray &a=fTracks;
265 delete a.RemoveAt(rm);
267 if (rm==last) return kTRUE;
269 AliESDtrack *t=GetTrack(last);
271 new (a[rm]) AliESDtrack(*t);
272 delete a.RemoveAt(last);
274 if (!used) return kTRUE;
277 // Remap the indices of the daughters of reconstructed decays
278 for (Int_t n=0; n<nv0; n++) {
279 AliESDv0 *v0=GetV0(n);
280 if (v0->GetIndex(0)==last) {
283 if (!used) return kTRUE;
285 if (v0->GetIndex(1)==last) {
288 if (!used) return kTRUE;
292 for (Int_t n=0; n<ncs; n++) {
293 AliESDcascade *cs=GetCascade(n);
294 if (cs->GetIndex()==last) {
297 if (!used) return kTRUE;
301 for (Int_t n=0; n<nkn; n++) {
302 AliESDkink *kn=GetKink(n);
303 if (kn->GetIndex(0)==last) {
306 if (!used) return kTRUE;
308 if (kn->GetIndex(1)==last) {
311 if (!used) return kTRUE;
318 Bool_t AliESD::Clean(Float_t *cleanPars) {
320 // Remove the data which are not needed for the physics analysis.
322 // If track's transverse parameter is larger than dmax
324 // track's longitudinal parameter is larger than zmax
325 // an attempt to remove this track from ESD is made.
327 // The track gets removed if it does not come
328 // from a reconstructed decay
331 Float_t dmax=cleanPars[0], zmax=cleanPars[1];
333 const AliESDVertex *vertex=GetVertex();
334 Bool_t vtxOK=vertex->GetStatus(), rc=kFALSE;
336 Int_t nTracks=GetNumberOfTracks();
337 for (Int_t i=nTracks-1; i>=0; i--) {
338 AliESDtrack *track=GetTrack(i);
339 Float_t xy,z; track->GetImpactParameters(xy,z);
340 if ((TMath::Abs(xy) > dmax) || (vtxOK && (TMath::Abs(z) > zmax))) {
341 if (RemoveTrack(i)) rc=kTRUE;
348 Int_t AliESD::AddV0(const AliESDv0 *v) {
352 Int_t idx=fV0s.GetEntriesFast();
353 new(fV0s[idx]) AliESDv0(*v);
357 //______________________________________________________________________________
358 void AliESD::Print(Option_t *) const
361 // Print header information of the event
363 printf("ESD run information\n");
364 printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
365 GetEventNumberInFile(),
366 GetBunchCrossNumber(),
371 GetMagneticField() );
372 printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
373 fPrimaryVertex.GetXv(), fPrimaryVertex.GetXRes(),
374 fPrimaryVertex.GetYv(), fPrimaryVertex.GetYRes(),
375 fPrimaryVertex.GetZv(), fPrimaryVertex.GetZRes());
376 printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
377 GetDiamondX(),GetDiamondY());
378 printf("SPD Multiplicity. Number of tracklets %d \n",
379 fSPDMult.GetNumberOfTracklets());
380 printf("Event from reconstruction version %d \n",fRecoVersion);
381 printf("Number of tracks: \n");
382 printf(" charged %d\n", GetNumberOfTracks());
383 printf(" hlt CF %d\n", GetNumberOfHLTConfMapTracks());
384 printf(" hlt HT %d\n", GetNumberOfHLTHoughTracks());
385 printf(" muon %d\n", GetNumberOfMuonTracks());
386 printf(" pmd %d\n", GetNumberOfPmdTracks());
387 printf(" trd %d\n", GetNumberOfTrdTracks());
388 printf(" v0 %d\n", GetNumberOfV0s());
389 printf(" cascades %d\n", GetNumberOfCascades());
390 printf(" kinks %d\n", GetNumberOfKinks());
391 printf(" CaloClusters %d\n", GetNumberOfCaloClusters());
392 printf(" phos %d\n", GetNumberOfPHOSClusters());
393 printf(" emcal %d\n", GetNumberOfEMCALClusters());
394 printf(" FMD %s\n", (fESDFMD ? "yes" : "no"));
395 printf(" VZERO %s\n", (fESDVZERO ? "yes" : "no"));
398 void AliESD::SetESDfriend(const AliESDfriend *ev) {
400 // Attaches the complementary info to the ESD
404 Int_t ntrk=ev->GetNumberOfTracks();
406 for (Int_t i=0; i<ntrk; i++) {
407 const AliESDfriendTrack *f=ev->GetTrack(i);
408 GetTrack(i)->SetFriendTrack(f);
412 void AliESD::GetESDfriend(AliESDfriend *ev) const {
414 // Extracts the complementary info from the ESD
418 Int_t ntrk=GetNumberOfTracks();
420 for (Int_t i=0; i<ntrk; i++) {
421 AliESDtrack *t=GetTrack(i);
422 const AliESDfriendTrack *f=t->GetFriendTrack();
425 t->ReleaseESDfriendTrack();// Not to have two copies of "friendTrack"