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),
74 fIRInt2InteractionsMap(0),
75 fIRInt1InteractionsMap(0)
77 // default constructor
80 for(int j=0; j<2; j++) fZDCEMEnergy[j] = -999.;
81 for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
82 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
84 for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
85 for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
86 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = 0;
87 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=-1;
88 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
91 //______________________________________________________________________________
92 AliAODHeader::AliAODHeader(Int_t nRun,
96 const Char_t *title) :
98 fMagneticField(-999.),
99 fMuonMagFieldScale(-999.),
102 fEventplaneMag(-999.),
103 fEventplaneQx(-999.),
104 fEventplaneQy(-999.),
120 fOrbitNumber(nOrbit),
121 fPeriodNumber(nPeriod),
122 fBunchCrossNumber(nBunchX),
123 fRefMultComb05(-999),
124 fRefMultComb08(-999),
130 fEventNumberESDFile(-1),
131 fNumberESDTracks(-1),
138 fIRInt2InteractionsMap(0),
139 fIRInt1InteractionsMap(0)
145 for(int j=0; j<2; j++) fZDCEMEnergy[j] = -999.;
146 for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
147 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
149 for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
150 for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
151 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=-1;
152 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
155 //______________________________________________________________________________
156 AliAODHeader::AliAODHeader(Int_t nRun,
166 Double_t muonMagFieldScale,
177 const Float_t *vzeroEqFactors,
182 fMagneticField(magField),
183 fMuonMagFieldScale(muonMagFieldScale),
185 fEventplane(eventplane),
189 fZDCN1Energy(n1Energy),
190 fZDCP1Energy(p1Energy),
191 fZDCN2Energy(n2Energy),
192 fZDCP2Energy(p2Energy),
195 fTriggerMask(trigMask),
199 fRefMultPos(refMultPos),
200 fRefMultNeg(refMultNeg),
204 fOrbitNumber(nOrbit),
205 fPeriodNumber(nPeriod),
206 fBunchCrossNumber(nBunchX),
207 fRefMultComb05(refMultComb05),
208 fRefMultComb08(refMultComb08),
209 fTriggerCluster(trigClus),
214 fEventNumberESDFile(-1),
215 fNumberESDTracks(-1),
222 fIRInt2InteractionsMap(0),
223 fIRInt1InteractionsMap(0)
229 for(int j=0; j<2; j++) fZDCEMEnergy[j] = emEnergy[j];
230 for(Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
231 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
233 for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
234 for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
235 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = 0;
236 if (vzeroEqFactors) for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j] = vzeroEqFactors[j];
237 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=0;
240 //______________________________________________________________________________
241 AliAODHeader::~AliAODHeader()
249 //______________________________________________________________________________
250 AliAODHeader::AliAODHeader(const AliAODHeader& hdr) :
252 fMagneticField(hdr.fMagneticField),
253 fMuonMagFieldScale(hdr.fMuonMagFieldScale),
254 fCentrality(hdr.fCentrality),
255 fEventplane(hdr.fEventplane),
256 fEventplaneMag(hdr.fEventplaneMag),
257 fEventplaneQx(hdr.fEventplaneQx),
258 fEventplaneQy(hdr.fEventplaneQy),
259 fZDCN1Energy(hdr.fZDCN1Energy),
260 fZDCP1Energy(hdr.fZDCP1Energy),
261 fZDCN2Energy(hdr.fZDCN2Energy),
262 fZDCP2Energy(hdr.fZDCP2Energy),
265 fTriggerMask(hdr.fTriggerMask),
266 fFiredTriggers(hdr.fFiredTriggers),
267 fRunNumber(hdr.fRunNumber),
268 fRefMult(hdr.fRefMult),
269 fRefMultPos(hdr.fRefMultPos),
270 fRefMultNeg(hdr.fRefMultNeg),
271 fNMuons(hdr.fNMuons),
272 fNDimuons(hdr.fNDimuons),
273 fEventType(hdr.fEventType),
274 fOrbitNumber(hdr.fOrbitNumber),
275 fPeriodNumber(hdr.fPeriodNumber),
276 fBunchCrossNumber(hdr.fBunchCrossNumber),
277 fRefMultComb05(hdr.fRefMultComb05),
278 fRefMultComb08(hdr.fRefMultComb08),
279 fTriggerCluster(hdr.fTriggerCluster),
280 fDiamondZ(hdr.fDiamondZ),
281 fDiamondSig2Z(hdr.fDiamondSig2Z),
282 fOfflineTrigger(hdr.fOfflineTrigger),
283 fESDFileName(hdr.fESDFileName),
284 fEventNumberESDFile(hdr.fEventNumberESDFile),
285 fNumberESDTracks(hdr.fNumberESDTracks),
286 fL0TriggerInputs(hdr.fL0TriggerInputs),
287 fL1TriggerInputs(hdr.fL1TriggerInputs),
288 fL2TriggerInputs(hdr.fL2TriggerInputs),
289 fTPConlyRefMult(hdr.fTPConlyRefMult),
290 fCentralityP(new AliCentrality(*hdr.fCentralityP)),
291 fEventplaneP(new AliEventplane(*hdr.fEventplaneP)),
292 fIRInt2InteractionsMap(hdr.fIRInt2InteractionsMap),
293 fIRInt1InteractionsMap(hdr.fIRInt1InteractionsMap)
298 SetTitle(hdr.fTitle);
299 SetQTheta(hdr.fQTheta, hdr.fNQTheta);
300 SetZDCEMEnergy(hdr.fZDCEMEnergy[0], hdr.fZDCEMEnergy[1]);
301 for(Int_t i=0; i<2; i++) fDiamondXY[i]=hdr.fDiamondXY[i];
302 for(Int_t i=0; i<3; i++) fDiamondCovXY[i]=hdr.fDiamondCovXY[i];
305 for(Int_t m=0; m<kNPHOSMatrix; m++){
306 if(hdr.fPHOSMatrix[m])
307 fPHOSMatrix[m]=new TGeoHMatrix(*(hdr.fPHOSMatrix[m])) ;
312 for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
313 if(hdr.fEMCALMatrix[sm])
314 fEMCALMatrix[sm]=new TGeoHMatrix(*(hdr.fEMCALMatrix[sm])) ;
318 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = hdr.fITSClusters[i];
319 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=hdr.fVZEROEqFactors[j];
320 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=hdr.fT0spread[i];
324 //______________________________________________________________________________
325 AliAODHeader& AliAODHeader::operator=(const AliAODHeader& hdr)
327 // Assignment operator
330 AliVHeader::operator=(hdr);
332 fMagneticField = hdr.fMagneticField;
333 fMuonMagFieldScale= hdr.fMuonMagFieldScale;
334 fCentrality = hdr.fCentrality;
335 fEventplane = hdr.fEventplane;
336 fEventplaneMag = hdr.fEventplaneMag;
337 fEventplaneQx = hdr.fEventplaneQx;
338 fEventplaneQy = hdr.fEventplaneQy;
339 fZDCN1Energy = hdr.fZDCN1Energy;
340 fZDCP1Energy = hdr.fZDCP1Energy;
341 fZDCN2Energy = hdr.fZDCN2Energy;
342 fZDCP2Energy = hdr.fZDCP2Energy;
343 fTriggerMask = hdr.fTriggerMask;
344 fFiredTriggers = hdr.fFiredTriggers;
345 fRunNumber = hdr.fRunNumber;
346 fRefMult = hdr.fRefMult;
347 fRefMultPos = hdr.fRefMultPos;
348 fRefMultNeg = hdr.fRefMultNeg;
349 fEventType = hdr.fEventType;
350 fOrbitNumber = hdr.fOrbitNumber;
351 fPeriodNumber = hdr.fPeriodNumber;
352 fBunchCrossNumber = hdr.fBunchCrossNumber;
353 fRefMultComb05 = hdr.fRefMultComb05;
354 fRefMultComb08 = hdr.fRefMultComb08;
356 fTriggerCluster = hdr.fTriggerCluster;
357 fNMuons = hdr.fNMuons;
358 fNDimuons = hdr.fNDimuons;
359 fDiamondZ = hdr.fDiamondZ;
360 fDiamondSig2Z = hdr.fDiamondSig2Z;
361 fOfflineTrigger = hdr.fOfflineTrigger;
362 fESDFileName = hdr.fESDFileName;
363 fEventNumberESDFile = hdr.fEventNumberESDFile;
364 fNumberESDTracks = hdr.fNumberESDTracks;
365 fL0TriggerInputs = hdr.fL0TriggerInputs;
366 fL1TriggerInputs = hdr.fL1TriggerInputs;
367 fL2TriggerInputs = hdr.fL2TriggerInputs;
368 fTPConlyRefMult = hdr.fTPConlyRefMult;
370 fIRInt2InteractionsMap = hdr.fIRInt2InteractionsMap;
371 fIRInt1InteractionsMap = hdr.fIRInt1InteractionsMap;
373 if(hdr.fEventplaneP){
374 if(fEventplaneP)*fEventplaneP = *hdr.fEventplaneP;
375 else fEventplaneP = new AliEventplane(*hdr.fEventplaneP);
378 if(hdr.fCentralityP){
379 if(fCentralityP)*fCentralityP = *hdr.fCentralityP;
380 else fCentralityP = new AliCentrality(*hdr.fCentralityP);
384 SetTitle(hdr.fTitle);
385 SetQTheta(hdr.fQTheta, hdr.fNQTheta);
386 SetZDCEMEnergy(hdr.fZDCEMEnergy[0], hdr.fZDCEMEnergy[1]);
387 for(Int_t i=0; i<2; i++) fDiamondXY[i]=hdr.fDiamondXY[i];
388 for(Int_t i=0; i<3; i++) fDiamondCovXY[i]=hdr.fDiamondCovXY[i];
390 for(Int_t m=0; m<kNPHOSMatrix; m++){
391 if(hdr.fPHOSMatrix[m]){
392 if(fPHOSMatrix[m])delete fPHOSMatrix[m];
393 fPHOSMatrix[m]=new TGeoHMatrix(*(hdr.fPHOSMatrix[m])) ;
399 for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
400 if(hdr.fEMCALMatrix[sm]){
401 if(fEMCALMatrix[sm])delete fEMCALMatrix[sm];
402 fEMCALMatrix[sm]=new TGeoHMatrix(*(hdr.fEMCALMatrix[sm])) ;
410 for (Int_t i = 0; i < 6; i++) fITSClusters[i] = hdr.fITSClusters[i];
411 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j] = hdr.fVZEROEqFactors[j];
412 for (Int_t i=0; i<kT0SpreadSize;i++) fT0spread[i]=hdr.fT0spread[i];
417 //______________________________________________________________________________
418 void AliAODHeader::SetQTheta(Double_t *QTheta, UInt_t size)
420 if (QTheta && size>0) {
421 if (size != (UInt_t)fNQTheta) {
424 fQTheta = new Double_t[fNQTheta];
427 for (Int_t i = 0; i < fNQTheta; i++) {
428 fQTheta[i] = QTheta[i];
437 //______________________________________________________________________________
438 Double_t AliAODHeader::GetQTheta(UInt_t i) const
440 if (fQTheta && i < (UInt_t)fNQTheta) {
447 //______________________________________________________________________________
448 void AliAODHeader::RemoveQTheta()
457 void AliAODHeader::Clear(Option_t* /*opt*/)
470 fEventplaneMag = -999.;
471 fEventplaneQx = -999.;
472 fEventplaneQy = -999.;
477 //______________________________________________________________________________
478 void AliAODHeader::Print(Option_t* /*option*/) const
480 // prints event information
482 printf("Run # : %d\n", fRunNumber);
483 printf("Bunch Crossing # : %d\n", fBunchCrossNumber);
484 printf("Orbit Number # : %d\n", fOrbitNumber);
485 printf("Period Number # : %d\n", fPeriodNumber);
486 printf("Trigger mask : %lld\n", fTriggerMask);
487 printf("Trigger cluster : %d\n", fTriggerCluster);
488 printf("Event Type : %d\n", fEventType);
489 printf("Magnetic field : %f\n", fMagneticField);
490 printf("Muon mag. field scale : %f\n", fMuonMagFieldScale);
492 printf("Centrality : %f\n", fCentrality);
493 printf("Event plane Ang : %f\n", fEventplane);
494 printf("Event plane Mag : %f\n", fEventplaneMag);
495 printf("Event plane Qx : %f\n", fEventplaneQx);
496 printf("Event plane Qy : %f\n", fEventplaneQy);
497 printf("ZDC N1 Energy : %f\n", fZDCN1Energy);
498 printf("ZDC P1 Energy : %f\n", fZDCP1Energy);
499 printf("ZDC N2 Energy : %f\n", fZDCN2Energy);
500 printf("ZDC P2 Energy : %f\n", fZDCP2Energy);
501 printf("ZDC EM1 Energy : %f\n", fZDCEMEnergy[0]);
502 printf("ZDC EM2 Energy : %f\n", fZDCEMEnergy[1]);
503 printf("ref. Multiplicity : %d\n", fRefMult);
504 printf("ref. Multiplicity (pos) : %d\n", fRefMultPos);
505 printf("ref. Multiplicity (neg) : %d\n", fRefMultNeg);
506 printf("ref. Mult.Comb |eta|<.5 : %d\n", fRefMultComb05);
507 printf("ref. Mult.Comb |eta|<.8 : %d\n", fRefMultComb08);
508 printf("number of muons : %d\n", fNMuons);
509 printf("number of dimuons : %d\n", fNDimuons);
510 printf("offline trigger : %u\n", fOfflineTrigger);
513 for (UInt_t i = 0; i<(UInt_t)fNQTheta; i++) {
514 printf("QTheta[%d] : %13.3e\n", i, GetQTheta(i));
517 printf("V0 Eq factors: ");
518 for (Int_t j=0; j<64; ++j) printf(" %.3f",fVZEROEqFactors[j]);
524 //__________________________________________________________________________
525 Int_t AliAODHeader::FindIRIntInteractionsBXMap(Int_t difference) const
528 // The mapping is of 181 bits, from -90 to +90
532 if(difference<-90 || difference>90) return bin;
533 else { bin = 90 + difference; }
538 //__________________________________________________________________________
539 Int_t AliAODHeader::GetIRInt2ClosestInteractionMap() const
542 // Calculation of the closest interaction
544 Int_t firstNegative=100;
545 for(Int_t item=-1; item>=-90; item--) {
546 Int_t bin = FindIRIntInteractionsBXMap(item);
547 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
549 firstNegative = item;
553 Int_t firstPositive=100;
554 for(Int_t item=1; item<=90; item++) {
555 Int_t bin = FindIRIntInteractionsBXMap(item);
556 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
558 firstPositive = item;
563 Int_t closest = firstPositive < TMath::Abs(firstNegative) ? firstPositive : TMath::Abs(firstNegative);
564 if(firstPositive==100 && firstNegative==100) closest=0;
568 //__________________________________________________________________________
569 Int_t AliAODHeader::GetIRInt1ClosestInteractionMap(Int_t gap) const
572 // Calculation of the closest interaction
573 // In case of VZERO (Int1) one has to introduce a gap
574 // in order to avoid false positivies from after-pulses
576 Int_t firstNegative=100;
577 for(Int_t item=-1; item>=-90; item--) {
578 Int_t bin = FindIRIntInteractionsBXMap(item);
579 Bool_t isFired = fIRInt1InteractionsMap.TestBitNumber(bin);
581 firstNegative = item;
585 Int_t firstPositive=100;
586 for(Int_t item=1+gap; item<=90; item++) {
587 Int_t bin = FindIRIntInteractionsBXMap(item);
588 Bool_t isFired = fIRInt1InteractionsMap.TestBitNumber(bin);
590 firstPositive = item;
595 Int_t closest = firstPositive < TMath::Abs(firstNegative) ? firstPositive : TMath::Abs(firstNegative);
596 if(firstPositive==100 && firstNegative==100) closest=0;
600 //__________________________________________________________________________
601 Int_t AliAODHeader::GetIRInt2LastInteractionMap() const
604 // Calculation of the last interaction
606 Int_t lastNegative=0;
607 for(Int_t item=-90; item<=-1; item++) {
608 Int_t bin = FindIRIntInteractionsBXMap(item);
609 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
615 Int_t lastPositive=0;
616 for(Int_t item=90; item>=1; item--) {
617 Int_t bin = FindIRIntInteractionsBXMap(item);
618 Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
625 Int_t last = lastPositive > TMath::Abs(lastNegative) ? lastPositive : TMath::Abs(lastNegative);