1 #include "CLHEP/Units/defs.h" 2 #include "CLHEP/Units/SystemOfUnits.h" 3 #include "CLHEP/Units/GlobalPhysicalConstants.h" 9 #include "CLHEP/Random/RandFlat.h" 10 #include "CLHEP/Random/RandPoissonQ.h" 11 #include "CLHEP/Random/RandGaussQ.h" 19 , averageEfficiency_(config.getParameter<double> (
"averageEfficiency"))
20 , averageShapingTime_(config.getParameter<double> (
"averageShapingTime"))
21 , timeResolution_(config.getParameter<double> (
"timeResolution"))
22 , timeJitter_(config.getParameter<double> (
"timeJitter"))
23 , averageNoiseRate_(config.getParameter<double> (
"averageNoiseRate"))
24 , signalPropagationSpeed_(config.getParameter<double> (
"signalPropagationSpeed"))
25 , bxwidth_(config.getParameter<
int> (
"bxwidth"))
26 , minBunch_(config.getParameter<
int> (
"minBunch"))
27 , maxBunch_(config.getParameter<
int> (
"maxBunch"))
28 , digitizeOnlyMuons_(config.getParameter<
bool> (
"digitizeOnlyMuons"))
29 , doBkgNoise_(config.getParameter<
bool> (
"doBkgNoise"))
30 , doNoiseCLS_(config.getParameter<
bool> (
"doNoiseCLS"))
31 , fixedRollRadius_(config.getParameter<
bool> (
"fixedRollRadius"))
32 , simulateElectronBkg_(config.getParameter<
bool> (
"simulateElectronBkg"))
33 , instLumi_(config.getParameter<double> (
"instLumi"))
34 , rateFact_(config.getParameter<double> (
"rateFact"))
35 , referenceInstLumi_(config.getParameter<double> (
"referenceInstLumi"))
36 , ME0ElecBkgParam0_(config.getParameter<double> (
"ME0ElecBkgParam0"))
37 , ME0ElecBkgParam1_(config.getParameter<double> (
"ME0ElecBkgParam1"))
38 , ME0ElecBkgParam2_(config.getParameter<double> (
"ME0ElecBkgParam2"))
39 , ME0ElecBkgParam3_(config.getParameter<double> (
"ME0ElecBkgParam3"))
40 , ME0NeuBkgParam0_(config.getParameter<double> (
"ME0NeuBkgParam0"))
41 , ME0NeuBkgParam1_(config.getParameter<double> (
"ME0NeuBkgParam1"))
42 , ME0NeuBkgParam2_(config.getParameter<double> (
"ME0NeuBkgParam2"))
43 , ME0NeuBkgParam3_(config.getParameter<double> (
"ME0NeuBkgParam3"))
64 bool digiMuon =
false;
65 bool digiElec =
false;
66 for (
const auto&
hit : simHits)
71 double partMom =
hit.pabs();
72 double checkMuonEff = CLHEP::RandFlat::shoot(engine, 0., 1.);
73 double checkElecEff = CLHEP::RandFlat::shoot(engine, 0., 1.);
78 if (partMom <= 1.95
e-03)
79 elecEff = 1.7e-05 *
std::exp(2.1 * partMom * 1000.);
80 if (partMom > 1.95
e-03 && partMom < 10.
e-03)
81 elecEff = 1.34 *
log(7.96
e-01 * partMom * 1000. - 5.75
e-01)
82 / (1.34 +
log(7.96
e-01 * partMom * 1000. - 5.75
e-01));
83 if (partMom > 10.
e-03)
85 if (checkElecEff < elecEff)
88 if (!(digiMuon || digiElec))
92 for (
const auto & digi : cluster)
106 float randomJitterTime = CLHEP::RandGaussQ::shoot(engine, 0.,
timeJitter_);
111 throw cms::Exception(
"Geometry")<<
"ME0SimpleModel::getSimHitBx() - ME0 simhit id does not match any ME0 roll id: " <<
id <<
"\n";
114 if (roll->id().region() == 0)
116 throw cms::Exception(
"Geometry") <<
"ME0SimpleModel::getSimHitBx() - this ME0 id is from barrel, which cannot happen: " << roll->id() <<
"\n";
118 const int nstrips = roll->nstrips();
119 float middleStrip = nstrips/2.;
120 const LocalPoint& middleOfRoll = roll->centreOfStrip(middleStrip);
121 const GlobalPoint& globMiddleRol = roll->toGlobal(middleOfRoll);
122 double muRadius =
sqrt(globMiddleRol.
x()*globMiddleRol.
x() + globMiddleRol.
y()*globMiddleRol.
y() +globMiddleRol.
z()*globMiddleRol.
z());
123 double timeCalibrationOffset_ = (muRadius*CLHEP::ns*CLHEP::cm)/(CLHEP::c_light);
125 const float halfStripLength(0.5 * top->stripLength());
126 const float distanceFromEdge(halfStripLength - simHitPos.y());
131 const float averagePropagationTime(distanceFromEdge / signalPropagationSpeedTrue);
133 float randomResolutionTime = CLHEP::RandGaussQ::shoot(engine, 0.,
timeResolution_);
134 const float simhitTime(tof +
averageShapingTime_ + randomResolutionTime + averagePropagationTime + randomJitterTime);
135 float referenceTime = 0.;
136 referenceTime = timeCalibrationOffset_ + halfStripLength / signalPropagationSpeedTrue +
averageShapingTime_;
137 const float timeDifference(simhitTime - referenceTime);
139 bx =
static_cast<int> (std::round((timeDifference) /
bxwidth_));
142 const bool debug(
false);
145 LogDebug(
"ME0SimpleModel")<<
"checktime " <<
"bx = " << bx <<
"\tdeltaT = " << timeDifference <<
"\tsimT = " << simhitTime
146 <<
"\trefT = " << referenceTime <<
"\ttof = " << tof <<
"\tavePropT = " << averagePropagationTime
147 <<
"\taveRefPropT = " << halfStripLength / signalPropagationSpeedTrue << std::endl;
157 const int nstrips(roll->
nstrips());
159 double trStripArea(0.0);
161 if (me0Id.region() == 0)
164 <<
"ME0Synchronizer::simulateNoise() - this ME0 id is from barrel, which cannot happen.";
167 const float striplength(top_->stripLength());
168 trStripArea = (roll->
pitch()) * striplength;
169 trArea = trStripArea * nstrips;
172 top_->radius() + CLHEP::RandFlat::shoot(engine, -1.*top_->stripLength()/2., top_->stripLength()/2.));
174 const float rSqrtR = rollRadius *
sqrt(rollRadius);
177 double averageNeutralNoiseRatePerRoll = 0.;
178 double averageNoiseElectronRatePerRoll = 0.;
179 double averageNoiseRatePerRoll = 0.;
180 if (me0Id.station() != 1)
182 throw cms::Exception(
"Geometry") <<
"ME0SimpleModel::simulateNoise() - this ME0 id is from station 1, which cannot happen: " <<roll->
id() <<
"\n";
190 averageNoiseRatePerRoll = averageNeutralNoiseRatePerRoll + averageNoiseElectronRatePerRoll;
198 for(
int j = 0; j < nstrips; ++j)
200 int randPoissonQ = CLHEP::RandPoissonQ::shoot(engine, aveIntrinsicNoisePerStrip);
202 for (
int k = 0;
k < randPoissonQ;
k++ )
204 const int time_hit(static_cast<int>(CLHEP::RandFlat::shoot(engine, nBxing)) +
minBunch_);
211 const double averageNoise(averageNoiseRatePerRoll * nBxing *
bxwidth_ * trArea * 1.0
e-9);
212 int randPoissonQ = CLHEP::RandPoissonQ::shoot(engine, averageNoise);
214 for (
int i = 0;
i < randPoissonQ; ++
i)
216 const int centralStrip(static_cast<int> (CLHEP::RandFlat::shoot(engine, 1, nstrips)));
217 const int time_hit(static_cast<int>(CLHEP::RandFlat::shoot(engine, nBxing)) +
minBunch_);
220 std::vector < std::pair<int, int> > cluster;
221 cluster.emplace_back(centralStrip, time_hit);
222 int clusterSize((CLHEP::RandFlat::shoot(engine)) <= 0.53 ? 1 : 2);
223 if (clusterSize == 2)
225 if(CLHEP::RandFlat::shoot(engine) < 0.5)
228 cluster.emplace_back(centralStrip - 1, time_hit);
232 if (CLHEP::RandFlat::shoot(engine) <
averageEfficiency_ && (centralStrip + 1 <= nstrips))
233 cluster.emplace_back(centralStrip + 1, time_hit);
236 for (
const auto& digi : cluster)
243 strips_.emplace(centralStrip, time_hit);
250 const PSimHit*
simHit,
const int bx, CLHEP::HepRandomEngine* engine)
254 const int nstrips(roll->
nstrips());
255 int centralStrip = 0;
256 if (!(topology.
channel(hit_position) + 1 > nstrips))
257 centralStrip = topology.
channel(hit_position) + 1;
259 centralStrip = topology.
channel(hit_position);
262 double deltaX = pointSimHit.
x() - pointDigiHit.
x();
265 std::vector < std::pair<int, int> > cluster;
267 cluster.emplace_back(centralStrip, bx);
270 int clusterSize((CLHEP::RandFlat::shoot(engine)) <= 0.53 ? 1 : 2);
271 if (clusterSize == 2)
276 cluster.emplace_back(centralStrip - 1, bx);
280 if (CLHEP::RandFlat::shoot(engine) <
averageEfficiency_ && (centralStrip + 1 <= nstrips))
281 cluster.emplace_back(centralStrip + 1, bx);
const StripTopology & specificTopology() const
double averageShapingTime_
ME0SimpleModel(const edm::ParameterSet &)
edm::DetSet< ME0DigiSimLink > ME0DigiSimLinks
CaloTopology const * topology(0)
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
double averageEfficiency_
bool simulateElectronBkg_
StripDigiSimLinks stripDigiSimLinks_
std::set< std::pair< int, int > > strips_
LocalPoint centreOfStrip(int strip) const
const ME0EtaPartition * etaPartition(ME0DetId id) const
Return a etaPartition given its id.
int getSimHitBx(const PSimHit *, CLHEP::HepRandomEngine *)
const ME0Geometry * geometry_
uint32_t rawId() const
get the raw id
float timeOfFlight() const
Local3DPoint localPosition() const
Abs< T >::type abs(const T &t)
double referenceInstLumi_
virtual int channel(const LocalPoint &p) const =0
int nstrips() const
Return the chamber this roll belongs to.
ME0DigiSimLinks theME0DigiSimLinks_
double signalPropagationSpeed_
void simulateNoise(const ME0EtaPartition *, CLHEP::HepRandomEngine *) override
std::vector< std::pair< int, int > > simulateClustering(const ME0EtaPartition *, const PSimHit *, const int, CLHEP::HepRandomEngine *) override
~ME0SimpleModel() override
bool simulateIntrinsicNoise_
DetectorHitMap detectorHitMap_
edm::DetSet< StripDigiSimLink > StripDigiSimLinks
std::vector< PSimHit > PSimHitContainer
void simulateSignal(const ME0EtaPartition *, const edm::PSimHitContainer &, CLHEP::HepRandomEngine *) override
const Topology & topology() const override
unsigned int detUnitId() const