BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
BesSensitiveManager Class Reference

#include <BesSensitiveManager.hh>

Public Member Functions

 BesSensitiveManager ()
 ~BesSensitiveManager ()
void AddSensitiveDetector (BesSensitiveDetector *detector)
G4int GetCurrentTrackIndex () const
std::vector< BesTruthTrack * > * GetTrackList ()
std::vector< BesTruthVertex * > * GetVertexList ()
void BeginOfTruthEvent (const G4Event *)
void EndOfTruthEvent (const G4Event *)
G4int CheckType (const HepMC::GenEvent *hepmcevt)
void SaveParticlesFromGenerator ()
void SetVertex0 (const G4Event *)
void UpdatePrimaryTrack (const G4Track *)
G4bool CheckDecayTrack (const G4Track *)
void UpdateVertex (BesTStats, const G4Track *)
G4bool MatchDaughterTrack (const G4Track *)
void GetDaughterVertexes (BesTruthTrack *pTrack, std::vector< int > *vDau)
G4bool MatchVertex (G4int vIndex, std::vector< int > *vDau)
void BeginOfTrack (const G4Track *track)
void EndOfTrack (const G4Track *track, G4TrackingManager *)
G4int GetNumberTracks () const
G4int GetNumberVertices () const
void ClearEvent ()
void SetLogLevel (G4int level)
 BesSensitiveManager ()
 ~BesSensitiveManager ()
void AddSensitiveDetector (BesSensitiveDetector *detector)
G4int GetCurrentTrackIndex () const
std::vector< BesTruthTrack * > * GetTrackList ()
std::vector< BesTruthVertex * > * GetVertexList ()
void BeginOfTruthEvent (const G4Event *)
void EndOfTruthEvent (const G4Event *)
G4int CheckType (const HepMC::GenEvent *hepmcevt)
void SaveParticlesFromGenerator ()
void SetVertex0 (const G4Event *)
void UpdatePrimaryTrack (const G4Track *)
G4bool CheckDecayTrack (const G4Track *)
void UpdateVertex (BesTStats, const G4Track *)
G4bool MatchDaughterTrack (const G4Track *)
void GetDaughterVertexes (BesTruthTrack *pTrack, std::vector< int > *vDau)
G4bool MatchVertex (G4int vIndex, std::vector< int > *vDau)
void BeginOfTrack (const G4Track *track)
void EndOfTrack (const G4Track *track, G4TrackingManager *)
G4int GetNumberTracks () const
G4int GetNumberVertices () const
void ClearEvent ()
void SetLogLevel (G4int level)
 BesSensitiveManager ()
 ~BesSensitiveManager ()
void AddSensitiveDetector (BesSensitiveDetector *detector)
G4int GetCurrentTrackIndex () const
std::vector< BesTruthTrack * > * GetTrackList ()
std::vector< BesTruthVertex * > * GetVertexList ()
void BeginOfTruthEvent (const G4Event *)
void EndOfTruthEvent (const G4Event *)
G4int CheckType (const HepMC::GenEvent *hepmcevt)
void SaveParticlesFromGenerator ()
void SetVertex0 (const G4Event *)
void UpdatePrimaryTrack (const G4Track *)
G4bool CheckDecayTrack (const G4Track *)
void UpdateVertex (BesTStats, const G4Track *)
G4bool MatchDaughterTrack (const G4Track *)
void GetDaughterVertexes (BesTruthTrack *pTrack, std::vector< int > *vDau)
G4bool MatchVertex (G4int vIndex, std::vector< int > *vDau)
void BeginOfTrack (const G4Track *track)
void EndOfTrack (const G4Track *track, G4TrackingManager *)
G4int GetNumberTracks () const
G4int GetNumberVertices () const
void ClearEvent ()
void SetLogLevel (G4int level)

Static Public Member Functions

static BesSensitiveManagerGetSensitiveManager ()
static BesSensitiveManagerGetSensitiveManager ()
static BesSensitiveManagerGetSensitiveManager ()

Protected Member Functions

