BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
BesSensitiveManager.cc
Go to the documentation of this file.
1//---------------------------------------------------------------------------//
2//////// BOOST --- BESIII Object_Oriented Simulation Tool //
3////////---------------------------------------------------------------------------//
4////////Description:
5// BesSensitiveManager is the magical piece of software that
6// helps a class that inherits from BesSenstiveDetector
7// complete all of its actions.
8// In addition, BesSensitiveManager handles the BesTruthTrack,BesTruthVertex lists.
9
10// Author : Dengzy
11// Created: Aug, 2004
12// Modified:
13// Comment:
14//// //// $Id: BesSensitiveManager.cc
15
16#include "TruSim/BesSensitiveManager.hh"
17#include "TruSim/BesTruthTrack.hh"
18#include "TruSim/BesTruthVertex.hh"
19
20#include "G4Event.hh"
21#include "G4Track.hh"
22#include "G4TrackingManager.hh"
23#include "G4VProcess.hh"
24
25#include "HepMC/GenEvent.h"
26
27#include "GaudiKernel/Bootstrap.h"
28#include "GaudiKernel/IDataProviderSvc.h"
29#include "GaudiKernel/IMessageSvc.h"
30#include "GaudiKernel/ISvcLocator.h"
31#include "GaudiKernel/MsgStream.h"
32
33#include "GaudiKernel/SmartDataPtr.h"
34#include "GeneratorObject/McGenEvent.h"
35
37
38// BeginOfEvent
39//
40// Allocate lists, and tell clients
41//
42void BesSensitiveManager::BeginOfTruthEvent( const G4Event* evt ) {
43 // Allocate our lists. We'll own these until EndOfEvent
44
45 m_trackList = new std::vector<BesTruthTrack*>;
46 m_vertexList = new std::vector<BesTruthVertex*>;
47
48 SetVertex0( evt );
49
50 m_count = 0;
52 m_count += m_trackList->size();
53
54 // Tell clients
55 iter = clients.begin();
56 iter_end = clients.end();
57 while ( iter != iter_end )
58 {
59 ( *iter )->BeginOfTruthEvent( evt );
60 iter++;
61 }
62}
63
64void BesSensitiveManager::SetVertex0( const G4Event* anEvent ) {
65 // G4int n_vertex = anEvent->GetNumberOfPrimaryVertex();
66 for ( G4int i = 0; i < 1; i++ )
67 {
68 G4PrimaryVertex* primaryVertex = anEvent->GetPrimaryVertex( i );
69 m_pos0 = primaryVertex->GetPosition();
70 m_t0 = primaryVertex->GetT0();
71 }
72 if ( m_logLevel <= 4 ) G4cout << "pos0:" << m_pos0 << " t0:" << m_t0 << G4endl;
73}
74
75G4int BesSensitiveManager::CheckType( const HepMC::GenEvent* hepmcevt ) {
76 G4int flag = 0;
77 for ( HepMC::GenEvent::vertex_const_iterator vitr = hepmcevt->vertices_begin();
78 vitr != hepmcevt->vertices_end(); ++vitr )
79 { // loop for vertex ...
80 for ( HepMC::GenVertex::particle_iterator pitr =
81 ( *vitr )->particles_begin( HepMC::children );
82 pitr != ( *vitr )->particles_end( HepMC::children ); ++pitr )
83 {
84 if ( ( *pitr )->end_vertex() )
85 {
86 flag = 1;
87 break;
88 }
89 }
90 if ( flag ) break;
91 }
92 if ( m_logLevel <= 4 )
93 {
94 if ( flag == 0 ) G4cout << G4endl << "generator is GENBES!" << G4endl;
95 else G4cout << G4endl << "generator is not GENBES!" << G4endl;
96 }
97 return flag;
98}
99
101 IDataProviderSvc* p_evtSvc = 0;
102 ISvcLocator* svcLocator = Gaudi::svcLocator();
103 StatusCode sc = svcLocator->service( "EventDataSvc", p_evtSvc );
104 if ( sc.isFailure() )
105 std::cout << "BesHepMCInterface could not access EventDataSvc!!" << std::endl;
106
107 SmartDataPtr<McGenEventCol> mcCollptr( p_evtSvc, "/Event/Gen" );
108
109 if ( mcCollptr == 0 ) std::cout << "no McGenEventCollection found." << std::endl;
110
111 else
112 {
113 McGenEventCol::const_iterator it = mcCollptr->begin();
114 McGenEvent* mcEvent = (McGenEvent*)( *it );
115 m_hepmcevt = mcEvent->getGenEvt();
116 G4int typeFlag = CheckType( m_hepmcevt );
117
118 for ( HepMC::GenEvent::vertex_const_iterator vitr = m_hepmcevt->vertices_begin();
119 vitr != m_hepmcevt->vertices_end(); ++vitr )
120 {
121 G4int barcodeVtx = ( *vitr )->barcode();
122 if ( m_logLevel <= 4 ) G4cout << G4endl << "barcodeVtx:" << barcodeVtx << " ";
123
124 G4LorentzVector xvtx( ( *vitr )->position().x(), ( *vitr )->position().y(),
125 ( *vitr )->position().z(), ( *vitr )->position().t() );
126 G4ThreeVector v( xvtx.x(), xvtx.y(), xvtx.z() );
127 BesTruthVertex* newVertex = new BesTruthVertex();
128 newVertex->SetPosition( v );
129 newVertex->SetTime( xvtx.t() * mm / c_light );
130 if ( m_logLevel <= 4 )
131 G4cout << "xyzt:" << xvtx.x() << " " << xvtx.y() << " " << xvtx.z() << " "
132 << xvtx.t() * mm / c_light << " ";
133 G4int nTrack = m_trackList->size();
134 BesTruthTrack* parentTrack = 0;
135 G4int parentTrackIndex = -99;
136 for ( int i = 0; i < nTrack; i++ )
137 {
138 parentTrack = ( *m_trackList )[i];
139 if ( parentTrack->GetBarcodeEndVtx() == barcodeVtx )
140 {
141 newVertex->SetParentTrack( parentTrack );
142 parentTrackIndex = parentTrack->GetIndex();
143 if ( m_logLevel <= 4 ) G4cout << "parentTrack:" << parentTrackIndex << " ";
144 parentTrack->SetTerminalVertex( newVertex );
145 // break;
146 }
147 }
148
149 G4int vtxFlag = 0;
150 G4int pOut = ( *vitr )->particles_out_size();
151 HepMC::GenVertex::particle_iterator pitr = ( *vitr )->particles_begin( HepMC::children );
152 G4int pdgcode = ( *pitr )->pdg_id();
153 if ( pOut == 1 && pdgcode == -11 && typeFlag == 1 ) vtxFlag = 1;
154
155 if ( vtxFlag == 0 )
156 {
157 m_vertexList->push_back( newVertex );
158 newVertex->SetIndex( m_vertexList->size() - 1 );
159 if ( m_logLevel <= 4 ) G4cout << "vindex:" << m_vertexList->size() - 1 << G4endl;
160
161 for ( HepMC::GenVertex::particle_iterator pitr =
162 ( *vitr )->particles_begin( HepMC::children );
163 pitr != ( *vitr )->particles_end( HepMC::children ); ++pitr )
164 {
165 G4LorentzVector p( ( *pitr )->momentum().x(), ( *pitr )->momentum().y(),
166 ( *pitr )->momentum().z(), ( *pitr )->momentum().t() );
167 G4LorentzVector pGeV( p.x() * GeV, p.y() * GeV, p.z() * GeV, p.t() * GeV );
168 G4int pdgcode = ( *pitr )->pdg_id();
169
170 BesTruthTrack* newTrack = new BesTruthTrack;
171 newTrack->SetP4( pGeV );
172 newTrack->SetPDGCode( pdgcode );
173 if ( m_logLevel <= 4 )
174 {
175 G4cout << "pdg:" << pdgcode << " ";
176 G4cout << "p:" << p.x() << " " << p.y() << " " << p.z() << " " << p.t() << " ";
177 G4double mass =
178 sqrt( p.t() * p.t() - p.x() * p.x() - p.y() * p.y() - p.z() * p.z() );
179 G4cout << mass << " ";
180 }
181 newTrack->SetPDGCharge( 99 );
182 newTrack->SetParticleName( "unknown" );
183 newTrack->SetVertex( newVertex );
184 newTrack->SetTerminalVertex( 0 );
185 newTrack->SetSource( "FromGenerator" );
186
187 G4int barcodeEndVtx = 0;
188 if ( ( *pitr )->end_vertex() )
189 {
190 barcodeEndVtx = ( *pitr )->end_vertex()->barcode();
191 if ( m_logLevel <= 4 ) G4cout << "endVtx:" << barcodeEndVtx << " ";
192 }
193 newTrack->SetBarcodeEndVtx( barcodeEndVtx );
194
195 m_trackList->push_back( newTrack );
196 newTrack->SetIndex( m_trackList->size() - 1 );
197 if ( m_logLevel <= 4 ) G4cout << "index:" << m_trackList->size() - 1 << " ";
198 // here, parentTrack->GetIndex can't be used,
199 // use parentTrackIndex instead
200 if ( parentTrackIndex >= 0 )
201 {
202 if ( m_logLevel <= 4 ) G4cout << "mother:" << parentTrackIndex;
203 ( *m_trackList )[parentTrackIndex]->AddDaughterIndex( m_trackList->size() - 1 );
204 }
205 if ( m_logLevel <= 4 ) G4cout << G4endl;
206 }
207 }
208 }
209 }
210}
211
212// EndOfEvent
213// Give lists to Event, and tell clients
214void BesSensitiveManager::EndOfTruthEvent( const G4Event* evt ) {
215 // Tell clients
216 iter = clients.begin();
217 iter_end = clients.end();
218 while ( iter != iter_end )
219 {
220 ( *iter )->EndOfTruthEvent( evt );
221 iter++;
222 }
223}
224
226 if ( m_trackList )
227 {
228 for ( size_t i = 0; i < m_trackList->size(); i++ ) delete ( *m_trackList )[i];
229 m_trackList->clear();
230 delete m_trackList;
231 }
232 if ( m_vertexList )
233 {
234 for ( size_t i = 0; i < m_vertexList->size(); i++ ) delete ( *m_vertexList )[i];
235 m_vertexList->clear();
236 delete m_vertexList;
237 }
238}
239
240void BesSensitiveManager::BeginOfTrack( const G4Track* track ) {
241 m_trackFlag = 0; // if m_trackFlag=1, this track is from generator
242
243 // Append our track in the parentage history
244 chain.push_back( FollowTrack( track ) );
245
246 // Get TruthTrack index
247 // int i = chain.size();
248
249 /*for(;;)
250 {
251 if(--i<0) G4cerr<<"::parents are corrupted"<<G4endl;
252 m_trackIndex = chain[i].trackIndex;
253 if (m_trackIndex != -1) break;
254 }*/
255
256 // Invoke clients
257 //
258 iter = clients.begin();
259 iter_end = clients.end();
260 while ( iter != iter_end )
261 {
262 ( *iter )->BeginOfTrack( track );
263 iter++;
264 }
265}
266void BesSensitiveManager::EndOfTrack( const G4Track* track,
267 G4TrackingManager* trackingManager ) {
268 if ( chain.back().savedByDefault == true )
269 {
270 BesTStats& stat = chain.back();
271 G4int endVtxFlag = 0;
272 if ( m_trackFlag == 1 )
273 {
274 BesTruthTrack* truthTrack = ( *m_trackList )[m_trackIndex];
275 if ( truthTrack->GetTerminalVertex() )
276 {
277 UpdateVertex( stat, track );
278 endVtxFlag = 1;
279 }
280 }
281 if ( endVtxFlag == 0 )
282 {
283 // Tracks saved to BesTruthTrack require additional work
284 G4StepPoint* finalStep = track->GetStep()->GetPostStepPoint();
285 G4StepStatus stepStatus = finalStep->GetStepStatus();
286 if ( track->GetNextVolume() != 0 ||
287 ( stepStatus != fGeomBoundary && stepStatus != fWorldBoundary ) )
288 {
289 if ( m_logLevel <= 4 ) G4cout << "Particle died. make a terminal vertex: ";
290 // Particle died. We always make a terminal vertex
291 const G4ThreeVector pos( finalStep->GetPosition() );
292 G4int vindex = m_vertexList->size();
293 if ( m_logLevel <= 4 ) G4cout << vindex << G4endl;
294 stat.vertices.push_back( vindex );
295 BesTruthVertex* newVertex = new BesTruthVertex();
296 newVertex->SetPosition( pos );
297 newVertex->SetTime( finalStep->GetGlobalTime() );
298 if ( m_trackFlag == 1 ) newVertex->SetParentTrack( ( *m_trackList )[m_trackIndex] );
299 else newVertex->SetParentTrack( m_trackList->back() );
300 newVertex->SetTerminal( true );
301 newVertex->SetIndex( vindex );
302
303 // set minDaughter index equal to m_count
304 newVertex->SetMinDau( m_count );
305
306 // Get how many decayed daughters this track has, if no, 0 is set.
307 G4TrackVector* trackVector = trackingManager->GimmeSecondaries();
308 G4int nSecon = trackVector->size();
309 G4Track* seconTrack;
310 G4int nDau = 0;
311 if ( nSecon > 0 )
312 {
313 for ( G4int i = 0; i < nSecon; i++ )
314 {
315 seconTrack = ( *trackVector )[i];
316 G4String processName = seconTrack->GetCreatorProcess()->GetProcessName();
317 if ( processName == "Decay" ) nDau++;
318 }
319 }
320 m_vertexList->push_back( newVertex );
321
322 m_count += nDau;
323
324 // Give this terminal vertex to the track
325 //(*m_trackList)[stat.trackIndex]->SetTerminalVertex( m_vertexList->back() );
326 // for particles from generator,
327 // m_trackList->back() may not be current track.
328
329 if ( m_trackFlag == 1 )
330 ( *m_trackList )[m_trackIndex]->SetTerminalVertex( m_vertexList->back() );
331 else m_trackList->back()->SetTerminalVertex( m_vertexList->back() );
332 }
333 }
334 }
335 // Invoke clients
336 iter = clients.begin();
337 iter_end = clients.end();
338 while ( iter != iter_end )
339 {
340 ( *iter )->EndOfTrack( track );
341 iter++;
342 }
343}
344
345void BesSensitiveManager::UpdateVertex( BesTStats stat, const G4Track* track ) {
346 BesTruthTrack* truthTrack = ( *m_trackList )[m_trackIndex];
347 G4int terminalIndex = truthTrack->GetTerminalVertex()->GetIndex();
348 if ( m_logLevel <= 4 ) G4cout << "updateVertex:" << terminalIndex << " ";
349 BesTruthVertex* vertex = ( *m_vertexList )[terminalIndex];
350 G4StepPoint* finalStep = track->GetStep()->GetPostStepPoint();
351 const G4ThreeVector pos( finalStep->GetPosition() );
352 G4double time = finalStep->GetGlobalTime();
353 if ( m_logLevel <= 4 )
354 G4cout << "newPos:" << pos << " "
355 << "newTime:" << time << G4endl;
356 vertex->SetPosition( pos );
357 vertex->SetTime( time );
358 vertex->SetTerminal( true );
359 // G4int vindex = m_vertexList->size();
360 // stat.vertices.push_back(terminalIndex);
361}
362
363void BesSensitiveManager::MakeNewTrack( BesTStats& stat, const G4Track* track ) {
364 if ( stat.originVertex < 0 && chain.size() > 0 )
365 {
366 if ( m_logLevel <= 4 ) G4cout << "MakeNewTrack for decayed particles,";
367 // for decayed particles, there may already be a BesTruthVertex that is suitable for this
368 // track. If so, it's always the terminal vertex of its immediate parent( chain.back() ).
369
370 G4int parentVstat = chain.back().vertices.size();
371 while ( --parentVstat >= 0 )
372 {
373 G4int vindex = chain.back().vertices[parentVstat];
374
375 G4ThreeVector diff( ( *m_vertexList )[vindex]->GetPosition() );
376 diff = diff - track->GetPosition();
377 if ( diff.mag2() < 1E-9 )
378 {
379 stat.originVertex = vindex;
380 if ( m_logLevel <= 4 ) G4cout << "find a vertex:" << vindex;
381 ( *m_vertexList )[vindex]->AddCurrentDau();
382 break;
383 }
384 }
385 }
386
387 if ( stat.originVertex < 0 && chain.size() == 0 )
388 {
389 // for primary track, check if there is already a vertex suitable for it.
390 G4int nVertex = m_vertexList->size();
391 for ( G4int i = 0; i < nVertex; i++ )
392 {
393 G4ThreeVector diff( ( *m_vertexList )[i]->GetPosition() );
394 diff = diff - track->GetPosition();
395 if ( diff.mag2() < 1E-9 )
396 {
397 stat.originVertex = i;
398 if ( m_logLevel <= 4 )
399 G4cout << "MakeNewTrack for primary particles,find a vertex:" << i;
400 break;
401 }
402 }
403 }
404
405 if ( stat.originVertex < 0 )
406 {
407 if ( m_logLevel <= 4 )
408 G4cout << "MakeNewTrack for primary particles,make new vertex:" << m_vertexList->size();
409 // it's a primary track(there's no vertex suitable for it)
410 // Make a new BesTruthVertex
411 const G4ThreeVector v( track->GetPosition() );
412
413 stat.originVertex = m_vertexList->size();
414
415 BesTruthVertex* newVertex = new BesTruthVertex();
416 newVertex->SetPosition( v );
417 newVertex->SetTime( track->GetGlobalTime() );
418
419 // if (chain.size() > 0) {
420 // G4int trackIndex = -1;
421 // G4int i = chain.size();
422 // while(--i>=0 && trackIndex < 0) trackIndex = chain[i].trackIndex;
423 // newVertex->SetParentTrack( trackIndex < 0 ? 0 : (*m_trackList)[trackIndex] );
424 // }
425
426 newVertex->SetParentTrack( 0 );
427 newVertex->SetTerminal( false );
428 newVertex->SetIndex( stat.originVertex );
429 if ( track->GetCreatorProcess() )
430 newVertex->SetProcessName( track->GetCreatorProcess()->GetProcessName() );
431 else newVertex->SetProcessName( "generator" );
432
433 m_vertexList->push_back( newVertex );
434 }
435
436 // Now, finally make our new BesTruthTrack
437 // We'll leave the assignment of terminalVertex until
438 // we know what happens to this track
439 BesTruthTrack* newTrack = new BesTruthTrack();
440 newTrack->SetP4( stat.p4 );
441 newTrack->SetPDGCode( track->GetDefinition()->GetPDGEncoding() );
442 newTrack->SetPDGCharge( track->GetDefinition()->GetPDGCharge() );
443 newTrack->SetParticleName( track->GetDefinition()->GetParticleName() );
444 newTrack->SetSource( "FromG4" );
445 BesTruthVertex* vertex = ( *m_vertexList )[stat.originVertex];
446 newTrack->SetVertex( vertex );
447
448 if ( track->GetParentID() == 0 )
449 {
450 stat.trackIndex = m_count;
451 m_count++;
452 }
453 else stat.trackIndex = vertex->GetMinDau() + vertex->GetCurrentDau() - 1;
454
455 newTrack->SetIndex( stat.trackIndex );
456 m_trackIndex = stat.trackIndex;
457 if ( m_logLevel <= 4 ) G4cout << " m_trackIndex:" << m_trackIndex << G4endl;
458
459 newTrack->SetG4TrackId( track->GetTrackID() );
460 m_trackList->push_back( newTrack );
461 // tell the parent track its daughter track index
462 BesTruthTrack* parent = newTrack->GetVertex()->GetParentTrack();
463 if ( parent )
464 {
465 parent->AddDaughterIndex( stat.trackIndex );
466 if ( m_logLevel <= 4 ) G4cout << "add this daughter to:" << parent->GetIndex() << G4endl;
467 }
468}
469
470//
471// FollowTrack (protected)
472//
473// Build a new track geneology stat record, and update
474// the trackList, and vertexList appropriately.
475//
476
478 // Some default stats for this track
479 BesTStats stat( track->GetTrackID(),
480 HepLorentzVector( track->GetMomentum(), track->GetTotalEnergy() ),
481 track->GetGlobalTime() );
482
483 // Check immediate parent
484 G4int parentId = track->GetParentID();
485 G4int pdg = track->GetDefinition()->GetPDGEncoding();
486 G4String particleName = track->GetDefinition()->GetParticleName();
487 G4ThreeVector trackPos = track->GetPosition();
488 G4double diffT = m_t0 - track->GetGlobalTime();
489 G4double diffPos = ( m_pos0 - trackPos ).mag2();
490
491 if ( parentId == 0 )
492 {
493 if ( m_logLevel <= 4 )
494 {
495 G4cout << G4endl;
496 G4cout << "trackId:" << track->GetTrackID() << " ";
497 G4cout << "parentId:" << parentId << " ";
498 G4cout << "pdg:" << pdg << " ";
499 G4cout << "name:" << particleName << " ";
500 G4cout << "timeDiff:" << diffT << " ";
501 G4cout << "posDiff:" << diffPos << G4endl;
502 }
503
504 // Primary particle: wipe decay chain
505 chain.clear();
506 // Always save
507 stat.savedByDefault = true;
508 // Make TruthTrack
509 if ( m_hepmcevt == 0 ) MakeNewTrack( stat, track );
510 else
511 {
512 UpdatePrimaryTrack( track );
513 m_trackFlag = 1;
514 }
515 return stat;
516 }
517
518 // Not primary particle: trim down chain until
519 // we uncover the parent. The parent must be there!
520 for ( ;; )
521 {
522 if ( chain.back().G4index == parentId ) break;
523 chain.pop_back();
524 }
525
526 // This track is a candidate for saving by default
527 // only if its parent was saved by default
528 if ( chain.back().savedByDefault )
529 {
530 // There are three ways particles are saved by default:
531 // 1. if they are a primary particle
532 // 2. if they are the result of a decay
533 //
534 G4String processName = track->GetCreatorProcess()->GetProcessName();
535 if ( processName == "Decay" )
536 {
537 if ( m_logLevel <= 4 )
538 {
539 G4cout << G4endl;
540 G4cout << "trackId: " << track->GetTrackID() << " ";
541 G4cout << "parentId: " << parentId << " ";
542 G4cout << "pdg: " << pdg << " ";
543 G4cout << "pname: " << particleName << G4endl;
544 }
545 stat.savedByDefault = true;
546
547 if ( CheckDecayTrack( track ) ) m_trackFlag = 1;
548 else MakeNewTrack( stat, track );
549 return stat;
550 }
551 }
552
553 // now this track will not be saved as BesTruthTrack
554 stat.savedByDefault = false;
555 return stat;
556}
557
558G4bool BesSensitiveManager::CheckDecayTrack( const G4Track* track ) {
559 G4int flag = 0;
560 G4int trackID = track->GetTrackID();
561 G4int parentID = track->GetParentID();
562 G4int pdgcode = track->GetDefinition()->GetPDGEncoding();
563 G4ThreeVector p3 = track->GetMomentum();
564 if ( m_logLevel <= 4 )
565 G4cout << "CheckDecayTrack p3: " << p3 << " " << track->GetTotalEnergy() << G4endl;
566
567 // HepLorentzVector p4(track->GetMomentum(), track->GetTotalEnergy());
568
569 BesTruthTrack* truthTrack = 0;
570 G4int nTrack = m_trackList->size();
571 G4int parentTrackIndex = -99;
572 G4int terminalVertexIndex = -99;
573 BesTruthTrack* pTrack;
574 for ( int i = 0; i < nTrack; i++ )
575 {
576 truthTrack = ( *m_trackList )[i];
577 if ( truthTrack->GetG4TrackId() == parentID )
578 {
579 // parentTrackIndex = i;
580 parentTrackIndex = truthTrack->GetIndex();
581 if ( truthTrack->GetTerminalVertex() )
582 {
583 terminalVertexIndex = truthTrack->GetTerminalVertex()->GetIndex();
584 pTrack = truthTrack;
585 if ( m_logLevel <= 4 )
586 {
587 G4cout << "parentTrackIndex:" << parentTrackIndex << " "
588 << "parent terminate at vertex: " << terminalVertexIndex << G4endl;
589 if ( parentTrackIndex != i ) G4cout << "i: " << i << std::endl;
590 }
591 break;
592 }
593 }
594 }
595 if ( parentTrackIndex == -99 || terminalVertexIndex == -99 )
596 {
597 G4cout << "MatchDecayError!" << G4endl;
598 // return false;
599 exit( 1 );
600 }
601
602 // match decayed track with p3
603 /*G4bool matchDauFlag=false;
604 if(terminalVertexIndex>0)
605 matchDauFlag = MatchDaughterTrack(track);
606 if(matchDauFlag)
607 return true;*/
608
609 // match decayed track with vertex index
610 G4double minDiffP = 1e99;
611 G4int truthI = -9;
612 /*for(int i=0;i<nTrack;i++)
613 {
614 truthTrack = (*m_trackList)[i];
615 G4String source = truthTrack->GetSource();
616 G4int pdgcode_tru = truthTrack->GetPDGCode();
617 if(pdgcode_tru==-22) pdgcode_tru = 22;
618 if(truthTrack->GetVertex()->GetIndex() == terminalVertexIndex &&
619 pdgcode_tru == pdgcode &&source=="FromGenerator"&&truthTrack->NotFound())
620 {
621 HepLorentzVector tp4 = truthTrack->GetP4();
622 G4ThreeVector tp3(tp4.x(), tp4.y(), tp4.z());
623 G4double diffP = (p3-tp3).mag2();
624 if(m_logLevel<=4)
625 G4cout<<"diffP: "<<diffP<<G4endl;
626 if(diffP<minDiffP )
627 { minDiffP = diffP; truthI = i; }
628 }
629 }*/
630
631 /*if(truthI!=-9)
632 {
633 if(m_logLevel<=4)
634 G4cout<<"MatchDecayedTrackWithVertexIndex, trackIndex:"<<truthI<<G4endl;
635 m_trackIndex = truthI;
636 truthTrack=(*m_trackList)[truthI];
637 //truthTrack->SetP4(p4);
638 truthTrack->SetPDGCharge(track->GetDefinition()->GetPDGCharge());
639 truthTrack->SetParticleName(track->GetDefinition()->GetParticleName());
640 truthTrack->SetG4TrackId(track->GetTrackID());
641 truthTrack->Found();
642 G4int size = truthTrack->GetDaughterIndexes().size();
643 if(size>0)
644 {
645 G4int minDau = (truthTrack->GetDaughterIndexes())[0];
646 G4int maxDau = (truthTrack->GetDaughterIndexes())[size-1];
647 if(m_logLevel<=4)
648 G4cout<<"daughters: "<<minDau<<" "<<maxDau<<G4endl;
649 }
650 else
651 {
652 if(m_logLevel<=4)
653 G4cout<<G4endl;
654 }
655 return true;
656 }*/ //match decay track with vertex index
657
658 // match decay track
659
660 if ( m_logLevel <= 4 )
661 std::cout << "chain.back().vertices.size(): " << chain.back().vertices.size() << std::endl;
662 // if particle is from generator, chain.back().vertices.size()=0;
663 // if particle is not from generator, but decayed during flight in Geant4,
664 // chain.back().vertices.size()=1;
665 if ( chain.back().vertices.size() < 1 )
666 {
667 if ( m_logLevel <= 4 ) std::cout << "trackList size: " << m_trackList->size() << std::endl;
668 std::vector<int>* vDau = new std::vector<int>;
669 GetDaughterVertexes( pTrack, vDau );
670 G4int sizev = vDau->size();
671 if ( sizev > 0 )
672 {
673 for ( int i = 0; i < nTrack; i++ )
674 {
675 truthTrack = ( *m_trackList )[i];
676 G4int vIndex = truthTrack->GetVertex()->GetIndex();
677 G4int pdgT = truthTrack->GetPDGCode();
678 if ( pdgT == -22 ) pdgT = 22;
679 if ( pdgT == pdgcode )
680 {
681 G4bool matchFlag = MatchVertex( vIndex, vDau );
682 if ( matchFlag )
683 {
684 HepLorentzVector tp4 = truthTrack->GetP4();
685 G4ThreeVector tp3( tp4.x(), tp4.y(), tp4.z() );
686 G4double diffP = ( p3 - tp3 ).mag2();
687 if ( m_logLevel <= 4 )
688 {
689 G4cout << "index: " << truthTrack->GetIndex() << "tp3: " << tp3 << G4endl;
690 G4cout << "diffP: " << diffP << G4endl;
691 }
692 if ( diffP < minDiffP )
693 {
694 minDiffP = diffP;
695 truthI = i;
696 if ( m_logLevel <= 4 ) G4cout << "truthI: " << i << G4endl;
697 }
698 }
699 }
700 }
701 if ( vDau ) delete vDau;
702 }
703 }
704
705 if ( truthI != -9 )
706 {
707 m_trackIndex = truthI;
708 if ( m_logLevel <= 4 )
709 {
710 G4cout << "MatchDecayedTrackWithTrueMother" << G4endl;
711 G4cout << "MatchWithTrueMother m_trackIndex: " << m_trackIndex << G4endl;
712 if ( minDiffP > 1e-9 ) G4cout << "large minDiffP: " << minDiffP << G4endl;
713 }
714 truthTrack = ( *m_trackList )[truthI];
715 G4double mass = truthTrack->GetP4().m();
716 G4double E = sqrt( mass * mass + p3.x() * p3.x() + p3.y() * p3.y() + p3.z() * p3.z() );
717 truthTrack->GetP4().setX( p3.x() );
718 truthTrack->GetP4().setY( p3.y() );
719 truthTrack->GetP4().setZ( p3.z() );
720 truthTrack->GetP4().setE( E );
721 HepLorentzVector p4 = truthTrack->GetP4();
722 if ( m_logLevel <= 4 )
723 {
724 G4cout << "primary p: " << p4.x() << " " << p4.y() << " " << p4.z() << " " << p4.m()
725 << G4endl;
726 }
727 truthTrack->SetPDGCharge( track->GetDefinition()->GetPDGCharge() );
728 truthTrack->SetParticleName( track->GetDefinition()->GetParticleName() );
729 truthTrack->SetG4TrackId( track->GetTrackID() );
730 truthTrack->Found();
731 // truthTrack->GetVertex()->SetPosition(track->GetPosition());
732 // truthTrack->GetVertex()->SetTime(track->GetGlobalTime());
733 return true;
734 }
735 return false;
736}
737
739 std::vector<int>* vDau ) {
740 G4int size = pTrack->GetDaughterIndexes().size();
741 if ( size > 0 )
742 {
743 G4int minDau = ( pTrack->GetDaughterIndexes() )[0];
744 G4int maxDau = ( pTrack->GetDaughterIndexes() )[size - 1];
745 // note! here, dau<=maxDau, not dau<maxDau
746 for ( G4int dau = minDau; dau <= maxDau; dau++ )
747 {
748 if ( dau < m_trackList->size() )
749 {
750 BesTruthTrack* truthTrack = ( *m_trackList )[dau];
751 if ( truthTrack->GetVertex() )
752 {
753 vDau->push_back( truthTrack->GetVertex()->GetIndex() );
754 GetDaughterVertexes( truthTrack, vDau );
755 }
756 }
757 }
758 }
759}
760
761G4bool BesSensitiveManager::MatchVertex( G4int vIndex, std::vector<int>* vDau ) {
762 G4int size = vDau->size();
763 if ( size > 0 )
764 {
765 for ( G4int i = 0; i < size; i++ )
766 {
767 if ( vIndex == ( *vDau )[i] ) return true;
768 }
769 }
770 return false;
771}
772
773G4bool BesSensitiveManager::MatchDaughterTrack( const G4Track* track ) {
774 /*G4int flag=0;
775 G4int pdgcode = track->GetDefinition()->GetPDGEncoding();
776 G4ThreeVector p = track->GetMomentum();
777 HepLorentzVector p4(track->GetMomentum(), track->GetTotalEnergy());
778 G4ThreeVector pos = track->GetPosition();
779 G4double time = track->GetGlobalTime();
780 BesTruthTrack* truthTrack=0;
781 G4int size = m_trackList->size();
782 if(size>0)
783 {
784 for(G4int i=0;i<size;i++)
785 {
786 truthTrack=(*m_trackList)[i];
787 G4String source = truthTrack->GetSource();
788 G4int pdgcode_tru = truthTrack->GetPDGCode();
789 if(pdgcode_tru==-22) pdgcode_tru = 22;
790 HepLorentzVector tp4 = truthTrack->GetP4();
791 G4ThreeVector tp3(tp4.x(), tp4.y(), tp4.z());
792 G4double diffP = (p-tp3).mag2();
793 if(source=="FromGenerator"&&pdgcode_tru==pdgcode&&diffP<1e-9&&truthTrack->NotFound())
794 {
795 m_trackIndex = i;
796 //truthTrack->SetP4(p4);
797 truthTrack->SetPDGCharge(track->GetDefinition()->GetPDGCharge());
798 truthTrack->SetParticleName(track->GetDefinition()->GetParticleName());
799 truthTrack->SetG4TrackId(track->GetTrackID());
800 truthTrack->Found();
801 //truthTrack->GetVertex()->SetPosition(pos);
802 //truthTrack->GetVertex()->SetTime(time);
803 flag=1;
804 if(m_logLevel<=4)
805 {
806 G4cout<<"MatchDecayedTrackWithP3!"<<"trackIndex:"<<m_trackIndex
807 <<" pdgcode:"<<pdgcode<<G4endl;
808 G4cout<<"parentIndex:"<<truthTrack->GetVertex()->GetParentTrack()->GetIndex()
809 <<" PDGCode:"<<truthTrack->GetVertex()->GetParentTrack()->GetPDGCode()<<G4endl;
810 }
811 return true;
812 }
813 }
814 }
815 if(flag!=1)
816 return false;*/
817 return true;
818}
819
820void BesSensitiveManager::UpdatePrimaryTrack( const G4Track* track ) {
821 if ( m_logLevel <= 4 )
822 {
823 G4cout << "UpdatePrimaryTrack! ";
824 G4cout << "position: " << track->GetPosition() << G4endl;
825 G4cout << "time: " << track->GetGlobalTime() << G4endl;
826 G4cout << "momentum: " << track->GetMomentum() << " " << track->GetTotalEnergy()
827 << G4endl;
828 }
829 G4int pdgcode = track->GetDefinition()->GetPDGEncoding();
830 G4ThreeVector p = track->GetMomentum();
831 // HepLorentzVector p4(track->GetMomentum(), track->GetTotalEnergy());
832 G4int nTrack = m_trackList->size();
833 BesTruthTrack* truthTrack;
834 G4int flag = 0;
835 G4double minDiffP = 1e99;
836 for ( int i = 0; i < nTrack; i++ )
837 {
838 truthTrack = ( *m_trackList )[i];
839 HepLorentzVector tp4 = truthTrack->GetP4();
840 G4ThreeVector tp3( tp4.x(), tp4.y(), tp4.z() );
841 G4double diffP = ( p - tp3 ).mag2();
842 G4int pdgT = truthTrack->GetPDGCode();
843 if ( pdgT == -22 ) pdgT = 22;
844 if ( pdgcode == pdgT && diffP < minDiffP ) minDiffP = diffP;
845 if ( pdgcode == pdgT && diffP < 1E-9 && truthTrack->NotFound() )
846 {
847 m_trackIndex = truthTrack->GetIndex();
848 if ( m_logLevel <= 4 ) G4cout << "m_trackIndex: " << m_trackIndex << " " << G4endl;
849 truthTrack->SetPDGCharge( track->GetDefinition()->GetPDGCharge() );
850 truthTrack->SetParticleName( track->GetDefinition()->GetParticleName() );
851 truthTrack->SetG4TrackId( track->GetTrackID() );
852 truthTrack->Found();
853 G4double mass = truthTrack->GetP4().m();
854 G4double E = sqrt( mass * mass + p.x() * p.x() + p.y() * p.y() + p.z() * p.z() );
855 truthTrack->GetP4().setX( p.x() );
856 truthTrack->GetP4().setY( p.y() );
857 truthTrack->GetP4().setZ( p.z() );
858 truthTrack->GetP4().setT( E );
859 if ( m_logLevel <= 4 )
860 {
861 HepLorentzVector p4 = truthTrack->GetP4();
862 G4cout << "primary p: " << p4.x() << " " << p4.y() << " " << p4.z() << " " << p4.m()
863 << G4endl;
864 }
865 G4int size = truthTrack->GetDaughterIndexes().size();
866 if ( size > 0 )
867 {
868 G4double minDau = ( truthTrack->GetDaughterIndexes() )[0];
869 G4double maxDau = ( truthTrack->GetDaughterIndexes() )[size - 1];
870 if ( m_logLevel <= 4 ) G4cout << "daughters: " << minDau << " " << maxDau << G4endl;
871 }
872 else
873 {
874 if ( m_logLevel <= 4 ) G4cout << G4endl;
875 }
876 flag = 1;
877 break;
878 }
879 }
880 if ( flag == 0 )
881 {
882 G4cout << "MatchError! parentID=0, but match no track in trackList" << G4endl;
883 G4cout << "pdgcode: " << pdgcode << " min p diff: " << minDiffP << G4endl;
884 exit( 1 );
885 }
886}
double mass
Double_t time
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
Definition KarLud.h:35
void EndOfTruthEvent(const G4Event *)
BesTStats FollowTrack(const G4Track *track)
void UpdatePrimaryTrack(const G4Track *)
void SetVertex0(const G4Event *)
G4bool MatchDaughterTrack(const G4Track *)
void MakeNewTrack(BesTStats &stat, const G4Track *track)
void BeginOfTrack(const G4Track *track)
void UpdateVertex(BesTStats, const G4Track *)
void EndOfTrack(const G4Track *track, G4TrackingManager *)
void BeginOfTruthEvent(const G4Event *)
G4bool MatchVertex(G4int vIndex, std::vector< int > *vDau)
void GetDaughterVertexes(BesTruthTrack *pTrack, std::vector< int > *vDau)
G4bool CheckDecayTrack(const G4Track *)
G4int CheckType(const HepMC::GenEvent *hepmcevt)
GenEvent * getGenEvt() const