78 MsgStream log(
msgSvc(), name() );
79 log << MSG::INFO <<
"in initialize()" << endmsg;
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;
89 NTuplePtr nt(
ntupleSvc(),
"FILE1/dimu" );
90 if ( nt ) m_passtuple = nt;
93 m_passtuple =
ntupleSvc()->book(
"FILE1/dimu", CLID_ColumnWiseTuple,
94 "DimuPreSelect N-Tuple example" );
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 );
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 );
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 );
138 log << MSG::ERROR <<
"Cannot book N-tuple:" << long( m_passtuple ) << endmsg;
139 return StatusCode::FAILURE;
144 log << MSG::INFO <<
"Initialize done!" << endmsg;
146 return StatusCode::SUCCESS;
151 if ( m_selectFlag ==
false )
return ( StatusCode::SUCCESS );
153 MsgStream log(
msgSvc(), name() );
154 log << MSG::INFO <<
"in execute()" << endmsg;
157 if ( m_totevent % 1000 == 0 ) std::cout << m_totevent <<
"\tdone!" << std::endl;
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;
163 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
164 m_currun = eventHeader->runNumber();
165 m_curevent = eventHeader->eventNumber();
169 m_event = m_curevent;
173 SmartDataPtr<RecMdcTrackCol> mdcTrackCol( eventSvc(),
"/Event/Recon/RecMdcTrackCol" );
176 log << MSG::FATAL <<
"Could not find RecMdcTrackCol!" << endmsg;
177 return ( StatusCode::FAILURE );
179 log << MSG::INFO <<
"MDC tracks:\t" << mdcTrackCol->size() << endmsg;
181 if ( mdcTrackCol->size() != 2 )
return ( StatusCode::SUCCESS );
185 double c1, c2, r1, r2, z1, z2,
p1,
p2;
186 c1 = c2 = r1 = r2 = z1 = z2 =
p1 =
p2 = 0.;
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();
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;
215 bool mdcflag5 = fabs(
p1 -
p2 ) / (
p1 +
p2 ) < m_psymcut;
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;
224 if ( m_output ) m_zeroCFlag = 1;
226 if ( mdcflag2 && mdcflag3 )
229 if ( m_output ) m_vtRZFlag = 1;
234 if ( m_output ) m_pLimFlag = 1;
239 if ( m_output ) m_pSymFlag = 1;
241 if ( mdcflag1 && mdcflag2 && mdcflag3 && mdcflag4 && mdcflag5 )
246 if ( !m_useFlag[0] ) m_passFlag[0] =
true;
247 else m_passFlag[0] = m_mdcPass;
248 log << MSG::INFO <<
"MDC selection done!" << endmsg;
251 SmartDataPtr<RecTofTrackCol> tofTrackCol( eventSvc(),
"/Event/Recon/RecTofTrackCol" );
254 log << MSG::FATAL <<
"Could not find RecTofTrackCol!" << endmsg;
255 return ( StatusCode::FAILURE );
257 log << MSG::INFO <<
"TOF tracks:\t" << tofTrackCol->size() << endmsg;
262 if ( tofTrackCol->size() > 7 && tofTrackCol->size() < 21 )
265 for (
int itof = 0; itof < tofTrackCol->size(); itof++ )
268 status->
setStatus( ( *tofTrackCol )[itof]->status() );
275 if ( goodtof == 0 ) t1 = ( *tofTrackCol )[itof]->tof();
276 if ( goodtof == 1 ) t2 = ( *tofTrackCol )[itof]->tof();
289 bool tofflag1 = fabs( t1 - t2 ) < m_tcut;
290 log << MSG::INFO <<
"t1:\t" << t1 <<
"\tt2:" << t2 <<
"dt:\t" << fabs( t1 - t2 ) << endmsg;
294 if ( m_output ) m_tLimFlag = 1;
298 if ( !m_useFlag[1] ) m_passFlag[1] =
true;
299 else m_passFlag[1] = m_tofPass;
300 log << MSG::INFO <<
"TOF selection done!" << endmsg;
303 SmartDataPtr<RecEmcShowerCol> emcShowerCol( eventSvc(),
"/Event/Recon/RecEmcShowerCol" );
306 log << MSG::FATAL <<
"Could not find RecEmcShowerCol!" << endmsg;
307 return ( StatusCode::FAILURE );
309 log << MSG::INFO <<
"EMC showers:\t" << emcShowerCol->size() << endmsg;
311 if ( emcShowerCol->size() < 2 )
return ( StatusCode::SUCCESS );
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();
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 );
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;
347 if ( emcFlag1 && emcFlag2 )
350 if ( m_output ) m_eLimFlag = 1;
352 if ( emcFlag3 && emcFlag4 )
355 if ( m_output ) m_eBBFlag = 1;
360 if ( m_output ) m_partFlag = 1;
362 if ( emcFlag1 && emcFlag2 && emcFlag3 && emcFlag4 && emcFlag5 )
367 if ( !m_useFlag[2] ) m_passFlag[2] =
true;
368 else m_passFlag[2] = m_emcPass;
369 log << MSG::INFO <<
"EMC selection done!" << endmsg;
372 SmartDataPtr<MucDigiCol> mucDigiCol( eventSvc(),
"/Event/Digi/MucDigiCol" );
375 log << MSG::FATAL <<
"Could not find MucDigiCol!" << endmsg;
376 return ( StatusCode::FAILURE );
378 SmartDataPtr<RecMucTrackCol> mucTrackCol( eventSvc(),
"/Event/Recon/RecMucTrackCol" );
381 log << MSG::FATAL <<
"Could not find RecMucTrackCol" << endmsg;
382 return ( StatusCode::FAILURE );
385 int mudigiNum, mutrkNum;
387 mudigiNum = mutrkNum = 0;
388 mudigiNum = mucDigiCol->size();
389 mutrkNum = mucTrackCol->size();
390 RecMucTrackCol::iterator mutrkIter = mucTrackCol->begin();
391 for ( ; mutrkIter != mucTrackCol->end(); mutrkIter++ )
393 if ( 0 == ( *mutrkIter )->trackId() || 1 == ( *mutrkIter )->trackId() )
394 depth += ( *mutrkIter )->depth();
399 m_mudigi = mudigiNum;
404 bool mucflag1 = mudigiNum >= m_mudigicut;
405 bool mucflag2 = mutrkNum >= m_mutrkcut;
406 bool mucflag3 = depth > m_depthcut;
408 log << MSG::INFO <<
"MUC digi:\t" << mudigiNum <<
"\tMUC track:\t" << mutrkNum << endmsg;
413 if ( m_output ) m_mudigiFlag = 1;
418 if ( m_output ) m_mutrkFlag = 1;
423 if ( m_output ) m_depthFlag = 1;
425 if ( mucflag1 && mucflag2 && mucflag3 )
430 if ( !m_useFlag[3] ) m_passFlag[3] =
true;
431 else m_passFlag[3] = m_mucPass;
432 log << MSG::INFO <<
"MUC selection done!" << endmsg;
435 if ( m_passFlag[0] && m_passFlag[1] && m_passFlag[2] && m_passFlag[3] )
438 setFilterPassed(
true );
440 log << MSG::INFO <<
"Set filter passed!" << endmsg;
444 m_mdcFlag = m_mdcPass;
445 m_tofFlag = m_tofPass;
446 m_emcFlag = m_emcPass;
447 m_mucFlag = m_mucPass;
450 if ( m_output ) m_passtuple->write();
452 return StatusCode::SUCCESS;