Transition to NewIO
[u/mrichter/AliRoot.git] / PHOS / AliPHOSClusterizerv2.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 /* $Log:
18  */
19 //*-- Author: Boris Polichtchouk, IHEP
20 //////////////////////////////////////////////////////////////////////////////
21 //  Clusterization class for IHEP reconstruction.
22 // Performs clusterization (collects neighbouring active cells)
23 // It differs from AliPHOSClusterizerv1 in neighbour definition only
24
25 // --- ROOT system ---
26 #include "TBenchmark.h"
27 #include "TROOT.h"
28
29 // --- Standard library ---
30
31 // --- AliRoot header files ---
32 #include "AliPHOSClusterizerv2.h"
33 #include "AliPHOSGetter.h"
34 #include "TFolder.h"
35 #include "AliPHOSEvalRecPoint.h"
36 #include "AliPHOSRecCpvManager.h"
37 #include "AliPHOSRecEmcManager.h"
38
39 ClassImp(AliPHOSClusterizerv2)
40
41 //____________________________________________________________________________
42 AliPHOSClusterizerv2::AliPHOSClusterizerv2() : AliPHOSClusterizerv1() 
43 {}
44
45 //____________________________________________________________________________
46 AliPHOSClusterizerv2::AliPHOSClusterizerv2(const char * headerFile, const char * name):
47 AliPHOSClusterizerv1(headerFile,name)
48 {}
49
50 //____________________________________________________________________________
51 AliPHOSClusterizerv2::AliPHOSClusterizerv2(const AliPHOSClusterizerv2 & clu):
52 AliPHOSClusterizerv1(clu)
53 {}
54
55 //____________________________________________________________________________
56 void AliPHOSClusterizerv2::GetNumberOfClustersFound(int* numb) const
57 {
58   // Returns the number of found EMC and CPV rec.points
59
60   AliPHOSGetter * gime = AliPHOSGetter::Instance() ;   
61   numb[0] = gime->EmcRecPoints()->GetEntries();  
62   numb[1] = gime->CpvRecPoints()->GetEntries();  
63 }
64
65 //____________________________________________________________________________
66 void AliPHOSClusterizerv2::Exec(Option_t* option)
67 {
68   // Steering method
69
70   if(strstr(option,"tim"))
71     gBenchmark->Start("PHOSClusterizer"); 
72   
73   if(strstr(option,"print"))
74     Print() ; 
75
76   AliPHOSGetter * gime = AliPHOSGetter::Instance() ; 
77
78   TFolder* wPoolF =  gime->PhosLoader()->GetDetectorDataFolder();
79   
80   TObjArray* wPool = new TObjArray(400);
81   wPool->SetName("SmartPoints");
82   wPoolF->Add(wPool);
83   wPoolF->Add(this);
84
85   Int_t nevents = gime->MaxEvent() ;
86   Int_t ievent ;
87
88   for(ievent = 0; ievent<nevents; ievent++) {
89     
90     gime->Event(ievent,"D") ;
91     
92     Info("Exec", "MakeClusters invoked..") ;
93     MakeClusters() ;
94     Info("Exec", "MakeClusters done.") ;
95
96
97     //SmartRecPoints will communicate with wPool.
98
99     AliPHOSEvalRecPoint* rp=0;
100
101     // CPV reconstruction
102
103     AliPHOSRecCpvManager* recCpv = new AliPHOSRecCpvManager();
104     wPoolF->Add(recCpv);
105
106     Int_t iPoint; //loop variable
107
108     for(iPoint=0; iPoint<gime->CpvRecPoints()->GetEntriesFast(); iPoint++) {
109       rp = new AliPHOSEvalRecPoint(iPoint, kTRUE);
110       rp->MakeJob();
111     }
112
113     AliPHOSEvalRecPoint pt;
114     pt.UpdateWorkingPool();
115
116     TObjArray * cpvRecPoints = gime->CpvRecPoints() ; 
117     Int_t nOldCpv = cpvRecPoints->GetEntries();
118     cpvRecPoints->Delete();
119     cpvRecPoints->Compress();
120
121     Int_t i; //loop variable
122
123     for(i=0; i<wPool->GetEntries(); i++)
124       cpvRecPoints->Add(wPool->At(i));
125
126     wPool->Clear();
127     wPool->Compress();
128
129     wPoolF->Remove(recCpv);
130     delete recCpv;
131
132     Info("Exec", "       %d", gime->CpvRecPoints()->GetEntries() ) ;
133     Info("Exec", "       %d cpvRecPoints", cpvRecPoints->GetEntries() ) ;
134
135
136     // Now Emc reconstruction
137
138     AliPHOSRecEmcManager* recEmc = new AliPHOSRecEmcManager();
139     wPoolF->Add(recEmc);
140
141     for(iPoint=0; iPoint<gime->EmcRecPoints()->GetEntriesFast(); iPoint++) {
142       rp = new AliPHOSEvalRecPoint(iPoint, kFALSE);
143       rp->MakeJob();
144     }
145
146     pt.UpdateWorkingPool();
147
148     TObjArray * emcRecPoints = gime->EmcRecPoints() ; 
149     Int_t nOldEmc = emcRecPoints->GetEntries();
150     emcRecPoints->Delete();
151     emcRecPoints->Compress();
152
153     for(i=0; i<wPool->GetEntries(); i++)
154       emcRecPoints->Add(wPool->At(i));
155
156     wPool->Clear();
157     wPool->Compress();
158
159     wPoolF->Remove(recEmc);
160     delete recEmc;
161
162     TString message ; 
163     message  = "       %d  OLD cpvRecPoints\n" ; 
164     message += "       %d\n" ; 
165     message += "       %d cpvRecPoints\n" ; 
166
167     message += "       %d OLD emcRecPoints " ; 
168     message += "       %d\n" ;
169     message += "       %d emcRecPoints\n" ;
170
171     Info("Exec", message.Data(), 
172          nOldCpv, 
173          gime->CpvRecPoints()->GetEntries(),cpvRecPoints->GetEntries(), 
174          nOldEmc, 
175          gime->EmcRecPoints()->GetEntries(), emcRecPoints->GetEntries() ) ; 
176
177     WriteRecPoints();
178
179
180   } // loop over events
181
182   if(strstr(option,"tim")) {
183     gBenchmark->Stop("PHOSClusterizer");
184     Info("Exec","took %f seconds for Clusterizing", gBenchmark->GetCpuTime("PHOSClusterizer") ) ;
185   }
186 }
187
188 //____________________________________________________________________________
189 Int_t AliPHOSClusterizerv2::AreNeighbours(AliPHOSDigit* d1, AliPHOSDigit* d2) const
190 {
191   // Points are neighbours if they have common edge.
192   // Points with common vertex are NOT neighbours.
193   // This treatment of neighbourship is the part of 
194   // IHEP algorithm of clusterization.
195
196   // Gives the neighbourness of two digits = 0 are not neighbour but continue searching 
197   //                                       = 1 are neighbour
198   //                                       = 2 are not neighbour but do not continue searching
199   // The order of d1 and d2 is important: first (d1) should be a digit already in a cluster 
200   // which is compared to a digit (d2)  not yet in a cluster  
201
202   const AliPHOSGeometry * geom = AliPHOSGetter::Instance()->PHOSGeometry();
203
204   Int_t rv = 0 ; 
205
206   Int_t relid1[4] ; 
207   geom->AbsToRelNumbering(d1->GetId(), relid1) ; 
208
209   Int_t relid2[4] ; 
210   geom->AbsToRelNumbering(d2->GetId(), relid2) ; 
211  
212   if ( (relid1[0] == relid2[0]) && (relid1[1]==relid2[1]) ) { // inside the same PHOS module and the same PPSD Module 
213     Int_t rowdiff = TMath::Abs( relid1[2] - relid2[2] ) ;  
214     Int_t coldiff = TMath::Abs( relid1[3] - relid2[3] ) ;  
215     
216     if ( ( (coldiff < 1) && (rowdiff <= 1) ) || ( ( coldiff <= 1 )  && ( rowdiff < 1 ) ) ){
217       rv = 1 ; 
218     }
219     else {
220       if((relid2[2] > relid1[2]) && (relid2[3] > relid1[3]+1)) 
221         rv = 2; //  Difference in row numbers is too large to look further 
222     }
223
224   } 
225   else {
226     
227     if( (relid1[0] < relid2[0]) || (relid1[1] < relid2[1]) )  
228       rv=2 ;
229
230   }
231
232   return rv ; 
233
234 }