00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "CondFormats/DTObjects/interface/DTTtrig.h"
00014
00015
00016
00017
00018 #include "CondFormats/DTObjects/interface/DTDataBuffer.h"
00019
00020
00021
00022
00023 #include <iostream>
00024 #include <sstream>
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 DTTtrig::DTTtrig():
00035 dataVersion( " " ),
00036 nsPerCount( 25.0 / 32.0 ) {
00037 dataList.reserve( 1000 );
00038 }
00039
00040
00041 DTTtrig::DTTtrig( const std::string& version ):
00042 dataVersion( version ),
00043 nsPerCount( 25.0 / 32.0 ) {
00044 dataList.reserve( 1000 );
00045 }
00046
00047
00048 DTTtrigId::DTTtrigId() :
00049 wheelId( 0 ),
00050 stationId( 0 ),
00051 sectorId( 0 ),
00052 slId( 0 ),
00053 layerId( 0 ),
00054 cellId( 0 ) {
00055 }
00056
00057
00058 DTTtrigData::DTTtrigData() :
00059 tTrig( 0.0 ),
00060 tTrms( 0.0 ) {
00061 }
00062
00063
00064
00065
00066
00067 DTTtrig::~DTTtrig() {
00068 DTDataBuffer<int,int>::dropBuffer( mapName() );
00069 }
00070
00071
00072 DTTtrigId::~DTTtrigId() {
00073 }
00074
00075
00076 DTTtrigData::~DTTtrigData() {
00077 }
00078
00079
00080
00081
00082
00083 int DTTtrig::get( int wheelId,
00084 int stationId,
00085 int sectorId,
00086 int slId,
00087 float& tTrig,
00088 float& tTrms,
00089 DTTimeUnits::type unit ) const {
00090 return get( wheelId, stationId, sectorId,
00091 slId, 0, 0,
00092 tTrig, tTrms, unit );
00093
00094 }
00095
00096
00097 int DTTtrig::get( int wheelId,
00098 int stationId,
00099 int sectorId,
00100 int slId,
00101 int layerId,
00102 int cellId,
00103 float& tTrig,
00104 float& tTrms,
00105 DTTimeUnits::type unit ) const {
00106
00107 tTrig =
00108 tTrms = 0.0;
00109
00110 std::string mName = mapName();
00111 DTBufferTree<int,int>* dBuf =
00112 DTDataBuffer<int,int>::findBuffer( mName );
00113 if ( dBuf == 0 ) {
00114 cacheMap();
00115 dBuf =
00116 DTDataBuffer<int,int>::findBuffer( mName );
00117 }
00118
00119 std::vector<int> chanKey;
00120 chanKey.reserve(6);
00121 chanKey.push_back( wheelId );
00122 chanKey.push_back( stationId );
00123 chanKey.push_back( sectorId );
00124 chanKey.push_back( slId );
00125 chanKey.push_back( layerId );
00126 chanKey.push_back( cellId );
00127 int ientry;
00128 int searchStatus = dBuf->find( chanKey.begin(), chanKey.end(), ientry );
00129 if ( !searchStatus ) {
00130 const DTTtrigData& data( dataList[ientry].second );
00131 tTrig = data.tTrig;
00132 tTrms = data.tTrms;
00133 if ( unit == DTTimeUnits::ns ) {
00134 tTrig *= nsPerCount;
00135 tTrms *= nsPerCount;
00136 }
00137 }
00138
00139 return searchStatus;
00140
00141 }
00142
00143
00144 int DTTtrig::get( const DTSuperLayerId& id,
00145 float& tTrig,
00146 float& tTrms,
00147 DTTimeUnits::type unit ) const {
00148 return get( id.wheel(),
00149 id.station(),
00150 id.sector(),
00151 id.superLayer(), 0, 0,
00152 tTrig, tTrms, unit );
00153 }
00154
00155
00156 int DTTtrig::get( const DetId& id,
00157 float& tTrig,
00158 float& tTrms,
00159 DTTimeUnits::type unit ) const {
00160 DTWireId wireId( id.rawId() );
00161 return get( wireId.wheel(),
00162 wireId.station(),
00163 wireId.sector(),
00164 wireId.superLayer(),
00165 wireId.layer(),
00166 wireId.wire(),
00167 tTrig, tTrms, unit );
00168 }
00169
00170
00171 float DTTtrig::unit() const {
00172 return nsPerCount;
00173 }
00174
00175
00176 const
00177 std::string& DTTtrig::version() const {
00178 return dataVersion;
00179 }
00180
00181
00182 std::string& DTTtrig::version() {
00183 return dataVersion;
00184 }
00185
00186
00187 void DTTtrig::clear() {
00188 DTDataBuffer<int,int>::dropBuffer( mapName() );
00189 dataList.clear();
00190 return;
00191 }
00192
00193
00194 int DTTtrig::set( int wheelId,
00195 int stationId,
00196 int sectorId,
00197 int slId,
00198 float tTrig,
00199 float tTrms,
00200 DTTimeUnits::type unit ) {
00201 return set( wheelId, stationId, sectorId,
00202 slId, 0, 0,
00203 tTrig, tTrms, unit );
00204
00205 }
00206
00207
00208 int DTTtrig::set( int wheelId,
00209 int stationId,
00210 int sectorId,
00211 int slId,
00212 int layerId,
00213 int cellId,
00214 float tTrig,
00215 float tTrms,
00216 DTTimeUnits::type unit ) {
00217
00218 if ( unit == DTTimeUnits::ns ) {
00219 tTrig /= nsPerCount;
00220 tTrms /= nsPerCount;
00221 }
00222
00223 std::string mName = mapName();
00224 DTBufferTree<int,int>* dBuf =
00225 DTDataBuffer<int,int>::findBuffer( mName );
00226 if ( dBuf == 0 ) {
00227 cacheMap();
00228 dBuf =
00229 DTDataBuffer<int,int>::findBuffer( mName );
00230 }
00231 std::vector<int> chanKey;
00232 chanKey.reserve(6);
00233 chanKey.push_back( wheelId );
00234 chanKey.push_back( stationId );
00235 chanKey.push_back( sectorId );
00236 chanKey.push_back( slId );
00237 chanKey.push_back( layerId );
00238 chanKey.push_back( cellId );
00239 int ientry;
00240 int searchStatus = dBuf->find( chanKey.begin(), chanKey.end(), ientry );
00241
00242 if ( !searchStatus ) {
00243 DTTtrigData& data( dataList[ientry].second );
00244 data.tTrig = tTrig;
00245 data.tTrms = tTrms;
00246 return -1;
00247 }
00248 else {
00249 DTTtrigId key;
00250 key. wheelId = wheelId;
00251 key.stationId = stationId;
00252 key. sectorId = sectorId;
00253 key. slId = slId;
00254 key. layerId = layerId;
00255 key. cellId = cellId;
00256 DTTtrigData data;
00257 data.tTrig = tTrig;
00258 data.tTrms = tTrms;
00259 ientry = dataList.size();
00260 dataList.push_back( std::pair<DTTtrigId,DTTtrigData>( key, data ) );
00261 dBuf->insert( chanKey.begin(), chanKey.end(), ientry );
00262 return 0;
00263 }
00264
00265 return 99;
00266
00267 }
00268
00269
00270 int DTTtrig::set( const DTSuperLayerId& id,
00271 float tTrig,
00272 float tTrms,
00273 DTTimeUnits::type unit ) {
00274 return set( id.wheel(),
00275 id.station(),
00276 id.sector(),
00277 id.superLayer(), 0, 0,
00278 tTrig, tTrms, unit );
00279 }
00280
00281
00282 int DTTtrig::set( const DetId& id,
00283 float tTrig,
00284 float tTrms,
00285 DTTimeUnits::type unit ) {
00286 DTWireId wireId( id.rawId() );
00287 return set( wireId.wheel(),
00288 wireId.station(),
00289 wireId.sector(),
00290 wireId.superLayer(),
00291 wireId.layer(),
00292 wireId.wire(),
00293 tTrig, tTrms, unit );
00294 }
00295
00296
00297 void DTTtrig::setUnit( float unit ) {
00298 nsPerCount = unit;
00299 }
00300
00301
00302 DTTtrig::const_iterator DTTtrig::begin() const {
00303 return dataList.begin();
00304 }
00305
00306
00307 DTTtrig::const_iterator DTTtrig::end() const {
00308 return dataList.end();
00309 }
00310
00311
00312 std::string DTTtrig::mapName() const {
00313 std::stringstream name;
00314 name << dataVersion << "_map_Ttrig" << this;
00315 return name.str();
00316 }
00317
00318
00319 void DTTtrig::cacheMap() const {
00320
00321 std::string mName = mapName();
00322 DTBufferTree<int,int>* dBuf =
00323 DTDataBuffer<int,int>::openBuffer( mName );
00324
00325 int entryNum = 0;
00326 int entryMax = dataList.size();
00327 std::vector<int> chanKey;
00328 chanKey.reserve(6);
00329 while ( entryNum < entryMax ) {
00330
00331 const DTTtrigId& chan = dataList[entryNum].first;
00332
00333 chanKey.clear();
00334 chanKey.push_back( chan. wheelId );
00335 chanKey.push_back( chan.stationId );
00336 chanKey.push_back( chan. sectorId );
00337 chanKey.push_back( chan. slId );
00338 chanKey.push_back( chan. layerId );
00339 chanKey.push_back( chan. cellId );
00340 dBuf->insert( chanKey.begin(), chanKey.end(), entryNum++ );
00341
00342 }
00343
00344 return;
00345
00346 }
00347