00001 #include "CalibTracker/SiStripConnectivity/plugins/SiStripRegionConnectivity.h"
00002 #include "FWCore/Framework/interface/ESHandle.h"
00003 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00004 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
00005 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
00006 #include "CalibTracker/Records/interface/SiStripDetCablingRcd.h"
00007 #include "CalibFormats/SiStripObjects/interface/SiStripDetCabling.h"
00008 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
00009
00010 using namespace sistrip;
00011
00012 SiStripRegionConnectivity::SiStripRegionConnectivity(const edm::ParameterSet& pset) :
00013
00014 etadivisions_(pset.getUntrackedParameter<unsigned int>("EtaDivisions",10)),
00015 phidivisions_(pset.getUntrackedParameter<unsigned int>("PhiDivisions",10)),
00016 etamax_(pset.getUntrackedParameter<double>("EtaMax",2.4))
00017
00018 {
00019 setWhatProduced(this, &SiStripRegionConnectivity::produceRegionCabling);
00020 }
00021
00022 SiStripRegionConnectivity::~SiStripRegionConnectivity() {}
00023
00024 std::auto_ptr<SiStripRegionCabling> SiStripRegionConnectivity::produceRegionCabling( const SiStripRegionCablingRcd& iRecord ) {
00025
00026 edm::ESHandle<SiStripDetCabling> detcabling;
00027 iRecord.getRecord<SiStripDetCablingRcd>().get( detcabling );
00028
00029 edm::ESHandle<TrackerGeometry> tkgeom;
00030 iRecord.getRecord<TrackerDigiGeometryRecord>().get( tkgeom );
00031
00032
00033
00034
00035 SiStripRegionCabling* RegionConnections = new SiStripRegionCabling(etadivisions_,phidivisions_,etamax_);
00036
00037
00038 SiStripRegionCabling::Cabling regioncabling(etadivisions_*phidivisions_,SiStripRegionCabling::RegionCabling(SiStripRegionCabling::ALLSUBDETS,SiStripRegionCabling::WedgeCabling(SiStripRegionCabling::ALLLAYERS,SiStripRegionCabling::ElementCabling())));
00039
00040
00041 std::map< uint32_t, std::vector<FedChannelConnection> >::const_iterator idet = detcabling->getDetCabling().begin();
00042 for (;idet!=detcabling->getDetCabling().end();idet++) {
00043 if (!idet->first || (idet->first == sistrip::invalid32_)) continue;
00044
00045
00046 GeomDetUnit* geom_det = const_cast<GeomDetUnit*>( tkgeom->idToDetUnit(DetId(idet->first)) );
00047 StripGeomDetUnit* strip_det = dynamic_cast<StripGeomDetUnit*>( geom_det );
00048 if ( !strip_det ) { continue; }
00049
00050
00051 double eta = tkgeom->idToDet(DetId(idet->first))->position().eta();
00052 double phi = tkgeom->idToDet(DetId(idet->first))->position().phi().value();
00053 uint32_t reg = RegionConnections->region(SiStripRegionCabling::Position(eta,phi));
00054
00055
00056 uint32_t subdet = static_cast<uint32_t>(SiStripRegionCabling::subdetFromDetId(idet->first));
00057
00058
00059 uint32_t layer = SiStripRegionCabling::layerFromDetId(idet->first);
00060
00061
00062 std::vector<FedChannelConnection> conns = idet->second;
00063 std::vector<FedChannelConnection>::iterator iconn = conns.begin();
00064 std::vector<FedChannelConnection>::iterator jconn = conns.end();
00065
00066
00067 regioncabling[reg][subdet][layer][idet->first].resize(conns.size());
00068 for ( ; iconn != jconn; ++iconn ) {
00069 if ( iconn->apvPairNumber() < conns.size() ) {
00070 regioncabling[reg][subdet][layer][idet->first][iconn->apvPairNumber()] = *iconn;
00071 }
00072 }
00073
00074 }
00075
00076
00077 RegionConnections->setRegionCabling(regioncabling);
00078
00079 return std::auto_ptr<SiStripRegionCabling>( RegionConnections );
00080 }
00081