1 #ifndef RecoLocalCalo_EcalRecAlgos_EcalUncalibRecHitFixedAlphaBetaAlgo_HH
2 #define RecoLocalCalo_EcalRecAlgos_EcalUncalibRecHitFixedAlphaBetaAlgo_HH
14 #include "CLHEP/Matrix/Vector.h"
15 #include "CLHEP/Matrix/SymMatrix.h"
64 EcalUncalibRecHitFixedAlphaBetaAlgo<C>():
fAlpha_(0.),
fBeta_(0.),
fAmp_max_(-1.),
fTim_max_(-1),
fPed_max_(0),
alfabeta_(0),
fNb_iter_(4),
fNum_samp_bef_max_(1),
fNum_samp_after_max_(3),
fSigma_ped(1.1),
DM1_(3),
temp_(3){
66 for (
int i=0;
i<36;
i++){
67 for(
int j=0;
j<1701;
j++){
76 EcalUncalibRecHitFixedAlphaBetaAlgo<C>(
int n_iter,
int n_bef_max =1,
int n_aft_max =3,
float sigma_ped = 1.1):
fAlpha_(0.),
fBeta_(0.),
fAmp_max_(-1.),
fTim_max_(-1),
fPed_max_(0),
alfabeta_(0),
DM1_(3),
temp_(3){
83 for (
int i=0;
i<36;
i++){
84 for(
int j=0;
j<1701;
j++){
96 const double* gainRatios,
108 const double* gainRatios,
114 double frame[C::MAXSAMPLES];
120 double maxsample(-1);
122 bool external_pede =
false;
127 external_pede =
true;
128 if(dyn_pedestal) { pedestal = (double(dataFrame.sample(0).adc()) +
double(dataFrame.sample(1).adc()))/2.;}
129 else{ pedestal = pedestals[0];}
130 for(
int iSample = 0; iSample < C::MAXSAMPLES; iSample++) {
132 GainId = dataFrame.sample(iSample).gainId();
143 if (GainId != gainId0) iGainSwitch = 1;
145 if(GainId==gainId0){frame[iSample] = double(dataFrame.sample(iSample).adc())-pedestal ;}
146 else {frame[iSample] = (double(dataFrame.sample(iSample).adc())-pedestals[GainId-1])*gainRatios[GainId-1];}
148 if( frame[iSample]>maxsample ) {
149 maxsample = frame[iSample];
155 external_pede =
false;
156 pedestal = (double(dataFrame.sample(0).adc()) +
double(dataFrame.sample(1).adc()))/2.;
158 for(
int iSample = 0; iSample < C::MAXSAMPLES; iSample++) {
160 GainId = dataFrame.sample(iSample).gainId();
168 frame[iSample] = double(dataFrame.sample(iSample).adc())-pedestal ;
170 if (GainId > gainId0) iGainSwitch = 1;
171 if( frame[iSample]>maxsample ) {
172 maxsample = frame[iSample];
178 if( (iGainSwitch==1 && external_pede==
false) ||
183 InitFitParameters(frame, imax);
184 chi2_ = PerformAnalyticFit(frame,imax);
195 if( alfabeta_ <= 0 )
return((
double)0.);
196 double dtsbeta,variable,puiss;
197 double dt = t-fTim_max_ ;
198 if(dt > -alfabeta_) {
200 variable=1.+dt/alfabeta_ ;
201 puiss=
pow(variable,fAlpha_);
202 return fAmp_max_*puiss*
exp(-dtsbeta)+fPed_max_ ;
210 fAmp_max_ = samples[max_sample];
211 fTim_max_ = max_sample;
216 if(fAmp_max_ < MinAmpl_){
217 fAmp_max_ = samples[5];
218 double sumA = samples[5]+samples[4]+samples[6];
219 if(sumA != 0) { fTim_max_ = 5+(samples[6]-samples[4])/sumA; }
220 else{ fTim_max_ = -993; }
224 else if(max_sample <1 || max_sample > 7)
229 float a = float(samples[max_sample-1]+samples[max_sample+1]-2*samples[max_sample])/2.;
230 if(a==0){doFit_ =
false;
return;}
231 float b = float(samples[max_sample+1]-samples[max_sample-1])/2.;
233 fTim_max_ = max_sample - b/(2*
a);
234 fAmp_max_ = samples[max_sample] - b*b/(4*
a);
248 double chi2=-1 ,
db[3] ;
253 int num_fit_min =(int)(max_sample - fNum_samp_bef_max_ ) ;
254 int num_fit_max =(int)(max_sample + fNum_samp_after_max_) ;
256 if (num_fit_min<0) num_fit_min = 0 ;
258 if (num_fit_max>= C::MAXSAMPLES ) {num_fit_max = C::MAXSAMPLES-1 ;}
261 LogDebug(
"EcalUncalibRecHitFixedAlphaBetaAlgo")<<
"No fit performed. The amplitude of sample 5 will be used";
266 double variation_func_max = 0. ;
double variation_tim_max = 0. ;
double variation_ped_max = 0. ;
268 for (
int iter=0 ; iter < fNb_iter_ ; iter ++) {
272 for(
int i1=0 ; i1<3 ; i1++) {
274 for(
int j1=i1 ; j1<3 ; j1++) {
275 DM1_.fast(j1+1,i1+1) = 0; }
278 fAmp_max_ += variation_func_max ;
279 fTim_max_ += variation_tim_max ;
280 fPed_max_ += variation_ped_max ;
283 for(
int i = num_fit_min ;
i <= num_fit_max ;
i++) {
286 func = pulseShapeFunction( (
double)
i ) ;
288 double dt =(double)i - fTim_max_ ;
289 if(dt > -alfabeta_) {
290 double dt_sur_beta = dt/fBeta_ ;
291 double variable = (double)1. + dt/alfabeta_ ;
292 double expo =
exp(-dt_sur_beta) ;
293 double puissance =
pow(variable,fAlpha_) ;
295 db[0]=un_sur_sigma*puissance*expo ;
296 db[1]=fAmp_max_*
db[0]*dt_sur_beta/(alfabeta_*variable) ;
299 db[0]=0. ;
db[1]=0. ;
303 for(
int i1=0 ; i1<3 ; i1++) {
304 for(
int j1=i1 ; j1<3 ; j1++) {
306 DM1_.fast(j1+1,i1+1) +=
db[i1]*
db[j1]; }
309 delta = (samples[
i]-func)*un_sur_sigma ;
311 for(
int ii=0 ; ii<3 ;ii++) {temp_[ii] += delta*
db[ii] ;}
312 chi2 += delta *
delta ;
320 InitFitParameters(samples,max_sample);
330 CLHEP::HepVector
PROD = DM1_*temp_ ;
337 InitFitParameters(samples,max_sample);
341 variation_func_max = PROD[0] ;
342 variation_tim_max = PROD[1] ;
343 variation_ped_max = PROD[2] ;
349 if( variation_func_max > 2000. || variation_func_max < -1000. ) {
350 InitFitParameters(samples,max_sample);
356 fAmp_max_ += variation_func_max ;
357 fTim_max_ += variation_tim_max ;
358 fPed_max_ += variation_ped_max ;
363 if( fAmp_max_>2*samples[max_sample] || fAmp_max_<-100 || fTim_max_<0 || 9<fTim_max_ ) {
364 InitFitParameters(samples,max_sample);
376 alfabeta_ = fAlpha_*fBeta_;
void InitFitParameters(double *samples, int max_sample)
float beta_table_[36][1701]
std::vector< Variable::Flags > flags
double pulseShapeFunction(double t)
virtual EcalUncalibratedRecHit makeRecHit(const C &dataFrame, const double *pedestals, const double *gainRatios, const EcalWeightSet::EcalWeightMatrix **weights, const EcalWeightSet::EcalChi2WeightMatrix **chi2Matrix)
Compute parameters.
float alpha_table_[36][1701]
void SetMinAmpl(double ampl)
math::Matrix< 10, 10 >::type EcalChi2WeightMatrix
void SetAlphaBeta(double alpha, double beta)
bool isSaturated(const Digi &digi, const int &maxADCvalue, int ifirst, int n)
math::Matrix< 3, 10 >::type EcalWeightMatrix
float PerformAnalyticFit(double *samples, int max_sample)
void SetDynamicPedestal(bool dyn_pede)
Power< A, B >::type pow(const A &a, const B &b)