1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //_________________________________________________________________________
19 // Implementation version v1 of the EMCAL particle identifier
21 //*-- Author: Yves Schutz (SUBATECH)
23 // --- ROOT system ---
26 #include "TBenchmark.h"
29 // --- Standard library ---
31 // --- AliRoot header files ---
32 #include "AliGenerator.h"
33 #include "AliEMCALPIDv1.h"
34 #include "AliEMCALRecParticle.h"
35 #include "AliEMCALGetter.h"
37 ClassImp( AliEMCALPIDv1)
39 //____________________________________________________________________________
40 AliEMCALPIDv1::AliEMCALPIDv1():AliEMCALPID()
45 fDefaultInit = kTRUE ;
49 //____________________________________________________________________________
50 AliEMCALPIDv1::AliEMCALPIDv1(const AliEMCALPIDv1 & pid ):AliEMCALPID(pid)
58 //____________________________________________________________________________
59 AliEMCALPIDv1::AliEMCALPIDv1(const TString alirunFileName, const TString eventFolderName):AliEMCALPID(alirunFileName, eventFolderName)
61 //ctor with the indication on where to look for the track segments
65 fDefaultInit = kFALSE ;
69 //____________________________________________________________________________
70 AliEMCALPIDv1::~AliEMCALPIDv1()
75 //____________________________________________________________________________
76 const TString AliEMCALPIDv1::BranchName() const
82 //____________________________________________________________________________
83 Float_t AliEMCALPIDv1::GetCalibratedEnergy(Float_t e) const
85 // It calibrates Energy depending on the recpoint energy.
86 // The energy of the reconstructed cluster is corrected with
87 // the formula A + B* E + C* E^2, whose parameters where obtained
88 // through the study of the reconstructed energy distribution of
89 // monoenergetic photons.
91 //Float_t p[]={0.,0.,0.};
92 //for (Int_t i=0; i<3; i++) p[i] = GetParameterCalibration(i);
93 Float_t enerec = e ; // p[0] + p[1]*e + p[2]*e*e;
97 //____________________________________________________________________________
98 TVector3 AliEMCALPIDv1::GetMomentumDirection(AliEMCALRecPoint * emc)const
100 // Calculates the momentum direction:
101 // direction is given by IP and this RecPoint
104 TVector3 dir(0,0,0) ;
105 TVector3 emcglobalpos ;
108 emc->GetGlobalPosition(emcglobalpos) ;
112 // dir.SetMag(1.) ; Removed to avoid warings !!!!!!!!!!!!!! TO BE REVISED
114 //account correction to the position of IP
115 Float_t xo,yo,zo ; //Coordinates of the origin
116 gAlice->Generator()->GetOrigin(xo,yo,zo) ;
117 TVector3 origin(xo,yo,zo);
123 //____________________________________________________________________________
124 void AliEMCALPIDv1::Init()
126 // Make all memory allocations that are not possible in default constructor
127 // Add the PID task to the list of EMCAL tasks
130 AliEMCALGetter * gime = AliEMCALGetter::Instance(GetTitle(), fEventFolderName.Data()) ;
133 gime->PostPID(this) ;
136 //____________________________________________________________________________
137 void AliEMCALPIDv1::InitParameters()
139 // Initialize the parameters
140 fRecParticlesInRun = 0 ;
142 fRecParticlesInRun = 0 ;
145 //____________________________________________________________________________
147 void AliEMCALPIDv1::Exec(Option_t * option)
151 if(strstr(option,"tim"))
152 gBenchmark->Start("EMCALPID");
154 if(strstr(option,"print")) {
158 AliEMCALGetter * gime = AliEMCALGetter::Instance(GetTitle()) ;
160 if (fLastEvent == -1)
161 fLastEvent = gime->MaxEvent() - 1 ;
163 fLastEvent = TMath::Min(fLastEvent,gime->MaxEvent());
164 Int_t nEvents = fLastEvent - fFirstEvent + 1;
169 for (ievent = fFirstEvent; ievent <= fLastEvent; ievent++) {
170 gime->Event(ievent,"R") ;
173 if(strstr(option,"deb"))
174 PrintRecParticles(option) ;
175 //increment the total number of rec particles per run
176 fRecParticlesInRun += gime->RecParticles()->GetEntriesFast() ;
179 if(strstr(option,"tim")){
180 gBenchmark->Stop("EMCALPID");
181 printf("Exec: took %f seconds for PID %f seconds per event",
182 gBenchmark->GetCpuTime("EMCALPID"),
183 gBenchmark->GetCpuTime("EMCALPID")/nEvents) ;
189 //____________________________________________________________________________
190 void AliEMCALPIDv1::MakeRecParticles(){
192 // Makes a RecParticle out of a TrackSegment
194 AliEMCALGetter * gime = AliEMCALGetter::Instance() ;
195 TObjArray * aECARecPoints = gime->ECARecPoints() ;
196 if ( !aECARecPoints ) {
197 Fatal("MakeRecParticles", "RecPoints or TrackSegments not found !") ;
199 TClonesArray * recParticles = gime->RecParticles() ;
200 recParticles->Clear();
202 TIter next(aECARecPoints) ;
203 AliEMCALRecPoint * eca ;
205 AliEMCALRecParticle * rp ;
206 while ( (eca = (AliEMCALRecPoint *)next()) ) {
208 new( (*recParticles)[index] ) AliEMCALRecParticle() ;
209 rp = (AliEMCALRecParticle *)recParticles->At(index) ;
210 rp->SetRecPoint(index) ;
211 rp->SetIndexInList(index) ;
213 // Now set type (reconstructed) of the particle
215 // Choose the cluster energy range
218 eca->GetElipsAxis(lambda) ;
220 if((lambda[0]>0.01) && (lambda[1]>0.01)){
221 // Looking PCA. Define and calculate the data (X),
222 // introduce in the function X2P that gives the components (P).
225 Float_t emaxdtotal = 0. ;
227 if((lambda[0]+lambda[1])!=0)
228 spher=fabs(lambda[0]-lambda[1])/(lambda[0]+lambda[1]);
230 emaxdtotal=eca->GetMaximalEnergy()/eca->GetEnergy();
233 // Float_t time = eca->GetTime() ;
235 //Set momentum, energy and other parameters
236 Float_t encal = GetCalibratedEnergy(eca->GetEnergy());
237 TVector3 dir = GetMomentumDirection(eca) ;
238 // dir.SetMag(encal) ;Removed to avoid warings !!!!!!!!!!!!!! TO BE REVISED
239 rp->SetMomentum(dir.X(),dir.Y(),dir.Z(),encal) ;
241 rp->Name(); //If photon sets the particle pdg name to gamma
242 rp->SetProductionVertex(0,0,0,0);
243 rp->SetFirstMother(-1);
244 rp->SetLastMother(-1);
245 rp->SetFirstDaughter(-1);
246 rp->SetLastDaughter(-1);
247 rp->SetPolarisation(0,0,0);
248 //Set the position in global coordinate system from the RecPoint
249 //AliEMCALGeometry * geom = gime->EMCALGeometry() ;
250 //AliEMCALTowerRecPoint * erp = gime->ECARecPoint(rp->GetEMCALRPIndex()) ;
252 //geom->GetGlobal(erp, pos) ; !!!!!!!!!! to check
261 //____________________________________________________________________________
262 void AliEMCALPIDv1:: Print(Option_t * /*option*/) const
264 // Print the parameters used for the particle type identification
266 printf("Print: =============== AliEMCALPID1 ================") ;
267 printf("Making PID\n");
268 printf(" Pricipal analysis file from 0.5 to 100 %s\n", fFileName.Data() ) ;
269 printf(" Name of parameters file %s\n", fFileNamePar.Data() ) ;
272 //____________________________________________________________________________
273 void AliEMCALPIDv1::Print() const
275 // Print the parameters used for the particle type identification
277 Info("Print", "=============== AliEMCALPIDv1 ================") ;
280 //____________________________________________________________________________
281 void AliEMCALPIDv1::PrintRecParticles(Option_t * option)
283 // Print table of reconstructed particles
285 AliEMCALGetter *gime = AliEMCALGetter::Instance() ;
287 TClonesArray * recParticles = gime->RecParticles() ;
289 printf("\nevent %i", gAlice->GetEvNumber());
290 printf(" found %i", recParticles->GetEntriesFast());
291 printf(" RecParticles\n");
293 if(strstr(option,"all")) { // printing found TS
294 printf("\n PARTICLE Index \n");
297 for (index = 0 ; index < recParticles->GetEntries() ; index++) {
298 AliEMCALRecParticle * rp = (AliEMCALRecParticle * ) recParticles->At(index) ;
300 printf(rp->Name().Data());
301 printf(" %i", rp->GetIndexInList());
302 printf(" %i", rp->GetType());
307 //____________________________________________________________________________
308 void AliEMCALPIDv1::Unload()
310 // Unloads RecPoints, TrackSegments and RecParticles from the folder
311 AliEMCALGetter * gime = AliEMCALGetter::Instance() ;
312 gime->EmcalLoader()->UnloadRecPoints() ;
313 gime->EmcalLoader()->UnloadTracks() ;
314 gime->EmcalLoader()->UnloadRecParticles() ;
317 //____________________________________________________________________________
318 void AliEMCALPIDv1::WriteRecParticles()
320 // Write RecParticles array to file
321 AliEMCALGetter *gime = AliEMCALGetter::Instance() ;
323 TClonesArray * recParticles = gime->RecParticles() ;
324 recParticles->Expand(recParticles->GetEntriesFast() ) ;
325 TTree * treeP = gime->TreeP() ;
330 Int_t bufferSize = 32000 ;
331 TBranch * rpBranch = treeP->Branch("EMCALRP",&recParticles,bufferSize);
332 rpBranch->SetTitle(BranchName());
336 gime->WriteRecParticles("OVERWRITE");
337 gime->WritePID("OVERWRITE");