CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
SiTrivialInduceChargeOnStrips Class Reference

#include <SiTrivialInduceChargeOnStrips.h>

Inheritance diagram for SiTrivialInduceChargeOnStrips:
SiInduceChargeOnStrips

Public Member Functions

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
 
 SiTrivialInduceChargeOnStrips (const edm::ParameterSet &conf, double g)
 
 ~SiTrivialInduceChargeOnStrips () override
 
- Public Member Functions inherited from SiInduceChargeOnStrips
virtual ~SiInduceChargeOnStrips ()
 

Private Member Functions

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
 
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
 

Private Attributes

const float geVperElectron
 
const float Nsigma
 
const std::vector< std::vector< float > > signalCoupling
 

Detailed Description

Definition at line 9 of file SiTrivialInduceChargeOnStrips.h.

Constructor & Destructor Documentation

SiTrivialInduceChargeOnStrips::SiTrivialInduceChargeOnStrips ( const edm::ParameterSet conf,
double  g 
)

Definition at line 93 of file SiTrivialInduceChargeOnStrips.cc.

References induce().

94  : signalCoupling(fillSignalCoupling(conf, Ntypes, type)), Nsigma(3.), geVperElectron(g) {
95 }
type
Definition: HCALResponse.h:21
const std::vector< std::vector< float > > signalCoupling
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
Definition: Activities.doc:4
SiTrivialInduceChargeOnStrips::~SiTrivialInduceChargeOnStrips ( )
inlineoverride

Definition at line 12 of file SiTrivialInduceChargeOnStrips.h.

References induce(), induceOriginal(), and induceVector().

12 {}

Member Function Documentation

void SiTrivialInduceChargeOnStrips::induce ( const SiChargeCollectionDrifter::collection_type collection_points,
const StripGeomDetUnit det,
std::vector< float > &  localAmplitudes,
size_t &  recordMinAffectedStrip,
size_t &  recordMaxAffectedStrip,
const TrackerTopology tTopo 
) const
overridevirtual

Implements SiInduceChargeOnStrips.

Definition at line 99 of file SiTrivialInduceChargeOnStrips.cc.

References induceVector().

Referenced by SiTrivialInduceChargeOnStrips(), and ~SiTrivialInduceChargeOnStrips().

104  {
105 
106 
107  induceVector(collection_points, det, localAmplitudes, recordMinAffectedStrip, recordMaxAffectedStrip, tTopo);
108 
109  /*
110  auto ominA=recordMinAffectedStrip, omaxA=recordMaxAffectedStrip;
111  std::vector<float> oampl(localAmplitudes);
112  induceOriginal(collection_points, det, oampl, ominA, omaxA, tTopo);
113 
114  // std::cout << "orig " << ominA << " " << omaxA << " ";
115  //for (auto a : oampl) std::cout << a << ",";
116  //std::cout << std::endl;
117 
118  auto minA=recordMinAffectedStrip, maxA=recordMaxAffectedStrip;
119  std::vector<float> ampl(localAmplitudes);
120  induceVector(collection_points, det, ampl, minA, maxA, tTopo);
121 
122  // std::cout << "vect " << minA << " " << maxA << " ";
123  //for (auto a : ampl) std::cout << a << ",";
124  //std::cout << std::endl;
125 
126  float diff=0;
127  for (size_t i=0; i!=ampl.size(); ++i) { diff = std::max(diff,ampl[i]>0 ? std::abs(ampl[i]-oampl[i])/ampl[i] : 0);}
128  if (diff> 1.e-4) {
129  std::cout << diff << std::endl;
130  std::cout << "orig " << ominA << " " << omaxA << " ";
131 // for (auto a : oampl) std::cout << a << ",";
132  std::cout << std::endl;
133  std::cout << "vect " << minA << " " << maxA << " ";
134 // for (auto a : ampl) std::cout << a << ",";
135  std::cout << std::endl;
136  }
137 
138  localAmplitudes.swap(ampl);
139  recordMinAffectedStrip=minA;
140  recordMaxAffectedStrip=maxA;
141  */
142 
143 }
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
void SiTrivialInduceChargeOnStrips::induceOriginal ( const SiChargeCollectionDrifter::collection_type collection_points,
const StripGeomDetUnit det,
std::vector< float > &  localAmplitudes,
size_t &  recordMinAffectedStrip,
size_t &  recordMaxAffectedStrip,
const TrackerTopology tTopo 
) const
private

