]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PHOS/AliPHOSReconstructor.cxx
f2e46973c8892005eb43e108eff88447338d3577
[u/mrichter/AliRoot.git] / PHOS / AliPHOSReconstructor.cxx
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 /* $Id$ */
17
18 //_________________________________________________________________________
19 //*--
20 //*-- Yves Schutz (SUBATECH) 
21 // Reconstruction class. Redesigned from the old AliReconstructionner class and 
22 // derived from STEER/AliReconstructor. 
23 // 
24 // --- ROOT system ---
25
26 // --- Standard library ---
27
28 // --- AliRoot header files ---
29 #include "AliESD.h"
30 #include "AliPHOSReconstructor.h"
31 #include "AliPHOSClusterizerv1.h"
32 #include "AliPHOSTrackSegmentMakerv1.h"
33 #include "AliPHOSPIDv1.h"
34 #include "AliPHOSGetter.h"
35 #include "AliPHOSTracker.h"
36 #include "AliRawReader.h"
37 #include "AliPHOSTrigger.h"
38 #include "AliPHOSGeometry.h"
39
40 ClassImp(AliPHOSReconstructor)
41
42 Bool_t AliPHOSReconstructor::fgDebug = kFALSE ; 
43
44 //____________________________________________________________________________
45   AliPHOSReconstructor::AliPHOSReconstructor() 
46 {
47   // ctor
48
49
50
51 //____________________________________________________________________________
52   AliPHOSReconstructor::~AliPHOSReconstructor()
53 {
54   // dtor
55
56
57
58 //____________________________________________________________________________
59 void AliPHOSReconstructor::Reconstruct(AliRunLoader* runLoader) const
60 {
61   // method called by AliReconstruction; 
62   // Only the clusterization is performed,; the rest of the reconstruction is done in FillESD because the track
63   // segment maker needs access to the AliESD object to retrieve the tracks reconstructed by 
64   // the global tracking.
65  
66   TString headerFile(runLoader->GetFileName()) ; 
67   TString branchName(runLoader->GetEventFolder()->GetName()) ;  
68   
69   AliPHOSClusterizerv1 clu(headerFile, branchName);
70   clu.SetEventRange(0, -1) ; // do all the events
71   if ( Debug() ) 
72     clu.ExecuteTask("deb all") ; 
73   else 
74     clu.ExecuteTask("") ;  
75
76 }
77
78 //____________________________________________________________________________
79 void AliPHOSReconstructor::Reconstruct(AliRunLoader* runLoader, AliRawReader* rawreader) const
80 {
81   // method called by AliReconstruction; 
82   // Only the clusterization is performed,; the rest of the reconstruction is done in FillESD because the track
83   // segment maker needs access to the AliESD object to retrieve the tracks reconstructed by 
84   // the global tracking.
85   // Here we reconstruct from Raw Data
86
87   rawreader->Reset() ; 
88   TString headerFile(runLoader->GetFileName()) ; 
89   TString branchName(runLoader->GetEventFolder()->GetName()) ;  
90   
91   AliPHOSClusterizerv1 clu(headerFile, branchName);
92   clu.SetEventRange(0, -1) ; // do all the events
93   clu.SetRawReader(rawreader);
94
95   TString option = GetOption();
96   if (option.Contains("OldRCUFormat"))
97     clu.SetOldRCUFormat(kTRUE);
98
99   if ( Debug() ) 
100     clu.ExecuteTask("deb all") ; 
101   else 
102     clu.ExecuteTask("") ;
103
104 }
105
106 //____________________________________________________________________________
107 void AliPHOSReconstructor::FillESD(AliRunLoader* runLoader, AliESD* esd) const
108 {
109   // This function creates AliESDtracks from AliPHOSRecParticles
110   //         and
111   // writes them to the ESD
112
113   Int_t eventNumber = runLoader->GetEventNumber() ;
114
115   AliPHOSGetter *gime = AliPHOSGetter::Instance();
116   gime->Event(eventNumber, "DRTP") ; 
117   TClonesArray *recParticles  = gime->RecParticles();
118   Int_t nOfRecParticles = recParticles->GetEntries();
119
120   esd->SetNumberOfPHOSClusters(nOfRecParticles) ; 
121   esd->SetFirstPHOSCluster(esd->GetNumberOfCaloClusters()) ;
122   
123   AliDebug(2,Form("%d digits and %d rec. particles in event %d, option %s",gime->Digits()->GetEntries(),nOfRecParticles,eventNumber,GetOption()));
124
125
126   //#########Calculate trigger and set trigger info###########
127  
128   AliPHOSTrigger tr ;
129   //   tr.SetPatchSize(1);//create 4x4 patches
130   tr.Trigger();
131   
132   Float_t maxAmp2x2  = tr.Get2x2MaxAmplitude();
133   Float_t maxAmpnxn  = tr.GetnxnMaxAmplitude();
134   Float_t ampOutOfPatch2x2  = tr.Get2x2AmpOutOfPatch() ;
135   Float_t ampOutOfPatchnxn  = tr.GetnxnAmpOutOfPatch() ;
136
137   AliPHOSGeometry * geom = gime->PHOSGeometry();
138
139   Int_t iSM2x2      = tr.Get2x2SuperModule();
140   Int_t iSMnxn      = tr.GetnxnSuperModule();
141   Int_t iCrystalPhi2x2 = tr.Get2x2CrystalPhi();
142   Int_t iCrystalPhinxn = tr.GetnxnCrystalPhi();
143   Int_t iCrystalEta2x2 = tr.Get2x2CrystalEta();
144   Int_t iCrystalEtanxn = tr.GetnxnCrystalEta();
145
146   AliDebug(2, Form("Trigger 2x2 max amp %f, out amp %f, SM %d, iphi %d ieta %d",  maxAmp2x2, ampOutOfPatch2x2, iSM2x2,iCrystalPhi2x2, iCrystalEta2x2));
147   AliDebug(2, Form("Trigger 4x4 max amp %f , out amp %f, SM %d, iphi %d, ieta %d",  maxAmpnxn, ampOutOfPatchnxn, iSMnxn,iCrystalPhinxn, iCrystalEtanxn));
148
149   Int_t iRelId2x2 []= {iSM2x2+1,0,iCrystalPhi2x2,iCrystalEta2x2};// PHOS modules in order to calculate AbsId need to be 1-5 not 0-4 as returns trigger.
150   Int_t iAbsId2x2 =-1;
151   Int_t iRelIdnxn []= {iSMnxn+1,0,iCrystalPhinxn,iCrystalEtanxn};// PHOS modules in order to calculate AbsId need to be 1-5 not 0-4 as returns trigger.
152   Int_t iAbsIdnxn =-1;
153   TVector3    pos2x2(-1,-1,-1);
154   TVector3    posnxn(-1,-1,-1);
155   geom->RelToAbsNumbering(iRelId2x2, iAbsId2x2);
156   geom->RelToAbsNumbering(iRelIdnxn, iAbsIdnxn);
157   geom->RelPosInAlice(iAbsId2x2, pos2x2);
158   geom->RelPosInAlice(iAbsIdnxn, posnxn);
159
160   TArrayF triggerPosition(6);
161   triggerPosition[0] = pos2x2(0) ;   
162   triggerPosition[1] = pos2x2(1) ;   
163   triggerPosition[2] = pos2x2(2) ;  
164   triggerPosition[3] = posnxn(0) ;   
165   triggerPosition[4] = posnxn(1) ;   
166   triggerPosition[5] = posnxn(2) ;  
167
168   TArrayF triggerAmplitudes(4);
169   triggerAmplitudes[0] = maxAmp2x2 ;   
170   triggerAmplitudes[1] = ampOutOfPatch2x2 ;    
171   triggerAmplitudes[2] = maxAmpnxn ;   
172   triggerAmplitudes[3] = ampOutOfPatchnxn ;   
173
174   //esd->SetPHOSTriggerCells(triggerPosition);
175   esd->AddPHOSTriggerPosition(triggerPosition);
176   esd->AddPHOSTriggerAmplitudes(triggerAmplitudes);
177   
178   //######################################
179
180   //Fill CaloClusters 
181   for (Int_t recpart = 0 ; recpart < nOfRecParticles ; recpart++) {
182     AliPHOSRecParticle * rp = dynamic_cast<AliPHOSRecParticle*>(recParticles->At(recpart));
183     if (Debug()) 
184       rp->Print();
185     // Get track segment and EMC rec.point associated with this rec.particle
186     AliPHOSTrackSegment *ts    = gime->TrackSegment(rp->GetPHOSTSIndex());
187     AliPHOSEmcRecPoint  *emcRP = gime->EmcRecPoint(ts->GetEmcIndex());
188     AliESDCaloCluster   *ec    = new AliESDCaloCluster() ; 
189
190   // fills the ESDCaloCluster
191     Float_t xyz[3];
192     for (Int_t ixyz=0; ixyz<3; ixyz++) 
193       xyz[ixyz] = rp->GetPos()[ixyz];
194     
195     AliDebug(2,Form("Global position xyz=(%f,%f,%f)",xyz[0],xyz[1],xyz[2]));
196     
197
198     Int_t  digitMult  = emcRP->GetDigitsMultiplicity();
199     Int_t *digitsList = emcRP->GetDigitsList();
200     UShort_t *amplList  = new UShort_t[digitMult];
201     UShort_t *timeList  = new UShort_t[digitMult];
202     UShort_t *digiList  = new UShort_t[digitMult];
203
204     // Convert Float_t* and Int_t* to UShort_t* to save memory
205     for (Int_t iDigit=0; iDigit<digitMult; iDigit++) {
206       AliPHOSDigit *digit = gime->Digit(digitsList[iDigit]);
207       amplList[iDigit] = (UShort_t)(digit->GetEnergy()*500); // Energy in units of GeV/500
208       timeList[iDigit] = (UShort_t)(digit->GetTime()*1e9*100); // time in units of 0.01 ns
209       digiList[iDigit] = (UShort_t)(digit->GetId());
210     }
211
212     ec->SetPHOS(kTRUE);
213     ec->SetGlobalPosition(xyz);                 //rec.point position in MARS
214     ec->SetClusterEnergy(rp->Energy());         //total particle energy
215     ec->SetClusterDisp(emcRP->GetDispersion()); //cluster dispersion
216     ec->SetPid          (rp->GetPID()) ;        //array of particle identification
217     ec->SetM02(emcRP->GetM2x()) ;               //second moment M2x
218     ec->SetM20(emcRP->GetM2z()) ;               //second moment M2z
219     ec->SetNExMax(emcRP->GetNExMax());          //number of local maxima
220     ec->SetNumberOfDigits(digitMult);           //digit multiplicity
221     ec->SetDigitAmplitude(amplList);            //energies in 1/500 of GeV
222     ec->SetDigitTime(timeList);                 //times in 1/100 on ns
223     ec->SetDigitIndex(digiList);                //abs id of the cell
224     ec->SetEmcCpvDistance(-1);                  //not yet implemented
225     ec->SetClusterChi2(-1);                     //not yet implemented
226     ec->SetM11(-1) ;                            //not yet implemented
227  
228     //Distance to the nearest bad crystal
229     ec->SetDistanceToBadChannel(emcRP->GetDistanceToBadCrystal()); 
230
231     //Primaries
232     ec->SetPrimaryIndex(rp->GetPrimaryIndex());
233     Int_t  primMult  = 0;
234     Int_t *primInts =  emcRP->GetPrimaries(primMult);
235     ec->SetNumberOfPrimaries(primMult);           //primary multiplicity
236     UShort_t *primList = new UShort_t[primMult];
237     for (Int_t ipr=0; ipr<primMult; ipr++) 
238       primList[ipr] = (UShort_t)(primInts[ipr]);         
239     ec->SetListOfPrimaries(primList);                  //primary List for a cluster
240     
241     // add the track to the esd object
242     esd->AddCaloCluster(ec);
243     delete ec;    
244   }  
245 }
246
247 //____________________________________________________________________________
248 void AliPHOSReconstructor::FillESD(AliRunLoader* runLoader,
249                                    AliRawReader* rawReader, AliESD* esd) const
250 {
251   //This function creates AliESDtracks from AliPHOSRecParticles 
252   //and writes them to the ESD in the case of raw data reconstruction.
253
254   Int_t eventNumber = runLoader->GetEventNumber() ;
255
256   AliPHOSGetter *gime = AliPHOSGetter::Instance();
257   gime->Event(eventNumber, "DRTP") ; 
258
259   TClonesArray *recParticles  = gime->RecParticles();
260   Int_t nOfRecParticles = recParticles->GetEntries();
261
262   esd->SetNumberOfPHOSClusters(nOfRecParticles) ; 
263   esd->SetFirstPHOSCluster(esd->GetNumberOfCaloClusters()) ;
264   
265   AliDebug(2,Form("%d digits and %d rec. particles in event %d, option %s",gime->Digits()->GetEntries(),nOfRecParticles,eventNumber,GetOption()));
266
267   for (Int_t recpart = 0 ; recpart < nOfRecParticles ; recpart++) {
268     AliPHOSRecParticle * rp = dynamic_cast<AliPHOSRecParticle*>(recParticles->At(recpart));
269
270     if(rp) {
271     Float_t xyz[3];
272     for (Int_t ixyz=0; ixyz<3; ixyz++) 
273       xyz[ixyz] = rp->GetPos()[ixyz];
274
275     AliDebug(2,Form("Global position xyz=(%f,%f,%f)",xyz[0],xyz[1],xyz[2]));
276     
277     AliPHOSTrackSegment *ts    = gime->TrackSegment(rp->GetPHOSTSIndex());
278     AliPHOSEmcRecPoint  *emcRP = gime->EmcRecPoint(ts->GetEmcIndex());
279     AliESDCaloCluster   *ec    = new AliESDCaloCluster() ; 
280
281     Int_t  digitMult  = emcRP->GetDigitsMultiplicity();
282     Int_t *digitsList = emcRP->GetDigitsList();
283     UShort_t *amplList  = new UShort_t[digitMult];
284     UShort_t *digiList  = new UShort_t[digitMult];
285
286     // Convert Float_t* and Int_t* to UShort_t* to save memory
287     for (Int_t iDigit=0; iDigit<digitMult; iDigit++) {
288       AliPHOSDigit *digit = gime->Digit(digitsList[iDigit]);
289       if(!digit) {
290         AliFatal(Form("Digit not found at the expected position %d!",iDigit));
291       }
292       else {
293         amplList[iDigit] = (UShort_t)digit->GetEnergy();
294         digiList[iDigit] = (UShort_t)(digit->GetId());
295       }
296     }
297
298     ec->SetPHOS(kTRUE);
299     ec->SetGlobalPosition(xyz);                 //rec.point position in MARS
300     ec->SetClusterEnergy(rp->Energy());         //total particle energy
301     ec->SetClusterDisp(emcRP->GetDispersion()); //cluster dispersion
302     ec->SetPid          (rp->GetPID()) ;        //array of particle identification
303     ec->SetM02(emcRP->GetM2x()) ;               //second moment M2x
304     ec->SetM20(emcRP->GetM2z()) ;               //second moment M2z
305     ec->SetNExMax(emcRP->GetNExMax());          //number of local maxima
306     ec->SetNumberOfDigits(digitMult);           //digit multiplicity
307     ec->SetDigitAmplitude(amplList);            //digit energies
308     ec->SetDigitIndex(digiList);                //abs id of the cell
309     ec->SetEmcCpvDistance(-1);                  //not yet implemented
310     ec->SetClusterChi2(-1);                     //not yet implemented
311     ec->SetM11(-1) ;                            //not yet implemented
312
313     //Distance to the nearest bad crystal
314     ec->SetDistanceToBadChannel(emcRP->GetDistanceToBadCrystal()); 
315     
316     // add the track to the esd object
317     esd->AddCaloCluster(ec);
318     delete ec;    
319     
320     }
321   }
322
323
324 }
325
326 AliTracker* AliPHOSReconstructor::CreateTracker(AliRunLoader* runLoader) const
327 {
328 // creates the PHOS tracker
329   if (!runLoader) return NULL; 
330   return new AliPHOSTracker(runLoader);
331 }
332