]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliTriggerAnalysis.cxx
Reduction of memory consumption in case of many triggers in the configuration (e...
[u/mrichter/AliRoot.git] / ANALYSIS / AliTriggerAnalysis.cxx
index 68bcf7f5b9ccce7cf12e0f4aa57ef2e7f6504911..580098ad10d925c9156c01ddf9cbe7d351062bb1 100644 (file)
@@ -44,6 +44,8 @@
 #include <AliESDFMD.h>
 #include <AliESDVertex.h>
 #include <AliESDtrackCuts.h>
+#include <AliDAQ.h>
+#include <AliESDTrdTrack.h>
 
 ClassImp(AliTriggerAnalysis)
 
@@ -63,8 +65,22 @@ AliTriggerAnalysis::AliTriggerAnalysis() :
   fZDCCutRefDeltaCorr(-2.1),
   fZDCCutSigmaSumCorr(6.0),
   fZDCCutSigmaDeltaCorr(1.2),
+  fZDCCutZNATimeCorrMin(0.0),
+  fZDCCutZNATimeCorrMax(2.0),
+  fZDCCutZNCTimeCorrMin(0.0),
+  fZDCCutZNCTimeCorrMax(5.0),
   fASPDCvsTCut(65),
   fBSPDCvsTCut(4),
+  fTRDptHSE(3.),
+  fTRDpidHSE(144),
+  fTRDptHQU(2.),
+  fTRDpidHQU(164.),
+  fTRDptHEE(3.),
+  fTRDpidHEE(144),
+  fTRDminSectorHEE(6),
+  fTRDmaxSectorHEE(8),
+  fTRDptHJT(3.),
+  fTRDnHJT(3),
   fDoFMD(kTRUE),
   fFMDLowCut(0.2),
   fFMDHitCut(0.5),
@@ -188,17 +204,25 @@ AliTriggerAnalysis::~AliTriggerAnalysis()
   }
 }
 
-void AliTriggerAnalysis::EnableHistograms()
+void AliTriggerAnalysis::EnableHistograms(Bool_t isLowFlux)
 {
-  // creates the monitoring histograms
+  // creates the monitoring histograms (dynamical range of histograms can be adapted for pp and pPb via isLowFlux flag)
   
   // do not add this hists to the directory
   Bool_t oldStatus = TH1::AddDirectoryStatus();
   TH1::AddDirectory(kFALSE);
-  
-  fHistBitsSPD = new TH2F("fHistBitsSPD", "SPD GFO;number of fired chips (offline);number of fired chips (hardware)", 1202, -1.5, 1200.5, 1202, -1.5, 1200.5);
+  //
+  Int_t nBins = isLowFlux ? 600 : 1202;
+  fHistBitsSPD = new TH2F("fHistBitsSPD", "SPD GFO;number of fired chips (offline);number of fired chips (hardware)", nBins, -1.5, -1.5 + nBins, nBins, -1.5, -1.5+nBins);
+  //
   fHistFiredBitsSPD = new TH1F("fHistFiredBitsSPD", "SPD GFO Hardware;chip number;events", 1200, -0.5, 1199.5);
-  fHistSPDClsVsTrk = new TH2F("fHistSPDClsVsTrk", "SPD Clusters vs Tracklets", 300, -0.5, 2999.5, 1000, -0.5, 9999.5);
+  //
+  Int_t nBinsX = isLowFlux ? 100  : 300;
+  Int_t nBinsY = isLowFlux ? 500  : 1000;
+  Float_t xMax = isLowFlux ? 400  : 2999.5;
+  Float_t yMax = isLowFlux ? 4000 : 9999.5;
+  fHistSPDClsVsTrk = new TH2F("fHistSPDClsVsTrk", "SPD Clusters vs Tracklets", nBinsX, -0.5, xMax, nBinsY, -0.5, yMax);
+  //
   fHistV0A = new TH1F("fHistV0A", "V0A;leading time (ns);events", 400, -100, 100);
   fHistV0C = new TH1F("fHistV0C", "V0C;leading time (ns);events", 400, -100, 100);
   fHistZDC = new TH1F("fHistZDC", "ZDC;trigger bits;events", 8, -1.5, 6.5);
@@ -249,6 +273,10 @@ const char* AliTriggerAnalysis::GetTriggerName(Trigger trigger)
     case kZDC : str = "ZDC"; break;
     case kZDCA : str = "ZDC A"; break;
     case kZDCC : str = "ZDC C"; break;
+    case kZNA : str = "ZN A"; break;
+    case kZNC : str = "ZN C"; break;
+    case kZNABG : str = "ZN A BG"; break;
+    case kZNCBG : str = "ZN C BG"; break;
     case kFMDA : str = "FMD A"; break;
     case kFMDC : str = "FMD C"; break;
     case kFPANY : str = "SPD GFO | V0 | ZDC | FMD"; break;
@@ -260,6 +288,11 @@ const char* AliTriggerAnalysis::GetTriggerName(Trigger trigger)
     case kCentral : str = "V0 Central"; break;
     case kSemiCentral : str = "V0 Semi-central"; break;
     case kEMCAL : str = "EMCAL"; break;
+    case kTRDHCO : str = "TRD cosmics"; break;
+    case kTRDHJT : str = "TRD Jet"; break;
+    case kTRDHSE : str = "TRD Single Electron"; break;
+    case kTRDHQU : str = "TRD Quarkonia"; break;
+    case kTRDHEE : str = "TRD Dielectron"; break;
     default: str = ""; break;
   }
    
