CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes
PhiBorderFinder Class Reference

#include <PhiBorderFinder.h>

Public Types

typedef DetRod Det
 
typedef geomsort::ExtractPhi< Det, float > DetPhi
 

Public Member Functions

bool isPhiOverlapping () const
 Returns true if any 2 of the Det overlap in phi. More...
 
bool isPhiPeriodic () const
 Returns true if the Dets are periodic in phi. More...
 
unsigned int nBins ()
 
const std::vector< double > & phiBins () const
 The centers of the Dets. More...
 
 PhiBorderFinder (const std::vector< const Det * > &utheDets)
 
const std::vector< double > & phiBorders () const
 
virtual ~PhiBorderFinder ()
 

Private Member Functions

int binIndex (int i) const
 
double positiveRange (double phi) const
 

Private Attributes

bool isPhiOverlapping_
 
bool isPhiPeriodic_
 
unsigned int theNbins
 
std::vector< double > thePhiBins
 
std::vector< double > thePhiBorders
 

Detailed Description

Find the phi binning of a list of detector according to several definitions.

Author
N. Amapane - INFN Torino

Definition at line 27 of file PhiBorderFinder.h.

Member Typedef Documentation

Definition at line 30 of file PhiBorderFinder.h.

Definition at line 31 of file PhiBorderFinder.h.

Constructor & Destructor Documentation

PhiBorderFinder::PhiBorderFinder ( const std::vector< const Det * > &  utheDets)
inline

Definition at line 34 of file PhiBorderFinder.h.

References binIndex(), BoundingBox::corners(), Exception, plotBeamSpotDB::first, mps_fire::i, isPhiOverlapping_, isPhiPeriodic_, LogTrace, RecoTauDiscriminantConfiguration::mean, metname, phi, phimax, phimin, Geom::pi(), position, positiveRange(), precomputed_value_sort(), EnergyCorrector::pt, RecoTauDiscriminantConfiguration::rms, edm::second(), stat_RMS(), AlCaHLTBitMon_QueryRunRegistry::string, std::swap(), theNbins, thePhiBins, thePhiBorders, and Geom::Phi< T >::value().

35  : theNbins(utheDets.size()), isPhiPeriodic_(false), isPhiOverlapping_(false) {
36  std::vector<const Det*> theDets = utheDets;
37  precomputed_value_sort(theDets.begin(), theDets.end(), DetPhi());
38 
39  const std::string metname = "Muon|RecoMuon|RecoMuonDetLayers|PhiBorderFinder";
40 
41  double step = 2.*Geom::pi()/theNbins;
42 
43  LogTrace(metname) << "RecoMuonDetLayers::PhiBorderFinder "
44  << "step w: " << step << " # of bins: " << theNbins;
45 
46  std::vector<double> spread(theNbins);
47  std::vector<std::pair<double,double> > phiEdge;
48  phiEdge.reserve(theNbins);
49  thePhiBorders.reserve(theNbins);
50  thePhiBins.reserve(theNbins);
51  for ( unsigned int i = 0; i < theNbins; i++ ) {
52  thePhiBins.push_back(theDets[i]->position().phi());
53  spread.push_back(theDets[i]->position().phi()
54  - (theDets[0]->position().phi() + i*step));
55 
56  LogTrace(metname) << "bin: " << i << " phi bin: " << thePhiBins[i]
57  << " spread: " << spread[i];
58 
59 
61  dynamic_cast<const BoundPlane*>(&theDets[i]->surface());
62  if (plane==0) {
63  //FIXME
64  throw cms::Exception("UnexpectedState") << ("PhiBorderFinder: det surface is not a BoundPlane");
65  }
66 
67  std::vector<GlobalPoint> dc =
68  BoundingBox().corners(*plane);
69 
70  float phimin(999.), phimax(-999.);
71  for (std::vector<GlobalPoint>::const_iterator pt=dc.begin();
72  pt!=dc.end(); pt++) {
73  float phi = (*pt).phi();
74 // float z = pt->z();
75  if (phi < phimin) phimin = phi;
76  if (phi > phimax) phimax = phi;
77  }
78  if (phimin*phimax < 0. && //Handle pi border:
79  phimax - phimin > Geom::pi()) { //Assume that the Det is on
80  //the shortest side
82  }
83  phiEdge.push_back(std::pair<double,double>(phimin,phimax));
84  }
85 
86  for (unsigned int i = 0; i < theNbins; i++) {
87 
88  // Put the two phi values in the [0,2pi] range
89  double firstPhi = positiveRange(phiEdge[i].first);
90  double secondPhi = positiveRange(phiEdge[binIndex(i-1)].second);
91 
92  // Reformat them in the [-pi,pi] range
93  Geom::Phi<double> firstEdge(firstPhi);
94  Geom::Phi<double> secondEdge(secondPhi);
95 
96  // Calculate the mean and format the result in the [-pi,pi] range
97  // Get their value in order to perform the mean in the correct way
98  Geom::Phi<double> mean((firstEdge.value() + secondEdge.value())/2.);
99 
100  // Special case: at +-pi there is a discontinuity
101  if ( phiEdge[i].first * phiEdge[binIndex(i-1)].second < 0 &&
102  fabs(firstPhi-secondPhi) < Geom::pi() )
103  mean = Geom::pi() - mean;
104 
105  thePhiBorders.push_back(mean);
106  }
107 
108  for (unsigned int i = 0; i < theNbins; i++) {
109  if (Geom::Phi<double>(phiEdge[i].first)
110  - Geom::Phi<double>(phiEdge[binIndex(i-1)].second) < 0) {
111  isPhiOverlapping_ = true;
112  break;
113  }
114  }
115 
116  double rms = stat_RMS(spread);
117  if ( rms < 0.01*step) {
118  isPhiPeriodic_ = true;
119  }
120 
121  //Check that everything is proper
122  if (thePhiBorders.size() != theNbins || thePhiBins.size() != theNbins)
123  //FIXME
124  throw cms::Exception("UnexpectedState") << "PhiBorderFinder: consistency error";
125  }
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
double stat_RMS(const CONT &cont)
Definition: simple_stat.h:20
#define LogTrace(id)
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
virtual PhiBorderFinder::~PhiBorderFinder ( )
inlinevirtual

