Geant4  10.00.p02
errprop.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // $Id: errprop.cc 68019 2013-03-13 13:32:43Z gcosmo $
27 //
30 //
31 // ------------------------------------------------------------
32 // GEANT 4 example main
33 // ------------------------------------------------------------
34 //
35 // History:
36 // - Created: P. Arce May 2007
37 //
38 
40 #include "G4SteppingVerbose.hh"
41 
42 #include "G4ErrorPropagator.hh"
43 #include "G4ErrorPropagatorData.hh"
49 #include "G4ErrorFreeTrajState.hh"
50 
51 #include "G4UImanager.hh"
52 #include "G4SystemOfUnits.hh"
53 
54 void Initialize();
55 G4ErrorTarget* BuildTarget( G4int iTarget );
56 void ProcessEvent( G4int iProp, size_t nEv );
57 void Finalize();
58 
61 
62 //-------------------------------------------------------------
63 int main()
64 {
65 
66  Initialize();
67 
68  //----- Choose propagation mode
69  // 0: propagate until target, all steps in one go
70  // 1: propagate until target, returning control to the user at each step
71  G4int iProp = 0;
72  char* prop = getenv("G4ERROR_PROP");
73  if( prop ) {
74  if( G4String(prop) == G4String("UNTIL_TARGET") ){
75  iProp = 0;
76  } else if ( G4String(prop) == G4String("STEP_BY_STEP") ) {
77  iProp = 1;
78  } else {
79  G4Exception("exG4eReco","Fatal error in Argument",FatalErrorInArgument,G4String("Variable G4ERROR_PROP = " + G4String(prop) + " It must be: UNTIL_TARGET or STEP_BY_STEP").c_str());
80  }
81  } else {
82  G4Exception("exG4eReco","Fatal error in Argument",JustWarning,"Variable G4ERROR_PROP not defined, taking it = UNTIL_TARGET");
83  }
84 
85  size_t nEvents = 3;
86  for( size_t ii = 0; ii < nEvents; ii++ ){
87  ProcessEvent( iProp, ii );
88  }
89 
90  Finalize();
91 
92 }
93 
94 
95 //-------------------------------------------------------------
96 void Initialize()
97 {
99 
100  // Initialize the GEANT4e manager
103 
105 
106  G4UImanager::GetUIpointer()->ApplyCommand("/exerror/setField -10. kilogauss");
107 
108  g4emgr->InitGeant4e();
109 
110  G4UImanager::GetUIpointer()->ApplyCommand("/control/verbose 1");
111  G4UImanager::GetUIpointer()->ApplyCommand("/tracking/verbose 1");
112  G4UImanager::GetUIpointer()->ApplyCommand("/geant4e/limits/stepLength 100 mm");
113 
114  //----- Choose target type:
115  // 1: PlaneSurfaceTarget
116  // 2: CylSurfaceTarget
117  // 3: GeomVolumeTarget
118  // 4: TrackLengthTarget
119  G4int iTarget = 1;
120  char* target = getenv("G4ERROR_TARGET");
121  if( target ) {
122  if( G4String(target) == G4String("PLANE_SURFACE") ) {
123  iTarget = 1;
124  }else if( G4String(target) == G4String("CYL_SURFACE") ) {
125  iTarget = 2;
126  }else if( G4String(target) == G4String("VOLUME") ) {
127  iTarget = 3;
128  }else if( G4String(target) == G4String("TRKLEN") ) {
129  iTarget = 4;
130  }else {
131  G4Exception("exG4eReco","Fatal error in Argument",FatalErrorInArgument,G4String("Variable G4ERROR_TARGET = " + G4String(target) + " It must be: PLANE_SURFACE, CYL_SURFACE, VOLUME, TRKLEN").c_str());
132  }
133  } else {
134  G4Exception("exG4eReco","Fatal error in Argument",JustWarning,"Variable G4ERROR_TARGET not defined, taking it = PLANE_SURFACE");
135  }
136 
137  theTarget = BuildTarget( iTarget );
138  g4edata->SetTarget( theTarget );
139 
141  char* mode = getenv("G4ERROR_MODE");
142  if( mode ) {
143  if( G4String(mode) == G4String("FORWARDS") ) {
145  } else if( G4String(mode) == G4String("BACKWARDS") ) {
147  } else {
148  G4Exception("exG4eReco","Fatal error in Argument",FatalErrorInArgument,G4String("Variable G4ERROR_MODE = " + G4String(mode) + " It must be: FORWARDS or BACKWARDS").c_str());
149  }
150  } else {
151  G4Exception("exG4eReco","Fatal error in Argument",JustWarning,"Variable G4ERROR_MODE not defined, taking it = BACKWARDS");
152  }
153 
154 }
155 
156 
157 void ProcessEvent( G4int iProp, size_t )
158 {
159 
160 // Set the starting trajectory.
161  G4ThreeVector xv3( 0, 0, 0 );
162  G4ThreeVector pv3( 20.0*GeV, 0.0, 0.0 );
163  G4ErrorTrajErr error( 5, 0 );
164  G4ErrorFreeTrajState* g4ErrorTrajState = new G4ErrorFreeTrajState( "mu-", xv3, pv3, error );
165 
167 
168  //int ierr = 0;
169 
170  G4Point3D surfPos(224.*cm,0.,0.);
171  G4Normal3D surfNorm(1.,0.,0.);
172  //- G4ErrorTarget* theG4ErrorTarget = new G4ErrorPlaneSurfaceTarget(surfNorm, surfPos );
173 
174  if( iProp == 0){
175  // Propagate until G4ErrorTarget is found all in one go
176  //ierr =
177  g4emgr->Propagate( g4ErrorTrajState, theTarget, theG4ErrorMode );
178  } else if( iProp == 1){
179 
180  // Propagate until G4ErrorTarget is reached step by step
181 
182  g4emgr->InitTrackPropagation();
183 
184  // G4Track* aTrack = G4EventManager::GetEventManager()->GetTrackingManager()->GetTrack();
185  bool moreEvt = TRUE;
186  while( moreEvt ){
187 
188  //ierr =
189  g4emgr->PropagateOneStep( g4ErrorTrajState, theG4ErrorMode );
190 
191  //---- Check if target is reached
192  if( g4emgr->GetPropagator()->CheckIfLastStep( g4ErrorTrajState->GetG4Track() )) {
193  g4emgr->GetPropagator()->InvokePostUserTrackingAction( g4ErrorTrajState->GetG4Track() );
194  moreEvt = 0;
195  G4cout << "STEP_BY_STEP propagation: Last Step " << G4endl;
196  }
197  }
198  }
199 
200  G4cout << " $$$ PROPAGATION ENDED " << G4endl;
201  // extract current state info
202  G4Point3D posEnd = g4ErrorTrajState->GetPosition();
203  G4Normal3D momEnd = g4ErrorTrajState->GetMomentum();
204  G4ErrorTrajErr errorEnd = g4ErrorTrajState->GetError();
205 
206  G4cout << " Position: " << posEnd << G4endl
207  << " Momentum: " << momEnd << G4endl
208  << " Error: " << errorEnd << G4endl;
209 }
210 
211 
212 //-------------------------------------------------------------
214 {
215 
216  G4ErrorTarget* target = 0;
217  if( iTarget == 1 ) {
218  G4Point3D surfPos(221.*cm,0.,0.);
219  G4Normal3D surfNorm(1.,0.,0.);
220  target = new G4ErrorPlaneSurfaceTarget(surfNorm, surfPos );
221  }else if( iTarget == 2 ) {
222  G4double radius = 222*cm;
223  target = new G4ErrorCylSurfaceTarget(radius);
224  }else if( iTarget == 3 ) {
225  target = new G4ErrorGeomVolumeTarget("MUON");
226  }else if( iTarget == 4 ) {
227  target = new G4ErrorTrackLengthTarget(223.*cm);
228  }else {
229  G4Exception("exG4eReco","Fatal error in Argument",FatalErrorInArgument,"Target type has to be between 1 and 4");
230  }
231  return target;
232 }
233 
234 
235 //-------------------------------------------------------------
236 void Finalize()
237 {
239 
240 }
static const double cm
Definition: G4SIunits.hh:106
G4int PropagateOneStep(G4ErrorTrajState *currentTS, G4ErrorMode mode=G4ErrorMode_PropForwards)
int main()
Definition: errprop.cc:63
void InvokePostUserTrackingAction(G4Track *fpTrack)
CLHEP::Hep3Vector G4ThreeVector
void Initialize()
Definition: errprop.cc:96
G4Point3D GetPosition() const
HepGeom::Point3D< G4double > G4Point3D
Definition: G4Point3D.hh:35
void ProcessEvent(G4int iProp, size_t nEv)
Definition: errprop.cc:157
static G4ErrorPropagatorManager * GetErrorPropagatorManager()
int G4int
Definition: G4Types.hh:78
Definition of the ExErrorDetectorConstruction class.
static G4UImanager * GetUIpointer()
Definition: G4UImanager.cc:58
G4ErrorMode theG4ErrorMode
Definition: errprop.cc:60
G4GLOB_DLL std::ostream G4cout
G4ErrorPropagator * GetPropagator() const
void SetUserInitialization(G4VUserDetectorConstruction *userInit)
Detector construction class.
G4Vector3D GetMomentum() const
G4ErrorTarget * theTarget
Definition: errprop.cc:59
#define TRUE
Definition: globals.hh:55
static const double GeV
Definition: G4SIunits.hh:196
G4Track * GetG4Track() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
void SetTarget(const G4ErrorTarget *target)
static void SetInstance(G4VSteppingVerbose *Instance)
G4bool CheckIfLastStep(G4Track *aTrack)
G4ErrorTarget * BuildTarget(G4int iTarget)
Definition: errprop.cc:213
void Finalize()
Definition: errprop.cc:236
G4int Propagate(G4ErrorTrajState *currentTS, const G4ErrorTarget *target, G4ErrorMode mode=G4ErrorMode_PropForwards)
#define G4endl
Definition: G4ios.hh:61
static PROLOG_HANDLER error
Definition: xmlrole.cc:108
double G4double
Definition: G4Types.hh:76
static G4ErrorPropagatorData * GetErrorPropagatorData()
G4int ApplyCommand(const char *aCommand)
Definition: G4UImanager.cc:432
G4ErrorTrajErr GetError() const
HepGeom::Normal3D< G4double > G4Normal3D
Definition: G4Normal3D.hh:35