CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC2_patch1/src/SLHCUpgradeSimulations/L1CaloTrigger/plugins/L1CaloTriggerSetupProducer.cc

Go to the documentation of this file.
00001 #ifndef L1CALOTRIGGERSETUPPRODUCER_H
00002 #define L1CALOTRIGGERSETUPPRODUCER_H
00003 
00004 #include <string>
00005 #include <iostream>
00006 #include <sstream>
00007 #include <stdexcept>
00008 #include <list>
00009 #include <sys/types.h>
00010 #include <sys/stat.h>
00011 #include <unistd.h>
00012 #include <errno.h>
00013 
00014 #include <memory>
00015 #include "boost/shared_ptr.hpp"
00016 
00017 #include "FWCore/Framework/interface/ModuleFactory.h"
00018 #include "FWCore/Framework/interface/ModuleFactory.h"
00019 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00020 #include "FWCore/Framework/interface/ESProducer.h"
00021 #include "FWCore/Framework/interface/ESHandle.h"
00022 #include "FWCore/Framework/interface/ESProducts.h"
00023 #include "SimDataFormats/SLHC/interface/L1CaloTriggerSetup.h"
00024 #include "SimDataFormats/SLHC/interface/L1CaloTriggerSetupRcd.h"
00025 
00026 //Include XERCES-C XML Parser
00027 #include <xercesc/dom/DOM.hpp>
00028 #include <xercesc/dom/DOMDocument.hpp>
00029 #include <xercesc/dom/DOMDocumentType.hpp>
00030 #include <xercesc/dom/DOMElement.hpp>
00031 #include <xercesc/dom/DOMImplementation.hpp>
00032 #include <xercesc/dom/DOMImplementationLS.hpp>
00033 #include <xercesc/dom/DOMNodeIterator.hpp>
00034 #include <xercesc/dom/DOMNodeList.hpp>
00035 #include <xercesc/dom/DOMText.hpp>
00036 #include <xercesc/parsers/XercesDOMParser.hpp>
00037 #include <xercesc/util/XMLUni.hpp>
00038 #include <string>
00039 #include <stdexcept>
00040 
00041 #include "FWCore/Framework/interface/Frameworkfwd.h"
00042 #include "FWCore/Framework/interface/EDProducer.h"
00043 #include "FWCore/Framework/interface/Event.h"
00044 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00045 
00046 
00047 // Error codes
00048 enum {
00049   ERROR_ARGS = 1,
00050   ERROR_XERCES_INIT,
00051   ERROR_PARSE,
00052    ERROR_EMPTY_DOCUMENT
00053 };
00054 
00055 
00056 class L1CaloTriggerSetupProducer : public edm::ESProducer {
00057    public:
00058       L1CaloTriggerSetupProducer(const edm::ParameterSet&);
00059       ~L1CaloTriggerSetupProducer();
00060 
00061       typedef boost::shared_ptr<L1CaloTriggerSetup> ReturnType;
00062 
00063       ReturnType produce(const L1CaloTriggerSetupRcd&);
00064    private:
00065 
00066 
00067   void openFile(std::string&) throw(std::runtime_error);
00068   void config(L1CaloTriggerSetup&); //Configure
00069 
00070 
00071   edm::FileInPath mInputfile;
00072   xercesc::XercesDOMParser *m_ConfigFileParser; //Main Parser object
00073 
00074 
00075   //DECLARE THE XML TAGS AND ATTRIBUTES
00076 
00077 
00078      XMLCh* TAG_GEO; //Tag For Geometry and Dimension
00079      XMLCh* ATT_GEO_eta; //Eta0 of the lattice
00080      XMLCh* ATT_GEO_phi; //Phi0 of the lattice
00081      XMLCh* ATT_GEO_etam; //EtaMax of the lattice
00082      XMLCh* ATT_GEO_phim; //PhiMax of the lattice
00083      XMLCh* ATT_GEO_dim; //Dimension of the lattice (Square
00084      XMLCh* TAG_SETTINGS;//Tag for Card general settings
00085 
00086      //Thresholds/Settings
00087       XMLCh* ATT_SETTINGS_ECALTower;
00088       XMLCh* ATT_SETTINGS_HCALTower;
00089       XMLCh* ATT_SETTINGS_ElectronCutA;
00090       XMLCh* ATT_SETTINGS_ElectronCutB;
00091       XMLCh* ATT_SETTINGS_ElectronCutC;
00092 
00093       XMLCh* ATT_SETTINGS_TauSeedTower;
00094 
00095       XMLCh* ATT_SETTINGS_ClusterCut;
00096       XMLCh* ATT_SETTINGS_IsolationEA;
00097       XMLCh* ATT_SETTINGS_IsolationEB;
00098       XMLCh* ATT_SETTINGS_IsolationTA;
00099       XMLCh* ATT_SETTINGS_IsolationTB;
00100       XMLCh* ATT_SETTINGS_IsolationZone;
00101       XMLCh* ATT_SETTINGS_IsolationPedestalEG;
00102       XMLCh* ATT_SETTINGS_IsolationPedestalTau;
00103 
00104 
00105   //      XMLCh* ATT_SETTINGS_JetCenter;
00106       XMLCh* ATT_SETTINGS_JetET;
00107       XMLCh* ATT_SETTINGS_FineGrainPass;
00108       //Wires
00109       XMLCh* TAG_WIRE;
00110       XMLCh* ATT_WIRE_bin;
00111       XMLCh* ATT_WIRE_eta;
00112       XMLCh* ATT_WIRE_phi;
00113 
00114 
00115     XMLCh* TAG_CARD; //Tag for  Card  ---General
00116 
00117 };
00118 #endif
00119 
00120 
00121 
00122 
00123 
00124 
00125 
00126 using namespace xercesc;
00127 using namespace std;
00128 
00129 
00130 
00131 L1CaloTriggerSetupProducer::L1CaloTriggerSetupProducer(const edm::ParameterSet& iConfig)
00132 {
00133   mInputfile = iConfig.getParameter<edm::FileInPath>("InputXMLFile");
00134 
00135    //the following line is needed to tell the framework what
00136    // data is being produced
00137    setWhatProduced(this);
00138 
00139 }
00140 
00141 
00142 L1CaloTriggerSetupProducer::~L1CaloTriggerSetupProducer()
00143 {
00144 
00145 
00146 
00147 }
00148 
00149 
00150 //
00151 // member functions
00152 //
00153 
00154 // ------------ method called to produce the data  ------------
00155 L1CaloTriggerSetupProducer::ReturnType
00156 L1CaloTriggerSetupProducer::produce(const L1CaloTriggerSetupRcd& iRecord)
00157 {
00158    using namespace edm::es;
00159 
00160    L1CaloTriggerSetup *setup = new L1CaloTriggerSetup();
00161    std::string filePath = mInputfile.fullPath();
00162 
00163    edm::LogInfo ("INFO") << "Configuration File:"<<filePath << endl;
00164 
00165 
00166 
00167    edm::LogInfo ("INFO") << "Initializing XERCES" << endl;
00168    XMLPlatformUtils::Initialize();  // Initialize Xerces infrastructure
00169 
00170 
00171    edm::LogInfo ("INFO") << "Creating XML Tags" << endl;
00172 
00173    //Mother Card : ClusteringCard
00174     TAG_CARD =XMLString::transcode("CARD");
00175 
00176     //Geometry Setup
00177     TAG_GEO =XMLString::transcode("GEOMETRY");
00178 
00179     ATT_GEO_eta=XMLString::transcode("eta0");
00180     ATT_GEO_phi=XMLString::transcode("phi0");
00181     ATT_GEO_dim=XMLString::transcode("dim");
00182     ATT_GEO_etam=XMLString::transcode("etam");
00183     ATT_GEO_phim=XMLString::transcode("phim");
00184 
00185     //Algorithm Settings
00186     TAG_SETTINGS=XMLString::transcode("SETTINGS");
00187 
00188     ATT_SETTINGS_ECALTower=XMLString::transcode("ECALTower");
00189     ATT_SETTINGS_HCALTower=XMLString::transcode("HCALTower");
00190     ATT_SETTINGS_ClusterCut=XMLString::transcode("ClusterThr");
00191 
00192     ATT_SETTINGS_ElectronCutA=XMLString::transcode("ElectronConstant");
00193     ATT_SETTINGS_ElectronCutB=XMLString::transcode("ElectronThreshold");
00194     ATT_SETTINGS_ElectronCutC=XMLString::transcode("ElectronSlope");
00195 
00196     ATT_SETTINGS_TauSeedTower=XMLString::transcode("TauSeedTower");
00197 
00198     ATT_SETTINGS_IsolationEA=XMLString::transcode("IsolationElectronA");
00199     ATT_SETTINGS_IsolationEB=XMLString::transcode("IsolationElectronB");
00200     ATT_SETTINGS_IsolationTA=XMLString::transcode("IsolationTauA");
00201     ATT_SETTINGS_IsolationTB=XMLString::transcode("IsolationTauB");
00202     ATT_SETTINGS_IsolationZone=XMLString::transcode("IsolationZone");
00203     ATT_SETTINGS_IsolationPedestalEG=XMLString::transcode("IsolationThresholdElectron");
00204     ATT_SETTINGS_IsolationPedestalTau=XMLString::transcode("IsolationThresholdTau");
00205     //    ATT_SETTINGS_JetCenter=XMLString::transcode("JetCenter");
00206     ATT_SETTINGS_JetET=XMLString::transcode("JetEt");
00207     ATT_SETTINGS_FineGrainPass=XMLString::transcode("FineGrainPass");
00208 
00209     //Wire Information
00210     TAG_WIRE=XMLString::transcode("WIRE");
00211     ATT_WIRE_bin=XMLString::transcode("no");
00212     ATT_WIRE_eta=XMLString::transcode("eta");
00213     ATT_WIRE_phi=XMLString::transcode("phi");
00214 
00215     TAG_CARD = XMLString::transcode("CARD");
00216 
00217 
00218     //Initialize the parser
00219 
00220    edm::LogInfo ("INFO") << "Initializing XERCES Parser" << endl;
00221    m_ConfigFileParser = new XercesDOMParser;
00222 
00223 
00224    edm::LogInfo ("INFO") << "Opening File..." << endl;
00225    openFile(filePath);
00226    edm::LogInfo ("INFO") << "Parsing Configuration"<<endl;
00227    config(*setup);
00228 
00229    edm::LogInfo ("INFO") << "terminating XERCES"<<endl;
00230    XMLPlatformUtils::Terminate();  // Terminate Xerces
00231 
00232    XMLString::release(&TAG_CARD);
00233    XMLString::release(&TAG_GEO);
00234    XMLString::release(&ATT_GEO_eta);
00235    XMLString::release(&ATT_GEO_phi);
00236    XMLString::release(&ATT_GEO_dim);
00237    XMLString::release(&TAG_SETTINGS);
00238    XMLString::release(&ATT_SETTINGS_ECALTower);
00239    XMLString::release(&ATT_SETTINGS_HCALTower);
00240    XMLString::release(&ATT_SETTINGS_TauSeedTower);
00241    XMLString::release(&ATT_SETTINGS_ElectronCutA);
00242    XMLString::release(&ATT_SETTINGS_ElectronCutB);
00243    XMLString::release(&ATT_SETTINGS_ElectronCutC);
00244 
00245    XMLString::release(&ATT_SETTINGS_ClusterCut);
00246    XMLString::release(&ATT_SETTINGS_IsolationEA);
00247    XMLString::release(&ATT_SETTINGS_IsolationEB);
00248    XMLString::release(&ATT_SETTINGS_IsolationTA);
00249    XMLString::release(&ATT_SETTINGS_IsolationTB);
00250    XMLString::release(&ATT_SETTINGS_IsolationZone);
00251    //   XMLString::release(&ATT_SETTINGS_JetCenter);
00252    XMLString::release(&ATT_SETTINGS_JetET);
00253    XMLString::release(&ATT_SETTINGS_FineGrainPass);
00254    XMLString::release(&TAG_WIRE);
00255    XMLString::release(&ATT_WIRE_bin);
00256    XMLString::release(&ATT_WIRE_eta);
00257    XMLString::release(&ATT_WIRE_phi);
00258    XMLString::release(&ATT_SETTINGS_IsolationPedestalEG);
00259    XMLString::release(&ATT_SETTINGS_IsolationPedestalTau);
00260 
00261 
00262    edm::LogInfo ("INFO") << "Creating Setup Module"<<endl;
00263    boost::shared_ptr<L1CaloTriggerSetup> rcd =(boost::shared_ptr<L1CaloTriggerSetup>) setup ;
00264    edm::LogInfo ("INFO") << "Event Setup Successfull"<<endl;
00265    return rcd ;
00266 
00267 }
00268 
00269 
00270 
00271 void
00272 L1CaloTriggerSetupProducer::openFile(string& configFile)
00273   throw( std::runtime_error )
00274 {
00275   // Test to see if the file is ok.
00276 
00277   struct stat fileStatus;
00278 
00279   int iretStat = stat(configFile.c_str(), &fileStatus);
00280   if( iretStat == ENOENT )
00281     printf("Path file_name does not exist, or path is an empty string.");
00282 
00283   else if( iretStat == ENOTDIR )
00284     printf("A component of the path is not a directory.");
00285   else if( iretStat == ELOOP )
00286     printf("Too many symbolic links encountered while traversing the path.");
00287   else if( iretStat == EACCES )
00288     printf("Permission denied.");
00289   else if( iretStat == ENAMETOOLONG )
00290     printf("File can not be read\n");
00291 
00292   // Configure DOM parser.
00293 
00294   m_ConfigFileParser->setValidationScheme( XercesDOMParser::Val_Never );
00295   m_ConfigFileParser->setDoNamespaces( false );
00296   m_ConfigFileParser->setDoSchema( false );
00297   m_ConfigFileParser->setLoadExternalDTD( false );
00298   m_ConfigFileParser->parse( configFile.c_str() );
00299 
00300 }
00301 
00302 
00303 
00304 void
00305 L1CaloTriggerSetupProducer::config(L1CaloTriggerSetup& rcd)
00306 {
00307 
00308 
00309        //Read Document
00310        DOMDocument* xmlDoc = m_ConfigFileParser->getDocument();
00311         //get Root XML element <root>
00312        DOMElement* elementRoot = xmlDoc->getDocumentElement();
00313         if( !elementRoot ) throw(std::runtime_error( "empty XML document" ));
00314        DOMNodeList*  children = elementRoot->getChildNodes();
00315        const  XMLSize_t nodeCount = children->getLength();
00316 
00317        //loop through XML entries
00318       for( XMLSize_t xx = 0; xx < nodeCount; ++xx )
00319   {
00320     DOMNode* currentNode = children->item(xx);
00321     if( currentNode->getNodeType() && currentNode->getNodeType() == DOMNode::ELEMENT_NODE )
00322       {
00323             DOMElement* currentElement = dynamic_cast< xercesc::DOMElement* >( currentNode );
00324 
00325       //Search for Clustering Card
00326             if( XMLString::equals(currentElement->getTagName(), TAG_CARD))
00327         {
00328     edm::LogInfo ("INFO") << "FOUND XML Setup information"<<endl;
00329 
00330     //Loop on the Children of the Clustering Card
00331     DOMNodeList*  card_c = currentElement->getChildNodes();
00332     XMLSize_t cardc_count = card_c->getLength();
00333     for( XMLSize_t i = 0; i < cardc_count; ++i)
00334        {
00335                  DOMNode* Nodei = card_c->item(i);
00336                if( Nodei->getNodeType() && Nodei->getNodeType() == DOMNode::ELEMENT_NODE )
00337            {
00338 
00339              DOMElement* cc_el = dynamic_cast< xercesc::DOMElement* >( Nodei );
00340              //Look for geo
00341              if( XMLString::equals(cc_el->getTagName(), TAG_GEO))
00342          {
00343            int geo_eta =atoi(XMLString::transcode(cc_el->getAttribute(ATT_GEO_eta)));
00344            int geo_phi =atoi(XMLString::transcode(cc_el->getAttribute(ATT_GEO_phi)));
00345            int geo_etam =atoi(XMLString::transcode(cc_el->getAttribute(ATT_GEO_etam)));
00346            int geo_phim =atoi(XMLString::transcode(cc_el->getAttribute(ATT_GEO_phim)));
00347            int geo_dim =atoi(XMLString::transcode(cc_el->getAttribute(ATT_GEO_dim)));
00348            //Store geo on the card
00349            rcd.setGeometry(geo_eta,geo_phi,geo_etam,geo_phim,geo_dim);
00350            edm::LogInfo ("INFO") << "Geometry Set "<<endl;
00351 
00352          }
00353 
00354              //Look for SETTINGS
00355              if( XMLString::equals(cc_el->getTagName(), TAG_SETTINGS))
00356          {
00357            int att_ECALTower     =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_ECALTower)));
00358            int att_HCALTower     =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_HCALTower)));
00359 
00360            int att_TauSeedTower     =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_TauSeedTower)));
00361 
00362            int att_ElectronCutA   =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_ElectronCutA)));
00363            int att_ElectronCutB   =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_ElectronCutB)));
00364            int att_ElectronCutC   =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_ElectronCutC)));
00365 
00366            int att_ClusterCut    =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_ClusterCut)));
00367            int att_isoEA         =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_IsolationEA)));
00368            int att_isoEB         =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_IsolationEB)));
00369            int att_isoTA         =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_IsolationTA)));
00370            int att_isoTB         =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_IsolationTB)));
00371            int att_isoZone       =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_IsolationZone)));
00372            int att_isoPedEG      =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_IsolationPedestalEG)));
00373            int att_isoPedTau     =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_IsolationPedestalTau)));
00374 
00375            //           int att_jetC          =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_JetCenter)));
00376            int att_jetET         =atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_JetET)));
00377            int att_fineGrainPass = atoi(XMLString::transcode(cc_el->getAttribute(ATT_SETTINGS_FineGrainPass)));
00378 
00379            //Store Activity Cuts on the Card
00380            rcd.setThresholds(att_ECALTower,
00381                  att_HCALTower,
00382                  att_ElectronCutA,
00383                  att_ElectronCutB,
00384                  att_ElectronCutC,
00385                  att_TauSeedTower,
00386                  att_ClusterCut,
00387                  att_isoEA,
00388                  att_isoEB,
00389                  att_isoTA,
00390                  att_isoTB,
00391                  att_isoZone,
00392                  att_isoPedEG,
00393                  att_isoPedTau,
00394                              //                 att_jetC,
00395                  att_jetET,
00396                  att_fineGrainPass     );
00397            edm::LogInfo ("INFO") << "Thresholds Set"<<endl;
00398 
00399          }
00400 
00401              //Look for Wires
00402              if( XMLString::equals(cc_el->getTagName(), TAG_WIRE))
00403          {
00404            int wire_bin  =atoi(XMLString::transcode(cc_el->getAttribute(ATT_WIRE_bin)));
00405            int wire_eta  =atoi(XMLString::transcode(cc_el->getAttribute(ATT_WIRE_eta)));
00406            int wire_phi  =atoi(XMLString::transcode(cc_el->getAttribute(ATT_WIRE_phi)));
00407            //store wires
00408            rcd.addWire(wire_bin,wire_eta,wire_phi);
00409 
00410          }
00411            }
00412        }
00413 
00414         }
00415       }
00416   }
00417 
00418 }
00419 
00420 
00421 
00422 DEFINE_FWK_EVENTSETUP_MODULE(L1CaloTriggerSetupProducer);
00423 
00424 
00425