void MakeNewTrack (BesTStats &stat, const G4Track *track)
BesTStats FollowTrack (const G4Track *track)
void MakeNewTrack (BesTStats &stat, const G4Track *track)
BesTStats FollowTrack (const G4Track *track)
void MakeNewTrack (BesTStats &stat, const G4Track *track)
BesTStats FollowTrack (const G4Track *track)

Protected Attributes

std::vector< BesSensitiveDetector * >::iterator iter
std::vector< BesSensitiveDetector * >::iterator iter_end
G4int m_trackIndex
G4int m_trackFlag
std::vector< BesTruthTrack * > * m_trackList
std::vector< BesTruthVertex * > * m_vertexList
std::vector< BesSensitiveDetector * > clients
std::vector< BesTStatschain
G4int m_count
G4ThreeVector m_pos0
G4double m_t0
G4int m_logLevel
HepMC::GenEvent * m_hepmcevt

Static Protected Attributes

static BesSensitiveManagerm_sensitiveManager = 0

Detailed Description

Constructor & Destructor Documentation

◆ BesSensitiveManager() [1/3]

◆ ~BesSensitiveManager() [1/3]

BesSensitiveManager::~BesSensitiveManager ( )
inline

◆ BesSensitiveManager() [2/3]

BesSensitiveManager::BesSensitiveManager ( )
inline

Definition at line 77 of file InstallArea/x86_64-el9-gcc13-opt/include/TruSim/BesSensitiveManager.hh.

77 : m_trackIndex( -1 ), m_trackFlag( 0 ), m_count( 0 ) {
78 m_hepmcevt = 0;
79 if ( m_sensitiveManager ) G4cout << "BesSensitiveManager constructed twice." << G4endl;
80 m_sensitiveManager = this;
81 }

◆ ~BesSensitiveManager() [2/3]

BesSensitiveManager::~BesSensitiveManager ( )
inline

◆ BesSensitiveManager() [3/3]

BesSensitiveManager::BesSensitiveManager ( )
inline

Definition at line 77 of file Simulation/BOOST/TruSim/include/TruSim/BesSensitiveManager.hh.

77 : m_trackIndex( -1 ), m_trackFlag( 0 ), m_count( 0 ) {
78 m_hepmcevt = 0;
79 if ( m_sensitiveManager ) G4cout << "BesSensitiveManager constructed twice." << G4endl;
80 m_sensitiveManager = this;
81 }

◆ ~BesSensitiveManager() [3/3]

BesSensitiveManager::~BesSensitiveManager ( )
inline

Member Function Documentation

◆ AddSensitiveDetector() [1/3]

void BesSensitiveManager::AddSensitiveDetector ( BesSensitiveDetector * detector)
inline

◆ AddSensitiveDetector() [2/3]

void BesSensitiveManager::AddSensitiveDetector ( BesSensitiveDetector * detector)
inline

Definition at line 88 of file InstallArea/x86_64-el9-gcc13-opt/include/TruSim/BesSensitiveManager.hh.

88 {
89 clients.push_back( detector );
90 }

◆ AddSensitiveDetector() [3/3]

void BesSensitiveManager::AddSensitiveDetector ( BesSensitiveDetector * detector)
inline

Definition at line 88 of file Simulation/BOOST/TruSim/include/TruSim/BesSensitiveManager.hh.

88 {
89 clients.push_back( detector );
90 }

◆ BeginOfTrack() [1/3]

void BesSensitiveManager::BeginOfTrack ( const G4Track * track)

Definition at line 240 of file BesSensitiveManager.cc.

240 {
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}
BesTStats FollowTrack(const G4Track *track)

Referenced by BesTrackingAction::PreUserTrackingAction().

◆ BeginOfTrack() [2/3]

void BesSensitiveManager::BeginOfTrack ( const G4Track * track)

◆ BeginOfTrack() [3/3]

void BesSensitiveManager::BeginOfTrack ( const G4Track * track)

◆ BeginOfTruthEvent() [1/3]

void BesSensitiveManager::BeginOfTruthEvent ( const G4Event * evt)

Definition at line 42 of file BesSensitiveManager.cc.

42 {
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}
void SetVertex0(const G4Event *)

Referenced by BesEventAction::BeginOfEventAction().

◆ BeginOfTruthEvent() [2/3]

void BesSensitiveManager::BeginOfTruthEvent ( const G4Event * )

◆ BeginOfTruthEvent() [3/3]

void BesSensitiveManager::BeginOfTruthEvent ( const G4Event * )

◆ CheckDecayTrack() [1/3]

G4bool BesSensitiveManager::CheckDecayTrack ( const G4Track * track)

Definition at line 558 of file BesSensitiveManager.cc.

558 {
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}
double mass
G4bool MatchVertex(G4int vIndex, std::vector< int > *vDau)
void GetDaughterVertexes(BesTruthTrack *pTrack, std::vector< int > *vDau)

Referenced by FollowTrack().

◆ CheckDecayTrack() [2/3]

G4bool BesSensitiveManager::CheckDecayTrack ( const G4Track * )

◆ CheckDecayTrack() [3/3]

G4bool BesSensitiveManager::CheckDecayTrack ( const G4Track * )

◆ CheckType() [1/3]

G4int BesSensitiveManager::CheckType ( const HepMC::GenEvent * hepmcevt)

Definition at line 75 of file BesSensitiveManager.cc.

75 {
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}

Referenced by SaveParticlesFromGenerator().

◆ CheckType() [2/3]

G4int BesSensitiveManager::CheckType ( const HepMC::GenEvent * hepmcevt)

◆ CheckType() [3/3]

G4int BesSensitiveManager::CheckType ( const HepMC::GenEvent * hepmcevt)

◆ ClearEvent() [1/3]

void BesSensitiveManager::ClearEvent ( )

Definition at line 225 of file BesSensitiveManager.cc.

225 {
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}

Referenced by BesEventAction::EndOfEventAction().

◆ ClearEvent() [2/3]

void BesSensitiveManager::ClearEvent ( )

◆ ClearEvent() [3/3]

void BesSensitiveManager::ClearEvent ( )

◆ EndOfTrack() [1/3]

void BesSensitiveManager::EndOfTrack ( const G4Track * track,
G4TrackingManager * trackingManager )

Definition at line 266 of file BesSensitiveManager.cc.

267 {
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}
void UpdateVertex(BesTStats, const G4Track *)

Referenced by BesTrackingAction::PostUserTrackingAction().

◆ EndOfTrack() [2/3]

void BesSensitiveManager::EndOfTrack ( const G4Track * track,
G4TrackingManager *  )

◆ EndOfTrack() [3/3]

void BesSensitiveManager::EndOfTrack ( const G4Track * track,
G4TrackingManager *  )

◆ EndOfTruthEvent() [1/3]

void BesSensitiveManager::EndOfTruthEvent ( const G4Event * evt)

Definition at line 214 of file BesSensitiveManager.cc.

214 {
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}

Referenced by BesEventAction::EndOfEventAction().

◆ EndOfTruthEvent() [2/3]

void BesSensitiveManager::EndOfTruthEvent ( const G4Event * )

◆ EndOfTruthEvent() [3/3]

void BesSensitiveManager::EndOfTruthEvent ( const G4Event * )

◆ FollowTrack() [1/3]

BesTStats BesSensitiveManager::FollowTrack ( const G4Track * track)
protected

Definition at line 477 of file BesSensitiveManager.cc.

477 {
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}
void UpdatePrimaryTrack(const G4Track *)
void MakeNewTrack(BesTStats &stat, const G4Track *track)
G4bool CheckDecayTrack(const G4Track *)

Referenced by BeginOfTrack().

◆ FollowTrack() [2/3]

BesTStats BesSensitiveManager::FollowTrack ( const G4Track * track)
protected

◆ FollowTrack() [3/3]

BesTStats BesSensitiveManager::FollowTrack ( const G4Track * track)
protected

◆ GetCurrentTrackIndex() [1/3]

G4int BesSensitiveManager::GetCurrentTrackIndex ( ) const
inline

◆ GetCurrentTrackIndex() [2/3]

G4int BesSensitiveManager::GetCurrentTrackIndex ( ) const
inline

◆ GetCurrentTrackIndex() [3/3]

G4int BesSensitiveManager::GetCurrentTrackIndex ( ) const
inline

◆ GetDaughterVertexes() [1/3]

void BesSensitiveManager::GetDaughterVertexes ( BesTruthTrack * pTrack,
std::vector< int > * vDau )

Definition at line 738 of file BesSensitiveManager.cc.

739 {
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}

Referenced by CheckDecayTrack(), and GetDaughterVertexes().

◆ GetDaughterVertexes() [2/3]

void BesSensitiveManager::GetDaughterVertexes ( BesTruthTrack * pTrack,
std::vector< int > * vDau )

◆ GetDaughterVertexes() [3/3]

void BesSensitiveManager::GetDaughterVertexes ( BesTruthTrack * pTrack,
std::vector< int > * vDau )

◆ GetNumberTracks() [1/3]

G4int BesSensitiveManager::GetNumberTracks ( ) const
inline

◆ GetNumberTracks() [2/3]

G4int BesSensitiveManager::GetNumberTracks ( ) const
inline

◆ GetNumberTracks() [3/3]

G4int BesSensitiveManager::GetNumberTracks ( ) const
inline

Definition at line 118 of file Simulation/BOOST/TruSim/include/TruSim/BesSensitiveManager.hh.

118{ return m_trackList ? m_trackList->size() : 0; }

◆ GetNumberVertices() [1/3]

G4int BesSensitiveManager::GetNumberVertices ( ) const
inline

◆ GetNumberVertices() [2/3]

G4int BesSensitiveManager::GetNumberVertices ( ) const
inline

◆ GetNumberVertices() [3/3]

G4int BesSensitiveManager::GetNumberVertices ( ) const
inline

Definition at line 119 of file Simulation/BOOST/TruSim/include/TruSim/BesSensitiveManager.hh.

119{ return m_vertexList ? m_vertexList->size() : 0; }

◆ GetSensitiveManager() [1/3]

◆ GetSensitiveManager() [2/3]

BesSensitiveManager * BesSensitiveManager::GetSensitiveManager ( )
inlinestatic

◆ GetSensitiveManager() [3/3]

BesSensitiveManager * BesSensitiveManager::GetSensitiveManager ( )
inlinestatic

◆ GetTrackList() [1/3]

◆ GetTrackList() [2/3]

std::vector< BesTruthTrack * > * BesSensitiveManager::GetTrackList ( )
inline

◆ GetTrackList() [3/3]

std::vector< BesTruthTrack * > * BesSensitiveManager::GetTrackList ( )
inline

◆ GetVertexList() [1/3]

std::vector< BesTruthVertex * > * BesSensitiveManager::GetVertexList ( )
inline

◆ GetVertexList() [2/3]

std::vector< BesTruthVertex * > * BesSensitiveManager::GetVertexList ( )
inline

◆ GetVertexList() [3/3]

std::vector< BesTruthVertex * > * BesSensitiveManager::GetVertexList ( )
inline

◆ MakeNewTrack() [1/3]

void BesSensitiveManager::MakeNewTrack ( BesTStats & stat,
const G4Track * track )
protected

Definition at line 363 of file BesSensitiveManager.cc.

363 {
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}
**********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

Referenced by FollowTrack().

◆ MakeNewTrack() [2/3]

void BesSensitiveManager::MakeNewTrack ( BesTStats & stat,
const G4Track * track )
protected

◆ MakeNewTrack() [3/3]

void BesSensitiveManager::MakeNewTrack ( BesTStats & stat,
const G4Track * track )
protected

◆ MatchDaughterTrack() [1/3]

G4bool BesSensitiveManager::MatchDaughterTrack ( const G4Track * track)

Definition at line 773 of file BesSensitiveManager.cc.

773 {
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}

◆ MatchDaughterTrack() [2/3]

G4bool BesSensitiveManager::MatchDaughterTrack ( const G4Track * )

◆ MatchDaughterTrack() [3/3]

G4bool BesSensitiveManager::MatchDaughterTrack ( const G4Track * )

◆ MatchVertex() [1/3]

G4bool BesSensitiveManager::MatchVertex ( G4int vIndex,
std::vector< int > * vDau )

Definition at line 761 of file BesSensitiveManager.cc.

761 {
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}

Referenced by CheckDecayTrack().

◆ MatchVertex() [2/3]

G4bool BesSensitiveManager::MatchVertex ( G4int vIndex,
std::vector< int > * vDau )

◆ MatchVertex() [3/3]

G4bool BesSensitiveManager::MatchVertex ( G4int vIndex,
std::vector< int > * vDau )

◆ SaveParticlesFromGenerator() [1/3]

void BesSensitiveManager::SaveParticlesFromGenerator ( )

Definition at line 100 of file BesSensitiveManager.cc.

100 {
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}
G4int CheckType(const HepMC::GenEvent *hepmcevt)
GenEvent * getGenEvt() const

Referenced by BeginOfTruthEvent().

◆ SaveParticlesFromGenerator() [2/3]

void BesSensitiveManager::SaveParticlesFromGenerator ( )

◆ SaveParticlesFromGenerator() [3/3]

void BesSensitiveManager::SaveParticlesFromGenerator ( )

◆ SetLogLevel() [1/3]

void BesSensitiveManager::SetLogLevel ( G4int level)
inline

◆ SetLogLevel() [2/3]

void BesSensitiveManager::SetLogLevel ( G4int level)
inline

◆ SetLogLevel() [3/3]

void BesSensitiveManager::SetLogLevel ( G4int level)
inline

◆ SetVertex0() [1/3]

void BesSensitiveManager::SetVertex0 ( const G4Event * anEvent)

Definition at line 64 of file BesSensitiveManager.cc.

64 {
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}

Referenced by BeginOfTruthEvent().

◆ SetVertex0() [2/3]

void BesSensitiveManager::SetVertex0 ( const G4Event * )

◆ SetVertex0() [3/3]

void BesSensitiveManager::SetVertex0 ( const G4Event * )

◆ UpdatePrimaryTrack() [1/3]

void BesSensitiveManager::UpdatePrimaryTrack ( const G4Track * track)

Definition at line 820 of file BesSensitiveManager.cc.

820 {
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}

Referenced by FollowTrack().

◆ UpdatePrimaryTrack() [2/3]

void BesSensitiveManager::UpdatePrimaryTrack ( const G4Track * )

◆ UpdatePrimaryTrack() [3/3]

void BesSensitiveManager::UpdatePrimaryTrack ( const G4Track * )

◆ UpdateVertex() [1/3]

void BesSensitiveManager::UpdateVertex ( BesTStats stat,
const G4Track * track )

Definition at line 345 of file BesSensitiveManager.cc.

345 {
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}
Double_t time

Referenced by EndOfTrack().

◆ UpdateVertex() [2/3]

void BesSensitiveManager::UpdateVertex ( BesTStats ,
const G4Track *  )

◆ UpdateVertex() [3/3]

void BesSensitiveManager::UpdateVertex ( BesTStats ,
const G4Track *  )

Member Data Documentation

◆ chain

std::vector< BesTStats > BesSensitiveManager::chain
protected

◆ clients

◆ iter

std::vector< BesSensitiveDetector * >::iterator BesSensitiveManager::iter
protected

◆ iter_end

std::vector< BesSensitiveDetector * >::iterator BesSensitiveManager::iter_end
protected

◆ m_count

G4int BesSensitiveManager::m_count
protected

◆ m_hepmcevt

HepMC::GenEvent * BesSensitiveManager::m_hepmcevt
protected

◆ m_logLevel

◆ m_pos0

G4ThreeVector BesSensitiveManager::m_pos0
protected

◆ m_sensitiveManager

BesSensitiveManager * BesSensitiveManager::m_sensitiveManager = 0
staticprotected

◆ m_t0

G4double BesSensitiveManager::m_t0
protected

◆ m_trackFlag

G4int BesSensitiveManager::m_trackFlag
protected

◆ m_trackIndex

◆ m_trackList

◆ m_vertexList


The documentation for this class was generated from the following files: