minor fixes, made compilable, added standalone support (Hans)
authorcblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 26 Jul 2012 18:48:06 +0000 (18:48 +0000)
committercblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 26 Jul 2012 18:48:06 +0000 (18:48 +0000)
TRD/Macros/AliTRDcheckConfig.C

index 688518b..7693bd1 100644 (file)
@@ -1,8 +1,21 @@
+/**************************************************************************\r
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
+ *                                                                        *\r
+ * Author: The ALICE Off-line Project.                                    *\r
+ * Contributors are mentioned in the code where appropriate.              *\r
+ *                                                                        *\r
+ * Permission to use, copy, modify and distribute this software and its   *\r
+ * documentation strictly for non-commercial purposes is hereby granted   *\r
+ * without fee, provided that the above copyright notice appears in all   *\r
+ * copies and that both the copyright notice and this permission notice   *\r
+ * appear in the supporting documentation. The authors make no claims     *\r
+ * about the suitability of this software for any purpose. It is          *\r
+ * provided "as is" without express or implied warranty.                  *\r
+ **************************************************************************/\r
+\r
 //===================================================================================\r
 // This is a macro to analyze TRD/Calib/DCS OCDB objects either\r
 // from the grid for a given run number or from a local object.\r
-// If you want to analyze data from the grid, please don't forget to\r
-// have a valid alien token initialized\r
 //\r
 // Arguments:\r
 // Either provide a run number as the first argument to access the \r
 // .x AliTRDcheckConfig.C (60111)\r
 // .x AliTRDcheckConfig.C (0, "$ALICE_ROOT/TRD/Calib/DCS/Run0_999999999_v0_s0.root")\r
 //\r
-// Please contact Frederick Kramer or Hans Beck in case of problems\r
+// Original author:\r
+//      Frederick Kramer\r
+// Current maintainer:\r
+//      Hans Beck\r
 //===================================================================================\r
 \r
+// Make the macro compile.\r
+#if !defined(__CINT__) || defined(__MAKECINT__)\r
+// Compile me in aliroot with .L AliTRDcheckConfig.C+ or with\r
+// 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\r
+#include <iostream>\r
+#include <fstream>\r
+#include <TMath.h>\r
+#include <TFile.h>\r
+#include <TGrid.h>\r
+#include <TEnv.h>\r
+#include "../../STEER/CDB/AliCDBEntry.h"\r
+#include "../../STEER/CDB/AliCDBManager.h"\r
+#include "../Cal/AliTRDCalDCS.h"\r
+#include "../Cal/AliTRDCalDCSv2.h"\r
+#include "../Cal/AliTRDCalDCSFEE.h"\r
+#include "../Cal/AliTRDCalDCSFEEv2.h"\r
+\r
+// Not sure where to put it?\r
+using namespace std;\r
+#endif\r
 \r
 const Int_t nROC = 540;\r
 const Int_t nROB = 8;\r
 const Int_t nMCM = 18;\r
 const Int_t cArraySize = 1000;\r
 \r
-Bool_t errors = false;\r
-Int_t  calVer = 0;\r
-\r
+Bool_t errors;\r
+Int_t  calVer;\r
+//______________________________________________________________________\r
 Int_t AnalyzeArray(Int_t states[cArraySize], Int_t occur[cArraySize]) {\r
-  long long srtIndx[cArraySize] = 0;\r
+  Int_t srtIndx[cArraySize] = {0};\r
   \r
   TMath::Sort(cArraySize, occur, srtIndx);\r
 \r
@@ -49,13 +85,11 @@ Int_t AnalyzeArray(Int_t states[cArraySize], Int_t occur[cArraySize]) {
   }\r
   return states[srtIndx[0]];\r
 }\r