@@ -471,6 +504,38 @@ Int_t AliTriggerAnalysis::EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigg
         decision = 1;
       break;
     }
+    case kZNA:
+    {
+      if (!offline)
+        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+      if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
+       decision = 1;
+      break;
+    }
+    case kZNC:
+    {
+      if (!offline)
+        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+      if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
+       decision = 1;
+      break;
+    }
+    case kZNABG:
+    {
+      if (!offline)
+        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+      if (ZDCTimeBGTrigger(aEsd,kASide))
+       decision = 1;
+      break;
+    }
+    case kZNCBG:
+    {
+      if (!offline)
+        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+      if (ZDCTimeBGTrigger(aEsd,kCSide))
+       decision = 1;
+      break;
+    }
     case kFMDA:
     {
       if (!offline)
@@ -509,6 +574,12 @@ Int_t AliTriggerAnalysis::EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigg
         AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
       return IsLaserWarmUpTPCEvent(aEsd);
     }
+    case kTPCHVdip:
+    {
+      if (!offline)
+        AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+      return IsHVdipTPCEvent(aEsd);
+    }
     case kCentral:
     {
       if (offline)
@@ -545,6 +616,46 @@ Int_t AliTriggerAnalysis::EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigg
        decision = kTRUE;
       break;
     }
+  case kTRDHCO:
+    {
+      if(!offline) 
+       AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+      if(TRDTrigger(aEsd,kTRDHCO))
+       decision = kTRUE;
+      break;
+    }
+  case kTRDHJT:
+    {
+      if(!offline) 
+       AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+      if(TRDTrigger(aEsd,kTRDHJT))
+       decision = kTRUE;
+      break;
+    }
+  case kTRDHSE:
+    {
+      if(!offline) 
+       AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+      if(TRDTrigger(aEsd,kTRDHSE))
+       decision = kTRUE;
+      break;
+    }
+  case kTRDHQU:
+    {
+      if(!offline) 
+       AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+      if(TRDTrigger(aEsd,kTRDHQU))
+       decision = kTRUE;
+      break;
+    }
+  case kTRDHEE:
+    {
+      if(!offline) 
+       AliFatal(Form("Online trigger not available for trigger %d", triggerNoFlags));
+      if(TRDTrigger(aEsd,kTRDHEE))
+       decision = kTRUE;
+      break;
+    }
     default:
     {
       AliFatal(Form("Trigger type %d not implemented", triggerNoFlags));
@@ -585,6 +696,16 @@ Bool_t AliTriggerAnalysis::IsLaserWarmUpTPCEvent(const AliESDEvent* esd)
   return kFALSE;
 }
 
+Bool_t AliTriggerAnalysis::IsHVdipTPCEvent(const AliESDEvent* esd) {
+  //
+  // This function flags events in which the TPC chamber HV is not at its nominal value
+  //
+  if (!esd->IsDetectorOn(AliDAQ::kTPC)) return kTRUE;
+  return kFALSE;
+
+}
+
+
 Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger)
 {
   // checks if an event has been triggered "offline"
@@ -683,6 +804,30 @@ Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigge
         decision = kTRUE;
       break;
     }
