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