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