BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
DimuPreSelect Class Reference

#include <DimuPreSelect.h>

Inheritance diagram for DimuPreSelect:

Public Member Functions

 DimuPreSelect (const std::string &name, ISvcLocator *pSvcLocator)
StatusCode initialize ()
StatusCode execute ()
StatusCode finalize ()

Detailed Description

Definition at line 7 of file DimuPreSelect.h.

Constructor & Destructor Documentation

◆ DimuPreSelect()

DimuPreSelect::DimuPreSelect ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 49 of file DimuPreSelect.cxx.

50 : Algorithm( name, pSvcLocator ) {
51 declareProperty( "CmsEnergy", m_ecms = 3.686 );
52 declareProperty( "Vr0Cut", m_vr0cut = 1.0 );
53 declareProperty( "Vz0Cut", m_vz0cut = 5.0 );
54 declareProperty( "PUpCut", m_pcut_up = 2.0 );
55 declareProperty( "PDownCut", m_pcut_down = 0.5 );
56 declareProperty( "PSymCut", m_psymcut = 0.5 );
57 declareProperty( "TCut", m_tcut = 4 );
58 declareProperty( "EUpCut", m_ecut_up = 1.0 );
59 declareProperty( "EDownCut", m_ecut_down = 0.1 );
60 declareProperty( "DThetaCut", m_dthetacut = 0.05 );
61 declareProperty( "DPhiCut", m_dphicut = 0.4 );
62 declareProperty( "PartSelect", m_partselect = 0 );
63 declareProperty( "MuDigiCut", m_mudigicut = 6 );
64 declareProperty( "MuTrkCut", m_mutrkcut = 1 );
65 declareProperty( "MuDepthCut", m_depthcut = 30 );
66 declareProperty( "UseMDC", m_useFlag[0] = 1 );
67 declareProperty( "UseTOF", m_useFlag[1] = 1 );
68 declareProperty( "UseEMC", m_useFlag[2] = 1 );
69 declareProperty( "UseMUC", m_useFlag[3] = 1 );
70 declareProperty( "Output", m_output = false );
71
72 declareProperty( "SelectDimu", m_selectFlag = true );
73 // Declare the properties
74}

Referenced by DimuPreSelect().

Member Function Documentation

◆ execute()

StatusCode DimuPreSelect::execute ( )

Definition at line 150 of file DimuPreSelect.cxx.

