]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Add Offline/FEE ADC info to each patch and highest trigger patch energy information...
authormvl <marco.van.leeuwen@cern.ch>
Sun, 7 Dec 2014 11:23:13 +0000 (12:23 +0100)
committermvl <marco.van.leeuwen@cern.ch>
Sun, 7 Dec 2014 11:25:00 +0000 (12:25 +0100)
PWG/EMCAL/AliEmcalTriggerMaker.cxx
PWG/EMCAL/AliEmcalTriggerMaker.h
PWG/EMCAL/AliEmcalTriggerPatchInfo.cxx
PWG/EMCAL/AliEmcalTriggerPatchInfo.h

index 2bead20f5387a2deb658ce941812163ff592be18..76f0afebd62854588e432255b84c0bd1ce14ca51 100644 (file)
@@ -1,6 +1,19 @@
-// $Id: AliEmcalTriggerMaker.cxx 64593 2013-10-18 10:23:58Z loizides $
 //
 // Class to make array of trigger patch objects in AOD/ESD events.
+// The input for the process are:
+//   - AliCaloTrigger objects from ESS/AOD, which contain raw trigger information
+//   - the CaloCells, which contain offline/FEE information
+//
+// The output is a list of AliEmcalTriggerPatchInfo objects which is stored in ESD/AOD (Use event->FindListObject to get them) with three types of trigger patches:
+//  1) Online trigger info
+//  2) Trigger info based on the offline FEE ADCs (SimpleOffline)
+//  3) The highest gamma and jet patch in the event, even if it does 
+//     not pass the threshold (RecalcJet and RecalcGamma); with two versions
+//     a) based on the online trigger information
+//     b) based offline FEE information
+// The different types of patches are distinguished by bitflags according 
+// to the enum AliEmcalTriggerPatchInfo::TriggerMakerBits and 
+//   EMCAL/AliEmcalTriggerTypes.h
 //
 // Author: J.Kral
 #include <TClonesArray.h>
@@ -24,6 +37,7 @@ ClassImp(AliEmcalTriggerMaker)
 
 using namespace std;
 
+const TString AliEmcalTriggerMaker::fgkTriggerTypeNames[5] = {"EJE", "EGA", "EL0", "REJE", "REGA"};
 //________________________________________________________________________
 AliEmcalTriggerMaker::AliEmcalTriggerMaker() : 
   AliAnalysisTaskEmcal("AliEmcalTriggerMaker",kFALSE),
@@ -44,6 +58,8 @@ AliEmcalTriggerMaker::AliEmcalTriggerMaker() :
   fRunTriggerType[kTMEMCalJet] = kTRUE;
   fRunTriggerType[kTMEMCalGamma] = kTRUE;
   fRunTriggerType[kTMEMCalLevel0] = kTRUE;
+  fRunTriggerType[kTMEMCalRecalcJet] = kTRUE;
+  fRunTriggerType[kTMEMCalRecalcGamma] = kTRUE;
   memset(fThresholdConstants, 0, sizeof(Int_t) * 12);
   memset(fPatchADCSimple, 0, sizeof(Int_t) * kPatchCols * kPatchRows);
   memset(fPatchADC, 0, sizeof(Int_t) * kPatchCols * kPatchRows);
@@ -69,6 +85,8 @@ AliEmcalTriggerMaker::AliEmcalTriggerMaker(const char *name, Bool_t doQA) :
   fRunTriggerType[kTMEMCalJet] = kTRUE;
   fRunTriggerType[kTMEMCalGamma] = kTRUE;
   fRunTriggerType[kTMEMCalLevel0] = kTRUE;
+  fRunTriggerType[kTMEMCalRecalcJet] = kTRUE;
+  fRunTriggerType[kTMEMCalRecalcGamma] = kTRUE;
   memset(fThresholdConstants, 0, sizeof(Int_t) * 12);
   memset(fPatchADCSimple, 0, sizeof(Int_t) * kPatchCols * kPatchRows);
   memset(fPatchADC, 0, sizeof(Int_t) * kPatchCols * kPatchRows);
