1 /**************************************************************************
2 * Copyright(c) 2004, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
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.
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.
29 #include "AliFMDBaseDA.h"
32 #include "AliFMDRawReader.h"
33 #include "AliFMDCalibSampleRate.h"
34 #include "AliFMDCalibStripRange.h"
36 #include "AliRawEventHeaderBase.h"
38 //_____________________________________________________________________
39 ClassImp(AliFMDBaseDA)
41 ; // Do not delete - to let Emacs for mat the code
44 //_____________________________________________________________________
46 AliFMDBaseDA::GetStripPath(UShort_t det,
52 return Form("%s%sFMD%d%c[%02d,%03d]",
53 (full ? GetSectorPath(det, ring, sec, full) : ""),
54 (full ? "/" : ""), det, ring, sec, str);
56 //_____________________________________________________________________
58 AliFMDBaseDA::GetSectorPath(UShort_t det,
63 return Form("%s%sFMD%d%c[%02d]",
64 (full ? GetRingPath(det, ring, full) : ""),
65 (full ? "/" : ""), det, ring, sec);
67 //_____________________________________________________________________
69 AliFMDBaseDA::GetRingPath(UShort_t det,
73 return Form("%s%sFMD%d%c",
74 (full ? GetDetectorPath(det, full) : ""),
75 (full ? "/" : ""), det, ring);
77 //_____________________________________________________________________
79 AliFMDBaseDA::GetDetectorPath(UShort_t det,
82 return Form("%s%sFMD%d",
83 (full ? fDiagnosticsFilename.Data() : ""),
84 (full ? ":/" : ""), det);
87 //_____________________________________________________________________
88 AliFMDBaseDA::AliFMDBaseDA() :
90 fDiagnosticsFilename("diagnosticsHistograms.root"),
93 fSaveHistograms(kFALSE),
100 fDetectorArray.SetOwner();
101 fConditionsFile.open("conditions.csv");
103 //_____________________________________________________________________
104 AliFMDBaseDA::AliFMDBaseDA(const AliFMDBaseDA & baseDA) :
106 fDiagnosticsFilename(baseDA.fDiagnosticsFilename.Data()),
109 fSaveHistograms(baseDA.fSaveHistograms),
110 fDetectorArray(baseDA.fDetectorArray),
111 fPulseSize(baseDA.fPulseSize),
112 fPulseLength(baseDA.fPulseLength),
113 fRequiredEvents(baseDA.fRequiredEvents),
114 fCurrentEvent(baseDA.fCurrentEvent)
116 fDetectorArray.SetOwner();
121 //_____________________________________________________________________
122 AliFMDBaseDA::~AliFMDBaseDA()
127 //_____________________________________________________________________
128 void AliFMDBaseDA::Run(AliRawReader* reader)
132 diagFile = TFile::Open(fDiagnosticsFilename.Data(),"RECREATE");
137 InitContainer(diagFile);
143 AliFMDRawReader* fmdReader = new AliFMDRawReader(reader,0);
144 TClonesArray* digitArray = new TClonesArray("AliFMDDigit",0);
147 reader->NextEvent(); // Read Start-of-Run event
148 reader->NextEvent(); // Read Start-of-Files event
150 reader->NextEvent(); // Start-of-Data
151 UInt_t eventType = reader->GetType();
152 Bool_t SOD_read = kFALSE;
153 if(eventType == AliRawEventHeaderBase::kStartOfData ||
154 eventType == AliRawEventHeaderBase::kFormatError) {
156 WriteConditionsData(fmdReader);
161 AliWarning("No SOD event detected!");
165 int lastProgress = 0;
167 for(Int_t n =1;n <= GetRequiredEvents(); n++) {
168 if(!reader->NextEvent()) continue;
172 fmdReader->ReadAdcs(digitArray);
173 //std::cout<<"in event "<<*(reader->GetEventId())<<" "<<n<<std::endl;
174 //AliDebug(5, Form("In event # %d with %d entries",
175 // *(reader->GetEventId()), digitArray->GetEntriesFast()));
177 for(Int_t i = 0; i<digitArray->GetEntriesFast();i++) {
178 AliFMDDigit* digit = static_cast<AliFMDDigit*>(digitArray->At(i));
183 int progress = int((n *100)/ GetRequiredEvents()) ;
184 if (progress <= lastProgress) continue;
185 lastProgress = progress;
186 std::cout << "Progress: " << lastProgress << " / 100 " << std::endl;
189 AliInfo(Form("Looped over %d events",GetCurrentEvent()));
192 for(UShort_t det=1;det<=3;det++) {
193 std::cout << "FMD" << det << std::endl;
194 UShort_t FirstRing = (det == 1 ? 1 : 0);
195 for (UShort_t ir = FirstRing; ir < 2; ir++) {
196 Char_t ring = (ir == 0 ? 'O' : 'I');
197 UShort_t nsec = (ir == 0 ? 40 : 20);
198 UShort_t nstr = (ir == 0 ? 256 : 512);
199 std::cout << " Ring " << ring << ": " << std::flush;
200 for(UShort_t sec =0; sec < nsec; sec++) {
201 for(UShort_t strip = 0; strip < nstr; strip++) {
202 Analyse(det,ring,sec,strip);
204 std::cout << '.' << std::flush;
208 std::cout << "done" << std::endl;
212 if(fOutputFile.is_open()) {
213 fOutputFile.write("# EOF\n",6);
217 if(fSaveHistograms ) {
221 AliInfo("Closing diagnostics file - please wait ...");
222 // diagFile->Write();
227 //_____________________________________________________________________
229 void AliFMDBaseDA::InitContainer(TDirectory* diagFile)
232 TObjArray* ringArray;
233 TObjArray* sectorArray;
235 TDirectory* savDir = gDirectory;
237 for(UShort_t det=1;det<=3;det++) {
238 detArray = new TObjArray();
239 detArray->SetOwner();
240 fDetectorArray.AddAtAndExpand(detArray,det);
242 TDirectory* detDir = 0;
245 detDir = diagFile->mkdir(GetDetectorPath(det, kFALSE));
248 UShort_t FirstRing = (det == 1 ? 1 : 0);
249 for (UShort_t ir = FirstRing; ir < 2; ir++) {
250 Char_t ring = (ir == 0 ? 'O' : 'I');
251 UShort_t nsec = (ir == 0 ? 40 : 20);
252 UShort_t nstr = (ir == 0 ? 256 : 512);
253 ringArray = new TObjArray();
254 ringArray->SetOwner();
255 detArray->AddAtAndExpand(ringArray,ir);
258 TDirectory* ringDir = 0;
261 ringDir = detDir->mkdir(GetRingPath(det,ring, kFALSE));
265 for(UShort_t sec =0; sec < nsec; sec++) {
266 sectorArray = new TObjArray();
267 sectorArray->SetOwner();
268 ringArray->AddAtAndExpand(sectorArray,sec);
271 TDirectory* secDir = 0;
274 secDir = ringDir->mkdir(GetSectorPath(det, ring, sec, kFALSE));
277 for(UShort_t strip = 0; strip < nstr; strip++) {
280 secDir->mkdir(GetStripPath(det, ring, sec, strip, kFALSE));
282 AddChannelContainer(sectorArray, det, ring, sec, strip);
290 //_____________________________________________________________________
291 void AliFMDBaseDA::WriteConditionsData(AliFMDRawReader* fmdReader)
293 AliFMDParameters* pars = AliFMDParameters::Instance();
294 fConditionsFile.write(Form("# %s \n",pars->GetConditionsShuttleID()),14);
296 AliFMDCalibSampleRate* sampleRate = new AliFMDCalibSampleRate();
297 AliFMDCalibStripRange* stripRange = new AliFMDCalibStripRange();
299 fmdReader->ReadSODevent(sampleRate,stripRange,fPulseSize,fPulseLength);
303 UShort_t defSampleRate = 4;
304 UShort_t sampleRateFromSOD;
306 AliFMDCalibSampleRate* sampleRate = new AliFMDCalibSampleRate();
308 UShort_t firstStrip = 0;
309 UShort_t lastStrip = 127;
310 UShort_t firstStripSOD;
311 UShort_t lastStripSOD;
312 AliFMDCalibStripRange* stripRange = new AliFMDCalibStripRange();
314 for(Int_t det=1;det<=3;det++) {
315 UShort_t FirstRing = (det == 1 ? 1 : 0);
316 for (UShort_t ir = FirstRing; ir < 2; ir++) {
317 Char_t ring = (ir == 0 ? 'O' : 'I');
318 UShort_t nsec = (ir == 0 ? 40 : 20);
319 for(UShort_t sec =0; sec < nsec; sec++) {
320 sampleRateFromSOD = defSampleRate;
321 sampleRate->Set(det,ring,sec,0,sampleRateFromSOD);
322 firstStripSOD = firstStrip;
323 lastStripSOD = lastStrip;
324 stripRange->Set(det,ring,sec,0,firstStripSOD,lastStripSOD);
330 sampleRate->WriteToFile(fConditionsFile);
331 stripRange->WriteToFile(fConditionsFile);
332 //pars->SetSampleRate(sampleRate);
333 //pars->SetStripRange(stripRange);
340 fConditionsFile.write("# Gain Events \n",15);
342 for(UShort_t det=1; det<=3;det++) {
343 UShort_t firstring = (det == 1 ? 1 : 0);
344 for(UShort_t iring = firstring; iring <=1;iring++) {
345 Char_t ring = (iring == 1 ? 'I' : 'O');
346 for(UShort_t board =0 ; board <=1; board++) {
348 Int_t idx = GetHalfringIndex(det,ring,board);
350 fConditionsFile << det << ','
353 << fPulseLength.At(idx) << "\n";
359 fConditionsFile.write("# Gain Pulse \n",14);
361 for(UShort_t det=1; det<=3;det++) {
362 UShort_t firstring = (det == 1 ? 1 : 0);
363 for(UShort_t iring = firstring; iring <=1;iring++) {
364 Char_t ring = (iring == 1 ? 'I' : 'O');
365 for(UShort_t board =0 ; board <=1; board++) {
367 Int_t idx = GetHalfringIndex(det,ring,board);
369 fConditionsFile << det << ','
372 << fPulseSize.At(idx) << "\n";
380 // Gain Relevant stuff
382 UShort_t defPulseSize = 32 ;
383 UShort_t defPulseLength = 100 ;
384 UShort_t pulseSizeFromSOD;
385 UShort_t pulseLengthFromSOD;
387 fPulseSize.Reset(defPulseSize);
388 fPulseLength.Reset(defPulseLength);
390 for(UShort_t det=1;det<=3;det++)
391 for(UShort_t iring=0;iring<=1;iring++)
392 for(UShort_t board=0;board<=1;board++) {
393 pulseSizeFromSOD = defPulseSize;
394 pulseLengthFromSOD = defPulseLength;
396 fPulseSize.AddAt(pulseSizeFromSOD,GetHalfringIndex(det,iring,board));
397 fPulseLength.AddAt(pulseLengthFromSOD,GetHalfringIndex(det,iring,board));
401 // fConditionsFile << defSampleRate << ','
402 // << timebins <<"\n";
404 if(fConditionsFile.is_open()) {
406 fConditionsFile.write("# EOF\n",6);
407 fConditionsFile.close();
412 //_____________________________________________________________________
413 Int_t AliFMDBaseDA::GetHalfringIndex(UShort_t det, Char_t ring, UShort_t board) {
415 UShort_t iring = (ring == 'I' ? 1 : 0);
417 Int_t index = (((det-1) << 2) | (iring << 1) | (board << 0));
424 //_____________________________________________________________________