53 : fNDataPointsPerMaxHalfScene(nDataPointsPerMaxHalfScene)
55 fType =
"G4MagneticFieldModel";
57 std::ostringstream oss;
73 const G4double xHalfScene = 0.5 * (xMax - xMin);
74 const G4double yHalfScene = 0.5 * (yMax - yMin);
75 const G4double zHalfScene = 0.5 * (zMax - zMin);
81 if (maxHalfScene <= 0.) {
83 <<
"Extent non-positive."
101 <<
"Null global field pointer."
106 <<
"No global field exists."
111 <<
"No global field manager."
117 const G4int nDataPointsPerXHalfScene =
G4int(xHalfScene / interval);
118 const G4int nDataPointsPerYHalfScene =
G4int(yHalfScene / interval);
119 const G4int nDataPointsPerZHalfScene =
G4int(zHalfScene / interval);
120 const G4int nXSamples = 2 * nDataPointsPerXHalfScene + 1;
121 const G4int nYSamples = 2 * nDataPointsPerYHalfScene + 1;
122 const G4int nZSamples = 2 * nDataPointsPerZHalfScene + 1;
123 const G4int nSamples = nXSamples * nYSamples * nZSamples;
124 const G4int nSamples3 = nSamples * 3;
125 const G4double arrowLengthMax = 0.8 * interval;
126 const G4int nResults = 6;
129 double position_time[4] = {0,0,0,0};
130 double result[nResults];
133 std::vector<G4double> BField(nSamples3);
134 std::vector<G4double> BFieldMagnitude(nSamples);
135 std::vector<G4double> xyz(nSamples3);
139 for (
G4int i = 0; i < nXSamples; i++) {
140 G4double x = (i - nDataPointsPerXHalfScene) * interval;
141 position_time[0] = x;
142 for (
G4int j = 0; j < nYSamples; j++) {
143 G4double y = (j - nDataPointsPerYHalfScene) * interval;
144 position_time[1] = y;
145 for (
G4int k = 0; k < nZSamples; k++) {
146 G4double z = (k - nDataPointsPerZHalfScene) * interval;
147 position_time[2] =
z;
149 const G4int ijk = i * nYSamples * nZSamples + j * nZSamples + k;
150 const G4int ijk3 = ijk * 3;
155 const G4Field* field = globalField;
164 if (pRegionFieldMgr) {
188 for (
G4int l = 0; l < 3; l++) {
189 BField[ijk3 + l] = result[l];
193 (result[0]*result[0]+result[1]*result[1]+result[2]*result[2]);
194 BFieldMagnitude[ijk] = mag;
200 if (mag > BFieldMagnitudeMax) {
201 BFieldMagnitudeMax = mag;
208 if (BFieldMagnitudeMax <= 0) {
210 <<
"No field in this scene."
215 for (
G4int i = 0; i < nSamples; i++) {
216 if (BFieldMagnitude[i] > 0) {
217 const G4int i3 = i * 3;
221 const G4double B = BFieldMagnitude[i];
231 const G4double f = B / BFieldMagnitudeMax;
232 const G4double arrowLength = arrowLengthMax * f;
236 blue = 2. * (0.5 - f);
238 red = 2. * (f - 0.5);
239 green = 2. * (1.0 - f);
244 x + arrowLength * BField[i3] / B,
245 y + arrowLength * BField[i3 + 1] / B,
246 z + arrowLength * BField[i3 + 2] / B,
CLHEP::Hep3Vector G4ThreeVector
virtual void GetFieldValue(const double Point[4], double *fieldArr) const =0
G4Navigator * GetNavigatorForTracking() const
G4Region * GetRegion() const
virtual ~G4MagneticFieldModel()
G4FieldManager * GetFieldManager() const
virtual void DescribeYourselfTo(G4VGraphicsScene &)
G4GLOB_DLL std::ostream G4cout
G4int fNDataPointsPerMaxHalfScene
G4bool DoesFieldExist() const
G4String fGlobalDescription
static G4TransportationManager * GetTransportationManager()
G4FieldManager * GetFieldManager() const
G4FieldManager * GetFieldManager() const
virtual const G4VisExtent & GetExtent() const
G4LogicalVolume * GetLogicalVolume() const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
virtual G4VPhysicalVolume * LocateGlobalPointAndSetup(const G4ThreeVector &point, const G4ThreeVector *direction=0, const G4bool pRelativeSearch=true, const G4bool ignoreDirection=true)
G4MagneticFieldModel(G4int nDataPointsPerHalfScene=10)
virtual void DescribeYourselfTo(G4VGraphicsScene &)
const G4Field * GetDetectorField() const
static const G4double alpha
static const G4double pos