]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/Macros/AliTRDcheckConfig.C
Adding macros to create Calibration objects
[u/mrichter/AliRoot.git] / TRD / Macros / AliTRDcheckConfig.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 //===================================================================================
17 // This is a macro to analyze TRD/Calib/DCS OCDB objects either
18 // from the grid for a given run number or from a local object.
19 //
20 // Arguments:
21 // Either provide a run number as the first argument to access the 
22 // corresponding file on the grid
23 // or the path + filename as the second argument (and an arbitrary number as the first)
24 // to access a local file.
25 //
26 // Please note that leading zeros in the run number are not supported.
27 //
28 // Examples:
29 // .x AliTRDcheckConfig.C (60111)
30 // .x AliTRDcheckConfig.C (0, "$ALICE_ROOT/TRD/Calib/DCS/Run0_999999999_v0_s0.root")
31 //
32 // Original author:
33 //      Frederick Kramer
34 // Current maintainer:
35 //      Hans Beck
36 //===================================================================================
37
38 // Make the macro compile.
39 #if !defined(__CINT__) || defined(__MAKECINT__)
40 // Compile me in aliroot with .L AliTRDcheckConfig.C+ or with
41 // clang -lXMLParser -lGui -lProof -lRAWDatabase -lVMC -lMinuit -lSTEERbase -lANALYSIS -lSTEER -lESD -L$ALICE_BUILD/lib/tgt_`root-config --arch` -lTRDbase -lCDB -lstdc++ `root-config --libs` -I`root-config --incdir` -I$ALICE_ROOT/include AliTRDcheckConfig.C
42 #include <iostream>
43 #include <fstream>
44 #include <TMath.h>
45 #include <TFile.h>
46 #include <TGrid.h>
47 #include <TEnv.h>
48 #include "../../STEER/CDB/AliCDBEntry.h"
49 #include "../../STEER/CDB/AliCDBManager.h"
50 #include "../Cal/AliTRDCalDCS.h"
51 #include "../Cal/AliTRDCalDCSv2.h"
52 #include "../Cal/AliTRDCalDCSFEE.h"
53 #include "../Cal/AliTRDCalDCSFEEv2.h"
54
55 // Not sure where to put it?
56 using namespace std;
57 #endif
58
59 const Int_t nROC = 540;
60 const Int_t nROB = 8;
61 const Int_t nMCM = 18;
62 const Int_t cArraySize = 1000;
63
64 Bool_t errors;
65 Int_t  calVer;
66 //______________________________________________________________________
67 Int_t AnalyzeArray(Int_t states[cArraySize], Int_t occur[cArraySize]) {
68   Int_t srtIndx[cArraySize] = {0};
69   
70   TMath::Sort(cArraySize, occur, srtIndx);
71
72   Int_t totalSum = 0, subSum = 0, iIndex = 0;
73   for (Int_t i=0; i<cArraySize; i++) totalSum += occur[i];
74   
75   cout << "    The majority ("<< occur[srtIndx[0]] << " of " 
76        << totalSum <<") is: " << states[srtIndx[0]] << endl;
77   subSum = occur[srtIndx[0]];
78   while (totalSum != subSum) {
79     if (++iIndex > 999) {
80       cout << "E : out of bounds." << endl;
81       break;
82     }
83     Printf("    Next: %7d (%d)", states[srtIndx[iIndex]], occur[srtIndx[iIndex]]);
84     subSum += occur[srtIndx[iIndex]];
85   }
86   return states[srtIndx[0]];
87 }
88 //______________________________________________________________________
89 void FillItemInArray(Int_t states[cArraySize], Int_t occur[cArraySize], Int_t item, Bool_t allowNeg) {
90   for (Int_t iArrPos=0; iArrPos<cArraySize; iArrPos++) {
91     // if allowNeg is set then we change the number indicating that the item ws not set from -1 to -100
92     // so that small negative numbers can be sorted too
93     if ((allowNeg && item == -100000) || (!allowNeg && item == -1)) break; // value not set
94     if (states[iArrPos] == item) {
95       occur[iArrPos]++;
96       break;
97     } else if (occur[iArrPos] == 0) {
98       states[iArrPos] = item;
99       occur[iArrPos]++;
100       break;
101     }
102   }
103 }
104 //______________________________________________________________________
105 void GetMajoritys(TObject* calDCSObj) {
106   
107   // Initializes full array with zeros
108   Int_t gsmStates[cArraySize] = {0}, gsmOccur[cArraySize] = {0};
109   Int_t nimStates[cArraySize] = {0}, nimOccur[cArraySize] = {0};
110   Int_t nevStates[cArraySize] = {0}, nevOccur[cArraySize] = {0};
111   Int_t nptStates[cArraySize] = {0}, nptOccur[cArraySize] = {0};
112   
113
114   { // Scoped declaration
115     Int_t feeArrSiz = 0;
116     if (calVer == 1) {
117       if(((AliTRDCalDCS*)calDCSObj)->GetFEEArr())
118         feeArrSiz = ((AliTRDCalDCS*)calDCSObj)->GetFEEArr()->GetSize();
119     }
120     else if (calVer == 2) {
121       if(((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr())
122         feeArrSiz = ((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr()->GetSize();
123     }
124
125     TObject* idcsfee;
126     for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {
127       if (calVer == 1) idcsfee = ((AliTRDCalDCS*)calDCSObj)->GetCalDCSFEEObj(i);
128       else if (calVer == 2) idcsfee = ((AliTRDCalDCSv2*)calDCSObj)->GetCalDCSFEEObj(i);
129       
130       if (idcsfee == NULL) continue;
131       
132       Int_t sbit(-9999);
133       if (calVer == 1) sbit = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();
134       else if (calVer == 2) sbit = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();
135       if (sbit != 0) continue;
136       
137       for (Int_t j=0; j<nROB; j++) {
138         for (Int_t k=0; k<nMCM; k++) {
139           Int_t igsm = 0;
140           Int_t inim = 0;
141           Int_t inev = 0;
142           Int_t inpt = 0;
143           if (calVer == 1) {
144             igsm = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMGlobalState(j,k);
145             inim = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMStateNI(j,k);
146             inev = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMEventCnt(j,k);
147             inpt = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMPtCnt(j,k);
148           }
149           else if (calVer == 2) {
150             igsm = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMGlobalState(j,k);
151             inim = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMStateNI(j,k);
152             inev = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMEventCnt(j,k);
153             inpt = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMPtCnt(j,k);
154           }
155
156           FillItemInArray(gsmStates, gsmOccur, igsm, false); 
157           FillItemInArray(nimStates, nimOccur, inim, false); 
158           FillItemInArray(nevStates, nevOccur, inev, false); 
159           FillItemInArray(nptStates, nptOccur, inpt, false); 
160         } // End of loop over MCMs
161       } // End of loop over ROBs
162     } // End of loop over ROCs
163   } // End of scoped declaration
164     
165   cout << "I : Global MCM state statistics:" << endl;
166   AnalyzeArray(gsmStates, gsmOccur);
167   cout << "I : Network interface state statistics:" << endl;
168   AnalyzeArray(nimStates, nimOccur);
169   cout << "I : MCM Event counter reading statistics:" << endl;
170   AnalyzeArray(nevStates, nevOccur);
171   cout << "I : MCM PreTrigger counter reading statistics:" << endl;
172   AnalyzeArray(nptStates, nptOccur);
173   
174   return;
175 }
176 //______________________________________________________________________
177 void GetMajorityDifferences(TObject* calDCSObj, TObject* calDCSObj2) {
178   
179   // Initializes full array with zeros
180   Int_t gsmStates[cArraySize] = {0}, gsmOccur[cArraySize] = {0};
181   Int_t nimStates[cArraySize] = {0}, nimOccur[cArraySize] = {0};
182   Int_t nevStates[cArraySize] = {0}, nevOccur[cArraySize] = {0};
183   Int_t nptStates[cArraySize] = {0}, nptOccur[cArraySize] = {0};
184   
185   
186   {  // Scoped declaration
187     Int_t feeArrSiz1 = 0;
188     Int_t feeArrSiz2 = 0;
189     if (calVer == 1) {
190       if(((AliTRDCalDCS*)calDCSObj)->GetFEEArr())
191         feeArrSiz1 = ((AliTRDCalDCS*)calDCSObj)->GetFEEArr()->GetSize();
192       if(((AliTRDCalDCS*)calDCSObj2)->GetFEEArr())
193         feeArrSiz2 = ((AliTRDCalDCS*)calDCSObj2)->GetFEEArr()->GetSize();
194     }
195     else if (calVer == 2) {
196       if(((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr())
197         feeArrSiz1 = ((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr()->GetSize();
198       if(((AliTRDCalDCSv2*)calDCSObj2)->GetFEEArr())
199         feeArrSiz2 = ((AliTRDCalDCSv2*)calDCSObj2)->GetFEEArr()->GetSize();
200     }
201
202     TObject* idcsfee;
203     TObject* idcsfee2;
204     for (Int_t i=0; i<nROC && i<feeArrSiz1 && i<feeArrSiz2; i++) {
205       if (calVer == 1) {
206         idcsfee  = ((AliTRDCalDCS*)calDCSObj)->GetCalDCSFEEObj(i);
207         idcsfee2 = ((AliTRDCalDCS*)calDCSObj2)->GetCalDCSFEEObj(i);
208       }
209       else if (calVer == 2) {
210         idcsfee  = ((AliTRDCalDCSv2*)calDCSObj)->GetCalDCSFEEObj(i);
211         idcsfee2 = ((AliTRDCalDCSv2*)calDCSObj2)->GetCalDCSFEEObj(i);
212       }
213       if ((idcsfee == NULL) || (idcsfee2 == NULL)) continue;
214       
215       Int_t sbit(-9999);
216       if (calVer == 1) sbit = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();
217       else if (calVer == 2) sbit = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();
218       if (sbit != 0) continue;
219       
220       for (Int_t j=0; j<nROB; j++) {
221         for (Int_t k=0; k<nMCM; k++) {
222           Int_t igsm, inim, inev, inpt, igsm1, inim1, inev1, inpt1, igsm2, inim2, inev2, inpt2;
223           if (calVer == 1) {
224             igsm1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMGlobalState(j,k);
225             inim1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMStateNI(j,k);
226             inev1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMEventCnt(j,k);
227             inpt1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMPtCnt(j,k);
228             igsm2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMGlobalState(j,k);
229             inim2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMStateNI(j,k);
230             inev2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMEventCnt(j,k);
231             inpt2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMPtCnt(j,k);
232           }
233           else if (calVer == 2) {
234             igsm1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMGlobalState(j,k);
235             inim1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMStateNI(j,k);
236             inev1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMEventCnt(j,k);
237             inpt1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMPtCnt(j,k);
238             igsm2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMGlobalState(j,k);
239             inim2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMStateNI(j,k);
240             inev2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMEventCnt(j,k);
241             inpt2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMPtCnt(j,k);
242           }
243           
244           igsm = igsm1 - igsm2;
245           inim = inim1 - inim2;
246           inev = inev2 - inev1;
247           inpt = inpt2 - inpt1;
248           
249           // if they were set to -1, it means they were not actauuly set
250           // change -1 to -100 to mean they werent set since the above 
251           // can give negatives
252           if (igsm1 == -1 && igsm == 0) igsm =-100000;
253           if (inim1 == -1 && inim == 0) inim =-100000;
254           if (inev1 == -1 && inev == 0) inev =-100000;
255           if (inpt1 == -1 && inpt == 0) inpt =-100000;
256           
257           FillItemInArray(gsmStates, gsmOccur, igsm, true); 
258           FillItemInArray(nimStates, nimOccur, inim, true); 
259           FillItemInArray(nevStates, nevOccur, inev, true); 
260           FillItemInArray(nptStates, nptOccur, inpt, true); 
261         } // End of loop over MCMs
262       } // End of loop over ROBs
263     } // End of loop over ROCs
264   } // End of scoped declaration
265   
266   cout << "I : Global MCM state difference statistics:" << endl;
267   AnalyzeArray(gsmStates, gsmOccur);
268   cout << "I : Network interface state difference statistics:" << endl;
269   AnalyzeArray(nimStates, nimOccur);
270   cout << "I : MCM Event counter difference statistics:" << endl;
271   if (AnalyzeArray(nevStates, nevOccur) < 1) {
272     cout << "E : There should have been some events recorded, but there weren't" << endl;
273     errors = true;
274   }
275   cout << "I : MCM PreTrigger counter difference statistics:" << endl;
276   if (AnalyzeArray(nptStates, nptOccur) < 1) {
277     cout << "E : There should have been some events recorded, but there weren't" << endl;
278     errors = true;
279   }
280   
281   return;
282 }
283 //______________________________________________________________________
284 void WrappedAliTRDcheckConfig(Int_t runNr, const char *pathfile,TFile *f){
285   // Reset the 'errors occured' bool as it's global
286   errors=false;
287   
288   AliCDBEntry *entry=0;
289   TString pathfilets(pathfile);
290
291   // get the source
292   if(pathfilets.Contains("nopathgiven")) {
293     cout << "I : Accessing grid storage for run number " << runNr << endl;
294     cout << "I : Get CDBManager instance." << endl;
295     AliCDBManager *man = AliCDBManager::Instance();
296     cout << "I : SetDefaultStorage." << endl;
297     man->SetDefaultStorageFromRun(runNr);
298
299     cout << "I : Get OCDB Entry." << endl;
300     entry = man->Get("TRD/Calib/DCS", runNr);
301     if (entry == NULL) {
302       cout << endl << "ERROR: Unable to get the AliTRDCalDCS object"
303            << "from the OCDB for run number " << runNr << "." << endl;
304       return;
305     }
306   } else {
307     cout << "I : Accessing file directly" << endl;
308     // Might be we want to check a file on the grid
309     if(pathfilets.BeginsWith("alien://"))
310       TGrid::Connect("alien://");
311     f = TFile::Open(pathfile);
312     if(f != NULL) {
313       entry = (AliCDBEntry*) f->Get("AliCDBEntry");
314       if(!entry){
315         cout << "E : Can not get the OCDB entry"<<endl;
316         return;
317       }
318     }
319     else {
320       cout << "E : Cannot open file" << endl;
321       return;
322     }
323   }
324   
325   TObjArray *objArrayCDB = (TObjArray*)entry->GetObject();
326   if(!objArrayCDB){
327     cout << "E : Can not get the OCDB object"<<endl;
328     return;
329   }
330   
331   Int_t iesor=0;
332   for (iesor=0; iesor<3; iesor++) if(objArrayCDB->At(iesor)) break;
333   if (iesor > 1) {
334     cout << "E : Neither the start or end of run objects were in the root file.";
335     return;
336   }
337
338   Bool_t hasSOR = (objArrayCDB->At(0));
339   Bool_t hasEOR = (objArrayCDB->At(1));
340   printf("SOR entry: %d, EOR entry: %d\n", hasSOR, hasEOR);
341
342   if (!strcmp(objArrayCDB->At(iesor)->ClassName(),"AliTRDCalDCS"))   calVer = 1;
343   else if (!strcmp(objArrayCDB->At(iesor)->ClassName(),"AliTRDCalDCSv2")) calVer = 2;
344   else {  
345     cout << "E : Object types undefined.";
346     return;
347   }
348
349   Bool_t sorandeor = true;
350   TObject *caldcs  = objArrayCDB->At(0);
351   TObject *caldcs2 = objArrayCDB->At(1);
352
353   if (caldcs == NULL && caldcs2 == NULL) {
354     cout << "E : Neither the start or end of run objects were in the root file.";
355     return;
356   } else if (caldcs != NULL && caldcs2 == NULL) {
357     cout << "E : The EOR file was not in the root file.";
358     errors = true;
359     sorandeor = false;
360   } else if (caldcs == NULL && caldcs2 != NULL) {
361     cout << "E : The SOR file was not in the root file.";
362     errors = true;
363     sorandeor = false;
364     caldcs = caldcs2;
365   }
366
367   cout << endl << "============ Non responding ROC Summary: ============" << endl;
368   TString bitfivestr = " ROCs with status bit 5. These havn't responded to communication\nattempts over DIM. Most probably they just were off this is ok.\n    DCS IDs: ";
369   Int_t lengthfive = bitfivestr.Length();
370   TString bitfourstr = " ROCs with status bit 4! BAD! This might be due to a communication problem between fxsproxy and the feeserver(s) \n    DCS IDs: ";
371   Int_t lengthfour = bitfourstr.Length();
372   TString bitthreestr = " ROCs with status bit 3! BAD! data from fee server was old or corrupt.\n    DCS IDs: ";
373   Int_t lengththree = bitthreestr.Length();
374   TString bittwostr = " ROCs with status bit 2. These have been in states in which they cannot be read out, e.g. Standby.\n    DCS IDs: ";
375   Int_t lengthtwo = bittwostr.Length();
376   TString bitonestr = " ROCs with status bit 1! BAD! This means the chamber(s) didn't respont even though is should have been in a good state.\n    DCS IDs: ";
377   Int_t lengthone = bitonestr.Length();
378
379
380   Int_t nSB1=0, nSB2=0, nSB3=0, nSB4=0, nSB5=0, nTot=0, nChanged=0;
381   { // Scoped declaration
382
383     // Determine the size of the array
384     Int_t feeArrSiz = 0;
385     if (calVer == 1) {
386       if(((AliTRDCalDCS*)caldcs)->GetFEEArr())
387         feeArrSiz = ((AliTRDCalDCS*)caldcs)->GetFEEArr()->GetSize();
388     }
389     else if (calVer == 2) {
390       if(((AliTRDCalDCSv2*)caldcs)->GetFEEArr())
391         feeArrSiz = ((AliTRDCalDCSv2*)caldcs)->GetFEEArr()->GetSize();
392     }
393
394     // Check the status/error bist for each ROC
395     TObject* idcsfee;
396     TObject* idcsfee2;
397     // Loop over the ROCs / the array
398     for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {
399       if (calVer == 1) idcsfee = ((AliTRDCalDCS*)caldcs)->GetCalDCSFEEObj(i);
400       else if (calVer == 2) idcsfee = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(i);
401       if (idcsfee != NULL) {
402         Int_t sb;
403         if (calVer == 1) sb = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();
404         else if (calVer == 2) sb = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();
405         if (sb == 5) { bitfivestr  += i; bitfivestr  += "  "; nSB5++; }
406         else if (sb == 4) { bitfourstr  += i; bitfourstr  += "  "; nSB4++; errors = true; }
407         else if (sb == 3) { bitthreestr += i; bitthreestr += "  "; nSB3++; errors = true; }
408         else if (sb == 2) { bittwostr   += i; bittwostr   += "  "; nSB2++; }
409         else if (sb == 1) { bitonestr   += i; bitonestr   += "  "; nSB1++; errors = true; }
410         nTot += 1;
411       }
412     } // End of loop over ROCs
413
414     // Print the statistcs for the status/error bits
415     if (lengthfive < bitfivestr.Length()) cout << nSB5 << bitfivestr.Data() << endl << endl;
416     if (lengthfour < bitfourstr.Length()) cout << nSB4 << bitfourstr.Data() << endl << endl;
417     if (lengththree < bitthreestr.Length()) cout << nSB3 << bitthreestr.Data() << endl << endl;
418     if (lengthtwo < bittwostr.Length()) cout << nSB2 << bittwostr.Data() << endl << endl;
419     if (lengthone < bitonestr.Length()) cout << nSB1 << bitonestr.Data() << endl << endl;
420     
421     cout << "The remaining " << nTot-(nSB1+nSB2+nSB3+nSB4+nSB5) << " ROCs responded correctly in the start of run."<<endl;
422     
423     // Reusing nTot
424     nTot=0;
425     for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {
426       if (calVer == 1) {
427         if (caldcs)  idcsfee  = ((AliTRDCalDCS*)caldcs)->GetCalDCSFEEObj(i);
428         if (caldcs2) idcsfee2 = ((AliTRDCalDCS*)caldcs2)->GetCalDCSFEEObj(i);
429       }
430       else if (calVer == 2) {
431         if (caldcs)  idcsfee  = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(i);
432         if (caldcs2) idcsfee2 = ((AliTRDCalDCSv2*)caldcs2)->GetCalDCSFEEObj(i);
433       }
434       if (idcsfee != NULL && idcsfee2 != NULL) {
435         Int_t sbd1 = 0;
436         Int_t sbd2 = 0;
437         if (calVer == 1) {
438           sbd1 = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();
439           sbd2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetStatusBit();
440         }
441         if (calVer == 2) {
442           sbd1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();
443           sbd2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetStatusBit();
444         }
445         Int_t sbd = sbd1 - sbd2;
446         if (sbd != 0) { 
447           cout << "ROC " << i << " changed from state " << sbd1 << " at start of the run to "  << sbd2 << " at the end of the run." << endl;
448           cout << "ROC " << i << " changed from state " << sbd1 << " at start of the run to "  << sbd2 << " at the end of the run." << endl;
449           nChanged++; 
450         }
451         nTot += 1;
452       }
453     } // End of loop over ROCs
454   } // End of scoped declaration
455   if (nChanged == 0) {
456     cout << "No ROCs changed state between the start and end of the run" << endl;
457   } else {
458     cout << "E : " << nChanged << " out of " << nTot << " ROCs changed state during the run" << endl;
459     errors = true; 
460   }
461
462   cout << endl << "============ Statistics from RSTATE: ============" << endl;
463   cout<<"I : The majority entry is given as well as all other values," << endl;
464   cout<<"    sorted according to their occurrence." << endl << endl;
465   GetMajoritys(caldcs);
466   if (sorandeor) GetMajorityDifferences(caldcs,caldcs2);
467
468   cout << endl << "============ Global Configuraton: ============" << endl;
469   cout<<"I : Anything not listed is not set, mixed numbers are indicated with a" << endl;
470   cout<<"    value of -2 and strings are set to 'mixed' if they're mixed." << endl << endl;
471  
472   Int_t   gtb, gct, gsh, gtc, gsz, gfw, gfs, gfl, gsn;
473   TString gcv, gcn, gft, grp, gtp, gtm, gtd, gts, gao;
474
475   if (calVer == 1) {
476     gtb = ((AliTRDCalDCS*)caldcs)->GetGlobalNumberOfTimeBins();
477     gct = ((AliTRDCalDCS*)caldcs)->GetGlobalConfigTag();
478     gsh = ((AliTRDCalDCS*)caldcs)->GetGlobalSingleHitThres();
479     gtc = ((AliTRDCalDCS*)caldcs)->GetGlobalThreePadClustThres();
480     gsz = ((AliTRDCalDCS*)caldcs)->GetGlobalSelectiveNoZS();
481     gfw = ((AliTRDCalDCS*)caldcs)->GetGlobalTCFilterWeight();
482     gfs = ((AliTRDCalDCS*)caldcs)->GetGlobalTCFilterShortDecPar();
483     gfl = ((AliTRDCalDCS*)caldcs)->GetGlobalTCFilterLongDecPar();
484     gsn = ((AliTRDCalDCS*)caldcs)->GetGlobalModeFastStatNoise();
485     gcv = ((AliTRDCalDCS*)caldcs)->GetGlobalConfigVersion();
486     gcn = ((AliTRDCalDCS*)caldcs)->GetGlobalConfigName();
487     gft = ((AliTRDCalDCS*)caldcs)->GetGlobalFilterType();
488     grp = ((AliTRDCalDCS*)caldcs)->GetGlobalReadoutParam();
489     gtp = ((AliTRDCalDCS*)caldcs)->GetGlobalTestPattern();
490     gtm = ((AliTRDCalDCS*)caldcs)->GetGlobalTrackletMode();
491     gtd = ((AliTRDCalDCS*)caldcs)->GetGlobalTrackletDef();
492     gts = ((AliTRDCalDCS*)caldcs)->GetGlobalTriggerSetup();
493     gao = ((AliTRDCalDCS*)caldcs)->GetGlobalAddOptions();
494   }
495   else if (calVer == 2) {
496     gtb = ((AliTRDCalDCSv2*)caldcs)->GetGlobalNumberOfTimeBins();
497     gct = ((AliTRDCalDCSv2*)caldcs)->GetGlobalConfigTag();
498     gsh = ((AliTRDCalDCSv2*)caldcs)->GetGlobalSingleHitThres();
499     gtc = ((AliTRDCalDCSv2*)caldcs)->GetGlobalThreePadClustThres();
500     gsz = ((AliTRDCalDCSv2*)caldcs)->GetGlobalSelectiveNoZS();
501     gfw = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTCFilterWeight();
502     gfs = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTCFilterShortDecPar();
503     gfl = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTCFilterLongDecPar();
504     gsn = ((AliTRDCalDCSv2*)caldcs)->GetGlobalModeFastStatNoise();
505     gcv = ((AliTRDCalDCSv2*)caldcs)->GetGlobalConfigVersion();
506     gcn = ((AliTRDCalDCSv2*)caldcs)->GetGlobalConfigName();
507     gft = ((AliTRDCalDCSv2*)caldcs)->GetGlobalFilterType();
508     grp = ((AliTRDCalDCSv2*)caldcs)->GetGlobalReadoutParam();
509     gtp = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTestPattern();
510     gtm = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTrackletMode();
511     gtd = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTrackletDef();
512     gts = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTriggerSetup();
513     gao = ((AliTRDCalDCSv2*)caldcs)->GetGlobalAddOptions();
514   }
515
516
517   if (gtb != -1) cout<<"Global number of time bins.........................: "<< gtb << endl;
518   if (gct != -1) cout<<"Global configuration tag...........................: "<< gct << endl;
519   if (gsh != -1) cout<<"Global single hit threshold........................: "<< gsh << endl;
520   if (gtc != -1) cout<<"Global three pad cluster threshold.................: "<< gtc << endl;
521   if (gsz != -1) cout<<"Global selective ZS (every i'th event).............: "<< gsz << endl;
522   if (gfw != -1) cout<<"Global tail cancellation filter weight.............: "<< gfs << endl;
523   if (gfs != -1) cout<<"Global tail cancellat. filter short decay parameter: "<< gfs << endl;
524   if (gfl != -1) cout<<"Global tail cancellation filt. long decay parameter: "<< gfl << endl;
525   if (gsn != -1) cout<<"Global fast statistics mode?.......................: "<< gsn << endl;
526   if (gcv != "") cout<<"Global configuration tag version...................: "<< gcv << endl;
527   if (gcn != "") cout<<"Global configuration tag name......................: "<< gcn << endl;
528   if (gft != "") cout<<"Global filter type.................................: "<< gft << endl;
529   if (grp != "") cout<<"Global readout parameter...........................: "<< grp << endl;
530   if (gtp != "") cout<<"Global test pattern................................: "<< gtp << endl;
531   if (gtm != "") cout<<"Global tracklet mode...............................: "<< gtm << endl;
532   if (gtd != "") cout<<"Global tracklet definition.........................: "<< gtd << endl;
533   if (gts != "") cout<<"Global trigger setup...............................: "<< gts << endl;
534   if (gao != "") cout<<"Global additional options..........................: "<< gao << endl;
535   
536   cout << endl << "============ Error Summary: ============" << endl;
537   if (errors) {
538     cout<<"    I noticed some errors, please see above for the specifics." << endl;
539   } else {
540     cout<<"    I didn't notice any errors, but that doesn't mean there weren't any!" << endl;
541   }
542 //______________________________________________________________________
543 }
544 void AliTRDcheckConfig(Int_t runNr=0, const char *pathfile="nopathgiven"){
545   // Wrapping the function to be able to clean up
546   TFile *f=0;
547   WrappedAliTRDcheckConfig(runNr,pathfile,f);
548   AliCDBManager::Destroy();
549   if(f){
550     delete f; // Destructor calls TFile::Close()
551     f=0;
552   }
553 }
554 //______________________________________________________________________
555 //
556 // The stuff below is only for compiling a standalone program,
557 // i.e., without root / aliroot 
558 //
559 #if !defined(__CINT__)
560 //______________________________________________________________________
561 void reduceTimeOuts(){
562   // Reduces the grid timeouts
563   gEnv->SetValue("XNet.ConnectTimeout"    , 20);
564   gEnv->SetValue("XNet.RequestTimeout"    , 40);
565   gEnv->SetValue("XNet.MaxRedirectCount"  ,  2);
566   gEnv->SetValue("XNet.ReconnectWait"     ,  2);
567   gEnv->SetValue("XNet.FirstConnectMaxCnt",  3);
568   gEnv->SetValue("XNet.TransactionTimeout",300);
569 }
570 //______________________________________________________________________
571 void printHelp(const char* argv0){
572   cout <<"Usuage: "<<argv0<< " [arg1 [arg2]]"<<endl
573        <<"Where arg1 can be:"<<endl
574        <<"  of type int-> gets treated as run number"<<endl
575        <<"  *.txt      -> gets treated as list of run numbers"<<endl
576        <<"  *.root     -> gets treated as OCDB entry"<<endl
577        <<"  -h,--help  -> displays this help"<<endl
578        <<"and arg2 can be"<<endl
579        <<"  -f, --fast   -> reduces grid timeouts"<<endl;
580 }
581 //______________________________________________________________________
582 int main(int argc,char** argv){
583   // This macro is a standalone program.
584   
585   // We change the meaning of the input 
586   // parameters a bit. See the help message
587
588   // Error if too many arguments
589   if(argc>3){
590     cout << "Too many arguments!"<<endl;
591     printHelp(argv[0]);
592     return 1;
593   }
594
595   // Check the argument two if any
596   if(argc>2){
597     if( (!strcmp("-f",argv[2])) ||
598         (!strcmp("--fast",argv[2])) ){
599       reduceTimeOuts();
600     }
601     else {
602       cout <<"Couldn't recognize your argument "
603            <<argv[2]<<endl;
604       printHelp(argv[0]);
605       return 1;
606     }
607   }
608
609   // Check argument one
610   if(argc>1){
611     // Convert to TString for easier handling
612     TString input(argv[1]);
613     // Help message
614     if( (!strcmp("-h",argv[1])) ||
615         (!strcmp("--help",argv[1])) ) {
616       printHelp(argv[0]);
617       return 0;
618     }
619     // int aka run number provided
620     else if(input.IsDigit()){
621       AliTRDcheckConfig(input.Atoi());
622       return 0;
623     }
624     // .root aka OCDB file provided
625     else if(input.EndsWith(".root")){
626       AliTRDcheckConfig(0,input.Data());
627       return 0;
628     }
629     // .txt aka list of root files provided
630     else if(input.EndsWith(".txt")){
631       // Open the text file
632       ifstream in;
633       in.open(Form("%s",input.Data()));
634       if (!in.is_open()){
635         cout << "F: Could not open file "<<input.Data()<<endl;
636         return 1;
637       }
638       // Loop over entries
639       string line;
640       TString Line;
641       while(in.good()) {
642         // Reading the line in the .txt file works fine
643         if(!getline(in,line)) break;
644         Line=line.data();
645         if(Line.IsNull()) continue;
646         // Run number provided
647         if(Line.IsDigit()){
648           AliTRDcheckConfig(Line.Atoi());
649         }
650         // .root file provided
651         else if(Line.EndsWith(".root")){
652           AliTRDcheckConfig(0,Line.Data());
653         }
654         else {
655           cout <<"Bad line in .txt file: "
656                <<Line.Data()<<endl;
657         }
658       } // End of loop over .txt file lines
659       return 0;
660     }
661     // Bad input, neither .root nor .txt nor int
662     else {
663       cout <<"Cannot recognize your input"
664            <<input.Data()<<endl;
665       printHelp(argv[0]);
666       return 1;
667     }
668   } // End of argc>1
669   
670   // Without arguments
671   AliTRDcheckConfig();
672   return 0;
673 }// End of main
674
675 // End of the non-root part
676 #endif