17 double ndep=0, ndep2=0, maxdep=0;
18 double nstr=0, nstr2=0;
19 double ncv=0, nval=0, nval2=0, maxv=0;
21 void dep(
double d) { ncall++; ndep+=
d; ndep2+=d*
d;maxdep=
std::max(d,maxdep);}
22 void str(
double d) { nstr+=
d; nstr2+=d*
d;}
23 void val(
double d) { ncv++; nval+=
d; nval2+=d*
d; maxv=
std::max(d,maxv);}
24 void zero() {
dzero++;}
27 std::cout <<
"deposits " << ncall <<
" " << maxdep <<
" " << ndep/ncall <<
" " <<
std::sqrt(ndep2*ncall -ndep*ndep)/ncall << std::endl;
29 std::cout <<
"strips " << nstr/ndep <<
" " <<
std::sqrt(nstr2*ndep -nstr*nstr)/ndep << std::endl;
30 std::cout <<
"vaules " << ncv <<
" " << maxv <<
" " << nval/ncv <<
" " <<
std::sqrt(nval2*ncv -nval*nval)/ncv << std::endl;
42 const std::string type[Ntypes] = {
"IB1",
"IB2",
"OB1",
"OB2",
"W1a",
"W2a",
"W3a",
"W1b",
"W2b",
"W3b",
"W4",
"W5",
"W6",
"W7"};
43 enum { indexOfIB1=0, indexOfIB2=1, indexOfOB1=2, indexOfOB2=3, indexOfW1a=4, indexOfW1b=7};
46 std::vector<std::vector<float> >
48 std::vector<std::vector<float> > signalCoupling;
49 signalCoupling.reserve(nTypes);
51 for(
int i=0;
i<nTypes; ++
i) {
52 auto dc = conf.
getParameter<std::vector<double> >(
"CouplingConstant"+mode+typeArray[
i]);
53 signalCoupling.emplace_back(dc.begin(),dc.end());
55 return signalCoupling;
73 chargeDeposited(
size_t strip,
size_t Nstrips,
double amplitude,
double chargeSpread,
double chargePosition) {
74 double integralUpToStrip = (strip == 0) ? 0. : (
approx_erf( (strip-chargePosition)/chargeSpread/1.41421356237309515 ) );
75 double integralUpToNext = (strip+1 == Nstrips) ? 1. : (
approx_erf( (strip+1-chargePosition)/chargeSpread/1.41421356237309515 ) );
77 return 0.5 * (integralUpToNext - integralUpToStrip) * amplitude;
85 : signalCoupling(fillSignalCoupling(conf, Ntypes, type)), Nsigma(3.), geVperElectron(g) {
92 std::vector<float>& localAmplitudes,
93 size_t& recordMinAffectedStrip,
94 size_t& recordMaxAffectedStrip,
98 induceVector(collection_points, det, localAmplitudes, recordMinAffectedStrip, recordMaxAffectedStrip, tTopo);
140 std::vector<float>& localAmplitudes,
141 size_t& recordMinAffectedStrip,
142 size_t& recordMaxAffectedStrip,
146 auto const & coupling = signalCoupling[typeOf(det,tTopo)];
148 const int Nstrips = topology.
nstrips();
150 if (Nstrips == 0)
return;
152 const int NP = collection_points.size();
158 for (
int ip=0; ip<NP; ip+=
MaxN) {
163 float chargePosition[
N];
164 float chargeSpread[
N];
170 for (
int i=0;
i!=
N;++
i) {
172 if (0==collection_points[
j].amplitude())
count.zero();
174 chargeSpread[
i]= collection_points[
j].sigma() / topology.
localPitch(collection_points[
j].
position());
179 for (
int i=0;
i!=
N;++
i) {
180 fromStrip[
i] =
std::max( 0,
int(std::floor( chargePosition[
i] -
Nsigma*chargeSpread[
i])) );
181 nStrip[
i] =
std::min( Nstrips,
int(std::ceil( chargePosition[i] +
Nsigma*chargeSpread[i])) ) - fromStrip[
i];
184 for (
int i=0;
i!=
N;++
i) tot += nStrip[
i];
191 for (
int i=0;
i!=
N;++
i) {
193 auto pos =
delta*(float(fromStrip[
i])-chargePosition[
i]);
194 for (
int j=0;
j<=nStrip[
i]; ++
j)
195 value[kk++] = pos+
float(
j)*
delta;
200 for (
int k=0;
k!=tot; ++
k)
205 for (
int i=0;
i!=
N;++
i) {
206 if (0 == fromStrip[
i]) value[
kk]=0;
208 if (Nstrips == fromStrip[i]+nStrip[i]) value[
kk]=1.f;
214 for (
int k=0;k!=tot-1; ++
k)
215 value[k]-=value[k+1];
218 float charge[Nstrips];
for (
int i=0;
i!=Nstrips; ++
i) charge[
i]=0;
220 for (
int i=0;
i!=
N;++
i){
221 for (
int j=0;
j!=nStrip[
i]; ++
j)
222 charge[fromStrip[
i]+
j]-= amplitude[
i]*value[kk++];
229 int minA=recordMinAffectedStrip, maxA=recordMaxAffectedStrip;
230 int sc = coupling.size();
231 for (
int i=0;
i!=Nstrips; ++
i) {
233 if (0==charge[
i])
continue;
234 auto affectedFromStrip =
std::max( 0, strip - sc + 1);
235 auto affectedUntilStrip =
std::min(Nstrips, strip + sc);
236 for (
auto affectedStrip=affectedFromStrip; affectedStrip < affectedUntilStrip; ++affectedStrip)
237 localAmplitudes[affectedStrip] += charge[i] * coupling[
std::abs(affectedStrip - strip)] ;
239 if( affectedFromStrip < minA ) minA = affectedFromStrip;
240 if( affectedUntilStrip > maxA ) maxA = affectedUntilStrip;
242 recordMinAffectedStrip=minA;
243 recordMaxAffectedStrip=maxA;
252 std::vector<float>& localAmplitudes,
253 size_t& recordMinAffectedStrip,
254 size_t& recordMaxAffectedStrip,
258 auto const & coupling = signalCoupling[typeOf(det,tTopo)];
260 size_t Nstrips = topology.
nstrips();
262 if (!collection_points.empty())
count.dep(collection_points.size());
264 for (
auto signalpoint = collection_points.begin(); signalpoint != collection_points.end(); signalpoint++ ) {
267 double chargePosition = topology.
strip(signalpoint->position());
268 double chargeSpread = signalpoint->sigma() / topology.
localPitch(signalpoint->position());
270 size_t fromStrip = size_t(
std::max( 0,
int(std::floor( chargePosition -
Nsigma*chargeSpread))));
271 size_t untilStrip = size_t(
std::min( Nstrips,
size_t(std::ceil( chargePosition +
Nsigma*chargeSpread) )));
274 for (
size_t strip = fromStrip; strip < untilStrip; strip++) {
276 double chargeDepositedOnStrip = chargeDeposited( strip, Nstrips, signalpoint->amplitude() /
geVperElectron, chargeSpread, chargePosition);
278 size_t affectedFromStrip = size_t(
std::max( 0,
int(strip - coupling.size() + 1)));
279 size_t affectedUntilStrip = size_t(
std::min( Nstrips, strip + coupling.size()) );
280 for (
size_t affectedStrip = affectedFromStrip; affectedStrip < affectedUntilStrip; affectedStrip++) {
281 localAmplitudes.at( affectedStrip ) += chargeDepositedOnStrip * coupling.at(
abs( affectedStrip - strip )) ;
284 if( affectedFromStrip < recordMinAffectedStrip ) recordMinAffectedStrip = affectedFromStrip;
285 if( affectedUntilStrip > recordMaxAffectedStrip ) recordMaxAffectedStrip = affectedUntilStrip;
T getParameter(std::string const &) const
virtual int nstrips() const =0
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
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.
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
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 float strip(const LocalPoint &) const =0
float approx_erf(float x)
virtual float localPitch(const LocalPoint &) const =0
virtual StripGeomDetType const & specificType() const
Abs< T >::type abs(const T &t)
DetId geographicalId() const
The label of this GeomDet.
const float geVperElectron
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