00001
00012 #include "HLTrigger/HLTcore/interface/HLTConfigData.h"
00013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00014
00015 #include <iostream>
00016
00017 static const edm::ParameterSet* s_dummyPSet()
00018 {
00019 static edm::ParameterSet dummyPSet;
00020 dummyPSet.registerIt();
00021 return &dummyPSet;
00022 }
00023
00024 HLTConfigData::HLTConfigData():
00025 processPSet_(s_dummyPSet()),
00026 processName_(""), globalTag_(""),
00027 tableName_(), triggerNames_(), moduleLabels_(), saveTagsModules_(),
00028 triggerIndex_(), moduleIndex_(),
00029 hltL1GTSeeds_(),
00030 streamNames_(), streamIndex_(), streamContents_(),
00031 datasetNames_(), datasetIndex_(), datasetContents_(),
00032 hltPrescaleTable_()
00033 {
00034 if (processPSet_->id().isValid()) {
00035 extract();
00036 }
00037 }
00038
00039 HLTConfigData::HLTConfigData(const edm::ParameterSet* iPSet):
00040 processPSet_(iPSet),
00041 processName_(""), globalTag_(""),
00042 tableName_(), triggerNames_(), moduleLabels_(), saveTagsModules_(),
00043 triggerIndex_(), moduleIndex_(),
00044 hltL1GTSeeds_(),
00045 streamNames_(), streamIndex_(), streamContents_(),
00046 datasetNames_(), datasetIndex_(), datasetContents_(),
00047 hltPrescaleTable_()
00048 {
00049 if (processPSet_->id().isValid()) {
00050 extract();
00051 }
00052 }
00053
00054 void HLTConfigData::extract()
00055 {
00056 using namespace std;
00057 using namespace edm;
00058 using namespace trigger;
00059
00060
00061 if (processPSet_->existsAs<string>("@process_name",true)) {
00062 processName_= processPSet_->getParameter<string>("@process_name");
00063 }
00064
00065
00066 globalTag_="";
00067 const ParameterSet* GlobalTagPSet(0);
00068 if (processPSet_->exists("GlobalTag")) {
00069 GlobalTagPSet = &(processPSet_->getParameterSet("GlobalTag"));
00070 } else if (processPSet_->exists("PoolDBESSource@GlobalTag")) {
00071 GlobalTagPSet = &(processPSet_->getParameterSet("PoolDBESSource@GlobalTag"));
00072 }
00073 if (GlobalTagPSet && GlobalTagPSet->existsAs<std::string>("globaltag",true)) {
00074 globalTag_=GlobalTagPSet->getParameter<std::string>("globaltag");
00075 }
00076
00077
00078 if (processPSet_->existsAs<ParameterSet>("HLTConfigVersion",true)) {
00079 const ParameterSet& HLTPSet(processPSet_->getParameterSet("HLTConfigVersion"));
00080 if (HLTPSet.existsAs<string>("tableName",true)) {
00081 tableName_=HLTPSet.getParameter<string>("tableName");
00082 }
00083 }
00084
00085 LogVerbatim("HLTConfigData") << "ProcessPSet with: "
00086 << processName_ << " "
00087 << globalTag_ << " "
00088 << tableName_;
00089
00090
00091 if (processPSet_->existsAs<ParameterSet>("@trigger_paths",true)) {
00092 const ParameterSet& HLTPSet(processPSet_->getParameterSet("@trigger_paths"));
00093 if (HLTPSet.existsAs<vector<string> >("@trigger_paths",true)) {
00094 triggerNames_= HLTPSet.getParameter<vector<string> >("@trigger_paths");
00095 }
00096 }
00097
00098
00099 const unsigned int n(size());
00100 moduleLabels_.reserve(n);
00101 for (unsigned int i=0;i!=n; ++i) {
00102 if (processPSet_->existsAs<vector<string> >(triggerNames_[i],true)) {
00103 moduleLabels_.push_back(processPSet_->getParameter<vector<string> >(triggerNames_[i]));
00104 }
00105 }
00106 saveTagsModules_.reserve(n);
00107 vector<string> labels;
00108 for (unsigned int i=0;i!=n; ++i) {
00109 labels.clear();
00110 const vector<string>& modules(moduleLabels(i));
00111 const unsigned int m(modules.size());
00112 labels.reserve(m);
00113 for (unsigned int j=0;j!=m; ++j) {
00114 const string& label(modules[j]);
00115 if (saveTags(label)) labels.push_back(label);
00116 }
00117 saveTagsModules_.push_back(labels);
00118 }
00119
00120
00121 moduleIndex_.resize(n);
00122 for (unsigned int i=0; i!=n; ++i) {
00123 triggerIndex_[triggerNames_[i]]=i;
00124 moduleIndex_[i].clear();
00125 const unsigned int m(size(i));
00126 for (unsigned int j=0; j!=m; ++j) {
00127 moduleIndex_[i][moduleLabels_[i][j]]=j;
00128 }
00129 }
00130
00131
00132 hltL1GTSeeds_.resize(n);
00133 for (unsigned int i=0; i!=n; ++i) {
00134 hltL1GTSeeds_[i].clear();
00135 const unsigned int m(size(i));
00136 for (unsigned int j=0; j!=m; ++j) {
00137 const string& label(moduleLabels_[i][j]);
00138 if (moduleType(label) == "HLTLevel1GTSeed") {
00139 const ParameterSet& pset(modulePSet(label));
00140 if (pset!=ParameterSet()) {
00141 const bool l1Tech(pset.getParameter<bool>("L1TechTriggerSeeding"));
00142 const string l1Seed(pset.getParameter<string>("L1SeedsLogicalExpression"));
00143 hltL1GTSeeds_[i].push_back(pair<bool,string>(l1Tech,l1Seed));
00144 }
00145 }
00146 }
00147 }
00148
00149
00150 if (processPSet_->existsAs<ParameterSet>("streams",true)) {
00151 const ParameterSet& streams(processPSet_->getParameterSet("streams"));
00152 streamNames_=streams.getParameterNamesForType<vector<string> >();
00153 sort(streamNames_.begin(),streamNames_.end());
00154 const unsigned int n(streamNames_.size());
00155 streamContents_.resize(n);
00156 for (unsigned int i=0; i!=n; ++i) {
00157 streamIndex_[streamNames_[i]]=i;
00158 streamContents_[i]=streams.getParameter<vector<string> >(streamNames_[i]);
00159 sort(streamContents_[i].begin(),streamContents_[i].end());
00160 }
00161
00162 }
00163
00164
00165 if (processPSet_->existsAs<ParameterSet>("datasets",true)) {
00166 const ParameterSet& datasets(processPSet_->getParameterSet("datasets"));
00167 datasetNames_=datasets.getParameterNamesForType<vector<string> >();
00168 sort(datasetNames_.begin(),datasetNames_.end());
00169 const unsigned int n(datasetNames_.size());
00170 datasetContents_.resize(n);
00171 for (unsigned int i=0; i!=n; ++i) {
00172 datasetIndex_[datasetNames_[i]]=i;
00173 datasetContents_[i]=datasets.getParameter< vector<string> >(datasetNames_[i]);
00174 sort(datasetContents_[i].begin(),datasetContents_[i].end());
00175 }
00176 }
00177
00178
00179
00180
00181 string prescaleName("");
00182 const string preS("PrescaleService");
00183 const string preT("PrescaleTable");
00184 if (processPSet_->existsAs<ParameterSet>(preS,true)) {
00185 prescaleName=preS;
00186 } else if ( processPSet_->existsAs<ParameterSet>(preT,true)) {
00187 prescaleName=preT;
00188 }
00189 if (prescaleName=="") {
00190 hltPrescaleTable_=HLTPrescaleTable();
00191 } else {
00192 const ParameterSet& iPS(processPSet_->getParameterSet(prescaleName));
00193 string defaultLabel("default");
00194 if (iPS.existsAs<string>("lvl1DefaultLabel",true)) {
00195 defaultLabel = iPS.getParameter<string>("lvl1DefaultLabel");
00196 }
00197 vector<string> labels;
00198 if (iPS.existsAs<vector<string> >("lvl1Labels",true)) {
00199 labels = iPS.getParameter<vector<string> >("lvl1Labels");
00200 }
00201 unsigned int set(0);
00202 const unsigned int n(labels.size());
00203 for (unsigned int i=0; i!=n; ++i) {
00204 if (labels[i]==defaultLabel) set=i;
00205 }
00206 map<string,vector<unsigned int> > table;
00207 if (iPS.existsAs< vector<ParameterSet> >("prescaleTable",true)) {
00208 const vector<ParameterSet>& vpTable(iPS.getParameterSetVector("prescaleTable"));
00209 const unsigned int m (vpTable.size());
00210 for (unsigned int i=0; i!=m; ++i) {
00211 table[vpTable[i].getParameter<std::string>("pathName")] =
00212 vpTable[i].getParameter<std::vector<unsigned int> >("prescales");
00213 }
00214 }
00215 if (n>0) {
00216 hltPrescaleTable_=HLTPrescaleTable(set,labels,table);
00217 } else {
00218 hltPrescaleTable_=HLTPrescaleTable();
00219 }
00220
00221 }
00222
00223 return;
00224 }
00225
00226 void HLTConfigData::dump(const std::string& what) const {
00227 using namespace std;
00228 using namespace edm;
00229
00230 if (what=="ProcessPSet") {
00231 cout << "HLTConfigData::dump: ProcessPSet = " << endl << *processPSet_ << endl;
00232 } else if (what=="ProcessName") {
00233 cout << "HLTConfigData::dump: ProcessName = " << processName_ << endl;
00234 } else if (what=="GlobalTag") {
00235 cout << "HLTConfigData::dump: GlobalTag = " << globalTag_ << endl;
00236 } else if (what=="TableName") {
00237 cout << "HLTConfigData::dump: TableName = " << tableName_ << endl;
00238 } else if (what=="Triggers") {
00239 const unsigned int n(size());
00240 cout << "HLTConfigData::dump: Triggers: " << n << endl;
00241 for (unsigned int i=0; i!=n; ++i) {
00242 cout << " " << i << " " << triggerNames_[i] << endl;
00243 }
00244 } else if (what=="TriggerSeeds") {
00245 const unsigned int n(size());
00246 cout << "HLTConfigData::dump: TriggerSeeds: " << n << endl;
00247 for (unsigned int i=0; i!=n; ++i) {
00248 const unsigned int m(hltL1GTSeeds_[i].size());
00249 cout << " " << i << " " << triggerNames_[i] << " " << m << endl;
00250 for (unsigned int j=0; j!=m; ++j) {
00251 cout << " " << j
00252 << " " << hltL1GTSeeds_[i][j].first
00253 << "/" << hltL1GTSeeds_[i][j].second << endl;
00254 }
00255 }
00256 } else if (what=="Modules") {
00257 const unsigned int n(size());
00258 cout << "HLTConfigData::dump Triggers and Modules: " << n << endl;
00259 for (unsigned int i=0; i!=n; ++i) {
00260 const unsigned int m(size(i));
00261 cout << i << " " << triggerNames_[i] << " " << m << endl;
00262 cout << " - Modules: ";
00263 unsigned int nHLTPrescalers(0);
00264 unsigned int nHLTLevel1GTSeed(0);
00265 for (unsigned int j=0; j!=m; ++j) {
00266 const string& label(moduleLabels_[i][j]);
00267 const string type(moduleType(label));
00268 const string edmtype(moduleEDMType(label));
00269 const bool tags(saveTags(label));
00270 cout << " " << j << ":" << label << "/" << type << "/" << edmtype << "/" << tags;
00271 if (type=="HLTPrescaler") nHLTPrescalers++;
00272 if (type=="HLTLevel1GTSeed") nHLTLevel1GTSeed++;
00273 }
00274 cout << endl;
00275 cout << " - Number of HLTPrescaler/HLTLevel1GTSeed modules: "
00276 << nHLTPrescalers << "/" << nHLTLevel1GTSeed << endl;
00277 }
00278 } else if (what=="StreamNames") {
00279 const unsigned int n(streamNames_.size());
00280 cout << "HLTConfigData::dump: StreamNames: " << n << endl;
00281 for (unsigned int i=0; i!=n; ++i) {
00282 cout << " " << i << " " << streamNames_[i] << endl;
00283 }
00284 } else if (what=="Streams") {
00285 const unsigned int n(streamNames_.size());
00286 cout << "HLTConfigData::dump: Streams: " << n << endl;
00287 for (unsigned int i=0; i!=n; ++i) {
00288 const unsigned int m(streamContents_[i].size());
00289 cout << " " << i << " " << streamNames_[i] << " " << m << endl;
00290 for (unsigned int j=0; j!=m; ++j) {
00291 cout << " " << j << " " << streamContents_[i][j] << endl;
00292 }
00293 }
00294 } else if (what=="DatasetNames") {
00295 const unsigned int n(datasetNames_.size());
00296 cout << "HLTConfigData::dump: DatasetNames: " << n << endl;
00297 for (unsigned int i=0; i!=n; ++i) {
00298 cout << " " << i << " " << datasetNames_[i] << endl;
00299 }
00300 } else if (what=="Datasets") {
00301 const unsigned int n(datasetNames_.size());
00302 cout << "HLTConfigData::dump: Datasets: " << n << endl;
00303 for (unsigned int i=0; i!=n; ++i) {
00304 const unsigned int m(datasetContents_[i].size());
00305 cout << " " << i << " " << datasetNames_[i] << " " << m << endl;
00306 for (unsigned int j=0; j!=m; ++j) {
00307 cout << " " << j << " " << datasetContents_[i][j] << endl;
00308 }
00309 }
00310 } else if (what=="PrescaleTable") {
00311 const unsigned int n (hltPrescaleTable_.size());
00312 cout << "HLTConfigData::dump: PrescaleTable: # of sets : " << n << endl;
00313 const vector<string>& labels(hltPrescaleTable_.labels());
00314 for (unsigned int i=0; i!=n; ++i) {
00315 cout << " " << i << "/'" << labels.at(i) << "'";
00316 }
00317 if (n>0) cout << endl;
00318 const map<string,vector<unsigned int> >& table(hltPrescaleTable_.table());
00319 cout << "HLTConfigData::dump: PrescaleTable: # of paths: " << table.size() << endl;
00320 const map<string,vector<unsigned int> >::const_iterator tb(table.begin());
00321 const map<string,vector<unsigned int> >::const_iterator te(table.end());
00322 for (map<string,vector<unsigned int> >::const_iterator ti=tb; ti!=te; ++ti) {
00323 for (unsigned int i=0; i!=n; ++i) {
00324 cout << " " << ti->second.at(i);
00325 }
00326 cout << " " << ti->first << endl;
00327 }
00328 } else {
00329 cout << "HLTConfigData::dump: Unkown dump request: " << what << endl;
00330 }
00331 return;
00332 }
00333
00334 const std::string& HLTConfigData::processName() const {
00335 return processName_;
00336 }
00337
00338 unsigned int HLTConfigData::size() const {
00339 return triggerNames_.size();
00340 }
00341 unsigned int HLTConfigData::size(unsigned int trigger) const {
00342 return moduleLabels_.at(trigger).size();
00343 }
00344 unsigned int HLTConfigData::size(const std::string& trigger) const {
00345 return size(triggerIndex(trigger));
00346 }
00347
00348 const std::string& HLTConfigData::tableName() const {
00349 return tableName_;
00350 }
00351 const std::vector<std::string>& HLTConfigData::triggerNames() const {
00352 return triggerNames_;
00353 }
00354 const std::string& HLTConfigData::triggerName(unsigned int trigger) const {
00355 return triggerNames_.at(trigger);
00356 }
00357 unsigned int HLTConfigData::triggerIndex(const std::string& trigger) const {
00358 const std::map<std::string,unsigned int>::const_iterator index(triggerIndex_.find(trigger));
00359 if (index==triggerIndex_.end()) {
00360 return size();
00361 } else {
00362 return index->second;
00363 }
00364 }
00365
00366 const std::vector<std::string>& HLTConfigData::moduleLabels(unsigned int trigger) const {
00367 return moduleLabels_.at(trigger);
00368 }
00369 const std::vector<std::string>& HLTConfigData::moduleLabels(const std::string& trigger) const {
00370 return moduleLabels_.at(triggerIndex(trigger));
00371 }
00372
00373 const std::vector<std::string>& HLTConfigData::saveTagsModules(unsigned int trigger) const {
00374 return saveTagsModules_.at(trigger);
00375 }
00376 const std::vector<std::string>& HLTConfigData::saveTagsModules(const std::string& trigger) const {
00377 return saveTagsModules_.at(triggerIndex(trigger));
00378 }
00379
00380 const std::string& HLTConfigData::moduleLabel(unsigned int trigger, unsigned int module) const {
00381 return moduleLabels_.at(trigger).at(module);
00382 }
00383 const std::string& HLTConfigData::moduleLabel(const std::string& trigger, unsigned int module) const {
00384 return moduleLabels_.at(triggerIndex(trigger)).at(module);
00385 }
00386
00387 unsigned int HLTConfigData::moduleIndex(unsigned int trigger, const std::string& module) const {
00388 const std::map<std::string,unsigned int>::const_iterator index(moduleIndex_.at(trigger).find(module));
00389 if (index==moduleIndex_.at(trigger).end()) {
00390 return size(trigger);
00391 } else {
00392 return index->second;
00393 }
00394 }
00395 unsigned int HLTConfigData::moduleIndex(const std::string& trigger, const std::string& module) const {
00396 return moduleIndex(triggerIndex(trigger),module);
00397 }
00398
00399 const std::string HLTConfigData::moduleType(const std::string& module) const {
00400 const edm::ParameterSet& pset(modulePSet(module));
00401 if (pset.existsAs<std::string>("@module_type",true)) {
00402 return pset.getParameter<std::string>("@module_type");
00403 } else {
00404 return "";
00405 }
00406 }
00407
00408 const std::string HLTConfigData::moduleEDMType(const std::string& module) const {
00409 const edm::ParameterSet& pset(modulePSet(module));
00410 if (pset.existsAs<std::string>("@module_edm_type",true)) {
00411 return pset.getParameter<std::string>("@module_edm_type");
00412 } else {
00413 return "";
00414 }
00415 }
00416
00417 const edm::ParameterSet& HLTConfigData::processPSet() const {
00418 return *processPSet_;
00419 }
00420
00421 const edm::ParameterSet& HLTConfigData::modulePSet(const std::string& module) const {
00422 if (processPSet_->exists(module)) {
00423 return processPSet_->getParameterSet(module);
00424 } else {
00425 return *s_dummyPSet();
00426 }
00427 }
00428
00429 bool HLTConfigData::saveTags(const std::string& module) const {
00430 const edm::ParameterSet& pset(modulePSet(module));
00431 if (pset.existsAs<bool>("saveTags",true)) {
00432 return pset.getParameter<bool>("saveTags");
00433 } else {
00434 return false;
00435 }
00436 }
00437
00438 const std::vector<std::vector<std::pair<bool,std::string> > >& HLTConfigData::hltL1GTSeeds() const {
00439 return hltL1GTSeeds_;
00440 }
00441
00442 const std::vector<std::pair<bool,std::string> >& HLTConfigData::hltL1GTSeeds(const std::string& trigger) const {
00443 return hltL1GTSeeds(triggerIndex(trigger));
00444 }
00445
00446 const std::vector<std::pair<bool,std::string> >& HLTConfigData::hltL1GTSeeds(unsigned int trigger) const {
00447 return hltL1GTSeeds_.at(trigger);
00448 }
00449
00451 const std::vector<std::string>& HLTConfigData::streamNames() const {
00452 return streamNames_;
00453 }
00454
00455 const std::string& HLTConfigData::streamName(unsigned int stream) const {
00456 return streamNames_.at(stream);
00457 }
00458
00459 unsigned int HLTConfigData::streamIndex(const std::string& stream) const {
00460 const std::map<std::string,unsigned int>::const_iterator index(streamIndex_.find(stream));
00461 if (index==streamIndex_.end()) {
00462 return streamNames_.size();
00463 } else {
00464 return index->second;
00465 }
00466 }
00467
00468 const std::vector<std::vector<std::string> >& HLTConfigData::streamContents() const {
00469 return streamContents_;
00470 }
00471
00472 const std::vector<std::string>& HLTConfigData::streamContent(unsigned int stream) const {
00473 return streamContents_.at(stream);
00474 }
00475
00476 const std::vector<std::string>& HLTConfigData::streamContent(const std::string& stream) const {
00477 return streamContent(streamIndex(stream));
00478 }
00479
00481 const std::vector<std::string>& HLTConfigData::datasetNames() const {
00482 return datasetNames_;
00483 }
00484
00485 const std::string& HLTConfigData::datasetName(unsigned int dataset) const {
00486 return datasetNames_.at(dataset);
00487 }
00488
00489 unsigned int HLTConfigData::datasetIndex(const std::string& dataset) const {
00490 const std::map<std::string,unsigned int>::const_iterator index(datasetIndex_.find(dataset));
00491 if (index==datasetIndex_.end()) {
00492 return datasetNames_.size();
00493 } else {
00494 return index->second;
00495 }
00496 }
00497
00498 const std::vector<std::vector<std::string> >& HLTConfigData::datasetContents() const {
00499 return datasetContents_;
00500 }
00501
00502 const std::vector<std::string>& HLTConfigData::datasetContent(unsigned int dataset) const {
00503 return datasetContents_.at(dataset);
00504 }
00505
00506 const std::vector<std::string>& HLTConfigData::datasetContent(const std::string& dataset) const {
00507 return datasetContent(datasetIndex(dataset));
00508 }
00509
00510
00511 unsigned int HLTConfigData::prescaleSize() const {
00512 return hltPrescaleTable_.size();
00513 }
00514 unsigned int HLTConfigData::prescaleValue(unsigned int set, const std::string& trigger) const {
00515 return hltPrescaleTable_.prescale(set,trigger);
00516 }
00517
00518 const std::vector<std::string>& HLTConfigData::prescaleLabels() const {
00519 return hltPrescaleTable_.labels();
00520 }
00521 const std::map<std::string,std::vector<unsigned int> >& HLTConfigData::prescaleTable() const {
00522 return hltPrescaleTable_.table();
00523 }
00524
00525 edm::ParameterSetID HLTConfigData::id() const {
00526 return processPSet_->id();
00527 }