3 #include "CLHEP/Random/RandFlat.h" 23 hXInt.setBinContent(
i,
j, xInt);
34 return range.min + (iBin - 1 +
pos) * binWidth;
42 if (m_barrelParam.size() != m_barrelParam_xInt.size()) {
43 m_barrelParam_xInt.resize(m_barrelParam.size());
44 for (
unsigned int i{0};
i != m_barrelParam.size(); ++
i) {
45 m_barrelParam_xInt[
i] = calculateXInt(m_barrelParam[
i]);
48 if (m_endcapParam.size() != m_endcapParam_xInt.size()) {
49 m_endcapParam_xInt.resize(m_endcapParam.size());
50 for (
unsigned int i{0};
i != m_endcapParam.size(); ++
i) {
51 m_endcapParam_xInt[
i] = calculateXInt(m_endcapParam[
i]);
58 if ((layer > m_nTIB) || (layer < 1)) {
60 <<
"[" << __PRETTY_FUNCTION__ <<
"] layer index " << layer <<
" out of range [1," << m_nTIB <<
"]";
63 m_barrelParam[layer - 1] =
params;
64 m_barrelParam_xInt[layer - 1] = calculateXInt(params);
70 if ((layer > m_nTOB) || (layer < 1)) {
72 <<
"[" << __PRETTY_FUNCTION__ <<
"] layer index " << layer <<
" out of range [1," << m_nTOB <<
")";
75 m_barrelParam[m_nTIB + layer - 1] =
params;
76 m_barrelParam_xInt[m_nTIB + layer - 1] = calculateXInt(params);
82 if ((wheel > m_nTID) || (wheel < 1)) {
84 <<
"[" << __PRETTY_FUNCTION__ <<
"] wheel index " << wheel <<
" out of range [1," << m_nTID <<
"]";
87 m_endcapParam[wheel - 1] =
params;
88 m_endcapParam_xInt[wheel - 1] = calculateXInt(params);
94 if ((wheel > m_nTEC) || (wheel < 1)) {
96 <<
"[" << __PRETTY_FUNCTION__ <<
"] wheel index " << wheel <<
" out of range [1," << m_nTEC <<
")";
99 m_endcapParam[m_nTID + wheel - 1] =
params;
100 m_endcapParam_xInt[m_nTID + wheel - 1] = calculateXInt(params);
107 CLHEP::HepRandomEngine* engine)
const {
108 if (m_barrelParam.size() != m_barrelParam_xInt.size()) {
109 throw cms::Exception(
"LogicError") <<
"x-integrals of 3D histograms have not been calculated";
111 const auto layerParam = m_barrelParam[layerIdx];
112 const int ip = layerParam.findBinY(pu);
113 const int iz = layerParam.findBinZ(z);
114 const float norm = m_barrelParam_xInt[layerIdx].binContent(ip, iz);
115 const auto val = CLHEP::RandFlat::shoot(engine) * norm;
116 if (
val < layerParam.binContent(0, ip, iz)) {
117 return layerParam.rangeX().min;
118 }
else if (norm -
val < layerParam.binContent(layerParam.numberOfBinsX() + 1, ip, iz)) {
119 return layerParam.rangeX().max;
121 float sum = layerParam.binContent(0, ip, iz);
122 for (
int i{1};
i != layerParam.numberOfBinsX() + 1; ++
i) {
123 sum += layerParam.binContent(
i, ip, iz);
125 return xBinPos(layerParam,
i, (sum -
val) / layerParam.binContent(
i, ip, iz));
129 throw cms::Exception(
"LogicError") <<
"Problem drawing a random number from the distribution";
135 CLHEP::HepRandomEngine* engine)
const {
136 if (m_endcapParam.size() != m_endcapParam_xInt.size()) {
137 throw cms::Exception(
"LogicError") <<
"x-integrals of 3D histograms have not been calculated";
139 const auto layerParam = m_endcapParam[wheelIdx];
140 const int ip = layerParam.findBinY(pu);
141 const int ir = layerParam.findBinZ(r);
142 const float norm = m_endcapParam_xInt[wheelIdx].binContent(ip, ir);
143 const auto val = CLHEP::RandFlat::shoot(engine) * norm;
144 if (
val < layerParam.binContent(0, ip, ir)) {
145 return layerParam.rangeX().min;
146 }
else if (norm -
val < layerParam.binContent(layerParam.numberOfBinsX() + 1, ip, ir)) {
147 return layerParam.rangeX().max;
149 float sum = layerParam.binContent(0, ip, ir);
150 for (
int i{1};
i != layerParam.numberOfBinsX() + 1; ++
i) {
151 sum += layerParam.binContent(
i, ip, ir);
153 return xBinPos(layerParam,
i, (sum -
val) / layerParam.binContent(
i, ip, ir));
157 throw cms::Exception(
"LogicError") <<
"Problem drawing a random number from the distribution";
bool putTIB(layerid layer, const LayerParameters ¶ms)
bool putTID(layerid wheel, const LayerParameters ¶ms)
void calculateIntegrals()
float sampleBarrel(layerid layerIdx, float z, float pu, CLHEP::HepRandomEngine *engine) const
float sampleEndcap(layerid wheelIdx, float r, float pu, CLHEP::HepRandomEngine *engine) const
bool putTEC(layerid wheel, const LayerParameters ¶ms)
bool putTOB(layerid layer, const LayerParameters ¶ms)