Functionality to create AOD files from ESD files added in AliReconstruction.
[u/mrichter/AliRoot.git] / STEER / AliESD.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 /* $Id$ */
17
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 //-----------------------------------------------------------------
24
25 #include "AliESD.h"
26 #include "AliESDfriend.h"
27
28 ClassImp(AliESD)
29
30 //______________________________________________________________________________
31 AliESD::AliESD():
32   fEventNumberInFile(0),
33   fBunchCrossNumber(0),
34   fOrbitNumber(0),
35   fPeriodNumber(0),
36   fRunNumber(0),
37   fTimeStamp(0),
38   fEventType(0),
39   fTriggerMask(0),
40   fTriggerCluster(0),
41   fRecoVersion(0),
42   fMagneticField(0),
43   fZDCN1Energy(0),
44   fZDCP1Energy(0),
45   fZDCN2Energy(0),
46   fZDCP2Energy(0),
47   fZDCEMEnergy(0),
48   fZDCParticipants(0),
49   fT0zVertex(0),
50   fSPDVertex(),
51   fPrimaryVertex(),
52   fSPDMult(),
53   fT0timeStart(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),
60   fV0s("AliESDv0",200),  
61   fCascades("AliESDcascade",20),
62   fKinks("AliESDkink",4000),
63   fCaloClusters("AliESDCaloCluster",10000),
64   fEMCALClusters(0), 
65   fFirstEMCALCluster(-1),
66   fEMCALTriggerPosition(0x0),
67   fEMCALTriggerAmplitudes(0x0),
68   fPHOSClusters(0), 
69   fFirstPHOSCluster(-1),
70   fPHOSTriggerPosition(0x0),
71   fPHOSTriggerAmplitudes(0x0),
72   fESDFMD(0x0),
73   fESDVZERO(0x0),
74   fErrorLogs("AliRawDataErrorLog",5)
75
76 {
77   for (Int_t i=0; i<24; i++) {
78     fT0time[i] = 0;
79     fT0amplitude[i] = 0;
80   }
81   for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
82   for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=0.;
83 }
84 //______________________________________________________________________________
85 AliESD::AliESD(const AliESD& esd):
86   TObject(esd),
87   fEventNumberInFile(esd.fEventNumberInFile),
88   fBunchCrossNumber(esd.fBunchCrossNumber),
89   fOrbitNumber(esd.fOrbitNumber),
90   fPeriodNumber(esd.fPeriodNumber),
91   fRunNumber(esd.fRunNumber),
92   fTimeStamp(esd.fTimeStamp),
93   fEventType(esd.fEventType),
94   fTriggerMask(esd.fTriggerMask),
95   fTriggerCluster(esd.fTriggerCluster),
96   fRecoVersion(esd.fRecoVersion),
97   fMagneticField(esd.fMagneticField),
98   fZDCN1Energy(esd.fZDCN1Energy),
99   fZDCP1Energy(esd.fZDCP1Energy),
100   fZDCN2Energy(esd.fZDCN2Energy),
101   fZDCP2Energy(esd.fZDCP2Energy),
102   fZDCEMEnergy(esd.fZDCEMEnergy),
103   fZDCParticipants(esd.fZDCParticipants),
104   fT0zVertex(esd.fT0zVertex),
105   fSPDVertex(esd.fSPDVertex),
106   fPrimaryVertex(esd.fPrimaryVertex),
107   fSPDMult(esd.fSPDMult),
108   fT0timeStart(esd.fT0timeStart),
109   fTracks(*((TClonesArray*)esd.fTracks.Clone())),
110   fHLTConfMapTracks(*((TClonesArray*)esd.fHLTConfMapTracks.Clone())),
111   fHLTHoughTracks(*((TClonesArray*)esd.fHLTHoughTracks.Clone())),
112   fMuonTracks(*((TClonesArray*)esd.fMuonTracks.Clone())),
113   fPmdTracks(*((TClonesArray*)esd.fPmdTracks.Clone())),
114   fTrdTracks(*((TClonesArray*)esd.fTrdTracks.Clone())),
115   fV0s(*((TClonesArray*)esd.fV0s.Clone())),  
116   fCascades(*((TClonesArray*)esd.fCascades.Clone())),
117   fKinks(*((TClonesArray*)esd.fKinks.Clone())),
118   fCaloClusters(*((TClonesArray*)esd.fCaloClusters.Clone())),
119   fEMCALClusters(esd.fEMCALClusters), 
120   fFirstEMCALCluster(esd.fFirstEMCALCluster),
121   fEMCALTriggerPosition(esd. fEMCALTriggerPosition),
122   fEMCALTriggerAmplitudes(esd.fEMCALTriggerAmplitudes),
123   fPHOSClusters(esd.fPHOSClusters), 
124   fFirstPHOSCluster(esd.fFirstPHOSCluster),
125   fPHOSTriggerPosition(esd.fPHOSTriggerPosition),
126   fPHOSTriggerAmplitudes(esd.fPHOSTriggerAmplitudes),
127   fESDFMD(esd.fESDFMD),
128   fESDVZERO(esd.fESDVZERO),
129   fErrorLogs(*((TClonesArray*)esd.fErrorLogs.Clone()))
130 {
131   for (Int_t i=0; i<24; i++) {
132     fT0time[i] = esd.fT0time[i];
133     fT0amplitude[i] = esd.fT0amplitude[i];
134   }
135   for (Int_t i=0; i<2; i++) fDiamondXY[i]=esd.fDiamondXY[i];
136   for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
137 }
138
139 //______________________________________________________________________________
140 AliESD & AliESD::operator=(const AliESD& source) {
141
142   // Assignment operator
143
144   if(&source == this) return *this;
145
146   fEventNumberInFile = source.fEventNumberInFile;
147   fBunchCrossNumber = source.fBunchCrossNumber;
148   fOrbitNumber = source.fOrbitNumber;
149   fPeriodNumber = source.fPeriodNumber;
150   fRunNumber = source.fRunNumber;
151   fTimeStamp   = source.fTimeStamp;
152   fEventType   = source.fEventType;
153   fTriggerMask = source.fTriggerMask;
154   fTriggerCluster = source.fTriggerCluster;
155   fRecoVersion = source.fRecoVersion;
156   fMagneticField = source.fMagneticField;
157   fZDCN1Energy = source.fZDCN1Energy;
158   fZDCP1Energy = source.fZDCP1Energy;
159   fZDCN2Energy = source.fZDCN2Energy;
160   fZDCP2Energy = source.fZDCP2Energy;
161   fZDCEMEnergy = source.fZDCEMEnergy;
162   fZDCParticipants = source.fZDCParticipants;
163   fT0zVertex = source.fT0zVertex;
164   fSPDVertex = source.fSPDVertex;
165   fPrimaryVertex = source.fPrimaryVertex;
166   fSPDMult = source.fSPDMult;
167   fT0timeStart = source.fT0timeStart;
168   fTracks = *((TClonesArray*)source.fTracks.Clone());
169   fHLTConfMapTracks = *((TClonesArray*)source.fHLTConfMapTracks.Clone());
170   fHLTHoughTracks = *((TClonesArray*)source.fHLTHoughTracks.Clone());
171   fMuonTracks = *((TClonesArray*)source.fMuonTracks.Clone());
172   fPmdTracks = *((TClonesArray*)source.fPmdTracks.Clone());
173   fTrdTracks = *((TClonesArray*)source.fTrdTracks.Clone());
174   fV0s = *((TClonesArray*)source.fV0s.Clone());
175   fCascades = *((TClonesArray*)source.fCascades.Clone());
176   fKinks = *((TClonesArray*)source.fKinks.Clone());
177   fCaloClusters = *((TClonesArray*)source.fCaloClusters.Clone());
178   fEMCALClusters = source.fEMCALClusters;
179   fFirstEMCALCluster = source.fFirstEMCALCluster;
180   fPHOSClusters = source.fPHOSClusters;
181   fFirstPHOSCluster = source.fFirstPHOSCluster;
182   fESDFMD = source.fESDFMD;
183   fESDVZERO = source.fESDVZERO;
184   fEMCALTriggerPosition=source. fEMCALTriggerPosition;
185   fEMCALTriggerAmplitudes=source.fEMCALTriggerAmplitudes;
186   fPHOSTriggerPosition=source.fPHOSTriggerPosition;
187   fPHOSTriggerAmplitudes=source.fPHOSTriggerAmplitudes;
188   fErrorLogs = *((TClonesArray*)source.fErrorLogs.Clone());
189
190   for (Int_t i=0; i<24; i++) {
191     fT0time[i] = source.fT0time[i];
192     fT0amplitude[i] = source.fT0amplitude[i];
193   }
194   for (Int_t i=0; i<2; i++) fDiamondXY[i]=source.fDiamondXY[i];
195   for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=source.fDiamondCovXY[i];
196
197   return *this;
198
199 }
200
201
202 //______________________________________________________________________________
203 AliESD::~AliESD()
204 {
205   //
206   // Standard destructor
207   //
208   fTracks.Delete();
209   fHLTConfMapTracks.Delete();
210   fHLTHoughTracks.Delete();
211   fMuonTracks.Delete();
212   fPmdTracks.Delete();
213   fTrdTracks.Delete();
214   fV0s.Delete();
215   fCascades.Delete();
216   fKinks.Delete();
217   fCaloClusters.Delete();
218   delete fESDFMD;
219   delete fESDVZERO;
220 //   fEMCALTriggerPosition->Delete();
221 //   fEMCALTriggerAmplitudes->Delete();
222 //   fPHOSTriggerPosition->Delete();
223 //   fPHOSTriggerAmplitudes->Delete();
224 //   delete fEMCALTriggerPosition;
225 //   delete fEMCALTriggerAmplitudes;
226 //   delete fPHOSTriggerPosition;
227 //   delete fPHOSTriggerAmplitudes;
228   fErrorLogs.Delete();
229
230 }
231
232 //______________________________________________________________________________
233 void AliESD::Reset()
234 {
235   fEventNumberInFile=0;
236   fBunchCrossNumber=0;
237   fOrbitNumber=0;
238   fPeriodNumber=0;
239   fRunNumber=0;
240   fTimeStamp = 0;
241   fEventType = 0;
242   fTriggerMask=0;
243   fTriggerCluster=0;
244   fRecoVersion=0;
245   fMagneticField=0;
246   fZDCN1Energy=0;
247   fZDCP1Energy=0;
248   fZDCN2Energy=0;
249   fZDCP2Energy=0;
250   fZDCEMEnergy=0;
251   fZDCParticipants=0;
252   fT0zVertex=0;
253   fT0timeStart = 0;
254   new (&fSPDVertex) AliESDVertex();
255   new (&fPrimaryVertex) AliESDVertex();
256   new (&fSPDMult) AliMultiplicity();
257   fTracks.Clear();
258   fHLTConfMapTracks.Clear();
259   fHLTHoughTracks.Clear();
260   fMuonTracks.Clear();
261   fPmdTracks.Clear();
262   fTrdTracks.Clear();
263   fV0s.Clear();
264   fCascades.Clear();
265   fCaloClusters.Clear();
266   fEMCALClusters=0; 
267   fFirstEMCALCluster=-1; 
268   fPHOSClusters=0; 
269   fFirstPHOSCluster=-1; 
270   if (fESDFMD) fESDFMD->Clear();
271 //   fEMCALTriggerPosition->Clear();
272 //   fEMCALTriggerAmplitudes->Clear();
273 //   fPHOSTriggerPosition->Clear();
274 //   fPHOSTriggerAmplitudes->Clear();
275   fErrorLogs.Clear();
276 }
277
278 Int_t AliESD::AddV0(const AliESDv0 *v) {
279   //
280   // Add V0
281   //
282     Int_t idx=fV0s.GetEntriesFast();
283     new(fV0s[idx]) AliESDv0(*v);
284     return idx;
285 }  
286
287 //______________________________________________________________________________
288 void AliESD::Print(Option_t *) const 
289 {
290   //
291   // Print header information of the event
292   //
293   printf("ESD run information\n");
294   printf("Event # in file %d Bunch crossing # %d Orbit # %d Period # %d Run # %d Trigger %lld Magnetic field %f \n",
295          GetEventNumberInFile(),
296          GetBunchCrossNumber(),
297          GetOrbitNumber(),
298          GetPeriodNumber(),
299          GetRunNumber(),
300          GetTriggerMask(),
301          GetMagneticField() );
302     printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
303            fPrimaryVertex.GetXv(), fPrimaryVertex.GetXRes(),
304            fPrimaryVertex.GetYv(), fPrimaryVertex.GetYRes(),
305            fPrimaryVertex.GetZv(), fPrimaryVertex.GetZRes());
306     printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
307            GetDiamondX(),GetDiamondY());
308     printf("SPD Multiplicity. Number of tracklets %d \n",
309            fSPDMult.GetNumberOfTracklets());
310   printf("Event from reconstruction version %d \n",fRecoVersion);
311   printf("Number of tracks: \n");
312   printf("                 charged   %d\n", GetNumberOfTracks());
313   printf("                 hlt CF    %d\n", GetNumberOfHLTConfMapTracks());
314   printf("                 hlt HT    %d\n", GetNumberOfHLTHoughTracks());
315   printf("                 muon      %d\n", GetNumberOfMuonTracks());
316   printf("                 pmd       %d\n", GetNumberOfPmdTracks());
317   printf("                 trd       %d\n", GetNumberOfTrdTracks());
318   printf("                 v0        %d\n", GetNumberOfV0s());
319   printf("                 cascades  %d\n", GetNumberOfCascades());
320   printf("                 kinks     %d\n", GetNumberOfKinks());
321   printf("                 CaloClusters %d\n", GetNumberOfCaloClusters());
322   printf("                 phos      %d\n", GetNumberOfPHOSClusters());
323   printf("                 emcal     %d\n", GetNumberOfEMCALClusters());
324   printf("                 FMD       %s\n", (fESDFMD ? "yes" : "no"));
325   printf("                 VZERO     %s\n", (fESDVZERO ? "yes" : "no"));
326 }
327
328 void AliESD::SetESDfriend(const AliESDfriend *ev) {
329   //
330   // Attaches the complementary info to the ESD
331   //
332   if (!ev) return;
333
334   Int_t ntrk=ev->GetNumberOfTracks();
335
336   for (Int_t i=0; i<ntrk; i++) {
337     const AliESDfriendTrack *f=ev->GetTrack(i);
338     GetTrack(i)->SetFriendTrack(f);
339   }
340 }
341
342 void AliESD::GetESDfriend(AliESDfriend *ev) const {
343   //
344   // Extracts the complementary info from the ESD
345   //
346   if (!ev) return;
347
348   Int_t ntrk=GetNumberOfTracks();
349
350   for (Int_t i=0; i<ntrk; i++) {
351     const AliESDtrack *t=GetTrack(i);
352     const AliESDfriendTrack *f=t->GetFriendTrack();
353     ev->AddTrack(f);
354   }
355 }