CMS 3D CMS Logo

RectangularCylindricalMFGrid.cc
Go to the documentation of this file.
4 #include <iostream>
5 
6 using namespace std;
7 
9  const GloballyPositioned<float>& vol)
10  : MFGrid3D(vol) {
11  // The parameters read from the data files are given in global coordinates.
12  // In version 85l, local frame has the same orientation of global frame for the reference
13  // volume, i.e. the r.f. transformation is only a translation.
14  // There is therefore no need to convert the field values to local coordinates.
15  // Check this assumption:
16  GlobalVector localXDir(frame().toGlobal(LocalVector(1, 0, 0)));
17  GlobalVector localYDir(frame().toGlobal(LocalVector(0, 1, 0)));
18 
19  if (localXDir.dot(GlobalVector(1, 0, 0)) > 0.999999 && localYDir.dot(GlobalVector(0, 1, 0)) > 0.999999) {
20  // "null" rotation - requires no conversion...
21  } else {
22  cout << "ERROR: RectangularCylindricalMFGrid: unexpected orientation: x: " << localXDir << " y: " << localYDir
23  << endl;
24  }
25 
26  int n1, n2, n3;
27  inFile >> n1 >> n2 >> n3;
28  double xref, yref, zref;
29  inFile >> xref >> yref >> zref;
30  double stepx, stepy, stepz;
31  inFile >> stepx >> stepy >> stepz;
32 
33  vector<BVector> fieldValues;
34  float Bx, By, Bz;
35  int nLines = n1 * n2 * n3;
36  fieldValues.reserve(nLines);
37  for (int iLine = 0; iLine < nLines; ++iLine) {
38  inFile >> Bx >> By >> Bz;
39  fieldValues.push_back(BVector(Bx, By, Bz));
40  }
41  // check completeness
42  string lastEntry;
43  inFile >> lastEntry;
44  if (lastEntry != "complete") {
45  cout << "ERROR during file reading: file is not complete" << endl;
46  }
47 
48  GlobalPoint grefp(GlobalPoint::Cylindrical(xref, yref, zref));
49  LocalPoint lrefp = frame().toLocal(grefp);
50 
51 #ifdef DEBUG_GRID
52  cout << "Grid reference point in grid system: " << xref << "," << yref << "," << zref << endl;
53  cout << "Grid reference point in global x,y,z: " << grefp << endl;
54  cout << "Grid reference point in local x,y,z: " << lrefp << endl;
55  cout << "steps " << stepx << "," << stepy << "," << stepz << endl;
56 #endif
57 
58  Grid1D gridX(lrefp.perp(), lrefp.perp() + stepx * (n1 - 1), n1);
59  //Grid1D gridY( lrefp.phi(), lrefp.phi() + stepy*(n2-1), n2); // wrong: gives zero
60  Grid1D gridY(yref, yref + stepy * (n2 - 1), n2);
61  Grid1D gridZ(lrefp.z(), lrefp.z() + stepz * (n3 - 1), n3);
62 
63  grid_ = GridType(gridX, gridY, gridZ, fieldValues);
64 }
65 
67  cout << endl << "Dump of RectangularCylindricalMFGrid" << endl;
68  cout << "Number of points from Grid1D " << grid_.grida().nodes() << " " << grid_.gridb().nodes() << " "
69  << grid_.gridc().nodes() << endl;
70 
71  cout << "Reference Point from Grid1D " << grid_.grida().lower() << " " << grid_.gridb().lower() << " "
72  << grid_.gridc().lower() << endl;
73 
74  cout << "Basic Distance from Grid1D " << grid_.grida().step() << " " << grid_.gridb().step() << " "
75  << grid_.gridc().step() << endl;
76 
77  cout << "Dumping " << grid_.data().size() << " field values " << endl;
78  // grid_.dump();
79 }
80 
82  const float minimalSignificantR = 1e-6; // [cm], points below this radius are treated as zero radius
83  float R = p.perp();
84  if (R < minimalSignificantR) {
85  if (grid_.grida().lower() < minimalSignificantR) {
86  int k = grid_.gridc().index(p.z());
87  double u = (p.z() - grid_.gridc().node(k)) / grid_.gridc().step();
88  LocalVector result((1 - u) * grid_(0, 0, k) + u * grid_(0, 0, k + 1));
89  return result;
90  }
91  }
92 
94  // FIXME: "OLD" convention of phi.
95  // GridType::ValueType value = interpol( R, Geom::pi() - p.phi(), p.z());
96  GridType::ReturnType value = interpol.interpolate(R, p.phi(), p.z());
97  return LocalVector(value);
98 }
99 
100 void RectangularCylindricalMFGrid::toGridFrame(const LocalPoint& p, double& a, double& b, double& c) const {
101  a = p.perp();
102  // FIXME: "OLD" convention of phi.
103  // b = Geom::pi() - p.phi();
104  b = p.phi();
105  c = p.z();
106 }
107 
109  // FIXME: "OLD" convention of phi.
110  // return LocalPoint( LocalPoint::Cylindrical(a, Geom::pi() - b, c));
112 }
const Container & data() const
Definition: Grid3D.h:63
const Grid1D & grida() const
Definition: Grid3D.h:59
LocalPoint fromGridFrame(double a, double b, double c) const override
find grid coordinates for point. For debugging and validation only.
Scalar lower() const
Definition: Grid1D.h:19
Scalar step() const
Definition: Grid1D.h:18
GloballyPositioned< float >::GlobalVector GlobalVector
Definition: MFGrid.h:30
GloballyPositioned< float >::LocalPoint LocalPoint
Definition: MFGrid.h:31
int index(Scalar a, Scalar &f) const
Definition: Grid1D.h:29
ReturnType interpolate(Scalar a, Scalar b, Scalar c)
LocalPoint toLocal(const GlobalPoint &gp) const
LocalVector uncheckedValueInTesla(const LocalPoint &p) const override
Interpolated field value at given point; does not check for exceptions.
Scalar node(int i) const
Definition: Grid1D.h:24
const GloballyPositioned< float > & frame() const
Local reference frame.
Definition: MFGrid.h:60
Definition: value.py:1
int nodes() const
Definition: Grid1D.h:21
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
void toGridFrame(const LocalPoint &p, double &a, double &b, double &c) const override
find grid coordinates for point. For debugging and validation only.
double b
Definition: hdecay.h:118
const Grid1D & gridb() const
Definition: Grid3D.h:60
const Grid1D & gridc() const
Definition: Grid3D.h:61
GloballyPositioned< float >::LocalVector LocalVector
Definition: MFGrid.h:32
double a
Definition: hdecay.h:119
RectangularCylindricalMFGrid(binary_ifstream &istr, const GloballyPositioned< float > &vol)