CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes | Friends
MagGeometry Class Reference

#include <MagGeometry.h>

Public Types

typedef Surface::GlobalPoint GlobalPoint
 
typedef Surface::GlobalVector GlobalVector
 

Public Member Functions

const std::vector
< MagVolume6Faces * > & 
barrelVolumes () const
 
const std::vector
< MagVolume6Faces * > & 
endcapVolumes () const
 
GlobalVector fieldInTesla (const GlobalPoint &gp) const
 Return field vector at the specified global point. More...
 
MagVolumefindVolume (const GlobalPoint &gp, double tolerance=0.) const
 Find a volume. More...
 
bool isZSymmetric () const
 
 MagGeometry (const edm::ParameterSet &config, std::vector< MagBLayer * >, std::vector< MagESector * >, std::vector< MagVolume6Faces * >, std::vector< MagVolume6Faces * >)
 Constructor. More...
 
 ~MagGeometry ()
 Destructor. More...
 

Private Member Functions

MagVolumefindVolume1 (const GlobalPoint &gp, double tolerance=0.) const
 
bool inBarrel (const GlobalPoint &gp) const
 

Private Attributes

bool cacheLastVolume
 
int geometryVersion
 
MagVolumelastVolume
 
MagBinFinders::GeneralBinFinderInR
< double > * 
theBarrelBinFinder
 
std::vector< MagBLayer * > theBLayers
 
std::vector< MagVolume6Faces * > theBVolumes
 
PeriodicBinFinderInPhi< float > * theEndcapBinFinder
 
std::vector< MagESector * > theESectors
 
std::vector< MagVolume6Faces * > theEVolumes
 

Friends

class MagGeometryExerciser
 

Detailed Description

Entry point to the geometry of magnetic volumes.

Date:
2010/10/13 15:40:20
Revision:
1.11
Author
N. Amapane - INFN Torino

Definition at line 25 of file MagGeometry.h.

Member Typedef Documentation

Definition at line 29 of file MagGeometry.h.

Definition at line 28 of file MagGeometry.h.

Constructor & Destructor Documentation

MagGeometry::MagGeometry ( const edm::ParameterSet config,
std::vector< MagBLayer * >  tbl,
std::vector< MagESector * >  tes,
std::vector< MagVolume6Faces * >  tbv,
std::vector< MagVolume6Faces * >  tev 
)

Constructor.

Definition at line 25 of file MagGeometry.cc.

References cacheLastVolume, gather_cfg::cout, verbose::debugOut, edm::ParameterSet::exists(), geometryVersion, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), Geom::pi(), theBarrelBinFinder, theBLayers, theEndcapBinFinder, and theESectors.

