]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PHOS/AliPHOSReconstructor.cxx
Protection for noCPV geometry
[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     //Primaries
229     ec->SetPrimaryIndex(rp->GetPrimaryIndex());
230     Int_t  primMult  = 0;
231     Int_t *primInts =  emcRP->GetPrimaries(primMult);
232     ec->SetNumberOfPrimaries(primMult);           //primary multiplicity
233     UShort_t *primList = new UShort_t[primMult];
234     for (Int_t ipr=0; ipr<primMult; ipr++) 
235       primList[ipr] = (UShort_t)(primInts[ipr]);         
236     ec->SetListOfPrimaries(primList);                  //primary List for a cluster
237     
238     // add the track to the esd object
239     esd->AddCaloCluster(ec);
240     delete ec;    
241   }  
242 }
243
244 //____________________________________________________________________________
245 void AliPHOSReconstructor::FillESD(AliRunLoader* runLoader,
246                                    AliRawReader* rawReader, AliESD* esd) const
247 {
248   //This function creates AliESDtracks from AliPHOSRecParticles 
249   //and writes them to the ESD in the case of raw data reconstruction.
250
251   Int_t eventNumber = runLoader->GetEventNumber() ;
252
253   AliPHOSGetter *gime = AliPHOSGetter::Instance();
254   gime->Event(eventNumber, "DRTP") ; 
255
256   TClonesArray *recParticles  = gime->RecParticles();
257   Int_t nOfRecParticles = recParticles->GetEntries();
258
259   esd->SetNumberOfPHOSClusters(nOfRecParticles) ; 
260   esd->SetFirstPHOSCluster(esd->GetNumberOfCaloClusters()) ;
261   
262   AliDebug(2,Form("%d digits and %d rec. particles in event %d, option %s",gime->Digits()->GetEntries(),nOfRecParticles,eventNumber,GetOption()));
263
264   for (Int_t recpart = 0 ; recpart < nOfRecParticles ; recpart++) {
265     AliPHOSRecParticle * rp = dynamic_cast<AliPHOSRecParticle*>(recParticles->At(recpart));
266
267     if(rp) {
268     Float_t xyz[3];
269     for (Int_t ixyz=0; ixyz<3; ixyz++) 
270       xyz[ixyz] = rp->GetPos()[ixyz];
271
272     AliDebug(2,Form("Global position xyz=(%f,%f,%f)",xyz[0],xyz[1],xyz[2]));
273     
274     AliPHOSTrackSegment *ts    = gime->TrackSegment(rp->GetPHOSTSIndex());
275     AliPHOSEmcRecPoint  *emcRP = gime->EmcRecPoint(ts->GetEmcIndex());
276     AliESDCaloCluster   *ec    = new AliESDCaloCluster() ; 
277
278     Int_t  digitMult  = emcRP->GetDigitsMultiplicity();
279     Int_t *digitsList = emcRP->GetDigitsList();
280     UShort_t *amplList  = new UShort_t[digitMult];
281     UShort_t *digiList  = new UShort_t[digitMult];
282
283     // Convert Float_t* and Int_t* to UShort_t* to save memory
284     for (Int_t iDigit=0; iDigit<digitMult; iDigit++) {
285       AliPHOSDigit *digit = gime->Digit(digitsList[iDigit]);
286       if(!digit) {
287         AliFatal(Form("Digit not found at the expected position %d!",iDigit));
288       }
289       else {
290         amplList[iDigit] = (UShort_t)digit->GetEnergy();
291         digiList[iDigit] = (UShort_t)(digit->GetId());
292       }
293     }
294
295     ec->SetPHOS(kTRUE);
296     ec->SetGlobalPosition(xyz);                 //rec.point position in MARS
297     ec->SetClusterEnergy(rp->Energy());         //total particle energy
298     ec->SetClusterDisp(emcRP->GetDispersion()); //cluster dispersion
299     ec->SetPid          (rp->GetPID()) ;        //array of particle identification
300     ec->SetM02(emcRP->GetM2x()) ;               //second moment M2x
301     ec->SetM20(emcRP->GetM2z()) ;               //second moment M2z
302     ec->SetNExMax(emcRP->GetNExMax());          //number of local maxima
303     ec->SetNumberOfDigits(digitMult);           //digit multiplicity
304     ec->SetDigitAmplitude(amplList);            //digit energies
305     ec->SetDigitIndex(digiList);                //abs id of the cell
306     ec->SetEmcCpvDistance(-1);                  //not yet implemented
307     ec->SetClusterChi2(-1);                     //not yet implemented
308     ec->SetM11(-1) ;                            //not yet implemented
309
310     // add the track to the esd object
311     esd->AddCaloCluster(ec);
312     delete ec;    
313
314     }
315   }
316
317
318 }
319
320 AliTracker* AliPHOSReconstructor::CreateTracker(AliRunLoader* runLoader) const
321 {
322 // creates the PHOS tracker
323   if (!runLoader) return NULL; 
324   return new AliPHOSTracker(runLoader);
325 }
326