73 MsgStream log(
msgSvc(), name() );
74 log << MSG::INFO <<
"in execute()" << endmsg;
76 int numOfChargedTrks = 0;
82 int numOfMatchedShower = 0;
86 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(),
"/Event/EventHeader" );
89 log << MSG::FATAL <<
"Could not find Event Header" << endmsg;
90 return ( StatusCode::FAILURE );
92 log << MSG::INFO <<
": retrieved event: " << eventHeader->eventNumber()
93 <<
" run: " << eventHeader->runNumber() << endmsg;
97 RecMdcTrackCol::iterator beginOfMdcTrkCol = RecMdcTrackCol::iterator( NULL );
98 if ( !recMdcTrackCol ) { log << MSG::INFO <<
"Could not find RecMdcTrackCol!" << endmsg; }
101 beginOfMdcTrkCol = recMdcTrackCol->begin();
102 numOfChargedTrks = recMdcTrackCol->size();
105 SmartDataPtr<RecMdcKalTrackCol> mdcKalTrackCol( eventSvc(),
107 RecMdcKalTrackCol::iterator beginOfMdcKalTrackCol = RecMdcKalTrackCol::iterator( NULL );
108 if ( !mdcKalTrackCol ) { log << MSG::INFO <<
"Could not find MdcKalTrackCol!" << endmsg; }
111 beginOfMdcKalTrackCol = mdcKalTrackCol->begin();
112 numOfKalTrks = mdcKalTrackCol->size();
116 RecMdcDedxCol::iterator beginOfDedxCol = RecMdcDedxCol::iterator( NULL );
117 if ( !mdcDedxCol ) { log << MSG::INFO <<
"Could not find MdcDedxCol!" << endmsg; }
120 beginOfDedxCol = mdcDedxCol->begin();
121 numOfDedx = mdcDedxCol->size();
125 RecExtTrackCol::iterator beginOfExtTrackCol = RecExtTrackCol::iterator( NULL );
126 if ( !extTrackCol ) { log << MSG::INFO <<
"Could not find RecExtTrackCol!" << endmsg; }
129 beginOfExtTrackCol = extTrackCol->begin();
130 numOfExt = extTrackCol->size();
134 RecTofTrackCol::iterator beginOfTofTrackCol = RecTofTrackCol::iterator( NULL );
135 if ( !TofTrackCol ) { log << MSG::INFO <<
"Could not find RecTofTrackCol!" << endmsg; }
138 beginOfTofTrackCol = TofTrackCol->begin();
139 numOfTof = TofTrackCol->size();
142 SmartDataPtr<RecEmcShowerCol> emcRecShowerCol( eventSvc(),
144 RecEmcShowerCol::iterator beginOfEmcTrackCol = RecEmcShowerCol::iterator( NULL );
145 if ( !emcRecShowerCol ) { log << MSG::INFO <<
"Could not find RecEmcShowerCol!" << endmsg; }
148 beginOfEmcTrackCol = emcRecShowerCol->begin();
149 numOfShower = emcRecShowerCol->size();
153 RecMucTrackCol::iterator beginOfMucTrackCol = RecMucTrackCol::iterator( NULL );
154 if ( !mucTrackCol ) { log << MSG::INFO <<
"Could not find RecMucTrackCol!" << endmsg; }
157 beginOfMucTrackCol = mucTrackCol->begin();
158 numOfMucTrks = mucTrackCol->size();
163 int MaxHit = numOfChargedTrks + numOfShower + numOfTof;
165 vector<bool> dEdxMatched;
166 vector<bool> kalTrkMatched;
167 vector<bool> extMatched;
168 vector<bool> TofMatched;
169 vector<bool> emcMatched;
170 vector<bool> mucMatched;
172 for (
int i = 0; i < MaxHit; i++ )
174 dEdxMatched.push_back(
false );
175 kalTrkMatched.push_back(
false );
176 extMatched.push_back(
false );
177 TofMatched.push_back(
false );
178 emcMatched.push_back(
false );
179 mucMatched.push_back(
false );
185 if ( numOfChargedTrks + numOfShower )
188 for (
int i = 0; i < numOfChargedTrks; i++ )
191 int mdcTrkID = ( *( beginOfMdcTrkCol + i ) )->trackId();
193 aNewEvtRecTrack->
setMdcTrack( *( beginOfMdcTrkCol + i ) );
195 for (
int j = 0; j < numOfKalTrks; j++ )
196 if ( !kalTrkMatched[j] && mdcTrkID == ( *( beginOfMdcKalTrackCol + j ) )->trackId() )
198 aNewEvtRecTrack->
setMdcKalTrack( *( beginOfMdcKalTrackCol + j ) );
200 kalTrkMatched[j] =
true;
203 for (
int j = 0; j < numOfDedx; j++ )
204 if ( !dEdxMatched[j] && mdcTrkID == ( *( beginOfDedxCol + j ) )->trackId() )
206 aNewEvtRecTrack->
setMdcDedx( *( beginOfDedxCol + j ) );
208 dEdxMatched[j] =
true;
211 for (
int j = 0; j < numOfExt; j++ )
212 if ( !extMatched[j] && mdcTrkID == ( *( beginOfExtTrackCol + j ) )->trackId() )
214 aNewEvtRecTrack->
setExtTrack( *( beginOfExtTrackCol + j ) );
216 extMatched[j] =
true;
218 for (
int j = 0; j < numOfTof; j++ )
219 if ( !TofMatched[j] && mdcTrkID == ( *( beginOfTofTrackCol + j ) )->trackID() )
221 aNewEvtRecTrack->
addTofTrack( *( beginOfTofTrackCol + j ) );
223 TofMatched[j] =
true;
225 for (
int j = 0; j < numOfMucTrks; j++ )
226 if ( !mucMatched[j] && mdcTrkID == ( *( beginOfMucTrackCol + j ) )->trackId() )
228 aNewEvtRecTrack->
setMucTrack( *( beginOfMucTrackCol + j ) );
230 mucMatched[j] =
true;
237 myEnergyMatched = -1.;
240 ( aNewEvtRecTrack->
extTrack() )->emcVolumeNumber() != -1 )
243 if ( m_Output == 1 ) myExted = 1.;
245 Hep3Vector extPos = ( aNewEvtRecTrack->
extTrack() )->emcPosition();
246 double extTheta = extPos.theta();
247 double extPhi = extPos.phi();
249 double dAngleMin = 9999.;
250 int indexOfEmcNearest = -1;
252 for (
int j = 0; j < numOfShower; j++ )
254 if ( !emcMatched[j] )
256 HepPoint3D emcPot = ( *( beginOfEmcTrackCol + j ) )->position();
257 Hep3Vector emcPos( emcPot.x(), emcPot.y(), emcPot.z() );
258 double dAngle = extPos.angle( emcPos );
259 if ( dAngle < dAngleMin )
262 indexOfEmcNearest = j;
266 if ( indexOfEmcNearest >= 0 )
268 HepPoint3D emcPot = ( *( beginOfEmcTrackCol + indexOfEmcNearest ) )->position();
269 double theta = emcPot.theta();
270 double phi = emcPot.phi();
271 double deltaTheta = ( extTheta - theta );
272 double deltaPhi = fmod( extPhi - phi + 5 *
M_PI, 2 *
M_PI ) -
M_PI;
273 if ( myActiveCutFlag )
275 double tanLamda = ( *( beginOfMdcTrkCol + i ) )->helix( 4 );
276 double kappa = ( *( beginOfMdcTrkCol + i ) )->helix( 2 );
277 double p = sqrt( 1 + tanLamda * tanLamda ) / fabs( kappa );
278 double aThetaCut = thetaCut( p, myEmcThetaNSigmaCut, myParticleId );
279 double aPhiCUt = phiCut( p, myEmcPhiNSigmaCut, myParticleId );
280 if ( fabs( deltaTheta ) < aThetaCut && fabs( deltaPhi ) < aPhiCUt )
282 aNewEvtRecTrack->
setEmcShower( *( beginOfEmcTrackCol + indexOfEmcNearest ) );
284 emcMatched[indexOfEmcNearest] =
true;
285 numOfMatchedShower++;
286 if ( m_Output == 1 ) myMatched = 1.;
289 else if ( fabs( deltaTheta ) < myEmcThetaCut &&
290 fabs( deltaPhi ) < myEmcPhiCut )
294 aNewEvtRecTrack->
setEmcShower( *( beginOfEmcTrackCol + indexOfEmcNearest ) );
296 emcMatched[indexOfEmcNearest] =
true;
297 numOfMatchedShower++;
298 if ( m_Output == 1 ) myMatched = 1.;
302 aNewEvtRecTrackCol->push_back( aNewEvtRecTrack );
305 myEnergyMatched = 0.;
311 for (
int i = 0; i < numOfShower;
314 if ( !emcMatched[i] )
317 aNewEvtRecTrack->
setTrackId(
id + numOfChargedTrks );
318 aNewEvtRecTrack->
setEmcShower( *( beginOfEmcTrackCol + i ) );
322 HepPoint3D emcPos( ( *( beginOfEmcTrackCol + i ) )->position() );
323 double emcPhi = emcPos.phi();
324 emcPhi = emcPhi < 0 ? emcPhi + CLHEP::twopi : emcPhi;
326 int module = 9999, nphi1 = 9999, nphi2 = 9999, nphi1_mrpc = 9999;
327 module = ( *( beginOfEmcTrackCol + i ) )->module();
330 nphi1 = (int)( emcPhi * 88. / CLHEP::twopi );
331 nphi2 = (int)( emcPhi * 88. / CLHEP::twopi + 0.5 );
336 nphi1 = (int)( emcPhi * 48. / CLHEP::twopi + 0.5 );
339 double fi_endtof_mrpc = atan2( emcPos.y(), emcPos.x() ) - 3.141592654 / 2.;
340 if ( fi_endtof_mrpc < 0 ) fi_endtof_mrpc += 2 * 3.141592654;
341 nphi1_mrpc = ( (int)( fi_endtof_mrpc / ( 3.141593 / 18 ) ) ) +
345 if ( nphi1_mrpc % 2 == 0 )
347 nphi1_mrpc = nphi1_mrpc / 2;
350 else { nphi1_mrpc = ( nphi1_mrpc + 1 ) / 2; }
352 if ( emcPos.z() > 0 )
354 ( nphi1_mrpc -= 19 );
355 nphi1_mrpc = nphi1_mrpc * ( -1 );
362 int partid_dPhiMin = 7;
363 bool mrpcmatch =
false;
365 int indexOfTofNearest = -1;
366 for (
int j = 0; j < numOfTof; j++ )
368 if ( !TofMatched[j] )
371 Identifier id( ( *( beginOfTofTrackCol + j ) )->tofID() );
381 if ( module != barrel_ec )
continue;
384 if ( layer == 0 ) { dPhi =
abs( im - nphi1 ); }
385 else { dPhi =
abs( im - nphi2 ); }
386 if ( module == 1 ) { dPhi = dPhi >= 44 ? 88 - dPhi : dPhi; }
387 else { dPhi = dPhi >= 24 ? 48 - dPhi : dPhi; }
389 if ( dPhi < dPhiMin )
392 indexOfTofNearest = j;
401 dphi =
abs( module_mrpc - nphi1_mrpc );
403 if ( dphi < dPhiMin )
406 partid_dPhiMin = barrel_ec;
407 indexOfTofNearest = j;
429 if ( indexOfTofNearest >= 0 )
432 ( *( beginOfTofTrackCol + indexOfTofNearest ) )->zrhit() );
433 double matWindow = 0;
434 double eShower = ( *( beginOfEmcTrackCol + i ) )->e5x5();
435 if ( eShower > 0 ) { matWindow = 0.01277 + 0.004268 / sqrt( eShower ); }
438 if ( indexOfTofNearest >= 0 && dPhiMin <= 1 )
441 double eShower = ( *( beginOfEmcTrackCol + i ) )->e5x5();
442 double matWindow = 0;
443 if ( eShower > 0 ) { matWindow = 0.01277 + 0.004268 / sqrt( eShower ); }
447 ( *( beginOfTofTrackCol + indexOfTofNearest ) )->zrhit() );
448 if ( fabs( tofPos.theta() - emcPos.theta() ) < matWindow || module != 1 )
450 aNewEvtRecTrack->
addTofTrack( *( beginOfTofTrackCol + indexOfTofNearest ) );
451 TofMatched[indexOfTofNearest] =
true;
456 aNewEvtRecTrackCol->push_back( aNewEvtRecTrack );
464 cout <<
"Charged tracks: " << numOfChargedTrks <<
" Ext track: " << numOfExt
465 <<
" Shower:" << numOfShower <<
" Matched shower:" << numOfMatchedShower << endl;
468 DataObject* aDataObject1;
470 if ( aDataObject1 == NULL )
474 if ( sc.isFailure() )
476 log << MSG::FATAL <<
"Could not register EvtRecObject in TDS!" << endmsg;
477 return StatusCode::FAILURE;
481 DataObject* aDataObject2;
483 if ( aDataObject2 == NULL )
486 aRecEvent->
setTotalTracks( numOfChargedTrks + numOfShower - numOfMatchedShower );
490 if ( sc.isFailure() )
492 log << MSG::FATAL <<
"Could not register EvtRecEvent in TDS!" << endmsg;
493 return ( StatusCode::FAILURE );
499 aRecEvent->
setTotalTracks( numOfChargedTrks + numOfShower - numOfMatchedShower );
504 DataObject* aDataObject3;
506 if ( aDataObject3 != NULL )
509 SmartIF<IDataManagerSvc> dataMgrSvc( eventSvc() );
516 if ( sc.isFailure() )
518 log << MSG::FATAL <<
"Could not register EvtRecTrackCol in TDS!" << endmsg;
519 return ( StatusCode::FAILURE );
523 SmartDataPtr<EvtRecTrackCol> evtRecTrackCol( eventSvc(),
525 if ( !evtRecTrackCol )
526 { log << MSG::FATAL <<
"Could not find RecTrackListCol in TDS!" << endmsg; }
528 EvtRecTrackCol::iterator itOfRecTrkListCol = evtRecTrackCol->begin();
530 for (
int i = 0; itOfRecTrkListCol != evtRecTrackCol->end(); itOfRecTrkListCol++, i++ )
532 cout <<
"******************** Track " << i <<
": *********************" << endl;
533 cout <<
"Track ID: " << ( *itOfRecTrkListCol )->trackId() << endl;
534 if ( ( *itOfRecTrkListCol )->isMdcTrackValid() )
536 RecMdcTrack* mdcTrk = ( *itOfRecTrkListCol )->mdcTrack();
537 double kappa = mdcTrk->
helix( 2 );
538 double tanl = mdcTrk->
helix( 4 );
539 cout <<
"Mdc kappa, tanl: " << kappa <<
", " << tanl << endl;
541 if ( ( *itOfRecTrkListCol )->isExtTrackValid() )
543 RecExtTrack* extTrack = ( *itOfRecTrkListCol )->extTrack();
545 cout <<
"Ext Emc pos:" << emcPos.x() <<
"," << emcPos.y() <<
"," << emcPos.z() << endl;
547 if ( ( *itOfRecTrkListCol )->isEmcShowerValid() )
549 RecEmcShower* emcTrack = ( *itOfRecTrkListCol )->emcShower();
551 double x = emcPos.x();
552 double y = emcPos.y();
553 double z = emcPos.z();
554 cout <<
"Emc rec pos:" << x <<
"," << y <<
"," << z << endl;
558 return StatusCode::SUCCESS;