150 {
151 if ( m_selectFlag == false ) return ( StatusCode::SUCCESS );
152
153 MsgStream log( msgSvc(), name() );
154 log << MSG::INFO << "in execute()" << endmsg;
155
156 m_totevent++;
157 if ( m_totevent % 1000 == 0 ) std::cout << m_totevent << "\tdone!" << std::endl;
158
159 setFilterPassed( false );
160 m_mdcPass = m_tofPass = m_emcPass = m_mucPass = false;
161 for ( int i = 0; i < 4; i++ ) m_passFlag[i] = false;
162
163 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
164 m_currun = eventHeader->runNumber();
165 m_curevent = eventHeader->eventNumber();
166 if ( m_output )
167 {
168 m_run = m_currun;
169 m_event = m_curevent;
170 }
171
172 // Select by MDC Info
173 SmartDataPtr<RecMdcTrackCol> mdcTrackCol( eventSvc(), "/Event/Recon/RecMdcTrackCol" );
174 if ( !mdcTrackCol )
175 {
176 log << MSG::FATAL << "Could not find RecMdcTrackCol!" << endmsg;
177 return ( StatusCode::FAILURE );
178 }
179 log << MSG::INFO << "MDC tracks:\t" << mdcTrackCol->size() << endmsg;
180
181 if ( mdcTrackCol->size() != 2 ) return ( StatusCode::SUCCESS );
182
183 m_cutpass[0] += 1;
184
185 double c1, c2, r1, r2, z1, z2, p1, p2;
186 c1 = c2 = r1 = r2 = z1 = z2 = p1 = p2 = 0.;
187
188 c1 = ( *mdcTrackCol )[0]->charge();
189 c2 = ( *mdcTrackCol )[1]->charge();
190 r1 = ( *mdcTrackCol )[0]->r();
191 r2 = ( *mdcTrackCol )[1]->r();
192 z1 = ( *mdcTrackCol )[0]->z();
193 z2 = ( *mdcTrackCol )[1]->z();
194 p1 = ( *mdcTrackCol )[0]->p();
195 p2 = ( *mdcTrackCol )[1]->p();
196
197 if ( m_output )
198 {
199 m_c1 = c1;
200 m_c2 = c2;
201 m_r1 = r1;
202 m_r2 = r2;
203 m_z1 = z1;
204 m_z2 = z2;
205 m_p1 = p1;
206 m_p2 = p2;
207 }
208
209 bool mdcflag1 = c1 + c2 == 0;
210 bool mdcflag2 = fabs( r1 ) <= m_vr0cut && fabs( z1 ) < m_vz0cut;
211 bool mdcflag3 = fabs( r2 ) <= m_vr0cut && fabs( z2 ) < m_vz0cut;
212 bool mdcflag4 = p1 < m_pcut_up && p2 < m_pcut_up;
213 // bool mdcflag4 = p1<2 && p1>1;
214 // bool mdcflag5 = p2<2 && p2>1;
215 bool mdcflag5 = fabs( p1 - p2 ) / ( p1 + p2 ) < m_psymcut;
216
217 log << MSG::INFO << "r1:\t" << r1 << "\tz1:" << z1 << endmsg;
218 log << MSG::INFO << "r2:\t" << r2 << "\tz2:" << z2 << endmsg;
219 log << MSG::INFO << "p1:\t" << p1 << "\tp2:" << p2 << endmsg;
220
221 if ( mdcflag1 )
222 {
223 m_cutpass[1] += 1;
224 if ( m_output ) m_zeroCFlag = 1;
225 }
226 if ( mdcflag2 && mdcflag3 )
227 {
228 m_cutpass[2] += 1;
229 if ( m_output ) m_vtRZFlag = 1;
230 }
231 if ( mdcflag4 )
232 {
233 m_cutpass[3] += 1;
234 if ( m_output ) m_pLimFlag = 1;
235 }
236 if ( mdcflag5 )
237 {
238 m_cutpass[4] += 1;
239 if ( m_output ) m_pSymFlag = 1;
240 }
241 if ( mdcflag1 && mdcflag2 && mdcflag3 && mdcflag4 && mdcflag5 )
242 {
243 m_mdcPass = true;
244 m_subpass[0] += 1;
245 }
246 if ( !m_useFlag[0] ) m_passFlag[0] = true;
247 else m_passFlag[0] = m_mdcPass;
248 log << MSG::INFO << "MDC selection done!" << endmsg;
249
250 // Select by TOF Info
251 SmartDataPtr<RecTofTrackCol> tofTrackCol( eventSvc(), "/Event/Recon/RecTofTrackCol" );
252 if ( !tofTrackCol )
253 {
254 log << MSG::FATAL << "Could not find RecTofTrackCol!" << endmsg;
255 return ( StatusCode::FAILURE );
256 }
257 log << MSG::INFO << "TOF tracks:\t" << tofTrackCol->size() << endmsg;
258
259 double t1, t2;
260 t1 = 0., t2 = 1000;
261 // if(tofTrackCol->size() < 8 && tofTrackCol->size() > 20)
262 if ( tofTrackCol->size() > 7 && tofTrackCol->size() < 21 )
263 {
264 int goodtof = 0;
265 for ( int itof = 0; itof < tofTrackCol->size(); itof++ )
266 {
267 TofHitStatus* status = new TofHitStatus;
268 status->setStatus( ( *tofTrackCol )[itof]->status() );
269
270 if ( !( status->is_cluster() ) )
271 {
272 delete status;
273 continue;
274 }
275 if ( goodtof == 0 ) t1 = ( *tofTrackCol )[itof]->tof();
276 if ( goodtof == 1 ) t2 = ( *tofTrackCol )[itof]->tof();
277
278 goodtof++;
279 delete status;
280 }
281 }
282
283 if ( m_output )
284 {
285 m_t1 = t1;
286 m_t2 = t2;
287 }
288
289 bool tofflag1 = fabs( t1 - t2 ) < m_tcut; // ns
290 log << MSG::INFO << "t1:\t" << t1 << "\tt2:" << t2 << "dt:\t" << fabs( t1 - t2 ) << endmsg;
291 if ( tofflag1 )
292 {
293 m_cutpass[5] += 1;
294 if ( m_output ) m_tLimFlag = 1;
295 m_tofPass = true;
296 m_subpass[1] += 1;
297 }
298 if ( !m_useFlag[1] ) m_passFlag[1] = true;
299 else m_passFlag[1] = m_tofPass;
300 log << MSG::INFO << "TOF selection done!" << endmsg;
301
302 // Select by EMC Info
303 SmartDataPtr<RecEmcShowerCol> emcShowerCol( eventSvc(), "/Event/Recon/RecEmcShowerCol" );
304 if ( !emcShowerCol )
305 {
306 log << MSG::FATAL << "Could not find RecEmcShowerCol!" << endmsg;
307 return ( StatusCode::FAILURE );
308 }
309 log << MSG::INFO << "EMC showers:\t" << emcShowerCol->size() << endmsg;
310
311 if ( emcShowerCol->size() < 2 ) return ( StatusCode::SUCCESS );
312
313 double e1, e2, theta1, theta2, phi1, phi2;
314 int part;
315
316 e1 = ( *emcShowerCol )[0]->energy();
317 e2 = ( *emcShowerCol )[1]->energy();
318 theta1 = ( *emcShowerCol )[0]->theta();
319 theta2 = ( *emcShowerCol )[1]->theta();
320 phi1 = ( *emcShowerCol )[0]->phi();
321 phi2 = ( *emcShowerCol )[1]->phi();
322 part = ( *emcShowerCol )[0]->module();
323
324 if ( m_output )
325 {
326 m_e1 = e1;
327 m_e2 = e2;
328 m_theta1 = theta1;
329 m_theta2 = theta2;
330 m_phi1 = phi1;
331 m_phi2 = phi2;
332 m_part = part;
333 }
334
335 bool emcFlag1 = e1 < m_ecut_up && e1 > m_ecut_down;
336 bool emcFlag2 = e2 < m_ecut_up && e2 > m_ecut_down;
337 bool emcFlag3 = fabs( theta1 + theta2 - PI ) < m_dthetacut;
338 bool emcFlag4 = fabs( phi1 - phi2 ) - PI < m_dphicut;
339 bool emcFlag5 = !m_partselect || ( m_partselect == 1 && part == 1 ) ||
340 ( m_partselect == 2 && part != 1 );
341
342 log << MSG::INFO << "e1:\t" << e1 << "\te2:\t" << e2 << endmsg;
343 log << MSG::INFO << "theta1:\t" << theta1 << "\ttheta2:\t" << theta2 << endmsg;
344 log << MSG::INFO << "phi1:\t" << phi1 << "\tphi2:\t" << phi2 << endmsg;
345 log << MSG::INFO << "part:\t" << part << "\tpartFlag:\t" << emcFlag5 << endmsg;
346
347 if ( emcFlag1 && emcFlag2 )
348 {
349 m_cutpass[6] += 1;
350 if ( m_output ) m_eLimFlag = 1;
351 }
352 if ( emcFlag3 && emcFlag4 )
353 {
354 m_cutpass[7] += 1;
355 if ( m_output ) m_eBBFlag = 1;
356 }
357 if ( emcFlag5 )
358 {
359 m_cutpass[8] += 1;
360 if ( m_output ) m_partFlag = 1;
361 }
362 if ( emcFlag1 && emcFlag2 && emcFlag3 && emcFlag4 && emcFlag5 )
363 {
364 m_emcPass = true;
365 m_subpass[2] += 1;
366 }
367 if ( !m_useFlag[2] ) m_passFlag[2] = true;
368 else m_passFlag[2] = m_emcPass;
369 log << MSG::INFO << "EMC selection done!" << endmsg;
370
371 // Select by MUC Info
372 SmartDataPtr<MucDigiCol> mucDigiCol( eventSvc(), "/Event/Digi/MucDigiCol" );
373 if ( !mucDigiCol )
374 {
375 log << MSG::FATAL << "Could not find MucDigiCol!" << endmsg;
376 return ( StatusCode::FAILURE );
377 }
378 SmartDataPtr<RecMucTrackCol> mucTrackCol( eventSvc(), "/Event/Recon/RecMucTrackCol" );
379 if ( !mucTrackCol )
380 {
381 log << MSG::FATAL << "Could not find RecMucTrackCol" << endmsg;
382 return ( StatusCode::FAILURE );
383 }
384
385 int mudigiNum, mutrkNum;
386 double depth = 0;
387 mudigiNum = mutrkNum = 0;
388 mudigiNum = mucDigiCol->size();
389 mutrkNum = mucTrackCol->size();
390 RecMucTrackCol::iterator mutrkIter = mucTrackCol->begin();
391 for ( ; mutrkIter != mucTrackCol->end(); mutrkIter++ )
392 {
393 if ( 0 == ( *mutrkIter )->trackId() || 1 == ( *mutrkIter )->trackId() )
394 depth += ( *mutrkIter )->depth();
395 }
396
397 if ( m_output )
398 {
399 m_mudigi = mudigiNum;
400 m_mutrk = mutrkNum;
401 m_depth = depth;
402 }
403
404 bool mucflag1 = mudigiNum >= m_mudigicut;
405 bool mucflag2 = mutrkNum >= m_mutrkcut;
406 bool mucflag3 = depth > m_depthcut;
407
408 log << MSG::INFO << "MUC digi:\t" << mudigiNum << "\tMUC track:\t" << mutrkNum << endmsg;
409
410 if ( mucflag1 )
411 {
412 m_cutpass[9] += 1;
413 if ( m_output ) m_mudigiFlag = 1;
414 }
415 if ( mucflag2 )
416 {
417 m_cutpass[10] += 1;
418 if ( m_output ) m_mutrkFlag = 1;
419 }
420 if ( mucflag3 )
421 {
422 m_cutpass[11] += 1;
423 if ( m_output ) m_depthFlag = 1;
424 }
425 if ( mucflag1 && mucflag2 && mucflag3 )
426 {
427 m_mucPass = true;
428 m_subpass[3] += 1;
429 }
430 if ( !m_useFlag[3] ) m_passFlag[3] = true;
431 else m_passFlag[3] = m_mucPass;
432 log << MSG::INFO << "MUC selection done!" << endmsg;
433
434 // All selections
435 if ( m_passFlag[0] && m_passFlag[1] && m_passFlag[2] && m_passFlag[3] )
436 {
437 m_totalpass += 1;
438 setFilterPassed( true );
439 }
440 log << MSG::INFO << "Set filter passed!" << endmsg;
441
442 if ( m_output )
443 {
444 m_mdcFlag = m_mdcPass;
445 m_tofFlag = m_tofPass;
446 m_emcFlag = m_emcPass;
447 m_mucFlag = m_mucPass;
448 }
449
450 if ( m_output ) m_passtuple->write();
451
452 return StatusCode::SUCCESS;
453}
double p2[4]
double p1[4]
Double_t phi2
Double_t phi1
Double_t e1
Double_t e2
#define PI
IMessageSvc * msgSvc()
void setStatus(unsigned int status)