Definition at line 264 of file SiTrivialInduceChargeOnStrips.cc.

References funct::abs(), geVperElectron, StripTopology::localPitch(), SiStripPI::max, min(), Nsigma, StripTopology::nstrips(), StripGeomDetUnit::specificTopology(), StripTopology::strip(), and ecaldqm::topology().

Referenced by induceVector(), and ~SiTrivialInduceChargeOnStrips().

269  {
270 
271 
272  auto const & coupling = signalCoupling[typeOf(det,tTopo)];
273  const StripTopology& topology = dynamic_cast<const StripTopology&>(det.specificTopology());
274  size_t Nstrips = topology.nstrips();
275 
276  if (!collection_points.empty()) count.dep(collection_points.size());
277 
278  for (auto signalpoint = collection_points.begin(); signalpoint != collection_points.end(); signalpoint++ ) {
279 
280  //In strip coordinates:
281  double chargePosition = topology.strip(signalpoint->position());
282  double chargeSpread = signalpoint->sigma() / topology.localPitch(signalpoint->position());
283 
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) )));
286 
287  count.str(std::max(0,int(untilStrip)-int(fromStrip)));
288  for (size_t strip = fromStrip; strip < untilStrip; strip++) {
289 
290  double chargeDepositedOnStrip = chargeDeposited( strip, Nstrips, signalpoint->amplitude() / geVperElectron, chargeSpread, chargePosition);
291 
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 )) ;
296  }
297 
298  if( affectedFromStrip < recordMinAffectedStrip ) recordMinAffectedStrip = affectedFromStrip;
299  if( affectedUntilStrip > recordMaxAffectedStrip ) recordMaxAffectedStrip = affectedUntilStrip;
300  }
301  }
302 
303 }
CaloTopology const * topology(0)
virtual float strip(const LocalPoint &) const =0
const std::vector< std::vector< float > > signalCoupling
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
T min(T a, T b)
Definition: MathUtil.h:58
virtual int nstrips() const =0
virtual float localPitch(const LocalPoint &) const =0
void SiTrivialInduceChargeOnStrips::induceVector ( const SiChargeCollectionDrifter::collection_type collection_points,
const StripGeomDetUnit det,
std::vector< float > &  localAmplitudes,
size_t &  recordMinAffectedStrip,
size_t &  recordMaxAffectedStrip,
const TrackerTopology tTopo 
) const
private

include last strip

do crosstalk... (can be done better, most probably not worth)

Definition at line 147 of file SiTrivialInduceChargeOnStrips.cc.

References funct::abs(), CustomPhysics_cfi::amplitude, approx_erf(), ALCARECOTkAlJpsiMuMu_cff::charge, constexpr, delta, f, objects.autophobj::float, geVperElectron, mps_fire::i, induceOriginal(), gen::k, GetRecoTauVFromDQM_MC_cff::kk, StripTopology::localPitch(), SiStripPI::max, PFRecoTauDiscriminationByNProngs_cfi::MaxN, min(), N, Nsigma, StripTopology::nstrips(), position, SimDataFormats::CaloAnalysis::sc, StripGeomDetUnit::specificTopology(), mathSSE::sqrt(), StripTopology::strip(), and ecaldqm::topology().

Referenced by induce(), and ~SiTrivialInduceChargeOnStrips().

