AliRoot Core  ee782a0 (ee782a0)
AliEMCALReconstructor.cxx
Go to the documentation of this file.
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 // --- ROOT system ---
17 #include <TClonesArray.h>
18 #include "TGeoManager.h"
19 #include "TGeoMatrix.h"
20 
21 // --- Standard library ---
22 #include <iostream>
23 
24 // --- AliRoot header files ---
25 #include "AliEMCALReconstructor.h"
26 
27 #include "AliCodeTimer.h"
28 #include "AliCaloCalibPedestal.h"
29 #include "AliEMCALCalibData.h"
30 #include "AliEMCALCalibTime.h"
31 #include "AliESDEvent.h"
32 #include "AliESDCaloCluster.h"
33 #include "AliESDCaloCells.h"
34 #include "AliESDtrack.h"
35 #include "AliEMCALLoader.h"
36 #include "AliEMCALRawUtils.h"
37 #include "AliEMCALDigit.h"
38 #include "AliEMCALClusterizerv1.h"
39 #include "AliEMCALClusterizerv2.h"
40 #include "AliEMCALClusterizerv3.h"
41 #include "AliEMCALClusterizerNxN.h"
42 #include "AliEMCALRecPoint.h"
43 #include "AliEMCALPID.h"
44 #include "AliEMCALRecoUtilsBase.h"
45 #include "AliRawReader.h"
46 #include "AliCDBEntry.h"
47 #include "AliCDBManager.h"
48 #include "AliEMCALGeometry.h"
49 #include "AliEMCAL.h"
50 #include "AliESDVZERO.h"
51 #include "AliCDBManager.h"
52 #include "AliRunLoader.h"
53 #include "AliRun.h"
54 #include "AliEMCALTriggerData.h"
58 #include "AliEMCALTriggerData.h"
60 #include "AliEMCALTriggerPatch.h"
61 #include "AliEMCALTriggerTypes.h"
62 #include "AliESDCalofriend.h"
63 
65 ClassImp(AliEMCALReconstructor) ;
67 
68 const AliEMCALRecParam* AliEMCALReconstructor::fgkRecParam = 0; // EMCAL rec. parameters
69 AliEMCALRawUtils* AliEMCALReconstructor::fgRawUtils = 0; // EMCAL raw utilities class
70 AliEMCALClusterizer* AliEMCALReconstructor::fgClusterizer = 0; // EMCAL clusterizer class
71 TClonesArray* AliEMCALReconstructor::fgDigitsArr = 0; // list of digits, to be used multiple times
72 TObjArray* AliEMCALReconstructor::fgClustersArr = 0; // list of clusters, to be used multiple times
73 TClonesArray* AliEMCALReconstructor::fgTriggerDigits = 0; // list of trigger digits, to be used multiple times
75 TClonesArray *AliEMCALReconstructor::fgTriggerData = 0x0;
76 
87 //____________________________________________________________________________
89  : fGeom(0),fCalibData(0),fCalibTime(0),fPedestalData(0), fMatches(0x0), fESDCalofriend(0x0)
90 {
91  // OCDB initialization, do it here to recover run number
92  // for geometry
93  //
95 
96  //----------------------------------
97  // Initialize the geometry, 3 posibilities:
98  // * To make sure we match with the geometry in a simulation file,
99  // let's try to get it first.
100  // * If not, check the run number assigned for this chunk and set the
101  // geometry depending on the run number
102  // * If not, take the default geometry
103  //
105  if (rl->GetAliRun())
106  {
107  AliEMCAL * emcal = dynamic_cast<AliEMCAL*>(rl->GetAliRun()->GetDetector("EMCAL"));
108  if(emcal) fGeom = emcal->GetGeometry();
109  }
110 
111  if(!fGeom)
112  {
113  Int_t runNumber = man->GetRun();
114  AliInfo(Form("Finding EMCAL Geometry from run number %d.",runNumber));
116  }
117 
118  if(!fGeom)
119  {
120  AliWarning(Form("Using default geometry in reconstruction!!!"));
122  }
123 
124  if ( !fGeom ) AliFatal(Form("Could not get geometry!"));
125  else AliInfo (Form("Geometry name: <<%s>>",fGeom->GetName()));
126 
127  //---------------------------
128  // Initialize AliEMCALRawUtils
129  // It must be done after the geometry is initialized since there is a geometry
130  // initialization in AliEMCALRawUtils that could conflict
131  //
133 
134  //=============================================
135  // OCDB containers, now get the different
136  // type of OCDB parameters
137  //
138  // Get energy calibration parameters
139  //
140  if(!fCalibData)
141  {
142  AliCDBEntry *entry = (AliCDBEntry*) man->Get("EMCAL/Calib/Data");
143  if (entry) fCalibData = (AliEMCALCalibData*) entry->GetObject();
144  }
145 
146  if(!fCalibData)
147  AliFatal("Energy Calibration parameters not found in CDB!");
148 
149 
150  // Get time calibration parameters if requested
151  //
152  if(!fCalibTime)
153  {
154  AliCDBEntry *entry = (AliCDBEntry*) man->Get("EMCAL/Calib/Time");
155  if (entry) fCalibTime = (AliEMCALCalibTime*) entry->GetObject();
156  }
157 
158  if(!fCalibTime)
159  AliFatal("Time Calibration parameters not found in CDB!");
160 
161  // Get bad channels
162  //
163  if(!fPedestalData)
164  {
165  AliCDBEntry *entry = (AliCDBEntry*) man->Get("EMCAL/Calib/Pedestals");
166  if (entry) fPedestalData = (AliCaloCalibPedestal*) entry->GetObject();
167  }
168 
169  if(!fPedestalData)
170  AliFatal("Dead map not found in CDB!");
171 
172  //----------------------------------------------------
173  // Get trigger parameters and init other trigger stuff
174  int dsize = (fGeom->GetTriggerMappingVersion() == 2) ? 2 : 1;
175  fgTriggerData = new TClonesArray("AliEMCALTriggerData",dsize);
176  for (int i=0;i<dsize;i++) {
177  new((*fgTriggerData)[i]) AliEMCALTriggerData();
178  }
179 
180  //-----------------------------
181  // Init temporary list of digits
182  //
183  fgDigitsArr = new TClonesArray("AliEMCALDigit",1000);
184  fgClustersArr = new TObjArray(1000);
185 
186  const int kNTRU = fGeom->GetNTotalTRU();
187  fgTriggerDigits = new TClonesArray("AliEMCALTriggerRawDigit", kNTRU * 96);
188 
189  //--------------------------
190  // Init Track matching array
191  //
192  fMatches = new TList();
193  fMatches->SetOwner(kTRUE);
194 }
195 
199 //____________________________________________________________________________
201 {
203 
204  //No need to delete, recovered from OCDB
205  //if(fCalibData) delete fCalibData;
206  //if(fCalibTime) delete fCalibTime;
207  //if(fPedestalData) delete fPedestalData;
208 
209  if(fgDigitsArr) fgDigitsArr->Clear("C");
210  delete fgDigitsArr;
211  fgDigitsArr = 0;
212 
213  if(fgClustersArr) fgClustersArr->Clear();
214  delete fgClustersArr;
215  fgClustersArr = 0;
216 
217  if(fgTriggerDigits) fgTriggerDigits->Clear();
218  delete fgTriggerDigits;
219  fgTriggerDigits = 0;
220 
221  delete fgRawUtils;
222  fgRawUtils = 0;
223  delete fgClusterizer;
224  fgClusterizer = 0;
225 
227  fgTriggerProcessor = 0;
228 
229  if(fMatches) { fMatches->Delete(); delete fMatches; fMatches = 0;}
230 
231  if (fESDCalofriend) delete fESDCalofriend;
232 
234 }
235 
236 //_____________________________________________________________________________
238 {
239  //
241 }
242 
253 //____________________________________________________________________________
255  if(fgTriggerProcessor) return;
256 
257  if(GetRecParam()){
258  if(GetRecParam()->IsSimulateTriggerElectronics()){
260  const AliEMCALTriggerDCSConfig* dcsConfig = dcsConfigDB->GetTriggerDCSConfig();
261  if(!dcsConfig)
262  AliFatal("No trigger configuration found in OCDB");
264  }
265  }
266 }
267 
268 
272 //____________________________________________________________________________
274 {
275  Int_t clusterizerType = -1;
276  Int_t eventType = -1;
277  if(GetRecParam())
278  {
279  clusterizerType = GetRecParam()->GetClusterizerFlag();
280  eventType = GetRecParam()->GetEventSpecie();
281  }
282  else
283  {
284  AliCDBEntry *entry = (AliCDBEntry*)
285  AliCDBManager::Instance()->Get("EMCAL/Calib/RecoParam");
286 
287  // Get The reco param for the default event specie
288  if (entry)
289  {
290  AliEMCALRecParam *recParam = (AliEMCALRecParam*)((TObjArray *) entry->GetObject())->At(0);
291  if(recParam) clusterizerType = recParam->GetClusterizerFlag();
292  }
293  }
294 
295  // Check if clusterizer previously set corresponds to what is needed for this event type
296  if(fgClusterizer)
297  {
298  if(eventType!=AliRecoParam::kCalib)
299  {
300  //printf("ReCreate clusterizer? Clusterizer set <%d>, Clusterizer in use <%s>\n",
301  // clusterizerType, fgClusterizer->Version());
302 
303  if (clusterizerType == AliEMCALRecParam::kClusterizerv1 && !strcmp(fgClusterizer->Version(),"clu-v1")) return;
304 
305  else if(clusterizerType == AliEMCALRecParam::kClusterizerNxN && !strcmp(fgClusterizer->Version(),"clu-NxN")) return;
306 
307  else if(clusterizerType == AliEMCALRecParam::kClusterizerv2 && !strcmp(fgClusterizer->Version(),"clu-v2")) return;
308 
309  else if(clusterizerType == AliEMCALRecParam::kClusterizerv3 && !strcmp(fgClusterizer->Version(),"clu-v3")) return;
310 
311  //Need to create new clusterizer, the one set previously is not the correct one
312  delete fgClusterizer;
313  }
314  else return;
315  }
316 
317  if (clusterizerType == AliEMCALRecParam::kClusterizerv1)
318  {
320  }
321  else if (clusterizerType == AliEMCALRecParam::kClusterizerNxN)
322  {
324  }
325  else if (clusterizerType == AliEMCALRecParam::kClusterizerv2)
326  {
328  }
329  else if (clusterizerType == AliEMCALRecParam::kClusterizerv3)
330  {
332  }
333  else
334  {
335  AliFatal(Form("Unknown clusterizer %d ", clusterizerType));
336  }
337 }
338 
346 //____________________________________________________________________________
347 void AliEMCALReconstructor::Reconstruct(TTree* digitsTree, TTree* clustersTree) const
348 {
349  AliCodeTimerAuto("",0)
350 
351  // Get input digits and put them in fgDigitsArr, clear the list before
352  ReadDigitsArrayFromTree(digitsTree);
353 
354  InitClusterizer();
355 
357  fgClusterizer->SetOutput(clustersTree);
358 
359  // Skip clusterization of LED events
360  if (GetRecParam()->GetEventSpecie()!=AliRecoParam::kCalib)
361  {
362  if(fgDigitsArr && fgDigitsArr->GetEntries())
363  {
364  fgClusterizer->SetInput(digitsTree);
365 
366  //fgClusterizer->Digits2Clusters("deb all") ; //For debugging
368 
369  fgClusterizer->Clear();
370 
371  }//digits array exists and has somethind
372  }//not a LED event
373 
374  clustersTree->Fill();
375 
376  // Deleting the recpoints at the end of the reconstruction call
378 }
379 
384 //____________________________________________________________________________
385 void AliEMCALReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digitsTree) const
386 {
387  rawReader->Reset() ;
388 
389  for (int i=0;i<fgTriggerData->GetEntriesFast();i++)
390  {
391  ((AliEMCALTriggerData*)fgTriggerData->At(i))->SetMode(1);
392  }
393 
394  if(fgDigitsArr) fgDigitsArr->Clear("C");
395 
397 
398  const int kNTRU = fGeom->GetNTotalTRU();
399  TClonesArray *digitsTrg = new TClonesArray("AliEMCALTriggerRawDigit", kNTRU * 96);
400 
401  Int_t bufsize = 32000;
402  digitsTree->Branch("EMCAL", &fgDigitsArr, bufsize);
403  digitsTree->Branch("EMTRG", &digitsTrg, bufsize);
404 
405  // Skip calibration events do the rest
406  Bool_t doFit = kTRUE;
407  if ( !(GetRecParam()->FitLEDEvents()) && GetRecParam()->GetEventSpecie()==AliRecoParam::kCalib) doFit = kFALSE;
408 
409  if (doFit)
410  {
411  // must be done here because, in constructor, option is not yet known
413 
414  // fgRawUtils->SetRawFormatHighLowGainFactor(GetRecParam()->GetHighLowGainFactor());
415 
416  // fgRawUtils->SetRawFormatOrder(GetRecParam()->GetOrderParameter());
417  // fgRawUtils->SetRawFormatTau(GetRecParam()->GetTau());
418  fgRawUtils->SetNoiseThreshold(GetRecParam()->GetNoiseThreshold());
419  fgRawUtils->SetNPedSamples(GetRecParam()->GetNPedSamples());
420  fgRawUtils->SetRemoveBadChannels(GetRecParam()->GetRemoveBadChannels());
421  if (!fgRawUtils->GetFittingAlgorithm()) fgRawUtils->SetFittingAlgorithm(GetRecParam()->GetFittingAlgorithm());
422  fgRawUtils->SetFALTROUsage(GetRecParam()->UseFALTRO());
423  fgRawUtils->SetL1PhaseUsage(GetRecParam()->UseL1Phase());
424  // fgRawUtils->SetFALTROUsage(0);
425 
426  //fgRawUtils->SetTimeMin(GetRecParam()->GetTimeMin());
427  //fgRawUtils->SetTimeMax(GetRecParam()->GetTimeMax());
428 
429  // fgRawUtils->SetTimeMin(-99999 );
430  // fgRawUtils->SetTimeMax( 99999 );
431 
433 
434  }//skip calibration event
435  else
436  {
437  AliDebug(1," Calibration Event, skip!");
438  }
439 
440  digitsTree->Fill();
441  digitsTrg->Delete();
442  delete digitsTrg;
443 
444 }
445 
453 //____________________________________________________________________________
454 void AliEMCALReconstructor::FillESD(TTree* digitsTree, TTree* clustersTree,
455  AliESDEvent* esd) const
456 {
457  //########################################
458  // Trigger
459  //########################################
460 
461  static int saveOnce[2] = {0,0};
462 
463 
464  Int_t v0M[2] = {0, 0};
465 
466  AliESDVZERO* esdV0 = esd->GetVZEROData();
467 
468  if (esdV0)
469  {
470  v0M[0] = esdV0->GetTriggerChargeC();
471  v0M[1] = esdV0->GetTriggerChargeA();
472  }
473  else
474  {
475  AliWarning("No V0 ESD! Run trigger processor w/ null V0 charges");
476  }
477 
478  if (fgTriggerDigits && fgTriggerDigits->GetEntriesFast()) fgTriggerDigits->Delete();
479 
480  TBranch *branchtrg = digitsTree->GetBranch("EMTRG");
481 
482  if (!branchtrg)
483  {
484  AliError("Can't get the branch with the EMCAL trigger digits!");
485  return;
486  }
487 
488  branchtrg->SetAddress(&fgTriggerDigits);
489  branchtrg->GetEntry(0);
490 
491  // Note: fgTriggerProcessor reset done at the end of this method
492 
495 
496  // Fill ESD
497  AliESDCaloTrigger* trgESD = esd->GetCaloTrigger("EMCAL");
498  Int_t totalSize = fgTriggerDigits->GetEntriesFast()+2*fgDigitsArr->GetEntriesFast(); //LG/HG
499  fESDCalofriend->Allocate(totalSize);
500 
501  if (trgESD)
502  {
503  trgESD->Allocate(fgTriggerDigits->GetEntriesFast());
504  int trgBitWord=0;
505  for (Int_t i = 0; i < fgTriggerDigits->GetEntriesFast(); i++) {
507  if (AliDebugLevel() > 999) rdig->Print("");
508 
509  Int_t px, py, trgBitWord=0;
510  if (fGeom->GetPositionInEMCALFromAbsFastORIndex(rdig->GetId(), px, py)) {
511  Int_t a = -1, t = -1, times[10];
512 
513  rdig->GetMaximum(a, t);
514  rdig->GetL0Times(times);
515 
516  trgESD->Add(px, py, a, t, times, rdig->GetNL0Times(), rdig->GetL1TimeSum(), rdig->GetL1SubRegion(), rdig->GetTriggerBits());
517  trgBitWord |= rdig->GetTriggerBits();
518  if (rdig->GetNL0Times()) trgBitWord |= 1 << 5; // Overwrite L0 id from STU payload
519 
520  const Int_t nSamples = 64;
521  Int_t samples[nSamples]={0};
522  if (rdig->GetNSamples() && rdig->GetSamples(samples,nSamples)) {
523  fESDCalofriend->Add(rdig->GetId(),5,nSamples,samples);
524  }
525  }
526  }
527 
528  trgESD->SetTriggerBitWord(trgBitWord);
529 
530  for (int i=0;i<fgTriggerData->GetEntriesFast();i++)
531  {
532  for (int j=0;j<2;j++) {
533  trgESD->SetL1Threshold(i,2 * j , ((AliEMCALTriggerData*)fgTriggerData->At(i))->GetL1JetThreshold( j));
534  trgESD->SetL1Threshold(i,2 * j + 1, ((AliEMCALTriggerData*)fgTriggerData->At(i))->GetL1GammaThreshold(j));
535  }
536  trgESD->SetL1FrameMask(i,((AliEMCALTriggerData*)fgTriggerData->At(i))->GetL1FrameMask());
537 
538  Int_t v0[2];
539  ((AliEMCALTriggerData*)fgTriggerData->At(i))->GetL1V0(v0);
540  trgESD->SetL1V0(i,v0);
541 
542  trgESD->SetMedian(i,((AliEMCALTriggerData*)fgTriggerData->At(i))->GetMedian());
543  if (!saveOnce[i] && ((AliEMCALTriggerData*)fgTriggerData->At(i))->GetL1DataDecoded())
544  {
545  int type[19] = {0};
546  ((AliEMCALTriggerData*)fgTriggerData->At(i))->GetL1TriggerType(type);
547 
548  esd->SetCaloTriggerType(i,type);
549 
550  saveOnce[i] = 1;
551  }
552  }
553  }
554 
555  // Resetting
556  for (int i=0;i<fgTriggerData->GetEntriesFast();i++)
557  {
558  ((AliEMCALTriggerData*)fgTriggerData->At(i))->Reset();
559  }
560 
561  //########################################
562  //##############Fill CaloCells############
563  //########################################
564 
565  // Get input digits and put them in fgDigitsArr, clear the list before
566  ReadDigitsArrayFromTree(digitsTree);
567 
568  Int_t nDigits = fgDigitsArr->GetEntries(), idignew = 0 ;
569  AliDebug(1,Form("%d digits",nDigits));
570 
571  AliESDCaloCells &emcCells = *(esd->GetEMCALCells());
572  emcCells.CreateContainer(nDigits);
574 
575  Float_t energy = 0;
576  Float_t time = 0;
577  Int_t mapDigitAndCellIndex[20000] = { 0 } ; // needed to pack cell MC labels in cluster and not loop all digits
578 
579  for (Int_t idig = 0 ; idig < nDigits ; idig++)
580  {
581  const AliEMCALDigit * dig = (const AliEMCALDigit*)fgDigitsArr->At(idig);
582  time = dig->GetTime(); // Time already calibrated in clusterizer
583  energy = dig->GetAmplitude(); // energy calibrated in clusterizer
584 
585  if (energy <= 0 ) continue ;
586 
587  fgClusterizer->Calibrate(energy,time,dig->GetId()); // Digits already calibrated in clusterizers
588 
589  if (energy <= 0 ) continue ; // Digits tagged as bad (dead, hot, not alive) are set to 0 in calibrate, remove them
590 
591  // Only for MC
592  // Get the label of the primary particle that generated the cell
593  // Assign the particle that deposited more energy
594  Int_t nparents = dig->GetNiparent();
595  Int_t digLabel =-1 ;
596  Float_t edep =-1.;
597  if ( nparents > 0 )
598  {
599  for ( Int_t jndex = 0 ; jndex < nparents ; jndex++ )
600  {
601  if(edep >= dig->GetDEParent(jndex+1)) continue ;
602 
603  digLabel = dig->GetIparent (jndex+1);
604  edep = dig->GetDEParent(jndex+1);
605  } // all primaries in digit
606  } // select primary label
607 
608  Bool_t highGain = kFALSE;
609  if( dig->GetType() == AliEMCALDigit::kHG ) highGain = kTRUE;
610 
611  emcCells.SetCell(idignew,dig->GetId(),energy, time,digLabel,0.,highGain);
612 
613  const Int_t nSamples = 64;//rdig->GetNSamples();
614  Int_t samples[nSamples]={0};
615 
616  if (dig->GetNALTROSamplesLG()) {
617  dig->GetALTROSamplesLG(samples); fESDCalofriend->Add(dig->GetId(),1,nSamples,samples);
618  }
619 
620  //Reset
621  for (int idig=0;idig<nSamples;idig++) samples[idig]=0;
622 
623  if (dig->GetNALTROSamplesHG()) {
624  dig->GetALTROSamplesHG(samples); fESDCalofriend->Add(dig->GetId(),0,nSamples,samples);
625  }
626 
627  mapDigitAndCellIndex[idignew] = idig; // needed to pack cell MC labels in cluster
628 
629  idignew++;
630  }
631 
632  emcCells.SetNumberOfCells(idignew);
633  emcCells.Sort();
634 
635  //------------------------------------------------------------
636  //-----------------CLUSTERS-----------------------------------
637  //------------------------------------------------------------
638  clustersTree->SetBranchStatus("*",0); //disable all branches
639  clustersTree->SetBranchStatus("EMCALECARP",1); //Enable only the branch we need
640  if(fgClustersArr) fgClustersArr->Clear();
641  TBranch *branch = clustersTree->GetBranch("EMCALECARP");
642  branch->SetAddress(&fgClustersArr);
643  branch->GetEntry(0);
644  //clustersTree->GetEvent(0);
645 
646  Int_t nClusters = fgClustersArr->GetEntries(), nClustersNew=0;
647  AliDebug(1,Form("%d clusters",nClusters));
648 
649 
650  //########################################
651  //##############Fill CaloClusters#########
652  //########################################
653  for (Int_t iClust = 0 ; iClust < nClusters ; iClust++)
654  {
655  const AliEMCALRecPoint * clust = (const AliEMCALRecPoint*)fgClustersArr->At(iClust);
656 
657  if(!clust) continue;
658 
659  // clust->Print(); //For debugging
660 
661  // Get information from EMCAL reconstruction points
662  Float_t xyz[3];
663  TVector3 gpos;
664  clust->GetGlobalPosition(gpos);
665  for (Int_t ixyz=0; ixyz<3; ixyz++)
666  xyz[ixyz] = gpos[ixyz];
667  Float_t elipAxis[2];
668  clust->GetElipsAxis(elipAxis);
669 
670  //Create digits lists
671  Int_t cellMult = clust->GetMultiplicity();
672 
673  Float_t *amplFloat = clust->GetEnergiesList();
674  Int_t *digitInts = clust->GetAbsId();
675  TArrayS absIdList(cellMult);
676  TArrayD fracList(cellMult);
677 
678  Int_t newCellMult = 0;
679  for (Int_t iCell=0; iCell<cellMult; iCell++)
680  {
681  if (amplFloat[iCell] > 0)
682  {
683  absIdList[newCellMult] = (UShort_t)(digitInts[iCell]);
684 
685  //Calculate Fraction
686  if(emcCells.GetCellAmplitude(digitInts[iCell])>0 && GetRecParam()->GetUnfold())
687  fracList[newCellMult] = amplFloat[iCell]/(emcCells.GetCellAmplitude(digitInts[iCell]));//get cell calibration value
688  else
689  fracList[newCellMult] = 0;
690 
691  newCellMult++;
692  }
693  }
694 
695  absIdList.Set(newCellMult);
696  fracList.Set(newCellMult);
697 
698  // Accept cluster if it has some digit
699  if(newCellMult > 0)
700  {
701  nClustersNew++;
702 
703  // Fill the ESDCaloCluster
704  AliESDCaloCluster * ec = new AliESDCaloCluster() ;
706  ec->SetPosition(xyz);
707  ec->SetE(clust->GetEnergy());
708  ec->SetTOF(clust->GetTime()) ; //time-of-flight
709 
710  ec->SetChi2(-1); //not yet implemented
711 
712  // Distance to the nearest bad tower
714 
715  //
716  // Shower shape related
717  //
718  ec->SetNCells(newCellMult);
719  ec->SetDispersion(clust->GetDispersion());
720  ec->SetM02(elipAxis[0]*elipAxis[0]) ;
721  ec->SetM20(elipAxis[1]*elipAxis[1]) ;
722  ec->SetNExMax(clust->GetNExMax()); //number of local maxima
723 
724  //
725  // Primaries
726  //
727  Int_t parentMult = 0;
728  Int_t *parentList = clust->GetParents(parentMult); // label index
729  Float_t *parentListDE = clust->GetParentsDE(); // deposited energy
730 
731  ec->SetLabel(parentList,parentMult);
732 
733  ec->SetClusterMCEdepFractionFromEdepArray(parentListDE);
734 
735  //
736  // Change type of cells list from short to ushort
737  // Pack the at maximum 4 different primary contributions on cells into a single int.
738  // (Profit from the same loop on cells in cluster)
739  //
740  UShort_t *newAbsIdList = new UShort_t[newCellMult];
741  Double_t *newFracList = new Double_t[newCellMult];
742  UInt_t *cellEDepFrac = new UInt_t [newCellMult];
743 
744  for(Int_t i = 0; i < newCellMult ; i++)
745  {
746  // int to short
747  newAbsIdList[i] = absIdList[i];
748  newFracList [i] = fracList[i];
749  cellEDepFrac[i] = 0;
750 
751  // *Pack cells parent energy deposit*
752  if(parentMult > 0)
753  {
754  // Get the digit that originated this cell cluster
755  Int_t cellPos = emcCells.GetCellPosition (newAbsIdList[i]);
756  Int_t idigit = mapDigitAndCellIndex[cellPos];
757  const AliEMCALDigit * dig = (const AliEMCALDigit*)fgDigitsArr->At(idigit);
758 
759  // Find the 4 MC labels that contributed to the cluster and their
760  // deposited energy in the current digit
761  Int_t nparents = dig->GetNiparent();
762  if ( nparents > 0 )
763  {
764  Int_t digLabel =-1 ;
765  Float_t edep = 0 ;
766  Float_t edepTot = 0 ;
767  Float_t mcEDepFrac[4] = {0,0,0,0};
768 
769  for ( Int_t jndex = 0 ; jndex < nparents ; jndex++ )
770  { // all primaries in digit
771  digLabel = dig->GetIparent (jndex+1);
772  edep = dig->GetDEParent(jndex+1);
773  edepTot += edep;
774 
775  if ( digLabel == parentList[0] ) mcEDepFrac[0] = edep;
776  else if ( digLabel == parentList[1] ) mcEDepFrac[1] = edep;
777  else if ( digLabel == parentList[2] ) mcEDepFrac[2] = edep;
778  else if ( digLabel == parentList[3] ) mcEDepFrac[3] = edep;
779  } // all primaries in digit
780 
781  // Divide energy deposit by total deposited energy
782  // Do not take the stored digit energy since it is smeared and with noise
783  // One could go back to the sdigit, but it is simpler to take the added
784  // deposited energy of all primaries.
785  // Do this only when deposited energy is significant, use 10 MeV although 50 MeV should be expected
786  if(edepTot > 0.01)
787  {
788  for(Int_t idep = 0; idep < 4; idep++)
789  mcEDepFrac[idep] /= edepTot;
790 
791  cellEDepFrac[i] = ec->PackMCEdepFraction(mcEDepFrac);
792  }
793  } // at least one parent in digit
794  } // at least one parent in cluster, do the cell primary packing
795  } // cell cluster loop
796 
797  ec->SetCellsAbsId(newAbsIdList);
798  ec->SetCellsAmplitudeFraction(newFracList);
799  ec->SetCellsMCEdepFractionMap(cellEDepFrac);
800 
801  //
802  // Track matching
803  //
804  fMatches->Clear();
805  Int_t nTracks = esd->GetNumberOfTracks();
806  for (Int_t itrack = 0; itrack < nTracks; itrack++)
807  {
808  AliESDtrack * track = esd->GetTrack(itrack) ; // retrieve track
809  if(track->GetEMCALcluster()==iClust)
810  {
811  Float_t dEta=-999, dPhi=-999;
812  Bool_t isMatch = CalculateResidual(track, ec, dEta, dPhi);
813  if(!isMatch)
814  {
815  // AliDebug(10, "Not good");
816  continue;
817  }
818 
819  AliEMCALMatch *match = new AliEMCALMatch();
820  match->SetIndexT(itrack);
821  match->SetDistance(TMath::Sqrt(dEta*dEta+dPhi*dPhi));
822  match->SetdEta(dEta);
823  match->SetdPhi(dPhi);
824  fMatches->Add(match);
825  }
826  }
827 
828  fMatches->Sort(kSortAscending); //Sort matched tracks from closest to furthest
829  Int_t nMatch = fMatches->GetEntries();
830  TArrayI arrayTrackMatched(nMatch);
831  for(Int_t imatch=0; imatch<nMatch; imatch++)
832  {
833  AliEMCALMatch *match = (AliEMCALMatch*)fMatches->At(imatch);
834  arrayTrackMatched[imatch] = match->GetIndexT();
835  if(imatch==0)
836  {
837  ec->SetTrackDistance(match->GetdPhi(), match->GetdEta());
838  }
839  }
840 
841  ec->AddTracksMatched(arrayTrackMatched);
842 
843  //add the cluster to the esd object
844  esd->AddCaloCluster(ec);
845 
846  delete ec;
847  delete [] newAbsIdList ;
848  delete [] newFracList ;
849  delete [] cellEDepFrac ;
850  }
851  } // cycle on clusters
852 
853  //
854  // Reset the index of matched cluster for tracks
855  // to the one in CaloCluster array
856  //
857  Int_t ncls = esd->GetNumberOfCaloClusters();
858  for(Int_t icl=0; icl<ncls; icl++)
859  {
860  AliESDCaloCluster *cluster = esd->GetCaloCluster(icl);
861  if(!cluster || !cluster->IsEMCAL()) continue;
862  TArrayI *trackIndex = cluster->GetTracksMatched();
863  for(Int_t itr=0; itr<trackIndex->GetSize(); itr++)
864  {
865  AliESDtrack *track = esd->GetTrack(trackIndex->At(itr));
866  track->SetEMCALcluster(cluster->GetID());
867  }
868  }
869 
870  // Fill ESDCaloCluster with PID weights
871  AliEMCALPID *pid = new AliEMCALPID;
872  //pid->SetPrintInfo(kTRUE);
873  pid->SetReconstructor(kTRUE);
874  pid->RunPID(esd);
875  delete pid;
876 
877  // Store EMCAL misalignment matrixes
878  FillMisalMatrixes(esd) ;
879 
880  //add calo friends
881  if (esd) {
882  AliESDfriend *fr = (AliESDfriend*)esd->FindListObject("AliESDfriend");
883  if (fr) {
884  AliDebug(1, Form("Writing Calo friend data to ESD tree"));
886  }
887  }
888 }
889 
893 //==================================================================================
895 {
896  // Check, if matrixes was already stored
897  for(Int_t sm = 0 ; sm < fGeom->GetNumberOfSuperModules(); sm++)
898  {
899  if(esd->GetEMCALMatrix(sm)!=0)
900  return ;
901  }
902 
903  // Create and store matrixes
904  if(!gGeoManager)
905  {
906  AliError("Can not store misal. matrixes: no gGeoManager! \n") ;
907  return ;
908  }
909 
910  // Note, that owner of copied matrixes will be header
911  const Int_t bufsize = 255;
912  char path[bufsize] ;
913  TGeoHMatrix * m = 0x0;
914  Int_t tmpType = -1;
915  Int_t SMOrder = 0;
916  TString SMName;
917  for(Int_t sm = 0; sm < fGeom->GetNumberOfSuperModules(); sm++)
918  {
919  if(fGeom->GetSMType(sm) == AliEMCALGeometry::kEMCAL_Standard ) SMName = "SMOD";
920  else if(fGeom->GetSMType(sm) == AliEMCALGeometry::kEMCAL_Half ) SMName = "SM10";
921  else if(fGeom->GetSMType(sm) == AliEMCALGeometry::kEMCAL_3rd ) SMName = "SM3rd";
922  else if( fGeom->GetSMType(sm) == AliEMCALGeometry::kDCAL_Standard ) SMName = "DCSM";
923  else if( fGeom->GetSMType(sm) == AliEMCALGeometry::kDCAL_Ext ) SMName = "DCEXT";
924  else AliError("Unkown SM Type!!");
925 
926  if(fGeom->GetSMType(sm) == tmpType)
927  {
928  SMOrder++;
929  }
930  else
931  {
932  tmpType = fGeom->GetSMType(sm);
933  SMOrder = 1;
934  }
935  snprintf(path,bufsize,"/ALIC_1/XEN1_1/%s_%d", SMName.Data(), SMOrder) ;
936 
937  if (gGeoManager->CheckPath(path))
938  {
939  gGeoManager->cd(path);
940  m = gGeoManager->GetCurrentMatrix() ;
941  // printf("================================================= \n");
942  // printf("AliEMCALReconstructor::FixMisalMatrixes(), sm %d, \n",sm);
943  // m->Print("");
944  esd->SetEMCALMatrix(new TGeoHMatrix(*m),sm) ;
945  // printf("================================================= \n");
946  }
947  else
948  {
949  esd->SetEMCALMatrix(NULL,sm) ;
950  }
951  }
952 }
953 
958 //__________________________________________________________________________
960 {
961  // Clear previous digits in the list
962  if(fgDigitsArr)
963  {
964  fgDigitsArr->Clear("C");
965  }
966  else
967  {
968  // It should not happen, but just in case ...
969  fgDigitsArr = new TClonesArray("AliEMCALDigit",100);
970  }
971 
972  // Read the digits from the input tree
973  TBranch *branch = digitsTree->GetBranch("EMCAL");
974  if (!branch)
975  {
976  AliError("can't get the branch with the EMCAL digits !");
977  return;
978  }
979 
980  branch->SetAddress(&fgDigitsArr);
981  branch->GetEntry(0);
982 }
983 
990 //==================================================================================
991 Bool_t AliEMCALReconstructor::CalculateResidual(AliESDtrack *track, AliESDCaloCluster *cluster, Float_t &dEta, Float_t &dPhi)const
992 {
993  dEta = -999, dPhi = -999;
994  Bool_t ITSTrackSA = 0;
995 
996  AliExternalTrackParam *trkParam = 0;
997 
998  const AliESDfriendTrack* friendTrack = track->GetFriendTrack();
999  if(friendTrack && friendTrack->GetTPCOut())
1000  trkParam = const_cast<AliExternalTrackParam*>(friendTrack->GetTPCOut());
1001  else if(track->GetInnerParam())
1002  trkParam = const_cast<AliExternalTrackParam*>(track->GetInnerParam());
1003  else
1004  {
1005  trkParam = new AliExternalTrackParam(*track); //If there is ITSSa track
1006  ITSTrackSA = 1;
1007  }
1008  if(!trkParam) return kFALSE;
1009 
1010  AliExternalTrackParam trkParamTmp (*trkParam);
1011  if(!AliEMCALRecoUtilsBase::ExtrapolateTrackToCluster(&trkParamTmp, cluster, track->GetMass(kTRUE), GetRecParam()->GetExtrapolateStep(), dEta, dPhi))
1012  {
1013  if(ITSTrackSA) delete trkParam;
1014  return kFALSE;
1015  }
1016 
1017  if(ITSTrackSA) delete trkParam;
1018  return kTRUE;
1019 }
1020 
1024 //==================================================================================
1026  : TObject(),
1027  fIndexT(-1),
1028  fDistance(-999.),
1029  fdEta(-999.),
1030  fdPhi(-999.)
1031 {
1032 }
1033 
1037 //==================================================================================
1039  : TObject(),
1040  fIndexT(copy.fIndexT),
1041  fDistance(copy.fDistance),
1042  fdEta(copy.fdEta),
1043  fdPhi(copy.fdPhi)
1044 {
1045 }
1046 
1050 //_____________________________________________________________________
1051 AliEMCALReconstructor::AliEMCALMatch& AliEMCALReconstructor::AliEMCALMatch::AliEMCALMatch::operator = (const AliEMCALMatch &source)
1052 {
1053  if (&source == this) return *this;
1054 
1055  new (this) AliEMCALMatch(source);
1056  return *this;
1057 }
1058 
1062 //==================================================================================
1063 Int_t AliEMCALReconstructor::AliEMCALMatch::Compare(const TObject *obj) const
1064 {
1066 
1067  Double_t thisDist = fDistance;//fDistance;
1068  Double_t thatDist = that->fDistance;//that->GetDistance();
1069 
1070  if (thisDist > thatDist) return 1;
1071  else if (thisDist < thatDist) return -1;
1072  return 0;
1073 }
AliEMCALCalibData * fCalibData
! Access to OCDB energy calibration database if available
static AliRunLoader * Instance()
Definition: AliRunLoader.h:176
AliESDCaloCluster * GetCaloCluster(Int_t i) const
Definition: AliESDEvent.h:500
virtual void FillESD(TTree *digitsTree, TTree *clustersTree, AliESDEvent *esd) const
virtual void Calibrate(Float_t &amp, Float_t &time, const Int_t cellId)
AliTPCcalibPID * pid
Definition: CalibPID.C:69
void InitTriggerElectronics() const
Init the fgTriggerProcessor.
void Print(Option_t *opt="") const
Print the list of timers we manage.
void RunPID(AliESDEvent *esd)
Definition: AliEMCALPID.cxx:63
virtual void Digits2Clusters(Option_t *option)=0
TList * fMatches
! Collection of matches between tracks and clusters
AliESDVZERO * GetVZEROData() const
Definition: AliESDEvent.h:281
Int_t GetRun() const
Float_t GetDEParent(Int_t index) const
void SetM02(Double_t m02)
virtual void Digits2Trigger(TClonesArray *digits, const Int_t V0M[], AliEMCALTriggerData *data)
Digits to trigger.
Bool_t Add(Int_t col, Int_t row, Float_t amp, Float_t time, Int_t trgtimes[], Int_t ntrgtimes, Int_t trgts, Int_t trgbits)
#define AliDebugLevel()
const AliExternalTrackParam * GetInnerParam() const
Definition: AliESDtrack.h:132
Bool_t CalculateResidual(AliESDtrack *track, AliESDCaloCluster *cluster, Float_t &dEta, Float_t &dPhi) const
void AddTracksMatched(TArrayI &array)
static AliEMCALClusterizer * fgClusterizer
Access to the clusterization tools.
#define TObjArray
Float_t GetTime(void) const
Definition: AliEMCALDigit.h:64
EMCal trigger raw digits.
virtual Float_t * GetParentsDE() const
TArrayI * GetTracksMatched() const
static const AliEMCALRecParam * GetRecParam()
static const Char_t * GetDefaultGeometryName()
const char * path
Int_t GetId() const
void SetE(Double_t ene)
virtual void ConvertDigits(AliRawReader *rawReader, TTree *digitsTree) const
virtual void Print(const Option_t *opt) const
Dump raw digit info.
Int_t GetEMCALcluster() const
Definition: AliESDtrack.h:408
static TObjArray * fgClustersArr
Temporary array with clusters, to be reused in the event.
Bool_t GetMaximum(Int_t &amplitude, Int_t &time) const
Checks the maximum amplitude in the time sample.
Double_t fDistance
Track - cluster distance.
virtual Float_t GetDispersion() const
void SetRemoveBadChannels(Bool_t val)
void SetCellsAbsId(UShort_t *array)
void SetEMCALMatrix(TGeoHMatrix *matrix, Int_t i)
Definition: AliESDEvent.h:160
Int_t GetID() const
void SetReconstructor(Bool_t yesno)
Definition: AliEMCALPID.h:72
Double_t fdEta
Track - cluster residual in eta.
static TClonesArray * fgDigitsArr
Temporary array with digits, to be reused in the event.
static const AliEMCALRecParam * fgkRecParam
Access to OCDB reconstruction parameters.
AliESDCalofriend * fESDCalofriend
void SetType(Char_t type)
virtual Float_t GetEnergy() const
Int_t GetNumberOfSuperModules(void) const
virtual void SetOutput(TTree *clustersTree)
Set the tree with output clusters.
static AliEMCALGeometry * GetInstanceFromRunNumber(Int_t runNumber, TString geoName="", const Text_t *mcname="TGeant3", const Text_t *mctitle="")
Cell energy calibration factors container class.
AliCaloCalibPedestal * fPedestalData
! Access to OCDB tower status database if available
AliTPCfastTrack * track
Int_t AddCaloCluster(const AliESDCaloCluster *c)
virtual UShort_t GetTriggerChargeC() const
Definition: AliESDVZERO.h:93
void CreateContainer(Short_t nCells)
Container of reconstruction parameters.
Int_t GetFittingAlgorithm() const
Double_t GetExtrapolateStep() const
const AliEMCALTriggerDCSConfig * GetTriggerDCSConfig()
Get DCS config.
EMCal digits object.
Definition: AliEMCALDigit.h:30
void GetALTROSamplesHG(Int_t samples[64]) const
Int_t GetIparent(Int_t index) const
#define AliWarning(message)
Definition: AliLog.h:541
Clusterize neighbour cells, split if several maxima.
Short_t GetNExMax(void) const
EMCal trigger electronics manager L0/L1.
void SetFALTROUsage(Bool_t val)
Int_t GetNALTROSamplesHG() const
Definition: AliEMCALDigit.h:89
void SetNPedSamples(Int_t val)
Int_t GetNTotalTRU() const
AliCDBEntry * Get(const AliCDBId &query, Bool_t forceCaching=kFALSE)
void Allocate(Int_t size)
Int_t GetNALTROSamplesLG() const
Definition: AliEMCALDigit.h:86
void SetOption(const Option_t *opt)
void SetCaloTriggerType(const Int_t *type)
Definition: AliESDEvent.h:162
Int_t Compare(const TObject *obj) const
Int_t GetMultiplicity(void) const
virtual void Reconstruct(TTree *digitsTree, TTree *clustersTree) const
void SetMedian(Int_t i, Int_t m)
Bool_t Add(Int_t id, Int_t type, Int_t nsamples, Int_t samples[])
TObject * GetObject()
Definition: AliCDBEntry.h:56
void SetNoiseThreshold(Int_t val)
void SetDispersion(Double_t disp)
static Bool_t ExtrapolateTrackToCluster(AliExternalTrackParam *trkParam, const AliVCluster *cluster, Double_t mass, Double_t step, Float_t &tmpEta, Float_t &tmpPhi)
void SetTriggerBitWord(Int_t w)
void SetChi2(Double_t chi2)
const AliExternalTrackParam * GetTPCOut() const
void GetALTROSamplesLG(Int_t samples[64]) const
AliESDCaloTrigger * GetCaloTrigger(TString calo) const
Definition: AliESDEvent.h:509
void Allocate(Int_t size)
virtual void InitClusterizer() const
void ReadDigitsArrayFromTree(TTree *digitsTree) const
void SetL1FrameMask(Int_t m)
#define AliInfo(message)
Definition: AliLog.h:484
AliESDCaloCells * GetEMCALCells() const
Definition: AliESDEvent.h:506
Container with calorimeter trigger information in the ESD event.
Int_t * GetAbsId() const
Int_t fIndexT
Track index in &#39;fTracks&#39; array.
Short_t GetClusterizerFlag() const
void SetM20(Double_t m20)
EMCal rec_points object.
#define AliCodeTimerAuto(message, counter)
Definition: AliCodeTimer.h:137
TGeoManager * gGeoManager
void SetTrackDistance(Double_t dx, Double_t dz)
virtual Option_t * GetOption() const
AliEMCALCalibTime * fCalibTime
! Access to OCDB time calibration database if available
Float_t * GetEnergiesList() const
void SetClusterMCEdepFractionFromEdepArray(Float_t *array)
virtual void SetInput(TTree *digitsTree)
Read the digits from the input tree.
virtual AliEMCALGeometry * GetGeometry() const
Definition: AliEMCAL.cxx:466
Double_t GetCellAmplitude(Short_t cellNumber)
Int_t GetSMType(Int_t nSupMod) const
Double_t GetMass(Bool_t tpcOnly=kFALSE) const
Definition: AliESDtrack.h:98
Cell time shifts container class.
TObject * FindListObject(const char *name) const
static AliCodeTimer * Instance()
Unique instance of this class, which is a singleton.
Int_t GetType() const
Definition: AliEMCALDigit.h:69
Base Class for EMCAL description.
Definition: AliEMCAL.h:35
AliTPCcalibV0 v0
Clusterize neighbour cells, no split, unfolding possible.
AliEMCALGeometry * fGeom
Not implemented.
Calorimeter cluster data container.
pedestal/bad map monitoring and calibration tools
Definition: AliCDBEntry.h:18
static AliEMCALTriggerDCSConfigDB * Instance()
static TClonesArray * fgTriggerDigits
Temporary array with trigger digits, to be reused in the event.
#define AliFatal(message)
Definition: AliLog.h:640
void Raw2Digits(AliRawReader *reader, TClonesArray *digitsArr, const AliCaloCalibPedestal *pedbadmap, TClonesArray *digitsTRG=0x0, TClonesArray *trgData=0x0)
static AliEMCALRawUtils * fgRawUtils
Access to raw fitting tools.
void SetNExMax(UChar_t nExMax)
static TClonesArray * fgTriggerData
Trigger parameters data container.
virtual UShort_t GetTriggerChargeA() const
Definition: AliESDVZERO.h:92
void SetFittingAlgorithm(Int_t val)
Create clusters of maximum size NxM.
Bool_t IsEMCAL() const
Int_t GetNSamples() const
Bool_t GetSamples(Int_t samples[64], Int_t ns) const
void SetEMCALcluster(Int_t index)
Definition: AliESDtrack.h:409
Int_t GetTriggerMappingVersion() const
#define AliDebug(logLevel, message)
Definition: AliLog.h:300
virtual void GetGlobalPosition(TVector3 &gpos) const
void SetCalofriend(AliESDCalofriend *obj)
void SetL1PhaseUsage(Bool_t val)
virtual Int_t * GetParents(Int_t &number) const
Bool_t GetUnfold() const
virtual void InitParameters()
Initializes the parameters for the Clusterizer from AliEMCALReconstructor::GetRecParam().
Float_t GetDistanceToBadTower() const
Int_t GetId() const
Definition: AliDigitNew.h:23
virtual const char * Version() const
Bool_t SetCell(Short_t pos, Short_t cellNumber, Double_t amplitude, Double_t time, Int_t mclabel=-1, Double_t efrac=0., Bool_t isHG=kFALSE)
void SetL1V0(const Int_t *v)
Int_t GetNumberOfTracks() const
Definition: AliESDEvent.h:536
void SetLabel(Int_t *array, UInt_t size)
AliESDtrack * GetTrack(Int_t i) const
Definition: AliESDEvent.h:405
static Int_t runNumber
Definition: pdc06_config.C:126
const TGeoHMatrix * GetEMCALMatrix(Int_t i) const
Definition: AliESDEvent.h:161
const AliESDfriendTrack * GetFriendTrack() const
Definition: AliESDtrack.h:59
Compute cluster PID weights.
Definition: AliEMCALPID.h:58
UInt_t PackMCEdepFraction(Float_t *eDep) const
Handling of raw data.
void SetL1Threshold(Int_t i, Int_t thr)
Int_t GetNumberOfCaloClusters() const
Definition: AliESDEvent.h:557
AliDetector * GetDetector(const char *name) const
Definition: AliRun.cxx:200
Float_t GetTime(void) const
#define AliError(message)
Definition: AliLog.h:591
Bool_t GetL0Times(Int_t times[]) const
Get L0 times.
static AliEMCALGeometry * GetInstance()
Int_t GetNiparent() const
Definition: AliEMCALDigit.h:60
void SetCellsAmplitudeFraction(Double32_t *array)
Class for calorimeter cell ESD data handling.
Clusterize neighbour cells, split if several maxima.
static AliCDBManager * Instance(TMap *entryCache=NULL, Int_t run=-1)
void dPhi()
Definition: CalibAlign.C:462
Bool_t GetPositionInEMCALFromAbsFastORIndex(const Int_t id, Int_t &iEta, Int_t &iPhi) const
void FillMisalMatrixes(AliESDEvent *esd) const
void SetNCells(Int_t n)
void SetType(Char_t t)
Short_t GetCellPosition(Short_t cellNumber)
void SetCellsMCEdepFractionMap(UInt_t *array)
Double_t fdPhi
Track - cluster residual in phi.
Float_t GetAmplitude() const
Definition: AliEMCALDigit.h:55
void SetPosition(Float_t *x)
void SetNumberOfCells(Int_t n)
virtual void GetElipsAxis(Float_t *lambda) const
void SetDistanceToBadChannel(Double_t dist)
virtual void DeleteRecPoints()
Free the cluster array.
Base class for the clusterization algorithm (pure abstract)
AliRun * GetAliRun() const
Wrapping class for EMCal reconstruction.
static AliEMCALTriggerElectronics * fgTriggerProcessor
Trigger preprocessor.
Int_t GetEventSpecie() const
void SetTOF(Double_t tof)