◆ finalize()

StatusCode DimuPreSelect::finalize ( )

Definition at line 455 of file DimuPreSelect.cxx.

455 {
456 if ( m_selectFlag == false ) return StatusCode::SUCCESS;
457
458 MsgStream log( msgSvc(), name() );
459 log << MSG::INFO << "in finalize()" << endmsg;
460 const string str[3] = { "all", "barrel", "endcap" };
461
462 cout << "pass 0 - 2 MDC tracks : " << m_cutpass[0] << endl;
463 cout << "pass 1 - 0 charge : " << m_cutpass[1] << endl;
464 cout << "pass 2 - |r|<" << m_vr0cut << " && |z|<" << m_vz0cut << " : "
465 << m_cutpass[2] << endl;
466 cout << "pass 3 - p < " << m_pcut_up << " GeV/c : " << m_cutpass[3] << endl;
467 cout << "pass 4 - p_sym < " << m_psymcut << " : " << m_cutpass[4] << endl;
468 cout << "pass 5 - |t1-t1| < " << m_tcut << " ns : " << m_cutpass[5] << endl;
469 cout << "pass 6 - " << m_ecut_down << " < e < " << m_ecut_up << " : "
470 << m_cutpass[6] << endl;
471 cout << "pass 7 - |dth|<" << m_dthetacut << " && |dphi|<" << m_dphicut << ": "
472 << m_cutpass[7] << endl;
473 cout << "pass 8 - " << str[(int)m_partselect] << " part is selected : " << m_cutpass[8]
474 << endl;
475 cout << "pass 9 - mudigi >= " << m_mudigicut << " : " << m_cutpass[9] << endl;
476 cout << "pass 10- mutrk >= " << m_mutrkcut << " : " << m_cutpass[10] << endl;
477 cout << "pass 11- mudepth>= " << m_depthcut << " : " << m_cutpass[11] << endl;
478
479 cout << "pass MDC : " << m_subpass[0] << "\tUsed: " << ( m_useFlag[0] ? "Yes" : "No" )
480 << endl;
481 cout << "pass TOF : " << m_subpass[1] << "\tUsed: " << ( m_useFlag[1] ? "Yes" : "No" )
482 << endl;
483 cout << "pass EMC : " << m_subpass[2] << "\tUsed: " << ( m_useFlag[2] ? "Yes" : "No" )
484 << endl;
485 cout << "pass MUC : " << m_subpass[3] << "\tUsed: " << ( m_useFlag[3] ? "Yes" : "No" )
486 << endl;
487
488 cout << "Total event: " << m_totevent << endl;
489 cout << "Dimu event: " << m_totalpass << endl;
490
491 return StatusCode::SUCCESS;
492}

