]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EMCAL/AliCaloRawAnalyzerPeakFinder.cxx
c246278d6af65a937e7bdc7c7164f0fca4b08c11
[u/mrichter/AliRoot.git] / EMCAL / AliCaloRawAnalyzerPeakFinder.cxx
1 // -*- mode: c++ -*-
2 /**************************************************************************
3  * This file is property of and copyright by                              *
4  * the Relativistic Heavy Ion Group (RHIG), Yale University, US, 2009     *
5  *                                                                        *
6  * Primary Author: Per Thomas Hille  <perthomas.hille@yale.edu>           *
7  *                                                                        *
8  * Contributors are mentioned in the code where appropriate.              *
9  * Please report bugs to   perthomas.hille@yale.edu                       *
10  *                                                                        *
11  * Permission to use, copy, modify and distribute this software and its   *
12  * documentation strictly for non-commercial purposes is hereby granted   *
13  * without fee, provided that the above copyright notice appears in all   *
14  * copies and that both the copyright notice and this permission notice   *
15  * appear in the supporting documentation. The authors make no claims     *
16  * about the suitability of this software for any purpose. It is          *
17  * provided "as is" without express or implied warranty.                  *
18  **************************************************************************/
19
20 // The Peak-Finder algorithm
21 // The amplitude is extracted  as a
22 // weighted sum of the samples using the 
23 // best possible weights.
24 // The wights is calculated only once and the
25 // Actual extraction of amplitude and peak position
26 // Is done with a simple vector multiplication, allowing for
27 // Extreemely fast computations. 
28
29 #include "AliCaloRawAnalyzerPeakFinder.h"
30 #include "AliCaloBunchInfo.h"
31 #include "AliCaloFitResults.h"
32 #include "TMath.h"
33 #include "AliLog.h"
34 #include "AliCDBEntry.h"
35 #include "AliCDBManager.h"
36 #include "TFile.h"
37 #include "AliCaloPeakFinderVectors.h"
38 #include <iostream>
39 using namespace std;
40
41
42 ClassImp( AliCaloRawAnalyzerPeakFinder )
43
44
45 AliCaloRawAnalyzerPeakFinder::AliCaloRawAnalyzerPeakFinder() :AliCaloRawAnalyzer("Peak-Finder", "PF"),  
46                                                               fAmp(0),
47                                                               fPeakFinderVectors(0),
48                                                               fRunOnAlien(false),
49                                                               fIsInitialized(false)
50 {
51   //Comment
52   fAlgo= Algo::kPeakFinder;
53   InitOCDB(fRunOnAlien);
54   fPeakFinderVectors = new AliCaloPeakFinderVectors() ;
55   ResetVectors();
56   LoadVectorsOCDB();
57 }
58
59
60 void 
61 AliCaloRawAnalyzerPeakFinder::InitOCDB(bool alien) const
62 {
63   // Setting the default OCDB pathe depending on wether we work locally or on the GRID.
64   AliCDBManager::Instance()->SetDefaultStorage(  alien == true ? "alien://$ALICE_ROOT/OCDB" : "local://$ALICE_ROOT/OCDB");
65   AliCDBManager::Instance()->SetRun(100);
66 }
67
68
69 void  
70 AliCaloRawAnalyzerPeakFinder::ResetVectors()
71 {
72   //As name implies
73   for(int i=0; i < PF::MAXSTART; i++)
74     {
75       for(int j=0; j < PF::SAMPLERANGE; j++ )
76         {
77           for(int k=0; k < 100; k++ )
78             {
79               fPFAmpVectors[i][j][k] = 0; 
80               fPFTofVectors[i][j][k] = 0;
81               fPFAmpVectorsCoarse[i][j][k] = 0;
82               fPFTofVectorsCoarse[i][j][k] = 0; 
83             }
84         }
85     }
86 }
87
88
89 AliCaloRawAnalyzerPeakFinder::~AliCaloRawAnalyzerPeakFinder()
90 {
91   //comment
92 }
93
94
95 Double_t  
96 AliCaloRawAnalyzerPeakFinder::ScanCoarse(const Double_t *const array, const int length ) const
97 {
98   // Fisrt (coarce) estimate of Amplitude using the Peak-Finder.
99   // The output of the first iteration is sued to select vectors 
100   // for the second iteration.
101
102   Double_t tmpTof = 0;
103   Double_t tmpAmp= 0;
104
105   for(int i=0; i < length; i++)
106     {
107       tmpTof += fPFTofVectorsCoarse[0][length][i]*array[i]; 
108       tmpAmp += fPFAmpVectorsCoarse[0][length][i]*array[i]; 
109     }
110   
111   tmpTof = tmpTof / tmpAmp ;
112   return tmpTof;
113 }
114
115
116 AliCaloFitResults 
117 AliCaloRawAnalyzerPeakFinder::Evaluate( const vector<AliCaloBunchInfo> &bunchvector, const UInt_t altrocfg1,  const UInt_t altrocfg2 )
118 {
119   if( fIsInitialized == false )
120     {
121       cout << __FILE__ << ":" << __LINE__ << "ERROR, peakfinder vectors not loaded" << endl;
122       return  AliCaloFitResults(kInvalid, kInvalid);
123     }
124
125   // Extracting the amplitude using the Peak-Finder algorithm
126   // The amplitude is a weighted sum of the samples using 
127   // optimum weights.
128
129   short maxampindex; //index of maximum amplitude
130   short maxamp; //Maximum amplitude
131   fAmp = 0;
132   int index = SelectBunch( bunchvector,  &maxampindex,  &maxamp );
133   
134   if( index >= 0)
135     {
136       Float_t ped = ReverseAndSubtractPed( &(bunchvector.at(index))  ,  altrocfg1, altrocfg2, fReversed  );
137       Float_t maxf = TMath::MaxElement(   bunchvector.at(index).GetLength(),  fReversed );
138       short timebinOffset = maxampindex - (bunchvector.at( index ).GetLength()-1); 
139  
140       if(  maxf < fAmpCut  ||  ( maxamp - ped) > fOverflowCut  ) // (maxamp - ped) > fOverflowCut = Close to saturation (use low gain then)
141         {
142           return  AliCaloFitResults( maxamp, ped, Ret::kCrude, maxf, timebinOffset);
143         }            
144       else if ( maxf >= fAmpCut )
145         {
146           int first = 0;
147           int last = 0;
148           short maxrev = maxampindex  -  bunchvector.at(index).GetStartBin();     
149           SelectSubarray( fReversed,  bunchvector.at(index).GetLength(), maxrev, &first, &last);
150           int nsamples =  last - first;
151
152           if( ( nsamples  )  >= fNsampleCut ) // no if statement needed really; keep for readability
153             {
154               int startbin = bunchvector.at(index).GetStartBin();  
155               int n = last - first;  
156               int pfindex = n - fNsampleCut; 
157               pfindex = pfindex > PF::SAMPLERANGE ? PF::SAMPLERANGE : pfindex;
158
159               int dt =  maxampindex - startbin -2; 
160               int tmpindex = 0;
161
162
163               Float_t tmptof = ScanCoarse( &fReversed[dt] , n );
164               
165               if( tmptof < -1 )
166                 {
167                   tmpindex = 0;
168                 }
169               else
170                 if( tmptof  > -1 && tmptof < 100 )
171                   {
172                     tmpindex = 1;
173                   }
174                 else
175                   {
176                     tmpindex = 2;
177                   }
178
179               double tof = 0;
180             
181               for(int k=0; k < PF::SAMPLERANGE; k++   )
182                 {
183                   tof +=  fPFTofVectors[0][pfindex][k]*fReversed[ dt  +k + tmpindex -1 ];   
184                 }
185             
186               for( int i=0; i < PF::SAMPLERANGE; i++ )
187                 {
188                   {
189                     fAmp += fPFAmpVectors[0][pfindex][i]*fReversed[ dt  +i  +tmpindex -1 ];
190                   }
191                 }
192               if( TMath::Abs(  (maxf - fAmp  )/maxf )  >   0.1 )
193                 {
194                   //      cout << __FILE__ << ":" << __LINE__ << "WARNING: amp was" << fAmp <<", but was changed to "<< maxf << endl;
195                   fAmp = maxf;
196                 }
197               
198               tof = timebinOffset - 0.01*tof/fAmp; // clock ticks
199               // use local-array time for chi2 estimate
200               Float_t chi2 = CalculateChi2(fAmp, tof-timebinOffset+maxrev, first, last);
201               Int_t ndf = last - first - 1; // nsamples - 2
202               return AliCaloFitResults( maxamp, ped , Ret::kFitPar, fAmp, tof, 
203                                         timebinOffset, chi2, ndf,
204                                         Ret::kDummy, AliCaloFitSubarray(index, maxrev, first, last) );  
205             }
206           else
207             {
208               Float_t chi2 = CalculateChi2(maxf, maxrev, first, last);
209               Int_t ndf = last - first - 1; // nsamples - 2
210               return AliCaloFitResults( maxamp, ped , Ret::kCrude, maxf, timebinOffset,
211                                         timebinOffset, chi2, ndf, Ret::kDummy, AliCaloFitSubarray(index, maxrev, first, last) ); 
212             }
213         } // ampcut
214     }
215   return  AliCaloFitResults(kInvalid, kInvalid);
216 }
217
218
219 void   
220 AliCaloRawAnalyzerPeakFinder::CopyVectors( const AliCaloPeakFinderVectors *const pfv )
221 {
222   // As name implies
223   if ( pfv != 0)
224     {
225       for(int i = 0;  i < PF::MAXSTART ; i++)
226         {
227           for( int j=0; j < PF::SAMPLERANGE; j++)  
228             {
229               pfv->GetVector( i, j, fPFAmpVectors[i][j] ,  fPFTofVectors[i][j],    
230                               fPFAmpVectorsCoarse[i][j] , fPFTofVectorsCoarse[i][j]  ); 
231
232               fPeakFinderVectors->SetVector( i, j, fPFAmpVectors[i][j], fPFTofVectors[i][j],    
233                                              fPFAmpVectorsCoarse[i][j], fPFTofVectorsCoarse[i][j] );   
234             }
235         }
236     }
237   else
238     {
239       AliFatal( "pfv = ZERO !!!!!!!");
240     } 
241 }
242
243
244 void   
245 AliCaloRawAnalyzerPeakFinder::LoadVectorsOCDB()
246 {
247   //Loading of Peak-Finder  vectors from the 
248   //Offline Condition Database  (OCDB)
249   AliCDBEntry* entry = AliCDBManager::Instance()->Get("EMCAL/Calib/PeakFinder/");
250   cout << __FILE__ << ":" << __LINE__ << ": Printing metadata !! " << endl;
251   entry->PrintMetaData();
252
253   if( entry != 0 )
254     {
255       AliCaloPeakFinderVectors  *pfv = (AliCaloPeakFinderVectors *)entry->GetObject(); 
256       if( pfv == 0 )
257         {
258           cout << __FILE__ << ":" << __LINE__ << "_ ERRROR " << endl;
259         }
260   
261       CopyVectors( pfv );
262       
263       if( pfv != 0 )
264         {
265           fIsInitialized = true;
266         }
267     }
268 }
269
270
271 void 
272 AliCaloRawAnalyzerPeakFinder::LoadVectorsASCII()
273 {
274   //Read in the Peak finder vecors from ASCI files
275   fIsInitialized= true;  
276   const Int_t buffersize = 256;
277   for(int i = 0;  i < PF::MAXSTART ; i++)
278   {
279     for( int j=0; j < PF::SAMPLERANGE; j++)
280     {
281       char filenameCoarse[buffersize];
282       char filename[buffersize];
283       int n = j+fNsampleCut;
284       double start = (double)i+0;
285       
286       snprintf(filename, buffersize,       "%s/EMCAL/vectors-emcal/start%.1fN%dtau0.235fs10dt1.0.txt", getenv("ALICE_ROOT"), start, n);
287       snprintf(filenameCoarse, buffersize, "%s/EMCAL/vectors-emcal/start%.1fN%dtau0.235fs10dt3.0.txt", getenv("ALICE_ROOT"), start, n);
288       
289       FILE *fp  =  fopen(filename, "r");
290       FILE *fpc =  fopen(filenameCoarse, "r");
291       
292       if( fp == 0 )
293             {
294               AliFatal( Form( "could not open file: %s", filename ) );
295             }
296       else if(fpc == 0)
297             {
298               AliFatal( Form( "could not open file: %s", filenameCoarse ) );
299             }
300       else
301             {
302               for(int m = 0; m < n ; m++ )
303         {
304           fscanf(fp, "%lf\t", &fPFAmpVectors[i][j][m] );
305           fscanf(fpc, "%lf\t", &fPFAmpVectorsCoarse[i][j][m] );
306         }
307               fscanf(fp,   "\n" );
308               fscanf(fpc,  "\n" );
309               for(int m = 0; m < n ; m++ )
310         {
311           fscanf(fp, "%lf\t",   &fPFTofVectors[i][j][m]  );
312           fscanf(fpc, "%lf\t",  &fPFTofVectorsCoarse[i][j][m]  );  
313         }
314               
315               fPeakFinderVectors->SetVector( i, j, fPFAmpVectors[i][j], fPFTofVectors[i][j],    
316                                       fPFAmpVectorsCoarse[i][j], fPFTofVectorsCoarse[i][j] );   
317         
318               fclose (fp);
319               fclose (fpc);
320             }
321     }
322   }
323 }
324
325
326 void   
327 AliCaloRawAnalyzerPeakFinder::WriteRootFile() const
328 {
329   // Utility function to write Peak-Finder vectors to an root file
330   // The output is used to create an OCDB entry.
331   fPeakFinderVectors->PrintVectors();
332   TFile *f = new TFile("peakfindervectors2.root",  "recreate" );
333   fPeakFinderVectors->Write();
334   f->Close();
335   delete f;
336 }
337
338
339 void 
340 AliCaloRawAnalyzerPeakFinder::PrintVectors()
341 {
342   for(int i=0; i < 20; i++)
343     {
344       for( int j = 0; j < PF::MAXSTART; j ++ )
345         {
346           for( int k=0; k < PF::SAMPLERANGE; k++ )
347             {
348               cout << fPFAmpVectors[j][k][i] << "\t" ;
349             }
350         }
351       cout << endl;
352     }
353   cout << __FILE__ << ":" << __LINE__ << ":.... DONE !!" << endl;
354 }