AliPhysics  b555aef (b555aef)
AliEmcalCorrectionCellTimeCalib.cxx
Go to the documentation of this file.
1 // AliEmcalCorrectionCellTimeCalib
2 //
3 
4 #include <TObjArray.h>
5 #include <TFile.h>
6 #include "AliEMCALGeometry.h"
7 #include "AliOADBContainer.h"
8 #include "AliEMCALRecoUtils.h"
9 #include "AliAODEvent.h"
10 
12 
16 
17 // Actually registers the class with the base class
19 
24  AliEmcalCorrectionComponent("AliEmcalCorrectionCellTimeCalib")
25  ,fCellTimeDistBefore(0)
26  ,fCellTimeDistAfter(0)
27  ,fCalibrateTime(kFALSE)
28  ,fCalibrateTimeL1Phase(kFALSE)
29  ,fUseAutomaticTimeCalib(1)
30 {
31 }
32 
37 {
38 }
39 
44 {
45  // Initialization
47 
48  AliWarning("Init EMCAL time calibration");
49 
50  GetProperty("createHistos", fCreateHisto);
51 
52  fCalibrateTime = kTRUE;
53 
54  // init reco utils
55  if (!fRecoUtils)
56  fRecoUtils = new AliEMCALRecoUtils;
57 
58  fRecoUtils->SetPositionAlgorithm(AliEMCALRecoUtils::kPosTowerGlobal);
59 
60  return kTRUE;
61 }
62 
67 {
69 
70  if (fCreateHisto){
71  fCellTimeDistBefore = new TH1F("hCellTimeDistBefore","hCellTimeDistBefore;t_cell",1000,-10e-6,10e-6);
73  fCellTimeDistAfter = new TH1F("hCellTimeDistAfter","hCellTimeDistAfter;t_cell",1000,-10e-6,10e-6);
75  }
76 }
77 
82 {
84 
85  if (!fEventManager.InputEvent()) {
86  AliError("Event ptr = 0, returning");
87  return kFALSE;
88  }
89 
91 
92  // CONFIGURE THE RECO UTILS -------------------------------------------------
93 
94  // allows time calibration
95  if (fCalibrateTime)
96  fRecoUtils->SwitchOnTimeRecalibration();
97  else
98  fRecoUtils->SwitchOffTimeRecalibration();
99 
100  // allows time calibration with L1 phase
102  fRecoUtils->SwitchOnL1PhaseInTimeRecalibration();
103  else
104  fRecoUtils->SwitchOffL1PhaseInTimeRecalibration();
105 
106  // START PROCESSING ---------------------------------------------------------
107  // Test if cells present
108  if (fCaloCells->GetNumberOfCells()<=0)
109  {
110  AliWarning(Form("Number of EMCAL cells = %d, returning", fCaloCells->GetNumberOfCells()));
111  return kFALSE;
112  }
113 
114  // mark the cells not recalibrated
115  fRecoUtils->ResetCellsCalibrated();
116 
117  if(fCreateHisto)
118  FillCellQA(fCellTimeDistBefore); // "before" QA
119 
120  // CELL RECALIBRATION -------------------------------------------------------
121  // cell objects will be updated
122  UpdateCells();
123 
124  if(fCreateHisto)
125  FillCellQA(fCellTimeDistAfter); // "after" QA
126 
127  return kTRUE;
128 }
129 
134 {
135  // Initialising bad channel maps
136 
137  if (!fEventManager.InputEvent())
138  return 0;
139 
140  AliInfo("Initialising time calibration map");
141 
142  // init default maps first
143  if (!fRecoUtils->GetEMCALTimeRecalibrationFactorsArray())
144  fRecoUtils->InitEMCALTimeRecalibrationFactors() ;
145 
146  Int_t runBC = fEventManager.InputEvent()->GetRunNumber();
147 
148  AliOADBContainer *contBC = new AliOADBContainer("");
149  if (fBasePath!="")
150  { //if fBasePath specified in the ->SetBasePath()
151  AliInfo(Form("Loading time calibration OADB from given path %s",fBasePath.Data()));
152 
153  TFile *fbad=new TFile(Form("%s/EMCALTimeCalib.root",fBasePath.Data()),"read");
154  if (!fbad || fbad->IsZombie())
155  {
156  AliFatal(Form("EMCALTimeCalib.root was not found in the path provided: %s",fBasePath.Data()));
157  return 0;
158  }
159 
160  if (fbad) delete fbad;
161 
162  contBC->InitFromFile(Form("%s/EMCALTimeCalib.root",fBasePath.Data()),"AliEMCALTimeCalib");
163  }
164  else
165  { // Else choose the one in the $ALICE_PHYSICS directory
166  AliInfo("Loading time calibration OADB from $ALICE_PHYSICS/OADB/EMCAL");
167 
168  TFile *fbad=new TFile("$ALICE_PHYSICS/OADB/EMCAL/EMCALTimeCalib.root","read");
169  if (!fbad || fbad->IsZombie())
170  {
171  AliFatal("$ALICE_PHYSICS/OADB/EMCAL/EMCALTimeCalib.root was not found");
172  return 0;
173  }
174 
175  if (fbad) delete fbad;
176 
177  contBC->InitFromFile("$ALICE_PHYSICS/OADB/EMCAL/EMCALTimeCalib.root","AliEMCALTimeCalib");
178  }
179 
180  TObjArray *arrayBC=(TObjArray*)contBC->GetObject(runBC);
181  if (!arrayBC)
182  {
183  AliError(Form("No external time calibration set for run number: %d", runBC));
184  delete contBC;
185  return 2;
186  }
187 
188  // The calibration object is accessed by specifying a pass
189  // For run 1, the actual pass is used (fFilepass, as determined in AliEmcalCorrectionComponent::GetPass())
190  // For run 2, the pass is always set to pass1 (as a convention)
191  // Other exceptions are hard-coded below
192 
193  TString pass = fFilepass;
194  if (fFilepass=="spc_calo") pass = "pass3";
195  if (fRun > 209121) pass = "pass1";
196 
197  TObjArray *arrayBCpass=(TObjArray*)arrayBC->FindObject(pass);
198  if (!arrayBCpass)
199  {
200  AliError(Form("No external time calibration set for: %d -%s", runBC,pass.Data()));
201  delete contBC;
202  return 2;
203  }
204 
205  arrayBCpass->Print();
206 
207  for(Int_t i = 0; i < 4; i++)
208  {
209  TH1F *h = fRecoUtils->GetEMCALChannelTimeRecalibrationFactors(i);
210  if (h)
211  delete h;
212 
213  h = (TH1F*)arrayBCpass->FindObject(Form("hAllTimeAvBC%d",i));
214 
215  if (!h)
216  {
217  AliError(Form("Can not get hAllTimeAvBC%d",i));
218  continue;
219  }
220  h->SetDirectory(0);
221  fRecoUtils->SetEMCALChannelTimeRecalibrationFactors(i,h);
222  }
223 
224  delete contBC;
225 
226  return 1;
227 }
228 
233 {
234  // Initialising run-by-run L1 phase in time calibration maps
235 
236  if (!fEventManager.InputEvent())
237  return 0;
238 
239  AliInfo("Initialising run-by-run L1 phase in time calibration map");
240 
241  // init default maps first
242  if (!fRecoUtils->GetEMCALL1PhaseInTimeRecalibrationArray())
243  fRecoUtils->InitEMCALL1PhaseInTimeRecalibration() ;
244 
245  Int_t runBC = fEventManager.InputEvent()->GetRunNumber();
246 
247  AliOADBContainer *contBC = new AliOADBContainer("");
248  if (fBasePath!="")
249  { //if fBasePath specified in the ->SetBasePath()
250  AliInfo(Form("Loading time calibration OADB from given path %s",fBasePath.Data()));
251 
252  TFile *timeFile=new TFile(Form("%s/EMCALTimeL1PhaseCalib.root",fBasePath.Data()),"read");
253  if (!timeFile || timeFile->IsZombie())
254  {
255  AliFatal(Form("EMCALTimeL1PhaseCalib.root was not found in the path provided: %s",fBasePath.Data()));
256  return 0;
257  }
258 
259  if (timeFile) delete timeFile;
260 
261  contBC->InitFromFile(Form("%s/EMCALTimeL1PhaseCalib.root",fBasePath.Data()),"AliEMCALTimeL1PhaseCalib");
262  }
263  else
264  { // Else choose the one in the $ALICE_PHYSICS directory
265  AliInfo("Loading L1 phase in time calibration OADB from $ALICE_PHYSICS/OADB/EMCAL");
266 
267  TFile *timeFile=new TFile("$ALICE_PHYSICS/OADB/EMCAL/EMCALTimeL1PhaseCalib.root","read");
268  if (!timeFile || timeFile->IsZombie())
269  {
270  AliFatal("$ALICE_PHYSICS/OADB/EMCAL/EMCALTimeL1PhaseCalib.root was not found");
271  return 0;
272  }
273 
274  if (timeFile) delete timeFile;
275 
276  contBC->InitFromFile("$ALICE_PHYSICS/OADB/EMCAL/EMCALTimeL1PhaseCalib.root","AliEMCALTimeL1PhaseCalib");
277  }
278 
279  TObjArray *arrayBC=(TObjArray*)contBC->GetObject(runBC);
280  if (!arrayBC)
281  {
282  AliError(Form("No external L1 phase in time calibration set for run number: %d", runBC));
283  delete contBC;
284  return 2;
285  }
286 
287  // The calibration object is accessed by specifying a pass
288  // For run 2 (which is the only time L1-phase is implemented), the pass is always set to pass1 (as a convention)
289  // Other exceptions are hard-coded below
290 
291  TString pass = "pass1";
292 
293  if ( fFilepass=="muon_calo_pass1" && fRun > 209121 && fRun < 244284 )
294  pass = "pass0";//period LHC15a-m
295 
296  TObjArray *arrayBCpass=(TObjArray*)arrayBC->FindObject(pass);
297  if (!arrayBCpass)
298  {
299  AliError(Form("No external L1 phase in time calibration set for: %d -%s", runBC,pass.Data()));
300  delete contBC;
301  return 2;
302  }
303 
304  arrayBCpass->Print();
305 
306 
307  TH1C *h = fRecoUtils->GetEMCALL1PhaseInTimeRecalibrationForAllSM();
308  if (h) delete h;
309 
310  h = (TH1C*)arrayBCpass->FindObject(Form("h%d",runBC));
311 
312  if (!h) {
313  AliFatal(Form("There is no calibration histogram h%d for this run",runBC));
314  }
315  h->SetDirectory(0);
316  fRecoUtils->SetEMCALL1PhaseInTimeRecalibrationForAllSM(h);
317 
318  delete contBC;
319 
320  return 1;
321 }
322 
328 {
330 
331  if (runChanged) {
332 
333  // define what recalib parameters are needed for various switches
334  // this is based on implementation in AliEMCALRecoUtils
335  Bool_t needTimecalib = fCalibrateTime;
336  if(fRun>209121) fCalibrateTimeL1Phase = kTRUE;
337  Bool_t needTimecalibL1Phase = fCalibrateTime & fCalibrateTimeL1Phase;
338 
339  // init time calibration
340  if (needTimecalib && fUseAutomaticTimeCalib) {
341  Int_t initTC = InitTimeCalibration();
342  if (!initTC) {
343  AliError("InitTimeCalibration returned false, returning");
344  }
345  if (initTC==1) {
346  AliWarning("InitTimeCalib OK");
347  }
348  if (initTC > 1) {
349  AliWarning(Form("No external time calibration available: %d - %s", fEventManager.InputEvent()->GetRunNumber(), fFilepass.Data()));
350  }
351  }
352 
353  // init time calibration with L1 phase
354  if (needTimecalibL1Phase && fUseAutomaticTimeCalib) {
355  Int_t initTCL1Phase = InitTimeCalibrationL1Phase();
356  if (!initTCL1Phase) {
357  AliError("InitTimeCalibrationL1Phase returned false, returning");
358  }
359  if (initTCL1Phase==1) {
360  AliWarning("InitTimeCalibL1Phase OK");
361  }
362  if (initTCL1Phase > 1) {
363  AliWarning(Form("No external time calibration L1 phase available: %d - %s", fEventManager.InputEvent()->GetRunNumber(), fFilepass.Data()));
364  }
365  }
366  }
367  return runChanged;
368 }
TH1F * fCellTimeDistAfter
! cell energy distribution, after time calibration
TH1F * fCellTimeDistBefore
! cell energy distribution, before time calibration
Bool_t fUseAutomaticTimeCalib
On by default the check in the OADB of the time recalibration.
AliVCaloCells * fCaloCells
! Pointer to CaloCells
AliEMCALRecoUtils * fRecoUtils
Pointer to RecoUtils.
int Int_t
Definition: External.C:63
Bool_t fCalibrateTimeL1Phase
flag cell time calibration with L1phase shift
Base class for correction components in the EMCal correction framework.
TString fBasePath
Base folder path to get root files.
TList * fOutput
! List of output histograms
Bool_t fCreateHisto
Flag to make some basic histograms.
Time calibration correction component in the EMCal correction framework.
AliEmcalCorrectionEventManager fEventManager
Minimal task which inherits from AliAnalysisTaskSE and manages access to the event.
Bool_t fCalibrateTime
flag cell time calibration
static RegisterCorrectionComponent< AliEmcalCorrectionCellTimeCalib > reg
bool Bool_t
Definition: External.C:53
TString fFilepass
Input data pass number.
bool GetProperty(std::string propertyName, T &property, bool requiredProperty=true, std::string correctionName="")
Retrieve property.