CMS 3D CMS Logo

PhiBorderFinder.cc
Go to the documentation of this file.
2 
3 PhiBorderFinder::PhiBorderFinder(const std::vector<const Det*>& utheDets)
4  : theNbins(utheDets.size()),
5  isPhiPeriodic_(false),
6  isPhiOverlapping_(false) {
7  std::vector<const Det*> theDets = utheDets;
8  precomputed_value_sort(theDets.begin(), theDets.end(), DetPhi());
9 
10  const std::string metname = "Muon|RecoMuon|RecoMuonDetLayers|PhiBorderFinder";
11 
12  double step = 2.*Geom::pi()/theNbins;
13 
14  LogTrace(metname) << "RecoMuonDetLayers::PhiBorderFinder "
15  << "step w: " << step << " # of bins: " << theNbins;
16 
17  std::vector<double> spread(theNbins);
18  std::vector<std::pair<double,double> > phiEdge;
19  phiEdge.reserve(theNbins);
20  thePhiBorders.reserve(theNbins);
21  thePhiBins.reserve(theNbins);
22  for ( unsigned int i = 0; i < theNbins; i++ ) {
23  thePhiBins.push_back(theDets[i]->position().phi());
24  spread.push_back(theDets[i]->position().phi()
25  - (theDets[0]->position().phi() + i*step));
26 
27  LogTrace(metname) << "bin: " << i << " phi bin: " << thePhiBins[i]
28  << " spread: " << spread[i];
29 
30 
32  dynamic_cast<const BoundPlane*>(&theDets[i]->surface());
33  if (plane==nullptr) {
34  //FIXME
35  throw cms::Exception("UnexpectedState") << ("PhiBorderFinder: det surface is not a BoundPlane");
36  }
37 
38  std::vector<GlobalPoint> dc =
39  BoundingBox().corners(*plane);
40 
41  float phimin(999.), phimax(-999.);
42  for (std::vector<GlobalPoint>::const_iterator pt=dc.begin();
43  pt!=dc.end(); pt++) {
44  float phi = (*pt).phi();
45  // float z = pt->z();
46  if (phi < phimin) phimin = phi;
47  if (phi > phimax) phimax = phi;
48  }
49  if (phimin*phimax < 0. && //Handle pi border:
50  phimax - phimin > Geom::pi()) { //Assume that the Det is on
51  //the shortest side
52  std::swap(phimin,phimax);
53  }
54  phiEdge.push_back(std::pair<double,double>(phimin,phimax));
55  }
56 
57  for (unsigned int i = 0; i < theNbins; i++) {
58 
59  // Put the two phi values in the [0,2pi] range
60  double firstPhi = positiveRange(phiEdge[i].first);
61  double secondPhi = positiveRange(phiEdge[binIndex(i-1)].second);
62 
63  // Reformat them in the [-pi,pi] range
64  Geom::Phi<double> firstEdge(firstPhi);
65  Geom::Phi<double> secondEdge(secondPhi);
66 
67  // Calculate the mean and format the result in the [-pi,pi] range
68  // Get their value in order to perform the mean in the correct way
69  Geom::Phi<double> mean((firstEdge.value() + secondEdge.value())/2.);
70 
71  // Special case: at +-pi there is a discontinuity
72  if ( phiEdge[i].first * phiEdge[binIndex(i-1)].second < 0 &&
73  fabs(firstPhi-secondPhi) < Geom::pi() )
74  mean = Geom::pi() - mean;
75 
76  thePhiBorders.push_back(mean);
77  }
78 
79  for (unsigned int i = 0; i < theNbins; i++) {
80  if (Geom::Phi<double>(phiEdge[i].first)
81  - Geom::Phi<double>(phiEdge[binIndex(i-1)].second) < 0) {
82  isPhiOverlapping_ = true;
83  break;
84  }
85  }
86 
87  double rms = stat_RMS(spread);
88  if ( rms < 0.01*step) {
89  isPhiPeriodic_ = true;
90  }
91 
92  //Check that everything is proper
93  if (thePhiBorders.size() != theNbins || thePhiBins.size() != theNbins)
94  //FIXME
95  throw cms::Exception("UnexpectedState") << "PhiBorderFinder: consistency error";
96 }
size
Write out results.
const std::string metname
geomsort::ExtractPhi< Det, float > DetPhi
U second(std::pair< T, U > const &p)
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
std::vector< double > thePhiBorders
PhiBorderFinder(const std::vector< const Det * > &utheDets)
double stat_RMS(const CONT &cont)
Definition: simple_stat.h:24
#define LogTrace(id)
T value() const
Explicit access to value in case implicit conversion not OK.
Definition: Phi.h:38
static std::vector< GlobalPoint > corners(const Plane &)
Definition: BoundingBox.cc:24
void precomputed_value_sort(RandomAccessIterator begin, RandomAccessIterator end, const Extractor &extr)
static int position[264][3]
Definition: ReadPGInfo.cc:509
double positiveRange(double phi) const
std::vector< double > thePhiBins
step
constexpr double pi()
Definition: Pi.h:31
int binIndex(int i) const
unsigned int theNbins