File indexing completed on 2024-04-06 12:14:19
0001 #include "Geometry/CaloTopology/interface/HcalTopologyRestrictionParser.h"
0002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0003 #include <boost/tokenizer.hpp>
0004 #include <sstream>
0005 #include <iostream>
0006 HcalTopologyRestrictionParser::HcalTopologyRestrictionParser(HcalTopology& target) : target_(target) {}
0007
0008 static HcalSubdetector determineSubdet(const std::string& item) {
0009 if (item == "HB")
0010 return HcalBarrel;
0011 if (item == "HE")
0012 return HcalEndcap;
0013 if (item == "HF")
0014 return HcalForward;
0015 if (item == "HO")
0016 return HcalOuter;
0017 return (HcalSubdetector)0;
0018 }
0019
0020 std::string HcalTopologyRestrictionParser::parse(const std::string& line) {
0021 std::ostringstream errors;
0022 boost::char_separator<char> sep(" \t", ";");
0023 typedef boost::tokenizer<boost::char_separator<char> > myTokType;
0024
0025 std::string totaline(line);
0026 totaline += ';';
0027 myTokType tok(totaline, sep);
0028 int ieta1 = 0, ieta2 = 0, iphi1 = -1, iphi2 = -1, depth1 = 1, depth2 = 4;
0029 HcalSubdetector subdet = (HcalSubdetector)0;
0030
0031 int phase = 0;
0032 for (myTokType::iterator beg = tok.begin(); beg != tok.end() && phase >= 0; ++beg) {
0033 edm::LogVerbatim("HCalGeom") << phase << " : <" << *beg << ">";
0034 if (*beg == ";") {
0035 if (phase == 0)
0036 continue;
0037 if (phase != 1 && phase != 5 && phase != 7) {
0038 errors << "Expect 1, 5, or 7 arguments, got " << phase;
0039 phase = -1;
0040 } else {
0041 if (phase == 1) {
0042 target_.excludeSubdetector(subdet);
0043 } else {
0044 target_.exclude(subdet, ieta1, ieta2, iphi1, iphi2, depth1, depth2);
0045 }
0046 phase = 0;
0047 }
0048 } else {
0049 switch (phase) {
0050 case (0):
0051 subdet = determineSubdet(*beg);
0052 break;
0053 case (1):
0054 ieta1 = atoi(beg->c_str());
0055 break;
0056 case (2):
0057 ieta2 = atoi(beg->c_str());
0058 break;
0059 case (3):
0060 iphi1 = atoi(beg->c_str());
0061 break;
0062 case (4):
0063 iphi2 = atoi(beg->c_str());
0064 depth1 = 1;
0065 depth2 = 4;
0066 break;
0067 case (5):
0068 depth1 = atoi(beg->c_str());
0069 break;
0070 case (6):
0071 depth2 = atoi(beg->c_str());
0072 break;
0073 }
0074 phase++;
0075 }
0076 }
0077
0078 return errors.str();
0079 }