CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HcalText2DetIdConverter.cc
Go to the documentation of this file.
1 
4 #include <stdlib.h>
5 #include <iostream>
6 #include <iomanip>
7 #include <cstdio>
8 
10 
16 
18 
19 namespace {
20  std::string strip (const std::string& fString) {
21  if (fString.empty ()) return fString;
22  int startIndex = fString.find_first_not_of(" \t\n");
23  int endIndex = fString.find_last_not_of(" \t\n");
24  return fString.substr(startIndex, (endIndex-startIndex)+1);
25  }
26 
27  int calibChannel (const std::string& fName) {
28  return
29  fName == "Mixer-High" ? 1 :
30  fName == "Mixer-Low" ? 2 :
31  fName == "Megatile" ? 3 :
32  fName == "Mixer-Scintillator" ? 4 :
33  fName == "RadDam1" ? 5 :
34  fName == "RadDam2" ? 6 :
35  fName == "RadDam3" ? 7 :
36  atoi(fName.c_str());
37  // 0;
38  }
39 }
40 
42  const std::string& fField2, const std::string& fField3) {
43  if (!init (fFlavor, fField1, fField2, fField3)) {
44  std::cerr << "HcalText2DetIdConverter::HcalText2DetIdConverter-> Can not initiate detId from items: "
45  << fFlavor << '/' << fField1 << '/' << fField2 << '/' << fField3 << std::endl;
46  throw cms::Exception("HcalGenDetId initialization error")
47  << " Can not initiate detId from items: "
48  << fFlavor << '/' << fField1 << '/' << fField2 << '/' << fField3 << std::endl;
49  }
50 }
51 
53  init (fId);
54 }
55 
57  return HcalGenericDetId (mId).isHcalDetId ();
58 }
59 
62 }
63 
66 }
67 
70 }
71 
73  bool result = true;
74  flavorName = "UNKNOWN";
75  mId = fId;
76  HcalGenericDetId genId (mId);
77  if (fId == HcalDetId::Undefined) {
78  flavorName = "NA";
79  }
80  else if (genId.isHcalDetId ()) {
81  HcalDetId hcalId (mId);
85  genId.genericSubdet () == HcalGenericDetId::HcalGenForward ? "HF" : "H_UNKNOWN";
86  setField (1, hcalId.ieta());
87  setField (2, hcalId.iphi());
88  setField (3, hcalId.depth());
89  }
90  else if (genId.isHcalTrigTowerDetId ()) {
91  HcalTrigTowerDetId triggerId (mId);
92  if (triggerId == HcalTrigTowerDetId::Undefined) {
93  flavorName = "NT";
94  }
95  else {
96  flavorName = "HT";
97  if (triggerId.version() == 0) {
98  setField (1, triggerId.ieta());
99  setField (2, triggerId.iphi());
100  setField (3, 1);
101  } else if (triggerId.version() == 1) {
102  setField (1, triggerId.ieta());
103  setField (2, triggerId.iphi());
104  setField (3, 10); // We use the tens digit to indicate version
105  } else {
106  // Unknown version
107  }
108  }
109  }
110  else if (genId.isHcalZDCDetId ()) {
111  HcalZDCDetId zdcId (mId);
112  switch (zdcId.section()) {
113  case HcalZDCDetId::EM: flavorName = "ZDC_EM"; break;
114  case HcalZDCDetId::HAD: flavorName = "ZDC_HAD"; break;
115  case HcalZDCDetId::LUM: flavorName = "ZDC_LUM"; break;
116  default: result = false;
117  }
118  setField (1, zdcId.zside());
119  setField (2, zdcId.channel());
120  setField (3, -99);
121  }
122  else if (genId.isHcalCalibDetId ()) {
123  HcalCalibDetId calibId (mId);
125  switch (calibId.hcalSubdet()) {
126  case HcalBarrel: flavorName = "CALIB_HB"; break;
127  case HcalEndcap: flavorName = "CALIB_HE"; break;
128  case HcalOuter: flavorName = "CALIB_HO"; break;
129  case HcalForward: flavorName = "CALIB_HF"; break;
130  default: result = false;
131  }
132  setField (1, calibId.ieta());
133  setField (2, calibId.iphi());
134  setField (3, calibId.cboxChannel() );
135  } else if (calibId.calibFlavor()==HcalCalibDetId::HOCrosstalk) {
136  flavorName="HOX";
137  setField (1, calibId.ieta());
138  setField (2, calibId.iphi());
139  setField (3, -999);
140  }
141  }
142  else {
143  flavorName = "UNKNOWN_FLAVOR";
144  std::cerr << "HcalText2DetIdConverter::init-> Unknown detId: " << std::hex << std::showbase << mId.rawId() << std::endl;
145  result = false;
146  }
147  return result;
148 }
149 
150 
151 bool HcalText2DetIdConverter::init (const std::string& fFlavor, const std::string& fField1,
152  const std::string& fField2, const std::string& fField3) {
153  bool result = true;
154  flavorName = strip (fFlavor);
155  field1 = strip (fField1);
156  field2 = strip (fField2);
157  field3 = strip (fField3);
158  if (flavorName == "HB" ||
159  flavorName == "HE" ||
160  flavorName == "HF" ||
161  flavorName == "HO") {
162  HcalSubdetector sub = flavorName == "HB" ? HcalBarrel :
163  flavorName == "HE" ? HcalEndcap :
164  flavorName == "HO" ? HcalOuter :
165  HcalForward;
166  mId = HcalDetId (sub, getField (1), getField (2), getField (3));
167  }
168  else if (flavorName == "HT") {
169  // We use the depth to signal the "version" being used (RCT or 1x1 HF). RCT
170  // has a 0 in the 10s digit, whereas 1x1 has a 1. The ones digit is still
171  // used to indicate depth, although in the 1x1 case this must be 0, so we
172  // set it as such.
173  const int depth_field = getField(3);
174  const int ones = depth_field % 10;
175  const int tens = (depth_field - ones) / 10;
176  if (tens == 0) {
177  const int depth = ones;
178  const int version = 0;
179  mId = HcalTrigTowerDetId (getField (1), getField (2), depth, version);
180  } else if (tens == 1) {
181  const int depth = 0;
182  const int version = 1;
183  mId = HcalTrigTowerDetId(getField(1), getField(2), depth, version);
184  } else {
185  // Undefined version!
186  }
187  }
188  else if (flavorName.find ("ZDC_") == 0) {
189  HcalZDCDetId::Section section = flavorName == "ZDC_EM" ? HcalZDCDetId::EM :
190  flavorName == "ZDC_HAD" ? HcalZDCDetId::HAD :
192  mId = HcalZDCDetId (section, getField (1)>0, getField (2));
193  }
194  else if (flavorName.find ("CALIB_") == 0) {
196  if (flavorName.find("HB")!=std::string::npos) sd=HcalBarrel;
197  else if (flavorName.find("HE")!=std::string::npos) sd=HcalEndcap;
198  else if (flavorName.find("HO")!=std::string::npos) sd=HcalOuter;
199  else if (flavorName.find("HF")!=std::string::npos) sd=HcalForward;
200 
201  int ieta=getField(1);
202  int iphi=getField(2);
203  int channel = calibChannel (field3);
204  mId = HcalCalibDetId (sd, ieta,iphi,channel);
205  }
206  else if (flavorName=="HOX") {
207  int ieta=getField(1);
208  int iphi=getField(2);
209  mId = HcalCalibDetId (ieta,iphi);
210  }
211  else if (flavorName == "NA") {
213  }
214  else {
215  std::cerr << "HcalText2DetIdConverter::init-> Unknown HcalDetId flavor: " << flavorName << std::endl;
216  result = false;
217  }
218  return result;
219 }
220 
221 
223  char* endptr;
224  const char* nptr = i == 1 ? field1.c_str() :
225  i == 2 ? field2.c_str() : field3.c_str();
226  long result = strtol (nptr, &endptr, 0);
227  if (*nptr != '\0' && *endptr == '\0') {
228  return result;
229  }
230  if (i == 2 && isHcalCalibDetId ()) {
231  int result = calibChannel (field2);
232  if (i) return result;
233  }
234  if (*nptr != '\0') {
235  std::cerr << "HcalText2DetIdConverter::getField-> Can not convert string "<< nptr << " to int. Bad symbol: " << *endptr << std::endl;
236  }
237  return 0;
238  }
239 
240 void HcalText2DetIdConverter::setField (int i, int fValue) {
241  char buffer [128];
242  sprintf (buffer, "%d", fValue);
243  if (i == 1) field1 = buffer;
244  else if (i == 2) field2 = buffer;
245  else field3 = buffer;
246 }
247 
249  return flavorName + " " + field1 + " " + field2 + " " + field3;
250 }
static const HcalDetId Undefined
Definition: HcalDetId.h:50
int i
Definition: DBlmapReader.cc:9
bool isHcalZDCDetId() const
CalibDetType calibFlavor() const
get the flavor of this calibration detid
int zside() const
get the z-side of the cell (1/-1)
Definition: HcalZDCDetId.h:34
int ieta() const
get the tower ieta
int ieta() const
get the rbx name (if relevant)
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
int depth() const
get the tower depth
Definition: HcalDetId.h:40
bool isHcalTrigTowerDetId() const
void setField(int i, int fValue)
tuple result
Definition: query.py:137
int ieta() const
get the cell ieta
Definition: HcalDetId.h:36
HcalSubdetector
Definition: HcalAssistant.h:31
HcalText2DetIdConverter(const std::string &fFlavor="NA", const std::string &fField1="0", const std::string &fField2="0", const std::string &fField3="0")
Section section() const
get the section
Definition: HcalZDCDetId.h:36
bool isHcalDetId() const
int iphi() const
get the low-edge iphi (if relevant)
bool init(const std::string &fFlavor, const std::string &fField1, const std::string &fField2, const std::string &fField3)
int iphi() const
get the cell iphi
Definition: HcalDetId.h:38
Definition: DetId.h:18
double sd
int version() const
get the version code for the trigger tower
int channel() const
get the channel
Definition: HcalZDCDetId.h:40
static const HcalTrigTowerDetId Undefined
int cboxChannel() const
get the calibration box channel (if relevant)
bool isHcalCalibDetId() const
HcalSubdetector hcalSubdet() const
get the HcalSubdetector (if relevant)
HcalGenericSubdetector genericSubdet() const
int iphi() const
get the tower iphi