]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/Macros/AliTRDcheckConfig.C
New class AliTriggerUtils to solve the cirular dependency between libESD and libSTEER...
[u/mrichter/AliRoot.git] / TRD / Macros / AliTRDcheckConfig.C
1 //===================================================================================
2 // This is a macro to analyze TRD/Calib/DCS OCDB objects either
3 // from the grid for a given run number or from a local object.
4 // If you want to analyze data from the grid, please don't forget to
5 // have a valid alien token initialized and the file /tmp/gclient_env_$UID source'd.
6 //
7 // Arguments:
8 // The first argument is the runnumber (this is ignored in case of a local file),
9 // the second is a string that needs to contain either "grid" or "local". Further
10 // you can add either verbose or quiet to that string. If you don't, you'll be asked
11 // for all stuff individually wether you want to see it or not
12 // the thrid argument is the number of the ROC you (eventually) want to dump its data
13 // member of.
14 // The fourth one is the path and name of the local file you might want to look at.
15 //
16 // So the simplest way to use this macro is if you want to check the output of a given
17 // run from the OCDB:
18 // .x AliTRDcheckConfigv2.C(60111)
19 //
20 // An example for quickly checking a local file:
21 // .x AliTRDcheckConfigv2.C(0, "local quiet", 533, "$ALICE_ROOT/TRD/Calib/DCS/Run0_999999999_v0_s0.root")
22 //
23 // Please contact Frederick Kramer in case of problems
24 //===================================================================================
25
26 // This is the path one needs to change if the year is no longer 2009 
27 // and the runnumber cannot be found
28 //TString alienOcdbPath("alien://folder=/alice/data/2009/OCDB/");
29 TString alienOcdbPath("alien://folder=/alice/data/2010/OCDB/");
30
31 // Do not make changes below here unless you know what your doing
32
33 const Int_t nROC = 540;
34 const Int_t nROB = 8;
35 const Int_t nMCM = 18;
36 const Int_t cArraySize = 1000;
37
38 Bool_t errors = false;
39 Int_t  calVer = 0;
40
41 Int_t AnalyzeArray(Int_t states[cArraySize], Int_t occur[cArraySize]) {
42   long long srtIndx[cArraySize] = 0;
43   
44   TMath::Sort(cArraySize, occur, srtIndx);
45
46   Int_t totalSum = 0, subSum = 0, iIndex = 0;
47   for (Int_t i=0; i<cArraySize; i++) totalSum += occur[i];
48   
49   cout << "    The majority ("<< occur[srtIndx[0]] << " of " 
50        << totalSum <<") is: " << states[srtIndx[0]] << endl;
51   subSum = occur[srtIndx[0]];
52   while (totalSum != subSum) {
53     if (++iIndex > 999) {
54       cout << "E : out of bounds." << endl;
55       break;
56     }
57     Printf("    Next: %7d (%d)", states[srtIndx[iIndex]], occur[srtIndx[iIndex]]);
58     subSum += occur[srtIndx[iIndex]];
59   }
60   return states[srtIndx[0]];
61 }
62
63
64
65 void FillItemInArray(Int_t states[cArraySize], Int_t occur[cArraySize], Int_t item, Bool_t allowNeg) {
66   for (Int_t iArrPos=0; iArrPos<cArraySize; iArrPos++) {
67     // if allowNeg is set then we change the number indicating that the item ws not set from -1 to -100
68     // so that small negitive numbers can be sorted too
69     if ((allowNeg && item == -100000) || (!allowNeg && item == -1)) break; // value not set
70     if (states[iArrPos] == item) {
71       occur[iArrPos]++;
72       break;
73     } else if (occur[iArrPos] == 0) {
74       states[iArrPos] = item;
75       occur[iArrPos]++;
76       break;
77     }
78   }
79 }
80
81 void GetMajoritys(TObject* calDCSObj) {
82   
83   Int_t gsmStates[cArraySize] = {0}, gsmOccur[cArraySize] = {0};
84   Int_t nimStates[cArraySize] = {0}, nimOccur[cArraySize] = {0};
85   Int_t nevStates[cArraySize] = {0}, nevOccur[cArraySize] = {0};
86   Int_t nptStates[cArraySize] = {0}, nptOccur[cArraySize] = {0};
87   
88   for (Int_t i=0; i<cArraySize; i++) {
89     gsmStates[i] = 0; gsmOccur[i]  = 0;
90     nimStates[i] = 0; nimOccur[i]  = 0;
91     nevStates[i] = 0; nevOccur[i]  = 0;
92     nptStates[i] = 0; nptOccur[i]  = 0;  
93   }
94   
95
96   Int_t feeArrSiz = 0;
97   if (calVer == 1) feeArrSiz = ((AliTRDCalDCS*)calDCSObj)->GetFEEArr()->GetSize();
98   if (calVer == 2) feeArrSiz = ((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr()->GetSize();
99
100   for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {
101     TObject* idcsfee;
102     if (calVer == 1) idcsfee = ((AliTRDCalDCS*)calDCSObj)->GetCalDCSFEEObj(i);
103     if (calVer == 2) idcsfee = ((AliTRDCalDCSv2*)calDCSObj)->GetCalDCSFEEObj(i);
104
105     if (idcsfee == NULL) continue;
106
107     Int_t sbit = 0;
108     if (calVer == 1) ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();
109     if (calVer == 2) ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();
110
111     if (sbit != 0) continue;
112
113     for (Int_t j=0; j<nROB; j++) {
114       for (Int_t k=0; k<nMCM; k++) {
115         Int_t igsm = 0;
116         Int_t inim = 0;
117         Int_t inev = 0;
118         Int_t inpt = 0;
119         if (calVer == 1) {
120           igsm = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMGlobalState(j,k);
121           inim = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMStateNI(j,k);
122           inev = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMEventCnt(j,k);
123           inpt = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMPtCnt(j,k);
124         }
125         if (calVer == 2) {
126           igsm = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMGlobalState(j,k);
127           inim = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMStateNI(j,k);
128           inev = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMEventCnt(j,k);
129           inpt = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMPtCnt(j,k);
130         }
131         
132         FillItemInArray(gsmStates, gsmOccur, igsm, false); 
133         FillItemInArray(nimStates, nimOccur, inim, false); 
134         FillItemInArray(nevStates, nevOccur, inev, false); 
135         FillItemInArray(nptStates, nptOccur, inpt, false); 
136       }
137     }
138   }
139   
140   cout << "I : Global MCM state statistics:" << endl;
141   AnalyzeArray(gsmStates, gsmOccur);
142   cout << "I : Network interface state statistics:" << endl;
143   AnalyzeArray(nimStates, nimOccur);
144   cout << "I : MCM Event counter reading statistics:" << endl;
145   AnalyzeArray(nevStates, nevOccur);
146   cout << "I : MCM PreTrigger counter reading statistics:" << endl;
147   AnalyzeArray(nptStates, nptOccur);
148   
149   return;
150 }
151
152
153
154 void GetMajorityDifferences(TObject* calDCSObj, TObject* calDCSObj2) {
155   
156   Int_t gsmStates[cArraySize] = {0}, gsmOccur[cArraySize] = {0};
157   Int_t nimStates[cArraySize] = {0}, nimOccur[cArraySize] = {0};
158   Int_t nevStates[cArraySize] = {0}, nevOccur[cArraySize] = {0};
159   Int_t nptStates[cArraySize] = {0}, nptOccur[cArraySize] = {0};
160   
161   for (Int_t i=0; i<cArraySize; i++) {
162     gsmStates[i] = 0; gsmOccur[i]  = 0;
163     nimStates[i] = 0; nimOccur[i]  = 0;
164     nevStates[i] = 0; nevOccur[i]  = 0;
165     nptStates[i] = 0; nptOccur[i]  = 0;  
166   }
167
168   Int_t feeArrSiz1 = 0;
169   Int_t feeArrSiz2 = 0;
170   if (calVer == 1) {
171     feeArrSiz1 = ((AliTRDCalDCS*)calDCSObj)->GetFEEArr()->GetSize();
172     feeArrSiz2 = ((AliTRDCalDCS*)calDCSObj2)->GetFEEArr()->GetSize();
173   }
174   if (calVer == 2) {
175     feeArrSiz1 = ((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr()->GetSize();
176     feeArrSiz2 = ((AliTRDCalDCSv2*)calDCSObj2)->GetFEEArr()->GetSize();
177   }
178
179   for (Int_t i=0; i<nROC && i<feeArrSiz1 && i<feeArrSiz2; i++) {
180     TObject* idcsfee;
181     TObject* idcsfee2;
182     if (calVer == 1) {
183       idcsfee  = ((AliTRDCalDCS*)calDCSObj)->GetCalDCSFEEObj(i);
184       idcsfee2 = ((AliTRDCalDCS*)calDCSObj2)->GetCalDCSFEEObj(i);
185     }
186     if (calVer == 2) {
187       idcsfee  = ((AliTRDCalDCSv2*)calDCSObj)->GetCalDCSFEEObj(i);
188       idcsfee2 = ((AliTRDCalDCSv2*)calDCSObj2)->GetCalDCSFEEObj(i);
189     }
190     Int_t sbit = 0;
191     if (calVer == 1) ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();
192     if (calVer == 1) ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();
193     if ((idcsfee == NULL) || (idcsfee2 == NULL) || (sbit != 0) /*|| (idcsfee2->GetStatusBit() != 0)*/) continue;
194     for (Int_t j=0; j<nROB; j++) {
195       for (Int_t k=0; k<nMCM; k++) {
196         Int_t igsm, inim, inev, inpt, igsm1, inim1, inev1, inpt1, igsm2, inim2, inev2, inpt2;
197         if (calVer == 1) {
198           igsm1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMGlobalState(j,k);
199           inim1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMStateNI(j,k);
200           inev1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMEventCnt(j,k);
201           inpt1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMPtCnt(j,k);
202           igsm2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMGlobalState(j,k);
203           inim2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMStateNI(j,k);
204           inev2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMEventCnt(j,k);
205           inpt2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMPtCnt(j,k);
206         }
207         if (calVer == 2) {
208           igsm1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMGlobalState(j,k);
209           inim1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMStateNI(j,k);
210           inev1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMEventCnt(j,k);
211           inpt1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMPtCnt(j,k);
212           igsm2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMGlobalState(j,k);
213           inim2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMStateNI(j,k);
214           inev2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMEventCnt(j,k);
215           inpt2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMPtCnt(j,k);
216         }
217
218         igsm = igsm1 - igsm2;
219         inim = inim1 - inim2;
220         inev = inev2 - inev1;
221         inpt = inpt2 - inpt1;
222         
223         // if they were set to -1, it means they were not actauuly set
224         // change -1 to -100 to mean they werent set since the above 
225         // can give negitives
226         if (igsm1 == -1 && igsm == 0) igsm =-100000;
227         if (inim1 == -1 && inim == 0) inim =-100000;
228         if (inev1 == -1 && inev == 0) inev =-100000;
229         if (inpt1 == -1 && inpt == 0) inpt =-100000;
230         
231         FillItemInArray(gsmStates, gsmOccur, igsm, true); 
232         FillItemInArray(nimStates, nimOccur, inim, true); 
233         FillItemInArray(nevStates, nevOccur, inev, true); 
234         FillItemInArray(nptStates, nptOccur, inpt, true); 
235       }
236     }
237   }
238   
239   cout << "I : Global MCM state difference statistics:" << endl;
240   AnalyzeArray(gsmStates, gsmOccur);
241   cout << "I : Network interface state difference statistics:" << endl;
242   AnalyzeArray(nimStates, nimOccur);
243   cout << "I : MCM Event counter difference statistics:" << endl;
244   if (AnalyzeArray(nevStates, nevOccur) < 1) {
245     cout << "E : There should have been some events recorded, but there weren't" << endl;
246     errors = true;
247   }
248   cout << "I : MCM PreTrigger counter difference statistics:" << endl;
249   if (AnalyzeArray(nptStates, nptOccur) < 1) {
250     cout << "E : There should have been some events recorded, but there weren't" << endl;
251     errors = true;
252   }
253   
254   return;
255 }
256
257
258 void AliTRDcheckConfig(Int_t runNr=0, char *pathfile="nopathgiven"){
259
260   AliCDBEntry *entry=0;
261   TString pathfilets(pathfile);
262
263   // get the source
264   if(pathfilets.Contains("nopathgiven")) {
265     cout << "I : Accessing grid storage for run number " << runNr << endl;
266     cout << "I : Get CDBManager instance." << endl;
267     AliCDBManager *man = AliCDBManager::Instance();
268     cout << "I : SetDefaultStorage." << endl;
269     man->SetDefaultStorage(alienOcdbPath);
270     cout << "I : Get OCDB Entry." << endl;
271     entry = man->Get("TRD/Calib/DCS", runNr);
272     if (entry == NULL) {
273       cout << endl << "ERROR: Unable to get the AliTRDCalDCS object from the OCDB for run number " << runNr << endl << endl;
274       cout << "If the run number is correct, it could be that the year is no longer 2010 and" << endl;
275       cout << "the path where the objects is stored has changed, check the top of this macro " << endl;
276       cout << "to change the path." << endl;
277       return;
278     }
279   } else {
280     cout << "I : Accessing local storage" << endl;
281     TFile *f = new TFile(pathfile);
282     if(f != NULL) {
283       entry = (AliCDBEntry*) f->Get("AliCDBEntry");
284     }
285     else {
286       cout << "E : Cannot open file" << endl;
287       return;
288     }
289   }
290   
291   TObject *objectCDB = (TObject*)entry->GetObject();
292   if (objectCDB->IsA()->InheritsFrom("TObjArray")) {
293     TObjArray *objArrayCDB = (TObjArray*)entry->GetObject();
294   }
295   
296   if (!strcmp(objArrayCDB->At(0)->ClassName(),"AliTRDCalDCS"))   calVer = 1;
297   if (!strcmp(objArrayCDB->At(0)->ClassName(),"AliTRDCalDCSv2")) calVer = 2;
298
299   Bool_t sorandeor = true;
300   TObject *caldcs  = objArrayCDB->At(0);
301   TObject *caldcs2 = objArrayCDB->At(1);
302
303   if (caldcs == NULL && caldcs2 == NULL) {
304     cout << "E : Neither the start or end of run files were in the root file.";
305     return;
306   } else if (caldcs != NULL && caldcs2 == NULL) {
307     cout << "E : The EOR file was not in the root file.";
308     errors = true;
309     sorandeor = false;
310   } else if (caldcs == NULL && caldcs2 != NULL) {
311     cout << "E : The SOR file was not in the root file.";
312     errors = true;
313     sorandeor = false;
314     caldcs = caldcs2;
315   }
316
317   cout << endl << "============ Non responding ROC Summary: ============" << endl;
318   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: ";
319   Int_t lengthfive = bitfivestr.Length();
320   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: ";
321   Int_t lengthfour = bitfourstr.Length();
322   TString bitthreestr = " ROCs with status bit 3! BAD! data from fee server was old or corrupt.\n    DCS IDs: ";
323   Int_t lengththree = bitthreestr.Length();
324   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: ";
325   Int_t lengthtwo = bittwostr.Length();
326   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: ";
327   Int_t lengthone = bitonestr.Length();
328
329   Int_t feeArrSiz = 0;
330   if (calVer == 1) feeArrSiz = ((AliTRDCalDCS*)caldcs)->GetFEEArr()->GetSize();
331   if (calVer == 2) feeArrSiz = ((AliTRDCalDCSv2*)caldcs)->GetFEEArr()->GetSize();
332
333   Int_t nSB1=0, nSB2=0, nSB3=0, nSB4=0, nSB5=0, nTot=0;
334   for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {
335     TObject* idcsfee;
336     if (calVer == 1) idcsfee = ((AliTRDCalDCS*)caldcs)->GetCalDCSFEEObj(i);
337     if (calVer == 2) idcsfee = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(i);
338     if (idcsfee != NULL) {
339       Int_t sb;
340       if (calVer == 1) sb = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();
341       if (calVer == 2) sb = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();
342       if (sb == 5) { bitfivestr  += i; bitfivestr  += "  "; nSB5++; }
343       if (sb == 4) { bitfourstr  += i; bitfourstr  += "  "; nSB4++; errors = true; }
344       if (sb == 3) { bitthreestr += i; bitthreestr += "  "; nSB3++; errors = true; }
345       if (sb == 2) { bittwostr   += i; bittwostr   += "  "; nSB2++; }
346       if (sb == 1) { bitonestr   += i; bitonestr   += "  "; nSB1++; errors = true; }
347       nTot += 1;
348     }
349   }
350
351   if (lengthfive < bitfivestr.Length()) cout << nSB5 << bitfivestr.Data() << endl << endl;
352   if (lengthfour < bitfourstr.Length()) cout << nSB4 << bitfourstr.Data() << endl << endl;
353   if (lengththree < bitthreestr.Length()) cout << nSB3 << bitthreestr.Data() << endl << endl;
354   if (lengthtwo < bittwostr.Length()) cout << nSB2 << bittwostr.Data() << endl << endl;
355   if (lengthone < bitonestr.Length()) cout << nSB1 << bitonestr.Data() << endl << endl;
356   
357   cout << "The remaining " << nTot-(nSB1+nSB2+nSB3+nSB4+nSB5) << " ROCs responded correctly in the start of run."<<endl;
358
359   Int_t nChanged=0, nTot=0;
360   for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {
361     TObject* idcsfee;
362     TObject* idcsfee2;
363     if (calVer == 1) {
364       idcsfee  = ((AliTRDCalDCS*)caldcs)->GetCalDCSFEEObj(i);
365       idcsfee2 = ((AliTRDCalDCS*)caldcs2)->GetCalDCSFEEObj(i);
366     }
367     if (calVer == 2) {
368       idcsfee  = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(i);
369       idcsfee2 = ((AliTRDCalDCSv2*)caldcs2)->GetCalDCSFEEObj(i);
370     }
371     if (idcsfee != NULL && idcsfee2 != NULL) {
372       Int_t sbd1 = 0;
373       Int_t sbd2 = 0;
374       if (calVer == 1) {
375         sbd1 = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();
376         sbd2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetStatusBit();
377       }
378       if (calVer == 2) {
379         sbd1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();
380         sbd2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetStatusBit();
381       }
382       Int_t sbd = sbd1 - sbd2;
383       if (sbd != 0) { 
384         cout << "ROC " << i << " changed from state " << sbd1 << " at start of the run to "  << sbd2 << " at the end of the run." << endl;
385         cout << "ROC " << i << " changed from state " << sbd1 << " at start of the run to "  << sbd2 << " at the end of the run." << endl;
386         nChanged++; 
387       }
388       nTot += 1;
389     }
390   }
391   
392   if (nChanged == 0) {
393     cout << "No ROCs changed state between the start and end of the run" << endl;
394   } else {
395     cout << "E : " << nChanged << " out of " << nTot << " ROCs changed state during the run" << endl;
396     errors = true; 
397   }
398
399   cout << endl << "============ Statistics from RSTATE: ============" << endl;
400   cout<<"I : The majority entry is given as well as all other values," << endl;
401   cout<<"    sorted according to their occurrence." << endl << endl;
402   GetMajoritys(caldcs);
403   if (sorandeor) GetMajorityDifferences(caldcs,caldcs2);
404
405   cout << endl << "============ Global Configuraton: ============" << endl;
406   cout<<"I : Anything not listed is not set, mixed numbers are indicated with a" << endl;
407   cout<<"    value of -2 and strings are set to 'mixed' if they're mixed." << endl << endl;
408  
409   Int_t   gtb, gct, gsh, gtc, gsz, gfw, gfs, gfl, gsn;
410   TString gcv, gcn, gft, grp, gtp, gtm, gtd, gts, gao;
411
412   if (calVer == 1) {
413     gtb = ((AliTRDCalDCS*)caldcs)->GetGlobalNumberOfTimeBins();
414     gct = ((AliTRDCalDCS*)caldcs)->GetGlobalConfigTag();
415     gsh = ((AliTRDCalDCS*)caldcs)->GetGlobalSingleHitThres();
416     gtc = ((AliTRDCalDCS*)caldcs)->GetGlobalThreePadClustThres();
417     gsz = ((AliTRDCalDCS*)caldcs)->GetGlobalSelectiveNoZS();
418     gfw = ((AliTRDCalDCS*)caldcs)->GetGlobalTCFilterWeight();
419     gfs = ((AliTRDCalDCS*)caldcs)->GetGlobalTCFilterShortDecPar();
420     gfl = ((AliTRDCalDCS*)caldcs)->GetGlobalTCFilterLongDecPar();
421     gsn = ((AliTRDCalDCS*)caldcs)->GetGlobalModeFastStatNoise();
422     gcv = ((AliTRDCalDCS*)caldcs)->GetGlobalConfigVersion();
423     gcn = ((AliTRDCalDCS*)caldcs)->GetGlobalConfigName();
424     gft = ((AliTRDCalDCS*)caldcs)->GetGlobalFilterType();
425     grp = ((AliTRDCalDCS*)caldcs)->GetGlobalReadoutParam();
426     gtp = ((AliTRDCalDCS*)caldcs)->GetGlobalTestPattern();
427     gtm = ((AliTRDCalDCS*)caldcs)->GetGlobalTrackletMode();
428     gtd = ((AliTRDCalDCS*)caldcs)->GetGlobalTrackletDef();
429     gts = ((AliTRDCalDCS*)caldcs)->GetGlobalTriggerSetup();
430     gao = ((AliTRDCalDCS*)caldcs)->GetGlobalAddOptions();
431   }
432   if (calVer == 2) {
433     gtb = ((AliTRDCalDCSv2*)caldcs)->GetGlobalNumberOfTimeBins();
434     gct = ((AliTRDCalDCSv2*)caldcs)->GetGlobalConfigTag();
435     gsh = ((AliTRDCalDCSv2*)caldcs)->GetGlobalSingleHitThres();
436     gtc = ((AliTRDCalDCSv2*)caldcs)->GetGlobalThreePadClustThres();
437     gsz = ((AliTRDCalDCSv2*)caldcs)->GetGlobalSelectiveNoZS();
438     gfw = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTCFilterWeight();
439     gfs = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTCFilterShortDecPar();
440     gfl = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTCFilterLongDecPar();
441     gsn = ((AliTRDCalDCSv2*)caldcs)->GetGlobalModeFastStatNoise();
442     gcv = ((AliTRDCalDCSv2*)caldcs)->GetGlobalConfigVersion();
443     gcn = ((AliTRDCalDCSv2*)caldcs)->GetGlobalConfigName();
444     gft = ((AliTRDCalDCSv2*)caldcs)->GetGlobalFilterType();
445     grp = ((AliTRDCalDCSv2*)caldcs)->GetGlobalReadoutParam();
446     gtp = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTestPattern();
447     gtm = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTrackletMode();
448     gtd = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTrackletDef();
449     gts = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTriggerSetup();
450     gao = ((AliTRDCalDCSv2*)caldcs)->GetGlobalAddOptions();
451   }
452
453
454   if (gtb != -1) cout<<"Global number of time bins.........................: "<< gtb << endl;
455   if (gct != -1) cout<<"Global configuration tag...........................: "<< gct << endl;
456   if (gsh != -1) cout<<"Global single hit threshold........................: "<< gsh << endl;
457   if (gtc != -1) cout<<"Global three pad cluster threshold.................: "<< gtc << endl;
458   if (gsz != -1) cout<<"Global selective ZS (every i'th event).............: "<< gsz << endl;
459   if (gfw != -1) cout<<"Global tail cancellation filter weight.............: "<< gfs << endl;
460   if (gfs != -1) cout<<"Global tail cancellat. filter short decay parameter: "<< gfs << endl;
461   if (gfl != -1) cout<<"Global tail cancellation filt. long decay parameter: "<< gsn << endl;
462   if (gsn != -1) cout<<"Global fast statistics mode?.......................: "<< gsn << endl;
463   if (gcv != "") cout<<"Global configuration tag version...................: "<< gcv << endl;
464   if (gcn != "") cout<<"Global configuration tag name......................: "<< gcn << endl;
465   if (gft != "") cout<<"Global filter type.................................: "<< gft << endl;
466   if (grp != "") cout<<"Global readout parameter...........................: "<< grp << endl;
467   if (gtp != "") cout<<"Global test pattern................................: "<< gtp << endl;
468   if (gtm != "") cout<<"Global tracklet mode...............................: "<< gtm << endl;
469   if (gtd != "") cout<<"Global tracklet definition.........................: "<< gtd << endl;
470   if (gts != "") cout<<"Global trigger setup...............................: "<< gts << endl;
471   if (gao != "") cout<<"Global additional options..........................: "<< gao << endl;
472   
473   cout << endl << "============ Error Summary: ============" << endl;
474   if (errors) {
475     cout<<"    I noticed some errors, please see above for the specifics." << endl;
476   } else {
477     cout<<"    I didn't notice any errors, but that doesn't mean there weren't any!" << endl;
478   }
479   
480
481 }