31 for (
int i=0 ;
i<10 ;
i++) {
32 for (
int j=0 ;
j<10 ;
j++) {
33 weight_matrix[
i][
j] = 8.;
54 double a1,a2,a3,a1i,a2i,a3i,b1,b2;
60 int ioktk[
ntrack],iokchi2[
ntrack],nk,nborn_min=0,nborn_max=0;
63 double par[4],tsig[1];
68 double noise_initialvalue,one_over_noisesq ;
72 double fact1,fact2,expo;
73 double albet,dtsbeta,variab,
alpha,
beta,puiss ;
74 double unsurs1 ,unsurs2 ;
76 int numb_a,numb_b,numb_ab,numb_b2,numb_x,ndimi,ndimj ;
78 fun=0; chi2s=0; chi2tot=0;
79 matrice DA,DAT,BK,DB,DBT,
C,CT,
D,DM1,CDM1,CDM1CT,
Z,CDM1Z,YK,Y,
B,
X,XINV,RES2 ;
83 amplu =
new double[
nsamp] ;
93 noise_initialvalue = noise_val ;
94 one_over_noisesq=1./(noise_initialvalue * noise_initialvalue) ;
95 for ( i=0 ; i<
dimmat ; i++ ) {
96 for ( j=0 ; j<
dimmat ; j++ ) {
99 errpj[
i][
i]=one_over_noisesq ;
116 printf(
" ------> __> valeurs de a1 %f a2 %f a3 %f\n",a1,a2,a3) ;
118 for (i=0 ; i<
ntrack ; i++) {
120 for (j=0 ; j<2 ; j++ ) {
121 bi[
i][
j] = (double)0. ;
122 dbi[
i][
j] = (double)0. ;
123 zi[
i][
j]=(double)0. ;
124 cti[
i][
j]=(double)0. ;
125 dm1i[
i][
j]=(double)0. ;
140 numb_ab = numb_a*numb_b ;
141 numb_b2 = numb_b*numb_b ;
161 A_CROISS =
cree_mat(numb_a,numb_x) ;
169 for (iter=0 ; iter < 6 ; iter++) {
178 printf(
" Debut de l'iteration numero %d \n",iter) ;
189 aiter[iter][0] = a1 ;
190 aiter[iter][1] = a2 ;
192 printf(
" resultats injectes a iterations %d \n",iter) ;
193 printf(
" parametre a1 = %f \n",a1) ;
194 printf(
" parametre a2 = %f \n",a2) ;
195 printf(
" chi2 du fit chi2s = %f \n",chi2s) ;
197 printf(
" value de nevtmax _______________ %d \n",nevtmax) ;
205 for (nevt=0 ; nevt < nevtmax ; nevt++) {
225 for ( k = 0 ; k < 10 ; k++) {
226 amplu[
k]=adcval[nevt][
k] ;
227 if (amplu[k] > ampmax[nk] ) {
228 ampmax[nk] = amplu[
k] ;
242 fit3 = parab(amplu,2,9,par3degre) ;
252 num_fit_min[nevt] = (double)imax[nk] - (
double)nsmin ;
253 num_fit_max[nevt] = (double)imax[nk] + (
double)nsmax ;
256 bi[nk][0] = par3degre[0] ;
257 bi[nk][1] = par3degre[1] ;
261 printf(
"---------> depart ampmax[%d]=%f maximum %f tim %f \n",
262 nk,ampmax[nk],bi[nk][0],bi[nk][1]);
274 bi[nk][0] += dbi[nk][0] ;
275 bi[nk][1] += dbi[nk][1] ;
278 printf(
"iter %d valeur de max %f et norma %f poly 3 \n",iter,bi[nk][1],bi[nk][0]) ;
292 ns =nborn_max-nborn_min+1 ;
294 for (k=0 ; k < 10 ; k++){
304 printf(
" CHECK sample %f ampli %f \n",t,amp) ;
312 unsurs1=1./noise_val;
313 unsurs2=(1./noise_val)*(1./noise_val);
319 nborn_min = (int)num_fit_min[nevt] ;
320 nborn_max = (int)num_fit_max[nevt] ;
321 if(k < nborn_min || k > nborn_max ) continue ;
330 fun = pulseShapepj( tsig , par) ;
333 printf(
" valeur ampli %f et function %f min %d max %d \n",amp,fun,nsmin,nsmax) ;
334 printf(
"min %f max %f \n",num_fit_min[nevt],num_fit_max[nevt]) ;
348 variab = (double)1. + dt/albet ;
350 expo =
exp(-dtsbeta) ;
351 puiss =
pow(variab,alpha) ;
353 db1[
k] = unsurs1*fun/b1 ;
355 db2[
k] = unsurs1*fact2*dtsbeta/(albet*variab) ;
356 da1[
k] = unsurs1*fact2*(
log(variab)-dtsbeta/(alpha*variab)) ;
357 da2[
k] = unsurs1*fact2*dtsbeta*dtsbeta/(albet*variab) ;
360 delta[
k] = (amp - fun)*unsurs1 ;
362 printf(
" ------->iter %d valeur de k %d amp %f fun %f delta %f \n",
363 iter,k,amp,fun,delta[k]) ;
364 printf(
" -----> valeur de k %d delta %f da1 %f da2 %f \n",
365 k,delta[k],da1[k],da2[k]) ;
368 chi2 = chi2 + delta[
k]*delta[
k] ;
371 printf(
" CHECK chi2 %f deltachi2 %f sample %d iter %d \n",chi2,delta[k]*delta[k],k, iter) ;
388 for(
int k1=nborn_min ; k1<nborn_max+1 ; k1++) {
392 DA.
coeff[0][0] = da1[k1]*wk1wk2 ;
393 DA.
coeff[1][0] = da2[k1]*wk1wk2 ;
394 DAT.
coeff[0][0]= da1[k2] ;
395 DAT.
coeff[0][1]= da2[k2] ;
396 DB.
coeff[0][0] = db1[k1]*wk1wk2 ;
397 DB.
coeff[1][0] = db2[k1]*wk1wk2 ;
398 DBT.
coeff[0][0]= db1[k2] ;
399 DBT.
coeff[0][1]= db2[k2] ;
403 produit_mat_int(DA,DAT,BK) ;
407 produit_mat_int(DA,DBT,C) ;
411 produit_mat_int(DB,DBT,D) ;
417 somme_mat_int_scale(DA,YK,delta2) ;
418 somme_mat_int_scale(DB,Z,delta2) ;
432 printf(
" event rejected because npamp_used = %d \n",ioktk[nk]);
435 chi2s = chi2/(2. + (double)ns + 2.) ;
439 if (nevt==198 || nevt==199){
440 std::cout <<
"adc123 pour l'evt " << nevt <<
" = "<<adcval[nevt][nborn_min]<<
" = "<<adcval[nevt][imax[nevt]]<<
" = "<<adcval[nevt][nborn_max]<<std::endl;
441 std::cout <<
"chi2s pour l'evt " << nevt <<
" = "<< chi2s<<
" "<< chi2<<
" "<< ns<<
" "<<iter<<std::endl;
442 std::cout <<
"chi2tot " << nevt <<
" = "<< chi2tot<<
" "<<iter<<std::endl;
448 transpose_mat(C,CT) ;
460 cti[nk][0] = CT.
coeff[0][0] ;
461 cti[nk][1] = CT.
coeff[0][1] ;
462 cti[nk][2] = CT.
coeff[1][0] ;
463 cti[nk][3] = CT.
coeff[1][1] ;
466 dm1i[nk][0] = DM1.
coeff[0][0] ;
467 dm1i[nk][1] = DM1.
coeff[0][1] ;
468 dm1i[nk][2] = DM1.
coeff[1][0] ;
469 dm1i[nk][3] = DM1.
coeff[1][1] ;
471 zi[nk][0] = Z.
coeff[0][0] ;
472 zi[nk][1] = Z.
coeff[1][0] ;
476 for( k=0 ; k< numb_a ; k++) {
479 somme_mat_int(BK,B) ;
484 produit_mat(C,DM1,CDM1) ;
488 produit_mat_int(CDM1,CT,CDM1CT);
492 produit_mat_int(CDM1,Z,CDM1Z) ;
503 diff_mat(B,CDM1CT,X) ;
504 inverse_mat(X,XINV) ;
505 diff_mat(Y,CDM1Z,RES2) ;
510 produit_mat(XINV,RES2,A_CROISS) ;
516 for( k=0 ; k< nk+1 ; k++) {
519 ZMCT.
coeff[0][0] = zi[
k][0] - (cti[
k][0]*A_CROISS.
coeff[0][0]+
520 cti[
k][1]*A_CROISS.
coeff[1][0]) ;
521 ZMCT.
coeff[1][0] = zi[
k][1] - (cti[
k][2]*A_CROISS.
coeff[0][0]+
522 cti[
k][3]*A_CROISS.
coeff[1][0]) ;
525 dbi[
k][0] = dm1i[
k][0]*ZMCT.
coeff[0][0] + dm1i[
k][1]*ZMCT.
coeff[1][0] ;
526 dbi[
k][1] = dm1i[
k][2]*ZMCT.
coeff[0][0] + dm1i[
k][3]*ZMCT.
coeff[1][0] ;
529 printf(
" variations de b1= %f et b2= %f \n",dbi[k][0],dbi[k][1]) ;
532 db_i[
k][0] = bi[
k][0]+ dbi[
k][0] ;
533 db_i[
k][1] = bi[
k][1]+ dbi[
k][1] ;
540 a1 += A_CROISS.
coeff[0][0] ;
541 a2 += A_CROISS.
coeff[1][0] ;
545 printf(
" CHECK croiss coef0: %f croiss coef1: %f iter %d \n",fabs(A_CROISS.
coeff[0][0]),fabs(A_CROISS.
coeff[1][0]), iter);
547 if(fabs(A_CROISS.
coeff[0][0]) < 0.001 && fabs(A_CROISS.
coeff[1][0]) < 0.001)
560 printf(
" resultats trouves au bout de %d iterations \n",iter) ;
561 printf(
" parametre a1 = %f \n",a1) ;
562 printf(
" parametre a2 = %f \n",a2) ;
566 std::cout <<
" Final chi2 / NDOF : "<< chi2tot/nevtmax << std::endl;
567 std::cout <<
" Final (alpha,beta) : ("<< a1<<
","<<a2<<
")"<< std::endl;
570 return chi2tot/nevtmax ;
582 double alpha ,
double beta ,
int nevtmaximum) {
587 nevtmax = nevtmaximum ;
593 if(ns >
SDIM2) printf(
"warning: NbOfsamples exceed maximum\n");
600 printf(
" Erreur : produit de matrices de tailles incompatibles \n ");
621 printf(
" Erreur : produit de matrices de tailles incompatibles \n ");
641 printf(
" Erreur : difference de matrices de tailles incompatibles \n ");
664 printf(
" copie nk %d i %d j %d k %d A %e M %e \n ",nk,i,j,k,A.
coeff[i][j],
677 printf(
" Erreur : somme de matrices de tailles incompatibles \n ");
760 printf(
"matrice remplie %e \n",M.
coeff[i][j]) ;
769 printf(
" erreur : affichage d'une matrice vide \n") ;
773 printf(
" MATRICE i= %d j= %d ---> %e \n",i,j,M.
coeff[i][j]) ;
796 printf(
" erreur : affichage d'une matrice vide \n") ;
799 printf(
" MATRICE nk= %d j= %d ---> %e \n",nk,j,M.
coeff[nk][j]) ;
800 printf(
" apres passage d'impression \n") ;
811 printf(
" attention matrice non inversible !!!! %d lignes %d colonnes \n",
836 for ( i=0 ; i<3 ; i++ ) {
837 for ( j=0 ; j<3 ; j++ ) M.
coeff[i][j] = M.
coeff[i][j]/deter ;
841 printf(
" Attention , on ne peut inverser la MATRICE %d \n",A.
nb_lignes) ;
850 double val , val2 , val3 , adfmx[
dimmat] , parfp3[
dimout] ;
852 double deglib,fit3,tm,
h,xki2 ;
853 int i ,nus ,ilow,isup ;
860 for (i=0 ; i<ns ; i++ ){
863 if((adcpj[i] < val3) && (i<imax) ){
866 if(adcpj[i] > val2 ){
871 if(ilow == imax )ilow=ilow-1 ;
872 if(isup-ilow < 3) isup=ilow+3 ;
874 for(i=ilow ; i<=isup ; i++){
876 adfmx[nus]=adcpj[
i] ;
883 if(nus < 4)
return 10000. ;
884 xki2 = f3deg ( nus , parfp3 , maskp3 , adfmx , errpj ) ;
901 int i ,
k ,
l , iworst ;
903 double xki2 , dif , difmx , deglib ;
907 deglib=(double)nmxu - 4. ;
908 for ( i=0 ; i<nmxu ; i++ ) {
913 f[
i][3]=f[
i][2]*t[
i] ;
916 for ( k=0 ; k<4 ; k++ ) {
917 for ( l=0 ; l<4 ; l++ ) {
919 for (i=0 ; i<nmxu ; i++ ) {
920 s=s+f[
i][
k]*f[
i][
l]*errpj[
i][
i]*mask[
i] ;
925 for (i=0 ; i<nmxu ; i++ ) {
926 s=s+f[
i][
k]*adcpj[
i]*errpj[
i][
i]*mask[
i] ;
931 deter = inverpj ( 4 , cov , invcov );
932 for ( k=0 ; k<4 ; k++ ) {
934 for ( l=0 ; l<4 ; l++ ) {
935 s=s+bv[
l]*invcov[
l][
k] ;
940 if( parom[3] == 0. ){
949 for (i=0 ; i<nmxu ; i++ ){
951 h= parom[0]+parom[1]*t[
i]+parom[2]*t2+parom[3]*t2*t[
i] ;
952 dif=(adcpj[
i]-
h)*mask[i] ;
958 if(deglib > 0.5) xki2=xki2/deglib ;
960 delta=parom[2]*parom[2]-3.*parom[3]*parom[1] ;
963 tm=-(delta+parom[2])/(3.*parom[3]) ;
964 tmp=(delta-parom[2])/(3.*parom[3]) ;
973 parom[5]= parom[0]+parom[1]*tm+parom[2]*tm*tm+parom[3]*tm*tm*tm ;
992 for( i=0 ; i<
n ; i++ ) {
993 for ( j=0 ; j<
n ; j++ ) {
999 al[0][0] =
sqrt(
g[0][0] ) ;
1000 for ( i=1 ; i<
n ; i++ ) {
1001 al[
i][0] =
g[0][
i] / al[0][0] ;
1002 for ( j=1 ; j<=
i ; j++ ) {
1004 for ( k=0 ; k<=j-1 ; k++ ) {
1005 s=s+ al[
i][
k] * al[
j][
k] ;
1008 if( j < i ) al[
i][
j] = r/al[
j][
j] ;
1009 if( j == i ) al[
i][
j] =
sqrt ( r) ;
1013 be[0][0] = 1./al[0][0] ;
1014 for ( i=1 ; i<
n ; i++ ) {
1015 be[
i][
i] = 1. / al[
i][
i] ;
1016 for ( j=0 ; j<
i ; j++ ) {
1019 for ( k=jj+1 ; k<=
i ; k++ ) {
1020 s=s+ be[
i][
k] * al[
k][jj] ;
1022 be[
i][jj]=-s/al[jj][jj] ;
1026 for ( i=0 ; i<
n ; i++ ) {
1027 for ( j=0 ; j<
n ; j++ ) {
1029 for ( k=0 ; k<
n ; k++ ) {
1030 s=s+ be[
k][
i] * be[
k][
j] ;
1048 b[0][0]=a[1][1]*a[2][2]-a[2][1]*a[1][2] ;
1049 b[1][1]=a[0][0]*a[2][2]-a[2][0]*a[0][2] ;
1050 b[2][2]=a[0][0]*a[1][1]-a[0][1]*a[1][0] ;
1051 printf(
"a[x][x] %e %e %e %e %e %e %e \n",a[0][0],a[1][1],a[0][1],a[1][0],
1052 a[0][0]*a[1][1],a[0][1]*a[1][0],b[2][2]);
1053 b[0][1]=a[2][1]*a[0][2]-a[0][1]*a[2][2] ;
1054 b[0][2]=a[0][1]*a[1][2]-a[1][1]*a[0][2] ;
1055 b[1][0]=a[1][2]*a[2][0]-a[1][0]*a[2][2] ;
1056 b[1][2]=a[1][0]*a[0][2]-a[0][0]*a[1][2] ;
1057 b[2][0]=a[1][0]*a[2][1]-a[1][1]*a[2][0] ;
1058 b[2][1]=a[0][1]*a[2][0]-a[0][0]*a[2][1] ;
1059 deter=a[0][0]*b[0][0] + a[1][0]*b[0][1] + a[2][0]*b[0][2] ;
1060 printf(
" deter = %e \n",deter) ;
1061 for ( i=0 ; i<3 ; i++ ) {
1062 for ( j=0 ; j<3 ; j++ ) {
1063 printf(
" avant division a[3][3] %d %d %e \n",i,j,a[i][j]) ;
1064 printf(
" avant division b[3][3] %d %d %e %e \n",i,j,b[i][j],deter) ;
1065 b[
i][
j] = b[
i][
j]/deter ;
1066 printf(
" valeur de b[3][3] apres division %d %d %e %e \n",i,j,b[i][j],deter) ;
1077 Double_t
dt, dtsbeta, albet, variab, puiss ;
1078 Double_t b1,b2,a1,a2 ;
1091 albet = alpha*
beta ;
1092 if( albet <= 0 )
return( (Double_t)0. );
1096 variab=1.+dt/albet ;
1097 puiss=
pow(variab,alpha);
1098 fitfun=h*puiss*
exp(-dtsbeta) + ped;
1114 Double_t
dt,alphadt,exponent ;
1121 alphadt = alpha*
dt ;
1122 exponent = -(alphadt+(
exp(-alphadt)-1.))/beta ;
1123 fitfun = b1*
exp(exponent) ;
1131 Double_t
dt,expo1,dt2,exponent ;
1138 expo1 =
exp(-beta*dt) ;
1140 exponent = -(alpha*dt2+(expo1-1.)) ;
1141 fitfun = b1*
exp(exponent) ;
1150 Double_t
dt, dtsbeta, albet, variab, puiss;
1151 Double_t b1,b2,a1,a2 ;
1162 albet = alpha*
beta ;
1163 if( albet <= 0 )
return( (Double_t)0. );
1167 variab=1.+dt/albet ;
1168 puiss=
pow(variab,alpha);
1169 fitfun=h*puiss*
exp(-dtsbeta) + ped;
1185 double denom,
dt,amp1,amp2,amp3 ;
1186 double ampmax = 0. ;
1191 for ( k = nmin ; k < nmax ; k++) {
1192 if (ampl[k] > ampmax ) {
1197 amp1 = ampl[imax-1] ;
1199 amp3 = ampl[imax+1] ;
1200 denom=2.*amp2-amp1-amp3 ;
1203 dt =0.5*(amp3-amp1)/denom ;
1213 parout[0] =amp2+(amp3-amp1)*dt*0.25 ;
1214 parout[1] = (double)imax + dt ;
1215 parout[2] = (double)imax ;
1221 Double_t fitval0,fitval;
1223 Double_t
dt,alpha2dt,exponent ;
1224 Double_t b1,b2,alpha2,
t ;
1236 puiss =
pow(fact,alpha) ;
1237 fitval0 = puiss*
exp(-alpha*dt/b2) ;
1244 alpha2dt = dt*alpha2 ;
1245 exponent = -(alpha2dt+(
exp(-alpha2dt)-1.))/beta ;
1246 fitval = b1*fitval0*
exp(exponent) ;
1256 double level = 0.30 ;
1258 double amplitude = 1.00 ;
1260 double amp_max = amplitude;
1263 double t_min = offset-4.50;
1264 double t_max = offset+12.50;
1266 int t_step_max = 3000;
1267 double delta_t = (double)((t_max-t_min)/t_step_max);
1270 int t_amp_half_flag = 0;
1271 double t_amp_half_min = 999.;
1272 double t_amp_half_max = -999.;
1274 for (
int t_step=0; t_step<t_step_max; t_step++){
1276 double t_val = t_min + (double)t_step*delta_t;
1277 double albet = alpha_here*beta_here ;
1281 if( methode == 2 ) {
1282 if( (t_val-offset) > -albet) {
1284 amp = amplitude*TMath::Power( ( 1 + ( dt / (alpha_here*beta_here) ) ) , alpha_here ) * TMath::Exp(-1.0*(dt/beta_here));
1291 if( amp > (amp_max*level) && t_amp_half_flag == 0) {
1292 t_amp_half_flag = 1;
1293 t_amp_half_min = t_val;
1296 if( amp < (amp_max*level) && t_amp_half_flag == 1) {
1297 t_amp_half_flag = 2;
1298 t_amp_half_max = t_val;
1304 double width = (t_amp_half_max - t_amp_half_min);
const double Z[kNumberCalorimeter]
double pulseShapepj(Double_t *, Double_t *)
Double_t polfit(Int_t ns, Int_t imax, Double_t par3d[dimout], Double_t errpj[dimmat][dimmat], double *)
void print_mat_nk(matrice, int)
double computePulseWidth(int, double, double)
void somme_mat_int_scale(matrice, matrice, double)
void produit_mat(matrice, matrice, matrice)
Exp< T >::type exp(const T &t)
double inverpj(int, double g[dimmat][dimmat], double ginv[dimmat][dimmat])
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
void somme_mat_int(matrice, matrice)
void transpose_mat(matrice, matrice)
void set_const(int, int, int, double, double, int)
double parab(double *, Int_t, Int_t, double *)
matrice cree_mat_prod(matrice, matrice)
unsigned int offset(bool)
void copie_colonne_mat(matrice, matrice, int)
matrice cree_mat(int, int)
double pulseShapepj2(Double_t *, Double_t *)
void inverse_mat(matrice, matrice)
double f3deg(int, double parom[dimout], double mask[dimmat], double adcpj[dimmat], double errpj[dimmat][dimmat])
Log< T >::type log(const T &t)
void zero_mat_nk(matrice, int)
void fill_mat(matrice, matrice)
double lastShape(Double_t *, Double_t *)
std::vector< std::vector< double > > tmp
void produit_mat_int(matrice, matrice, matrice)
TFParams(int size=SDIM2, int size_sh=PLSHDIM)
double mixShape(Double_t *, Double_t *)
void diff_mat(matrice, matrice, matrice)
double lastShape2(Double_t *, Double_t *)
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
double inv3x3(double a[3][3], double b[3][3])
double fitpj(double **, double *, double **, double noise_val, int debug)
DecomposeProduct< arg, typename Div::arg > D
tuple size
Write out results.
Power< A, B >::type pow(const A &a, const B &b)
const double par[8 *NPar][4]