]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDSaxHandler.cxx
Don't use shared pads in HLT and some code clean-up
[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   ,fGTUArr(new TObjArray(19))\r
53   ,fSystem(0)\r
54   ,fInsideRstate(0)\r
55   ,fCurrentSM(0)\r
56   ,fCurrentStack(0)\r
57   ,fCurrentROB(-1)\r
58   ,fCurrentMCM(-1)\r
59   ,fContent(0)\r
60   ,fDCSFEEObj(0)\r
61   ,fDCSPTRObj(0)\r
62   ,fDCSGTUObj(0)\r
63   ,fCalDCSObj(new AliTRDCalDCS())\r
64 {\r
65   //\r
66   // AliTRDSaxHandler default constructor\r
67   //\r
68   fFEEArr->SetOwner();\r
69   fPTRArr->SetOwner();\r
70   fGTUArr->SetOwner();\r
71 }\r
72 \r
73 //_____________________________________________________________________________\r
74 AliTRDSaxHandler::AliTRDSaxHandler(const AliTRDSaxHandler &sh)\r
75   :TObject(sh)\r
76   ,fHandlerStatus(0)\r
77   ,fNDCSPTR(0)\r
78   ,fNDCSGTU(0)\r
79   ,fFEEArr(0)\r
80   ,fPTRArr(0)\r
81   ,fGTUArr(0)\r
82   ,fSystem(0)\r
83   ,fInsideRstate(0)\r
84   ,fCurrentSM(0)\r
85   ,fCurrentStack(0)\r
86   ,fCurrentROB(-1)\r
87   ,fCurrentMCM(-1)\r
88   ,fContent(0)\r
89   ,fDCSFEEObj(0)\r
90   ,fDCSPTRObj(0)\r
91   ,fDCSGTUObj(0)\r
92   ,fCalDCSObj(0)\r
93 {\r
94   //\r
95   // AliTRDSaxHandler copy constructor\r
96   //\r
97 }\r
98 \r
99 //_____________________________________________________________________________\r
100 AliTRDSaxHandler &AliTRDSaxHandler::operator=(const AliTRDSaxHandler &sh)\r
101 {\r
102   //\r
103   // Assignment operator\r
104   //\r
105   if (&sh == this) return *this;\r
106 \r
107   new (this) AliTRDSaxHandler(sh);\r
108   return *this;\r
109 }\r
110 \r
111 //_____________________________________________________________________________\r
112 AliTRDSaxHandler::~AliTRDSaxHandler()\r
113 {\r
114   //\r
115   // AliTRDSaxHandler destructor\r
116   //\r
117 \r
118   if (fFEEArr) {\r
119     delete fFEEArr;\r
120     fFEEArr    = 0x0;\r
121   }\r
122   if (fPTRArr) {\r
123     delete fPTRArr;\r
124     fPTRArr    = 0x0;\r
125   }\r
126   if (fGTUArr) {\r
127     delete fGTUArr;\r
128     fGTUArr    = 0x0;\r
129   }\r
130   if (fCalDCSObj) {\r
131     delete fCalDCSObj;\r
132     fCalDCSObj = 0x0;\r
133   }\r
134 \r
135 }\r
136 \r
137 //_____________________________________________________________________________\r
138 AliTRDCalDCS* AliTRDSaxHandler::GetCalDCSObj()\r
139 {\r
140   // put the arrays in the global calibration object and return this\r
141   fCalDCSObj->SetFEEArr(fFEEArr);\r
142   fCalDCSObj->SetPTRArr(fPTRArr);\r
143   fCalDCSObj->SetGTUArr(fGTUArr);\r
144   return fCalDCSObj;\r
145 }\r
146 \r
147 //_____________________________________________________________________________\r
148 void AliTRDSaxHandler::OnStartDocument()\r
149 {\r
150   // if something should happen right at the beginning of the\r
151   // XML document, this must happen here\r
152 }\r
153 \r
154 //_____________________________________________________________________________\r
155 void AliTRDSaxHandler::OnEndDocument()\r
156 {\r
157   // if something should happen at the end of the XML document\r
158   // this must be done here\r
159 }\r
160 \r
161 //_____________________________________________________________________________\r
162 void AliTRDSaxHandler::OnStartElement(const char *name, const TList *attributes)\r
163 {\r
164   // when a new XML element is found, it is processed here\r
165   fContent    = "";\r
166   Int_t dcsId = 0;\r
167   TString strName  = name;\r
168   TString dcsTitle = "";\r
169 \r
170   // set the current system if necessary\r
171   if (strName.Contains("FEE")) fSystem = kInsideFEE;\r
172   if (strName.Contains("PTR")) fSystem = kInsidePTR;\r
173   if (strName.Contains("GTU")) fSystem = kInsideGTU;\r
174 \r
175   // set if we are inside rstate \r
176   // (in principle not necessary - just to be more safe against stupid tags)\r
177   if (strName.Contains("rstate")) fInsideRstate = 1;\r
178 \r
179   // get the attributes of the element\r
180   TXMLAttr *attr;\r
181   TIter next(attributes);\r
182   while ((attr = (TXMLAttr*) next())) {\r
183     TString attribName = attr->GetName();\r
184     if (attribName.Contains("id") && strName.Contains("DCS")) {\r
185       dcsTitle = name;\r
186       dcsId = atoi(attr->GetValue());\r
187     }\r
188     if (attribName.Contains("roc") && strName.Contains("ack")) {\r
189       if (atoi(attr->GetValue()) != fDCSFEEObj->GetDCSid())\r
190         fDCSFEEObj->SetStatusBit(3); // consistence check\r
191     }\r
192     if (attribName.Contains("rob") && (fInsideRstate == 1)) {\r
193       fCurrentROB = atoi(attr->GetValue());\r
194     }\r
195     if (attribName.Contains("mcm") && (fInsideRstate == 1)) {\r
196       fCurrentMCM = atoi(attr->GetValue());\r
197     }\r
198     if (attribName.Contains("sm") && strName.Contains("DCS")) {\r
199       fCurrentSM = atoi(attr->GetValue()); // only for GTU/PTR\r
200     }\r
201     if (attribName.Contains("id") && strName.Contains("STACK")) {\r
202       fCurrentStack = atoi(attr->GetValue()); // only for GTU/PTR\r
203     }\r
204   }\r
205 \r
206   // if there is a new DCS element put it in the correct array\r
207   if (strName.Contains("DCS")) {\r
208     if (fSystem == kInsideFEE) {\r
209       fDCSFEEObj = new AliTRDCalDCSFEE(name,dcsTitle);\r
210       fDCSFEEObj->SetDCSid(dcsId);\r
211     }\r
212     if (fSystem == kInsidePTR) {\r
213       fDCSPTRObj = new AliTRDCalDCSPTR(name,dcsTitle);\r
214       fDCSPTRObj->SetDCSid(dcsId);\r
215     }\r
216     if (fSystem == kInsideGTU) {\r
217       fDCSGTUObj = new AliTRDCalDCSGTU(name,dcsTitle);\r
218       fDCSGTUObj->SetDCSid(dcsId);\r
219     }\r
220   }\r
221 }\r
222 \r
223 //_____________________________________________________________________________\r
224 void AliTRDSaxHandler::OnEndElement(const char *name)\r
225 {\r
226   // do everything that needs to be done when an end tag of an element is found\r
227   TString strName = name;\r
228   \r
229   // if done with this DCS board, put it in the correct array\r
230   // no check for </ack> necessary since this check is done during XML validation\r
231   if (strName.Contains("DCS")) {\r
232     if (fSystem == kInsideFEE) {\r
233       Int_t detID = 0;\r
234       if (fDCSFEEObj->GetStatusBit() == 0) {\r
235         // if there were no errors (StatusBit==0) the following should match\r
236         detID = fDCSFEEObj->GetDCSid();\r
237         AliTRDgeometry aliGeo;\r
238         Int_t calDetID = aliGeo.GetDetector(fDCSFEEObj->GetLayer(),\r
239                                             fDCSFEEObj->GetStack(),\r
240                                             fDCSFEEObj->GetSM());\r
241         if (detID != calDetID) fDCSFEEObj->SetStatusBit(4);\r
242       } else {\r
243         // if the dcs board didn't properly respond, don't compare\r
244         detID = fDCSFEEObj->GetDCSid();\r
245       }\r
246       fFEEArr->AddAt(fDCSFEEObj,detID);\r
247     }\r
248     if (fSystem == kInsidePTR) {\r
249       fPTRArr->AddAt(fDCSPTRObj,fNDCSPTR);\r
250       fNDCSPTR++;\r
251     }\r
252     if (fSystem == kInsideGTU) {\r
253       fGTUArr->AddAt(fDCSGTUObj,fNDCSGTU);\r
254       fNDCSGTU++;\r
255     }\r
256     fCurrentSM = 99; // 99 for no SM set\r
257     fDCSFEEObj = 0;  // just to be sure\r
258     return;\r
259   }\r
260 \r
261   // done with this stack?\r
262   if (strName.Contains("STACK")) {\r
263     fCurrentStack = 99; // 99 for no stack set\r
264   }\r
265 \r
266   // outside of rstate again?\r
267   if (strName.Contains("rstate")) {\r
268     fInsideRstate = 0;\r
269     fCurrentROB   = -1;\r
270     fCurrentMCM   = -1;\r
271   }\r
272   if (strName.Contains("ro-board")) fCurrentROB = -1;\r
273   \r
274   // store informations of the FEE DCS-Board\r
275   if (fSystem == kInsideFEE) {\r
276     if (strName.Contains("DNR"))            fDCSFEEObj->SetStatusBit(fContent.Atoi());\r
277     if (strName.Contains("CFGNME"))         fDCSFEEObj->SetConfigName(fContent);\r
278     if (strName.Contains("CFGTAG"))         fDCSFEEObj->SetConfigTag(fContent.Atoi());\r
279     if (strName.Contains("CFGVRSN"))        fDCSFEEObj->SetConfigVersion(fContent);\r
280     if (strName.Contains("NTB"))            fDCSFEEObj->SetNumberOfTimeBins(fContent.Atoi());\r
281     if (strName.Contains("SM-ID"))          fDCSFEEObj->SetSM(fContent.Atoi());\r
282     if (strName.Contains("STACK-ID"))       fDCSFEEObj->SetStack(fContent.Atoi());\r
283     if (strName.Contains("LAYER-ID"))       fDCSFEEObj->SetLayer(fContent.Atoi());\r
284     if (strName.Contains("SINGLEHITTHRES")) fDCSFEEObj->SetSingleHitThres(fContent.Atoi());\r
285     if (strName.Contains("THRPADCLSTHRS"))  fDCSFEEObj->SetThreePadClustThres(fContent.Atoi());\r
286     if (strName.Contains("SELNOZS"))        fDCSFEEObj->SetSelectiveNoZS(fContent.Atoi());\r
287     if (strName.Contains("FASTSTATNOISE"))  fDCSFEEObj->SetFastStatNoise(fContent.Atoi());\r
288     if (strName.Contains("FILTWEIGHT"))     fDCSFEEObj->SetTCFilterWeight(fContent.Atoi());\r
289     if (strName.Contains("FILTSHRTDCYPRM")) fDCSFEEObj->SetTCFilterShortDecPar(fContent.Atoi());\r
290     if (strName.Contains("FILTLNGDCYPRM"))  fDCSFEEObj->SetTCFilterLongDecPar(fContent.Atoi());\r
291     if (strName.Contains("FLTR"))           fDCSFEEObj->SetFilterType(fContent);\r
292     if (strName.Contains("READOUTPAR"))     fDCSFEEObj->SetReadoutParam(fContent);\r
293     if (strName.Contains("TESTPATTERN"))    fDCSFEEObj->SetTestPattern(fContent);\r
294     if (strName.Contains("TRCKLTMODE"))     fDCSFEEObj->SetTrackletMode(fContent);\r
295     if (strName.Contains("TRCKLTDEF"))      fDCSFEEObj->SetTrackletDef(fContent);\r
296     if (strName.Contains("TRIGGERSETUP"))   fDCSFEEObj->SetTriggerSetup(fContent);\r
297     if (strName.Contains("ADDOPTIONS"))     fDCSFEEObj->SetAddOptions(fContent);\r
298     if (fInsideRstate == 1) {\r
299       if (fCurrentROB>=0 && fCurrentMCM>=0) {\r
300         if (strName.Contains("gsm")) fDCSFEEObj->SetMCMGlobalState(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
301         if (strName.Contains("ni")) fDCSFEEObj->SetMCMStateNI(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
302         if (strName.Contains("ev")) fDCSFEEObj->SetMCMEventCnt(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
303         if (strName.Contains("ptrg")) fDCSFEEObj->SetMCMPtCnt(fCurrentROB, fCurrentMCM, fContent.Atoi());\r
304       }\r
305     }\r
306   }\r
307 \r
308   \r
309   // store pretrigger informations\r
310   if (fSystem == kInsidePTR) {\r
311     // no informations available yet\r
312   }\r
313   // store GTU informations\r
314   if (fSystem == kInsideGTU) {\r
315     if (strName.Contains("SMMASK"))\r
316       fHandlerStatus = fDCSGTUObj->SetSMMask(fContent);\r
317     if (strName.Contains("LINKMASK")) \r
318       fHandlerStatus = fDCSGTUObj->SetLinkMask(fCurrentSM, fCurrentStack, fContent);\r
319     if (strName.Contains("STMASK"))\r
320       fDCSGTUObj->SetStackMaskBit(fCurrentSM, fCurrentStack, fContent.Atoi());\r
321   }\r
322 }\r
323 \r
324 //_____________________________________________________________________________\r
325 void AliTRDSaxHandler::OnCharacters(const char *characters)\r
326 {\r
327   // copy the the text content of an XML element\r
328   fContent = characters;\r
329 }\r
330 \r
331 //_____________________________________________________________________________\r
332 void AliTRDSaxHandler::OnComment(const char* /*text*/)\r
333 {\r
334   // comments within the XML file are ignored\r
335 }\r
336 \r
337 //_____________________________________________________________________________\r
338 void AliTRDSaxHandler::OnWarning(const char *text)\r
339 {\r
340   // process warnings here\r
341   AliInfo(Form("Warning: %s",text));\r
342 }\r
343 \r
344 //_____________________________________________________________________________\r
345 void AliTRDSaxHandler::OnError(const char *text)\r
346 {\r
347   // process errors here\r
348   AliError(Form("Error: %s",text));\r
349 }\r
350 \r
351 //_____________________________________________________________________________\r
352 void AliTRDSaxHandler::OnFatalError(const char *text)\r
353 {\r
354   // process fatal errors here\r
355   AliError(Form("Fatal error: %s",text)); // use AliFatal?\r
356 }\r
357 \r
358 //_____________________________________________________________________________\r
359 void AliTRDSaxHandler::OnCdataBlock(const char* /*text*/, Int_t /*len*/)\r
360 {\r
361   // process character data blocks here\r
362   // not implemented and should not be used here\r
363 }\r
364 \r