Trigger.cpp

Go to the documentation of this file.
00001 
00002 #include "cafe/Trigger.hpp"
00003 
00004 #include <algorithm>
00005 #include "cafe/Config.hpp"
00006 #include "cafe/Event.hpp"
00007 #include "tmb_tree/TMBTrigger.hpp"
00008 #include "tmb_tree/TMBTrigBits.hpp"
00009 
00010 using namespace std;
00011 
00012 namespace cafe {
00013 
00014     Trigger::Trigger(const char *name)
00015         : Processor(name),
00016           _vars("_trgname"),
00017           _numEvents(0),
00018           _numPassed(0),
00019           _stat(0)
00020     {
00021         Config config(name);
00022         vector<string> temp = config.getVString("Triggers", " ,");
00023         _Tracking = config.get("Accounting", false);
00024 
00025         for(int i = 0; i < temp.size(); i++) {
00026             _triggerNames[temp.at(i)] = 0;
00027         }
00028 
00029         _numEvents = 0;
00030         _numPassed = 0;
00031         if(_triggerNames.size() == 0) {
00032             warn() << "Trigger[" << name << "] No triggers specified ? All events will fail" 
00033                    << endl;
00034         }
00035 
00036         out() << "Trigger[" << name << "] Triggers = ";
00037         for(map<string, long>::const_iterator it = _triggerNames.begin(); 
00038             it != _triggerNames.end(); ++it) {
00039             std::string tmpname = it->first;
00040             out() << it->first << ' ';
00041         }
00042         out() << endl;
00043         _useTrigBits=config.get("UseTrigBits",false);
00044         if(_useTrigBits) out()<<"Will use TMBTrigBits instead of TMBTriggers"<<endl;
00045         _required=config.get("Required",true);
00046         if(!_required) out()<<"Will veto on trigger list"<<endl;
00047     }
00048         
00049     bool Trigger::processEvent(Event& event)
00050     {
00051         ++_numEvents;
00052 
00053         _stat = 0;
00054         event.get("StatPointer", _stat);
00055         bool trig_found = !_required;
00056         Collection<TMBTrigger> triggers = event.getTriggers(_vars);
00057         if(triggers.size()>0 && !_useTrigBits){
00058 
00059         //
00060         // This is proportional to the number of triggers in the event
00061         // and about log(numUserTriggers).
00062         //
00063 
00064 
00065           for(Collection<TMBTrigger>::const_iterator it = triggers.begin(); 
00066               it != triggers.end();
00067             ++it) {
00068             if(_triggerNames.find((*it).getTrgName()) != _triggerNames.end()) {
00069                 trig_found = _required;
00070 
00071                 if(_Tracking) {
00072 
00073                     // Find the trigger in the list and increment the counter
00074                         
00075                     std::string tmpname = (*it).getTrgName();
00076                     ++_triggerNames[tmpname];
00077                 }
00078             }
00079           }
00080 
00081         }else{
00082           const TMBTrigBits* trigbits = event.getTrigBits();
00083           if(!trigbits) return false;
00084           for(map<string,long>::const_iterator it = _triggerNames.begin();
00085               it != _triggerNames.end(); ++it){
00086             std::string tmpname = it->first;
00087             if(trigbits->triggerFired(tmpname)){
00088               trig_found=_required;
00089               if(_Tracking)  ++_triggerNames[tmpname];
00090             }
00091           }
00092         }
00093 
00094         if(trig_found) {
00095             ++_numPassed;
00096             if(_stat != 0) {
00097                 _stat->EventSelected(name()); 
00098             }
00099             return true;
00100         }
00101 
00102         return false;
00103     }
00104 
00105 
00106     void Trigger::finish() {
00107 
00108         if(_numEvents > 0) {
00109             out() << "============================================\n";
00110             out() << "  Trigger[" << name() << "] SUMMARY\n\n";
00111             out() << "  " << _numEvents << " events processed.\n";
00112             out() << "  " << _numPassed << " events passed, pass rate = "
00113                   << double(_numPassed) / double(_numEvents) * 100.
00114                   << "%\n\n";
00115             if(_Tracking) {
00116                 out() << "    Individual Trigger Efficencies\n\n";
00117              
00118                 for(map<string, long>::const_iterator it = _triggerNames.begin(); 
00119                     it != _triggerNames.end(); ++it) {
00120                     std::string tmpname = it->first;
00121                     out() << "    " << tmpname << ": " 
00122                           << (double(it->second) / _numEvents) * 100.0 
00123                           << "% (" << it->second << " events)\n";
00124                 }
00125                 out() << '\n';
00126             }
00127 
00128             out() << "============================================" << endl;
00129         }
00130     }
00131 }
00132 ClassImp(cafe::Trigger)
00133 

Generated on Thu Apr 3 04:14:24 2008 for CAF by doxygen 1.3.4