]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/PlotDriftSpeedSDDVsTime.C
Fix for Savannah bug 67210 (Peter Hristov)
[u/mrichter/AliRoot.git] / ITS / PlotDriftSpeedSDDVsTime.C
1 #if !defined(__CINT__) || defined(__MAKECINT__)
2 #include <Riostream.h>
3 #include <TFile.h>
4 #include <TH1F.h>
5 #include <TH2F.h>
6 #include <TGraph.h>
7 #include <TStyle.h>
8 #include <TLegend.h>
9 #include <TLegendEntry.h>
10 #include <TLine.h>
11 #include <TSystem.h>
12 #include <TGrid.h>
13 #include <TMath.h>
14 #include <TGraphErrors.h>
15 #include <TCanvas.h>
16 #include <TLatex.h>
17 #include <TObjArray.h>
18 #include "AliCDBEntry.h"
19 #include "AliITSDriftSpeedArraySDD.h"
20 #include "AliITSgeomTGeo.h"
21 #endif
22
23 /*  $Id$    */
24
25
26 // Macro to plot the drift speed vs. time from the OCDB files 
27 // created from INJECTOR runs (OCDB/ITS/Calib/DriftSpeedSDD)
28 // Origin: F. Prino (prino@to.infn.it)
29
30 void FillErrors(Float_t errSpeed[260]);
31
32 void PlotDriftSpeedSDDVsTime(Int_t year=2010, Int_t firstRun=62840, 
33                              Int_t lastRun=999999999,
34                              Int_t anode=128){
35   TGrid::Connect("alien:",0,0,"t");
36   Float_t errSpeed[260];
37   FillErrors(errSpeed);
38   TString cmd=Form("gbbox find \"/alice/data/%d/OCDB/ITS/Calib/DriftSpeedSDD\" \"Run*.root\" > runSpeedAlien.txt",year);
39   gSystem->Exec(cmd.Data());
40   FILE* listruns=fopen("runSpeedAlien.txt","r");
41   Char_t filnam[200],filnamalien[200];
42   TGraphErrors** gvdrvstime=new TGraphErrors*[520];
43   TGraphErrors** gvdrvsrun=new TGraphErrors*[520];
44   TGraph* gGoodInjVsRun=new TGraph(0);
45   gGoodInjVsRun->SetName("gGoodInjVsRun");
46   TGraph* gAverSpeedVsRun=new TGraph(0);
47   gAverSpeedVsRun->SetName("gAverSpeedVsRun");
48   TGraph* gGoodInjVsTime=new TGraph(0);
49   gGoodInjVsTime->SetName("gGoodInjVsTime");
50   TGraph* gAverSpeedVsTime=new TGraph(0);
51   gAverSpeedVsTime->SetName("gAverSpeedVsIime");
52   
53   for(Int_t iMod=0; iMod<260;iMod++){
54     gvdrvstime[iMod]=new TGraphErrors(0);    
55     gvdrvstime[iMod]->SetTitle(Form("Module %d",iMod+240));
56     gvdrvstime[iMod]->SetName(Form("gspmod%dt",iMod+240));
57     gvdrvsrun[iMod]=new TGraphErrors(0);    
58     gvdrvsrun[iMod]->SetTitle(Form("Module %d",iMod+240));
59     gvdrvsrun[iMod]->SetName(Form("gspmod%dr",iMod+240));
60   }
61   Float_t Edrift=(1800-45)/291/0.012;  
62   Int_t nrun,nrun2,nv,ns;
63   while(!feof(listruns)){
64     fscanf(listruns,"%s\n",filnam);
65     Char_t directory[100];
66     sprintf(directory,"/alice/data/%d",year);
67     if(!strstr(filnam,directory)) continue;
68        sscanf(filnam,"/alice/data/%d/OCDB/ITS/Calib/DriftSpeedSDD/Run%d_%d_v%d_s%d.root",&year,&nrun,&nrun2,&nv,&ns);
69
70        if(year==2009 && (nrun<85639 && nrun2> 85639)) continue;// protection for files with swapped ladders 4-5 of layer 3 
71        if(year==2009 && (nrun>100000 && nv< 325)) continue; // protection for files with swapped ladder 0-1 of layer 4
72   
73     if(nrun<firstRun) continue;
74     if(nrun>lastRun) continue;
75     sprintf(filnamalien,"alien://%s",filnam);
76     printf("Open file: %s\n",filnam);
77     TFile *f= TFile::Open(filnamalien);
78     AliCDBEntry *ent=(AliCDBEntry*)f->Get("AliCDBEntry");
79     TObjArray *drspSDD = (TObjArray *)ent->GetObject();
80     
81     Int_t iGoodInj=0;
82     Int_t iAverSpeed=0;
83     Float_t timeday=0;
84     
85     AliITSDriftSpeedArraySDD *vdriftarr;
86     AliITSDriftSpeedArraySDD *vdriftarr0;
87     AliITSDriftSpeedArraySDD *vdriftarr1;
88
89     for(Int_t iMod=0; iMod<260;iMod++){
90       Int_t index=-1;
91       if(anode<256) index=2*iMod;
92       else index=2*iMod+1;
93       vdriftarr=(AliITSDriftSpeedArraySDD*)drspSDD->At(index);
94           
95       Int_t i0=2*iMod;
96       Int_t i1=1+2*iMod;
97       vdriftarr0=(AliITSDriftSpeedArraySDD*)drspSDD->At(i0);
98       vdriftarr1=(AliITSDriftSpeedArraySDD*)drspSDD->At(i1);
99           
100       Int_t statusInj0=vdriftarr0->GetInjectorStatus();
101       Int_t statusInj1=vdriftarr1->GetInjectorStatus();
102       if(statusInj0>0) iGoodInj++;
103       else iAverSpeed++;
104       if(statusInj1>0) iGoodInj++;
105       else iAverSpeed++;
106           
107       Int_t iAn=anode;
108       if(anode>256) iAn=anode-256;
109       Float_t vdrift=vdriftarr->GetDriftSpeed(0,iAn);
110       if(vdrift<4. || vdrift > 8.) continue;
111       UInt_t timest=vdriftarr->GetTimestamp(0);
112       if(timest==0) continue;
113       Int_t npt=gvdrvsrun[iMod]->GetN();
114       gvdrvsrun[iMod]->SetPoint(npt,(Float_t)nrun,vdrift);
115       gvdrvsrun[iMod]->SetPointError(npt,0,errSpeed[iMod]);
116       
117       Float_t timeZero;
118       if(year==2009) timeZero=1247762992;
119       else timeZero=1262300400;
120       if(timest<timeZero) continue;
121       timeday=float(timest-timeZero)/60./60./24.;
122       Float_t mob=vdrift*1.E5/Edrift;  
123       Float_t temper=293.15*TMath::Power((mob/1350.),-1/2.4); 
124       if(iMod==497-240) printf("Run %s   Time %d Day %f Speed=%f Temp=%f\n",filnam,timest,timeday,vdrift,temper);
125       npt=gvdrvstime[iMod]->GetN();
126       gvdrvstime[iMod]->SetPoint(npt,timeday,vdrift);
127       gvdrvstime[iMod]->SetPointError(npt,0,errSpeed[iMod]);
128     }
129     Int_t npt=gGoodInjVsRun->GetN();
130     gGoodInjVsRun->SetPoint(npt,(Float_t)nrun,iGoodInj);
131     gAverSpeedVsRun->SetPoint(npt,(Float_t)nrun,iAverSpeed);
132         
133     npt=gGoodInjVsTime->GetN();
134     gGoodInjVsTime->SetPoint(npt,timeday,iGoodInj);
135     gAverSpeedVsTime->SetPoint(npt,timeday,iAverSpeed);
136         
137     printf("Number of half-modules with drift speed from injectors = %d\n",iGoodInj);
138     printf("Number of half-modules with average drift speed        = %d\n",iAverSpeed);
139         f->Close();
140   }
141
142   Int_t mod1=244-240;
143   Int_t mod2=277-240;
144 //   Int_t mod1=268-240;
145 //   Int_t mod2=274-240;
146   Int_t mod3=327-240;
147    Int_t mod4=453-240;
148    //  Int_t mod4=497-240;
149   Int_t lay1,lad1,det1;
150   Int_t lay2,lad2,det2;
151   Int_t lay3,lad3,det3;
152   Int_t lay4,lad4,det4;
153   AliITSgeomTGeo::GetModuleId(mod1+240,lay1,lad1,det1);
154   AliITSgeomTGeo::GetModuleId(mod2+240,lay2,lad2,det2);
155   AliITSgeomTGeo::GetModuleId(mod3+240,lay3,lad3,det3);
156   AliITSgeomTGeo::GetModuleId(mod4+240,lay4,lad4,det4);
157   Char_t filout[100];
158   sprintf(filout,"DriftSpVsTime_%d.root",year);
159   TFile *ofil=new TFile(filout,"recreate");
160   for(Int_t iMod=0; iMod<260;iMod++){
161     gvdrvstime[iMod]->Write();
162     gvdrvsrun[iMod]->Write();
163   }
164   gGoodInjVsRun->Write();
165   gGoodInjVsTime->Write();
166   gAverSpeedVsRun->Write();
167   gAverSpeedVsTime->Write();
168   ofil->Close();
169
170   gStyle->SetOptTitle(0);
171   TCanvas* c0=new TCanvas("c0","Vdrift vs. time");
172   c0->SetGridx();
173   c0->SetGridy();
174   gvdrvstime[mod1]->SetMarkerStyle(20);
175   gvdrvstime[mod2]->SetMarkerStyle(22);
176   gvdrvstime[mod2]->SetMarkerColor(2);
177   gvdrvstime[mod2]->SetLineColor(2);
178   gvdrvstime[mod3]->SetMarkerStyle(29);
179   gvdrvstime[mod3]->SetMarkerColor(3);
180   gvdrvstime[mod3]->SetLineColor(3);
181   gvdrvstime[mod4]->SetMarkerStyle(27);
182   gvdrvstime[mod4]->SetMarkerColor(4);
183   gvdrvstime[mod4]->SetLineColor(4);
184   gvdrvstime[mod1]->Draw("AP");
185   gvdrvstime[mod1]->SetMinimum(6.3);
186   gvdrvstime[mod1]->SetMaximum(6.75);
187   Char_t title[100];
188   if(year==2009){
189   sprintf(title,"Time (days since July 16th 2009)");
190   }else if (year==2010){
191   sprintf(title,"Time (days since January 1st 2010)");
192   }
193   gvdrvstime[mod1]->GetXaxis()->SetTitle(title);
194   gvdrvstime[mod1]->GetYaxis()->SetTitle("Drift speed (#mum/ns)");
195   gvdrvstime[mod2]->Draw("PSAME");
196   gvdrvstime[mod3]->Draw("PSAME");
197   gvdrvstime[mod4]->Draw("PSAME");
198   TLegend* leg=new TLegend(0.6,0.7,0.89,0.89);
199   leg->SetBorderSize(0);
200   leg->SetFillColor(0);
201   leg->SetFillStyle(0);
202   TLegendEntry* lent=leg->AddEntry(gvdrvstime[mod1],Form("Lay %d Lad %d Det %d",lay1,lad1,det1),"P");
203   lent=leg->AddEntry(gvdrvstime[mod2],Form("Lay %d Lad %d Det %d",lay2,lad2,det2),"P");
204   lent->SetTextColor(2);
205   lent=leg->AddEntry(gvdrvstime[mod3],Form("Lay %d Lad %d Det %d",lay3,lad3,det3),"P");
206   lent->SetTextColor(3);
207   lent=leg->AddEntry(gvdrvstime[mod4],Form("Lay %d Lad %d Det %d",lay4,lad4,det4),"P");
208   lent->SetTextColor(4);
209   leg->Draw();
210
211   TCanvas* c1=new TCanvas("c1","Vdrift vs. run");
212   c1->SetGridx();
213   c1->SetGridy();
214   gvdrvsrun[mod1]->SetMarkerStyle(20);
215   gvdrvsrun[mod2]->SetMarkerStyle(22);
216   gvdrvsrun[mod2]->SetMarkerColor(2);
217   gvdrvsrun[mod2]->SetLineColor(2);
218   gvdrvsrun[mod3]->SetMarkerStyle(29);
219   gvdrvsrun[mod3]->SetMarkerColor(3);
220   gvdrvsrun[mod3]->SetLineColor(3);
221   gvdrvsrun[mod4]->SetMarkerStyle(27);
222   gvdrvsrun[mod4]->SetMarkerColor(4);
223   gvdrvsrun[mod4]->SetLineColor(4);
224   gvdrvsrun[mod1]->Draw("AP");
225   gvdrvsrun[mod1]->SetMinimum(6.3);
226   gvdrvsrun[mod1]->SetMaximum(6.75);
227
228   gvdrvsrun[mod1]->GetXaxis()->SetTitle("Run number");
229   gvdrvsrun[mod1]->GetYaxis()->SetTitle("Drift speed (#mum/ns)");
230   gvdrvsrun[mod2]->Draw("PSAME");
231   gvdrvsrun[mod3]->Draw("PSAME");
232   gvdrvsrun[mod4]->Draw("PSAME");
233   leg->Draw();
234
235
236   TH2F* hlay3=new TH2F("hlay3","Variation of the drift speed (%) Layer 3",6,-0.5,5.5,14,-0.5,13.5);
237   hlay3->GetXaxis()->SetTitle("Detector");
238   hlay3->GetYaxis()->SetTitle("Ladder");
239   hlay3->GetXaxis()->SetTickLength(0);
240   hlay3->GetYaxis()->SetTickLength(0);
241   hlay3->SetStats(0);
242
243   TH2F* hlay4=new TH2F("hlay4","Variation of the drift speed (%) Layer 4",8,-0.5,7.5,22,-0.5,21.5);
244   hlay4->GetXaxis()->SetTitle("Detector");
245   hlay4->GetYaxis()->SetTitle("Ladder");
246   hlay4->GetXaxis()->SetTickLength(0);
247   hlay4->GetYaxis()->SetTickLength(0);
248   hlay4->GetYaxis()->SetTitle("Ladder");
249   hlay4->SetStats(0);
250
251   Double_t run1,run2,vdr1,vdr2;
252   Int_t lay,lad,det;
253   for(Int_t iMod=0; iMod<260; iMod++){
254     Int_t lastPoint=gvdrvsrun[iMod]->GetN()-1;
255     gvdrvsrun[iMod]->GetPoint(lastPoint,run2,vdr2);
256     gvdrvsrun[iMod]->GetPoint(lastPoint-1,run1,vdr1);
257     Float_t diff=0.;
258     if(vdr1>0.) diff=100*(vdr2-vdr1)/vdr1;
259     AliITSgeomTGeo::GetModuleId(iMod+240,lay,lad,det);
260     if(lay==3) hlay3->SetBinContent(det,lad,diff);
261     if(lay==4) hlay4->SetBinContent(det,lad,diff);
262   }
263   TLine* lin=new TLine(0,0,0,23);  
264   gStyle->SetPalette(1);
265
266   TCanvas *c0b=new TCanvas("c0b","Percent difference Last Run - Previous Run",900,600);
267   c0b->Divide(2,1);
268   c0b->cd(1);
269   hlay3->DrawCopy("colz");
270   for(Int_t i=0;i<6;i++){
271     lin->SetY1(-0.5);
272     lin->SetY2(13.5);
273     lin->SetX1(i+0.5);
274     lin->SetX2(i+0.5);
275     lin->DrawClone();
276   }
277   for(Int_t i=0;i<14;i++){
278     lin->SetX1(-0.5);
279     lin->SetX2(5.5);
280     lin->SetY1(i+0.5);
281     lin->SetY2(i+0.5);
282     lin->DrawClone();
283   }
284   c0b->cd(2);
285   hlay4->DrawCopy("colz");
286   for(Int_t i=0;i<8;i++){
287     lin->SetY1(-0.5);
288     lin->SetY2(21.5);
289     lin->SetX1(i+0.5);
290     lin->SetX2(i+0.5);
291     lin->DrawClone();
292   }
293   for(Int_t i=0;i<22;i++){
294     lin->SetX1(-0.5);
295     lin->SetX2(7.5);
296     lin->SetY1(i+0.5);
297     lin->SetY2(i+0.5);
298     lin->DrawClone();
299   }
300
301   TCanvas* c4=new TCanvas("c4","GoodMod vs. run");
302   c4->SetGridx();
303   c4->SetGridy();
304   gGoodInjVsRun->SetMarkerStyle(20);
305   gGoodInjVsRun->SetMarkerColor(2);
306   gGoodInjVsRun->GetXaxis()->SetTitle("Run number");
307   gGoodInjVsRun->GetYaxis()->SetTitle("Half-modules with drift speed from injectors");
308   gGoodInjVsRun->Draw("AP");
309   
310   TCanvas* c5=new TCanvas("c5","GoodMod vs. time");
311   c5->SetGridx();
312   c5->SetGridy();
313   gGoodInjVsTime->SetMarkerStyle(20);
314   gGoodInjVsTime->SetMarkerColor(2);
315   gGoodInjVsTime->GetXaxis()->SetTitle(title);
316   gGoodInjVsTime->GetYaxis()->SetTitle("Half-modules with drift speed from injectors");
317   gGoodInjVsTime->Draw("AP");
318 }
319
320 void FillErrors(Float_t errSpeed[260]){
321   Float_t err[260]={
322     0.002308,0.005120,0.004632,0.001000,0.001735,
323     0.001000,0.001000,0.002667,0.004237,0.005297,
324     0.001000,0.005460,0.005149,0.003921,0.001000,
325     0.003906,0.001000,0.004871,0.001000,0.001000,
326     0.001000,0.001000,0.002261,0.002986,0.002056,
327     0.002848,0.001000,0.001777,0.002822,0.004651,
328     0.001000,0.003551,0.006466,0.001000,0.002083,
329     0.004531,0.001000,0.002213,0.001000,0.001000,
330     0.001000,0.001000,0.001000,0.003223,0.002800,
331     0.002147,0.001000,0.003364,0.001000,0.001000,
332     0.002515,0.003229,0.002552,0.005765,0.002368,
333     0.003473,0.002363,0.001000,0.003413,0.001000,
334     0.004906,0.001000,0.004346,0.004887,0.007138,
335     0.007242,0.004289,0.003970,0.002914,0.002199,
336     0.001000,0.003483,0.002154,0.002914,0.003097,
337     0.006034,0.003101,0.001000,0.002425,0.002651,
338     0.002771,0.002409,0.002260,0.003109,0.001000,
339     0.003384,0.003374,0.002212,0.004441,0.001000,
340     0.001000,0.001000,0.003578,0.001000,0.001000,
341     0.003517,0.003590,0.001787,0.003329,0.001000,
342     0.002770,0.001000,0.004032,0.003059,0.001000,
343     0.001000,0.001000,0.001000,0.001000,0.001000,
344     0.001000,0.004556,0.001000,0.001000,0.001000,
345     0.001000,0.001000,0.001000,0.004819,0.002100,
346     0.002624,0.003784,0.003772,0.002483,0.002792,
347     0.001000,0.004713,0.003214,0.003180,0.002145,
348     0.002470,0.003078,0.001000,0.007131,0.002770,
349     0.002533,0.001000,0.004362,0.002819,0.001000,
350     0.003630,0.004215,0.002975,0.001000,0.003790,
351     0.002345,0.001000,0.003999,0.004555,0.003989,
352     0.001000,0.001000,0.001000,0.003136,0.002426,
353     0.005144,0.002844,0.002310,0.002467,0.002503,
354     0.003811,0.003440,0.004773,0.003114,0.001000,
355     0.000583,0.001000,0.001000,0.003385,0.001000,
356     0.001000,0.001000,0.001000,0.003108,0.002109,
357     0.005325,0.003750,0.002810,0.003559,0.001000,
358     0.001000,0.003262,0.003903,0.001000,0.003622,
359     0.002533,0.002121,0.003733,0.005353,0.002221,
360     0.004767,0.003267,0.004892,0.002152,0.003398,
361     0.001000,0.003146,0.001000,0.002952,0.003310,
362     0.002644,0.002573,0.001000,0.003989,0.001000,
363     0.005294,0.003095,0.003479,0.002250,0.001000,
364     0.001000,0.005221,0.001000,0.001653,0.004330,
365     0.013188,0.007375,0.003226,0.003875,0.001000,
366     0.003653,0.001000,0.002655,0.001000,0.001000,
367     0.001000,0.001000,0.004718,0.001000,0.001000,
368     0.001000,0.002780,0.003680,0.001000,0.002787,
369     0.001000,0.004617,0.001000,0.001000,0.003231,
370     0.001887,0.002090,0.003326,0.129970,0.004907,
371     0.004334,0.001000,0.001000,0.003489,0.002573,
372     0.002566,0.002982,0.001000,0.001000,0.003436,
373     0.004016,0.003736,0.001784,0.004775,0.008090};
374   for(Int_t i=0;i<260;i++) errSpeed[i]=err[i];
375   
376   
377 }