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::CastorRadFacility) {
152  flavorName="CRF";
153  setField (1, calibId.rm());
154  setField (2, calibId.fiber());
155  setField (3, calibId.channel());
156  }
157  }
158  else {
159  flavorName = "UNKNOWN_FLAVOR";
160  std::cerr << "HcalText2DetIdConverter::init-> Unknown detId: " << std::hex << std::showbase << mId.rawId() << std::endl;
161  result = false;
162  }
163  return result;
164 }
165 
166 
167 bool HcalText2DetIdConverter::init (const std::string& fFlavor, const std::string& fField1,
168  const std::string& fField2, const std::string& fField3) {
169  bool result = true;
170  flavorName = strip (fFlavor);
171  field1 = strip (fField1);
172  field2 = strip (fField2);
173  field3 = strip (fField3);
174  if (flavorName == "HB" ||
175  flavorName == "HE" ||
176  flavorName == "HF" ||
177  flavorName == "HO") {
178  HcalSubdetector sub = flavorName == "HB" ? HcalBarrel :
179  flavorName == "HE" ? HcalEndcap :
180  flavorName == "HO" ? HcalOuter :
181  HcalForward;
182  mId = HcalDetId (sub, getField (1), getField (2), getField (3));
183  }
184  else if (flavorName == "HT") {
185  // We use the depth to signal the "version" being used (RCT or 1x1 HF). RCT
186  // has a 0 in the 10s digit, whereas 1x1 has a 1. The ones digit is still
187  // used to indicate depth, although in the 1x1 case this must be 0, so we
188  // set it as such.
189  mId = HcalTrigTowerDetId (getField (1), getField (2), getField (3));
190 /*
191  const int depth_field = getField(3);
192  const int ones = depth_field % 10;
193  const int tens = (depth_field - ones) / 10;
194  if (tens == 0) {
195  const int depth = ones;
196  const int version = 0;
197  mId = HcalTrigTowerDetId (getField (1), getField (2), depth, version);
198  } else if (tens == 1) {
199  const int depth = 0;
200  const int version = 1;
201  mId = HcalTrigTowerDetId(getField(1), getField(2), depth, version);
202  } else {
203  // Undefined version!
204  }
205 */
206  }
207  else if (flavorName.find ("ZDC_") == 0) {
209  if(flavorName == "ZDC_EM") section = HcalZDCDetId::EM;
210  else if(flavorName == "ZDC_HAD") section = HcalZDCDetId::HAD;
211  else if(flavorName == "ZDC_LUM") section = HcalZDCDetId::LUM;
212  else if(flavorName == "ZDC_RPD") section = HcalZDCDetId::RPD;
213  mId = HcalZDCDetId (section, getField (1)>0, getField (2));
214  }
215  else if (flavorName.find ("CALIB_") == 0) {
217  if (flavorName.find("HB")!=std::string::npos) sd=HcalBarrel;
218  else if (flavorName.find("HE")!=std::string::npos) sd=HcalEndcap;
219  else if (flavorName.find("HO")!=std::string::npos) sd=HcalOuter;
220  else if (flavorName.find("HF")!=std::string::npos) sd=HcalForward;
221 
222  int ieta=getField(1);
223  int iphi=getField(2);
224  int channel = calibChannel (field3);
225  mId = HcalCalibDetId (sd, ieta,iphi,channel);
226  }
227  else if (flavorName=="HOX") {
228  int ieta=getField(1);
229  int iphi=getField(2);
230  mId = HcalCalibDetId (ieta,iphi);
231  }
232  else if (flavorName=="UMNQIE") {
233  int channel=getField(1);
235  }
236  else if (flavorName=="CRF") {
237  int rm=getField(1);
238  int fiber=getField(2);
239  int channel=getField(3);
241  }
242  else if (flavorName == "NA") {
244  }
245  else {
246  std::cerr << "HcalText2DetIdConverter::init-> Unknown HcalDetId flavor: " << flavorName << std::endl;
247  result = false;
248  }
249  return result;
250 }
251 
252 
254  char* endptr;
255  const char* nptr = i == 1 ? field1.c_str() :
256  i == 2 ? field2.c_str() : field3.c_str();
257  long result = strtol (nptr, &endptr, 0);
258  if (*nptr != '\0' && *endptr == '\0') {
259  return result;
260  }
261  if (i == 2 && isHcalCalibDetId ()) {
262  int result = calibChannel (field2);
263  if (i) return result;
264  }
265  if (*nptr != '\0') {
266  std::cerr << "HcalText2DetIdConverter::getField-> Can not convert string "<< nptr << " to int. Bad symbol: " << *endptr << std::endl;
267  }
268  return 0;
269  }
270 
271 void HcalText2DetIdConverter::setField (int i, int fValue) {
272  char buffer [128];
273  sprintf (buffer, "%d", fValue);
274  if (i == 1) field1 = buffer;
275  else if (i == 2) field2 = buffer;
276  else field3 = buffer;
277 }
278 
280  return flavorName + " " + field1 + " " + field2 + " " + field3;
281 }
static const HcalDetId Undefined
Definition: HcalDetId.h:85
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
int ieta() const
get the tower ieta
int ieta() const
get the rbx name (if relevant)
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:108
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")
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:103
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:76
int channel() const
get the channel (for uMNio/qie or similar)
int iphi() const
get the tower iphi