]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDSaxHandler.cxx
Introduce smaller AliTRDCalDCSFEEv2 object (Frederick)
[u/mrichter/AliRoot.git] / TRD / AliTRDSaxHandler.cxx
index 945daec206c19d0c9be06c9cdc1d6928f6a96279..488ce8f157471f6e344a6bac6a61cfccdaf830bf 100644 (file)
 \r
 ////////////////////////////////////////////////////////////////////////////\r
 //                                                                        //\r
-//  The SAX XML file handler used in the preprocessor                     //\r
+//  The SAX XML file handler used in the TRD preprocessor                 //\r
 //                                                                        //\r
-//  Author                                                              //\r
+//  Authors:                                                              //\r
 //    Frederick Kramer (kramer@ikf.uni-frankfurt.de)                      //\r
+//    Thomas Bird      (thomas@thomasbird.com)                            //\r
 //                                                                        //\r
 ////////////////////////////////////////////////////////////////////////////\r
 \r
-#include <cstdlib>\r
-#include <Riostream.h>\r
-#include <TList.h>\r
-#include <TXMLAttr.h>\r
-#include <TSAXParser.h>\r
-#include <TObjArray.h>\r
 \r
+#include <TList.h>\r
+#include <TMath.h>\r
 #include "AliLog.h"\r
+#include "Cal/AliTRDCalDCSGTUTgu.h"\r
+#include "Cal/AliTRDCalDCSPTR.h"\r
 \r
+#include <TXMLAttr.h>\r
+#include <TObjArray.h>\r
 #include "AliTRDSaxHandler.h"\r
 #include "AliTRDgeometry.h"\r
-\r
-#include "Cal/AliTRDCalDCS.h"\r
-#include "Cal/AliTRDCalDCSFEE.h"\r
-#include "Cal/AliTRDCalDCSPTR.h"\r
+#include "Cal/AliTRDCalDCSv2.h"\r
+#include "Cal/AliTRDCalDCSFEEv2.h"\r
 #include "Cal/AliTRDCalDCSGTU.h"\r
 \r
 ClassImp(AliTRDSaxHandler)\r
-\r
+  \r
 //_____________________________________________________________________________\r
 AliTRDSaxHandler::AliTRDSaxHandler()\r
   :TObject()\r
@@ -51,22 +50,29 @@ AliTRDSaxHandler::AliTRDSaxHandler()
   ,fNDCSGTU(0)\r
   ,fFEEArr(new TObjArray(540))\r
   ,fPTRArr(new TObjArray(6))\r
-  ,fGTUArr(new TObjArray(19))\r
   ,fSystem(0)\r
+  ,fInsideRstate(0)\r
   ,fCurrentSM(0)\r
   ,fCurrentStack(0)\r
+  ,fCurrentROB(-1)\r
+  ,fCurrentMCM(-1)\r
+  ,fCurrentADC(-1)\r
   ,fContent(0)\r
   ,fDCSFEEObj(0)\r
   ,fDCSPTRObj(0)\r
   ,fDCSGTUObj(0)\r
-  ,fCalDCSObj(new AliTRDCalDCS())\r
+  ,fCalDCSObj(new AliTRDCalDCSv2())\r
+  ,fLevel1Tag(-2)\r
+  ,fLevel2Tag(-2)\r
+  ,fInsideBoardInfo(false)\r
+  ,fTmu(0)\r
+  ,fCtpOpc(0)\r
+  ,fSegment(0)\r
+  ,fBoardInfo(0)\r
 {\r
-  //\r
   // AliTRDSaxHandler default constructor\r
-  //\r
   fFEEArr->SetOwner();\r
   fPTRArr->SetOwner();\r
-  fGTUArr->SetOwner();\r
 }\r
 \r
 //_____________________________________________________________________________\r
@@ -77,29 +83,34 @@ AliTRDSaxHandler::AliTRDSaxHandler(const AliTRDSaxHandler &sh)
   ,fNDCSGTU(0)\r
   ,fFEEArr(0)\r
   ,fPTRArr(0)\r
-  ,fGTUArr(0)\r
   ,fSystem(0)\r
+  ,fInsideRstate(0)\r
   ,fCurrentSM(0)\r
   ,fCurrentStack(0)\r
+  ,fCurrentROB(-1)\r
+  ,fCurrentMCM(-1)\r
+  ,fCurrentADC(-1)\r
   ,fContent(0)\r
   ,fDCSFEEObj(0)\r
   ,fDCSPTRObj(0)\r
   ,fDCSGTUObj(0)\r
   ,fCalDCSObj(0)\r
