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