152  {
153 
154 
155  auto const & coupling = signalCoupling[typeOf(det,tTopo)];
156  const StripTopology& topology = dynamic_cast<const StripTopology&>(det.specificTopology());
157  const int Nstrips = topology.nstrips();
158 
159  if (Nstrips == 0) return;
160 
161  const int NP = collection_points.size();
162  if(0==NP) return;
163 
164  constexpr int MaxN = 512;
165  // if NP too large split...
166 
167  for (int ip=0; ip<NP; ip+=MaxN) {
168  auto N = std::min(NP-ip,MaxN);
169 
170  count.dep(N);
171  float amplitude[N];
172  float chargePosition[N];
173  float chargeSpread[N];
174  int fromStrip[N];
175  int nStrip[N];
176 
177  // load not vectorize
178  //In strip coordinates:
179  for (int i=0; i!=N;++i) {
180  auto j = ip+i;
181  if (0==collection_points[j].amplitude()) count.zero();
182  chargePosition[i]=topology.strip(collection_points[j].position());
183  chargeSpread[i]= collection_points[j].sigma() / topology.localPitch(collection_points[j].position());
184  amplitude[i]=0.5f*collection_points[j].amplitude() / geVperElectron;
185  }
186 
187  // this vectorize
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];
191  }
192  int tot=0;
193  for (int i=0; i!=N;++i) tot += nStrip[i];
194  tot+=N; // add last strip
195  count.val(tot);
196  float value[tot];
197 
198  // assign relative position (lower bound of strip) in value;
199  int kk=0;
200  for (int i=0; i!=N;++i) {
201  auto delta = 1.f/(std::sqrt(2.f)*chargeSpread[i]);
202  auto pos = delta*(float(fromStrip[i])-chargePosition[i]);
203 
204  // VI: before value[0] was not defined and value[tot] was filled
205  // to fix this the loop below was changed
206  for (int j=0;j<=nStrip[i]; ++j) {
207  value[kk] = pos+float(j)*delta;
208  ++kk;
209  }
210  }
211  assert(kk==tot);
212 
213  // main loop fully vectorized
214  for (int k=0;k!=tot; ++k)
215  value[k] = approx_erf(value[k]);
216 
217  // saturate 0 & NStrips strip to 0 and 1???
218  kk=0;
219  for (int i=0; i!=N;++i) {
220  if (0 == fromStrip[i]) value[kk]=0;
221  kk+=nStrip[i];
222  if (Nstrips == fromStrip[i]+nStrip[i]) value[kk]=1.f;
223  ++kk;
224  }
225  assert(kk==tot);
226 
227  // compute integral over strip (lower bound becomes the value)
228  for (int k=0;k!=tot-1; ++k)
229  value[k]-=value[k+1]; // this is negative!
230 
231 
232  float charge[Nstrips]; for (int i=0;i!=Nstrips; ++i) charge[i]=0;
233  kk=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++];
237  ++kk; // skip last "strip"
238  }
239  assert(kk==tot);
240 
241 
243  int minA=recordMinAffectedStrip, maxA=recordMaxAffectedStrip;
244  int sc = coupling.size();
245  for (int i=0;i!=Nstrips; ++i) {
246  int strip = 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)] ;
252 
253  if( affectedFromStrip < minA ) minA = affectedFromStrip;
254  if( affectedUntilStrip > maxA ) maxA = affectedUntilStrip;
255  }
256  recordMinAffectedStrip=minA;
257  recordMaxAffectedStrip=maxA;
258  } // end loop ip
259 
260 }
dbl * delta
Definition: mlp_gen.cc:36
CaloTopology const * topology(0)
virtual float strip(const LocalPoint &) const =0
const std::vector< std::vector< float > > signalCoupling
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
#define constexpr
float approx_erf(float x)
Definition: approx_erf.h:6
T sqrt(T t)
Definition: SSEVec.h:18
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
Definition: value.py:1
T min(T a, T b)
Definition: MathUtil.h:58
int k[5][pyjets_maxn]
#define N
Definition: blowfish.cc:9
virtual int nstrips() const =0
virtual float localPitch(const LocalPoint &) const =0
static int position[264][3]
Definition: ReadPGInfo.cc:509

Member Data Documentation

const float SiTrivialInduceChargeOnStrips::geVperElectron
private

Definition at line 41 of file SiTrivialInduceChargeOnStrips.h.

Referenced by induceOriginal(), and induceVector().

const float SiTrivialInduceChargeOnStrips::Nsigma
private

Definition at line 40 of file SiTrivialInduceChargeOnStrips.h.

Referenced by induceOriginal(), and induceVector().

const std::vector<std::vector<float> > SiTrivialInduceChargeOnStrips::signalCoupling
private

Definition at line 38 of file SiTrivialInduceChargeOnStrips.h.