00001 #ifndef RECOTRACKER_RING_H
00002 #define RECOTRACKER_RING_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <iostream>
00021 #include <map>
00022 #include <sstream>
00023 #include <fstream>
00024 #include <utility>
00025
00026 #include "DataFormats/DetId/interface/DetId.h"
00027
00028 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00029 #include "DataFormats/GeometryVector/interface/Pi.h"
00030
00031 class Ring {
00032
00033 public:
00034
00035 typedef std::multimap<double,DetId> DetIdMap;
00036 typedef DetIdMap::iterator iterator;
00037 typedef DetIdMap::const_iterator const_iterator;
00038 typedef std::pair<iterator,iterator> IteratorRange;
00039 typedef std::pair<const_iterator,const_iterator> ConstIteratorRange;
00040
00041 enum type {
00042 TIBRing,
00043 TOBRing,
00044 TIDRing,
00045 TECRing,
00046 PXBRing,
00047 PXFRing,
00048 Unspecified
00049 };
00050
00051 Ring() : initialized_(false),
00052 rmin_(0.),
00053 rmax_(0.),
00054 zmin_(0.),
00055 zmax_(0.),
00056 type_(Unspecified),
00057 index_(0) {}
00058
00059 Ring(type input) : initialized_(false),
00060 rmin_(0.),
00061 rmax_(0.),
00062 zmin_(0.),
00063 zmax_(0.),
00064 type_(input),
00065 index_(0) {}
00066
00067 Ring(unsigned int index,
00068 float rmin,
00069 float rmax,
00070 float zmin,
00071 float zmax,
00072 unsigned int type) : initialized_(true),
00073 rmin_(rmin),
00074 rmax_(rmax),
00075 zmin_(zmin),
00076 zmax_(zmax),
00077 index_(index) {
00078 if ( type == 0 ) {
00079 type_ = TIBRing;
00080 } else if ( type == 1 ) {
00081 type_ = TOBRing;
00082 } else if ( type == 2 ) {
00083 type_ = TIDRing;
00084 } else if ( type == 3 ) {
00085 type_ = TECRing;
00086 } else if ( type == 4 ) {
00087 type_ = PXBRing;
00088 } else if ( type == 5 ) {
00089 type_ = PXFRing;
00090 } else {
00091 type_ = Unspecified;
00092 }
00093 }
00094
00095 Ring(Ring* input) : detids_(input->getDetIdMap()),
00096 initialized_(input->isInitialized()),
00097 rmin_(input->getrmin()),
00098 rmax_(input->getrmax()),
00099 zmin_(input->getzmin()),
00100 zmax_(input->getzmax()),
00101 type_(input->getType()),
00102 index_(input->getindex()) {}
00103
00104 ~Ring() {}
00105
00106 inline void addId(double phi, DetId id) { detids_.insert(std::make_pair(phi,id)); }
00107
00108 inline int getNumDetIds() const { return detids_.size(); }
00109
00110 inline bool containsDetId(DetId id, double phi = 999999.,
00111 double dphi_scalefactor = 1.5) const {
00112
00113
00114
00115 double phi_inner = -Geom::pi();
00116 double phi_outer = Geom::pi();
00117 double delta_phi = Geom::twoPi() / detids_.size();
00118 if ( phi != 999999. ) {
00119 phi_inner = map_phi(phi - dphi_scalefactor*delta_phi);
00120 phi_outer = map_phi(phi + dphi_scalefactor*delta_phi);
00121 }
00122
00123
00124 if ( phi_inner > phi_outer ) {
00125
00126 for ( const_iterator ring = detids_.lower_bound(phi_inner); ring != detids_.end(); ++ring ) {
00127 if ( id == ring->second ) {
00128 return true;
00129 }
00130 }
00131 for ( const_iterator ring = detids_.begin(); ring != detids_.upper_bound(phi_outer); ++ring ) {
00132 if ( id == ring->second ) {
00133 return true;
00134 }
00135 }
00136 } else {
00137 for ( const_iterator ring = detids_.lower_bound(phi_inner); ring != detids_.upper_bound(phi_outer); ++ring ) {
00138 if ( id == ring->second ) {
00139 return true;
00140 }
00141 }
00142 }
00143
00144 return false;
00145 }
00146
00147 inline const_iterator begin() const { return detids_.begin(); }
00148 inline const_iterator end() const { return detids_.end(); }
00149
00150 inline iterator begin() { return detids_.begin(); }
00151 inline iterator end() { return detids_.end(); }
00152
00153 inline bool isInitialized() const { return initialized_; }
00154
00155 inline float getrmin() const { if ( !isInitialized() ) notInitializedMsg(); return rmin_; }
00156 inline float getrmax() const { if ( !isInitialized() ) notInitializedMsg(); return rmax_; }
00157 inline float getzmin() const { if ( !isInitialized() ) notInitializedMsg(); return zmin_; }
00158 inline float getzmax() const { if ( !isInitialized() ) notInitializedMsg(); return zmax_; }
00159
00160 inline void setrmin(float input) { rmin_ = input; }
00161 inline void setrmax(float input) { rmax_ = input; }
00162 inline void setzmin(float input) { zmin_ = input; }
00163 inline void setzmax(float input) { zmax_ = input; }
00164
00165 inline void setInitialized(bool input) { initialized_ = input; }
00166
00167 inline void initialize(float rmin, float rmax, float zmin, float zmax) {
00168 rmin_ = rmin;
00169 rmax_ = rmax;
00170 zmin_ = zmin;
00171 zmax_ = zmax;
00172 initialized_ = true; }
00173
00174 inline void notInitializedMsg() const {
00175 edm::LogWarning("RoadSearch") << "Ring " << index_ << " does not have initialized values for r_min, r_max, z_min, z_max! Using default value of 0. !"; }
00176
00177 inline void setType(type input) { type_ = input; }
00178
00179 inline type getType() const { return type_; }
00180
00181 inline DetId getFirst() const { return detids_.begin()->second; }
00182
00183 inline void setindex(unsigned int input) { index_ = input; }
00184
00185 inline unsigned int getindex() const { return index_; }
00186
00187 inline DetIdMap getDetIdMap() const { return detids_; }
00188
00190 int operator==(const Ring& ring) const { return index_==ring.getindex(); }
00192 int operator!=(const Ring& ring) const { return index_!=ring.getindex(); }
00194 int operator<(const Ring& ring) const { return index_<ring.getindex(); }
00195
00196 inline std::string print() const {
00197 std::ostringstream stream;
00198 stream << "Ring: " << index_
00199 << " rmin: " << rmin_
00200 << " rmax: " << rmax_
00201 << " zmin: " << zmin_
00202 << " zmax: " << zmax_
00203 << " number of DetUnits: " << detids_.size();
00204 return stream.str();
00205 }
00206
00207 inline std::string dump() const {
00208 std::ostringstream stream;
00209 stream << "### Ring with index: " << index_ << " ###" << std::endl;
00210 stream << index_
00211 << " " << rmin_
00212 << " " << rmax_
00213 << " " << zmin_
00214 << " " << zmax_
00215 << " " << type_ << std::endl;
00216 stream << detids_.size() << std::endl;
00217 for ( const_iterator entry = detids_.begin(); entry != detids_.end(); ++entry ) {
00218 stream << entry->first << " " << entry->second.rawId() << std::endl;
00219 }
00220 return stream.str();
00221 }
00222
00223 inline const_iterator lower_bound(double phi) const { return detids_.lower_bound(phi); }
00224 inline const_iterator upper_bound(double phi) const { return detids_.upper_bound(phi); }
00225
00226 inline double map_phi(double phi) const {
00227
00228 double result = phi;
00229 if ( result < -Geom::pi()) result += Geom::twoPi();
00230 if ( result > Geom::pi()) result -= Geom::twoPi();
00231 return result;
00232 }
00233
00234 private:
00235
00236 DetIdMap detids_;
00237
00238 bool initialized_;
00239
00240 float rmin_;
00241 float rmax_;
00242 float zmin_;
00243 float zmax_;
00244
00245 type type_;
00246
00247 unsigned int index_;
00248
00249 };
00250
00251 #endif