ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4ExactHelixStepper.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4ExactHelixStepper.cc
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 // G4ExactHelixStepper implementation
27 //
28 // Author: J.Apostolakis, 28.01.2005.
29 // Implementation adapted from ExplicitEuler by W.Wander
30 // -------------------------------------------------------------------
31 
32 #include "G4ExactHelixStepper.hh"
33 #include "G4PhysicalConstants.hh"
34 #include "G4ThreeVector.hh"
35 #include "G4LineSection.hh"
36 
38  : G4MagHelicalStepper(EqRhs),
39  fBfieldValue(DBL_MAX, DBL_MAX, DBL_MAX)
40 {
41 }
42 
44 {
45 }
46 
47 // ---------------------------------------------------------------------------
48 
49 void
51  const G4double*,
52  G4double hstep,
53  G4double yOut[],
54  G4double yErr[] )
55 {
56  const G4int nvar = 6;
57 
58  G4int i;
59  G4ThreeVector Bfld_value;
60 
61  MagFieldEvaluate(yInput, Bfld_value);
62  AdvanceHelix(yInput, Bfld_value, hstep, yOut);
63 
64  // We are assuming a constant field: helix is exact
65  //
66  for(i=0; i<nvar; ++i)
67  {
68  yErr[i] = 0.0 ;
69  }
70 
71  fBfieldValue = Bfld_value;
72 }
73 
74 // ---------------------------------------------------------------------------
75 
76 void
78  G4ThreeVector Bfld,
79  G4double h,
80  G4double yOut[])
81 {
82  // Assuming a constant field: solution is a helix
83 
84  AdvanceHelix(yIn, Bfld, h, yOut);
85 
86  G4Exception("G4ExactHelixStepper::DumbStepper",
87  "GeomField0002", FatalException,
88  "Should not be called. Stepper must do all the work." );
89 }
90 
91 
92 // ---------------------------------------------------------------------------
93 
96 {
97  // Implementation : must check whether h/R > pi !!
98  // If( h/R < pi) DistChord=h/2*std::tan(Ang_curve/4)
99  // Else DistChord=R_helix
100 
101  G4double distChord;
102  G4double Ang_curve=GetAngCurve();
103 
104  if (Ang_curve<=pi)
105  {
106  distChord=GetRadHelix()*(1-std::cos(0.5*Ang_curve));
107  }
108  else if(Ang_curve<twopi)
109  {
110  distChord=GetRadHelix()*(1+std::cos(0.5*(twopi-Ang_curve)));
111  }
112  else
113  {
114  distChord=2.*GetRadHelix();
115  }
116 
117  return distChord;
118 }
119 
120 // ---------------------------------------------------------------------------
121 
122 G4int
124 {
125  return 1;
126 }