Moving to the new VMC naming convention
[u/mrichter/AliRoot.git] / PHOS / AliPHOSTrackSegmentMakerv1.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 /* $Id$ */
16 //_________________________________________________________________________
17 // Implementation version 1 of algorithm class to construct PHOS track segments
18 // Track segment for PHOS is list of 
19 //        EMC RecPoint + (possibly) CPV RecPoint + (possibly) PPSD RecPoint
20 // To find TrackSegments we do the following: 
21 //  for each EMC RecPoints we look at
22 //   CPV/PPSD RecPoints in the radious fRcpv. 
23 //  If there is such a CPV RecPoint, 
24 //   we make "Link" it is just indexes of EMC and CPV/PPSD RecPoint and distance
25 //   between them in the PHOS plane. 
26 //  Then we sort "Links" and starting from the 
27 //   least "Link" pointing to the unassined EMC and CPV RecPoints assing them to 
28 //   new TrackSegment. 
29 // If there is no CPV/PPSD RecPoint we make TrackSegment 
30 // consisting from EMC alone. There is no TrackSegments without EMC RecPoint.
31 //// In principle this class should be called from AliPHOSReconstructioner, but 
32 // one can use it as well in standalone mode.
33 // Use  case:
34 //  root [0] AliPHOSTrackSegmentMakerv1 * t = new AliPHOSTrackSegmentMaker("galice.root", "tracksegmentsname", "recpointsname")
35 //  Warning in <TDatabasePDG::TDatabasePDG>: object already instantiated
36 //               // reads gAlice from header file "galice.root", uses recpoints stored in the branch names "recpointsname" (default = "Default")
37 //               // and saves recpoints in branch named "tracksegmentsname" (default = "recpointsname")                       
38 //  root [1] t->ExecuteTask()
39 //  root [2] t->SetMaxEmcPpsdDistance(5)
40 //  root [3] t->SetTrackSegmentsBranch("max distance 5 cm")
41 //  root [4] t->ExecuteTask("deb all time") 
42 //                 
43 //*-- Author: Dmitri Peressounko (RRC Ki & SUBATECH) & Yves Schutz (SUBATECH) 
44 //
45
46 // --- ROOT system ---
47 #include "TROOT.h"
48 #include "TFile.h"
49 #include "TFolder.h"
50 #include "TTree.h"
51 #include "TSystem.h"
52 #include "TBenchmark.h"
53
54 // --- Standard library ---
55
56 // --- AliRoot header files ---
57
58 #include "AliPHOSTrackSegmentMakerv1.h"
59 #include "AliPHOSClusterizerv1.h"
60 #include "AliPHOSTrackSegment.h"
61 #include "AliPHOSCpvRecPoint.h"
62 #include "AliPHOSLink.h"
63 #include "AliPHOSGetter.h"
64 #include "AliPHOS.h"
65
66 ClassImp( AliPHOSTrackSegmentMakerv1) 
67
68
69 //____________________________________________________________________________
70   AliPHOSTrackSegmentMakerv1::AliPHOSTrackSegmentMakerv1() : AliPHOSTrackSegmentMaker()
71 {
72   // default ctor (to be used mainly by Streamer)
73
74   InitParameters() ; 
75   fDefaultInit = kTRUE ; 
76 }
77
78 //____________________________________________________________________________
79  AliPHOSTrackSegmentMakerv1::AliPHOSTrackSegmentMakerv1(const TString alirunFileName, const TString eventFolderName)
80    :AliPHOSTrackSegmentMaker(alirunFileName, eventFolderName)
81 {
82   // ctor
83
84   InitParameters() ; 
85   Init() ;
86   fDefaultInit = kFALSE ; 
87 }
88
89 //____________________________________________________________________________
90  AliPHOSTrackSegmentMakerv1::~AliPHOSTrackSegmentMakerv1()
91
92   // dtor
93   // fDefaultInit = kTRUE if TrackSegmentMaker created by default ctor (to get just the parameters)
94   if (!fDefaultInit)  
95     delete fLinkUpArray ;
96 }
97
98
99 //____________________________________________________________________________
100 const TString AliPHOSTrackSegmentMakerv1::BranchName() const 
101 {  
102  
103   return GetName() ;
104 }
105
106 //____________________________________________________________________________
107 void  AliPHOSTrackSegmentMakerv1::FillOneModule()
108 {
109   // Finds first and last indexes between which 
110   // clusters from one PHOS module are
111
112   AliPHOSGetter * gime = AliPHOSGetter::Instance() ; 
113   
114   TObjArray * emcRecPoints = gime->EmcRecPoints() ; 
115   TObjArray * cpvRecPoints = gime->CpvRecPoints() ; 
116  
117   //First EMC clusters
118   Int_t totalEmc = emcRecPoints->GetEntriesFast() ;
119   for(fEmcFirst = fEmcLast; (fEmcLast < totalEmc) &&  
120         ((dynamic_cast<AliPHOSRecPoint *>(emcRecPoints->At(fEmcLast)))->GetPHOSMod() == fModule ); 
121       fEmcLast ++)  ;
122   
123   //Now CPV clusters
124   Int_t totalCpv = cpvRecPoints->GetEntriesFast() ;
125
126     for(fCpvFirst = fCpvLast; (fCpvLast < totalCpv) && 
127          ((dynamic_cast<AliPHOSRecPoint *>(cpvRecPoints->At(fCpvLast)))->GetPHOSMod() == fModule ); 
128        fCpvLast ++) ;
129       
130 }
131
132 //____________________________________________________________________________
133 Float_t  AliPHOSTrackSegmentMakerv1::GetDistanceInPHOSPlane(AliPHOSEmcRecPoint * emcClu,AliPHOSRecPoint * cpvClu, Bool_t &toofar)const
134 {
135   // Calculates the distance between the EMC RecPoint and the PPSD RecPoint
136   // Clusters are sorted in "rows" and "columns" of width 1 cm
137
138   Float_t delta = 1 ;  // Width of the rows in sorting of RecPoints (in cm)
139                        // if you change this value, change it as well in xxxRecPoint::Compare()
140   Float_t r = fRcpv ;
141  
142   TVector3 vecEmc ;
143   TVector3 vecCpv ;
144   
145   emcClu->GetLocalPosition(vecEmc) ;
146   cpvClu->GetLocalPosition(vecCpv)  ; 
147
148   if(emcClu->GetPHOSMod() == cpvClu->GetPHOSMod()){ 
149     if(vecCpv.X() <= vecEmc.X() + fRcpv + 2*delta ){ 
150
151       vecCpv = vecCpv  - vecEmc ; 
152       r = vecCpv.Mag() ;
153       toofar = kFALSE ;
154
155     } // if  xPpsd >= xEmc + ...
156     else 
157       toofar = kTRUE ;
158   } 
159   else 
160     toofar = kTRUE ;
161
162   //toofar = kFALSE ;
163  
164   
165   return r ;
166 }
167
168 //____________________________________________________________________________
169 void  AliPHOSTrackSegmentMakerv1::Init()
170 {
171   // Make all memory allocations that are not possible in default constructor
172   
173   AliPHOSGetter* gime = AliPHOSGetter::Instance(GetTitle(), fEventFolderName.Data());
174   
175   fLinkUpArray  = new TClonesArray("AliPHOSLink", 1000); 
176   if ( !gime->TrackSegmentMaker() ) {
177     gime->PostTrackSegmentMaker(this);
178   }
179 }
180
181 //____________________________________________________________________________
182 void  AliPHOSTrackSegmentMakerv1::InitParameters()
183 {
184   fRcpv      = 10. ;   
185   fEmcFirst  = 0 ;    
186   fEmcLast   = 0 ;   
187   fCpvFirst  = 0 ;   
188   fCpvLast   = 0 ;   
189   fLinkUpArray = 0 ;
190   fTrackSegmentsInRun       = 0 ; 
191 }
192
193
194 //____________________________________________________________________________
195 void  AliPHOSTrackSegmentMakerv1::MakeLinks()const
196
197   // Finds distances (links) between all EMC and PPSD clusters, 
198   // which are not further apart from each other than fRcpv 
199   // and sort them in accordance with this distance
200   
201   AliPHOSGetter * gime = AliPHOSGetter::Instance() ; 
202   TObjArray * emcRecPoints = gime->EmcRecPoints() ; 
203   TObjArray * cpvRecPoints = gime->CpvRecPoints() ; 
204
205   fLinkUpArray->Clear() ;    
206
207   AliPHOSRecPoint * cpv ;
208   AliPHOSEmcRecPoint * emcclu ;
209
210   Int_t iLinkUp  = 0 ;
211   
212   Int_t iEmcRP;
213   for(iEmcRP = fEmcFirst; iEmcRP < fEmcLast; iEmcRP++ ) {
214     emcclu = dynamic_cast<AliPHOSEmcRecPoint *>(emcRecPoints->At(iEmcRP)) ;
215
216     Bool_t toofar ;        
217     Int_t iCpv = 0 ;    
218     for(iCpv = fCpvFirst; iCpv < fCpvLast;iCpv++ ) { 
219       
220       cpv = dynamic_cast<AliPHOSRecPoint *>(cpvRecPoints->At(iCpv)) ;
221       Float_t r = GetDistanceInPHOSPlane(emcclu, cpv, toofar) ;
222       
223       if(toofar)
224         break ;  
225       if(r < fRcpv) { 
226         new ((*fLinkUpArray)[iLinkUp++])  AliPHOSLink(r, iEmcRP, iCpv) ;
227       }      
228     }
229   } 
230   
231   fLinkUpArray->Sort() ;  //first links with smallest distances
232 }
233
234 //____________________________________________________________________________
235 void  AliPHOSTrackSegmentMakerv1::MakePairs()
236
237   // Using the previously made list of "links", we found the smallest link - i.e. 
238   // link with the least distance between EMC and CPV and pointing to still 
239   // unassigned RecParticles. We assign these RecPoints to TrackSegment and 
240   // remove them from the list of "unassigned". 
241
242   AliPHOSGetter * gime = AliPHOSGetter::Instance() ; 
243
244   TObjArray * emcRecPoints = gime->EmcRecPoints() ; 
245   TObjArray * cpvRecPoints = gime->CpvRecPoints() ; 
246   TClonesArray * trackSegments = gime->TrackSegments();
247     
248   //Make arrays to mark clusters already chosen
249   Int_t * emcExist = 0;
250   if(fEmcLast > fEmcFirst)
251     emcExist = new Int_t[fEmcLast-fEmcFirst] ;
252   
253   Int_t index;
254   for(index = 0; index <fEmcLast-fEmcFirst; index ++)
255     emcExist[index] = 1 ;
256   
257   Bool_t * cpvExist = 0;
258   if(fCpvLast > fCpvFirst)
259     cpvExist = new Bool_t[fCpvLast-fCpvFirst] ;
260   for(index = 0; index <fCpvLast-fCpvFirst; index ++)
261     cpvExist[index] = kTRUE ;
262   
263   
264   // Finds the smallest links and makes pairs of CPV and EMC clusters with smallest distance 
265   TIter nextUp(fLinkUpArray) ;
266   
267   AliPHOSLink * linkUp ;
268   
269   AliPHOSRecPoint * nullpointer = 0 ;
270   
271   while ( (linkUp =  static_cast<AliPHOSLink *>(nextUp()) ) ){  
272
273     if(emcExist[linkUp->GetEmc()-fEmcFirst] != -1){ //without ppsd Up yet 
274
275       if(cpvExist[linkUp->GetPpsd()-fCpvFirst]){ //CPV still exist
276        
277        new ((* trackSegments)[fNTrackSegments]) 
278          AliPHOSTrackSegment(dynamic_cast<AliPHOSEmcRecPoint *>(emcRecPoints->At(linkUp->GetEmc())) , 
279                            dynamic_cast<AliPHOSRecPoint *>(cpvRecPoints->At(linkUp->GetPpsd()))) ;
280        (dynamic_cast<AliPHOSTrackSegment *>(trackSegments->At(fNTrackSegments)))->SetIndexInList(fNTrackSegments);
281        fNTrackSegments++ ;
282        
283        emcExist[linkUp->GetEmc()-fEmcFirst] = -1 ; //Mark emc  that Cpv was found 
284        //mark CPV recpoint as already used 
285        cpvExist[linkUp->GetPpsd()-fCpvFirst] = kFALSE ;
286       } //if ppsdUp still exist
287     } 
288   }        
289
290   //look through emc recPoints left without CPV/PPSD
291   if(emcExist){ //if there is emc rec point
292     Int_t iEmcRP ;
293     for(iEmcRP = 0; iEmcRP < fEmcLast-fEmcFirst  ; iEmcRP++ ){
294       if(emcExist[iEmcRP] > 0 ){
295        new ((*trackSegments)[fNTrackSegments])  
296          AliPHOSTrackSegment(dynamic_cast<AliPHOSEmcRecPoint *>(emcRecPoints->At(iEmcRP+fEmcFirst)), 
297                            nullpointer) ;
298        (dynamic_cast<AliPHOSTrackSegment *>(trackSegments->At(fNTrackSegments)))->SetIndexInList(fNTrackSegments);
299        fNTrackSegments++;    
300       } 
301     }
302   }
303   delete [] emcExist ; 
304   delete [] cpvExist ; 
305 }
306
307 //____________________________________________________________________________
308 void  AliPHOSTrackSegmentMakerv1::Exec(Option_t * option)
309 {
310   // STEERing method
311   
312   if(strstr(option,"tim"))
313     gBenchmark->Start("PHOSTSMaker");
314  
315   if(strstr(option,"print")) {
316     Print() ; 
317     return ; 
318   }
319   
320   AliPHOSGetter * gime = AliPHOSGetter::Instance() ;  
321   
322   const AliPHOSGeometry * geom = gime->PHOSGeometry() ; 
323
324   Int_t nevents = gime->MaxEvent() ;    
325   Int_t ievent ;
326
327   for(ievent = 0; ievent < nevents; ievent++) {
328     gime->Event(ievent,"R") ;
329     //Make some initializations 
330     fNTrackSegments = 0 ;
331     fEmcFirst = 0 ;    
332     fEmcLast  = 0 ;   
333     fCpvFirst = 0 ;   
334     fCpvLast  = 0 ;   
335     
336     gime->TrackSegments()->Clear();
337
338     //    if(!ReadRecPoints(ievent))   continue; //reads RecPoints for event ievent
339     
340     for(fModule = 1; fModule <= geom->GetNModules() ; fModule++ ) {
341       FillOneModule() ; 
342       MakeLinks() ;
343       MakePairs() ;
344     }
345
346     WriteTrackSegments(ievent) ;
347
348     if(strstr(option,"deb"))
349       PrintTrackSegments(option);
350     
351     //increment the total number of track segments per run 
352     fTrackSegmentsInRun += gime->TrackSegments()->GetEntriesFast() ; 
353
354   }
355   
356   if(strstr(option,"tim")){
357     gBenchmark->Stop("PHOSTSMaker");
358     Info("Exec", "took %f seconds for making TS %f seconds per event", 
359           gBenchmark->GetCpuTime("PHOSTSMaker"), 
360           gBenchmark->GetCpuTime("PHOSTSMaker")/nevents) ;
361    }
362   Unload();
363 }
364
365 //____________________________________________________________________________
366 void AliPHOSTrackSegmentMakerv1::Unload() 
367 {
368   AliPHOSGetter * gime = AliPHOSGetter::Instance() ;  
369   gime->PhosLoader()->UnloadRecPoints() ;
370   gime->PhosLoader()->UnloadTracks() ;
371 }
372
373 //____________________________________________________________________________
374 void AliPHOSTrackSegmentMakerv1::Print()const
375 {
376   //  Print TrackSegmentMaker parameters
377
378   TString message("") ;
379   if( strcmp(GetName(), "") != 0 ) {
380     message = "\n======== AliPHOSTrackSegmentMakerv1 ========\n" ; 
381     message += "Making Track segments\n" ;
382     message += "with parameters:\n" ; 
383     message += "     Maximal EMC - CPV (PPSD) distance (cm) %f\n" ;
384     message += "============================================\n" ;
385     Info("Print", message.Data(),fRcpv) ;
386   }
387   else
388     Info("Print", "AliPHOSTrackSegmentMakerv1 not initialized ") ;
389 }
390
391 //____________________________________________________________________________
392 void AliPHOSTrackSegmentMakerv1::WriteTrackSegments(Int_t event)
393 {
394   // Writes found TrackSegments to TreeR. Creates branches 
395   // "PHOSTS" and "AliPHOSTrackSegmentMaker" with the same title.
396   // In the former branch found TrackSegments are stored, while 
397   // in the latter all parameters, with which TS were made. 
398   // ROOT does not allow overwriting existing branches, therefore
399   // first we check, if branches with the same title already exist.
400   // If yes - exits without writing.
401
402   AliPHOSGetter *gime = AliPHOSGetter::Instance() ; 
403
404   TClonesArray * trackSegments = gime->TrackSegments() ; 
405   trackSegments->Expand(trackSegments->GetEntriesFast()) ;
406
407   TTree * treeT = gime->TreeT();
408  
409   //First TS
410   Int_t bufferSize = 32000 ; 
411   TBranch * tsBranch = treeT->Branch("PHOSTS",&trackSegments,bufferSize);
412   tsBranch->Fill() ;  
413
414   gime->WriteTracks("OVERWRITE");
415   gime->WriteTrackSegmentMaker("OVERWRITE");
416 }
417
418
419 //____________________________________________________________________________
420 void AliPHOSTrackSegmentMakerv1::PrintTrackSegments(Option_t * option)
421 {
422   // option deb - prints # of found TrackSegments
423   // option deb all - prints as well indexed of found RecParticles assigned to the TS
424
425   TClonesArray * trackSegments = AliPHOSGetter::Instance()->TrackSegments() ; 
426
427   Info("PrintTrackSegments", "Results from TrackSegmentMaker:") ; 
428   printf("nevent: %d\n", gAlice->GetEvNumber()) ; 
429   printf("        Found %d TrackSegments\n", trackSegments->GetEntriesFast() ); 
430   
431   if(strstr(option,"all")) {  // printing found TS
432     printf("TrackSegment #  EMC RP#  CPV RP#\n") ; 
433     Int_t index;
434     for (index = 0 ; index <trackSegments->GetEntriesFast() ; index++) {
435       AliPHOSTrackSegment * ts = (AliPHOSTrackSegment * )trackSegments->At(index) ; 
436       printf("   %d           %d        %d \n", ts->GetIndexInList(), ts->GetEmcIndex(), ts->GetCpvIndex() ) ; 
437     }   
438   }
439 }