+  ,fLevel1Tag(-2)\r
+  ,fLevel2Tag(-2)\r
+  ,fInsideBoardInfo(false)\r
+  ,fTmu(0)\r
+  ,fCtpOpc(0)\r
+  ,fSegment(0)\r
+  ,fBoardInfo(0)\r
 {\r
-  //\r
   // AliTRDSaxHandler copy constructor\r
-  //\r
 }\r
 \r
 //_____________________________________________________________________________\r
 AliTRDSaxHandler &AliTRDSaxHandler::operator=(const AliTRDSaxHandler &sh)\r
 {\r
-  //\r
   // Assignment operator\r
-  //\r
   if (&sh == this) return *this;\r
-\r
   new (this) AliTRDSaxHandler(sh);\r
   return *this;\r
 }\r
@@ -107,10 +118,7 @@ AliTRDSaxHandler &AliTRDSaxHandler::operator=(const AliTRDSaxHandler &sh)
 //_____________________________________________________________________________\r
 AliTRDSaxHandler::~AliTRDSaxHandler()\r
 {\r
-  //\r
   // AliTRDSaxHandler destructor\r
-  //\r
-\r
   if (fFEEArr) {\r
     delete fFEEArr;\r
     fFEEArr    = 0x0;\r
@@ -119,90 +127,213 @@ AliTRDSaxHandler::~AliTRDSaxHandler()
     delete fPTRArr;\r
     fPTRArr    = 0x0;\r
   }\r
-  if (fGTUArr) {\r
-    delete fGTUArr;\r
-    fGTUArr    = 0x0;\r
+  if (fDCSGTUObj) {\r
+    delete fDCSGTUObj;\r
+    fDCSGTUObj    = 0x0;\r
   }\r
   if (fCalDCSObj) {\r
     delete fCalDCSObj;\r
     fCalDCSObj = 0x0;\r
   }\r
-\r
 }\r
 \r
 //_____________________________________________________________________________\r
-AliTRDCalDCS* AliTRDSaxHandler::GetCalDCSObj()\r
+AliTRDCalDCSv2* AliTRDSaxHandler::GetCalDCSObj()\r
 {\r
   // put the arrays in the global calibration object and return this\r
-  fCalDCSObj->SetNumberOfTimeBins(0); //test test test\r
   fCalDCSObj->SetFEEArr(fFEEArr);\r
   fCalDCSObj->SetPTRArr(fPTRArr);\r
-  fCalDCSObj->SetGTUArr(fGTUArr);\r
+  fCalDCSObj->SetGTUObj(fDCSGTUObj);\r
   return fCalDCSObj;\r
 }\r
 \r
 //_____________________________________________________________________________\r
-void AliTRDSaxHandler::OnStartDocument()\r
+void AliTRDSaxHandler::OnStartDocument() const\r
 {\r
   // if something should happen right at the beginning of the\r
   // XML document, this must happen here\r
 }\r
 \r
 //_____________________________________________________________________________\r
-void AliTRDSaxHandler::OnEndDocument()\r
+void AliTRDSaxHandler::OnEndDocument() const\r
 {\r
   // if something should happen at the end of the XML document\r
   // this must be done here\r
 }\r
 \r
+//_____________________________________________________________________________\r
+bool AliTRDSaxHandler::CompareString(TString str, const char *str2)\r
+{\r
+  // compre strings, ignoring case\r
+  // returns true if they are the same, else false\r
+  return !(bool)str.CompareTo(str2,str.kIgnoreCase);\r
+}\r
+\r
+\r
 //_____________________________________________________________________________\r
 void AliTRDSaxHandler::OnStartElement(const char *name, const TList *attributes)\r
 {\r
   // when a new XML element is found, it is processed here\r
-  fContent    = "";\r
+  fContent    = ""; // Technically <p> This <em>is</em> ok but would be a problem here</p>\r
   Int_t dcsId = 0;\r
-  TString strName  = name;\r
+  TString tagName  = name;\r
   TString dcsTitle = "";\r
 \r
   // set the current system if necessary\r
-  if (strName.Contains("FEE")) fSystem = kInsideFEE;\r
-  if (strName.Contains("PTR")) fSystem = kInsidePTR;\r
-  if (strName.Contains("GTU")) fSystem = kInsideGTU;\r
+  if (CompareString(tagName, "FEE")) fSystem = kInsideFEE;\r
+  if (CompareString(tagName, "PTR")) fSystem = kInsidePTR;\r
+  if (CompareString(tagName, "GTU")) {\r
+    fSystem = kInsideGTU;\r
+    fDCSGTUObj = new AliTRDCalDCSGTU(tagName,tagName);\r
+  }\r
+\r
+  if (fSystem == kInsideGTU) {\r
+    if (CompareString(tagName, "tgu")) fLevel1Tag = kInsideTgu;\r
+    if (CompareString(tagName, "board_info")) {\r
+      fInsideBoardInfo = true;\r
+      fBoardInfo = new AliTRDCalDCSGTUBoardInfo(tagName,tagName);\r
+    }\r
+    if (CompareString(tagName(0,tagName.Length()-3), "segment")) { \r
+      fSegment = new AliTRDCalDCSGTUSegment(tagName,tagName);\r
+      fSegment->SetId(TString(tagName(8,2)).Atoi());\r
+      fLevel1Tag = kInsideSegment;\r
+    }\r
+    if (fLevel1Tag == kInsideTgu) {\r
+      if (CompareString(tagName, "ctp_opc"))   fCtpOpc = new AliTRDCalDCSGTUCtpOpc(tagName,tagName);\r
+    } else if (fLevel1Tag == kInsideSegment) {\r
+      if (CompareString(tagName, "smu")) {\r
+       fLevel2Tag = kInsideSmu;\r
+      }\r
+      if (CompareString(tagName(0,3), "tmu")) {\r
+       fTmu = new AliTRDCalDCSGTUTmu(tagName,tagName);\r
+       fTmu->SetId(TString(tagName(4,2)).Atoi());\r
+       fLevel2Tag = kInsideTmu;\r
+      }\r
+    }\r
+  } else if (fSystem == kInsideFEE) {\r
+    if (CompareString(tagName, "gaintbl")) fLevel1Tag = kInsideGainTable;\r
+  }\r
+\r
+  // set if we are inside rstate \r
+  // (in principle not necessary - just to be more safe against stupid tags)\r
+  if (CompareString(tagName, "rstate")) fInsideRstate = 1;\r
 \r
   // get the attributes of the element\r
   TXMLAttr *attr;\r
   TIter next(attributes);\r
   while ((attr = (TXMLAttr*) next())) {\r
     TString attribName = attr->GetName();\r
-    if (attribName.Contains("id") && strName.Contains("DCS")) {\r
-      dcsTitle = name;\r
-      dcsId = atoi(attr->GetValue());\r
-    }\r
-    if (attribName.Contains("roc") && strName.Contains("ack")) {\r
-      if (atoi(attr->GetValue()) != fDCSFEEObj->GetDCSid())\r
-       fDCSFEEObj->SetStatusBit(3); // consistence check\r
-    }\r
-    if (attribName.Contains("sm") && strName.Contains("DCS")) {\r
-      fCurrentSM = atoi(attr->GetValue()); // only for GTU/PTR\r
+    TString attribValue = attr->GetValue();\r
+    if (fSystem == kInsideFEE && fLevel1Tag == kInsideNone) {\r
+      if (CompareString(attribName, "id") && CompareString(tagName, "DCS")) {\r
+       dcsTitle = name;\r
+       dcsId = atoi(attr->GetValue());\r
+      }\r
+      if (CompareString(attribName, "roc") && CompareString(tagName, "ack")) {\r
+       if (attribValue.Atoi() != fDCSFEEObj->GetDCSid())\r
+         fDCSFEEObj->SetStatusBit(4); // consistency check\r
+      }\r
+      if (CompareString(attribName, "rob") && CompareString(tagName, "ro-board") && (fInsideRstate == 1)) {\r
+       fCurrentROB = attribValue.Atoi();\r
+      }\r
+      if (CompareString(attribName, "mcm") && CompareString(tagName, "m") && (fInsideRstate == 1)) {\r
+       fCurrentMCM = attribValue.Atoi();\r
+      }\r
+      if (CompareString(attribName, "sm") && CompareString(tagName, "DCS")) {\r
+       fCurrentSM = attribValue.Atoi(); // only for GTU/PTR\r
+      }\r
+      if (CompareString(attribName, "id") && CompareString(tagName, "STACK")) {// hmmmm not exist?\r
+       fCurrentStack = attribValue.Atoi(); // only for GTU/PTR\r
+      }\r
+    } else if (fSystem == kInsideFEE && fLevel1Tag == kInsideGainTable) {\r
+      if (CompareString(tagName, "roc") && CompareString(attribName, "type"))    fDCSFEEObj->SetGainTableRocType(attribValue);\r
+      if (CompareString(tagName, "roc") && CompareString(attribName, "serial"))  fDCSFEEObj->SetGainTableRocSerial(attribValue.Atoi());\r
+      if (CompareString(tagName, "mcm") && CompareString(attribName, "rob"))     fCurrentROB = attribValue.Atoi();\r
+      if (CompareString(tagName, "mcm") && CompareString(attribName, "pos"))     fCurrentMCM = attribValue.Atoi();\r
+      if (CompareString(tagName, "adc") && CompareString(attribName, "id"))      fCurrentADC = attribValue.Atoi();\r
+      \r
+    } else if (fSystem == kInsideGTU && fLevel1Tag == kInsideNone) {\r
+      if (CompareString(tagName, "publisher")) {\r
+       if (CompareString(attribName, "at"))         fDCSGTUObj->SetSORFlag(attribValue.Atoi());\r
+       if (CompareString(attribName, "serial"))     fDCSGTUObj->SetSerial(attribValue.Atoi());\r
+       if (CompareString(attribName, "runnr"))      fDCSGTUObj->SetRunNumber(attribValue.Atoi());\r
+      }\r
+    } else if (fSystem == kInsideGTU && fLevel1Tag == kInsideTgu) {\r
+      if (CompareString(tagName, "from")) {\r
+       if (CompareString(attribName, "at"))         fDCSGTUObj->GetTgu()->SetFromSORFlag(attribValue.Atoi());\r
+       if (CompareString(attribName, "runnr"))      fDCSGTUObj->GetTgu()->SetFromRunNumber(attribValue.Atoi());\r
+       if (CompareString(attribName, "child"))      fDCSGTUObj->GetTgu()->SetFromChild(attribValue.Atoi());\r
+      }\r
+      if (CompareString(tagName, "segmentmask") && CompareString(attribName, "value"))  fDCSGTUObj->GetTgu()->SetSegmentMask(attribValue);\r
+      if (CompareString(tagName, "busymask") && CompareString(attribName, "value"))     fDCSGTUObj->GetTgu()->SetBusyMask(attribValue);\r
+      if (CompareString(tagName, "contribmask") && CompareString(attribName, "value"))  fDCSGTUObj->GetTgu()->SetContribMask(attribValue);\r
+      \r
+      if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "id"))         fCtpOpc->SetId(attribValue.Atoi());\r
+      if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "opcode"))     fCtpOpc->SetOpcode(attribValue.Atoi());\r
+      if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "direction"))  fCtpOpc->SetDirection(attribValue.Atoi());\r
+      if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "inverted"))   fCtpOpc->SetInverted(attribValue.Atoi());\r
+      if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "delay"))      fCtpOpc->SetDelay(attribValue.Atoi());\r
+      if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "connected"))  fCtpOpc->SetConnected(attribValue.Atoi());\r
+      \r
+    } else if (fSystem == kInsideGTU && fLevel1Tag == kInsideSegment) {\r
+      if (CompareString(tagName, "from")) {\r
+       if (CompareString(attribName, "at"))         fSegment->SetFromSORFlag(attribValue.Atoi());\r
+       if (CompareString(attribName, "runnr"))      fSegment->SetFromRunNumber(attribValue.Atoi());\r
+       if (CompareString(attribName, "child"))      fSegment->SetFromChild(attribValue.Atoi());\r
+      }\r
+      if (fLevel2Tag == kInsideSmu) {\r
+       if (CompareString(tagName, "stackmask") && CompareString(attribName, "value"))     fSegment->SetSmuStackMask(attribValue);\r
+       if (CompareString(tagName, "tracklets") && CompareString(attribName, "send"))      fSegment->SetSmuTracklets(attribValue.Atoi());\r
+       if (CompareString(tagName, "tracks") && CompareString(attribName, "send"))         fSegment->SetSmuTracks(attribValue.Atoi());\r
+       if (CompareString(tagName, "idelay") && CompareString(attribName, "value"))        fSegment->SetSmuIdelay(attribValue.Atoi());\r
+       if (CompareString(tagName, "ttc_emulator") && CompareString(attribName, "enable")) fSegment->SetSmuTtcEmulatorEnable(attribValue.Atoi());\r
+       \r
+       if (CompareString(tagName, "trigger_window") && CompareString(attribName, "l1_low"))  \r
+         fSegment->SetSmuTriggerWindowL1Low(attribValue.Atoi());\r
+       if (CompareString(tagName, "trigger_window") && CompareString(attribName, "l1_high"))  \r
+         fSegment->SetSmuTriggerWindowL1High(attribValue.Atoi());\r
+       if (CompareString(tagName, "trigger_window") && CompareString(attribName, "l2_low"))  \r
+         fSegment->SetSmuTriggerWindowL2Low(attribValue.Atoi());\r
+       if (CompareString(tagName, "trigger_window") && CompareString(attribName, "l2_high"))  \r
+         fSegment->SetSmuTriggerWindowL2High(attribValue.Atoi());\r
+       \r
+      } else if (fLevel2Tag == kInsideTmu) {\r
+       if (CompareString(tagName, "linkmask") && CompareString(attribName, "value"))      fTmu->SetLinkMask(attribValue);\r
+       if (CompareString(tagName, "pattern_generator") && CompareString(attribName, "enable")) \r
+         fTmu->SetPatternGeneratorEnable(attribValue.Atoi());\r
+       if (CompareString(tagName, "pattern_generator") && CompareString(attribName, "datawords")) \r
+         fTmu->SetPatternGeneratorDataWords(attribValue.Atoi());\r
+       if (CompareString(tagName, "pattern_generator") && CompareString(attribName, "trackletwords")) \r
+         fTmu->SetPatternGeneratorTrackletWords(attribValue.Atoi());\r
+      }\r
     }\r