-\r
-\r
-\r
+//______________________________________________________________________\r
 void FillItemInArray(Int_t states[cArraySize], Int_t occur[cArraySize], Int_t item, Bool_t allowNeg) {\r
   for (Int_t iArrPos=0; iArrPos<cArraySize; iArrPos++) {\r
     // if allowNeg is set then we change the number indicating that the item ws not set from -1 to -100\r
-    // so that small negitive numbers can be sorted too\r
+    // so that small negative numbers can be sorted too\r
     if ((allowNeg && item == -100000) || (!allowNeg && item == -1)) break; // value not set\r
     if (states[iArrPos] == item) {\r
       occur[iArrPos]++;\r
@@ -67,66 +101,67 @@ void FillItemInArray(Int_t states[cArraySize], Int_t occur[cArraySize], Int_t it
     }\r
   }\r
 }\r
-\r
+//______________________________________________________________________\r
 void GetMajoritys(TObject* calDCSObj) {\r
   \r
+  // Initializes full array with zeros\r
   Int_t gsmStates[cArraySize] = {0}, gsmOccur[cArraySize] = {0};\r
   Int_t nimStates[cArraySize] = {0}, nimOccur[cArraySize] = {0};\r
   Int_t nevStates[cArraySize] = {0}, nevOccur[cArraySize] = {0};\r
   Int_t nptStates[cArraySize] = {0}, nptOccur[cArraySize] = {0};\r
   \r
-  for (Int_t i=0; i<cArraySize; i++) {\r
-    gsmStates[i] = 0; gsmOccur[i]  = 0;\r
-    nimStates[i] = 0; nimOccur[i]  = 0;\r
-    nevStates[i] = 0; nevOccur[i]  = 0;\r
-    nptStates[i] = 0; nptOccur[i]  = 0;  \r
-  }\r
-  \r
 \r
-  Int_t feeArrSiz = 0;\r
-  if (calVer == 1) feeArrSiz = ((AliTRDCalDCS*)calDCSObj)->GetFEEArr()->GetSize();\r
-  if (calVer == 2) feeArrSiz = ((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr()->GetSize();\r
+  { // Scoped declaration\r
+    Int_t feeArrSiz = 0;\r
+    if (calVer == 1) {\r
+      if(((AliTRDCalDCS*)calDCSObj)->GetFEEArr())\r
+       feeArrSiz = ((AliTRDCalDCS*)calDCSObj)->GetFEEArr()->GetSize();\r
+    }\r
+    else if (calVer == 2) {\r
+      if(((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr())\r
+       feeArrSiz = ((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr()->GetSize();\r
+    }\r
 \r
-  for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {\r
     TObject* idcsfee;\r
-    if (calVer == 1) idcsfee = ((AliTRDCalDCS*)calDCSObj)->GetCalDCSFEEObj(i);\r
-    if (calVer == 2) idcsfee = ((AliTRDCalDCSv2*)calDCSObj)->GetCalDCSFEEObj(i);\r
-\r
-    if (idcsfee == NULL) continue;\r
-\r
-    Int_t sbit = 0;\r
-    if (calVer == 1) ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();\r
-    if (calVer == 2) ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();\r
-\r
-    if (sbit != 0) continue;\r
-\r
-    for (Int_t j=0; j<nROB; j++) {\r
-      for (Int_t k=0; k<nMCM; k++) {\r
-       Int_t igsm = 0;\r
-       Int_t inim = 0;\r
-       Int_t inev = 0;\r
-       Int_t inpt = 0;\r
-       if (calVer == 1) {\r
-         igsm = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMGlobalState(j,k);\r
-         inim = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMStateNI(j,k);\r
-         inev = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMEventCnt(j,k);\r
-         inpt = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMPtCnt(j,k);\r
-       }\r
-       if (calVer == 2) {\r
-         igsm = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMGlobalState(j,k);\r
-         inim = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMStateNI(j,k);\r
-         inev = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMEventCnt(j,k);\r
-         inpt = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMPtCnt(j,k);\r
-       }\r
-       \r
-       FillItemInArray(gsmStates, gsmOccur, igsm, false); \r
-       FillItemInArray(nimStates, nimOccur, inim, false); \r
-       FillItemInArray(nevStates, nevOccur, inev, false); \r
-       FillItemInArray(nptStates, nptOccur, inpt, false); \r
-      }\r
-    }\r
-  }\r
-  \r
+    for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {\r
+      if (calVer == 1) idcsfee = ((AliTRDCalDCS*)calDCSObj)->GetCalDCSFEEObj(i);\r
+      else if (calVer == 2) idcsfee = ((AliTRDCalDCSv2*)calDCSObj)->GetCalDCSFEEObj(i);\r
+      \r
+      if (idcsfee == NULL) continue;\r
+      \r
+      Int_t sbit(-9999);\r
+      if (calVer == 1) sbit = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();\r
+      else if (calVer == 2) sbit = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();\r
+      if (sbit != 0) continue;\r
+      \r
+      for (Int_t j=0; j<nROB; j++) {\r
+       for (Int_t k=0; k<nMCM; k++) {\r
+         Int_t igsm = 0;\r
+         Int_t inim = 0;\r
+         Int_t inev = 0;\r
+         Int_t inpt = 0;\r
+         if (calVer == 1) {\r
+           igsm = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMGlobalState(j,k);\r
+           inim = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMStateNI(j,k);\r
+           inev = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMEventCnt(j,k);\r
+           inpt = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMPtCnt(j,k);\r
+         }\r
+         else if (calVer == 2) {\r
+           igsm = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMGlobalState(j,k);\r
+           inim = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMStateNI(j,k);\r
+           inev = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMEventCnt(j,k);\r
+           inpt = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMPtCnt(j,k);\r
+         }\r
+\r
+         FillItemInArray(gsmStates, gsmOccur, igsm, false); \r
+         FillItemInArray(nimStates, nimOccur, inim, false); \r
+         FillItemInArray(nevStates, nevOccur, inev, false); \r
+         FillItemInArray(nptStates, nptOccur, inpt, false); \r
+       } // End of loop over MCMs\r
+      } // End of loop over ROBs\r
+    } // End of loop over ROCs\r
+  } // End of scoped declaration\r
+    \r
   cout << "I : Global MCM state statistics:" << endl;\r
   AnalyzeArray(gsmStates, gsmOccur);\r
   cout << "I : Network interface state statistics:" << endl;\r
@@ -138,97 +173,95 @@ void GetMajoritys(TObject* calDCSObj) {
   \r
   return;\r
 }\r
-\r
-\r
-\r
+//______________________________________________________________________\r
 void GetMajorityDifferences(TObject* calDCSObj, TObject* calDCSObj2) {\r
   \r
+  // Initializes full array with zeros\r
   Int_t gsmStates[cArraySize] = {0}, gsmOccur[cArraySize] = {0};\r
   Int_t nimStates[cArraySize] = {0}, nimOccur[cArraySize] = {0};\r
   Int_t nevStates[cArraySize] = {0}, nevOccur[cArraySize] = {0};\r
   Int_t nptStates[cArraySize] = {0}, nptOccur[cArraySize] = {0};\r
   \r
-  for (Int_t i=0; i<cArraySize; i++) {\r
-    gsmStates[i] = 0; gsmOccur[i]  = 0;\r
-    nimStates[i] = 0; nimOccur[i]  = 0;\r
-    nevStates[i] = 0; nevOccur[i]  = 0;\r
-    nptStates[i] = 0; nptOccur[i]  = 0;  \r
-  }\r
-\r
-  Int_t feeArrSiz1 = 0;\r
-  Int_t feeArrSiz2 = 0;\r
-  if (calVer == 1) {\r
-    feeArrSiz1 = ((AliTRDCalDCS*)calDCSObj)->GetFEEArr()->GetSize();\r
-    feeArrSiz2 = ((AliTRDCalDCS*)calDCSObj2)->GetFEEArr()->GetSize();\r
-  }\r
-  if (calVer == 2) {\r
-    feeArrSiz1 = ((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr()->GetSize();\r
-    feeArrSiz2 = ((AliTRDCalDCSv2*)calDCSObj2)->GetFEEArr()->GetSize();\r
-  }\r
-\r
-  for (Int_t i=0; i<nROC && i<feeArrSiz1 && i<feeArrSiz2; i++) {\r
-    TObject* idcsfee;\r
-    TObject* idcsfee2;\r
-\r
+  \r
+  {  // Scoped declaration\r
+    Int_t feeArrSiz1 = 0;\r
+    Int_t feeArrSiz2 = 0;\r
     if (calVer == 1) {\r
-      idcsfee  = ((AliTRDCalDCS*)calDCSObj)->GetCalDCSFEEObj(i);\r
-      idcsfee2 = ((AliTRDCalDCS*)calDCSObj2)->GetCalDCSFEEObj(i);\r
+      if(((AliTRDCalDCS*)calDCSObj)->GetFEEArr())\r
+       feeArrSiz1 = ((AliTRDCalDCS*)calDCSObj)->GetFEEArr()->GetSize();\r
+      if(((AliTRDCalDCS*)calDCSObj2)->GetFEEArr())\r
+       feeArrSiz2 = ((AliTRDCalDCS*)calDCSObj2)->GetFEEArr()->GetSize();\r
     }\r
-    if (calVer == 2) {\r
-      idcsfee  = ((AliTRDCalDCSv2*)calDCSObj)->GetCalDCSFEEObj(i);\r
-      idcsfee2 = ((AliTRDCalDCSv2*)calDCSObj2)->GetCalDCSFEEObj(i);\r
+    else if (calVer == 2) {\r
+      if(((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr())\r
+       feeArrSiz1 = ((AliTRDCalDCSv2*)calDCSObj)->GetFEEArr()->GetSize();\r
+      if(((AliTRDCalDCSv2*)calDCSObj2)->GetFEEArr())\r
+       feeArrSiz2 = ((AliTRDCalDCSv2*)calDCSObj2)->GetFEEArr()->GetSize();\r
     }\r
-    if ((idcsfee == NULL) || (idcsfee2 == NULL)) continue;\r
-\r
-    Int_t sbit = 0;\r
-    if (calVer == 1) sbit = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();\r
-    if (calVer == 2) sbit = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();\r
-    if (sbit != 0) continue;\r
 \r
-    for (Int_t j=0; j<nROB; j++) {\r
-      for (Int_t k=0; k<nMCM; k++) {\r
-       Int_t igsm, inim, inev, inpt, igsm1, inim1, inev1, inpt1, igsm2, inim2, inev2, inpt2;\r
-       if (calVer == 1) {\r
-         igsm1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMGlobalState(j,k);\r
-         inim1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMStateNI(j,k);\r
-         inev1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMEventCnt(j,k);\r
-         inpt1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMPtCnt(j,k);\r
-         igsm2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMGlobalState(j,k);\r
-         inim2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMStateNI(j,k);\r
-         inev2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMEventCnt(j,k);\r
-         inpt2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMPtCnt(j,k);\r
-       }\r
-       if (calVer == 2) {\r
-         igsm1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMGlobalState(j,k);\r
-         inim1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMStateNI(j,k);\r
-         inev1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMEventCnt(j,k);\r
-         inpt1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMPtCnt(j,k);\r
-         igsm2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMGlobalState(j,k);\r
-         inim2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMStateNI(j,k);\r
-         inev2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMEventCnt(j,k);\r
-         inpt2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMPtCnt(j,k);\r
-       }\r
-\r
-       igsm = igsm1 - igsm2;\r
-       inim = inim1 - inim2;\r
-       inev = inev2 - inev1;\r
-       inpt = inpt2 - inpt1;\r
-       \r
-       // if they were set to -1, it means they were not actauuly set\r
-       // change -1 to -100 to mean they werent set since the above \r
-       // can give negitives\r
-       if (igsm1 == -1 && igsm == 0) igsm =-100000;\r
-       if (inim1 == -1 && inim == 0) inim =-100000;\r
-       if (inev1 == -1 && inev == 0) inev =-100000;\r
-       if (inpt1 == -1 && inpt == 0) inpt =-100000;\r
-       \r
-       FillItemInArray(gsmStates, gsmOccur, igsm, true); \r
-       FillItemInArray(nimStates, nimOccur, inim, true); \r
-       FillItemInArray(nevStates, nevOccur, inev, true); \r
-       FillItemInArray(nptStates, nptOccur, inpt, true); \r
+    TObject* idcsfee;\r
+    TObject* idcsfee2;\r
+    for (Int_t i=0; i<nROC && i<feeArrSiz1 && i<feeArrSiz2; i++) {\r
+      if (calVer == 1) {\r
+       idcsfee  = ((AliTRDCalDCS*)calDCSObj)->GetCalDCSFEEObj(i);\r
+       idcsfee2 = ((AliTRDCalDCS*)calDCSObj2)->GetCalDCSFEEObj(i);\r
       }\r
-    }\r
-  }\r
+      else if (calVer == 2) {\r
+       idcsfee  = ((AliTRDCalDCSv2*)calDCSObj)->GetCalDCSFEEObj(i);\r
+       idcsfee2 = ((AliTRDCalDCSv2*)calDCSObj2)->GetCalDCSFEEObj(i);\r
+      }\r
+      if ((idcsfee == NULL) || (idcsfee2 == NULL)) continue;\r
+      \r
+      Int_t sbit(-9999);\r
+      if (calVer == 1) sbit = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();\r
+      else if (calVer == 2) sbit = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();\r
+      if (sbit != 0) continue;\r
+      \r
+      for (Int_t j=0; j<nROB; j++) {\r
+       for (Int_t k=0; k<nMCM; k++) {\r
+         Int_t igsm, inim, inev, inpt, igsm1, inim1, inev1, inpt1, igsm2, inim2, inev2, inpt2;\r
+         if (calVer == 1) {\r
+           igsm1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMGlobalState(j,k);\r
+           inim1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMStateNI(j,k);\r
+           inev1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMEventCnt(j,k);\r
+           inpt1 = ((AliTRDCalDCSFEE*)idcsfee)->GetMCMPtCnt(j,k);\r
+           igsm2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMGlobalState(j,k);\r
+           inim2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMStateNI(j,k);\r
+           inev2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMEventCnt(j,k);\r
+           inpt2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetMCMPtCnt(j,k);\r
+         }\r
+         else if (calVer == 2) {\r
+           igsm1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMGlobalState(j,k);\r
+           inim1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMStateNI(j,k);\r
+           inev1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMEventCnt(j,k);\r
+           inpt1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetMCMPtCnt(j,k);\r
+           igsm2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMGlobalState(j,k);\r
+           inim2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMStateNI(j,k);\r
+           inev2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMEventCnt(j,k);\r
+           inpt2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetMCMPtCnt(j,k);\r
+         }\r
+         \r
+         igsm = igsm1 - igsm2;\r
+         inim = inim1 - inim2;\r
+         inev = inev2 - inev1;\r
+         inpt = inpt2 - inpt1;\r
+         \r
+         // if they were set to -1, it means they were not actauuly set\r
+         // change -1 to -100 to mean they werent set since the above \r
+         // can give negatives\r
+         if (igsm1 == -1 && igsm == 0) igsm =-100000;\r
+         if (inim1 == -1 && inim == 0) inim =-100000;\r
+         if (inev1 == -1 && inev == 0) inev =-100000;\r
+         if (inpt1 == -1 && inpt == 0) inpt =-100000;\r
+         \r
+         FillItemInArray(gsmStates, gsmOccur, igsm, true); \r
+         FillItemInArray(nimStates, nimOccur, inim, true); \r
+         FillItemInArray(nevStates, nevOccur, inev, true); \r
+         FillItemInArray(nptStates, nptOccur, inpt, true); \r
+       } // End of loop over MCMs\r
+      } // End of loop over ROBs\r
+    } // End of loop over ROCs\r
+  } // End of scoped declaration\r
   \r
   cout << "I : Global MCM state difference statistics:" << endl;\r
   AnalyzeArray(gsmStates, gsmOccur);\r
@@ -247,10 +280,11 @@ void GetMajorityDifferences(TObject* calDCSObj, TObject* calDCSObj2) {
   \r
   return;\r
 }\r
-\r
-\r
-void AliTRDcheckConfig(Int_t runNr=0, char *pathfile="nopathgiven"){\r
-\r
+//______________________________________________________________________\r
+void WrappedAliTRDcheckConfig(Int_t runNr, const char *pathfile,TFile *f){\r
+  // Reset the 'errors occured' bool as it's global\r
+  errors=false;\r
+  \r
   AliCDBEntry *entry=0;\r
   TString pathfilets(pathfile);\r
 \r
@@ -265,14 +299,22 @@ void AliTRDcheckConfig(Int_t runNr=0, char *pathfile="nopathgiven"){
     cout << "I : Get OCDB Entry." << endl;\r
     entry = man->Get("TRD/Calib/DCS", runNr);\r
     if (entry == NULL) {\r
-      cout << endl << "ERROR: Unable to get the AliTRDCalDCS object from the OCDB for run number " << runNr << "." << endl;\r
+      cout << endl << "ERROR: Unable to get the AliTRDCalDCS object"\r
+          << "from the OCDB for run number " << runNr << "." << endl;\r
       return;\r
     }\r
   } else {\r
-    cout << "I : Accessing local storage" << endl;\r
-    TFile *f = new TFile(pathfile);\r
+    cout << "I : Accessing file directly" << endl;\r
+    // Might be we want to check a file on the grid\r
+    if(pathfilets.BeginsWith("alien://"))\r
+      TGrid::Connect("alien://");\r
+    f = TFile::Open(pathfile);\r
     if(f != NULL) {\r
       entry = (AliCDBEntry*) f->Get("AliCDBEntry");\r
+      if(!entry){\r
+       cout << "E : Can not get the OCDB entry"<<endl;\r
+       return;\r
+      }\r
     }\r
     else {\r
       cout << "E : Cannot open file" << endl;\r
@@ -280,9 +322,10 @@ void AliTRDcheckConfig(Int_t runNr=0, char *pathfile="nopathgiven"){
     }\r
   }\r
   \r
-  TObject *objectCDB = (TObject*)entry->GetObject();\r
-  if (objectCDB->IsA()->InheritsFrom("TObjArray")) {\r
-    TObjArray *objArrayCDB = (TObjArray*)entry->GetObject();\r
+  TObjArray *objArrayCDB = (TObjArray*)entry->GetObject();\r
+  if(!objArrayCDB){\r
+    cout << "E : Can not get the OCDB object"<<endl;\r
+    return;\r
   }\r
   \r
   Int_t iesor=0;\r
@@ -333,69 +376,82 @@ void AliTRDcheckConfig(Int_t runNr=0, char *pathfile="nopathgiven"){
   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: ";\r
   Int_t lengthone = bitonestr.Length();\r
 \r
-  Int_t feeArrSiz = 0;\r
-  if (calVer == 1) feeArrSiz = ((AliTRDCalDCS*)caldcs)->GetFEEArr()->GetSize();\r
-  if (calVer == 2) feeArrSiz = ((AliTRDCalDCSv2*)caldcs)->GetFEEArr()->GetSize();\r
 \r
-  Int_t nSB1=0, nSB2=0, nSB3=0, nSB4=0, nSB5=0, nTot=0;\r
-  for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {\r
-    TObject* idcsfee;\r
-    if (calVer == 1) idcsfee = ((AliTRDCalDCS*)caldcs)->GetCalDCSFEEObj(i);\r
-    if (calVer == 2) idcsfee = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(i);\r
-    if (idcsfee != NULL) {\r
-      Int_t sb;\r
-      if (calVer == 1) sb = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();\r
-      if (calVer == 2) sb = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();\r
-      if (sb == 5) { bitfivestr  += i; bitfivestr  += "  "; nSB5++; }\r
-      if (sb == 4) { bitfourstr  += i; bitfourstr  += "  "; nSB4++; errors = true; }\r
-      if (sb == 3) { bitthreestr += i; bitthreestr += "  "; nSB3++; errors = true; }\r
-      if (sb == 2) { bittwostr   += i; bittwostr   += "  "; nSB2++; }\r
-      if (sb == 1) { bitonestr   += i; bitonestr   += "  "; nSB1++; errors = true; }\r
-      nTot += 1;\r
-    }\r
-  }\r
+  Int_t nSB1=0, nSB2=0, nSB3=0, nSB4=0, nSB5=0, nTot=0, nChanged=0;\r
+  { // Scoped declaration\r
 \r
-  if (lengthfive < bitfivestr.Length()) cout << nSB5 << bitfivestr.Data() << endl << endl;\r
-  if (lengthfour < bitfourstr.Length()) cout << nSB4 << bitfourstr.Data() << endl << endl;\r
-  if (lengththree < bitthreestr.Length()) cout << nSB3 << bitthreestr.Data() << endl << endl;\r
-  if (lengthtwo < bittwostr.Length()) cout << nSB2 << bittwostr.Data() << endl << endl;\r
-  if (lengthone < bitonestr.Length()) cout << nSB1 << bitonestr.Data() << endl << endl;\r
-  \r
-  cout << "The remaining " << nTot-(nSB1+nSB2+nSB3+nSB4+nSB5) << " ROCs responded correctly in the start of run."<<endl;\r
-\r
-  Int_t nChanged=0, nTot=0;\r
-  for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {\r
-    TObject* idcsfee;\r
-    TObject* idcsfee2;\r
+    // Determine the size of the array\r
+    Int_t feeArrSiz = 0;\r
     if (calVer == 1) {\r
-      if (caldcs)  idcsfee  = ((AliTRDCalDCS*)caldcs)->GetCalDCSFEEObj(i);\r
-      if (caldcs2) idcsfee2 = ((AliTRDCalDCS*)caldcs2)->GetCalDCSFEEObj(i);\r
+      if(((AliTRDCalDCS*)caldcs)->GetFEEArr())\r
+       feeArrSiz = ((AliTRDCalDCS*)caldcs)->GetFEEArr()->GetSize();\r
     }\r
-    if (calVer == 2) {\r
-      if (caldcs)  idcsfee  = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(i);\r
-      if (caldcs2) idcsfee2 = ((AliTRDCalDCSv2*)caldcs2)->GetCalDCSFEEObj(i);\r
+    else if (calVer == 2) {\r
+      if(((AliTRDCalDCSv2*)caldcs)->GetFEEArr())\r
+       feeArrSiz = ((AliTRDCalDCSv2*)caldcs)->GetFEEArr()->GetSize();\r
     }\r
-    if (idcsfee != NULL && idcsfee2 != NULL) {\r
-      Int_t sbd1 = 0;\r
-      Int_t sbd2 = 0;\r
+\r
+    // Check the status/error bist for each ROC\r
+    TObject* idcsfee;\r
+    TObject* idcsfee2;\r
+    // Loop over the ROCs / the array\r
+    for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {\r
+      if (calVer == 1) idcsfee = ((AliTRDCalDCS*)caldcs)->GetCalDCSFEEObj(i);\r
+      else if (calVer == 2) idcsfee = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(i);\r
+      if (idcsfee != NULL) {\r
+       Int_t sb;\r
+       if (calVer == 1) sb = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();\r
+       else if (calVer == 2) sb = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();\r
+       if (sb == 5) { bitfivestr  += i; bitfivestr  += "  "; nSB5++; }\r
+       else if (sb == 4) { bitfourstr  += i; bitfourstr  += "  "; nSB4++; errors = true; }\r
+       else if (sb == 3) { bitthreestr += i; bitthreestr += "  "; nSB3++; errors = true; }\r
+       else if (sb == 2) { bittwostr   += i; bittwostr   += "  "; nSB2++; }\r
+       else if (sb == 1) { bitonestr   += i; bitonestr   += "  "; nSB1++; errors = true; }\r
+       nTot += 1;\r
+      }\r
+    } // End of loop over ROCs\r
+\r
+    // Print the statistcs for the status/error bits\r
+    if (lengthfive < bitfivestr.Length()) cout << nSB5 << bitfivestr.Data() << endl << endl;\r
+    if (lengthfour < bitfourstr.Length()) cout << nSB4 << bitfourstr.Data() << endl << endl;\r
+    if (lengththree < bitthreestr.Length()) cout << nSB3 << bitthreestr.Data() << endl << endl;\r
+    if (lengthtwo < bittwostr.Length()) cout << nSB2 << bittwostr.Data() << endl << endl;\r
+    if (lengthone < bitonestr.Length()) cout << nSB1 << bitonestr.Data() << endl << endl;\r
+    \r
+    cout << "The remaining " << nTot-(nSB1+nSB2+nSB3+nSB4+nSB5) << " ROCs responded correctly in the start of run."<<endl;\r
+    \r
+    // Reusing nTot\r
+    nTot=0;\r
+    for (Int_t i=0; i<nROC && i<feeArrSiz; i++) {\r
       if (calVer == 1) {\r
-       sbd1 = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();\r
-       sbd2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetStatusBit();\r
+       if (caldcs)  idcsfee  = ((AliTRDCalDCS*)caldcs)->GetCalDCSFEEObj(i);\r
+       if (caldcs2) idcsfee2 = ((AliTRDCalDCS*)caldcs2)->GetCalDCSFEEObj(i);\r
       }\r
-      if (calVer == 2) {\r
-       sbd1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();\r
-       sbd2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetStatusBit();\r
+      else if (calVer == 2) {\r
+       if (caldcs)  idcsfee  = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(i);\r
+       if (caldcs2) idcsfee2 = ((AliTRDCalDCSv2*)caldcs2)->GetCalDCSFEEObj(i);\r
       }\r
-      Int_t sbd = sbd1 - sbd2;\r
-      if (sbd != 0) { \r
-       cout << "ROC " << i << " changed from state " << sbd1 << " at start of the run to "  << sbd2 << " at the end of the run." << endl;\r
-       cout << "ROC " << i << " changed from state " << sbd1 << " at start of the run to "  << sbd2 << " at the end of the run." << endl;\r
-       nChanged++; \r
+      if (idcsfee != NULL && idcsfee2 != NULL) {\r
+       Int_t sbd1 = 0;\r
+       Int_t sbd2 = 0;\r
+       if (calVer == 1) {\r
+         sbd1 = ((AliTRDCalDCSFEE*)idcsfee)->GetStatusBit();\r
+         sbd2 = ((AliTRDCalDCSFEE*)idcsfee2)->GetStatusBit();\r
+       }\r
+       if (calVer == 2) {\r
+         sbd1 = ((AliTRDCalDCSFEEv2*)idcsfee)->GetStatusBit();\r
+         sbd2 = ((AliTRDCalDCSFEEv2*)idcsfee2)->GetStatusBit();\r
+       }\r
+       Int_t sbd = sbd1 - sbd2;\r
+       if (sbd != 0) { \r
+         cout << "ROC " << i << " changed from state " << sbd1 << " at start of the run to "  << sbd2 << " at the end of the run." << endl;\r
+         cout << "ROC " << i << " changed from state " << sbd1 << " at start of the run to "  << sbd2 << " at the end of the run." << endl;\r
+         nChanged++; \r
+       }\r
+       nTot += 1;\r
       }\r
-      nTot += 1;\r
-    }\r
-  }\r
-  \r
+    } // End of loop over ROCs\r
+  } // End of scoped declaration\r
   if (nChanged == 0) {\r
     cout << "No ROCs changed state between the start and end of the run" << endl;\r
   } else {\r
@@ -436,24 +492,25 @@ void AliTRDcheckConfig(Int_t runNr=0, char *pathfile="nopathgiven"){
     gts = ((AliTRDCalDCS*)caldcs)->GetGlobalTriggerSetup();\r
     gao = ((AliTRDCalDCS*)caldcs)->GetGlobalAddOptions();\r
   }\r
-  if (calVer == 2) {\r
-    gtb = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetNumberOfTimeBins();\r
-    gct = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetConfigTag();\r
-    gsh = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetSingleHitThres();\r
-    gtc = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetThreePadClustThres();\r
-    gsz = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetSelectiveNoZS();\r
-    gfw = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetTCFilterWeight();\r
-    gfs = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetTCFilterShortDecPar();\r
-    gfl = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetTCFilterLongDecPar();\r
-    gcv = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetConfigVersion();\r
-    gcn = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetConfigName();\r
-    gft = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetFilterType();\r
-    grp = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetReadoutParam();\r
-    gtp = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetTestPattern();\r
-    gtm = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetTrackletMode();\r
-    gtd = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetTrackletDef();\r
-    gts = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetTriggerSetup();\r
-    gao = ((AliTRDCalDCSv2*)caldcs)->GetCalDCSFEEObj(0)->GetAddOptions();\r
+  else if (calVer == 2) {\r
+    gtb = ((AliTRDCalDCSv2*)caldcs)->GetGlobalNumberOfTimeBins();\r
+    gct = ((AliTRDCalDCSv2*)caldcs)->GetGlobalConfigTag();\r
+    gsh = ((AliTRDCalDCSv2*)caldcs)->GetGlobalSingleHitThres();\r
+    gtc = ((AliTRDCalDCSv2*)caldcs)->GetGlobalThreePadClustThres();\r
+    gsz = ((AliTRDCalDCSv2*)caldcs)->GetGlobalSelectiveNoZS();\r
+    gfw = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTCFilterWeight();\r
+    gfs = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTCFilterShortDecPar();\r
+    gfl = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTCFilterLongDecPar();\r
+    gsn = ((AliTRDCalDCSv2*)caldcs)->GetGlobalModeFastStatNoise();\r
+    gcv = ((AliTRDCalDCSv2*)caldcs)->GetGlobalConfigVersion();\r
+    gcn = ((AliTRDCalDCSv2*)caldcs)->GetGlobalConfigName();\r
+    gft = ((AliTRDCalDCSv2*)caldcs)->GetGlobalFilterType();\r
+    grp = ((AliTRDCalDCSv2*)caldcs)->GetGlobalReadoutParam();\r
+    gtp = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTestPattern();\r
+    gtm = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTrackletMode();\r
+    gtd = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTrackletDef();\r
+    gts = ((AliTRDCalDCSv2*)caldcs)->GetGlobalTriggerSetup();\r
+    gao = ((AliTRDCalDCSv2*)caldcs)->GetGlobalAddOptions();\r
   }\r
 \r
 \r
@@ -482,6 +539,138 @@ void AliTRDcheckConfig(Int_t runNr=0, char *pathfile="nopathgiven"){
   } else {\r
     cout<<"    I didn't notice any errors, but that doesn't mean there weren't any!" << endl;\r
   }\r
+//______________________________________________________________________\r
+}\r
+void AliTRDcheckConfig(Int_t runNr=0, const char *pathfile="nopathgiven"){\r
+  // Wrapping the function to be able to clean up\r
+  TFile *f=0;\r
+  WrappedAliTRDcheckConfig(runNr,pathfile,f);\r
+  AliCDBManager::Destroy();\r
+  if(f){\r
+    delete f; // Destructor calls TFile::Close()\r
+    f=0;\r
+  }\r
+}\r
+//______________________________________________________________________\r
+//\r
+// The stuff below is only for compiling a standalone program,\r
+// i.e., without root / aliroot \r
+//\r
+#if !defined(__CINT__)\r
+//______________________________________________________________________\r
+void reduceTimeOuts(){\r
+  // Reduces the grid timeouts\r
+  gEnv->SetValue("XNet.ConnectTimeout"    , 20);\r
+  gEnv->SetValue("XNet.RequestTimeout"    , 40);\r
+  gEnv->SetValue("XNet.MaxRedirectCount"  ,  2);\r
+  gEnv->SetValue("XNet.ReconnectWait"     ,  2);\r
+  gEnv->SetValue("XNet.FirstConnectMaxCnt",  3);\r
+  gEnv->SetValue("XNet.TransactionTimeout",300);\r
+}\r
+//______________________________________________________________________\r
+void printHelp(const char* argv0){\r
+  cout <<"Usuage: "<<argv0<< " [arg1 [arg2]]"<<endl\r
+       <<"Where arg1 can be:"<<endl\r
+       <<"  of type int-> gets treated as run number"<<endl\r
+       <<"  *.txt      -> gets treated as list of run numbers"<<endl\r
+       <<"  *.root     -> gets treated as OCDB entry"<<endl\r
+       <<"  -h,--help  -> displays this help"<<endl\r
+       <<"and arg2 can be"<<endl\r
+       <<"  -f, --fast   -> reduces grid timeouts"<<endl;\r
+}\r
+//______________________________________________________________________\r
+int main(int argc,char** argv){\r
+  // This macro is a standalone program.\r
   \r
+  // We change the meaning of the input \r
+  // parameters a bit. See the help message\r
+\r
+  // Error if too many arguments\r
+  if(argc>3){\r
+    cout << "Too many arguments!"<<endl;\r
+    printHelp(argv[0]);\r
+    return 1;\r
+  }\r
 \r
-}\r
+  // Check the argument two if any\r
+  if(argc>2){\r
+    if( (!strcmp("-f",argv[2])) ||\r
+       (!strcmp("--fast",argv[2])) ){\r
+      reduceTimeOuts();\r
+    }\r
+    else {\r
+      cout <<"Couldn't recognize your argument "\r
+          <<argv[2]<<endl;\r
+      printHelp(argv[0]);\r
+      return 1;\r
+    }\r
+  }\r
+\r
+  // Check argument one\r
+  if(argc>1){\r
+    // Convert to TString for easier handling\r
+    TString input(argv[1]);\r
+    // Help message\r
+    if( (!strcmp("-h",argv[1])) ||\r
+       (!strcmp("--help",argv[1])) ) {\r
+      printHelp(argv[0]);\r
+      return 0;\r
+    }\r
+    // int aka run number provided\r
+    else if(input.IsDigit()){\r
+      AliTRDcheckConfig(input.Atoi());\r
+      return 0;\r
+    }\r
+    // .root aka OCDB file provided\r
+    else if(input.EndsWith(".root")){\r
+      AliTRDcheckConfig(0,input.Data());\r
+      return 0;\r
+    }\r
+    // .txt aka list of root files provided\r
+    else if(input.EndsWith(".txt")){\r
+      // Open the text file\r
+      ifstream in;\r
+      in.open(Form("%s",input.Data()));\r
+      if (!in.is_open()){\r
+       cout << "F: Could not open file "<<input.Data()<<endl;\r
+       return 1;\r
+      }\r
+      // Loop over entries\r
+      string line;\r
+      TString Line;\r
+      while(in.good()) {\r
+       // Reading the line in the .txt file works fine\r
+       if(!getline(in,line)) break;\r
+       Line=line.data();\r
+       if(Line.IsNull()) continue;\r
+       // Run number provided\r
+       if(Line.IsDigit()){\r
+         AliTRDcheckConfig(Line.Atoi());\r
+       }\r
+       // .root file provided\r
+       else if(Line.EndsWith(".root")){\r
+         AliTRDcheckConfig(0,Line.Data());\r
+       }\r
+       else {\r
+         cout <<"Bad line in .txt file: "\r
+              <<Line.Data()<<endl;\r
+       }\r
+      } // End of loop over .txt file lines\r
+      return 0;\r
+    }\r
+    // Bad input, neither .root nor .txt nor int\r
+    else {\r
+      cout <<"Cannot recognize your input"\r
+          <<input.Data()<<endl;\r
+      printHelp(argv[0]);\r
+      return 1;\r
+    }\r
+  } // End of argc>1\r
+  \r
+  // Without arguments\r
+  AliTRDcheckConfig();\r
+  return 0;\r
+}// End of main\r
+\r
+// End of the non-root part\r
+#endif\r