]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PHOS/PHOS-HTML/src/AliPHOSTrackSegmentMakerv1.cxx.html
This commit was generated by cvs2svn to compensate for changes in r799,
[u/mrichter/AliRoot.git] / PHOS / PHOS-HTML / src / AliPHOSTrackSegmentMakerv1.cxx.html
1 <!DOCTYPE HTML PUBLIC "-// IETF/DTD HTML 2.0// EN">
2 <html>
3 <!--                                             -->
4 <!-- Author: ROOT team (rootdev@hpsalo.cern.ch)  -->
5 <!--                                             -->
6 <!--   Date: Thu Mar  9 00:11:51 2000            -->
7 <!--                                             -->
8 <head>
9 <title>AliPHOSTrackSegmentMakerv1 - source file</title>
10 <link rev=made href="mailto:rootdev@root.cern.ch">
11 <meta name="rating" content="General">
12 <meta name="objecttype" content="Manual">
13 <meta name="keywords" content="software development, oo, object oriented, unix, x11, motif, windows nt, c++, html, rene brun, fons rademakers">
14 <meta name="description" content="ROOT - An Object Oriented Framework For Large Scale Data Analysis.">
15 </head>
16 <body BGCOLOR="#ffffff" LINK="#0000ff" VLINK="#551a8b" ALINK="#ff0000" TEXT="#000000">
17 <a name="TopOfPage"></a>
18 <pre>
19 /**************************************************************************
20  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
21  *                                                                        *
22  * Author: The ALICE Off-line Project.                                    *
23  * Contributors are mentioned in the code where appropriate.              *
24  *                                                                        *
25  * Permission to use, copy, modify and distribute this software and its   *
26  * documentation strictly for non-commercial purposes is hereby granted   *
27  * without fee, provided that the above copyright notice appears in all   *
28  * copies and that both the copyright notice and this permission notice   *
29  * appear in the supporting documentation. The authors make no claims     *
30  * about the suitability of this software for any purpose. It is          *
31  * provided "as is" without express or implied warranty.                  *
32  **************************************************************************/
33
34 /* $Id$ */
35
36 <b>//_________________________________________________________________________</b>
37 <b>// Implementation version 1 of algorithm class to construct PHOS track segments</b>
38 <b>// Associates EMC and PPSD clusters</b>
39 <b>// Unfolds the EMC cluster   </b>
40 <b>//                  </b>
41 <b>//*-- Author: Dmitri Peressounko (RRC Ki &amp; SUBATECH)</b>
42 <b>//</b>
43
44 <b>// --- ROOT system ---</b>
45
46 #include "TObjArray.h"
47 #include "TClonesArray.h"
48 #include "TObjectTable.h"
49
50 <b>// --- Standard library ---</b>
51
52 #include &lt;iostream&gt;
53 #include &lt;cassert&gt;
54
55 <b>// --- AliRoot header files ---</b>
56
57 #include "<a href="../AliPHOSTrackSegmentMakerv1.h">AliPHOSTrackSegmentMakerv1.h</a>"
58 #include "<a href="../AliPHOSTrackSegment.h">AliPHOSTrackSegment.h</a>"
59 #include "<a href="../AliPHOSLink.h">AliPHOSLink.h</a>"
60 #include "<a href="../AliPHOSv0.h">AliPHOSv0.h</a>"
61 #include "AliRun.h"
62
63 extern void UnfoldingChiSquare(Int_t &amp;nPar, Double_t *Grad, Double_t &amp; fret, Double_t *x, Int_t iflag) ; 
64
65 ClassImp( AliPHOSTrackSegmentMakerv1) 
66
67
68 <b>//____________________________________________________________________________</b>
69 <a name="AliPHOSTrackSegmentMakerv1:AliPHOSTrackSegmentMakerv1"> </a> <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:AliPHOSTrackSegmentMakerv1">AliPHOSTrackSegmentMakerv1::AliPHOSTrackSegmentMakerv1</a>() 
70 {
71 <b>  // ctor</b>
72
73   <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fR0">fR0</a> = 4. ;   
74   <a href=".././AliPHOSGeometry.html">AliPHOSGeometry</a> * geom = <a href=".././AliPHOSGeometry.html#AliPHOSGeometry:GetInstance">AliPHOSGeometry::GetInstance</a>() ;
75 <b>  //clusters are sorted in "rows" and "columns" of width geom-&gt;GetCrystalSize(0),</b>
76   <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fDelta">fDelta</a> = <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fR0">fR0</a> + geom-&gt;GetCrystalSize(0) ;
77   <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fMinuit">fMinuit</a> = new TMinuit(100) ;
78   <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fUnfoldFlag">fUnfoldFlag</a> = kTRUE ; 
79 }
80
81 <b>//____________________________________________________________________________</b>
82 <a name="AliPHOSTrackSegmentMakerv1:~AliPHOSTrackSegmentMakerv1"> </a> <a href=".././AliPHOSTrackSegmentMakerv1.html">AliPHOSTrackSegmentMakerv1</a>::~<a href=".././AliPHOSTrackSegmentMakerv1.html">AliPHOSTrackSegmentMakerv1</a>()
83
84 <b>  // dtor</b>
85  
86    delete <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fMinuit">fMinuit</a> ; 
87 }
88
89 <b>//____________________________________________________________________________</b>
90 <a name="AliPHOSTrackSegmentMakerv1:FindFit"> </a><a href="../ListOfTypes.html#Bool_t">Bool_t</a>  <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:FindFit">AliPHOSTrackSegmentMakerv1::FindFit</a>(<a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> * emcRP, <a href="../ListOfTypes.html#int">int</a> * maxAt, <a href="../ListOfTypes.html#Float_t">Float_t</a> * maxAtEnergy,
91                                     <a href="../ListOfTypes.html#Int_t">Int_t</a> nPar, <a href="../ListOfTypes.html#Float_t">Float_t</a> * fitparameters)
92
93 <b>  // Calls TMinuit to fit the energy distribution of a cluster with several maxima </b>
94
95   <a href=".././AliPHOSGeometry.html">AliPHOSGeometry</a> * geom = <a href=".././AliPHOSGeometry.html#AliPHOSGeometry:GetInstance">AliPHOSGeometry::GetInstance</a>() ;
96
97   gMinuit-&gt;SetPrintLevel(-1) ;           // No Printout
98   gMinuit-&gt;SetFCN(UnfoldingChiSquare) ;  // To set the address of the minimization function 
99   gMinuit-&gt;SetObjectFit(emcRP) ;         // To tranfer pointer to UnfoldingChiSquare
100
101 <b>  // filling initial values for fit parameters</b>
102   <a href=".././AliPHOSDigit.html">AliPHOSDigit</a> * digit ;
103
104   <a href="../ListOfTypes.html#Int_t">Int_t</a> ierflg  = 0; 
105   <a href="../ListOfTypes.html#Int_t">Int_t</a> index   = 0 ;
106   <a href="../ListOfTypes.html#Int_t">Int_t</a> nDigits = (<a href="../ListOfTypes.html#Int_t">Int_t</a>) nPar / 3 ;
107
108   <a href="../ListOfTypes.html#Int_t">Int_t</a> iDigit ;
109
110
111   for(iDigit = 0; iDigit &lt; nDigits; iDigit++){
112     digit = (<a href=".././AliPHOSDigit.html">AliPHOSDigit</a> *) maxAt[iDigit]; 
113
114     <a href="../ListOfTypes.html#Int_t">Int_t</a> relid[4] ;
115     <a href="../ListOfTypes.html#Float_t">Float_t</a> x ;
116     <a href="../ListOfTypes.html#Float_t">Float_t</a> z ;
117     geom-&gt;AbsToRelNumbering(digit-&gt;GetId(), relid) ;
118     geom-&gt;RelPosInModule(relid, x, z) ;
119
120     <a href="../ListOfTypes.html#Float_t">Float_t</a> energy = maxAtEnergy[iDigit] ;
121
122     gMinuit-&gt;mnparm(index, "x",  x, 0.1, 0, 0, ierflg) ;
123     index++ ;   
124     if(ierflg != 0){ 
125       cout &lt;&lt; "PHOS Unfolding&gt;  Unable to set initial value for fit procedure : x = " &lt;&lt; x &lt;&lt; endl ;
126       return kFALSE;
127     }
128     gMinuit-&gt;mnparm(index, "z",  z, 0.1, 0, 0, ierflg) ;
129     index++ ;   
130     if(ierflg != 0){
131       cout &lt;&lt; "PHOS Unfolding&gt;  Unable to set initial value for fit procedure : z = " &lt;&lt; z &lt;&lt; endl ;
132       return kFALSE;
133     }
134     gMinuit-&gt;mnparm(index, "Energy",  energy , 0.05*energy, 0., 4.*energy, ierflg) ;
135     index++ ;   
136     if(ierflg != 0){
137       cout &lt;&lt; "PHOS Unfolding&gt;  Unable to set initial value for fit procedure : energy = " &lt;&lt; energy &lt;&lt; endl ;      
138       return kFALSE;
139     }
140   }
141
142   <a href="../ListOfTypes.html#Double_t">Double_t</a> p0 = 0.1 ; // "Tolerance" Evaluation stops when EDM = 0.0001*p0 ; The number of function call slightly
143 <b>                      //  depends on it. </b>
144   <a href="../ListOfTypes.html#Double_t">Double_t</a> p1 = 1.0 ;
145   <a href="../ListOfTypes.html#Double_t">Double_t</a> p2 = 0.0 ;
146
147   gMinuit-&gt;mnexcm("SET STR", &amp;p2, 0, ierflg) ;   // force TgMinuit to reduce function calls  
148   gMinuit-&gt;mnexcm("SET GRA", &amp;p1, 1, ierflg) ;   // force TMinuit to use my gradient  
149   gMinuit-&gt;SetMaxIterations(5);
150   gMinuit-&gt;mnexcm("SET NOW", &amp;p2 , 0, ierflg) ;  // No Warnings
151   gMinuit-&gt;mnexcm("MIGRAD", &amp;p0, 0, ierflg) ;    // minimize 
152   if(ierflg == 4){  // Minimum not found   
153     cout &lt;&lt; "PHOS Unfolding&gt;  Fit not converged, cluster abandoned "&lt;&lt; endl ;      
154     return kFALSE ;
155   }            
156   for(index = 0; index &lt; nPar; index++){
157     <a href="../ListOfTypes.html#Double_t">Double_t</a> err ;
158     <a href="../ListOfTypes.html#Double_t">Double_t</a> val ;
159     gMinuit-&gt;GetParameter(index, val, err) ;    // Returns value and error of parameter index
160     fitparameters[index] = val ;
161    }
162   return kTRUE;
163
164 }
165
166 <b>//____________________________________________________________________________</b>
167 <a name="AliPHOSTrackSegmentMakerv1:FillOneModule"> </a><a href="../ListOfTypes.html#void">void</a>  <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:FillOneModule">AliPHOSTrackSegmentMakerv1::FillOneModule</a>(<a href="../ListOfTypes.html#DigitsList">DigitsList</a> * Dl, <a href="../ListOfTypes.html#RecPointsList">RecPointsList</a> * emcIn, TObjArray * emcOut, 
168                                         <a href="../ListOfTypes.html#RecPointsList">RecPointsList</a> * ppsdIn, TObjArray * ppsdOutUp,
169                                         TObjArray * ppsdOutLow, <a href="../ListOfTypes.html#Int_t">Int_t</a> &amp; phosmod, <a href="../ListOfTypes.html#Int_t">Int_t</a> &amp; emcStopedAt, 
170                                         <a href="../ListOfTypes.html#Int_t">Int_t</a> &amp; ppsdStopedAt)
171 {
172 <b>  // Unfold clusters and fill xxxOut arrays with clusters from one PHOS module</b>
173  
174   <a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> *  emcRecPoint  ; 
175   <a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a> * ppsdRecPoint ;
176   <a href="../ListOfTypes.html#Int_t">Int_t</a> index ;
177   
178   <a href="../ListOfTypes.html#Int_t">Int_t</a> nEmcUnfolded = emcIn-&gt;GetEntries() ;
179   for(index = emcStopedAt; index &lt; nEmcUnfolded; index++){
180     emcRecPoint = (<a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> *) (*emcIn)[index] ;
181
182     if(emcRecPoint-&gt;GetPHOSMod() != phosmod )  
183        break ;
184     
185     <a href="../ListOfTypes.html#Int_t">Int_t</a> nMultipl = emcRecPoint-&gt;GetMultiplicity() ; 
186     <a href="../ListOfTypes.html#Int_t">Int_t</a> maxAt[nMultipl] ;
187     <a href="../ListOfTypes.html#Float_t">Float_t</a> maxAtEnergy[nMultipl] ;
188     <a href="../ListOfTypes.html#Int_t">Int_t</a> nMax = emcRecPoint-&gt;GetNumberOfLocalMax(maxAt, maxAtEnergy) ;
189
190     if(nMax &lt;= 1 )     // if cluster is very flat (no pronounced maximum) then nMax = 0 
191       emcOut-&gt;Add(emcRecPoint) ;
192     else if (<a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fUnfoldFlag">fUnfoldFlag</a>) {
193       <a href="#AliPHOSTrackSegmentMakerv1:UnfoldClusters">UnfoldClusters</a>(Dl, emcIn, emcRecPoint, nMax, maxAt, maxAtEnergy, emcOut) ;
194       emcIn-&gt;Remove(emcRecPoint); 
195       emcIn-&gt;Compress() ;
196       nEmcUnfolded-- ;
197       index-- ;
198     }
199   }
200   emcStopedAt = index ;
201
202   for(index = ppsdStopedAt; index &lt; ppsdIn-&gt;GetEntries(); index++){
203     ppsdRecPoint = (<a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a> *) (*ppsdIn)[index] ;
204     if(ppsdRecPoint-&gt;GetPHOSMod() != phosmod )   
205       break ;
206     if(ppsdRecPoint-&gt;GetUp() ) 
207       ppsdOutUp-&gt;Add(ppsdRecPoint) ;
208     else  
209       ppsdOutLow-&gt;Add(ppsdRecPoint) ;
210   }
211   ppsdStopedAt = index ;
212    
213   emcOut-&gt;Sort() ;
214   ppsdOutUp-&gt;Sort() ;
215   ppsdOutLow-&gt;Sort() ;   
216 }
217 <b>//____________________________________________________________________________</b>
218 <a name="AliPHOSTrackSegmentMakerv1:GetDistanceInPHOSPlane"> </a><a href="../ListOfTypes.html#Float_t">Float_t</a>  <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:GetDistanceInPHOSPlane">AliPHOSTrackSegmentMakerv1::GetDistanceInPHOSPlane</a>(<a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> * emcclu,<a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a> * PpsdClu, <a href="../ListOfTypes.html#Bool_t">Bool_t</a> &amp;toofar)
219 {
220 <b>  // Calculates the distance between the EMC RecPoint and the PPSD RecPoint</b>
221  
222   <a href="../ListOfTypes.html#Float_t">Float_t</a> r = <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fR0">fR0</a> ;
223  
224   TVector3 vecEmc ;
225   TVector3 vecPpsd ;
226   
227   emcclu-&gt;GetLocalPosition(vecEmc) ;
228   PpsdClu-&gt;GetLocalPosition(vecPpsd)  ; 
229   if(emcclu-&gt;GetPHOSMod() == PpsdClu-&gt;GetPHOSMod()){ 
230     if(vecPpsd.X() &gt;= vecEmc.X() - <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fDelta">fDelta</a> ){ 
231       if(vecPpsd.Z() &gt;= vecEmc.Z() - <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fDelta">fDelta</a> ){
232         <a href=".././AliPHOSGeometry.html">AliPHOSGeometry</a> * geom = <a href=".././AliPHOSGeometry.html#AliPHOSGeometry:GetInstance">AliPHOSGeometry::GetInstance</a>() ;
233 <b>     // Correct to difference in CPV and EMC position due to different distance to center.</b>
234 <b>     // we assume, that particle moves from center</b>
235         <a href="../ListOfTypes.html#Float_t">Float_t</a> dCPV = geom-&gt;GetIPtoOuterCoverDistance();
236         <a href="../ListOfTypes.html#Float_t">Float_t</a> dEMC = geom-&gt;GetIPtoCrystalSurface() ;
237         dEMC         = dEMC / dCPV ;
238         vecPpsd = dEMC * vecPpsd  - vecEmc ; 
239         r = vecPpsd.Mag() ;
240       } // if  zPpsd &gt;= zEmc - <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fDelta">fDelta</a>
241       toofar = kFALSE ;
242     } // if  xPpsd &gt;= xEmc - <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fDelta">fDelta</a>
243     else 
244       toofar = kTRUE ;
245   } 
246   else 
247     toofar = kTRUE ;
248   
249   return r ;
250 }
251
252 <b>//____________________________________________________________________________</b>
253 <a name="AliPHOSTrackSegmentMakerv1:MakeLinks"> </a><a href="../ListOfTypes.html#void">void</a>  <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:MakeLinks">AliPHOSTrackSegmentMakerv1::MakeLinks</a>(TObjArray * emcRecPoints, TObjArray * ppsdRecPointsUp, 
254                                      TObjArray * ppsdRecPointsLow, TClonesArray * linklowArray, 
255                                      TClonesArray *linkupArray) 
256
257 <b>  // Finds distances (links) between all EMC and PPSD clusters, which are not further apart from each other than <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fR0">fR0</a> </b>
258   
259   TIter nextEmc(emcRecPoints) ;
260   <a href="../ListOfTypes.html#Int_t">Int_t</a> iEmcClu = 0 ; 
261   
262   <a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a> * ppsdlow ; 
263   <a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a> * ppsdup ;
264   <a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> * emcclu ;
265   
266   <a href="../ListOfTypes.html#Int_t">Int_t</a> iLinkLow = 0 ;
267   <a href="../ListOfTypes.html#Int_t">Int_t</a> iLinkUp  = 0 ;
268   
269   while( (emcclu = (<a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a>*)nextEmc() ) ) {
270     <a href="../ListOfTypes.html#Bool_t">Bool_t</a> toofar ;
271     TIter nextPpsdLow(ppsdRecPointsLow ) ;
272     <a href="../ListOfTypes.html#Int_t">Int_t</a> iPpsdLow = 0 ;
273     
274     while( (ppsdlow = (<a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a>*)nextPpsdLow() ) ) { 
275       <a href="../ListOfTypes.html#Float_t">Float_t</a> r = <a href="#AliPHOSTrackSegmentMakerv1:GetDistanceInPHOSPlane">GetDistanceInPHOSPlane</a>(emcclu, ppsdlow, toofar) ;
276       
277       if(toofar) 
278         break ;  
279       if(r &lt; <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fR0">fR0</a>) 
280         new( (*linklowArray)[iLinkLow++]) <a href=".././AliPHOSLink.html">AliPHOSLink</a>(r, iEmcClu, iPpsdLow) ;
281       
282       iPpsdLow++ ;
283       
284     }
285     
286     TIter nextPpsdUp(ppsdRecPointsUp ) ;
287     <a href="../ListOfTypes.html#Int_t">Int_t</a> iPpsdUp = 0 ;
288     
289     while( (ppsdup = (<a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a>*)nextPpsdUp() ) ) { 
290       <a href="../ListOfTypes.html#Float_t">Float_t</a> r = <a href="#AliPHOSTrackSegmentMakerv1:GetDistanceInPHOSPlane">GetDistanceInPHOSPlane</a>(emcclu, ppsdup, toofar) ;
291       
292       if(toofar)
293         break ;  
294       if(r &lt; <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:fR0">fR0</a>) 
295         new( (*linkupArray)[iLinkUp++]) <a href=".././AliPHOSLink.html">AliPHOSLink</a>(r, iEmcClu, iPpsdUp) ;
296       
297       iPpsdUp++ ;
298       
299     }
300     
301     iEmcClu++ ; 
302     
303   } // while nextEmC
304   
305   linklowArray-&gt;Sort() ; //first links with smallest distances
306   linkupArray-&gt;Sort() ;
307 }
308     
309 <b>//____________________________________________________________________________</b>
310 <a name="AliPHOSTrackSegmentMakerv1:MakePairs"> </a><a href="../ListOfTypes.html#void">void</a>  <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:MakePairs">AliPHOSTrackSegmentMakerv1::MakePairs</a>(TObjArray * emcRecPoints, TObjArray * ppsdRecPointsUp, 
311                                     TObjArray * ppsdRecPointsLow, TClonesArray * linklowArray, 
312                                     TClonesArray * linkupArray, <a href="../ListOfTypes.html#TrackSegmentsList">TrackSegmentsList</a> * trsl) 
313
314
315 <b>  // Finds the smallest links and makes pairs of PPSD and EMC clusters with smallest distance </b>
316   
317   TIter nextLow(linklowArray) ;
318   TIter nextUp(linkupArray) ;
319   
320   <a href=".././AliPHOSLink.html">AliPHOSLink</a> * linkLow ;
321   <a href=".././AliPHOSLink.html">AliPHOSLink</a> * linkUp ;
322
323   <a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> * emc ;
324   <a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a> * ppsdLow ;
325   <a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a> * ppsdUp ;
326
327   <a href=".././AliPHOSRecPoint.html">AliPHOSRecPoint</a> * nullpointer = 0 ;
328
329   while ( (linkLow =  (<a href=".././AliPHOSLink.html">AliPHOSLink</a> *)nextLow() ) ){
330     emc = (<a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> *) emcRecPoints-&gt;At(linkLow-&gt;GetEmc()) ;
331     ppsdLow = (<a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a> *) ppsdRecPointsLow-&gt;At(linkLow-&gt;GetPpsd()) ;
332     if( (emc) &amp;&amp; (ppsdLow) ){ // RecPoints not removed yet 
333          ppsdUp = 0 ;
334          
335          while ( (linkUp =  (<a href=".././AliPHOSLink.html">AliPHOSLink</a> *)nextUp() ) ){  
336            if(linkLow-&gt;GetEmc() == linkUp-&gt;GetEmc() ){
337              ppsdUp = (<a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a> *) ppsdRecPointsUp-&gt;At(linkUp-&gt;GetPpsd()) ;
338              break ;
339            }
340         
341          } // while nextUp
342          
343          nextUp.Reset();
344          <a href=".././AliPHOSTrackSegment.html">AliPHOSTrackSegment</a> * subtr = new <a href=".././AliPHOSTrackSegment.html">AliPHOSTrackSegment</a>(emc, ppsdUp, ppsdLow ) ;
345          trsl-&gt;Add(subtr) ;  
346          emcRecPoints-&gt;AddAt(nullpointer,linkLow-&gt;GetEmc()) ;       
347          ppsdRecPointsLow-&gt;AddAt(nullpointer,linkLow-&gt;GetPpsd()) ;
348          
349          if(ppsdUp)  
350            ppsdRecPointsUp-&gt;AddAt(nullpointer,linkUp-&gt;GetPpsd()) ;
351          
352     } 
353   } 
354    
355   TIter nextEmc(emcRecPoints) ;          
356   nextEmc.Reset() ;
357
358   while( (emc = (<a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a>*)nextEmc()) ){ //to create pairs if no ppsdlow
359     ppsdLow = 0 ; 
360     ppsdUp  = 0 ;
361     
362     while ( (linkUp =  (<a href=".././AliPHOSLink.html">AliPHOSLink</a> *)nextUp() ) ){
363       
364       if(emcRecPoints-&gt;IndexOf(emc) == linkUp-&gt;GetEmc() ){
365         ppsdUp = (<a href=".././AliPHOSPpsdRecPoint.html">AliPHOSPpsdRecPoint</a> *) ppsdRecPointsUp-&gt;At(linkUp-&gt;GetPpsd()) ;
366         break ;
367       }
368       
369     }
370     <a href=".././AliPHOSTrackSegment.html">AliPHOSTrackSegment</a> * subtr = new <a href=".././AliPHOSTrackSegment.html">AliPHOSTrackSegment</a>(emc, ppsdUp, ppsdLow ) ;
371     trsl-&gt;Add(subtr) ;   
372  
373     if(ppsdUp)  
374       ppsdRecPointsUp-&gt;AddAt(nullpointer,linkUp-&gt;GetPpsd()) ;
375   }
376      
377 }
378
379 <b>//____________________________________________________________________________</b>
380 <a name="AliPHOSTrackSegmentMakerv1:MakeTrackSegments"> </a><a href="../ListOfTypes.html#void">void</a>  <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:MakeTrackSegments">AliPHOSTrackSegmentMakerv1::MakeTrackSegments</a>(<a href="../ListOfTypes.html#DigitsList">DigitsList</a> * DL, <a href="../ListOfTypes.html#RecPointsList">RecPointsList</a> * emcl, 
381                                         <a href="../ListOfTypes.html#RecPointsList">RecPointsList</a> * ppsdl, <a href="../ListOfTypes.html#TrackSegmentsList">TrackSegmentsList</a> * trsl)
382 {
383 <b>  // Makes the track segments out of the list of EMC and PPSD Recpoints and stores them in a list</b>
384
385   <a href="../ListOfTypes.html#Int_t">Int_t</a> phosmod      = 1 ;
386   <a href="../ListOfTypes.html#Int_t">Int_t</a> emcStopedAt  = 0 ; 
387   <a href="../ListOfTypes.html#Int_t">Int_t</a> ppsdStopedAt = 0 ; 
388   
389   TObjArray * emcRecPoints     = new TObjArray(100) ;  // these arrays keep pointers 
390   TObjArray * ppsdRecPointsUp  = new TObjArray(100) ;  // to RecPoints, which are 
391   TObjArray * ppsdRecPointsLow = new TObjArray(100) ;  // kept in TClonesArray's emcl and ppsdl
392   
393   
394   TClonesArray * linklowArray = new TClonesArray("<a href=".././AliPHOSLink.html">AliPHOSLink</a>", 100);
395   TClonesArray * linkupArray  = new TClonesArray("<a href=".././AliPHOSLink.html">AliPHOSLink</a>", 100); 
396   
397   <a href=".././AliPHOSGeometry.html">AliPHOSGeometry</a> * geom = <a href=".././AliPHOSGeometry.html#AliPHOSGeometry:GetInstance">AliPHOSGeometry::GetInstance</a>() ;
398   
399   while(phosmod &lt;= geom-&gt;GetNModules() ){
400     
401     <a href="#AliPHOSTrackSegmentMakerv1:FillOneModule">FillOneModule</a>(DL, emcl, emcRecPoints, ppsdl, ppsdRecPointsUp, ppsdRecPointsLow, phosmod, emcStopedAt, ppsdStopedAt) ;
402
403     <a href="#AliPHOSTrackSegmentMakerv1:MakeLinks">MakeLinks</a>(emcRecPoints, ppsdRecPointsUp, ppsdRecPointsLow, linklowArray, linkupArray) ; 
404
405     <a href="#AliPHOSTrackSegmentMakerv1:MakePairs">MakePairs</a>(emcRecPoints, ppsdRecPointsUp, ppsdRecPointsLow, linklowArray, linkupArray, trsl) ;
406  
407     emcRecPoints-&gt;Clear() ;
408  
409     ppsdRecPointsUp-&gt;Clear() ;
410   
411     ppsdRecPointsLow-&gt;Clear() ;
412
413     linkupArray-&gt;Clear() ;
414    
415     linklowArray-&gt;Clear() ;
416    
417     phosmod++ ; 
418   }
419   delete emcRecPoints ; 
420   emcRecPoints = 0 ; 
421
422   delete ppsdRecPointsUp ; 
423   ppsdRecPointsUp = 0 ; 
424
425   delete ppsdRecPointsLow ; 
426   ppsdRecPointsLow = 0 ; 
427
428   delete linkupArray ; 
429   linkupArray = 0  ; 
430
431   delete linklowArray ; 
432   linklowArray = 0 ; 
433 }
434
435 <b>//____________________________________________________________________________</b>
436 <a name="AliPHOSTrackSegmentMakerv1:ShowerShape"> </a><a href="../ListOfTypes.html#Double_t">Double_t</a>  <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:ShowerShape">AliPHOSTrackSegmentMakerv1::ShowerShape</a>(<a href="../ListOfTypes.html#Double_t">Double_t</a> r)
437
438 <b>  // Shape of the shower (see PHOS TDR)</b>
439 <b>  // If you change this function, change also the gradien evaluation  in ChiSquare()</b>
440
441   <a href="../ListOfTypes.html#Double_t">Double_t</a> r4    = r*r*r*r ;
442   <a href="../ListOfTypes.html#Double_t">Double_t</a> r295  = TMath::Power(r, 2.95) ;
443   <a href="../ListOfTypes.html#Double_t">Double_t</a> shape = TMath::Exp( -r4 * (1. / (2.32 + 0.26 * r4) + 0.0316 / (1 + 0.0652 * r295) ) ) ;
444   return shape ;
445 }
446
447 <b>//____________________________________________________________________________</b>
448 <a name="AliPHOSTrackSegmentMakerv1:UnfoldClusters"> </a><a href="../ListOfTypes.html#void">void</a>  <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:UnfoldClusters">AliPHOSTrackSegmentMakerv1::UnfoldClusters</a>(<a href="../ListOfTypes.html#DigitsList">DigitsList</a> * DL, <a href="../ListOfTypes.html#RecPointsList">RecPointsList</a> * emcIn,  <a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> * iniEmc, 
449                                          <a href="../ListOfTypes.html#Int_t">Int_t</a> nMax, <a href="../ListOfTypes.html#int">int</a> * maxAt, <a href="../ListOfTypes.html#Float_t">Float_t</a> * maxAtEnergy, TObjArray * emcList)
450
451 <b>  // Performs the unfolding of a cluster with nMax overlapping showers </b>
452 <b>  // This is time consuming (use the (Un)SetUnfolFlag()  )</b>
453
454   <a href="../ListOfTypes.html#Int_t">Int_t</a> nPar = 3 * nMax ;
455   <a href="../ListOfTypes.html#Float_t">Float_t</a> fitparameters[nPar] ;
456   <a href=".././AliPHOSGeometry.html">AliPHOSGeometry</a> * geom = <a href=".././AliPHOSGeometry.html#AliPHOSGeometry:GetInstance">AliPHOSGeometry::GetInstance</a>() ;
457
458   <a href="../ListOfTypes.html#Bool_t">Bool_t</a> rv = <a href="#AliPHOSTrackSegmentMakerv1:FindFit">FindFit</a>(iniEmc, maxAt, maxAtEnergy, nPar, fitparameters) ;
459   if( !rv )  // Fit failed, return and remove cluster
460     return ;
461   
462   <a href="../ListOfTypes.html#Float_t">Float_t</a> xDigit ;
463   <a href="../ListOfTypes.html#Float_t">Float_t</a> zDigit ;
464   <a href="../ListOfTypes.html#Int_t">Int_t</a> relid[4] ;
465
466   <a href="../ListOfTypes.html#Int_t">Int_t</a> nDigits = iniEmc-&gt;GetMultiplicity() ;  
467   <a href="../ListOfTypes.html#Float_t">Float_t</a> xpar  ;
468   <a href="../ListOfTypes.html#Float_t">Float_t</a> zpar  ;
469   <a href="../ListOfTypes.html#Float_t">Float_t</a> epar  ;
470   <a href="../ListOfTypes.html#Float_t">Float_t</a> distance ;
471   <a href="../ListOfTypes.html#Float_t">Float_t</a> ratio ;
472   <a href="../ListOfTypes.html#Float_t">Float_t</a> efit[nDigits] ;
473   <a href="../ListOfTypes.html#Int_t">Int_t</a> iparam ;
474   <a href="../ListOfTypes.html#Int_t">Int_t</a> iDigit ;
475   
476   <a href=".././AliPHOSDigit.html">AliPHOSDigit</a> * digit ;
477   <a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> * emcRP ;  
478   <a href="../ListOfTypes.html#Int_t">Int_t</a> * emcDigits = iniEmc-&gt;GetDigitsList() ;
479   <a href="../ListOfTypes.html#Float_t">Float_t</a> * emcEnergies = iniEmc-&gt;GetEnergiesList() ;
480
481   <a href="../ListOfTypes.html#Int_t">Int_t</a> iRecPoint = emcIn-&gt;GetEntries() ;
482
483   for(iDigit = 0 ; iDigit &lt; nDigits ; iDigit ++){
484     digit = (<a href=".././AliPHOSDigit.html">AliPHOSDigit</a> *) emcDigits[iDigit];
485     geom-&gt;AbsToRelNumbering(digit-&gt;GetId(), relid) ;
486     geom-&gt;RelPosInModule(relid, xDigit, zDigit) ;
487     efit[iDigit] = 0;
488     iparam = 0 ;
489     
490     while(iparam &lt; nPar ){
491       xpar = fitparameters[iparam] ;
492       zpar = fitparameters[iparam+1] ;
493       epar = fitparameters[iparam+2] ;
494       iparam += 3 ;
495       distance = (xDigit - xpar) * (xDigit - xpar) + (zDigit - zpar) * (zDigit - zpar)  ;
496       distance =  TMath::Sqrt(distance) ;
497       efit[iDigit] += epar * <a href="#AliPHOSTrackSegmentMakerv1:ShowerShape">ShowerShape</a>(distance) ;
498     }
499   }
500
501   iparam = 0 ;
502   <a href="../ListOfTypes.html#Float_t">Float_t</a> eDigit ;
503
504   while(iparam &lt; nPar ){
505     xpar = fitparameters[iparam] ;
506     zpar = fitparameters[iparam+1] ;
507     epar = fitparameters[iparam+2] ;
508     iparam += 3 ;
509     new ((*emcIn)[iRecPoint]) <a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a>( iniEmc-&gt;GetLogWeightCut(), iniEmc-&gt;GetLocMaxCut() ) ;
510     emcRP = (<a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> *) emcIn-&gt;At(iRecPoint++);
511
512     for(iDigit = 0 ; iDigit &lt; nDigits ; iDigit ++){
513       digit = (<a href=".././AliPHOSDigit.html">AliPHOSDigit</a> *) emcDigits[iDigit];
514       geom-&gt;AbsToRelNumbering(digit-&gt;GetId(), relid) ;
515       geom-&gt;RelPosInModule(relid, xDigit, zDigit) ;
516       distance = (xDigit - xpar) * (xDigit - xpar) + (zDigit - zpar) * (zDigit - zpar)  ;
517       distance =  TMath::Sqrt(distance) ;
518       ratio = epar * <a href="#AliPHOSTrackSegmentMakerv1:ShowerShape">ShowerShape</a>(distance) / efit[iDigit] ; 
519       eDigit = emcEnergies[iDigit] * ratio ;
520       emcRP-&gt;AddDigit( *digit, eDigit ) ;
521     }
522
523     emcList-&gt;Add(emcRP) ;
524
525   }
526 }
527
528 <b>//______________________________________________________________________________</b>
529 <a href="../ListOfTypes.html#void">void</a> UnfoldingChiSquare(<a href="../ListOfTypes.html#Int_t">Int_t</a> &amp; nPar, <a href="../ListOfTypes.html#Double_t">Double_t</a> * Grad, <a href="../ListOfTypes.html#Double_t">Double_t</a> &amp; fret, <a href="../ListOfTypes.html#Double_t">Double_t</a> * x, <a href="../ListOfTypes.html#Int_t">Int_t</a> iflag)
530 {
531 <b>  // Calculates th Chi square for the cluster unfolding minimization</b>
532 <b>  // Number of parameters, Gradient, Chi squared, parameters, what to do</b>
533
534   <a href=".././AliPHOSGeometry.html">AliPHOSGeometry</a> * geom = <a href=".././AliPHOSGeometry.html#AliPHOSGeometry:GetInstance">AliPHOSGeometry::GetInstance</a>() ;
535
536   <a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> * emcRP = (<a href=".././AliPHOSEmcRecPoint.html">AliPHOSEmcRecPoint</a> *) gMinuit-&gt;GetObjectFit() ; // EmcRecPoint to fit
537   <a href="../ListOfTypes.html#Int_t">Int_t</a> * emcDigits     = emcRP-&gt;GetDigitsList() ;
538   <a href="../ListOfTypes.html#Float_t">Float_t</a> * emcEnergies = emcRP-&gt;GetEnergiesList() ;
539   fret = 0. ;     
540   <a href="../ListOfTypes.html#Int_t">Int_t</a> iparam ;
541
542   if(iflag == 2)
543     for(iparam = 0 ; iparam &lt; nPar ; iparam++)    
544       Grad[iparam] = 0 ; // Will evaluate gradient
545   
546   <a href="../ListOfTypes.html#Double_t">Double_t</a> efit ;  
547   
548   <a href=".././AliPHOSDigit.html">AliPHOSDigit</a> * digit ;
549   <a href="../ListOfTypes.html#Int_t">Int_t</a> iDigit = 0 ;
550
551   while ( (digit = (<a href=".././AliPHOSDigit.html">AliPHOSDigit</a> *)emcDigits[iDigit] )){
552     <a href="../ListOfTypes.html#Int_t">Int_t</a> relid[4] ;
553     <a href="../ListOfTypes.html#Float_t">Float_t</a> xDigit ;
554     <a href="../ListOfTypes.html#Float_t">Float_t</a> zDigit ;
555     geom-&gt;AbsToRelNumbering(digit-&gt;GetId(), relid) ;
556     geom-&gt;RelPosInModule(relid, xDigit, zDigit) ;
557     
558      if(iflag == 2){  // calculate gradient
559        <a href="../ListOfTypes.html#Int_t">Int_t</a> iParam = 0 ;
560        efit = 0 ;
561        while(iParam &lt; nPar ){
562          <a href="../ListOfTypes.html#Double_t">Double_t</a> distance = (xDigit - x[iParam]) * (xDigit - x[iParam]) ;
563          iParam++ ; 
564          distance += (zDigit - x[iParam]) * (zDigit - x[iParam]) ; 
565          distance = TMath::Sqrt( distance ) ; 
566          iParam++ ;      
567          efit += x[iParam] * <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:ShowerShape">AliPHOSTrackSegmentMakerv1::ShowerShape</a>(distance) ;
568          iParam++ ;
569        }
570        <a href="../ListOfTypes.html#Double_t">Double_t</a> sum = 2. * (efit - emcEnergies[iDigit]) / emcEnergies[iDigit] ; // Here we assume, that sigma = sqrt(E) 
571        iParam = 0 ;
572        while(iParam &lt; nPar ){
573          <a href="../ListOfTypes.html#Double_t">Double_t</a> xpar = x[iParam] ;
574          <a href="../ListOfTypes.html#Double_t">Double_t</a> zpar = x[iParam+1] ;
575          <a href="../ListOfTypes.html#Double_t">Double_t</a> epar = x[iParam+2] ;
576          <a href="../ListOfTypes.html#Double_t">Double_t</a> dr = TMath::Sqrt( (xDigit - xpar) * (xDigit - xpar) + (zDigit - zpar) * (zDigit - zpar) );
577          <a href="../ListOfTypes.html#Double_t">Double_t</a> shape = sum * <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:ShowerShape">AliPHOSTrackSegmentMakerv1::ShowerShape</a>(dr) ;
578          <a href="../ListOfTypes.html#Double_t">Double_t</a> r4 = dr*dr*dr*dr ;
579          <a href="../ListOfTypes.html#Double_t">Double_t</a> r295 = TMath::Power(dr,2.95) ;
580          <a href="../ListOfTypes.html#Double_t">Double_t</a> deriv =-4. * dr*dr * ( 2.32 / ( (2.32 + 0.26 * r4) * (2.32 + 0.26 * r4) ) +
581                                          0.0316 * (1. + 0.0171 * r295) / ( ( 1. + 0.0652 * r295) * (1. + 0.0652 * r295) ) ) ;
582          
583          Grad[iParam] += epar * shape * deriv * (xpar - xDigit) ;  // Derivative over x    
584          iParam++ ; 
585          Grad[iParam] += epar * shape * deriv * (zpar - zDigit) ;  // Derivative over z         
586          iParam++ ; 
587          Grad[iParam] += shape ;                                  // Derivative over energy             
588          iParam++ ; 
589        }
590      }
591      efit = 0;
592      iparam = 0 ;
593      while(iparam &lt; nPar ){
594        <a href="../ListOfTypes.html#Double_t">Double_t</a> xpar = x[iparam] ;
595        <a href="../ListOfTypes.html#Double_t">Double_t</a> zpar = x[iparam+1] ;
596        <a href="../ListOfTypes.html#Double_t">Double_t</a> epar = x[iparam+2] ;
597        iparam += 3 ;
598        <a href="../ListOfTypes.html#Double_t">Double_t</a> distance = (xDigit - xpar) * (xDigit - xpar) + (zDigit - zpar) * (zDigit - zpar)  ;
599        distance =  TMath::Sqrt(distance) ;
600        efit += epar * <a href=".././AliPHOSTrackSegmentMakerv1.html#AliPHOSTrackSegmentMakerv1:ShowerShape">AliPHOSTrackSegmentMakerv1::ShowerShape</a>(distance) ;
601      }
602      fret += (efit-emcEnergies[iDigit])*(efit-emcEnergies[iDigit])/emcEnergies[iDigit] ; 
603 <b>     // Here we assume, that sigma = sqrt(E)</b>
604      iDigit++ ;
605   }
606 }
607 </pre>
608
609 <!--SIGNATURE-->
610 <br>
611 <address>
612 <hr>
613 <center>
614 <a href="http://root.cern.ch/root/Welcome.html">ROOT page</a> - <a href="../ClassIndex.html">Class index</a> - <a href="#TopOfPage">Top of the page</a><br>
615 </center>
616 <hr>This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to <a href="mailto:rootdev@root.cern.ch">ROOT support</a>, or contact <a href="mailto:rootdev@root.cern.ch">the developers</a> with any questions or problems regarding ROOT.
617 </address>
618 </body>
619 </html>