00001 #include <iostream>
00002
00003 #include "FWCore/Framework/interface/eventsetupdata_registration_macro.h"
00004
00005 #include "CalibCalorimetry/EcalLaserCorrection/interface/EcalLaserDbService.h"
00006
00007 #include "CondFormats/EcalObjects/interface/EcalLaserAlphas.h"
00008 #include "CondFormats/EcalObjects/interface/EcalLaserAPDPNRatiosRef.h"
00009 #include "CondFormats/EcalObjects/interface/EcalLaserAPDPNRatios.h"
00010
00011 #include "FWCore/Framework/interface/ESHandle.h"
00012 #include "Geometry/EcalMapping/interface/EcalElectronicsMapping.h"
00013 #include "Geometry/EcalMapping/interface/EcalMappingRcd.h"
00014
00015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00016
00017 using namespace std;
00018
00019 EcalLaserDbService::EcalLaserDbService ()
00020 :
00021 mAlphas_ (0),
00022 mAPDPNRatiosRef_ (0),
00023 mAPDPNRatios_ (0)
00024 {}
00025
00026
00027
00028 const EcalLaserAlphas* EcalLaserDbService::getAlphas () const {
00029 return mAlphas_;
00030 }
00031
00032 const EcalLaserAPDPNRatiosRef* EcalLaserDbService::getAPDPNRatiosRef () const {
00033 return mAPDPNRatiosRef_;
00034 }
00035
00036 const EcalLaserAPDPNRatios* EcalLaserDbService::getAPDPNRatios () const {
00037 return mAPDPNRatios_;
00038 }
00039
00040
00041 float EcalLaserDbService::getLaserCorrection (DetId const & xid, edm::Timestamp const & iTime) const {
00042
00043 float correctionFactor = 1.0;
00044
00045 const EcalLaserAPDPNRatios::EcalLaserAPDPNRatiosMap& laserRatiosMap = mAPDPNRatios_->getLaserMap();
00046 const EcalLaserAPDPNRatios::EcalLaserTimeStampMap& laserTimeMap = mAPDPNRatios_->getTimeMap();
00047 const EcalLaserAPDPNRatiosRefMap& laserRefMap = mAPDPNRatiosRef_->getMap();
00048 const EcalLaserAlphaMap& laserAlphaMap = mAlphas_->getMap();
00049
00050 EcalLaserAPDPNRatios::EcalLaserAPDPNpair apdpnpair;
00051 EcalLaserAPDPNRatios::EcalLaserTimeStamp timestamp;
00052 EcalLaserAPDPNref apdpnref;
00053 EcalLaserAlpha alpha;
00054
00055 if (xid.det()==DetId::Ecal) {
00056
00057 } else {
00058
00059 edm::LogError("EcalLaserDbService") << " DetId is NOT in ECAL" << endl;
00060 return correctionFactor;
00061 }
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 int iLM = getLMNumber(xid);
00079
00080
00081
00082
00083 EcalLaserAPDPNRatios::EcalLaserAPDPNRatiosMap::const_iterator itratio = laserRatiosMap.find(xid);
00084 if (itratio != laserRatiosMap.end()) {
00085 apdpnpair = (*itratio);
00086 } else {
00087 edm::LogError("EcalLaserDbService") << "error with laserRatiosMap!" << endl;
00088 return correctionFactor;
00089 }
00090
00091 if (iLM-1< (int)laserTimeMap.size()) {
00092 timestamp = laserTimeMap[iLM-1];
00093 } else {
00094 edm::LogError("EcalLaserDbService") << "error with laserTimeMap!" << endl;
00095 return correctionFactor;
00096 }
00097
00098 EcalLaserAPDPNRatiosRefMap::const_iterator itref = laserRefMap.find(xid);
00099 if ( itref != laserRefMap.end() ) {
00100 apdpnref = (*itref);
00101 } else {
00102 edm::LogError("EcalLaserDbService") << "error with laserRefMap!" << endl;
00103 return correctionFactor;
00104 }
00105
00106 EcalLaserAlphaMap::const_iterator italpha = laserAlphaMap.find(xid);
00107 if ( italpha != laserAlphaMap.end() ) {
00108 alpha = (*italpha);
00109 } else {
00110 edm::LogError("EcalLaserDbService") << "error with laserAlphaMap!" << endl;
00111 return correctionFactor;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 if (apdpnref!=0&&(timestamp.t2.value()-timestamp.t1.value())!=0) {
00131 float interpolatedLaserResponse = apdpnpair.p1/apdpnref + (iTime.value()-timestamp.t1.value())*(apdpnpair.p2-apdpnpair.p1)/apdpnref/(timestamp.t2.value()-timestamp.t1.value());
00132
00133
00134 if (interpolatedLaserResponse<=0) {
00135 edm::LogError("EcalLaserDbService") << "interpolatedLaserResponse is <= zero!" << endl;
00136 return correctionFactor;
00137 } else {
00138 correctionFactor = 1/pow(interpolatedLaserResponse,alpha);
00139 }
00140
00141 } else {
00142 edm::LogError("EcalLaserDbService") << "apdpnref or timestamp.t2-timestamp.t1 is zero!" << endl;
00143 return correctionFactor;
00144 }
00145
00146
00147
00148 return correctionFactor;
00149
00150 }
00151
00152
00153
00154
00155
00156 int EcalLaserDbService::getLMNumber(DetId const & xid) const {
00157
00158 int iLM = 0;
00159
00160 if (xid.subdetId()==EcalBarrel) {
00161
00162 EBDetId tempid(xid.rawId());
00163
00164 int iSM = tempid.ism();
00165 int iETA = tempid.ietaSM();
00166 int iPHI = tempid.iphiSM();
00167
00168 const int nSM = 36;
00169 int numLM[nSM] = {37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35};
00170
00171 if (iSM<=nSM) {
00172 iLM = numLM[iSM-1];
00173 }
00174
00175 if (iPHI>10&&iETA>5) { iLM++; }
00176
00177
00178
00179 } else if (xid.subdetId()==EcalEndcap) {
00180
00181 EEDetId tempid(xid.rawId());
00182
00183 int iSC = tempid.isc();
00184 int iX = tempid.ix();
00185
00186 int iZ = tempid.zside();
00187
00188 const int nSC = 312;
00189 const int nEELM = 18;
00190
00191
00192
00193 int indexSCpos[nSC] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163,164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 308, 309, 310, 311, 312, 313, 314, 315, 316 };
00194
00195 int indexDCCpos[nSC] = { 48, 48, 48, 48, 48, 48, 48, 48, 47, 48, 48, 48, 48, 48, 48, 48, 48, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 46, 47, 47, 47, 48, 48, 48, 48,48, 46, 47, 47, 47, 47, 48, 48, 48, 48, 46, 47, 47, 47, 47, 47, 47, 48, 48, 46, 47, 47, 47, 47, 47, 47, 47, 46, 47, 47, 47, 47, 47, 47, 46, 46, 47, 47, 47, 47, 46, 46, 47, 49, 49, 49, 49, 49, 49, 49, 49, 50, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 49, 49, 49, 49, 49, 49, 49, 51, 50, 50, 50, 49, 49, 49, 49, 49, 51, 50, 50, 50, 50, 49, 49, 49, 49, 51, 50, 50, 50, 50, 50, 50, 49, 49, 51, 50, 50, 50, 50, 50, 50, 50, 51, 50, 50, 50, 50, 50, 50, 51, 51, 50, 50, 50, 50, 51, 51, 50, 53, 53, 53, 53, 53, 53, 53, 53, 52, 52, 52, 53, 53, 53, 53, 53, 53, 51, 52, 52, 52, 52, 52, 52, 53, 53, 53, 51, 51, 52, 52, 52, 52, 52, 52, 52, 51, 51, 51, 52, 52, 52, 52, 52, 52, 51, 51, 51, 52, 52, 52, 52, 52, 52,51, 51, 51, 51, 52, 52, 52, 52, 51, 51, 51, 51, 52, 52, 52, 51, 51, 51, 51, 51, 52, 51, 51, 51, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54,53, 53, 53, 53, 53, 53, 46, 54, 54, 54, 54, 54, 54, 53, 53, 53, 46, 46, 54, 54, 54, 54, 54, 54, 54, 46, 46, 46, 54, 54, 54, 54, 54, 54, 46, 46, 46, 54, 54, 54, 54, 54, 54, 46, 46, 46, 46, 54, 54, 54, 54, 46, 46, 46, 46, 54, 54, 54, 46, 46, 46, 46, 46, 54, 46, 46, 46 };
00196
00197
00198
00199 int indexSCneg[nSC] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72, 73,74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 308, 309, 310, 311, 312, 313, 314, 315, 316 };
00200
00201 int indexDCCneg[nSC] = { 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2, 3, 3, 3, 3, 3, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 2, 2, 2, 2, 2, 2, 3, 3, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 2, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 6, 5, 5, 5, 4, 4, 4, 4, 4, 6, 5, 5, 5, 5, 4, 4, 4, 4, 6, 5, 5, 5, 5, 5, 5, 4, 4, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 5, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 6, 6, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 7, 7, 7, 7, 7, 7, 6, 6, 6, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 7, 7, 7, 7, 6, 6, 6, 6, 7, 7, 7, 6, 6, 6, 6, 6,7, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 8, 8, 8, 8, 8, 8, 1, 9, 9, 9, 9, 9, 9, 8, 8, 8, 1, 1, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 9, 9, 9, 9, 1, 1, 1, 1, 9, 9, 9, 1, 1, 1, 1, 1, 9, 1, 1, 1 };
00202
00203 int numDCC[nEELM] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 46, 47, 48, 49, 50, 51, 52, 53, 54 };
00204 int numLM[nEELM] = { 73, 74, 75, 76, 77, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 89, 90, 92 };
00205
00206 int tempdcc = 0;
00207
00208
00209 if (iZ>0) {
00210 for (int i=0; i<nSC; i++) {
00211 if (indexSCpos[i]==iSC) {
00212 tempdcc = indexDCCpos[i];
00213 break;
00214 }
00215 }
00216 } else {
00217 for (int i=0; i<nSC; i++) {
00218 if (indexSCneg[i]==iSC) {
00219 tempdcc = indexDCCneg[i];
00220 break;
00221 }
00222 }
00223 }
00224
00225
00226 for (int j=0; j<nEELM; j++) {
00227 if (tempdcc==numDCC[j]) {
00228 iLM = numLM[j];
00229 break;
00230 }
00231 }
00232
00233
00234 if (tempdcc==53&&iX>50) {
00235 iLM++;
00236 } else if (tempdcc==8&&iX>50) {
00237 iLM++;
00238 }
00239
00240
00241
00242
00243
00244 } else {
00245 edm::LogError("EcalLaserDbService") << " getLMNumber: DetId is not in ECAL." << endl;
00246
00247 }
00248
00249 return iLM;
00250
00251 }
00252
00253
00254 EVENTSETUP_DATA_REG(EcalLaserDbService);