@@ -148,11 +166,10 @@ void AliEmcalTriggerMaker::UserCreateOutputObjects()
   if(fDoQA && fOutput){
     fQAHistos = new THistManager("TriggerQA");
 
-    TString trtypenames[3] = {"EJE", "EGA", "EL0"};
-    for(int itype = 0; itype < 3; itype++){
-      fQAHistos->CreateTH2(Form("RCPos%s", trtypenames[itype].Data()), Form("Lower edge position of %s patches (col-row)", trtypenames[itype].Data()), 48, -0.5, 47.5, 64, -0.5, 63.5);
-      fQAHistos->CreateTH2(Form("EPCentPos%s", trtypenames[itype].Data()), Form("Center position of the %s trigger patches", trtypenames[itype].Data()), 20, -0.8, 0.8, 100., 1., 4.);
-      fQAHistos->CreateTH2(Form("PatchADCvsE%s", trtypenames[itype].Data()), Form("Patch ADC value for trigger type %s", trtypenames[itype].Data()), 200, 0., 200, 200, 0., 200);
+    for(int itype = 0; itype < 5; itype++){
+      fQAHistos->CreateTH2(Form("RCPos%s", fgkTriggerTypeNames[itype].Data()), Form("Lower edge position of %s patches (col-row)", fgkTriggerTypeNames[itype].Data()), 48, -0.5, 47.5, 64, -0.5, 63.5);
+      fQAHistos->CreateTH2(Form("EPCentPos%s", fgkTriggerTypeNames[itype].Data()), Form("Center position of the %s trigger patches", fgkTriggerTypeNames[itype].Data()), 20, -0.8, 0.8, 100, 1., 4.);
+      fQAHistos->CreateTH2(Form("PatchADCvsE%s", fgkTriggerTypeNames[itype].Data()), Form("Patch ADC value for trigger type %s", fgkTriggerTypeNames[itype].Data()), 200, 0., 200, 200, 0., 200);
     }
     fQAHistos->CreateTH1("triggerBitsAll", "Trigger bits for all incoming patches", 64, -0.5, 63.5);
     fQAHistos->CreateTH1("triggerBitsSel", "Trigger bits for reconstructed patches", 64, -0.5, 63.5);
@@ -290,7 +307,7 @@ Bool_t AliEmcalTriggerMaker::Run()
     Bool_t isOfflineSimple=0;
     while (NextTrigger(isOfflineSimple)) {
       // process jet
-      if(fRunTriggerType[kTMEMCalJet]){
+       if(fRunTriggerType[kTMEMCalJet]){
         trigger = ProcessPatch(kTMEMCalJet, isOfflineSimple);
         // save main jet triggers in event
         if (trigger != 0) {
@@ -330,6 +347,12 @@ Bool_t AliEmcalTriggerMaker::Run()
             triggerMainLevel0 = trigger;
         }
       }
+
+      // Recalculated triggers (max patches without threshold)
+      if(fRunTriggerType[kTMEMCalRecalcJet])
+       ProcessPatch(kTMEMCalRecalcJet, isOfflineSimple);
+      if(fRunTriggerType[kTMEMCalRecalcGamma])
+       ProcessPatch(kTMEMCalRecalcGamma, isOfflineSimple);
     } // triggers
     
     // mark the most energetic patch as main
@@ -337,31 +360,31 @@ Bool_t AliEmcalTriggerMaker::Run()
     if (triggerMainJet != 0) {
       Int_t tBits = triggerMainJet->GetTriggerBits();
       // main trigger flag
-      tBits = tBits | ( 1 << 24 );
+      tBits = tBits | ( 1 << AliEmcalTriggerPatchInfo::kMainTriggerBitNum );
       triggerMainJet->SetTriggerBits( tBits );
     }
     if (triggerMainJetSimple != 0) {
       Int_t tBits = triggerMainJetSimple->GetTriggerBits();
       // main trigger flag
-      tBits = tBits | ( 1 << 24 );
+      tBits = tBits | ( 1 << AliEmcalTriggerPatchInfo::kMainTriggerBitNum );
       triggerMainJetSimple->SetTriggerBits(tBits);
     }
     if (triggerMainGamma != 0) {
       Int_t tBits = triggerMainGamma->GetTriggerBits();
       // main trigger flag
-      tBits = tBits | ( 1 << 24 );
+      tBits = tBits | ( 1 << AliEmcalTriggerPatchInfo::kMainTriggerBitNum );
       triggerMainGamma->SetTriggerBits( tBits );
     }
     if (triggerMainGammaSimple != 0) {
       Int_t tBits = triggerMainGammaSimple->GetTriggerBits();
       // main trigger flag
-      tBits = tBits | ( 1 << 24 );
+      tBits = tBits | ( 1 << AliEmcalTriggerPatchInfo::kMainTriggerBitNum );
       triggerMainGammaSimple->SetTriggerBits( tBits );
     }
     if(triggerMainLevel0){
       Int_t tBits = triggerMainLevel0->GetTriggerBits();
       // main trigger flag
-      tBits |= (1 << 24);
+      tBits |= (1 << AliEmcalTriggerPatchInfo::kMainTriggerBitNum);
       triggerMainLevel0->SetTriggerBits(tBits);
     }
   } // there are some triggers
@@ -390,11 +413,11 @@ AliEmcalTriggerPatchInfo* AliEmcalTriggerMaker::ProcessPatch(TriggerMakerTrigger
        
   if ((type == kTMEMCalJet    && !IsEJE( tBits )) || 
       (type == kTMEMCalGamma  && !IsEGA( tBits )) || 
-      (type == kTMEMCalLevel0 && !(CheckForL0(*fCaloTriggers))))
+      (type == kTMEMCalLevel0 && !(CheckForL0(*fCaloTriggers))) ||
+      (type == kTMEMCalRecalcJet && (tBits & (1 << AliEmcalTriggerPatchInfo::kRecalcJetBitNum))==0) ||
+      (type == kTMEMCalRecalcGamma && (tBits & (1 << AliEmcalTriggerPatchInfo::kRecalcGammaBitNum))==0) ) 
     return 0;
 
-  TString trtypenames[3] = {"EJE", "EGA", "EL0"}; // For QA
-
   // save primary vertex in vector
   TVector3 vertex;
   vertex.SetXYZ(fVertex[0], fVertex[1], fVertex[2]);
@@ -424,11 +447,12 @@ AliEmcalTriggerPatchInfo* AliEmcalTriggerMaker::ProcessPatch(TriggerMakerTrigger
   // sum the available energy in the 32/32 window of cells
   // step over trigger channels and get all the corresponding cells
   // make CM
-  Double_t amp = 0;
-  Int_t cmiCol = 0;
-  Int_t cmiRow = 0;
+  Float_t amp = 0;
+  Float_t cmiCol = 0;
+  Float_t cmiRow = 0;
   Int_t adcAmp = 0;
-  int nfastor = (type == kTMEMCalJet) ? 16 : 2; // 32x32 cell window for L1 Jet trigger, 4x4 for L1 Gamma or L0 trigger
+  Double_t adcOfflineAmp = 0;
+  int nfastor = (type == kTMEMCalJet || type == kTMEMCalRecalcJet) ? 16 : 2; // 32x32 cell window for L1 Jet trigger, 4x4 for L1 Gamma or L0 trigger
   for (Int_t i = 0; i < nfastor; ++i) {
     for (Int_t j = 0; j < nfastor; ++j) {
          // get the 4 cells composing the trigger channel
@@ -436,20 +460,20 @@ AliEmcalTriggerPatchInfo* AliEmcalTriggerMaker::ProcessPatch(TriggerMakerTrigger
          fGeom->GetCellIndexFromFastORIndex(absId, cellAbsId);
          // add amplitudes and find patch edges
          for (Int_t k = 0; k < 4; ++k) {
-           Double_t ca = fCaloCells->GetCellAmplitude(cellAbsId[k]);
+           Float_t ca = fCaloCells->GetCellAmplitude(cellAbsId[k]);
            //fGeom->GetGlobal(cellAbsId[k], cellCoor);
            amp += ca;
-           cmiCol += ca*(Double_t)i;
-           cmiRow += ca*(Double_t)j;
+           cmiCol += ca*(Float_t)i;
+           cmiRow += ca*(Float_t)j;
          }
          // add the STU ADCs in the patch (in case of L1) or the TRU Amplitude (in case of L0)
-         if (!isOfflineSimple )
-             if(type == kTMEMCalLevel0){
-               adcAmp += fPatchADC[globCol+i][globRow+j] * 4; // precision loss in case of global integer field
-             } else
-               adcAmp += fPatchADC[globCol+i][globRow+j];
-         else
-           adcAmp += fPatchADCSimple[globCol+i][globRow+j];
+
+         if(type == kTMEMCalLevel0){
+           adcAmp += fPatchADC[globCol+i][globRow+j] * 4; // precision loss in case of global integer field
+         } else
+           adcAmp += fPatchADC[globCol+i][globRow+j];
+
+         adcOfflineAmp += fPatchADCSimple[globCol+i][globRow+j];
     }
   }
 
@@ -479,9 +503,11 @@ AliEmcalTriggerPatchInfo* AliEmcalTriggerMaker::ProcessPatch(TriggerMakerTrigger
   Int_t posOffset=-1;
   switch(type){
   case kTMEMCalJet:
+  case kTMEMCalRecalcJet:
     posOffset = 15;
     break;
   case kTMEMCalGamma:
+  case kTMEMCalRecalcGamma:
     posOffset = 1;
     break;
   case kTMEMCalLevel0:
@@ -501,9 +527,11 @@ AliEmcalTriggerPatchInfo* AliEmcalTriggerMaker::ProcessPatch(TriggerMakerTrigger
   // picking two diagonally closest cells from the patches
   switch(type){
   case kTMEMCalJet:
+  case kTMEMCalRecalcJet:
     posOffset = 7;
     break;
   case kTMEMCalGamma:
+  case kTMEMCalRecalcGamma:
     posOffset = 0;
     break;
   case kTMEMCalLevel0:
@@ -520,9 +548,11 @@ AliEmcalTriggerPatchInfo* AliEmcalTriggerMaker::ProcessPatch(TriggerMakerTrigger
        
   switch(type){
   case kTMEMCalJet:
+  case kTMEMCalRecalcJet:
     posOffset = 8;
     break;
   case kTMEMCalGamma:
+  case kTMEMCalRecalcGamma:
     posOffset = 1;
     break;
   case kTMEMCalLevel0:
@@ -568,6 +598,8 @@ AliEmcalTriggerPatchInfo* AliEmcalTriggerMaker::ProcessPatch(TriggerMakerTrigger
         1 << (fTriggerBitConfig->GetJetLowBit()) | 1 << (fTriggerBitConfig->GetJetHighBit()) | 1 << (fTriggerBitConfig->GetTriggerTypesEnd() + fTriggerBitConfig->GetGammaLowBit()) |
         1 << (fTriggerBitConfig->GetTriggerTypesEnd() + fTriggerBitConfig->GetGammaHighBit()) | 1 << (fTriggerBitConfig->GetGammaLowBit()) | 1 << (fTriggerBitConfig->GetGammaHighBit()));
     break;
+  default:  // recalculated patches don't need any action
+    break;
   };
 
   // save the trigger object
@@ -580,13 +612,14 @@ AliEmcalTriggerPatchInfo* AliEmcalTriggerMaker::ProcessPatch(TriggerMakerTrigger
   trigger->SetEdge1(edge1, amp);
   trigger->SetEdge2(edge2, amp);
   trigger->SetADCAmp(adcAmp);
+  trigger->SetADCOfflineAmp(Int_t(adcOfflineAmp));
   trigger->SetTriggerBits(tBits);
   trigger->SetOffSet(offSet);
   trigger->SetEdgeCell(globCol*2, globRow*2); // from triggers to cells
   if(fDoQA){
-    fQAHistos->FillTH2(Form("RCPos%s", trtypenames[type].Data()), globCol, globRow);
-    fQAHistos->FillTH2(Form("EPCentPos%s", trtypenames[type].Data()), centerGeo.Eta(), centerGeo.Phi());
-    fQAHistos->FillTH2(Form("PatchADCvsE%s", trtypenames[type].Data()), adcAmp, trigger->GetPatchE());
+    fQAHistos->FillTH2(Form("RCPos%s", fgkTriggerTypeNames[type].Data()), globCol, globRow);
+    fQAHistos->FillTH2(Form("EPCentPos%s", fgkTriggerTypeNames[type].Data()), centerGeo.Eta(), centerGeo.Phi());
+    fQAHistos->FillTH2(Form("PatchADCvsE%s", fgkTriggerTypeNames[type].Data()), adcAmp, trigger->GetPatchE());
     // Redo checking of found trigger bits after masking of unwanted triggers
     for(unsigned int ibit = 0; ibit < sizeof(tBits)*8; ibit++) {
       if(tBits & (1 << ibit)){
@@ -600,77 +633,128 @@ AliEmcalTriggerPatchInfo* AliEmcalTriggerMaker::ProcessPatch(TriggerMakerTrigger
 //________________________________________________________________________
 void AliEmcalTriggerMaker::RunSimpleOfflineTrigger() 
 {
-  // Runs a simple offline trigger algorithm.
+  // Runs a simple algorithm to calculate patch energies based on 
+  // the offline/FEE ADC values (useOffline = kTRUE) or 
+  // the online/trigger values (useOffline = kFALSE.
+  //
   // It creates separate patches for jet and gamma triggers
   // on the same positions (different from STU reconstruction behavior)
-  // TODO:: change to merge
 
-  TArrayI tBitsArray, rowArray, colArray;
-  
-  // 0 thresholds = no processing
-  if (fCaloTriggerSetupOut->GetThresholdJetLowSimple() == 0 &&
-      fCaloTriggerSetupOut->GetThresholdJetHighSimple() == 0 )
-    return;
+  TArrayI tBitsArray(4), rowArray(4), colArray(4);
   
+  // First entries are for recalculated patches
+
+  tBitsArray[0] = 1 << AliEmcalTriggerPatchInfo::kRecalcJetBitNum;
+  colArray[0] = -1;
+  rowArray[0] = -1;
+
+  tBitsArray[1] = 1 << AliEmcalTriggerPatchInfo::kRecalcJetBitNum | 1 << AliEmcalTriggerPatchInfo::kSimpleOfflineBitNum;
+  colArray[1] = -1;
+  rowArray[1] = -1;
+
+  tBitsArray[2] = 1 << AliEmcalTriggerPatchInfo::kRecalcGammaBitNum;
+  colArray[2] = -1;
+  rowArray[2] = -1;
+
+  tBitsArray[3] = 1 << AliEmcalTriggerPatchInfo::kRecalcGammaBitNum | 1 << AliEmcalTriggerPatchInfo::kSimpleOfflineBitNum;
+  colArray[3] = -1;
+  rowArray[3] = -1;
+
+  Int_t maxPatchADCoffline = -1;
+  Int_t maxPatchADC = -1;
   // run the trigger algo, stepping by 8 towers (= 4 trigger channels)
   Int_t maxCol = 48;
   Int_t maxRow = fGeom->GetNTotalTRU()*2;
   for (Int_t i = 0; i < (maxCol-16); i += 4) {
     for (Int_t j = 0; j < (maxRow-16); j += 4) {
+      Int_t tSumOffline  = 0;
       Int_t tSum  = 0;
       Int_t tBits = 0;
       // window
-      for (Int_t k = 0; k < 16; ++k)
-        for (Int_t l = 0; l < 16; ++l)
-          tSum += (ULong64_t)fPatchADCSimple[i+k][j+l];
-      
+      for (Int_t k = 0; k < 16; ++k) {
+        for (Int_t l = 0; l < 16; ++l) {
+         tSumOffline += (ULong64_t)fPatchADCSimple[i+k][j+l];    
+         tSum += (ULong64_t)fPatchADC[i+k][j+l];
+       }
+      }
+
+      if (tSum > maxPatchADC) { // Mark highest Jet patch
+       maxPatchADC = tSum;
+       colArray[0] = i;
+       rowArray[0] = j;
+      }
+
+      if (tSumOffline > maxPatchADCoffline) { // Mark highest Jet patch
+       maxPatchADCoffline = tSumOffline;
+       colArray[1] = i;
+       rowArray[1] = j;
+      }
+
       // check thresholds
-      if (tSum > fCaloTriggerSetupOut->GetThresholdJetLowSimple())
-        tBits = tBits | ( 1 << ( fTriggerBitConfig->GetTriggerTypesEnd() + fTriggerBitConfig->GetJetLowBit() ));
-      if (tSum > fCaloTriggerSetupOut->GetThresholdJetHighSimple())
-        tBits = tBits | ( 1 << ( fTriggerBitConfig->GetTriggerTypesEnd() + fTriggerBitConfig->GetJetHighBit() ));
+      if (tSumOffline > fCaloTriggerSetupOut->GetThresholdJetLowSimple())
+       tBits = tBits | ( 1 << ( fTriggerBitConfig->GetTriggerTypesEnd() + fTriggerBitConfig->GetJetLowBit() ));
+      if (tSumOffline > fCaloTriggerSetupOut->GetThresholdJetHighSimple())
+       tBits = tBits | ( 1 << ( fTriggerBitConfig->GetTriggerTypesEnd() + fTriggerBitConfig->GetJetHighBit() ));
       
       // add trigger values
       if (tBits != 0) {
-        // add offline bit
-        tBits = tBits | ( 1 << 25 );
-        tBitsArray.Set( tBitsArray.GetSize() + 1 );
-        colArray.Set( colArray.GetSize() + 1 );
-        rowArray.Set( rowArray.GetSize() + 1 );
-        tBitsArray[tBitsArray.GetSize()-1] = tBits;
-        colArray[colArray.GetSize()-1] = i;
-        rowArray[rowArray.GetSize()-1] = j;
+       // add offline bit
+       tBits = tBits | ( 1 << AliEmcalTriggerPatchInfo::kSimpleOfflineBitNum );
+       tBitsArray.Set( tBitsArray.GetSize() + 1 );
+       colArray.Set( colArray.GetSize() + 1 );
+       rowArray.Set( rowArray.GetSize() + 1 );
+       tBitsArray[tBitsArray.GetSize()-1] = tBits;
+       colArray[colArray.GetSize()-1] = i;
+       rowArray[rowArray.GetSize()-1] = j;
       }
     }
   } // trigger algo
   
   // 4x4 trigger algo, stepping by 2 towers (= 1 trigger channel)
+  maxPatchADC = -1;
+  maxPatchADCoffline = -1;
+
   for (Int_t i = 0; i < (maxCol-2); ++i) {
     for (Int_t j = 0; j < (maxRow-2); ++j) {
       Int_t tSum = 0;
+      Int_t tSumOffline = 0;
       Int_t tBits = 0;
       
       // window
-      for (Int_t k = 0; k < 2; ++k)
-        for (Int_t l = 0; l < 2; ++l)
-          tSum += (ULong64_t)fPatchADCSimple[i+k][j+l];
-      
+      for (Int_t k = 0; k < 2; ++k) {
+        for (Int_t l = 0; l < 2; ++l) {
+         tSumOffline += (ULong64_t)fPatchADCSimple[i+k][j+l];
+         tSum += (ULong64_t)fPatchADC[i+k][j+l];
+       }
+      }
+
+      if (tSum > maxPatchADC) { // Mark highest Gamma patch
+       maxPatchADC = tSum;
+       colArray[2] = i;
+       rowArray[2] = j;
+      }
+      if (tSumOffline > maxPatchADCoffline) { // Mark highest Gamma patch
+       maxPatchADCoffline = tSumOffline;
+       colArray[3] = i;
+       rowArray[3] = j;
+      }
+
       // check thresholds
-      if (tSum > fCaloTriggerSetupOut->GetThresholdGammaLowSimple())
-        tBits = tBits | ( 1 << ( fTriggerBitConfig->GetTriggerTypesEnd() + fTriggerBitConfig->GetGammaLowBit() ));
-      if (tSum > fCaloTriggerSetupOut->GetThresholdGammaHighSimple())
-        tBits = tBits | ( 1 << ( fTriggerBitConfig->GetTriggerTypesEnd() + fTriggerBitConfig->GetGammaHighBit() ));
+      if (tSumOffline > fCaloTriggerSetupOut->GetThresholdGammaLowSimple())
+       tBits = tBits | ( 1 << ( fTriggerBitConfig->GetTriggerTypesEnd() + fTriggerBitConfig->GetGammaLowBit() ));
+      if (tSumOffline > fCaloTriggerSetupOut->GetThresholdGammaHighSimple())
+       tBits = tBits | ( 1 << ( fTriggerBitConfig->GetTriggerTypesEnd() + fTriggerBitConfig->GetGammaHighBit() ));
       
       // add trigger values
       if (tBits != 0) {
-        // add offline bit
-        tBits = tBits | ( 1 << 25 );
-        tBitsArray.Set( tBitsArray.GetSize() + 1 );
-        colArray.Set( colArray.GetSize() + 1 );
-        rowArray.Set( rowArray.GetSize() + 1 );
-        tBitsArray[tBitsArray.GetSize()-1] = tBits;
-        colArray[colArray.GetSize()-1] = i;
-        rowArray[rowArray.GetSize()-1] = j;
+       // add offline bit
+       tBits = tBits | ( 1 << AliEmcalTriggerPatchInfo::kSimpleOfflineBitNum );
+       tBitsArray.Set( tBitsArray.GetSize() + 1 );
+       colArray.Set( colArray.GetSize() + 1 );
+       rowArray.Set( rowArray.GetSize() + 1 );
+       tBitsArray[tBitsArray.GetSize()-1] = tBits;
+       colArray[colArray.GetSize()-1] = i;
+       rowArray[rowArray.GetSize()-1] = j;
       }
     }
   } // trigger algo
index 7c7560f369aedb92d675c0630a78dad6b5291d21..f2d6d0553e49bdf5658ff5a1d7e71e2aaaaa3a88 100644 (file)
@@ -19,12 +19,15 @@ class AliEmcalTriggerMaker : public AliAnalysisTaskEmcal {
   enum TriggerMakerTriggerType_t {
     kTMEMCalJet = 0,
     kTMEMCalGamma = 1,
-    kTMEMCalLevel0 = 2
+    kTMEMCalLevel0 = 2,
+    kTMEMCalRecalcJet = 3,
+    kTMEMCalRecalcGamma = 4
   };
   enum TriggerMakerBitConfig_t {
     kOldConfig = 0,
     kNewConfig = 1
   };
+
   AliEmcalTriggerMaker();
   AliEmcalTriggerMaker(const char *name, Bool_t doQA = kFALSE);
   virtual ~AliEmcalTriggerMaker();
@@ -72,14 +75,14 @@ class AliEmcalTriggerMaker : public AliAnalysisTaskEmcal {
   Double_t                   fPatchADCSimple[kPatchCols][kPatchRows];   //!patch map for simple offline trigger
   Int_t                      fPatchADC[kPatchCols][kPatchRows];         //!ADC values map
   Int_t                      fITrigger;                 //!trigger counter
-  Bool_t                     fRunTriggerType[3];        // Run patch maker for a given trigger type
+  Bool_t                     fRunTriggerType[5];        // Run patch maker for a given trigger type
   Bool_t                     fDoQA;                     // Fill QA histograms
   THistManager              *fQAHistos;                 //! Histograms for QA
-
+  static const TString       fgkTriggerTypeNames[5];    //! Histogram name tags
  private:
   AliEmcalTriggerMaker(const AliEmcalTriggerMaker&);            // not implemented
   AliEmcalTriggerMaker &operator=(const AliEmcalTriggerMaker&); // not implemented
 
-  ClassDef(AliEmcalTriggerMaker, 4) // Task to make array of EMCAL trigger patches
+  ClassDef(AliEmcalTriggerMaker, 5) // Task to make array of EMCAL trigger patches
 };
 #endif
index 3c6de0d004cf149be8b3cb92b14acf511cb18147..e66bc4d711156f145ab7f348a609f32f3cb66af1 100644 (file)
@@ -1,6 +1,9 @@
-// $Id$
 //
-// Emcal particle trigger class, which can contain either
+// Emcal trigger patch information class
+// Can contain three types of information, distinguished by the various bits in the bit field:
+//  1) online trigger information (no extra bits set)
+//  2) offline recalculated trigger patches (bit 25, kSimpleOfflineTriggerBit set)
+//  3) highest patch energy, also for events that did not fire the trigger (bits 22, 23 kRecalc... (using both online and offline info, use bit 25 to distinguish)
 //
 // Author: J.Kral
 
@@ -17,8 +20,10 @@ AliEmcalTriggerPatchInfo::AliEmcalTriggerPatchInfo() :
   fEdge1(),
   fEdge2(),
   fADCAmp(0),
+  fADCOfflineAmp(0),
   fTriggerBits(0),
-  fOffSet(0)            // To be set explictly by the trigger maker in order to avoid hard coding
+  fOffSet(0),            // To be set explictly by the trigger maker in order to avoid hard coding
+  fTriggerBitConfig()
 {
   // Default constructor.
   fEdgeCell[0] = -1;
@@ -34,8 +39,10 @@ AliEmcalTriggerPatchInfo::AliEmcalTriggerPatchInfo(const AliEmcalTriggerPatchInf
   fEdge1(p.fEdge1),
   fEdge2(p.fEdge2),
   fADCAmp(p.fADCAmp),
+  fADCOfflineAmp(p.fADCOfflineAmp),
   fTriggerBits(p.fTriggerBits),
-  fOffSet(p.fOffSet)
+  fOffSet(p.fOffSet),
+  fTriggerBitConfig(p.fTriggerBitConfig)
 {
   // Copy constructor.
   fEdgeCell[0] = p.fEdgeCell[0];
@@ -59,6 +66,7 @@ AliEmcalTriggerPatchInfo &AliEmcalTriggerPatchInfo::operator=(const AliEmcalTrig
     fEdge1 = p.fEdge1;
     fEdge2 = p.fEdge2;
     fADCAmp = p.fADCAmp;
+    fADCOfflineAmp = p.fADCOfflineAmp;
     fTriggerBits = p.fTriggerBits;
     fEdgeCell[0] = p.fEdgeCell[0];
     fEdgeCell[1] = p.fEdgeCell[1];
index 632d4079c9f014a069b5721f5b0d304e69b31b70..4f48870c6d5e4fccd4fd7ad36ad58a495b1ab3ce 100644 (file)
@@ -21,6 +21,13 @@ class AliEmcalTriggerPatchInfo: public TObject {
   AliEmcalTriggerPatchInfo &operator=(const AliEmcalTriggerPatchInfo &p);
   virtual ~AliEmcalTriggerPatchInfo();
 
+  enum TriggerMakerBits_t {
+    kRecalcJetBitNum = 22,
+    kRecalcGammaBitNum = 23,
+    kMainTriggerBitNum = 24,
+    kSimpleOfflineBitNum = 25
+  };
+  // The lower bits in fTriggerBits are defined in EMCAL/AliEmcalTriggerTypes.h
 
   Double_t GetPhiGeo() const { return fCenterGeo.Phi(); }
   Double_t GetPhiCM()  const { return fCenterMass.Phi(); }
@@ -32,24 +39,25 @@ class AliEmcalTriggerPatchInfo: public TObject {
   Double_t GetEtaMax() const { return fEdge1.Eta(); }
   Double_t GetPatchE() const { return fCenterGeo.E(); }
   Int_t    GetADCAmp() const { return fADCAmp; }
+  Int_t    GetADCOfflineAmp() const { return fADCOfflineAmp; }
   Double_t GetADCAmpGeVRough() const { return (Double_t)fADCAmp * kEMCL1ADCtoGeV; }
   Int_t    GetTriggerBits() const { return fTriggerBits; }
   Int_t    GetEdgeCellX() const { return fEdgeCell[0]; }
   Int_t    GetEdgeCellY() const { return fEdgeCell[1]; }
   void     GetCellIndices( AliEMCALGeometry *geom, TArrayI *cells );
   
-  Bool_t   IsLevel0() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetLevel0Bit()))&(!(fTriggerBits >> 25))&1); }
-  Bool_t   IsJetLow() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetJetLowBit()))&(!(fTriggerBits >> 25))&1); }
-  Bool_t   IsJetHigh() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetJetHighBit()))&(!(fTriggerBits >> 25))&1); }
-  Bool_t   IsGammaLow() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetGammaLowBit()))&(!(fTriggerBits >> 25))&1); }
-  Bool_t   IsGammaHigh() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetGammaHighBit()))&(!(fTriggerBits >> 25))&1); }
-  Bool_t   IsMainTrigger() const { return (Bool_t)((fTriggerBits >> 24)&(!(fTriggerBits >> 25))&1); }
-  Bool_t   IsJetLowSimple() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetJetLowBit()))&(fTriggerBits >> 25)&1); }
-  Bool_t   IsJetHighSimple() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetJetHighBit()))&(fTriggerBits >> 25)&1); }
-  Bool_t   IsGammaLowSimple() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetGammaLowBit()))&(fTriggerBits >> 25)&1); }
-  Bool_t   IsGammaHighSimple() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetGammaHighBit()))&(fTriggerBits >> 25)&1); }
-  Bool_t   IsMainTriggerSimple() const { return (Bool_t)((fTriggerBits >> 24)&(fTriggerBits >> 25)&1); }
-  Bool_t   IsOfflineSimple() const { return (Bool_t)((fTriggerBits >> 25)&1); }
+  Bool_t   IsLevel0() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetLevel0Bit()))&(!(fTriggerBits >> kSimpleOfflineBitNum))&1); }
+  Bool_t   IsJetLow() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetJetLowBit()))&(!(fTriggerBits >> kSimpleOfflineBitNum))&1); }
+  Bool_t   IsJetHigh() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetJetHighBit()))&(!(fTriggerBits >> kSimpleOfflineBitNum))&1); }
+  Bool_t   IsGammaLow() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetGammaLowBit()))&(!(fTriggerBits >> kSimpleOfflineBitNum))&1); }
+  Bool_t   IsGammaHigh() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetGammaHighBit()))&(!(fTriggerBits >> kSimpleOfflineBitNum))&1); }
+  Bool_t   IsMainTrigger() const { return (Bool_t)((fTriggerBits >> kMainTriggerBitNum)&(!(fTriggerBits >> kSimpleOfflineBitNum))&1); }
+  Bool_t   IsJetLowSimple() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetJetLowBit()))&(fTriggerBits >> kSimpleOfflineBitNum)&1); }
+  Bool_t   IsJetHighSimple() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetJetHighBit()))&(fTriggerBits >> kSimpleOfflineBitNum)&1); }
+  Bool_t   IsGammaLowSimple() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetGammaLowBit()))&(fTriggerBits >> kSimpleOfflineBitNum)&1); }
+  Bool_t   IsGammaHighSimple() const { return (Bool_t)((fTriggerBits >> (fOffSet + fTriggerBitConfig.GetGammaHighBit()))&(fTriggerBits >> kSimpleOfflineBitNum)&1); }
+  Bool_t   IsMainTriggerSimple() const { return (Bool_t)((fTriggerBits >> kMainTriggerBitNum)&(fTriggerBits >> kSimpleOfflineBitNum)&1); }
+  Bool_t   IsOfflineSimple() const { return (Bool_t)((fTriggerBits >> kSimpleOfflineBitNum)&1); }
   
   void SetCenterGeo( TVector3 &v, Double_t e ) { SetLorentzVector( fCenterGeo, v, e ); }
   void SetCenterGeo( TLorentzVector &v ) { fCenterGeo = v; }
