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