-    if (attribName.Contains("id") && strName.Contains("STACK")) {\r
-      fCurrentStack = atoi(attr->GetValue()); // only for GTU/PTR\r
+    \r
+    if (fInsideBoardInfo) {\r
+      if (CompareString(tagName, "board_info") && CompareString(attribName, "board_id"))    fBoardInfo->SetId(attribValue);\r
+      if (CompareString(tagName, "board_info") && CompareString(attribName, "design_type")) fBoardInfo->SetType(attribValue.Atoi());\r
+      if (CompareString(tagName, "board_info") && CompareString(attribName, "pci_ga"))      fBoardInfo->SetPciGa(attribValue.Atoi());\r
+      if (CompareString(tagName, "hardware") && CompareString(attribName, "date"))          fBoardInfo->SetHwDate(attribValue);\r
+      if (CompareString(tagName, "hardware") && CompareString(attribName, "rev"))           fBoardInfo->SetHwRev(attribValue.Atoi());\r
+      if (CompareString(tagName, "hardware") && CompareString(attribName, "clean"))         fBoardInfo->SetHwClean(attribValue.Atoi());\r
+      if (CompareString(tagName, "software") && CompareString(attribName, "date"))          fBoardInfo->SetSwDate(attribValue);\r
+      if (CompareString(tagName, "software") && CompareString(attribName, "rev"))           fBoardInfo->SetSwRev(attribValue.Atoi());\r
+      if (CompareString(tagName, "software") && CompareString(attribName, "clean"))         fBoardInfo->SetSwClean(attribValue.Atoi());\r
     }\r
   }\r
 \r
   // if there is a new DCS element put it in the correct array\r
