]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG4/UserTasks/EmcalTasks/AliAnalysisTaskEMCALTriggerQA.cxx
increasing track depth to 50k
[u/mrichter/AliRoot.git] / PWG4 / UserTasks / EmcalTasks / AliAnalysisTaskEMCALTriggerQA.cxx
CommitLineData
bce9493b 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16//------------------------------------------------------------------------//
17// Fill histograms with basic QA information for EMCAL offline trigger //
18// Author: Nicolas Arbor (LPSC-Grenoble) //
19// Gustavo Conesa Balbastre (LPSC-Grenoble) //
20// //
21//------------------------------------------------------------------------//
22
23
24#include <TList.h>
25#include <TH1F.h>
26#include <TH2F.h>
27#include <TF1.h>
28
29#include "AliLog.h"
30#include "AliVCluster.h"
31#include "AliVCaloCells.h"
32#include "AliVEvent.h"
33#include "AliESDEvent.h"
34#include "AliESDVZERO.h"
35#include "AliESDCaloTrigger.h"
36#include "AliEMCALGeometry.h"
37
38#include "AliAnalysisTaskEMCALTriggerQA.h"
39
40ClassImp(AliAnalysisTaskEMCALTriggerQA)
41
85196c29 42//______________________________________________________________
bce9493b 43AliAnalysisTaskEMCALTriggerQA::AliAnalysisTaskEMCALTriggerQA() :
44AliAnalysisTaskSE(),
45fOutputList(0),
46fGeometry(0), fGeoName("EMCAL_COMPLETEV1"),
47fhNEvents(0),
e022364d 48fhFORAmp(0),
49fhL0Amp(0),
aff917ac 50fhL1Amp(0),
e022364d 51fhL1GAmp(0),
52fhL1JAmp(0),
bce9493b 53fhL0Patch(0),
54fhL1GPatch(0),
55fhL1JPatch(0),
85196c29 56fhFEESTU(0),
57fhTRUSTU(0),
bce9493b 58fhV0STU(0),
59fhFullTRUSTU(0),
60fhSTUChecks(0),
85196c29 61fNBinsSTUSignal (2000), fMaxSTUSignal (200000),
62fNBinsTRUSignal (2000), fMaxTRUSignal (200000),
63fNBinsV0Signal (2000), fMaxV0Signal (20000),
64fNBinsSTUFEERatio(2000), fMaxSTUFEERatio(20000),
65fNBinsSTUTRURatio(2000), fMaxSTUTRURatio(200)
bce9493b 66
67{
68 // Constructor
bce9493b 69
70}
71
85196c29 72//______________________________________________________________________________
bce9493b 73AliAnalysisTaskEMCALTriggerQA::AliAnalysisTaskEMCALTriggerQA(const char *name) :
74AliAnalysisTaskSE(name),
75fOutputList(0),
76fGeometry(0), fGeoName("EMCAL_COMPLETEV1"),
77fhNEvents(0),
e022364d 78fhFORAmp(0),
79fhL0Amp(0),
aff917ac 80fhL1Amp(0),
e022364d 81fhL1GAmp(0),
82fhL1JAmp(0),
bce9493b 83fhL0Patch(0),
84fhL1GPatch(0),
85fhL1JPatch(0),
85196c29 86fhFEESTU(0),
87fhTRUSTU(0),
bce9493b 88fhV0STU(0),
89fhFullTRUSTU(0),
90fhSTUChecks(0),
85196c29 91fNBinsSTUSignal (2000), fMaxSTUSignal (200000),
92fNBinsTRUSignal (2000), fMaxTRUSignal (200000),
93fNBinsV0Signal (2000), fMaxV0Signal (20000),
94fNBinsSTUFEERatio(2000), fMaxSTUFEERatio(20000),
95fNBinsSTUTRURatio(2000), fMaxSTUTRURatio(200)
bce9493b 96
97{
98 // Constructor
bce9493b 99
100 DefineOutput(1, TList::Class());
101
102}
103
104
85196c29 105//___________________________________________________________
bce9493b 106void AliAnalysisTaskEMCALTriggerQA::UserCreateOutputObjects()
107{
108 // Init histograms and geometry
109
110 fGeometry = AliEMCALGeometry::GetInstance(fGeoName);
111
85196c29 112 fOutputList = new TList;
113 fOutputList ->SetOwner(kTRUE);
bce9493b 114
85196c29 115 fhNEvents = new TH1F("hNEvents","Number of selected events",1,0,1);
116 fhNEvents ->SetYTitle("N events");
bce9493b 117
e022364d 118 fhFORAmp = new TH2F("hFORAmp", "FEE cells deposited energy, grouped like FastOR 2x2 per Row and Column",fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows);
119 fhFORAmp ->SetXTitle("Index #eta (collumns)");
120 fhFORAmp ->SetYTitle("Index #phi (rows)");
121 fhFORAmp ->SetZTitle("Amplitude");
aff917ac 122
e022364d 123 fhL0Amp = new TH2F("hL0Amp","FALTRO signal per Row and Column",fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows);
124 fhL0Amp ->SetXTitle("Index #eta (collumns)");
125 fhL0Amp ->SetYTitle("Index #phi (rows)");
126 fhL0Amp ->SetZTitle("Amplitude");
aff917ac 127
128 fhL1Amp = new TH2F("hL1Amp","STU signal per Row and Column",fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows);
129 fhL1Amp ->SetXTitle("Index #eta (collumns)");
130 fhL1Amp ->SetYTitle("Index #phi (rows)");
131 fhL1Amp ->SetZTitle("Amplitude");
132
e022364d 133 fhL1GAmp = new TH2F("hL1GAmp","STU signal per Row and Column for L1 Gamma",fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows);
134 fhL1GAmp ->SetXTitle("Index #eta (collumns)");
135 fhL1GAmp ->SetYTitle("Index #phi (rows)");
136 fhL1GAmp ->SetZTitle("Amplitude");
aff917ac 137
e022364d 138 fhL1JAmp = new TH2F("hL1JAmp","STU signal per Row and Column for L1 Jet",fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows);
139 fhL1JAmp ->SetXTitle("Index #eta (collumns)");
140 fhL1JAmp ->SetYTitle("Index #phi (rows)");
141 fhL1JAmp ->SetZTitle("Amplitude");
aff917ac 142
85196c29 143 fhL0Patch = new TH2F("hL0Patch","FOR with associated L0 Patch",fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows);
144 fhL0Patch ->SetXTitle("Index #eta (collumns)");
145 fhL0Patch ->SetYTitle("Index #phi (rows)");
e022364d 146 fhL0Patch ->SetZTitle("counts");
aff917ac 147
85196c29 148 fhL1GPatch = new TH2F("hL1GPatch","FOR with associated L1 Gamma Patch",fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows);
149 fhL1GPatch ->SetXTitle("Index #eta (collumns)");
150 fhL1GPatch ->SetYTitle("Index #phi (rows)");
e022364d 151 fhL1GPatch ->SetZTitle("counts");
aff917ac 152
85196c29 153 fhL1JPatch = new TH2F("hL1JPatch","FOR with associated L1 Jet Patch",fgkFALTROCols,0,fgkFALTROCols,fgkFALTRORows,0,fgkFALTRORows);
154 fhL1JPatch ->SetXTitle("Index #eta (collumns)");
155 fhL1JPatch ->SetYTitle("Index #phi (rows)");
e022364d 156 fhL1JPatch ->SetZTitle("counts");
aff917ac 157
85196c29 158 fhFullTRUSTU = new TH2I("hFullTRUSTU","Total signal STU vs TRU",fNBinsTRUSignal,0,fMaxTRUSignal,fNBinsSTUSignal,0,fMaxSTUSignal);
bce9493b 159 fhFullTRUSTU->SetXTitle("Total signal TRU");
160 fhFullTRUSTU->SetYTitle("Total signal STU");
e022364d 161 fhFullTRUSTU->SetZTitle("counts");
aff917ac 162
85196c29 163 fhV0STU = new TH2I("hV0STU","Total signal STU vs V0C+V0S",fNBinsV0Signal,0,fMaxV0Signal,fNBinsSTUSignal,0,fMaxSTUSignal);
164 fhV0STU ->SetXTitle("Signal V0C+V0A");
165 fhV0STU ->SetYTitle("Total signal STU");
e022364d 166 fhV0STU ->SetZTitle("counts");
aff917ac 167
85196c29 168 fhSTUChecks = new TH2I("hSTUChecks","Check FEE/STU link",2,0,2,15,0,15);
169 fhSTUChecks ->SetXTitle("Index #eta");
170 fhSTUChecks ->SetYTitle("Index #phi");
aff917ac 171
85196c29 172 fhFEESTU = new TH2F("hFEESTU","STU / FEE vs channel", fNBinsSTUFEERatio,0,fMaxSTUFEERatio,30,0,30);
173 fhFEESTU ->SetXTitle("STU/FEE signal");
174 fhFEESTU ->SetYTitle("channel");
e022364d 175 fhFEESTU ->SetZTitle("counts");
aff917ac 176
85196c29 177 fhTRUSTU = new TH2F("hTRUSTU","STU / TRU vs channel", fNBinsSTUTRURatio,0,fMaxSTUTRURatio,30,0,30);
178 fhTRUSTU ->SetXTitle("STU/TRU signal");
179 fhTRUSTU ->SetYTitle("channel");
e022364d 180 fhTRUSTU ->SetZTitle("counts");
aff917ac 181
bce9493b 182 fOutputList->Add(fhNEvents);
183 fOutputList->Add(fhV0STU);
e022364d 184 fOutputList->Add(fhFORAmp);
185 fOutputList->Add(fhL0Amp);
aff917ac 186 fOutputList->Add(fhL1Amp);
e022364d 187 fOutputList->Add(fhL1GAmp);
188 fOutputList->Add(fhL1JAmp);
bce9493b 189 fOutputList->Add(fhL0Patch);
190 fOutputList->Add(fhL1GPatch);
191 fOutputList->Add(fhL1JPatch);
192 fOutputList->Add(fhFullTRUSTU);
193 fOutputList->Add(fhSTUChecks);
85196c29 194 fOutputList->Add(fhFEESTU);
195 fOutputList->Add(fhTRUSTU);
bce9493b 196
197 PostData(1, fOutputList);
198
199}
85196c29 200//______________________________________________________
bce9493b 201void AliAnalysisTaskEMCALTriggerQA::UserExec(Option_t *)
202{
203 // Main loop
bce9493b 204
205 AliVEvent* event = InputEvent();
206
207 //Remove next lines when AODs ready
208 AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(event);
209
210 if (!esdEvent)
211 {
212 AliError("Work only with ESDs, not available, exit");
213 return;
214 }
215
216 fhNEvents->Fill(0);
217
bce9493b 218 //map for cells and patches
219
e022364d 220 Double_t emcalCell [fgkFALTRORows][fgkFALTROCols], emcalTrigL0 [fgkFALTRORows][fgkFALTROCols], emcalTrigL1G [fgkFALTRORows][fgkFALTROCols], emcalTrigL1J [fgkFALTRORows][fgkFALTROCols], emcalTrigL1[fgkFALTRORows][fgkFALTROCols];
bce9493b 221 Double_t emcalPatchL0[fgkFALTRORows][fgkFALTROCols], emcalPatchL1G[fgkFALTRORows][fgkFALTROCols], emcalPatchL1J[fgkFALTRORows][fgkFALTROCols];
222
223 for (Int_t i = 0; i < fgkFALTRORows; i++)
224 {
225 for (Int_t j = 0; j < fgkFALTROCols; j++)
226 {
85196c29 227 emcalTrigL0[i][j] = 0.;
e022364d 228 emcalTrigL1G[i][j] = 0.;
229 emcalTrigL1J[i][j] = 0.;
85196c29 230 emcalTrigL1[i][j] = 0.;
231 emcalCell[i][j] = 0.;
232 emcalPatchL0[i][j] = 0.;
bce9493b 233 emcalPatchL1G[i][j] = 0.;
234 emcalPatchL1J[i][j] = 0.;
235 }
236 }
237
238 // ---------------------------------
239 // Cells analysis
240 // Fill FEE energy per channel array
241 // ---------------------------------
242
243 Int_t posX = -1, posY = -1;
244 Int_t nSupMod = -1, ieta = -1, iphi = -1, nModule = -1, nIphi = -1, nIeta = -1;
245 Short_t absId = -1;
246 Int_t nCells = 0;
247
248 AliVCaloCells& cells= *(event->GetEMCALCells());
249
250 if (cells.IsEMCAL())
251 {
252 for (Int_t icell = 0; icell < cells.GetNumberOfCells(); icell++)
253 {
254 nCells ++;
255
256 Double_t amp =0., time = 0.;
257
258 cells.GetCell(icell, absId, amp, time);
259
260 fGeometry->GetCellIndex(absId, nSupMod, nModule, nIphi, nIeta);
261 fGeometry->GetCellPhiEtaIndexInSModule(nSupMod, nModule, nIphi, nIeta, iphi, ieta);
262
263 posX = (nSupMod % 2) ? ieta + AliEMCALGeoParams::fgkEMCALCols : ieta;
264 posY = iphi + AliEMCALGeoParams::fgkEMCALRows * int(nSupMod / 2);
bce9493b 265
85196c29 266 if(int(posX/2) > fgkFALTROCols || int(posY/2) > fgkFALTRORows ) {
267 printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Wrong Position (x,y) = (%d,%d)\n",posX,posY);
268 continue;
269 }
270
271 emcalCell[int(posY/2)][int(posX/2)] += amp;
272
bce9493b 273 }
274 }
275
85196c29 276 //-------------------------------------
277 // Trigger analysis, fill L0, L1 arrays
278 //-------------------------------------
bce9493b 279
280 AliESDCaloTrigger& trg= * (esdEvent->GetCaloTrigger("EMCAL"));
281
282 Int_t nL0Patch = 0 ;
283 Int_t nL1Patch = 0 ;
284 Double_t totSTU = 0.;
285 Double_t totTRU = 0.;
286
287 trg.Reset();
288 while (trg.Next())
289 {
290 trg.GetPosition(posX,posY);
291
292
293 if (posX > -1 && posY > -1)
294 {
295 //L0 analysis
296 Int_t nTimes = 0;
297 trg.GetNL0Times(nTimes);
85196c29 298
aff917ac 299 Float_t ampL0 = 0.;
300 trg.GetAmplitude(ampL0);
301 emcalTrigL0[posY][posX] += ampL0;
302 totTRU += ampL0;
303
bce9493b 304 if (nTimes)
305 {
306 nL0Patch += nTimes;
bce9493b 307 emcalPatchL0[posY][posX] = 1.;
aff917ac 308 fhL0Patch->Fill(posX,59-posY);//59 is due to FOR reference
bce9493b 309 }
310
311 //L1 analysis
312 Int_t bit = 0;
313 trg.GetTriggerBits(bit);
314
aff917ac 315 Int_t ts = 0;
316 trg.GetL1TimeSum(ts);
317 emcalTrigL1 [posY][posX] += ts;
318 totSTU += ts;
319
bce9493b 320 //L1-Gamma
321 if (bit >> 4 & 0x1)
322 {
323 nL1Patch ++;
324 emcalPatchL1G[posY][posX] = 1.;
aff917ac 325 fhL1GPatch->Fill(posX,59-posY);
326
327 emcalTrigL1G[posY][posX] += ts;
bce9493b 328
85196c29 329 //printf("Gamma STU patch %d, time sum %d, posX %d , posY %d\n",nL1Patch,ts,posX, posY);
bce9493b 330 }
331
332 //L1-Jet
333 if (bit >> 5 & 0x1)
334 {
335 nL1Patch ++;
336 emcalPatchL1J[posY][posX] = 1.;
aff917ac 337 fhL1JPatch->Fill(posX,59-posY);
338
339 emcalTrigL1J[posY][posX] += ts;
bce9493b 340
85196c29 341 //printf("Jet STU patch %d, time sum %d, posX %d , posY %d\n",nL1Patch,ts,posX, posY);
aff917ac 342
bce9493b 343 }
344
345 }
346 }
347
85196c29 348 if(totTRU > fMaxTRUSignal)printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Large totTRU %f\n",totTRU);
349 if(totSTU > fMaxSTUSignal)printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Large totSTU %f\n",totSTU);
bce9493b 350
351 if (totTRU != 0) fhFullTRUSTU->Fill(totTRU,totSTU);
352
353 //V0 analysis
354 AliESDVZERO* eventV0 = esdEvent->GetVZEROData();
355
356 Float_t v0C = 0, v0A = 0;
357
358 if (eventV0)
359 {
360 for (Int_t i = 0; i < 32; i++)
361 {
362 v0C += eventV0->GetAdcV0C(i);
363 v0A += eventV0->GetAdcV0A(i);
364 }
365 }
366
367 if (totSTU != 0) {
368 fhV0STU->Fill(v0A+v0C,totSTU);
85196c29 369 if( v0A+v0C > fMaxV0Signal) printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Large v0A+v0C %f\n",v0A+v0C);
bce9493b 370 }
371
85196c29 372 //if(nL0Patch!=0 || nL1Patch!=0) printf("total TRU %f, total STU %f, V0C+V0A %f; nL0 %d, nL1 %d \n",
373 // totTRU,totSTU,v0A+v0C,nL0Patch,nL1Patch);
374
bce9493b 375 //Matrix with signal per channel
e022364d 376 for (Int_t i = 0; i < fgkFALTRORows; i++)
bce9493b 377 {
e022364d 378 for (Int_t j = 0; j < fgkFALTROCols; j++) //check x,y direction for reading FOR ((0,0) = top left);
bce9493b 379 {
e022364d 380 fhFORAmp->Fill( j, fgkFALTRORows-i-1, emcalCell [i][j]);
381 fhL0Amp ->Fill( j, fgkFALTRORows-i-1, emcalTrigL0 [i][j]);
aff917ac 382 fhL0Amp ->Fill( j, fgkFALTRORows-i-1, emcalTrigL1 [i][j]);
e022364d 383 fhL1GAmp->Fill( j, fgkFALTRORows-i-1, emcalTrigL1G[i][j]);
384 fhL1JAmp->Fill( j, fgkFALTRORows-i-1, emcalTrigL1J[i][j]);
bce9493b 385 }
386 }
387
aff917ac 388 //FEE-TRU-STU correlation checks
bce9493b 389 Double_t ampFOR[30] = {0.}, ampL0[30] = {0.}, ampL1[30] = {0.};
e022364d 390 for (Int_t i = 0; i < fgkFALTRORows; i++)
bce9493b 391 {
e022364d 392 for (Int_t j = 0; j < fgkFALTROCols; j++)
bce9493b 393 {
394
395 //method to get TRU number
85196c29 396 Int_t idFOR = -1;
397 fGeometry->GetAbsFastORIndexFromPositionInEMCAL(j,i,idFOR);
398 Int_t iTRU = -1;
399 Int_t iADC = -1;
400 fGeometry->GetTRUFromAbsFastORIndex(idFOR,iTRU,iADC);
401 //printf("i %d, j %d, iTRU %d, iADC %d, idFOR %d; cell %f, L0 %f, L1 %f\n",
402 // i,j,iTRU,iADC,idFOR, emcalCell [i][j],emcalTrigL0[i][j],emcalTrigL1[i][j]);
bce9493b 403 if (iTRU >= 0)
404 {
405 ampFOR[iTRU] += emcalCell [i][j];
406 ampL0[iTRU] += emcalTrigL0[i][j];
407 ampL1[iTRU] += emcalTrigL1[i][j];
408 }
409 }
410 }
411
85196c29 412 // FEE vs STU and TRU vs STU ratios
bce9493b 413 for (Int_t i = 0; i < 30; i++)
414 {
85196c29 415
416 if (ampFOR[i] != 0 && ampL1[i] != 0) {
417 fhFEESTU->Fill(ampL1[i]/ampFOR[i],i);
418 if(ampL1[i]/ampFOR[i] > fMaxSTUFEERatio) printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Large STU/FEE ratio %f\n",ampL1[i]/ampFOR[i]);
419 }
420
421 if (ampL0[i] != 0 && ampL1[i] != 0) {
422 fhTRUSTU->Fill(ampL1[i]/ampL0[i] ,i);
423 if(ampL1[i]/ampL0[i] > fMaxSTUTRURatio) printf("AliAnalysisTaskEMCALTriggerQA::UserExec() - Large STU/TRU ratio %f\n",ampL1[i]/ampL0[i]);
424 }
425
bce9493b 426 }
427
bce9493b 428 PostData(1, fOutputList);
429
430}
431
85196c29 432//_______________________________________________________
433void AliAnalysisTaskEMCALTriggerQA::Terminate(Option_t *)
434{
435 // Terminate analysis
436 // Do some plots
437
438 Int_t checkSTU[30];
439 for (Int_t i = 0; i < 30; i++)
440 {
441 checkSTU[i] = 1 ; // Init array
442 TH1F* hTRUSTUChannel = (TH1F*) fhTRUSTU->ProjectionY(Form("hTRUSTUChannel%d",i),i,i);
443 //printf("AliAnalysisTaskEMCALTriggerQA::Terminate() - Channel %d TRUSTU Entries %d, Integral(10,20) %f ",
444 // i, hTRUSTUChannel->GetEntries(), hTRUSTUChannel->Integral(10,20));
aff917ac 445 Int_t binMin = hTRUSTUChannel->FindBin(10);
446 Int_t binMax = hTRUSTUChannel->FindBin(20);
85196c29 447 if (hTRUSTUChannel->GetEntries() > 0 &&
aff917ac 448 hTRUSTUChannel->Integral(binMin,binMax)/hTRUSTUChannel->GetEntries() < 0.9)
85196c29 449 checkSTU[i] = 0;
450 else if(hTRUSTUChannel->GetEntries() <= 0)
451 checkSTU[i] = 0;
452
453 //printf(" - %d\n",checkSTU[i]);
454 delete hTRUSTUChannel;
455 }
456
457 for (Int_t i = 0; i < 30; i++)
458 {
459 if (i<15) fhSTUChecks->Fill(0.,i,checkSTU[i]);
460 else fhSTUChecks->Fill(1.,i,checkSTU[i]);
461 }
462
463}