]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AnalyzeSDDNoiseAllMod.C
1.The QA data created on demand according to the event species at filling time. 2...
[u/mrichter/AliRoot.git] / ITS / AnalyzeSDDNoiseAllMod.C
1 #if !defined(__CINT__) || defined(__MAKECINT__)
2 #include <TH2F.h>
3 #include <TCanvas.h>
4 #include <TStopwatch.h>
5 #include <TStyle.h>
6 #include <TGrid.h>
7 #include <TSystem.h>
8 #include <TLatex.h>
9 #include <TFile.h>
10 #include "AliRawReader.h"
11 #include "AliRawReaderDate.h"
12 #include "AliRawReaderRoot.h"
13 #include "AliITSOnlineSDDBase.h"
14 #include "AliITSOnlineSDDCMN.h"
15 #include "AliITSRawStreamSDD.h"
16 #include "TPaveStats.h"
17 #endif
18
19 // Macro for the analysis of PEDESTAL runs (equivalent to ITSSDDBASda.cxx)
20 // Two functions named AnalyzeSDDNoiseAllModules: 
21 // The first is for analyzing a local raw data file and takes as agrument the file name.
22 // The second is for running on ALIEN
23 // All DDLs are analyzed, the argument nDDL selects the DDL to be plotted
24 // Origin: F. Prino (prino@to.infn.it)
25
26 void AnalyzeSDDNoiseAllMod(Char_t *datafil, Int_t adcfreq=20, Int_t nDDL=0, Int_t firstEv=10, Int_t lastEv=12){
27
28   const Int_t kTotDDL=24;
29   const Int_t kModPerDDL=12;
30   const Int_t kSides=2;
31
32   AliITSOnlineSDDBase **base=new AliITSOnlineSDDBase*[kTotDDL*kModPerDDL*kSides];
33   TH2F **histo=new TH2F*[kTotDDL*kModPerDDL*kSides];
34
35   Char_t hisnam[20];
36   for(Int_t iddl=0; iddl<kTotDDL;iddl++){
37     for(Int_t imod=0; imod<kModPerDDL;imod++){
38       for(Int_t isid=0;isid<kSides;isid++){
39         Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
40         base[index]=new AliITSOnlineSDDBase(iddl,imod,isid);    
41         if(adcfreq==40) base[index]->SetLastGoodTB(254);
42         else base[index]->SetLastGoodTB(126);
43         sprintf(hisnam,"h%02dc%02ds%d",iddl,imod,isid);
44         histo[index]=new TH2F(hisnam,"",128,-0.5,127.5,256,-0.5,255.5);
45       }
46     }
47   }
48
49
50   TCanvas* c0 = new TCanvas("c0","Ev Display",900,900);
51   gStyle->SetPalette(1);
52   Char_t text[50];
53
54   Int_t iev=firstEv;
55   AliRawReader *rd; 
56   if(strstr(datafil,".root")!=0){
57     rd=new AliRawReaderRoot(datafil,iev);
58   }else{
59     rd=new AliRawReaderDate(datafil,iev);
60   }
61   TLatex *t0=new TLatex();
62   t0->SetNDC();
63   t0->SetTextSize(0.06);
64   t0->SetTextColor(4);
65
66   do{
67     c0->Clear();
68     c0->Divide(4,6,0.001,0.001);
69     printf("Event # %d ",iev);
70     rd->Reset();
71     for(Int_t iddl=0; iddl<kTotDDL;iddl++){
72       for(Int_t imod=0; imod<kModPerDDL;imod++){
73         for(Int_t isid=0;isid<kSides;isid++){
74           Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
75           histo[index]->Reset();
76         }
77       }
78     }
79     AliITSRawStreamSDD s(rd);
80     while(s.Next()){
81       Int_t iDDL=rd->GetDDLID();
82       Int_t iCarlos=s.GetCarlosId();
83       if(s.IsCompletedModule()) continue;
84       if(s.IsCompletedDDL()) continue;
85       if(iDDL>=0 && iDDL<kTotDDL){ 
86         Int_t index=kSides*(kModPerDDL*iDDL+iCarlos)+s.GetChannel(); 
87         histo[index]->Fill(s.GetCoord2(),s.GetCoord1(),s.GetSignal());
88       }
89     }
90     iev++;
91     for(Int_t iddl=0; iddl<kTotDDL;iddl++){
92       for(Int_t imod=0; imod<kModPerDDL;imod++){
93         for(Int_t isid=0;isid<kSides;isid++){
94           Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
95           base[index]->AddEvent(histo[index]);
96           if(iddl==nDDL){
97             Int_t index2=kSides*imod+isid;
98             c0->cd(index2+1);
99             histo[index]->DrawCopy("colz");
100             sprintf(text,"DDL %d channel %d Side %d",nDDL,imod,isid);
101             t0->DrawLatex(0.15,0.92,text);
102             c0->Update();
103           }
104         }
105       }
106     }
107     printf(" --- OK\n");
108   }while(rd->NextEvent()&&iev<=lastEv);
109
110   for(Int_t iddl=0; iddl<kTotDDL;iddl++){
111     for(Int_t imod=0; imod<kModPerDDL;imod++){
112       for(Int_t isid=0;isid<kSides;isid++){
113         Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
114         base[index]->ValidateAnodes();
115         base[index]->WriteToASCII(); // fondamentale!!!!!!!!!
116         delete base[index];
117       }
118     }
119   }
120   delete rd;
121   delete [] base;
122   
123   printf("Start second analysis for Common Mode correction\n");
124   AliITSOnlineSDDCMN **corr=new AliITSOnlineSDDCMN*[kTotDDL*kModPerDDL*kSides];
125   Bool_t isFilled[kTotDDL*kModPerDDL*kSides];
126
127   for(Int_t iddl=0; iddl<kTotDDL;iddl++){
128     for(Int_t imod=0; imod<kModPerDDL;imod++){
129       for(Int_t isid=0;isid<kSides;isid++){
130         Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
131         corr[index]=new AliITSOnlineSDDCMN(iddl,imod,isid);
132         if(adcfreq==40) corr[index]->SetLastGoodTB(254);
133         else corr[index]->SetLastGoodTB(126);
134         isFilled[index]=0;
135       }
136     }
137   }
138
139   iev=firstEv;
140   AliRawReader *rd2; 
141   if(strstr(datafil,".root")!=0){
142     rd2=new AliRawReaderRoot(datafil,iev);
143   }else{
144     rd2=new AliRawReaderDate(datafil,iev);
145   }
146   do{
147     c0->Clear();
148     c0->Divide(4,6,0.001,0.001);
149     printf("Event # %d ",iev);
150     rd2->Reset();
151     for(Int_t iddl=0; iddl<kTotDDL;iddl++){
152       for(Int_t imod=0; imod<kModPerDDL;imod++){
153         for(Int_t isid=0;isid<kSides;isid++){
154           Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
155           histo[index]->Reset();
156         }
157       }
158     }
159     
160     AliITSRawStreamSDD s(rd2);
161     while(s.Next()){
162       Int_t iDDL=rd2->GetDDLID();
163       Int_t iCarlos=s.GetCarlosId();
164       if(s.IsCompletedModule()) continue;
165       if(s.IsCompletedDDL()) continue;
166       if(iDDL>=0 && iDDL<kTotDDL){ 
167         Int_t index=kSides*(kModPerDDL*iDDL+iCarlos)+s.GetChannel(); 
168         histo[index]->Fill(s.GetCoord2(),s.GetCoord1(),s.GetSignal());
169         isFilled[index]=1;
170       }
171     }
172     iev++;
173     for(Int_t iddl=0; iddl<kTotDDL;iddl++){
174       for(Int_t imod=0; imod<kModPerDDL;imod++){
175         for(Int_t isid=0;isid<kSides;isid++){
176           Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
177           if(isFilled[index]) corr[index]->AddEvent(histo[index]);
178           if(iddl==nDDL){
179             Int_t index2=kSides*imod+isid;
180             c0->cd(index2+1);
181             histo[index]->DrawCopy("colz");
182             sprintf(text,"DDL %d channel %d Side %d",nDDL,imod,isid);
183             t0->DrawLatex(0.15,0.92,text);
184             c0->Update();
185           }
186         }
187       }
188     }
189     printf(" --- OK\n");
190   }while(rd2->NextEvent()&&iev<=lastEv);
191
192   TH1F *htotbas=new TH1F("htotbas","",100,0.,150.);
193   TH1F *htotbaseq=new TH1F("htotbaseq","",100,0.,150.);
194   TH1F *htotnoise=new TH1F("htotnoise","",100,0.,10.);
195   TH1F *htotnoisecorr=new TH1F("htotnoisecorr","",100,0.,10.);
196   TH1F *hstatus=new TH1F("hstatus","",2,-0.5,1.5);
197
198   TFile *outfil=new TFile("SDDbase-results.root","recreate");
199   for(Int_t iddl=0; iddl<kTotDDL;iddl++){
200     for(Int_t imod=0; imod<kModPerDDL;imod++){
201       for(Int_t isid=0;isid<kSides;isid++){
202         Int_t index=kSides*(kModPerDDL*iddl+imod)+isid;
203         if(isFilled[index]){
204           corr[index]->ValidateAnodes();
205           corr[index]->WriteToASCII();
206           corr[index]->WriteToROOT(outfil);
207           for(Int_t ian=0; ian<256;ian++){
208             Float_t basl=corr[index]->GetAnodeBaseline(ian);
209             Float_t basleq=corr[index]->GetAnodeEqualizedBaseline(ian);
210             Float_t noi=corr[index]->GetAnodeRawNoise(ian);
211             Float_t cornoi=corr[index]->GetAnodeCorrNoise(ian);
212             Int_t anstatus=corr[index]->IsAnodeGood(ian);
213             hstatus->Fill(anstatus);
214             htotbas->Fill(basl);
215             htotbaseq->Fill(basleq);
216             htotnoise->Fill(noi);
217             htotnoisecorr->Fill(cornoi);
218           }
219         }
220       }
221     }
222   }
223   outfil->Close();
224   // Draw Statistics of baselines and noise
225   TCanvas *call=new TCanvas("call","General stats",700,700);
226   call->Divide(2,2);
227   call->cd(1);
228   htotbas->Draw();
229   htotbas->GetXaxis()->SetTitle("Baselines");
230   htotbas->GetXaxis()->SetTitleSize(0.07);
231   htotbas->GetXaxis()->SetTitleOffset(0.6);
232   call->cd(2);
233   htotbaseq->Draw();
234   htotbaseq->GetXaxis()->SetTitle("Baselines after equalization");
235   htotbaseq->GetXaxis()->SetTitleSize(0.07);
236   htotbaseq->GetXaxis()->SetTitleOffset(0.6);
237   call->cd(3);
238   htotnoisecorr->SetLineColor(2);
239   htotnoisecorr->Draw();
240   call->Update();
241   TPaveStats *st1=(TPaveStats*)htotnoisecorr->GetListOfFunctions()->FindObject("stats");
242   st1->SetY1NDC(0.51);
243   st1->SetY2NDC(0.7);
244   htotnoisecorr->GetXaxis()->SetTitle("Noise");
245   htotnoisecorr->GetXaxis()->SetTitleSize(0.07);
246   htotnoisecorr->GetXaxis()->SetTitleOffset(0.6);
247   htotnoise->Draw("SAMES");
248   call->Update();
249   TPaveStats *st2=(TPaveStats*)htotnoise->GetListOfFunctions()->FindObject("stats");
250   st2->SetY1NDC(0.71);
251   st2->SetY2NDC(0.9);
252   
253   call->cd(4);
254   hstatus->Draw();
255   hstatus->GetXaxis()->SetTitle("Anode Status (0=bad 1=good)");
256   hstatus->GetXaxis()->SetTitleSize(0.07);
257   hstatus->GetXaxis()->SetTitleOffset(0.6);
258   call->Update();
259   call->SaveAs("GenStatsPedestal.gif");
260
261   // Draw baselines and noise for all modules of the selected DDL
262
263   TH1F** hbas = new TH1F*[kSides*kModPerDDL];
264   TH1F** hrawn = new TH1F*[kSides*kModPerDDL];
265   TH1F** hcorrn = new TH1F*[kSides*kModPerDDL];
266   TH1F** hdbas = new TH1F*[kSides*kModPerDDL];
267   TH1F** hdrawn = new TH1F*[kSides*kModPerDDL];
268   TH1F** hdcorrn = new TH1F*[kSides*kModPerDDL];
269   TCanvas *c1=new TCanvas("c1","DDL: Baselines vs anode",900,900);
270   c1->SetBottomMargin(0.14);
271   c1->Divide(4,6,0.001,0.001);
272   TCanvas *c2=new TCanvas("c2","DDL: Noise vs anode",900,900);
273   c2->SetBottomMargin(0.14);
274   c2->Divide(4,6,0.001,0.001);
275   TCanvas *c3=new TCanvas("c3","DDL: Baselines distr",900,900);
276   c3->SetBottomMargin(0.14);
277   c3->Divide(4,6,0.001,0.001);
278   TCanvas *c4=new TCanvas("c4","DDL: Noise Distr",900,900);
279   c4->SetBottomMargin(0.14);
280   c4->Divide(4,6,0.001,0.001);
281   TLatex *t1=new TLatex(0.15,0.2,"Raw Noise");
282   t1->SetNDC();
283   t1->SetTextSize(0.05);
284   TLatex *t2=new TLatex(0.4,0.2,"Corrected Noise");
285   t2->SetNDC();
286   t2->SetTextSize(0.05);
287   t2->SetTextColor(2);
288   TLatex *t3=new TLatex();
289   t3->SetNDC();
290   t3->SetTextSize(0.06);
291   t3->SetTextColor(4);
292
293   for(Int_t imod=0; imod<kModPerDDL;imod++){
294     for(Int_t isid=0;isid<kSides;isid++){
295       Int_t index1=kSides*(kModPerDDL*nDDL+imod)+isid;
296       Int_t index2=kSides*imod+isid;
297       sprintf(text,"DDL %d channel %d Side %d",nDDL,imod,isid);
298       hbas[index2]=corr[index1]->GetBaselineAnodeHisto();
299       hrawn[index2]=corr[index1]->GetRawNoiseAnodeHisto();
300       hcorrn[index2]=corr[index1]->GetCorrNoiseAnodeHisto();
301       hdbas[index2]=corr[index1]->GetBaselineHisto();
302       hdrawn[index2]=corr[index1]->GetRawNoiseHisto();
303       hdcorrn[index2]=corr[index1]->GetCorrNoiseHisto();
304       c1->cd(index2+1);
305       hbas[index2]->Draw();
306       hbas[index2]->SetMinimum(0);
307       hbas[index2]->SetMaximum(75);
308       hbas[index2]->GetXaxis()->SetTitle("Anode");
309       hbas[index2]->GetYaxis()->SetTitle("Baseline");
310       hbas[index2]->GetXaxis()->SetTitleSize(0.07);
311       hbas[index2]->GetYaxis()->SetTitleSize(0.07);
312       hbas[index2]->GetXaxis()->SetTitleOffset(0.6);
313       hbas[index2]->GetYaxis()->SetTitleOffset(0.7);
314       t3->DrawLatex(0.15,0.92,text);
315       c1->Update();
316
317
318       c2->cd(index2+1); 
319       hrawn[index2]->SetMinimum(1.);
320       hrawn[index2]->SetMaximum(6.);
321       hrawn[index2]->Draw();
322       hrawn[index2]->GetXaxis()->SetTitle("Anode");
323       hrawn[index2]->GetYaxis()->SetTitle("Noise");
324       hrawn[index2]->GetXaxis()->SetTitleSize(0.07);
325       hrawn[index2]->GetYaxis()->SetTitleSize(0.07);
326       hrawn[index2]->GetXaxis()->SetTitleOffset(0.6);
327       hrawn[index2]->GetYaxis()->SetTitleOffset(0.7);
328       gStyle->SetOptStat(0);
329       hrawn[index2]->SetStats(0);
330       hcorrn[index2]->SetLineColor(2);
331       hcorrn[index2]->Draw("SAME");
332       t1->Draw();
333       t2->Draw();
334       t3->DrawLatex(0.15,0.92,text);
335       c2->Update();
336
337       c3->cd(index2+1);
338       hdbas[index2]->Draw();
339       hdbas[index2]->GetXaxis()->SetTitle("Baseline");
340       hdbas[index2]->GetXaxis()->SetTitleSize(0.07);
341       hdbas[index2]->GetXaxis()->SetTitleOffset(0.6);
342       t3->DrawLatex(0.15,0.92,text);
343       c3->Update();
344
345       c4->cd(index2+1); 
346       hdrawn[index2]->Draw();
347       hdrawn[index2]->GetXaxis()->SetTitle("Noise");
348       hdrawn[index2]->GetXaxis()->SetTitleSize(0.07);
349       hdrawn[index2]->GetXaxis()->SetTitleOffset(0.6);
350       hdcorrn[index2]->SetLineColor(2);
351       hdcorrn[index2]->Draw("SAME");
352       t1->Draw();
353       t2->Draw();
354       t3->DrawLatex(0.15,0.92,text);
355       c4->Update();
356     }
357   }
358
359   c1->SaveAs("Baselines.gif");
360   c2->SaveAs("Noise.gif");
361   c3->SaveAs("BaselinesDist.gif");
362   c4->SaveAs("NoiseDist.gif");
363   
364   Char_t delfil[100];
365   for(Int_t iddl=0; iddl<kTotDDL;iddl++){
366     for(Int_t imod=0; imod<kModPerDDL;imod++){
367       for(Int_t isid=0;isid<kSides;isid++){
368         sprintf(delfil,"rm SDDbase_step1_ddl%02dc%02d_sid%d.data",iddl,imod,isid);
369         gSystem->Exec(delfil);
370       }
371     }
372   }
373
374 }
375
376 void AnalyzeSDDNoiseAllMod(Int_t nrun, Int_t n2, Char_t* dir="LHC08d_SDD",Int_t adcfreq=20, Int_t nDDL=0, Int_t firstEv=15, Int_t lastEv=18){
377   TGrid::Connect("alien:",0,0,"t");
378   Char_t filnam[200];
379   sprintf(filnam,"alien:///alice/data/2008/%s/%09d/raw/08%09d%03d.10.root",dir,nrun,nrun,n2);
380   printf("Open file %s\n",filnam);
381   AnalyzeSDDNoiseAllMod(filnam,adcfreq,nDDL,firstEv,lastEv);
382 }