CMS 3D CMS Logo

SpecialCylindricalMFGrid.cc
Go to the documentation of this file.
2 #include "binary_ifstream.h"
4 
5 #include <iostream>
6 
7 using namespace std;
8 
10  const GloballyPositioned<float>& vol,
11  int gridType)
12  : MFGrid3D(vol) {
13  if (gridType == 5) {
14  sector1 = false;
15  } else if (gridType == 6) {
16  sector1 = true;
17  } else {
18  cout << "ERROR wrong SpecialCylindricalMFGrid type " << gridType << endl;
19  sector1 = false;
20  }
21 
22  int n1, n2, n3;
23  inFile >> n1 >> n2 >> n3;
24 #ifdef DEBUG_GRID
25  cout << "n1 " << n1 << " n2 " << n2 << " n3 " << n3 << endl;
26 #endif
27  double xref, yref, zref;
28  inFile >> xref >> yref >> zref;
29  double stepx, stepy, stepz;
30  inFile >> stepx >> stepy >> stepz;
31 
32  double RParAsFunOfPhi[4]; // R = f(phi) or const. (0,2: const. par. ; 1,3: const./sin(phi));
33  inFile >> RParAsFunOfPhi[0] >> RParAsFunOfPhi[1] >> RParAsFunOfPhi[2] >> RParAsFunOfPhi[3];
34 
35  vector<BVector> fieldValues;
36  float Bx, By, Bz;
37  int nLines = n1 * n2 * n3;
38  fieldValues.reserve(nLines);
39  for (int iLine = 0; iLine < nLines; ++iLine) {
40  inFile >> Bx >> By >> Bz;
41  // This would be fine only if local r.f. has the axes oriented as the global r.f.
42  // For this volume we know that the local and global r.f. have different axis
43  // orientation, so we do not try to be clever.
44  // fieldValues.push_back(BVector(Bx,By,Bz));
45 
46  // Preserve double precision!
48  fieldValues.push_back(BVector(lB.x(), lB.y(), lB.z()));
49  }
50  // check completeness
51  string lastEntry;
52  inFile >> lastEntry;
53  if (lastEntry != "complete") {
54  cout << "ERROR during file reading: file is not complete" << endl;
55  }
56 
57  GlobalPoint grefp(GlobalPoint::Cylindrical(xref, yref, zref));
58 
59 #ifdef DEBUG_GRID
60  LocalPoint lrefp = frame().toLocal(grefp);
61  cout << "Grid reference point in grid system: " << xref << "," << yref << "," << zref << endl;
62  cout << "Grid reference point in global x,y,z: " << grefp << endl;
63  cout << "Grid reference point in local x,y,z: " << lrefp << endl;
64  cout << "steps " << stepx << "," << stepy << "," << stepz << endl;
65  cout << "RParAsFunOfPhi[0...4] = ";
66  for (int i = 0; i < 4; ++i)
67  cout << RParAsFunOfPhi[i] << " ";
68  cout << endl;
69 #endif
70 
71  Grid1D gridX(0, n1 - 1, n1); // offset and step size not constant
72  Grid1D gridY(yref, yref + stepy * (n2 - 1), n2);
73  Grid1D gridZ(grefp.z(), grefp.z() + stepz * (n3 - 1), n3);
74 
75  grid_ = GridType(gridX, gridY, gridZ, fieldValues);
76 
77  stepConstTerm_ = (RParAsFunOfPhi[0] - RParAsFunOfPhi[2]) / (n1 - 1);
78  stepPhiTerm_ = (RParAsFunOfPhi[1] - RParAsFunOfPhi[3]) / (n1 - 1);
79  startConstTerm_ = RParAsFunOfPhi[2];
80  startPhiTerm_ = RParAsFunOfPhi[3];
81 
82  // Activate/deactivate timers
83  // static SimpleConfigurable<bool> timerOn(false,"MFGrid:timing");
84  // (*TimingReport::current()).switchOn("MagneticFieldProvider::valueInTesla(SpecialCylindricalMFGrid)",timerOn);
85 }
86 
88  // static TimingReport::Item & timer= (*TimingReport::current())["MagneticFieldProvider::valueInTesla(SpecialCylindricalMFGrid)"];
89  // TimeMe t(timer,false);
90 
92  double a, b, c;
93  toGridFrame(p, a, b, c);
94  // the following holds if B values was not converted to local coords -- see ctor
95  // GlobalVector gv( interpol.interpolate( a, b, c)); // grid in global frame
96  // return frame().toLocal(gv); // must return a local vector
97  return LocalVector(interpol.interpolate(a, b, c));
98 }
99 
101 
103  double sinPhi; // sin or cos depending on wether we are at phi=0 or phi=pi/2
104  if (sector1) {
105  sinPhi = cos(b);
106  } else {
107  sinPhi = sin(b);
108  }
109 
110  double R = a * stepSize(sinPhi) + startingPoint(sinPhi);
111  // "OLD" convention of phi.
112  // GlobalPoint gp( GlobalPoint::Cylindrical(R, Geom::pi() - b, c));
114  return frame().toLocal(gp);
115 }
116 
117 void SpecialCylindricalMFGrid::toGridFrame(const LocalPoint& p, double& a, double& b, double& c) const {
119  double sinPhi; // sin or cos depending on wether we are at phi=0 or phi=pi/2
120  if (sector1) {
121  sinPhi = cos(gp.phi());
122  } else {
123  sinPhi = sin(gp.phi());
124  }
125  a = (gp.perp() - startingPoint(sinPhi)) / stepSize(sinPhi);
126  // FIXME: "OLD" convention of phi.
127  // b = Geom::pi() - gp.phi();
128  b = gp.phi();
129  c = gp.z();
130 
131 #ifdef DEBUG_GRID
132  if (sector1) {
133  cout << "toGridFrame: sinPhi ";
134  } else {
135  cout << "toGridFrame: cosPhi ";
136  }
137  cout << sinPhi << " LocalPoint " << p << " GlobalPoint " << gp << endl
138  << " a " << a << " b " << b << " c " << c << endl;
139 
140 #endif
141 }
GlobalPoint toGlobal(const LocalPoint &lp) const
LocalVector uncheckedValueInTesla(const LocalPoint &p) const override
Interpolated field value at given point; does not check for exceptions.
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
GloballyPositioned< float >::LocalPoint LocalPoint
Definition: MFGrid.h:31
ReturnType interpolate(Scalar a, Scalar b, Scalar c)
double stepSize(double sinPhi) const
LocalPoint toLocal(const GlobalPoint &gp) const
void toGridFrame(const LocalPoint &p, double &a, double &b, double &c) const override
find grid coordinates for point. For debugging and validation only.
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
const GloballyPositioned< float > & frame() const
Local reference frame.
Definition: MFGrid.h:60
SpecialCylindricalMFGrid(binary_ifstream &istr, const GloballyPositioned< float > &vol, int gridType)
GridType grid_
Definition: MFGrid3D.h:59
Definition: Grid1D.h:7
GloballyPositioned< float >::GlobalPoint GlobalPoint
Definition: MFGrid.h:29
Grid3D GridType
Definition: MFGrid3D.h:56
Grid3D::BVector BVector
Definition: MFGrid3D.h:57
double b
Definition: hdecay.h:118
GloballyPositioned< float >::LocalVector LocalVector
Definition: MFGrid.h:32
double startingPoint(double sinPhi) const
double a
Definition: hdecay.h:119
LocalPoint fromGridFrame(double a, double b, double c) const override
find grid coordinates for point. For debugging and validation only.