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 84 of file SiTrivialInduceChargeOnStrips.cc.

85  : signalCoupling(fillSignalCoupling(conf, Ntypes, type)), Nsigma(3.), geVperElectron(g) {
86 }
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 90 of file SiTrivialInduceChargeOnStrips.cc.

References induceVector().

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

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

255  {
256 
257 
258  auto const & coupling = signalCoupling[typeOf(det,tTopo)];
259  const StripTopology& topology = dynamic_cast<const StripTopology&>(det.specificTopology());
260  size_t Nstrips = topology.nstrips();
261 
262  if (!collection_points.empty()) count.dep(collection_points.size());
263 
264  for (auto signalpoint = collection_points.begin(); signalpoint != collection_points.end(); signalpoint++ ) {
265 
266  //In strip coordinates:
267  double chargePosition = topology.strip(signalpoint->position());
268  double chargeSpread = signalpoint->sigma() / topology.localPitch(signalpoint->position());
269 
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) )));
272 
273  count.str(std::max(0,int(untilStrip)-int(fromStrip)));
274  for (size_t strip = fromStrip; strip < untilStrip; strip++) {
275 
276  double chargeDepositedOnStrip = chargeDeposited( strip, Nstrips, signalpoint->amplitude() / geVperElectron, chargeSpread, chargePosition);
277 
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 )) ;
282  }
283 
284  if( affectedFromStrip < recordMinAffectedStrip ) recordMinAffectedStrip = affectedFromStrip;
285  if( affectedUntilStrip > recordMaxAffectedStrip ) recordMaxAffectedStrip = affectedUntilStrip;
286  }
287  }
288 
289 }
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
const T & max(const T &a, const T &b)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
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 138 of file SiTrivialInduceChargeOnStrips.cc.

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

Referenced by induce().

143  {
144 
145 
146  auto const & coupling = signalCoupling[typeOf(det,tTopo)];
147  const StripTopology& topology = dynamic_cast<const StripTopology&>(det.specificTopology());
148  const int Nstrips = topology.nstrips();
149 
150  if (Nstrips == 0) return;
151 
152  const int NP = collection_points.size();
153  if(0==NP) return;
154 
155  constexpr int MaxN = 512;
156  // if NP too large split...
157 
158  for (int ip=0; ip<NP; ip+=MaxN) {
159  auto N = std::min(NP-ip,MaxN);
160 
161  count.dep(N);
162  float amplitude[N];
163  float chargePosition[N];
164  float chargeSpread[N];
165  int fromStrip[N];
166  int nStrip[N];
167 
168  // load not vectorize
169  //In strip coordinates:
170  for (int i=0; i!=N;++i) {
171  auto j = ip+i;
172  if (0==collection_points[j].amplitude()) count.zero();
173  chargePosition[i]=topology.strip(collection_points[j].position());
174  chargeSpread[i]= collection_points[j].sigma() / topology.localPitch(collection_points[j].position());
175  amplitude[i]=0.5f*collection_points[j].amplitude() / geVperElectron;
176  }
177 
178  // this vectorize
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];
182  }
183  int tot=0;
184  for (int i=0; i!=N;++i) tot += nStrip[i];
185  tot+=N; // add last strip
186  count.val(tot);
187  float value[tot];
188 
189  // assign relative position (lower bound of strip) in value;
190  int kk=0;
191  for (int i=0; i!=N;++i) {
192  auto delta = 1.f/(std::sqrt(2.f)*chargeSpread[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;
196  }
197  assert(kk==tot);
198 
199  // main loop fully vectorized
200  for (int k=0;k!=tot; ++k)
201  value[k] = approx_erf(value[k]);
202 
203  // saturate 0 & NStrips strip to 0 and 1???
204  kk=0;
205  for (int i=0; i!=N;++i) {
206  if (0 == fromStrip[i]) value[kk]=0;
207  kk+=nStrip[i];
208  if (Nstrips == fromStrip[i]+nStrip[i]) value[kk]=1.f;
209  ++kk;
210  }
211  assert(kk==tot);
212 
213  // compute integral over strip (lower bound becomes the value)
214  for (int k=0;k!=tot-1; ++k)
215  value[k]-=value[k+1]; // this is negative!
216 
217 
218  float charge[Nstrips]; for (int i=0;i!=Nstrips; ++i) charge[i]=0;
219  kk=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++];
223  ++kk; // skip last "strip"
224  }
225  assert(kk==tot);
226 
227 
229  int minA=recordMinAffectedStrip, maxA=recordMaxAffectedStrip;
230  int sc = coupling.size();
231  for (int i=0;i!=Nstrips; ++i) {
232  int strip = 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)] ;
238 
239  if( affectedFromStrip < minA ) minA = affectedFromStrip;
240  if( affectedUntilStrip > maxA ) maxA = affectedUntilStrip;
241  }
242  recordMinAffectedStrip=minA;
243  recordMaxAffectedStrip=maxA;
244  } // end loop ip
245 
246 }
dbl * delta
Definition: mlp_gen.cc:36
virtual int nstrips() const =0
int i
Definition: DBlmapReader.cc:9
CaloTopology const * topology(0)
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
const T & max(const T &a, const T &b)
T sqrt(T t)
Definition: SSEVec.h:48
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int j
Definition: DBlmapReader.cc:9
double f[11][100]
int k[5][pyjets_maxn]
#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.