Files for PHOS trigger utils
authorprsnko <Dmitri.Peressounko@cern.ch>
Wed, 7 Jan 2015 11:25:39 +0000 (14:25 +0300)
committerprsnko <Dmitri.Peressounko@cern.ch>
Wed, 7 Jan 2015 11:25:39 +0000 (14:25 +0300)
OADB/PHOS/PHOSTrigBadMaps.root [new file with mode: 0644]
PWGGA/PHOSTasks/ClusterSelection/AliPHOSTriggerUtils.cxx [new file with mode: 0644]
PWGGA/PHOSTasks/ClusterSelection/AliPHOSTriggerUtils.h [new file with mode: 0644]

diff --git a/OADB/PHOS/PHOSTrigBadMaps.root b/OADB/PHOS/PHOSTrigBadMaps.root
new file mode 100644 (file)
index 0000000..196fa2d
Binary files /dev/null and b/OADB/PHOS/PHOSTrigBadMaps.root differ
diff --git a/PWGGA/PHOSTasks/ClusterSelection/AliPHOSTriggerUtils.cxx b/PWGGA/PHOSTasks/ClusterSelection/AliPHOSTriggerUtils.cxx
new file mode 100644 (file)
index 0000000..b785f42
--- /dev/null
@@ -0,0 +1,186 @@
+#include "TNamed.h"
+
+#include "AliPHOSTriggerUtils.h"
+#include "AliVEvent.h"
+#include "AliAODEvent.h"
+#include "AliESDEvent.h"
+#include "AliVCluster.h"
+#include "AliVCaloCells.h"
+#include "AliOADBContainer.h"
+#include "AliPHOSGeoUtils.h"
+#include "AliLog.h"
+
+ClassImp(AliPHOSTriggerUtils)
+//-----------------------------------------------------------------------    
+AliPHOSTriggerUtils::AliPHOSTriggerUtils():TNamed(),
+fbdrL(-1),
+fbdrR( 3),
+fRun(-1), 
+fEvent(0x0),
+fGeom(0x0),
+fNtrg4x4(0)
+{
+    
+   for(Int_t mod=0;mod<5;mod++)fPHOSBadMap[mod]=0x0 ;
+    
+}
+//-----------------------------------------------------------------------    
+AliPHOSTriggerUtils::AliPHOSTriggerUtils(const Text_t* name, const Text_t* title):
+TNamed(name, title),
+fbdrL(-1),
+fbdrR( 3),
+fRun(-1), 
+fEvent(0x0),
+fGeom(new AliPHOSGeoUtils("IHEP","")),
+fNtrg4x4(0)
+{
+
+  fGeom = new AliPHOSGeoUtils("IHEP","");
+
+  for(Int_t mod=0;mod<5;mod++)fPHOSBadMap[mod]=0x0 ;
+
+
+}
+//-----------------------------------------------------------------------    
+void AliPHOSTriggerUtils::SetEvent(AliVEvent * event){
+   //read bad map corresponding this run, 
+   //prepre list of fired PHOS triggers
+  
+  fEvent=event ;
+
+   Int_t runNumber=-999 ;
+   AliAODEvent *aod = dynamic_cast<AliAODEvent*>(event) ;
+   if(aod)
+      runNumber = aod->GetRunNumber() ;
+   else{
+      AliESDEvent *esd = dynamic_cast<AliESDEvent*>(event) ;
+      if(esd)
+         runNumber = esd->GetRunNumber() ;
+   }
+  //Check if run number changed and one should (re)read bad map
+  if(fRun!=runNumber){
+   fRun = runNumber ;
+     // 
+    AliOADBContainer badmapContainer(Form("phosTriggerBadMap"));
+    badmapContainer.InitFromFile("$ALICE_ROOT/OADB/PHOS/PHOSTrigBadMaps.root","phosTriggerBadMap");
+//    badmapContainer.InitFromFile("$PHOSTrigBadMaps.root","phosTrigBadMap");
+    TObjArray *maps = (TObjArray*)badmapContainer.GetObject(runNumber,"phosTriggerBadMap");
+    if(!maps){
+      AliError(Form("Can not read Trigger Bad map for run %d. \n",runNumber)) ;    
+    }
+    else{
+      AliInfo(Form("Setting PHOS Trigger bad map with name %s \n",maps->GetName())) ;
+      for(Int_t mod=0; mod<5;mod++){
+        if(fPHOSBadMap[mod]) 
+          delete fPHOSBadMap[mod] ;
+        TH2I * h = (TH2I*)maps->At(mod) ;      
+       if(h)
+          fPHOSBadMap[mod]=new TH2I(*h) ;
+      }
+    }    
+    
+  }
+  
+  
+ AliVCaloTrigger* trgESD = event->GetCaloTrigger("PHOS");
+ trgESD->Reset();
+
+ // *************************************************************************************************
+ // Trigger
+ // ************************************************************************
+  fNtrg4x4 = 0;
+  //Loop over 4x4 fired regions
+  while(trgESD->Next()) {
+    Int_t tmod,tabsId; // "Online" module number, bottom-left 4x4 edge cell absId
+    trgESD->GetPosition(tmod,tabsId);
+    Int_t trelid[4] ;
+    fGeom->AbsToRelNumbering(tabsId,trelid);     
+     
+    fTrMod4x4[fNtrg4x4] = trelid[0];
+    fTrX4x4[fNtrg4x4]  = trelid[2];
+    fTrZ4x4[fNtrg4x4]  = trelid[3];
+    if ( fNtrg4x4<999 ) fNtrg4x4++;
+    else AliFatal("PHOS trigger capacity exceeded, increase size of fTrMod4x4[],fTrX4x4[],fTrZ4x4[] arrays") ;
+  }  
+}
+
+//-----------------------------------------------------------------------    
+Bool_t AliPHOSTriggerUtils::IsFiredTrigger(AliVCluster * clu){  
+  
+   if(!fEvent)
+     return kFALSE ;
+  
+   //Maximum energy tower
+   Int_t maxId, relid[4];
+   Double_t eMax = -111;
+     
+   AliVCaloCells * phsCells=fEvent->GetPHOSCells() ;
+   
+   for (Int_t iDig=0; iDig< clu->GetNCells(); iDig++){
+      Int_t cellAbsId1 = clu->GetCellAbsId(iDig);
+      Double_t eCell = phsCells->GetCellAmplitude(cellAbsId1)*clu->GetCellAmplitudeFraction(iDig);
+      if(eCell>eMax) 
+        {
+          eMax = eCell;
+          maxId = cellAbsId1;
+        }
+    }
+    
+    fGeom->AbsToRelNumbering(maxId, relid);
+    Int_t mod= relid[0] ;
+    Int_t ix = relid[2];
+    Int_t iz = relid[3];
+        
+    if(!TestBadMap(mod,ix,iz))
+      return kFALSE ;
+        
+    for (Int_t itr=0; itr < fNtrg4x4; itr++ ){
+      if(fTrMod4x4[itr] != mod ) continue; //trigger fired in other module
+      if( (ix - fTrX4x4[itr] ) > fbdrL && (ix - fTrX4x4[itr] ) < fbdrR &&
+          (iz - fTrZ4x4[itr] ) > fbdrL && (iz - fTrZ4x4[itr] ) < fbdrR  ){ //this is trigger
+       return kTRUE ; 
+//         Int_t branch = FindBranch(tnX4x4[n4x4], tnZ4x4[n4x4]); //tru, gde srabotal trigger
+      }
+    }//tr44
+    
+    return kFALSE ;
+}
+//-----------------------------------------------------------------------  
+Int_t AliPHOSTriggerUtils::FindBranch(Int_t nX, Int_t nZ) {
+  //Calculate branch number from column and raw of a cell 
+  
+  Int_t sm=-1;
+
+  if ( nX>=0  && nX <=15 && nZ <= 27 ) sm = 0;
+  if ( nX>=16 && nX <=31 && nZ <= 27 ) sm = 1;        
+  if ( nX>=32 && nX <=47 && nZ <= 27 ) sm = 2;
+  if ( nX>=48 && nX <=64 && nZ <= 27 ) sm = 3;             
+
+  if ( nX>=0  && nX <=15 && nZ >= 28 && nZ <= 56 ) sm = 4;
+  if ( nX>=16 && nX <=31 && nZ >= 28 && nZ <= 56 ) sm = 5;
+  if ( nX>=32 && nX <=47 && nZ >= 28 && nZ <= 56 ) sm = 6;
+  if ( nX>=48 && nX <=64 && nZ >= 28 && nZ <= 56 ) sm = 7;
+
+  return sm;
+}
+//-----------------------------------------------------------------------  
+Bool_t AliPHOSTriggerUtils::TestBadMap(Int_t mod, Int_t ix,Int_t iz){
+  //Test if this is good cell
+  
+  if(!fPHOSBadMap[mod])
+    return kTRUE ;
+  if( fPHOSBadMap[mod]->GetBinContent(ix,iz)>0)
+    return kFALSE ;
+  else 
+    return kTRUE ;
+  
+  
+}
+    
+    
+    
+    
+    
+    
+  
+  
\ No newline at end of file
diff --git a/PWGGA/PHOSTasks/ClusterSelection/AliPHOSTriggerUtils.h b/PWGGA/PHOSTasks/ClusterSelection/AliPHOSTriggerUtils.h
new file mode 100644 (file)
index 0000000..af59947
--- /dev/null
@@ -0,0 +1,77 @@
+#ifndef ALIPHOSTRIGGERUTILS_H
+#define ALIPHOSTRIGGERUTILS_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+//_________________________________________________________________________
+// class to test trigger information of PHOS trigger
+// and to model it in MC simulations
+// 
+//*-- Author: Dmitri Peressounko (RRC "KI")
+
+// --- ROOT system ---
+#include "TNamed.h"
+class TF1 ;
+class TH2I;
+
+// --- AliRoot header files ---
+class AliVCluster ;
+class AliVEvent ;
+class AliPHOSGeoUtils;
+
+class AliPHOSTriggerUtils : public TNamed {
+
+public: 
+
+  AliPHOSTriggerUtils() ;
+  AliPHOSTriggerUtils(const Text_t* name, const Text_t* title="") ;
+  AliPHOSTriggerUtils(const AliPHOSTriggerUtils & utils) ;
+  
+  virtual ~AliPHOSTriggerUtils(void){} ; 
+  AliPHOSTriggerUtils & operator = (const AliPHOSTriggerUtils  & rvalue) ;
+
+  void SetEvent(AliVEvent * event); //sets ref. to current event; inits class for new run if necessary
+  
+  Bool_t IsFiredTrigger(AliVCluster * clu) ; //Returns true if this cluster fired PHOS trigger in event
+  
+  Bool_t IsFiredTriggerMC(AliVCluster * clu) ;  //For MC simulations without detailed PHOS trigger
+                                                    //Returns true if this cluster should fire PHOS trigger
+                                                    //according to parameterization of turn-on curve and trigger bad map
+                                                    
+  void ReadTriggerParams(const char * filename); //Read trigger info (bad map, parameterizations) from specific file, ignore OADB        
+  
+  void SetTileOffset(Int_t left=-1, Int_t right=3){fbdrL=left;fbdrR=right ;}
+  
+protected:
+  
+  void InitForRun(Int_t run) ; //read trigger bad map for this run from OADB. Should be called once per run
+  Bool_t TestBadMap(Int_t mod, Int_t ix,Int_t iz) ; //Check if trigger is in good/active region
+  Int_t FindBranch(Int_t nX, Int_t nZ) ; //Calculate number of PHOS branch
+  
+  
+private:
+  Int_t fbdrL ;  //Offset between cell and trigger 4x4 tile
+  Int_t fbdrR ;  //in left/right (top/bottom) directions              
+  
+  Int_t fRun ;         //current run number (-1 not set yet, -2 use input file set with ReadTriggerParams)  
+  AliVEvent * fEvent ; //! Ref to current ESD/AOD event
+  
+  //Trigger bad map for 5 modules
+  TH2I * fPHOSBadMap[5] ;
+  AliPHOSGeoUtils* fGeom ;  //! PHOS geometry
+  
+  //Parameterization of turn-on curves
+  TF1 * fTOC[5][8];     //parameterization of turn-on curves for 5 modules and 8 branches/module
+  
+  Int_t fNtrg4x4 ;       //! Number of triggers in current event
+  Int_t fTrMod4x4[1000]; //! trigger modules
+  Int_t fTrX4x4[1000] ;  //! trigger X coordinates
+  Int_t fTrZ4x4[1000] ;  //! trigger Z coordinates
+  
+  
+  ClassDef(AliPHOSTriggerUtils,1)       // PHOS trigger analysis class 
+
+} ;
+
+#endif // AliPHOSTRIGERUTILS_H
+