Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "L1Trigger/DTTrackFinder/src/L1MuDTExtrapolationUnit.h"
00021
00022
00023
00024
00025
00026 #include <iostream>
00027 #include <bitset>
00028 #include <cassert>
00029
00030
00031
00032
00033
00034 #include "L1Trigger/DTTrackFinder/src/L1MuDTTFConfig.h"
00035 #include "CondFormats/L1TObjects/interface/L1MuDTExtParam.h"
00036 #include "L1Trigger/DTTrackFinder/src/L1MuDTSEU.h"
00037 #include "L1Trigger/DTTrackFinder/src/L1MuDTEUX.h"
00038 #include "L1Trigger/DTTrackFinder/src/L1MuDTERS.h"
00039 #include "L1Trigger/DTTrackFinder/src/L1MuDTSectorProcessor.h"
00040 #include "L1Trigger/DTTrackFinder/src/L1MuDTSecProcId.h"
00041 #include "L1Trigger/DTTrackFinder/src/L1MuDTDataBuffer.h"
00042 #include "L1Trigger/DTTrackFinder/src/L1MuDTTrackSegPhi.h"
00043 #include "CondFormats/L1TObjects/interface/L1MuDTTFParameters.h"
00044 #include "CondFormats/DataRecord/interface/L1MuDTTFParametersRcd.h"
00045
00046 using namespace std;
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 L1MuDTExtrapolationUnit::L1MuDTExtrapolationUnit(const L1MuDTSectorProcessor& sp) :
00057 m_sp(sp), m_SEUs() {
00058
00059 for ( int ext_idx = 0; ext_idx < MAX_EXT; ext_idx++ ) {
00060
00061 Extrapolation ext = static_cast<Extrapolation>(ext_idx);
00062
00063 if ( ext == EX12 || ext == EX13 || ext == EX14 ||
00064 ext == EX21 || ext == EX23 || ext == EX24 || ext == EX34 ) {
00065
00066 unsigned int maxaddr = 4;
00067
00068 if ( ext == EX12 || ext == EX13 || ext == EX14 ) maxaddr = 2;
00069
00070 for ( unsigned int startAddress = 0; startAddress < maxaddr; startAddress++ ) {
00071 SEUId id = make_pair(ext, startAddress);
00072 m_SEUs[id] = new L1MuDTSEU(sp,ext,startAddress);
00073 if ( L1MuDTTFConfig::Debug(6) ) cout << " creating SEU " << ext << " " << startAddress << endl;
00074 }
00075 }
00076 }
00077
00078 }
00079
00080
00081
00082
00083
00084
00085 L1MuDTExtrapolationUnit::~L1MuDTExtrapolationUnit() {
00086
00087 for ( SEUmap::iterator iter = m_SEUs.begin(); iter != m_SEUs.end(); iter++ ) {
00088 delete (*iter).second;
00089 (*iter).second = 0;
00090 }
00091 m_SEUs.clear();
00092
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 void L1MuDTExtrapolationUnit::run(const edm::EventSetup& c) {
00104
00105 c.get< L1MuDTTFParametersRcd >().get( pars );
00106
00107 SEUmap::const_iterator iter;
00108 for ( iter = m_SEUs.begin(); iter != m_SEUs.end(); iter++ ) {
00109
00110 pair<int,int> ext_pair = which_ext(((*iter).second)->ext());
00111 int start = ext_pair.first;
00112
00113 const L1MuDTTrackSegPhi* ts = 0;
00114
00115
00116 ts = m_sp.data()->getTSphi(start, ((*iter).second)->tsId() );
00117
00118 if ( ts != 0 && !ts->empty() ) {
00119 ((*iter).second)->load(ts);
00120 ((*iter).second)->run(c);
00121 }
00122
00123 }
00124
00125
00126
00127
00128 bool run_21 = pars->get_soc_run_21(m_sp.id().wheel(), m_sp.id().sector());
00129 if ( L1MuDTTFConfig::getUseEX21() || run_21 ) {
00130
00131
00132 for ( unsigned int startAdr = 0; startAdr < 2; startAdr++ ) {
00133
00134 bitset<12> extab12 = this->getEXTable( EX12, startAdr );
00135 bitset<12> extab21 = this->getEXTable( EX21, startAdr );
00136
00137 for ( int eux = 0; eux < 12; eux++ ) {
00138 if ( extab12.test(eux) && !extab21.test(eux) ) {
00139 reset(EX12,startAdr,eux);
00140 if ( L1MuDTTFConfig::Debug(6) ) {
00141 SEUId seuid = make_pair(EX12, startAdr);
00142 L1MuDTSEU* SEU12 = m_SEUs[seuid];
00143 cout << " EX12 - EX21 mismatch : "
00144 << " EX12 : " << extab12 << " , "
00145 << " EX21 : " << extab21 << endl
00146 << " Cancel: " << SEU12->ext()
00147 << " start addr = " << SEU12->tsId()
00148 << " target addr = " << eux << endl;
00149 }
00150 }
00151 }
00152
00153 }
00154 }
00155
00156 }
00157
00158
00159
00160
00161
00162 void L1MuDTExtrapolationUnit::reset() {
00163
00164 SEUmap::const_iterator iter;
00165 for ( iter = m_SEUs.begin(); iter != m_SEUs.end(); iter++ ) {
00166 ((*iter).second)->reset();
00167 }
00168
00169 }
00170
00171
00172
00173
00174
00175 void L1MuDTExtrapolationUnit::reset(Extrapolation ext, unsigned int startAdr, unsigned int relAdr) {
00176
00177
00178
00179
00180 SEUId seuid = make_pair(ext, startAdr);
00181 SEUmap::const_iterator iter = m_SEUs.find(seuid);
00182 if ( iter != m_SEUs.end() ) ((*iter).second)->reset(relAdr);
00183
00184 }
00185
00186
00187
00188
00189
00190 unsigned short int L1MuDTExtrapolationUnit::getAddress(Extrapolation ext, unsigned int startAdr, int id) const {
00191
00192
00193
00194
00195
00196
00197
00198
00199 unsigned short int address = 15;
00200
00201 SEUId seuid = make_pair(ext, startAdr);
00202 SEUmap::const_iterator iter = m_SEUs.find(seuid);
00203 if ( iter != m_SEUs.end() ) address = ((*iter).second)->ers()->address(id);
00204
00205 return address;
00206
00207 }
00208
00209
00210
00211
00212
00213 unsigned short int L1MuDTExtrapolationUnit::getQuality(Extrapolation ext, unsigned int startAdr, int id) const {
00214
00215
00216
00217
00218
00219
00220
00221
00222 unsigned short int quality = 0;
00223
00224 SEUId seuid = make_pair(ext, startAdr);
00225 SEUmap::const_iterator iter = m_SEUs.find(seuid);
00226 if ( iter != m_SEUs.end() ) quality = ((*iter).second)->ers()->quality(id);
00227
00228 return quality;
00229
00230 }
00231
00232
00233
00234
00235
00236 const bitset<12>& L1MuDTExtrapolationUnit::getEXTable(Extrapolation ext, unsigned int startAdr) const {
00237
00238
00239
00240
00241
00242
00243 SEUId seuid = make_pair(ext, startAdr);
00244 return m_SEUs[seuid]->exTable();
00245
00246 }
00247
00248
00249
00250
00251
00252 const bitset<12>& L1MuDTExtrapolationUnit::getQSTable(Extrapolation ext, unsigned int startAdr) const {
00253
00254
00255
00256
00257
00258
00259 SEUId seuid = make_pair(ext, startAdr);
00260 return m_SEUs[seuid]->qsTable();
00261
00262 }
00263
00264
00265
00266
00267
00268 int L1MuDTExtrapolationUnit::numberOfExt() const {
00269
00270 int number = 0;
00271 SEUmap::const_iterator iter;
00272 for ( iter = m_SEUs.begin(); iter != m_SEUs.end(); iter++ ) {
00273 number += ((*iter).second)->numberOfExt();
00274 }
00275
00276 return number;
00277
00278 }
00279
00280
00281
00282
00283
00284 void L1MuDTExtrapolationUnit::print(int level) const {
00285
00286 SEUmap::const_iterator iter_seu;
00287
00288 if ( level == 0 ) {
00289 for ( iter_seu = m_SEUs.begin(); iter_seu != m_SEUs.end(); iter_seu++ ) {
00290 vector<L1MuDTEUX*> vec_eux = ((*iter_seu).second)->eux();
00291 vector<L1MuDTEUX*>::const_iterator iter_eux;
00292 for ( iter_eux = vec_eux.begin();
00293 iter_eux != vec_eux.end(); iter_eux++ ) {
00294 if ( (*iter_eux)->result() ) {
00295 cout << ((*iter_seu).second)->ext() << " "
00296 << ((*iter_seu).second)->tsId() << " "
00297 << (*iter_eux)->id() << endl;
00298 cout << "start : " << *(*iter_eux)->ts().first << endl;
00299 cout << "target : " << *(*iter_eux)->ts().second << endl;
00300 cout << "result : " << "quality = " << (*iter_eux)->quality() << '\t'
00301 << "address = " << (*iter_eux)->address() << endl;
00302 }
00303 }
00304 }
00305 }
00306
00307
00308
00309
00310 if ( level == 1 ) {
00311 cout << "Results from Extrapolator and Quality Sorter of " << m_sp.id()
00312 << " : \n" << endl;
00313
00314 cout << " EXT QSU " << endl;
00315 cout << " S E U 11 11 " << endl;
00316 cout << " 109876543210 109876543210 " << endl;
00317 cout << "-------------------------------------" << endl;
00318 for ( iter_seu = m_SEUs.begin(); iter_seu != m_SEUs.end(); iter_seu++ ) {
00319
00320 cout << ((*iter_seu).second)->ext() << "_ "
00321 << ((*iter_seu).second)->tsId() << ": "
00322 << ((*iter_seu).second)->exTable() << " "
00323 << ((*iter_seu).second)->qsTable() << endl;
00324
00325 }
00326
00327 cout << endl;
00328 }
00329
00330 }
00331
00332
00333
00334
00335
00336
00337
00338 pair<int,int> L1MuDTExtrapolationUnit::which_ext(Extrapolation ext) {
00339
00340 int source = 0;
00341 int target = 0;
00342
00343
00344
00345 switch ( ext ) {
00346 case EX12 : { source = 1; target = 2; break; }
00347 case EX13 : { source = 1; target = 3; break; }
00348 case EX14 : { source = 1; target = 4; break; }
00349 case EX21 : { source = 1; target = 2; break; }
00350 case EX23 : { source = 2; target = 3; break; }
00351 case EX24 : { source = 2; target = 4; break; }
00352 case EX34 : { source = 3; target = 4; break; }
00353 case EX15 : { source = 1; target = 3; break; }
00354 case EX25 : { source = 2; target = 3; break; }
00355 default : { source = 1; target = 2; break; }
00356 }
00357
00358 return pair<int,int>(source,target);
00359
00360 }