New class AliESDEvent, backward compatibility with the old AliESD (Christian)
[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 "AliESDEvent.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 AliESDEvent 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 AliESDEvent 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, AliESDEvent* 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   const Float_t kBigShort = std::numeric_limits<short int>::max() - 1;
182   const Float_t nsec100   = 1e9*100.; // units of 0.01 ns
183   const Float_t gev500    = 500.;     // units of GeV/500
184
185   for (Int_t recpart = 0 ; recpart < nOfRecParticles ; recpart++) {
186     AliPHOSRecParticle * rp = dynamic_cast<AliPHOSRecParticle*>(recParticles->At(recpart));
187     if (Debug()) 
188       rp->Print();
189     // Get track segment and EMC rec.point associated with this rec.particle
190     AliPHOSTrackSegment *ts    = gime->TrackSegment(rp->GetPHOSTSIndex());
191     AliPHOSEmcRecPoint  *emcRP = gime->EmcRecPoint(ts->GetEmcIndex());
192     AliESDCaloCluster   *ec    = new AliESDCaloCluster() ; 
193         
194     Float_t xyz[3];
195     for (Int_t ixyz=0; ixyz<3; ixyz++) 
196       xyz[ixyz] = rp->GetPos()[ixyz];
197     
198     AliDebug(2,Form("Global position xyz=(%f,%f,%f)",xyz[0],xyz[1],xyz[2]));
199     
200     //Create digits lists
201     Int_t  digitMult  = emcRP->GetDigitsMultiplicity();
202     Int_t *digitsList = emcRP->GetDigitsList();
203     Short_t *amplList  = new Short_t[digitMult];
204     Short_t *timeList  = new Short_t[digitMult];
205     Short_t *digiList  = new Short_t[digitMult];
206
207     // Convert Float_t* and Int_t* to Short_t* to save memory
208     for (Int_t iDigit=0; iDigit<digitMult; iDigit++) {
209       AliPHOSDigit *digit = gime->Digit(digitsList[iDigit]);
210       amplList[iDigit] =
211         (Short_t)(TMath::Min(digit->GetEnergy()*gev500,kBigShort)); // Energy in units of GeV/500
212       timeList[iDigit] =
213         (Short_t)(TMath::Min(digit->GetTime()*nsec100,kBigShort)); // time in units of 0.01 ns
214       digiList[iDigit] = (Short_t)(digit->GetId());
215     }
216     
217     //Primaries
218     Int_t  primMult  = 0;
219     Int_t *primInts =  emcRP->GetPrimaries(primMult);
220     Short_t *primList = new Short_t[primMult];
221     for (Int_t ipr=0; ipr<primMult; ipr++) 
222       primList[ipr] = (Short_t)(primInts[ipr]);  
223     
224     // fills the ESDCaloCluster
225  
226     ec->SetPHOS(kTRUE);
227     ec->SetPosition(xyz);                 //rec.point position in MARS
228     ec->SetE(rp->Energy());         //total particle energy
229     ec->SetClusterDisp(emcRP->GetDispersion()); //cluster dispersion
230     ec->SetPid          (rp->GetPID()) ;        //array of particle identification
231     ec->SetM02(emcRP->GetM2x()) ;               //second moment M2x
232     ec->SetM20(emcRP->GetM2z()) ;               //second moment M2z
233     ec->SetNExMax(emcRP->GetNExMax());          //number of local maxima
234     ec->SetEmcCpvDistance(-1);                  //not yet implemented
235     ec->SetClusterChi2(-1);                     //not yet implemented
236     ec->SetM11(-1) ;                            //not yet implemented
237  
238     //Digits Lists
239     TArrayS arrayAmpList(digitMult,amplList);
240     TArrayS arrayTimeList(digitMult,timeList);
241     TArrayS arrayIndexList(digitMult,digiList);
242     ec->AddDigitAmplitude(arrayAmpList);
243     ec->AddDigitTime(arrayTimeList);
244     ec->AddDigitIndex(arrayIndexList);
245
246     //Distance to the nearest bad crystal
247     ec->SetDistanceToBadChannel(emcRP->GetDistanceToBadCrystal()); 
248   
249     //Array of MC indeces
250     TArrayS arrayPrim(primMult,primList);
251     ec->AddLabels(arrayPrim);
252
253     //Array of tracks uncomment when available in future
254     //TArrayS arrayTrackMatched(1);// Only one track, temporal solution.
255     //arrayTrackMatched[0]= (Short_t)(matchedTrack[iClust]);
256     //ec->AddTracksMatched(arrayTrackMatched);
257     
258     // add the track to the esd object
259     esd->AddCaloCluster(ec);
260     delete ec;    
261   }  
262 }
263
264 //____________________________________________________________________________
265 void AliPHOSReconstructor::FillESD(AliRunLoader* runLoader,
266                                    AliRawReader* rawReader, AliESDEvent* esd) const
267 {
268   //This function creates AliESDtracks from AliPHOSRecParticles 
269   //and writes them to the ESD in the case of raw data reconstruction.
270
271   Int_t eventNumber = runLoader->GetEventNumber() ;
272
273   AliPHOSGetter *gime = AliPHOSGetter::Instance();
274   gime->Event(eventNumber, "DRTP") ; 
275
276   TClonesArray *recParticles  = gime->RecParticles();
277   Int_t nOfRecParticles = recParticles->GetEntries();
278
279   esd->SetNumberOfPHOSClusters(nOfRecParticles) ; 
280   esd->SetFirstPHOSCluster(esd->GetNumberOfCaloClusters()) ;
281   
282   AliDebug(2,Form("%d digits and %d rec. particles in event %d, option %s",gime->Digits()->GetEntries(),nOfRecParticles,eventNumber,GetOption()));
283
284   for (Int_t recpart = 0 ; recpart < nOfRecParticles ; recpart++) {
285     AliPHOSRecParticle * rp = dynamic_cast<AliPHOSRecParticle*>(recParticles->At(recpart));
286
287     if(rp) {
288     Float_t xyz[3];
289     for (Int_t ixyz=0; ixyz<3; ixyz++) 
290       xyz[ixyz] = rp->GetPos()[ixyz];
291
292     AliDebug(2,Form("Global position xyz=(%f,%f,%f)",xyz[0],xyz[1],xyz[2]));
293     
294     AliPHOSTrackSegment *ts    = gime->TrackSegment(rp->GetPHOSTSIndex());
295     AliPHOSEmcRecPoint  *emcRP = gime->EmcRecPoint(ts->GetEmcIndex());
296     AliESDCaloCluster   *ec    = new AliESDCaloCluster() ; 
297
298     Int_t  digitMult  = emcRP->GetDigitsMultiplicity();
299     Int_t *digitsList = emcRP->GetDigitsList();
300     Short_t *amplList  = new Short_t[digitMult];
301     Short_t *digiList  = new Short_t[digitMult];
302
303     // Convert Float_t* and Int_t* to UShort_t* to save memory
304     for (Int_t iDigit=0; iDigit<digitMult; iDigit++) {
305       AliPHOSDigit *digit = gime->Digit(digitsList[iDigit]);
306       if(!digit) {
307         AliFatal(Form("Digit not found at the expected position %d!",iDigit));
308       }
309       else {
310         amplList[iDigit] = (Short_t)digit->GetEnergy();
311         digiList[iDigit] = (Short_t)(digit->GetId());
312         //timeList[iDigit] = (Short_t)(digit->GetTime());
313       }
314     }
315
316     ec->SetPHOS(kTRUE);
317     ec->SetPosition(xyz);                 //rec.point position in MARS
318     ec->SetE(rp->Energy());         //total particle energy
319     ec->SetClusterDisp(emcRP->GetDispersion()); //cluster dispersion
320     ec->SetPid          (rp->GetPID()) ;        //array of particle identification
321     ec->SetM02(emcRP->GetM2x()) ;               //second moment M2x
322     ec->SetM20(emcRP->GetM2z()) ;               //second moment M2z
323     ec->SetNExMax(emcRP->GetNExMax());          //number of local maxima
324
325     ec->SetEmcCpvDistance(-1);                  //not yet implemented
326     ec->SetClusterChi2(-1);                     //not yet implemented
327     ec->SetM11(-1) ;                            //not yet implemented
328  //    TArrayS arrayAmpList(digitMult,amplList);
329 //     TArrayS arrayTimeList(digitMult,timeList);
330 //     TArrayS arrayIndexList(digitMult,digiList);
331 //     ec->AddDigitAmplitude(arrayAmpList);
332 //     ec->AddDigitTime(arrayTimeList);
333 //     ec->AddDigitIndex(arrayIndexList);
334     //Distance to the nearest bad crystal
335     ec->SetDistanceToBadChannel(emcRP->GetDistanceToBadCrystal()); 
336     
337     // add the track to the esd object
338     esd->AddCaloCluster(ec);
339     delete ec;    
340     
341     }
342   }
343
344
345 }
346
347 AliTracker* AliPHOSReconstructor::CreateTracker(AliRunLoader* runLoader) const
348 {
349 // creates the PHOS tracker
350   if (!runLoader) return NULL; 
351   return new AliPHOSTracker(runLoader);
352 }
353