◆ initialize()

StatusCode DimuPreSelect::initialize ( )

Definition at line 77 of file DimuPreSelect.cxx.

77 {
78 MsgStream log( msgSvc(), name() );
79 log << MSG::INFO << "in initialize()" << endmsg;
80
81 m_totevent = m_currun = m_curevent = 0;
82 for ( int i = 0; i < 20; i++ ) m_cutpass[i] = 0;
83 m_subpass[0] = m_subpass[1] = m_subpass[2] = m_subpass[3] = 0;
84 m_totalpass = 0;
85
86 if ( m_output )
87 {
88 StatusCode status;
89 NTuplePtr nt( ntupleSvc(), "FILE1/dimu" );
90 if ( nt ) m_passtuple = nt;
91 else
92 {
93 m_passtuple = ntupleSvc()->book( "FILE1/dimu", CLID_ColumnWiseTuple,
94 "DimuPreSelect N-Tuple example" );
95 if ( m_passtuple )
96 {
97 status = m_passtuple->addItem( "run", m_run );
98 status = m_passtuple->addItem( "event", m_event );
99 status = m_passtuple->addItem( "part", m_part );
100 status = m_passtuple->addItem( "c1", m_c1 );
101 status = m_passtuple->addItem( "c2", m_c2 );
102 status = m_passtuple->addItem( "r1", m_r1 );
103 status = m_passtuple->addItem( "r2", m_r2 );
104 status = m_passtuple->addItem( "z1", m_z1 );
105 status = m_passtuple->addItem( "z2", m_z2 );
106 status = m_passtuple->addItem( "p1", m_p1 );
107 status = m_passtuple->addItem( "p2", m_p2 );
108 status = m_passtuple->addItem( "t1", m_t1 );
109 status = m_passtuple->addItem( "t2", m_t2 );
110 status = m_passtuple->addItem( "e1", m_e1 );
111 status = m_passtuple->addItem( "e2", m_e2 );
112 status = m_passtuple->addItem( "theta1", m_theta1 );
113 status = m_passtuple->addItem( "theta2", m_theta2 );
114 status = m_passtuple->addItem( "phi1", m_phi1 );
115 status = m_passtuple->addItem( "phi2", m_phi2 );
116 status = m_passtuple->addItem( "mudigi", m_mudigi );
117 status = m_passtuple->addItem( "mutrk", m_mutrk );
118 status = m_passtuple->addItem( "depth", m_depth );
119
120 status = m_passtuple->addItem( "zeroC", m_zeroCFlag );
121 status = m_passtuple->addItem( "vtRZ", m_vtRZFlag );
122 status = m_passtuple->addItem( "pLim", m_pLimFlag );
123 status = m_passtuple->addItem( "pSym", m_pSymFlag );
124 status = m_passtuple->addItem( "tLim", m_tLimFlag );
125 status = m_passtuple->addItem( "eLim", m_eLimFlag );
126 status = m_passtuple->addItem( "eBB", m_eBBFlag );
127 status = m_passtuple->addItem( "partSlt", m_partFlag );
128 status = m_passtuple->addItem( "muDigiN", m_mudigiFlag );
129 status = m_passtuple->addItem( "muTrkN", m_mutrkFlag );
130
131 status = m_passtuple->addItem( "mdc", m_mdcFlag );
132 status = m_passtuple->addItem( "tof", m_tofFlag );
133 status = m_passtuple->addItem( "emc", m_emcFlag );
134 status = m_passtuple->addItem( "muc", m_mucFlag );
135 }
136 else
137 {
138 log << MSG::ERROR << "Cannot book N-tuple:" << long( m_passtuple ) << endmsg;
139 return StatusCode::FAILURE;
140 }
141 }
142 }
143
144 log << MSG::INFO << "Initialize done!" << endmsg;
145
146 return StatusCode::SUCCESS;
147}
INTupleSvc * ntupleSvc()

The documentation for this class was generated from the following files: