102 {
103 std::cout << std::defaultfloat;
104
105 MsgStream log(
msgSvc(), name() );
106 log << MSG::INFO << "execute()" << endmsg;
107 int eventNumber, runNumber;
108
109 if ( m_setSeed == true ) CLHEP::HepRandom::setTheSeed( 9000 );
110
111
112 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
113 if ( !eventHeader )
114 {
115 log << MSG::FATAL << "Could not find Event Header" << endmsg;
116 return ( StatusCode::FAILURE );
117 }
118 runNumber = eventHeader->runNumber();
119 eventNumber = eventHeader->eventNumber();
120
121
122 if ( msgFlag )
123 {
124 cout << "TrackExt: ******************* Start a event *******************" << endl;
125 cout << "run= " << runNumber << "; event= " << eventNumber << endl;
126 }
127
128
129 SmartDataPtr<MucDigiCol> mucDigiCol( eventSvc(), "/Event/Digi/MucDigiCol" );
130 if ( !mucDigiCol )
131 {
132 log << MSG::FATAL << "Could not find MUC digi" << endmsg;
133 return ( StatusCode::SUCCESS );
134 }
135
136
137 ExtMdcTrack aExtMdcTrack;
139
140 bool setTrk = false;
141
142 int parID;
143 if ( myParticleName == "e" ) parID = 0;
144 else if ( myParticleName == "mu" ) parID = 1;
145 else if ( myParticleName == "pi" ) parID = 2;
146 else if ( myParticleName == "kaon" ) parID = 3;
147 else if ( myParticleName == "proton" || myParticleName == "anti_proton" ) parID = 4;
148 else
149 {
150 std::cerr << "TrkExtAlg::execute() - Error: Invalid particle name: " << myParticleName
151 << std::endl;
152 abort();
153 }
154
155 if ( myInputTrk == "Mdc" )
156 {
157 SmartDataPtr<RecMdcTrackCol> aMdcTrackCol( eventSvc(), "/Event/Recon/RecMdcTrackCol" );
158 if ( !aMdcTrackCol )
159 {
160 log << MSG::WARNING << "Can't find RecMdcTrackCol in TDS!" << endmsg;
161 return ( StatusCode::SUCCESS );
162 }
164 }
165 else if ( myInputTrk == "Kal" )
166 {
167 SmartDataPtr<RecMdcKalTrackCol> aMdcKalTrackCol( eventSvc(),
168 "/Event/Recon/RecMdcKalTrackCol" );
169 if ( !aMdcKalTrackCol )
170 {
171 log << MSG::WARNING << "Can't find RecMdcKalTrackCol in TDS!" << endmsg;
172 return ( StatusCode::SUCCESS );
173 }
175 }
176 else
177 {
178 log << MSG::WARNING << "Wrong type of inputTrk:" << myInputTrk << endmsg;
179 return ( StatusCode::SUCCESS );
180 }
181
183 if ( setTrk )
184 {
186 {
187
188 RecExtTrack* aExtTrack = new RecExtTrack;
189
190 for ( int i = 0; i < 5; i++ )
191 {
192 if ( aExtMdcTrack.
ReadTrk( i ) )
193 {
195
202 double tofInMdc = aExtMdcTrack.
GetTrkTof();
203
204 if ( msgFlag )
205 {
206 cout << "Start From:" << position.x() << ' ' << position.y() << ' ' << position.z()
207 << endl;
210 cout <<
"Start Error matrix:" <<
error << endl;
211 cout << "Path before start:" << pathInMDC << endl;
212 }
213
214 G4String aParticleName(
parName[i] );
216 if ( !aParticleName.contains( "proton" ) )
217 {
218 if ( charge > 0 ) aParticleName += "+";
219 else aParticleName += "-";
220 }
221 else
222 {
223 if ( charge > 0 ) aParticleName = "proton";
224 else aParticleName = "anti_proton";
225 }
226
227 if ( msgFlag )
228 {
229 cout << "Charge: " << charge << endl;
230 cout << "Particle: " << aParticleName << endl;
231 }
232
233 ExtSteppingAction* extSteppingAction;
234 extSteppingAction = myExtTrack->GetStepAction();
236
237
238 extSteppingAction->
Reset();
241 bool m_trackstatus = false;
242 int trk_startpart = 0;
243 while ( !m_trackstatus )
244 {
245
246 trk_startpart++;
247 if ( trk_startpart > 20 )
248 {
249 cout << "-------has modified more than 20 times---------" << endl;
250 break;
251 }
252 if ( myExtTrack->Set( position,
momentum, error, aParticleName, pathInMDC,
253 tofInMdc ) )
254 {
255 myExtTrack->TrackExtrapotation();
257 m_trackstatus = extSteppingAction->
TrackStop();
258 }
259 else m_trackstatus = true;
260 }
261 }
262 }
263
265
266 if ( msgFlag ) cout << "will add aExtTrack!" << endl;
267 if ( aExtTrackCol )
268 {
269 if ( aExtTrack ) aExtTrackCol->add( aExtTrack );
270 else if ( msgFlag ) cout << "No aExtTrack!" << endl;
271 }
272 else
273 {
274 if ( msgFlag ) cout << "No aExtTrackCol!" << endl;
275 }
276 if ( msgFlag ) cout << "add a aExtTrack!" << endl;
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295 }
296 }
297
298
299
300
301
302
303
304
305
306
307
308 SmartIF<IDataManagerSvc> dataManSvc( eventSvc() );
309
310
311 DataObject* extTrackCol;
312 eventSvc()->findObject( "/Event/Recon/RecExtTrackCol", extTrackCol );
313 if ( extTrackCol != NULL )
314 {
315 dataManSvc->clearSubTree( "/Event/Recon/RecExtTrackCol" );
316 eventSvc()->unregisterObject( "/Event/Recon/RecExtTrackCol" );
317 }
318
319
320
321 StatusCode sc = eventSvc()->registerObject( "/Event/Recon/RecExtTrackCol", aExtTrackCol );
322 if ( sc != StatusCode::SUCCESS )
323 {
324 log << MSG::FATAL << "Could not register RecExtTrackCol in TDS!" << endmsg;
325 return ( StatusCode::FAILURE );
326 }
327
328
329
330 SmartDataPtr<RecExtTrackCol> aExtTrkCol( eventSvc(), "/Event/Recon/RecExtTrackCol" );
331 if ( !aExtTrkCol )
332 {
333 log << MSG::FATAL << "Can't find RecExtTrackCol in TDS!" << endmsg;
334 return ( StatusCode::FAILURE );
335 }
336
337 RecExtTrackCol::iterator iterOfExtTrk;
338 int j = 1;
339
340 for ( iterOfExtTrk = aExtTrkCol->begin(); iterOfExtTrk != aExtTrkCol->end(); iterOfExtTrk++ )
341 {
342 if ( myResultFlag )
343 {
344 for ( int i = 0; i < 5; i++ )
345 {
346
347 cout << "##########track" << j << ": "
348 << "(" << i << ")" << endl;
349 cout << "******TOF1:******" << endl;
350 cout << "VolumeName: " << ( *iterOfExtTrk )->tof1VolumeName( i ) << "\t"
351 << "VolumeNumber: " << ( *iterOfExtTrk )->tof1VolumeNumber( i ) << "\t" << endl
352 << "Position: " << ( *iterOfExtTrk )->tof1Position( i ) << "\t"
353 << "Momentum: " << ( *iterOfExtTrk )->tof1Momentum( i ) << "\t" << endl
354 << "Error matrix: " << ( *iterOfExtTrk )->tof1ErrorMatrix( i )
355 << "Error z: " << ( *iterOfExtTrk )->tof1PosSigmaAlongZ( i ) << "\t"
356 << "Error Tz: " << ( *iterOfExtTrk )->tof1PosSigmaAlongT( i ) << "\t"
357 << "Error x: " << ( *iterOfExtTrk )->tof1PosSigmaAlongX( i ) << "\t"
358 << "Error y: " << ( *iterOfExtTrk )->tof1PosSigmaAlongY( i ) << endl
359 << "Tof: " << ( *iterOfExtTrk )->tof1( i ) << "\t"
360 << "PathOF: " << ( *iterOfExtTrk )->tof1Path( i ) << endl;
361 cout << "******TOF2:******" << endl;
362 cout << "VolumeName: " << ( *iterOfExtTrk )->tof2VolumeName( i ) << "\t"
363 << "VolumeNumber: " << ( *iterOfExtTrk )->tof2VolumeNumber( i ) << "\t" << endl
364 << "Position: " << ( *iterOfExtTrk )->tof2Position( i ) << "\t"
365 << "Momentum: " << ( *iterOfExtTrk )->tof2Momentum( i ) << "\t" << endl
366 << "Error matrix: " << ( *iterOfExtTrk )->tof2ErrorMatrix( i )
367 << "Error z: " << ( *iterOfExtTrk )->tof2PosSigmaAlongZ( i ) << "\t"
368 << "Error Tz: " << ( *iterOfExtTrk )->tof2PosSigmaAlongT( i ) << "\t"
369 << "Error x: " << ( *iterOfExtTrk )->tof2PosSigmaAlongX( i ) << "\t"
370 << "Error y: " << ( *iterOfExtTrk )->tof2PosSigmaAlongY( i ) << endl
371 << "Tof: " << ( *iterOfExtTrk )->tof2( i ) << "\t"
372 << "PathOF: " << ( *iterOfExtTrk )->tof2Path( i ) << endl;
373
374
375 cout << "******EMC:******" << endl
376 << "VolumeName: " << ( *iterOfExtTrk )->emcVolumeName( i ) << "\t"
377 << "VolumeNumber: " << ( *iterOfExtTrk )->emcVolumeNumber( i ) << "\t" << endl
378 << "Position: " << ( *iterOfExtTrk )->emcPosition( i ) << "\t"
379 << "Momentum: " << ( *iterOfExtTrk )->emcMomentum( i ) << "\t" << endl
380 << "Error matrix: " << ( *iterOfExtTrk )->emcErrorMatrix( i )
381 << "Error theta: " << ( *iterOfExtTrk )->emcPosSigmaAlongTheta( i ) << "\t"
382 << "Error phi: " << ( *iterOfExtTrk )->emcPosSigmaAlongPhi( i ) << "\t"
383 << "EMC path: " << ( *iterOfExtTrk )->emcPath( i ) << endl;
384
385
386 cout << "******MUC:******" << endl
387 << "VolumeName: " << ( *iterOfExtTrk )->mucVolumeName( i ) << "\t"
388 << "VolumeNumber: " << ( *iterOfExtTrk )->mucVolumeNumber( i ) << endl
389 << "Position: " << ( *iterOfExtTrk )->mucPosition( i ) << "\t"
390 << "Momentum: " << ( *iterOfExtTrk )->mucMomentum( i ) << "\t" << endl
391 << "Error matrix: " << ( *iterOfExtTrk )->mucErrorMatrix( i )
392 << "Error z: " << ( *iterOfExtTrk )->mucPosSigmaAlongZ( i ) << "\t"
393 << "Error Tz: " << ( *iterOfExtTrk )->mucPosSigmaAlongT( i ) << "\t"
394 << "Error x: " << ( *iterOfExtTrk )->mucPosSigmaAlongX( i ) << "\t"
395 << "Error y: " << ( *iterOfExtTrk )->mucPosSigmaAlongY( i ) << endl;
396
397 cout << "*******MUC KALMANFILTER***********" << endl;
398 cout << "Chisq is " << ( *iterOfExtTrk )->MucKalchi2( i ) << endl;
399 cout << "Nfit is " << ( *iterOfExtTrk )->MucKaldof( i ) << endl;
400 cout << "chiL " << ( *iterOfExtTrk )->MucKalchi2() << endl;
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422 }
423 }
424 j++;
425
426 }
427
428 if ( msgFlag ) cout << "****************** End a event! ****************" << endl << endl;
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556 return StatusCode::SUCCESS;
557}
**********INTEGER nmxhep !maximum number of particles DOUBLE PRECISION vhep INTEGER jdahep COMMON hepevt $ !serial number $ !number of particles $ !status code $ !particle ident KF $ !parent particles $ !childreen particles $ !four momentum
ObjectVector< RecExtTrack > RecExtTrackCol
void SetTrackId(int trackId)
void SetParType(int aParType=2)
double GetParticleCharge() const
double GetTrackLength() const
bool SetMdcKalTrkCol(RecMdcKalTrackCol *aPointer)
bool SetMdcRecTrkCol(RecMdcTrackCol *aPointer)
const Hep3Vector GetPosition() const
const HepSymMatrix GetErrorMatrix() const
const Hep3Vector GetMomentum() const
void SetMsgFlag(bool aFlag)
void SetExtTrackPointer(RecExtTrack *aExtTrack)
void InfmodMuc(Hep3Vector &pos, Hep3Vector &mom, HepSymMatrix &err)
void Set_which_tof_version(int version)
void SetMucDigiColPointer(MucDigiCol *rawdigicol)