10#include "G4DynamicParticle.hh"
11#include "G4GeometryManager.hh"
12#include "G4LogicalVolume.hh"
13#include "G4Navigator.hh"
14#include "G4ParticleTable.hh"
15#include "G4PrimaryParticle.hh"
16#include "G4ProductionCuts.hh"
18#include "G4RegionStore.hh"
19#include "G4SDManager.hh"
20#include "G4SteppingManager.hh"
21#include "G4TransportationManager.hh"
22#include "G4VPhysicalVolume.hh"
28#include "G4RunManagerKernel.hh"
40 , myGeomOptimization( true )
47 bes3WorldVolume = bes3DetectorConstruction->Construct();
49 extTrack =
new G4Track;
55 extRunManagerKernel =
new G4RunManagerKernel;
56 extRunManagerKernel->DefineWorldVolume( bes3WorldVolume );
57 extRunManagerKernel->SetPhysics( extPhysicsList );
58 extTrackingManager = extRunManagerKernel->GetTrackingManager();
62 const int m_detVer,
const bool aUseMucKal,
const int aMucWindow )
63 : myMsgFlag( msgFlag )
64 , myBFieldOn( BFieldOn )
65 , myGeomOptimization( GeomOptimization )
67 , myUseMucKal( aUseMucKal )
68 , myMucWindow( aMucWindow ) {
71 bes3WorldVolume = bes3DetectorConstruction->Construct();
73 extTrack =
new G4Track;
78 extRunManagerKernel =
new G4RunManagerKernel;
79 extTrackingManager = extRunManagerKernel->GetTrackingManager();
80 extRunManagerKernel->DefineWorldVolume( bes3WorldVolume );
81 extRunManagerKernel->SetPhysics( extPhysicsList );
82 extTrackingManager = extRunManagerKernel->GetTrackingManager();
93 if ( extTrack )
delete extTrack;
95 if ( bes3DetectorConstruction )
delete bes3DetectorConstruction;
97 if ( extPhysicsList )
delete extPhysicsList;
101 G4GeometryManager::GetInstance()->OpenGeometry();
104 G4SDManager* fSDM = G4SDManager::GetSDMpointerIfExist();
105 if ( fSDM ) {
delete fSDM; }
114 const bool GeomOptimization,
const bool aUseMucKal,
115 const int aMucWindow ) {
116 myMsgFlag = aMsgFlag;
117 myGeomOptimization = GeomOptimization;
118 myBFieldOn =
Bfield, myUseMucKal = aUseMucKal;
119 myMucWindow = aMucWindow;
124 if ( myMsgFlag ) cout <<
"Ext_track::Init will execute geant initialization." << endl;
127 extRunManagerKernel->InitializePhysics();
128 G4cout <<
"dzy add output before extRunManagerKernel->RunInitialization()" << G4endl;
129 extRunManagerKernel->RunInitialization();
130 G4cout <<
"dzy add output after extRunManagerKernel->RunInitialization()" << G4endl;
134 extSteppingAction->SetMucKalFlag( aUseMucKal );
135 extSteppingAction->SetMucWindow( aMucWindow );
137 extTrackingManager->SetUserAction( extSteppingAction );
141bool Ext_track::GeometryInitialization() {
142 if ( myMsgFlag ) cout <<
"Ext_track::GeometryInitialization()." << endl;
152 G4Region* defaultRegion =
new G4Region(
"DefaultRegionForBesWorld" );
153 defaultRegion->SetProductionCuts(
154 G4ProductionCutsTable::GetProductionCutsTable()->GetDefaultProductionCuts() );
157 if ( bes3WorldVolume->GetLogicalVolume()->GetRegion() )
159 if ( bes3WorldVolume->GetLogicalVolume()->GetRegion() != defaultRegion )
161 cout <<
"The world volume has a user-defined region <"
162 << bes3WorldVolume->GetLogicalVolume()->GetRegion()->GetName() <<
">." << G4endl;
168 if ( defaultRegion->GetNumberOfRootVolumes() )
170 if ( defaultRegion->GetNumberOfRootVolumes() >
size_t( 1 ) )
172 cout <<
"DefaultRegionHasMoreThanOneVolume,Default world region should have a unique "
177 std::vector<G4LogicalVolume*>::iterator lvItr =
178 defaultRegion->GetRootLogicalVolumeIterator();
179 defaultRegion->RemoveRootLogicalVolume( *lvItr );
180 cout << ( *lvItr )->GetName() <<
" is removed from the default region." << endl;
184 G4LogicalVolume* bes3WorldLog = bes3WorldVolume->GetLogicalVolume();
185 bes3WorldLog->SetRegion( defaultRegion );
186 defaultRegion->AddRootLogicalVolume( bes3WorldLog );
189 G4TransportationManager::GetTransportationManager()
190 ->GetNavigatorForTracking()
191 ->SetWorldVolume( bes3WorldVolume );
196bool Ext_track::PhysicsInitialization() {
197 if ( myMsgFlag ) cout <<
"Ext_track::PhysicsInitialization()." << endl;
202 extPhysicsList->Construct();
203 extPhysicsList->CheckParticleList();
204 extPhysicsList->SetCuts();
209 G4RegionStore::GetInstance()->UpdateMaterialList( bes3WorldVolume );
210 G4ProductionCutsTable::GetProductionCutsTable()->UpdateCoupleTable( bes3WorldVolume );
213 if ( myMsgFlag ) cout <<
"Build PhysicsTables" << endl;
214 extPhysicsList->BuildPhysicsTable();
215 if ( myMsgFlag ) cout <<
"Build PhysicsTables end." << endl;
216 G4ProductionCutsTable::GetProductionCutsTable()->PhysicsTableUpdated();
217 extPhysicsList->DumpCutValuesTableIfRequested();
220 if ( myGeomOptimization )
222 cout <<
"Geometry Optimization,please wait for a few minutes." << endl;
223 G4GeometryManager* geomManager = G4GeometryManager::GetInstance();
224 geomManager->OpenGeometry();
225 geomManager->CloseGeometry(
true,
false );
231void Ext_track::CheckRegions() {
233 G4RegionStore::GetInstance()->SetWorldVolume();
235 for (
size_t i = 0; i < G4RegionStore::GetInstance()->size(); i++ )
237 G4Region* region = ( *( G4RegionStore::GetInstance() ) )[i];
239 if ( region->GetWorldPhysical() != bes3WorldVolume )
continue;
240 G4ProductionCuts* cuts = region->GetProductionCuts();
243 region->SetProductionCuts(
244 G4ProductionCutsTable::GetProductionCutsTable()->GetDefaultProductionCuts() );
253bool Ext_track::Set(
const Hep3Vector& xv3,
const Hep3Vector& pv3,
const HepSymMatrix& err,
254 const std::string& particleName,
const double pathInMDC,
255 const double tofInMdc ) {
256 if ( err.num_row() != 6 )
258 std::cerr <<
"%ERROR at Ext_track::Set. Dimension of error matrix: " << err.num_row()
259 <<
" should be 6" << std::endl;
271 if ( !CheckVertexInsideWorld( xv3 ) )
return false;
273 float p( pv3.mag() );
274 m_vect[3] = pv3.x() / p;
275 m_vect[4] = pv3.y() / p;
276 m_vect[5] = pv3.z() / p;
280 if ( particleName !=
"e+" && particleName !=
"e-" && particleName !=
"mu+" &&
281 particleName !=
"mu-" && particleName !=
"pi+" && particleName !=
"pi-" &&
282 particleName !=
"kaon+" && particleName !=
"kaon-" && particleName !=
"proton" &&
283 particleName !=
"anti_proton" && particleName !=
"gamma" )
285 std::cerr <<
"Unknown or unconstructed Particle." << std::endl;
292 G4ParticleDefinition* particleDefinition =
293 G4ParticleTable::GetParticleTable()->FindParticle( particleName );
294 Q = particleDefinition->GetPDGCharge();
295 mass = particleDefinition->GetPDGMass();
297 Hep3Vector xv( m_vect[0], m_vect[1], m_vect[2] );
298 Hep3Vector pv( m_vect[3] * m_vect[6], m_vect[4] * m_vect[6], m_vect[5] * m_vect[6] );
300 m_xp_err.set_err( err, xv, pv, Q,
mass );
302 extSteppingAction->SetXpErrPointer( &m_xp_err );
303 extSteppingAction->SetInitialPath( pathInMDC );
304 extSteppingAction->SetInitialTof( tofInMdc );
306 double betaInMDC = p / sqrt(
mass *
mass + p * p );
307 extSteppingAction->SetBetaInMDC( betaInMDC );
312 extSteppingAction->MucReset();
327 G4DynamicParticle* DP =
new G4DynamicParticle( particleDefinition, pv );
330 extTrack =
new G4Track( DP, 0.0, xv3 );
334 Hep3Vector center( 0, 0, 0 );
335 G4Navigator* navigator =
336 G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking();
337 navigator->LocateGlobalPointAndSetup( center, 0,
false );
343bool Ext_track::CheckVertexInsideWorld(
const Hep3Vector& pos ) {
344 G4Navigator* navigator =
345 G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking();
347 G4VPhysicalVolume* world = navigator->GetWorldVolume();
348 G4VSolid* solid = world->GetLogicalVolume()->GetSolid();
349 EInside qinside = solid->Inside( pos );
351 if ( qinside != kInside )
return false;
void SetMsgFlag(bool aMsgFalg)
void TrackExtrapotation()
void Initialization(const bool aMsgFlag, const bool Bfield, const bool GeomOptimization, const bool aUseMucKal, const int aMucWindow)
bool Set(const Hep3Vector &xv3, const Hep3Vector &pv3, const HepSymMatrix &err, const std::string &particleName, const double pathInMDC, const double tofInMdc)