00001 #include <RecoMuon/DetLayers/src/MuonDTDetLayerGeometryBuilder.h> 00002 00003 #include <DataFormats/MuonDetId/interface/DTChamberId.h> 00004 #include <Geometry/CommonDetUnit/interface/GeomDet.h> 00005 #include <RecoMuon/DetLayers/interface/MuRodBarrelLayer.h> 00006 #include <RecoMuon/DetLayers/interface/MuDetRod.h> 00007 00008 #include <Utilities/General/interface/precomputed_value_sort.h> 00009 #include <Geometry/CommonDetUnit/interface/DetSorting.h> 00010 00011 #include <FWCore/MessageLogger/interface/MessageLogger.h> 00012 00013 #include <iostream> 00014 00015 using namespace std; 00016 00017 MuonDTDetLayerGeometryBuilder::MuonDTDetLayerGeometryBuilder() { 00018 } 00019 00020 MuonDTDetLayerGeometryBuilder::~MuonDTDetLayerGeometryBuilder() { 00021 } 00022 00023 vector<DetLayer*> 00024 MuonDTDetLayerGeometryBuilder::buildLayers(const DTGeometry& geo) { 00025 00026 const std::string metname = "Muon|RecoMuon|RecoMuonDetLayers|MuonDTDetLayerGeometryBuilder"; 00027 00028 vector<DetLayer*> detlayers; 00029 vector<MuRodBarrelLayer*> result; 00030 00031 for(int station = DTChamberId::minStationId; station <= DTChamberId::maxStationId; station++) { 00032 00033 vector<const DetRod*> muDetRods; 00034 for(int sector = DTChamberId::minSectorId; sector <= DTChamberId::maxSectorId; sector++) { 00035 00036 vector<const GeomDet*> geomDets; 00037 for(int wheel = DTChamberId::minWheelId; wheel <= DTChamberId::maxWheelId; wheel++) { 00038 const GeomDet* geomDet = geo.idToDet(DTChamberId(wheel, station, sector)); 00039 if (geomDet) { 00040 geomDets.push_back(geomDet); 00041 LogTrace(metname) << "get DT chamber " << DTChamberId(wheel, station, sector) 00042 << " at R=" << geomDet->position().perp() 00043 << ", phi=" << geomDet->position().phi() ; 00044 } 00045 } 00046 00047 if (geomDets.size()!=0) { 00048 precomputed_value_sort(geomDets.begin(), geomDets.end(), geomsort::DetZ()); 00049 muDetRods.push_back(new MuDetRod(geomDets)); 00050 LogTrace(metname) << " New MuDetRod with " << geomDets.size() 00051 << " chambers at R=" << muDetRods.back()->position().perp() 00052 << ", phi=" << muDetRods.back()->position().phi(); 00053 } 00054 } 00055 precomputed_value_sort(muDetRods.begin(), muDetRods.end(), geomsort::ExtractPhi<GeometricSearchDet,float>()); 00056 result.push_back(new MuRodBarrelLayer(muDetRods)); 00057 LogDebug(metname) << " New MuRodBarrelLayer with " << muDetRods.size() 00058 << " rods, at R " << result.back()->specificSurface().radius(); 00059 } 00060 00061 for(vector<MuRodBarrelLayer*>::const_iterator it = result.begin(); it != result.end(); it++) 00062 detlayers.push_back((DetLayer*)(*it)); 00063 00064 return detlayers; 00065 }