use the new AliCaloRawStreamV3 decoder (from Yuri), based on the new AliAltroRawStrea...
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALCalibHistoProducer.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, 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 /* $Id$ */
17 /* History of cvs commits:
18  *
19  * $Log$
20  * Revision 1.1  2006/12/07 16:32:16  gustavo
21  * First shuttle code, online calibration histograms producer, EMCAL preprocessor
22  * 
23  *
24 */
25 ///////////////////////////////////////////////////////////////////////////////
26 // Class AliEMCALCalibHistoProducer accumulating histograms
27 // with amplitudes per EMCAL channel
28 // It is intended to run at DAQ computers (LDC, GDC, HLT or MOOD)
29 // and it fills the histograms with amplitudes per channel.
30 // Usage example see in EMCAL/macros/Shuttle/AliEMCALCalibHistoProducer.C
31 //
32 // Author: Boris Polichtchouk, 4 October 2006
33 // Adapted for EMCAL by Gustavo Conesa Balbastre, October 2006
34 ///////////////////////////////////////////////////////////////////////////////
35
36 #include "TH1.h"
37 #include "TFile.h"
38 #include "TProfile.h"
39
40
41 #include "AliLog.h"
42 #include "AliRawReader.h"
43 #include "AliCaloRawStreamV3.h"
44 #include "AliEMCALCalibHistoProducer.h"
45
46 ClassImp(AliEMCALCalibHistoProducer)
47
48 //-----------------------------------------------------------------------------
49 AliEMCALCalibHistoProducer::AliEMCALCalibHistoProducer(AliRawReader* rawReader) : 
50   TObject(),fRawReader(rawReader),fHistoFile(0),fHistoFileName("calibEmcHisto.root"),
51   fUpdatingRate(100), fNSuperModules(12),  fNCellsEta (48),   
52   fNCellsPhi(24),  fNCellsPhiHalfSM(12)
53 {
54   // Constructor
55
56   for(Int_t ism=0; ism<fNSuperModules; ism++) {
57     fAmpProf[ism] = 0;
58     fSMInstalled[ism]=kTRUE;
59     for(Int_t icol=0; icol<fNCellsEta; icol++) 
60       for(Int_t irow=0; irow<fNCellsPhi; irow++) 
61           fAmpHisto[ism][icol][irow]=0;
62   }
63
64 }
65 //-----------------------------------------------------------------------------
66 AliEMCALCalibHistoProducer::AliEMCALCalibHistoProducer() : 
67   fRawReader(0x0),fHistoFile(0),fHistoFileName(""),
68   fUpdatingRate(0), fNSuperModules(12),  fNCellsEta (48),   
69   fNCellsPhi(24),  fNCellsPhiHalfSM(12)
70 {
71   // default Constructor
72
73   for(Int_t ism=0; ism<fNSuperModules; ism++) {
74     fAmpProf[ism] = 0;
75     fSMInstalled[ism]=kTRUE;
76     for(Int_t icol=0; icol<fNCellsEta; icol++) 
77       for(Int_t irow=0; irow<fNCellsPhi; irow++) 
78           fAmpHisto[ism][icol][irow]=0;
79   }
80
81 }
82
83 //-----------------------------------------------------------------------------
84 AliEMCALCalibHistoProducer::AliEMCALCalibHistoProducer(const AliEMCALCalibHistoProducer & copy) :
85   TObject(copy),fRawReader((AliRawReader*)copy. fRawReader->Clone()),
86   fHistoFile((TFile*)copy.fHistoFile->Clone()),fHistoFileName(copy.fHistoFileName),
87   fUpdatingRate(copy.fUpdatingRate),
88   fNSuperModules(copy.fNSuperModules), fNCellsEta (copy.fNCellsEta), 
89   fNCellsPhi(copy.fNCellsPhi), fNCellsPhiHalfSM(copy.fNCellsPhiHalfSM)
90 {
91   //copy constructor
92
93  for(Int_t ism=0; ism<fNSuperModules; ism++) {
94     fAmpProf[ism] = copy. fAmpProf[ism];
95     fSMInstalled[ism]= copy.fSMInstalled[ism];
96     for(Int_t icol=0; icol<fNCellsEta; icol++) 
97       for(Int_t irow=0; irow<fNCellsPhi; irow++) 
98           fAmpHisto[ism][icol][irow]= copy.fAmpHisto[ism][icol][irow];
99   }
100
101 }
102
103 //-----------------------------------------------------------------------------
104 AliEMCALCalibHistoProducer::~AliEMCALCalibHistoProducer()
105 {
106   // Destructor
107   if(fHistoFile) {
108     fHistoFile->Close();
109     delete fHistoFile;
110   }
111 }
112
113 //------------------------------------------------------------------------------
114 //
115 AliEMCALCalibHistoProducer& AliEMCALCalibHistoProducer::operator=(const AliEMCALCalibHistoProducer& copy)
116 {
117         //
118         // Assignment operator.
119         // Besides copying all parameters, duplicates all collections.  
120         //
121                 if (&copy == this) return *this;
122         TObject::operator=(copy);
123         fHistoFileName = copy.fHistoFileName;
124         fUpdatingRate = copy.fUpdatingRate;
125         fNSuperModules = copy.fNSuperModules;
126         fNCellsEta = copy.fNCellsEta;
127         fNCellsPhi = copy.fNCellsPhi;
128         fNCellsPhiHalfSM = copy.fNCellsPhiHalfSM;
129         
130         fRawReader  = (AliRawReader*)copy. fRawReader->Clone();
131         fHistoFile      = (TFile*)copy.fHistoFile->Clone();
132
133         for(Int_t ism=0; ism<fNSuperModules; ism++) {
134           fAmpProf[ism] = copy. fAmpProf[ism];
135           fSMInstalled[ism]= copy.fSMInstalled[ism];
136           for(Int_t icol=0; icol<fNCellsEta; icol++) 
137             for(Int_t irow=0; irow<fNCellsPhi; irow++) 
138               fAmpHisto[ism][icol][irow]= copy.fAmpHisto[ism][icol][irow];
139         }
140
141         return (*this);
142 }
143 //-----------------------------------------------------------------------------
144 void AliEMCALCalibHistoProducer::Init()
145 {
146   // initializes input data stream supplied by rawReader
147   // Checks existence of histograms which might have been left
148   // from the previous runs to continue their filling
149   fHistoFile =  new TFile(fHistoFileName,"update");
150   char hname[128];
151   Int_t nRow =  fNCellsPhi ;
152
153   for(Int_t supermodule=0; supermodule<fNSuperModules; supermodule++) {
154     //Check installed supermodules
155     if(fSMInstalled[supermodule]==kFALSE) continue;
156     //Check created profiles
157     sprintf(hname,"mod%d",supermodule);
158     TProfile* prof = (TProfile*)fHistoFile->Get(hname);
159     if(prof)
160       fAmpProf[supermodule]=prof;
161     
162     //Check created histograms
163     if(supermodule > 10) nRow = fNCellsPhiHalfSM ; //Supermodules 11 and 12 are half supermodules
164     for(Int_t column=0; column<fNCellsEta; column++) {
165       for(Int_t row=0; row<nRow; row++) {
166         sprintf(hname,"mod%dcol%drow%d",supermodule,column,row);
167         TH1F* hist = (TH1F*)fHistoFile->Get(hname);
168         if(hist) 
169           fAmpHisto[supermodule][column][row]=hist;
170       }
171     }
172   }
173   
174 }
175 //-----------------------------------------------------------------------------
176 void AliEMCALCalibHistoProducer::Run()
177 {
178   // Reads raw data stream and fills amplitude histograms
179   // The histograms are written to file every fUpdatingRate events
180   //Also fills profiles to study the stability of supermodules during runs.
181
182   Init();
183   
184 //   TH1F* gHighGain = 0;
185 //   TH1F* gLowGain = 0;
186   char hname[128];
187   Int_t iEvent = 0;
188   Int_t runNum = 0;
189   Int_t nProfFreq = 1000; //Number of events with which a bin of the TProfile if filled
190   Int_t nEvtBins = 1000; //Total number of the profile survey bins.
191
192   AliCaloRawStreamV3 in(fRawReader,"EMCAL");
193
194   // Read raw data event by event
195
196   while (fRawReader->NextEvent()) {
197     runNum = fRawReader->GetRunNumber();
198
199     while (in.NextDDL()) {
200       while (in.NextChannel()) {
201
202         if(fSMInstalled[in.GetModule()]==kFALSE) continue;
203
204         // indices
205         Int_t mod = in.GetModule();
206         Int_t col = in.GetColumn();
207         Int_t row = in.GetRow();
208         Int_t evtbin = iEvent/nProfFreq;
209         Bool_t HighGainFlag = in.IsHighGain();
210         
211         //Check if histogram/profile already exist, if not create it.
212         if(!fAmpHisto[mod][col][row]) {
213           sprintf(hname,"mod%dcol%drow%d",mod,col,row);
214           fAmpHisto[mod][col][row] = new TH1F(hname,hname,1024,-0.5,1023.);
215         }
216         if(!fAmpProf[mod]) {
217           sprintf(hname,"mod%d",mod);
218           fAmpProf[mod] = new TProfile(hname,hname,nEvtBins,0.,nEvtBins);
219         }
220         
221         // loop over samples
222         Int_t maxSample = 0;
223         while (in.NextBunch()) {
224           const UShort_t *sig = in.GetSignals();
225           for (Int_t i = 0; i < in.GetBunchLength(); i++) {
226             if (sig[i] > maxSample) maxSample = sig[i];
227           }
228         } // bunches
229         
230         //Fill histogram/profile 
231         if(HighGainFlag) {
232           fAmpHisto[mod][col][row]->Fill(maxSample);
233           fAmpProf[mod]->Fill(evtbin, maxSample);
234         }
235       } // channels
236     } // DDL's
237
238     // update histograms in local file every 100th event
239     if(iEvent%fUpdatingRate == 0) {
240       AliInfo(Form("Updating histo file, event %d, run %d\n",iEvent,runNum));
241       UpdateHistoFile();
242     } 
243     iEvent++;
244   }
245
246   UpdateHistoFile(); 
247   AliInfo(Form("%d events of run %d processed.",iEvent,runNum));
248 }
249
250 //-----------------------------------------------------------------------------
251 void AliEMCALCalibHistoProducer::UpdateHistoFile()
252 {
253   // Write histograms to file
254
255   if(!fHistoFile) return;
256   if(!fHistoFile->IsOpen()) return;
257
258   TH1F* hist=0;
259   TProfile* prof =0;
260  
261   Int_t nRow =  fNCellsPhi ;
262   for(Int_t supermodule=0; supermodule<fNSuperModules; supermodule++) {
263     
264     prof = fAmpProf[supermodule]; 
265     if(prof) prof->Write(prof->GetName(),TObject::kWriteDelete);
266     
267     if(supermodule > 10)  nRow = fNCellsPhiHalfSM ; //Supermodules 11 and 12 are half supermodules
268     for(Int_t column=0; column<fNCellsEta; column++) {
269       for(Int_t row=0; row<nRow; row++) {
270         hist = fAmpHisto[supermodule][column][row]; 
271         if(hist) hist->Write(hist->GetName(),TObject::kWriteDelete);
272       }
273     }
274   }
275   
276 }