16#include "TruSim/BesSensitiveManager.hh"
17#include "TruSim/BesTruthTrack.hh"
18#include "TruSim/BesTruthVertex.hh"
22#include "G4TrackingManager.hh"
23#include "G4VProcess.hh"
25#include "HepMC/GenEvent.h"
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"
33#include "GaudiKernel/SmartDataPtr.h"
34#include "GeneratorObject/McGenEvent.h"
59 ( *iter )->BeginOfTruthEvent( evt );
66 for ( G4int i = 0; i < 1; i++ )
68 G4PrimaryVertex* primaryVertex = anEvent->GetPrimaryVertex( i );
69 m_pos0 = primaryVertex->GetPosition();
70 m_t0 = primaryVertex->GetT0();
77 for ( HepMC::GenEvent::vertex_const_iterator vitr = hepmcevt->vertices_begin();
78 vitr != hepmcevt->vertices_end(); ++vitr )
80 for ( HepMC::GenVertex::particle_iterator pitr =
81 ( *vitr )->particles_begin( HepMC::children );
82 pitr != ( *vitr )->particles_end( HepMC::children ); ++pitr )
84 if ( ( *pitr )->end_vertex() )
94 if (
flag == 0 ) G4cout << G4endl <<
"generator is GENBES!" << G4endl;
95 else G4cout << G4endl <<
"generator is not GENBES!" << G4endl;
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;
107 SmartDataPtr<McGenEventCol> mcCollptr( p_evtSvc,
"/Event/Gen" );
109 if ( mcCollptr == 0 ) std::cout <<
"no McGenEventCollection found." << std::endl;
113 McGenEventCol::const_iterator it = mcCollptr->begin();
118 for ( HepMC::GenEvent::vertex_const_iterator vitr =
m_hepmcevt->vertices_begin();
121 G4int barcodeVtx = ( *vitr )->barcode();
122 if (
m_logLevel <= 4 ) G4cout << G4endl <<
"barcodeVtx:" << barcodeVtx <<
" ";
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() );
129 newVertex->
SetTime( xvtx.t() * mm / c_light );
131 G4cout <<
"xyzt:" << xvtx.x() <<
" " << xvtx.y() <<
" " << xvtx.z() <<
" "
132 << xvtx.t() * mm / c_light <<
" ";
135 G4int parentTrackIndex = -99;
136 for (
int i = 0; i < nTrack; i++ )
138 parentTrack = ( *m_trackList )[i];
142 parentTrackIndex = parentTrack->
GetIndex();
143 if (
m_logLevel <= 4 ) G4cout <<
"parentTrack:" << parentTrackIndex <<
" ";
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;
161 for ( HepMC::GenVertex::particle_iterator pitr =
162 ( *vitr )->particles_begin( HepMC::children );
163 pitr != ( *vitr )->particles_end( HepMC::children ); ++pitr )
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();
171 newTrack->
SetP4( pGeV );
175 G4cout <<
"pdg:" << pdgcode <<
" ";
176 G4cout <<
"p:" << p.x() <<
" " << p.y() <<
" " << p.z() <<
" " << p.t() <<
" ";
178 sqrt( p.t() * p.t() - p.x() * p.x() - p.y() * p.y() - p.z() * p.z() );
179 G4cout <<
mass <<
" ";
187 G4int barcodeEndVtx = 0;
188 if ( ( *pitr )->end_vertex() )
190 barcodeEndVtx = ( *pitr )->end_vertex()->barcode();
191 if (
m_logLevel <= 4 ) G4cout <<
"endVtx:" << barcodeEndVtx <<
" ";
200 if ( parentTrackIndex >= 0 )
202 if (
m_logLevel <= 4 ) G4cout <<
"mother:" << parentTrackIndex;
203 ( *m_trackList )[parentTrackIndex]->AddDaughterIndex(
m_trackList->size() - 1 );
220 ( *iter )->EndOfTruthEvent( evt );
262 ( *iter )->BeginOfTrack( track );
267 G4TrackingManager* trackingManager ) {
268 if (
chain.back().savedByDefault ==
true )
271 G4int endVtxFlag = 0;
281 if ( endVtxFlag == 0 )
284 G4StepPoint* finalStep = track->GetStep()->GetPostStepPoint();
285 G4StepStatus stepStatus = finalStep->GetStepStatus();
286 if ( track->GetNextVolume() != 0 ||
287 ( stepStatus != fGeomBoundary && stepStatus != fWorldBoundary ) )
289 if (
m_logLevel <= 4 ) G4cout <<
"Particle died. make a terminal vertex: ";
291 const G4ThreeVector pos( finalStep->GetPosition() );
293 if (
m_logLevel <= 4 ) G4cout << vindex << G4endl;
294 stat.vertices.push_back( vindex );
297 newVertex->
SetTime( finalStep->GetGlobalTime() );
307 G4TrackVector* trackVector = trackingManager->GimmeSecondaries();
308 G4int nSecon = trackVector->size();
313 for ( G4int i = 0; i < nSecon; i++ )
315 seconTrack = ( *trackVector )[i];
316 G4String processName = seconTrack->GetCreatorProcess()->GetProcessName();
317 if ( processName ==
"Decay" ) nDau++;
340 ( *iter )->EndOfTrack( track );
348 if (
m_logLevel <= 4 ) G4cout <<
"updateVertex:" << terminalIndex <<
" ";
350 G4StepPoint* finalStep = track->GetStep()->GetPostStepPoint();
351 const G4ThreeVector pos( finalStep->GetPosition() );
352 G4double
time = finalStep->GetGlobalTime();
354 G4cout <<
"newPos:" << pos <<
" "
355 <<
"newTime:" <<
time << G4endl;
364 if ( stat.originVertex < 0 &&
chain.size() > 0 )
366 if (
m_logLevel <= 4 ) G4cout <<
"MakeNewTrack for decayed particles,";
370 G4int parentVstat =
chain.back().vertices.size();
371 while ( --parentVstat >= 0 )
373 G4int vindex =
chain.back().vertices[parentVstat];
375 G4ThreeVector diff( ( *
m_vertexList )[vindex]->GetPosition() );
376 diff = diff - track->GetPosition();
377 if ( diff.mag2() < 1E-9 )
379 stat.originVertex = vindex;
380 if (
m_logLevel <= 4 ) G4cout <<
"find a vertex:" << vindex;
381 ( *m_vertexList )[vindex]->AddCurrentDau();
387 if ( stat.originVertex < 0 &&
chain.size() == 0 )
391 for ( G4int i = 0; i < nVertex; i++ )
393 G4ThreeVector diff( ( *
m_vertexList )[i]->GetPosition() );
394 diff = diff - track->GetPosition();
395 if ( diff.mag2() < 1E-9 )
397 stat.originVertex = i;
399 G4cout <<
"MakeNewTrack for primary particles,find a vertex:" << i;
405 if ( stat.originVertex < 0 )
408 G4cout <<
"MakeNewTrack for primary particles,make new vertex:" <<
m_vertexList->size();
411 const G4ThreeVector
v( track->GetPosition() );
417 newVertex->
SetTime( track->GetGlobalTime() );
428 newVertex->
SetIndex( stat.originVertex );
429 if ( track->GetCreatorProcess() )
430 newVertex->
SetProcessName( track->GetCreatorProcess()->GetProcessName() );
440 newTrack->
SetP4( stat.p4 );
441 newTrack->
SetPDGCode( track->GetDefinition()->GetPDGEncoding() );
442 newTrack->
SetPDGCharge( track->GetDefinition()->GetPDGCharge() );
443 newTrack->
SetParticleName( track->GetDefinition()->GetParticleName() );
448 if ( track->GetParentID() == 0 )
455 newTrack->
SetIndex( stat.trackIndex );
466 if (
m_logLevel <= 4 ) G4cout <<
"add this daughter to:" << parent->
GetIndex() << G4endl;
480 HepLorentzVector( track->GetMomentum(), track->GetTotalEnergy() ),
481 track->GetGlobalTime() );
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();
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;
507 stat.savedByDefault =
true;
522 if (
chain.back().G4index == parentId )
break;
528 if (
chain.back().savedByDefault )
534 G4String processName = track->GetCreatorProcess()->GetProcessName();
535 if ( processName ==
"Decay" )
540 G4cout <<
"trackId: " << track->GetTrackID() <<
" ";
541 G4cout <<
"parentId: " << parentId <<
" ";
542 G4cout <<
"pdg: " << pdg <<
" ";
543 G4cout <<
"pname: " << particleName << G4endl;
545 stat.savedByDefault =
true;
554 stat.savedByDefault =
false;
560 G4int trackID = track->GetTrackID();
561 G4int parentID = track->GetParentID();
562 G4int pdgcode = track->GetDefinition()->GetPDGEncoding();
563 G4ThreeVector p3 = track->GetMomentum();
565 G4cout <<
"CheckDecayTrack p3: " << p3 <<
" " << track->GetTotalEnergy() << G4endl;
571 G4int parentTrackIndex = -99;
572 G4int terminalVertexIndex = -99;
574 for (
int i = 0; i < nTrack; i++ )
576 truthTrack = ( *m_trackList )[i];
580 parentTrackIndex = truthTrack->
GetIndex();
587 G4cout <<
"parentTrackIndex:" << parentTrackIndex <<
" "
588 <<
"parent terminate at vertex: " << terminalVertexIndex << G4endl;
589 if ( parentTrackIndex != i ) G4cout <<
"i: " << i << std::endl;
595 if ( parentTrackIndex == -99 || terminalVertexIndex == -99 )
597 G4cout <<
"MatchDecayError!" << G4endl;
610 G4double minDiffP = 1e99;
661 std::cout <<
"chain.back().vertices.size(): " <<
chain.back().vertices.size() << std::endl;
665 if (
chain.back().vertices.size() < 1 )
668 std::vector<int>* vDau =
new std::vector<int>;
670 G4int sizev = vDau->size();
673 for (
int i = 0; i < nTrack; i++ )
675 truthTrack = ( *m_trackList )[i];
678 if ( pdgT == -22 ) pdgT = 22;
679 if ( pdgT == pdgcode )
684 HepLorentzVector tp4 = truthTrack->
GetP4();
685 G4ThreeVector tp3( tp4.x(), tp4.y(), tp4.z() );
686 G4double diffP = ( p3 - tp3 ).mag2();
689 G4cout <<
"index: " << truthTrack->
GetIndex() <<
"tp3: " << tp3 << G4endl;
690 G4cout <<
"diffP: " << diffP << G4endl;
692 if ( diffP < minDiffP )
696 if (
m_logLevel <= 4 ) G4cout <<
"truthI: " << i << G4endl;
701 if ( vDau )
delete vDau;
710 G4cout <<
"MatchDecayedTrackWithTrueMother" << G4endl;
711 G4cout <<
"MatchWithTrueMother m_trackIndex: " <<
m_trackIndex << G4endl;
712 if ( minDiffP > 1e-9 ) G4cout <<
"large minDiffP: " << minDiffP << G4endl;
714 truthTrack = ( *m_trackList )[truthI];
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();
724 G4cout <<
"primary p: " << p4.x() <<
" " << p4.y() <<
" " << p4.z() <<
" " << p4.m()
727 truthTrack->
SetPDGCharge( track->GetDefinition()->GetPDGCharge() );
728 truthTrack->
SetParticleName( track->GetDefinition()->GetParticleName() );
739 std::vector<int>* vDau ) {
746 for ( G4int dau = minDau; dau <= maxDau; dau++ )
748 if ( dau < m_trackList->size() )
762 G4int size = vDau->size();
765 for ( G4int i = 0; i < size; i++ )
767 if ( vIndex == ( *vDau )[i] )
return true;
823 G4cout <<
"UpdatePrimaryTrack! ";
824 G4cout <<
"position: " << track->GetPosition() << G4endl;
825 G4cout <<
"time: " << track->GetGlobalTime() << G4endl;
826 G4cout <<
"momentum: " << track->GetMomentum() <<
" " << track->GetTotalEnergy()
829 G4int pdgcode = track->GetDefinition()->GetPDGEncoding();
830 G4ThreeVector p = track->GetMomentum();
835 G4double minDiffP = 1e99;
836 for (
int i = 0; i < nTrack; i++ )
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();
843 if ( pdgT == -22 ) pdgT = 22;
844 if ( pdgcode == pdgT && diffP < minDiffP ) minDiffP = diffP;
845 if ( pdgcode == pdgT && diffP < 1E-9 && truthTrack->NotFound() )
849 truthTrack->
SetPDGCharge( track->GetDefinition()->GetPDGCharge() );
850 truthTrack->
SetParticleName( track->GetDefinition()->GetParticleName() );
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 );
861 HepLorentzVector p4 = truthTrack->
GetP4();
862 G4cout <<
"primary p: " << p4.x() <<
" " << p4.y() <<
" " << p4.z() <<
" " << p4.m()
870 if (
m_logLevel <= 4 ) G4cout <<
"daughters: " << minDau <<
" " << maxDau << G4endl;
882 G4cout <<
"MatchError! parentID=0, but match no track in trackList" << G4endl;
883 G4cout <<
"pdgcode: " << pdgcode <<
" min p diff: " << minDiffP << G4endl;
**********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
HepMC::GenEvent * m_hepmcevt
void EndOfTruthEvent(const G4Event *)
BesTStats FollowTrack(const G4Track *track)
void UpdatePrimaryTrack(const G4Track *)
std::vector< BesTruthTrack * > * m_trackList
void SetVertex0(const G4Event *)
static BesSensitiveManager * m_sensitiveManager
G4bool MatchDaughterTrack(const G4Track *)
std::vector< BesTruthVertex * > * m_vertexList
void MakeNewTrack(BesTStats &stat, const G4Track *track)
void BeginOfTrack(const G4Track *track)
void UpdateVertex(BesTStats, const G4Track *)
std::vector< BesSensitiveDetector * > clients
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)
std::vector< BesSensitiveDetector * >::iterator iter_end
G4bool CheckDecayTrack(const G4Track *)
void SaveParticlesFromGenerator()
std::vector< BesTStats > chain
G4int CheckType(const HepMC::GenEvent *hepmcevt)
std::vector< BesSensitiveDetector * >::iterator iter
void SetSource(G4String source)
HepLorentzVector GetP4() const
BesTruthVertex * GetTerminalVertex() const
BesTruthVertex * GetVertex() const
void SetPDGCode(G4int code)
void SetTerminalVertex(BesTruthVertex *vertex)
void SetIndex(G4int index)
G4int GetG4TrackId() const
void SetVertex(BesTruthVertex *vertex)
void SetBarcodeEndVtx(G4int vtx)
void SetParticleName(G4String name)
vector< int > GetDaughterIndexes() const
void SetP4(const HepLorentzVector &p4)
void SetG4TrackId(G4int trackId)
void SetPDGCharge(G4double charge)
void AddDaughterIndex(G4int index)
void SetPosition(const G4ThreeVector &p)
BesTruthTrack * GetParentTrack() const
void SetParentTrack(BesTruthTrack *newParent)
void SetTerminal(bool wasTerminal)
void SetTime(const G4double &t)
void SetIndex(signed long newIndex)
void SetMinDau(G4int dau)
G4int GetCurrentDau() const
void SetProcessName(const G4String name)
GenEvent * getGenEvt() const