00001 #include "DQM/SiStripMonitorClient/interface/SiStripUtility.h"
00002 #include "DQMServices/Core/interface/MonitorElement.h"
00003 #include "DQMServices/Core/interface/DQMStore.h"
00004
00005 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
00006 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
00007 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00008
00009
00010
00011 int SiStripUtility::getMEList(std::string name, std::vector<std::string>& values) {
00012 values.clear();
00013 std::string prefix_str = name.substr(0,(name.find(":")));
00014 prefix_str += "/";
00015 std::string temp_str = name.substr(name.find(":")+1);
00016 split(temp_str, values, ",");
00017 for (std::vector<std::string>::iterator it = values.begin();
00018 it != values.end(); it++) (*it).insert(0,prefix_str);
00019 return values.size();
00020 }
00021
00022
00023
00024 int SiStripUtility::getMEList(std::string name, std::string& dir_path, std::vector<std::string>& values) {
00025 values.clear();
00026 dir_path = name.substr(0,(name.find(":")));
00027 dir_path += "/";
00028 std::string temp_str = name.substr(name.find(":")+1);
00029 split(temp_str, values, ",");
00030 return values.size();
00031 }
00032
00033
00034 bool SiStripUtility::checkME(std::string name, std::string me_name, std::string& full_path) {
00035 if (name.find(name) == std::string::npos) return false;
00036 std::string prefix_str = name.substr(0,(name.find(":")));
00037 prefix_str += "/";
00038 std::string temp_str = name.substr(name.find(":")+1);
00039 std::vector<std::string> values;
00040 split(temp_str, values, ",");
00041 for (std::vector<std::string>::iterator it = values.begin();
00042 it != values.end(); it++) {
00043 if ((*it).find(me_name) != std::string::npos) {
00044 full_path = prefix_str + (*it);
00045 return true;
00046 }
00047 }
00048 return false;
00049 }
00050
00051
00052
00053
00054 void SiStripUtility::split(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters) {
00055
00056 std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
00057
00058
00059 std::string::size_type pos = str.find_first_of(delimiters, lastPos);
00060
00061 while (std::string::npos != pos || std::string::npos != lastPos) {
00062
00063 tokens.push_back(str.substr(lastPos, pos - lastPos));
00064
00065
00066 lastPos = str.find_first_not_of(delimiters, pos);
00067
00068
00069 pos = str.find_first_of(delimiters, lastPos);
00070 }
00071 }
00072
00073
00074
00075 void SiStripUtility::getMEStatusColor(int status, int& rval, int&gval, int& bval) {
00076 if (status == dqm::qstatus::STATUS_OK) {
00077 rval = 0; gval = 255; bval = 0;
00078 } else if (status == dqm::qstatus::WARNING) {
00079 rval = 255; gval = 255; bval = 0;
00080 } else if (status == dqm::qstatus::ERROR) {
00081 rval = 255; gval = 0; bval = 0;
00082 } else if (status == dqm::qstatus::OTHER) {
00083 rval = 255; gval = 150; bval = 0;
00084 } else {
00085 rval = 0; gval = 0; bval = 255;
00086 }
00087 }
00088
00089
00090
00091 void SiStripUtility::getMEStatusColor(int status, int& icol, std::string& tag) {
00092 if (status == dqm::qstatus::STATUS_OK) {
00093 tag = "Ok";
00094 icol = 3;
00095 } else if (status == dqm::qstatus::WARNING) {
00096 tag = "Warning";
00097 icol = 5;
00098 } else if (status == dqm::qstatus::ERROR) {
00099 tag = "Error";
00100 icol = 2;
00101 } else if (status == dqm::qstatus::OTHER) {
00102 tag = "Other";
00103 icol = 1;
00104 } else {
00105 tag = " ";
00106 icol = 1;
00107 }
00108 }
00109
00110
00111
00112 void SiStripUtility::getDetectorStatusColor(int status, int& rval, int&gval, int& bval) {
00113
00114 if (status == 0) {
00115 rval = 0; gval = 255;bval = 0;
00116 return;
00117 }
00118
00119 if (((status >> 0) & 0x1) > 0) {
00120 rval = 150; gval = 0; bval = 0;
00121 return;
00122 }
00123
00124 if (((status >> 3) & 0x1) > 0) {
00125 rval = 100; gval = 100; bval = 255;
00126 return;
00127 }
00128
00129 if (((status >> 4) & 0x1) > 0) {
00130 rval = 200; gval = 20; bval = 255;
00131 return;
00132 }
00133
00134 if (((status >> 1) & 0x1) > 0) {
00135 rval = 255; bval = 0;
00136 if (((status >> 2) & 0x1) > 0) gval = 0;
00137 else gval = 100;
00138 } else {
00139 rval = 251; gval = 0; bval = 100;
00140 }
00141 }
00142
00143
00144
00145
00146 int SiStripUtility::getMEStatus(MonitorElement* me) {
00147 int status = 0;
00148 if (me->getQReports().size() == 0) {
00149 status = 0;
00150 } else if (me->hasError()) {
00151 status = dqm::qstatus::ERROR;
00152 } else if (me->hasWarning()) {
00153 status = dqm::qstatus::WARNING;
00154 } else if (me->hasOtherReport()) {
00155 status = dqm::qstatus::OTHER;
00156 } else {
00157 status = dqm::qstatus::STATUS_OK;
00158 }
00159 return status;
00160 }
00161
00162
00163
00164 void SiStripUtility::getModuleFolderList(DQMStore * dqm_store, std::vector<std::string>& mfolders){
00165 std::string currDir = dqm_store->pwd();
00166 if (currDir.find("module_") != std::string::npos) {
00167
00168 mfolders.push_back(currDir);
00169 } else {
00170 std::vector<std::string> subdirs = dqm_store->getSubdirs();
00171 for (std::vector<std::string>::const_iterator it = subdirs.begin();
00172 it != subdirs.end(); it++) {
00173 dqm_store->cd(*it);
00174 getModuleFolderList(dqm_store, mfolders);
00175 dqm_store->goUp();
00176 }
00177 }
00178 }
00179
00180
00181
00182 int SiStripUtility::getMEStatus(MonitorElement* me, int& bad_channels) {
00183 int status = 0;
00184 if (me->getQReports().size() == 0) {
00185 status = 0;
00186 bad_channels = -1;
00187 } else {
00188 std::vector<QReport *> qreports = me->getQReports();
00189 bad_channels =qreports[0]->getBadChannels().size();
00190 if (me->hasError()) {
00191 status = dqm::qstatus::ERROR;
00192 } else if (me->hasWarning()) {
00193 status = dqm::qstatus::WARNING;
00194 } else if (me->hasOtherReport()) {
00195 status = dqm::qstatus::OTHER;
00196 } else {
00197 status = dqm::qstatus::STATUS_OK;
00198 }
00199 }
00200 return status;
00201 }
00202
00203
00204
00205 void SiStripUtility::getMEValue(MonitorElement* me, std::string & val){
00206 val = "";
00207 if ( me && ( me->kind()==MonitorElement::DQM_KIND_REAL || me->kind()==MonitorElement::DQM_KIND_INT ) ) {
00208 val = me->valueString();
00209 val = val.substr(val.find("=")+1);
00210 }
00211 }
00212
00213
00214
00215 bool SiStripUtility::goToDir(DQMStore * dqm_store, std::string name) {
00216 std::string currDir = dqm_store->pwd();
00217 std::string dirName = currDir.substr(currDir.find_last_of("/")+1);
00218 if (dirName.find(name) == 0) {
00219 return true;
00220 }
00221 std::vector<std::string> subDirVec = dqm_store->getSubdirs();
00222 for (std::vector<std::string>::const_iterator ic = subDirVec.begin();
00223 ic != subDirVec.end(); ic++) {
00224 std::string fname = (*ic);
00225 if (
00226 (fname.find("Reference") != std::string::npos) ||
00227 (fname.find("AlCaReco") != std::string::npos) ||
00228 (fname.find("HLT") != std::string::npos)
00229 ) continue;
00230 dqm_store->cd(fname);
00231 if (!goToDir(dqm_store, name)) dqm_store->goUp();
00232 else return true;
00233 }
00234 return false;
00235 }
00236
00237
00238
00239 void SiStripUtility::getSubDetectorTag(uint32_t det_id, std::string& subdet_tag, const TrackerTopology* tTopo) {
00240 StripSubdetector subdet(det_id);
00241 subdet_tag = "";
00242 switch (subdet.subdetId())
00243 {
00244 case StripSubdetector::TIB:
00245 {
00246 subdet_tag = "TIB";
00247 break;
00248 }
00249 case StripSubdetector::TID:
00250 {
00251
00252 if (tTopo->tidSide(det_id) == 2) {
00253 subdet_tag = "TIDF";
00254 } else if (tTopo->tidSide(det_id) == 1) {
00255 subdet_tag = "TIDB";
00256 }
00257 break;
00258 }
00259 case StripSubdetector::TOB:
00260 {
00261 subdet_tag = "TOB";
00262 break;
00263 }
00264 case StripSubdetector::TEC:
00265 {
00266
00267 if (tTopo->tecSide(det_id) == 2) {
00268 subdet_tag = "TECF";
00269 } else if (tTopo->tecSide(det_id) == 1) {
00270 subdet_tag = "TECB";
00271 }
00272 break;
00273 }
00274 }
00275 }
00276
00277
00278
00279 void SiStripUtility::setBadModuleFlag(std::string & hname, uint16_t& flg){
00280
00281 if (hname.find("FractionOfBadChannels") != std::string::npos) flg |= (1<<0);
00282 else if (hname.find("NumberOfDigi") != std::string::npos) flg |= (1<<1);
00283 else if (hname.find("NumberOfCluster") != std::string::npos) flg |= (1<<2);
00284 else if (hname.find("ExcludedFedChannel") != std::string::npos) flg |= (1<<3);
00285 else if (hname.find("DCSError") != std::string::npos) flg |= (1<<4);
00286 }
00287
00288
00289
00290 void SiStripUtility::getBadModuleStatus(uint16_t flag, std::string & message){
00291 if (flag == 0) message += " No Error";
00292 else {
00293
00294 if (((flag >> 0) & 0x1) > 0) message += " Fed BadChannel : ";
00295 if (((flag >> 1) & 0x1) > 0) message += " # of Digi : ";
00296 if (((flag >> 2) & 0x1) > 0) message += " # of Clusters :";
00297 if (((flag >> 3) & 0x1) > 0) message += " Excluded FED Channel ";
00298 if (((flag >> 4) & 0x1) > 0) message += " DCSError ";
00299 }
00300 }
00301
00302
00303
00304 void SiStripUtility::getTopFolderPath(DQMStore * dqm_store, std::string type, std::string& path) {
00305 if (type != "SiStrip" && type != "Tracking") return;
00306 path = "";
00307 dqm_store->cd();
00308 if (type == "SiStrip") {
00309 if (dqm_store->dirExists(type)) {
00310 dqm_store->cd(type);
00311 path = dqm_store->pwd();
00312 } else {
00313 if (SiStripUtility::goToDir(dqm_store, type)) {
00314 std::string mdir = "MechanicalView";
00315 if (SiStripUtility::goToDir(dqm_store, mdir)) {
00316 path = dqm_store->pwd();
00317 path = path.substr(0, path.find(mdir)-1);
00318 }
00319 }
00320 }
00321 } else if (type == "Tracking") {
00322 std::string top_dir = "Tracking";
00323 if (dqm_store->dirExists(top_dir)) {
00324 dqm_store->cd(top_dir);
00325 path = dqm_store->pwd();
00326 } else {
00327 if (SiStripUtility::goToDir(dqm_store, top_dir)) {
00328 std::string tdir = "TrackParameters";
00329 if (SiStripUtility::goToDir(dqm_store, tdir)) {
00330 path = dqm_store->pwd();
00331 path = path.substr(0, path.find(tdir)-1);
00332 }
00333 }
00334 }
00335 }
00336 }