CMS 3D CMS Logo

lsbs_cert.cc
Go to the documentation of this file.
1 #include <Riostream.h>
2 #include <TDirectory.h>
3 #include <TFile.h>
4 #include <TROOT.h>
5 #include <TStyle.h>
6 #include <TKey.h>
7 #include <TH1.h>
8 #include <TH2.h>
9 #include <TH2D.h>
10 #include <TCanvas.h>
11 #include <TGraph.h>
12 #include <TPaveStats.h>
13 #include <TText.h>
14 #include <TLegend.h>
15 #include <cstring>
16 #include <utility>
17 #include <vector>
18 #include <sstream>
19 #include <algorithm>
20 #include <TString.h>
21 #include <TColor.h>
22 
23 using namespace std;
24 
25 //global vars
26 bool debug = false;
27 int numlumis = -1;
28 
29 int nlumis ( string filename ); //get number of run lumisections
30 string runnum_str ( string filename ); //read the run number, return in string
31 int getplot ( string filename , string iDir , string strplot , TH1F& plot ); //read given plot
32 void Cleaning ( vector<int> & );
33 string ListOut ( vector<int> & );
34 void vector_AND ( vector<int> & , vector<int> );
35 void lsbs_cert( string filename );
36 
37 int main(int argc , char *argv[]) {
38 
39  if(argc==2) {
40  char* filename = argv[1];
41 
42  std::cout << "ready to run lsbs filename " << filename << std::endl;
43 
44  lsbs_cert(filename);
45 
46  }
47  else {std::cout << "Too few arguments: " << argc << std::endl; return -1; }
48  return 0;
49 
50 }
51 
52 void lsbs_cert( string filename )
53 {
54  void check_offset ( string filename , string iDir , string plot , float limit_min , float limit_max , vector <int>& );
55  void check_sigma ( string filename , string iDir , string plot , float limit_err , vector <int>& );
56  bool check_isgood ( vector<int> & , int ls ); //check if this LS is good
57 
58  //presets
59  numlumis = -1;
60 
61  float limit_x = 0.002;
62  float limit_y = 0.002;
63  float limit_z = 0.5;
64  float limit_dx = 0.002;
65  float limit_dy = 0.002;
66  float limit_dz = 0.5;
67  float limit_errdx = 0.002;
68  float limit_errdy = 0.002;
69  float limit_errdz = 0.5;
70 
71 
72  //LS certification
73  vector <int> ls_x_bad;
74  vector <int> ls_y_bad;
75  vector <int> ls_z_bad;
76 
77  vector <int> ls_xsc_bad;
78  vector <int> ls_ysc_bad;
79  vector <int> ls_zsc_bad;
80 
81  vector <int> ls_dx_bad;
82  vector <int> ls_dy_bad;
83  vector <int> ls_dz_bad;
84 
85  vector <int> ls_dxsc_bad;
86  vector <int> ls_dysc_bad;
87  vector <int> ls_dzsc_bad;
88 
89  vector <int> ls_errdx_bad;
90  vector <int> ls_errdy_bad;
91  vector <int> ls_errdz_bad;
92 
93  vector <int> ls_errdxsc_bad;
94  vector <int> ls_errdysc_bad;
95  vector <int> ls_errdzsc_bad;
96 
97  vector <int> ls_good;
98  vector <int> ls_bad;
99 
100  //beamspot vs primary vertex
101  check_offset ( filename, "Validation" , "hxLumibased PrimaryVertex-DataBase" , -limit_x , limit_x , ls_x_bad );
102  check_offset ( filename, "Validation" , "hyLumibased PrimaryVertex-DataBase" , -limit_y , limit_y , ls_y_bad );
103  check_offset ( filename, "Validation" , "hzLumibased PrimaryVertex-DataBase" , -limit_z , limit_z , ls_z_bad );
104 
105  //beamspot vs scalers
106  check_offset ( filename, "Validation" , "hxLumibased Scalers-DataBase fit" , -limit_x , limit_x , ls_xsc_bad );
107  check_offset ( filename, "Validation" , "hyLumibased Scalers-DataBase fit" , -limit_y , limit_y , ls_ysc_bad );
108  check_offset ( filename, "Validation" , "hzLumibased Scalers-DataBase fit" , -limit_z , limit_z , ls_zsc_bad );
109 
110  check_offset ( filename, "Debug" , "hsigmaXLumibased PrimaryVertex-DataBase fit" , -limit_dx , limit_dx , ls_dx_bad );
111  check_offset ( filename, "Debug" , "hsigmaYLumibased PrimaryVertex-DataBase fit" , -limit_dy , limit_dy , ls_dy_bad );
112  check_offset ( filename, "Debug" , "hsigmaZLumibased PrimaryVertex-DataBase fit" , -limit_dz , limit_dz , ls_dz_bad );
113 
114  check_offset ( filename, "Validation" , "hsigmaXLumibased Scalers-DataBase fit" , -limit_dx , limit_dx , ls_dxsc_bad );
115  check_offset ( filename, "Validation" , "hsigmaYLumibased Scalers-DataBase fit" , -limit_dy , limit_dy , ls_dysc_bad );
116  check_offset ( filename, "Validation" , "hsigmaZLumibased Scalers-DataBase fit" , -limit_dz , limit_dz , ls_dzsc_bad );
117 
118  check_sigma ( filename, "Debug" , "hsigmaXLumibased PrimaryVertex-DataBase fit" , limit_errdx , ls_errdx_bad );
119  check_sigma ( filename, "Debug" , "hsigmaYLumibased PrimaryVertex-DataBase fit" , limit_errdy , ls_errdy_bad );
120  check_sigma ( filename, "Debug" , "hsigmaZLumibased PrimaryVertex-DataBase fit" , limit_errdz , ls_errdz_bad );
121 
122  check_sigma ( filename, "Validation" , "hsigmaXLumibased Scalers-DataBase fit" , limit_errdx , ls_errdxsc_bad );
123  check_sigma ( filename, "Validation" , "hsigmaYLumibased Scalers-DataBase fit" , limit_errdy , ls_errdysc_bad );
124  check_sigma ( filename, "Validation" , "hsigmaZLumibased Scalers-DataBase fit" , limit_errdz , ls_errdzsc_bad );
125 
126  //BAD LS only if bad in both histos (wrt PV, Scalers)
127  vector_AND ( ls_x_bad , ls_xsc_bad );
128  vector_AND ( ls_y_bad , ls_ysc_bad );
129  vector_AND ( ls_z_bad , ls_zsc_bad );
130  vector_AND ( ls_dx_bad , ls_dxsc_bad );
131  vector_AND ( ls_dy_bad , ls_dysc_bad );
132  vector_AND ( ls_dz_bad , ls_dzsc_bad );
133  vector_AND ( ls_errdx_bad , ls_errdxsc_bad );
134  vector_AND ( ls_errdy_bad , ls_errdysc_bad );
135  vector_AND ( ls_errdz_bad , ls_errdzsc_bad );
136 
137  //good LS = all LS minus BAD LS
138  for ( int i = 1; i <= nlumis ( filename ) ; i++ )
139  {
140  if ( !check_isgood ( ls_x_bad , i ) && !check_isgood ( ls_xsc_bad , i ) )
141  {
142  ls_bad.push_back ( i );
143  continue;
144  }
145  else
146  if ( !check_isgood ( ls_y_bad , i ) && !check_isgood ( ls_ysc_bad , i ) )
147  {
148  ls_bad.push_back ( i );
149  continue;
150  }
151  else
152  if ( !check_isgood ( ls_z_bad , i ) && !check_isgood ( ls_zsc_bad , i ) )
153  {
154  ls_bad.push_back ( i );
155  continue;
156  }
157  else
158  if ( !check_isgood ( ls_dx_bad , i ) && !check_isgood ( ls_dxsc_bad , i ) )
159  {
160  ls_bad.push_back ( i );
161  continue;
162  }
163  else
164  if ( !check_isgood ( ls_dy_bad , i ) && !check_isgood ( ls_dysc_bad , i ) )
165  {
166  ls_bad.push_back ( i );
167  continue;
168  }
169  else
170  if ( !check_isgood ( ls_dz_bad , i ) && !check_isgood ( ls_dzsc_bad , i ) )
171  {
172  ls_bad.push_back ( i );
173  continue;
174  }
175  else
176  if ( !check_isgood ( ls_errdx_bad , i ) && !check_isgood ( ls_errdxsc_bad , i ) )
177  {
178  ls_bad.push_back ( i );
179  continue;
180  }
181  else
182  if ( !check_isgood ( ls_errdy_bad , i ) && !check_isgood ( ls_errdysc_bad , i ) )
183  {
184  ls_bad.push_back ( i );
185  continue;
186  }
187  else
188  if ( !check_isgood ( ls_errdz_bad , i ) && !check_isgood ( ls_errdzsc_bad , i ) )
189  {
190  ls_bad.push_back ( i );
191  continue;
192  }
193 
194  //check also that LS is not missing!!!
195  ls_good.push_back( i );
196  }
197 
198  std::ofstream outfile;
199  string namefile = "Certification_BS_run_" + runnum_str( filename ) + ".txt";
200  outfile.open(namefile.c_str());
201  outfile << "Lumibased BeamSpot Calibration Certification for run " << runnum_str( filename ) << ":" << endl << endl;
202 
203  char line[2000];
204  sprintf( line, " GOOD Lumisections (values within limits): %s" , ListOut( ls_good ).c_str() );
205  outfile << line << endl;
206 
207  if ( !ls_bad.empty() )
208  {
209  sprintf( line, " BAD Lumisections (values outside limits): %s" , ListOut( ls_bad ).c_str() );
210  outfile << line << endl;
211 
212  sprintf( line, " --- histogram name --- --- bad lumisection list(*) ---" );
213  outfile << line << endl;
214  sprintf( line, " hxLumibased PrimaryVertex-DataBase (mean): %s" , ListOut( ls_x_bad ).c_str() );
215  if ( !ls_x_bad.empty() ) outfile << line << endl;
216  sprintf( line, " hyLumibased PrimaryVertex-DataBase (mean): %s" , ListOut( ls_y_bad ).c_str() );
217  if ( !ls_y_bad.empty() ) outfile << line << endl;
218  sprintf( line, " hzLumibased PrimaryVertex-DataBase (mean): %s" , ListOut( ls_z_bad ).c_str() );
219  if ( !ls_z_bad.empty() ) outfile << line << endl;
220 
221  sprintf( line, " hsigmaXLumibased PrimaryVertex-DataBase fit (mean): %s" , ListOut( ls_dx_bad ).c_str() );
222  if ( !ls_dx_bad.empty() ) outfile << line << endl;
223  sprintf( line, " hsigmaYLumibased PrimaryVertex-DataBase fit (mean): %s" , ListOut( ls_dy_bad ).c_str() );
224  if ( !ls_dy_bad.empty() ) outfile << line << endl;
225  sprintf( line, " hsigmaZLumibased PrimaryVertex-DataBase fit (mean): %s" , ListOut( ls_dz_bad ).c_str() );
226  if ( !ls_dz_bad.empty() ) outfile << line << endl;
227 
228  sprintf( line, " hsigmaXLumibased PrimaryVertex-DataBase fit (error): %s" , ListOut( ls_errdx_bad ).c_str() );
229  if ( !ls_errdx_bad.empty() ) outfile << line << endl;
230  sprintf( line, " hsigmaYLumibased PrimaryVertex-DataBase fit (error): %s" , ListOut( ls_errdy_bad ).c_str() );
231  if ( !ls_errdy_bad.empty() ) outfile << line << endl;
232  sprintf( line, " hsigmaZLumibased PrimaryVertex-DataBase fit (error): %s" , ListOut( ls_errdz_bad ).c_str() );
233  if ( !ls_errdz_bad.empty() ) outfile << line << endl;
234 
235  sprintf( line, " (*) also bad in the corresponding 'Scalers-Database fit' histograms" );
236  outfile << line << endl;
237  }
238 
239  outfile.close();
240  std::cout << "Lumibased BeamSpot Calibration Certification summary saved in " << namefile << endl;
241 }
242 
243 void check_offset ( string filename , string iDir , string plot , float limit_min , float limit_max , vector <int>& badLS )
244 {
245  TH1F checkPlot;
246  if ( getplot ( filename , iDir , plot , checkPlot ) < 0 ) return;
247 
248 
249  //look at each LS, save the bad one
250  for ( int i = 1; i <= checkPlot.GetNbinsX() ; i++ )
251  {
252  float value = checkPlot.GetBinContent( i );
253  if ( value < limit_min || value > limit_max )
254  {
255  badLS.push_back( (int)checkPlot.GetBinCenter( i ) );
256  }
257  }
258 }
259 
260 
261 void check_sigma ( string filename , string iDir , string plot , float limit_err , vector <int>& badLS )
262 {
263  TH1F checkPlot;
264  if ( getplot ( filename , iDir , plot , checkPlot ) < 0 ) return;
265 
266  //look at each LS
267  for ( int i = 1; i <= checkPlot.GetNbinsX() ; i++ )
268  {
269  float value = checkPlot.GetBinError( i );
270  if ( value > limit_err )
271  {
272  badLS.push_back( (int)checkPlot.GetBinCenter( i ) );
273  }
274  }
275 
276 }
277 
278 bool check_isgood ( vector<int> & ls_badlist, int ls )
279 {
280  //check if this LS is found in the BAD list
281  for ( unsigned int i = 0; i < ls_badlist.size() ; i++ )
282  {
283  if ( ls == ls_badlist[i] ) return false;
284  }
285  return true;
286 }
287 
288 int nlumis( string filename )
289 {
290  if ( numlumis > -1 )
291  return numlumis;
292 
293  TFile* file = TFile::Open(filename.c_str());
294  if (!file->IsOpen()) {
295  cerr << "Failed to open " << filename << endl;
296  return -1;
297  }
298 
299  string run = runnum_str( filename );
300  string EventInfoDir = "DQMData/Run " + run + "/SiStrip/Run summary/EventInfo";
301  TDirectory *rsEventInfoDir = dynamic_cast<TDirectory*>( file->Get(EventInfoDir.c_str()));
302  rsEventInfoDir->cd();
303  TIter eiKeys(rsEventInfoDir->GetListOfKeys());
304  TKey *eiKey;
305  while ( (eiKey = dynamic_cast<TKey*>(eiKeys())) )
306  {
307  string classname(eiKey->GetClassName());
308  if (classname=="TObjString" )
309  {
310  string sflag = eiKey->GetName();
311  string tempname = sflag.substr(sflag.find("i=")+2);
312  size_t pos1 = tempname.find("<");
313  size_t pos2 = sflag.find_first_of(">");
314  string detvalue = tempname.substr(0,pos1);
315  string numlumisec = sflag.substr(1,pos2-1);
316  if ( numlumisec == (string)"iLumiSection" )
317  {
318  numlumis = atoi( detvalue.c_str() );
319  break;
320  }
321  }
322  }
323 
324  return numlumis;
325 }
326 
327 string runnum_str( string filename )
328 {
329  return filename.substr(filename.find("_R000")+5, 6);
330 }
331 
332 int getplot( string filename , string iDir , string strplot , TH1F& plot )
333 {
334  string run = runnum_str( filename );
335  if (debug) std::cout << filename.c_str() << endl;
336 
337  TFile* file = TFile::Open(filename.c_str());
338  if (!file->IsOpen()) {
339  cerr << "Failed to open " << filename << endl;
340  return -1;
341  }
342 
343  string dir = "DQMData/Run " + run + "/AlcaBeamMonitor/Run summary/" + iDir;
344 
345  file->cd( dir.c_str() );
346 
347  string theplot = strplot + ";1";
348  TH1F* thisplot;
349  gDirectory->GetObject ( theplot.c_str() , thisplot );
350 
351  if ( !thisplot )
352  {
353  std::cout << "Error: plot " << dir << "/" << theplot.c_str() << " not found!" << endl;
354  return -2;
355  }
356 
357  plot = *thisplot;
358  thisplot = nullptr;
359  delete thisplot;
360 
361  return 0;
362 }
363 
364 void Cleaning( vector<int> &LSlist)
365 {
366  if ( LSlist.empty() ) return;
367 
368  //cleaning: keep only 1st and last lumisection in the range
369  int refLS = LSlist[0];
370  for (unsigned int at = 1; at < LSlist.size() - 1; at++)
371  {
372  //delete LSnums in between a single continuous range
373  if ( refLS + 1 == LSlist[at] && LSlist[at] + 1 == LSlist[at+1] )
374  {
375  refLS = LSlist[at];
376  LSlist[at] = -1;
377  }
378  else
379  {
380  refLS = LSlist[at];
381  }
382  }
383 }
384 
385 string ListOut(vector<int> &LSlist)
386 {
387 
388  Cleaning( LSlist );
389 
390  string strout = "";
391  bool rangeset = false;
392  for (unsigned int at = 0; at < LSlist.size(); at++)
393  {
394  if ( LSlist[at] != -1 )
395  {
396  if ( at > 0 && LSlist[at-1] != -1 ) strout += ",";
397  stringstream lsnum;
398  lsnum << LSlist[at];
399  strout += lsnum.str();
400  rangeset = false;
401  }
402  if ( LSlist[at] == -1 && !rangeset )
403  {
404  strout += "-";
405  rangeset = true;
406  }
407  }
408 
409  return strout;
410 }
411 
412 void vector_AND ( vector<int> & bad_def, vector<int> bad_sc)
413 {
414  vector <int> temp;
415 
416  int def_size = bad_def.size();
417  for ( int i = 0; i < def_size; i++ )
418  for ( unsigned int j = 0; j < bad_sc.size(); j++ )
419  if ( bad_def[ i ] == bad_sc[ j ] )
420  {
421  temp.push_back( bad_def[ i ] );
422  break;
423  }
424 
425  bad_def = temp;
426 }
void lsbs_cert(string filename)
Definition: lsbs_cert.cc:52
void vector_AND(vector< int > &, vector< int >)
Definition: lsbs_cert.cc:412
int numlumis
Definition: lsbs_cert.cc:27
int nlumis(string filename)
Definition: lsbs_cert.cc:288
Definition: value.py:1
int getplot(string filename, string iDir, string strplot, TH1F &plot)
Definition: lsbs_cert.cc:332
void Cleaning(vector< int > &)
Definition: lsbs_cert.cc:364
string runnum_str(string filename)
Definition: lsbs_cert.cc:327
def ls(path, rec=False)
Definition: eostools.py:348
bool debug
Definition: lsbs_cert.cc:26
string ListOut(vector< int > &)
Definition: lsbs_cert.cc:385
int main(int argc, char *argv[])
Definition: lsbs_cert.cc:37
bool check_isgood(vector< int > &ls_badlist, int ls)
Definition: lsbs_cert.cc:278
dbl *** dir
Definition: mlp_gen.cc:35
void check_offset(string filename, string iDir, string plot, float limit_min, float limit_max, vector< int > &badLS)
Definition: lsbs_cert.cc:243
void check_sigma(string filename, string iDir, string plot, float limit_err, vector< int > &badLS)
Definition: lsbs_cert.cc:261