31 unsigned int nsamples = theWave.
getSize() ;
32 std::vector<double> trWave ;
33 trWave.resize( nsamples );
35 const double Dt = theWave.
getDt();
36 const double inv_Dt = 1. / Dt;
37 if(fabs(tShift) > Dt) {
38 ibin = int(tShift * inv_Dt);
39 for (
unsigned int i=0 ; i<theWave.
getSize() ; ++i ) {
40 if ( (
int)i + ibin >= 0 && (
int)i + ibin < (
int)nsamples) trWave[i+ibin] = theWave.
getSample(i) ;
43 for (
unsigned int i=0 ; i<(
unsigned int)ibin ; ++i ) {
47 for (
unsigned int i=nsamples+ibin; i<nsamples; ++i) {
52 for (
unsigned int i=0 ; i<theWave.
getSize() ; ++i ) trWave[i] = theWave.
getSample(i);
56 std::vector<double> tranWave ;
57 tranWave.resize(trWave.size());
58 double tmpshift = tShift - ibin * Dt;
61 for(
unsigned int i=1; i<trWave.size(); ++i) {
62 tranWave[i] = trWave[i] - tmpshift * (trWave[i] - trWave[i-1]) * inv_Dt;
65 tranWave[trWave.size() - 1] =
baseline;
66 for(
int i=trWave.size()-2; i>=0; --i) {
67 tranWave[i] = trWave[i] - tmpshift * (trWave[i] - trWave[i+1]) * inv_Dt;
71 return LArWave( tranWave , Dt ) ;
280 static const double c[3][4][7] =
281 { { { -0.107, -0.071, -0.036, 0.000, 0.036, 0.071, 0.107 } ,
282 { 0.012, -0.071, -0.107, -0.095, -0.036, 0.071, 0.226 } ,
283 { 0.131, -0.071, -0.179, -0.190, -0.107, 0.071, 0.345 } ,
284 { 0.250, -0.071, -0.250, -0.286, -0.179, 0.071, 0.464 } } ,
285 { { 0.087, -0.266, -0.230, 0.000, 0.230, 0.266, -0.087 } ,
286 { 0.123, -0.183, -0.218, -0.095, 0.075, 0.183, 0.115 } ,
287 { -0.008, 0.067, -0.040, -0.190, -0.246, -0.067, 0.484 } ,
288 { -0.306, 0.484, 0.306, -0.286, -0.734, -0.484, 1.020 } } ,
289 { { 0.087, -0.266, -0.230, 0.000, 0.230, 0.266, -0.087 } ,
290 { -0.049, 0.219, -0.276, -0.439, 0.018, 0.584, -0.057 } ,
291 { -0.079, 0.234, -0.063, -0.333, -0.270, 0.099, 0.413 } ,
292 { 0.269, -0.856, 0.497, 0.863, -0.543, -1.824, 1.594 } } } ;
294 const int ipoly = m-2 ;
296 std::vector<double> wave = theWave.
getWave() ;
297 const double dt = theWave.
getDt() ;
298 const double inv_dt = 1. / dt;
299 unsigned int nsamples = theWave.
getSize() ;
300 std::vector<double> dwave ;
301 dwave.resize(nsamples,0.0) ;
303 for (
unsigned int i=0 ; i<nsamples ; i++ ) {
306 for (
unsigned int j=0 ; j<=6 ; j++ )
307 dwave[i] += -c[ipoly][ifilt][6-j] * wave[j] ;
308 }
else if ( i>=nsamples-3 ) {
309 int ifilt = nsamples - i + 2;
310 for (
unsigned int j=nsamples-7 ; j<=nsamples-1 ; j++ )
311 dwave[i] += c[ipoly][ifilt][j-(nsamples-7)] * wave[j] ;
314 for (
unsigned int j=i-3 ; j<=i+3 ; j++ )
315 dwave[i] += c[ipoly][ifilt][j-(i-3)] * wave[j] ;
499 const std::vector<double>& vAmpli)
const
501 std::vector<LArWave> MWandDAC0 ;
502 unsigned nWaves = vWaves.size() ;
503 if ( nWaves != vAmpli.size() ) {
504 std::cout <<
" linearMasterWave ERROR: wrong number of amplitudes!" << std::endl ;
507 double dt = vWaves[0]->getDt() ;
508 unsigned len = vWaves[0]->getSize() ;
509 for (
unsigned k=1 ; k<nWaves ; k++ ) {
510 if ( vWaves[k]->getDt() != dt ) {
511 std::cout <<
" linearMasterWave ERROR: waves don't have same dt" << std::endl ;
514 if ( vWaves[k]->
getSize() != len ) {
515 std::cout <<
" linearMasterWave ERROR: waves don't have same length" << std::endl ;
521 for (
unsigned i=0 ; i<len ; i++ ) {
522 std::vector<double> ramp ;
523 for (
unsigned k=0 ; k<nWaves ; k++ ) {
524 ramp.push_back(vWaves[k]->getSample(i)) ;
527 std::vector<double> par =
linfit(vAmpli,ramp,rho) ;
528 if (par.size() != 2) {
529 std::cout <<
" linearMasterWave ERROR: linear fit failed" << std::endl ;
535 MWandDAC0.push_back(dac0) ;
536 MWandDAC0.push_back(mw) ;
601 const std::vector<double>& Y,
605 std::vector<double> dummy;
606 if(Ndeg > 2 || (Y.empty()) || (X.size() != Y.size())) {
610 case 0: { dummy.resize(1);
612 for(
unsigned int i=0; i<Y.size(); ++i) sum += Y[i];
613 dummy[0] = sum / Y.size();
615 case 1: {
double rho;
return linfit(X,Y,rho);}
617 double a11,a12,a13,a21,a22,a23,a31,a32,a33;
619 double sum =0., sum2=0., sum3=0., sum4=0.;
620 for(
unsigned int i=0; i<X.size(); ++i) {
623 sum3 += X[i]*X[i]*X[i];
624 sum4 += X[i]*X[i]*X[i]*X[i];
627 a13 = a22 = a31 = sum2;
631 double ai11,ai12,ai13,ai21,ai22,ai23,ai31,ai32,ai33;
633 a11*(a33*a22-a32*a23) - a21*(a33*a12-a32*a13) + a31*(a23*a12-a22*a13);
634 if(fabs(det) < 1.e-6)
return (dummy);
635 ai11 = (a33*a22 - a32*a23);
636 ai12 = ai21 = -(a33*a12-a32*a13);
637 ai22 = a33*a11 - a31*a13;
638 ai13 = ai31 = a23*a12 - a22*a13;
639 ai23 = ai32 = -(a23*a11-a21*a13);
640 ai33 = a22*a11-a21*a12;
641 sum = 0.; sum2=0.; sum3=0.;
642 for(
unsigned int i=0; i<X.size(); ++i) {
645 sum3 += X[i]*X[i]*Y[i];
648 const double inv_det = 1. / det;
649 dummy[0] = (ai11*sum + ai12*sum2 + ai13*sum3) * inv_det;
650 dummy[1] = (ai21*sum + ai22*sum2 + ai23*sum3) * inv_det;
651 dummy[2] = (ai31*sum + ai32*sum2 + ai33*sum3) * inv_det;