+    case kZNA:
+    {
+      if (ZDCTDCTrigger(aEsd,kASide,kTRUE,kFALSE,kFALSE))
+       decision = kTRUE;
+      break;
+    }
+    case kZNC:
+    {
+      if (ZDCTDCTrigger(aEsd,kCSide,kTRUE,kFALSE,kFALSE))
+       decision = kTRUE;
+      break;
+    }
+    case kZNABG:
+    {
+      if (ZDCTimeBGTrigger(aEsd,kASide))
+       decision = kTRUE;
+      break;
+    }
+    case kZNCBG:
+    {
+      if (ZDCTimeBGTrigger(aEsd,kCSide))
+       decision = kTRUE;
+      break;
+    }
     case kFMDA:
     {
       if (FMDTrigger(aEsd, kASide))
@@ -727,6 +872,36 @@ Bool_t AliTriggerAnalysis::IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigge
       if (EMCALCellsTrigger(aEsd))
        decision = kTRUE;
       break;
+    }  
+  case kTRDHCO:
+    {
+      if(TRDTrigger(aEsd,kTRDHCO))
+       decision = kTRUE;
+      break;
+    }
+  case kTRDHJT:
+    {
+      if(TRDTrigger(aEsd,kTRDHJT))
+       decision = kTRUE;
+      break;
+    }
+  case kTRDHSE:
+    {
+      if(TRDTrigger(aEsd,kTRDHSE))
+       decision = kTRUE;
+      break;
+    }
+  case kTRDHQU:
+    {
+      if(TRDTrigger(aEsd,kTRDHQU))
+       decision = kTRUE;
+      break;
+    }
+  case kTRDHEE:
+    {
+      if(TRDTrigger(aEsd,kTRDHEE))
+       decision = kTRUE;
+      break;
     }
   default:
       {
@@ -1372,6 +1547,56 @@ Bool_t AliTriggerAnalysis::ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHi
   return zdcAccept;
 }
 
