42 : Algorithm( name, pSvcLocator ) {
46 declareProperty(
"Vr0cut", m_vr0cut = 1.0 );
47 declareProperty(
"Vz0cut", m_vz0cut = 5.0 );
49 declareProperty(
"lowEnergyShowerCut", m_lowEnergyShowerCut = 0.1 );
50 declareProperty(
"highEnergyShowerCut", m_highEnergyShowerCut = 0.5 );
51 declareProperty(
"matchThetaCut", m_matchThetaCut = 0.2 );
52 declareProperty(
"matchPhiCut", m_matchPhiCut = 0.2 );
54 declareProperty(
"highMomentumCut", m_highMomentumCut = 0.5 );
55 declareProperty(
"EoPMaxCut", m_EoPMaxCut = 1.3 );
56 declareProperty(
"EoPMinCut", m_EoPMinCut = 0.6 );
57 declareProperty(
"minAngShEnergyCut", m_minAngShEnergyCut = 0.2 );
58 declareProperty(
"minAngCut", m_minAngCut = 0.3 );
59 declareProperty(
"acolliCut", m_acolliCut = 0.03 );
60 declareProperty(
"eNormCut", m_eNormCut = 0.5 );
61 declareProperty(
"pNormCut", m_pNormCut = 0.5 );
62 declareProperty(
"BarrelOrEndcap", m_BarrelOrEndcap = 1 );
63 declareProperty(
"Output", m_output =
false );
64 declareProperty(
"oneProngMomentumCut", m_oneProngMomentumCut = 1.2 );
69 MsgStream log(
msgSvc(), name() );
71 log << MSG::INFO <<
"in initialize()" << endmsg;
76 NTuplePtr nt1(
ntupleSvc(),
"FILE1/bhabha" );
77 if ( nt1 ) m_tuple1 = nt1;
80 m_tuple1 =
ntupleSvc()->book(
"FILE1/bhabha", CLID_ColumnWiseTuple,
"N-Tuple example" );
83 status = m_tuple1->addItem(
"sh1_ene", m_sh1_ene );
84 status = m_tuple1->addItem(
"sh1_theta", m_sh1_theta );
85 status = m_tuple1->addItem(
"sh1_phi", m_sh1_phi );
86 status = m_tuple1->addItem(
"sh2_ene", m_sh2_ene );
87 status = m_tuple1->addItem(
"sh2_theta", m_sh2_theta );
88 status = m_tuple1->addItem(
"sh2_phi", m_sh2_phi );
89 status = m_tuple1->addItem(
"di_phi", m_di_phi );
90 status = m_tuple1->addItem(
"di_the", m_di_the );
91 status = m_tuple1->addItem(
"acolli", m_acolli );
92 status = m_tuple1->addItem(
"mdc_hit", m_mdc_hit );
93 status = m_tuple1->addItem(
"etot", m_etot );
97 log << MSG::ERROR <<
" Cannot book N-tuple:" << long( m_tuple1 ) << endmsg;
98 return StatusCode::FAILURE;
102 NTuplePtr nt2(
ntupleSvc(),
"FILE1/bha1" );
103 if ( nt2 ) m_tuple2 = nt2;
106 m_tuple2 =
ntupleSvc()->book(
"FILE1/bha1", CLID_ColumnWiseTuple,
"N-Tuple example" );
109 status = m_tuple2->addItem(
"sh_ene", m_sh_ene );
110 status = m_tuple2->addItem(
"sh_theta", m_sh_theta );
111 status = m_tuple2->addItem(
"sh_phi", m_sh_phi );
115 log << MSG::ERROR <<
" Cannot book N-tuple:" << long( m_tuple2 ) << endmsg;
116 return StatusCode::FAILURE;
127 m_oneProngsSelected = 0;
128 m_twoProngsMatchedSelected = 0;
129 m_twoProngsOneMatchedSelected = 0;
130 m_selectedTrkID1 = 999;
131 m_selectedTrkID2 = 999;
133 log << MSG::INFO <<
"successfully return from initialize()" << endmsg;
134 return StatusCode::SUCCESS;
140 setFilterPassed(
false );
142 MsgStream log(
msgSvc(), name() );
143 log << MSG::INFO <<
"in execute()" << endmsg;
147 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
150 cout <<
" eventHeader " << endl;
151 return StatusCode::FAILURE;
154 int run = eventHeader->runNumber();
155 int event = eventHeader->eventNumber();
156 if ( event % 1000 == 0 ) cout <<
" run,event: " << run <<
"," <<
event << endl;
161 cout <<
" evtRecEvent " << endl;
162 return StatusCode::FAILURE;
165 log << MSG::DEBUG <<
"ncharg, nneu, tottks = " << evtRecEvent->totalCharged() <<
" , "
166 << evtRecEvent->totalNeutral() <<
" , " << evtRecEvent->totalTracks() << endmsg;
170 cout <<
" evtRecTrkCol " << endl;
171 return StatusCode::FAILURE;
177 double ene5x5, theta, phi, eseed;
178 double showerX, showerY, showerZ;
179 long int thetaIndex, phiIndex;
191 vector<RecEmcShower*> GoodShowers;
194 for (
int i = 0; i < evtRecEvent->totalTracks(); i++ )
196 if ( i >= evtRecTrkCol->size() )
break;
198 if ( ( *itTrk )->isEmcShowerValid() )
204 ene5x5 = theShower->
e5x5();
207 if ( ene5x5 > 0.4 && ene5x5 < 4 && npart == 1 && ( m_BarrelOrEndcap == 1 ) )
209 GoodShowers.push_back( theShower );
210 iGood.push_back( ( *itTrk )->trackId() );
212 else if ( ene5x5 > 0.4 && ene5x5 < 4 && ( npart == 2 || npart == 0 ) &&
213 ( m_BarrelOrEndcap == 2 ) )
215 GoodShowers.push_back( theShower );
216 iGood.push_back( ( *itTrk )->trackId() );
218 else if ( ene5x5 > 0.4 && ene5x5 < 4 && ( m_BarrelOrEndcap == 0 ) )
220 GoodShowers.push_back( theShower );
221 iGood.push_back( ( *itTrk )->trackId() );
229 double MaxE( 0 ), MaxPhi, MaxThe;
231 double SecE( 0 ), SecPhi, SecThe;
232 for (
int i = 0; i < GoodShowers.size(); i++ )
235 double eraw = theShower->
energy();
240 MaxPhi = theShower->
phi();
241 MaxThe = theShower->
theta();
244 for (
int i = 0; i < GoodShowers.size(); i++ )
247 double eraw = theShower->
energy();
248 if ( i != MaxId && eraw > SecE )
251 SecPhi = theShower->
phi();
252 SecThe = theShower->
theta();
256 double dphi = ( fabs( MaxPhi - SecPhi ) -
PI ) * 180. /
PI;
257 double dthe = ( fabs( MaxThe + SecThe ) -
PI ) * 180. /
PI;
258 if ( GoodShowers.size() >= 2 && SecE > 1.0 && dphi > -4 && dphi < 2 &&
abs( dthe ) < 3 &&
261 setFilterPassed(
true );
269 m_sh1_theta = MaxThe;
272 m_sh2_theta = SecThe;
279 return StatusCode::SUCCESS;