test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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
 
 SiTrivialInduceChargeOnStrips (const edm::ParameterSet &conf, double g)
 
virtual ~SiTrivialInduceChargeOnStrips ()
 
- 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 90 of file SiTrivialInduceChargeOnStrips.cc.

91  : signalCoupling(fillSignalCoupling(conf, Ntypes, type)), Nsigma(3.), geVperElectron(g) {
92 }
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
virtual SiTrivialInduceChargeOnStrips::~SiTrivialInduceChargeOnStrips ( )
inlinevirtual

Definition at line 12 of file SiTrivialInduceChargeOnStrips.h.

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
virtual

Implements SiInduceChargeOnStrips.

Definition at line 96 of file SiTrivialInduceChargeOnStrips.cc.

References induceVector().

101  {
102 
103 
104  induceVector(collection_points, det, localAmplitudes, recordMinAffectedStrip, recordMaxAffectedStrip, tTopo);
105 
106  /*
107  auto ominA=recordMinAffectedStrip, omaxA=recordMaxAffectedStrip;
108  std::vector<float> oampl(localAmplitudes);
109  induceOriginal(collection_points, det, oampl, ominA, omaxA, tTopo);
110 
111  // std::cout << "orig " << ominA << " " << omaxA << " ";
112  //for (auto a : oampl) std::cout << a << ",";
113  //std::cout << std::endl;
114 
115  auto minA=recordMinAffectedStrip, maxA=recordMaxAffectedStrip;
116  std::vector<float> ampl(localAmplitudes);
117  induceVector(collection_points, det, ampl, minA, maxA, tTopo);
118 
119  // std::cout << "vect " << minA << " " << maxA << " ";
120  //for (auto a : ampl) std::cout << a << ",";
121  //std::cout << std::endl;
122 
123  float diff=0;
124  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);}
125  if (diff> 1.e-4) {
126  std::cout << diff << std::endl;
127  std::cout << "orig " << ominA << " " << omaxA << " ";
128 // for (auto a : oampl) std::cout << a << ",";
129  std::cout << std::endl;
130  std::cout << "vect " << minA << " " << maxA << " ";
131 // for (auto a : ampl) std::cout << a << ",";
132  std::cout << std::endl;
133  }
134 
135  localAmplitudes.swap(ampl);
136  recordMinAffectedStrip=minA;
137  recordMaxAffectedStrip=maxA;
138  */
139 
140 }
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 261 of file SiTrivialInduceChargeOnStrips.cc.

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

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

References funct::abs(), approx_erf(), assert(), RecoTauCleanerPlugins::charge, constexpr, KineDebug3::count(), delta, f, geVperElectron, i, j, relval_2017::k, GetRecoTauVFromDQM_MC_cff::kk, StripTopology::localPitch(), bookConverter::max, HLT_25ns10e33_v2_cff::MaxN, min(), N, Nsigma, StripTopology::nstrips(), position, StripGeomDetUnit::specificTopology(), mathSSE::sqrt(), StripTopology::strip(), ecaldqm::topology(), and relativeConstraints::value.

Referenced by induce().

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