00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "L1TriggerConfig/RPCTriggerConfig/interface/RPCConeBuilder.h"
00026 #include "L1TriggerConfig/RPCTriggerConfig/interface/RPCStripsRing.h"
00027
00028
00029
00030
00031 #include "FWCore/Framework/interface/ModuleFactory.h"
00032
00033
00034
00035 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00036
00037 #include <sstream>
00038 #include <vector>
00039
00040 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
00041
00042 RPCConeBuilder::RPCConeBuilder(const edm::ParameterSet& iConfig) :
00043 m_towerBeg(iConfig.getParameter<int>("towerBeg")),
00044 m_towerEnd(iConfig.getParameter<int>("towerEnd")),
00045 m_rollBeg(iConfig.getParameter<int>("rollBeg")),
00046 m_rollEnd(iConfig.getParameter<int>("rollEnd")),
00047 m_hwPlaneBeg(iConfig.getParameter<int>("hwPlaneBeg")),
00048 m_hwPlaneEnd(iConfig.getParameter<int>("hwPlaneEnd"))
00049 {
00050
00051 setWhatProduced(this, dependsOn( &RPCConeBuilder::geometryCallback ));
00052
00053 for (int i = m_towerBeg; i <= m_towerEnd; ++i){
00054
00055 std::stringstream name;
00056 name << "lpSizeTower" << i;
00057
00058 L1RPCConeBuilder::TLogPlaneSize newSizes =
00059 iConfig.getParameter<std::vector<int> >(name.str().c_str());
00060
00061 m_LPSizesInTowers.push_back(newSizes);
00062
00063 }
00064
00065 for (int roll = m_rollBeg; roll <= m_rollEnd; ++roll){
00066 L1RPCConeBuilder::THWplaneToTower newHwPlToTower;
00067 L1RPCConeBuilder::THWplaneToLP newHWplaneToLP;
00068 for (int hwpl = m_hwPlaneBeg; hwpl <= m_hwPlaneEnd; ++hwpl){
00069 std::stringstream name;
00070 name << "rollConnLP_" << roll << "_" << hwpl;
00071 L1RPCConeBuilder::TTowerList newListLP =
00072 iConfig.getParameter<std::vector<int> >(name.str().c_str());
00073 newHWplaneToLP.push_back(newListLP);
00074
00075
00076 std::stringstream name1;
00077 name1 << "rollConnT_" << roll << "_" << hwpl;
00078 L1RPCConeBuilder::TLPList newListT =
00079 iConfig.getParameter<std::vector<int> >(name1.str().c_str());
00080 newHwPlToTower.push_back(newListT);
00081 }
00082 m_RingsToTowers.push_back(newHwPlToTower);
00083 m_RingsToLP.push_back(newHWplaneToLP);
00084 }
00085
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 RPCConeBuilder::ReturnType
00097 RPCConeBuilder::produce(const L1RPCConeBuilderRcd& iRecord)
00098
00099 {
00100
00101
00102
00103 using namespace edm::es;
00104 boost::shared_ptr<L1RPCConeBuilder> pL1RPCConeBuilder( ( new L1RPCConeBuilder ) );
00105
00106 pL1RPCConeBuilder->setFirstTower(m_towerBeg);
00107 pL1RPCConeBuilder->setLastTower(m_towerEnd);
00108
00109 pL1RPCConeBuilder->setLPSizeForTowers(m_LPSizesInTowers);
00110 pL1RPCConeBuilder->setRingsToLP(m_RingsToLP);
00111
00112
00113 edm::ESHandle<RPCGeometry> rpcGeom;
00114 iRecord.getRecord<MuonGeometryRecord>().get(rpcGeom);
00115
00116 buildCones(rpcGeom);
00117
00118
00119
00120
00121 pL1RPCConeBuilder->setConeConnectionMap(m_ringsMap.begin()->second.getConnectionsMap());
00122
00123 m_ringsMap.clear();
00124
00125 return pL1RPCConeBuilder;
00126
00127 }
00128
00129
00130 void RPCConeBuilder::geometryCallback( const MuonGeometryRecord& record ){
00131
00132
00133
00134
00135
00136
00137
00138
00139 }
00140
00141
00142 void RPCConeBuilder::buildCones(const edm::ESHandle<RPCGeometry> & rpcGeom ){
00143
00144
00145
00146
00147
00148 int rolls = 0;
00149 for(TrackingGeometry::DetContainer::const_iterator it = rpcGeom->dets().begin();
00150 it != rpcGeom->dets().end();
00151 ++it)
00152 {
00153
00154 if( dynamic_cast< RPCRoll* >( *it ) == 0 ) continue;
00155
00156 ++rolls;
00157 RPCRoll* roll = dynamic_cast< RPCRoll*>( *it );
00158
00159 int ringId = RPCStripsRing::getRingId(roll);
00160 if ( m_ringsMap.find(ringId) == m_ringsMap.end() ) {
00161 m_ringsMap[ringId]=RPCStripsRing(roll);
00162 } else {
00163 m_ringsMap[ringId].addRoll(roll);
00164 }
00165
00166
00167 }
00168
00169
00170
00171 RPCStripsRing::TIdToRindMap::iterator it = m_ringsMap.begin();
00172
00173
00174 for (;it != m_ringsMap.end(); ++it){
00175
00176
00177
00178 it->second.filterOverlapingChambers();
00179 it->second.fillWithVirtualStrips();
00180
00181
00182
00183
00184
00185
00186
00187 if (it->second.isReferenceRing() && (it->second.size() != 1152)){
00188 throw cms::Exception("RPCInternal") << "Problem: refring " << it->first
00189 << " has " << it->second.size() << " strips \n";
00190 }
00191
00192
00193 }
00194
00195
00196 it = m_ringsMap.begin();
00197 for (;it != m_ringsMap.end(); ++it){
00198 int key = it->first;
00199 int sign = key/100 - (key/1000)*10;
00200
00201 if (sign == 0) {
00202 key += 100;
00203 } else {
00204 key -= 100;
00205 }
00206
00207 if (key != 2000){
00208 if (it->second.size() != m_ringsMap[key].size())
00209 {
00210 throw cms::Exception("RPCInternal") << " Size differs for ring " << key << " +- 100 \n";
00211 }
00212 }
00213
00214
00215 }
00216
00217 buildConnections();
00218 }
00219
00220
00221 void RPCConeBuilder::buildConnections(){
00222
00223
00224
00225 RPCStripsRing::TIdToRindMap::iterator itRef = m_ringsMap.begin();
00226 for (;itRef != m_ringsMap.end(); ++itRef){
00227
00228
00229 RPCStripsRing::TOtherConnStructVec ringsToConnect;
00230
00231 if (!itRef->second.isReferenceRing()) continue;
00232
00233 RPCStripsRing::TIdToRindMap::iterator itOther = m_ringsMap.begin();
00234 for (;itOther != m_ringsMap.end(); ++itOther){
00235
00236 if (itOther->second.isReferenceRing()) continue;
00237
00238 std::pair<int,int> pr = areConnected(itRef, itOther);
00239 if ( pr.first != -1 ) {
00240 RPCStripsRing::TOtherConnStruct newOtherConn;
00241 newOtherConn.m_it = itOther;
00242 newOtherConn.m_logplane = pr.first;
00243 newOtherConn.m_logplaneSize = pr.second;
00244 ringsToConnect.push_back(newOtherConn);
00245 }
00246
00247
00248 }
00249
00250
00251 std::pair<int,int> prRef = areConnected(itRef, itRef);
00252 if (prRef.first == -1){
00253 throw cms::Exception("RPCConfig") << " Cannot determine logplane for reference ring "
00254 << itRef->first << "\n ";
00255 }
00256 if (prRef.second != 8){
00257
00258 throw cms::Exception("RPCConfig") << " logplaneSize for reference ring "
00259 << itRef->first << " wrong "
00260 << " logplane: " << prRef.first
00261 << " etaPart: " << itRef->second.getEtaPartition()
00262 << " tower: " << itRef->second.getTowerForRefRing()
00263 << " hwPlane: " << itRef->second.getHwPlane()
00264 << " strips " << prRef.second << "\n";
00265 }
00266
00267 itRef->second.createRefConnections(ringsToConnect, prRef.first, prRef.second);
00268
00269 }
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291 }
00292
00293
00294
00295 std::pair<int, int> RPCConeBuilder::areConnected(RPCStripsRing::TIdToRindMap::iterator ref,
00296 RPCStripsRing::TIdToRindMap::iterator other){
00297
00298 int logplane = -1;
00299
00300
00301
00302
00303 if ( ref->second.getEtaPartition()*other->second.getEtaPartition()<0 )
00304 return std::make_pair(-1,0);
00305
00306
00307
00308 L1RPCConeBuilder::TTowerList refTowList
00309 = m_RingsToTowers.at(std::abs(ref->second.getEtaPartition()))
00310 .at(ref->second.getHwPlane()-1);
00311
00312
00313 L1RPCConeBuilder::TTowerList otherTowList
00314 = m_RingsToTowers.at(std::abs(other->second.getEtaPartition()))
00315 .at(other->second.getHwPlane()-1);
00316
00317 int refTower = -1;
00318
00319 L1RPCConeBuilder::TTowerList::iterator rtlIt = refTowList.begin();
00320 for (; rtlIt != refTowList.end(); ++rtlIt){
00321
00322 if ( *rtlIt >= 0 && refTower < 0){
00323 refTower = *rtlIt;
00324 }
00325 else if ( *rtlIt >= 0 && refTower >= 0) {
00326 throw cms::Exception("RPCConfig") << " Reference(?) ring "
00327 << ref->first << " "
00328 << "wants to be connected more than one tower: "
00329 << refTower << " "
00330 << *rtlIt << "\n";
00331
00332 }
00333
00334 }
00335
00336 if (refTower < 0) {
00337 throw cms::Exception("RPCConfig") << " Reference(?) ring "
00338 << ref->first
00339 << " is not connected anywhere \n";
00340 }
00341
00342 L1RPCConeBuilder::TTowerList::iterator otlIt = otherTowList.begin();
00343
00344 int index = -1, i = 0;
00345 for (; otlIt != otherTowList.end(); ++otlIt){
00346 if (*otlIt == refTower) {
00347 index = i;
00348 }
00349 ++i;
00350 }
00351
00352 int lpSize = 0;
00353 if (index != -1){
00354 logplane = m_RingsToLP.at(std::abs(other->second.getEtaPartition()))
00355 .at(other->second.getHwPlane()-1)
00356 .at(index);
00357 lpSize = m_LPSizesInTowers.at(refTower).at(logplane-1);
00358
00359 }
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371 return std::make_pair(logplane,lpSize);
00372
00373 }
00374
00375
00376
00377 DEFINE_FWK_EVENTSETUP_MODULE(RPCConeBuilder);