CMS 3D CMS Logo

HcalText2DetIdConverter.cc
Go to the documentation of this file.
1 
4 #include <cstdlib>
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  setField (1, triggerId.ieta());
98  setField (2, triggerId.iphi());
99  setField (3, triggerId.version()*10 + triggerId.depth());
100 /*
101  if (triggerId.version() == 0) {
102  setField (1, triggerId.ieta());
103  setField (2, triggerId.iphi());
104  setField (3, 1);
105  } else if (triggerId.version() == 1) {
106  setField (1, triggerId.ieta());
107  setField (2, triggerId.iphi());
108  setField (3, 10); // We use the tens digit to indicate version
109  } else {
110  // Unknown version
111  }
112 */
113  }
114  }
115  else if (genId.isHcalZDCDetId ()) {
116  HcalZDCDetId zdcId (mId);
117  switch (zdcId.section()) {
118  case HcalZDCDetId::EM: flavorName = "ZDC_EM"; break;
119  case HcalZDCDetId::HAD: flavorName = "ZDC_HAD"; break;
120  case HcalZDCDetId::LUM: flavorName = "ZDC_LUM"; break;
121  case HcalZDCDetId::RPD: flavorName = "ZDC_RPD"; break;
122  default: result = false;
123  }
124  setField (1, zdcId.zside());
125  setField (2, zdcId.channel());
126  setField (3, -99);
127  }
128  else if (genId.isHcalCalibDetId ()) {
129  HcalCalibDetId calibId (mId);
131  switch (calibId.hcalSubdet()) {
132  case HcalBarrel: flavorName = "CALIB_HB"; break;
133  case HcalEndcap: flavorName = "CALIB_HE"; break;
134  case HcalOuter: flavorName = "CALIB_HO"; break;
135  case HcalForward: flavorName = "CALIB_HF"; break;
136  default: result = false;
137  }
138  setField (1, calibId.ieta());
139  setField (2, calibId.iphi());
140  setField (3, calibId.cboxChannel() );
141  } else if (calibId.calibFlavor()==HcalCalibDetId::HOCrosstalk) {
142  flavorName="HOX";
143  setField (1, calibId.ieta());
144  setField (2, calibId.iphi());
145  setField (3, -999);
146  } else if (calibId.calibFlavor()==HcalCalibDetId::uMNqie) {
147  flavorName="UMNQIE";
148  setField (1, calibId.channel());
149  setField (2, -999);
150  setField (3, -999);
151  } else if (calibId.calibFlavor()==HcalCalibDetId::LASERMON) {
152  flavorName="LASMON";
153  setField (1, calibId.ieta());
154  setField (2, calibId.iphi());
155  setField (3, calibId.cboxChannel() );
156  } else if (calibId.calibFlavor()==HcalCalibDetId::CastorRadFacility) {
157  flavorName="CRF";
158  setField (1, calibId.rm());
159  setField (2, calibId.fiber());
160  setField (3, calibId.channel());
161  } else if ( calibId.calibFlavor()==HcalCalibDetId::HBX) {
162  flavorName="HBX";
163  setField (1, calibId.ieta());
164  setField (2, calibId.iphi());
165  setField (3, -999);
166  } else if ( calibId.calibFlavor()==HcalCalibDetId::HEX) {
167  flavorName="HEX";
168  setField (1, calibId.ieta());
169  setField (2, calibId.iphi());
170  setField (3, -999);
171  }
172  }
173  else {
174  flavorName = "UNKNOWN_FLAVOR";
175  std::cerr << "HcalText2DetIdConverter::init-> Unknown detId: " << std::hex << std::showbase << mId.rawId() << std::endl;
176  result = false;
177  }
178  return result;
179 }
180 
181 
182 bool HcalText2DetIdConverter::init (const std::string& fFlavor, const std::string& fField1,
183  const std::string& fField2, const std::string& fField3) {
184  bool result = true;
185  flavorName = strip (fFlavor);
186  field1 = strip (fField1);
187  field2 = strip (fField2);
188  field3 = strip (fField3);
189  if (flavorName == "HB" ||
190  flavorName == "HE" ||
191  flavorName == "HF" ||
192  flavorName == "HO") {
193  HcalSubdetector sub = flavorName == "HB" ? HcalBarrel :
194  flavorName == "HE" ? HcalEndcap :
195  flavorName == "HO" ? HcalOuter :
196  HcalForward;
197  mId = HcalDetId (sub, getField (1), getField (2), getField (3));
198  }
199  else if (flavorName == "HT") {
200  // We use the depth to signal the "version" being used (RCT or 1x1 HF). RCT
201  // has a 0 in the 10s digit, whereas 1x1 has a 1. The ones digit is still
202  // used to indicate depth, although in the 1x1 case this must be 0, so we
203  // set it as such.
204  mId = HcalTrigTowerDetId (getField (1), getField (2), getField (3));
205 /*
206  const int depth_field = getField(3);
207  const int ones = depth_field % 10;
208  const int tens = (depth_field - ones) / 10;
209  if (tens == 0) {
210  const int depth = ones;
211  const int version = 0;
212  mId = HcalTrigTowerDetId (getField (1), getField (2), depth, version);
213  } else if (tens == 1) {
214  const int depth = 0;
215  const int version = 1;
216  mId = HcalTrigTowerDetId(getField(1), getField(2), depth, version);
217  } else {
218  // Undefined version!
219  }
220 */
221  }
222  else if (flavorName.find ("ZDC_") == 0) {
224  if(flavorName == "ZDC_EM") section = HcalZDCDetId::EM;
225  else if(flavorName == "ZDC_HAD") section = HcalZDCDetId::HAD;
226  else if(flavorName == "ZDC_LUM") section = HcalZDCDetId::LUM;
227  else if(flavorName == "ZDC_RPD") section = HcalZDCDetId::RPD;
228  mId = HcalZDCDetId (section, getField (1)>0, getField (2));
229  }
230  else if (flavorName.find ("CALIB_") == 0) {
232  if (flavorName.find("HB")!=std::string::npos) sd=HcalBarrel;
233  else if (flavorName.find("HE")!=std::string::npos) sd=HcalEndcap;
234  else if (flavorName.find("HO")!=std::string::npos) sd=HcalOuter;
235  else if (flavorName.find("HF")!=std::string::npos) sd=HcalForward;
236 
237  int ieta=getField(1);
238  int iphi=getField(2);
239  int channel = calibChannel (field3);
240  mId = HcalCalibDetId (sd, ieta,iphi,channel);
241  }
242  else if (flavorName=="HOX" || flavorName=="HBX" || flavorName=="HEX") {
243  int ieta=getField(1);
244  int iphi=getField(2);
245  mId = (flavorName=="HOX")?
247  ((flavorName=="HBX")?(HcalCalibDetId(HcalCalibDetId::HBX,ieta,iphi)):
249  );
250  }
251  else if (flavorName=="UMNQIE") {
252  int channel=getField(1);
254  }
255  else if (flavorName == "LASMON" ) {
256  int ieta = getField(1);
257  int iphi = getField(2);
258  int channel = getField(3);
259  mId = HcalCalibDetId (HcalCalibDetId::LASERMON, ieta, iphi, channel);
260  }
261  else if (flavorName=="CRF") {
262  int rm=getField(1);
263  int fiber=getField(2);
264  int channel=getField(3);
266  }
267  else if (flavorName == "NA") {
269  }
270  else {
271  std::cerr << "HcalText2DetIdConverter::init-> Unknown HcalDetId flavor: " << flavorName << std::endl;
272  result = false;
273  }
274  return result;
275 }
276 
277 
279  char* endptr;
280  const char* nptr = i == 1 ? field1.c_str() :
281  i == 2 ? field2.c_str() : field3.c_str();
282  long result = strtol (nptr, &endptr, 0);
283  if (*nptr != '\0' && *endptr == '\0') {
284  return result;
285  }
286  if (i == 2 && isHcalCalibDetId ()) {
287  int result = calibChannel (field2);
288  if (i) return result;
289  }
290  if (*nptr != '\0') {
291  std::cerr << "HcalText2DetIdConverter::getField-> Can not convert string "<< nptr << " to int. Bad symbol: " << *endptr << std::endl;
292  }
293  return 0;
294  }
295 
296 void HcalText2DetIdConverter::setField (int i, int fValue) {
297  char buffer [128];
298  sprintf (buffer, "%d", fValue);
299  if (i == 1) field1 = buffer;
300  else if (i == 2) field2 = buffer;
301  else field3 = buffer;
302 }
303 
305  return flavorName + " " + field1 + " " + field2 + " " + field3;
306 }
static const HcalDetId Undefined
Definition: HcalDetId.h:272
int rm() const
get the rm (where relevant)
bool isHcalZDCDetId() const
int fiber() const
get the fiber (where relevant)
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:39
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:50
int ieta() const
get the tower ieta
int ieta() const
int depth() const
get the depth (zero for LHC Run 1, may be nonzero for later runs)
int depth() const
get the tower depth
Definition: HcalDetId.h:166
bool isHcalTrigTowerDetId() const
void setField(int i, int fValue)
int ieta() const
get the cell ieta
Definition: HcalDetId.h:159
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")
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:161
Definition: init.py:1
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.cc:62
static const HcalTrigTowerDetId Undefined
Section section() const
get the section
Definition: HcalZDCDetId.cc:47
int cboxChannel() const
get the calibration box channel (if relevant)
bool isHcalCalibDetId() const
HcalSubdetector hcalSubdet() const
get the HcalSubdetector (if relevant)
HcalGenericSubdetector genericSubdet() const
rm
Definition: submit.py:77
int channel() const
get the channel (for uMNio/qie or similar)
int iphi() const
get the tower iphi