AliPhysics  58f3d52 (58f3d52)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliEmcalFastOrMonitorTask.cxx
Go to the documentation of this file.
1 /**************************************************************************************
2  * Copyright (C) 2017, Copyright Holders of the ALICE Collaboration *
3  * All rights reserved. *
4  * *
5  * Redistribution and use in source and binary forms, with or without *
6  * modification, are permitted provided that the following conditions are met: *
7  * * Redistributions of source code must retain the above copyright *
8  * notice, this list of conditions and the following disclaimer. *
9  * * Redistributions in binary form must reproduce the above copyright *
10  * notice, this list of conditions and the following disclaimer in the *
11  * documentation and/or other materials provided with the distribution. *
12  * * Neither the name of the <organization> nor the *
13  * names of its contributors may be used to endorse or promote products *
14  * derived from this software without specific prior written permission. *
15  * *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
19  * DISCLAIMED. IN NO EVENT SHALL ALICE COLLABORATION BE LIABLE FOR ANY *
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES *
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND *
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
26  **************************************************************************************/
27 #include <algorithm>
28 #include <iostream>
29 #include <vector>
30 #include <THashList.h>
31 #include <TH2.h>
32 #include <THistManager.h>
33 #include <TLorentzVector.h>
34 #include <TMath.h>
35 #include <TObjArray.h>
36 #include <TParameter.h>
37 #include <TVector3.h>
38 
40 #include "AliEMCALGeometry.h"
41 #include "AliEMCALTriggerConstants.h"
42 #include "AliInputEventHandler.h"
43 #include "AliLog.h"
44 #include "AliOADBContainer.h"
45 #include "AliVCaloCells.h"
46 #include "AliVCaloTrigger.h"
47 #include "AliVEvent.h"
48 #include "AliVVertex.h"
49 
53 
54 using namespace PWG::EMCAL;
55 
58  fHistos(nullptr),
59  fGeom(nullptr),
60  fLocalInitialized(false),
61  fOldRun(-1),
62  fRequestTrigger(AliVEvent::kAny),
63  fTriggerPattern(""),
64  fCellData(),
65  fMaskedFastors(),
66  fMaskedCells(),
67  fNameMaskedFastorOADB(),
68  fNameMaskedCellOADB("$ALICE_PHYSICS/OADB/EMCAL/EMCALBadChannels.root"),
69  fMaskedFastorOADB(nullptr),
70  fMaskedCellOADB(nullptr)
71 {
72 
73 }
74 
75 AliEmcalFastOrMonitorTask::AliEmcalFastOrMonitorTask(const char *name) :
76  AliAnalysisTaskSE(name),
77  fHistos(nullptr),
78  fGeom(nullptr),
79  fLocalInitialized(false),
80  fOldRun(-1),
81  fRequestTrigger(AliVEvent::kAny),
82  fTriggerPattern(""),
83  fMaskedFastors(),
84  fMaskedCells(),
85  fNameMaskedFastorOADB(),
86  fNameMaskedCellOADB("$ALICE_PHYSICS/OADB/EMCAL/EMCALBadChannels.root"),
87  fMaskedFastorOADB(nullptr),
88  fMaskedCellOADB(nullptr)
89 {
90  DefineOutput(1, TList::Class());
91 }
92 
96 }
97 
99  fHistos = new THistManager("fastOrHistos");
100 
101  const int kMaxCol = 48, kMaxRow = 104, kMaxFastOr = kMaxRow * kMaxCol;
102 
103  fHistos->CreateTH1("hEvents", "Number of events", 1, 0.5, 1.5);
104  fHistos->CreateTH1("hFastOrFrequencyL0", "FastOr frequency at Level0", kMaxFastOr, -0.5, kMaxFastOr - 0.5);
105  fHistos->CreateTH1("hFastOrFrequencyL1", "FastOr frequency at Level1", kMaxFastOr, -0.5, kMaxFastOr - 0.5);
106  fHistos->CreateTH2("hFastOrAmplitude", "FastOr amplitudes", kMaxFastOr, -0.5, kMaxFastOr - 0.5, 513, -0.5, 512.5);
107  fHistos->CreateTH2("hFastOrTimeSum", "FastOr time sum", kMaxFastOr, -0.5, kMaxFastOr - 0.5, 2049, -0.5, 2048.5);
108  fHistos->CreateTH2("hFastOrTransverseTimeSum", "FastOr transverse time sum", kMaxFastOr, -0.5, kMaxFastOr - 0.5, 2049, -0.5, 2048.5);
109  fHistos->CreateTH2("hFastOrNL0Times", "FastOr Number of L0 times", kMaxFastOr, -0.5, kMaxFastOr - 0.5, 16, -0.5, 15.5);
110  fHistos->CreateTH2("hFastOrColRowFrequencyL0", "FastOr Frequency (col-row) at Level1", kMaxCol, -0.5, kMaxCol - 0.5, kMaxRow, -0.5, kMaxRow - 0.5);
111  fHistos->CreateTH2("hFastOrColRowFrequencyL1", "FastOr Frequency (col-row) at Level0", kMaxCol, -0.5, kMaxCol - 0.5, kMaxRow, -0.5, kMaxRow - 0.5);
112  fHistos->CreateTH2("hEnergyFastorCell", "Sum of cell energy vs. fastor Energy", 1000, 0., 20., 1000 , 0., 20.);
113 
114  // Helper histograms checking the mask status of cells and FastORs
115  fHistos->CreateTH1("hMaskedFastors", "Index of masked FastOR; FastOR index; Counts", 3001, -0.5, 3000.5);
116  fHistos->CreateTH1("hMaskedCells", "Index of masked cell; Cell index; Counts", 20001, -0.5, 20000.5);
117  fHistos->CreateTH1("hCellEnergyCount", "Counts of non-0 cell entries; Cell index; Counts", 20001, -0.5, 20000.5);
118 
119  // THnSparse for fastor-by-fastor energy decalibration
120  TAxis fastorIDAxis(4992, -0.5, 4991.5), offlineaxis(200, 0., 20.), onlineaxis(200, 0., 20.), cellmaskaxis(5, -0.5, 4.5);
121  const TAxis *sparseaxis[4] = {&fastorIDAxis, &offlineaxis, &onlineaxis, &cellmaskaxis};
122  fastorIDAxis.SetNameTitle("fastorAbsID", "FastOR abs. ID");
123  offlineaxis.SetNameTitle("offlinenergy", "E_{2x2 cells} (GeV)");
124  onlineaxis.SetNameTitle("onlineenergy", "E_{FastOR} (GeV)");
125  cellmaskaxis.SetNameTitle("maskedcells", "Number of masked cells");
126  fHistos->CreateTHnSparse("hFastOrEnergyOfflineOnline", "FastOr Offline vs Online energy", 4, sparseaxis);
127 
128  PostData(1, fHistos->GetListOfHistograms());
129 }
130 
132  fGeom = AliEMCALGeometry::GetInstanceFromRunNumber(InputEvent()->GetRunNumber());
133 
134  int nrow = fGeom->GetTriggerMappingVersion() == 2 ? 104 : 64;
135  fCellData.Allocate(48, nrow);
136 
137  if(fNameMaskedCellOADB.Length()){
138  fMaskedCellOADB = new AliOADBContainer("AliEMCALBadChannels");
139  fMaskedCellOADB->InitFromFile(fNameMaskedCellOADB, "AliEMCALBadChannels");
140  }
141 
142  if(fNameMaskedFastorOADB.Length()){
143  fMaskedFastorOADB = new AliOADBContainer("AliEmcalMaskedFastors");
144  fMaskedFastorOADB->InitFromFile(fNameMaskedFastorOADB, "AliEmcalMaskedFastors");
145  }
146 }
147 
149  // Load masked FastOR data
150  if(fMaskedFastorOADB){
151  AliInfoStream() << "Loading masked cells for run " << newrun << std::endl;
152  fMaskedFastors.clear();
153  TObjArray *maskedfastors = static_cast<TObjArray *>(fMaskedFastorOADB->GetObject(newrun));
154  if(maskedfastors && maskedfastors->GetEntries()){
155  for(auto masked : *maskedfastors){
156  TParameter<int> *fastOrAbsID = static_cast<TParameter<int> *>(masked);
157  fMaskedFastors.push_back(fastOrAbsID->GetVal());
158  fHistos->FillTH1("hMaskedFastors", fastOrAbsID->GetVal());
159  }
160  std::sort(fMaskedFastors.begin(), fMaskedFastors.end(), std::less<int>());
161  }
162  }
163 
164  // Load masked cell data
165  if(fMaskedCellOADB){
166  AliInfoStream() << "Loading masked cells for run " << newrun << std::endl;
167  fMaskedCells.clear();
168  TObjArray *maskhistos = static_cast<TObjArray *>(fMaskedCellOADB->GetObject(newrun));
169  if(maskhistos && maskhistos->GetEntries()){
170  for(auto mod : *maskhistos){
171  TH2 *modhist = static_cast<TH2 *>(mod);
172  TString modname = modhist->GetName();
173  AliDebugStream(1) << "Reading bad channels from histogram " << modname << std::endl;
174  modname.ReplaceAll("EMCALBadChannelMap_Mod", "");
175  Int_t modid = modname.Atoi();
176  for(int icol = 0; icol < 48; icol++){
177  for(int irow = 0; irow < 24; irow++){
178  if(modhist->GetBinContent(icol, irow) > 0.){
179  int cellindex = fGeom->GetAbsCellIdFromCellIndexes(modid, irow, icol);
180  fMaskedCells.push_back(cellindex);
181  fHistos->FillTH1("hMaskedCells", cellindex);
182  }
183  }
184  }
185  }
186  std::sort(fMaskedCells.begin(), fMaskedCells.end(), std::less<int>());
187  }
188  }
189 }
190 
192  if(!fLocalInitialized){
193  ExecOnce();
194  fLocalInitialized = true;
195  }
196 
197  // Run change
198  if(InputEvent()->GetRunNumber() != fOldRun){
199  RunChanged(InputEvent()->GetRunNumber());
200  fOldRun = InputEvent()->GetRunNumber();
201  }
202 
203  // Check trigger
204  if(!(fInputHandler->IsEventSelected() & fRequestTrigger)) return;
205  if(fTriggerPattern.Length()){
206  if(!TString(InputEvent()->GetFiredTriggerClasses()).Contains(fTriggerPattern)) return;
207  }
208 
209  const AliVVertex *vtx = fInputEvent->GetPrimaryVertex();
210  Double_t vtxpos[3];
211  vtx->GetXYZ(vtxpos);
212 
214 
215  fHistos->FillTH1("hEvents", 1);
216 
217  AliVCaloTrigger *triggerdata = InputEvent()->GetCaloTrigger("EMCAL");
218  triggerdata->Reset();
219  Int_t nl0times, l1timesum, fastOrID, globCol, globRow;
220  Float_t amp;
221  while(triggerdata->Next()){
222  triggerdata->GetAmplitude(amp);
223  triggerdata->GetNL0Times(nl0times);
224  triggerdata->GetL1TimeSum(l1timesum);
225  triggerdata->GetPosition(globCol, globRow);
226  fGeom->GetTriggerMapping()->GetAbsFastORIndexFromPositionInEMCAL(globCol, globRow, fastOrID);
227  if(amp > 1e-5){
228  fHistos->FillTH2("hFastOrColRowFrequencyL0", globCol, globRow);
229  fHistos->FillTH1("hFastOrFrequencyL0", fastOrID);
230  }
231  if(l1timesum){
232  fHistos->FillTH2("hFastOrColRowFrequencyL1", globCol, globRow);
233  fHistos->FillTH1("hFastOrFrequencyL1", fastOrID);
234  }
235  if(std::find(fMaskedFastors.begin(), fMaskedFastors.end(), fastOrID) == fMaskedFastors.end()){
236  fHistos->FillTH2("hFastOrAmplitude", fastOrID, amp);
237  fHistos->FillTH2("hFastOrTimeSum", fastOrID, l1timesum);
238  fHistos->FillTH2("hFastOrNL0Times", fastOrID, nl0times);
239  fHistos->FillTH2("hFastOrTransverseTimeSum", fastOrID, GetTransverseTimeSum(fastOrID, l1timesum, vtxpos));
240  fHistos->FillTH2("hEnergyFastorCell", fCellData(globCol, globRow), l1timesum * EMCALTrigger::kEMCL1ADCtoGeV);
241  int ncellmasked = 0;
242  int fastorCells[4];
243  fGeom->GetTriggerMapping()->GetCellIndexFromFastORIndex(fastOrID, fastorCells);
244  for(int icell = 0; icell < 4; icell++){
245  if(std::find(fMaskedCells.begin(), fMaskedCells.end(), fastorCells[icell]) != fMaskedCells.end()) ncellmasked++;
246  }
247  double energydata[4] = {
248  static_cast<double>(fastOrID),
249  fCellData(globCol, globRow),
250  l1timesum * EMCALTrigger::kEMCL1ADCtoGeV,
251  static_cast<double>(ncellmasked)
252  };
253  fHistos->FillTHnSparse("hFastOrEnergyOfflineOnline", energydata);
254  }
255  }
256 
257  PostData(1, fHistos->GetListOfHistograms());
258 }
259 
261  fCellData.Reset();
262  AliVCaloCells *emccells = InputEvent()->GetEMCALCells();
263  for(int icell = 0; icell < emccells->GetNumberOfCells(); icell++){
264  int position = emccells->GetCellNumber(icell);
265  double amplitude = emccells->GetAmplitude(icell);
266  if(amplitude > 0){
267  fHistos->FillTH1("hCellEnergyCount", position);
268  if(std::find(fMaskedCells.begin(), fMaskedCells.end(), position) != fMaskedCells.end()){
269  AliErrorStream() << "Non-0 cell energy " << amplitude << " found for masked cell " << position << std::endl;
270  }
271  int absFastor, col, row;
272  fGeom->GetTriggerMapping()->GetFastORIndexFromCellIndex(position, absFastor);
273  fGeom->GetPositionInEMCALFromAbsFastORIndex(absFastor, col, row);
274  fCellData(col, row) += amplitude;
275  }
276  }
277 }
278 
280  Int_t cellIDs[4];
281  fGeom->GetTriggerMapping()->GetCellIndexFromFastORIndex(fastorAbsID, cellIDs);
282  std::vector<double> eta, phi;
283  for(int i = 0l; i < 4; i++){
284  double etatmp, phitmp;
285  fGeom->EtaPhiFromIndex(cellIDs[i], etatmp, phitmp);
286  eta.push_back(etatmp);
287  phi.push_back(phitmp);
288  }
289 
290  // Calculate FastOR position: for the approximation take mean eta and phi
291  // Radius is taken from the geometry
292  TVector3 fastorPos, vertexPos(vertex[0], vertex[1], vertex[2]);
293  fastorPos.SetPtEtaPhi(fGeom->GetIPDistance(), TMath::Mean(eta.begin(), eta.end()), TMath::Mean(phi.begin(), phi.end()));
294  fastorPos -= vertexPos;
295 
296  TLorentzVector evec(fastorPos, adc);
297  return evec.Et();
298 }
Bool_t fLocalInitialized
Switch whether task is initialized (for ExecOnce)
virtual void UserExec(Option_t *)
Event loop.
Double_t GetTransverseTimeSum(Int_t fastorAbsID, Double_t adc, const Double_t *vtx) const
Calculate transverse L1 time sum of a FastOR.
double Double_t
Definition: External.C:58
std::vector< int > fMaskedCells
List of masked cells.
Int_t fOldRun
Old Run (for RunChanged())
TString fNameMaskedFastorOADB
Name of the OADB container with masked fastors.
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
Fill a 2D histogram within the container.
ULong_t fRequestTrigger
Trigger selection bits.
THistManager * fHistos
! Histogram handler
std::vector< int > fMaskedFastors
List of masked fastors.
void FillTHnSparse(const char *name, const double *x, double weight=1., Option_t *opt="")
TH2 * CreateTH2(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt="")
Create a new TH2 within the container.
int Int_t
Definition: External.C:63
THashList * GetListOfHistograms() const
Get the list of histograms.
Definition: THistManager.h:671
float Float_t
Definition: External.C:68
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Create a new TH1 within the container.
AliOADBContainer * fMaskedFastorOADB
! OADB container with masked fastors
AliEMCALTriggerDataGrid< double > fCellData
Grid with summed cell data.
AliEMCALGeometry * fGeom
! EMCAL Geometry object
TString fNameMaskedCellOADB
Name of the OADB container with masked cells.
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
Fill a 1D histogram within the container.
virtual void UserCreateOutputObjects()
Creating output objects.
Definition: External.C:220
virtual void ExecOnce()
Initialization of the task.
Container class for histograms.
Definition: THistManager.h:99
void LoadEventCellData()
Load event-dependent cell data.
Int_t GetRunNumber(TString)
Definition: PlotMuonQA.C:2235
const char Option_t
Definition: External.C:48
AliOADBContainer * fMaskedCellOADB
! OADB container with masked cells
virtual void RunChanged(Int_t newrun)
Run-dependent setup of the task.
THnSparse * CreateTHnSparse(const char *name, const char *title, int ndim, const int *nbins, const double *min, const double *max, Option_t *opt="")
Create a new THnSparse within the container.
TString fTriggerPattern
Trigger string pattern used in addition to the trigger selection bits.
Simlple monitoring of EMCAL FastOr quantities.