CMS 3D CMS Logo

MuonDetLayerGeometry.cc

Go to the documentation of this file.
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     //    cscLayers_all.push_back(*it);
00034     allForward.push_back(*it);
00035     //    allEndcap.push_back(*it);
00036     //    allDetLayers.push_back(*it);
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     //    cscLayers_all.push_back(*it);
00044     allBackward.push_back(*it);
00045     //    allEndcap.push_back(*it);
00046     //    allDetLayers.push_back(*it);
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     //    rpcLayers_all.push_back(*it);
00059     allBarrel.push_back(*it);
00060     //    allDetLayers.push_back(*it);
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     //    rpcLayers_all.push_back(*it);
00067     //    rpcLayers_endcap.push_back(*it);
00068     allForward.push_back(*it);
00069     //    allEndcap.push_back(*it);
00070     //    allDetLayers.push_back(*it);
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     //    rpcLayers_all.push_back(*it);
00078     //    rpcLayers_endcap.push_back(*it);
00079     allBackward.push_back(*it);
00080     //    allEndcap.push_back(*it);
00081     //    allDetLayers.push_back(*it);
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         //        allDetLayers.push_back(*it);
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"); // << detLayer->module();
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 // Quick way to sort barrel det layers by increasing R,
00249 // do not abuse!
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   // The following are filled inside-out, no need to re-sort
00263   // precomputed_value_sort(dtLayers.begin(), dtLayers.end(),ExtractR<DetLayer,float>());
00264   // precomputed_value_sort(cscLayers_fw.begin(), cscLayers_fw.end(),ExtractAbsZ<DetLayer,float>());
00265   // precomputed_value_sort(cscLayers_bk.begin(), cscLayers_bk.end(),ExtractAbsZ<DetLayer,float>());
00266   // precomputed_value_sort(rpcLayers_fw.begin(), rpcLayers_fw.end(),ExtractAbsZ<DetLayer,float>());
00267   // precomputed_value_sort(rpcLayers_bk.begin(), rpcLayers_bk.end(),ExtractAbsZ<DetLayer,float>());
00268   // precomputed_value_sort(rpcLayers_barrel.begin(), rpcLayers_barrel.end(), ExtractR<DetLayer,float>());
00269 
00270   // Sort these inside-out
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   // Build more complicated vectors with correct sorting
00276 
00277   //cscLayers_all: from -Z to +Z
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   //rpcLayers_endcap: from -Z to +Z
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   //rpcLayers_all: order is bw, barrel, fw
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   // allEndcap: order is  all bw, all fw
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   // allDetLayers: order is  all bw, all barrel, all fw
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 }

Generated on Tue Jun 9 17:44:12 2009 for CMSSW by  doxygen 1.5.4