Extending the functionality of the physics selection. Instead of providing a yes...
[u/mrichter/AliRoot.git] / STEER / AliAODHeader.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2007, 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 //     AOD event base class
20 //     Author: Markus Oldenburg, CERN
21 //-------------------------------------------------------------------------
22
23 #include "AliAODHeader.h"
24 #include <TGeoMatrix.h>
25 #include <TObjString.h>
26
27 ClassImp(AliAODHeader)
28
29 //______________________________________________________________________________
30 AliAODHeader::AliAODHeader() : 
31   AliVHeader(),
32   fMagneticField(-999.),
33   fMuonMagFieldScale(-999.),
34   fCentrality(-999.),
35   fZDCN1Energy(-999.),
36   fZDCP1Energy(-999.),
37   fZDCN2Energy(-999.),
38   fZDCP2Energy(-999.),
39   fNQTheta(0),
40   fQTheta(0x0),
41   fTriggerMask(0),
42   fFiredTriggers(),
43   fRunNumber(-999),  
44   fRefMult(-999),
45   fRefMultPos(-999),
46   fRefMultNeg(-999),
47   fNMuons(0),
48   fNDimuons(0),
49   fEventType(0),
50   fOrbitNumber(0),
51   fPeriodNumber(0),
52   fBunchCrossNumber(0),
53   fTriggerCluster(0), 
54   fDiamondZ(0.), 
55   fDiamondSig2Z(0.),
56   fOfflineTrigger(0)
57 {
58   // default constructor
59
60   SetName("header");
61   for(int j=0; j<2; j++) fZDCEMEnergy[j] = -999.;
62   for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
63   fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
64   fDiamondCovXY[1]=0.;
65   for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
66   for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
67 }
68
69 //______________________________________________________________________________
70 AliAODHeader::AliAODHeader(Int_t nRun, 
71                            UShort_t nBunchX,
72                            UInt_t nOrbit,
73                            UInt_t nPeriod,
74                            const Char_t *title) :
75   AliVHeader(),
76   fMagneticField(-999.),
77   fMuonMagFieldScale(-999.),
78   fCentrality(-999.),
79   fZDCN1Energy(-999.),
80   fZDCP1Energy(-999.),
81   fZDCN2Energy(-999.),
82   fZDCP2Energy(-999.),
83   fNQTheta(0),
84   fQTheta(0x0),
85   fTriggerMask(0),
86   fFiredTriggers(),
87   fRunNumber(nRun),
88   fRefMult(-999),
89   fRefMultPos(-999),
90   fRefMultNeg(-999),
91   fNMuons(0),
92   fNDimuons(0),
93   fEventType(0),
94   fOrbitNumber(nOrbit),
95   fPeriodNumber(nPeriod),
96   fBunchCrossNumber(nBunchX),
97   fTriggerCluster(0), 
98   fDiamondZ(0.), 
99   fDiamondSig2Z(0.),
100   fOfflineTrigger(0)
101 {
102   // constructor
103
104   SetName("header");
105   SetTitle(title);
106   for(int j=0; j<2; j++) fZDCEMEnergy[j] = -999.;
107   for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
108   fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
109   fDiamondCovXY[1]=0.;
110   for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
111   for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
112 }
113
114 //______________________________________________________________________________
115 AliAODHeader::AliAODHeader(Int_t nRun, 
116                            UShort_t nBunchX,
117                            UInt_t nOrbit,
118                            UInt_t nPeriod,
119                            Int_t refMult,
120                            Int_t refMultPos,
121                            Int_t refMultNeg,
122                            Double_t magField,
123                            Double_t muonMagFieldScale,
124                            Double_t cent,
125                            Double_t n1Energy,
126                            Double_t p1Energy,
127                            Double_t n2Energy,
128                            Double_t p2Energy,
129                            Double_t *emEnergy,
130                            ULong64_t trigMask,
131                            UChar_t trigClus,
132                            UInt_t evttype,
133                            const Char_t *title,
134                            Int_t nMuons,
135                            Int_t nDimuons) :
136   AliVHeader(),
137   fMagneticField(magField),
138   fMuonMagFieldScale(muonMagFieldScale),
139   fCentrality(cent),
140   fZDCN1Energy(n1Energy),
141   fZDCP1Energy(p1Energy),
142   fZDCN2Energy(n2Energy),
143   fZDCP2Energy(p2Energy),
144   fNQTheta(0),
145   fQTheta(0x0),
146   fTriggerMask(trigMask),
147   fFiredTriggers(),
148   fRunNumber(nRun),  
149   fRefMult(refMult),
150   fRefMultPos(refMultPos),
151   fRefMultNeg(refMultNeg),
152   fNMuons(nMuons),
153   fNDimuons(nDimuons),
154   fEventType(evttype),
155   fOrbitNumber(nOrbit),
156   fPeriodNumber(nPeriod),
157   fBunchCrossNumber(nBunchX),
158   fTriggerCluster(trigClus),
159   fDiamondZ(0.), 
160   fDiamondSig2Z(0.),
161   fOfflineTrigger(0)
162 {
163   // constructor
164
165   SetName("header");
166   SetTitle(title);
167   for(int j=0; j<2; j++) fZDCEMEnergy[j] = emEnergy[j];
168   for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
169   fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
170   fDiamondCovXY[1]=0.;
171   for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
172   for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
173 }
174
175 //______________________________________________________________________________
176 AliAODHeader::~AliAODHeader() 
177 {
178   // destructor
179   
180   RemoveQTheta();
181 }
182
183 //______________________________________________________________________________
184 AliAODHeader::AliAODHeader(const AliAODHeader& hdr) :
185   AliVHeader(hdr),
186   fMagneticField(hdr.fMagneticField),
187   fMuonMagFieldScale(hdr.fMuonMagFieldScale),
188   fCentrality(hdr.fCentrality),
189   fZDCN1Energy(hdr.fZDCN1Energy),
190   fZDCP1Energy(hdr.fZDCP1Energy),
191   fZDCN2Energy(hdr.fZDCN2Energy),
192   fZDCP2Energy(hdr.fZDCP2Energy),
193   fNQTheta(0),
194   fQTheta(0x0),
195   fTriggerMask(hdr.fTriggerMask),
196   fFiredTriggers(hdr.fFiredTriggers),
197   fRunNumber(hdr.fRunNumber),  
198   fRefMult(hdr.fRefMult), 
199   fRefMultPos(hdr.fRefMultPos), 
200   fRefMultNeg(hdr.fRefMultNeg),
201   fNMuons(hdr.fNMuons),
202   fNDimuons(hdr.fNDimuons),
203   fEventType(hdr.fEventType),
204   fOrbitNumber(hdr.fOrbitNumber),
205   fPeriodNumber(hdr.fPeriodNumber),
206   fBunchCrossNumber(hdr.fBunchCrossNumber),
207   fTriggerCluster(hdr.fTriggerCluster), 
208   fDiamondZ(hdr.fDiamondZ), 
209   fDiamondSig2Z(hdr.fDiamondSig2Z),
210   fOfflineTrigger(hdr.fOfflineTrigger)
211 {
212   // Copy constructor.
213   
214   SetName(hdr.fName);
215   SetTitle(hdr.fTitle);
216   SetQTheta(hdr.fQTheta, hdr.fNQTheta);
217   SetZDCEMEnergy(hdr.fZDCEMEnergy[0], hdr.fZDCEMEnergy[1]);
218   for(Int_t i=0; i<2; i++) fDiamondXY[i]=hdr.fDiamondXY[i];
219   for(Int_t i=0; i<3; i++) fDiamondCovXY[i]=hdr.fDiamondCovXY[i];
220
221
222   for(Int_t m=0; m<kNPHOSMatrix; m++){
223       if(hdr.fPHOSMatrix[m])
224           fPHOSMatrix[m]=new TGeoHMatrix(*(hdr.fPHOSMatrix[m])) ;
225       else
226           fPHOSMatrix[m]=0;
227   }
228   
229   for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
230       if(hdr.fEMCALMatrix[sm])
231           fEMCALMatrix[sm]=new TGeoHMatrix(*(hdr.fEMCALMatrix[sm])) ;
232       else
233           fEMCALMatrix[sm]=0;
234   }
235
236 }
237
238 //______________________________________________________________________________
239 AliAODHeader& AliAODHeader::operator=(const AliAODHeader& hdr)
240 {
241   // Assignment operator
242   if(this!=&hdr) {
243     
244      AliVHeader::operator=(hdr);
245     
246     fMagneticField    = hdr.fMagneticField;
247     fMuonMagFieldScale= hdr.fMuonMagFieldScale;
248     fCentrality       = hdr.fCentrality;
249     fZDCN1Energy      = hdr.fZDCN1Energy;
250     fZDCP1Energy      = hdr.fZDCP1Energy;
251     fZDCN2Energy      = hdr.fZDCN2Energy;
252     fZDCP2Energy      = hdr.fZDCP2Energy;
253     fTriggerMask      = hdr.fTriggerMask;
254     fFiredTriggers    = hdr.fFiredTriggers;
255     fRunNumber        = hdr.fRunNumber;
256     fRefMult          = hdr.fRefMult;
257     fRefMultPos       = hdr.fRefMultPos;
258     fRefMultNeg       = hdr.fRefMultNeg;
259     fEventType        = hdr.fEventType;
260     fOrbitNumber      = hdr.fOrbitNumber;
261     fPeriodNumber     = hdr.fPeriodNumber;
262     fBunchCrossNumber = hdr.fBunchCrossNumber;
263     fTriggerCluster   = hdr.fTriggerCluster;
264     fNMuons           = hdr.fNMuons;
265     fNDimuons         = hdr.fNDimuons;
266     fDiamondZ         = hdr.fDiamondZ;
267     fDiamondSig2Z     = hdr.fDiamondSig2Z;
268     fOfflineTrigger   = hdr.fOfflineTrigger;
269
270
271     SetName(hdr.fName);
272     SetTitle(hdr.fTitle);
273     SetQTheta(hdr.fQTheta, hdr.fNQTheta);
274     SetZDCEMEnergy(hdr.fZDCEMEnergy[0], hdr.fZDCEMEnergy[1]);
275     for(Int_t i=0; i<2; i++) fDiamondXY[i]=hdr.fDiamondXY[i];
276     for(Int_t i=0; i<3; i++) fDiamondCovXY[i]=hdr.fDiamondCovXY[i];
277
278     for(Int_t m=0; m<kNPHOSMatrix; m++){
279         if(hdr.fPHOSMatrix[m])
280             fPHOSMatrix[m]=new TGeoHMatrix(*(hdr.fPHOSMatrix[m])) ;
281         else
282             fPHOSMatrix[m]=0;
283     }
284     
285     for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
286         if(hdr.fEMCALMatrix[sm])
287             fEMCALMatrix[sm]=new TGeoHMatrix(*(hdr.fEMCALMatrix[sm])) ;
288         else
289             fEMCALMatrix[sm]=0;
290   }
291
292   }
293
294
295   return *this;
296 }
297
298 //______________________________________________________________________________
299 void AliAODHeader::SetQTheta(Double_t *QTheta, UInt_t size) 
300 {
301   if (QTheta && size>0) {
302     if (size != (UInt_t)fNQTheta) {
303       RemoveQTheta();
304       fNQTheta = size;
305       fQTheta = new Double_t[fNQTheta];
306     }
307     
308     for (Int_t i = 0; i < fNQTheta; i++) {
309       fQTheta[i] = QTheta[i];
310     }
311   } else {
312     RemoveQTheta();
313   }
314
315   return;
316 }
317
318 //______________________________________________________________________________
319 Double_t AliAODHeader::GetQTheta(UInt_t i) const
320 {
321   if (fQTheta && i < (UInt_t)fNQTheta) {
322     return fQTheta[i];
323   } else {
324     return -999.;
325   }
326 }
327
328 //______________________________________________________________________________
329 void AliAODHeader::RemoveQTheta()
330 {
331   delete[] fQTheta;
332   fQTheta = 0x0;
333   fNQTheta = 0;
334
335   return;
336 }
337
338 //______________________________________________________________________________
339 void AliAODHeader::Print(Option_t* /*option*/) const 
340 {
341   // prints event information
342
343   printf("Run #                   : %d\n", fRunNumber);
344   printf("Bunch Crossing  #       : %d\n", fBunchCrossNumber);
345   printf("Orbit Number #          : %d\n", fOrbitNumber);
346   printf("Period Number #         : %d\n", fPeriodNumber);
347   printf("Trigger mask            : %lld\n", fTriggerMask);
348   printf("Trigger cluster         : %d\n", fTriggerCluster);
349   printf("Event Type              : %d\n", fEventType);
350   printf("Magnetic field          : %f\n", fMagneticField);
351   printf("Muon mag. field scale   : %f\n", fMuonMagFieldScale);
352   
353   printf("Centrality              : %f\n", fCentrality);
354   printf("ZDC N1 Energy           : %f\n", fZDCN1Energy);
355   printf("ZDC P1 Energy           : %f\n", fZDCP1Energy);
356   printf("ZDC N2 Energy           : %f\n", fZDCN2Energy);
357   printf("ZDC P2 Energy           : %f\n", fZDCP2Energy);
358   printf("ZDC EM1 Energy          : %f\n", fZDCEMEnergy[0]);
359   printf("ZDC EM2 Energy          : %f\n", fZDCEMEnergy[1]);
360   printf("ref. Multiplicity       : %d\n", fRefMult);
361   printf("ref. Multiplicity (pos) : %d\n", fRefMultPos);
362   printf("ref. Multiplicity (neg) : %d\n", fRefMultNeg);
363   printf("number of muons         : %d\n", fNMuons);
364   printf("number of dimuons       : %d\n", fNDimuons);
365   printf("offline trigger         : %u\n", fOfflineTrigger);
366
367   if (fQTheta) {
368     for (UInt_t i = 0; i<(UInt_t)fNQTheta; i++) {
369       printf("QTheta[%d]              : %13.3e\n", i, GetQTheta(i));
370     }
371   }
372
373   return;
374 }