]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONTrackerHV.cxx
Adding utility class to check MCH HV (in particular trips) more closely
[u/mrichter/AliRoot.git] / MUON / AliMUONTrackerHV.cxx
CommitLineData
084cc733 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#include "AliMUONTrackerHV.h"
19#include "Riostream.h"
20#include "TObjArray.h"
21#include "TObjString.h"
22#include "AliDCSValue.h"
23#include "TMap.h"
24#include <map>
25#include "AliMpDCSNamer.h"
26#include "TH2.h"
27#include "TStyle.h"
28#include "AliCDBEntry.h"
29#include "AliCDBManager.h"
30#include "TLine.h"
31#include <set>
32#include "AliLog.h"
33#include "TGraph.h"
34#include "TMultiGraph.h"
35#include "AliMUONCDB.h"
36#include "TCanvas.h"
37#include "AliMUONCalibrationData.h"
38#include "AliGRPObject.h"
39
40ClassImp(AliMUONTrackerHV)
41
42//______________________________________________________________________________
43AliMUONTrackerHV::AliMUONTrackerHV(const char* runlist, const char* ocdbPath) : TObject(), fRunList(), fOCDBPath(ocdbPath)
44{
45 // ctor from a runlist (txt file)
46 SetRunList(runlist);
47}
48
49//______________________________________________________________________________
50AliMUONTrackerHV::AliMUONTrackerHV(Int_t runNumber, const char* ocdbPath) : TObject(), fRunList(), fOCDBPath(ocdbPath)
51{
52 // ctor for a single run
53 SetRunList(runNumber);
54}
55
56//______________________________________________________________________________
57AliMUONTrackerHV::~AliMUONTrackerHV()
58{
59 // dtor
60}
61
62//______________________________________________________________________________
63void AliMUONTrackerHV::ReadIntegers(const char* filename, std::vector<int>& integers)
64{
65 /// Read integers from filename, where integers are either
66 /// separated by "," or by return carriage
67 std::ifstream in(gSystem->ExpandPathName(filename));
68 int i;
69
70 std::set<int> runset;
71
72 char line[10000];
73
74 in.getline(line,10000,'\n');
75
76 TString sline(line);
77
78 if (sline.Contains(","))
79 {
80 TObjArray* a = sline.Tokenize(",");
81 TIter next(a);
82 TObjString* s;
83 while ( ( s = static_cast<TObjString*>(next()) ) )
84 {
85 runset.insert(s->String().Atoi());
86 }
87 delete a;
88 }
89 else
90 {
91 runset.insert(sline.Atoi());
92
93 while ( in >> i )
94 {
95 runset.insert(i);
96 }
97 }
98
99 for ( std::set<int>::const_iterator it = runset.begin(); it != runset.end(); ++it )
100 {
101 integers.push_back((*it));
102 }
103
104 std::sort(integers.begin(),integers.end());
105}
106
107
108//______________________________________________________________________________
109void AliMUONTrackerHV::SetRunList(Int_t runNumber)
110{
111 // Make the runlist be a single run
112 fRunList.clear();
113 fRunList.push_back(runNumber);
114}
115
116//______________________________________________________________________________
117void
118AliMUONTrackerHV::SetRunList(const char* runlist)
119{
120 // Read the runlist from an ASCII file or a comma separated list
121 // or a space separated list
122
123 fRunList.clear();
124
125 if ( TString(runlist).Contains(",") || TString(runlist).Contains(" ") )
126 {
127 TObjArray* runs = 0x0;
128 if ( TString(runlist).Contains(",") )
129 {
130 runs = TString(runlist).Tokenize(",");
131 }
132 else
133 {
134 runs = TString(runlist).Tokenize(" ");
135 }
136 TIter next(runs);
137 TObjString* s;
138 std::set<int> runset;
139
140 while ( ( s = static_cast<TObjString*>(next()) ) )
141 {
142 runset.insert(s->String().Atoi());
143 }
144
145 for ( std::set<int>::const_iterator it = runset.begin(); it != runset.end(); ++it )
146 {
147 fRunList.push_back((*it));
148 }
149
150 std::sort(fRunList.begin(),fRunList.end());
151
152 delete runs;
153 }
154 else
155 {
156 ReadIntegers(runlist,fRunList);
157 }
158}
159
160
161//______________________________________________________________________________
162TGraph*
163AliMUONTrackerHV::ShowValues(TMap* m, const char* name)
164{
165 // make a graph of HV channels' voltage values for a given dcs alias (name)
166
167 TGraph* g(0x0);
168
169 AliInfo(name);
170
171 TPair* p = static_cast<TPair*>(m->FindObject(name));
172 TObjArray* a = static_cast<TObjArray*>(p->Value());
173 TIter n2(a);
174 AliDCSValue* val;
175 Int_t i(0);
176
177 while ( ( val = static_cast<AliDCSValue*>(n2()) ) )
178 {
179 StdoutToAliInfo(std::cout << Form("i=%5d ",i);
180 val->Print(""););
181 ++i;
182 }
183
184 if ( TString(name).Contains("sw") )
185 {
186 // do not graph switches
187 return 0x0;
188 }
189
190 n2.Reset();
191 g = new TGraph(a->GetEntries());
192 i = 0;
193 while ( ( val = static_cast<AliDCSValue*>(n2()) ) )
194 {
195 g->SetPoint(i,val->GetTimeStamp(),val->GetFloat());
196 ++i;
197 }
198 return g;
199}
200
201//______________________________________________________________________________
202void
203AliMUONTrackerHV::ScanHV(Int_t verbose)
204{
205 /// Retrieve HV values from OCDB for a given run list, and check whether
206 /// we have some issues with them...
207
208 if ( fRunList.empty() )
209 {
210 std::cout << "No runs to process..." << std::endl;
211 return;
212 }
213
214 AliCDBManager::Instance()->SetDefaultStorage(fOCDBPath.Data());
215
216 for ( std::vector<int>::size_type i = 0; i < fRunList.size(); ++i )
217 {
218 AliMUONCDB::CheckHV(fRunList[i],verbose);
219 }
220}
221
222//______________________________________________________________________________
223void AliMUONTrackerHV::HVoff(const char* logfile, const char* outputBaseName)
224{
225 /// Check the number of HV which have problem
226 /// the input is the output of e.g.
227 /// .L MUONTrackerHV.C+
228 /// ScanHV("lhc11de.list");> lhc11de.log
229 ///
230
231 gStyle->SetOptStat(0);
232
233 char line[1024];
234
235 std::ifstream in(logfile);
236 int run(-1),a,b,c,d,e,f,g,h,z,other;
237 std::map<int,std::string> results;
238
239 std::string message;
240 const char* testProblem = "I-AliMUONCDB::CheckHV::CheckHV: Problem at ";
241
242 while ( in.getline(line,1023,'\n') )
243 {
244 TString sline(line);
245 if (sline.Contains("SUMMARY"))
246 {
247 AliInfo(line);
248 int r;
249 sscanf(line,"I-AliMUONCDB::CheckHV::CheckHV: RUN %09d HVchannel SUMMARY : # of cases A(%3d) B(%3d) C(%3d) D(%3d) E(%3d) F(%3d) G(%3d) H(%3d) Z(%3d) OTHER(%3d)",
250 &r,&a,&b,&c,&d,&e,&f,&g,&h,&z,&other);
251 if ( r != run )
252 {
253 if ( run == -1 )
254 {
255 AliCDBManager::Instance()->SetDefaultStorage(fOCDBPath.Data());
256 AliCDBManager::Instance()->SetRun(r);
257 AliMUONCDB::LoadMapping();
258 }
259
260 if ( run > 0 )
261 {
262 results.insert(std::make_pair<int,std::string>(run,message));
263
264 }
265 message = "";
266 run = r;
267 }
268 }
269 else if ( sline.Contains(testProblem) )
270 {
271 message += "|";
272 message += sline(strlen(testProblem),sline.Length()-1).Data();
273 }
274 }
275
276 results.insert(std::make_pair<int,std::string>(run,message));
277
278 AliMpDCSNamer hvNamer("TRACKER");
279
280 TH2* hvoff = new TH2I(outputBaseName,outputBaseName,1,0,1,1,0,1);
281
282 std::map<int,std::string>::const_iterator it;
283
284 for ( it = results.begin(); it != results.end(); ++it )
285 {
286 AliInfo(Form("%d -> %s",it->first,it->second.c_str()));
287 TObjArray* split = TString(it->second.c_str()).Tokenize("|");
288 TIter next(split);
289 TObjString* str;
290 while ( ( str = static_cast<TObjString*>(next()) ) )
291 {
292 TString s(str->String());
293 TObjArray* parts = s.Tokenize(":");
294 TString alias = (static_cast<TObjString*>(parts->At(0)))->String();
295 TString channel = hvNamer.DCSChannelNameFromAlias(alias.Data());
296 channel.ReplaceAll(".actual.vMon","");
297 hvoff->Fill(Form("%6d",it->first),channel.Data(),1.0);
298 delete parts;
299 }
300 delete split;
301 }
302
303 hvoff->LabelsDeflate("x");
304 hvoff->LabelsDeflate("y");
305 hvoff->LabelsOption("x","<");
306 hvoff->LabelsOption("y","<");
307
308 TCanvas* c1 = new TCanvas;
309 c1->SetLeftMargin(0.35);
310 hvoff->Draw("text");
311 c1->Print(Form("%s.pdf",outputBaseName));
312 TCanvas* c2 = new TCanvas;
313 TH1* hx = hvoff->ProjectionX("hvoffperrun");
314 hx->Draw();
315 c2->Print(Form("%s-perrun.pdf",outputBaseName));
316 TCanvas* c3 = new TCanvas;
317 c3->SetBottomMargin(0.5);
318 TH1* perchannel = hvoff->ProjectionY("hvoffperchannel");
319 perchannel->GetXaxis()->SetBit(TAxis::kLabelsVert);
320 perchannel->GetXaxis()->LabelsOption(">");
321 perchannel->Draw();
322 c3->Print(Form("%s-perchannel.pdf",outputBaseName));
323}
324
325//______________________________________________________________________________
326void AliMUONTrackerHV::TimeAxis(TMultiGraph* g)
327{
328 g->GetXaxis()->SetTimeDisplay(1);
329// g->GetXaxis()->SetTimeFormat("%d/%m %H:%M%F2010-12-31 24:00:00");
330 g->GetXaxis()->SetTimeFormat("%d/%m %H:%M");
331 g->GetXaxis()->SetTimeOffset(0,"gmt");
332 g->GetXaxis()->SetNdivisions(505);
333}
334
335//______________________________________________________________________________
336TMultiGraph*
337AliMUONTrackerHV::ShowHV(TMap* m, const char* dcsname)
338{
339 TIter next(m);
340 TObjString* s;
341 AliMpDCSNamer hvNamer("TRACKER");
342 TMultiGraph* mg = new TMultiGraph;
343
344 while ( ( s = static_cast<TObjString*>(next()) ) )
345 {
346 TString name(s->String());
347
348 if ( dcsname && !name.Contains(dcsname)) continue;
349
350 TGraph* g = ShowValues(m,name);
351
352 if ( g )
353 {
354 g->SetMarkerSize(1.5);
355 g->SetMarkerStyle(2);
356 g->SetLineStyle(2);
357 mg->Add(g,"lp");
358 g->SetTitle(name.Data());
359 }
360 }
361
362 return mg;
363}
364
365//______________________________________________________________________________
366void
367AliMUONTrackerHV::Plot(const char* dcsname, Bool_t withPatch)
368{
369 /// Show HV values for a given dcs alias (or all if dcsname=0)
370 /// Each canvas for each run will go to a separate PDF file
371
372 AliCDBManager::Instance()->SetDefaultStorage(fOCDBPath.Data());
373 TList messages;
374 messages.SetOwner(kTRUE);
375
376 for ( std::vector<int>::size_type i = 0; i < fRunList.size(); ++i )
377 {
378 Int_t runNumber = fRunList[i];
379
380 messages.Delete();
381
382 AliCDBManager::Instance()->SetRun(runNumber);
383
384 TMap* m = AliMUONCalibrationData::CreateHV(runNumber,0x0,withPatch,&messages);
385
386 TMultiGraph* mg = ShowHV(m,dcsname);
387
388 if ( !mg ) continue;
389
390 TString cname(Form("MCH_HV_RUN%09d",runNumber));
391
392 if ( strlen(dcsname) > 0 )
393 {
394 TString s(dcsname);
395 s.ReplaceAll("/","_");
396 cname += Form("_dcsname_%s",s.Data());
397 }
398
399 AliCDBEntry* e = AliCDBManager::Instance()->Get("GRP/GRP/Data",runNumber);
400
401 TLine* startRunLine(0);
402 TLine* endRunLine(0);
403 time_t start(0);
404 time_t end(0);
405
406 if ( e )
407 {
408 AliGRPObject* grp = static_cast<AliGRPObject*>(e->GetObject());
409 if (grp)
410 {
411 start = grp->GetTimeStart();
412 end = grp->GetTimeEnd();
413 }
414 }
415
416 if ( end )
417 {
418 TGraph* g = new TGraph(1);
419 g->SetPoint(0,end,0);
420 mg->Add(g,"");
421 }
422
423 TCanvas* c = new TCanvas(cname.Data(),cname.Data());
424
425 c->Draw();
426
427 mg->SetTitle(cname.Data());
428
429 mg->Draw("AL");
430
431 TimeAxis(mg);
432
433 if ( start )
434 {
435 startRunLine = new TLine(start,mg->GetYaxis()->GetXmin(),start,mg->GetYaxis()->GetXmax());
436 startRunLine->SetLineColor(2);
437 startRunLine->SetLineWidth(4);
438 }
439 if ( end )
440 {
441 endRunLine = new TLine(end,mg->GetYaxis()->GetXmin(),end,mg->GetYaxis()->GetXmax());
442 endRunLine->SetLineColor(2);
443 endRunLine->SetLineWidth(4);
444 }
445
446 if ( startRunLine ) startRunLine->Draw();
447 if ( endRunLine ) endRunLine->Draw();
448
449 c->SaveAs(Form("%s.pdf",cname.Data()));
450 }
451}
452
453//______________________________________________________________________________
454void
455AliMUONTrackerHV::ReportTrips()
456{
457 /// Report trips
458
459 AliCDBManager::Instance()->SetDefaultStorage(fOCDBPath.Data());
460
461 TList messages;
462 messages.SetOwner(kTRUE);
463 TObjString* msg(0);
464
465 for ( std::vector<int>::size_type i = 0; i < fRunList.size(); ++i )
466 {
467 Int_t runNumber = fRunList[i];
468
469 AliInfo("---------------------");
470
471 Int_t ntrips(0);
472
473 messages.Delete();
474
475 AliCDBManager::Instance()->SetRun(runNumber);
476
477 AliMUONCalibrationData::CreateHV(runNumber,0x0,kTRUE,&messages);
478
479 TIter next(&messages);
480
481 while ( ( msg = static_cast<TObjString*>(next())) )
482 {
483 if ( msg->String().Contains("TRIP") )
484 {
485 ++ntrips;
486 }
487 }
488
489 AliInfo(Form("RUN %09d - %d trip%c",runNumber,ntrips,(ntrips>1 ? 's':' ')));
490
491 next.Reset();
492
493 while ( ( msg = static_cast<TObjString*>(next())) )
494 {
495 if ( msg->String().Contains("TRIP") )
496 {
497 AliInfo(msg->String().Data());
498 }
499 }
500 }
501}
502