Definition at line 128 of file PhiBorderFinder.h.

128 {};

Member Function Documentation

int PhiBorderFinder::binIndex ( int  i) const
inlineprivate

Definition at line 160 of file PhiBorderFinder.h.

References createfilelist::int.

Referenced by PhiBorderFinder().

160  {
161  int ind = i % (int)theNbins;
162  return (ind < 0) ? ind+theNbins : ind;
163  }
unsigned int theNbins
bool PhiBorderFinder::isPhiOverlapping ( ) const
inline

Returns true if any 2 of the Det overlap in phi.

Definition at line 136 of file PhiBorderFinder.h.

References isPhiOverlapping_.

Referenced by MuRodBarrelLayer::MuRodBarrelLayer().

136 { return isPhiOverlapping_; }
bool PhiBorderFinder::isPhiPeriodic ( ) const
inline

Returns true if the Dets are periodic in phi.

Definition at line 133 of file PhiBorderFinder.h.

References isPhiPeriodic_.

Referenced by MuRodBarrelLayer::MuRodBarrelLayer().

133 { return isPhiPeriodic_; }
unsigned int PhiBorderFinder::nBins ( )
inline

Definition at line 130 of file PhiBorderFinder.h.

References theNbins.

130 {return theNbins;}
unsigned int theNbins
const std::vector<double>& PhiBorderFinder::phiBins ( ) const
inline

The centers of the Dets.

Definition at line 143 of file PhiBorderFinder.h.

References thePhiBins.

Referenced by GeneralBinFinderInPhi< T >::GeneralBinFinderInPhi().

143 { return thePhiBins; }
std::vector< double > thePhiBins
const std::vector<double>& PhiBorderFinder::phiBorders ( ) const
inline

The borders, defined for each det as the middle between its lower edge and the previous Det's upper edge.

Definition at line 140 of file PhiBorderFinder.h.

References thePhiBorders.

Referenced by GeneralBinFinderInPhi< T >::GeneralBinFinderInPhi().

140 { return thePhiBorders; }
std::vector< double > thePhiBorders
double PhiBorderFinder::positiveRange ( double  phi) const
inlineprivate

Definition at line 155 of file PhiBorderFinder.h.

References Geom::twoPi().

Referenced by PhiBorderFinder().

156  {
157  return (phi > 0) ? phi : phi + Geom::twoPi();
158  }
constexpr double twoPi()
Definition: Pi.h:32

Member Data Documentation

bool PhiBorderFinder::isPhiOverlapping_
private

Definition at line 151 of file PhiBorderFinder.h.

Referenced by isPhiOverlapping(), and PhiBorderFinder().

bool PhiBorderFinder::isPhiPeriodic_
private

Definition at line 150 of file PhiBorderFinder.h.

Referenced by isPhiPeriodic(), and PhiBorderFinder().

unsigned int PhiBorderFinder::theNbins
private

Definition at line 149 of file PhiBorderFinder.h.

Referenced by nBins(), and PhiBorderFinder().

std::vector<double> PhiBorderFinder::thePhiBins
private

Definition at line 153 of file PhiBorderFinder.h.

Referenced by phiBins(), and PhiBorderFinder().

std::vector<double> PhiBorderFinder::thePhiBorders
private

Definition at line 152 of file PhiBorderFinder.h.

Referenced by PhiBorderFinder(), and phiBorders().