00001
00008 #include <RecoMuon/DetLayers/interface/MuonDetLayerGeometry.h>
00009
00010 #include <FWCore/Utilities/interface/Exception.h>
00011 #include <TrackingTools/DetLayers/interface/DetLayer.h>
00012 #include <DataFormats/MuonDetId/interface/CSCDetId.h>
00013 #include <DataFormats/MuonDetId/interface/DTChamberId.h>
00014 #include <DataFormats/MuonDetId/interface/RPCDetId.h>
00015
00016 #include <Utilities/General/interface/precomputed_value_sort.h>
00017 #include <DataFormats/GeometrySurface/interface/GeometricSorting.h>
00018
00019 #include <algorithm>
00020
00021 using namespace std;
00022 using namespace geomsort;
00023
00024 MuonDetLayerGeometry::MuonDetLayerGeometry() {}
00025
00026 MuonDetLayerGeometry::~MuonDetLayerGeometry(){}
00027
00028 void MuonDetLayerGeometry::addCSCLayers(pair<vector<DetLayer*>, vector<DetLayer*> > csclayers) {
00029
00030 vector<DetLayer*>::const_iterator it;
00031 for(it=csclayers.first.begin(); it!=csclayers.first.end(); it++) {
00032 cscLayers_fw.push_back(*it);
00033
00034 allForward.push_back(*it);
00035
00036
00037
00038 detLayersMap[ makeDetLayerId(*it) ] = *it;
00039 }
00040
00041 for(it=csclayers.second.begin(); it!=csclayers.second.end(); it++) {
00042 cscLayers_bk.push_back(*it);
00043
00044 allBackward.push_back(*it);
00045
00046
00047
00048 detLayersMap[ makeDetLayerId(*it) ] = *it;
00049 }
00050 }
00051
00052 void MuonDetLayerGeometry::addRPCLayers(vector<DetLayer*> barrelLayers, pair<vector<DetLayer*>, vector<DetLayer*> > endcapLayers) {
00053
00054 vector<DetLayer*>::const_iterator it;
00055
00056 for (it=barrelLayers.begin();it!=barrelLayers.end();it++){
00057 rpcLayers_barrel.push_back(*it);
00058
00059 allBarrel.push_back(*it);
00060
00061
00062 detLayersMap[ makeDetLayerId(*it) ] = *it;
00063 }
00064 for (it=endcapLayers.first.begin(); it!=endcapLayers.first.end(); it++){
00065 rpcLayers_fw.push_back(*it);
00066
00067
00068 allForward.push_back(*it);
00069
00070
00071
00072 detLayersMap[ makeDetLayerId(*it) ] = *it;
00073 }
00074
00075 for (it=endcapLayers.second.begin(); it!=endcapLayers.second.end(); it++){
00076 rpcLayers_bk.push_back(*it);
00077
00078
00079 allBackward.push_back(*it);
00080
00081
00082
00083 detLayersMap[ makeDetLayerId(*it) ] = *it;
00084 }
00085
00086 }
00087
00088 void MuonDetLayerGeometry::addDTLayers(vector<DetLayer*> dtlayers) {
00089
00090 vector<DetLayer*>::const_iterator it;
00091 for(it=dtlayers.begin(); it!=dtlayers.end(); it++) {
00092 dtLayers.push_back(*it);
00093 allBarrel.push_back(*it);
00094
00095
00096 detLayersMap[ makeDetLayerId(*it) ] = *it;
00097 }
00098 }
00099
00100 DetId MuonDetLayerGeometry::makeDetLayerId(const DetLayer* detLayer) const{
00101
00102 if(detLayer->subDetector() == GeomDetEnumerators::CSC){
00103 CSCDetId id( detLayer->basicComponents().front()->geographicalId().rawId() ) ;
00104
00105 if(id.station() == 1 )
00106 {
00107 if(id.ring() == 1 || id.ring() == 4)
00108 return CSCDetId(id.endcap(),1,1,0,0);
00109 else if(id.ring() == 2 || id.ring() == 3)
00110 return CSCDetId(id.endcap(),1,2,0,0);
00111 else
00112 throw cms::Exception("InvalidCSCRing")<<" Invalid CSC Ring: "<<id.ring()<<endl;
00113 }
00114 else
00115 return CSCDetId(id.endcap(),id.station(),0,0,0);
00116
00117 }
00118 else if(detLayer->subDetector() == GeomDetEnumerators::DT){
00119 DTChamberId id( detLayer->basicComponents().front()->geographicalId().rawId() ) ;
00120 return DTChamberId(0,id.station(),0);
00121 }
00122 else if(detLayer->subDetector()== GeomDetEnumerators::RPCBarrel ||
00123 detLayer->subDetector()== GeomDetEnumerators::RPCEndcap){
00124 RPCDetId id( detLayer->basicComponents().front()->geographicalId().rawId());
00125 return RPCDetId(id.region(),0,id.station(),0,id.layer(),0,0);
00126 }
00127 else throw cms::Exception("InvalidModuleIdentification");
00128 }
00129
00130
00131 const vector<DetLayer*>&
00132 MuonDetLayerGeometry::allDTLayers() const {
00133 return dtLayers;
00134 }
00135
00136 const vector<DetLayer*>&
00137 MuonDetLayerGeometry::allCSCLayers() const {
00138 return cscLayers_all;
00139 }
00140
00141
00142 const vector<DetLayer*>&
00143 MuonDetLayerGeometry::forwardCSCLayers() const {
00144 return cscLayers_fw;
00145 }
00146
00147
00148 const vector<DetLayer*>&
00149 MuonDetLayerGeometry::backwardCSCLayers() const {
00150 return cscLayers_bk;
00151 }
00152
00153
00154 const vector<DetLayer*>&
00155 MuonDetLayerGeometry::allRPCLayers() const {
00156 return rpcLayers_all;
00157 }
00158
00159
00160 const vector<DetLayer*>&
00161 MuonDetLayerGeometry::barrelRPCLayers() const {
00162 return rpcLayers_barrel;
00163 }
00164
00165
00166 const vector<DetLayer*>&
00167 MuonDetLayerGeometry::endcapRPCLayers() const {
00168 return rpcLayers_endcap;
00169 }
00170
00171
00172 const vector<DetLayer*>&
00173 MuonDetLayerGeometry::forwardRPCLayers() const {
00174 return rpcLayers_fw;
00175 }
00176
00177
00178 const vector<DetLayer*>&
00179 MuonDetLayerGeometry::backwardRPCLayers() const {
00180 return rpcLayers_bk;
00181 }
00182
00183
00184 const vector<DetLayer*>&
00185 MuonDetLayerGeometry::allLayers() const {
00186 return allDetLayers;
00187 }
00188
00189
00190 const vector<DetLayer*>&
00191 MuonDetLayerGeometry::allBarrelLayers() const {
00192 return allBarrel;
00193 }
00194
00195 const vector<DetLayer*>&
00196 MuonDetLayerGeometry::allEndcapLayers() const {
00197 return allEndcap;
00198 }
00199
00200
00201 const vector<DetLayer*>&
00202 MuonDetLayerGeometry::allForwardLayers() const {
00203 return allForward;
00204 }
00205
00206
00207 const vector<DetLayer*>&
00208 MuonDetLayerGeometry::allBackwardLayers() const {
00209 return allBackward;
00210 }
00211
00212 const DetLayer* MuonDetLayerGeometry::idToLayer(DetId &detId) const{
00213
00214 DetId id;
00215
00216 if(detId.subdetId() == MuonSubdetId::CSC){
00217 CSCDetId cscId( detId.rawId() );
00218
00219 if(cscId.station() == 1)
00220 {
00221 if(cscId.ring() == 1 || cscId.ring() == 4)
00222 id = CSCDetId(cscId.endcap(),1,1,0,0);
00223 else if(cscId.ring() == 2 || cscId.ring() == 3)
00224 id = CSCDetId(cscId.endcap(),1,2,0,0);
00225 else
00226 throw cms::Exception("InvalidCSCRing")<<" Invalid CSC Ring: "<<cscId.ring()<<endl;
00227 }
00228 else id = CSCDetId(cscId.endcap(),cscId.station(),0,0,0);
00229 }
00230
00231 else if (detId.subdetId() == MuonSubdetId::DT){
00232 DTChamberId dtId( detId.rawId() );
00233 id = DTChamberId(0,dtId.station(),0);
00234 }
00235 else if (detId.subdetId() == MuonSubdetId::RPC){
00236 RPCDetId rpcId(detId.rawId() );
00237 id = RPCDetId(rpcId.region(),0,rpcId.station(),0,rpcId.layer(),0,0);
00238 }
00239
00240 else throw cms::Exception("InvalidSubdetId")<< detId.subdetId();
00241
00242 std::map<DetId,DetLayer*>::const_iterator layer = detLayersMap.find(id);
00243 if (layer == detLayersMap.end()) return 0;
00244 return layer->second;
00245 }
00246
00247
00248
00249
00250 #include <TrackingTools/DetLayers/interface/BarrelDetLayer.h>
00251 struct ExtractBarrelDetLayerR {
00252 typedef Surface::Scalar result_type;
00253 result_type operator()(const DetLayer* p) const {
00254 const BarrelDetLayer * bdl = dynamic_cast<const BarrelDetLayer*>(p);
00255 if (bdl) return bdl->specificSurface().radius();
00256 else return -1.;
00257 }
00258 };
00259
00260 void MuonDetLayerGeometry::sortLayers() {
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271 precomputed_value_sort(allBarrel.begin(), allBarrel.end(), ExtractBarrelDetLayerR());
00272 precomputed_value_sort(allBackward.begin(), allBackward.end(), ExtractAbsZ<DetLayer,float>());
00273 precomputed_value_sort(allForward.begin(), allForward.end(), ExtractAbsZ<DetLayer,float>());
00274
00275
00276
00277
00278 cscLayers_all.reserve(cscLayers_bk.size()+cscLayers_fw.size());
00279 std::copy(cscLayers_bk.begin(),cscLayers_bk.end(),back_inserter(cscLayers_all));
00280 std::reverse(cscLayers_all.begin(),cscLayers_all.end());
00281 std::copy(cscLayers_fw.begin(),cscLayers_fw.end(),back_inserter(cscLayers_all));
00282
00283
00284 rpcLayers_endcap.reserve(rpcLayers_bk.size()+rpcLayers_fw.size());
00285 std::copy(rpcLayers_bk.begin(),rpcLayers_bk.end(),back_inserter(rpcLayers_endcap));
00286 std::reverse(rpcLayers_endcap.begin(),rpcLayers_endcap.end());
00287 std::copy(rpcLayers_fw.begin(),rpcLayers_fw.end(),back_inserter(rpcLayers_endcap));
00288
00289
00290 rpcLayers_all.reserve(rpcLayers_bk.size()+rpcLayers_barrel.size()+rpcLayers_fw.size());
00291 std::copy(rpcLayers_bk.begin(),rpcLayers_bk.end(),back_inserter(rpcLayers_all));
00292 std::reverse(rpcLayers_all.begin(),rpcLayers_all.end());
00293 std::copy(rpcLayers_barrel.begin(),rpcLayers_barrel.end(),back_inserter(rpcLayers_all));
00294 std::copy(rpcLayers_fw.begin(),rpcLayers_fw.end(),back_inserter(rpcLayers_all));
00295
00296
00297 allEndcap.reserve(allBackward.size()+allForward.size());
00298 std::copy(allBackward.begin(),allBackward.end(),back_inserter(allEndcap));
00299 std::reverse(allEndcap.begin(),allEndcap.end());
00300 std::copy(allForward.begin(),allForward.end(),back_inserter(allEndcap));
00301
00302
00303 allDetLayers.reserve(allBackward.size()+allBarrel.size()+allForward.size());
00304 std::copy(allBackward.begin(),allBackward.end(),back_inserter(allDetLayers));
00305 std::reverse(allDetLayers.begin(),allDetLayers.end());
00306 std::copy(allBarrel.begin(),allBarrel.end(),back_inserter(allDetLayers));
00307 std::copy(allForward.begin(),allForward.end(),back_inserter(allDetLayers));
00308
00309
00310 }