CMS 3D CMS Logo

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