]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDSaxHandler.cxx
Modifications by Thomas
[u/mrichter/AliRoot.git] / TRD / AliTRDSaxHandler.cxx
1 /*************************************************************************\r
2  * * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *\r
3  * *                                                                        *\r
4  * * Author: The ALICE Off-line Project.                                    *\r
5  * * Contributors are mentioned in the code where appropriate.              *\r
6  * *                                                                        *\r
7  * * Permission to use, copy, modify and distribute this software and its   *\r
8  * * documentation strictly for non-commercial purposes is hereby granted   *\r
9  * * without fee, provided that the above copyright notice appears in all   *\r
10  * * copies and that both the copyright notice and this permission notice   *\r
11  * * appear in the supporting documentation. The authors make no claims     *\r
12  * * about the suitability of this software for any purpose. It is          *\r
13  * * provided "as is" without express or implied warranty.                  *\r
14  * **************************************************************************/\r
15 \r
16 /* $Id: AliTRDSaxHandler.cxx 26327 2008-06-02 15:36:18Z cblume $ */\r
17 \r
18 ////////////////////////////////////////////////////////////////////////////\r
19 //                                                                        //\r
20 //  The SAX XML file handler used in the preprocessor                     //\r
21 //                                                                        //\r
22 //  Author:                                                               //\r
23 //    Frederick Kramer (kramer@ikf.uni-frankfurt.de)                      //\r
24 //                                                                        //\r
25 ////////////////////////////////////////////////////////////////////////////\r
26 \r
27 #include <TList.h>\r
28 #include <TXMLAttr.h>\r
29 #include <TObjArray.h>\r
30 #include <TMath.h>\r
31 \r
32 #include "AliLog.h"\r
33 \r
34 #include "AliTRDSaxHandler.h"\r
35 #include "AliTRDgeometry.h"\r
36 \r
37 #include "Cal/AliTRDCalDCS.h"\r
38 #include "Cal/AliTRDCalDCSFEE.h"\r
39 #include "Cal/AliTRDCalDCSPTR.h"\r
40 #include "Cal/AliTRDCalDCSGTU.h"\r
41 \r
42 ClassImp(AliTRDSaxHandler)\r
43   \r
44 //_____________________________________________________________________________\r
45 AliTRDSaxHandler::AliTRDSaxHandler()\r
46   :TObject()\r
47   ,fHandlerStatus(0)\r
48   ,fNDCSPTR(0)\r
49   ,fNDCSGTU(0)\r
50   ,fFEEArr(new TObjArray(540))\r
51   ,fPTRArr(new TObjArray(6))\r
52   ,fSystem(0)\r
53   ,fInsideRstate(0)\r
54   ,fCurrentSM(0)\r
55   ,fCurrentStack(0)\r
56   ,fCurrentROB(-1)\r
57   ,fCurrentMCM(-1)\r
58   ,fCurrentADC(-1)\r
59   ,fContent(0)\r
60   ,fDCSFEEObj(0)\r
61   ,fDCSPTRObj(0)\r
62   ,fDCSGTUObj(0)\r
63   ,fCalDCSObj(new AliTRDCalDCS())\r
64   ,fLevel1Tag(-2)\r
65   ,fLevel2Tag(-2)\r
66   ,fInsideBoardInfo(false)\r
67   ,fTmu(0)\r
68   ,fCtpOpc(0)\r
69   ,fSegment(0)\r
70   ,fBoardInfo(0)\r
71 {\r
72   //\r
73   // AliTRDSaxHandler default constructor\r
74   //\r
75   fFEEArr->SetOwner();\r
76   fPTRArr->SetOwner();\r
77 }\r
78 \r
79 //_____________________________________________________________________________\r
80 AliTRDSaxHandler::AliTRDSaxHandler(const AliTRDSaxHandler &sh)\r
81   :TObject(sh)\r
82   ,fHandlerStatus(0)\r
83   ,fNDCSPTR(0)\r
84   ,fNDCSGTU(0)\r
85   ,fFEEArr(0)\r
86   ,fPTRArr(0)\r
87   ,fSystem(0)\r
88   ,fInsideRstate(0)\r
89   ,fCurrentSM(0)\r
90   ,fCurrentStack(0)\r
91   ,fCurrentROB(-1)\r
92   ,fCurrentMCM(-1)\r
93   ,fCurrentADC(-1)\r
94   ,fContent(0)\r
95   ,fDCSFEEObj(0)\r
96   ,fDCSPTRObj(0)\r
97   ,fDCSGTUObj(0)\r
98   ,fCalDCSObj(0)\r
99   ,fLevel1Tag(-2)\r
100   ,fLevel2Tag(-2)\r
101   ,fInsideBoardInfo(false)\r
102   ,fTmu(0)\r
103   ,fCtpOpc(0)\r
104   ,fSegment(0)\r
105   ,fBoardInfo(0)\r
106 {\r
107   //\r
108   // AliTRDSaxHandler copy constructor\r
109   //\r
110 }\r
111 \r
112 //_____________________________________________________________________________\r
113 AliTRDSaxHandler &AliTRDSaxHandler::operator=(const AliTRDSaxHandler &sh)\r
114 {\r
115   //\r
116   // Assignment operator\r
117   //\r
118   if (&sh == this) return *this;\r
119 \r
120   new (this) AliTRDSaxHandler(sh);\r
121   return *this;\r
122 }\r
123 \r
124 //_____________________________________________________________________________\r
125 AliTRDSaxHandler::~AliTRDSaxHandler()\r
126 {\r
127   //\r
128   // AliTRDSaxHandler destructor\r
129   //\r
130 \r
131   if (fFEEArr) {\r
132     delete fFEEArr;\r
133     fFEEArr    = 0x0;\r
134   }\r
135   if (fPTRArr) {\r
136     delete fPTRArr;\r
137     fPTRArr    = 0x0;\r
138   }\r
139   if (fDCSGTUObj) {\r
140     delete fDCSGTUObj;\r
141     fDCSGTUObj    = 0x0;\r
142   }\r
143   if (fCalDCSObj) {\r
144     delete fCalDCSObj;\r
145     fCalDCSObj = 0x0;\r
146   }\r
147 \r
148 }\r
149 \r
150 //_____________________________________________________________________________\r
151 AliTRDCalDCS* AliTRDSaxHandler::GetCalDCSObj()\r
152 {\r
153   // put the arrays in the global calibration object and return this\r
154   fCalDCSObj->SetFEEArr(fFEEArr);\r
155   fCalDCSObj->SetPTRArr(fPTRArr);\r
156   fCalDCSObj->SetGTUObj(fDCSGTUObj);\r
157   return fCalDCSObj;\r
158 }\r
159 \r
160 //_____________________________________________________________________________\r
161 void AliTRDSaxHandler::OnStartDocument()\r
162 {\r
163   // if something should happen right at the beginning of the\r
164   // XML document, this must happen here\r
165 }\r
166 \r
167 //_____________________________________________________________________________\r
168 void AliTRDSaxHandler::OnEndDocument()\r
169 {\r
170   // if something should happen at the end of the XML document\r
171   // this must be done here\r
172 }\r
173 \r
174 //_____________________________________________________________________________\r
175 bool AliTRDSaxHandler::CompareString(TString str, const char *str2)\r
176 {\r
177   // compre strings, ignoring case\r
178   return !(bool)str.CompareTo(str2,str.kIgnoreCase);\r
179   // returns true if they are the same, else false\r
180 }\r
181 \r
182 \r
183 //_____________________________________________________________________________\r
184 void AliTRDSaxHandler::OnStartElement(const char *name, const TList *attributes)\r
185 {\r
186   // when a new XML element is found, it is processed here\r
187   fContent    = ""; // Technically <p> This <em>is</em> ok but would be a problem here</p>\r
188   Int_t dcsId = 0;\r
189   TString tagName  = name;\r
190   TString dcsTitle = "";\r
191 \r
192   // set the current system if necessary\r
193   if (CompareString(tagName, "FEE")) fSystem = kInsideFEE;\r
194   if (CompareString(tagName, "PTR")) fSystem = kInsidePTR;\r
195   if (CompareString(tagName, "GTU")) {\r
196     fSystem = kInsideGTU;\r
197     fDCSGTUObj = new AliTRDCalDCSGTU(tagName,tagName);\r
198   }\r
199 \r
200   if (fSystem == kInsideGTU) {\r
201 //     cout << "Start: " << tagName << " " << fLevel1Tag << " " << fLevel2Tag << " " << fInsideBoardInfo << "\n";\r
202     if (CompareString(tagName, "tgu")) fLevel1Tag = kInsideTgu;\r
203     if (CompareString(tagName, "board_info")) {\r
204       fInsideBoardInfo = true;\r
205       fBoardInfo = new AliTRDCalDCSGTUBoardInfo(tagName,tagName);\r
206     }\r
207     if (CompareString(tagName(0,tagName.Length()-3), "segment")) { \r
208       fSegment = new AliTRDCalDCSGTUSegment(tagName,tagName);\r
209       fSegment->SetId(TString(tagName(8,2)).Atoi());\r
210       fLevel1Tag = kInsideSegment;\r
211     }\r
212     if (fLevel1Tag == kInsideTgu) {\r
213       if (CompareString(tagName, "ctp_opc"))   fCtpOpc = new AliTRDCalDCSGTUCtpOpc(tagName,tagName);\r
214     } else if (fLevel1Tag == kInsideSegment) {\r
215       if (CompareString(tagName, "smu")) {\r
216         fLevel2Tag = kInsideSmu;\r
217       }\r
218       if (CompareString(tagName(0,3), "tmu")) {\r
219         fTmu = new AliTRDCalDCSGTUTmu(tagName,tagName);\r
220         fTmu->SetId(TString(tagName(4,2)).Atoi());\r
221         fLevel2Tag = kInsideTmu;\r
222       }\r
223     }\r
224   } else if (fSystem == kInsideFEE) {\r
225     if (CompareString(tagName, "gaintbl")) fLevel1Tag = kInsideGainTable;\r
226   }\r
227   \r
228 \r
229   // set if we are inside rstate \r
230   // (in principle not necessary - just to be more safe against stupid tags)\r
231   if (CompareString(tagName, "rstate")) fInsideRstate = 1;\r
232 \r
233   // get the attributes of the element\r
234   TXMLAttr *attr;\r
235   TIter next(attributes);\r
236   while ((attr = (TXMLAttr*) next())) {\r
237     TString attribName = attr->GetName();\r
238     TString attribValue = attr->GetValue();\r
239     if (fSystem == kInsideFEE && fLevel1Tag == kInsideNone) {\r
240       if (CompareString(attribName, "id") && CompareString(tagName, "DCS")) {\r
241         dcsTitle = name;\r
242         dcsId = atoi(attr->GetValue());\r
243       }\r
244       if (CompareString(attribName, "roc") && CompareString(tagName, "ack")) {\r
245         if (attribValue.Atoi() != fDCSFEEObj->GetDCSid())\r
246           fDCSFEEObj->SetStatusBit(3); // consistency check\r
247       }\r
248       if (CompareString(attribName, "rob") && CompareString(tagName, "ro-board") && (fInsideRstate == 1)) {\r
249         fCurrentROB = attribValue.Atoi();\r
250       }\r
251       if (CompareString(attribName, "mcm") && CompareString(tagName, "m") && (fInsideRstate == 1)) {\r
252         fCurrentMCM = attribValue.Atoi();\r
253       }\r
254       if (CompareString(attribName, "sm") && CompareString(tagName, "DCS")) {\r
255         fCurrentSM = attribValue.Atoi(); // only for GTU/PTR\r
256       }\r
257       if (CompareString(attribName, "id") && CompareString(tagName, "STACK")) {// hmmmm not exist?\r
258         fCurrentStack = attribValue.Atoi(); // only for GTU/PTR\r
259       }\r
260     } else if (fSystem == kInsideFEE && fLevel1Tag == kInsideGainTable) {\r
261       if (CompareString(tagName, "roc") && CompareString(attribName, "type"))    fDCSFEEObj->SetGainTableRocType(attribValue);\r
262       if (CompareString(tagName, "roc") && CompareString(attribName, "serial"))  fDCSFEEObj->SetGainTableRocSerial(attribValue.Atoi());\r
263       if (CompareString(tagName, "mcm") && CompareString(attribName, "rob"))     fCurrentROB = attribValue.Atoi();\r
264       if (CompareString(tagName, "mcm") && CompareString(attribName, "pos"))     fCurrentMCM = attribValue.Atoi();\r
265       if (CompareString(tagName, "adc") && CompareString(attribName, "id"))      fCurrentADC = attribValue.Atoi();\r
266       \r
267     } else if (fSystem == kInsideGTU && fLevel1Tag == kInsideNone) {\r
268       if (CompareString(tagName, "publisher")) {\r
269         if (CompareString(attribName, "at"))         fDCSGTUObj->SetSORFlag(attribValue.Atoi());\r
270         if (CompareString(attribName, "serial"))     fDCSGTUObj->SetSerial(attribValue.Atoi());\r
271         if (CompareString(attribName, "runnr"))      fDCSGTUObj->SetRunNumber(attribValue.Atoi());\r
272       }\r
273     } else if (fSystem == kInsideGTU && fLevel1Tag == kInsideTgu) {\r
274       if (CompareString(tagName, "from")) {\r
275         if (CompareString(attribName, "at"))         fDCSGTUObj->GetTgu()->SetFromSORFlag(attribValue.Atoi());\r
276         if (CompareString(attribName, "runnr"))      fDCSGTUObj->GetTgu()->SetFromRunNumber(attribValue.Atoi());\r
277         if (CompareString(attribName, "child"))      fDCSGTUObj->GetTgu()->SetFromChild(attribValue.Atoi());\r
278       }\r
279       if (CompareString(tagName, "segmentmask") && CompareString(attribName, "value"))  fDCSGTUObj->GetTgu()->SetSegmentMask(attribValue);\r
280       if (CompareString(tagName, "busymask") && CompareString(attribName, "value"))     fDCSGTUObj->GetTgu()->SetBusyMask(attribValue);\r
281       if (CompareString(tagName, "contribmask") && CompareString(attribName, "value"))  fDCSGTUObj->GetTgu()->SetContribMask(attribValue);\r
282       \r
283       if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "id"))         fCtpOpc->SetId(attribValue.Atoi());\r
284       if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "opcode"))     fCtpOpc->SetOpcode(attribValue.Atoi());\r
285       if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "direction"))  fCtpOpc->SetDirection(attribValue.Atoi());\r
286       if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "inverted"))   fCtpOpc->SetInverted(attribValue.Atoi());\r
287       if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "delay"))      fCtpOpc->SetDelay(attribValue.Atoi());\r
288       if (CompareString(tagName, "ctp_opc") && CompareString(attribName, "connected"))  fCtpOpc->SetConnected(attribValue.Atoi());\r
289       \r
290     } else if (fSystem == kInsideGTU && fLevel1Tag == kInsideSegment) {\r
291       if (CompareString(tagName, "from")) {\r
292         if (CompareString(attribName, "at"))         fSegment->SetFromSORFlag(attribValue.Atoi());\r
293         if (CompareString(attribName, "runnr"))      fSegment->SetFromRunNumber(attribValue.Atoi());\r
294         if (CompareString(attribName, "child"))      fSegment->SetFromChild(attribValue.Atoi());\r
295       }\r
296       if (fLevel2Tag == kInsideSmu) {\r
297         if (CompareString(tagName, "stackmask") && CompareString(attribName, "value"))     fSegment->SetSmuStackMask(attribValue);\r
298         if (CompareString(tagName, "tracklets") && CompareString(attribName, "send"))      fSegment->SetSmuTracklets(attribValue.Atoi());\r
299         if (CompareString(tagName, "tracks") && CompareString(attribName, "send"))         fSegment->SetSmuTracks(attribValue.Atoi());\r
300         if (CompareString(tagName, "idelay") && CompareString(attribName, "value"))        fSegment->SetSmuIdelay(attribValue.Atoi());\r
301         if (CompareString(tagName, "ttc_emulator") && CompareString(attribName, "enable")) fSegment->SetSmuTtcEmulatorEnable(attribValue.Atoi());\r
302         \r
303         if (CompareString(tagName, "trigger_window") && CompareString(attribName, "l1_low"))  \r
304           fSegment->SetSmuTriggerWindowL1Low(attribValue.Atoi());\r
305         if (CompareString(tagName, "trigger_window") && CompareString(attribName, "l1_high"))  \r
306           fSegment->SetSmuTriggerWindowL1High(attribValue.Atoi());\r
307         if (CompareString(tagName, "trigger_window") && CompareString(attribName, "l2_low"))  \r
308           fSegment->SetSmuTriggerWindowL2Low(attribValue.Atoi());\r
309         if (CompareString(tagName, "trigger_window") && CompareString(attribName, "l2_high"))  \r
310           fSegment->SetSmuTriggerWindowL2High(attribValue.Atoi());\r
311         \r
312       } else if (fLevel2Tag == kInsideTmu) {\r
313         if (CompareString(tagName, "linkmask") && CompareString(attribName, "value"))      fTmu->SetLinkMask(attribValue);\r
314         if (CompareString(tagName, "pattern_generator") && CompareString(attribName, "enable")) \r
315           fTmu->SetPatternGeneratorEnable(attribValue.Atoi());\r
316         if (CompareString(tagName, "pattern_generator") && CompareString(attribName, "datawords")) \r
317           fTmu->SetPatternGeneratorDataWords(attribValue.Atoi());\r
318         if (CompareString(tagName, "pattern_generator") && CompareString(attribName, "trackletwords")) \r
319           fTmu->SetPatternGeneratorTrackletWords(attribValue.Atoi());\r
320       }\r
321     }\r
322     \r
323     if (fInsideBoardInfo) {\r
324 //       cout << tagName << ": " << attribName << "=" << attribValue  << "\n";\r
325       if (CompareString(tagName, "board_info") && CompareString(attribName, "board_id"))    fBoardInfo->SetId(attribValue);\r
326       if (CompareString(tagName, "board_info") && CompareString(attribName, "design_type")) fBoardInfo->SetType(attribValue.Atoi());\r
327       if (CompareString(tagName, "board_info") && CompareString(attribName, "pci_ga"))      fBoardInfo->SetPciGa(attribValue.Atoi());\r
328       if (CompareString(tagName, "hardware") && CompareString(attribName, "date"))          fBoardInfo->SetHwDate(attribValue);\r
329       if (CompareString(tagName, "hardware") && CompareString(attribName, "rev"))           fBoardInfo->SetHwRev(attribValue.Atoi());\r
330       if (CompareString(tagName, "hardware") && CompareString(attribName, "clean"))         fBoardInfo->SetHwClean(attribValue.Atoi());\r
331       if (CompareString(tagName, "software") && CompareString(attribName, "date"))          fBoardInfo->SetSwDate(attribValue);\r
332       if (CompareString(tagName, "software") && CompareString(attribName, "rev"))           fBoardInfo->SetSwRev(attribValue.Atoi());\r
333       if (CompareString(tagName, "software") && CompareString(attribName, "clean"))         fBoardInfo->SetSwClean(attribValue.Atoi());\r
334     }\r
335   }\r
336 \r
337   // if there is a new DCS element put it in the correct array\r
338   if (CompareString(tagName, "DCS")) {\r
339     if (fSystem == kInsideFEE) {\r
340       fDCSFEEObj = new AliTRDCalDCSFEE(name,dcsTitle);\r
341       fDCSFEEObj->SetDCSid(dcsId);\r
342     }\r
343     if (fSystem == kInsidePTR) {\r
344 //       fDCSPTRObj = new AliTRDCalDCSPTR(name,dcsTitle);\r
345 //       fDCSPTRObj->SetDCSid(dcsId);\r
346     }\r
347     if (fSystem == kInsideGTU) {\r
348 //       fDCSGTUObj = new AliTRDCalDCSGTU(name,dcsTitle);\r
349 //       fDCSGTUObj->SetDCSid(dcsId);\r
350     }\r
351   }\r
352 }\r
353 \r
354 //_____________________________________________________________________________\r
355 void AliTRDSaxHandler::OnEndElement(const char *name)\r
356 {\r
357   // do everything that needs to be done when an end tag of an element is found\r
358   TString tagName = name;\r
359   \r
360   // if done with this DCS board, put it in the correct array\r
361   // no check for </ack> necessary since this check is done during XML validation\r
362   if (CompareString(tagName, "DCS")) {\r
363     if (fSystem == kInsideFEE) {\r
364       Int_t detID = 0;\r
365       if (fDCSFEEObj->GetStatusBit() == 0) {\r
366         // if there were no errors (StatusBit==0) the following should match\r
367         detID = fDCSFEEObj->GetDCSid();\r
368         AliTRDgeometry aliGeo;\r
369         Int_t calDetID = aliGeo.GetDetector(fDCSFEEObj->GetLayer(),\r
370                                             fDCSFEEObj->GetStack(),\r
371                                             fDCSFEEObj->GetSM());\r
372         if (detID != calDetID) fDCSFEEObj->SetStatusBit(4);\r
373       } else {\r
374         // if the dcs board didn't properly respond, don't compare\r
375         detID = fDCSFEEObj->GetDCSid();\r
376       }\r
377       fFEEArr->AddAt(fDCSFEEObj,detID);\r
378     }\r
379     if (fSystem == kInsidePTR) {\r
380       fPTRArr->AddAt(fDCSPTRObj,fNDCSPTR);\r
381       fNDCSPTR++;\r
382     }\r
383 //     if (fSystem == kInsideGTU) {\r
384 //       fGTUArr->AddAt(fDCSGTUObj,fNDCSGTU);\r
385 //       fNDCSGTU++;\r
386 //     }\r
387     fCurrentSM = 99; // 99 for no SM set\r
388     fDCSFEEObj = 0;  // just to be sure\r
389     return;\r
390   }\r
391 \r
392   // done with this stack? \r
393   if (CompareString(tagName, "STACK")) {// TODO: errrrm ???? always 99?\r
394     fCurrentStack = 99; // 99 for no stack set\r
395   }\r
396 \r
397   // outside of rstate again?\r
398   if (CompareString(tagName, "rstate")) {\r
399     fInsideRstate = 0;\r
400     fCurrentROB   = -1;\r
401     fCurrentMCM   = -1;\r
402   }\r
403   if (CompareString(tagName, "ro-board")) fCurrentROB = -1;\r
404   \r
405   // store informations of the FEE DCS-Board\r
406   if (fSystem == kInsideFEE) {\r
407     if (CompareString(tagName, "DNR"))            fDCSFEEObj->SetStatusBit(fContent.Atoi());\r
408     if (CompareString(tagName, "CFGNME"))         fDCSFEEObj->SetConfigName(fContent);\r
409     if (CompareString(tagName, "CFGTAG"))         fDCSFEEObj->SetConfigTag(fContent.Atoi());\r
410     if (CompareString(tagName, "CFGVRSN"))        fDCSFEEObj->SetConfigVersion(fContent);\r
411     if (CompareString(tagName, "NTB"))            fDCSFEEObj->SetNumberOfTimeBins(fContent.Atoi());\r
412     if (CompareString(tagName, "SM-ID"))          fDCSFEEObj->SetSM(fContent.Atoi());\r
413     if (CompareString(tagName, "STACK-ID"))       fDCSFEEObj->SetStack(fContent.Atoi());\r
414     if (CompareString(tagName, "LAYER-ID"))       fDCSFEEObj->SetLayer(fContent.Atoi());\r
415     if (CompareString(tagName, "SINGLEHITTHRES")) fDCSFEEObj->SetSingleHitThres(fContent.Atoi());\r
416     if (CompareString(tagName, "THRPADCLSTHRS"))  fDCSFEEObj->SetThreePadClustThres(fContent.Atoi());\r
417     if (CompareString(tagName, "SELNOZS"))        fDCSFEEObj->SetSelectiveNoZS(fContent.Atoi());\r
418     if (CompareString(tagName, "FASTSTATNOISE"))  fDCSFEEObj->SetFastStatNoise(fContent.Atoi());\r
419     if (CompareString(tagName, "FILTWEIGHT"))     fDCSFEEObj->SetTCFilterWeight(fContent.Atoi());\r
420     if (CompareString(tagName, "FILTSHRTDCYPRM")) fDCSFEEObj->SetTCFilterShortDecPar(fContent.Atoi());\r
421     if (CompareString(tagName, "FILTLNGDCYPRM"))  fDCSFEEObj->SetTCFilterLongDecPar(fContent.Atoi());\r
422     if (CompareString(tagName, "FLTR"))           fDCSFEEObj->SetFilterType(fContent);\r
423     if (CompareString(tagName, "READOUTPAR"))     fDCSFEEObj->SetReadoutParam(fContent);\r
424     if (CompareString(tagName, "TESTPATTERN"))    fDCSFEEObj->SetTestPattern(fContent);\r
425     if (CompareString(tagName, "TRCKLTMODE"))     fDCSFEEObj->SetTrackletMode(fContent);\r
426     if (CompareString(tagName, "TRCKLTDEF"))      fDCSFEEObj->SetTrackletDef(fContent);\r
427     if (CompareString(tagName, "TRIGGERSETUP"))   fDCSFEEObj->SetTriggerSetup(fContent);\r
428     if (CompareString(tagName, "ADDOPTIONS"))     fDCSFEEObj->SetAddOptions(fContent);\r
429     if (CompareString(tagName, "gaintbl")) {\r
430       fLevel1Tag = kInsideNone;\r
431       fCurrentROB = -1;\r
432       fCurrentMCM = -1;\r
433       fCurrentADC = -1;\r
434     }\r
435     if (fLevel1Tag == kInsideGainTable) {\r
436       if (CompareString(tagName, "name"))   fDCSFEEObj->SetGainTableName(fContent);\r
437       if (CompareString(tagName, "desc"))   fDCSFEEObj->SetGainTableDesc(fContent);\r
438       if (CompareString(tagName, "adcdac")) fDCSFEEObj->SetGainTableAdcdac(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
439       if (CompareString(tagName, "fgfn"))   fDCSFEEObj->SetGainTableFgfn(fCurrentROB, fCurrentMCM, fCurrentADC, fContent.Atoi());\r
440       if (CompareString(tagName, "fgan"))   fDCSFEEObj->SetGainTableFgan(fCurrentROB, fCurrentMCM, fCurrentADC, fContent.Atoi());\r
441     }\r
442     if (fInsideRstate == 1) {\r
443       if (fCurrentROB>=0 && fCurrentMCM>=0) {\r
444         if (CompareString(tagName, "gsm")) fDCSFEEObj->SetMCMGlobalState(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
445         if (CompareString(tagName, "ni")) fDCSFEEObj->SetMCMStateNI(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
446         if (CompareString(tagName, "ev")) fDCSFEEObj->SetMCMEventCnt(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
447         if (CompareString(tagName, "ptrg")) fDCSFEEObj->SetMCMPtCnt(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
448       }\r
449     }\r
450   }\r
451 \r
452   if (fSystem == kInsideGTU) {\r
453 //     cout << "Close: " << tagName << " " << fLevel1Tag << " " << fLevel2Tag << " " << fInsideBoardInfo << "\n";\r
454 \r
455 //     if (CompareString(tagName, "run")) { \r
456 //       fDCSGTUObj->SetSORFlag(TString(fContent(fContent.Length()-1,1)).Atoi());\r
457 //       fDCSGTUObj->SetRunNumber(TString(fContent(0,fContent.Length()-2)).Atoi());\r
458 //     }\r
459 //     if (CompareString(tagName, "serial"))         fDCSGTUObj->SetSerial(fContent.Atoi());\r
460     if (CompareString(tagName, "board_info")) {\r
461       fInsideBoardInfo = false;\r
462       if (fLevel1Tag == kInsideTgu)                                  fDCSGTUObj->GetTgu()->SetBoardInfo(fBoardInfo);\r
463       if (fLevel1Tag == kInsideSegment && fLevel2Tag == kInsideSmu)  fSegment->SetSmuBoardInfo(fBoardInfo);\r
464       if (fLevel1Tag == kInsideSegment && fLevel2Tag == kInsideTmu)  fTmu->SetBoardInfo(fBoardInfo);\r
465     }\r
466     if (CompareString(tagName, "dnr"))            fDCSGTUObj->SetDNR(fContent.Atoi());\r
467     if (CompareString(tagName, "tgu"))            fLevel1Tag = kInsideNone;\r
468     if (CompareString(tagName(0,tagName.Length()-3), "segment")) { \r
469       fDCSGTUObj->GetSegmentArray()->Add(fSegment);\r
470       fLevel1Tag = kInsideNone;\r
471     }\r
472     if (fLevel1Tag == kInsideTgu) {\r
473       if (CompareString(tagName, "ctp_opc"))        fDCSGTUObj->GetTgu()->GetCtpOpcArray()->Add(fCtpOpc);\r
474     } else if (fLevel1Tag == kInsideSegment) {\r
475       if (CompareString(tagName, "smu"))          fLevel2Tag = kInsideNone;\r
476       if (CompareString(tagName(0,3), "tmu")) {\r
477         fSegment->GetTmuArray()->Add(fTmu);\r
478         fLevel2Tag = kInsideNone;\r
479       }\r
480     }\r
481   }\r
482 \r
483   \r
484   // store pretrigger informations\r
485   if (fSystem == kInsidePTR) {\r
486     // no informations available yet\r
487   }\r
488 //   // store GTU informations\r
489 //   if (fSystem == kInsideGTU) {\r
490 //     if (CompareString(tagName, "SMMASK"))\r
491 //       fHandlerStatus = fDCSGTUObj->SetSMMask(fContent);\r
492 //     if (CompareString(tagName, "LINKMASK")) \r
493 //       fHandlerStatus = fDCSGTUObj->SetLinkMask(fCurrentSM, fCurrentStack, fContent);\r
494 //     if (CompareString(tagName, "STMASK"))\r
495 //       fDCSGTUObj->SetStackMaskBit(fCurrentSM, fCurrentStack, fContent.Atoi());\r
496 //   }\r
497 }\r
498 \r
499 //_____________________________________________________________________________\r
500 void AliTRDSaxHandler::OnCharacters(const char *characters)\r
501 {\r
502   // copy the the text content of an XML element\r
503   fContent = characters;\r
504 }\r
505 \r
506 //_____________________________________________________________________________\r
507 void AliTRDSaxHandler::OnComment(const char* /*text*/)\r
508 {\r
509   // comments within the XML file are ignored\r
510 }\r
511 \r
512 //_____________________________________________________________________________\r
513 void AliTRDSaxHandler::OnWarning(const char *text)\r
514 {\r
515   // process warnings here\r
516   AliInfo(Form("Warning: %s",text));\r
517 }\r
518 \r
519 //_____________________________________________________________________________\r
520 void AliTRDSaxHandler::OnError(const char *text)\r
521 {\r
522   // process errors here\r
523   AliError(Form("Error: %s",text));\r
524 }\r
525 \r
526 //_____________________________________________________________________________\r
527 void AliTRDSaxHandler::OnFatalError(const char *text)\r
528 {\r
529   // process fatal errors here\r
530   AliError(Form("Fatal error: %s",text)); // use AliFatal?\r
531 }\r
532 \r
533 //_____________________________________________________________________________\r
534 void AliTRDSaxHandler::OnCdataBlock(const char* /*text*/, Int_t /*len*/)\r
535 {\r
536   // process character data blocks here\r
537   // not implemented and should not be used here\r
538 }\r
539 \r