]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AOD/AliAODHeader.cxx
improved GenEventHeader() method in case of AOD
[u/mrichter/AliRoot.git] / STEER / AOD / AliAODHeader.cxx
index 4efe07ee88f62e6666c128b14875fade0552a61d..e9475e8aeda1af1439f83a086f2409f647509791 100644 (file)
@@ -23,6 +23,8 @@
 #include "AliAODHeader.h"
 #include "AliCentrality.h"
 #include "AliEventplane.h"
+#include "AliMagF.h"
+#include <TGeoGlobalMagField.h>
 #include <TGeoMatrix.h>
 #include <TObjString.h>
 
@@ -36,6 +38,8 @@ AliAODHeader::AliAODHeader() :
   fCentrality(-999.),
   fEventplane(-999.),
   fEventplaneMag(-999.),
+  fEventplaneQx(-999.),
+  fEventplaneQy(-999.),
   fZDCN1Energy(-999.),
   fZDCP1Energy(-999.),
   fZDCN2Energy(-999.),
@@ -50,22 +54,29 @@ AliAODHeader::AliAODHeader() :
   fRefMultNeg(-999),
   fNMuons(0),
   fNDimuons(0),
+  fNGlobalMuons(0),               // AU
+  fNGlobalDimuons(0),             // AU
   fEventType(0),
   fOrbitNumber(0),
   fPeriodNumber(0),
   fBunchCrossNumber(0),
+  fRefMultComb05(-999),
+  fRefMultComb08(-999),
   fTriggerCluster(0), 
   fDiamondZ(0.), 
   fDiamondSig2Z(0.),
   fOfflineTrigger(0),
   fESDFileName(""),
   fEventNumberESDFile(-1),
+  fNumberESDTracks(-1),
   fL0TriggerInputs(0),
   fL1TriggerInputs(0),
   fL2TriggerInputs(0),
   fTPConlyRefMult(-1), 
   fCentralityP(0),
