CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_6/src/DQM/HLTEvF/plugins/HLTMonBitSummary.cc

Go to the documentation of this file.
00001 //HLTMonBitSummary.cc
00002 //combination of HLTMon.cc and UserCode/AEverett/BitPlotting
00003 
00004 // user include files
00005 #include "DQM/HLTEvF/interface/HLTMonBitSummary.h"
00006 
00007 #include "FWCore/Framework/interface/Frameworkfwd.h"
00008 #include "FWCore/Framework/interface/EDAnalyzer.h"
00009 
00010 #include "FWCore/Framework/interface/Event.h"
00011 #include "FWCore/Framework/interface/MakerMacros.h"
00012 #include "FWCore/Framework/interface/ESHandle.h"
00013 
00014 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00015 
00016 #include "FWCore/Common/interface/TriggerNames.h"
00017 #include "DataFormats/Common/interface/TriggerResults.h"
00018 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00019 #include "FWCore/Framework/interface/Run.h"
00020 
00021 //#include "DQM/HLTEvF/interface/HLTriggerSelector.h"
00022 
00023 #include "FWCore/ServiceRegistry/interface/Service.h"
00024 #include "CommonTools/UtilAlgos/interface/TFileService.h" 
00025 #include "TH1F.h"
00026 #include "TProfile.h"
00027 #include "TH2F.h"
00028 
00029 #include "TPRegexp.h" 
00030 #include "TString.h"
00031 
00032 #include "DQMServices/Core/interface/DQMStore.h"
00033 #include "DQMServices/Core/interface/MonitorElement.h"
00034 
00035 // needed for trigger bits from EventSetup as in ALCARECO paths
00036 #include "CondFormats/HLTObjects/interface/AlCaRecoTriggerBits.h"
00037 #include "CondFormats/DataRecord/interface/AlCaRecoTriggerBitsRcd.h"
00038 
00039 
00040 HLTMonBitSummary::HLTMonBitSummary(const edm::ParameterSet& iConfig) :
00041   inputTag_ (iConfig.getParameter<edm::InputTag> ("TriggerResultsTag")),
00042   HLTPathNamesConfigPreVal_(iConfig.getParameter<std::vector<std::string > >("HLTPaths")),
00043   total_(0),
00044   nValidTriggers_(0),
00045   nValidConfigTriggers_(0),
00046   ndenomAccept_(0)
00047 {
00048   denominatorWild_ = iConfig.getUntrackedParameter<std::string>("denominatorWild","");
00049   denominator_ = iConfig.getUntrackedParameter<std::string>("denominator");
00050   directory_ = iConfig.getUntrackedParameter<std::string>("directory","HLT/Generic/Summary");
00051   histLabel_ = iConfig.getUntrackedParameter<std::string>("histLabel","Generic");
00052   //  out_ = iConfig.getUntrackedParameter<std::string>("out","");
00053   dummyFilters_.clear();
00054   filterTypes_ = iConfig.getUntrackedParameter<std::vector<std::string > >("filterTypes",dummyFilters_);
00055   esPathsKey_ = iConfig.getUntrackedParameter<std::string>("eventSetupPathsKey","");
00056 
00057   configFlag_ = false;
00058   filterFlag_ = false;
00059   hltchange_ = false;
00060 
00061   dbe_ = NULL;
00062   dbe_ = edm::Service < DQMStore > ().operator->();
00063   dbe_->setVerbose(0);
00064 
00065 }
00066 
00067 
00068 HLTMonBitSummary::~HLTMonBitSummary(){}
00069 
00070 //
00071 // member functions
00072 //
00073 
00074 void HLTMonBitSummary::beginRun(const edm::Run  & r, const edm::EventSetup  &iSetup){
00075 
00076   //initialize the hlt configuration from the process name if not blank
00077   std::string processName = inputTag_.process();
00078   if (processName != ""){
00079 
00080     //Grab paths from EventSetup via AlCaRecoTriggerBitsRcd if configured - copied from HLTHighLevel
00081     if (esPathsKey_.size()) {
00082       // Get map of strings to concatenated list of names of HLT paths from EventSetup:
00083       edm::ESHandle<AlCaRecoTriggerBits> triggerBits;
00084       iSetup.get<AlCaRecoTriggerBitsRcd>().get(triggerBits);
00085       typedef std::map<std::string, std::string> TriggerMap;
00086       const TriggerMap &triggerMap = triggerBits->m_alcarecoToTrig;
00087 
00088       TriggerMap::const_iterator listIter = triggerMap.find(esPathsKey_);
00089     
00090       if (listIter == triggerMap.end()) {
00091         throw cms::Exception("Configuration")
00092           //<< " HLTHighLevel [instance: " << *moduleLabel() << " - path: " << *pathName()
00093           //<< "]: "
00094           <<" No triggerList with key " << esPathsKey_ << " in AlCaRecoTriggerBitsRcd";
00095       }
00096       
00097       // We must avoid a std::map<std::stringvector<std::string> > in DB for performance reason,
00098       // so the paths are mapped into one string that we have to decompose:
00099       HLTPathNamesKey_ = triggerBits->decompose(listIter->second);
00100     }
00101     
00102     bool initOK = false;
00103     initOK = hltConfig_.init(r, iSetup, processName, hltchange_);
00104     //Otherwise read paths from configuration
00105     HLTPathNamesConfig_.clear();
00106     if(HLTPathNamesConfigPreVal_.size()){
00107       //run trigger config selection
00108       if (initOK) {
00109         configSelector(HLTPathNamesConfigPreVal_, HLTPathNamesConfig_);
00110       }
00111       else{
00112         edm::LogError("HLTMonBitSummary") << "HLTConfigProvider initialization with process name " 
00113                                           << processName << " failed." << std::endl;
00114           }
00115     }
00116     
00117     //check if the two vectors have any common elements    
00118     std::vector<int> removePaths;
00119     for(size_t i=0; i<HLTPathNamesKey_.size(); ++i){
00120       for(size_t j=0; j<HLTPathNamesConfig_.size(); ++j){
00121         if(HLTPathNamesConfig_[j] == HLTPathNamesKey_[i]) removePaths.push_back(i); 
00122       }
00123     }
00124     reverse(removePaths.begin(),removePaths.end());    
00125     if(removePaths.size()){
00126       for(unsigned int k=0; k<removePaths.size(); ++k)
00127         HLTPathNamesKey_.erase(HLTPathNamesKey_.begin()+removePaths[k]);
00128     }
00129 
00130 
00131     //combine two vectors
00132     HLTPathsByName_.clear();
00133     HLTPathsByName_.reserve(HLTPathNamesConfig_.size() + HLTPathNamesKey_.size());
00134     HLTPathsByName_.insert(HLTPathsByName_.end(),HLTPathNamesConfig_.begin(),HLTPathNamesConfig_.end());
00135     HLTPathsByName_.insert(HLTPathsByName_.end(),HLTPathNamesKey_.begin(),HLTPathNamesKey_.end());
00136 
00137     count_.resize(HLTPathsByName_.size());
00138     HLTPathsByIndex_.resize(HLTPathsByName_.size());
00139 
00140     
00141     if( (nValidTriggers_ != HLTPathsByName_.size() || hltchange_) && total_!=0 ){
00142       edm::LogWarning("HLTMonBitSummary") << "A change in the HLT configuration has been found." 
00143                                           << std::endl
00144                                           << "BitSummary histograms do not support changing configurations."
00145                                           << std::endl
00146                                           << "Processing of events halted.";
00147       configFlag_ = true;
00148     }
00149 
00150     if(!configFlag_){
00151 
00152       nValidTriggers_ = HLTPathsByName_.size();
00153       nValidConfigTriggers_ = HLTPathNamesConfig_.size();
00154 
00155       //get all the filters -
00156       //only if filterTypes_ is nonempty and only on HLTPathNamesConfig_ paths
00157       if(initOK){ 
00158         if(!filterTypes_.empty()){
00159           triggerFilters_.clear();
00160           triggerFilterIndices_.clear();
00161           for( size_t i = 0; i < nValidConfigTriggers_; i++) {
00162             // create a row [triggername,filter1name, filter2name, etc.] 
00163             triggerFilters_.push_back(std::vector <std::string>());  
00164             // create a row [0, filter1index, filter2index, etc.]
00165             triggerFilterIndices_.push_back(std::vector <uint>()); 
00166       
00167             std::vector<std::string> moduleNames = hltConfig_.moduleLabels( HLTPathNamesConfig_[i] ); 
00168       
00169             triggerFilters_[i].push_back(HLTPathNamesConfig_[i]);//first entry is trigger name      
00170             triggerFilterIndices_[i].push_back(0);
00171       
00172             int numModule = 0, numFilters = 0;
00173             std::string moduleName, moduleType;
00174             unsigned int moduleIndex;
00175       
00176             //print module name
00177             std::vector<std::string>::const_iterator iDumpModName;
00178             for (iDumpModName = moduleNames.begin();iDumpModName != moduleNames.end();iDumpModName++) {
00179               moduleName = *iDumpModName;
00180               moduleType = hltConfig_.moduleType(moduleName);
00181               moduleIndex = hltConfig_.moduleIndex(HLTPathNamesConfig_[i], moduleName);
00182               LogDebug ("HLTMonBitSummary") << "Module"      << numModule
00183                                                  << " is called " << moduleName
00184                                                  << " , type = "  << moduleType
00185                                                  << " , index = " << moduleIndex
00186                                                  << std::endl;
00187               numModule++;
00188               for(size_t k = 0; k < filterTypes_.size(); k++) {
00189                 if(moduleType == filterTypes_[k]) {
00190                   numFilters++;
00191                   triggerFilters_[i].push_back(moduleName);
00192                   triggerFilterIndices_[i].push_back(moduleIndex);
00193                 }
00194               }
00195             }//end for modulesName
00196           }//end for nValidConfigTriggers_
00197         }
00198       }
00199       else{
00200         edm::LogError("HLTMonBitSummary") << "HLTConfigProvider initialization has failed."
00201                                           << " Could not get filter names." << std::endl;
00202         filterFlag_ = true;
00203       }
00204 
00205       //check denominator
00206       HLTPathDenomName_.clear();
00207       HLTPathDenomNamePreVal_.clear();
00208       if( denominatorWild_.size() != 0 ) HLTPathDenomNamePreVal_.push_back(denominatorWild_);
00209       if(initOK){
00210         configSelector(HLTPathDenomNamePreVal_, HLTPathDenomName_);
00211       }
00212       //HLTriggerSelector denomSelect(r, iSetup, inputTag_,HLTPathDenomName_);
00213       //HLTPathDenomName_.swap(denomSelect.theSelectTriggers);
00214       //for (unsigned int i = 0; i < HLTPathDenomName_.size(); i++)
00215       //  std::cout << "testing denom: " << HLTPathDenomName_[i] << std::endl;
00216       if(HLTPathDenomName_.size()==1) denominator_ = HLTPathDenomName_[0];
00217     }
00218   }//end if process
00219 
00220        
00221   if(dbe_ && !configFlag_){
00222 
00223     int nbin = nValidConfigTriggers_;
00224     
00225     dbe_->setCurrentFolder(directory_);
00226 
00227     //int nbin_sub = 5;
00228     int nbin_sub = 8;
00229     
00230     // Count histos for efficiency plots
00231     if(!filterTypes_.empty() && !filterFlag_){
00232       dbe_->setCurrentFolder(directory_ + "Trigger_Filters/");
00233       //hCountSummary = dbe_->book1D("hCountSummary", "Count Summary", nbin+1, -0.5, 0.5+(double)nbin);
00234     
00235       hSubFilterCount.clear();
00236       hSubFilterEff.clear();
00237 
00238       for( int trig = 0; trig < nbin; trig++ ) {
00239         // count plots for subfilter
00240         //hSubFilterCount[trig] = dbe_->book1D("Filters_" + triggerFilters_[trig][0], 
00241         hSubFilterCount.push_back(dbe_->book1D("Filters_" + triggerFilters_[trig][0], 
00242                                              "Filters_" + triggerFilters_[trig][0],
00243                                              nbin_sub+1, -0.5, 0.5+(double)nbin_sub));
00244       
00245         for(int filt = 0; filt < (int)triggerFilters_[trig].size()-1; filt++){
00246           hSubFilterCount[trig]->setBinLabel(filt+1, triggerFilters_[trig][filt+1]);
00247         }
00248       }
00249 
00250       dbe_->setCurrentFolder(directory_ + "Trigger_Efficiencies/");
00251       for( int trig = 0; trig < nbin; trig++ ) {
00252         //hSubFilterEff[trig] = dbe_->book1D("Efficiency_" + triggerFilters_[trig][0], 
00253         hSubFilterEff.push_back(dbe_->book1D("Efficiency_" + triggerFilters_[trig][0], 
00254                                            "Efficiency_" + triggerFilters_[trig][0],
00255                                            nbin_sub+1, -0.5, 0.5+(double)nbin_sub));
00256       
00257         for(int filt = 0; filt < (int)triggerFilters_[trig].size()-1; filt++){
00258           hSubFilterEff[trig]->setBinLabel(filt+1,triggerFilters_[trig][filt+1]);
00259         }
00260       }
00261     }
00262       
00263     //--------------B i t   P l o t t i n g   s e c t i o n ---------------//
00264     //---------------------------------------------------------------------//
00265 
00266     std::stringstream rNs;
00267     rNs<<r.run();
00268     std::string rN = rNs.str();
00269     LogDebug("HLTMonBitSummary")<<"this is the beginning of a NEW run: "<< r.run();
00270 
00271     //h1_->Reset();
00272     // h2_->Reset();
00273     //pf_->Reset();
00274     //if (ratio_) ratio_->Reset();
00275 
00276     for (uint i=0; i < nValidTriggers_ && i < 400 ; ++i){
00277       h1_->getTH1F()->GetXaxis()->SetBinLabel(i+1,HLTPathsByName_[i].c_str());
00278       h2_->getTH2F()->GetXaxis()->SetBinLabel(i+1,HLTPathsByName_[i].c_str());
00279       h2_->getTH2F()->GetYaxis()->SetBinLabel(i+1,HLTPathsByName_[i].c_str());
00280       pf_->getTH1F()->GetXaxis()->SetBinLabel(i+1,HLTPathsByName_[i].c_str());
00281       if (ratio_)
00282         ratio_->getTH1F()->GetXaxis()->SetBinLabel(i+1,(HLTPathsByName_[i]+" & "+denominator_).c_str());
00283     }
00284     
00285     //------------------------End Of BitPlotting section -------------------------//
00286   }
00287      
00288 }
00289 
00290 
00291 // ------------ method called to for each event  ------------
00292 void
00293 HLTMonBitSummary::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00294 {
00295   if(configFlag_) return;
00296      
00297   total_++;    
00298   const std::string invalid("@@invalid@@");
00299 
00300   // get hold of TriggerResults Object
00301   edm::Handle<edm::TriggerResults> trh;
00302   iEvent.getByLabel(inputTag_,trh);
00303   
00304   if (trh.failedToGet()) {
00305      edm::LogError("HLTMonBitSummary")<<" could not get: "<<inputTag_;
00306      return;
00307   }
00308 
00309   // get hold of trigger names - based on TriggerResults object!
00310   const edm::TriggerNames & triggerNames = iEvent.triggerNames(*trh);
00311 
00312   unsigned int lastModule = 0;
00313 
00314   //std::cout << " Was at least one path run? " << trh->wasrun() << std::endl;;
00315   //std::cout << " Has at least one path accepted the event? " << trh->accept() << std::endl;
00316   //std::cout << " Has any path encountered an error? " << trh->error() << std::endl;
00317   //std::cout << " Number of paths stored =  " << trh->size() << std::endl;  
00318 
00319   for (unsigned int trig=0; trig < nValidTriggers_; trig++) {
00320     //convert *all* trigger names (from config and key) to trigger index properly  
00321     HLTPathsByIndex_[trig]=triggerNames.triggerIndex(HLTPathsByName_[trig]);
00322   }
00323   
00324   //get filter information for config triggers only
00325   for (unsigned int trig=0; trig < nValidConfigTriggers_; trig++) {
00326     //std::cout << "Trigger Name = " << HLTPathNamesConfig_[trig] << ", HLTPathsByIndex_ = " << HLTPathsByIndex_[trig] << std::endl; 
00327     //std::cout << "Trigger Name = " << HLTPathNamesConfig_[trig] << ", trh->index = " << lastModule << " " << trh->accept(HLTPathsByIndex_[trig]) << std::endl; 
00328     
00329     //check if trigger exists in TriggerResults
00330     if(!filterTypes_.empty() && !filterFlag_ && HLTPathsByIndex_[trig] < trh->size()) {
00331       lastModule = trh->index(HLTPathsByIndex_[trig]);
00332         
00333       //go through the list of filters
00334       for(unsigned int filt = 0; filt < triggerFilters_[trig].size()-1; filt++){
00335         //      cout << "triggerFilters_["<<trig<<"]["<<filt+1<<"] = " << triggerFilters_[trig][filt+1] 
00336         //           << " , triggerFilterIndices = " << triggerFilterIndices_[trig][filt+1]
00337         //           << " , lastModule = " << lastModule << std::endl;
00338         
00339         int binNumber = hSubFilterCount[trig]->getTH1F()->GetXaxis()->FindBin(triggerFilters_[trig][filt+1].c_str());      
00340         
00341         //check if filter passed
00342         if(trh->accept(HLTPathsByIndex_[trig])){
00343           hSubFilterCount[trig]->Fill(binNumber-1);//binNumber1 = 0 = first filter
00344         }
00345         //otherwise the module that issued the decision is the first fail
00346         //so that all the ones before it passed
00347         else if(triggerFilterIndices_[trig][filt+1] < lastModule){
00348           hSubFilterCount[trig]->Fill(binNumber-1);
00349         }
00350         
00351         //hSubFilterCount[trig]->Fill(-1);
00352         
00353         float eff = (float)hSubFilterCount[trig]->getBinContent(binNumber) / (float)total_ ;
00354         float efferr = sqrt(eff*(1-eff)/ (float)total_);
00355         hSubFilterEff[trig]->setBinContent(binNumber,eff);
00356         hSubFilterEff[trig]->setBinError(binNumber,efferr);
00357 
00358       }//filt
00359     } 
00360   }
00361   
00362   //and check validity name (should not be necessary)
00363   std::vector<bool> validity(nValidTriggers_);
00364   for (unsigned int i=0; i!=nValidTriggers_; i++) {
00365     validity[i]=( (HLTPathsByIndex_[i]<trh->size()) && (HLTPathsByName_[i]!=invalid) );
00366   }
00367    
00368   
00369   //---------------------B i t   P l o t t i n g   S e c t i o n --------------------//
00370   //---------------------------------------------------------------------------------//
00371   
00372   //convert also for the denominator and check validity
00373   uint denominatorIndex = 0;
00374   bool denominatorValidity= false;
00375   if (denominator_!="") {
00376     denominatorIndex=triggerNames.triggerIndex(denominator_);
00377     denominatorValidity= (denominatorIndex <trh->size());
00378   }
00379   
00380   std::stringstream report;
00381   std::string sep=" ";
00382   bool atLeastOne=false;
00383   
00384   //check whether the denominator fired
00385   bool denomAccept=false;
00386   if (ratio_ && denominatorValidity) {
00387     denomAccept=trh->accept(denominatorIndex);
00388     if(denomAccept) ndenomAccept_++;
00389   }
00390 
00391   for (unsigned int i=0; i!=nValidTriggers_; i++) {
00392     if (!validity[i]) continue;
00393     bool iAccept=trh->accept(HLTPathsByIndex_[i]);
00394     if (iAccept) {
00395       report<<sep<<HLTPathsByName_[i];
00396       count_[i]++;
00397       sep=", ";
00398       atLeastOne=true;
00399       //trigger has fired. make an entry in both 1D and profile plots
00400       h1_->Fill(i);
00401       //make the entry in the 2D plot : UPPER diagonal terms = AND of the two triggers
00402       for (unsigned int j=i; j!=nValidTriggers_; j++) {
00403         if (!validity[j]) continue;
00404         if (trh->accept(HLTPathsByIndex_[j]))
00405           h2_->Fill(i,j);    
00406       }//loop on second trigger for AND terms
00407     }//trigger[i]=true
00408        
00409     float pf_eff = (float)h1_->getBinContent(i+1) / (float)total_ ;
00410     float pf_efferr = sqrt(pf_eff*(1-pf_eff) / (float)total_);
00411     pf_->setBinContent(i+1,pf_eff);
00412     pf_->setBinError(i+1,pf_efferr);
00413 
00414     //make proper entries in the ratio plot
00415     if (ratio_ && denomAccept){
00416       float ratio_eff = (float)h1_->getBinContent(i+1) / (float)ndenomAccept_ ;
00417       float ratio_efferr = sqrt(ratio_eff*(1-ratio_eff) / (float)ndenomAccept_);
00418       ratio_->setBinContent(i+1,ratio_eff);
00419       ratio_->setBinError(i+1,ratio_efferr);
00420     }
00421 
00422     
00423     //make proper entry inthe 2D plot: LOWER diagonal terms = OR of the two triggers
00424     for (unsigned int j=0; j!=i; j++) {
00425       if (!validity[j]) continue;
00426       bool jAccept=trh->accept(HLTPathsByIndex_[j]);
00427       if (iAccept || jAccept)
00428         h2_->Fill(i,j);
00429      }//loop on second trigger for OR terms
00430     
00431   }//loop on first trigger
00432 
00433   if (atLeastOne){
00434     LogDebug("BitPlotting|BitReport")<<report.str();
00435   }
00436   
00437   //   edm::LogError("BitPlotting")<<"# entries:"<<h1_->getTH1F()->GetEntries();
00438   
00439   //-----------------E n d  o f  B i t P l o t t i n g   S e c t i o n-----------------//
00440        
00441 }
00442 void HLTMonBitSummary::beginJob() {  
00443 
00444   if(dbe_){
00445     if (directory_ != "" && directory_.substr(directory_.length()-1,1) != "/" ) directory_ = directory_+"/" ;
00446   
00447     float min = -0.5;
00448     float max = 400-0.5;
00449     //uint nBin = HLTPathsByName_.size();
00450     uint nBin = 400;
00451    
00452     dbe_->setCurrentFolder(directory_);
00453 
00454     h1_ = dbe_->book1D("PassingBits_Summary_"+histLabel_,"PassingBits_Summary_"+histLabel_, nBin, min, max);
00455     h2_ = dbe_->book2D("PassingBits_Correlation_"+histLabel_,"PassingBits_Correlation_"+histLabel_,nBin,min,max, nBin,min,max);
00456     pf_ = dbe_->book1D("Efficiency_Summary_"+histLabel_,"Efficiency_Summary_"+histLabel_, nBin, min, max);
00457     if (denominator_!="")
00458       //ratio_ = dbe_->book1D(std::string("Ratio_"+denominator_),std::string("Ratio_"+denominator_),nBin,min,max);
00459       ratio_ = dbe_->book1D("HLTRate_"+histLabel_,"HLTRate_"+histLabel_,nBin,min,max);
00460     else 
00461       ratio_=0;
00462 
00463   }
00464 
00465 }
00466 
00467 // ------------ method called once each job just after ending the event loop  ------------
00468 void HLTMonBitSummary::endJob() {  
00469     
00470   std::stringstream report;
00471   report <<" out of: "<<total_<<" events.\n";
00472   if(!count_.empty()){
00473     for (uint i=0; i!=HLTPathsByName_.size();i++){
00474       report<<HLTPathsByName_[i]<<" passed: "<<count_[i]<<" times.\n";
00475       count_[i]=0;
00476     }
00477   }
00478   
00479   edm::LogInfo("HLTMonBitSummary|BitSummary")<<report.str();
00480   LogDebug("HLTMonBitSummary|BitSummary")<<report.str();
00481   total_=0;
00482   //  if( out_.size() != 0 ) edm::Service<DQMStore>()->save(out_);
00483   
00484 }
00485 
00486 
00487 void HLTMonBitSummary::configSelector(std::vector<std::string> selectTriggers, std::vector<std::string > & theSelectTriggers){
00488 
00489   //get the configuration
00490   std::vector<std::string> validTriggerNames = hltConfig_.triggerNames(); 
00491   
00492   bool goodToGo = false;
00493   //remove all path names that are not valid
00494   while(!goodToGo && selectTriggers.size()!=0){
00495     goodToGo=true;
00496     for (std::vector<std::string>::iterator j=selectTriggers.begin();j!=selectTriggers.end();++j){
00497       //bool goodOne = false;
00498       //check if trigger name is valid
00499       //use of wildcard
00500       TPRegexp wildCard(*j);
00501       //std::cout << "wildCard.GetPattern() = " << wildCard.GetPattern() << std::endl;
00502       for (unsigned int i = 0; i != validTriggerNames.size(); ++i){
00503         if (TString(validTriggerNames[i]).Contains(wildCard)){ 
00504           //goodOne = true;
00505           if (find(theSelectTriggers.begin(),
00506                    theSelectTriggers.end(), 
00507                    validTriggerNames[i])==theSelectTriggers.end()){
00508             //std::cout << "wildcard trigger = " << validTriggerNames[i] << std::endl;
00509             theSelectTriggers.push_back( validTriggerNames[i] ); //add it after duplicate check.
00510           }
00511         }
00512       }
00513     }
00514   }//while
00515 }