#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. | |
bool | isPhiPeriodic () const |
Returns true if the Dets are periodic in phi. | |
unsigned int | nBins () |
const std::vector< double > & | phiBins () const |
The centers of the Dets. | |
PhiBorderFinder (std::vector< const Det * > theDets) | |
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 |
Find the phi binning of a list of detector according to several definitions.
Definition at line 29 of file PhiBorderFinder.h.
typedef DetRod PhiBorderFinder::Det |
Definition at line 32 of file PhiBorderFinder.h.
typedef geomsort::ExtractPhi<Det,float> PhiBorderFinder::DetPhi |
Definition at line 33 of file PhiBorderFinder.h.
PhiBorderFinder::PhiBorderFinder | ( | std::vector< const Det * > | theDets | ) | [inline] |
Definition at line 36 of file PhiBorderFinder.h.
References binIndex(), BoundingBox::corners(), Exception, first, i, isPhiOverlapping_, isPhiPeriodic_, LogTrace, plotscripts::mean(), metname, phi, Geom::pi(), pi, position, positiveRange(), precomputed_value_sort(), plotscripts::rms(), edm::second(), stat_RMS(), launcher::step, swap(), theNbins, thePhiBins, thePhiBorders, and Geom::Phi< T >::value().
: theNbins(theDets.size()), isPhiPeriodic_(false), isPhiOverlapping_(false) { precomputed_value_sort(theDets.begin(), theDets.end(), DetPhi()); const std::string metname = "Muon|RecoMuon|RecoMuonDetLayers|PhiBorderFinder"; double step = 2.*Geom::pi()/theNbins; LogTrace(metname) << "RecoMuonDetLayers::PhiBorderFinder " << "step w: " << step << " # of bins: " << theNbins; std::vector<double> spread(theNbins); std::vector<std::pair<double,double> > phiEdge; phiEdge.reserve(theNbins); thePhiBorders.reserve(theNbins); thePhiBins.reserve(theNbins); for ( unsigned int i = 0; i < theNbins; i++ ) { thePhiBins.push_back(theDets[i]->position().phi()); spread.push_back(theDets[i]->position().phi() - (theDets[0]->position().phi() + i*step)); LogTrace(metname) << "bin: " << i << " phi bin: " << thePhiBins[i] << " spread: " << spread[i]; ConstReferenceCountingPointer<BoundPlane> plane = dynamic_cast<const BoundPlane*>(&theDets[i]->surface()); if (plane==0) { //FIXME throw cms::Exception("UnexpectedState") << ("PhiBorderFinder: det surface is not a BoundPlane"); } std::vector<GlobalPoint> dc = BoundingBox().corners(*plane); float phimin(999.), phimax(-999.); for (std::vector<GlobalPoint>::const_iterator pt=dc.begin(); pt!=dc.end(); pt++) { float phi = (*pt).phi(); // float z = pt->z(); if (phi < phimin) phimin = phi; if (phi > phimax) phimax = phi; } if (phimin*phimax < 0. && //Handle pi border: phimax - phimin > Geom::pi()) { //Assume that the Det is on //the shortest side std::swap(phimin,phimax); } phiEdge.push_back(std::pair<double,double>(phimin,phimax)); } for (unsigned int i = 0; i < theNbins; i++) { // Put the two phi values in the [0,2pi] range double firstPhi = positiveRange(phiEdge[i].first); double secondPhi = positiveRange(phiEdge[binIndex(i-1)].second); // Reformat them in the [-pi,pi] range Geom::Phi<double> firstEdge(firstPhi); Geom::Phi<double> secondEdge(secondPhi); // Calculate the mean and format the result in the [-pi,pi] range // Get their value in order to perform the mean in the correct way Geom::Phi<double> mean((firstEdge.value() + secondEdge.value())/2.); // Special case: at +-pi there is a discontinuity if ( phiEdge[i].first * phiEdge[binIndex(i-1)].second < 0 && fabs(firstPhi-secondPhi) < Geom::pi() ) mean = Geom::pi() - mean; thePhiBorders.push_back(mean); } for (unsigned int i = 0; i < theNbins; i++) { if (Geom::Phi<double>(phiEdge[i].first) - Geom::Phi<double>(phiEdge[binIndex(i-1)].second) < 0) { isPhiOverlapping_ = true; break; } } double rms = stat_RMS(spread); if ( rms < 0.01*step) { isPhiPeriodic_ = true; } //Check that everything is proper if (thePhiBorders.size() != theNbins || thePhiBins.size() != theNbins) //FIXME throw cms::Exception("UnexpectedState") << "PhiBorderFinder: consistency error"; }
virtual PhiBorderFinder::~PhiBorderFinder | ( | ) | [inline, virtual] |
Definition at line 129 of file PhiBorderFinder.h.
{};
int PhiBorderFinder::binIndex | ( | int | i | ) | const [inline, private] |
Definition at line 161 of file PhiBorderFinder.h.
References theNbins.
Referenced by PhiBorderFinder().
bool PhiBorderFinder::isPhiOverlapping | ( | ) | const [inline] |
Returns true if any 2 of the Det overlap in phi.
Definition at line 137 of file PhiBorderFinder.h.
References isPhiOverlapping_.
Referenced by MuRodBarrelLayer::MuRodBarrelLayer().
{ return isPhiOverlapping_; }
bool PhiBorderFinder::isPhiPeriodic | ( | ) | const [inline] |
Returns true if the Dets are periodic in phi.
Definition at line 134 of file PhiBorderFinder.h.
References isPhiPeriodic_.
Referenced by MuRodBarrelLayer::MuRodBarrelLayer().
{ return isPhiPeriodic_; }
unsigned int PhiBorderFinder::nBins | ( | ) | [inline] |
const std::vector<double>& PhiBorderFinder::phiBins | ( | ) | const [inline] |
The centers of the Dets.
Definition at line 144 of file PhiBorderFinder.h.
References thePhiBins.
Referenced by GeneralBinFinderInPhi< T >::GeneralBinFinderInPhi().
{ return 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 141 of file PhiBorderFinder.h.
References thePhiBorders.
Referenced by GeneralBinFinderInPhi< T >::GeneralBinFinderInPhi().
{ return thePhiBorders; }
double PhiBorderFinder::positiveRange | ( | double | phi | ) | const [inline, private] |
Definition at line 156 of file PhiBorderFinder.h.
References Geom::twoPi().
Referenced by PhiBorderFinder().
{ return (phi > 0) ? phi : phi + Geom::twoPi(); }
bool PhiBorderFinder::isPhiOverlapping_ [private] |
Definition at line 152 of file PhiBorderFinder.h.
Referenced by isPhiOverlapping(), and PhiBorderFinder().
bool PhiBorderFinder::isPhiPeriodic_ [private] |
Definition at line 151 of file PhiBorderFinder.h.
Referenced by isPhiPeriodic(), and PhiBorderFinder().
unsigned int PhiBorderFinder::theNbins [private] |
Definition at line 150 of file PhiBorderFinder.h.
Referenced by binIndex(), nBins(), and PhiBorderFinder().
std::vector<double> PhiBorderFinder::thePhiBins [private] |
Definition at line 154 of file PhiBorderFinder.h.
Referenced by phiBins(), and PhiBorderFinder().
std::vector<double> PhiBorderFinder::thePhiBorders [private] |
Definition at line 153 of file PhiBorderFinder.h.
Referenced by PhiBorderFinder(), and phiBorders().