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
00061
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
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