File indexing completed on 2024-04-06 12:21:56
0001 #ifndef L1Trigger_TrackFindingTracklet_interface_Util_h
0002 #define L1Trigger_TrackFindingTracklet_interface_Util_h
0003
0004 #include <sstream>
0005 #include <fstream>
0006 #include <cassert>
0007 #include <cmath>
0008 #include <string>
0009 #include <algorithm>
0010 #include <sys/types.h>
0011 #include <sys/stat.h>
0012
0013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0014 #include "FWCore/Utilities/interface/Exception.h"
0015
0016 namespace trklet {
0017
0018
0019 inline std::string hexFormat(const std::string& binary) {
0020 std::stringstream ss;
0021
0022 unsigned int radix = 1, value = 0;
0023 for (int i = binary.length() - 1; i >= 0; i--) {
0024 if (binary.at(i) != '0' && binary.at(i) != '1')
0025 continue;
0026 value += (binary.at(i) - '0') * radix;
0027 if (radix == 8) {
0028 ss << std::hex << value;
0029 radix = 1;
0030 value = 0;
0031 } else
0032 radix <<= 1;
0033 }
0034 if (radix != 1)
0035 ss << std::hex << value;
0036
0037 std::string str = ss.str() + "x0";
0038 std::reverse(str.begin(), str.end());
0039 return str;
0040 }
0041
0042 inline double bendstrip(double r, double rinv, double stripPitch, double sensorSpacing) {
0043 double delta = r * sensorSpacing * 0.5 * rinv;
0044 double bend = delta / stripPitch;
0045 return bend;
0046 }
0047
0048 inline double convertFEBend(
0049 double FEbend, double sensorSep, double sensorSpacing, double CF, bool barrel, double r = 0) {
0050 double bend = sensorSpacing * CF * FEbend / sensorSep;
0051 return bend;
0052 }
0053
0054 inline double tan_theta(double r, double z, double z0, bool z0_max) {
0055
0056
0057 double tan;
0058 if (z0_max)
0059 tan = (z - z0) / r;
0060 else
0061 tan = (z + z0) / r;
0062
0063 return tan;
0064 }
0065
0066 inline double rinv(double phi1, double phi2, double r1, double r2) {
0067 assert(r1 < r2);
0068
0069 double dphi = phi2 - phi1;
0070 double dr = r2 - r1;
0071
0072 return 2.0 * sin(dphi) / dr / sqrt(1.0 + 2 * r1 * r2 * (1.0 - cos(dphi)) / (dr * dr));
0073 }
0074
0075 inline std::string convertHexToBin(const std::string& stubwordhex) {
0076 std::string stubwordbin = "";
0077
0078 for (char word : stubwordhex) {
0079 std::string hexword = "";
0080 if (word == '0')
0081 hexword = "0000";
0082 else if (word == '1')
0083 hexword = "0001";
0084 else if (word == '2')
0085 hexword = "0010";
0086 else if (word == '3')
0087 hexword = "0011";
0088 else if (word == '4')
0089 hexword = "0100";
0090 else if (word == '5')
0091 hexword = "0101";
0092 else if (word == '6')
0093 hexword = "0110";
0094 else if (word == '7')
0095 hexword = "0111";
0096 else if (word == '8')
0097 hexword = "1000";
0098 else if (word == '9')
0099 hexword = "1001";
0100 else if (word == 'A')
0101 hexword = "1010";
0102 else if (word == 'B')
0103 hexword = "1011";
0104 else if (word == 'C')
0105 hexword = "1100";
0106 else if (word == 'D')
0107 hexword = "1101";
0108 else if (word == 'E')
0109 hexword = "1110";
0110 else if (word == 'F')
0111 hexword = "1111";
0112 else {
0113 throw cms::Exception("Inconsistency")
0114 << __FILE__ << " " << __LINE__ << " hex string format invalid: " << stubwordhex;
0115 }
0116 stubwordbin += hexword;
0117 }
0118 return stubwordbin;
0119 }
0120
0121 inline int ilog2(double factor) {
0122 double power = log(factor) / log(2);
0123 int ipower = round(power);
0124 assert(std::abs(power - ipower) < 0.1);
0125 return ipower;
0126 }
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 inline int dirExists(const std::string& path) {
0137 struct stat info;
0138
0139 int statRC = stat(path.c_str(), &info);
0140 if (statRC != 0) {
0141 if (errno == ENOENT) {
0142 return 0;
0143 }
0144 if (errno == ENOTDIR) {
0145 return 0;
0146 }
0147 return -1;
0148 }
0149
0150 return (info.st_mode & S_IFDIR) ? 1 : 0;
0151 }
0152
0153
0154 inline std::ofstream openfile(const std::string& dir, const std::string& fname, const char* file, int line) {
0155 if (dirExists(dir) != 1) {
0156 edm::LogVerbatim("Tracklet") << "Creating directory : " << dir;
0157 int fail = system((std::string("mkdir -p ") + dir).c_str());
0158 if (fail) {
0159 throw cms::Exception("BadDir") << file << " " << line << " could not create directory " << dir;
0160 }
0161 }
0162
0163 std::ofstream out(dir + "/" + fname);
0164
0165 if (out.fail()) {
0166 throw cms::Exception("BadFile") << file << " " << line << " could not create file " << fname << " in " << dir;
0167 }
0168
0169 return out;
0170 }
0171
0172
0173
0174 inline void openfile(
0175 std::ofstream& out, bool first, const std::string& dir, const std::string& fname, const char* file, int line) {
0176 if (dirExists(dir) != 1) {
0177 edm::LogVerbatim("Tracklet") << "Creating directory : " << dir;
0178 int fail = system((std::string("mkdir -p ") + dir).c_str());
0179 if (fail) {
0180 throw cms::Exception("BadDir") << file << " " << line << " could not create directory " << dir;
0181 }
0182 }
0183
0184 if (first) {
0185 out.open(fname);
0186 } else {
0187 out.open(fname, std::ofstream::app);
0188 }
0189
0190 if (out.fail()) {
0191 throw cms::Exception("BadFile") << file << " " << line << " could not create file " << fname << " in " << dir;
0192 }
0193 }
0194
0195 };
0196 #endif