@@ -60,6 +68,7 @@ class AliEmcalTriggerPatchInfo: public TObject {
   void SetEdge2( TLorentzVector &v ) { fEdge2 = v; }
   void SetEdge2( TVector3 &v, Double_t e ) { SetLorentzVector( fEdge2, v, e ); }
   void SetADCAmp( Int_t a ) { fADCAmp = a; }
+  void SetADCOfflineAmp( Int_t a ) { fADCOfflineAmp = a; }
   void SetEdgeCell( Int_t x, Int_t y ) { fEdgeCell[0] = x; fEdgeCell[1] = y; }
 
   void SetLorentzVector( TLorentzVector &lv, TVector3 &v, Double_t e );
@@ -78,12 +87,13 @@ class AliEmcalTriggerPatchInfo: public TObject {
   TLorentzVector    fCenterMass;                    // CM
   TLorentzVector    fEdge1;                         // max eta/ min phi edge
   TLorentzVector    fEdge2;                         // min eta/ max phi edge
-  Int_t             fADCAmp;                        // online ADC amplitude
-  Int_t             fTriggerBits;                   //trigger bit mask
+  Int_t             fADCAmp;                        // online (trigger) ADC amplitude
+  Int_t             fADCOfflineAmp;                 // offline (FEE) ADC amplitude
+  Int_t             fTriggerBits;                   // trigger bit mask, see definitions in AliEmcalTriggerType and TriggerMakerBits_t (above)
   Int_t             fEdgeCell[2];                   // cell "bottom lower" edge (min phi, max eta)
   Int_t             fOffSet;                        // offset of bit (different in data and MC)
   AliEmcalTriggerBitConfig   fTriggerBitConfig;     // Trigger bit configuration
 
-  ClassDef(AliEmcalTriggerPatchInfo, 5) // Emcal particle class
+  ClassDef(AliEmcalTriggerPatchInfo, 6) // Emcal particle class
 };
 #endif