72 {
73 MsgStream log(
msgSvc(), name() );
74 log << MSG::INFO << "in execute()" << endmsg;
75
76 int numOfChargedTrks = 0;
77 int numOfKalTrks = 0;
78 int numOfDedx = 0;
79 int numOfExt = 0;
80 int numOfTof = 0;
81 int numOfShower = 0;
82 int numOfMatchedShower = 0;
83 int numOfMucTrks = 0;
84
85
86 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
87 if ( !eventHeader )
88 {
89 log << MSG::FATAL << "Could not find Event Header" << endmsg;
90 return ( StatusCode::FAILURE );
91 }
92 log << MSG::INFO << ": retrieved event: " << eventHeader->eventNumber()
93 << " run: " << eventHeader->runNumber() << endmsg;
94
95
97 RecMdcTrackCol::iterator beginOfMdcTrkCol = RecMdcTrackCol::iterator( NULL );
98 if ( !recMdcTrackCol ) { log << MSG::INFO << "Could not find RecMdcTrackCol!" << endmsg; }
99 else
100 {
101 beginOfMdcTrkCol = recMdcTrackCol->begin();
102 numOfChargedTrks = recMdcTrackCol->size();
103 }
104
105 SmartDataPtr<RecMdcKalTrackCol> mdcKalTrackCol( eventSvc(),
107 RecMdcKalTrackCol::iterator beginOfMdcKalTrackCol = RecMdcKalTrackCol::iterator( NULL );
108 if ( !mdcKalTrackCol ) { log << MSG::INFO << "Could not find MdcKalTrackCol!" << endmsg; }
109 else
110 {
111 beginOfMdcKalTrackCol = mdcKalTrackCol->begin();
112 numOfKalTrks = mdcKalTrackCol->size();
113 }
114
116 RecMdcDedxCol::iterator beginOfDedxCol = RecMdcDedxCol::iterator( NULL );
117 if ( !mdcDedxCol ) { log << MSG::INFO << "Could not find MdcDedxCol!" << endmsg; }
118 else
119 {
120 beginOfDedxCol = mdcDedxCol->begin();
121 numOfDedx = mdcDedxCol->size();
122 }
123
125 RecExtTrackCol::iterator beginOfExtTrackCol = RecExtTrackCol::iterator( NULL );
126 if ( !extTrackCol ) { log << MSG::INFO << "Could not find RecExtTrackCol!" << endmsg; }
127 else
128 {
129 beginOfExtTrackCol = extTrackCol->begin();
130 numOfExt = extTrackCol->size();
131 }
132
134 RecTofTrackCol::iterator beginOfTofTrackCol = RecTofTrackCol::iterator( NULL );
135 if ( !TofTrackCol ) { log << MSG::INFO << "Could not find RecTofTrackCol!" << endmsg; }
136 else
137 {
138 beginOfTofTrackCol = TofTrackCol->begin();
139 numOfTof = TofTrackCol->size();
140 }
141
142 SmartDataPtr<RecEmcShowerCol> emcRecShowerCol( eventSvc(),
144 RecEmcShowerCol::iterator beginOfEmcTrackCol = RecEmcShowerCol::iterator( NULL );
145 if ( !emcRecShowerCol ) { log << MSG::INFO << "Could not find RecEmcShowerCol!" << endmsg; }
146 else
147 {
148 beginOfEmcTrackCol = emcRecShowerCol->begin();
149 numOfShower = emcRecShowerCol->size();
150 }
151
153 RecMucTrackCol::iterator beginOfMucTrackCol = RecMucTrackCol::iterator( NULL );
154 if ( !mucTrackCol ) { log << MSG::INFO << "Could not find RecMucTrackCol!" << endmsg; }
155 else
156 {
157 beginOfMucTrackCol = mucTrackCol->begin();
158 numOfMucTrks = mucTrackCol->size();
159 }
160
161
162
163 int MaxHit = numOfChargedTrks + numOfShower + numOfTof;
164
165 vector<bool> dEdxMatched;
166 vector<bool> kalTrkMatched;
167 vector<bool> extMatched;
168 vector<bool> TofMatched;
169 vector<bool> emcMatched;
170 vector<bool> mucMatched;
171
172 for ( int i = 0; i < MaxHit; i++ )
173 {
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 );
180 }
181
182
183
185 if ( numOfChargedTrks + numOfShower )
186
187 {
188 for ( int i = 0; i < numOfChargedTrks; i++ )
189 {
190 EvtRecTrack* aNewEvtRecTrack = new EvtRecTrack;
191 int mdcTrkID = ( *( beginOfMdcTrkCol + i ) )->trackId();
193 aNewEvtRecTrack->
setMdcTrack( *( beginOfMdcTrkCol + i ) );
194
195 for ( int j = 0; j < numOfKalTrks; j++ )
196 if ( !kalTrkMatched[j] && mdcTrkID == ( *( beginOfMdcKalTrackCol + j ) )->trackId() )
197 {
198 aNewEvtRecTrack->
setMdcKalTrack( *( beginOfMdcKalTrackCol + j ) );
199
200 kalTrkMatched[j] = true;
201 }
202
203 for ( int j = 0; j < numOfDedx; j++ )
204 if ( !dEdxMatched[j] && mdcTrkID == ( *( beginOfDedxCol + j ) )->trackId() )
205 {
206 aNewEvtRecTrack->
setMdcDedx( *( beginOfDedxCol + j ) );
207
208 dEdxMatched[j] = true;
209 }
210
211 for ( int j = 0; j < numOfExt; j++ )
212 if ( !extMatched[j] && mdcTrkID == ( *( beginOfExtTrackCol + j ) )->trackId() )
213 {
214 aNewEvtRecTrack->
setExtTrack( *( beginOfExtTrackCol + j ) );
215
216 extMatched[j] = true;
217 }
218 for ( int j = 0; j < numOfTof; j++ )
219 if ( !TofMatched[j] && mdcTrkID == ( *( beginOfTofTrackCol + j ) )->trackID() )
220 {
221 aNewEvtRecTrack->
addTofTrack( *( beginOfTofTrackCol + j ) );
222
223 TofMatched[j] = true;
224 }
225 for ( int j = 0; j < numOfMucTrks; j++ )
226 if ( !mucMatched[j] && mdcTrkID == ( *( beginOfMucTrackCol + j ) )->trackId() )
227 {
228 aNewEvtRecTrack->
setMucTrack( *( beginOfMucTrackCol + j ) );
229
230 mucMatched[j] = true;
231 }
232
233 if ( m_Output == 1 )
234 {
235 myExted = -1.;
236 myMatched = -1.;
237 myEnergyMatched = -1.;
238 }
240 ( aNewEvtRecTrack->
extTrack() )->emcVolumeNumber() != -1 )
241
242 {
243 if ( m_Output == 1 ) myExted = 1.;
244
245 Hep3Vector extPos = ( aNewEvtRecTrack->
extTrack() )->emcPosition();
246 double extTheta = extPos.theta();
247 double extPhi = extPos.phi();
248
249 double dAngleMin = 9999.;
250 int indexOfEmcNearest = -1;
251
252 for ( int j = 0; j < numOfShower; j++ )
253 {
254 if ( !emcMatched[j] )
255 {
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 )
260 {
261 dAngleMin = dAngle;
262 indexOfEmcNearest = j;
263 }
264 }
265 }
266 if ( indexOfEmcNearest >= 0 )
267 {
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 )
274 {
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 )
281 {
282 aNewEvtRecTrack->
setEmcShower( *( beginOfEmcTrackCol + indexOfEmcNearest ) );
283
284 emcMatched[indexOfEmcNearest] = true;
285 numOfMatchedShower++;
286 if ( m_Output == 1 ) myMatched = 1.;
287 }
288 }
289 else if ( fabs( deltaTheta ) < myEmcThetaCut &&
290 fabs( deltaPhi ) < myEmcPhiCut )
291
292
293 {
294 aNewEvtRecTrack->
setEmcShower( *( beginOfEmcTrackCol + indexOfEmcNearest ) );
295
296 emcMatched[indexOfEmcNearest] = true;
297 numOfMatchedShower++;
298 if ( m_Output == 1 ) myMatched = 1.;
299 }
300 }
301 }
302 aNewEvtRecTrackCol->push_back( aNewEvtRecTrack );
303 if ( m_Output == 1 )
304 {
305 myEnergyMatched = 0.;
306 myNTuple1->write();
307 }
308 }
309
310 int id = 0;
311 for ( int i = 0; i < numOfShower;
312 i++ )
313 {
314 if ( !emcMatched[i] )
315 {
316 EvtRecTrack* aNewEvtRecTrack = new EvtRecTrack;
317 aNewEvtRecTrack->
setTrackId(
id + numOfChargedTrks );
318 aNewEvtRecTrack->
setEmcShower( *( beginOfEmcTrackCol + i ) );
319
320
321
322 HepPoint3D emcPos( ( *( beginOfEmcTrackCol + i ) )->position() );
323 double emcPhi = emcPos.phi();
324 emcPhi = emcPhi < 0 ? emcPhi + CLHEP::twopi : emcPhi;
325
326 int module = 9999, nphi1 = 9999, nphi2 = 9999, nphi1_mrpc = 9999;
327 module = ( *( beginOfEmcTrackCol + i ) )->module();
328 if ( module == 1 )
329 {
330 nphi1 = (int)( emcPhi * 88. / CLHEP::twopi );
331 nphi2 = (int)( emcPhi * 88. / CLHEP::twopi + 0.5 );
332 nphi2 += 88;
333 }
334 else
335 {
336 nphi1 = (int)( emcPhi * 48. / CLHEP::twopi + 0.5 );
337
338
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 ) ) ) +
342 1;
343
344
345 if ( nphi1_mrpc % 2 == 0 )
346 {
347 nphi1_mrpc = nphi1_mrpc / 2;
348 }
349
350 else { nphi1_mrpc = ( nphi1_mrpc + 1 ) / 2; }
351
352 if ( emcPos.z() > 0 )
353 {
354 ( nphi1_mrpc -= 19 );
355 nphi1_mrpc = nphi1_mrpc * ( -1 );
356 }
357
358
359 }
360
361 int dPhiMin = 9999;
362 int partid_dPhiMin = 7;
363 bool mrpcmatch = false;
364
365 int indexOfTofNearest = -1;
366 for ( int j = 0; j < numOfTof; j++ )
367 {
368 if ( !TofMatched[j] )
369 {
370
371 Identifier id( ( *( beginOfTofTrackCol + j ) )->tofID() );
373
374 if ( !is_mrpc )
375 {
379 im += layer * 88;
380
381 if ( module != barrel_ec ) continue;
382
383 int dPhi;
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; }
388
389 if ( dPhi < dPhiMin )
390 {
391 dPhiMin = dPhi;
392 indexOfTofNearest = j;
393 }
394 }
395 else
396 {
399
400 int dphi;
401 dphi =
abs( module_mrpc - nphi1_mrpc );
402
403 if ( dphi < dPhiMin )
404 {
405 dPhiMin = dphi;
406 partid_dPhiMin = barrel_ec;
407 indexOfTofNearest = j;
408 mrpcmatch = true;
409 }
410 }
411
412 }
413 }
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429 if ( indexOfTofNearest >= 0 )
430 {
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 ); }
436 }
437
438 if ( indexOfTofNearest >= 0 && dPhiMin <= 1 )
439 {
440
441 double eShower = ( *( beginOfEmcTrackCol + i ) )->e5x5();
442 double matWindow = 0;
443 if ( eShower > 0 ) { matWindow = 0.01277 + 0.004268 / sqrt( eShower ); }
444 matWindow = 0.2;
445
447 ( *( beginOfTofTrackCol + indexOfTofNearest ) )->zrhit() );
448 if ( fabs( tofPos.theta() - emcPos.theta() ) < matWindow || module != 1 )
449 {
450 aNewEvtRecTrack->
addTofTrack( *( beginOfTofTrackCol + indexOfTofNearest ) );
451 TofMatched[indexOfTofNearest] = true;
452
453 }
454 }
455
456 aNewEvtRecTrackCol->push_back( aNewEvtRecTrack );
457 id++;
458 }
459 }
460 }
461
462
463 if ( myMsgFlag )
464 cout << "Charged tracks: " << numOfChargedTrks << " Ext track: " << numOfExt
465 << " Shower:" << numOfShower << " Matched shower:" << numOfMatchedShower << endl;
466
467
468 DataObject* aDataObject1;
470 if ( aDataObject1 == NULL )
471 {
472 EvtRecObject* aRecObject = new EvtRecObject;
474 if ( sc.isFailure() )
475 {
476 log << MSG::FATAL << "Could not register EvtRecObject in TDS!" << endmsg;
477 return StatusCode::FAILURE;
478 }
479 }
480
481 DataObject* aDataObject2;
483 if ( aDataObject2 == NULL )
484 {
486 aRecEvent->
setTotalTracks( numOfChargedTrks + numOfShower - numOfMatchedShower );
490 if ( sc.isFailure() )
491 {
492 log << MSG::FATAL << "Could not register EvtRecEvent in TDS!" << endmsg;
493 return ( StatusCode::FAILURE );
494 }
495 }
496 else
497 {
499 aRecEvent->
setTotalTracks( numOfChargedTrks + numOfShower - numOfMatchedShower );
502 }
503
504 DataObject* aDataObject3;
506 if ( aDataObject3 != NULL )
507 {
508
509 SmartIF<IDataManagerSvc> dataMgrSvc( eventSvc() );
512 }
513
514 StatusCode sc =
516 if ( sc.isFailure() )
517 {
518 log << MSG::FATAL << "Could not register EvtRecTrackCol in TDS!" << endmsg;
519 return ( StatusCode::FAILURE );
520 }
521
522
523 SmartDataPtr<EvtRecTrackCol> evtRecTrackCol( eventSvc(),
525 if ( !evtRecTrackCol )
526 { log << MSG::FATAL << "Could not find RecTrackListCol in TDS!" << endmsg; }
527
528 EvtRecTrackCol::iterator itOfRecTrkListCol = evtRecTrackCol->begin();
529 if ( myMsgFlag )
530 for ( int i = 0; itOfRecTrkListCol != evtRecTrackCol->end(); itOfRecTrkListCol++, i++ )
531 {
532 cout << "******************** Track " << i << ": *********************" << endl;
533 cout << "Track ID: " << ( *itOfRecTrkListCol )->trackId() << endl;
534 if ( ( *itOfRecTrkListCol )->isMdcTrackValid() )
535 {
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;
540 }
541 if ( ( *itOfRecTrkListCol )->isExtTrackValid() )
542 {
543 RecExtTrack* extTrack = ( *itOfRecTrkListCol )->extTrack();
545 cout << "Ext Emc pos:" << emcPos.x() << "," << emcPos.y() << "," << emcPos.z() << endl;
546 }
547 if ( ( *itOfRecTrkListCol )->isEmcShowerValid() )
548 {
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;
555 }
556 }
557
558 return StatusCode::SUCCESS;
559}
HepGeom::Point3D< double > HepPoint3D
ObjectVector< EvtRecTrack > EvtRecTrackCol
HepPoint3D position() const
const Hep3Vector emcPosition() const
const HepVector helix() const
......
void setTotalTracks(const int tottks)
void setTotalNeutral(const int nneu)
void setTotalCharged(const int nchrg)
void setMucTrack(const RecMucTrack *trk)
void setMdcTrack(const RecMdcTrack *trk)
void setTrackId(const int trkId)
void setMdcKalTrack(const RecMdcKalTrack *trk)
void setMdcDedx(const RecMdcDedx *trk)
void setEmcShower(const RecEmcShower *shower)
void addTofTrack(const SmartRef< RecTofTrack > trk)
void setExtTrack(const RecExtTrack *trk)
static bool is_mrpc(const Identifier &id)
static int phi_module(const Identifier &id)
static int barrel_ec(const Identifier &id)
Values of different levels (failure returns 0).
static int layer(const Identifier &id)
static int module(const Identifier &id)
_EXTERN_ std::string Event
_EXTERN_ std::string EvtRecEvent
_EXTERN_ std::string EvtRecTrackCol
_EXTERN_ std::string RecExtTrackCol
_EXTERN_ std::string RecMdcDedxCol
_EXTERN_ std::string RecTofTrackCol
_EXTERN_ std::string RecMdcTrackCol
_EXTERN_ std::string RecMdcKalTrackCol
_EXTERN_ std::string RecMucTrackCol
_EXTERN_ std::string RecEmcShowerCol