]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/src/AliL3VertexArray.cxx
Added Gautes changes from Bergen.
[u/mrichter/AliRoot.git] / HLT / src / AliL3VertexArray.cxx
1 // @(#) $Id$
2
3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright &copy ALICE HLT Group
5
6 #include "AliL3StandardIncludes.h"
7
8 #include "AliL3Logging.h"
9 #include "AliL3VertexArray.h"
10
11
12 /** \class AliL3VertexArray
13 <pre>
14 //_____________________________________________________________
15 // AliL3VertexArray
16 //
17 // The L3 Fast Vertex Finder Base Class
18 //
19 // usage:
20 //
21 //for(Int_t sec=0;sec<NSEC;sec++){
22 //  ResetSector();
23 //  FillSectorSeed3D(x,y,z);
24 //  FillSector3D(x,y,z);
25 //  FindSectorVertex();
26 //  Double_t z = GetZSector();
27 //  Double_t zerr = GetZSectorErr();
28 //  // do somethink with z, zerr
29 //}
30 </pre>
31 */
32
33 ClassImp(AliL3VertexArray)
34 void AliL3VertexArray::AnalyzeSector(Float_t *vertex, Int_t *array, Int_t len)
35 {
36   //loop over all seeds and all vertex position
37   LOG(AliL3Log::kInformational,"AliL3VertexArray::AnalyzeSector","Analyze")
38   <<AliL3Log::kDec<<"Number of Seeds: "<<fNSeed<<ENDLOG;
39   for(Int_t i =0;i<fNSeed;i++)
40     for(Int_t bin = 0;bin<len;bin++)
41       array[bin] += Trace(fZSeed[i],fRSeed[i],fSecSeed[i],vertex[bin]);
42 }
43
44 void AliL3VertexArray::FindSectorVertex(Double_t pos, Double_t range, Int_t nbin)
45 {
46   //define position and range for search and
47   //loop over all seeds
48   //and find position of vertex and error 
49   const Int_t klen = nbin;
50   const Double_t kwidth = range; 
51   const Double_t kxmin = pos - kwidth/2;
52   const Double_t kstep = kwidth/klen;
53   const Double_t kstart = kxmin + kstep/2.;
54   Int_t * array = new Int_t[klen];
55   Float_t * ver   = new Float_t[klen];
56   for(Int_t i=0;i<klen;i++){
57     ver[i] =  kstart + kstep * i;
58     array[i] = 0;
59   }
60   AnalyzeSector(ver,array,klen);
61   FindMean(ver,array,klen);
62   delete[] array;
63   delete[] ver;
64 }
65
66 void AliL3VertexArray::FindMean(Float_t *vertex,Int_t *array, Int_t len)
67 {
68   //find mean and error of array and store it in
69   //fZSector and fZSectorErr
70   const Int_t knbin = len;
71   Int_t xbin =0;
72   Int_t max=0;
73   for(Int_t i = 0;i<knbin;i++){
74     if(array[i]>max){
75       max = array[i];
76       xbin =i;
77     }
78   }
79   Int_t hmax = max/2;
80   Int_t xmin,xmax;
81   Int_t ops = 0;
82   xmin = xbin;
83   while(xmin--){
84     if(xmin<0) {ops++;break;}
85     if(array[xmin]<hmax) {
86       break;
87     }
88   }
89   xmax = xbin;
90   while(xmax++){
91     if(xmax>=knbin) {ops++;break;}
92     if(array[xmax]<hmax){
93       break;
94     }
95   }
96   if(ops){
97     if(xbin >= knbin/2){xmin = 2 * xbin - knbin +1;xmax = knbin-1;}
98     else{xmin = 0;xmax = 2 * xbin;}
99   }
100   Double_t sumw=0;
101   Double_t sumw2=0;
102   Double_t sumwx=0;
103   Double_t sumwx2=0;
104   for(Int_t bin = xmin;bin<=xmax;bin++){
105     sumw   += array[bin];
106     sumw2  += array[bin] * array[bin]; 
107     sumwx  += array[bin] * vertex[bin];
108     sumwx2 += array[bin] * vertex[bin] * vertex[bin];
109   }
110   if(sumw){
111     Double_t mean = sumwx/sumw;
112     Double_t rms2 = fabs(sumwx2/sumw - mean*mean);
113     fZSectorErr = sqrt(rms2/sumw);
114     fZSector = mean;
115   }
116   else{fZSectorErr = fZSector = 0;}
117   sumw=sumw2=sumwx=sumwx2=0;
118   for(Int_t bin = 0;bin<knbin;bin++){
119     sumw   += array[bin];
120     sumw2  += array[bin] * array[bin];
121     sumwx  += array[bin] * vertex[bin];
122     sumwx2 += array[bin] * vertex[bin] * vertex[bin];
123   }
124   if(sumw){
125     Double_t mean = fZSector;
126     Double_t rms2 = fabs(sumwx2/sumw - mean*mean);
127     fZSectorErr = sqrt(rms2/sumw);
128   }
129 }
130