-  fEventplaneP(0)
+  fEventplaneP(0),
+  fIRInt2InteractionsMap(0),
+  fIRInt1InteractionsMap(0)
 {
   // default constructor
 
@@ -93,6 +104,8 @@ AliAODHeader::AliAODHeader(Int_t nRun,
   fCentrality(-999.),
   fEventplane(-999.),
   fEventplaneMag(-999.),
+  fEventplaneQx(-999.),
+  fEventplaneQy(-999.),
   fZDCN1Energy(-999.),
   fZDCP1Energy(-999.),
   fZDCN2Energy(-999.),
@@ -107,22 +120,29 @@ AliAODHeader::AliAODHeader(Int_t nRun,
   fRefMultNeg(-999),
   fNMuons(0),
   fNDimuons(0),
+  fNGlobalMuons(0),               // AU
+  fNGlobalDimuons(0),             // AU
   fEventType(0),
   fOrbitNumber(nOrbit),
   fPeriodNumber(nPeriod),
   fBunchCrossNumber(nBunchX),
+  fRefMultComb05(-999),
+  fRefMultComb08(-999),
   fTriggerCluster(0), 
   fDiamondZ(0.), 
   fDiamondSig2Z(0.),
   fOfflineTrigger(0),
   fESDFileName(""),
   fEventNumberESDFile(-1),
+  fNumberESDTracks(-1),
   fL0TriggerInputs(0),
   fL1TriggerInputs(0),
   fL2TriggerInputs(0),
   fTPConlyRefMult(-1), 
   fCentralityP(0),
-  fEventplaneP(0)
+  fEventplaneP(0),
+  fIRInt2InteractionsMap(0),
+  fIRInt1InteractionsMap(0)
 {
   // constructor
 
@@ -146,6 +166,8 @@ AliAODHeader::AliAODHeader(Int_t nRun,
                           Int_t refMult,
                           Int_t refMultPos,
                           Int_t refMultNeg,
+                          Int_t refMultComb05,
+                          Int_t refMultComb08,
                           Double_t magField,
                           Double_t muonMagFieldScale,
                           Double_t cent,
@@ -161,12 +183,17 @@ AliAODHeader::AliAODHeader(Int_t nRun,
                           const Float_t *vzeroEqFactors,
                           const Char_t *title,
                           Int_t nMuons,
-                          Int_t nDimuons) :
+                          Int_t nDimuons,
+                          Int_t nGlobalMuons,                 // AU
+                          Int_t nGlobalDimuons) :             // AU
   AliVHeader(),
   fMagneticField(magField),
   fMuonMagFieldScale(muonMagFieldScale),
   fCentrality(cent),
   fEventplane(eventplane),
+  fEventplaneMag(0),
+  fEventplaneQx(0),
+  fEventplaneQy(0),
   fZDCN1Energy(n1Energy),
   fZDCP1Energy(p1Energy),
   fZDCN2Energy(n2Energy),
@@ -181,22 +208,29 @@ AliAODHeader::AliAODHeader(Int_t nRun,
   fRefMultNeg(refMultNeg),
   fNMuons(nMuons),
   fNDimuons(nDimuons),
+  fNGlobalMuons(nGlobalMuons),               // AU
+  fNGlobalDimuons(nGlobalDimuons),           // AU
   fEventType(evttype),
   fOrbitNumber(nOrbit),
   fPeriodNumber(nPeriod),
   fBunchCrossNumber(nBunchX),
+  fRefMultComb05(refMultComb05),
+  fRefMultComb08(refMultComb08),
   fTriggerCluster(trigClus),
   fDiamondZ(0.), 
   fDiamondSig2Z(0.),
   fOfflineTrigger(0),
   fESDFileName(""),
   fEventNumberESDFile(-1),
+  fNumberESDTracks(-1),
   fL0TriggerInputs(0),
   fL1TriggerInputs(0),
   fL2TriggerInputs(0),
   fTPConlyRefMult(-1), 
   fCentralityP(0),
-  fEventplaneP(0)
+  fEventplaneP(0),
+  fIRInt2InteractionsMap(0),
+  fIRInt1InteractionsMap(0)
 {
   // constructor
 
@@ -230,6 +264,8 @@ AliAODHeader::AliAODHeader(const AliAODHeader& hdr) :
   fCentrality(hdr.fCentrality),
   fEventplane(hdr.fEventplane),
   fEventplaneMag(hdr.fEventplaneMag),
+  fEventplaneQx(hdr.fEventplaneQx),
+  fEventplaneQy(hdr.fEventplaneQy),
   fZDCN1Energy(hdr.fZDCN1Energy),
   fZDCP1Energy(hdr.fZDCP1Energy),
   fZDCN2Energy(hdr.fZDCN2Energy),
@@ -244,22 +280,29 @@ AliAODHeader::AliAODHeader(const AliAODHeader& hdr) :
   fRefMultNeg(hdr.fRefMultNeg),
   fNMuons(hdr.fNMuons),
   fNDimuons(hdr.fNDimuons),
+  fNGlobalMuons(hdr.fNGlobalMuons),           // AU
+  fNGlobalDimuons(hdr.fNGlobalDimuons),       // AU
   fEventType(hdr.fEventType),
   fOrbitNumber(hdr.fOrbitNumber),
   fPeriodNumber(hdr.fPeriodNumber),
   fBunchCrossNumber(hdr.fBunchCrossNumber),
+  fRefMultComb05(hdr.fRefMultComb05), 
+  fRefMultComb08(hdr.fRefMultComb08), 
   fTriggerCluster(hdr.fTriggerCluster), 
   fDiamondZ(hdr.fDiamondZ), 
   fDiamondSig2Z(hdr.fDiamondSig2Z),
   fOfflineTrigger(hdr.fOfflineTrigger),
   fESDFileName(hdr.fESDFileName),
   fEventNumberESDFile(hdr.fEventNumberESDFile),
+  fNumberESDTracks(hdr.fNumberESDTracks),
   fL0TriggerInputs(hdr.fL0TriggerInputs),
   fL1TriggerInputs(hdr.fL1TriggerInputs),
   fL2TriggerInputs(hdr.fL2TriggerInputs),
   fTPConlyRefMult(hdr.fTPConlyRefMult), 
   fCentralityP(new AliCentrality(*hdr.fCentralityP)),
-  fEventplaneP(new AliEventplane(*hdr.fEventplaneP))
+  fEventplaneP(new AliEventplane(*hdr.fEventplaneP)),
+  fIRInt2InteractionsMap(hdr.fIRInt2InteractionsMap),
+  fIRInt1InteractionsMap(hdr.fIRInt1InteractionsMap)
 {
   // Copy constructor.
   
@@ -303,6 +346,8 @@ AliAODHeader& AliAODHeader::operator=(const AliAODHeader& hdr)
     fCentrality       = hdr.fCentrality;
     fEventplane       = hdr.fEventplane;
     fEventplaneMag    = hdr.fEventplaneMag;
+    fEventplaneQx     = hdr.fEventplaneQx;
+    fEventplaneQy     = hdr.fEventplaneQy;
     fZDCN1Energy      = hdr.fZDCN1Energy;
     fZDCP1Energy      = hdr.fZDCP1Energy;
     fZDCN2Energy      = hdr.fZDCN2Energy;
@@ -317,19 +362,28 @@ AliAODHeader& AliAODHeader::operator=(const AliAODHeader& hdr)
     fOrbitNumber      = hdr.fOrbitNumber;
     fPeriodNumber     = hdr.fPeriodNumber;
     fBunchCrossNumber = hdr.fBunchCrossNumber;
+    fRefMultComb05    = hdr.fRefMultComb05;
+    fRefMultComb08    = hdr.fRefMultComb08;
+
     fTriggerCluster   = hdr.fTriggerCluster;
     fNMuons           = hdr.fNMuons;
     fNDimuons         = hdr.fNDimuons;
+    fNGlobalMuons     = hdr.fNGlobalMuons;           // AU
+    fNGlobalDimuons   = hdr.fNGlobalDimuons;         // AU
     fDiamondZ         = hdr.fDiamondZ;
     fDiamondSig2Z     = hdr.fDiamondSig2Z;
     fOfflineTrigger   = hdr.fOfflineTrigger;
     fESDFileName      = hdr.fESDFileName;
     fEventNumberESDFile = hdr.fEventNumberESDFile;
+    fNumberESDTracks    = hdr.fNumberESDTracks;
     fL0TriggerInputs    = hdr.fL0TriggerInputs;
     fL1TriggerInputs    = hdr.fL1TriggerInputs;
     fL2TriggerInputs    = hdr.fL2TriggerInputs;
     fTPConlyRefMult     = hdr.fTPConlyRefMult;
 
+    fIRInt2InteractionsMap  = hdr.fIRInt2InteractionsMap;
+    fIRInt1InteractionsMap  = hdr.fIRInt1InteractionsMap;
+
     if(hdr.fEventplaneP){
       if(fEventplaneP)*fEventplaneP = *hdr.fEventplaneP;
       else fEventplaneP = new AliEventplane(*hdr.fEventplaneP);
@@ -428,6 +482,8 @@ void AliAODHeader::Clear(Option_t* /*opt*/)
     fEventplaneP = 0;
     fEventplane = -999;
     fEventplaneMag = -999.;
+    fEventplaneQx = -999.;
+    fEventplaneQy = -999.;
   }
   return;
 }
@@ -448,8 +504,10 @@ void AliAODHeader::Print(Option_t* /*option*/) const
   printf("Muon mag. field scale   : %f\n", fMuonMagFieldScale);
   
   printf("Centrality              : %f\n", fCentrality);
-  printf("Event plane             : %f\n", fEventplane);
-  printf("Event plane             : %f\n", fEventplaneMag);
+  printf("Event plane Ang         : %f\n", fEventplane);
+  printf("Event plane Mag         : %f\n", fEventplaneMag);
+  printf("Event plane Qx          : %f\n", fEventplaneQx);
+  printf("Event plane Qy          : %f\n", fEventplaneQy);
   printf("ZDC N1 Energy           : %f\n", fZDCN1Energy);
   printf("ZDC P1 Energy           : %f\n", fZDCP1Energy);
   printf("ZDC N2 Energy           : %f\n", fZDCN2Energy);
@@ -459,6 +517,8 @@ void AliAODHeader::Print(Option_t* /*option*/) const
   printf("ref. Multiplicity       : %d\n", fRefMult);
   printf("ref. Multiplicity (pos) : %d\n", fRefMultPos);
   printf("ref. Multiplicity (neg) : %d\n", fRefMultNeg);
+  printf("ref. Mult.Comb |eta|<.5 : %d\n", fRefMultComb05);
+  printf("ref. Mult.Comb |eta|<.8 : %d\n", fRefMultComb08);
   printf("number of muons         : %d\n", fNMuons);
   printf("number of dimuons       : %d\n", fNDimuons);
   printf("offline trigger         : %u\n", fOfflineTrigger);
@@ -474,3 +534,148 @@ void AliAODHeader::Print(Option_t* /*option*/) const
 
   return;
 }
+
+//__________________________________________________________________________
+Int_t AliAODHeader::FindIRIntInteractionsBXMap(Int_t difference) const
+{
+  //
+  // The mapping is of 181 bits, from -90 to +90
+  //
+  Int_t bin=-1;
+
+  if(difference<-90 || difference>90) return bin;
+  else { bin = 90 + difference; }
+  
+  return bin;
+}
+
+//__________________________________________________________________________
+Int_t AliAODHeader::GetIRInt2ClosestInteractionMap() const
+{
+  //
+  // Calculation of the closest interaction
+  //
+  Int_t firstNegative=100;
+  for(Int_t item=-1; item>=-90; item--) {
+    Int_t bin = FindIRIntInteractionsBXMap(item);
+    Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
+    if(isFired) {
+      firstNegative = item;
+      break;
+    }
+  }
+  Int_t firstPositive=100;
+  for(Int_t item=1; item<=90; item++) {
+    Int_t bin = FindIRIntInteractionsBXMap(item);
+    Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
+    if(isFired) {
+      firstPositive = item;
+      break;
+    }
+  }
+
+  Int_t closest = firstPositive < TMath::Abs(firstNegative) ? firstPositive : TMath::Abs(firstNegative);
+  if(firstPositive==100 && firstNegative==100) closest=0;
+  return closest;
+}
+
+//__________________________________________________________________________
+Int_t AliAODHeader::GetIRInt1ClosestInteractionMap(Int_t gap) const
+{
+  //
+  // Calculation of the closest interaction
+  // In case of VZERO (Int1) one has to introduce a gap
+  // in order to avoid false positivies from after-pulses
+
+  Int_t firstNegative=100;
+  for(Int_t item=-1; item>=-90; item--) {
+    Int_t bin = FindIRIntInteractionsBXMap(item);
+    Bool_t isFired = fIRInt1InteractionsMap.TestBitNumber(bin);
+    if(isFired) {
+      firstNegative = item;
+      break;
+    }
+  }
+  Int_t firstPositive=100;
+  for(Int_t item=1+gap; item<=90; item++) {
+    Int_t bin = FindIRIntInteractionsBXMap(item);
+    Bool_t isFired = fIRInt1InteractionsMap.TestBitNumber(bin);
+    if(isFired) {
+      firstPositive = item;
+      break;
+    }
+  }
+
+  Int_t closest = firstPositive < TMath::Abs(firstNegative) ? firstPositive : TMath::Abs(firstNegative);
+  if(firstPositive==100 && firstNegative==100) closest=0;
+  return closest;
+}
+
+//__________________________________________________________________________
+Int_t AliAODHeader::GetIRInt2LastInteractionMap() const
+{
+  //
+  // Calculation of the last interaction
+  //
+  Int_t lastNegative=0;
+  for(Int_t item=-90; item<=-1; item++) {
+    Int_t bin = FindIRIntInteractionsBXMap(item);
+    Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
+    if(isFired) {
+      lastNegative = item;
+      break;
+    }
+  }
+  Int_t lastPositive=0;
+  for(Int_t item=90; item>=1; item--) {
+    Int_t bin = FindIRIntInteractionsBXMap(item);
+    Bool_t isFired = fIRInt2InteractionsMap.TestBitNumber(bin);
+    if(isFired) {
+      lastPositive = item;
+      break;
+    }
+  }
+
+  Int_t last = lastPositive > TMath::Abs(lastNegative) ? lastPositive : TMath::Abs(lastNegative);
+  return last;
+}
+
+//__________________________________________________________________________
+Bool_t AliAODHeader::InitMagneticField() const
+{
+  // Create mag field from stored information
+  //
+  const double def5kg = 5.00667905807495117e+00;
+  const double def2kg = 2.04487347602844238e+00;
+  //
+  AliMagF* fld = (AliMagF*) TGeoGlobalMagField::Instance()->GetField();
+  if (fld) {
+    if (TGeoGlobalMagField::Instance()->IsLocked()) {
+      if (fld->TestBit(AliMagF::kOverrideGRP)) {
+       AliInfo("ExpertMode!!! Information on magnet currents will be ignored !");
+       AliInfo("ExpertMode!!! Running with the externally locked B field !");
+       return kTRUE;
+      }
+    }
+    AliInfo("Destroying existing B field instance!");
+    delete TGeoGlobalMagField::Instance();
+  }
+  //
+  double fc5 = fMagneticField/def5kg;
+  double fc2 = fMagneticField/def2kg;
+  Bool_t use5 = TMath::Abs(TMath::Abs(fc5)-1.) < TMath::Abs(TMath::Abs(fc2)-1.);
+  //
+  fld = new AliMagF("mag","mag",use5 ? fc5 : fc2, fMuonMagFieldScale, use5 ? AliMagF::k5kG : AliMagF::k2kG);
+  //
+  if (fld) {
+    TGeoGlobalMagField::Instance()->SetField( fld );
+    TGeoGlobalMagField::Instance()->Lock();
+    AliInfo("Running with the B field constructed out of the AOD Header !");
+    return kTRUE;
+  }
+  else {
+    AliError("Failed to create a B field map !");
+    return kFALSE;
+  }
+  //
+}