00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "CondFormats/DTObjects/interface/DTReadOutMapping.h"
00014
00015
00016
00017
00018
00019 #include "CondFormats/DTObjects/interface/DTCompactMapAbstractHandler.h"
00020
00021
00022
00023
00024 #include <iostream>
00025 #include <sstream>
00026 #include <map>
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 DTReadOutMapping::DTReadOutMapping():
00037 cellMapVersion( " " ),
00038 robMapVersion( " " ) {
00039 readOutChannelDriftTubeMap.reserve( 2000 );
00040 mType = rgBuf = rgROB = rgROS = rgDDU = grBuf = 0;
00041 grROB = grROS = grDDU = 0;
00042 }
00043
00044
00045 DTReadOutMapping::DTReadOutMapping( const std::string& cell_map_version,
00046 const std::string& rob_map_version ):
00047 cellMapVersion( cell_map_version ),
00048 robMapVersion( rob_map_version ) {
00049 readOutChannelDriftTubeMap.reserve( 2000 );
00050 mType = rgBuf = rgROB = rgROS = rgDDU = grBuf = 0;
00051 grROB = grROS = grDDU = 0;
00052 }
00053
00054
00055 DTReadOutGeometryLink::DTReadOutGeometryLink():
00056 dduId( 0 ),
00057 rosId( 0 ),
00058 robId( 0 ),
00059 tdcId( 0 ),
00060 channelId( 0 ),
00061 wheelId( 0 ),
00062 stationId( 0 ),
00063 sectorId( 0 ),
00064 slId( 0 ),
00065 layerId( 0 ),
00066 cellId( 0 ) {
00067 }
00068
00069
00070
00071
00072 DTReadOutMapping::~DTReadOutMapping() {
00073
00074 delete mType;
00075 delete rgBuf;
00076
00077 delete rgROB;
00078 delete rgROS;
00079 delete rgDDU;
00080 delete grBuf;
00081
00082 if ( grROB != 0 ) {
00083 std::vector<std::vector<int>*> gr_list = grROB->contList();
00084 std::vector<std::vector<int>*>::const_iterator gr_iter = gr_list.begin();
00085 std::vector<std::vector<int>*>::const_iterator gr_iend = gr_list.end();
00086 while ( gr_iter != gr_iend ) delete *gr_iter++;
00087 }
00088 if ( grROS != 0 ) {
00089 std::vector<std::vector<int>*> gr_list = grROS->contList();
00090 std::vector<std::vector<int>*>::const_iterator gr_iter = gr_list.begin();
00091 std::vector<std::vector<int>*>::const_iterator gr_iend = gr_list.end();
00092 while ( gr_iter != gr_iend ) delete *gr_iter++;
00093 }
00094 if ( grDDU != 0 ) {
00095 std::vector<std::vector<int>*> gr_list = grDDU->contList();
00096 std::vector<std::vector<int>*>::const_iterator gr_iter = gr_list.begin();
00097 std::vector<std::vector<int>*>::const_iterator gr_iend = gr_list.end();
00098 while ( gr_iter != gr_iend ) delete *gr_iter++;
00099 }
00100
00101 delete grROB;
00102 delete grROS;
00103 delete grDDU;
00104
00105 }
00106
00107 DTReadOutGeometryLink::~DTReadOutGeometryLink() {
00108 }
00109
00110
00111
00112
00113 int DTReadOutMapping::readOutToGeometry( int dduId,
00114 int rosId,
00115 int robId,
00116 int tdcId,
00117 int channelId,
00118 DTWireId& wireId ) const {
00119
00120 int wheelId;
00121 int stationId;
00122 int sectorId;
00123 int slId;
00124 int layerId;
00125 int cellId;
00126
00127 int status = readOutToGeometry( dduId,
00128 rosId,
00129 robId,
00130 tdcId,
00131 channelId,
00132 wheelId,
00133 stationId,
00134 sectorId,
00135 slId,
00136 layerId,
00137 cellId );
00138
00139 wireId = DTWireId( wheelId, stationId, sectorId, slId, layerId, cellId );
00140 return status;
00141
00142 }
00143
00144
00145 int DTReadOutMapping::readOutToGeometry( int dduId,
00146 int rosId,
00147 int robId,
00148 int tdcId,
00149 int channelId,
00150 int& wheelId,
00151 int& stationId,
00152 int& sectorId,
00153 int& slId,
00154 int& layerId,
00155 int& cellId ) const {
00156
00157 wheelId =
00158 stationId =
00159 sectorId =
00160 slId =
00161 layerId =
00162 cellId = 0;
00163
00164 if ( ( mType == 0 ) ||
00165 ( rgBuf == 0 ) ||
00166 ( rgROB == 0 ) ||
00167 ( rgROS == 0 ) ||
00168 ( rgDDU == 0 ) ) cacheMap();
00169
00170 int defaultValue;
00171 mType->find( 0, defaultValue );
00172 if ( defaultValue ) {
00173
00174 int searchStatus;
00175 int ientry;
00176
00177 std::vector<int> dduKey;
00178 dduKey.reserve( 5 );
00179 dduKey.push_back( dduId );
00180 dduKey.push_back( rosId );
00181 searchStatus = rgDDU->find( dduKey.begin(), dduKey.end(), ientry );
00182 if ( searchStatus ) return searchStatus;
00183 const DTReadOutGeometryLink& lros( readOutChannelDriftTubeMap[ientry] );
00184 wheelId = lros. wheelId;
00185 sectorId = lros. sectorId;
00186
00187 std::vector<int> rosKey;
00188 rosKey.reserve( 5 );
00189 rosKey.push_back( lros. cellId );
00190 rosKey.push_back( robId );
00191 searchStatus = rgROS->find( rosKey.begin(), rosKey.end(), ientry );
00192 if ( searchStatus ) return searchStatus;
00193 const DTReadOutGeometryLink& lrob( readOutChannelDriftTubeMap[ientry] );
00194 if ( lrob. wheelId != defaultValue ) wheelId = lrob. wheelId;
00195 stationId = lrob.stationId;
00196 if ( lrob. sectorId != defaultValue ) sectorId = lrob. sectorId;
00197
00198 std::vector<int> robKey;
00199 robKey.reserve( 5 );
00200 robKey.push_back( lrob. cellId );
00201 robKey.push_back( tdcId );
00202 robKey.push_back( channelId );
00203 searchStatus = rgROB->find( robKey.begin(), robKey.end(), ientry );
00204 if ( searchStatus ) return searchStatus;
00205 const DTReadOutGeometryLink& ltdc( readOutChannelDriftTubeMap[ientry] );
00206 slId = ltdc. slId;
00207 layerId = ltdc. layerId;
00208 cellId = ltdc. cellId;
00209 return 0;
00210
00211 }
00212
00213 std::vector<int> chanKey;
00214 chanKey.reserve(5);
00215 chanKey.push_back( dduId );
00216 chanKey.push_back( rosId );
00217 chanKey.push_back( robId );
00218 chanKey.push_back( tdcId );
00219 chanKey.push_back( channelId );
00220 int ientry;
00221 int searchStatus = rgBuf->find( chanKey.begin(), chanKey.end(), ientry );
00222 if ( !searchStatus ) {
00223 const DTReadOutGeometryLink& link( readOutChannelDriftTubeMap[ientry] );
00224 wheelId = link. wheelId;
00225 stationId = link.stationId;
00226 sectorId = link. sectorId;
00227 slId = link. slId;
00228 layerId = link. layerId;
00229 cellId = link. cellId;
00230 }
00231
00232 return searchStatus;
00233
00234 }
00235
00236
00237 int DTReadOutMapping::geometryToReadOut( const DTWireId& wireId,
00238 int& dduId,
00239 int& rosId,
00240 int& robId,
00241 int& tdcId,
00242 int& channelId ) const {
00243 return geometryToReadOut( wireId.wheel(),
00244 wireId.station(),
00245 wireId.sector(),
00246 wireId.superLayer(),
00247 wireId.layer(),
00248 wireId.wire(),
00249 dduId,
00250 rosId,
00251 robId,
00252 tdcId,
00253 channelId);
00254 }
00255
00256
00257 int DTReadOutMapping::geometryToReadOut( int wheelId,
00258 int stationId,
00259 int sectorId,
00260 int slId,
00261 int layerId,
00262 int cellId,
00263 int& dduId,
00264 int& rosId,
00265 int& robId,
00266 int& tdcId,
00267 int& channelId ) const {
00268
00269 dduId =
00270 rosId =
00271 robId =
00272 tdcId =
00273 channelId = 0;
00274
00275 if ( ( mType == 0 ) ||
00276 ( grBuf == 0 ) ||
00277 ( grROB == 0 ) ||
00278 ( grROS == 0 ) ||
00279 ( grDDU == 0 ) ) cacheMap();
00280
00281 int defaultValue;
00282 mType->find( 0, defaultValue );
00283 if ( defaultValue ) {
00284
00285 int loop1 = 0;
00286 int loop2 = 0;
00287 int loop3 = 0;
00288 int loop0 = 0;
00289
00290 int searchStatus;
00291 int mapId = 0;
00292 std::vector<int>* robMLgr;
00293 std::vector<int>* rosMLgr;
00294 std::vector<int>* dduMLgr;
00295
00296 std::vector<int> cellKey;
00297 cellKey.reserve(6);
00298 cellKey.push_back( cellId );
00299 cellKey.push_back( layerId );
00300 cellKey.push_back( slId );
00301 std::vector<int> stdcKey = cellKey;
00302 searchStatus = grROB->find( cellKey.begin(), cellKey.end(), robMLgr );
00303 if ( searchStatus ) return searchStatus;
00304 if ( !( robMLgr->size() ) ) return 1;
00305 std::vector<int>::const_iterator tdc_iter = robMLgr->begin();
00306 std::vector<int>::const_iterator tdc_iend = robMLgr->end();
00307 while( tdc_iter != tdc_iend ) {
00308 loop1++;
00309 const DTReadOutGeometryLink& ltdc(
00310 readOutChannelDriftTubeMap[*tdc_iter++] );
00311 channelId = ltdc.channelId;
00312 tdcId = ltdc. tdcId;
00313 mapId = ltdc.rosId;
00314 cellKey.clear();
00315 cellKey.push_back( mapId );
00316 cellKey.push_back( stationId );
00317 std::vector<int> srosKey = cellKey;
00318 searchStatus = grROS->find( cellKey.begin(), cellKey.end(), rosMLgr );
00319 if ( searchStatus ) continue;
00320 if ( !( rosMLgr->size() ) ) continue;
00321 std::vector<int>::const_iterator ros_iter = rosMLgr->begin();
00322 std::vector<int>::const_iterator ros_iend = rosMLgr->end();
00323 while( ros_iter != ros_iend ) {
00324 loop2++;
00325 const DTReadOutGeometryLink& lros(
00326 readOutChannelDriftTubeMap[*ros_iter++] );
00327 int secCk = lros.sectorId;
00328 int wheCk = lros. wheelId;
00329 if ( ( secCk != defaultValue ) &&
00330 ( secCk != sectorId ) ) continue;
00331 if ( ( wheCk != defaultValue ) &&
00332 ( wheCk != wheelId ) ) continue;
00333 robId = lros.robId;
00334 mapId = lros.rosId;
00335 cellKey.clear();
00336 cellKey.push_back( mapId );
00337 cellKey.push_back( wheelId );
00338 cellKey.push_back( sectorId );
00339 std::vector<int> sdduKey = cellKey;
00340 searchStatus = grDDU->find( cellKey.begin(), cellKey.end(), dduMLgr );
00341 if ( searchStatus ) continue;
00342 if ( !( dduMLgr->size() ) ) continue;
00343 if ( searchStatus ) return searchStatus;
00344 if ( !( dduMLgr->size() ) ) return 1;
00345 loop0++;
00346 std::vector<int>::const_iterator ddu_iter = dduMLgr->begin();
00347 std::vector<int>::const_iterator ddu_iend = dduMLgr->end();
00348 while( ddu_iter != ddu_iend ) {
00349 loop3++;
00350 const DTReadOutGeometryLink& lddu(
00351 readOutChannelDriftTubeMap[*ddu_iter++] );
00352 mapId = lros.rosId;
00353 if ( ( ( sectorId == secCk ) ||
00354 ( sectorId == lddu.sectorId ) ) &&
00355 ( ( wheelId == wheCk ) ||
00356 ( wheelId == lddu.wheelId ) ) ) {
00357 rosId = lddu.rosId;
00358 dduId = lddu.dduId;
00359 return 0;
00360 }
00361 }
00362 }
00363 }
00364
00365 return 1;
00366
00367 }
00368
00369 std::vector<int> cellKey;
00370 cellKey.reserve(6);
00371 cellKey.push_back( wheelId );
00372 cellKey.push_back( stationId );
00373 cellKey.push_back( sectorId );
00374 cellKey.push_back( slId );
00375 cellKey.push_back( layerId );
00376 cellKey.push_back( cellId );
00377 int ientry;
00378 int searchStatus = grBuf->find( cellKey.begin(), cellKey.end(), ientry );
00379 if ( !searchStatus ) {
00380 const DTReadOutGeometryLink& link( readOutChannelDriftTubeMap[ientry] );
00381 dduId = link. dduId;
00382 rosId = link. rosId;
00383 robId = link. robId;
00384 tdcId = link. tdcId;
00385 channelId = link.channelId;
00386 }
00387
00388 return searchStatus;
00389
00390 }
00391
00392
00393 DTReadOutMapping::type DTReadOutMapping::mapType() const {
00394 if ( mType == 0 ) cacheMap();
00395 int defaultValue;
00396 mType->find( 0, defaultValue );
00397 if ( defaultValue ) return compact;
00398 else return plain;
00399 }
00400
00401
00402 const
00403 std::string& DTReadOutMapping::mapCellTdc() const {
00404 return cellMapVersion;
00405 }
00406
00407
00408 std::string& DTReadOutMapping::mapCellTdc() {
00409 return cellMapVersion;
00410 }
00411
00412
00413 const
00414 std::string& DTReadOutMapping::mapRobRos() const {
00415 return robMapVersion;
00416 }
00417
00418
00419 std::string& DTReadOutMapping::mapRobRos() {
00420 return robMapVersion;
00421 }
00422
00423
00424 void DTReadOutMapping::clear() {
00425 delete rgBuf;
00426 delete grBuf;
00427 delete mType;
00428 rgBuf = grBuf = mType = 0;
00429 readOutChannelDriftTubeMap.clear();
00430 return;
00431 }
00432
00433
00434 int DTReadOutMapping::insertReadOutGeometryLink( int dduId,
00435 int rosId,
00436 int robId,
00437 int tdcId,
00438 int channelId,
00439 int wheelId,
00440 int stationId,
00441 int sectorId,
00442 int slId,
00443 int layerId,
00444 int cellId ) {
00445 DTReadOutGeometryLink link;
00446 link. dduId = dduId;
00447 link. rosId = rosId;
00448 link. robId = robId;
00449 link. tdcId = tdcId;
00450 link.channelId = channelId;
00451 link. wheelId = wheelId;
00452 link.stationId = stationId;
00453 link. sectorId = sectorId;
00454 link. slId = slId;
00455 link. layerId = layerId;
00456 link. cellId = cellId;
00457
00458 int ientry = readOutChannelDriftTubeMap.size();
00459 readOutChannelDriftTubeMap.push_back( link );
00460
00461 if ( rgBuf == 0 ) {
00462 DTBufferTree<int,int>** prgBuf;
00463 prgBuf = const_cast<DTBufferTree<int,int>**>( &rgBuf );
00464 *prgBuf = new DTBufferTree<int,int>;
00465 }
00466 if ( grBuf == 0 ) {
00467 DTBufferTree<int,int>** pgrBuf;
00468 pgrBuf = const_cast<DTBufferTree<int,int>**>( &grBuf );
00469 *pgrBuf = new DTBufferTree<int,int>;
00470 }
00471
00472 std::vector<int> cellKey;
00473 cellKey.reserve(6);
00474 cellKey.push_back( wheelId );
00475 cellKey.push_back( stationId );
00476 cellKey.push_back( sectorId );
00477 cellKey.push_back( slId );
00478 cellKey.push_back( layerId );
00479 cellKey.push_back( cellId );
00480 int grStatus =
00481 grBuf->insert( cellKey.begin(), cellKey.end(), ientry );
00482 std::vector<int> chanKey;
00483 chanKey.reserve(5);
00484 chanKey.push_back( dduId );
00485 chanKey.push_back( rosId );
00486 chanKey.push_back( robId );
00487 chanKey.push_back( tdcId );
00488 chanKey.push_back( channelId );
00489 int rgStatus =
00490 rgBuf->insert( chanKey.begin(), chanKey.end(), ientry );
00491
00492 if ( grStatus || rgStatus ) return 1;
00493 else return 0;
00494
00495 }
00496
00497
00498 DTReadOutMapping::const_iterator DTReadOutMapping::begin() const {
00499 return readOutChannelDriftTubeMap.begin();
00500 }
00501
00502
00503 DTReadOutMapping::const_iterator DTReadOutMapping::end() const {
00504 return readOutChannelDriftTubeMap.end();
00505 }
00506
00507
00508 const DTReadOutMapping* DTReadOutMapping::fullMap() const {
00509 if ( mapType() == plain ) return this;
00510 DTCompactMapAbstractHandler* cmHandler =
00511 DTCompactMapAbstractHandler::getInstance();
00512 if ( cmHandler == 0 ) {
00513 std::cout << "CondCoreDTPlugins library not loaded, "
00514 << "compactMapHandler plugin missing" << std::endl;
00515 return 0;
00516 }
00517 return cmHandler->expandMap( *this );
00518 }
00519
00520
00521 std::string DTReadOutMapping::mapNameGR() const {
00522 std::stringstream name;
00523 name << cellMapVersion << "_" << robMapVersion << "_map_GR" << this;
00524 return name.str();
00525 }
00526
00527
00528 std::string DTReadOutMapping::mapNameRG() const {
00529 std::stringstream name;
00530 name << cellMapVersion << "_" << robMapVersion << "_map_RG" << this;
00531 return name.str();
00532 }
00533
00534
00535 void DTReadOutMapping::cacheMap() const {
00536
00537 DTBufferTree<int,int>** pmType;
00538 pmType = const_cast<DTBufferTree<int,int>**>( &mType );
00539 *pmType = new DTBufferTree<int,int>;
00540
00541 mType->insert( 0, 0 );
00542
00543 DTBufferTree<int,int>** prgBuf;
00544 prgBuf = const_cast<DTBufferTree<int,int>**>( &rgBuf );
00545 *prgBuf = new DTBufferTree<int,int>;
00546 DTBufferTree<int,int>** pgrBuf;
00547 pgrBuf = const_cast<DTBufferTree<int,int>**>( &grBuf );
00548 *pgrBuf = new DTBufferTree<int,int>;
00549
00550 DTBufferTree<int,int>** prgROB;
00551 prgROB = const_cast<DTBufferTree<int,int>**>( &rgROB );
00552 *prgROB = new DTBufferTree<int,int>;
00553 DTBufferTree<int,int>** prgROS;
00554 prgROS = const_cast<DTBufferTree<int,int>**>( &rgROS );
00555 *prgROS = new DTBufferTree<int,int>;
00556 DTBufferTree<int,int>** prgDDU;
00557 prgDDU = const_cast<DTBufferTree<int,int>**>( &rgDDU );
00558 *prgDDU = new DTBufferTree<int,int>;
00559 rgROB->setDefault( 0 );
00560 rgROS->setDefault( 0 );
00561 rgDDU->setDefault( 0 );
00562
00563 DTBufferTree<int,std::vector<int>*>** pgrROB;
00564 pgrROB = const_cast<DTBufferTree<int,std::vector<int>*>**>( &grROB );
00565 *pgrROB = new DTBufferTree<int,std::vector<int>*>;
00566 DTBufferTree<int,std::vector<int>*>** pgrROS;
00567 pgrROS = const_cast<DTBufferTree<int,std::vector<int>*>**>( &grROS );
00568 *pgrROS = new DTBufferTree<int,std::vector<int>*>;
00569 DTBufferTree<int,std::vector<int>*>** pgrDDU;
00570 pgrDDU = const_cast<DTBufferTree<int,std::vector<int>*>**>( &grDDU );
00571 *pgrDDU = new DTBufferTree<int,std::vector<int>*>;
00572 grROB->setDefault( 0 );
00573 grROS->setDefault( 0 );
00574 grDDU->setDefault( 0 );
00575
00576 int entryNum = 0;
00577 int entryMax = readOutChannelDriftTubeMap.size();
00578 std::vector<int> cellKey;
00579 cellKey.reserve(6);
00580 std::vector<int> chanKey;
00581 chanKey.reserve(5);
00582 int defaultValue = 0;
00583 int key;
00584 int val;
00585 int rosMapKey = 0;
00586 int robMapKey = 0;
00587 std::map<int,std::vector<int>*> dduEntries;
00588 for ( entryNum = 0; entryNum < entryMax; entryNum++ ) {
00589
00590 const DTReadOutGeometryLink& link( readOutChannelDriftTubeMap[entryNum] );
00591
00592 key = link.dduId;
00593 val = link.stationId;
00594 if ( key > 0x3fffffff ) {
00595 if ( link. tdcId > 0x3fffffff ) {
00596 mType->insert( 0, defaultValue = link. tdcId );
00597 rosMapKey = key;
00598 }
00599 else {
00600 mType->insert( 0, defaultValue = link.wheelId );
00601 robMapKey = key;
00602 }
00603 }
00604
00605 if ( defaultValue == 0 ) {
00606
00607 chanKey.clear();
00608 chanKey.push_back( link. dduId );
00609 chanKey.push_back( link. rosId );
00610 chanKey.push_back( link. robId );
00611 chanKey.push_back( link. tdcId );
00612 chanKey.push_back( link.channelId );
00613
00614 rgBuf->insert( chanKey.begin(), chanKey.end(), entryNum );
00615
00616 cellKey.clear();
00617 cellKey.push_back( link. wheelId );
00618 cellKey.push_back( link.stationId );
00619 cellKey.push_back( link. sectorId );
00620 cellKey.push_back( link. slId );
00621 cellKey.push_back( link. layerId );
00622 cellKey.push_back( link. cellId );
00623
00624 grBuf->insert( cellKey.begin(), cellKey.end(), entryNum );
00625
00626 }
00627
00628 if ( key == robMapKey ) {
00629
00630 chanKey.clear();
00631 chanKey.push_back( link. rosId );
00632 chanKey.push_back( link. tdcId );
00633 chanKey.push_back( link.channelId );
00634 rgROB->insert( chanKey.begin(), chanKey.end(), entryNum );
00635
00636 cellKey.clear();
00637 cellKey.push_back( link. cellId );
00638 cellKey.push_back( link.layerId );
00639 cellKey.push_back( link. slId );
00640 std::vector<int>* robMLgr;
00641 grROB->find( cellKey.begin(), cellKey.end(), robMLgr );
00642 if ( robMLgr == 0 ) grROB->insert( cellKey.begin(), cellKey.end(),
00643 robMLgr = new std::vector<int> );
00644 robMLgr->push_back( entryNum );
00645
00646 }
00647
00648 if ( key == rosMapKey ) {
00649
00650 chanKey.clear();
00651 chanKey.push_back( link.rosId );
00652 chanKey.push_back( link.robId );
00653 rgROS->insert( chanKey.begin(), chanKey.end(), entryNum );
00654
00655 cellKey.clear();
00656 cellKey.push_back( link. cellId );
00657 cellKey.push_back( link.stationId );
00658 std::vector<int>* rosMLgr;
00659 grROS->find( cellKey.begin(), cellKey.end(), rosMLgr );
00660 if ( rosMLgr == 0 ) grROS->insert( cellKey.begin(), cellKey.end(),
00661 rosMLgr = new std::vector<int> );
00662 rosMLgr->push_back( entryNum );
00663
00664 }
00665
00666 if ( ( key < 0x3fffffff ) &&
00667 ( val > 0x3fffffff ) ) {
00668
00669 chanKey.clear();
00670 chanKey.push_back( link.dduId );
00671 chanKey.push_back( link.rosId );
00672 rgDDU->insert( chanKey.begin(), chanKey.end(), entryNum );
00673
00674 int mapId = link.cellId;
00675 std::vector<int>* dduMLgr;
00676 std::map<int,std::vector<int>*>::const_iterator dduEntIter =
00677 dduEntries.find( mapId );
00678 if ( dduEntIter == dduEntries.end() )
00679 dduEntries.insert( std::pair<int,std::vector<int>*>( mapId,
00680 dduMLgr = new std::vector<int> ) );
00681 else dduMLgr = dduEntIter->second;
00682 dduMLgr->push_back( entryNum );
00683
00684 }
00685
00686 }
00687
00688 if ( defaultValue != 0 ) {
00689 for ( entryNum = 0; entryNum < entryMax; entryNum++ ) {
00690 const DTReadOutGeometryLink& link(
00691 readOutChannelDriftTubeMap[entryNum] );
00692 key = link.dduId;
00693 if ( key != rosMapKey ) continue;
00694 int mapId = link. rosId;
00695 int whchkId = link. wheelId;
00696 int secchkId = link.sectorId;
00697
00698 std::vector<int>* dduMLgr;
00699 std::map<int,std::vector<int>*>::const_iterator dduEntIter =
00700 dduEntries.find( mapId );
00701 if ( dduEntIter != dduEntries.end() ) dduMLgr = dduEntIter->second;
00702 else continue;
00703 std::vector<int>::const_iterator dduIter = dduMLgr->begin();
00704 std::vector<int>::const_iterator dduIend = dduMLgr->end();
00705 while( dduIter != dduIend ) {
00706 int ientry = *dduIter++;
00707 const DTReadOutGeometryLink& lros(
00708 readOutChannelDriftTubeMap[ientry] );
00709 int wheelId = whchkId;
00710 int sectorId = secchkId;
00711 if ( wheelId == defaultValue ) wheelId = lros. wheelId;
00712 if ( sectorId == defaultValue ) sectorId = lros.sectorId;
00713 cellKey.clear();
00714 cellKey.push_back( mapId );
00715 cellKey.push_back( wheelId );
00716 cellKey.push_back( sectorId );
00717 std::vector<int>* dduMLgr = 0;
00718 grDDU->find( cellKey.begin(), cellKey.end(), dduMLgr );
00719 if ( dduMLgr == 0 ) grDDU->insert( cellKey.begin(), cellKey.end(),
00720 dduMLgr = new std::vector<int> );
00721 dduMLgr->push_back( ientry );
00722 }
00723
00724 }
00725
00726 std::map<int,std::vector<int>*>::const_iterator dduEntIter =
00727 dduEntries.begin();
00728 std::map<int,std::vector<int>*>::const_iterator dduEntIend =
00729 dduEntries.end();
00730 while ( dduEntIter != dduEntIend ) {
00731 const std::pair<int,std::vector<int>*>& dduEntry = *dduEntIter++;
00732 delete dduEntry.second;
00733 }
00734
00735 delete rgBuf;
00736 delete grBuf;
00737 *prgBuf = new DTBufferTree<int,int>;
00738 *pgrBuf = new DTBufferTree<int,int>;
00739
00740 }
00741
00742 return;
00743
00744 }
00745