CPV DA updates (S.Evdokimov)
[u/mrichter/AliRoot.git] / PHOS / PHOSbase / AliPHOSCpvPedProducer.cxx
CommitLineData
0916ba78 1#include "AliPHOSCpvPedProducer.h"
2#include "AliPHOSCpvParam.h"
3#include "AliPHOSCpvRawStream.h"
4#include <fstream>
5#include <iostream>
6#include <TTree.h>
7#include <TF1.h>
8#include <TFitResult.h>
9#include <TFitResultPtr.h>
10#include <TSystem.h>
11#include <TTimeStamp.h>
12
13#include "TFile.h"
14
15using namespace std;
16
17using std::ifstream;
18using std::ofstream;
19ClassImp(AliPHOSCpvPedProducer) ;
20
21//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
22AliPHOSCpvPedProducer::AliPHOSCpvPedProducer(Int_t sigcut):
23 TObject(),
24 fSigCut(sigcut),
25 fTurbo(kTRUE),
26 fhErrors(0),
27 fRawStream(0)
28{
29 //
30 //constructor
31 //
bdffcb75 32 for(Int_t iDDL=0; iDDL<2*AliPHOSCpvParam::kNDDL; iDDL++) {//iDDL
33 fPedMeanMap[iDDL]=0;
34 fPedSigMap [iDDL]=0;
35 f1DPedMean [iDDL]=0;
36 f1DPedSigma[iDDL]=0;
37 for(Int_t iX=0; iX<AliPHOSCpvParam::kPadPcX; iX++)
38 for(Int_t iY=1; iY<AliPHOSCpvParam::kPadPcY; iY++)
39 fPadAdc[iDDL][iX][iY]=0;
40 }//iDDL
41
0916ba78 42 CreateErrHist();
43} //constructor
44//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
45AliPHOSCpvPedProducer::~AliPHOSCpvPedProducer()
46{
47 //
48 //destructor
49 //
bdffcb75 50 for(Int_t iDDL=0; iDDL<2*AliPHOSCpvParam::kNDDL; iDDL++) {//iDDL
0916ba78 51 delete fPedMeanMap[iDDL];
52 delete fPedSigMap [iDDL];
53 delete f1DPedMean [iDDL];
54 delete f1DPedSigma[iDDL];
55 for(Int_t iX=0; iX<AliPHOSCpvParam::kPadPcX; iX++)
56 for(Int_t iY=1; iY<AliPHOSCpvParam::kPadPcY; iY++)
57 delete fPadAdc[iDDL][iX][iY];
58 }//iDDL
59
60 //delete fhErrors;
61} //destructor
62//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
63void AliPHOSCpvPedProducer::SetTurbo(Bool_t turbo)
64{
65 fTurbo = turbo;
66 if(fRawStream) fRawStream->SetTurbo(fTurbo);
67}
68//--------------------------------------------------------------------------------------
69Bool_t AliPHOSCpvPedProducer::LoadNewEvent(AliRawReader *& rawReader)
70{
71 if(fRawStream) delete fRawStream;
72 fRawStream = new AliPHOSCpvRawStream(rawReader);
73 if(fRawStream) {
74 fRawStream->SetTurbo(fTurbo);
75 return kTRUE;
76 }
77 fhErrors->Fill(0);
78 return kFALSE;
79}
80//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81Bool_t AliPHOSCpvPedProducer::FillPedestal(Int_t abspad,Float_t q)
82{
83 //
84 //Called from the CpvdaFillPedestal() and fills the pedestal values
85 //Arguments: absolute pad number as from AliPHOSCpvParam and q-charge
86 //
87 if(q<0) {
88 AliError("Negative charge is read!!!!!!");
89 return kFALSE;
90 }
91 if(AliPHOSCpvParam::IsValidAbs(abspad) && q>0) {
92 Int_t iDDL=AliPHOSCpvParam::A2DDL(abspad),
93 iX=AliPHOSCpvParam::A2X(abspad),
94 iY=AliPHOSCpvParam::A2Y(abspad);
bdffcb75 95 if(!fPadAdc [iDDL][iX][iY]) CreateDDLHistos(iDDL);
0916ba78 96 fPadAdc [iDDL][iX][iY] -> Fill(q);
97 return kTRUE;
98 }
99 return kFALSE;
100}//FillPedestal(int,float)
101//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
102Bool_t AliPHOSCpvPedProducer::FillPedestal()
103{
104 //
105 //Called from the Cpvda
106 //
107 while(fRawStream->Next()){
108 for(Int_t iPad=0;iPad<fRawStream->GetNPads();iPad++) {
109 Int_t charge = fRawStream->GetChargeArray()[iPad];
110 Int_t aPad = fRawStream -> GetPadArray()[iPad];
111 if(charge){
112 if(!AliPHOSCpvParam::IsValidAbs(aPad)) continue;
113 if(!FillPedestal(aPad, (Float_t)charge)) return kFALSE;
114 }
115 }
116 }
117 return kTRUE;
118}//FillPedestal(TClonesArray*)
119//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
120Bool_t AliPHOSCpvPedProducer::CalcPedestal(Int_t iDDL)
121{
122 //
123 //Calculate pedestal for each pad
124 //Arguments: nDDL-DDL number, nEv - number of the read events
125 //Retutns: kTRUE/kFALSE
126 //
127 //cout<<"Now we are going to calculate pedestals"<<endl;
128
129 if(fPedMeanMap[iDDL]){
130 for(Int_t iX=0; iX<AliPHOSCpvParam::kPadPcX; iX++) {
131 for(Int_t iY=0; iY<AliPHOSCpvParam::kPadPcY; iY++) {
132 //cout<<"Ped["<<iX<<"]["<<iY<<"] = " << fPadAdc[iDDL][iX][iY]->GetMean()<<endl;
133 fPedMeanMap[iDDL] -> Fill(iX, iY, fPadAdc[iDDL][iX][iY]->GetMean());
134 fPedSigMap [iDDL] -> Fill(iX, iY, fPadAdc[iDDL][iX][iY]->GetRMS ());
135 f1DPedMean [iDDL] -> Fill(fPadAdc[iDDL][iX][iY]->GetMean());
136 f1DPedSigma[iDDL] -> Fill(fPadAdc[iDDL][iX][iY]->GetRMS ());
137 }
138
139 }
140 return kTRUE;
141 }
142 else return kFALSE;
143}//CaclPedestal()
144//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
145void AliPHOSCpvPedProducer::WriteAllHistsToFile(const char * name) const
146{
147 TFile * rootF = TFile::Open(name,"RECREATE");
148 printf("Root file created \n");
149 //rootF->cd();
bdffcb75 150 for(Int_t iDDL=0; iDDL<2*AliPHOSCpvParam::kNDDL; iDDL++) {
0916ba78 151 // for(Int_t iX=0; iX<AliPHOSCpvParam::kPadPcX; iX++) {
152 // for(Int_t iY=0; iY<AliPHOSCpvParam::kPadPcY; iY++) {
153 // //fPadAdc[iDDL][iX][iY]->Write();
154 // }
155 // }
156 //Printf("iDDL = %d\n", iDDL);
157 if ( fPedMeanMap[iDDL])
158 rootF->WriteObject(fPedMeanMap[iDDL], Form("PedMeanMap%d",iDDL));
159 if ( fPedSigMap[iDDL])
160 rootF->WriteObject(fPedSigMap [iDDL], Form("fPedSigMap%d",iDDL));
161 if ( f1DPedMean[iDDL])
162 rootF->WriteObject(f1DPedMean [iDDL], Form("f1DPedMean%d",iDDL));
163 if ( f1DPedSigma[iDDL])
164 rootF->WriteObject(f1DPedSigma[iDDL], Form("f1DPedSig%d",iDDL));
165 //printf("Write here something \n");
166 }
167 //if(fhErrors) fhErrors -> Write();
168
bdffcb75 169 for(Int_t iDDL=0; iDDL<2*AliPHOSCpvParam::kNDDL; iDDL++)
0916ba78 170 for(Int_t iX=0; iX<AliPHOSCpvParam::kPadPcX; iX++)
171 for(Int_t iY=0; iY<AliPHOSCpvParam::kPadPcY; iY++);
172 //fPadAdc[iDDL][iX][iY]->Write();
173
174 rootF->Close();
175} //WriteAllHistsToFile()
176//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
177void AliPHOSCpvPedProducer::WritePedFiles(Int_t iDDL) const
178{
179 //
180 // Write pedestal files to load them to RCB card
181 // One file per each column controler
182 //
183
184 // accordance to RCB format, pedestals must be written in blocks of 64 lines (not AliPHOSCpvParam::kNPadAdd!)
185 Int_t block = 64;
186
187 //cout<<"pedestal files now will be created!"<< endl;
188
189 if(!fPedMeanMap[iDDL]) {
190 Printf("No pedestals found for DDL %d !\n");
191 return;
192 }
193
194 for(Int_t iCC=0; iCC<AliPHOSCpvParam::kNRows; iCC++) {
195 FILE * pedFile;
196 FILE* pedFileForRCB;
197 pedFile = fopen(Form("thr%d_%02d.dat",iDDL,iCC),"w");
198 if(!pedFile) {
199 Printf("AliPHOSCpvPedProducer::WritePedFiles: Error, file thr%d_%02d.dat could not be open",iDDL,iCC);
200 }
201 // create and initialize arrays for ped and sigmas
202 Int_t ped[AliPHOSCpvParam::kN3GAdd][block],
203 sig[AliPHOSCpvParam::kN3GAdd][block];
204 for(Int_t i3g=0; i3g<AliPHOSCpvParam::kN3GAdd; i3g++) {
205 for(Int_t iPad=0; iPad<block; iPad++) {
206 ped[i3g][iPad] = fMaxThr;
207 sig[i3g][iPad] = 0;
208 }
209 }
210 Int_t iXmin, iXmax;
211 AliPHOSCpvParam::GetLimOfCConX(iCC,iXmin,iXmax);
212 //cout<<iXmin<<iXmax<<endl;
213 for(Int_t iY=0; iY<AliPHOSCpvParam::kPadPcY; iY++) {
214 Int_t g3 = AliPHOSCpvParam::Y23G(iY);
215 for(Int_t iX=iXmin; iX<=iXmax; iX++) {
216 Int_t pad = AliPHOSCpvParam::XY2Pad(iX,iY);
217 ped[g3][pad] = (Int_t) fPadAdc[iDDL][iX][iY]->GetMean();
218 sig[g3][pad] = (Int_t) fPadAdc[iDDL][iX][iY]->GetRMS ();
219 //cout<< "ped is " << fPadAdc[iDDL][iX][iY]->GetMean()<<endl;
220 }
221 }
222
223 // write arrays to file
224 for(Int_t i3g=0; i3g<AliPHOSCpvParam::kN3GAdd; i3g++) {
225 for(Int_t pad=0; pad<block; pad++) {
226 // first 10 bit for pedestal
227 // last 9 bit for fSigCut*sigma
228 Int_t write,writeRCB;
229 if ((ped[i3g][pad] + fSigCut*sig[i3g][pad]) > fMaxThr)
230 write = (fMaxThr<<9) + 0;
231 else
232 write = ((ped[i3g][pad]+fSigCut * sig[i3g][pad])<<9) + fSigCut * sig[i3g][pad];
233
234 fprintf(pedFile, "0x%05x\n", write);
235 }
236 }
237 fclose(pedFile);
238 } // iCC
239} // WritePedFiles(iDDL)
240//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
241void AliPHOSCpvPedProducer::CreateErrHist()
242{
243 Int_t nErrors = AliPHOSCpvRawStream::GetNErrors();
244 const char * errNames[nErrors];
245 for(Int_t i=0; i<nErrors; i++) {
246 errNames[i] = AliPHOSCpvRawStream::GetErrName(i);
247 }
248 fhErrors = new TH1I("errorTypes","Errors occured during processing",nErrors+1,0,nErrors+1);
249 TAxis* x = fhErrors->GetXaxis();
250 x->SetBinLabel(1, "Can't get event");
251 for(Int_t i=0; i<nErrors; i++) {
252 x->SetBinLabel(i+2,errNames[i]);
253 }
254}
255//--------------------------------------------------------------------------------------
256void AliPHOSCpvPedProducer::CreateDDLHistos(Int_t iDDL)
257{
258 // creating histograms
259 fPedMeanMap[iDDL] = new TH2F(Form("hPedMeanMap%d",iDDL),"2D mean pedestal map" ,AliPHOSCpvParam::kPadPcX,0.,AliPHOSCpvParam::kPadPcX,AliPHOSCpvParam::kPadPcY,0.,AliPHOSCpvParam::kPadPcY);
260 fPedSigMap [iDDL] = new TH2F(Form("hPedSigMap%d" ,iDDL),"2D pedestal sigma map",AliPHOSCpvParam::kPadPcX,0.,AliPHOSCpvParam::kPadPcX,AliPHOSCpvParam::kPadPcY,0.,AliPHOSCpvParam::kPadPcY);
261 f1DPedMean [iDDL] = new TH1F(Form("h1DPedMean%d" ,iDDL),"1D mean pedestal map" ,5000,0,5000);
262 f1DPedSigma[iDDL] = new TH1F(Form("h1DPedSigma%d",iDDL),"1D pedestal sigma map",100 ,0,100 );
263
264 // initialization of arrays
265 int adr;
266 for(Int_t iX=0; iX<AliPHOSCpvParam::kPadPcX; iX++) {
267 for(Int_t iY=0; iY<AliPHOSCpvParam::kPadPcY; iY++) {
268 adr = AliPHOSCpvParam::XY2A(iDDL,iX,iY);
269 fPadAdc[iDDL][iX][iY] = new TH1F(Form("hPad%d_%d_%d",iDDL,iX,iY),Form("Amplitudes CC=%d, 3Gass=%d, pad=%d",AliPHOSCpvParam::A2CC(adr),AliPHOSCpvParam::A23G(adr),AliPHOSCpvParam::A2Pad(adr)),5000,0,5000);
270 }//iY
271 }//iX
272
273}