Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DL3Trigger_factory.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DL3Trigger_factory.cc
4 // Created: Wed Jul 31 14:34:24 EDT 2013
5 // Creator: davidl (on Darwin harriet.jlab.org 11.4.2 i386)
6 //
7 
8 
9 #include <iostream>
10 #include <iomanip>
11 using namespace std;
12 
13 #include "DL3Trigger_factory.h"
14 using namespace jana;
15 
17 #include <TOF/DTOFDigiHit.h>
18 #include <BCAL/DBCALPoint.h>
19 #include <BCAL/DBCALCluster.h>
20 #include <FCAL/DFCALCluster.h>
22 
24 #include <BCAL/DBCALCluster.h>
25 #include <TRIGGER/DL1Trigger.h>
26 
27 //------------------
28 // init
29 //------------------
31 {
32  FRACTION_TO_KEEP = 1.0;
33  DO_WIRE_BASED_TRACKING = false;
34  DO_BCAL_CLUSTER = false;
35  L1_TRIG_MASK = 0xffffffff;
36  L1_FP_TRIG_MASK = 0xffffffff;
37  MVA_WEIGHTS = "";
38  MVA_CUT = -0.2;
39  mvareader = NULL;
40 
41  gPARMS->SetDefaultParameter("L3:FRACTION_TO_KEEP", FRACTION_TO_KEEP ,"Random Fraction of event L3 should keep. (Only used for debugging).");
42  gPARMS->SetDefaultParameter("L3:DO_WIRE_BASED_TRACKING", DO_WIRE_BASED_TRACKING ,"Activate wire-based tracking for every event");
43  gPARMS->SetDefaultParameter("L3:DO_BCAL_CLUSTER", DO_BCAL_CLUSTER ,"Activate BCAL clusters for every event");
44  gPARMS->SetDefaultParameter("L3:L1_TRIG_MASK", L1_TRIG_MASK ,"Discard events that don't have one of these bits set in DL1Trigger::trig_mask (or in L1_FP_TRIG_MASK)");
45  gPARMS->SetDefaultParameter("L3:L1_FP_TRIG_MASK", L1_FP_TRIG_MASK ,"Discard events that don't have one of these bits set in DL1Trigger::fp_trig_mask (or in L1_TRIG_MASK)");
46  gPARMS->SetDefaultParameter("L3:MVA_WEIGHTS", MVA_WEIGHTS ,"TMVA weights file");
47  gPARMS->SetDefaultParameter("L3:MVA_CUT", MVA_CUT ,"Cut on MVA response function. Event with values less than this are discarded.");
48 
49  if(MVA_WEIGHTS != ""){
50 #ifdef HAVE_TMVA
51  mvareader = new TMVA::Reader();
52  mvareader->AddVariable("Nstart_counter", &Nstart_counter);
53  mvareader->AddVariable("Ntof", &Ntof);
54  mvareader->AddVariable("Nbcal_points", &Nbcal_points);
55  mvareader->AddVariable("Nbcal_clusters", &Nbcal_clusters);
56  mvareader->AddVariable("Ebcal_points", &Ebcal_points);
57  mvareader->AddVariable("Ebcal_clusters", &Ebcal_clusters);
58  mvareader->AddVariable("Nfcal_clusters", &Nfcal_clusters);
59  mvareader->AddVariable("Efcal_clusters", &Efcal_clusters);
60  mvareader->AddVariable("Ntrack_candidates", &Ntrack_candidates);
61  mvareader->AddVariable("Ptot_candidates", &Ptot_candidates);
62 
63  mvareader->BookMVA("MVA", MVA_WEIGHTS);
64 #endif
65  }
66 
67  return NOERROR;
68 }
69 
70 //------------------
71 // brun
72 //------------------
73 jerror_t DL3Trigger_factory::brun(jana::JEventLoop *eventLoop, int32_t runnumber)
74 {
75  return NOERROR;
76 }
77 
78 //------------------
79 // evnt
80 //------------------
81 jerror_t DL3Trigger_factory::evnt(JEventLoop *loop, uint64_t eventnumber)
82 {
83  // Simple pass-through L3 trigger
84  // algorithm = 0x1
85 
86 
87 
88  DL3Trigger *l3trig = new DL3Trigger(DL3Trigger::kKEEP_EVENT, 0x0L, 0x1);
89  _data.push_back(l3trig);
90 
91  if(FRACTION_TO_KEEP!=1.0){
92  double r = (double)random()/(double)RAND_MAX;
93  if(r > FRACTION_TO_KEEP) l3trig->L3_decision = DL3Trigger::kDISCARD_EVENT;
94  }
95 
96  // If L1 trigger filter is being applied, do that here
97  if( (L1_TRIG_MASK!=0xffffffff) || (L1_FP_TRIG_MASK!=0xffffffff) ){
98 
99  vector<const DL1Trigger*> l1triggers;
100  loop->Get(l1triggers);
101  bool trig_bit_is_set = false;
102  for(auto t : l1triggers){
103  if( t->trig_mask&L1_TRIG_MASK ) trig_bit_is_set = true;
104  if( t->fp_trig_mask&L1_FP_TRIG_MASK ) trig_bit_is_set = true;
105  }
106  if(!trig_bit_is_set) l3trig->L3_decision = DL3Trigger::kDISCARD_EVENT;
107  }
108 
109 #ifdef HAVE_TMVA
110  if(mvareader){
111  vector<const DSCDigiHit*> scdigihits;
112  vector<const DTOFDigiHit*> tofdigihits;
113  vector<const DBCALPoint*> bcalpoints;
114  vector<const DBCALCluster*> bcalclusters;
115  vector<const DFCALCluster*> fcalclusters;
116  vector<const DTrackCandidate*> trackcandidates;
117  loop->Get(scdigihits);
118  loop->Get(tofdigihits);
119  loop->Get(bcalpoints);
120  loop->Get(bcalclusters);
121  loop->Get(fcalclusters);
122  loop->Get(trackcandidates);
123 
124  // Calorimeter energies
125  double Ebcal_points = 0.0;
126  double Ebcal_clusters = 0.0;
127  double Efcal_clusters = 0.0;
128  for(auto bp : bcalpoints ) Ebcal_points += bp->E();
129  for(auto bc : bcalclusters) Ebcal_clusters += bc->E();
130  for(auto fc : fcalclusters) Efcal_clusters += fc->getEnergy();
131 
132  // Ptot for candidates
133  double Ptot_candidates = 0.0;
134  for(auto tc : trackcandidates) Ptot_candidates += tc->momentum().Mag();
135 
136  Nstart_counter = scdigihits.size();
137  Ntof = tofdigihits.size();
138  Nbcal_points = bcalpoints.size();
139  Nbcal_clusters = bcalclusters.size();
140  Ebcal_points = Ebcal_points;
141  Ebcal_clusters = Ebcal_clusters;
142  Nfcal_clusters = fcalclusters.size();
143  Efcal_clusters = Efcal_clusters;
144  Ntrack_candidates = trackcandidates.size();
145  Ptot_candidates = Ptot_candidates;
146 
147  l3trig->mva_response = mvareader->EvaluateMVA("MVA");
148  if( l3trig->mva_response < MVA_CUT ) l3trig->L3_decision = DL3Trigger::kDISCARD_EVENT;
149  }
150 #endif
151 
152 
153  if(DO_WIRE_BASED_TRACKING){
154  vector<const DTrackWireBased*> wbt;
155  loop->Get(wbt);
156  }
157 
158  if(DO_BCAL_CLUSTER){
159  vector<const DBCALCluster*> bcalclusters;
160  loop->Get(bcalclusters);
161  }
162 
163  return NOERROR;
164 }
165 
166 //------------------
167 // erun
168 //------------------
170 {
171  return NOERROR;
172 }
173 
174 //------------------
175 // fini
176 //------------------
178 {
179  return NOERROR;
180 }
181 
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
jerror_t fini(void)
Called after last event of last event source has been processed.
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
double mva_response
Definition: DL3Trigger.h:80
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
L3_decision_t L3_decision
Definition: DL3Trigger.h:77
jerror_t init(void)
Called once at program start.