1 #if !defined(__CINT__) || defined(__MAKECINT__)
4 #include <TStopwatch.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"
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)
26 void AnalyzeSDDNoiseAllMod(Char_t *datafil, Int_t adcfreq=20, Int_t nDDL=0, Int_t firstEv=10, Int_t lastEv=12){
28 const Int_t kTotDDL=24;
29 const Int_t kModPerDDL=12;
32 AliITSOnlineSDDBase **base=new AliITSOnlineSDDBase*[kTotDDL*kModPerDDL*kSides];
33 TH2F **histo=new TH2F*[kTotDDL*kModPerDDL*kSides];
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);
50 TCanvas* c0 = new TCanvas("c0","Ev Display",900,900);
51 gStyle->SetPalette(1);
56 if(strstr(datafil,".root")!=0){
57 rd=new AliRawReaderRoot(datafil,iev);
59 rd=new AliRawReaderDate(datafil,iev);
61 TLatex *t0=new TLatex();
63 t0->SetTextSize(0.06);
68 c0->Divide(4,6,0.001,0.001);
69 printf("Event # %d ",iev);
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();
79 AliITSRawStreamSDD s(rd);
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());
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]);
97 Int_t index2=kSides*imod+isid;
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);
108 }while(rd->NextEvent()&&iev<=lastEv);
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!!!!!!!!!
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];
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);
141 if(strstr(datafil,".root")!=0){
142 rd2=new AliRawReaderRoot(datafil,iev);
144 rd2=new AliRawReaderDate(datafil,iev);
148 c0->Divide(4,6,0.001,0.001);
149 printf("Event # %d ",iev);
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();
160 AliITSRawStreamSDD s(rd2);
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());
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]);
179 Int_t index2=kSides*imod+isid;
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);
190 }while(rd2->NextEvent()&&iev<=lastEv);
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);
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;
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);
215 htotbaseq->Fill(basleq);
216 htotnoise->Fill(noi);
217 htotnoisecorr->Fill(cornoi);
224 // Draw Statistics of baselines and noise
225 TCanvas *call=new TCanvas("call","General stats",700,700);
229 htotbas->GetXaxis()->SetTitle("Baselines");
230 htotbas->GetXaxis()->SetTitleSize(0.07);
231 htotbas->GetXaxis()->SetTitleOffset(0.6);
234 htotbaseq->GetXaxis()->SetTitle("Baselines after equalization");
235 htotbaseq->GetXaxis()->SetTitleSize(0.07);
236 htotbaseq->GetXaxis()->SetTitleOffset(0.6);
238 htotnoisecorr->SetLineColor(2);
239 htotnoisecorr->Draw();
241 TPaveStats *st1=(TPaveStats*)htotnoisecorr->GetListOfFunctions()->FindObject("stats");
244 htotnoisecorr->GetXaxis()->SetTitle("Noise");
245 htotnoisecorr->GetXaxis()->SetTitleSize(0.07);
246 htotnoisecorr->GetXaxis()->SetTitleOffset(0.6);
247 htotnoise->Draw("SAMES");
249 TPaveStats *st2=(TPaveStats*)htotnoise->GetListOfFunctions()->FindObject("stats");
255 hstatus->GetXaxis()->SetTitle("Anode Status (0=bad 1=good)");
256 hstatus->GetXaxis()->SetTitleSize(0.07);
257 hstatus->GetXaxis()->SetTitleOffset(0.6);
259 call->SaveAs("GenStatsPedestal.gif");
261 // Draw baselines and noise for all modules of the selected DDL
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");
283 t1->SetTextSize(0.05);
284 TLatex *t2=new TLatex(0.4,0.2,"Corrected Noise");
286 t2->SetTextSize(0.05);
288 TLatex *t3=new TLatex();
290 t3->SetTextSize(0.06);
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();
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);
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");
334 t3->DrawLatex(0.15,0.92,text);
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);
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");
354 t3->DrawLatex(0.15,0.92,text);
359 c1->SaveAs("Baselines.gif");
360 c2->SaveAs("Noise.gif");
361 c3->SaveAs("BaselinesDist.gif");
362 c4->SaveAs("NoiseDist.gif");
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);
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");
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);