/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Calibration/calibUtil/calibUtil-00-00-43/src/StripSrv.cxx

Go to the documentation of this file.
00001 // $Header: /bes/bes/BossCvs/Calibration/calibUtil/src/StripSrv.cxx,v 1.1.1.1 2005/10/17 06:12:26 maqm Exp $
00003 
00004 #include "xmlBase/XmlParser.h"
00005 #include "xmlBase/Dom.h"
00006 #include <xercesc/dom/DOMElement.hpp>
00007 #include <xercesc/dom/DOMNodeList.hpp>
00008 #include <xercesc/dom/DOMTreeWalker.hpp>
00009 
00010 #include <string>
00011 #include <iostream>
00012 #include <vector>
00013 #include <cstdlib>
00014 #include <memory>
00015 
00016 #include "calibUtil/GenericSrv.h"
00017 #include "calibUtil/StripSrv.h"
00018 #include "calibUtil/ChannelStatusDef.h"
00019 
00020 namespace calibUtil {
00021   
00022   using XERCES_CPP_NAMESPACE_QUALIFIER DOMElement;
00023 
00024   StripSrv::StripSrv(eBadType badType, const GenericSrv& gen)
00025     : m_badType(badType), m_state(BUILDING) {
00026     m_genSrv = new GenericSrv(gen);
00027   }
00028 
00029   // Initialize the data structures by parsing the XML file
00030   StripSrv::StripSrv(std::string xmlFileName) : m_badType(UNKNOWN_BADTYPE),
00031                                                 m_state(FROM_PERS), 
00032                                                 m_genSrv(0)            
00033   {
00034     using xmlBase::Dom;
00035     using XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument;
00036 
00037     xmlBase::XmlParser* parser = new xmlBase::XmlParser();
00038     DOMDocument* doc = parser->parse(xmlFileName.c_str());
00039 
00040     if (doc == 0) {
00041       std::cerr << "Error parsing document" << xmlFileName << std::endl;
00042       return;
00043     }
00044 
00045     DOMElement* docElt = doc->getDocumentElement();
00046     m_genSrv = new GenericSrv(docElt);
00047 
00048     std::vector<DOMElement *> towers;
00049 
00050     Dom::getDescendantsByTagName(docElt, "tower", towers);
00051     unsigned nTower = towers.size();
00052 
00053     m_towers.reserve(nTower);
00054 
00055     std::string bString = Dom::getAttribute(docElt,"badType");
00056     if (!bString.compare("hot")) m_badType = HOT;
00057     else if (!bString.compare("dead")) m_badType = DEAD;
00058     else m_badType = UNKNOWN_BADTYPE;
00059 
00060 
00061     for (unsigned int iTower = 0; iTower < nTower; iTower++) {
00062       Tower tower;
00063       tower.m_uniplanes.clear();
00064       try {
00065         tower.m_row = Dom::getIntAttribute(towers[iTower], "row");
00066         tower.m_col = Dom::getIntAttribute(towers[iTower], "col");
00067       }
00068       catch (xmlBase::DomException ex) {
00069         std::cerr << "From calibUtil::StripSrv::StripSrv" << std::endl
00070                   << ex.getMsg() << std::endl;
00071         throw ex;
00072       }
00073 
00074       tower.m_howBad = 0;
00075       tower.m_allBad = 0;
00076 
00077       std::string attValue = Dom::getAttribute(towers[iTower], "nOnbdCalib");
00078       if (attValue.compare("true") == 0) {
00079         tower.m_howBad |= vCALIBUTIL_nOnbdCalib;
00080       }
00081       attValue = Dom::getAttribute(towers[iTower], "nOnbdTrig");
00082       if (attValue.compare("true") == 0) {
00083         tower.m_howBad |= vCALIBUTIL_nOnbdTrig;
00084       }
00085       attValue = Dom::getAttribute(towers[iTower], "nOnbdData");
00086       if (attValue.compare("true") == 0) {
00087         tower.m_howBad |= vCALIBUTIL_nOnbdData;
00088       }
00089       if (tower.m_howBad) {
00090         tower.m_allBad = 1;
00091         goto NEXT;
00092       }    // otherwise have to process individual uniplane elements
00093 
00094       {
00095         DOMElement* uniElt = Dom::getFirstChildElement(towers[iTower]);
00096 
00097         while (uniElt != 0) {
00098           Uniplane uni;
00099           uni.m_howBad = 0;
00100           fillUni(uniElt, &uni);
00101           // if bad status, complain and return
00102 
00103           tower.m_uniplanes.push_back(uni);
00104           uniElt = Dom::getSiblingElement(uniElt);
00105         }
00106       }
00107     NEXT:
00108       m_towers.push_back(tower);
00109       //      towerElt = Dom::getSiblingElement(towerElt);
00110     }
00111   }
00112 
00114   StripSrv::~StripSrv(){
00115     delete m_genSrv;
00116   }
00117   
00119   StripSrv::eBadType  StripSrv::getBadType() const {
00120     return m_badType;
00121   }
00122   
00124   void StripSrv::getBadTowers(std::vector<StripSrv::towerRC>& towerRCs) const
00125   {
00126     std::vector<Tower>::const_iterator it = m_towers.begin();
00127     while(it != m_towers.end() ) {
00128 
00129       towerRC trc;
00130       towerRCs.reserve(m_towers.size());
00131       trc.row = it->m_row;
00132       trc.col = it->m_col;
00133       towerRCs.push_back(trc);
00134       it++;
00135     }
00136   }
00137 
00139 
00141   std::string StripSrv::getInst() const {
00142     return m_genSrv->getInst();
00143   }
00144   
00146   std::string StripSrv::getTimestamp() const {
00147     return m_genSrv->getTimestamp();
00148   }
00149   
00151   std::string StripSrv::getCalType() const {
00152     return m_genSrv->getCalType();
00153   }
00154   
00156   std::string StripSrv::getFmtVer() const {
00157     return m_genSrv->getFmtVer();
00158   } 
00159   
00160   
00162   eVisitorRet StripSrv::traverseInfo(ClientObject *client) const {
00163 
00164     /* NOTE:  could also check for empty badLists and only
00165        call back client if nonempty.
00166     */
00167     std::vector<Tower>::const_iterator iTower = m_towers.begin();
00168     
00169     eVisitorRet ret = DONE;
00170     while (iTower != m_towers.end() ) {
00171       if (iTower->m_allBad) {
00172         ret = client->badTower(iTower->m_row, iTower->m_col, iTower->m_howBad);
00173         if (ret != CONT) return ret;
00174       }
00175       //   If tower not all bad, loop over planes within towers
00176       else {
00177         std::vector<Uniplane>::const_iterator iUni = 
00178           (iTower->m_uniplanes).begin();
00179         while (iUni != (iTower->m_uniplanes).end() ) {
00180           ret = client->badPlane(iTower->m_row, iTower->m_col,
00181                                  iUni->m_tray, iUni->m_top,
00182                                  iUni->m_howBad, iUni->m_allBad,
00183                                  (iUni->m_strips));
00184           if (ret != CONT) return ret;
00185           iUni++;
00186         }
00187       }
00188       ++iTower;
00189     }
00190     // If got to here, traversed the entire data structure without
00191     // a murmur from client
00192     return DONE;
00193   }
00194 
00195   // Private utilities
00196 
00197   void StripSrv::fillUni(const DOMElement* uniElt, Uniplane *uni) {
00198     using xmlBase::Dom;
00199 
00200     std::string attValue;
00201 
00202     attValue = Dom::getAttribute(uniElt, "allBad");
00203     uni->m_allBad = (attValue.compare("true") == 0);
00204 
00205     attValue = Dom::getAttribute(uniElt, "nOnbdCalib");
00206     if (attValue.compare("true") == 0) {
00207       uni->m_howBad |= vCALIBUTIL_nOnbdCalib;
00208     }
00209     attValue = Dom::getAttribute(uniElt, "nOnbdTrig");
00210     if (attValue.compare("true") == 0) {
00211       uni->m_howBad |= vCALIBUTIL_nOnbdTrig;
00212       }
00213     attValue = Dom::getAttribute(uniElt, "nOnbdData");
00214     if (attValue.compare("true") == 0) {
00215       uni->m_howBad |= vCALIBUTIL_nOnbdData;
00216     }
00217     
00218     attValue = Dom::getAttribute(uniElt, "tray");
00219     uni->m_tray = atoi(attValue.c_str());
00220     
00221     attValue = Dom::getAttribute(uniElt, "which");
00222     if (attValue.compare("top") == 0) uni->m_top = true;
00223     else if (attValue.compare("bot") == 0) uni->m_top = false;
00224     // if anything else happens, xml file is bad
00225     
00226     if (!uni->m_allBad) {   // process strip lists, spans
00227       fillStrips(uniElt, uni->m_strips);
00228     }
00229   }
00230 
00231 
00232   void StripSrv::fillStrips(const DOMElement* badElt, StripCol& list) {
00233     using xmlBase::Dom;
00234 
00235     DOMElement* childElt = Dom::getFirstChildElement(badElt);
00236 
00237     while (childElt != 0 ) {
00238       // must be list or span
00239       if (Dom::checkTagName(childElt, "stripList")) {
00240         std::string xmlList = Dom::getAttribute(childElt, "strips");
00241         strToNum(xmlList, list);
00242       }
00243       else  if (Dom::checkTagName(childElt, "stripSpan")) {
00244         unsigned short first, last;
00245 
00246         try {
00247           first = Dom::getIntAttribute(childElt, "first");
00248           last = Dom::getIntAttribute(childElt, "last");
00249         }
00250         catch (xmlBase::DomException ex) {
00251           std::cerr << "From calibUtil::StripSrv::fillStrips" << std::endl
00252                     << ex.getMsg() << std::endl;
00253           throw ex;
00254         }
00255       
00256         if (last >= first) {
00257           // Might as well reserve memory all at once
00258           list.reserve(list.size() + last + 1 - first);  
00259           for (unsigned short int i = first; i <= last; i++) {
00260             list.push_back(i);
00261           }
00262         }
00263       }
00264       childElt = Dom::getSiblingElement(childElt);
00265     }
00266   }
00267 
00268   void StripSrv::strToNum(std::string s, std::vector<unsigned short int> &v){
00269 
00270     std::string::iterator it = s.begin();
00271     
00272     // Maybe add something to be sure all we've got are digits
00273     // and blanks??
00274     
00275     // Skip over leading blanks, if any
00276     while((it != s.end()) && (*it == ' ')) it++;
00277 
00278     // save contiguous digits in tempStr
00279     while ((it != s.end()) && (*it >= '0') && (*it <= '9'))    {
00280       std::string tempStr;    
00281       tempStr += *it;
00282       it++;  
00283         
00284       while((it != s.end()) && (*it >= '0') && (*it <= '9')){
00285         tempStr += *it;
00286         it++;
00287       }
00288 
00289       // No more contiguous digits; skip over blanks
00290       while((it != s.end()) && (*it == ' ')) it++;
00291       
00292       // Save the converted integer
00293       v.push_back(atoi(tempStr.c_str()));
00294     }
00295 
00296   }
00297 
00298   StripSrv::Tower* StripSrv::findTower(towerRC& towerId) {
00299     std::vector<Tower>::iterator it = m_towers.begin();
00300     while(it != m_towers.end() ) {
00301       if ((it->m_row == towerId.row) && (it->m_col == towerId.col)) {
00302         return (&(*it));
00303       }
00304       ++it;
00305     }
00306     return 0;
00307   }
00308 
00309   const StripSrv::Tower* StripSrv::findTower(const towerRC& towerId) const {
00310     std::vector<Tower>::const_iterator it = m_towers.begin();
00311     while(it != m_towers.end() ) {
00312       if ((it->m_row == towerId.row) && (it->m_col == towerId.col)) {
00313         return (&(*it));
00314       }
00315       ++it;
00316     }
00317     return 0;
00318   }
00319   
00320   eVisitorRet StripSrv::writeXml(std::ostream* ) {
00321     return DONE;
00322   }
00323 
00324 
00325 }// end of namespace calibUtil

Generated on Tue Nov 29 22:57:55 2016 for BOSS_7.0.2 by  doxygen 1.4.7