ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/System8/s8/Selector/src/S8Selector.cpp
Revision: 1.2
Committed: Tue May 24 14:38:25 2011 UTC (13 years, 11 months ago) by samvel
Branch: MAIN
CVS Tags: V00-00-04, V00-00-03, V00-00-02-04, V00-00-02-03, V00-00-02-02, V00-00-02-01, V00-00-02, HEAD
Changes since 1.1: +6 -6 lines
Error occurred while calculating annotation data.
Log Message:
Change selector build system to scram

File Contents

# Content
1 /**
2 * S8Selector
3 * s8
4 *
5 * Created by Samvel Khalatian on Feb 3, 2011
6 * Copyright 2010, All rights reserved
7 */
8
9 #include <algorithm>
10 #include <iomanip>
11 #include <ostream>
12
13 #include <TLorentzVector.h>
14
15 #include "s8/IO/interface/Event.h"
16 #include "Tree/System8/interface/S8GenEvent.h"
17 #include "Tree/System8/interface/S8Jet.h"
18 #include "Tree/System8/interface/S8TriggerCenter.h"
19 #include "Tree/System8/interface/S8Tools.h"
20 #include "s8/Selector/interface/S8Selector.h"
21
22 using std::endl;
23 using std::find_if;
24 using std::left;
25 using std::setw;
26
27 using s8::S8Selector;
28
29 S8Selector::S8Selector() throw():
30 _gluon_splitting(KEEP),
31 _is_first_event(true),
32 _simulate_trigger(false)
33 {
34 using s8::tools::make_hash;
35
36 _hlt_jet20u.setHash(make_hash("hlt_btagmu_jet20u"));
37 _hlt_dijet20u.setHash(make_hash("hlt_btagmu_dijet20u"));
38 _hlt_dijet30u.setHash(make_hash("hlt_btagmu_dijet30u"));
39 }
40
41 S8Selector::~S8Selector() throw()
42 {
43 }
44
45 void S8Selector::optionGluonSplittingIsSet(const GluonSplitting &value)
46 {
47 _gluon_splitting = value;
48 }
49
50 void S8Selector::optionPtHatIsSet(const Range &value)
51 {
52 _pt_hat = value;
53 }
54
55 void S8Selector::optionTriggerIsSet(const Trigger &trigger)
56 {
57 _triggers.push_back(TriggerCounter(trigger));
58 }
59
60 void S8Selector::optionSimulateTriggerIsSet(const bool &value)
61 {
62 _simulate_trigger = value;
63 }
64
65 void S8Selector::optionPrimaryVerticesIsSet(const Range &primary_vertices)
66 {
67 _primary_vertices = primary_vertices;
68 }
69
70 void S8Selector::treeDidLoad(const TriggerCenter *trigger_center)
71 {
72 const TriggerCenter::TriggerMap &triggers = trigger_center->triggers();
73
74 // Search for trigger in the Trigger Menu
75 //
76 for(Triggers::iterator trigger = _triggers.begin();
77 _triggers.end() != trigger;
78 ++trigger)
79 {
80 trigger->disable = true;
81 trigger->simulate = false;
82
83 TriggerCenter::TriggerMap::const_iterator found_trigger =
84 triggers.find(trigger->trigger.hash());
85
86 // check if trigger is found
87 //
88 if (triggers.end() == found_trigger)
89 {
90 // Trigger is not found
91 //
92 if (_simulate_trigger &&
93
94 (trigger->trigger.hash() != _hlt_dijet20u.hash() ||
95 trigger->trigger.hash() != _hlt_dijet30u.hash()))
96
97 trigger->simulate = true;
98 else
99 continue;
100 }
101 else
102 trigger->name = found_trigger->second;
103
104 trigger->disable = false;
105 }
106 }
107
108 const s8::Event *S8Selector::operator()(const Event *event)
109 {
110 if (!event)
111 return 0;
112
113 ++_events.total;
114
115 if (!isValueInRange(event->primaryVertices()->size(), _primary_vertices))
116 return 0;
117
118 ++_events.primary_vertices;
119
120 if (!isValueInRange(event->gen()->ptHat(), _pt_hat))
121 return 0;
122
123 ++_events.pt_hat;
124
125 // Triggers
126 //
127 if (!_triggers.empty() &&
128 !processTriggers(event))
129
130 return 0;
131
132 ++_events.trigger;
133
134 // Gluon Splitting
135 // [see PythiaOptionsDelegate for description]
136 //
137 switch(_gluon_splitting)
138 {
139 case KEEP:
140 break;
141
142 case BB:
143 {
144 if (event->gen()->isGluonSplitting(s8::GenEvent::BB))
145 break;
146
147 return 0;
148 }
149
150 case CC:
151 {
152 if (event->gen()->isGluonSplitting(s8::GenEvent::CC))
153 break;
154
155 return 0;
156 }
157
158 case ONLY:
159 {
160 if (event->gen()->isGluonSplitting(s8::GenEvent::BB) ||
161 event->gen()->isGluonSplitting(s8::GenEvent::CC))
162
163 break;
164
165 return 0;
166 }
167
168 case NO_BB:
169 {
170 if (event->gen()->isGluonSplitting(s8::GenEvent::BB))
171 return 0;
172
173 break;
174 }
175
176 case NO_CC:
177 {
178 if (event->gen()->isGluonSplitting(s8::GenEvent::CC))
179 return 0;
180
181 break;
182 }
183
184 case REMOVE:
185 {
186 if (event->gen()->isGluonSplitting(s8::GenEvent::BB) ||
187 event->gen()->isGluonSplitting(s8::GenEvent::CC))
188
189 return 0;
190
191 break;
192 }
193
194 case ADD_BB:
195 {
196 if (event->gen()->isGluonSplitting(s8::GenEvent::BB))
197 break;
198
199 _is_first_event = !_is_first_event;
200
201 if (_is_first_event)
202 return 0;
203
204 break;
205 }
206
207 case ADD_CC:
208 {
209 if (event->gen()->isGluonSplitting(s8::GenEvent::CC))
210 break;
211
212 _is_first_event = !_is_first_event;
213
214 if (_is_first_event)
215 return 0;
216
217 break;
218 }
219
220 case ENHANCE:
221 {
222 if (event->gen()->isGluonSplitting(s8::GenEvent::BB) ||
223 event->gen()->isGluonSplitting(s8::GenEvent::CC))
224
225 break;
226
227 _is_first_event = !_is_first_event;
228
229 if (_is_first_event)
230 return 0;
231
232 break;
233 }
234 }
235
236 ++_events.gluon_splitting;
237
238 return event;
239 }
240
241 void S8Selector::print(std::ostream &out) const
242 {
243 out << "S8Selector cutflow (events passed)" << endl;
244 out << " " << setw(20) << left << "Total" << _events.total << endl;
245 out << " " << setw(20) << left << "Primary Vertices"
246 << _events.primary_vertices << endl;
247 out << " " << setw(20) << left << "Pt Hat" << _events.pt_hat << endl;
248 out << " " << setw(20) << left << "Triggers" << _events.trigger << endl;
249 out << " " << setw(20) << left << "Gluon Splitting"
250 << _events.gluon_splitting <<endl;
251 out << endl;
252 out << "Triggers Cutflow" << endl;
253 out << " Name" << setw(25) << left << " "
254 << " Hash" << endl;
255 out << "---------------------------------------------------"
256 << endl;
257 for(Triggers::const_iterator trigger = _triggers.begin();
258 _triggers.end() != trigger;
259 ++trigger)
260 {
261 out << " [+] " << setw(30) << left;
262 if (trigger->name.empty())
263 out << trigger->trigger.hash();
264 else
265 out << trigger->name;
266
267 out << trigger->counter << endl;
268 }
269 out << "---------------------------------------------------"
270 << endl;
271 }
272
273
274
275 bool S8Selector::processTriggers(const Event *event)
276 {
277 bool triggers_pass = false;
278
279 // Search for user defined triggers among those that passed the event
280 //
281 for(Triggers::iterator trigger = _triggers.begin();
282 _triggers.end() != trigger;
283 ++trigger)
284 {
285 if (trigger->disable)
286 continue;
287
288 if (trigger->simulate)
289 {
290 if (!simulateTrigger(trigger->trigger, event))
291 continue;
292 }
293 else
294 {
295 if (!didTriggerPass(trigger->trigger, event))
296 continue;
297 }
298
299 ++(trigger->counter);
300
301 triggers_pass = true;
302 }
303
304 return triggers_pass;
305 }
306
307 bool S8Selector::didTriggerPass(const Trigger &trigger,
308 const Event *event)
309 {
310 _trigger_predicator.setSearchTrigger(trigger);
311
312 s8::Triggers::const_iterator found_trigger =
313 find_if(event->triggers()->begin(),
314 event->triggers()->end(),
315 _trigger_predicator);
316
317 // Check if trigger was found and passed the event
318 //
319 return event->triggers()->end() != found_trigger &&
320 (**found_trigger);
321 }
322
323 bool S8Selector::simulateTrigger(const Trigger &trigger, const Event *event)
324 {
325 if (!didTriggerPass(_hlt_jet20u, event))
326 return false;
327
328 double max_pt = 0;
329 if (_hlt_dijet20u.hash() == trigger.hash())
330 max_pt = 60;
331 else if (_hlt_dijet30u.hash() == trigger.hash())
332 max_pt = 80;
333 else
334 return false;
335
336 // Apply offline jet pT cut
337 //
338 int trigger_jets = 0;
339 for(Jets::const_iterator jet = event->jets()->begin();
340 event->jets()->end() != jet &&
341 2 > trigger_jets;
342 ++jet)
343 {
344 if (max_pt < (*jet)->p4()->Pt() &&
345 3.0 > fabs((*jet)->p4()->Eta()))
346
347 ++trigger_jets;
348 }
349
350 return 1 < trigger_jets;
351 }