]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGGA/EMCALTasks/AliAnalysisTaskEMCALClusterize.cxx
#100552: EMCal MC labels overflow and re-index bug fix (Jiri Kral)
[u/mrichter/AliRoot.git] / PWGGA / EMCALTasks / AliAnalysisTaskEMCALClusterize.cxx
CommitLineData
eef481c6 1 /**************************************************************************
6fdd30c4 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 **************************************************************************/
6fdd30c4 15
16//_________________________________________________________________________
17// This analysis provides a new list of clusters to be used in other analysis
18//
19// Author: Gustavo Conesa Balbastre,
20// Adapted from analysis class from Deepa Thomas
21//
cd231d42 22// $Id$
6fdd30c4 23//_________________________________________________________________________
24
25// --- Root ---
04fcfa08 26#include <TString.h>
27#include <TRefArray.h>
28#include <TClonesArray.h>
29#include <TTree.h>
30#include <TGeoManager.h>
31#include <TROOT.h>
32#include <TInterpreter.h>
33#include <TFile.h>
6fdd30c4 34
35// --- AliRoot Analysis Steering
36#include "AliAnalysisTask.h"
37#include "AliAnalysisManager.h"
38#include "AliESDEvent.h"
39#include "AliGeomManager.h"
40#include "AliVCaloCells.h"
41#include "AliAODCaloCluster.h"
42#include "AliCDBManager.h"
43#include "AliCDBStorage.h"
44#include "AliCDBEntry.h"
45#include "AliLog.h"
46#include "AliVEventHandler.h"
6060ed91 47#include "AliAODInputHandler.h"
3769e0cb 48#include "AliOADBContainer.h"
6edb4448 49#include "AliAODMCParticle.h"
6fdd30c4 50
51// --- EMCAL
6fdd30c4 52#include "AliEMCALAfterBurnerUF.h"
53#include "AliEMCALGeometry.h"
54#include "AliEMCALClusterizerNxN.h"
55#include "AliEMCALClusterizerv1.h"
cfcbe5d2 56#include "AliEMCALClusterizerv2.h"
6fdd30c4 57#include "AliEMCALRecPoint.h"
58#include "AliEMCALDigit.h"
59#include "AliCaloCalibPedestal.h"
60#include "AliEMCALCalibData.h"
61
62#include "AliAnalysisTaskEMCALClusterize.h"
63
64ClassImp(AliAnalysisTaskEMCALClusterize)
65
6544055e 66//______________________________________________________________________________
6fdd30c4 67AliAnalysisTaskEMCALClusterize::AliAnalysisTaskEMCALClusterize(const char *name)
6544055e 68: AliAnalysisTaskSE(name)
69, fEvent(0)
3769e0cb 70, fGeom(0), fGeomName("")
6544055e 71, fGeomMatrixSet(kFALSE), fLoadGeomMatrices(kFALSE)
72, fCalibData(0), fPedestalData(0)
3769e0cb 73, fOCDBpath(""), fAccessOCDB(kFALSE)
6544055e 74, fDigitsArr(0), fClusterArr(0), fCaloClusterArr(0)
75, fRecParam(0), fClusterizer(0)
76, fUnfolder(0), fJustUnfold(kFALSE)
6a797202 77, fOutputAODBranch(0), fOutputAODBranchName(""), fOutputAODBranchSet(0)
78, fFillAODFile(kFALSE), fFillAODHeader(0)
6544055e 79, fFillAODCaloCells(0), fRun(-1)
80, fRecoUtils(0), fConfigName("")
6edb4448 81, fOrgClusterCellId()
1e0ff9d3 82, fCellLabels(), fCellSecondLabels(), fCellTime()
adad4ea9 83, fCellMatchdEta(), fCellMatchdPhi()
1e0ff9d3 84, fRecalibrateWithClusterTime(0)
3769e0cb 85, fMaxEvent(0), fDoTrackMatching(kFALSE)
86, fSelectCell(kFALSE), fSelectCellMinE(0), fSelectCellMinFrac(0)
cb68426a 87, fRemoveLEDEvents(kTRUE),fRemoveExoticEvents(kFALSE)
3769e0cb 88, fImportGeometryFromFile(kFALSE), fImportGeometryFilePath("")
cb68426a 89, fOADBSet(kFALSE), fAccessOADB(kTRUE), fOADBFilePath("")
5aa88029 90, fCentralityClass(""), fSelectEMCALEvent(0)
91, fEMCALEnergyCut(0.), fEMCALNcellsCut (0)
6edb4448 92, fSetCellMCLabelFromCluster(0)
93, fRemapMCLabelForAODs(0)
6a8be5c3 94{
b43bdd14 95 // Constructor
96
e3990982 97 for(Int_t i = 0; i < 12; i++) fGeomMatrix[i] = 0;
6edb4448 98
99 ResetArrays();
a39f5b70 100
cb68426a 101 fCentralityBin[0] = fCentralityBin[1]=-1;
a39f5b70 102
6fdd30c4 103}
104
6544055e 105//______________________________________________________________
6fdd30c4 106AliAnalysisTaskEMCALClusterize::AliAnalysisTaskEMCALClusterize()
6544055e 107: AliAnalysisTaskSE("DefaultAnalysis_AliAnalysisTaskEMCALClusterize")
108, fEvent(0)
3769e0cb 109, fGeom(0), fGeomName("")
6544055e 110, fGeomMatrixSet(kFALSE), fLoadGeomMatrices(kFALSE)
111, fCalibData(0), fPedestalData(0)
3769e0cb 112, fOCDBpath(""), fAccessOCDB(kFALSE)
6544055e 113, fDigitsArr(0), fClusterArr(0), fCaloClusterArr(0)
114, fRecParam(0), fClusterizer(0)
115, fUnfolder(0), fJustUnfold(kFALSE)
6a797202 116, fOutputAODBranch(0), fOutputAODBranchName(""), fOutputAODBranchSet(0)
117, fFillAODFile(kFALSE), fFillAODHeader(0)
6544055e 118, fFillAODCaloCells(0), fRun(-1)
119, fRecoUtils(0), fConfigName("")
6edb4448 120, fOrgClusterCellId()
1e0ff9d3 121, fCellLabels(), fCellSecondLabels(), fCellTime()
adad4ea9 122, fCellMatchdEta(), fCellMatchdPhi()
1e0ff9d3 123, fRecalibrateWithClusterTime(0)
3769e0cb 124, fMaxEvent(0), fDoTrackMatching(kFALSE)
125, fSelectCell(kFALSE), fSelectCellMinE(0), fSelectCellMinFrac(0)
cb68426a 126, fRemoveLEDEvents(kTRUE), fRemoveExoticEvents(kFALSE)
9ac44255 127, fImportGeometryFromFile(kFALSE), fImportGeometryFilePath("")
cb68426a 128, fOADBSet(kFALSE), fAccessOADB(kTRUE), fOADBFilePath("")
6c79bfc8 129, fCentralityClass(""), fSelectEMCALEvent(0)
130, fEMCALEnergyCut(0.), fEMCALNcellsCut (0)
6edb4448 131, fSetCellMCLabelFromCluster(0)
132, fRemapMCLabelForAODs(0)
6fdd30c4 133{
134 // Constructor
b43bdd14 135
e3990982 136 for(Int_t i = 0; i < 12; i++) fGeomMatrix[i] = 0;
6edb4448 137
138 ResetArrays();
139
3af5a372 140 fCentralityBin[0] = fCentralityBin[1]=-1;
141
6fdd30c4 142}
143
5994e71f 144
6544055e 145//_______________________________________________________________
6fdd30c4 146AliAnalysisTaskEMCALClusterize::~AliAnalysisTaskEMCALClusterize()
147{
148 //dtor
149
b43bdd14 150 if (fDigitsArr)
151 {
6fdd30c4 152 fDigitsArr->Clear("C");
542e1379 153 delete fDigitsArr;
6fdd30c4 154 }
155
b43bdd14 156 if (fClusterArr)
157 {
6fdd30c4 158 fClusterArr->Delete();
542e1379 159 delete fClusterArr;
6fdd30c4 160 }
161
b43bdd14 162 if (fCaloClusterArr)
163 {
6fdd30c4 164 fCaloClusterArr->Delete();
1e0ff9d3 165 delete fCaloClusterArr;
6fdd30c4 166 }
6a8be5c3 167
385b7abf 168 if(fClusterizer) delete fClusterizer;
169 if(fUnfolder) delete fUnfolder;
170 if(fRecoUtils) delete fRecoUtils;
6a8be5c3 171
6fdd30c4 172}
173
5aa88029 174//_______________________________________________________
175Bool_t AliAnalysisTaskEMCALClusterize::AcceptEventEMCAL()
176{
177 // Accept event given there is a EMCAL cluster with enough energy, and not noisy, exotic
178
179 if(!fSelectEMCALEvent) return kTRUE; // accept
180
181 if(fEMCALEnergyCut <= 0) return kTRUE; // accept
182
183 Int_t nCluster = InputEvent() -> GetNumberOfCaloClusters();
184 AliVCaloCells * caloCell = InputEvent() -> GetEMCALCells();
185 Int_t bc = InputEvent() -> GetBunchCrossNumber();
186
187 for(Int_t icalo = 0; icalo < nCluster; icalo++)
188 {
189 AliVCluster *clus = (AliVCluster*) (InputEvent()->GetCaloCluster(icalo));
190
191 if( ( clus->IsEMCAL() ) && ( clus->GetNCells() > fEMCALNcellsCut ) && ( clus->E() > fEMCALEnergyCut ) &&
192 fRecoUtils->IsGoodCluster(clus,fGeom,caloCell,bc))
193 {
194
195 if (fDebug > 0)
196 printf("AliAnalysisTaskEMCALClusterize::AcceptEventEMCAL() - Accept : E %2.2f > %2.2f, nCells %d > %d \n",
197 clus->E(), fEMCALEnergyCut, clus->GetNCells(), fEMCALNcellsCut);
198
199 return kTRUE;
200 }
201
202 }// loop
203
204 if (fDebug > 0)
205 printf("AliAnalysisTaskEMCALClusterize::AcceptEventEMCAL() - Reject \n");
206
207 return kFALSE;
208
209}
210
3769e0cb 211//_______________________________________________
212void AliAnalysisTaskEMCALClusterize::AccessOADB()
213{
214 // Set the AODB calibration, bad channels etc. parameters at least once
215 // alignment matrices from OADB done in SetGeometryMatrices
216
217 //Set it only once
218 if(fOADBSet) return ;
219
220 Int_t runnumber = InputEvent()->GetRunNumber() ;
221 TString pass = GetPass();
222
223 printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Get AODB parameters from EMCAL in %s for run %d, and <%s> \n",fOADBFilePath.Data(),runnumber,pass.Data());
224
225 Int_t nSM = fGeom->GetNumberOfSuperModules();
226
227 // Bad map
228 if(fRecoUtils->IsBadChannelsRemovalSwitchedOn())
229 {
230 AliOADBContainer *contBC=new AliOADBContainer("");
231 contBC->InitFromFile(Form("%s/EMCALBadChannels.root",fOADBFilePath.Data()),"AliEMCALBadChannels");
232
233 TObjArray *arrayBC=(TObjArray*)contBC->GetObject(runnumber);
234
235 if(arrayBC)
236 {
3769e0cb 237 fRecoUtils->SwitchOnDistToBadChannelRecalculation();
238 printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Remove EMCAL bad cells \n");
239
240 for (Int_t i=0; i<nSM; ++i)
241 {
242 TH2I *hbm = fRecoUtils->GetEMCALChannelStatusMap(i);
243
244 if (hbm)
245 delete hbm;
246
17e1c80e 247 hbm=(TH2I*)arrayBC->FindObject(Form("EMCALBadChannelMap_Mod%d",i));
3769e0cb 248
249 if (!hbm)
250 {
251 AliError(Form("Can not get EMCALBadChannelMap_Mod%d",i));
252 continue;
253 }
254
255 hbm->SetDirectory(0);
256 fRecoUtils->SetEMCALChannelStatusMap(i,hbm);
257
258 } // loop
17e1c80e 259 } else printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Do NOT remove EMCAL bad channels\n"); // run array
3769e0cb 260 } // Remove bad
261
262 // Energy Recalibration
263 if(fRecoUtils->IsRecalibrationOn())
264 {
265 AliOADBContainer *contRF=new AliOADBContainer("");
266
267 contRF->InitFromFile(Form("%s/EMCALRecalib.root",fOADBFilePath.Data()),"AliEMCALRecalib");
268
269 TObjArray *recal=(TObjArray*)contRF->GetObject(runnumber);
270
271 if(recal)
272 {
273 TObjArray *recalpass=(TObjArray*)recal->FindObject(pass);
274
275 if(recalpass)
276 {
277 TObjArray *recalib=(TObjArray*)recalpass->FindObject("Recalib");
278
279 if(recalib)
280 {
281 printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Recalibrate EMCAL \n");
282 for (Int_t i=0; i<nSM; ++i)
283 {
284 TH2F *h = fRecoUtils->GetEMCALChannelRecalibrationFactors(i);
285
286 if (h)
287 delete h;
288
289 h = (TH2F*)recalib->FindObject(Form("EMCALRecalFactors_SM%d",i));
290
291 if (!h)
292 {
293 AliError(Form("Could not load EMCALRecalFactors_SM%d",i));
294 continue;
295 }
296
297 h->SetDirectory(0);
298
299 fRecoUtils->SetEMCALChannelRecalibrationFactors(i,h);
300 } // SM loop
17e1c80e 301 }else printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Do NOT recalibrate EMCAL, no params object array \n"); // array ok
302 }else printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Do NOT recalibrate EMCAL, no params for pass\n"); // array pass ok
303 }else printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Do NOT recalibrate EMCAL, no params for run\n"); // run number array ok
7bf608c9 304
3769e0cb 305 } // Recalibration on
306
7bf608c9 307 // Energy Recalibration, apply on top of previous calibration factors
308 if(fRecoUtils->IsRunDepRecalibrationOn())
309 {
310 AliOADBContainer *contRFTD=new AliOADBContainer("");
311
312 contRFTD->InitFromFile(Form("%s/EMCALTemperatureCorrCalib.root",fOADBFilePath.Data()),"AliEMCALRunDepTempCalibCorrections");
313
314 TH1S *htd=(TH1S*)contRFTD->GetObject(runnumber);
315
74d2310f 316 //If it did not exist for this run, get closes one
317 if (!htd)
318 {
319 AliWarning(Form("No TemperatureCorrCalib Objects for run: %d",runnumber));
320 // let's get the closest runnumber instead then..
321 Int_t lower = 0;
322 Int_t ic = 0;
323 Int_t maxEntry = contRFTD->GetNumberOfEntries();
324
325 while ( (ic < maxEntry) && (contRFTD->UpperLimit(ic) < runnumber) ) {
326 lower = ic;
327 ic++;
328 }
329
330 Int_t closest = lower;
331 if ( (ic<maxEntry) &&
332 (contRFTD->LowerLimit(ic)-runnumber) < (runnumber - contRFTD->UpperLimit(lower)) ) {
333 closest = ic;
334 }
335
336 AliWarning(Form("TemperatureCorrCalib Objects found closest id %d from run: %d", closest, contRFTD->LowerLimit(closest)));
337 htd = (TH1S*) contRFTD->GetObjectByIndex(closest);
338 }
339
7bf608c9 340 if(htd)
341 {
342 printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Recalibrate (Temperature) EMCAL \n");
343
344 for (Int_t ism=0; ism<nSM; ++ism)
345 {
346 for (Int_t icol=0; icol<48; ++icol)
347 {
348 for (Int_t irow=0; irow<24; ++irow)
349 {
350 Float_t factor = fRecoUtils->GetEMCALChannelRecalibrationFactor(ism,icol,irow);
351
352 Int_t absID = fGeom->GetAbsCellIdFromCellIndexes(ism, irow, icol); // original calibration factor
353 factor *= htd->GetBinContent(absID) / 10000. ; // correction dependent on T
354 //printf("\t ism %d, icol %d, irow %d,absID %d, corrA %2.3f, corrB %2.3f, corrAB %2.3f\n",ism, icol, irow, absID,
355 // GetEMCALChannelRecalibrationFactor(ism,icol,irow) , htd->GetBinContent(absID) / 10000., factor);
356 fRecoUtils->SetEMCALChannelRecalibrationFactor(ism,icol,irow,factor);
357 } // columns
358 } // rows
359 } // SM loop
360 }else printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Do NOT recalibrate EMCAL with T variations, no params TH1 \n");
361 } // Run by Run T calibration
3769e0cb 362
363 // Time Recalibration
364 if(fRecoUtils->IsTimeRecalibrationOn())
365 {
366 AliOADBContainer *contTRF=new AliOADBContainer("");
367
f46af216 368 contTRF->InitFromFile(Form("%s/EMCALTimeCalib.root",fOADBFilePath.Data()),"AliEMCALTimeCalib");
3769e0cb 369
370 TObjArray *trecal=(TObjArray*)contTRF->GetObject(runnumber);
371
372 if(trecal)
373 {
61841488 374 TString passTmp = pass;
7764134d 375 if(pass!="pass1" && pass!="pass2") passTmp = "pass2"; // TEMPORARY FIX FOR LHC11a analysis
61841488 376 TObjArray *trecalpass=(TObjArray*)trecal->FindObject(passTmp);
377
3769e0cb 378 if(trecalpass)
379 {
b43bdd14 380 printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Time Recalibrate EMCAL \n");
f46af216 381 for (Int_t ibc = 0; ibc < 4; ++ibc)
3769e0cb 382 {
f46af216 383 TH1F *h = fRecoUtils->GetEMCALChannelTimeRecalibrationFactors(ibc);
384
385 if (h)
386 delete h;
387
388 h = (TH1F*)trecalpass->FindObject(Form("hAllTimeAvBC%d",ibc));
389
390 if (!h)
3769e0cb 391 {
f46af216 392 AliError(Form("Could not load hAllTimeAvBC%d",ibc));
393 continue;
394 }
395
396 h->SetDirectory(0);
397
398 fRecoUtils->SetEMCALChannelTimeRecalibrationFactors(ibc,h);
399 } // bunch crossing loop
17e1c80e 400 }else printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Do NOT recalibrate time EMCAL, no params for pass\n"); // array pass ok
401 }else printf("AliAnalysisTaskEMCALClusterize::SetOADBParameters() - Do NOT recalibrate time EMCAL, no params for run\n"); // run number array ok
3769e0cb 402
403 } // Time recalibration on
404
405 // Parameters already set once, so do not it again
406 fOADBSet = kTRUE;
407
408}
409
6544055e 410//_________________________________________________
411Bool_t AliAnalysisTaskEMCALClusterize::AccessOCDB()
412{
413 //Access to OCDB stuff
1f77507b 414
6544055e 415 fEvent = InputEvent();
416 if (!fEvent)
417 {
418 Warning("AccessOCDB","Event not available!!!");
419 return kFALSE;
1f77507b 420 }
1f77507b 421
6544055e 422 if (fEvent->GetRunNumber()==fRun)
423 return kTRUE;
424 fRun = fEvent->GetRunNumber();
1f77507b 425
6544055e 426 if(DebugLevel() > 1 )
596697e6 427 printf("AliAnalysisTaksEMCALClusterize::AccessOCDB() - Begin");
b43bdd14 428
6544055e 429 AliCDBManager *cdb = AliCDBManager::Instance();
1f77507b 430
1f77507b 431
b43bdd14 432 if (fOCDBpath.Length())
433 {
6544055e 434 cdb->SetDefaultStorage(fOCDBpath.Data());
435 printf("AliAnalysisTaksEMCALClusterize::AccessOCDB() - Default storage %s",fOCDBpath.Data());
436 }
437
438 cdb->SetRun(fEvent->GetRunNumber());
1f77507b 439
440 //
6544055e 441 // EMCAL from RAW OCDB
442 if (fOCDBpath.Contains("alien:"))
443 {
444 cdb->SetSpecificStorage("EMCAL/Calib/Data","alien://Folder=/alice/data/2010/OCDB");
445 cdb->SetSpecificStorage("EMCAL/Calib/Pedestals","alien://Folder=/alice/data/2010/OCDB");
446 }
1f77507b 447
6544055e 448 TString path = cdb->GetDefaultStorage()->GetBaseFolder();
1f77507b 449
6544055e 450 // init parameters:
1f77507b 451
6544055e 452 //Get calibration parameters
453 if(!fCalibData)
454 {
455 AliCDBEntry *entry = (AliCDBEntry*)
456 AliCDBManager::Instance()->Get("EMCAL/Calib/Data");
457
458 if (entry) fCalibData = (AliEMCALCalibData*) entry->GetObject();
1f77507b 459 }
6544055e 460
461 if(!fCalibData)
462 AliFatal("Calibration parameters not found in CDB!");
463
464 //Get calibration parameters
465 if(!fPedestalData)
466 {
467 AliCDBEntry *entry = (AliCDBEntry*)
468 AliCDBManager::Instance()->Get("EMCAL/Calib/Pedestals");
469
470 if (entry) fPedestalData = (AliCaloCalibPedestal*) entry->GetObject();
1f77507b 471 }
472
6544055e 473 if(!fPedestalData)
474 AliFatal("Dead map not found in CDB!");
1f77507b 475
6544055e 476 return kTRUE;
6fdd30c4 477}
478
9ac44255 479//_____________________________________________________
6544055e 480void AliAnalysisTaskEMCALClusterize::CheckAndGetEvent()
6fdd30c4 481{
6544055e 482 // Get the input event, it can depend in embedded events what you want to get
483 // Also check if the quality of the event is good if not reject it
484
485 fEvent = 0x0;
6a8be5c3 486
5aa88029 487 //Process events if there is a high energy cluster
488 if(!AcceptEventEMCAL()) return ;
489
220447cd 490 AliAODInputHandler* aodIH = dynamic_cast<AliAODInputHandler*>((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
491 Int_t eventN = Entry();
492 if(aodIH) eventN = aodIH->GetReadEntry();
493
6544055e 494 if (eventN > fMaxEvent)
495 return ;
f5036bcb 496
c50e6949 497 //printf("Clusterizer --- Event %d-- \n",eventN);
b43bdd14 498
6060ed91 499 //Check if input event are embedded events
500 //If so, take output event
3769e0cb 501 if (aodIH && aodIH->GetMergeEvents())
502 {
6544055e 503 fEvent = AODEvent();
1f77507b 504
505 if(!aodIH->GetMergeEMCALCells())
506 AliFatal("Events merged but not EMCAL cells, check analysis settings!");
507
3769e0cb 508 if(DebugLevel() > 1)
509 {
510 printf("AliAnalysisTaksEMCALClusterize::UserExec() - Use embedded events\n");
511
512 printf("\t InputEvent N Clusters %d, N Cells %d\n",InputEvent()->GetNumberOfCaloClusters(),
513 InputEvent()->GetEMCALCells()->GetNumberOfCells());
514
515 printf("\t MergedEvent N Clusters %d, N Cells %d\n",aodIH->GetEventToMerge()->GetNumberOfCaloClusters(),
516 aodIH->GetEventToMerge()->GetEMCALCells()->GetNumberOfCells());
517
518 for (Int_t icl=0; icl < aodIH->GetEventToMerge()->GetNumberOfCaloClusters(); icl++)
519 {
520 AliAODCaloCluster *sigCluster = aodIH->GetEventToMerge()->GetCaloCluster(icl);
521 if(sigCluster->IsEMCAL()) printf("\t \t Signal cluster: i %d, E %f\n",icl,sigCluster->E());
522 }
523
524 printf("\t OutputEvent N Clusters %d, N Cells %d\n", AODEvent()->GetNumberOfCaloClusters(),
525 AODEvent()->GetEMCALCells()->GetNumberOfCells());
6544055e 526 }
6060ed91 527 }
3769e0cb 528 else
529 {
6544055e 530 fEvent = InputEvent();
1f77507b 531 if(fFillAODCaloCells) FillAODCaloCells();
532 if(fFillAODHeader) FillAODHeader();
6060ed91 533 }
534
3769e0cb 535 if (!fEvent)
536 {
3fa4fb85 537 Error("UserExec","Event not available");
6544055e 538 return ;
6fdd30c4 539 }
6a8be5c3 540
cd2e4ce6 541 //-------------------------------------------------------------------------------------
6544055e 542 // Reject events if LED was firing, use only for LHC11a data
543 // Reject event if triggered by exotic cell and remove exotic cells if not triggered
cd2e4ce6 544 //-------------------------------------------------------------------------------------
6544055e 545
3769e0cb 546 if( IsLEDEvent( InputEvent()->GetRunNumber() ) ) { fEvent = 0x0 ; return ; }
6544055e 547
3769e0cb 548 if( IsExoticEvent() ) { fEvent = 0x0 ; return ; }
cd2e4ce6 549
6a797202 550 //-------------------------------------------------------------------------------------
551 // Set the cluster array in the event (output or input)
552 //-------------------------------------------------------------------------------------
553
554 if ( fFillAODFile )
555 {
556 //Magic line to write events to AOD filem put after event rejection
557 AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kTRUE);
558 }
559 else if( !fOutputAODBranchSet )
560 {
561 // Create array and put it in the input event, if output AOD not selected, only once
562 InputEvent()->AddObject(fOutputAODBranch);
563 fOutputAODBranchSet = kTRUE;
564 printf("AliAnalysisTaskEMCALClusterize::UserExec() - Add AOD branch <%s> to input event\n",fOutputAODBranchName.Data());
565 }
6544055e 566
567}
568
569//____________________________________________________
570void AliAnalysisTaskEMCALClusterize::ClusterizeCells()
571{
572 // Recluster calocells, transform them into digits,
573 // feed the clusterizer with them and get new list of clusters
574
575 //In case of MC, first loop on the clusters and fill MC label to array
576 Int_t nClusters = fEvent->GetNumberOfCaloClusters();
577 Int_t nClustersOrg = 0;
b43bdd14 578
6544055e 579 AliAODInputHandler* aodIH = dynamic_cast<AliAODInputHandler*>((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
580 if(aodIH && aodIH->GetEventToMerge()) //Embedding
581 nClusters = aodIH->GetEventToMerge()->GetNumberOfCaloClusters(); //Get clusters directly from embedded signal
6edb4448 582
583 ResetArrays();
584
6544055e 585 for (Int_t i = 0; i < nClusters; i++)
586 {
587 AliVCluster *clus = 0;
588 if(aodIH && aodIH->GetEventToMerge()) //Embedding
589 clus = aodIH->GetEventToMerge()->GetCaloCluster(i); //Get clusters directly from embedded signal
590 else
591 clus = fEvent->GetCaloCluster(i);
5994e71f 592
6544055e 593 if(!clus) return;
6a8be5c3 594
f46af216 595 if(clus->IsEMCAL())
6edb4448 596 {
6544055e 597 Int_t label = clus->GetLabel();
598 Int_t label2 = -1 ;
6edb4448 599 //printf("Org cluster E %f, Time %e, Index = %d, ID %d, MC label %d\n", clus->E(), clus->GetTOF(),i, clus->GetID(),label );
e59a6a2e 600 //printf("Original list of labels from old cluster : \n");
6edb4448 601 //for(Int_t imc = 0; imc < clus->GetNLabels(); imc++) printf("\t Label %d\n",clus->GetLabelAt(imc));
e59a6a2e 602
6544055e 603 if (clus->GetNLabels()>=2) label2 = clus->GetLabelAt(1) ;
604 UShort_t * index = clus->GetCellsAbsId() ;
f46af216 605 for(Int_t icell=0; icell < clus->GetNCells(); icell++ )
606 {
6edb4448 607 //printf("\t cell %d, MC label %d\n",index[icell],fEvent->GetEMCALCells()->GetCellMCLabel(index[icell]));
608 fOrgClusterCellId[index[icell]] = i;
6544055e 609 fCellLabels[index[icell]] = label;
610 fCellSecondLabels[index[icell]] = label2;
6edb4448 611 fCellTime[index[icell]] = clus->GetTOF();
73a4ed8f 612 fCellMatchdEta[index[icell]] = clus->GetTrackDz();
613 fCellMatchdPhi[index[icell]] = clus->GetTrackDx();
614 //printf(" %d,", index[icell] );
6fdd30c4 615 }
6544055e 616 nClustersOrg++;
6fdd30c4 617 }
b43bdd14 618 // printf("\n");
6544055e 619 }
620
621 // Transform CaloCells into Digits
b43bdd14 622
6544055e 623 Int_t idigit = 0;
624 Int_t id = -1;
625 Float_t amp = -1;
626 Double_t time = -1;
627
6edb4448 628 AliVCaloCells *cells = fEvent->GetEMCALCells();
b43bdd14 629
a7e5a381 630 Int_t bc = InputEvent()->GetBunchCrossNumber();
6544055e 631 for (Int_t icell = 0; icell < cells->GetNumberOfCells(); icell++)
632 {
6544055e 633 // Get cell values, recalibrate and not include bad channels found in analysis, nor cells with too low energy, nor exotic cell
634 id = cells->GetCellNumber(icell);
a7e5a381 635 Bool_t accept = fRecoUtils->AcceptCalibrateCell(id,bc,amp,time,cells);
636
1e0ff9d3 637 // Do not include cells with too low energy, nor exotic cell
d95102d2 638 if( amp < fRecParam->GetMinECut() ||
639 time > fRecParam->GetTimeMax() ||
640 time < fRecParam->GetTimeMin() ) accept = kFALSE;
1e0ff9d3 641
642 // In case of old AOD analysis cell time is -1 s, approximate replacing by time of the cluster the digit belongs.
643 if (fRecalibrateWithClusterTime)
644 {
645 time = fCellTime[id];
646 //printf("cell %d time org %f - ",id, time*1.e9);
647 fRecoUtils->RecalibrateCellTime(id,bc,time);
648 //printf("recal %f\n",time*1.e9);
649 }
a7e5a381 650
d95102d2 651 //Exotic?
652 if (accept && fRecoUtils->IsExoticCell(id,cells,bc))
653 accept = kFALSE;
b43bdd14 654
f46af216 655 if( !accept )
656 {
f46af216 657 if( DebugLevel() > 2 )
658 printf("AliAnalysisTaksEMCALClusterize::ClusterizeCells() - Remove channel absId %d, index %d of %d, amp %f, time %f\n",
b43bdd14 659 id,icell, cells->GetNumberOfCells(), amp, time*1.e9);
6544055e 660 continue;
661 }
b43bdd14 662
bdd50327 663 Int_t mcLabel = cells->GetMCLabel(icell);
e59a6a2e 664 //printf("AliAnalysisTaksEMCALClusterize::ClusterizeCells() - cell %d, mc label %d\n",id,mcLabel);
6edb4448 665
bdd50327 666 //if(fCellLabels[id]!=mcLabel)printf("mcLabel %d - %d\n",mcLabel,fCellLabels[id]);
6edb4448 667 if ( fSetCellMCLabelFromCluster == 1 ) mcLabel = fCellLabels[id]; // Older aliroot MC productions
668 else if( fSetCellMCLabelFromCluster == 0 && fRemapMCLabelForAODs) RemapMCLabelForAODs(mcLabel);
e59a6a2e 669 else mcLabel = -1; // found later
670
671 //printf("\t new label %d\n",mcLabel);
bdd50327 672
673 // Create the digit, put a fake primary deposited energy to trick the clusterizer
674 // when checking the most likely primary
6edb4448 675
e59a6a2e 676 new((*fDigitsArr)[idigit]) AliEMCALDigit( mcLabel, mcLabel, id, amp, time,AliEMCALDigit::kHG,idigit, 0, 0, amp);
677 // Last parameter should be MC deposited energy, since it is not available, add just the cell amplitude so that
678 // we give more weight to the MC label of the cell with highest energy in the cluster
6edb4448 679
6544055e 680 idigit++;
681 }
6a8be5c3 682
04fcfa08 683 fDigitsArr->Sort();
b43bdd14 684
6544055e 685 //-------------------------------------------------------------------------------------
686 //Do the clusterization
687 //-------------------------------------------------------------------------------------
b43bdd14 688
6544055e 689 fClusterizer->Digits2Clusters("");
690
691 //-------------------------------------------------------------------------------------
692 //Transform the recpoints into AliVClusters
693 //-------------------------------------------------------------------------------------
694
b43bdd14 695 RecPoints2Clusters();
6544055e 696
3769e0cb 697 if(!fCaloClusterArr)
698 {
6544055e 699 printf("AliAnalysisTaksEMCALClusterize::UserExec() - No array with CaloClusters, input RecPoints entries %d\n",fClusterArr->GetEntriesFast());
700 return;
701 }
702
3769e0cb 703 if( DebugLevel() > 0 )
704 {
6544055e 705 printf("AliAnalysisTaksEMCALClusterize::ClusterizeCells() - N clusters: before recluster %d, after recluster %d\n",nClustersOrg, fCaloClusterArr->GetEntriesFast());
b43bdd14 706
707 if(fCaloClusterArr->GetEntriesFast() != fClusterArr->GetEntriesFast())
708 {
6544055e 709 printf("\t Some RecRoints not transformed into CaloClusters (clusterizer %d, unfold %d): Input entries %d - Output entries %d - %d (not fast)\n",
710 fRecParam->GetClusterizerFlag(),fRecParam->GetUnfold(),
711 fClusterArr->GetEntriesFast(), fCaloClusterArr->GetEntriesFast(), fCaloClusterArr->GetEntries());
712 }
713 }
6544055e 714}
a39f5b70 715
73a4ed8f 716//_____________________________________________________
6544055e 717void AliAnalysisTaskEMCALClusterize::ClusterUnfolding()
718{
719 // Take the event clusters and unfold them
720
721 AliVCaloCells *cells = fEvent->GetEMCALCells();
722 Double_t cellAmplitude = 0;
723 Double_t cellTime = 0;
724 Short_t cellNumber = 0;
60d77596 725 Int_t cellMCLabel = 0;
77e93dc2 726 Double_t cellEFrac = 0;
6544055e 727 Int_t nClustersOrg = 0;
728
729 // Fill the array with the EMCAL clusters, copy them
730 for (Int_t i = 0; i < fEvent->GetNumberOfCaloClusters(); i++)
731 {
732 AliVCluster *clus = fEvent->GetCaloCluster(i);
b43bdd14 733 if(clus->IsEMCAL())
734 {
6544055e 735 //recalibrate/remove bad channels/etc if requested
b43bdd14 736 if(fRecoUtils->ClusterContainsBadChannel(fGeom,clus->GetCellsAbsId(), clus->GetNCells()))
737 {
5994e71f 738 continue;
6544055e 739 }
3bfc4732 740
b43bdd14 741 if(fRecoUtils->IsRecalibrationOn())
742 {
6544055e 743 //Calibrate cluster
744 fRecoUtils->RecalibrateClusterEnergy(fGeom, clus, cells);
745
746 //CalibrateCells
747 for (Int_t icell = 0; icell < cells->GetNumberOfCells(); icell++)
748 {
77e93dc2 749 if (cells->GetCell(icell, cellNumber, cellAmplitude, cellTime, cellMCLabel, cellEFrac) != kTRUE)
6544055e 750 break;
751
752 Int_t imod = -1, iphi =-1, ieta=-1,iTower = -1, iIphi = -1, iIeta = -1;
753 fGeom->GetCellIndex(cellNumber,imod,iTower,iIphi,iIeta);
754 fGeom->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi, iIeta,iphi,ieta);
755
756 //Do not include bad channels found in analysis?
757 if( fRecoUtils->IsBadChannelsRemovalSwitchedOn() &&
6edb4448 758 fRecoUtils->GetEMCALChannelStatus(imod, ieta, iphi))
6544055e 759 continue;
6544055e 760
761 cells->SetCell(icell, cellNumber, cellAmplitude*fRecoUtils->GetEMCALChannelRecalibrationFactor(imod,ieta,iphi),cellTime);
762
763 }// cells loop
764 }// recalibrate
5994e71f 765
6544055e 766 //Cast to ESD or AOD, needed to create the cluster array
767 AliESDCaloCluster * esdCluster = dynamic_cast<AliESDCaloCluster*> (clus);
768 AliAODCaloCluster * aodCluster = dynamic_cast<AliAODCaloCluster*> (clus);
b43bdd14 769
770 if (esdCluster)
771 {
6544055e 772 fCaloClusterArr->Add( new AliESDCaloCluster(*esdCluster) );
773 }//ESD
b43bdd14 774 else if(aodCluster)
775 {
6544055e 776 fCaloClusterArr->Add( new AliAODCaloCluster(*aodCluster) );
777 }//AOD
778 else
779 Warning("UserExec()"," - Wrong CaloCluster type?");
b43bdd14 780
6544055e 781 nClustersOrg++;
6a8be5c3 782 }
6fdd30c4 783 }
784
6544055e 785 //Do the unfolding
786 fUnfolder->UnfoldClusters(fCaloClusterArr, cells);
6a8be5c3 787
6544055e 788 //CLEAN-UP
789 fUnfolder->Clear();
385b7abf 790
6544055e 791}
792
793//_____________________________________________________
794void AliAnalysisTaskEMCALClusterize::FillAODCaloCells()
795{
796 // Put calo cells in standard branch
797 AliVCaloCells &eventEMcells = *(fEvent->GetEMCALCells());
798 Int_t nEMcell = eventEMcells.GetNumberOfCells() ;
6fdd30c4 799
6544055e 800 AliAODCaloCells &aodEMcells = *(AODEvent()->GetEMCALCells());
801 aodEMcells.CreateContainer(nEMcell);
802 aodEMcells.SetType(AliVCaloCells::kEMCALCell);
803 Double_t calibFactor = 1.;
b43bdd14 804 for (Int_t iCell = 0; iCell < nEMcell; iCell++)
805 {
6544055e 806 Int_t imod = -1, iphi =-1, ieta=-1,iTower = -1, iIphi = -1, iIeta = -1;
807 fGeom->GetCellIndex(eventEMcells.GetCellNumber(iCell),imod,iTower,iIphi,iIeta);
808 fGeom->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi, iIeta,iphi,ieta);
385b7abf 809
b43bdd14 810 if(fRecoUtils->IsRecalibrationOn())
811 {
6544055e 812 calibFactor = fRecoUtils->GetEMCALChannelRecalibrationFactor(imod,ieta,iphi);
385b7abf 813 }
0821ba9f 814
b43bdd14 815 if(!fRecoUtils->GetEMCALChannelStatus(imod, ieta, iphi))
816 { //Channel is not declared as bad
77e93dc2 817 aodEMcells.SetCell(iCell,eventEMcells.GetCellNumber(iCell),eventEMcells.GetAmplitude(iCell)*calibFactor,
818 eventEMcells.GetTime(iCell),eventEMcells.GetMCLabel(iCell),eventEMcells.GetEFraction(iCell));
6544055e 819 }
b43bdd14 820 else
821 {
77e93dc2 822 aodEMcells.SetCell(iCell,eventEMcells.GetCellNumber(iCell),0,-1,-1,0);
5994e71f 823 }
6fdd30c4 824 }
6544055e 825 aodEMcells.Sort();
6fdd30c4 826
6544055e 827}
6fdd30c4 828
6544055e 829//__________________________________________________
830void AliAnalysisTaskEMCALClusterize::FillAODHeader()
6fdd30c4 831{
6544055e 832 //Put event header information in standard AOD branch
e9dd2d80 833
6544055e 834 AliESDEvent* esdevent = dynamic_cast<AliESDEvent*> (fEvent);
835 AliAODEvent* aodevent = dynamic_cast<AliAODEvent*> (fEvent);
e9dd2d80 836
6544055e 837 Double_t pos[3] ;
838 Double_t covVtx[6];
839 for (Int_t i = 0; i < 6; i++) covVtx[i] = 0.;
840
841 AliAODHeader* header = AODEvent()->GetHeader();
842 header->SetRunNumber(fEvent->GetRunNumber());
843
b43bdd14 844 if(esdevent)
845 {
6544055e 846 TTree* tree = fInputHandler->GetTree();
b43bdd14 847 if (tree)
848 {
6544055e 849 TFile* file = tree->GetCurrentFile();
850 if (file) header->SetESDFileName(file->GetName());
851 }
852 }
853 else if (aodevent) header->SetESDFileName(aodevent->GetHeader()->GetESDFileName());
e9dd2d80 854
6544055e 855 header->SetBunchCrossNumber(fEvent->GetBunchCrossNumber());
856 header->SetOrbitNumber(fEvent->GetOrbitNumber());
857 header->SetPeriodNumber(fEvent->GetPeriodNumber());
858 header->SetEventType(fEvent->GetEventType());
385b7abf 859
6544055e 860 //Centrality
b43bdd14 861 if(fEvent->GetCentrality())
6544055e 862 header->SetCentrality(new AliCentrality(*(fEvent->GetCentrality())));
b43bdd14 863 else
6544055e 864 header->SetCentrality(0);
385b7abf 865
6544055e 866 //Trigger
867 header->SetOfflineTrigger(fInputHandler->IsEventSelected()); // propagate the decision of the physics selection
868 if (esdevent) header->SetFiredTriggerClasses(esdevent->GetFiredTriggerClasses());
869 else if (aodevent) header->SetFiredTriggerClasses(aodevent->GetFiredTriggerClasses());
b43bdd14 870
6544055e 871 header->SetTriggerMask(fEvent->GetTriggerMask());
872 header->SetTriggerCluster(fEvent->GetTriggerCluster());
b43bdd14 873
874 if (esdevent)
875 {
6544055e 876 header->SetL0TriggerInputs(esdevent->GetHeader()->GetL0TriggerInputs());
877 header->SetL1TriggerInputs(esdevent->GetHeader()->GetL1TriggerInputs());
878 header->SetL2TriggerInputs(esdevent->GetHeader()->GetL2TriggerInputs());
879 }
b43bdd14 880 else if (aodevent)
881 {
6544055e 882 header->SetL0TriggerInputs(aodevent->GetHeader()->GetL0TriggerInputs());
883 header->SetL1TriggerInputs(aodevent->GetHeader()->GetL1TriggerInputs());
884 header->SetL2TriggerInputs(aodevent->GetHeader()->GetL2TriggerInputs());
885 }
e9dd2d80 886
6544055e 887 header->SetMagneticField(fEvent->GetMagneticField());
888 //header->SetMuonMagFieldScale(esdevent->GetCurrentDip()/6000.);
e9dd2d80 889
6544055e 890 header->SetZDCN1Energy(fEvent->GetZDCN1Energy());
891 header->SetZDCP1Energy(fEvent->GetZDCP1Energy());
892 header->SetZDCN2Energy(fEvent->GetZDCN2Energy());
893 header->SetZDCP2Energy(fEvent->GetZDCP2Energy());
894 header->SetZDCEMEnergy(fEvent->GetZDCEMEnergy(0),fEvent->GetZDCEMEnergy(1));
385b7abf 895
6544055e 896 Float_t diamxy[2]={fEvent->GetDiamondX(),fEvent->GetDiamondY()};
897 Float_t diamcov[3];
898 fEvent->GetDiamondCovXY(diamcov);
899 header->SetDiamond(diamxy,diamcov);
900 if (esdevent) header->SetDiamondZ(esdevent->GetDiamondZ(),esdevent->GetSigma2DiamondZ());
901 else if (aodevent) header->SetDiamondZ(aodevent->GetDiamondZ(),aodevent->GetSigma2DiamondZ());
e9dd2d80 902
6544055e 903 //
904 Int_t nVertices = 1 ;/* = prim. vtx*/;
905 Int_t nCaloClus = fEvent->GetNumberOfCaloClusters();
e9dd2d80 906
6544055e 907 AODEvent()->ResetStd(0, nVertices, 0, 0, 0, nCaloClus, 0, 0);
385b7abf 908
6544055e 909 // Access to the AOD container of vertices
910 TClonesArray &vertices = *(AODEvent()->GetVertices());
911 Int_t jVertices=0;
385b7abf 912
6544055e 913 // Add primary vertex. The primary tracks will be defined
914 // after the loops on the composite objects (V0, cascades, kinks)
915 fEvent->GetPrimaryVertex()->GetXYZ(pos);
916 Float_t chi = 0;
b43bdd14 917 if (esdevent)
918 {
6544055e 919 esdevent->GetPrimaryVertex()->GetCovMatrix(covVtx);
920 chi = esdevent->GetPrimaryVertex()->GetChi2toNDF();
921 }
b43bdd14 922 else if (aodevent)
923 {
6544055e 924 aodevent->GetPrimaryVertex()->GetCovMatrix(covVtx);
925 chi = aodevent->GetPrimaryVertex()->GetChi2perNDF();//Different from ESD?
6fdd30c4 926 }
bd9e8ebd 927
6544055e 928 AliAODVertex * primary = new(vertices[jVertices++])
929 AliAODVertex(pos, covVtx, chi, NULL, -1, AliAODVertex::kPrimary);
930 primary->SetName(fEvent->GetPrimaryVertex()->GetName());
931 primary->SetTitle(fEvent->GetPrimaryVertex()->GetTitle());
e9dd2d80 932
6544055e 933}
934
afc22931 935//___________________________________________________________
936void AliAnalysisTaskEMCALClusterize::FillCaloClusterInEvent()
b43bdd14 937{
938 // Get the CaloClusters array, do some final calculations
afc22931 939 // and put the clusters in the output or input event
940 // as a separate branch
b43bdd14 941
942 //First recalculate track-matching for the new clusters
943 if(fDoTrackMatching)
944 {
945 fRecoUtils->FindMatches(fEvent,fCaloClusterArr,fGeom);
946 }
947 //Put the new clusters in the AOD list
948
949 Int_t kNumberOfCaloClusters = fCaloClusterArr->GetEntriesFast();
596697e6 950
b43bdd14 951 for(Int_t i = 0; i < kNumberOfCaloClusters; i++)
952 {
953 AliAODCaloCluster *newCluster = (AliAODCaloCluster *) fCaloClusterArr->At(i);
954
955 newCluster->SetID(i);
956
afc22931 957 // Correct cluster energy non linearity
958 newCluster->SetE(fRecoUtils->CorrectClusterEnergyLinearity(newCluster));
959
b43bdd14 960 //Add matched track
961 if(fDoTrackMatching)
962 {
963 Int_t trackIndex = fRecoUtils->GetMatchedTrackIndex(i);
964 if(trackIndex >= 0)
965 {
966 newCluster->AddTrackMatched(fEvent->GetTrack(trackIndex));
967 if(DebugLevel() > 1)
968 printf("AliAnalysisTaksEMCALClusterize::UserExec() - Matched Track index %d to new cluster %d \n",trackIndex,i);
969 }
970
971 Float_t dR = 999., dZ = 999.;
972 fRecoUtils->GetMatchedResiduals(newCluster->GetID(),dR,dZ);
973 newCluster->SetTrackDistance(dR,dZ);
974
975 }
976 else
977 {// Assign previously assigned matched track in reco, very very rough
978 Int_t absId0 = newCluster->GetCellsAbsId()[0]; // Assign match of first cell in cluster
979 newCluster->SetTrackDistance(fCellMatchdPhi[absId0],fCellMatchdEta[absId0]);
980 }
1e0ff9d3 981
982 //printf("New cluster E %f, Time %e, Id = ", newCluster->E(), newCluster->GetTOF() );
983 //for(Int_t icell=0; icell < newCluster->GetNCells(); icell++ ) printf(" %d,", newCluster->GetCellsAbsId() [icell] );
984 //printf("\n");
985
b43bdd14 986 // Calculate distance to bad channel for new cluster. Make sure you give the list of bad channels.
987 fRecoUtils->RecalculateClusterDistanceToBadChannel(fGeom, fEvent->GetEMCALCells(), newCluster);
988
989 new((*fOutputAODBranch)[i]) AliAODCaloCluster(*newCluster);
990
991 if(DebugLevel() > 1 )
992 printf("AliAnalysisTaksEMCALClusterize::UserExec() - New cluster %d of %d, energy %f\n",newCluster->GetID(), kNumberOfCaloClusters, newCluster->E());
993
994 } // cluster loop
995
996 fOutputAODBranch->Expand(kNumberOfCaloClusters); // resize TObjArray to 'remove' slots
997
b43bdd14 998
999}
1000
3769e0cb 1001//_______________________________________________
1002TString AliAnalysisTaskEMCALClusterize::GetPass()
1003{
1004 // Get passx from filename.
1005
1006 if (!AliAnalysisManager::GetAnalysisManager()->GetTree())
1007 {
1008 AliError("AliAnalysisTaskEMCALClusterize::GetPass() - Pointer to tree = 0, returning null\n");
1009 return TString("");
1010 }
1011
1012 if (!AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile())
1013 {
1014 AliError("AliAnalysisTaskEMCALClusterize::GetPass() - Null pointer input file, returning null\n");
1015 return TString("");
1016 }
1017
1018 TString pass(AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile()->GetName());
1019 if (pass.Contains("ass1")) return TString("pass1");
1020 else if (pass.Contains("ass2")) return TString("pass2");
1021 else if (pass.Contains("ass3")) return TString("pass3");
61841488 1022 else if (pass.Contains("ass4")) return TString("pass4");
1023 else if (pass.Contains("ass5")) return TString("pass5");
3769e0cb 1024
1025 // No condition fullfilled, give a default value
1026 printf("AliAnalysisTaskEMCALClusterize::GetPass() - Pass number string not found \n");
1027 return TString("");
1028
1029}
1030
6544055e 1031//_________________________________________
1032void AliAnalysisTaskEMCALClusterize::Init()
1033{
1034 //Init analysis with configuration macro if available
1035
3769e0cb 1036 fOADBSet = kFALSE;
1037 if(fOADBFilePath == "") fOADBFilePath = "$ALICE_ROOT/OADB/EMCAL" ;
1038
3769e0cb 1039 fBranchNames = "ESD:AliESDHeader.,EMCALCells.";
1040
1041 if(!fRecParam) fRecParam = new AliEMCALRecParam;
1042 if(!fRecoUtils) fRecoUtils = new AliEMCALRecoUtils();
1043
1044 if(fMaxEvent <= 0) fMaxEvent = 1000000000;
1045 if(fSelectCellMinE <= 0) fSelectCellMinE = 0.005;
1046 if(fSelectCellMinFrac <= 0) fSelectCellMinFrac = 0.001;
1047
cb68426a 1048 //Centrality
1049 if(fCentralityClass == "") fCentralityClass = "V0M";
cb68426a 1050
3769e0cb 1051 if (fOCDBpath == "") fOCDBpath = "raw://" ;
1052 if (fOutputAODBranchName == "") fOutputAODBranchName = "newEMCALClusters" ;
1053
1054 if(gROOT->LoadMacro(fConfigName) >=0)
1055 {
6544055e 1056 printf("AliAnalysisTaksEMCALClusterize::Init() - Configure analysis with %s\n",fConfigName.Data());
1057 AliAnalysisTaskEMCALClusterize *clus = (AliAnalysisTaskEMCALClusterize*)gInterpreter->ProcessLine("ConfigEMCALClusterize()");
1058 fGeomName = clus->fGeomName;
1059 fLoadGeomMatrices = clus->fLoadGeomMatrices;
1060 fOCDBpath = clus->fOCDBpath;
1061 fAccessOCDB = clus->fAccessOCDB;
1062 fRecParam = clus->fRecParam;
1063 fJustUnfold = clus->fJustUnfold;
1064 fFillAODFile = clus->fFillAODFile;
1065 fRecoUtils = clus->fRecoUtils;
1066 fConfigName = clus->fConfigName;
1067 fMaxEvent = clus->fMaxEvent;
1068 fDoTrackMatching = clus->fDoTrackMatching;
1069 fOutputAODBranchName = clus->fOutputAODBranchName;
e3990982 1070 for(Int_t i = 0; i < 12; i++) fGeomMatrix[i] = clus->fGeomMatrix[i] ;
cb68426a 1071 fCentralityClass = clus->fCentralityClass;
1072 fCentralityBin[0] = clus->fCentralityBin[0];
1073 fCentralityBin[1] = clus->fCentralityBin[1];
6fdd30c4 1074 }
e9dd2d80 1075
9ac44255 1076 // Init geometry, I do not like much to do it like this ...
3769e0cb 1077 if(fImportGeometryFromFile && !gGeoManager)
1078 {
d86974bb 1079 if (fImportGeometryFilePath == "") fImportGeometryFilePath = "$ALICE_ROOT/OADB/EMCAL/geometry_2011.root" ; // "$ALICE_ROOT/EVE/alice-data/default_geo.root"
3769e0cb 1080 printf("AliAnalysisTaskEMCALClusterize::Init() - Import %s\n",fImportGeometryFilePath.Data());
1081 TGeoManager::Import(fImportGeometryFilePath) ;
9ac44255 1082 }
b43bdd14 1083
6544055e 1084}
6fdd30c4 1085
6544055e 1086//_______________________________________________________
6fdd30c4 1087void AliAnalysisTaskEMCALClusterize::InitClusterization()
1088{
1089 //Select clusterization/unfolding algorithm and set all the needed parameters
1090
04fcfa08 1091 if (fJustUnfold)
1092 {
bd9e8ebd 1093 // init the unfolding afterburner
1094 delete fUnfolder;
1759f743 1095 fUnfolder = new AliEMCALAfterBurnerUF(fRecParam->GetW0(),fRecParam->GetLocMaxCut(),fRecParam->GetMinECut());
bd9e8ebd 1096 return;
6a8be5c3 1097 }
1098
bd9e8ebd 1099 //First init the clusterizer
1100 delete fClusterizer;
1101 if (fRecParam->GetClusterizerFlag() == AliEMCALRecParam::kClusterizerv1)
1102 fClusterizer = new AliEMCALClusterizerv1 (fGeom, fCalibData, fPedestalData);
cfcbe5d2 1103 else if(fRecParam->GetClusterizerFlag() == AliEMCALRecParam::kClusterizerv2)
1104 fClusterizer = new AliEMCALClusterizerv2(fGeom, fCalibData, fPedestalData);
b43bdd14 1105 else if(fRecParam->GetClusterizerFlag() == AliEMCALRecParam::kClusterizerNxN)
1106 {
bd9e8ebd 1107 fClusterizer = new AliEMCALClusterizerNxN(fGeom, fCalibData, fPedestalData);
212ac797 1108 fClusterizer->SetNRowDiff(fRecParam->GetNRowDiff());
1109 fClusterizer->SetNColDiff(fRecParam->GetNColDiff());
04fcfa08 1110 }
1111 else
1112 {
bd9e8ebd 1113 AliFatal(Form("Clusterizer < %d > not available", fRecParam->GetClusterizerFlag()));
1114 }
6a8be5c3 1115
bd9e8ebd 1116 //Now set the parameters
1117 fClusterizer->SetECAClusteringThreshold( fRecParam->GetClusteringThreshold() );
1118 fClusterizer->SetECALogWeight ( fRecParam->GetW0() );
1119 fClusterizer->SetMinECut ( fRecParam->GetMinECut() );
1120 fClusterizer->SetUnfolding ( fRecParam->GetUnfold() );
1121 fClusterizer->SetECALocalMaxCut ( fRecParam->GetLocMaxCut() );
1122 fClusterizer->SetTimeCut ( fRecParam->GetTimeCut() );
1123 fClusterizer->SetTimeMin ( fRecParam->GetTimeMin() );
1124 fClusterizer->SetTimeMax ( fRecParam->GetTimeMax() );
1125 fClusterizer->SetInputCalibrated ( kTRUE );
2af35150 1126 fClusterizer->SetJustClusters ( kTRUE );
04fcfa08 1127
1128 // Initialize the cluster rec points and digits arrays and get them.
1129 fClusterizer->SetOutput(0);
1130 fClusterArr = const_cast<TObjArray *>(fClusterizer->GetRecPoints());
1131 fDigitsArr = fClusterizer->GetDigits();
1132
bd9e8ebd 1133 //In case of unfolding after clusterization is requested, set the corresponding parameters
04fcfa08 1134 if(fRecParam->GetUnfold())
1135 {
bd9e8ebd 1136 Int_t i=0;
04fcfa08 1137 for (i = 0; i < 8; i++)
1138 {
bd9e8ebd 1139 fClusterizer->SetSSPars(i, fRecParam->GetSSPars(i));
1140 }//end of loop over parameters
04fcfa08 1141
1142 for (i = 0; i < 3; i++)
1143 {
bd9e8ebd 1144 fClusterizer->SetPar5 (i, fRecParam->GetPar5(i));
1145 fClusterizer->SetPar6 (i, fRecParam->GetPar6(i));
1146 }//end of loop over parameters
6fdd30c4 1147
bd9e8ebd 1148 fClusterizer->InitClusterUnfolding();
6544055e 1149
bd9e8ebd 1150 }// to unfold
6fdd30c4 1151}
3fa4fb85 1152
6544055e 1153//_________________________________________________
1154void AliAnalysisTaskEMCALClusterize::InitGeometry()
1155{
3769e0cb 1156 // Init geometry and set the geometry matrix, for the first event, skip the rest
6544055e 1157 // Also set once the run dependent calibrations
1158
3769e0cb 1159 if(fGeomMatrixSet) return;
1160
1161 Int_t runnumber = InputEvent()->GetRunNumber() ;
1162 if (!fGeom)
1163 {
1164 if(fGeomName=="")
1165 {
1166 if (runnumber < 140000) fGeomName = "EMCAL_FIRSTYEARV1";
1167 else if(runnumber < 171000) fGeomName = "EMCAL_COMPLETEV1";
1168 else fGeomName = "EMCAL_COMPLETE12SMV1";
1169 printf("AliAnalysisTaskEMCALClusterize::InitGeometry() - Set EMCAL geometry name to <%s> for run %d\n",fGeomName.Data(),runnumber);
1170 }
6544055e 1171
3769e0cb 1172 fGeom = AliEMCALGeometry::GetInstance(fGeomName);
6544055e 1173
3769e0cb 1174 if(fDebug > 0)
1175 {
1176 printf("AliAnalysisTaskEMCALClusterize::InitGeometry(run=%d)",runnumber);
1177 if (!gGeoManager) printf(" - Careful!, gGeoManager not loaded, load misalign matrices");
1178 printf("\n");
1179 }
1180 } // geometry pointer did not exist before
1181
1182 if(fLoadGeomMatrices)
1183 {
1184 printf("AliAnalysisTaskEMCALClusterize::InitGeometry() - Load user defined EMCAL geometry matrices\n");
1185
1186 // OADB if available
1187 AliOADBContainer emcGeoMat("AliEMCALgeo");
1188 emcGeoMat.InitFromFile(Form("%s/EMCALlocal2master.root",fOADBFilePath.Data()),"AliEMCALgeo");
1189 TObjArray *matEMCAL=(TObjArray*)emcGeoMat.GetObject(runnumber,"EmcalMatrices");
1190
1191
1192 for(Int_t mod=0; mod < (fGeom->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
1193 {
1194
1195 if (!fGeomMatrix[mod]) // Get it from OADB
1196 {
1197 if(fDebug > 1 )
1198 printf("AliAnalysisTaskEMCALClusterize::InitGeometry() - EMCAL matrices SM %d, %p\n",
1199 mod,((TGeoHMatrix*) matEMCAL->At(mod)));
1200 //((TGeoHMatrix*) matEMCAL->At(mod))->Print();
1201
1202 fGeomMatrix[mod] = (TGeoHMatrix*) matEMCAL->At(mod) ;
1203 }
1204
1205 if(fGeomMatrix[mod])
1206 {
1207 if(DebugLevel() > 1)
1208 fGeomMatrix[mod]->Print();
1209
1210 fGeom->SetMisalMatrix(fGeomMatrix[mod],mod) ;
1211 }
1212
1213 fGeomMatrixSet=kTRUE;
1214
1215 }//SM loop
1216 }//Load matrices
1217 else if(!gGeoManager)
1218 {
1219 printf("AliAnalysisTaksEMCALClusterize::InitGeometry() - Get geo matrices from data");
1220 //Still not implemented in AOD, just a workaround to be able to work at least with ESDs
1221 if(!strcmp(fEvent->GetName(),"AliAODEvent"))
1222 {
1223 if(DebugLevel() > 1)
1224 Warning("UserExec","Use ideal geometry, values geometry matrix not kept in AODs.");
1225 }//AOD
1226 else
1227 {
1228 if(DebugLevel() > 1)
1229 printf("AliAnalysisTaksEMCALClusterize::InitGeometry() - AliAnalysisTaskEMCALClusterize Load Misaligned matrices.");
1230
1231 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(fEvent) ;
1232
1233 if(!esd)
1234 {
1235 Error("InitGeometry"," - This event does not contain ESDs?");
6a797202 1236 if(fFillAODFile) AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kFALSE);
3769e0cb 1237 return;
1238 }
1239
1240 for(Int_t mod=0; mod < (fGeom->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
1241 {
1242 if(DebugLevel() > 1)
1243 esd->GetEMCALMatrix(mod)->Print();
1244
1245 if(esd->GetEMCALMatrix(mod)) fGeom->SetMisalMatrix(esd->GetEMCALMatrix(mod),mod) ;
1246
1247 }
1248
1249 fGeomMatrixSet=kTRUE;
1250
1251 }//ESD
1252 }//Load matrices from Data
1253
6544055e 1254}
1255
6544055e 1256//____________________________________________________
1257Bool_t AliAnalysisTaskEMCALClusterize::IsExoticEvent()
1258{
1259
1260 // Check if event is exotic, get an exotic cell and compare with triggered patch
1261 // If there is a match remove event ... to be completed, filled with something provisional
1262
1263 if(!fRemoveExoticEvents) return kFALSE;
1264
1265 // Loop on cells
1266 AliVCaloCells * cells = fEvent->GetEMCALCells();
1267 Float_t totCellE = 0;
a7e5a381 1268 Int_t bc = InputEvent()->GetBunchCrossNumber();
b43bdd14 1269 for(Int_t icell = 0; icell < cells->GetNumberOfCells(); icell++)
1270 {
6544055e 1271
1272 Float_t ecell = 0 ;
1273 Double_t tcell = 0 ;
1274
1275 Int_t absID = cells->GetCellNumber(icell);
a7e5a381 1276 Bool_t accept = fRecoUtils->AcceptCalibrateCell(absID,bc,ecell,tcell,cells);
1277 if(accept && !fRecoUtils->IsExoticCell(absID,cells,bc)) totCellE += ecell;
6544055e 1278 }
1279
1280 // TString triggerclasses = "";
1281 // if(esdevent) triggerclasses = esdevent ->GetFiredTriggerClasses();
1282 // else triggerclasses = ((AliAODEvent*)event)->GetFiredTriggerClasses();
1283 // //
1284 // printf("AliAnalysisTaskEMCALClusterize - reject event %d with cluster - reject event with ncells in SM3 %d and SM4 %d\n",(Int_t)Entry(),ncellsSM3, ncellsSM4);
6a797202 1285 // if(fFillAODFile) AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kFALSE);;
6544055e 1286 // return;
1287 //
1288
1289 //printf("TotE cell %f\n",totCellE);
1290 if(totCellE < 1) return kTRUE;
1291
1292 return kFALSE;
1293
1294}
1295
3769e0cb 1296//________________________________________________________________
1297Bool_t AliAnalysisTaskEMCALClusterize::IsLEDEvent(const Int_t run)
6544055e 1298{
1299 //Check if event is LED
1300
1301 if(!fRemoveLEDEvents) return kFALSE;
3769e0cb 1302
1303 //check events of LHC11a period
b9d6234e 1304 if(run < 146858 || run > 146860) return kFALSE ;
3769e0cb 1305
6544055e 1306 // Count number of cells with energy larger than 0.1 in SM3, cut on this number
1307 Int_t ncellsSM3 = 0;
6544055e 1308 AliVCaloCells * cells = fEvent->GetEMCALCells();
3769e0cb 1309 for(Int_t icell = 0; icell < cells->GetNumberOfCells(); icell++)
1310 {
6544055e 1311 if(cells->GetAmplitude(icell) > 0.1 && cells->GetCellNumber(icell)/(24*48)==3) ncellsSM3++;
6544055e 1312 }
1313
1314 TString triggerclasses = "";
1315
1316 AliESDEvent *esdevent = dynamic_cast<AliESDEvent*>(fEvent);
1317 if(esdevent) triggerclasses = esdevent ->GetFiredTriggerClasses();
1318 else triggerclasses = ((AliAODEvent*)fEvent)->GetFiredTriggerClasses();
1319
1320 Int_t ncellcut = 21;
1321 if(triggerclasses.Contains("EMC")) ncellcut = 35;
1322
b9d6234e 1323 if( ncellsSM3 >= ncellcut)
3769e0cb 1324 {
b9d6234e 1325 printf("AliAnalysisTaksEMCALClusterize::IsLEDEvent() - reject event %d with ncells in SM3 %d\n",(Int_t)Entry(),ncellsSM3);
6a797202 1326 if(fFillAODFile) AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()->SetFillAOD(kFALSE);;
6544055e 1327 return kTRUE;
1328 }
1329
1330 return kFALSE;
1331
1332}
1333
b43bdd14 1334//_______________________________________________________
1335void AliAnalysisTaskEMCALClusterize::RecPoints2Clusters()
6fdd30c4 1336{
1337 // Restore clusters from recPoints
b43bdd14 1338 // Cluster energy, global position, cells and their amplitude
1339 // fractions are restored
1340
6a8be5c3 1341 Int_t j = 0;
b43bdd14 1342 for(Int_t i = 0; i < fClusterArr->GetEntriesFast(); i++)
6fdd30c4 1343 {
b43bdd14 1344 AliEMCALRecPoint *recPoint = (AliEMCALRecPoint*) fClusterArr->At(i);
6fdd30c4 1345
1346 const Int_t ncells = recPoint->GetMultiplicity();
f6e45fe0 1347 Int_t ncellsTrue = 0;
6fdd30c4 1348
6a8be5c3 1349 if(recPoint->GetEnergy() < fRecParam->GetClusteringThreshold()) continue;
1350
6fdd30c4 1351 // cells and their amplitude fractions
1352 UShort_t absIds[ncells];
1353 Double32_t ratios[ncells];
1354
f6e45fe0 1355 //For later check embedding
1356 AliAODInputHandler* aodIH = dynamic_cast<AliAODInputHandler*>((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
f053064e 1357
1358 Float_t clusterE = 0;
f46af216 1359 for (Int_t c = 0; c < ncells; c++)
1360 {
b43bdd14 1361 AliEMCALDigit *digit = (AliEMCALDigit*) fDigitsArr->At(recPoint->GetDigitsList()[c]);
6fdd30c4 1362
f6e45fe0 1363 absIds[ncellsTrue] = digit->GetId();
1364 ratios[ncellsTrue] = recPoint->GetEnergiesList()[c]/digit->GetAmplitude();
6544055e 1365
d390e7cb 1366 // In case of unfolding, remove digits with unfolded energy too low
b43bdd14 1367 if(fSelectCell)
1368 {
f46af216 1369 if (recPoint->GetEnergiesList()[c] < fSelectCellMinE || ratios[ncellsTrue] < fSelectCellMinFrac)
1370 {
1371 if(DebugLevel() > 1)
1372 {
6544055e 1373 printf("AliAnalysisTaksEMCALClusterize::RecPoints2Clusters() - Too small energy in cell of cluster: cluster cell %f, digit %f\n",
d390e7cb 1374 recPoint->GetEnergiesList()[c],digit->GetAmplitude());
1375 }
1376
1377 continue;
1378
1379 } // if cuts
1380 }// Select cells
6544055e 1381
d390e7cb 1382 //Recalculate cluster energy and number of cluster cells in case any of the cells was rejected
1383 ncellsTrue++;
1384 clusterE +=recPoint->GetEnergiesList()[c];
f053064e 1385
f6e45fe0 1386 // In case of embedding, fill ratio with amount of signal,
f46af216 1387 if (aodIH && aodIH->GetMergeEvents())
1388 {
f6e45fe0 1389 //AliVCaloCells* inEMCALCells = InputEvent()->GetEMCALCells();
1390 AliVCaloCells* meEMCALCells = aodIH->GetEventToMerge()->GetEMCALCells();
1391 AliVCaloCells* ouEMCALCells = AODEvent()->GetEMCALCells();
1392
1393 Float_t sigAmplitude = meEMCALCells->GetCellAmplitude(absIds[ncellsTrue]);
1394 //Float_t bkgAmplitude = inEMCALCells->GetCellAmplitude(absIds[ncellsTrue]);
1395 Float_t sumAmplitude = ouEMCALCells->GetCellAmplitude(absIds[ncellsTrue]);
1396 //printf("\t AbsID %d, amplitude : bkg %f, sigAmplitude %f, summed %f - %f\n",absIds[ncellsTrue], bkgAmplitude, sigAmplitude, sumAmplitude, digit->GetAmplitude());
1397
1398 if(sumAmplitude > 0) ratios[ncellsTrue] = sigAmplitude/sumAmplitude;
1399 //printf("\t \t ratio %f\n",ratios[ncellsTrue]);
1400
1401 }//Embedding
1402
f6e45fe0 1403 }// cluster cell loop
6fdd30c4 1404
f46af216 1405 if (ncellsTrue < 1)
1406 {
f053064e 1407 if (DebugLevel() > 1)
1408 printf("AliAnalysisTaskEMCALClusterize::RecPoints2Clusters() - Skipping cluster with no cells avobe threshold E = %f, ncells %d\n",
1409 recPoint->GetEnergy(), ncells);
1410 continue;
1411 }
1412
1413 //if(ncellsTrue != ncells) printf("Old E %f, ncells %d; New E %f, ncells %d\n",recPoint->GetEnergy(),ncells,clusterE,ncellsTrue);
1414
f46af216 1415 if(clusterE < fRecParam->GetClusteringThreshold())
1416 {
f053064e 1417 if (DebugLevel()>1)
1418 printf("AliAnalysisTaskEMCALClusterize::RecPoints2Clusters() - Remove cluster with energy below seed threshold %f\n",clusterE);
6fdd30c4 1419 continue;
1420 }
1421
1422 TVector3 gpos;
1423 Float_t g[3];
1424
1425 // calculate new cluster position
596697e6 1426
b43bdd14 1427 recPoint->EvalGlobalPosition(fRecParam->GetW0(), fDigitsArr);
6fdd30c4 1428 recPoint->GetGlobalPosition(gpos);
1429 gpos.GetXYZ(g);
1430
1431 // create a new cluster
596697e6 1432
b43bdd14 1433 (*fCaloClusterArr)[j] = new AliAODCaloCluster() ;
1434 AliAODCaloCluster *clus = dynamic_cast<AliAODCaloCluster *>( fCaloClusterArr->At(j) ) ;
6a8be5c3 1435 j++;
6fdd30c4 1436 clus->SetType(AliVCluster::kEMCALClusterv1);
6544055e 1437 clus->SetE(clusterE);
6fdd30c4 1438 clus->SetPosition(g);
f6e45fe0 1439 clus->SetNCells(ncellsTrue);
6fdd30c4 1440 clus->SetCellsAbsId(absIds);
1441 clus->SetCellsAmplitudeFraction(ratios);
6fdd30c4 1442 clus->SetChi2(-1); //not yet implemented
bd9e8ebd 1443 clus->SetTOF(recPoint->GetTime()) ; //time-of-flight
6fdd30c4 1444 clus->SetNExMax(recPoint->GetNExMax()); //number of local maxima
5994e71f 1445 clus->SetDistanceToBadChannel(recPoint->GetDistanceToBadTower());
b43bdd14 1446
f46af216 1447 if(ncells == ncellsTrue)
1448 {
f053064e 1449 Float_t elipAxis[2];
1450 recPoint->GetElipsAxis(elipAxis);
1451 clus->SetM02(elipAxis[0]*elipAxis[0]) ;
1452 clus->SetM20(elipAxis[1]*elipAxis[1]) ;
1453 clus->SetDispersion(recPoint->GetDispersion());
1454 }
f46af216 1455 else if(fSelectCell)
1456 {
afaaef51 1457 // In case some cells rejected, in unfolding case, recalculate
1458 // shower shape parameters and position
d20bc070 1459 if(DebugLevel() > 1)
f46af216 1460 printf("AliAnalysisTaskEMCALClusterize::RecPoints2Clusters() - Cells removed from cluster (ncells %d, ncellsTrue %d), recalculate Shower Shape\n",ncells,ncellsTrue);
b43bdd14 1461
f053064e 1462 AliVCaloCells* cells = 0x0;
1463 if (aodIH && aodIH->GetMergeEvents()) cells = AODEvent() ->GetEMCALCells();
1464 else cells = InputEvent()->GetEMCALCells();
b43bdd14 1465
f053064e 1466 fRecoUtils->RecalculateClusterShowerShapeParameters(fGeom,cells,clus);
1467 fRecoUtils->RecalculateClusterPID(clus);
afaaef51 1468 fRecoUtils->RecalculateClusterPosition(fGeom,cells,clus);
f053064e 1469
f053064e 1470 }
6060ed91 1471
6edb4448 1472 // MC
1473
1474 if ( fSetCellMCLabelFromCluster == 1 ) SetClustersMCLabelFrom2SelectedLabels(recPoint,clus) ;
1475 else if( fSetCellMCLabelFromCluster == 2 ) SetClustersMCLabelFromOriginalClusters(clus) ;
1476 else
1477 {
1478 // Normal case, trust what the clusterizer has found
1479 Int_t parentMult = 0;
1480 Int_t *parentList = recPoint->GetParents(parentMult);
1481 clus->SetLabel(parentList, parentMult);
1b5f58b6 1482// printf("Label list : ");
1483// for(Int_t ilabel = 0; ilabel < parentMult; ilabel++ ) printf(" %d ",parentList[ilabel]);
1484// printf("\n");
6edb4448 1485 }
1486
1487 } // recPoints loop
1488
1489}
1490
1491//___________________________________________________________________________
1492void AliAnalysisTaskEMCALClusterize::RemapMCLabelForAODs(Int_t & label)
1493{
1494 // MC label for Cells not remapped after ESD filtering, do it here.
e59a6a2e 1495
6edb4448 1496 if(label < 0) return ;
1497
1498 AliAODEvent * evt = dynamic_cast<AliAODEvent*> (fEvent) ;
1499 if(!evt) return ;
1500
1501 TClonesArray * arr = dynamic_cast<TClonesArray*>(evt->FindListObject("mcparticles")) ;
1502 if(!arr) return ;
6060ed91 1503
6edb4448 1504 if(label < arr->GetEntriesFast())
1505 {
1506 AliAODMCParticle * particle = dynamic_cast<AliAODMCParticle *>(arr->At(label));
1507 if(!particle) return ;
1508
1509 if(label == particle->Label()) return ; // label already OK
1510 //else printf("AliAnalysisTaskEMCALClusterize::RemapMCLabelForAODs() - Label %d - AOD stack %d \n",label, particle->Label());
1511 }
1512 //else printf("AliAnalysisTaskEMCALClusterize::RemapMCLabelForAODs() - Label %d > AOD labels %d \n",label, arr->GetEntriesFast());
1513
1514 // loop on the particles list and check if there is one with the same label
1515 for(Int_t ind = 0; ind < arr->GetEntriesFast(); ind++ )
1516 {
1517 AliAODMCParticle * particle = dynamic_cast<AliAODMCParticle *>(arr->At(ind));
1518 if(label == particle->Label())
f46af216 1519 {
6edb4448 1520 label = ind;
1521 //printf("AliAnalysisTaskEMCALClusterize::RemapMCLabelForAODs() - New Label Index %d \n",label);
1522 return;
1523 }
1524 }
1525
1526 label = -1;
1527
1528 //printf("AliAnalysisTaskEMCALClusterize::RemapMCLabelForAODs() - Label not found set to -1 \n");
e59a6a2e 1529
6edb4448 1530}
1531
1532//________________________________________________
1533void AliAnalysisTaskEMCALClusterize::ResetArrays()
1534{
1535 // Reset arrays containing information for all possible cells
1536 for(Int_t j = 0; j < 12672; j++)
1537 {
1538 fOrgClusterCellId[j] = -1;
1539 fCellLabels[j] = -1;
1540 fCellSecondLabels[j] = -1;
1541 fCellTime[j] = 0.;
1542 fCellMatchdEta[j] = -999;
1543 fCellMatchdPhi[j] = -999;
1544 }
1545}
1546
1547//_____________________________________________________________________________________________________
1548void AliAnalysisTaskEMCALClusterize::SetClustersMCLabelFrom2SelectedLabels(AliEMCALRecPoint * recPoint,
1549 AliAODCaloCluster * clus)
1550{
1551 // Set the cluster MC label, the digizer was filled with most likely MC label for all cells in original cluster
1552 // Now check the second most likely MC label and add it to the new cluster
1553
1554 Int_t parentMult = 0;
1555 Int_t *parentList = recPoint->GetParents(parentMult);
1556 clus->SetLabel(parentList, parentMult);
1557
1558 //Write the second major contributor to each MC cluster.
1559 Int_t iNewLabel ;
1560 for ( Int_t iLoopCell = 0 ; iLoopCell < clus->GetNCells() ; iLoopCell++ )
1561 {
1562
1563 Int_t idCell = clus->GetCellAbsId(iLoopCell) ;
1564 if(idCell>=0)
1565 {
1566 iNewLabel = 1 ; //iNewLabel makes sure we don't write twice the same label.
1567 for ( UInt_t iLoopLabels = 0 ; iLoopLabels < clus->GetNLabels() ; iLoopLabels++ )
b43bdd14 1568 {
6edb4448 1569 if ( fCellSecondLabels[idCell] == -1 ) iNewLabel = 0; // -1 is never a good second label.
6ffa213f 1570 if ( fCellSecondLabels[idCell] == clus->GetLabelAt(iLoopLabels) ) iNewLabel = 0;
6edb4448 1571 }
1572 if (iNewLabel == 1)
1573 {
1574 Int_t * newLabelArray = new Int_t[clus->GetNLabels()+1] ;
1575 for ( UInt_t iLoopNewLabels = 0 ; iLoopNewLabels < clus->GetNLabels() ; iLoopNewLabels++ )
6ffa213f 1576 {
6edb4448 1577 newLabelArray[iLoopNewLabels] = clus->GetLabelAt(iLoopNewLabels) ;
6ffa213f 1578 }
6edb4448 1579
1580 newLabelArray[clus->GetNLabels()] = fCellSecondLabels[idCell] ;
1581 clus->SetLabel(newLabelArray,clus->GetNLabels()+1) ;
1582 delete [] newLabelArray;
1583 }
1584 }//positive cell number
1585 }
1586}
1587
1588//___________________________________________________________________________________________________
1589void AliAnalysisTaskEMCALClusterize::SetClustersMCLabelFromOriginalClusters(AliAODCaloCluster * clus)
1590{
1591 // Get the original clusters that contribute to the new cluster, assign the labels of such clusters
1592 // to the new cluster.
1593 // Only approximatedly valid when output are V1 clusters, handle with care
e59a6a2e 1594
6edb4448 1595 TArrayI clArray(100) ; //Weird if more than a few clusters are in the origin ...
1596 clArray.Reset();
1597 Int_t nClu = 0;
1598 Int_t nLabTotOrg = 0;
4d0b0c70 1599 Float_t emax = -1;
1600 Int_t idMax = -1;
6edb4448 1601 //Find the clusters that originally had the cells
1602 for ( Int_t iLoopCell = 0 ; iLoopCell < clus->GetNCells() ; iLoopCell++ )
1603 {
1604 Int_t idCell = clus->GetCellAbsId(iLoopCell) ;
1605
1606 if(idCell>=0)
1607 {
1608 Int_t idCluster = fOrgClusterCellId[idCell];
1609
1610 Bool_t set = kTRUE;
1611 for(Int_t icl =0; icl < nClu; icl++)
1612 {
1613 if( idCluster == ((Int_t)clArray.GetAt(icl)) ) set = kFALSE;
1614 // printf("\t \t icell %d Cluster in array %d, IdCluster %d, in array %d, set %d\n",
1615 // iLoopCell, icl, idCluster,((Int_t)clArray.GetAt(icl)),set);
1616 }
1617 if( set && idCluster >= 0)
1618 {
1619 clArray.SetAt(idCluster,nClu++);
1620 //printf("******** idCluster %d \n",idCluster);
1621 nLabTotOrg+=(fEvent->GetCaloCluster(idCluster))->GetNLabels();
4d0b0c70 1622
1623 //printf("Cluster in array %d, IdCluster %d\n",nClu-1, idCluster);
1624
1625 //Search highest E cluster
1626 AliVCluster * clOrg = fEvent->GetCaloCluster(idCluster);
1627 //printf("\t E %f\n",clOrg->E());
1628 if(emax < clOrg->E())
1629 {
1630 emax = clOrg->E();
1631 idMax = idCluster;
1632 }
6edb4448 1633 }
37d2296c 1634 }
6edb4448 1635 }// cell loop
1636
1637 if(nClu==0 || nLabTotOrg == 0)
1638 {
1639 if(clus->E() > 0.25) printf("AliAnalysisTaskEMCALClusterize::SetClustersMCLabelFromOriginalClusters() - Check: N org clusters %d, n tot labels %d, cluster E %f, n cells %d\n",nClu,nLabTotOrg,clus->E(), clus->GetNCells());
1640 //for(Int_t icell = 0; icell < clus->GetNCells(); icell++) printf("\t cell %d",clus->GetCellsAbsId()[icell]);
1641 //printf("\n");
1642 }
1643
4d0b0c70 1644
1645 // Put the first in the list the cluster with highest energy
1646 if(idMax != ((Int_t)clArray.GetAt(0))) // Max not at first position
1647 {
1648 Int_t maxIndex = -1;
1649 Int_t firstCluster = ((Int_t)clArray.GetAt(0));
1650 for ( Int_t iLoopCluster = 0 ; iLoopCluster < nClu ; iLoopCluster++ )
1651 {
1652 if(idMax == ((Int_t)clArray.GetAt(iLoopCluster))) maxIndex = iLoopCluster;
1653 }
1654
1655 clArray.SetAt(idMax,0);
1656 clArray.SetAt(firstCluster,maxIndex);
1657
1658 }
1659
6edb4448 1660 // Get the labels list in the original clusters, assign all to the new cluster
1661 TArrayI clMCArray(nLabTotOrg) ;
1662 clMCArray.Reset();
1663
1664 Int_t nLabTot = 0;
1665 for ( Int_t iLoopCluster = 0 ; iLoopCluster < nClu ; iLoopCluster++ )
1666 {
1667 Int_t idCluster = clArray.GetAt(iLoopCluster);
4d0b0c70 1668 //printf("New Cluster in Array %d, idCluster %d \n",iLoopCluster,idCluster);
6edb4448 1669 AliVCluster * clOrg = fEvent->GetCaloCluster(idCluster);
1670 Int_t nLab = clOrg->GetNLabels();
37d2296c 1671
6edb4448 1672 for ( Int_t iLab = 0 ; iLab < nLab ; iLab++ )
1673 {
1674 Int_t lab = clOrg->GetLabelAt(iLab) ;
1675 if(lab>=0)
1676 {
1677 Bool_t set = kTRUE;
1678 //printf("\t \t Set Label %d \n", lab);
1679 for(Int_t iLabTot =0; iLabTot < nLabTot; iLabTot++)
1680 {
1681 if( lab == ((Int_t)clMCArray.GetAt(iLabTot)) ) set = kFALSE;
1682 //printf("iLoopCluster %d, Label ID in Org Cluster %d,label %d Label ID in array %d, label in array %d, set %d\n",
1683 // iLoopCluster, iLab, lab, iLabTot, ((Int_t)clMCArray.GetAt(iLabTot)),set);
1684 }
1685 if( set ) clMCArray.SetAt(lab,nLabTot++);
1686 }
1687 }
1688 }// cluster loop
1689
1690 // Set the final list of labels
1691
1692 clus->SetLabel(clMCArray.GetArray(), nLabTot);
1693
e59a6a2e 1694// printf("Final list of labels for new cluster : \n");
1695// for(Int_t ice = 0; ice < clus->GetNCells() ; ice++)
1696// {
1697// printf("\t Cell %d ",clus->GetCellsAbsId()[ice]);
1698// Int_t label = InputEvent()->GetEMCALCells()->GetCellMCLabel(clus->GetCellsAbsId()[ice]);
1699// printf(" org %d ",label);
1700// RemapMCLabelForAODs(label);
1701// printf(" new %d \n",label);
1702// }
1703// for(Int_t imc = 0; imc < clus->GetNLabels(); imc++) printf("\t Label %d\n",clus->GetLabelAt(imc));
6544055e 1704}
1705
3769e0cb 1706
6544055e 1707//____________________________________________________________
1708void AliAnalysisTaskEMCALClusterize::UserCreateOutputObjects()
1709{
1710 // Init geometry, create list of output clusters
1711
6a797202 1712
1713 fOutputAODBranch = new TClonesArray("AliAODCaloCluster", 0);
1714
1715 if(fOutputAODBranchName.Length()==0)
3769e0cb 1716 {
6a797202 1717 fOutputAODBranchName = "newEMCALClustersArray";
1718 printf("Cluster branch name not set, set it to newEMCALClustersArray \n");
6544055e 1719 }
6a797202 1720
1721 fOutputAODBranch->SetName(fOutputAODBranchName);
1722
1723 if( fFillAODFile )
3769e0cb 1724 {
6a797202 1725 //fOutputAODBranch = new TClonesArray("AliAODCaloCluster", 0);
1726
1727
1728 //fOutputAODBranch->SetOwner(kFALSE);
1729
1730 AddAODBranch("TClonesArray", &fOutputAODBranch);
6544055e 1731 }
b43bdd14 1732
6fdd30c4 1733}
6544055e 1734
1735//_______________________________________________________
1736void AliAnalysisTaskEMCALClusterize::UserExec(Option_t *)
1737{
b43bdd14 1738 // Do clusterization event by event, execute different steps
596697e6 1739 // 1) Do some checks on the kind of events (ESD, AOD) or if some filtering is needed, initializations
1740 // load things and clear arrays
b43bdd14 1741 // 2) Clusterize a) just unfolding existing clusters (fJustUnfold)
1742 // b) recluster cells
1743 // + convert cells into digits (calibrating them)
1744 // + recluster digits into recPoints with the chosen clusterizer (V1, V1+Unfold,V2, NxN)
1745 // with methods in AliEMCALClusterizer
1746 // + transform recPoints into CaloClusters
1747 // 3) Do some final calculations in the found clusters (track-matching) and put them in an AOD branch
1748
596697e6 1749 //-------
b43bdd14 1750 // Step 1
1751
b0f874d4 1752
b43bdd14 1753 //Remove the contents of AOD branch output list set in the previous event
6544055e 1754 fOutputAODBranch->Clear("C");
596697e6 1755
cb68426a 1756 LoadBranches();
1757
1758 //Check if there is a centrality value, PbPb analysis, and if a centrality bin selection is requested
1759 //If we need a centrality bin, we select only those events in the corresponding bin.
1760 if( GetCentrality() && fCentralityBin[0] >= 0 && fCentralityBin[1] >= 0 )
1761 {
8fa7608a 1762 Float_t cen = GetEventCentrality();
cb68426a 1763 if(cen > fCentralityBin[1] || cen < fCentralityBin[0]) return ; //reject events out of bin.
1764 }
b0f874d4 1765
596697e6 1766 // intermediate array with new clusters : init the array only once or clear from previous event
1767 if(!fCaloClusterArr) fCaloClusterArr = new TObjArray(10000);
1768 else fCaloClusterArr->Delete();//Clear("C"); it leaks?
1769
5aa88029 1770 InitGeometry(); // only once, must be done before OADB, geo OADB accessed here
1771
6544055e 1772 //Get the event, do some checks and settings
1773 CheckAndGetEvent() ;
1774
a1eeb25d 1775 if (!fEvent)
1776 {
6544055e 1777 if(DebugLevel() > 0 ) printf("AliAnalysisTaksEMCALClusterize::UserExec() - Skip Event %d", (Int_t) Entry());
1778 return ;
1779 }
6a797202 1780
3769e0cb 1781 //Init pointers, geometry, clusterizer, ocdb, aodb
6544055e 1782
6544055e 1783
3769e0cb 1784 if(fAccessOCDB) AccessOCDB();
1785 if(fAccessOADB) AccessOADB(); // only once
b43bdd14 1786
3769e0cb 1787 InitClusterization();
6544055e 1788
596697e6 1789 //-------
b43bdd14 1790 // Step 2
1791
6544055e 1792 // Make clusters
1793 if (fJustUnfold) ClusterUnfolding();
1794 else ClusterizeCells() ;
6544055e 1795
596697e6 1796 //-------
b43bdd14 1797 // Step 3
6544055e 1798
afc22931 1799 FillCaloClusterInEvent();
b65291bf 1800
6544055e 1801}
1802