00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "CondTools/L1Trigger/interface/L1ConfigOnlineProdBase.h"
00025 #include "CondFormats/L1TObjects/interface/L1CaloHcalScale.h"
00026 #include "CondFormats/DataRecord/interface/L1CaloHcalScaleRcd.h"
00027 #include "Geometry/HcalTowerAlgo/interface/HcalTrigTowerGeometry.h"
00028 #include "CalibCalorimetry/CaloTPG/src/CaloTPGTranscoderULUT.h"
00029 #include "CondTools/L1Trigger/interface/OMDSReader.h"
00030
00031 #include <cmath>
00032 #include <iostream>
00033 #include <iomanip>
00034
00035
00036
00037
00038
00039 class L1CaloHcalScaleConfigOnlineProd :
00040 public L1ConfigOnlineProdBase< L1CaloHcalScaleRcd, L1CaloHcalScale > {
00041 public:
00042 L1CaloHcalScaleConfigOnlineProd(const edm::ParameterSet& iConfig);
00043 ~L1CaloHcalScaleConfigOnlineProd();
00044
00045 virtual boost::shared_ptr< L1CaloHcalScale > newObject(
00046 const std::string& objectKey ) ;
00047
00048
00049 private:
00050
00051 L1CaloHcalScale* hcalScale;
00052 HcalTrigTowerGeometry* theTrigTowerGeometry;
00053 CaloTPGTranscoderULUT* caloTPG;
00054 typedef std::vector<double> RCTdecompression;
00055 std::vector<RCTdecompression> hcaluncomp;
00056
00057
00058
00059
00060 HcalTrigTowerDetId* ttDetId;
00061
00062
00063 };
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 L1CaloHcalScaleConfigOnlineProd::L1CaloHcalScaleConfigOnlineProd(
00077 const edm::ParameterSet& iConfig)
00078 : L1ConfigOnlineProdBase< L1CaloHcalScaleRcd, L1CaloHcalScale >( iConfig )
00079 {
00080 hcalScale = new L1CaloHcalScale(0);
00081 caloTPG = new CaloTPGTranscoderULUT();
00082
00083 HcalTopologyMode::Mode mode = HcalTopologyMode::LHC;
00084 int maxDepthHB = 2;
00085 int maxDepthHE = 3;
00086 if( iConfig.exists( "hcalTopologyConstants" ))
00087 {
00088 const edm::ParameterSet hcalTopoConsts = iConfig.getParameter<edm::ParameterSet>( "hcalTopologyConstants" );
00089 StringToEnumParser<HcalTopologyMode::Mode> parser;
00090 mode = (HcalTopologyMode::Mode) parser.parseString(hcalTopoConsts.getParameter<std::string>("mode"));
00091 maxDepthHB = hcalTopoConsts.getParameter<int>("maxDepthHB");
00092 maxDepthHE = hcalTopoConsts.getParameter<int>("maxDepthHE");
00093 }
00094
00095 theTrigTowerGeometry = new HcalTrigTowerGeometry( new HcalTopology( mode, maxDepthHB, maxDepthHE ));
00096 }
00097
00098
00099 L1CaloHcalScaleConfigOnlineProd::~L1CaloHcalScaleConfigOnlineProd()
00100 {
00101
00102
00103
00104 if(caloTPG != 0)
00105 delete caloTPG;
00106 }
00107
00108 boost::shared_ptr< L1CaloHcalScale >
00109 L1CaloHcalScaleConfigOnlineProd::newObject( const std::string& objectKey )
00110 {
00111 using namespace edm::es;
00112
00113 std:: cout << "object Key " << objectKey <<std::endl <<std::flush;
00114
00115 if(objectKey == "NULL" || objectKey == "")
00116 return boost::shared_ptr< L1CaloHcalScale >( hcalScale );
00117 if(objectKey == "IDENTITY"){
00118
00119 delete hcalScale;
00120
00121 hcalScale = new L1CaloHcalScale(1);
00122
00123 return boost::shared_ptr< L1CaloHcalScale >( hcalScale);
00124 }
00125
00126 std::vector<unsigned int> analyticalLUT(1024, 0);
00127 std::vector<unsigned int> identityLUT(1024, 0);
00128
00129
00130 for (unsigned int i=0; i < 1024; i++) {
00131 analyticalLUT[i] = (unsigned int)(sqrt(14.94*log(1.+i/14.94)*i) + 0.5);
00132 identityLUT[i] = std::min(i,0xffu);
00133 }
00134
00135 hcaluncomp.clear();
00136 for (int i = 0; i < 4176; i++){
00137 RCTdecompression decompressionTable(256,0);
00138 hcaluncomp.push_back(decompressionTable);
00139 }
00140
00141
00142
00143 std::vector < std::string > mainStrings;
00144 mainStrings.push_back("HCAL_LUT_METADATA");
00145 mainStrings.push_back("HCAL_LUT_CHAN_DATA");
00146
00147
00148
00149
00150 std::vector< std::string > metaStrings ;
00151 metaStrings.push_back("RCTLSB");
00152 metaStrings.push_back("NOMINAL_GAIN");
00153
00154
00155 l1t::OMDSReader::QueryResults paramResults =
00156 m_omdsReader.basicQueryView( metaStrings,
00157 "CMS_HCL_HCAL_COND",
00158 "V_HCAL_LUT_METADATA_V1",
00159 "V_HCAL_LUT_METADATA_V1.TAG_NAME",
00160 m_omdsReader.basicQuery(
00161 "HCAL_LUT_METADATA",
00162 "CMS_RCT",
00163 "HCAL_SCALE_KEY",
00164 "HCAL_SCALE_KEY.HCAL_TAG",
00165 m_omdsReader.singleAttribute(objectKey)));
00166
00167
00168
00169
00170 if( paramResults.queryFailed()
00171 || (paramResults.numberRows()!=1) )
00172 {
00173 edm::LogError( "L1-O2O" ) << "Problem with L1CaloHcalScale key. Unable to find lutparam dat table" ;
00174 return boost::shared_ptr< L1CaloHcalScale >() ;
00175 }
00176
00177 double hcalLSB, nominal_gain;
00178 paramResults.fillVariable("RCTLSB",hcalLSB);
00179 paramResults.fillVariable("NOMINAL_GAIN",nominal_gain);
00180
00181 float rctlsb = hcalLSB;
00182
00183
00184
00185 l1t::OMDSReader::QueryResults chanKey =m_omdsReader.basicQuery(
00186 "HCAL_LUT_CHAN_DATA",
00187 "CMS_RCT",
00188 "HCAL_SCALE_KEY",
00189 "HCAL_SCALE_KEY.HCAL_TAG",
00190 m_omdsReader.singleAttribute(objectKey));
00191
00192
00193
00194
00195
00196 std::string schemaName("CMS_HCL_HCAL_COND");
00197 coral::ISchema& schema = m_omdsReader.dbSession()->schema( schemaName ) ;
00198 coral::IQuery* query = schema.newQuery(); ;
00199
00200
00201 std::vector< std::string > channelStrings;
00202 channelStrings.push_back("IPHI");
00203 channelStrings.push_back("IETA");
00204 channelStrings.push_back("LUT_GRANULARITY");
00205 channelStrings.push_back("OUTPUT_LUT_THRESHOLD");
00206 channelStrings.push_back("OBJECTNAME");
00207
00208
00209
00210 std::vector< std::string >::const_iterator it = channelStrings.begin() ;
00211 std::vector< std::string >::const_iterator end = channelStrings.end() ;
00212 for( ; it != end ; ++it )
00213 {
00214 query->addToOutputList( *it ) ;
00215 }
00216
00217 std::string ob = "OBJECTNAME";
00218 coral::AttributeList myresult;
00219 myresult.extend("IPHI", typeid(int));
00220 myresult.extend("IETA", typeid(int));
00221 myresult.extend("LUT_GRANULARITY", typeid(int));
00222 myresult.extend("OUTPUT_LUT_THRESHOLD", typeid(int));
00223 myresult.extend( ob,typeid(std::string));
00224
00225 query->defineOutput( myresult );
00226
00227 query->addToTableList( "V_HCAL_LUT_CHAN_DATA_V1");
00228
00229 query->setCondition(
00230 "V_HCAL_LUT_CHAN_DATA_V1.TAG_NAME = :" + chanKey.columnNames().front(),
00231 chanKey.attributeLists().front());
00232
00233 coral::ICursor& cursor = query->execute();
00234
00235
00236 std::vector<coral::AttributeList> atts;
00237 while (cursor.next()) {
00238 atts.push_back(cursor.currentRow());
00239 };
00240
00241 delete query;
00242
00243 l1t::OMDSReader::QueryResults chanResults(channelStrings,atts);
00244 if( chanResults.queryFailed()
00245 || (chanResults.numberRows()==0) )
00246 {
00247 edm::LogError( "L1-O2O" ) << "Problem with L1CaloHcalScale key. Unable to find lutparam dat table nrows" << chanResults.numberRows() ;
00248 return boost::shared_ptr< L1CaloHcalScale >() ;
00249 }
00250
00251
00252
00253 chanResults.attributeLists();
00254 for(int i = 0; i < chanResults.numberRows() ; ++i){
00255 std::string objectName;
00256 chanResults.fillVariableFromRow("OBJECTNAME",i, objectName);
00257
00258 if(objectName == "HcalTrigTowerDetId") {
00259 int ieta, iphi, lutGranularity, threshold;
00260
00261
00262 chanResults.fillVariableFromRow("LUT_GRANULARITY",i,lutGranularity);
00263 chanResults.fillVariableFromRow("IPHI",i,iphi);
00264 chanResults.fillVariableFromRow("IETA",i,ieta);
00265 chanResults.fillVariableFromRow("OUTPUT_LUT_THRESHOLD",i,threshold);
00266
00267
00268 unsigned int outputLut[1024];
00269
00270 uint32_t lutId = caloTPG->getOutputLUTId(ieta,iphi);
00271
00272 double eta_low = 0., eta_high = 0.;
00273 theTrigTowerGeometry->towerEtaBounds(ieta,eta_low,eta_high);
00274 double cosh_ieta = fabs(cosh((eta_low + eta_high)/2.));
00275
00276
00277 if (!caloTPG->HTvalid(ieta, iphi)) continue;
00278 double factor = 0.;
00279 if (abs(ieta) >= theTrigTowerGeometry->firstHFTower())
00280 factor = rctlsb;
00281 else
00282 factor = nominal_gain / cosh_ieta * lutGranularity;
00283 for (int k = 0; k < threshold; ++k)
00284 outputLut[k] = 0;
00285
00286 for (unsigned int k = threshold; k < 1024; ++k)
00287 outputLut[k] = (abs(ieta) < theTrigTowerGeometry->firstHFTower()) ? analyticalLUT[k] : identityLUT[k];
00288
00289
00290
00291 unsigned int tpg = outputLut[0];
00292
00293 int low = 0;
00294
00295 for (unsigned int k = 0; k < 1024; ++k){
00296 if (outputLut[k] != tpg){
00297 unsigned int mid = (low + k)/2;
00298 hcaluncomp[lutId][tpg] = (tpg == 0 ? low : factor * mid);
00299 low = k;
00300 tpg = outputLut[k];
00301 }
00302 }
00303 hcaluncomp[lutId][tpg] = factor * low;
00304 }
00305 }
00306
00307
00308
00309 for( unsigned short ieta = 1 ; ieta <= L1CaloHcalScale::nBinEta; ++ieta ){
00310 for(int pos = 0; pos <=1; pos++){
00311 for( unsigned short irank = 0 ; irank < L1CaloHcalScale::nBinRank; ++irank ){
00312
00313
00314
00315 int zside = (int) pow(-1,pos);
00316 int nphi = 0;
00317 double etvalue = 0.;
00318
00319
00320 for(int iphi = 1; iphi<=72; iphi++){
00321 if(!caloTPG->HTvalid(ieta, iphi))
00322 continue;
00323 uint32_t lutId = caloTPG->getOutputLUTId(ieta,iphi);
00324 nphi++;
00325 etvalue += (double) hcaluncomp[lutId][irank];
00326
00327 }
00328 if (nphi > 0) etvalue /= nphi;
00329
00330 hcalScale->setBin(irank, ieta, zside, etvalue);
00331
00332 }
00333 }
00334 }
00335
00336 std::cout << std::setprecision(10);
00337 hcalScale->print(std::cout);
00338
00339 return boost::shared_ptr< L1CaloHcalScale >( hcalScale );
00340
00341 }
00342
00343 DEFINE_FWK_EVENTSETUP_MODULE(L1CaloHcalScaleConfigOnlineProd);