Upgrade to draw evolution of the number of live channels
[u/mrichter/AliRoot.git] / MUON / MUONStatusMap.C
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 /// \ingroup macros
19 /// \file MUONStatusMap.C
20 /// \brief Macro to check/test pad status and pad status map makers
21 ///
22 /// \author Laurent Aphecetche
23
24 #if !defined(__CINT__) || defined(__MAKECINT__)
25 #include "AliCDBManager.h"
26 #include "AliCDBEntry.h"
27 #include "AliLog.h"
28 #include "AliMpCDB.h"
29 #include "AliMUONCDB.h"
30 #include "AliMUONCalibrationData.h"
31 #include "AliMUONPadStatusMaker.h"
32 #include "AliMUONPadStatusMapMaker.h"
33 #include "AliMUONRecoParam.h"
34 #include "AliMUONVCalibParam.h"
35 #include "AliMUONVStore.h"
36 #include "AliMpConstants.h"
37 #include "AliMpDDLStore.h"
38 #include "AliMpDetElement.h"
39 #include "AliMpManuIterator.h"
40 #include "Riostream.h"
41 #include "TAxis.h"
42 #include "TCanvas.h"
43 #include "TLegend.h"
44 #include "TFile.h"
45 #include "TGraph.h"
46 #include "TBox.h"
47 #include "TH2F.h"
48 #include "TStyle.h"
49 #include "TText.h"
50 #include <vector>
51 #endif
52
53 namespace
54 {
55   Int_t NTOTALNUMBEROFPADS(1064008);
56 }
57
58 //______________________________________________________________________________
59 void ReadIntegers(const char* filename, std::vector<int>& integers)
60 {
61   /// Read integers from filename, where integers are either
62   /// separated by "," or by return carriage
63   ifstream in(gSystem->ExpandPathName(filename));
64   int i;
65   
66   char line[10000];
67   
68   in.getline(line,10000,'\n');
69   
70   TString sline(line);
71   
72   if (sline.Contains(","))
73   {
74     TObjArray* a = sline.Tokenize(",");
75     TIter next(a);
76     TObjString* s;
77     while ( ( s = static_cast<TObjString*>(next()) ) )
78     {
79       integers.push_back(s->String().Atoi());
80     }
81   }
82   else
83   {
84     integers.push_back(sline.Atoi());
85     
86     while ( in >> i )
87     {
88       integers.push_back(i);
89     }
90   }
91   
92   std::sort(integers.begin(),integers.end());
93 }
94
95
96 //______________________________________________________________________________
97 void MUONStatusMap(AliMUONVStore*& vstatus,
98                    AliMUONVStore*& vstatusMap,
99                    const char* cdbStorage = "alien://folder=/alice/data/2011/OCDB",
100                    Int_t runNumber=145292)
101 {  
102
103   AliCDBManager::Instance()->SetDefaultStorage(cdbStorage);
104   AliCDBManager::Instance()->SetRun(runNumber);
105   
106 //  AliCDBManager::Instance()->SetSpecificStorage("MUON/Calib/RecoParam","alien://folder=/alice/cern.ch/user/c/cgeuna/OCDB");
107   
108   AliMUONCDB::LoadMapping();
109   
110   AliMUONRecoParam* recoParam = AliMUONCDB::LoadRecoParam();
111   
112 //  man->SetSpecificStorage("MUON/Calib/OccupancyMap","local://$ALICE_ROOT/OCDB");
113 //  man->SetSpecificStorage("MUON/Calib/OccupancyMap","alien://folder=/alice/cern.ch/user/l/laphecet/OCDB");
114 //  man->SetSpecificStorage("MUON/Calib/RejectList","alien://folder=/alice/cern.ch/user/l/laphecet/OCDB");
115 //  man->SetSpecificStorage("MUON/Align/Data","alien://folder=/alice/cern.ch/user/l/laphecet/OCDB");
116
117   AliMUONCalibrationData cd(runNumber);
118   
119   AliMUONPadStatusMaker statusMaker(cd);
120   
121   statusMaker.SetLimits(*recoParam);
122   
123   UInt_t mask = recoParam->PadGoodnessMask();
124
125   //  delete recoParam;
126   
127   statusMaker.Report(mask);
128   
129   vstatus = static_cast<AliMUONVStore*>(statusMaker.StatusStore()->Clone());
130   
131   const Bool_t deferredInitialization = kFALSE;
132   
133   AliMUONPadStatusMapMaker statusMapMaker(cd,mask,deferredInitialization);
134     
135   vstatusMap = static_cast<AliMUONVStore*>(statusMapMaker.StatusMap()->Clone());
136 }
137
138 //______________________________________________________________________________
139 Int_t GetBadChannels(Int_t runNumber,
140                      Int_t& nbadped,
141                      Int_t& nbadhv,
142                      Int_t& nbadgain,
143                      Int_t& nbadocc,
144                      Int_t& nmissing,
145                      Int_t& nreco)
146 {
147   if (!AliCDBManager::Instance()->IsDefaultStorageSet())
148   {
149     AliCDBManager::Instance()->SetDefaultStorage("raw://");
150   }
151   
152   AliCDBManager::Instance()->SetRun(runNumber);
153   
154   AliMpCDB::LoadDDLStore();
155   
156   AliMUONCalibrationData cd(runNumber,true);
157   
158   AliMUONPadStatusMaker statusMaker(cd);
159   
160   AliMUONRecoParam* recoParam = AliMUONCDB::LoadRecoParam();
161
162   statusMaker.SetLimits(*recoParam);
163   
164   AliMpManuIterator it;
165   Int_t detElemId, manuId;
166   
167   Int_t pedCheck = ( 
168                      AliMUONPadStatusMaker::kPedMeanZero |
169                      AliMUONPadStatusMaker::kPedMeanTooLow |
170                      AliMUONPadStatusMaker::kPedMeanTooHigh |
171                      AliMUONPadStatusMaker::kPedSigmaTooLow |
172                      AliMUONPadStatusMaker::kPedSigmaTooHigh );
173      
174   Int_t hvCheck = ( 
175                    AliMUONPadStatusMaker::kHVError |
176                    AliMUONPadStatusMaker::kHVTooLow |
177                    AliMUONPadStatusMaker::kHVTooHigh |
178                    AliMUONPadStatusMaker::kHVChannelOFF |
179                    AliMUONPadStatusMaker::kHVSwitchOFF );
180
181   
182   Int_t occCheck = (
183                     AliMUONPadStatusMaker::kManuOccupancyTooHigh 
184                    );
185                     
186   Int_t ntotal(0);
187   Int_t nbad(0);
188   nbadped=0;
189   nbadocc=0;
190   nbadgain=0;
191   nbadhv=0;
192   nmissing=0;
193   nreco=0;
194   
195   while ( it.Next(detElemId,manuId) )
196   {
197     AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
198     for ( Int_t manuChannel = 0; manuChannel < AliMpConstants::ManuNofChannels(); ++manuChannel )
199     {
200       if ( de->IsConnectedChannel(manuId,manuChannel) )
201       {
202         ++ntotal;
203         
204         UInt_t status = statusMaker.PadStatus(detElemId, manuId, manuChannel);
205         
206         if (!status) continue;
207         
208         bool bad(false);
209         
210         if ( status & AliMUONPadStatusMaker::BuildStatus(pedCheck,0,0,0) ) 
211         {
212           ++nbadped;
213           bad=true;
214         }
215         
216         if ( status & AliMUONPadStatusMaker::BuildStatus(0,hvCheck,0,0) ) 
217         {
218           ++nbadhv;
219           bad=true;
220         }
221         
222         if ( status & AliMUONPadStatusMaker::BuildStatus(0,0,0,occCheck) ) 
223         {
224           ++nbadocc;
225           bad=true;
226         }
227         
228         if ( status & recoParam->PadGoodnessMask() ) 
229         {
230           ++nreco;
231         }
232         
233         if ( status & AliMUONPadStatusMaker::BuildStatus(AliMUONPadStatusMaker::kMissing,0,0,AliMUONPadStatusMaker::kMissing) )
234         {
235           bad=true;
236           ++nmissing;
237         }
238         
239         if (bad) ++nbad;
240       }
241     }
242   }
243   
244   if (ntotal!=NTOTALNUMBEROFPADS)
245   {
246     cerr << Form("ERROR ! NOT THE EXPECTED NUMBER OF CHANNELS (%d vs 1064008) FOR RUN %09d",
247                  ntotal,runNumber) << endl;
248   }
249   
250   AliCDBManager::Instance()->ClearCache(); 
251  
252   return nbad;
253 }
254
255 //______________________________________________________________________________
256 void Draw(TFile* f, const char* gname, TLegend* l, Bool_t normalized)
257 {
258   if (!f) return;
259   
260   TGraph* g = static_cast<TGraph*>(f->Get(gname));
261   
262   if (!g) return;
263   
264   if ( normalized ) 
265   {
266     g = static_cast<TGraph*>(g->Clone());
267     for ( Int_t i = 0; i < g->GetN(); ++i ) 
268     {
269       Double_t y = g->GetY()[i];
270       g->SetPoint(i,g->GetX()[i],y/NTOTALNUMBEROFPADS);
271     }
272   }
273   
274   g->Draw("lp");
275   g->GetXaxis()->SetNdivisions(505);
276   g->GetXaxis()->SetNoExponent();
277   
278   if (l) l->AddEntry(g,gname,"LP");
279 }
280
281 //______________________________________________________________________________
282 void DrawPeriod(double run1, double run2, double ymin, double ymax, const char* label)
283 {
284   TBox* b = new TBox(run1,ymin,run2,ymax);
285   b->SetFillColor(5);
286   b->Draw();
287   TText* text = new TText((run1+run2)/2.0,ymax*0.6,label);
288   text->SetTextSize(0.05);
289   text->Draw();
290 }
291
292 //______________________________________________________________________________
293 void DrawEvolution(const char* file, bool normalized=true)
294 {
295   TFile* f = TFile::Open(file);
296   
297   if (!f) return;
298   
299   TCanvas* c = new TCanvas("mch-status-evolution","mch-status-evolution");
300   
301   c->SetGridy();
302   c->SetTicky();
303   
304   c->Draw();
305   
306   TLegend* l = new TLegend(0.1,0.7,0.3,0.95,"ch evolution");
307
308   TGraph* g = static_cast<TGraph*>(f->Get("nbad"));
309   if (!g) return;
310   
311   int runmin = TMath::Nint(g->GetX()[0]);
312   int runmax = TMath::Nint(g->GetX()[g->GetN()-1]);
313   
314   double ymax(0.4);
315   
316   TH2* h = new TH2F("hframe","hframe;Run number;Fraction of dead channels",100,runmin-200,runmax+200,100,0,ymax);
317
318   gStyle->SetOptStat(kFALSE);
319   h->Draw();
320   h->GetXaxis()->SetNoExponent();
321   h->GetXaxis()->SetNdivisions(505);
322
323   gStyle->SetOptTitle(kFALSE);
324
325   DrawPeriod(115881,117222,0,ymax,"10b"); 
326
327   DrawPeriod(119159,120824,0,ymax,"10c");
328
329   DrawPeriod(122374,126424,0,ymax,"10d");
330
331   DrawPeriod(127724,130850,0,ymax,"10e");
332
333   DrawPeriod(133005,134929,0,ymax,"10f");
334
335   DrawPeriod(135658,136376,0,ymax,"10g");
336
337   DrawPeriod(137133,139513,0,ymax,"10h");
338   
339   DrawPeriod(143856,146860,0,ymax,"11a");
340
341   DrawPeriod(148370,150702,0,ymax,"11b");
342
343   DrawPeriod(155384,155384,0,ymax,"11c");
344
345   DrawPeriod(156477,159606,0,ymax,"11d");
346
347   Draw(f,"nbad",l,normalized);
348   Draw(f,"nbadped",l,normalized);
349   Draw(f,"nbadocc",l,normalized);
350   Draw(f,"nbadhv",l,normalized);
351   Draw(f,"nmissing",l,normalized);
352   Draw(f,"nreco",l,normalized);
353   
354   h->Draw("same");
355
356   c->RedrawAxis("g");
357   
358   l->Draw();
359 }
360
361 //______________________________________________________________________________
362 void MUONStatusMapEvolution(const char* runlist, const char* outfile)
363 {
364   // Compute the number of bad pads (because of bad ped, bad hv, bad occupancy
365   // or missing in configuration)
366   //
367   // output a root file with the different graphs.
368   //
369   // output can be then plotted using the DrawEvolution function
370   //
371   
372   std::vector<int> runs;
373
374   ReadIntegers(runlist,runs);
375   
376   if ( runs.empty() ) 
377   {
378     cout << "No runs to process..." << endl;
379     return;    
380   }
381   
382   int year(2011);
383   
384   if ( runs[0] <= 139699 ) year=2010;
385   
386   AliCDBManager::Instance()->SetDefaultStorage(Form("alien://folder=/alice/data/%d/OCDB?cacheFold=/local/cdb",year));
387 //  AliCDBManager::Instance()->SetDefaultStorage("local:///local/cdb/alice/data/2010/OCDB");
388   
389   TList glist;
390   
391   glist.SetOwner(kTRUE);
392   
393   TGraph* gnbad = new TGraph(runs.size());
394   gnbad->SetName("nbad");
395   glist.Add(gnbad);
396   
397   TGraph* gnbadped = new TGraph(runs.size());
398   gnbadped->SetName("nbadped");
399   glist.Add(gnbadped);
400   
401   TGraph* gnbadocc = new TGraph(runs.size());
402   gnbadocc->SetName("nbadocc");
403   glist.Add(gnbadocc);
404   
405   TGraph* gnbadhv = new TGraph(runs.size());
406   gnbadhv->SetName("nbadhv");
407   glist.Add(gnbadhv);
408   
409   TGraph* gnmissing = new TGraph(runs.size());
410   gnmissing->SetName("nmissing");
411   glist.Add(gnmissing);
412
413   TGraph* gnreco = new TGraph(runs.size());
414   gnreco->SetName("nreco");
415   glist.Add(gnreco);
416   
417   for ( std::vector<int>::size_type i = 0; i < runs.size(); ++i ) 
418   {
419     Int_t runNumber = runs[i];
420     Int_t nbadped;
421     Int_t nbadhv;
422     Int_t nbadgain;
423     Int_t nbadocc;
424     Int_t nmissing;
425     Int_t nreco;
426     
427     Int_t nbad = GetBadChannels(runNumber,nbadped,nbadhv,nbadgain,nbadocc,nmissing,nreco);
428     
429     gnbad->SetPoint(i,runNumber,nbad);
430     gnbadped->SetPoint(i,runNumber,nbadped);
431     gnbadhv->SetPoint(i,runNumber,nbadhv);
432     gnbadocc->SetPoint(i,runNumber,nbadocc);
433     gnmissing->SetPoint(i,runNumber,nmissing);
434     gnreco->SetPoint(i,runNumber,nreco);
435   }
436   
437   TIter next(&glist);
438   TGraph* g;
439   Int_t index(0);
440
441   TFile f(outfile,"recreate");
442   Int_t  color[] = {  1 ,  2 ,  3 ,  4,  6, 8 };
443   Int_t marker[] = { 28 , 24 , 23 , 26, 30, 5 };
444
445   while ( ( g = static_cast<TGraph*>(next() ) ) )
446   {
447     g->GetXaxis()->SetNdivisions(505);
448     g->GetXaxis()->SetNoExponent();
449     g->SetMinimum(0);
450     g->GetYaxis()->SetNoExponent();
451     g->SetLineColor(color[index]);
452     g->SetMarkerStyle(marker[index]);
453     g->SetMarkerColor(color[index]);
454     g->SetMarkerSize(1.0);
455     ++index;
456     g->Write();
457   }
458     
459   f.Close();
460   
461   
462 }