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