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
00021 #include "CondFormats/L1TObjects/interface/L1MuDTPhiLut.h"
00022
00023
00024
00025
00026
00027 #include <iostream>
00028 #include <ostream>
00029 #include <iomanip>
00030 #include <string>
00031 #include <cstdlib>
00032
00033
00034
00035
00036
00037 #include "FWCore/ParameterSet/interface/FileInPath.h"
00038 #include "CondFormats/L1TObjects/interface/DTTFBitArray.h"
00039 #include "CondFormats/L1TObjects/interface/L1TriggerLutFile.h"
00040
00041 using namespace std;
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 L1MuDTPhiLut::L1MuDTPhiLut() {
00052
00053 phi_lut.reserve(2);
00054 setPrecision();
00055
00056
00057
00058
00059
00060
00061 }
00062
00063
00064
00065
00066
00067
00068 L1MuDTPhiLut::~L1MuDTPhiLut() {
00069
00070 vector<LUT>::iterator iter;
00071 for ( iter = phi_lut.begin(); iter != phi_lut.end(); iter++ ) {
00072 (*iter).clear();
00073 }
00074
00075 phi_lut.clear();
00076
00077 }
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 void L1MuDTPhiLut::reset() {
00088
00089 phi_lut.clear();
00090
00091 }
00092
00093
00094
00095
00096
00097 int L1MuDTPhiLut::load() {
00098
00099
00100 string defaultPath = "L1TriggerConfig/DTTrackFinder/parameters/";
00101 string phi_dir = "L1TriggerData/DTTrackFinder/Ass/";
00102 string phi_str = "";
00103
00104
00105
00106
00107 int sh_phi = 12 - nbit_phi;
00108 int sh_phib = 10 - nbit_phib;
00109
00110
00111 for ( int idx = 0; idx < 2; idx++ ) {
00112 switch ( idx ) {
00113 case 0 : { phi_str = "phi12"; break; }
00114 case 1 : { phi_str = "phi42"; break; }
00115 }
00116
00117
00118 edm::FileInPath lut_f = edm::FileInPath(string(defaultPath + phi_dir + phi_str + ".lut"));
00119 string phi_file = lut_f.fullPath();
00120
00121
00122 L1TriggerLutFile file(phi_file);
00123 if ( file.open() != 0 ) return -1;
00124
00125
00126
00127 LUT tmplut;
00128
00129 int number = -1;
00130 int adr_old = -512 >> sh_phib;
00131 int sum_phi = 0;
00132
00133
00134 while ( file.good() ) {
00135
00136 int adr = (file.readInteger()) >> sh_phib;
00137 int phi = file.readInteger();
00138
00139 number++;
00140
00141 if ( adr != adr_old ) {
00142 tmplut.insert(make_pair( adr_old, ((sum_phi/number) >> sh_phi) ));
00143
00144 adr_old = adr;
00145 number = 0;
00146 sum_phi = 0;
00147 }
00148
00149 sum_phi += phi;
00150
00151 if ( !file.good() ) file.close();
00152
00153 }
00154
00155 file.close();
00156 phi_lut.push_back(tmplut);
00157 }
00158 return 0;
00159
00160 }
00161
00162
00163
00164
00165
00166 void L1MuDTPhiLut::print() const {
00167
00168 cout << endl;
00169 cout << "L1 barrel Track Finder Phi-Assignment look-up tables :" << endl;
00170 cout << "======================================================" << endl;
00171 cout << endl;
00172 cout << "Precision : " << endl;
00173 cout << '\t' << setw(2) << nbit_phi << " bits are used for phi " << endl;
00174 cout << '\t' << setw(2) << nbit_phib << " bits are used for phib " << endl;
00175
00176
00177 for ( int idx = 0; idx < 2; idx++ ) {
00178
00179 cout << endl;
00180 if ( idx == 0 ) cout << "Phi-Assignment Method : " << "PHI12" << endl;
00181 if ( idx == 1 ) cout << "Phi-Assignment Method : " << "PHI42" << endl;
00182 cout << "=============================" << endl;
00183 cout << endl;
00184
00185 cout << " address";
00186 for ( int i = 0; i < nbit_phib; i++ ) cout << ' ';
00187 cout << " value" << endl;
00188 for ( int i = 0; i < nbit_phi + nbit_phib; i++ ) cout << '-';
00189 cout << "----------------------" << endl;
00190
00191 LUT::const_iterator iter = phi_lut[idx].begin();
00192 while ( iter != phi_lut[idx].end() ) {
00193 int address = (*iter).first;
00194 int value = (*iter).second;
00195
00196 DTTFBitArray<10> b_address(static_cast<unsigned>(abs(address)));
00197 DTTFBitArray<12> b_value(static_cast<unsigned>(abs(value)));
00198
00199 if ( address < 0 ) b_address.twoComplement();
00200 if ( value < 0 ) b_value.twoComplement();
00201
00202 cout.setf(ios::right,ios::adjustfield);
00203 cout << " " << setbase(10) << setw(5) << address << " (";
00204 for ( int i = nbit_phib-1; i >= 0; i-- ) cout << b_address[i];
00205 cout << ") " << setw(5) << value << " (";
00206 for ( int i = nbit_phi-1; i >= 0; i-- ) cout << b_value[i];
00207 cout << ") " << endl;
00208
00209 iter++;
00210 }
00211
00212 }
00213
00214 cout << endl;
00215
00216 }
00217
00218
00219
00220
00221
00222 int L1MuDTPhiLut::getDeltaPhi(int idx, int address) const {
00223
00224 LUT::const_iterator iter = phi_lut[idx].find(address);
00225 if ( iter != phi_lut[idx].end() ) {
00226 return (*iter).second;
00227 }
00228 else {
00229 cerr << "PhiLut::getDeltaPhi : can not find address " << address << endl;
00230 return 0;
00231 }
00232
00233 }
00234
00235
00236
00237
00238
00239 void L1MuDTPhiLut::setPrecision() {
00240
00241 nbit_phi = 12;
00242 nbit_phib = 10;
00243
00244 }
00245
00246
00247
00248
00249
00250 pair<unsigned short, unsigned short> L1MuDTPhiLut::getPrecision() const {
00251
00252 return pair<unsigned short, unsigned short>(nbit_phi,nbit_phib);
00253
00254 }