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.),
66 fEventNumberESDFile(-1),
73 fIRInt2InteractionsMap(0),
74 fIRInt1InteractionsMap(0)
76 // default constructor
79 for(int j=0; j<2; j++) fZDCEMEnergy[j] = -999.;
80 for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
81 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
83 for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
84 for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
85 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = 0;
86 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=-1;
87 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
90 //______________________________________________________________________________
91 AliAODHeader::AliAODHeader(Int_t nRun,
95 const Char_t *title) :
97 fMagneticField(-999.),
98 fMuonMagFieldScale(-999.),
101 fEventplaneMag(-999.),
102 fEventplaneQx(-999.),
103 fEventplaneQy(-999.),
119 fOrbitNumber(nOrbit),
120 fPeriodNumber(nPeriod),
121 fBunchCrossNumber(nBunchX),
122 fRefMultComb05(-999),
123 fRefMultComb08(-999),
129 fEventNumberESDFile(-1),
136 fIRInt2InteractionsMap(0),
137 fIRInt1InteractionsMap(0)
143 for(int j=0; j<2; j++) fZDCEMEnergy[j] = -999.;
144 for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
145 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
147 for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
148 for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
149 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=-1;
150 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
153 //______________________________________________________________________________
154 AliAODHeader::AliAODHeader(Int_t nRun,
164 Double_t muonMagFieldScale,
175 const Float_t *vzeroEqFactors,
180 fMagneticField(magField),
181 fMuonMagFieldScale(muonMagFieldScale),
183 fEventplane(eventplane),
187 fZDCN1Energy(n1Energy),
188 fZDCP1Energy(p1Energy),
189 fZDCN2Energy(n2Energy),
190 fZDCP2Energy(p2Energy),
193 fTriggerMask(trigMask),
197 fRefMultPos(refMultPos),
198 fRefMultNeg(refMultNeg),
202 fOrbitNumber(nOrbit),
203 fPeriodNumber(nPeriod),
204 fBunchCrossNumber(nBunchX),
205 fRefMultComb05(refMultComb05),
206 fRefMultComb08(refMultComb08),
207 fTriggerCluster(trigClus),
212 fEventNumberESDFile(-1),
219 fIRInt2InteractionsMap(0),
220 fIRInt1InteractionsMap(0)
226 for(int j=0; j<2; j++) fZDCEMEnergy[j] = emEnergy[j];
227 for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
228 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
230 for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
231 for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
232 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = 0;
233 if (vzeroEqFactors) for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j] = vzeroEqFactors[j];
234 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
237 //______________________________________________________________________________
238 AliAODHeader::~AliAODHeader()
246 //______________________________________________________________________________
247 AliAODHeader::AliAODHeader(const AliAODHeader& hdr) :
249 fMagneticField(hdr.fMagneticField),
250 fMuonMagFieldScale(hdr.fMuonMagFieldScale),
251 fCentrality(hdr.fCentrality),
252 fEventplane(hdr.fEventplane),
253 fEventplaneMag(hdr.fEventplaneMag),
254 fEventplaneQx(hdr.fEventplaneQx),
255 fEventplaneQy(hdr.fEventplaneQy),
256 fZDCN1Energy(hdr.fZDCN1Energy),
257 fZDCP1Energy(hdr.fZDCP1Energy),
258 fZDCN2Energy(hdr.fZDCN2Energy),
259 fZDCP2Energy(hdr.fZDCP2Energy),
262 fTriggerMask(hdr.fTriggerMask),
263 fFiredTriggers(hdr.fFiredTriggers),
264 fRunNumber(hdr.fRunNumber),
265 fRefMult(hdr.fRefMult),
266 fRefMultPos(hdr.fRefMultPos),
267 fRefMultNeg(hdr.fRefMultNeg),
268 fNMuons(hdr.fNMuons),
269 fNDimuons(hdr.fNDimuons),
270 fEventType(hdr.fEventType),
271 fOrbitNumber(hdr.fOrbitNumber),
272 fPeriodNumber(hdr.fPeriodNumber),
273 fBunchCrossNumber(hdr.fBunchCrossNumber),
274 fRefMultComb05(hdr.fRefMultComb05),
275 fRefMultComb08(hdr.fRefMultComb08),
276 fTriggerCluster(hdr.fTriggerCluster),
277 fDiamondZ(hdr.fDiamondZ),
278 fDiamondSig2Z(hdr.fDiamondSig2Z),
279 fOfflineTrigger(hdr.fOfflineTrigger),
280 fESDFileName(hdr.fESDFileName),
281 fEventNumberESDFile(hdr.fEventNumberESDFile),
282 fL0TriggerInputs(hdr.fL0TriggerInputs),
283 fL1TriggerInputs(hdr.fL1TriggerInputs),
284 fL2TriggerInputs(hdr.fL2TriggerInputs),
285 fTPConlyRefMult(hdr.fTPConlyRefMult),
286 fCentralityP(new AliCentrality(*hdr.fCentralityP)),
287 fEventplaneP(new AliEventplane(*hdr.fEventplaneP)),
288 fIRInt2InteractionsMap(hdr.fIRInt2InteractionsMap),
289 fIRInt1InteractionsMap(hdr.fIRInt1InteractionsMap)
294 SetTitle(hdr.fTitle);
295 SetQTheta(hdr.fQTheta, hdr.fNQTheta);
296 SetZDCEMEnergy(hdr.fZDCEMEnergy[0], hdr.fZDCEMEnergy[1]);
297 for(Int_t i=0; i<2; i++) fDiamondXY[i]=hdr.fDiamondXY[i];
298 for(Int_t i=0; i<3; i++) fDiamondCovXY[i]=hdr.fDiamondCovXY[i];
301 for(Int_t m=0; m<kNPHOSMatrix; m++){
302 if(hdr.fPHOSMatrix[m])
303 fPHOSMatrix[m]=new TGeoHMatrix(*(hdr.fPHOSMatrix[m])) ;
308 for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
309 if(hdr.fEMCALMatrix[sm])
310 fEMCALMatrix[sm]=new TGeoHMatrix(*(hdr.fEMCALMatrix[sm])) ;
314 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = hdr.fITSClusters[i];
315 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=hdr.fVZEROEqFactors[j];
316 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=hdr.fT0spread[i];
320 //______________________________________________________________________________
321 AliAODHeader& AliAODHeader::operator=(const AliAODHeader& hdr)
323 // Assignment operator
326 AliVHeader::operator=(hdr);
328 fMagneticField = hdr.fMagneticField;
329 fMuonMagFieldScale= hdr.fMuonMagFieldScale;
330 fCentrality = hdr.fCentrality;
331 fEventplane = hdr.fEventplane;
332 fEventplaneMag = hdr.fEventplaneMag;
333 fEventplaneQx = hdr.fEventplaneQx;
334 fEventplaneQy = hdr.fEventplaneQy;
335 fZDCN1Energy = hdr.fZDCN1Energy;
336 fZDCP1Energy = hdr.fZDCP1Energy;
337 fZDCN2Energy = hdr.fZDCN2Energy;
338 fZDCP2Energy = hdr.fZDCP2Energy;
339 fTriggerMask = hdr.fTriggerMask;
340 fFiredTriggers = hdr.fFiredTriggers;
341 fRunNumber = hdr.fRunNumber;
342 fRefMult = hdr.fRefMult;
343 fRefMultPos = hdr.fRefMultPos;
344 fRefMultNeg = hdr.fRefMultNeg;
345 fEventType = hdr.fEventType;
346 fOrbitNumber = hdr.fOrbitNumber;
347 fPeriodNumber = hdr.fPeriodNumber;
348 fBunchCrossNumber = hdr.fBunchCrossNumber;
349 fRefMultComb05 = hdr.fRefMultComb05;
350 fRefMultComb08 = hdr.fRefMultComb08;
352 fTriggerCluster = hdr.fTriggerCluster;
353 fNMuons = hdr.fNMuons;
354 fNDimuons = hdr.fNDimuons;
355 fDiamondZ = hdr.fDiamondZ;
356 fDiamondSig2Z = hdr.fDiamondSig2Z;
357 fOfflineTrigger = hdr.fOfflineTrigger;
358 fESDFileName = hdr.fESDFileName;
359 fEventNumberESDFile = hdr.fEventNumberESDFile;
360 fL0TriggerInputs = hdr.fL0TriggerInputs;
361 fL1TriggerInputs = hdr.fL1TriggerInputs;
362 fL2TriggerInputs = hdr.fL2TriggerInputs;
363 fTPConlyRefMult = hdr.fTPConlyRefMult;
365 fIRInt2InteractionsMap = hdr.fIRInt2InteractionsMap;
366 fIRInt1InteractionsMap = hdr.fIRInt1InteractionsMap;
368 if(hdr.fEventplaneP){
369 if(fEventplaneP)*fEventplaneP = *hdr.fEventplaneP;
370 else fEventplaneP = new AliEventplane(*hdr.fEventplaneP);
373 if(hdr.fCentralityP){
374 if(fCentralityP)*fCentralityP = *hdr.fCentralityP;
375 else fCentralityP = new AliCentrality(*hdr.fCentralityP);
379 SetTitle(hdr.fTitle);
380 SetQTheta(hdr.fQTheta, hdr.fNQTheta);
381 SetZDCEMEnergy(hdr.fZDCEMEnergy[0], hdr.fZDCEMEnergy[1]);
382 for(Int_t i=0; i<2; i++) fDiamondXY[i]=hdr.fDiamondXY[i];
383 for(Int_t i=0; i<3; i++) fDiamondCovXY[i]=hdr.fDiamondCovXY[i];
385 for(Int_t m=0; m<kNPHOSMatrix; m++){
386 if(hdr.fPHOSMatrix[m]){
387 if(fPHOSMatrix[m])delete fPHOSMatrix[m];
388 fPHOSMatrix[m]=new TGeoHMatrix(*(hdr.fPHOSMatrix[m])) ;
394 for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
395 if(hdr.fEMCALMatrix[sm]){
396 if(fEMCALMatrix[sm])delete fEMCALMatrix[sm];
397 fEMCALMatrix[sm]=new TGeoHMatrix(*(hdr.fEMCALMatrix[sm])) ;
405 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = hdr.fITSClusters[i];
406 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j] = hdr.fVZEROEqFactors[j];
407 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=hdr.fT0spread[i];
412 //______________________________________________________________________________
413 void AliAODHeader::SetQTheta(Double_t *QTheta, UInt_t size)
415 if (QTheta && size>0) {
416 if (size != (UInt_t)fNQTheta) {
419 fQTheta = new Double_t[fNQTheta];
422 for (Int_t i = 0; i < fNQTheta; i++) {
423 fQTheta[i] = QTheta[i];
432 //______________________________________________________________________________
433 Double_t AliAODHeader::GetQTheta(UInt_t i) const
435 if (fQTheta && i < (UInt_t)fNQTheta) {
442 //______________________________________________________________________________
443 void AliAODHeader::RemoveQTheta()
452 void AliAODHeader::Clear(Option_t* /*opt*/)
465 fEventplaneMag = -999.;
466 fEventplaneQx = -999.;
467 fEventplaneQy = -999.;
472 //______________________________________________________________________________
473 void AliAODHeader::Print(Option_t* /*option*/) const
475 // prints event information
477 printf("Run # : %d\n", fRunNumber);
478 printf("Bunch Crossing # : %d\n", fBunchCrossNumber);
479 printf("Orbit Number # : %d\n", fOrbitNumber);
480 printf("Period Number # : %d\n", fPeriodNumber);
481 printf("Trigger mask : %lld\n", fTriggerMask);
482 printf("Trigger cluster : %d\n", fTriggerCluster);
483 printf("Event Type : %d\n", fEventType);
484 printf("Magnetic field : %f\n", fMagneticField);
485 printf("Muon mag. field scale : %f\n", fMuonMagFieldScale);
487 printf("Centrality : %f\n", fCentrality);
488 printf("Event plane Ang : %f\n", fEventplane);
489 printf("Event plane Mag : %f\n", fEventplaneMag);
490 printf("Event plane Qx : %f\n", fEventplaneQx);
491 printf("Event plane Qy : %f\n", fEventplaneQy);
492 printf("ZDC N1 Energy : %f\n", fZDCN1Energy);
493 printf("ZDC P1 Energy : %f\n", fZDCP1Energy);
494 printf("ZDC N2 Energy : %f\n", fZDCN2Energy);
495 printf("ZDC P2 Energy : %f\n", fZDCP2Energy);
496 printf("ZDC EM1 Energy : %f\n", fZDCEMEnergy[0]);
497 printf("ZDC EM2 Energy : %f\n", fZDCEMEnergy[1]);
498 printf("ref. Multiplicity : %d\n", fRefMult);
499 printf("ref. Multiplicity (pos) : %d\n", fRefMultPos);
500 printf("ref. Multiplicity (neg) : %d\n", fRefMultNeg);
501 printf("ref. Mult.Comb |eta|<.5 : %d\n", fRefMultComb05);
502 printf("ref. Mult.Comb |eta|<.8 : %d\n", fRefMultComb08);
503 printf("number of muons : %d\n", fNMuons);
504 printf("number of dimuons : %d\n", fNDimuons);
505 printf("offline trigger : %u\n", fOfflineTrigger);
508 for (UInt_t i = 0; i<(UInt_t)fNQTheta; i++) {
509 printf("QTheta[%d] : %13.3e\n", i, GetQTheta(i));
512 printf("V0 Eq factors: ");
513 for (Int_t j=0; j<64; ++j) printf(" %.3f",fVZEROEqFactors[j]);
519 //__________________________________________________________________________
520 Int_t AliAODHeader::FindIRIntInteractionsBXMap(Int_t difference)
523 // The mapping is of 181 bits, from -90 to +90
527 if(difference<-90 || difference>90) return bin;
528 else { bin = 90 + difference; }
533 //__________________________________________________________________________
534 Int_t AliAODHeader::GetIRInt2ClosestInteractionMap()
537 // Calculation of the closest interaction
539 Int_t firstNegative=100;
540 for(Int_t item=-1; item>=-90; item--) {
541 Int_t bin = FindIRIntInteractionsBXMap(item);
542 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
544 firstNegative = item;
548 Int_t firstPositive=100;
549 for(Int_t item=1; item<=90; item++) {
550 Int_t bin = FindIRIntInteractionsBXMap(item);
551 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
553 firstPositive = item;
558 Int_t closest = firstPositive < TMath::Abs(firstNegative) ? firstPositive : TMath::Abs(firstNegative);
559 if(firstPositive==100 && firstNegative==100) closest=0;
563 //__________________________________________________________________________
564 Int_t AliAODHeader::GetIRInt1ClosestInteractionMap(Int_t gap)
567 // Calculation of the closest interaction
568 // In case of VZERO (Int1) one has to introduce a gap
569 // in order to avoid false positivies from after-pulses
571 Int_t firstNegative=100;
572 for(Int_t item=-1; item>=-90; item--) {
573 Int_t bin = FindIRIntInteractionsBXMap(item);
574 Bool_t isFired = fIRInt1InteractionsMap.TestBitNumber(bin);
576 firstNegative = item;
580 Int_t firstPositive=100;
581 for(Int_t item=1+gap; item<=90; item++) {
582 Int_t bin = FindIRIntInteractionsBXMap(item);
583 Bool_t isFired = fIRInt1InteractionsMap.TestBitNumber(bin);
585 firstPositive = item;
590 Int_t closest = firstPositive < TMath::Abs(firstNegative) ? firstPositive : TMath::Abs(firstNegative);
591 if(firstPositive==100 && firstNegative==100) closest=0;
595 //__________________________________________________________________________
596 Int_t AliAODHeader::GetIRInt2LastInteractionMap()
599 // Calculation of the last interaction
601 Int_t lastNegative=0;
602 for(Int_t item=-90; item<=-1; item++) {
603 Int_t bin = FindIRIntInteractionsBXMap(item);
604 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
610 Int_t lastPositive=0;
611 for(Int_t item=90; item>=1; item--) {
612 Int_t bin = FindIRIntInteractionsBXMap(item);
613 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
620 Int_t last = lastPositive > TMath::Abs(lastNegative) ? lastPositive : TMath::Abs(lastNegative);