28  :
30 {
31 
32  cacheLastVolume = config.getUntrackedParameter<bool>("cacheLastVolume", true);
33 
34  // FIXME: wait geometryVersion to be propagated to all cfgs.
35  if (config.exists("geometryVersion")) {
36  geometryVersion = config.getParameter<int>("geometryVersion");
37  } else {
38  geometryVersion = 90322;
39  }
40 
41  vector<double> rBorders;
42 
43  for (vector<MagBLayer *>::const_iterator ilay = theBLayers.begin();
44  ilay != theBLayers.end(); ++ilay) {
45  if (verbose::debugOut) cout << " Barrel layer at " << (*ilay)->minR() <<endl;
46  //FIXME assume layers are already sorted in minR
47  rBorders.push_back((*ilay)->minR());
48  }
49 
51 
52  if (verbose::debugOut) {
53  for (vector<MagESector *>::const_iterator isec = theESectors.begin();
54  isec != theESectors.end(); ++isec) {
55  cout << " Endcap sector at " << (*isec)->minPhi() << endl;
56  }
57  }
58 
59  //FIXME assume sectors are already sorted in phi
60  //FIXME: PeriodicBinFinderInPhi gets *center* of first bin
61  int nEBins = theESectors.size();
62  theEndcapBinFinder = new PeriodicBinFinderInPhi<float>(theESectors.front()->minPhi()+Geom::pi()/nEBins, nEBins);
63 
64 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
MagVolume * lastVolume
Definition: MagGeometry.h:63
bool exists(std::string const &parameterName) const
checks if a parameter exists
PeriodicBinFinderInPhi< float > * theEndcapBinFinder
Definition: MagGeometry.h:73
static bool debugOut
Definition: MagVerbosity.h:14
MagBinFinders::GeneralBinFinderInR< double > * theBarrelBinFinder
Definition: MagGeometry.h:72
std::vector< MagVolume6Faces * > theEVolumes
Definition: MagGeometry.h:70
std::vector< MagVolume6Faces * > theBVolumes
Definition: MagGeometry.h:69
std::vector< MagESector * > theESectors
Definition: MagGeometry.h:66
double pi()
Definition: Pi.h:31
tuple cout
Definition: gather_cfg.py:121
bool cacheLastVolume
Definition: MagGeometry.h:75
int geometryVersion
Definition: MagGeometry.h:76
std::vector< MagBLayer * > theBLayers
Definition: MagGeometry.h:65
MagGeometry::~MagGeometry ( )

Destructor.

Definition at line 66 of file MagGeometry.cc.

References theBarrelBinFinder, theBLayers, theEndcapBinFinder, and theESectors.

66  {
67  delete theBarrelBinFinder;
68  delete theEndcapBinFinder;
69 
70  for (vector<MagBLayer *>::const_iterator ilay = theBLayers.begin();
71  ilay != theBLayers.end(); ++ilay) {
72  delete (*ilay);
73  }
74 
75  for (vector<MagESector *>::const_iterator ilay = theESectors.begin();
76  ilay != theESectors.end(); ++ilay) {
77  delete (*ilay);
78  }
79 }
PeriodicBinFinderInPhi< float > * theEndcapBinFinder
Definition: MagGeometry.h:73
MagBinFinders::GeneralBinFinderInR< double > * theBarrelBinFinder
Definition: MagGeometry.h:72
std::vector< MagESector * > theESectors
Definition: MagGeometry.h:66
std::vector< MagBLayer * > theBLayers
Definition: MagGeometry.h:65

Member Function Documentation

const std::vector<MagVolume6Faces*>& MagGeometry::barrelVolumes ( ) const
inline

Definition at line 50 of file MagGeometry.h.

References theBVolumes.

50 {return theBVolumes;}
std::vector< MagVolume6Faces * > theBVolumes
Definition: MagGeometry.h:69
const std::vector<MagVolume6Faces*>& MagGeometry::endcapVolumes ( ) const
inline

Definition at line 51 of file MagGeometry.h.

References theEVolumes.

51 {return theEVolumes;}
std::vector< MagVolume6Faces * > theEVolumes
Definition: MagGeometry.h:70
GlobalVector MagGeometry::fieldInTesla ( const GlobalPoint gp) const

Return field vector at the specified global point.

Definition at line 83 of file MagGeometry.cc.

References MagVolume::fieldInTesla(), findVolume(), edm::detail::isnan(), PV3DBase< T, PVType, FrameType >::mag(), and v.

Referenced by VolumeBasedMagneticField::inTesla(), and VolumeBasedMagneticField::inTeslaUnchecked().

83  {
84  MagVolume * v = 0;
85 
86 
87  v = findVolume(gp);
88  if (v!=0) {
89  return v->fieldInTesla(gp);
90  }
91 
92  // Fall-back case: no volume found
93 
94  if (isnan(gp.mag())) {
95  LogWarning("InvalidInput") << "Input value invalid (not a number): " << gp << endl;
96 
97  } else {
98  LogWarning("MagneticField") << "MagGeometry::fieldInTesla: failed to find volume for " << gp << endl;
99  }
100  return GlobalVector();
101 }
Surface::GlobalVector GlobalVector
Definition: MagGeometry.h:28
T mag() const
Definition: PV3DBase.h:66
bool isnan(float x)
Definition: math.h:13
LocalVector fieldInTesla(const LocalPoint &lp) const
Definition: MagVolume.cc:11
MagVolume * findVolume(const GlobalPoint &gp, double tolerance=0.) const
Find a volume.
Definition: MagGeometry.cc:142
mathSSE::Vec4< T > v
MagVolume * MagGeometry::findVolume ( const GlobalPoint gp,
double  tolerance = 0. 
) const

Find a volume.

Definition at line 142 of file MagGeometry.cc.

References newFWLiteAna::bin, PeriodicBinFinderInPhi< T >::binIndex(), MagBinFinders::GeneralBinFinderInR< T >::binIndex(), cacheLastVolume, gather_cfg::cout, verbose::debugOut, inBarrel(), MagVolume::inside(), lastVolume, max(), PV3DBase< T, PVType, FrameType >::perp(), phi, PV3DBase< T, PVType, FrameType >::phi(), dttmaxenums::R, query::result, theBarrelBinFinder, theBLayers, theEndcapBinFinder, and theESectors.

Referenced by fieldInTesla(), and VolumeBasedMagneticField::findVolume().

142  {
143  // Check volume cache
144  if (lastVolume!=0 && lastVolume->inside(gp)){
145  return lastVolume;
146  }
147 
148  MagVolume * result=0;
149  if (inBarrel(gp)) { // Barrel
150  double R = gp.perp();
151  int bin = theBarrelBinFinder->binIndex(R);
152 
153  for (int bin1 = bin; bin1 >= max(0,bin-2); --bin1) {
154  if (verbose::debugOut) cout << "Trying layer at R " << theBLayers[bin1]->minR()
155  << " " << R << endl ;
156  result = theBLayers[bin1]->findVolume(gp, tolerance);
157  if (verbose::debugOut) cout << "***In blayer " << bin1-bin << " "
158  << (result==0? " failed " : " OK ") <<endl;
159  if (result != 0) break;
160  }
161 
162  } else { // Endcaps
163  Geom::Phi<float> phi = gp.phi();
164  int bin = theEndcapBinFinder->binIndex(phi);
165  if (verbose::debugOut) cout << "Trying endcap sector at phi "
166  << theESectors[bin]->minPhi() << " " << phi << endl ;
167  result = theESectors[bin]->findVolume(gp, tolerance);
168  if (verbose::debugOut) cout << "***In guessed esector "
169  << (result==0? " failed " : " OK ") <<endl;
170  }
171 
172 
173  if (result==0 && tolerance < 0.0001) {
174  // If search fails, retry with a 300 micron tolerance.
175  // This is a hack for thin gaps on air-iron boundaries,
176  // which will not be present anymore once surfaces are matched.
177  if (verbose::debugOut) cout << "Increasing the tolerance to 0.03" <<endl;
178  result = findVolume(gp, 0.03);
179  }
180 
182 
183  return result;
184 }
T perp() const
Definition: PV3DBase.h:71
virtual int binIndex(T R) const
Definition: MagBinFinders.h:68
MagVolume * lastVolume
Definition: MagGeometry.h:63
Geom::Phi< T > phi() const
Definition: PV3DBase.h:68
PeriodicBinFinderInPhi< float > * theEndcapBinFinder
Definition: MagGeometry.h:73
static bool debugOut
Definition: MagVerbosity.h:14
bool inBarrel(const GlobalPoint &gp) const
Definition: MagGeometry.cc:189
virtual int binIndex(T phi) const
returns an index in the valid range for the bin that contains phi
virtual bool inside(const GlobalPoint &gp, double tolerance=0.) const =0
MagBinFinders::GeneralBinFinderInR< double > * theBarrelBinFinder
Definition: MagGeometry.h:72
const T & max(const T &a, const T &b)
tuple result
Definition: query.py:137
std::vector< MagESector * > theESectors
Definition: MagGeometry.h:66
tuple cout
Definition: gather_cfg.py:121
MagVolume * findVolume(const GlobalPoint &gp, double tolerance=0.) const
Find a volume.
Definition: MagGeometry.cc:142
bool cacheLastVolume
Definition: MagGeometry.h:75
std::vector< MagBLayer * > theBLayers
Definition: MagGeometry.h:65
Definition: DDAxes.h:10
MagVolume * MagGeometry::findVolume1 ( const GlobalPoint gp,
double  tolerance = 0. 
) const
private

Definition at line 106 of file MagGeometry.cc.

References gather_cfg::cout, newFWLiteAna::found, inBarrel(), theBVolumes, theEVolumes, and v.

106  {
107 
108  MagVolume6Faces * found = 0;
109 
110  if (inBarrel(gp)) { // Barrel
111  for (vector<MagVolume6Faces*>::const_iterator v = theBVolumes.begin();
112  v!=theBVolumes.end(); ++v){
113  if ((*v)==0) { //FIXME: remove this check
114  cout << endl << "***ERROR: MagGeometry::findVolume: MagVolume not set" << endl;
115  continue;
116  }
117  if ((*v)->inside(gp,tolerance)) {
118  found = (*v);
119  break;
120  }
121  }
122 
123  } else { // Endcaps
124  for (vector<MagVolume6Faces*>::const_iterator v = theEVolumes.begin();
125  v!=theEVolumes.end(); ++v){
126  if ((*v)==0) { //FIXME: remove this check
127  cout << endl << "***ERROR: MagGeometry::findVolume: MagVolume not set" << endl;
128  continue;
129  }
130  if ((*v)->inside(gp,tolerance)) {
131  found = (*v);
132  break;
133  }
134  }
135  }
136 
137  return found;
138 }
bool inBarrel(const GlobalPoint &gp) const
Definition: MagGeometry.cc:189
std::vector< MagVolume6Faces * > theEVolumes
Definition: MagGeometry.h:70
std::vector< MagVolume6Faces * > theBVolumes
Definition: MagGeometry.h:69
tuple cout
Definition: gather_cfg.py:121
mathSSE::Vec4< T > v
bool MagGeometry::inBarrel ( const GlobalPoint gp) const
private

Definition at line 189 of file MagGeometry.cc.

References geometryVersion, PV3DBase< T, PVType, FrameType >::perp(), dttmaxenums::R, Gflash::Z, and PV3DBase< T, PVType, FrameType >::z().

Referenced by findVolume(), and findVolume1().

189  {
190  float Z = fabs(gp.z());
191  float R = gp.perp();
192 
193  // FIXME: Get these dimensions from the builder.
194  if (geometryVersion>=90812) {
195  return (Z<350. ||
196  (R>172.4 && Z<633.89) ||
197  (R>308.755 && Z<662.01));
198  } else {
199  return (Z<350. ||
200  (R>172.4 && Z<633.29) ||
201  (R>308.755 && Z<661.01));
202  }
203 }
const double Z[kNumberCalorimeter]
T perp() const
Definition: PV3DBase.h:71
T z() const
Definition: PV3DBase.h:63
int geometryVersion
Definition: MagGeometry.h:76
bool MagGeometry::isZSymmetric ( ) const
inline

Definition at line 47 of file MagGeometry.h.

Referenced by VolumeBasedMagneticField::isZSymmetric().

47 {return false;}

Friends And Related Function Documentation

friend class MagGeometryExerciser
friend

Definition at line 55 of file MagGeometry.h.

Member Data Documentation

bool MagGeometry::cacheLastVolume
private

Definition at line 75 of file MagGeometry.h.

Referenced by findVolume(), and MagGeometry().

int MagGeometry::geometryVersion
private

Definition at line 76 of file MagGeometry.h.

Referenced by inBarrel(), and MagGeometry().

MagVolume* MagGeometry::lastVolume
mutableprivate

Definition at line 63 of file MagGeometry.h.

Referenced by findVolume().

MagBinFinders::GeneralBinFinderInR<double>* MagGeometry::theBarrelBinFinder
private

Definition at line 72 of file MagGeometry.h.

Referenced by findVolume(), MagGeometry(), and ~MagGeometry().

std::vector<MagBLayer *> MagGeometry::theBLayers
private

Definition at line 65 of file MagGeometry.h.

Referenced by findVolume(), MagGeometry(), and ~MagGeometry().

std::vector<MagVolume6Faces*> MagGeometry::theBVolumes
private

Definition at line 69 of file MagGeometry.h.

Referenced by barrelVolumes(), and findVolume1().

PeriodicBinFinderInPhi<float>* MagGeometry::theEndcapBinFinder
private

Definition at line 73 of file MagGeometry.h.

Referenced by findVolume(), MagGeometry(), and ~MagGeometry().

std::vector<MagESector *> MagGeometry::theESectors
private

Definition at line 66 of file MagGeometry.h.

Referenced by findVolume(), MagGeometry(), and ~MagGeometry().

std::vector<MagVolume6Faces*> MagGeometry::theEVolumes
private

Definition at line 70 of file MagGeometry.h.

Referenced by endcapVolumes(), and findVolume1().