]> git.uio.no Git - u/mrichter/AliRoot.git/blob - FMD/AliFMDBaseDA.cxx
Added reading of the SOD event to the FMD raw reader. This event will contain crucial...
[u/mrichter/AliRoot.git] / FMD / AliFMDBaseDA.cxx
1 /**************************************************************************
2  * Copyright(c) 2004, 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 /** @file    AliFMDBaseDA.cxx
17     @author  Hans Hjersing Dalsgaard <canute@nbi.dk>
18     @date    Wed Mar 26 11:30:45 2008
19     @brief   Base class for detector algorithms.
20 */
21 //
22 // This is the implementation of the (virtual) base class for the FMD
23 // detector algorithms(DA). It implements the creation of the relevant
24 // containers and handles the loop over the raw data. The derived
25 // classes can control the parameters and action to be taken making
26 // this the base class for the Pedestal, Gain and Physics DA.
27 //
28
29 #include "AliFMDBaseDA.h"
30 #include "iostream"
31
32 #include "AliFMDRawReader.h"
33 #include "AliFMDCalibSampleRate.h"
34 #include "AliFMDCalibStripRange.h"
35 #include "AliLog.h"
36 #include "AliRawEventHeaderBase.h"
37
38 //_____________________________________________________________________
39 ClassImp(AliFMDBaseDA)
40 #if 0 
41 ; // Do not delete  - to let Emacs for mat the code
42 #endif
43
44 //_____________________________________________________________________
45 const char*
46 AliFMDBaseDA::GetStripPath(UShort_t det, 
47                            Char_t   ring, 
48                            UShort_t sec, 
49                            UShort_t str, 
50                            Bool_t   full) const
51 {
52   return Form("%s%sFMD%d%c[%02d,%03d]", 
53               (full ? GetSectorPath(det, ring, sec, full) : ""), 
54               (full ? "/" : ""), det, ring, sec, str);
55 }
56 //_____________________________________________________________________
57 const char*
58 AliFMDBaseDA::GetSectorPath(UShort_t det, 
59                             Char_t   ring, 
60                             UShort_t sec, 
61                             Bool_t   full) const
62 {
63   return Form("%s%sFMD%d%c[%02d]", 
64               (full ? GetRingPath(det, ring, full) : ""), 
65               (full ? "/" : ""), det, ring, sec);
66 }
67 //_____________________________________________________________________
68 const char*
69 AliFMDBaseDA::GetRingPath(UShort_t det, 
70                           Char_t   ring, 
71                           Bool_t   full) const
72 {
73   return Form("%s%sFMD%d%c", 
74               (full ? GetDetectorPath(det, full) : ""), 
75               (full ? "/" : ""), det, ring);
76 }
77 //_____________________________________________________________________
78 const char*
79 AliFMDBaseDA::GetDetectorPath(UShort_t det, 
80                               Bool_t   full) const
81 {
82   return Form("%s%sFMD%d", 
83               (full ? fDiagnosticsFilename.Data() : ""), 
84               (full ? ":/" : ""), det);
85 }
86
87 //_____________________________________________________________________
88 AliFMDBaseDA::AliFMDBaseDA() : 
89   TNamed(),
90   fDiagnosticsFilename("diagnosticsHistograms.root"),
91   fOutputFile(),
92   fConditionsFile(),
93   fSaveHistograms(kFALSE),
94   fDetectorArray(),
95   fPulseSize(16),
96   fPulseLength(16),
97   fRequiredEvents(5),
98   fCurrentEvent(0)
99  {
100   fDetectorArray.SetOwner();
101   fConditionsFile.open("conditions.csv");
102 }
103 //_____________________________________________________________________
104 AliFMDBaseDA::AliFMDBaseDA(const AliFMDBaseDA & baseDA) : 
105   TNamed(baseDA),
106   fDiagnosticsFilename(baseDA.fDiagnosticsFilename.Data()),
107   fOutputFile(),
108   fConditionsFile(),
109   fSaveHistograms(baseDA.fSaveHistograms),
110   fDetectorArray(baseDA.fDetectorArray),
111   fPulseSize(baseDA.fPulseSize),
112   fPulseLength(baseDA.fPulseLength),
113   fRequiredEvents(baseDA.fRequiredEvents),
114   fCurrentEvent(baseDA.fCurrentEvent)
115 {
116   fDetectorArray.SetOwner();
117   
118 }
119
120
121 //_____________________________________________________________________
122 AliFMDBaseDA::~AliFMDBaseDA() 
123 {
124   //destructor
125 }
126
127 //_____________________________________________________________________
128 void AliFMDBaseDA::Run(AliRawReader* reader) 
129 {
130   TFile* diagFile = 0;
131   if (fSaveHistograms)
132     diagFile = TFile::Open(fDiagnosticsFilename.Data(),"RECREATE");
133
134   
135   
136   
137   InitContainer(diagFile);
138   Init();
139
140
141   reader->Reset();
142   
143   AliFMDRawReader* fmdReader  = new AliFMDRawReader(reader,0);
144   TClonesArray*    digitArray = new TClonesArray("AliFMDDigit",0);
145     
146   //reader->NextEvent(); // Read Start-of-Run event
147   // reader->NextEvent(); // Read Start-of-Files event
148   
149   // reader->NextEvent(); // Start-of-Data
150   
151   
152   int lastProgress = 0;
153   
154   for(Int_t n =1;n <= GetRequiredEvents(); n++) {
155     if(!reader->NextEvent()) continue;
156     
157     UInt_t eventType = reader->GetType();
158     if(eventType == AliRawEventHeaderBase::kStartOfData || 
159        eventType == AliRawEventHeaderBase::kFormatError) { 
160       
161       WriteConditionsData(fmdReader);
162       
163     }
164     if(eventType != AliRawEventHeaderBase::kPhysicsEvent)  {
165       n--; 
166       continue; 
167     }
168     
169     SetCurrentEvent(n);
170     digitArray->Clear();
171     fmdReader->ReadAdcs(digitArray);
172     //std::cout<<"in event "<<*(reader->GetEventId())<<"   "<<n<<std::endl;
173     //AliDebug(5, Form("In event # %d with %d entries", 
174     //               *(reader->GetEventId()), digitArray->GetEntriesFast()));
175     
176     for(Int_t i = 0; i<digitArray->GetEntriesFast();i++) {
177       AliFMDDigit* digit = static_cast<AliFMDDigit*>(digitArray->At(i));
178       FillChannels(digit);
179     }
180     
181     FinishEvent();
182     int progress = int((n *100)/ GetRequiredEvents()) ;
183     if (progress <= lastProgress) continue;
184     lastProgress = progress;
185     std::cout << "Progress: " << lastProgress << " / 100 " << std::endl;
186   }
187
188   AliInfo(Form("Looped over %d events",GetCurrentEvent()));
189   WriteHeaderToFile();
190   
191   for(UShort_t det=1;det<=3;det++) {
192     std::cout << "FMD" << det << std::endl;
193     UShort_t FirstRing = (det == 1 ? 1 : 0);
194     for (UShort_t ir = FirstRing; ir < 2; ir++) {
195       Char_t   ring = (ir == 0 ? 'O' : 'I');
196       UShort_t nsec = (ir == 0 ? 40  : 20);
197       UShort_t nstr = (ir == 0 ? 256 : 512);
198       std::cout << " Ring " << ring << ": " << std::flush;
199       for(UShort_t sec =0; sec < nsec;  sec++)  {
200         for(UShort_t strip = 0; strip < nstr; strip++) {
201           Analyse(det,ring,sec,strip);
202         }
203         std::cout << '.' << std::flush;
204       }
205       if(fSaveHistograms)
206         diagFile->Flush();
207       std::cout << "done" << std::endl;
208     }
209   }
210
211   if(fOutputFile.is_open()) {
212     fOutputFile.write("# EOF\n",6);
213     fOutputFile.close();
214   }
215   
216   if(fSaveHistograms ) {
217     
218     Terminate(diagFile);
219   
220     AliInfo("Closing diagnostics file - please wait ...");
221     // diagFile->Write();
222     diagFile->Close();
223     AliInfo("done");
224   }
225 }
226 //_____________________________________________________________________
227
228 void AliFMDBaseDA::InitContainer(TDirectory* diagFile)
229 {
230   TObjArray* detArray;
231   TObjArray* ringArray;
232   TObjArray* sectorArray;
233     
234   TDirectory* savDir   = gDirectory;
235
236   for(UShort_t det=1;det<=3;det++) {
237     detArray = new TObjArray();
238     detArray->SetOwner();
239     fDetectorArray.AddAtAndExpand(detArray,det);
240
241     TDirectory* detDir = 0;
242     if (diagFile) {
243       diagFile->cd();
244       detDir = diagFile->mkdir(GetDetectorPath(det, kFALSE));
245     }
246
247     UShort_t FirstRing = (det == 1 ? 1 : 0);
248     for (UShort_t ir = FirstRing; ir < 2; ir++) {
249       Char_t   ring = (ir == 0 ? 'O' : 'I');
250       UShort_t nsec = (ir == 0 ? 40  : 20);
251       UShort_t nstr = (ir == 0 ? 256 : 512);
252       ringArray = new TObjArray();
253       ringArray->SetOwner();
254       detArray->AddAtAndExpand(ringArray,ir);
255
256
257       TDirectory* ringDir = 0;
258       if (detDir) { 
259         detDir->cd();
260         ringDir = detDir->mkdir(GetRingPath(det,ring, kFALSE));
261       }
262       
263
264       for(UShort_t sec =0; sec < nsec;  sec++)  {
265         sectorArray = new TObjArray();
266         sectorArray->SetOwner();
267         ringArray->AddAtAndExpand(sectorArray,sec);
268
269
270         TDirectory* secDir = 0;
271         if (ringDir) { 
272           ringDir->cd();
273           secDir = ringDir->mkdir(GetSectorPath(det, ring, sec, kFALSE));
274         }
275         
276         for(UShort_t strip = 0; strip < nstr; strip++) {
277           if (secDir) { 
278             secDir->cd();
279             secDir->mkdir(GetStripPath(det, ring, sec, strip, kFALSE));
280           }
281           AddChannelContainer(sectorArray, det, ring, sec, strip);
282         }
283       }
284     }
285   }
286   savDir->cd();
287 }
288
289 //_____________________________________________________________________ 
290 void AliFMDBaseDA::WriteConditionsData(AliFMDRawReader* fmdReader) 
291 {
292   AliFMDParameters* pars       = AliFMDParameters::Instance();
293   fConditionsFile.write(Form("# %s \n",pars->GetConditionsShuttleID()),14);
294   
295   AliFMDCalibSampleRate* sampleRate = new AliFMDCalibSampleRate();
296   AliFMDCalibStripRange* stripRange = new AliFMDCalibStripRange();
297   
298   fmdReader->ReadSODevent(sampleRate,stripRange,fPulseSize,fPulseLength);
299   
300   // Sample Rate
301   /*
302     UShort_t defSampleRate = 4;
303     UShort_t sampleRateFromSOD;
304     
305   AliFMDCalibSampleRate* sampleRate = new AliFMDCalibSampleRate();
306
307   UShort_t firstStrip = 0;
308   UShort_t lastStrip  = 127;
309   UShort_t firstStripSOD;
310   UShort_t lastStripSOD;
311   AliFMDCalibStripRange* stripRange = new AliFMDCalibStripRange();
312   
313   for(Int_t det=1;det<=3;det++) {
314     UShort_t FirstRing = (det == 1 ? 1 : 0);
315     for (UShort_t ir = FirstRing; ir < 2; ir++) {
316       Char_t   ring = (ir == 0 ? 'O' : 'I');
317       UShort_t nsec = (ir == 0 ? 40  : 20);
318       for(UShort_t sec =0; sec < nsec;  sec++)  {
319         sampleRateFromSOD = defSampleRate;
320         sampleRate->Set(det,ring,sec,0,sampleRateFromSOD);
321         firstStripSOD = firstStrip;
322         lastStripSOD  = lastStrip;
323         stripRange->Set(det,ring,sec,0,firstStripSOD,lastStripSOD);
324         
325       }
326     }
327   }
328   */
329   sampleRate->WriteToFile(fConditionsFile);
330   stripRange->WriteToFile(fConditionsFile);
331   //pars->SetSampleRate(sampleRate);
332   //pars->SetStripRange(stripRange);
333
334  
335   // Zero Suppresion
336   
337   // Strip Range
338   
339  
340   
341   
342   
343   // Gain Relevant stuff
344   /*
345   UShort_t defPulseSize = 32 ; 
346   UShort_t defPulseLength = 100 ; 
347   UShort_t pulseSizeFromSOD;
348   UShort_t pulseLengthFromSOD;  
349   
350   fPulseSize.Reset(defPulseSize);
351   fPulseLength.Reset(defPulseLength);
352   
353   for(UShort_t det=1;det<=3;det++)
354     for(UShort_t iring=0;iring<=1;iring++)
355       for(UShort_t board=0;board<=1;board++) {
356         pulseSizeFromSOD = defPulseSize;
357         pulseLengthFromSOD = defPulseLength;
358
359         fPulseSize.AddAt(pulseSizeFromSOD,GetHalfringIndex(det,iring,board));
360         fPulseLength.AddAt(pulseLengthFromSOD,GetHalfringIndex(det,iring,board));
361       }
362           
363   
364   //  fConditionsFile     << defSampleRate   << ',' 
365   //                  << timebins     <<"\n";
366   */
367   if(fConditionsFile.is_open()) {
368     
369     fConditionsFile.write("# EOF\n",6);
370     fConditionsFile.close();
371     
372   }
373   
374 }
375 //_____________________________________________________________________ 
376 Int_t AliFMDBaseDA::GetHalfringIndex(UShort_t det, Char_t ring, UShort_t board) {
377
378   UShort_t iring  =  (ring == 'I' ? 1 : 0);
379   
380   Int_t index = (((det-1) << 2) | (iring << 1) | (board << 0));
381   
382   return index;
383   
384 }
385
386
387 //_____________________________________________________________________ 
388 //
389 // EOF
390 //