#include <L1TriggerConfig/RPCConeBuilder/src/RPCConeBuilder.cc>
Public Types | |
typedef boost::shared_ptr < L1RPCConeBuilder > | ReturnType |
Public Member Functions | |
void | geometryCallback (const MuonGeometryRecord &) |
ReturnType | produce (const L1RPCConeBuilderRcd &) |
RPCConeBuilder (const edm::ParameterSet &) | |
~RPCConeBuilder () | |
Private Member Functions | |
std::pair< int, int > | areConnected (RPCStripsRing::TIdToRindMap::iterator ref, RPCStripsRing::TIdToRindMap::iterator other) |
void | buildCones (const edm::ESHandle< RPCGeometry > &rpcGeom) |
void | buildConnections () |
Private Attributes | |
int | m_hwPlaneBeg |
int | m_hwPlaneEnd |
L1RPCConeBuilder::TLPSizesInTowers | m_LPSizesInTowers |
RPCStripsRing::TIdToRindMap | m_ringsMap |
L1RPCConeBuilder::TRingsToLP | m_RingsToLP |
L1RPCConeBuilder::TRingsToTowers | m_RingsToTowers |
int | m_rollBeg |
int | m_rollEnd |
int | m_towerBeg |
Returns logplane number for this connection, if not connected returns -1. In second lpSize. | |
int | m_towerEnd |
Usage: <usage>
Implementation: <Notes on="" implementation>="">
Definition at line 36 of file RPCConeBuilder.h.
typedef boost::shared_ptr<L1RPCConeBuilder> RPCConeBuilder::ReturnType |
Definition at line 40 of file RPCConeBuilder.h.
RPCConeBuilder::RPCConeBuilder | ( | const edm::ParameterSet & | iConfig | ) |
Definition at line 42 of file RPCConeBuilder.cc.
References edm::eventsetup::dependsOn(), geometryCallback(), edm::ParameterSet::getParameter(), i, m_hwPlaneBeg, m_hwPlaneEnd, m_LPSizesInTowers, m_RingsToLP, m_RingsToTowers, m_rollBeg, m_rollEnd, m_towerBeg, m_towerEnd, name, and edm::ESProducer::setWhatProduced().
00042 : 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 }
RPCConeBuilder::~RPCConeBuilder | ( | ) | [inline] |
std::pair< int, int > RPCConeBuilder::areConnected | ( | RPCStripsRing::TIdToRindMap::iterator | ref, | |
RPCStripsRing::TIdToRindMap::iterator | other | |||
) | [private] |
Definition at line 295 of file RPCConeBuilder.cc.
References funct::abs(), asciidump::at, Exception, i, index, m_LPSizesInTowers, m_RingsToLP, and m_RingsToTowers.
Referenced by buildConnections().
00296 { 00297 00298 int logplane = -1; 00299 00300 //std::cout << "Checking " << ref->first << " and " << other->first << std::endl; 00301 00302 // Do not connect rolls lying on the oposite side of detector 00303 if ( ref->second.getEtaPartition()*other->second.getEtaPartition()<0 ) 00304 return std::make_pair(-1,0); 00305 00306 00307 // refRing and otherRing areConnected, if they contribute to the same tower 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 if (logplane != -1){ 00364 00365 std::cout << ref->first << " <-> " << other->first 00366 << " logplane " << logplane 00367 << " lpsize " << lpSize 00368 << std::endl; 00369 }*/ 00370 00371 return std::make_pair(logplane,lpSize); 00372 00373 }
void RPCConeBuilder::buildCones | ( | const edm::ESHandle< RPCGeometry > & | rpcGeom | ) | [private] |
Definition at line 142 of file RPCConeBuilder.cc.
References buildConnections(), Exception, RPCStripsRing::getRingId(), it, getDQMSummary::key, and m_ringsMap.
Referenced by produce().
00142 { 00143 00144 00145 //std::cout << " ---> buildCones called " << std::endl; 00146 00147 // fetch geometricall data 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 //RPCStripsRing sr(roll); 00166 00167 } 00168 00169 //std::cout << " found: " << rolls << " dets" << std::endl; 00170 00171 RPCStripsRing::TIdToRindMap::iterator it = m_ringsMap.begin(); 00172 00173 // filtermixed strips, fill gaps with virtual strips 00174 for (;it != m_ringsMap.end(); ++it){ 00175 00176 //int before = it->second.size(); 00177 00178 it->second.filterOverlapingChambers(); 00179 it->second.fillWithVirtualStrips(); 00180 00181 00182 //std::cout << it->first << " " << it->second.isReferenceRing() << " " 00183 // << before << " -> " 00184 // << it->second.size() << std::endl; 00185 00186 // In reference plane we should have 144*8 = 1152 strips 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 // Xcheck, if rings are symettrical 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){// Hey 2100 has no counterring 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 }
void RPCConeBuilder::buildConnections | ( | ) | [private] |
Definition at line 221 of file RPCConeBuilder.cc.
References areConnected(), Exception, RPCStripsRing::TOtherConnStruct::m_it, RPCStripsRing::TOtherConnStruct::m_logplane, RPCStripsRing::TOtherConnStruct::m_logplaneSize, and m_ringsMap.
Referenced by buildCones().
00221 { 00222 00223 00224 00225 RPCStripsRing::TIdToRindMap::iterator itRef = m_ringsMap.begin(); 00226 for (;itRef != m_ringsMap.end(); ++itRef){ // iterate over reference rings 00227 00228 00229 RPCStripsRing::TOtherConnStructVec ringsToConnect; 00230 00231 if (!itRef->second.isReferenceRing()) continue; // iterate over reference rings 00232 00233 RPCStripsRing::TIdToRindMap::iterator itOther = m_ringsMap.begin(); 00234 for (;itOther != m_ringsMap.end(); ++itOther){ // iterate over nonreference rings 00235 00236 if (itOther->second.isReferenceRing()) continue; // iterate over nonreference rings 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 } // OtherRings iteration ends 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 // XXX 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 } // RefRings iteration ends 00270 00271 00272 // Fetch connection data, and save in one place 00273 /* 00274 RPCStripsRing::TIdToRindMap::iterator it = m_ringsMap.begin(); 00275 for (;it != m_ringsMap.end(); ++it) { 00276 00277 L1RPCConeBuilder::TConMap nmap = it->second.getConnectionsMap(); 00278 L1RPCConeBuilder::TConMap::iterator newMapIt = nmap.begin(); 00279 for (; newMapIt != nmap.end(); ++ newMapIt) { 00280 uint32_t raw = newMapIt->first; 00281 TStrip2ConVec stripsVec = newMapIt->second; 00282 TStrip2ConVec::iterator stripIt = stripsVec.first 00283 //unsigned char strip = 00284 00285 00286 } 00287 00288 00289 }*/ 00290 00291 }
void RPCConeBuilder::geometryCallback | ( | const MuonGeometryRecord & | record | ) |
Definition at line 130 of file RPCConeBuilder.cc.
Referenced by RPCConeBuilder().
00130 { 00131 00132 //std::cout << " Geometry callback called " << std::endl; 00133 00134 //edm::ESHandle<RPCGeometry> rpcGeom; 00135 //record.get(rpcGeom); 00136 00137 //buildCones(rpcGeom); 00138 00139 }
RPCConeBuilder::ReturnType RPCConeBuilder::produce | ( | const L1RPCConeBuilderRcd & | iRecord | ) |
Definition at line 97 of file RPCConeBuilder.cc.
References buildCones(), edm::eventsetup::DependentRecordImplementation< RecordT, ListT >::getRecord(), m_LPSizesInTowers, m_ringsMap, m_RingsToLP, m_towerBeg, and m_towerEnd.
00099 { 00100 00101 00102 //std::cout << " RPCConeBuilder::produce called " << std::endl; 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 // getConnectionsMap() returns reference to static class member, so we are getting all connections 00119 00120 //std::cout << " conMap has: " << m_ringsMap.begin()->second.getConnectionsMap().size() << " rings" << std::endl; 00121 pL1RPCConeBuilder->setConeConnectionMap(m_ringsMap.begin()->second.getConnectionsMap()); 00122 00123 m_ringsMap.clear(); // free mem 00124 00125 return pL1RPCConeBuilder; 00126 00127 }
int RPCConeBuilder::m_hwPlaneBeg [private] |
int RPCConeBuilder::m_hwPlaneEnd [private] |
Definition at line 66 of file RPCConeBuilder.h.
Referenced by areConnected(), produce(), and RPCConeBuilder().
Definition at line 70 of file RPCConeBuilder.h.
Referenced by buildCones(), buildConnections(), and produce().
Definition at line 68 of file RPCConeBuilder.h.
Referenced by areConnected(), produce(), and RPCConeBuilder().
int RPCConeBuilder::m_rollBeg [private] |
int RPCConeBuilder::m_rollEnd [private] |
int RPCConeBuilder::m_towerBeg [private] |
Returns logplane number for this connection, if not connected returns -1. In second lpSize.
Definition at line 59 of file RPCConeBuilder.h.
Referenced by produce(), and RPCConeBuilder().
int RPCConeBuilder::m_towerEnd [private] |