removed iostream
[u/mrichter/AliRoot.git] / PHOS / AliPHOSPpsdRecPoint.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 //  A RecPoint (cluster) in the PPSD 
18 //  A PPSD RecPoint ends up to be a single digit
19 //  Why should I put meaningless comments
20 //  just to satisfy
21 //  the code checker                
22 //                
23 //*--  Yves Schutz (SUBATECH)
24
25 // --- ROOT system ---
26
27 #include "TPad.h"
28
29 // --- Standard library ---
30
31 // --- AliRoot header files ---
32
33 #include "AliPHOSGeometry.h"
34 #include "AliPHOSPpsdRecPoint.h"
35 #include "AliPHOSCpvRecPoint.h"
36 #include "AliRun.h"
37 #include "AliPHOSGetter.h"
38
39 ClassImp(AliPHOSPpsdRecPoint)
40
41 //____________________________________________________________________________
42 AliPHOSPpsdRecPoint::AliPHOSPpsdRecPoint(void)
43
44   // ctor
45
46   fMulDigit = 0 ;  
47   fLocPos.SetX(1000000.)  ;      //Local position should be evaluated
48 }
49
50 //____________________________________________________________________________
51 void AliPHOSPpsdRecPoint::AddDigit(AliPHOSDigit & digit, Float_t Energy)
52 {
53   // adds a digit to the digits list
54   // and accumulates the total amplitude and the multiplicity 
55   
56   
57   if ( fMulDigit >= fMaxDigit ) { // increase the size of the lists 
58     fMaxDigit*=2 ; 
59     int * tempo = new ( int[fMaxDigit] ) ; 
60     Int_t index ; 
61     
62     for ( index = 0 ; index < fMulDigit ; index++ )
63       tempo[index] = fDigitsList[index] ;
64     
65     delete []  fDigitsList ; 
66     fDigitsList =  new ( int[fMaxDigit] ) ;
67    
68     for ( index = 0 ; index < fMulDigit ; index++ )
69       fDigitsList[index] = tempo[index] ;
70  
71     delete [] tempo ;
72   }
73
74   fDigitsList[fMulDigit++]  =  digit.GetIndexInList() ; 
75   fAmp += Energy ; 
76   EvalPHOSMod(&digit) ;
77 }
78
79 //____________________________________________________________________________
80 Int_t AliPHOSPpsdRecPoint::Compare(const TObject * obj) const
81 {
82   // Compares according to the position
83   Float_t delta = 1 ; //width of the "Sorting row"
84
85   Int_t rv ; 
86   
87   if( (strcmp(obj->ClassName() , "AliPHOSPpsdRecPoint" )) == 0)  // PPSD Rec Point
88     {
89      AliPHOSPpsdRecPoint * clu = (AliPHOSPpsdRecPoint *)obj ; 
90
91      Float_t x1 , z1 ;    //This rec point
92      Float_t x2 , z2 ;    //
93      
94      Int_t phosmod1 ;
95      Int_t phosmod2 ;
96      
97      Int_t up1 ;
98      Int_t up2 ; 
99   
100      if(GetUp()) // upper layer
101        up1 = 0 ; 
102      else        // lower layer
103        up1 = 1 ;       
104      
105      if(clu->GetUp()) // upper layer
106        up2 = 0 ; 
107      else            // lower layer
108        up2 = 1 ;       
109
110      TVector3 posloc ;
111      GetLocalPosition(posloc) ;
112      x1 = posloc.X() ;
113      z1 = posloc.Z() ; 
114      phosmod1 = GetPHOSMod();  
115      clu->GetLocalPosition(posloc) ;
116      x2 = posloc.X() ;
117      z2 = posloc.Z() ; 
118      phosmod2 = clu->GetPHOSMod();
119      
120      if(phosmod1 == phosmod2 ) {
121        
122        if(up1 == up2 ){
123          Int_t rowdif = (Int_t)TMath::Ceil(x1/delta) - (Int_t) TMath::Ceil(x2/delta) ;
124          
125          if (rowdif> 0) 
126            rv = 1 ;
127          else if(rowdif < 0) 
128            rv = -1 ;
129          else if(z1>z2) 
130            rv = -1 ;
131          else 
132            rv = 1 ; 
133        }
134        
135        else {
136          
137          if(up1 < up2 ) // Upper level first (up = True or False, True > False)
138            rv = -1 ;   
139          else 
140            rv = 1 ;
141        }
142        
143      } // if phosmod1 == phosmod2
144      
145      else {
146        
147        if(phosmod1 < phosmod2 ) 
148          rv = -1 ;
149        else 
150          rv = 1 ;
151        
152      }
153      
154      return rv ;      
155     }
156   else
157     {
158       AliPHOSCpvRecPoint * clu  = (AliPHOSCpvRecPoint *) obj ;   
159       if(GetPHOSMod()  < clu->GetPHOSMod() ) 
160         rv = -1 ;
161       else 
162         rv = 1 ;
163       return rv ;
164     }
165
166   
167 }
168
169 //____________________________________________________________________________
170 void AliPHOSPpsdRecPoint::EvalAll(Float_t logWeight,TClonesArray * digits )
171 {
172   // calculates all the characteristics of the RecPoint
173   AliPHOSRecPoint::EvalAll(logWeight,digits) ;
174   EvalLocalPosition(logWeight,digits) ;
175   EvalUp(digits) ;
176 }
177
178 //____________________________________________________________________________
179 void AliPHOSPpsdRecPoint::EvalLocalPosition(Float_t logWeight,TClonesArray * digits )
180 {
181   // Calculates the local position in the PHOS-PPSD-module coordinates
182   
183   Int_t relid[4] ;
184
185   Float_t x = 0. ;
186   Float_t z = 0. ;
187
188   AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; 
189   AliPHOSGeometry * phosgeom =  (AliPHOSGeometry*)gime->PHOSGeometry();
190   
191   AliPHOSDigit * digit ;
192   Int_t iDigit;
193
194   for(iDigit = 0; iDigit < fMulDigit; iDigit++) {
195     digit = (AliPHOSDigit *) digits->At(fDigitsList[iDigit]) ; 
196  
197     Float_t xi ;
198     Float_t zi ;
199     phosgeom->AbsToRelNumbering(digit->GetId(), relid) ;
200     phosgeom->RelPosInModule(relid, xi, zi);
201     x += xi ;
202     z += zi ;
203   }
204
205   x /= fMulDigit ;
206   z /= fMulDigit ;
207
208   fLocPos.SetX(x)  ;
209   fLocPos.SetY(0.) ;
210   fLocPos.SetZ(z)  ;
211
212 }
213
214 //____________________________________________________________________________
215 void AliPHOSPpsdRecPoint::EvalUp(TClonesArray * digits)
216 {
217   // Are we in the uper PPSD module ?
218
219   Int_t relid[4] ;
220   
221   AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; 
222   AliPHOSGeometry * phosgeom =  (AliPHOSGeometry*)gime->PHOSGeometry();
223   
224   
225   AliPHOSDigit *digit = (AliPHOSDigit *) digits->At(fDigitsList[0]) ; 
226   
227   phosgeom->AbsToRelNumbering(digit->GetId(),relid);
228
229   if((Int_t)TMath::Ceil((Float_t)relid[1]/
230                         (phosgeom->GetNumberOfModulesPhi()*phosgeom->GetNumberOfModulesZ())-0.0001 ) > 1) 
231     fUp = kFALSE ;
232   else  
233     fUp = kTRUE ;
234   
235 }
236 //______________________________________________________________________________
237 void AliPHOSPpsdRecPoint::Paint(Option_t *)
238 {
239   //*-*-*-*-*-*-*-*-*-*-*Paint this ALiRecPoint as a TMarker  with its current attributes*-*-*-*-*-*-*
240   //*-*                  =============================================
241
242   TVector3 pos(0.,0.,0.) ;
243   GetLocalPosition(pos) ;
244   Coord_t x = pos.X() ;
245   Coord_t y = pos.Z() ;
246   Color_t markercolor = 1 ;
247   Size_t  markersize  = 1. ;
248   Style_t markerstyle = 2 ;
249   if (GetUp()) 
250     markerstyle = 3 ;
251   
252   if (!gPad->IsBatch()) {
253     gVirtualX->SetMarkerColor(markercolor);
254     gVirtualX->SetMarkerSize (markersize);
255     gVirtualX->SetMarkerStyle(markerstyle);
256   }
257   gPad->SetAttMarkerPS(markercolor,markerstyle,markersize);
258   gPad->PaintPolyMarker(1,&x,&y,"");
259   
260   
261 }
262
263 //____________________________________________________________________________
264 void AliPHOSPpsdRecPoint::Print(Option_t * option) 
265 {
266   // Print the digits information 
267   
268   Info("Print","AliPHOSPpsdRecPoint: " ) ;
269   
270   Int_t iDigit; 
271   Info("Print"," Digit{s} # ") ; 
272   for(iDigit=0; iDigit<fMulDigit; iDigit++) 
273     Info("Print", "%d", fDigitsList[iDigit]) ;  
274   Info("Print","       Multiplicity    = %d", fMulDigit  ) ;
275   Info("Print","       Stored at position %d", fIndexInList ) ; 
276 }
277
278