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;
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) {
61 auto dc = conf.
getParameter<std::vector<double> >(
"CouplingConstant"+mode+typeArray[
i]);
62 signalCoupling.emplace_back(dc.begin(),dc.end());
64 return signalCoupling;
82 chargeDeposited(
size_t strip,
size_t Nstrips,
double amplitude,
double chargeSpread,
double chargePosition) {
83 double integralUpToStrip = (strip == 0) ? 0. : (
approx_erf( (strip-chargePosition)/chargeSpread/1.41421356237309515 ) );
84 double integralUpToNext = (strip+1 == Nstrips) ? 1. : (
approx_erf( (strip+1-chargePosition)/chargeSpread/1.41421356237309515 ) );
86 return 0.5 * (integralUpToNext - integralUpToStrip) * amplitude;
94 : signalCoupling(fillSignalCoupling(conf, Ntypes, type)), Nsigma(3.), geVperElectron(g) {
101 std::vector<float>& localAmplitudes,
102 size_t& recordMinAffectedStrip,
103 size_t& recordMaxAffectedStrip,
107 induceVector(collection_points, det, localAmplitudes, recordMinAffectedStrip, recordMaxAffectedStrip, tTopo);
149 std::vector<float>& localAmplitudes,
150 size_t& recordMinAffectedStrip,
151 size_t& recordMaxAffectedStrip,
155 auto const & coupling = signalCoupling[typeOf(det,tTopo)];
157 const int Nstrips = topology.
nstrips();
159 if (Nstrips == 0)
return;
161 const int NP = collection_points.size();
167 for (
int ip=0; ip<NP; ip+=
MaxN) {
172 float chargePosition[
N];
173 float chargeSpread[
N];
179 for (
int i=0;
i!=
N;++
i) {
181 if (0==collection_points[
j].amplitude()) count.zero();
183 chargeSpread[
i]= collection_points[
j].sigma() / topology.
localPitch(collection_points[
j].
position());
188 for (
int i=0;
i!=
N;++
i) {
189 fromStrip[
i] =
std::max( 0,
int(std::floor( chargePosition[
i] -
Nsigma*chargeSpread[
i])) );
190 nStrip[
i] =
std::min( Nstrips,
int(std::ceil( chargePosition[i] +
Nsigma*chargeSpread[i])) ) - fromStrip[
i];
193 for (
int i=0;
i!=
N;++
i) tot += nStrip[
i];
200 for (
int i=0;
i!=
N;++
i) {
202 auto pos =
delta*(float(fromStrip[
i])-chargePosition[
i]);
206 for (
int j=0;
j<=nStrip[
i]; ++
j) {
214 for (
int k=0;
k!=tot; ++
k)
219 for (
int i=0;
i!=
N;++
i) {
220 if (0 == fromStrip[
i]) value[
kk]=0;
222 if (Nstrips == fromStrip[i]+nStrip[i]) value[
kk]=1.f;
228 for (
int k=0;k!=tot-1; ++
k)
229 value[k]-=value[k+1];
232 float charge[Nstrips];
for (
int i=0;
i!=Nstrips; ++
i) charge[
i]=0;
234 for (
int i=0;
i!=
N;++
i){
235 for (
int j=0;
j!=nStrip[
i]; ++
j)
236 charge[fromStrip[
i]+
j]-= amplitude[
i]*value[kk++];
243 int minA=recordMinAffectedStrip, maxA=recordMaxAffectedStrip;
244 int sc = coupling.size();
245 for (
int i=0;
i!=Nstrips; ++
i) {
247 if (0==charge[
i])
continue;
248 auto affectedFromStrip =
std::max( 0, strip - sc + 1);
249 auto affectedUntilStrip =
std::min(Nstrips, strip + sc);
250 for (
auto affectedStrip=affectedFromStrip; affectedStrip < affectedUntilStrip; ++affectedStrip)
251 localAmplitudes[affectedStrip] += charge[i] * coupling[
std::abs(affectedStrip - strip)] ;
253 if( affectedFromStrip < minA ) minA = affectedFromStrip;
254 if( affectedUntilStrip > maxA ) maxA = affectedUntilStrip;
256 recordMinAffectedStrip=minA;
257 recordMaxAffectedStrip=maxA;
266 std::vector<float>& localAmplitudes,
267 size_t& recordMinAffectedStrip,
268 size_t& recordMaxAffectedStrip,
272 auto const & coupling = signalCoupling[typeOf(det,tTopo)];
274 size_t Nstrips = topology.
nstrips();
276 if (!collection_points.empty()) count.dep(collection_points.size());
278 for (
auto signalpoint = collection_points.begin(); signalpoint != collection_points.end(); signalpoint++ ) {
281 double chargePosition = topology.
strip(signalpoint->position());
282 double chargeSpread = signalpoint->sigma() / topology.
localPitch(signalpoint->position());
284 size_t fromStrip = size_t(
std::max( 0,
int(std::floor( chargePosition -
Nsigma*chargeSpread))));
285 size_t untilStrip = size_t(
std::min( Nstrips,
size_t(std::ceil( chargePosition +
Nsigma*chargeSpread) )));
287 count.str(
std::max(0,
int(untilStrip)-
int(fromStrip)));
288 for (
size_t strip = fromStrip; strip < untilStrip; strip++) {
290 double chargeDepositedOnStrip = chargeDeposited( strip, Nstrips, signalpoint->amplitude() /
geVperElectron, chargeSpread, chargePosition);
292 size_t affectedFromStrip = size_t(
std::max( 0,
int(strip - coupling.size() + 1)));
293 size_t affectedUntilStrip = size_t(
std::min( Nstrips, strip + coupling.size()) );
294 for (
size_t affectedStrip = affectedFromStrip; affectedStrip < affectedUntilStrip; affectedStrip++) {
295 localAmplitudes.at( affectedStrip ) += chargeDepositedOnStrip * coupling.at((
size_t)
std::abs( (
int)affectedStrip - (
int)strip )) ;
298 if( affectedFromStrip < recordMinAffectedStrip ) recordMinAffectedStrip = affectedFromStrip;
299 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