1 /**************************************************************************
2 * Copyright(c) 1998-2007, 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 // AOD event base class
20 // Author: Markus Oldenburg, CERN
21 //-------------------------------------------------------------------------
23 #include "AliAODHeader.h"
24 #include "AliCentrality.h"
25 #include "AliEventplane.h"
26 #include <TGeoMatrix.h>
27 #include <TObjString.h>
29 ClassImp(AliAODHeader)
31 //______________________________________________________________________________
32 AliAODHeader::AliAODHeader() :
34 fMagneticField(-999.),
35 fMuonMagFieldScale(-999.),
38 fEventplaneMag(-999.),
64 fEventNumberESDFile(-1),
71 fIRInt2InteractionsMap(0),
72 fIRInt1InteractionsMap(0)
74 // default constructor
77 for(int j=0; j<2; j++) fZDCEMEnergy[j] = -999.;
78 for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
79 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
81 for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
82 for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
83 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = 0;
84 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=-1;
85 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
88 //______________________________________________________________________________
89 AliAODHeader::AliAODHeader(Int_t nRun,
93 const Char_t *title) :
95 fMagneticField(-999.),
96 fMuonMagFieldScale(-999.),
99 fEventplaneMag(-999.),
115 fOrbitNumber(nOrbit),
116 fPeriodNumber(nPeriod),
117 fBunchCrossNumber(nBunchX),
118 fRefMultComb05(-999),
119 fRefMultComb08(-999),
125 fEventNumberESDFile(-1),
132 fIRInt2InteractionsMap(0),
133 fIRInt1InteractionsMap(0)
139 for(int j=0; j<2; j++) fZDCEMEnergy[j] = -999.;
140 for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
141 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
143 for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
144 for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
145 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=-1;
146 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
149 //______________________________________________________________________________
150 AliAODHeader::AliAODHeader(Int_t nRun,
160 Double_t muonMagFieldScale,
171 const Float_t *vzeroEqFactors,
176 fMagneticField(magField),
177 fMuonMagFieldScale(muonMagFieldScale),
179 fEventplane(eventplane),
181 fZDCN1Energy(n1Energy),
182 fZDCP1Energy(p1Energy),
183 fZDCN2Energy(n2Energy),
184 fZDCP2Energy(p2Energy),
187 fTriggerMask(trigMask),
191 fRefMultPos(refMultPos),
192 fRefMultNeg(refMultNeg),
196 fOrbitNumber(nOrbit),
197 fPeriodNumber(nPeriod),
198 fBunchCrossNumber(nBunchX),
199 fRefMultComb05(refMultComb05),
200 fRefMultComb08(refMultComb08),
201 fTriggerCluster(trigClus),
206 fEventNumberESDFile(-1),
213 fIRInt2InteractionsMap(0),
214 fIRInt1InteractionsMap(0)
220 for(int j=0; j<2; j++) fZDCEMEnergy[j] = emEnergy[j];
221 for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
222 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
224 for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
225 for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
226 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = 0;
227 if (vzeroEqFactors) for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j] = vzeroEqFactors[j];
228 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
231 //______________________________________________________________________________
232 AliAODHeader::~AliAODHeader()
240 //______________________________________________________________________________
241 AliAODHeader::AliAODHeader(const AliAODHeader& hdr) :
243 fMagneticField(hdr.fMagneticField),
244 fMuonMagFieldScale(hdr.fMuonMagFieldScale),
245 fCentrality(hdr.fCentrality),
246 fEventplane(hdr.fEventplane),
247 fEventplaneMag(hdr.fEventplaneMag),
248 fZDCN1Energy(hdr.fZDCN1Energy),
249 fZDCP1Energy(hdr.fZDCP1Energy),
250 fZDCN2Energy(hdr.fZDCN2Energy),
251 fZDCP2Energy(hdr.fZDCP2Energy),
254 fTriggerMask(hdr.fTriggerMask),
255 fFiredTriggers(hdr.fFiredTriggers),
256 fRunNumber(hdr.fRunNumber),
257 fRefMult(hdr.fRefMult),
258 fRefMultPos(hdr.fRefMultPos),
259 fRefMultNeg(hdr.fRefMultNeg),
260 fNMuons(hdr.fNMuons),
261 fNDimuons(hdr.fNDimuons),
262 fEventType(hdr.fEventType),
263 fOrbitNumber(hdr.fOrbitNumber),
264 fPeriodNumber(hdr.fPeriodNumber),
265 fBunchCrossNumber(hdr.fBunchCrossNumber),
266 fRefMultComb05(hdr.fRefMultComb05),
267 fRefMultComb08(hdr.fRefMultComb08),
268 fTriggerCluster(hdr.fTriggerCluster),
269 fDiamondZ(hdr.fDiamondZ),
270 fDiamondSig2Z(hdr.fDiamondSig2Z),
271 fOfflineTrigger(hdr.fOfflineTrigger),
272 fESDFileName(hdr.fESDFileName),
273 fEventNumberESDFile(hdr.fEventNumberESDFile),
274 fL0TriggerInputs(hdr.fL0TriggerInputs),
275 fL1TriggerInputs(hdr.fL1TriggerInputs),
276 fL2TriggerInputs(hdr.fL2TriggerInputs),
277 fTPConlyRefMult(hdr.fTPConlyRefMult),
278 fCentralityP(new AliCentrality(*hdr.fCentralityP)),
279 fEventplaneP(new AliEventplane(*hdr.fEventplaneP)),
280 fIRInt2InteractionsMap(hdr.fIRInt2InteractionsMap),
281 fIRInt1InteractionsMap(hdr.fIRInt1InteractionsMap)
286 SetTitle(hdr.fTitle);
287 SetQTheta(hdr.fQTheta, hdr.fNQTheta);
288 SetZDCEMEnergy(hdr.fZDCEMEnergy[0], hdr.fZDCEMEnergy[1]);
289 for(Int_t i=0; i<2; i++) fDiamondXY[i]=hdr.fDiamondXY[i];
290 for(Int_t i=0; i<3; i++) fDiamondCovXY[i]=hdr.fDiamondCovXY[i];
293 for(Int_t m=0; m<kNPHOSMatrix; m++){
294 if(hdr.fPHOSMatrix[m])
295 fPHOSMatrix[m]=new TGeoHMatrix(*(hdr.fPHOSMatrix[m])) ;
300 for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
301 if(hdr.fEMCALMatrix[sm])
302 fEMCALMatrix[sm]=new TGeoHMatrix(*(hdr.fEMCALMatrix[sm])) ;
306 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = hdr.fITSClusters[i];
307 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=hdr.fVZEROEqFactors[j];
308 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=hdr.fT0spread[i];
312 //______________________________________________________________________________
313 AliAODHeader& AliAODHeader::operator=(const AliAODHeader& hdr)
315 // Assignment operator
318 AliVHeader::operator=(hdr);
320 fMagneticField = hdr.fMagneticField;
321 fMuonMagFieldScale= hdr.fMuonMagFieldScale;
322 fCentrality = hdr.fCentrality;
323 fEventplane = hdr.fEventplane;
324 fEventplaneMag = hdr.fEventplaneMag;
325 fZDCN1Energy = hdr.fZDCN1Energy;
326 fZDCP1Energy = hdr.fZDCP1Energy;
327 fZDCN2Energy = hdr.fZDCN2Energy;
328 fZDCP2Energy = hdr.fZDCP2Energy;
329 fTriggerMask = hdr.fTriggerMask;
330 fFiredTriggers = hdr.fFiredTriggers;
331 fRunNumber = hdr.fRunNumber;
332 fRefMult = hdr.fRefMult;
333 fRefMultPos = hdr.fRefMultPos;
334 fRefMultNeg = hdr.fRefMultNeg;
335 fEventType = hdr.fEventType;
336 fOrbitNumber = hdr.fOrbitNumber;
337 fPeriodNumber = hdr.fPeriodNumber;
338 fBunchCrossNumber = hdr.fBunchCrossNumber;
339 fRefMultComb05 = hdr.fRefMultComb05;
340 fRefMultComb08 = hdr.fRefMultComb08;
342 fTriggerCluster = hdr.fTriggerCluster;
343 fNMuons = hdr.fNMuons;
344 fNDimuons = hdr.fNDimuons;
345 fDiamondZ = hdr.fDiamondZ;
346 fDiamondSig2Z = hdr.fDiamondSig2Z;
347 fOfflineTrigger = hdr.fOfflineTrigger;
348 fESDFileName = hdr.fESDFileName;
349 fEventNumberESDFile = hdr.fEventNumberESDFile;
350 fL0TriggerInputs = hdr.fL0TriggerInputs;
351 fL1TriggerInputs = hdr.fL1TriggerInputs;
352 fL2TriggerInputs = hdr.fL2TriggerInputs;
353 fTPConlyRefMult = hdr.fTPConlyRefMult;
355 fIRInt2InteractionsMap = hdr.fIRInt2InteractionsMap;
356 fIRInt1InteractionsMap = hdr.fIRInt1InteractionsMap;
358 if(hdr.fEventplaneP){
359 if(fEventplaneP)*fEventplaneP = *hdr.fEventplaneP;
360 else fEventplaneP = new AliEventplane(*hdr.fEventplaneP);
363 if(hdr.fCentralityP){
364 if(fCentralityP)*fCentralityP = *hdr.fCentralityP;
365 else fCentralityP = new AliCentrality(*hdr.fCentralityP);
369 SetTitle(hdr.fTitle);
370 SetQTheta(hdr.fQTheta, hdr.fNQTheta);
371 SetZDCEMEnergy(hdr.fZDCEMEnergy[0], hdr.fZDCEMEnergy[1]);
372 for(Int_t i=0; i<2; i++) fDiamondXY[i]=hdr.fDiamondXY[i];
373 for(Int_t i=0; i<3; i++) fDiamondCovXY[i]=hdr.fDiamondCovXY[i];
375 for(Int_t m=0; m<kNPHOSMatrix; m++){
376 if(hdr.fPHOSMatrix[m]){
377 if(fPHOSMatrix[m])delete fPHOSMatrix[m];
378 fPHOSMatrix[m]=new TGeoHMatrix(*(hdr.fPHOSMatrix[m])) ;
384 for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
385 if(hdr.fEMCALMatrix[sm]){
386 if(fEMCALMatrix[sm])delete fEMCALMatrix[sm];
387 fEMCALMatrix[sm]=new TGeoHMatrix(*(hdr.fEMCALMatrix[sm])) ;
395 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = hdr.fITSClusters[i];
396 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j] = hdr.fVZEROEqFactors[j];
397 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=hdr.fT0spread[i];
402 //______________________________________________________________________________
403 void AliAODHeader::SetQTheta(Double_t *QTheta, UInt_t size)
405 if (QTheta && size>0) {
406 if (size != (UInt_t)fNQTheta) {
409 fQTheta = new Double_t[fNQTheta];
412 for (Int_t i = 0; i < fNQTheta; i++) {
413 fQTheta[i] = QTheta[i];
422 //______________________________________________________________________________
423 Double_t AliAODHeader::GetQTheta(UInt_t i) const
425 if (fQTheta && i < (UInt_t)fNQTheta) {
432 //______________________________________________________________________________
433 void AliAODHeader::RemoveQTheta()
442 void AliAODHeader::Clear(Option_t* /*opt*/)
455 fEventplaneMag = -999.;
460 //______________________________________________________________________________
461 void AliAODHeader::Print(Option_t* /*option*/) const
463 // prints event information
465 printf("Run # : %d\n", fRunNumber);
466 printf("Bunch Crossing # : %d\n", fBunchCrossNumber);
467 printf("Orbit Number # : %d\n", fOrbitNumber);
468 printf("Period Number # : %d\n", fPeriodNumber);
469 printf("Trigger mask : %lld\n", fTriggerMask);
470 printf("Trigger cluster : %d\n", fTriggerCluster);
471 printf("Event Type : %d\n", fEventType);
472 printf("Magnetic field : %f\n", fMagneticField);
473 printf("Muon mag. field scale : %f\n", fMuonMagFieldScale);
475 printf("Centrality : %f\n", fCentrality);
476 printf("Event plane : %f\n", fEventplane);
477 printf("Event plane : %f\n", fEventplaneMag);
478 printf("ZDC N1 Energy : %f\n", fZDCN1Energy);
479 printf("ZDC P1 Energy : %f\n", fZDCP1Energy);
480 printf("ZDC N2 Energy : %f\n", fZDCN2Energy);
481 printf("ZDC P2 Energy : %f\n", fZDCP2Energy);
482 printf("ZDC EM1 Energy : %f\n", fZDCEMEnergy[0]);
483 printf("ZDC EM2 Energy : %f\n", fZDCEMEnergy[1]);
484 printf("ref. Multiplicity : %d\n", fRefMult);
485 printf("ref. Multiplicity (pos) : %d\n", fRefMultPos);
486 printf("ref. Multiplicity (neg) : %d\n", fRefMultNeg);
487 printf("ref. Mult.Comb |eta|<.5 : %d\n", fRefMultComb05);
488 printf("ref. Mult.Comb |eta|<.8 : %d\n", fRefMultComb08);
489 printf("number of muons : %d\n", fNMuons);
490 printf("number of dimuons : %d\n", fNDimuons);
491 printf("offline trigger : %u\n", fOfflineTrigger);
494 for (UInt_t i = 0; i<(UInt_t)fNQTheta; i++) {
495 printf("QTheta[%d] : %13.3e\n", i, GetQTheta(i));
498 printf("V0 Eq factors: ");
499 for (Int_t j=0; j<64; ++j) printf(" %.3f",fVZEROEqFactors[j]);
505 //__________________________________________________________________________
506 Int_t AliAODHeader::FindIRIntInteractionsBXMap(Int_t difference)
509 // The mapping is of 181 bits, from -90 to +90
513 if(difference<-90 || difference>90) return bin;
514 else { bin = 90 + difference; }
519 //__________________________________________________________________________
520 Int_t AliAODHeader::GetIRInt2ClosestInteractionMap()
523 // Calculation of the closest interaction
525 Int_t firstNegative=100;
526 for(Int_t item=-1; item>=-90; item--) {
527 Int_t bin = FindIRIntInteractionsBXMap(item);
528 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
530 firstNegative = item;
534 Int_t firstPositive=100;
535 for(Int_t item=1; item<=90; item++) {
536 Int_t bin = FindIRIntInteractionsBXMap(item);
537 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
539 firstPositive = item;
544 Int_t closest = firstPositive < TMath::Abs(firstNegative) ? firstPositive : TMath::Abs(firstNegative);
545 if(firstPositive==100 && firstNegative==100) closest=0;
549 //__________________________________________________________________________
550 Int_t AliAODHeader::GetIRInt2LastInteractionMap()
553 // Calculation of the last interaction
555 Int_t lastNegative=0;
556 for(Int_t item=-90; item<=-1; item++) {
557 Int_t bin = FindIRIntInteractionsBXMap(item);
558 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
564 Int_t lastPositive=0;
565 for(Int_t item=90; item>=1; item--) {
566 Int_t bin = FindIRIntInteractionsBXMap(item);
567 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
574 Int_t last = lastPositive > TMath::Abs(lastNegative) ? lastPositive : TMath::Abs(lastNegative);