BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
StripSrv.cxx
Go to the documentation of this file.
1// $Header: /bes/bes/BossCvs/Calibration/calibUtil/src/StripSrv.cxx,v 1.1.1.1 2005/10/17
2// 06:12:26 maqm Exp $
3/// Module provides methods for clients to get strip services.
4
5#include "xmlBase/Dom.h"
6#include "xmlBase/XmlParser.h"
7#include <xercesc/dom/DOMElement.hpp>
8#include <xercesc/dom/DOMNodeList.hpp>
9#include <xercesc/dom/DOMTreeWalker.hpp>
10
11#include <cstdlib>
12#include <iostream>
13#include <memory>
14#include <string>
15#include <vector>
16
17#include "calibUtil/ChannelStatusDef.h"
18#include "calibUtil/GenericSrv.h"
19#include "calibUtil/StripSrv.h"
20
21namespace calibUtil {
22
23 using XERCES_CPP_NAMESPACE_QUALIFIER DOMElement;
24
25 StripSrv::StripSrv( eBadType badType, const GenericSrv& gen )
26 : m_badType( badType ), m_state( BUILDING ) {
27 m_genSrv = new GenericSrv( gen );
28 }
29
30 // Initialize the data structures by parsing the XML file
31 StripSrv::StripSrv( std::string xmlFileName )
32 : m_badType( UNKNOWN_BADTYPE ), m_state( FROM_PERS ), m_genSrv( 0 ) {
33 using xmlBase::Dom;
34 using XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument;
35
37 DOMDocument* doc = parser->parse( xmlFileName.c_str() );
38
39 if ( doc == 0 )
40 {
41 std::cerr << "Error parsing document" << xmlFileName << std::endl;
42 return;
43 }
44
45 DOMElement* docElt = doc->getDocumentElement();
46 m_genSrv = new GenericSrv( docElt );
47
48 std::vector<DOMElement*> towers;
49
50 Dom::getDescendantsByTagName( docElt, "tower", towers );
51 unsigned nTower = towers.size();
52
53 m_towers.reserve( nTower );
54
55 std::string bString = Dom::getAttribute( docElt, "badType" );
56 if ( !bString.compare( "hot" ) ) m_badType = HOT;
57 else if ( !bString.compare( "dead" ) ) m_badType = DEAD;
58 else m_badType = UNKNOWN_BADTYPE;
59
60 for ( unsigned int iTower = 0; iTower < nTower; iTower++ )
61 {
62 Tower tower;
63 tower.m_uniplanes.clear();
64 try
65 {
66 tower.m_row = Dom::getIntAttribute( towers[iTower], "row" );
67 tower.m_col = Dom::getIntAttribute( towers[iTower], "col" );
68 } catch ( xmlBase::DomException ex )
69 {
70 std::cerr << "From calibUtil::StripSrv::StripSrv" << std::endl
71 << ex.getMsg() << std::endl;
72 throw ex;
73 }
74
75 tower.m_howBad = 0;
76 tower.m_allBad = 0;
77
78 std::string attValue = Dom::getAttribute( towers[iTower], "nOnbdCalib" );
79 if ( attValue.compare( "true" ) == 0 ) { tower.m_howBad |= vCALIBUTIL_nOnbdCalib; }
80 attValue = Dom::getAttribute( towers[iTower], "nOnbdTrig" );
81 if ( attValue.compare( "true" ) == 0 ) { tower.m_howBad |= vCALIBUTIL_nOnbdTrig; }
82 attValue = Dom::getAttribute( towers[iTower], "nOnbdData" );
83 if ( attValue.compare( "true" ) == 0 ) { tower.m_howBad |= vCALIBUTIL_nOnbdData; }
84 if ( tower.m_howBad )
85 {
86 tower.m_allBad = 1;
87 goto NEXT;
88 } // otherwise have to process individual uniplane elements
89
90 {
91 DOMElement* uniElt = Dom::getFirstChildElement( towers[iTower] );
92
93 while ( uniElt != 0 )
94 {
95 Uniplane uni;
96 uni.m_howBad = 0;
97 fillUni( uniElt, &uni );
98 // if bad status, complain and return
99
100 tower.m_uniplanes.push_back( uni );
101 uniElt = Dom::getSiblingElement( uniElt );
102 }
103 }
104 NEXT:
105 m_towers.push_back( tower );
106 // towerElt = Dom::getSiblingElement(towerElt);
107 }
108 }
109
110 /// destructor used to deallocate memory
111 StripSrv::~StripSrv() { delete m_genSrv; }
112
113 /// returns the status (Hot or Dead) of the strips
114 StripSrv::eBadType StripSrv::getBadType() const { return m_badType; }
115
116 /// Lists all towers with bad strips
117 void StripSrv::getBadTowers( std::vector<StripSrv::towerRC>& towerRCs ) const {
118 std::vector<Tower>::const_iterator it = m_towers.begin();
119 while ( it != m_towers.end() )
120 {
121
122 towerRC trc;
123 towerRCs.reserve( m_towers.size() );
124 trc.row = it->m_row;
125 trc.col = it->m_col;
126 towerRCs.push_back( trc );
127 it++;
128 }
129 }
130
131 /// methods giving access to generic data
132
133 /// Get instrument name
134 std::string StripSrv::getInst() const { return m_genSrv->getInst(); }
135
136 /// Get timestamp
137 std::string StripSrv::getTimestamp() const { return m_genSrv->getTimestamp(); }
138
139 /// Get calibration type
140 std::string StripSrv::getCalType() const { return m_genSrv->getCalType(); }
141
142 /// Get format Version
143 std::string StripSrv::getFmtVer() const { return m_genSrv->getFmtVer(); }
144
145 /// call back method for client to access large data
147
148 /* NOTE: could also check for empty badLists and only
149 call back client if nonempty.
150 */
151 std::vector<Tower>::const_iterator iTower = m_towers.begin();
152
153 eVisitorRet ret = DONE;
154 while ( iTower != m_towers.end() )
155 {
156 if ( iTower->m_allBad )
157 {
158 ret = client->badTower( iTower->m_row, iTower->m_col, iTower->m_howBad );
159 if ( ret != CONT ) return ret;
160 }
161 // If tower not all bad, loop over planes within towers
162 else
163 {
164 std::vector<Uniplane>::const_iterator iUni = ( iTower->m_uniplanes ).begin();
165 while ( iUni != ( iTower->m_uniplanes ).end() )
166 {
167 ret = client->badPlane( iTower->m_row, iTower->m_col, iUni->m_tray, iUni->m_top,
168 iUni->m_howBad, iUni->m_allBad, ( iUni->m_strips ) );
169 if ( ret != CONT ) return ret;
170 iUni++;
171 }
172 }
173 ++iTower;
174 }
175 // If got to here, traversed the entire data structure without
176 // a murmur from client
177 return DONE;
178 }
179
180 // Private utilities
181
182 void StripSrv::fillUni( const DOMElement* uniElt, Uniplane* uni ) {
183 using xmlBase::Dom;
184
185 std::string attValue;
186
187 attValue = Dom::getAttribute( uniElt, "allBad" );
188 uni->m_allBad = ( attValue.compare( "true" ) == 0 );
189
190 attValue = Dom::getAttribute( uniElt, "nOnbdCalib" );
191 if ( attValue.compare( "true" ) == 0 ) { uni->m_howBad |= vCALIBUTIL_nOnbdCalib; }
192 attValue = Dom::getAttribute( uniElt, "nOnbdTrig" );
193 if ( attValue.compare( "true" ) == 0 ) { uni->m_howBad |= vCALIBUTIL_nOnbdTrig; }
194 attValue = Dom::getAttribute( uniElt, "nOnbdData" );
195 if ( attValue.compare( "true" ) == 0 ) { uni->m_howBad |= vCALIBUTIL_nOnbdData; }
196
197 attValue = Dom::getAttribute( uniElt, "tray" );
198 uni->m_tray = atoi( attValue.c_str() );
199
200 attValue = Dom::getAttribute( uniElt, "which" );
201 if ( attValue.compare( "top" ) == 0 ) uni->m_top = true;
202 else if ( attValue.compare( "bot" ) == 0 ) uni->m_top = false;
203 // if anything else happens, xml file is bad
204
205 if ( !uni->m_allBad )
206 { // process strip lists, spans
207 fillStrips( uniElt, uni->m_strips );
208 }
209 }
210
211 void StripSrv::fillStrips( const DOMElement* badElt, StripCol& list ) {
212 using xmlBase::Dom;
213
214 DOMElement* childElt = Dom::getFirstChildElement( badElt );
215
216 while ( childElt != 0 )
217 {
218 // must be list or span
219 if ( Dom::checkTagName( childElt, "stripList" ) )
220 {
221 std::string xmlList = Dom::getAttribute( childElt, "strips" );
222 strToNum( xmlList, list );
223 }
224 else if ( Dom::checkTagName( childElt, "stripSpan" ) )
225 {
226 unsigned short first, last;
227
228 try
229 {
230 first = Dom::getIntAttribute( childElt, "first" );
231 last = Dom::getIntAttribute( childElt, "last" );
232 } catch ( xmlBase::DomException ex )
233 {
234 std::cerr << "From calibUtil::StripSrv::fillStrips" << std::endl
235 << ex.getMsg() << std::endl;
236 throw ex;
237 }
238
239 if ( last >= first )
240 {
241 // Might as well reserve memory all at once
242 list.reserve( list.size() + last + 1 - first );
243 for ( unsigned short int i = first; i <= last; i++ ) { list.push_back( i ); }
244 }
245 }
246 childElt = Dom::getSiblingElement( childElt );
247 }
248 }
249
250 void StripSrv::strToNum( std::string s, std::vector<unsigned short int>& v ) {
251
252 std::string::iterator it = s.begin();
253
254 // Maybe add something to be sure all we've got are digits
255 // and blanks??
256
257 // Skip over leading blanks, if any
258 while ( ( it != s.end() ) && ( *it == ' ' ) ) it++;
259
260 // save contiguous digits in tempStr
261 while ( ( it != s.end() ) && ( *it >= '0' ) && ( *it <= '9' ) )
262 {
263 std::string tempStr;
264 tempStr += *it;
265 it++;
266
267 while ( ( it != s.end() ) && ( *it >= '0' ) && ( *it <= '9' ) )
268 {
269 tempStr += *it;
270 it++;
271 }
272
273 // No more contiguous digits; skip over blanks
274 while ( ( it != s.end() ) && ( *it == ' ' ) ) it++;
275
276 // Save the converted integer
277 v.push_back( atoi( tempStr.c_str() ) );
278 }
279 }
280
281 StripSrv::Tower* StripSrv::findTower( towerRC& towerId ) {
282 std::vector<Tower>::iterator it = m_towers.begin();
283 while ( it != m_towers.end() )
284 {
285 if ( ( it->m_row == towerId.row ) && ( it->m_col == towerId.col ) )
286 { return ( &( *it ) ); }
287 ++it;
288 }
289 return 0;
290 }
291
292 const StripSrv::Tower* StripSrv::findTower( const towerRC& towerId ) const {
293 std::vector<Tower>::const_iterator it = m_towers.begin();
294 while ( it != m_towers.end() )
295 {
296 if ( ( it->m_row == towerId.row ) && ( it->m_col == towerId.col ) )
297 { return ( &( *it ) ); }
298 ++it;
299 }
300 return 0;
301 }
302
303 eVisitorRet StripSrv::writeXml( std::ostream* ) { return DONE; }
304
305} // end of namespace calibUtil
XmlRpcServer s
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
Definition KarLud.h:35
virtual eVisitorRet badTower(unsigned int row, unsigned int col, int badness)=0
virtual eVisitorRet badPlane(unsigned int row, unsigned int col, unsigned int tray, bool top, int badness, bool allBad, const StripCol &strips)=0
eVisitorRet writeXml(std::ostream *out)
Definition StripSrv.cxx:303
eBadType getBadType() const
returns the status (Hot or Dead) of the strip
Definition StripSrv.cxx:114
StripSrv(std::string xmlFileName)
Definition StripSrv.cxx:31
std::string getInst() const
methods giving access to generic data
Definition StripSrv.cxx:134
std::string getCalType() const
Get calibration type.
Definition StripSrv.cxx:140
eVisitorRet traverseInfo(ClientObject *client) const
call back method for client to access large data
Definition StripSrv.cxx:146
std::string getTimestamp() const
Get timestamp.
Definition StripSrv.cxx:137
~StripSrv()
destructor. Deallocates memory
Definition StripSrv.cxx:111
void getBadTowers(std::vector< towerRC > &towerIds) const
lists all towers with bad strips
Definition StripSrv.cxx:117
struct calibUtil::StripSrv::stowerRC towerRC
Clients should use as return values for readData.
std::string getFmtVer() const
Get format Version.
Definition StripSrv.cxx:143
DOMDocument * parse(const char *const filename, const std::string &docType=std::string(""))
Parse an xml file, returning document node if successful.
Index first(Pair i)
Module implements methods for clients to get generic services.
std::vector< unsigned short int > StripCol