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
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
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&);
00069
00070
00071 edm::FileInPath mInputfile;
00072 xercesc::XercesDOMParser *m_ConfigFileParser;
00073
00074
00075
00076
00077
00078 XMLCh* TAG_GEO;
00079 XMLCh* ATT_GEO_eta;
00080 XMLCh* ATT_GEO_phi;
00081 XMLCh* ATT_GEO_etam;
00082 XMLCh* ATT_GEO_phim;
00083 XMLCh* ATT_GEO_dim;
00084 XMLCh* TAG_SETTINGS;
00085
00086
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
00106 XMLCh* ATT_SETTINGS_JetET;
00107 XMLCh* ATT_SETTINGS_FineGrainPass;
00108
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;
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
00136
00137 setWhatProduced(this);
00138
00139 }
00140
00141
00142 L1CaloTriggerSetupProducer::~L1CaloTriggerSetupProducer()
00143 {
00144
00145
00146
00147 }
00148
00149
00150
00151
00152
00153
00154
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();
00169
00170
00171 edm::LogInfo ("INFO") << "Creating XML Tags" << endl;
00172
00173
00174 TAG_CARD =XMLString::transcode("CARD");
00175
00176
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
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
00206 ATT_SETTINGS_JetET=XMLString::transcode("JetEt");
00207 ATT_SETTINGS_FineGrainPass=XMLString::transcode("FineGrainPass");
00208
00209
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
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();
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
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
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
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
00310 DOMDocument* xmlDoc = m_ConfigFileParser->getDocument();
00311
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
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
00326 if( XMLString::equals(currentElement->getTagName(), TAG_CARD))
00327 {
00328 edm::LogInfo ("INFO") << "FOUND XML Setup information"<<endl;
00329
00330
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
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
00349 rcd.setGeometry(geo_eta,geo_phi,geo_etam,geo_phim,geo_dim);
00350 edm::LogInfo ("INFO") << "Geometry Set "<<endl;
00351
00352 }
00353
00354
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
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
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
00395 att_jetET,
00396 att_fineGrainPass );
00397 edm::LogInfo ("INFO") << "Thresholds Set"<<endl;
00398
00399 }
00400
00401
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
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