00001
00005 #include <stdlib.h>
00006 #include <iostream>
00007 #include <iomanip>
00008
00009 #include "FWCore/Utilities/interface/Exception.h"
00010
00011 #include "DataFormats/HcalDetId/interface/HcalGenericDetId.h"
00012 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
00013 #include "DataFormats/HcalDetId/interface/HcalCalibDetId.h"
00014 #include "DataFormats/HcalDetId/interface/HcalTrigTowerDetId.h"
00015 #include "DataFormats/HcalDetId/interface/HcalZDCDetId.h"
00016
00017 #include "CalibFormats/HcalObjects/interface/HcalText2DetIdConverter.h"
00018
00019 namespace {
00020 std::string strip (const std::string& fString) {
00021 if (fString.empty ()) return fString;
00022 int startIndex = fString.find_first_not_of(" \t\n");
00023 int endIndex = fString.find_last_not_of(" \t\n");
00024 return fString.substr(startIndex, (endIndex-startIndex)+1);
00025 }
00026
00027 int calibChannel (const std::string& fName) {
00028 return
00029 fName == "Mixer-High" ? 1 :
00030 fName == "Mixer-Low" ? 2 :
00031 fName == "Megatile" ? 3 :
00032 fName == "Mixer-Scintillator" ? 4 :
00033 fName == "RadDam1" ? 5 :
00034 fName == "RadDam2" ? 6 :
00035 fName == "RadDam3" ? 7 :
00036 atoi(fName.c_str());
00037
00038 }
00039 }
00040
00041 HcalText2DetIdConverter::HcalText2DetIdConverter (const std::string& fFlavor, const std::string& fField1,
00042 const std::string& fField2, const std::string& fField3) {
00043 if (!init (fFlavor, fField1, fField2, fField3)) {
00044 std::cerr << "HcalText2DetIdConverter::HcalText2DetIdConverter-> Can not initiate detId from items: "
00045 << fFlavor << '/' << fField1 << '/' << fField2 << '/' << fField3 << std::endl;
00046 throw cms::Exception("HcalGenDetId initialization error")
00047 << " Can not initiate detId from items: "
00048 << fFlavor << '/' << fField1 << '/' << fField2 << '/' << fField3 << std::endl;
00049 }
00050 }
00051
00052 HcalText2DetIdConverter::HcalText2DetIdConverter (DetId fId) {
00053 init (fId);
00054 }
00055
00056 bool HcalText2DetIdConverter::isHcalDetId () const {
00057 return HcalGenericDetId (mId).isHcalDetId ();
00058 }
00059
00060 bool HcalText2DetIdConverter::isHcalCalibDetId () const {
00061 return HcalGenericDetId (mId).isHcalCalibDetId ();
00062 }
00063
00064 bool HcalText2DetIdConverter::isHcalTrigTowerDetId () const {
00065 return HcalGenericDetId (mId).isHcalTrigTowerDetId ();
00066 }
00067
00068 bool HcalText2DetIdConverter::isHcalZDCDetId () const {
00069 return HcalGenericDetId (mId).isHcalZDCDetId ();
00070 }
00071
00072 bool HcalText2DetIdConverter::init (DetId fId) {
00073 bool result = true;
00074 flavorName = "UNKNOWN";
00075 mId = fId;
00076 HcalGenericDetId genId (mId);
00077 if (fId == HcalDetId::Undefined) {
00078 flavorName = "NA";
00079 }
00080 else if (genId.isHcalDetId ()) {
00081 HcalDetId hcalId (mId);
00082 flavorName = genId.genericSubdet () == HcalGenericDetId::HcalGenBarrel ? "HB" :
00083 genId.genericSubdet () == HcalGenericDetId::HcalGenEndcap ? "HE" :
00084 genId.genericSubdet () == HcalGenericDetId::HcalGenOuter ? "HO" :
00085 genId.genericSubdet () == HcalGenericDetId::HcalGenForward ? "HF" : "H_UNKNOWN";
00086 setField (1, hcalId.ieta());
00087 setField (2, hcalId.iphi());
00088 setField (3, hcalId.depth());
00089 }
00090 else if (genId.isHcalTrigTowerDetId ()) {
00091 HcalTrigTowerDetId triggerId (mId);
00092 if (triggerId == HcalTrigTowerDetId::Undefined) {
00093 flavorName = "NT";
00094 }
00095 else {
00096 flavorName = "HT";
00097 setField (1, triggerId.ieta());
00098 setField (2, triggerId.iphi());
00099 setField (3, 1);
00100 }
00101 }
00102 else if (genId.isHcalZDCDetId ()) {
00103 HcalZDCDetId zdcId (mId);
00104 switch (zdcId.section()) {
00105 case HcalZDCDetId::EM: flavorName = "ZDC_EM"; break;
00106 case HcalZDCDetId::HAD: flavorName = "ZDC_HAD"; break;
00107 case HcalZDCDetId::LUM: flavorName = "ZDC_LUM"; break;
00108 default: result = false;
00109 }
00110 setField (1, zdcId.zside());
00111 setField (2, zdcId.channel());
00112 setField (3, -99);
00113 }
00114 else if (genId.isHcalCalibDetId ()) {
00115 HcalCalibDetId calibId (mId);
00116 if (calibId.calibFlavor()==HcalCalibDetId::CalibrationBox) {
00117 switch (calibId.hcalSubdet()) {
00118 case HcalBarrel: flavorName = "CALIB_HB"; break;
00119 case HcalEndcap: flavorName = "CALIB_HE"; break;
00120 case HcalOuter: flavorName = "CALIB_HO"; break;
00121 case HcalForward: flavorName = "CALIB_HF"; break;
00122 default: result = false;
00123 }
00124 setField (1, calibId.ieta());
00125 setField (2, calibId.iphi());
00126 setField (3, calibId.cboxChannel() );
00127 } else if (calibId.calibFlavor()==HcalCalibDetId::HOCrosstalk) {
00128 flavorName="HOX";
00129 setField (1, calibId.ieta());
00130 setField (2, calibId.iphi());
00131 setField (3, -999);
00132 }
00133 }
00134 else {
00135 flavorName = "UNKNOWN_FLAVOR";
00136 std::cerr << "HcalText2DetIdConverter::init-> Unknown detId: " << std::hex << std::showbase << mId.rawId() << std::endl;
00137 result = false;
00138 }
00139 return result;
00140 }
00141
00142
00143 bool HcalText2DetIdConverter::init (const std::string& fFlavor, const std::string& fField1,
00144 const std::string& fField2, const std::string& fField3) {
00145 bool result = true;
00146 flavorName = strip (fFlavor);
00147 field1 = strip (fField1);
00148 field2 = strip (fField2);
00149 field3 = strip (fField3);
00150 if (flavorName == "HB" ||
00151 flavorName == "HE" ||
00152 flavorName == "HF" ||
00153 flavorName == "HO") {
00154 HcalSubdetector sub = flavorName == "HB" ? HcalBarrel :
00155 flavorName == "HE" ? HcalEndcap :
00156 flavorName == "HO" ? HcalOuter :
00157 HcalForward;
00158 mId = HcalDetId (sub, getField (1), getField (2), getField (3));
00159 }
00160 else if (flavorName == "HT") {
00161 mId = HcalTrigTowerDetId (getField (1), getField (2));
00162 }
00163 else if (flavorName.find ("ZDC_") == 0) {
00164 HcalZDCDetId::Section section = flavorName == "ZDC_EM" ? HcalZDCDetId::EM :
00165 flavorName == "ZDC_HAD" ? HcalZDCDetId::HAD :
00166 flavorName == "ZDC_LUM" ? HcalZDCDetId::LUM : HcalZDCDetId::Unknown;
00167 mId = HcalZDCDetId (section, getField (1)>0, getField (2));
00168 }
00169 else if (flavorName.find ("CALIB_") == 0) {
00170 HcalSubdetector sd = HcalOther;
00171 if (flavorName.find("HB")!=std::string::npos) sd=HcalBarrel;
00172 else if (flavorName.find("HE")!=std::string::npos) sd=HcalEndcap;
00173 else if (flavorName.find("HO")!=std::string::npos) sd=HcalOuter;
00174 else if (flavorName.find("HF")!=std::string::npos) sd=HcalForward;
00175
00176 int ieta=getField(1);
00177 int iphi=getField(2);
00178 int channel = calibChannel (field3);
00179 mId = HcalCalibDetId (sd, ieta,iphi,channel);
00180 }
00181 else if (flavorName=="HOX") {
00182 int ieta=getField(1);
00183 int iphi=getField(2);
00184 mId = HcalCalibDetId (ieta,iphi);
00185 }
00186 else if (flavorName == "NA") {
00187 mId = HcalDetId::Undefined;
00188 }
00189 else {
00190 std::cerr << "HcalText2DetIdConverter::init-> Unknown HcalDetId flavor: " << flavorName << std::endl;
00191 result = false;
00192 }
00193 return result;
00194 }
00195
00196
00197 int HcalText2DetIdConverter::getField (int i) const{
00198 char* endptr;
00199 const char* nptr = i == 1 ? field1.c_str() :
00200 i == 2 ? field2.c_str() : field3.c_str();
00201 long result = strtol (nptr, &endptr, 0);
00202 if (*nptr != '\0' && *endptr == '\0') {
00203 return result;
00204 }
00205 if (i == 2 && isHcalCalibDetId ()) {
00206 int result = calibChannel (field2);
00207 if (i) return result;
00208 }
00209 if (*nptr != '\0') {
00210 std::cerr << "HcalText2DetIdConverter::getField-> Can not convert string "<< nptr << " to int. Bad symbol: " << *endptr << std::endl;
00211 }
00212 return 0;
00213 }
00214
00215 void HcalText2DetIdConverter::setField (int i, int fValue) {
00216 char buffer [128];
00217 sprintf (buffer, "%d", fValue);
00218 if (i == 1) field1 = buffer;
00219 else if (i == 2) field2 = buffer;
00220 else field3 = buffer;
00221 }
00222
00223 std::string HcalText2DetIdConverter::toString () const {
00224 return flavorName + " " + field1 + " " + field2 + " " + field3;
00225 }