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  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  default: result = false;
122  }
123  setField (1, zdcId.zside());
124  setField (2, zdcId.channel());
125  setField (3, -99);
126  }
127  else if (genId.isHcalCalibDetId ()) {
128  HcalCalibDetId calibId (mId);
130  switch (calibId.hcalSubdet()) {
131  case HcalBarrel: flavorName = "CALIB_HB"; break;
132  case HcalEndcap: flavorName = "CALIB_HE"; break;
133  case HcalOuter: flavorName = "CALIB_HO"; break;
134  case HcalForward: flavorName = "CALIB_HF"; break;
135  default: result = false;
136  }
137  setField (1, calibId.ieta());
138  setField (2, calibId.iphi());
139  setField (3, calibId.cboxChannel() );
140  } else if (calibId.calibFlavor()==HcalCalibDetId::HOCrosstalk) {
141  flavorName="HOX";
142  setField (1, calibId.ieta());
143  setField (2, calibId.iphi());
144  setField (3, -999);
145  }
146  }
147  else {
148  flavorName = "UNKNOWN_FLAVOR";
149  std::cerr << "HcalText2DetIdConverter::init-> Unknown detId: " << std::hex << std::showbase << mId.rawId() << std::endl;
150  result = false;
151  }
152  return result;
153 }
154 
155 
156 bool HcalText2DetIdConverter::init (const std::string& fFlavor, const std::string& fField1,
157  const std::string& fField2, const std::string& fField3) {
158  bool result = true;
159  flavorName = strip (fFlavor);
160  field1 = strip (fField1);
161  field2 = strip (fField2);
162  field3 = strip (fField3);
163  if (flavorName == "HB" ||
164  flavorName == "HE" ||
165  flavorName == "HF" ||
166  flavorName == "HO") {
167  HcalSubdetector sub = flavorName == "HB" ? HcalBarrel :
168  flavorName == "HE" ? HcalEndcap :
169  flavorName == "HO" ? HcalOuter :
170  HcalForward;
171  mId = HcalDetId (sub, getField (1), getField (2), getField (3));
172  }
173  else if (flavorName == "HT") {
174  // We use the depth to signal the "version" being used (RCT or 1x1 HF). RCT
175  // has a 0 in the 10s digit, whereas 1x1 has a 1. The ones digit is still
176  // used to indicate depth, although in the 1x1 case this must be 0, so we
177  // set it as such.
178  mId = HcalTrigTowerDetId (getField (1), getField (2), getField (3));
179 /*
180  const int depth_field = getField(3);
181  const int ones = depth_field % 10;
182  const int tens = (depth_field - ones) / 10;
183  if (tens == 0) {
184  const int depth = ones;
185  const int version = 0;
186  mId = HcalTrigTowerDetId (getField (1), getField (2), depth, version);
187  } else if (tens == 1) {
188  const int depth = 0;
189  const int version = 1;
190  mId = HcalTrigTowerDetId(getField(1), getField(2), depth, version);
191  } else {
192  // Undefined version!
193  }
194 */
195  }
196  else if (flavorName.find ("ZDC_") == 0) {
197  HcalZDCDetId::Section section = flavorName == "ZDC_EM" ? HcalZDCDetId::EM :
198  flavorName == "ZDC_HAD" ? HcalZDCDetId::HAD :
200  mId = HcalZDCDetId (section, getField (1)>0, getField (2));
201  }
202  else if (flavorName.find ("CALIB_") == 0) {
204  if (flavorName.find("HB")!=std::string::npos) sd=HcalBarrel;
205  else if (flavorName.find("HE")!=std::string::npos) sd=HcalEndcap;
206  else if (flavorName.find("HO")!=std::string::npos) sd=HcalOuter;
207  else if (flavorName.find("HF")!=std::string::npos) sd=HcalForward;
208 
209  int ieta=getField(1);
210  int iphi=getField(2);
211  int channel = calibChannel (field3);
212  mId = HcalCalibDetId (sd, ieta,iphi,channel);
213  }
214  else if (flavorName=="HOX") {
215  int ieta=getField(1);
216  int iphi=getField(2);
217  mId = HcalCalibDetId (ieta,iphi);
218  }
219  else if (flavorName == "NA") {
221  }
222  else {
223  std::cerr << "HcalText2DetIdConverter::init-> Unknown HcalDetId flavor: " << flavorName << std::endl;
224  result = false;
225  }
226  return result;
227 }
228 
229 
231  char* endptr;
232  const char* nptr = i == 1 ? field1.c_str() :
233  i == 2 ? field2.c_str() : field3.c_str();
234  long result = strtol (nptr, &endptr, 0);
235  if (*nptr != '\0' && *endptr == '\0') {
236  return result;
237  }
238  if (i == 2 && isHcalCalibDetId ()) {
239  int result = calibChannel (field2);
240  if (i) return result;
241  }
242  if (*nptr != '\0') {
243  std::cerr << "HcalText2DetIdConverter::getField-> Can not convert string "<< nptr << " to int. Bad symbol: " << *endptr << std::endl;
244  }
245  return 0;
246  }
247 
249  char buffer [128];
250  sprintf (buffer, "%d", fValue);
251  if (i == 1) field1 = buffer;
252  else if (i == 2) field2 = buffer;
253  else field3 = buffer;
254 }
255 
257  return flavorName + " " + field1 + " " + field2 + " " + field3;
258 }
static const HcalDetId Undefined
Definition: HcalDetId.h:80
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)
tuple result
Definition: mps_fire.py:95
int depth() const
get the depth (zero for LHC Run 1, may be nonzero for later runs)
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
int depth() const
get the tower depth
Definition: HcalDetId.cc:106
bool isHcalTrigTowerDetId() const
void setField(int i, int fValue)
int ieta() const
get the cell ieta
Definition: HcalDetId.h:56
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.cc:101
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