CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CrosstalkInversion.cc
Go to the documentation of this file.
4 
5 namespace reco {
6 
7 std::vector<stats_t<float> > InverseCrosstalkMatrix::
8 unfold(const SiStripCluster& clus, const float x) {
9  auto const & q = clus.amplitudes();
10  const stats_t<float> suppressed(-5,100);
11  const stats_t<float> saturated(254,400);
12  #define STATS(value) ( (value<254) ? stats_t<float>(value) : saturated )
13 
14  const unsigned N=q.size();
15  std::vector<stats_t<float> > Q(N+2,stats_t<float>(0));
16  Q[0] = Q[N+1] = suppressed;
17 
18  if(N==1) //optimize N==1
19  Q[1] = STATS(q[0])/(1-2*x);
20  else if(N==2) { //optimize N==2
21  const double A=1-2*x;
22  const stats_t<float> q0 = STATS(q[0]);
23  const stats_t<float> q1 = STATS(q[1]);
24  Q[1] = ( A*q0 -x*q1 ) / (A*A-x*x);
25  Q[2] = ( A*q1 -x*q0 ) / (A*A-x*x);
26  }
27  else { //general case
28  const InverseCrosstalkMatrix inverse(N,x);
29  for(unsigned i=0; i<(N+1)/2; i++) {
30  for(unsigned j=i; j<N-i; j++) {
31  const float Cij = inverse(i+1,j+1);
32  Q[i+1] += Cij * STATS(q[ j ]) ; if( i!=j)
33  Q[j+1] += Cij * STATS(q[ i ]) ; if( N!=i+j+1) {
34  Q[N-i] += Cij * STATS(q[N-j-1]) ; if( i!=j)
35  Q[N-j] += Cij * STATS(q[N-i-1]) ;
36  }
37  }
38  }
39  }
40  #undef STATS
41  return Q;
42 }
43 
45 InverseCrosstalkMatrix(const unsigned N, const float x)
46  : N( x>0 ? N : 0 ),
47  sq( sqrt(-x*4+1)),
48  lambdaP( 1+(1+sq)/(-x*2) ),
49  lambdaM( 1+(1-sq)/(-x*2) ),
50  denominator( sq * ( pow(lambdaP,N+1) - pow(lambdaM,N+1) ) )
51 {}
52 
54 operator()(const unsigned i, const unsigned j) const
55 { return N==0 || edm::isNotFinite(denominator) ? i==j : i>=j ? element(i,j) : element(j,i) ; }
56 
57 inline
59 element(const unsigned i, const unsigned j) const
60 { return ( pow(lambdaM,N+1-i) - pow(lambdaP,N+1-i) ) * ( pow(lambdaM,j) - pow(lambdaP,j) ) / denominator; }
61 
62 }
#define STATS(value)
int i
Definition: DBlmapReader.cc:9
float operator()(const unsigned i, const unsigned j) const
InverseCrosstalkMatrix(const unsigned N, const float x)
bool isNotFinite(T x)
Definition: isFinite.h:10
list denominator
Definition: cuy.py:484
T sqrt(T t)
Definition: SSEVec.h:48
int j
Definition: DBlmapReader.cc:9
static std::vector< stats_t< float > > unfold(const SiStripCluster &q, const float x)
#define N
Definition: blowfish.cc:9
double q1[4]
Definition: TauolaWrapper.h:87
float element(const unsigned, const unsigned) const
const std::vector< uint8_t > & amplitudes() const
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40