First shuttle code, online calibration histograms producer, EMCAL preprocessor
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALCalibHistoProducer.cxx
CommitLineData
9e788b10 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 *
21*/
22///////////////////////////////////////////////////////////////////////////////
23// Class AliEMCALCalibHistoProducer accumulating histograms
24// with amplitudes per EMCAL channel
25// It is intended to run at DAQ computers (LDC, GDC, HLT or MOOD)
26// and it fills the histograms with amplitudes per channel.
27// Usage example see in EMCAL/macros/Shuttle/AliEMCALCalibHistoProducer.C
28//
29// Author: Boris Polichtchouk, 4 October 2006
30// Adapted for EMCAL by Gustavo Conesa Balbastre, October 2006
31///////////////////////////////////////////////////////////////////////////////
32
33#include "AliLog.h"
34#include "AliEMCALCalibHistoProducer.h"
35#include "TH1.h"
36#include "TFile.h"
37#include "TProfile.h"
38#include "AliRawReader.h"
39#include "AliCaloRawStream.h"
40
41ClassImp(AliEMCALCalibHistoProducer)
42
43//-----------------------------------------------------------------------------
44AliEMCALCalibHistoProducer::AliEMCALCalibHistoProducer(AliRawReader* rawReader) :
45 fRawReader(rawReader),fHistoFile(0),fHistoFileName("calibHisto.root"),
46 fUpdatingRate(100),fIsOldRCUFormat(kFALSE), fNSuperModules(12), fNCellsEta (48),
47 fNCellsPhi(24), fNCellsPhiHalfSM(12)
48{
49 // Constructor
50
51 for(Int_t ism=0; ism<fNSuperModules; ism++) {
52 fAmpProf[ism] = 0;
53 fSMInstalled[ism]=kTRUE;
54 for(Int_t icol=0; icol<fNCellsEta; icol++)
55 for(Int_t irow=0; irow<fNCellsPhi; irow++)
56 fAmpHisto[ism][icol][irow]=0;
57 }
58
59}
60
61//-----------------------------------------------------------------------------
62AliEMCALCalibHistoProducer::AliEMCALCalibHistoProducer() :
63 fRawReader(0),fHistoFile(0),fUpdatingRate(0),fIsOldRCUFormat(kFALSE),
64 fNSuperModules(12), fNCellsEta (48), fNCellsPhi(24), fNCellsPhiHalfSM(12)
65{
66 // Default constructor
67}
68
69//-----------------------------------------------------------------------------
70AliEMCALCalibHistoProducer::~AliEMCALCalibHistoProducer()
71{
72 // Destructor
73 if(fHistoFile) {
74 fHistoFile->Close();
75 delete fHistoFile;
76 }
77}
78//-----------------------------------------------------------------------------
79void AliEMCALCalibHistoProducer::Init()
80{
81 // initializes input data stream supplied by rawReader
82 // Checks existence of histograms which might have been left
83 // from the previous runs to continue their filling
84 fHistoFile = new TFile(fHistoFileName,"update");
85 char hname[128];
86 Int_t nRow = fNCellsPhi ;
87
88 for(Int_t supermodule=0; supermodule<fNSuperModules; supermodule++) {
89 //Check installed supermodules
90 if(fSMInstalled[supermodule]==kFALSE) continue;
91 //Check created profiles
92 sprintf(hname,"mod%d",supermodule);
93 TProfile* prof = (TProfile*)fHistoFile->Get(hname);
94 if(prof)
95 fAmpProf[supermodule]=prof;
96
97 //Check created histograms
98 if(supermodule > 10) nRow = fNCellsPhiHalfSM ; //Supermodules 11 and 12 are half supermodules
99 for(Int_t column=0; column<fNCellsEta; column++) {
100 for(Int_t row=0; row<nRow; row++) {
101 sprintf(hname,"mod%dcol%drow%d",supermodule,column,row);
102 TH1F* hist = (TH1F*)fHistoFile->Get(hname);
103 if(hist)
104 fAmpHisto[supermodule][column][row]=hist;
105 }
106 }
107 }
108
109}
110//-----------------------------------------------------------------------------
111void AliEMCALCalibHistoProducer::Run()
112{
113 // Reads raw data stream and fills amplitude histograms
114 // The histograms are written to file every fUpdatingRate events
115 //Also fills profiles to study the stability of supermodules during runs.
116
117 Init();
118
119// TH1F* gHighGain = 0;
120// TH1F* gLowGain = 0;
121 Int_t iBin = 0;
122 Int_t iEvent = 0;
123 Int_t runNum = 0;
124 Int_t nProfFreq = 1000; //Number of events with which a bin of the TProfile if filled
125 Int_t nEvtBins = 1000; //Total number of the profile survey bins.
126
127 AliCaloRawStream in(fRawReader,"EMCAL");
128 if(fIsOldRCUFormat)
129 in.SetOldRCUFormat(kTRUE);
130
131 // Read raw data event by event
132
133 while (fRawReader->NextEvent()) {
134 runNum = fRawReader->GetRunNumber();
135 Float_t energy = 0;
136 while ( in.Next() ) {
137
138 if(fSMInstalled[in.GetModule()]==kFALSE) continue;
139
140 if (in.GetSignal() > energy) {
141 energy = (Double_t) in.GetSignal();
142 }
143
144 iBin++;
145
146 if(iBin==in.GetTimeLength()) {
147 iBin=0;
148
149 Int_t mod = in.GetModule();
150 Int_t col = in.GetColumn();
151 Int_t row = in.GetRow();
152 Int_t evtbin = iEvent/nProfFreq;
153 char hname[128];
154
155 //Check if histogram/profile already exist, if not create it.
156 if(!fAmpHisto[mod][col][row]) {
157 sprintf(hname,"mod%dcol%drow%d",mod,col,row);
158 fAmpHisto[mod][col][row] = new TH1F(hname,hname,1024,-0.5,1023.);
159 }
160 if(!fAmpProf[mod]) {
161 sprintf(hname,"mod%d",mod);
162 fAmpProf[mod] = new TProfile(hname,hname,nEvtBins,0.,nEvtBins);
163 }
164 //Fill histogram/profile
165 Bool_t lowGainFlag = in.IsLowGain();
166 if(!lowGainFlag) {
167 fAmpHisto[mod][col][row]->Fill(energy);
168 fAmpProf[mod]->Fill(evtbin, energy);
169 }
170 }
171 }
172
173 // update histograms in local file every 100th event
174 if(iEvent%fUpdatingRate == 0) {
175 AliInfo(Form("Updating histo file, event %d, run %d\n",iEvent,runNum));
176 UpdateHistoFile();
177 }
178 iEvent++;
179 }
180
181 UpdateHistoFile();
182 AliInfo(Form("%d events of run %d processed.",iEvent,runNum));
183}
184
185//-----------------------------------------------------------------------------
186void AliEMCALCalibHistoProducer::UpdateHistoFile()
187{
188 // Write histograms to file
189
190 if(!fHistoFile) return;
191 if(!fHistoFile->IsOpen()) return;
192
193 TH1F* hist=0;
194 TProfile* prof =0;
195
196 Int_t nRow = fNCellsPhi ;
197 for(Int_t supermodule=0; supermodule<fNSuperModules; supermodule++) {
198
199 prof = fAmpProf[supermodule];
200 if(prof) prof->Write(prof->GetName(),TObject::kWriteDelete);
201
202 if(supermodule > 10) nRow = fNCellsPhiHalfSM ; //Supermodules 11 and 12 are half supermodules
203 for(Int_t column=0; column<fNCellsEta; column++) {
204 for(Int_t row=0; row<nRow; row++) {
205 hist = fAmpHisto[supermodule][column][row];
206 if(hist) hist->Write(hist->GetName(),TObject::kWriteDelete);
207 }
208 }
209 }
210
211}