-  if (strName.Contains("DCS")) {\r
+  if (CompareString(tagName, "DCS")) {\r
     if (fSystem == kInsideFEE) {\r
-      fDCSFEEObj = new AliTRDCalDCSFEE(name,dcsTitle);\r
+      fDCSFEEObj = new AliTRDCalDCSFEEv2();\r
       fDCSFEEObj->SetDCSid(dcsId);\r
     }\r
     if (fSystem == kInsidePTR) {\r
-      fDCSPTRObj = new AliTRDCalDCSPTR(name,dcsTitle);\r
-      fDCSPTRObj->SetDCSid(dcsId);\r
+//       fDCSPTRObj = new AliTRDCalDCSPTR(name,dcsTitle);\r
+//       fDCSPTRObj->SetDCSid(dcsId);\r
     }\r
     if (fSystem == kInsideGTU) {\r
-      fDCSGTUObj = new AliTRDCalDCSGTU(name,dcsTitle);\r
-      fDCSGTUObj->SetDCSid(dcsId);\r
+//       fDCSGTUObj = new AliTRDCalDCSGTU(name,dcsTitle);\r
+//       fDCSGTUObj->SetDCSid(dcsId);\r
     }\r
   }\r
 }\r
@@ -211,11 +342,11 @@ void AliTRDSaxHandler::OnStartElement(const char *name, const TList *attributes)
 void AliTRDSaxHandler::OnEndElement(const char *name)\r
 {\r
   // do everything that needs to be done when an end tag of an element is found\r
-  TString strName = name;\r
+  TString tagName = name;\r
   \r
   // if done with this DCS board, put it in the correct array\r
   // no check for </ack> necessary since this check is done during XML validation\r
-  if (strName.Contains("DCS")) {\r
+  if (CompareString(tagName, "DCS")) {\r
     if (fSystem == kInsideFEE) {\r
       Int_t detID = 0;\r
       if (fDCSFEEObj->GetStatusBit() == 0) {\r
@@ -236,44 +367,106 @@ void AliTRDSaxHandler::OnEndElement(const char *name)
       fPTRArr->AddAt(fDCSPTRObj,fNDCSPTR);\r
       fNDCSPTR++;\r
     }\r
-    if (fSystem == kInsideGTU) {\r
-      fGTUArr->AddAt(fDCSGTUObj,fNDCSGTU);\r
-      fNDCSGTU++;\r
-    }\r
+//     if (fSystem == kInsideGTU) {\r
+//       fGTUArr->AddAt(fDCSGTUObj,fNDCSGTU);\r
+//       fNDCSGTU++;\r
+//     }\r
     fCurrentSM = 99; // 99 for no SM set\r
     fDCSFEEObj = 0;  // just to be sure\r
     return;\r
   }\r
 \r
-  // done with this stack?\r
-  if (strName.Contains("STACK")) {\r
+  // done with this stack? \r
+  if (CompareString(tagName, "STACK")) {// TODO: errrrm ???? always 99?\r
     fCurrentStack = 99; // 99 for no stack set\r
   }\r
 \r
+  // outside of rstate again?\r
+  if (CompareString(tagName, "rstate")) {\r
+    fInsideRstate = 0;\r
+    fCurrentROB   = -1;\r
+    fCurrentMCM   = -1;\r
+  }\r
+  if (CompareString(tagName, "ro-board")) fCurrentROB = -1;\r
+  \r
   // store informations of the FEE DCS-Board\r
   if (fSystem == kInsideFEE) {\r
-    if (strName.Contains("DNR")) fDCSFEEObj->SetStatusBit(fContent.Atoi());\r
-    if (strName.Contains("CFGNME")) fDCSFEEObj->SetConfigName(fContent);\r
-    if (strName.Contains("CFGTAG")) fDCSFEEObj->SetConfigTag(fContent.Atoi());\r
-    if (strName.Contains("CFGVRSN")) fDCSFEEObj->SetConfigVersion(fContent);\r
-    if (strName.Contains("NTB")) fDCSFEEObj->SetNumberOfTimeBins(fContent.Atoi());\r
-    if (strName.Contains("SM-ID")) fDCSFEEObj->SetSM(fContent.Atoi());\r
-    if (strName.Contains("STACK-ID")) fDCSFEEObj->SetStack(fContent.Atoi());\r
-    if (strName.Contains("LAYER-ID")) fDCSFEEObj->SetLayer(fContent.Atoi());\r
-    if (strName.Contains("SINGLEHITTHRES")) fDCSFEEObj->SetSingleHitThres(fContent.Atoi());\r
-    if (strName.Contains("THRPDCLSTHRS")) fDCSFEEObj->SetThreePadClustThres(fContent.Atoi());\r
-    if (strName.Contains("SELNOZS")) fDCSFEEObj->SetSelectiveNoZS(fContent.Atoi());\r
-    if (strName.Contains("FASTSTATNOISE")) fDCSFEEObj->SetFastStatNoise(fContent.Atoi());\r
-    if (strName.Contains("FILTWEIGHT")) fDCSFEEObj->SetTCFilterWeight(fContent.Atoi());\r
-    if (strName.Contains("FILTSHRTDCYPRM")) fDCSFEEObj->SetTCFilterShortDecPar(fContent.Atoi());\r
-    if (strName.Contains("FILTLNGDCYPRM")) fDCSFEEObj->SetTCFilterLongDecPar(fContent.Atoi());\r
-    if (strName.Contains("FLTR")) fDCSFEEObj->SetFilterType(fContent);\r
-    if (strName.Contains("READOURPAR")) fDCSFEEObj->SetReadoutParam(fContent);\r
-    if (strName.Contains("TESTPATTERN")) fDCSFEEObj->SetTestPattern(fContent);\r
-    if (strName.Contains("TRCKLTMODE")) fDCSFEEObj->SetTrackletMode(fContent);\r
-    if (strName.Contains("TRCKLTDEF")) fDCSFEEObj->SetTrackletDef(fContent);\r
-    if (strName.Contains("TRGGRSTP")) fDCSFEEObj->SetTriggerSetup(fContent);\r
-    if (strName.Contains("ADDOPTIONS")) fDCSFEEObj->SetAddOptions(fContent);\r
+    if (CompareString(tagName, "DNR"))            fDCSFEEObj->SetStatusBit(fContent.Atoi());\r
+    if (CompareString(tagName, "CFGNME"))         fDCSFEEObj->SetConfigName(fContent);\r
+    if (CompareString(tagName, "CFGTAG"))         fDCSFEEObj->SetConfigTag(fContent.Atoi());\r
+    if (CompareString(tagName, "CFGVRSN"))        fDCSFEEObj->SetConfigVersion(fContent);\r
+    if (CompareString(tagName, "NTB"))            fDCSFEEObj->SetNumberOfTimeBins(fContent.Atoi());\r
+    if (CompareString(tagName, "SM-ID"))          fDCSFEEObj->SetSM(fContent.Atoi());\r
+    if (CompareString(tagName, "STACK-ID"))       fDCSFEEObj->SetStack(fContent.Atoi());\r
+    if (CompareString(tagName, "LAYER-ID"))       fDCSFEEObj->SetLayer(fContent.Atoi());\r
+    if (CompareString(tagName, "SINGLEHITTHRES")) fDCSFEEObj->SetSingleHitThres(fContent.Atoi());\r
+    if (CompareString(tagName, "THRPADCLSTHRS"))  fDCSFEEObj->SetThreePadClustThres(fContent.Atoi());\r
+    if (CompareString(tagName, "SELNOZS"))        fDCSFEEObj->SetSelectiveNoZS(fContent.Atoi());\r
+    if (CompareString(tagName, "FASTSTATNOISE"))  fDCSFEEObj->SetFastStatNoise(fContent.Atoi());\r
+    if (CompareString(tagName, "FILTWEIGHT"))     fDCSFEEObj->SetTCFilterWeight(fContent.Atoi());\r
+    if (CompareString(tagName, "FILTSHRTDCYPRM")) fDCSFEEObj->SetTCFilterShortDecPar(fContent.Atoi());\r
+    if (CompareString(tagName, "FILTLNGDCYPRM"))  fDCSFEEObj->SetTCFilterLongDecPar(fContent.Atoi());\r
+    if (CompareString(tagName, "FLTR"))           fDCSFEEObj->SetFilterType(fContent);\r
+    if (CompareString(tagName, "READOUTPAR"))     fDCSFEEObj->SetReadoutParam(fContent);\r
+    if (CompareString(tagName, "TESTPATTERN"))    fDCSFEEObj->SetTestPattern(fContent);\r
+    if (CompareString(tagName, "TRCKLTMODE"))     fDCSFEEObj->SetTrackletMode(fContent);\r
+    if (CompareString(tagName, "TRCKLTDEF"))      fDCSFEEObj->SetTrackletDef(fContent);\r
+    if (CompareString(tagName, "TRIGGERSETUP"))   fDCSFEEObj->SetTriggerSetup(fContent);\r
+    if (CompareString(tagName, "ADDOPTIONS"))     fDCSFEEObj->SetAddOptions(fContent);\r
+    if (CompareString(tagName, "gaintbl")) {\r
+      fLevel1Tag = kInsideNone;\r
+      fCurrentROB = -1;\r
+      fCurrentMCM = -1;\r
+      fCurrentADC = -1;\r
+    }\r
+    if (fLevel1Tag == kInsideGainTable) {\r
+      if (CompareString(tagName, "name"))   fDCSFEEObj->SetGainTableName(fContent);\r
+      if (CompareString(tagName, "desc"))   fDCSFEEObj->SetGainTableDesc(fContent);\r
+      if (fCurrentROB>=0 && fCurrentMCM>=0) {\r
+       if (CompareString(tagName, "adcdac")) fDCSFEEObj->SetGainTableAdcdac(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
+       if (fCurrentADC>=0) {\r
+         if (CompareString(tagName, "fgfn"))   fDCSFEEObj->SetGainTableFgfn(fCurrentROB, fCurrentMCM, fCurrentADC, fContent.Atoi());\r
+         if (CompareString(tagName, "fgan"))   fDCSFEEObj->SetGainTableFgan(fCurrentROB, fCurrentMCM, fCurrentADC, fContent.Atoi());\r
+       }\r
+      }\r
+    }\r
+    if (fInsideRstate == 1) {\r
+      if (fCurrentROB>=0 && fCurrentMCM>=0) {\r
+       if (CompareString(tagName, "gsm")) fDCSFEEObj->SetMCMGlobalState(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
+        if (CompareString(tagName, "ni")) fDCSFEEObj->SetMCMStateNI(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
+       if (CompareString(tagName, "ev")) fDCSFEEObj->SetMCMEventCnt(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
+       if (CompareString(tagName, "ptrg")) fDCSFEEObj->SetMCMPtCnt(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
+      }\r
+    }\r
+  }\r
+\r
+  if (fSystem == kInsideGTU) {\r
+//     if (CompareString(tagName, "run")) { \r
+//       fDCSGTUObj->SetSORFlag(TString(fContent(fContent.Length()-1,1)).Atoi());\r
+//       fDCSGTUObj->SetRunNumber(TString(fContent(0,fContent.Length()-2)).Atoi());\r
+//     }\r
+//     if (CompareString(tagName, "serial"))         fDCSGTUObj->SetSerial(fContent.Atoi());\r
+    if (CompareString(tagName, "board_info")) {\r
+      fInsideBoardInfo = false;\r
+      if (fLevel1Tag == kInsideTgu)                                  fDCSGTUObj->GetTgu()->SetBoardInfo(fBoardInfo);\r
+      if (fLevel1Tag == kInsideSegment && fLevel2Tag == kInsideSmu)  fSegment->SetSmuBoardInfo(fBoardInfo);\r
+      if (fLevel1Tag == kInsideSegment && fLevel2Tag == kInsideTmu)  fTmu->SetBoardInfo(fBoardInfo);\r
+    }\r
+    if (CompareString(tagName, "dnr"))            fDCSGTUObj->SetDNR(fContent.Atoi());\r
+    if (CompareString(tagName, "tgu"))            fLevel1Tag = kInsideNone;\r
+    if (CompareString(tagName(0,tagName.Length()-3), "segment")) { \r
+      fDCSGTUObj->GetSegmentArray()->Add(fSegment);\r
+      fLevel1Tag = kInsideNone;\r
+    }\r
+    if (fLevel1Tag == kInsideTgu) {\r
+      if (CompareString(tagName, "ctp_opc"))        fDCSGTUObj->GetTgu()->GetCtpOpcArray()->Add(fCtpOpc);\r
+    } else if (fLevel1Tag == kInsideSegment) {\r
+      if (CompareString(tagName, "smu"))          fLevel2Tag = kInsideNone;\r
+      if (CompareString(tagName(0,3), "tmu")) {\r
+       fSegment->GetTmuArray()->Add(fTmu);\r
+       fLevel2Tag = kInsideNone;\r
+      }\r
+    }\r
   }\r
 \r
   \r
@@ -281,15 +474,15 @@ void AliTRDSaxHandler::OnEndElement(const char *name)
   if (fSystem == kInsidePTR) {\r
     // no informations available yet\r
   }\r
-  // store GTU informations\r
-  if (fSystem == kInsideGTU) {\r
-    if (strName.Contains("SMMASK"))\r
-      fHandlerStatus = fDCSGTUObj->SetSMMask(fContent);\r
-    if (strName.Contains("LINKMASK")) \r
-      fHandlerStatus = fDCSGTUObj->SetLinkMask(fCurrentSM, fCurrentStack, fContent);\r
-    if (strName.Contains("STMASK"))\r
-      fDCSGTUObj->SetStackMaskBit(fCurrentSM, fCurrentStack, fContent.Atoi());\r
-  }\r
+//   // store GTU informations\r
+//   if (fSystem == kInsideGTU) {\r
+//     if (CompareString(tagName, "SMMASK"))\r
+//       fHandlerStatus = fDCSGTUObj->SetSMMask(fContent);\r
+//     if (CompareString(tagName, "LINKMASK")) \r
+//       fHandlerStatus = fDCSGTUObj->SetLinkMask(fCurrentSM, fCurrentStack, fContent);\r
+//     if (CompareString(tagName, "STMASK"))\r
+//       fDCSGTUObj->SetStackMaskBit(fCurrentSM, fCurrentStack, fContent.Atoi());\r
+//   }\r
 }\r
 \r
 //_____________________________________________________________________________\r
@@ -300,7 +493,7 @@ void AliTRDSaxHandler::OnCharacters(const char *characters)
 }\r
 \r
 //_____________________________________________________________________________\r
-void AliTRDSaxHandler::OnComment(const char* /*text*/)\r
+void AliTRDSaxHandler::OnComment(const char* /*text*/) const\r
 {\r
   // comments within the XML file are ignored\r
 }\r
@@ -327,7 +520,7 @@ void AliTRDSaxHandler::OnFatalError(const char *text)
 }\r
 \r
 //_____________________________________________________________________________\r
-void AliTRDSaxHandler::OnCdataBlock(const char* /*text*/, Int_t /*len*/)\r
+void AliTRDSaxHandler::OnCdataBlock(const char* /*text*/, Int_t /*len*/) const\r
 {\r
   // process character data blocks here\r
   // not implemented and should not be used here\r