+Bool_t AliTriggerAnalysis::ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const
+{
+  // This method implements a selection
+  // based on the timing in of zdcN
+  // It can be used in order to flag background
+  // ** So far only implemented for the 2012 pA run **
+
+  if(fMC) return kFALSE;
+
+  AliESDZDC *zdcData = aEsd->GetESDZDC();
+  Bool_t zna = kFALSE;
+  Bool_t znc = kFALSE;
+  Bool_t znabadhit = kFALSE;
+  Bool_t zncbadhit = kFALSE;
+
+  Float_t tdcC=999, tdcCcorr=999, tdcA=999, tdcAcorr=999;
+  for(Int_t i = 0; i < 4; ++i) {
+    if (zdcData->GetZDCTDCData(10,i) != 0) {
+      znc = kTRUE;
+      tdcC = 0.025*(zdcData->GetZDCTDCData(10,i)-zdcData->GetZDCTDCData(14,i));
+      tdcCcorr = zdcData->GetZDCTDCCorrected(10,i);
+      if((TMath::Abs(tdcCcorr)<fZDCCutZNCTimeCorrMax) && (TMath::Abs(tdcCcorr)>fZDCCutZNCTimeCorrMin)) zncbadhit = kTRUE;
+    }
+  }
+  for(Int_t j = 0; j < 4; ++j) {
+    if (zdcData->GetZDCTDCData(12,j) != 0) {
+      zna = kTRUE;
+      tdcA = 0.025*(zdcData->GetZDCTDCData(12,j)-zdcData->GetZDCTDCData(14,j));
+      tdcAcorr = zdcData->GetZDCTDCCorrected(12,j);
+      if((TMath::Abs(tdcAcorr)<fZDCCutZNATimeCorrMax) && (TMath::Abs(tdcAcorr)>fZDCCutZNATimeCorrMin)) znabadhit = kTRUE;
+    }
+  }
+
+  const Int_t runNumber = aEsd->GetRunNumber();
+  if(runNumber<188124 || (runNumber>188374 && runNumber<194713)){ // FIXME: end of pA-run is not known
+    AliDebug(3,Form(" ZN BG time cut not implemented for run %d",runNumber));
+    return kFALSE;
+  }
+
+  Bool_t znabg = (zna && znabadhit);
+  Bool_t zncbg = (znc && zncbadhit);
+
+  // Printf("Checking ZN background (time) for run %d, A = %d, time=%2.2f, C = %d, time=%2.2f",runNumber,(Int_t)zna,tdcAcorr,(Int_t)znc,tdcCcorr);
+  // Printf("Checking ZN background (time) for run %d, A-BG = %d, C-BG = %d",runNumber,(Int_t)znabg,(Int_t)zncbg);
+
+  if (side == kASide) return znabg;
+  if (side == kCSide) return zncbg;
+  return kFALSE;
+}
+
 Bool_t AliTriggerAnalysis::ZDCTrigger(const AliESDEvent* aEsd, AliceSide side) const
 {
   // Returns if ZDC triggered
@@ -1574,8 +1799,8 @@ void AliTriggerAnalysis::SaveHistograms() const
     
   if (fHistBitsSPD) {
     fHistBitsSPD->Write();
-    fHistBitsSPD->ProjectionX();
-    fHistBitsSPD->ProjectionY();
+    //fHistBitsSPD->ProjectionX();
+    //fHistBitsSPD->ProjectionY();
   }
   else Printf("Cannot save fHistBitsSPD");
   if (fHistFiredBitsSPD) fHistFiredBitsSPD->Write();
@@ -1682,13 +1907,13 @@ AliTriggerAnalysis::T0Decision AliTriggerAnalysis::T0Trigger(const AliESDEvent*
   Float_t  tvdc[5] ;
   for (Int_t ii=0; ii<5; ii++)
     tvdc[ii] = esdT0->GetTVDC(ii);
-  Int_t trig=esdT0->GetT0Trig();
+  //  Int_t trig=esdT0->GetT0Trig();
   //  cout<<" T0 trig "<<trig<<endl;   
 
   if(fillHists) fHistT0->Fill(tvdc[0]);
     
   if (online) {
-    if(trig&1) return  kT0BB;
+    if(aEsd->GetHeader()->GetFiredTriggerInputs().Contains("0TVX") ) return kT0BB;
   }
   else {
   
@@ -1755,3 +1980,85 @@ Bool_t AliTriggerAnalysis::EMCALCellsTrigger(const AliESDEvent *aEsd)
 
   return isFired;
 }
+
+//__________________________________________________________________________________________
+Bool_t AliTriggerAnalysis::TRDTrigger(const AliESDEvent *esd, Trigger trigger)
+{
+  // evaluate the TRD trigger conditions,
+  // so far HCO, HSE, HQU, HJT, HEE
+
+  Bool_t isFired = kFALSE;
+
+  if(trigger!=kTRDHCO && trigger!=kTRDHJT && trigger!=kTRDHSE && trigger!=kTRDHQU && trigger!=kTRDHEE) {
+    AliWarning("Beware you are erroneously trying to use this function (wrong trigger)");
+    return isFired;
+  }
+
+  if (!esd) {
+    AliErrorClass("ESD event pointer is null");
+    return isFired;
+  }
+  
+  Int_t nTrdTracks = esd->GetNumberOfTrdTracks();
+  
+  if (nTrdTracks > 0 && (trigger==kTRDHCO) ) { 
+    isFired = kTRUE;
+    return isFired;
+  }
+
+  if(trigger!=kTRDHJT) {
+    for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
+      
+      AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);   
+      if (!trdTrack) continue;
+
+      // for the electron triggers we only consider matched tracks
+      if(trigger==kTRDHQU)
+       if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHQU) && (trdTrack->GetPID() > fTRDpidHQU) ) { 
+         isFired = kTRUE;
+         return isFired;
+       }
+
+      if(trigger==kTRDHSE)
+       if ( (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) { 
+         isFired = kTRUE;
+         return isFired;
+       }
+      
+      if(trigger==kTRDHEE)
+       if ( (trdTrack->GetSector() >= fTRDminSectorHEE) && (trdTrack->GetSector() <= fTRDmaxSectorHEE) &&
+            (TMath::Abs(trdTrack->Pt()) > fTRDptHSE) && (trdTrack->GetPID() > fTRDpidHSE) ) { 
+         isFired = kTRUE;
+         return isFired;
+       }
+
+    }
+  } else if(trigger==kTRDHJT) {
+
+    Int_t nTracks[90] = { 0 }; // stack-wise counted number of tracks above pt threshold
+
+    for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
+      
+      AliESDTrdTrack *trdTrack = esd->GetTrdTrack(iTrack);    
+      if (!trdTrack) continue;
+      
+      Int_t globalStack = 5*trdTrack->GetSector() + trdTrack->GetStack();
+      
+      // stack-wise counting of tracks above pt threshold for jet trigger
+      if (TMath::Abs(trdTrack->GetPt()) >= fTRDptHJT) {
+       ++nTracks[globalStack];
+      }
+    }
+
+    // check if HJT condition is fulfilled in any stack
+    for (Int_t iStack = 0; iStack < 90; iStack++) {
+      if (nTracks[iStack] >= fTRDnHJT) {
+       isFired = kTRUE;
+       break;
+      }
+    }
+
+  }
+
+  return isFired;
+}