CMS 3D CMS Logo

HGCalTestGuardRing.cc
Go to the documentation of this file.
3 
7 
14 
17 
22 
31 
32 #include <fstream>
33 #include <sstream>
34 #include <string>
35 #include <map>
36 
38 public:
40  ~HGCalTestGuardRing() override = default;
41  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
42 
43 protected:
44  void analyze(edm::Event const&, edm::EventSetup const&) override;
45  void beginJob() override {}
46  void endJob() override {}
47 
48 private:
50  const double guardRingOffset_;
52  std::map<HGCSiliconDetId, int> waferID_;
53 };
54 
56  : nameSense_(ps.getParameter<std::string>("nameSense")),
57  waferFile_(ps.getParameter<std::string>("waferFile")),
58  guardRingOffset_(ps.getParameter<double>("guardRingOffset")),
60  DetId::Detector det = (nameSense_ != "HGCalHESiliconSensitive") ? DetId::HGCalEE : DetId::HGCalHSi;
61  edm::LogVerbatim("HGCalSim") << "Test Guard Ring Offset " << guardRingOffset_ << " for " << nameSense_ << ":" << det
62  << " for wafers read from file " << waferFile_;
63  if (!waferFile_.empty()) {
64  std::string thick[4] = {"h120", "l200", "l300", "h200"};
65  int addType[4] = {HGCalTypes::WaferFineThin,
69  const int partTypeH[6] = {HGCalTypes::WaferFull,
75  const int partTypeL[7] = {HGCalTypes::WaferFull,
82  edm::FileInPath filetmp("SimG4CMS/Calo/data/" + waferFile_);
83  std::string fileName = filetmp.fullPath();
84  std::ifstream fInput(fileName.c_str());
85  if (!fInput.good()) {
86  edm::LogVerbatim("HGCalSim") << "Cannot open file " << fileName;
87  } else {
88  char buffer[80];
89  while (fInput.getline(buffer, 80)) {
90  std::vector<std::string> items = CaloSimUtils::splitString(std::string(buffer));
91  if (items.size() > 6) {
92  int layer = std::atoi(items[0].c_str());
93  int waferU = std::atoi(items[4].c_str());
94  int waferV = std::atoi(items[5].c_str());
95  int thck = static_cast<int>(std::find(thick, thick + 4, items[2]) - thick);
96  int type = (thck < 4) ? addType[thck] : 0;
97  HGCSiliconDetId id(det, -1, type, layer, waferU, waferV, 0, 0);
98  int orient = std::atoi(items[5].c_str());
99  int part = std::atoi(items[1].c_str());
100  if (part >= 0) {
102  part = partTypeH[part];
103  else
104  part = partTypeL[part];
105  }
106  waferID_[id] = orient * 100 + part;
107 #ifdef EDM_ML_DEBUG
108  edm::LogVerbatim("HGCalSim") << "HGCalTestGuardRing::Reads " << id << " Orientation:Partial " << orient << ":"
109  << part;
110 #endif
111  }
112  }
113  edm::LogVerbatim("HGCalSim") << "HGCalTestGuardRing::Reads in " << waferID_.size() << " wafer information from "
114  << fileName;
115  fInput.close();
116  }
117  }
118 }
119 
122  desc.add<std::string>("nameSense", "HGCalEESensitive");
123  desc.add<std::string>("waferFile", "testWafersEE.txt");
124  desc.add<double>("guardRingOffset", 1.0);
125  descriptions.add("hgcalTestGuardRingEE", desc);
126 }
127 
129  // get HGCalGeometry
130  const HGCalGeometry* geom = &iS.getData(geomToken_);
131  const HGCalDDDConstants& hgc = geom->topology().dddConstants();
132  double waferSize = hgc.waferSize(false);
133  HGCalCell wafer(waferSize, hgc.getUVMax(0), hgc.getUVMax(1));
134  const bool v17OrLess = hgc.v17OrLess();
135 
136  // get the hit collection
137  edm::LogVerbatim("HGCalSim") << "HGCalTestGuardRing: Wafer Szie " << waferSize << " v17OrLess " << v17OrLess;
138 
139  // Loop over all IDs
140  int all(0), allSi(0), good(0);
141  for (std::map<HGCSiliconDetId, int>::const_iterator itr = waferID_.begin(); itr != waferID_.end(); ++itr) {
142  HGCSiliconDetId id = itr->first;
143  ++all;
144  if ((id.det() == DetId::HGCalEE) || (id.det() == DetId::HGCalHSi)) {
145  ++allSi;
146  if (((id.det() == DetId::HGCalEE) && (nameSense_ == "HGCalEESensitive")) ||
147  ((id.det() == DetId::HGCalHSi) && (nameSense_ == "HGCalHESiliconSensitive"))) {
148  int partial = ((itr->second) % 100);
149  int orient = (((itr->second) / 100) % 100);
150  int type = id.type();
151  int nCells = hgc.getUVMax(type);
152  for (int u = 0; u < 2 * nCells; ++u) {
153  for (int v = 0; v < 2 * nCells; ++v) {
154  if (((v - u) < nCells) && ((u - v) <= nCells)) {
155  HGCSiliconDetId hid(id.det(), id.zside(), id.type(), id.layer(), id.waferU(), id.waferV(), u, v);
156  bool valid = (geom->topology()).valid(static_cast<DetId>(hid));
157  if (valid) {
158  ++good;
159  int placeIndex = wafer.cellPlacementIndex(1, HGCalTypes::waferFrontBack(0), orient);
160  std::pair<double, double> xy = wafer.cellUV2XY1(u, v, placeIndex, type);
161  std::vector<std::pair<double, double> > wxy1 =
162  HGCalWaferMask::waferXY(partial, orient, -1, waferSize, 0.0, 0.0, 0.0, v17OrLess);
163  bool check1 = HGCGuardRing::insidePolygon(xy.first, xy.second, wxy1);
164  std::ostringstream st1;
165  for (unsigned int k1 = 0; k1 < wxy1.size(); ++k1)
166  st1 << " (" << wxy1[k1].first << ", " << wxy1[k1].second << ")";
167  edm::LogVerbatim("HGCSim")
168  << "First " << hid << " Type:Partial:Orient:Place " << type << ":" << partial << ":" << orient
169  << ":" << placeIndex << " Boundary with " << wxy1.size() << " points: " << st1.str() << " check "
170  << check1 << " for (" << xy.first << ", " << xy.second << ")";
171 
172  std::vector<std::pair<double, double> > wxy2 =
173  HGCalWaferMask::waferXY(partial, orient, -1, waferSize, guardRingOffset_, 0.0, 0.0, v17OrLess);
174  bool check2 = HGCGuardRing::insidePolygon(xy.first, xy.second, wxy2);
175  std::ostringstream st2;
176  for (unsigned int k1 = 0; k1 < wxy2.size(); ++k1)
177  st2 << " (" << wxy2[k1].first << ", " << wxy2[k1].second << ")";
178  edm::LogVerbatim("HGCSim") << "Second Offset " << guardRingOffset_ << " Boundary with " << wxy2.size()
179  << " points: " << st2.str() << " check " << check2 << " for (" << xy.first
180  << ", " << xy.second << ")";
181  }
182  }
183  }
184  }
185  }
186  }
187  }
188  edm::LogVerbatim("HGCalSim") << "Total hits = " << all << " Good Silicon DetIds = " << allSi << ":" << good;
189 }
190 
191 //define this as a plug-in
Log< level::Info, true > LogVerbatim
static constexpr int32_t WaferHalf2
Definition: HGCalTypes.h:43
static constexpr int32_t WaferFive2
Definition: HGCalTypes.h:44
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
void beginJob() override
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
def all(container)
workaround iterator generators for ROOT classes
Definition: cmstools.py:25
static constexpr int32_t waferFrontBack(int32_t index)
Definition: HGCalTypes.h:138
int32_t waferU(const int32_t index)
std::map< HGCSiliconDetId, int > waferID_
const double guardRingOffset_
static constexpr int32_t WaferThree
Definition: HGCalTypes.h:42
int zside(DetId const &)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
static constexpr int32_t WaferSemi2
Definition: HGCalTypes.h:41
const edm::ESGetToken< HGCalGeometry, IdealGeometryRecord > geomToken_
static std::vector< std::pair< double, double > > waferXY(const int &part, const int &orient, const int &zside, const double &waferSize, const double &offset, const double &xpos, const double &ypos, const bool &v17)
U second(std::pair< T, U > const &p)
static constexpr int32_t WaferFull
Definition: HGCalTypes.h:35
HGCalTestGuardRing(const edm::ParameterSet &ps)
static constexpr int32_t WaferHalf
Definition: HGCalTypes.h:39
std::vector< std::string > splitString(const std::string &)
Definition: CaloSimUtils.cc:3
void endJob() override
void analyze(edm::Event const &, edm::EventSetup const &) override
~HGCalTestGuardRing() override=default
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
static constexpr int32_t WaferCoarseThin
Definition: HGCalTypes.h:31
const std::string nameSense_
const std::string waferFile_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
static constexpr int32_t WaferChopTwoM
Definition: HGCalTypes.h:38
part
Definition: HCALResponse.h:20
Detector
Definition: DetId.h:24
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static bool insidePolygon(double x, double y, const std::vector< std::pair< double, double > > &xyv)
Definition: HGCGuardRing.cc:90
HLT enums.
ALPAKA_FN_ACC ALPAKA_FN_INLINE void uint32_t const uint32_t CACellT< TrackerTraits > uint32_t * nCells
int32_t waferV(const int32_t index)
static constexpr int32_t WaferCoarseThick
Definition: HGCalTypes.h:32
static constexpr int32_t WaferFive
Definition: HGCalTypes.h:36
static constexpr int32_t WaferFineThick
Definition: HGCalTypes.h:33
static constexpr int32_t WaferFineThin
Definition: HGCalTypes.h:30
static constexpr int32_t WaferSemi
Definition: HGCalTypes.h:40