20 double ndep=0, ndep2=0, maxdep=0;
21 double nstr=0, nstr2=0;
22 double ncv=0, nval=0, nval2=0, maxv=0;
24 void dep(
double d) { ncall++; ndep+=
d; ndep2+=d*
d;maxdep=
std::max(d,maxdep);}
25 void str(
double d) { nstr+=
d; nstr2+=d*
d;}
26 void val(
double d) { ncv++; nval+=
d; nval2+=d*
d; maxv=
std::max(d,maxv);}
27 void zero() { dzero++;}
29 std::cout <<
"deposits " << ncall <<
" " << maxdep <<
" " << ndep/ncall <<
" " <<
std::sqrt(ndep2*ncall -ndep*ndep)/ncall << std::endl;
30 std::cout <<
"zeros " << dzero << std::endl;
31 std::cout <<
"strips " << nstr/ndep <<
" " <<
std::sqrt(nstr2*ndep -nstr*nstr)/ndep << std::endl;
32 std::cout <<
"vaules " << ncv <<
" " << maxv <<
" " << nval/ncv <<
" " <<
std::sqrt(nval2*ncv -nval*nval)/ncv << std::endl;
37 void dep(
double)
const {}
38 void str(
double)
const {}
39 void val(
double)
const {}
51 const std::string type[Ntypes] = {
"IB1",
"IB2",
"OB1",
"OB2",
"W1a",
"W2a",
"W3a",
"W1b",
"W2b",
"W3b",
"W4",
"W5",
"W6",
"W7"};
52 enum { indexOfIB1=0, indexOfIB2=1, indexOfOB1=2, indexOfOB2=3, indexOfW1a=4, indexOfW1b=7};
55 std::vector<std::vector<float> >
57 std::vector<std::vector<float> > signalCoupling;
58 signalCoupling.reserve(nTypes);
60 for(
int i=0;
i<nTypes; ++
i) {
63 if( typeArray[
i].
find(
"W") != std::string::npos && mode ==
"Dec" )
64 version = conf.
getParameter<
bool>(
"CouplingConstantsRunIIDecW") ?
"RunII" :
"";
65 else if( typeArray[
i].
find(
"B") != std::string::npos && mode ==
"Dec")
66 version = conf.
getParameter<
bool>(
"CouplingConstantsRunIIDecB") ?
"RunII" :
"";
68 auto dc = conf.
getParameter<std::vector<double> >(
"CouplingConstant"+version+mode+typeArray[
i]);
69 signalCoupling.emplace_back(dc.begin(),dc.end());
71 return signalCoupling;
89 chargeDeposited(
size_t strip,
size_t Nstrips,
double amplitude,
double chargeSpread,
double chargePosition) {
90 double integralUpToStrip = (strip == 0) ? 0. : (
approx_erf( (strip-chargePosition)/chargeSpread/1.41421356237309515 ) );
91 double integralUpToNext = (strip+1 == Nstrips) ? 1. : (
approx_erf( (strip+1-chargePosition)/chargeSpread/1.41421356237309515 ) );
93 return 0.5 * (integralUpToNext - integralUpToStrip) * amplitude;
101 : signalCoupling(fillSignalCoupling(conf, Ntypes, type)), Nsigma(3.), geVperElectron(g) {
108 std::vector<float>& localAmplitudes,
109 size_t& recordMinAffectedStrip,
110 size_t& recordMaxAffectedStrip,
114 induceVector(collection_points, det, localAmplitudes, recordMinAffectedStrip, recordMaxAffectedStrip, tTopo);
156 std::vector<float>& localAmplitudes,
157 size_t& recordMinAffectedStrip,
158 size_t& recordMaxAffectedStrip,
162 auto const & coupling = signalCoupling[typeOf(det,tTopo)];
164 const int Nstrips = topology.
nstrips();
166 if (Nstrips == 0)
return;
168 const int NP = collection_points.size();
174 for (
int ip=0; ip<NP; ip+=
MaxN) {
179 float chargePosition[
N];
180 float chargeSpread[
N];
186 for (
int i=0;
i!=
N;++
i) {
188 if (0==collection_points[j].
amplitude()) count.zero();
189 chargePosition[
i]=topology.
strip(collection_points[j].
position());
190 chargeSpread[
i]= collection_points[j].sigma() / topology.
localPitch(collection_points[j].
position());
195 for (
int i=0;
i!=
N;++
i) {
196 fromStrip[
i] =
std::max( 0,
int(std::floor( chargePosition[
i] -
Nsigma*chargeSpread[
i])) );
197 nStrip[
i] =
std::min( Nstrips,
int(std::ceil( chargePosition[i] +
Nsigma*chargeSpread[i])) ) - fromStrip[
i];
200 for (
int i=0;
i!=
N;++
i) tot += nStrip[
i];
207 for (
int i=0;
i!=
N;++
i) {
213 for (
int j=0;j<=nStrip[
i]; ++j) {
221 for (
int k=0;
k!=tot; ++
k)
226 for (
int i=0;
i!=
N;++
i) {
227 if (0 == fromStrip[
i]) value[
kk]=0;
229 if (Nstrips == fromStrip[i]+nStrip[i]) value[
kk]=1.f;
235 for (
int k=0;k!=tot-1; ++
k)
236 value[k]-=value[k+1];
239 float charge[Nstrips];
for (
int i=0;
i!=Nstrips; ++
i) charge[
i]=0;
241 for (
int i=0;
i!=
N;++
i){
242 for (
int j=0;j!=nStrip[
i]; ++j)
243 charge[fromStrip[
i]+j]-= amplitude[
i]*value[kk++];
250 int minA=recordMinAffectedStrip, maxA=recordMaxAffectedStrip;
251 int sc = coupling.size();
252 for (
int i=0;
i!=Nstrips; ++
i) {
254 if (0==charge[
i])
continue;
255 auto affectedFromStrip =
std::max( 0, strip - sc + 1);
256 auto affectedUntilStrip =
std::min(Nstrips, strip + sc);
257 for (
auto affectedStrip=affectedFromStrip; affectedStrip < affectedUntilStrip; ++affectedStrip)
258 localAmplitudes[affectedStrip] += charge[i] * coupling[
std::abs(affectedStrip - strip)] ;
260 if( affectedFromStrip < minA ) minA = affectedFromStrip;
261 if( affectedUntilStrip > maxA ) maxA = affectedUntilStrip;
263 recordMinAffectedStrip=minA;
264 recordMaxAffectedStrip=maxA;
273 std::vector<float>& localAmplitudes,
274 size_t& recordMinAffectedStrip,
275 size_t& recordMaxAffectedStrip,
279 auto const & coupling = signalCoupling[typeOf(det,tTopo)];
281 size_t Nstrips = topology.
nstrips();
283 if (!collection_points.empty()) count.dep(collection_points.size());
285 for (
auto signalpoint = collection_points.begin(); signalpoint != collection_points.end(); signalpoint++ ) {
288 double chargePosition = topology.
strip(signalpoint->position());
289 double chargeSpread = signalpoint->sigma() / topology.
localPitch(signalpoint->position());
291 size_t fromStrip = size_t(
std::max( 0,
int(std::floor( chargePosition -
Nsigma*chargeSpread))));
292 size_t untilStrip = size_t(
std::min( Nstrips,
size_t(std::ceil( chargePosition +
Nsigma*chargeSpread) )));
294 count.str(
std::max(0,
int(untilStrip)-
int(fromStrip)));
295 for (
size_t strip = fromStrip; strip < untilStrip; strip++) {
297 double chargeDepositedOnStrip = chargeDeposited( strip, Nstrips, signalpoint->amplitude() /
geVperElectron, chargeSpread, chargePosition);
299 size_t affectedFromStrip = size_t(
std::max( 0,
int(strip - coupling.size() + 1)));
300 size_t affectedUntilStrip = size_t(
std::min( Nstrips, strip + coupling.size()) );
301 for (
size_t affectedStrip = affectedFromStrip; affectedStrip < affectedUntilStrip; affectedStrip++) {
302 localAmplitudes.at( affectedStrip ) += chargeDepositedOnStrip * coupling.at((
size_t)
std::abs( (
int)affectedStrip - (
int)strip )) ;
305 if( affectedFromStrip < recordMinAffectedStrip ) recordMinAffectedStrip = affectedFromStrip;
306 if( affectedUntilStrip > recordMaxAffectedStrip ) recordMaxAffectedStrip = affectedUntilStrip;
T getParameter(std::string const &) const
unsigned int tibLayer(const DetId &id) const
unsigned int tidRing(const DetId &id) const
CaloTopology const * topology(0)
unsigned int tecRing(const DetId &id) const
ring id
virtual float strip(const LocalPoint &) const =0
std::vector< SignalPoint > collection_type
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
int dzero(double a, double b, double &x0, double &rv, double eps, int mxf, F func)
Private version of the exponential integral.
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
virtual StripGeomDetType const & specificType() const
Abs< T >::type abs(const T &t)
DetId geographicalId() const
The label of this GeomDet.
void induce(const SiChargeCollectionDrifter::collection_type &collection_points, const StripGeomDetUnit &det, std::vector< float > &localAmplitudes, size_t &recordMinAffectedStrip, size_t &recordMaxAffectedStrip, const TrackerTopology *tTopo) const override
const float geVperElectron
virtual int nstrips() const =0
constexpr float approx_erf(float x)
virtual float localPitch(const LocalPoint &) const =0
static int position[264][3]
SiTrivialInduceChargeOnStrips(const edm::ParameterSet &conf, double g)
void induceVector(const SiChargeCollectionDrifter::collection_type &collection_points, const StripGeomDetUnit &det, std::vector< float > &localAmplitudes, size_t &recordMinAffectedStrip, size_t &recordMaxAffectedStrip, const TrackerTopology *tTopo) const
SubDetector subDetector() const
unsigned int tobLayer(const DetId &id) const
void induceOriginal(const SiChargeCollectionDrifter::collection_type &collection_points, const StripGeomDetUnit &det, std::vector< float > &localAmplitudes, size_t &recordMinAffectedStrip, size_t &recordMaxAffectedStrip, const TrackerTopology *tTopo) const