[3308] | 1 | #include "machdefs.h"
|
---|
| 2 | #include <stdlib.h>
|
---|
| 3 | #include <stdio.h>
|
---|
| 4 | #include <math.h>
|
---|
| 5 |
|
---|
| 6 | #include "nbtri.h"
|
---|
| 7 | #include "nbmath.h"
|
---|
| 8 | #include "matxop.h"
|
---|
| 9 | #include "filtccd.h"
|
---|
| 10 |
|
---|
| 11 | static int DEB_FitPan = 0;
|
---|
| 12 | static int DEB_BaseLine = 0;
|
---|
| 13 | static int DEB_Bosse = 0;
|
---|
| 14 | static int DEB_BossePaG = 0;
|
---|
| 15 | static int DEB_SigmaInt = 0;
|
---|
| 16 | static int DEB_FiltMed = 0;
|
---|
| 17 | static int DEB_FiltInt = 0;
|
---|
| 18 |
|
---|
| 19 | static int Bosse_probnb = 0;
|
---|
| 20 |
|
---|
| 21 | /*=========================================================================*/
|
---|
| 22 | void SetDebFilt(int razer)
|
---|
| 23 | {
|
---|
| 24 | char *c;
|
---|
| 25 | DEB_FitPan = DEB_BaseLine = DEB_Bosse = DEB_BossePaG
|
---|
| 26 | = DEB_SigmaInt = DEB_FiltMed = DEB_FiltInt = 0;
|
---|
| 27 | if( razer < 0 ) return;
|
---|
| 28 | if( (c = getenv("DEB_FitPan")) ) DEB_FitPan = atoi(c); else DEB_FitPan = 0;
|
---|
| 29 | if( (c = getenv("DEB_BaseLine")) ) DEB_BaseLine = atoi(c); else DEB_BaseLine = 0;
|
---|
| 30 | if( (c = getenv("DEB_Bosse")) ) DEB_Bosse = atoi(c); else DEB_Bosse = 0;
|
---|
| 31 | if( (c = getenv("DEB_BossePaG")) ) DEB_BossePaG = atoi(c); else DEB_BossePaG = 0;
|
---|
| 32 | if( (c = getenv("DEB_SigmaInt")) ) DEB_SigmaInt = atoi(c); else DEB_SigmaInt = 0;
|
---|
| 33 | if( (c = getenv("DEB_FiltMed")) ) DEB_FiltMed = atoi(c); else DEB_FiltMed = 0;
|
---|
| 34 | if( (c = getenv("DEB_FiltInt")) ) DEB_FiltInt = atoi(c); else DEB_FiltInt = 0;
|
---|
| 35 | }
|
---|
| 36 |
|
---|
| 37 | /*=========================================================================*/
|
---|
| 38 | double LPacZin(double t,double *Par,double *DgDpar)
|
---|
| 39 | /* Christophe 11/02/94
|
---|
| 40 | fonction de paczinski en -magnitude 2.5*log10(Paczin) au temps t
|
---|
| 41 | pour U0,T0,Tau,magfond et derivees de la fonction par rapport
|
---|
| 42 | aux parametres [0]=U0,[1]=T0,[2]=Tau,[3]=magfond
|
---|
| 43 | */
|
---|
| 44 | {
|
---|
| 45 | double Paczin,u2,su2u24,tt0tau,dadu2;
|
---|
| 46 |
|
---|
| 47 | tt0tau = (t-Par[1])/Par[2];
|
---|
| 48 | u2 = Par[0]*Par[0] + tt0tau*tt0tau;
|
---|
| 49 | su2u24 = sqrt(u2*(u2+4.));
|
---|
| 50 | dadu2 = -4./su2u24/su2u24/su2u24;
|
---|
| 51 |
|
---|
| 52 | Paczin = (u2+2.)/su2u24;
|
---|
| 53 | DgDpar[0] = DftoDm/Paczin *dadu2* 2.*Par[0];
|
---|
| 54 | DgDpar[1] = DftoDm/Paczin *dadu2*(-2.*tt0tau/Par[2]);
|
---|
| 55 | DgDpar[2] = DftoDm/Paczin *dadu2*(-2.*tt0tau*tt0tau/Par[2]);
|
---|
| 56 | DgDpar[3] = 1.;
|
---|
| 57 |
|
---|
| 58 | Paczin = 2.5*log10(Paczin) + Par[3];
|
---|
| 59 | return (Paczin);
|
---|
| 60 | }
|
---|
| 61 |
|
---|
| 62 | /*=========================================================================*/
|
---|
| 63 | double MPacZin(double t,double *Par,double *DgDpar)
|
---|
| 64 | /* rcecile 13/06/94
|
---|
| 65 | fonction de paczinski a l'envers en -magnitude 2.5*log10(Paczin) au temps t
|
---|
| 66 | pour U0,T0,Tau,magfond et derivees de la fonction par rapport
|
---|
| 67 | aux parametres [0]=U0,[1]=T0,[2]=Tau,[3]=magfond
|
---|
| 68 | */
|
---|
| 69 | {
|
---|
| 70 | double Paczin,u2,su2u24,tt0tau,dadu2;
|
---|
| 71 |
|
---|
| 72 | tt0tau = (t-Par[1])/Par[2];
|
---|
| 73 | u2 = Par[0]*Par[0] + tt0tau*tt0tau;
|
---|
| 74 | su2u24 = sqrt(u2*(u2+4.));
|
---|
| 75 | dadu2 = -4./su2u24/su2u24/su2u24;
|
---|
| 76 |
|
---|
| 77 | Paczin = (u2+2.)/su2u24;
|
---|
| 78 | DgDpar[0] = DftoDm/Paczin *dadu2* 2.*Par[0];
|
---|
| 79 | DgDpar[1] = DftoDm/Paczin *dadu2*(-2.*tt0tau/Par[2]);
|
---|
| 80 | DgDpar[2] = DftoDm/Paczin *dadu2*(-2.*tt0tau*tt0tau/Par[2]);
|
---|
| 81 | DgDpar[3] = 1.;
|
---|
| 82 |
|
---|
| 83 | Paczin = -2.5*log10(Paczin) + Par[3];
|
---|
| 84 | return (Paczin);
|
---|
| 85 | }
|
---|
| 86 |
|
---|
| 87 | /*=========================================================================*/
|
---|
| 88 | double LPacZin2(double t,double *Par,double *DgDpar)
|
---|
| 89 | /* Christophe 11/02/94
|
---|
| 90 | fonction de paczinski en -magnitude 2.5*log10(Paczin) au temps t
|
---|
| 91 | pour 1/U0,T0,1/Tau,magfond et derivees de la fonction par rapport
|
---|
| 92 | aux parametres [0]=1/U0,[1]=T0,[2]=1/Tau,[3]=magfond
|
---|
| 93 | */
|
---|
| 94 | {
|
---|
| 95 | double Paczin,U2,U02,tt0,tt0tau,tt0tau2,dPdU2,U24p1,sU24p1,den;
|
---|
| 96 |
|
---|
| 97 | tt0 = t-Par[1];
|
---|
| 98 | tt0tau = tt0*Par[2];
|
---|
| 99 | tt0tau2 = tt0tau*tt0tau;
|
---|
| 100 | U02 = Par[0]*Par[0];
|
---|
| 101 | U2 = U02/(1.+U02*tt0tau2);
|
---|
| 102 | U24p1 = 1.+4*U2; sU24p1 = sqrt(U24p1);
|
---|
| 103 | den = 1.+U02*tt0tau2; den *= den;
|
---|
| 104 | dPdU2 = 4.*U2/(U24p1*sU24p1);
|
---|
| 105 |
|
---|
| 106 | Paczin = (1.+2.*U2)/sU24p1;
|
---|
| 107 | DgDpar[0] = DftoDm/Paczin *dPdU2* 2.*Par[0]/den;
|
---|
| 108 | DgDpar[1] = DftoDm/Paczin *dPdU2* 2.*U02*U02*Par[2]*tt0tau/den;
|
---|
| 109 | DgDpar[2] = -DftoDm/Paczin *dPdU2* 2.*U02*U02*tt0*tt0tau/den;
|
---|
| 110 | DgDpar[3] = 1.;
|
---|
| 111 |
|
---|
| 112 | Paczin = 2.5*log10(Paczin) + Par[3];
|
---|
| 113 | return (Paczin);
|
---|
| 114 | }
|
---|
| 115 |
|
---|
| 116 | /*=========================================================================*/
|
---|
| 117 | double MPacZin2(double t,double *Par,double *DgDpar)
|
---|
| 118 | /* rcecile 13/06/94
|
---|
| 119 | fonction de paczinski a l'envers en -magnitude 2.5*log10(Paczin) au temps t
|
---|
| 120 | pour 1/U0,T0,1/Tau,magfond et derivees de la fonction par rapport
|
---|
| 121 | aux parametres [0]=1/U0,[1]=T0,[2]=1/Tau,[3]=magfond
|
---|
| 122 | */
|
---|
| 123 | {
|
---|
| 124 | double Paczin,U2,U02,tt0,tt0tau,tt0tau2,dPdU2,U24p1,sU24p1,den;
|
---|
| 125 |
|
---|
| 126 | tt0 = t-Par[1];
|
---|
| 127 | tt0tau = tt0*Par[2];
|
---|
| 128 | tt0tau2 = tt0tau*tt0tau;
|
---|
| 129 | U02 = Par[0]*Par[0];
|
---|
| 130 | U2 = U02/(1.+U02*tt0tau2);
|
---|
| 131 | U24p1 = 1.+4*U2; sU24p1 = sqrt(U24p1);
|
---|
| 132 | den = 1.+U02*tt0tau2; den *= den;
|
---|
| 133 | dPdU2 = 4.*U2/(U24p1*sU24p1);
|
---|
| 134 |
|
---|
| 135 | Paczin = (1.+2.*U2)/sU24p1;
|
---|
| 136 | DgDpar[0] = DftoDm/Paczin *dPdU2* 2.*Par[0]/den;
|
---|
| 137 | DgDpar[1] = DftoDm/Paczin *dPdU2* 2.*U02*U02*Par[2]*tt0tau/den;
|
---|
| 138 | DgDpar[2] = -DftoDm/Paczin *dPdU2* 2.*U02*U02*tt0*tt0tau/den;
|
---|
| 139 | DgDpar[3] = 1.;
|
---|
| 140 |
|
---|
| 141 | Paczin = -2.5*log10(Paczin) + Par[3];
|
---|
| 142 | return (Paczin);
|
---|
| 143 | }
|
---|
| 144 |
|
---|
| 145 | /*=========================================================================*/
|
---|
| 146 | double LErrExt(double m,double *Par,double *DgDpar)
|
---|
| 147 | /* fonction des erreurs externes -- Cecile 23/02/94 */
|
---|
| 148 | {
|
---|
| 149 | double errext;
|
---|
| 150 | errext =exp(Par[1]*m) ;
|
---|
| 151 | if ( errext < 1.e-200 ) errext = 0.;
|
---|
| 152 | DgDpar[0] = errext;
|
---|
| 153 | errext *= Par[0];
|
---|
| 154 | DgDpar[1] = m*errext;
|
---|
| 155 | DgDpar[2] = 1.;
|
---|
| 156 | errext += Par[2];
|
---|
| 157 | return (errext);
|
---|
| 158 | }
|
---|
| 159 |
|
---|
| 160 | /*=========================================================================*/
|
---|
| 161 | void SetBosse_probnb(int iset)
|
---|
| 162 | {
|
---|
| 163 | if( iset<=0 ) Bosse_probnb=0; else Bosse_probnb=1;
|
---|
| 164 | }
|
---|
| 165 |
|
---|
| 166 | /*=========================================================================*/
|
---|
| 167 | int_4 Bosse(float *mag,float *err,int_4 ndata
|
---|
| 168 | ,float mean,int_4 nptmin,float scut,int_4 nptscut
|
---|
| 169 | ,float *chi2,int_4 *npoint,float *Pchi2
|
---|
| 170 | ,int_4 *ideb,int_4 *ifin,int_4 *classB,int_4 NbossMX)
|
---|
| 171 | /* Christophe 10/11/93 La Silla
|
---|
| 172 | **** Recherche de Bosses ****
|
---|
| 173 | ENTREE:
|
---|
| 174 | mag: magnitude
|
---|
| 175 | err: erreur sur la magnitude
|
---|
| 176 | ndata: nombre de donnees
|
---|
| 177 | mean: moyenne de reference pour calculer les bosses
|
---|
| 178 | nptmin: nombre minimum de points pour valider une bosse
|
---|
| 179 | scut, nptscut: definition des conditions d'arret de la bosse:
|
---|
| 180 | Soit un point de signe oppose a plus de abs(scut*sigma)
|
---|
| 181 | Soit nptscut points a moins de abs(scut*sigma)
|
---|
| 182 | si scut<=0. la seule interruption est sur le changement de signe
|
---|
| 183 | SORTIE:
|
---|
| 184 | chi2: Xi2 des bosses
|
---|
| 185 | npoint: nombre de points dans la bosse
|
---|
| 186 | Pchi2: probabilite de Xi2 des bosses
|
---|
| 187 | ideb: indice du debut de la bosse
|
---|
| 188 | ifin: indice de fin de la bosse (idem)
|
---|
| 189 | classB: tableau des indices de rangement par probabilite de Xi2 croissant
|
---|
| 190 | NbossMX: nombre maximum de bosses permis
|
---|
| 191 | Bosse: nombre de bosse trouvees
|
---|
| 192 | */
|
---|
| 193 | {
|
---|
| 194 | int_4 deb=DEB_Bosse;
|
---|
| 195 | int_4 ipo,ifirst,j,k,npt,i1,i2,sgn,sgnsave,nbosse,np_scut,cont_bosse,pass;
|
---|
| 196 | double v,av,ev,c2,sc2,pc2;
|
---|
| 197 |
|
---|
| 198 | ipo = sgnsave = npt = i1 = i2 = ifirst = np_scut = 0;
|
---|
| 199 | nbosse = -1;
|
---|
| 200 | c2 = sc2= pc2 = 0.;
|
---|
| 201 | nptmin = ( nptmin <= 0 ) ? 1 : nptmin ;
|
---|
| 202 | nptscut = ( nptscut <= 0 ) ? 1 : nptscut ;
|
---|
| 203 | scut = ( scut <= 0. ) ? 0. : scut ;
|
---|
| 204 |
|
---|
| 205 | while ( ipo < ndata ) {
|
---|
| 206 | ev = err[ipo];
|
---|
| 207 | v = 0.;
|
---|
| 208 | if ( ev > 0. ) v = ( mag[ipo] - mean ) / ev;
|
---|
| 209 | av = fabs(v);
|
---|
| 210 | sgn = ( v > 0. ) ? 1 : -1 ;
|
---|
| 211 | if ( deb >= 4 ) printf("ipo=%5d sgn=%2d v=%f ev=%f\n",ipo,sgn,v,ev);
|
---|
| 212 | /* conditions d'increment de la fluctuation*/
|
---|
| 213 | cont_bosse = 1;
|
---|
| 214 | if ( sgn != sgnsave && av > scut ) cont_bosse = 0;
|
---|
| 215 | if ( cont_bosse && ev > 0. ) {
|
---|
| 216 | npt++;
|
---|
| 217 | c2 += v*v;
|
---|
| 218 | pc2 += nberfc(av/Rac2) + Log2;
|
---|
| 219 | i2 = ipo;
|
---|
| 220 | if( av < scut ) { np_scut++;} else { np_scut=0;}
|
---|
| 221 | }
|
---|
| 222 | /* conditions d'arret de la fluctuation */
|
---|
| 223 | if ( ( cont_bosse == 0 && ev>0. ) ||
|
---|
| 224 | ( np_scut>=nptscut && ev>0. ) ||
|
---|
| 225 | ( ipo == ndata-1 ) ) {
|
---|
| 226 | /* y a t il assez de points ? */
|
---|
| 227 | if ( npt >= nptmin ) {
|
---|
| 228 | nbosse++;
|
---|
| 229 | /* on prend prob(xi2,npt)/2**(npt-1) */
|
---|
| 230 | if(Bosse_probnb)
|
---|
| 231 | pc2 = (double) probnb( (float) c2,npt,&pass) + (npt-1)*Log2;
|
---|
| 232 | if ( nbosse >= NbossMX ) {
|
---|
| 233 | printf("Bosse: Trop de bosses (%d), changez dimension tableaux",nbosse);
|
---|
| 234 | exit(-1);
|
---|
| 235 | } else if ( nbosse == 0 ) {
|
---|
| 236 | classB[0] = 0;
|
---|
| 237 | } else if ( nbosse > 0 ) {
|
---|
| 238 | for ( j=0;j<nbosse;j++)
|
---|
| 239 | if ( pc2 > fabs( (double) Pchi2[classB[j]] ) ) break;
|
---|
| 240 | for ( k=nbosse-1;k>=j;k--) classB[k+1] = classB[k];
|
---|
| 241 | classB[j] = nbosse;
|
---|
| 242 | }
|
---|
| 243 | Pchi2[nbosse] = sgnsave*pc2;
|
---|
| 244 | sc2 += sgnsave*c2;
|
---|
| 245 | chi2[nbosse] = sgnsave*c2;
|
---|
| 246 | npoint[nbosse] = npt;
|
---|
| 247 | ideb[nbosse] = i1;
|
---|
| 248 | ifin[nbosse] = i2;
|
---|
| 249 | if(deb>=3) printf("Find bosse %5d, npt=%5d lim=%5d %5d classB=%5d pc2=%.2f\n"
|
---|
| 250 | ,nbosse,npoint[nbosse],ideb[nbosse],ifin[nbosse]
|
---|
| 251 | ,classB[nbosse],Pchi2[nbosse]);
|
---|
| 252 | }
|
---|
| 253 | i1 = ipo;
|
---|
| 254 | npt = 1;
|
---|
| 255 | sgnsave = ( v > 0. ) ? 1 : -1;
|
---|
| 256 | c2 = v*v;
|
---|
| 257 | pc2 = nberfc(av/Rac2) + Log2;
|
---|
| 258 | }
|
---|
| 259 | ipo++;
|
---|
| 260 | }
|
---|
| 261 |
|
---|
| 262 | nbosse++;
|
---|
| 263 | if(deb) printf("Bosse: nombre de bosses trouvees=%d, somme des Pchi2=%f\n"
|
---|
| 264 | ,nbosse,sc2);
|
---|
| 265 | if ( nbosse > 0 && deb ) {
|
---|
| 266 | k=3;
|
---|
| 267 | if ( deb >= 2 ) k=nbosse;
|
---|
| 268 | for (ipo=0;ipo<k;ipo++) {
|
---|
| 269 | j = classB[ipo];
|
---|
| 270 | printf("Find bosse %4d, npt=%5d lim=%5d %5d pc2=%.2f\n"
|
---|
| 271 | ,j,npoint[j],ideb[j],ifin[j],Pchi2[j]);
|
---|
| 272 | }
|
---|
| 273 | }
|
---|
| 274 | return(nbosse);
|
---|
| 275 | }
|
---|
| 276 |
|
---|
| 277 | /*=========================================================================*/
|
---|
| 278 | int BosseN(float *mag,float *err,int_4 ndata
|
---|
| 279 | ,float mean,float smin,int_4 nptsmin,float scut,int_4 nptscut
|
---|
| 280 | ,float *chi2,int_4 *npoint,float *Pchi2
|
---|
| 281 | ,int_4 *ideb,int_4 *ifin,int_4 *classB,int_4 NbossMX)
|
---|
| 282 | /* Christophe 27/12/95 Saclay
|
---|
| 283 | **** Recherche de Bosses sur courbe de lumiere ****
|
---|
| 284 | ENTREE:
|
---|
| 285 | mag: tableau des magnitudes
|
---|
| 286 | err: tableau des erreurs sur la magnitude (<=0 point non considere)
|
---|
| 287 | ndata: nombre de donnees dans les tableaux (mag,err)
|
---|
| 288 | mean: ligne de base par rapport a laquelle les bosses sont determinees
|
---|
| 289 | smin, nptsmin: condition de validation d une bosse:
|
---|
| 290 | nombre minimum de points au dessus (dessous)
|
---|
| 291 | de smin*err (-smin*err) pour valider une bosse
|
---|
| 292 | scut : condition de demarrage d une bosse:
|
---|
| 293 | 1 point > scut (ou < -scut)
|
---|
| 294 | scut, nptscut: definition des conditions d'arret de la bosse:
|
---|
| 295 | nptscut points a moins de scut**err si bosse positive
|
---|
| 296 | nptscut points a plus de -scut**err si bosse negative
|
---|
| 297 | Conseil: scut = 1.
|
---|
| 298 | NbossMX: nombre maximum permis de bosses
|
---|
| 299 | SORTIE:
|
---|
| 300 | chi2: tableau des Xi2 des bosses
|
---|
| 301 | npoint: tableau des nombres de points dans les bosses (du meme signe que la bosse)
|
---|
| 302 | Pchi2: tableau des probabilites de Xi2 des bosses
|
---|
| 303 | ideb: tableau des indices de debut des bosses
|
---|
| 304 | ifin: tableau des indices de fin des bosses (idem)
|
---|
| 305 | classB: tableau des indices de rangement par probabilite de Xi2 croissant
|
---|
| 306 | ex: pchi2 de la 3ieme bosse = Pchi2[classB[2]]
|
---|
| 307 | return: Bosse: nombre de bosses trouvees
|
---|
| 308 | REMARQUE:
|
---|
| 309 | npoints != ifin-ideb+1 car
|
---|
| 310 | 1-/ il y a des points a erreur <=0
|
---|
| 311 | 2-/ les points de signes opposes
|
---|
| 312 | au signe de la bosse ne sont pas comptabilises
|
---|
| 313 | c'est le nombre de points de meme signe que la bosse dans la bosse
|
---|
| 314 | le nombre total de points dans la bossse est ifin-ideb+1
|
---|
| 315 | */
|
---|
| 316 | {
|
---|
| 317 | int deb=DEB_Bosse; /* 0,1,2,3 */
|
---|
| 318 | int j,k,ipo,npt=0,npt_cut=0,npt_c2_cut=0,i1=-1,i2=-1,sgn,sgnsave,nbosse,npt_valid,pass;
|
---|
| 319 | double v,av,ev,c2,pc2,c2_cut,pc2_cut;
|
---|
| 320 | char s;
|
---|
| 321 |
|
---|
| 322 | if(smin<0.) smin = 1.;
|
---|
| 323 | if(nptsmin<=0) nptsmin = 1;
|
---|
| 324 | if(scut<0.) scut = 1.;
|
---|
| 325 | if(nptscut<=0) nptscut = 1;
|
---|
| 326 |
|
---|
| 327 | if(deb>=1) printf("***** BosseN ndata=%d smin=%d, %f scut=%d, %f\n"
|
---|
| 328 | ,ndata,nptsmin,smin,nptscut,scut);
|
---|
| 329 |
|
---|
| 330 | if( ndata <= 1 ) return(-1);
|
---|
| 331 |
|
---|
| 332 | nbosse = -1;
|
---|
| 333 | ipo = sgnsave = 0;
|
---|
| 334 |
|
---|
| 335 | for (;;) {
|
---|
| 336 | /* caracteristiques du point ipo */
|
---|
| 337 | ev = err[ipo];
|
---|
| 338 | if ( ev > 0. ) v = ( mag[ipo] - mean ) / ev; else v = 0.;
|
---|
| 339 | if ( v > 0. ) { av = v; sgn = 1; } else { av = -v; sgn = -1; }
|
---|
| 340 | if (deb>=3)
|
---|
| 341 | printf(" ipo=%5d sgn=%2d v=%f ev=%f c2=%f\n",ipo,sgn,v,ev,v*v);
|
---|
| 342 | if ( ev>0. && sgnsave==0 && av>=scut ) {
|
---|
| 343 | /* essai d'une nouvelle bosse (sgnsave==0), on demarre si > scut */
|
---|
| 344 | i1 = i2 = ipo;
|
---|
| 345 | sgnsave = sgn;
|
---|
| 346 | c2 = v*v;
|
---|
| 347 | pc2 = nberfc(av/Rac2) + Log2;
|
---|
| 348 | npt = 1;
|
---|
| 349 | if( av >= smin ) npt_valid = 1; else npt_valid = 0;
|
---|
| 350 | c2_cut = pc2_cut = 0.;
|
---|
| 351 | npt_cut = npt_c2_cut = 0;
|
---|
| 352 | if(deb>=3)
|
---|
| 353 | printf("* Dep bosse [%d] i1=%d n,c2,pc2= %d, %.3f, %.3f\n"
|
---|
| 354 | ,sgnsave,i1,npt,c2,pc2);
|
---|
| 355 | } else if( sgnsave!=0 &&
|
---|
| 356 | ( (ev>0. && sgnsave*v<scut) || ipo==ndata-1 ) ) {
|
---|
| 357 | /* c'est une possibilite de fin de bosse */
|
---|
| 358 | /* c a d soit un point normal en position de coupure */
|
---|
| 359 | /* soit le dernier point des tableaux */
|
---|
| 360 | if ( ev>0. && sgnsave*v<scut ) {
|
---|
| 361 | /* point normal ou dernier point dans des conditions d arret de bosse */
|
---|
| 362 | s = '-';
|
---|
| 363 | npt_cut++;
|
---|
| 364 | if( sgn == sgnsave ) {
|
---|
| 365 | npt_c2_cut++;
|
---|
| 366 | c2_cut += v*v;
|
---|
| 367 | pc2_cut += nberfc(av/Rac2) + Log2;
|
---|
| 368 | }
|
---|
| 369 | } else if ( ev>0. && sgnsave*v>=scut ) {
|
---|
| 370 | /* c-a-d le dernier point (ipo==ndata-1) */
|
---|
| 371 | /* avec une amplitude (grande) continuant la bosse */
|
---|
| 372 | /* --> dans ce cas la bosse doit inclure ce point */
|
---|
| 373 | /* et eventuellement les precedents de cette coupure */
|
---|
| 374 | s = '+';
|
---|
| 375 | npt += 1 + npt_c2_cut;
|
---|
| 376 | c2 += v*v + c2_cut;
|
---|
| 377 | pc2 += nberfc(av/Rac2) + Log2 + pc2_cut;
|
---|
| 378 | if( av >= smin ) npt_valid++;
|
---|
| 379 | i2 = ipo;
|
---|
| 380 | } else {
|
---|
| 381 | /* cas ipo==ndata-1 et ev<=0. : point ignore */
|
---|
| 382 | s = '0';
|
---|
| 383 | }
|
---|
| 384 | if(deb>=3)
|
---|
| 385 | printf("- Fin%c ncut=%d n,c2,pc2= %d, %.3f, %.3f cut= %d, %.3f, %.3f\n"
|
---|
| 386 | ,s,npt_cut,npt,c2,pc2,npt_c2_cut,c2_cut,pc2_cut);
|
---|
| 387 | if ( npt_cut>=nptscut || ipo==ndata-1 ) {
|
---|
| 388 | /* c'est une fin de bosse */
|
---|
| 389 | if ( npt_valid >= nptsmin ) {
|
---|
| 390 | /* validation de la bosse */
|
---|
| 391 | nbosse++;
|
---|
| 392 | /* on prend prob(xi2,npt)/2**(npt-1) */
|
---|
| 393 | if(Bosse_probnb)
|
---|
| 394 | pc2 = (double) probnb((float) c2,npt,&pass) + (npt-1)*Log2;
|
---|
| 395 | if ( nbosse >= NbossMX ) {
|
---|
| 396 | printf("Bosse: Trop de bosses (%d), changez dimension tableaux",nbosse);
|
---|
| 397 | return(-NbossMX);
|
---|
| 398 | } else if ( nbosse == 0 ) {
|
---|
| 399 | classB[0] = 0;
|
---|
| 400 | } else if ( nbosse > 0 ) {
|
---|
| 401 | for ( j=0;j<nbosse;j++)
|
---|
| 402 | if ( pc2 > fabs( (double) Pchi2[classB[j]] ) ) break;
|
---|
| 403 | for ( k=nbosse-1;k>=j;k--) classB[k+1] = classB[k];
|
---|
| 404 | classB[j] = nbosse;
|
---|
| 405 | }
|
---|
| 406 | Pchi2[nbosse] = sgnsave*pc2;
|
---|
| 407 | chi2[nbosse] = sgnsave*c2;
|
---|
| 408 | npoint[nbosse] = npt;
|
---|
| 409 | ideb[nbosse] = i1;
|
---|
| 410 | ifin[nbosse] = i2;
|
---|
| 411 | if(deb>=3)
|
---|
| 412 | printf("* Bosse %d, lim=%d %d classB=%d n,c2,pc2=%d %.3f %.3f\n"
|
---|
| 413 | ,nbosse,ideb[nbosse],ifin[nbosse],classB[nbosse]
|
---|
| 414 | ,npoint[nbosse],chi2[nbosse],Pchi2[nbosse]);
|
---|
| 415 | } else {
|
---|
| 416 | if(deb>=3) printf("* Bosse rejetee npt=%d /%d\n",npt,nptsmin);
|
---|
| 417 | }
|
---|
| 418 | sgnsave = 0;
|
---|
| 419 | ipo = i2;
|
---|
| 420 | }
|
---|
| 421 | } else if ( ev>0. && sgnsave!=0 ) {
|
---|
| 422 | /* c'est un point normal dans la bosse */
|
---|
| 423 | npt += 1 + npt_c2_cut;
|
---|
| 424 | c2 += v*v + c2_cut;
|
---|
| 425 | pc2 += nberfc(av/Rac2) + Log2 + pc2_cut;
|
---|
| 426 | if( av >= smin ) npt_valid++;
|
---|
| 427 | i2 = ipo;
|
---|
| 428 | if(deb>=3)
|
---|
| 429 | printf("- add point i2=%d n,c2,pc2= %d, %.3f, %.3f cut= %d, %.3f, %.3f\n"
|
---|
| 430 | ,i2,npt,c2,pc2,npt_c2_cut,c2_cut,pc2_cut);
|
---|
| 431 | npt_cut = npt_c2_cut = 0;
|
---|
| 432 | c2_cut = pc2_cut = 0.;
|
---|
| 433 | } else {
|
---|
| 434 | /* point a erreur negative ou points a moins de scut sans bosse demarree */
|
---|
| 435 | if(deb>=3)
|
---|
| 436 | printf("- pas de bosse demarree (%d) ou erreur negative (%f)\n"
|
---|
| 437 | ,sgnsave,ev);
|
---|
| 438 | }
|
---|
| 439 | ipo++;
|
---|
| 440 | if(ipo >= ndata ) break;
|
---|
| 441 | }
|
---|
| 442 | nbosse++;
|
---|
| 443 |
|
---|
| 444 | if(deb>=1) {
|
---|
| 445 | printf("Bosse: nombre de bosses trouvees=%d\n",nbosse);
|
---|
| 446 | if ( nbosse>0 ) {
|
---|
| 447 | printf("********************************************************\n");
|
---|
| 448 | k=3;
|
---|
| 449 | if ( deb>=2 ) k=nbosse;
|
---|
| 450 | for (ipo=0;ipo<k;ipo++) {
|
---|
| 451 | j = classB[ipo];
|
---|
| 452 | printf("* bosse %4d, lim=%5d %5d n,c2,pc2=%d %.3f %.3f\n"
|
---|
| 453 | ,j,ideb[j],ifin[j],npoint[j],chi2[j],Pchi2[j]);
|
---|
| 454 | }
|
---|
| 455 | printf("********************************************************\n");
|
---|
| 456 | }
|
---|
| 457 | }
|
---|
| 458 |
|
---|
| 459 | return(nbosse);
|
---|
| 460 | }
|
---|
| 461 |
|
---|
| 462 | /*=========================================================================*/
|
---|
| 463 | int_4 BossePaG(float *temps,float *mag,float *err,int_4 ndata,float mean
|
---|
| 464 | ,int_4 I1,int_4 I2,float *U0,float *T0,float *Tau)
|
---|
| 465 | /* Christophe 11/11/93 La Silla
|
---|
| 466 | **** Recherche des parametres U0,T0,Tau d'une bosse ****
|
---|
| 467 | bosse + ou - en magnitude ou en flux
|
---|
| 468 | ENTREE:
|
---|
| 469 | temps: temps
|
---|
| 470 | mag: magnitude
|
---|
| 471 | err: erreur sur la magnitude
|
---|
| 472 | ndata: nombre de donnees (si >0 mag=magnitudes, si <0 mag=flux)
|
---|
| 473 | mean: valeur de la ligne de base
|
---|
| 474 | I1: indice de depart de la bosse
|
---|
| 475 | I2: indice de fin de la bosse
|
---|
| 476 | U0: si >0 la bosse est positive, si <0 la bosse est negative
|
---|
| 477 | SORTIE:
|
---|
| 478 | U0: estimation du parametre d'impact U0
|
---|
| 479 | T0: estimation du temps de minimum d'approche T0
|
---|
| 480 | Tau: estimation de la largeur Tau
|
---|
| 481 | BossePaG: retourne 0 si calcul ok, <0 sinon
|
---|
| 482 | Methode:
|
---|
| 483 | Les parametres T0 et Tau sont estimes a partir de la
|
---|
| 484 | distribution en temps des points dans la bosse,
|
---|
| 485 | U0 par l'estimation de la hauteur de la gaussienne de sigma
|
---|
| 486 | calcule pour la valeur de Tau et de l'aire de la bosse.
|
---|
| 487 | */
|
---|
| 488 | {
|
---|
| 489 | int_4 deb=DEB_BossePaG;
|
---|
| 490 | int_4 i,flu=0,bossp=1;
|
---|
| 491 | float tprev,magprev;
|
---|
| 492 | double v,m,s,norm,sint,hgauss,a,aa,u12,hmax;
|
---|
| 493 | int ifirst;
|
---|
| 494 |
|
---|
| 495 | if( ndata<0 ) { flu=1; ndata *= -1;}
|
---|
| 496 | if( *U0<0 ) bossp = -1;
|
---|
| 497 | *U0 = *T0 = *Tau = 0.;
|
---|
| 498 | if ( I2 <= I1 ) {printf("BossePaG: I1 <= I2 %d %d\n",I1,I2); return(-1);}
|
---|
| 499 | if ( mean <= 0. && flu ) return(-11);
|
---|
| 500 | if(deb) printf("BossePaG: de I1=%d a I2=%d n=%d mean=%g flu=%d\n"
|
---|
| 501 | ,I1,I2,ndata,mean,flu);
|
---|
| 502 |
|
---|
| 503 | /* Calcul de T0 et Tau */
|
---|
| 504 | hmax= -1.e30;
|
---|
| 505 | tprev = temps[I1]; magprev = mean; /* $CHECK$ EA pas cool l'init de magprev */
|
---|
| 506 | /* magprev peut etre une amplitude, mais pas mean !! */
|
---|
| 507 | /* $CHECK$ EA si on tue le point I1, sint delire. Je rajoute ifirst */
|
---|
| 508 | m = s = norm = sint = 0.;
|
---|
| 509 | ifirst = 1;
|
---|
| 510 | for (i=I1;i<=I2;i++) {
|
---|
| 511 | if ( err[i] <= 0. ) continue;
|
---|
| 512 | if(flu && bossp<0 && mag[i]<=0.) continue;
|
---|
| 513 | if(flu && bossp>=0) a = mag[i]/mean-1.;
|
---|
| 514 | else if(flu && bossp<0) a = 1.-mean/mag[i];
|
---|
| 515 | else a = mag[i]-mean;
|
---|
| 516 | aa = bossp*a;
|
---|
| 517 | if( aa<=0 ) continue;
|
---|
| 518 | if( aa > hmax ) hmax=aa;
|
---|
| 519 | v = temps[i];
|
---|
| 520 | m += v*aa;
|
---|
| 521 | s += v*v*aa;
|
---|
| 522 | norm += aa;
|
---|
| 523 | if ( !ifirst )
|
---|
| 524 | sint += (temps[i]-tprev)*(a+magprev)/2.;
|
---|
| 525 | else
|
---|
| 526 | ifirst = 0;
|
---|
| 527 | tprev = temps[i];
|
---|
| 528 | magprev = a;
|
---|
| 529 | }
|
---|
| 530 | if(norm <= 0. ) return(-2);
|
---|
| 531 | sint = fabs(sint);
|
---|
| 532 | m = m/norm;
|
---|
| 533 | s = s/norm - m*m;
|
---|
| 534 | if(s <= 0.) return(-3);
|
---|
| 535 | s = sqrt(s);
|
---|
| 536 | hgauss = sint / S2Pi / s;
|
---|
| 537 | if (deb>=2) printf("m=%f s=%f int=%f hgauss=%f hmax=%f\n",m,s,sint,hgauss,hmax);
|
---|
| 538 |
|
---|
| 539 | /* T0 = moyenne */
|
---|
| 540 | *T0 = m;
|
---|
| 541 |
|
---|
| 542 | /* U0 = hauteur de la gaussienne de sigma s */
|
---|
| 543 | if(flu) a = hgauss+1.; else a = pow(10.,0.4*hgauss);
|
---|
| 544 | if(a<=1. || a>= sqrt(GRAND2)) return(-4);
|
---|
| 545 | *U0 = 2.*(a/sqrt(a*a-1.)-1.);
|
---|
| 546 | if(deb>=2) printf("A0=%f u0^2=%f",a,*U0);
|
---|
| 547 |
|
---|
| 548 | /* Tau = en considerant que 2.36*s est la largeur
|
---|
| 549 | a mi-hauteur (magnitude) de la courbe de pazcinski */
|
---|
| 550 | if(flu) a = hgauss/2.+1.; else a = pow(10.,0.2*hgauss);
|
---|
| 551 | if(a<1.) return(-5);
|
---|
| 552 | u12 = 2*(a/sqrt(a*a-1.)-1.);
|
---|
| 553 | if (deb>=2) printf(" a1/2=%f u1/2^2=%f\n",a,u12);
|
---|
| 554 | v = 2.36*s/2.;
|
---|
| 555 | if ( u12 <= *U0 ) return(-6);
|
---|
| 556 | v = v*v/(u12-*U0);
|
---|
| 557 | *Tau = sqrt(v);
|
---|
| 558 | *U0 = sqrt(*U0);
|
---|
| 559 | if (deb) printf("BossePaG: U0=%f, T0=%f, Tau=%f\n",*U0,*T0,*Tau);
|
---|
| 560 |
|
---|
| 561 | return(0);
|
---|
| 562 | }
|
---|
| 563 |
|
---|
| 564 | /*=========================================================================*/
|
---|
| 565 | float SigmaInt(float *temps,float *mag,float *err,int_4 *ndata,float nsigma)
|
---|
| 566 | /* Christophe 12/11/93 La Silla
|
---|
| 567 | **** Calcul du sigma interne d'une courbe de lumiere ****
|
---|
| 568 | ENTREE:
|
---|
| 569 | temps: temps
|
---|
| 570 | mag: magnitude
|
---|
| 571 | err: erreur sur la magnitude
|
---|
| 572 | ndata: nombre de donnees
|
---|
| 573 | nsigma: nombre de sigmas pour la coupure de la 2sd passe
|
---|
| 574 | si <=0 une seule passe
|
---|
| 575 | SORTIE:
|
---|
| 576 | SigmaInt: retourne le sigma Interne ou <0 si il y a eu un probleme
|
---|
| 577 | - Methode: On calcul le sigma avec la dispersion d'un point Y(t) et de la
|
---|
| 578 | prediction lineaire a partir de ses 2 voisins Y0(t) et Y1(t):
|
---|
| 579 | M = Y - Ypred = Y - (Y1 +(Y2-Y1)/(t2-t1)*(t-t1))
|
---|
| 580 | le calcul de propagation des erreurs donne:
|
---|
| 581 | SM = 2*(R^2-R+1)*SY avec SY=SY1=SY2 et R=(t-t1)/(t2-t1) (<1.)
|
---|
| 582 | donc pour avoir SY on calcul le sigma de la quantite:
|
---|
| 583 | M et on divise le resultat par sqrt( <2*(R^2-R+1)> )
|
---|
| 584 | ce qui dans le cas ou les points sont equidistants
|
---|
| 585 | donne comme R=1/2: SM/sqrt(3/2)
|
---|
| 586 | */
|
---|
| 587 | {
|
---|
| 588 | int_4 deb=DEB_SigmaInt;
|
---|
| 589 | int_4 pass,passmx,i,n=0;
|
---|
| 590 | float sigma;
|
---|
| 591 | double m,s,fpred,R,sR;
|
---|
| 592 |
|
---|
| 593 | passmx = ( nsigma > 0. ) ? 2 : 1 ;
|
---|
| 594 | if ( *ndata < 3 ) return(-1.);
|
---|
| 595 | sigma = GRAND;
|
---|
| 596 | if( nsigma <= 0. ) nsigma = 1.;
|
---|
| 597 | for (pass=1;pass<=passmx;pass++) {
|
---|
| 598 | n=0;
|
---|
| 599 | m = s = sR = 0.;
|
---|
| 600 | for (i=1;i<*ndata-1;i++) {
|
---|
| 601 | if ( err[i] > 0. && err[i-1] > 0. && err[i+1] > 0. ) {
|
---|
| 602 | R = ( temps[i] - temps[i-1] ) / ( temps[i+1]- temps[i-1] );
|
---|
| 603 | fpred = mag[i] - ( mag[i-1] + (mag[i+1]- mag[i-1] )*R );
|
---|
| 604 | if ( fabs(fpred) < nsigma*sigma ) {
|
---|
| 605 | m += fpred;
|
---|
| 606 | s += fpred*fpred;
|
---|
| 607 | sR += 2.*(R*R-R+1.);
|
---|
| 608 | n++;
|
---|
| 609 | } } }
|
---|
| 610 | if ( n <= 0 ) return(-2.);
|
---|
| 611 | m = m/n;
|
---|
| 612 | sR = sR/n;
|
---|
| 613 | sigma = sqrt(s/n) / sqrt(sR);
|
---|
| 614 | if ( deb ) printf("SigmaInt: pass=%d sigma=%f m=%f sR=%f npoints=%d\n"
|
---|
| 615 | ,pass,sigma,m,sR,n);
|
---|
| 616 | }
|
---|
| 617 | *ndata = n;
|
---|
| 618 | return(sigma);
|
---|
| 619 | }
|
---|
| 620 |
|
---|
| 621 | /*=========================================================================*/
|
---|
| 622 | int_4 FiltMed(float *mag,float *err
|
---|
| 623 | ,float *magflt, float* errflt, int_4 ndata)
|
---|
| 624 | /* Christophe 13/11/93 La Silla
|
---|
| 625 | **** Filtre Statistique Median a 3 points ****
|
---|
| 626 | ENTREE:
|
---|
| 627 | mag: magnitude
|
---|
| 628 | err: erreur sur la magnitude
|
---|
| 629 | ndata: nombre de donnees
|
---|
| 630 | SORTIE:
|
---|
| 631 | magflt: magnitude filtree
|
---|
| 632 | errflt: erreur sur la magnitude filtree
|
---|
| 633 | FiltMed: retourne 0 si ok, <0 sinon.
|
---|
| 634 | */
|
---|
| 635 | {
|
---|
| 636 | int deb=DEB_FiltMed;
|
---|
| 637 | int j,k0,k1,k2,imin=-1,imax=-1;
|
---|
| 638 |
|
---|
| 639 | if ( ndata<3 ) {
|
---|
| 640 | for (k0=0;k0<ndata;k0++)
|
---|
| 641 | { magflt[k0] = mag[k0]; errflt[k0] = err[k0];}
|
---|
| 642 | return(-1);
|
---|
| 643 | }
|
---|
| 644 |
|
---|
| 645 | /* filtre median sur tous les points sauf le premier et le dernier */
|
---|
| 646 | for (k0=1;k0<ndata-1;k0++) {
|
---|
| 647 | magflt[k0] = mag[k0]; errflt[k0] = err[k0];
|
---|
| 648 | if ( err[k0] <= 0. ) continue;
|
---|
| 649 | /*recherche du 1er point inferieur utilisable */
|
---|
| 650 | k1 = k0-1; while ( err[k1] <= 0. && k1 > 0 ) k1--;
|
---|
| 651 | /* recherche du 1er point superieur utilisable */
|
---|
| 652 | k2 = k0+1; while ( err[k2] <= 0. && k2 < ndata-1 ) k2++;
|
---|
| 653 | if ( err[k1]<=0. || err[k2]<=0. ) continue;
|
---|
| 654 | if ((mag[k1]-mag[k0])*(mag[k2]-mag[k0])<0.) j=k0;
|
---|
| 655 | else if((mag[k0]-mag[k1])*(mag[k2]-mag[k1])<0.) j=k1;
|
---|
| 656 | else if((mag[k1]-mag[k2])*(mag[k0]-mag[k2])<0.) j=k2;
|
---|
| 657 | else {
|
---|
| 658 | if (mag[k0]==mag[k1]) {if(err[k0]<=err[k1]) j=k0; else j=k1;}
|
---|
| 659 | else if(mag[k1]==mag[k2]) {if(err[k1]<=err[k2]) j=k1; else j=k2;}
|
---|
| 660 | else {if(err[k2]< err[k0]) j=k2; else j=k0;}
|
---|
| 661 | }
|
---|
| 662 | magflt[k0] = mag[j]; errflt[k0] = err[j];
|
---|
| 663 | if( imin == -1 ) imin = k0; imax = k0;
|
---|
| 664 | }
|
---|
| 665 |
|
---|
| 666 | /* cas du premier point */
|
---|
| 667 | k0 = 0; magflt[k0] = mag[k0]; errflt[k0] = err[k0];
|
---|
| 668 | if( err[k0]>0. && imin>=0 )
|
---|
| 669 | { magflt[k0] = magflt[imin]; errflt[k0] = errflt[imin];}
|
---|
| 670 |
|
---|
| 671 | /* cas du dernier point */
|
---|
| 672 | k0 = ndata-1; magflt[k0] = mag[k0]; errflt[k0] = err[k0];
|
---|
| 673 | if( err[k0]>0. && imax>=0 )
|
---|
| 674 | { magflt[k0] = magflt[imax]; errflt[k0] = errflt[imax];}
|
---|
| 675 |
|
---|
| 676 | /* debug? */
|
---|
| 677 | if (deb>=1) {
|
---|
| 678 | printf("FiltMed:");
|
---|
| 679 | for(k0=0;k0<ndata+10;k0+=10) {
|
---|
| 680 | for(j=k0; j<k0+10 && j<ndata; j++)
|
---|
| 681 | { if(k0==j) printf("\nF "); printf(" %10.3f",mag[j]);}
|
---|
| 682 | for(j=k0; j<k0+10 && j<ndata; j++)
|
---|
| 683 | { if(k0==j) printf("\nE "); printf(" %10.3f",err[j]);}
|
---|
| 684 | for(j=k0; j<k0+10 && j<ndata; j++)
|
---|
| 685 | { if(k0==j) printf("\nFf"); printf(" %10.3f",magflt[j]);}
|
---|
| 686 | for(j=k0; j<k0+10 && j<ndata; j++)
|
---|
| 687 | { if(k0==j) printf("\nEf"); printf(" %10.3f",errflt[j]);}
|
---|
| 688 | }
|
---|
| 689 | printf("\n");
|
---|
| 690 | }
|
---|
| 691 |
|
---|
| 692 | return(0);
|
---|
| 693 | }
|
---|
| 694 |
|
---|
| 695 | /*=========================================================================*/
|
---|
| 696 | int_4 FiltInt(float *temps,float *mag,float *err,int_4 ndata,int_4 I1,int_4 I2
|
---|
| 697 | ,float lbosse,int_4 npomin,int_4 *ideb,int_4 *ifin)
|
---|
| 698 | /* Christophe 15/11/93 La Silla
|
---|
| 699 | **** Calcul de l'intervalle pour le fit ****
|
---|
| 700 | ENTREE:
|
---|
| 701 | temps: temps
|
---|
| 702 | mag: magnitude
|
---|
| 703 | err: erreur sur la magnitude
|
---|
| 704 | ndata: nombre de donnees
|
---|
| 705 | I1: 1er indice de la bosse
|
---|
| 706 | I2: dernier indice de la bosse
|
---|
| 707 | lbosse: largeur (en unite de largeur de bosse)
|
---|
| 708 | a rajouter de part et d'autre de la bosse
|
---|
| 709 | npomin: nombre de points minimum avant/apres la bosse
|
---|
| 710 | SORTIE:
|
---|
| 711 | ideb: indice du debut de l'intervalle
|
---|
| 712 | ifin: indice de fin de l'intervalle
|
---|
| 713 | FiltInt: retourne nombre de points dans l'intervalle et hors bosse,
|
---|
| 714 | <0 si probleme.
|
---|
| 715 | */
|
---|
| 716 | {
|
---|
| 717 | int_4 deb=DEB_FiltInt;
|
---|
| 718 | int_4 i,n,ntot;
|
---|
| 719 | float t1,t2;
|
---|
| 720 | double dt;
|
---|
| 721 |
|
---|
| 722 | if ( I2 <= I1 ) {printf("FiltInt: I2 <= I1 %d %d\n",I1,I2); return(-1);}
|
---|
| 723 |
|
---|
| 724 | ntot = 0;
|
---|
| 725 | t1 = temps[I1];
|
---|
| 726 | t2 = temps[I2];
|
---|
| 727 | lbosse = (lbosse<=0.) ? 1. : lbosse ;
|
---|
| 728 | dt = (t2-t1)*lbosse;
|
---|
| 729 | if(deb>1) printf("FiltInt: limites bosse %f %f (%f)\n",t1,t2,dt);
|
---|
| 730 | t1 -= dt;
|
---|
| 731 | t2 += dt;
|
---|
| 732 | if(deb>1) printf("FiltInt: limites intervalle de fit %f %f\n",t1,t2);
|
---|
| 733 |
|
---|
| 734 | /* calcul de la borne inferieure de fit */
|
---|
| 735 | n=0;
|
---|
| 736 | for (i=I1;i>=0;i--) {
|
---|
| 737 | if(err[i] > 0. ) {
|
---|
| 738 | n++;
|
---|
| 739 | if( temps[i] < t1 && n > npomin ) break;
|
---|
| 740 | } }
|
---|
| 741 | ntot += n;
|
---|
| 742 | *ideb= ( i<0 ) ? 0 : i;
|
---|
| 743 |
|
---|
| 744 | /* calcul de la borne superieure de fit */
|
---|
| 745 | n=0;
|
---|
| 746 | for (i=I2;i<ndata;i++) {
|
---|
| 747 | if(err[i] > 0. ) {
|
---|
| 748 | n++;
|
---|
| 749 | if( temps[i] > t2 && n > npomin ) break;
|
---|
| 750 | } }
|
---|
| 751 | ntot += n;
|
---|
| 752 | *ifin= ( i>= ndata ) ? ndata-1 : i;
|
---|
| 753 |
|
---|
| 754 | if(deb) printf("FiltInt: limites intervalle de fit %d %d\n",*ideb,*ifin);
|
---|
| 755 |
|
---|
| 756 | return(ntot);
|
---|
| 757 | }
|
---|
| 758 |
|
---|
| 759 | /*======================================================================================*/
|
---|
| 760 | double chi2_exterieur(float *mag,float *err,int_4 ndata,float mean
|
---|
| 761 | ,int_4 I1,int_4 I2,int_4 *npt)
|
---|
| 762 | /* Cecile
|
---|
| 763 | calcul du Chi2 par degre de liberte a l'exterieur de la bosse delimitee par i1 et I2
|
---|
| 764 | ENTREE :
|
---|
| 765 | mag : magnitude
|
---|
| 766 | err : erreur sur la magnitude
|
---|
| 767 | ndata : nombre de donnees
|
---|
| 768 | mean : moyenne des mesures
|
---|
| 769 | I1, I2 : limites de la bosse
|
---|
| 770 | SORTIE:
|
---|
| 771 | chi2_exterieur : valeur du Chi2 reduit a l'exterieur de la bosse
|
---|
| 772 | */
|
---|
| 773 | {
|
---|
| 774 | int_4 i;
|
---|
| 775 | double chi2,d;
|
---|
| 776 |
|
---|
| 777 | if ( I2 <= I1 ) {printf("chi2_ext. : I2 <= I1 %d %d\n",I1,I2); return(-1.);}
|
---|
| 778 |
|
---|
| 779 | *npt=0;
|
---|
| 780 | chi2=0.;
|
---|
| 781 |
|
---|
| 782 | if(I1>0) {
|
---|
| 783 | for(i=0;i<I1;i++) {
|
---|
| 784 | if( err[i] > 0.) {
|
---|
| 785 | d = (mag[i] - mean) / err[i];
|
---|
| 786 | chi2+= d*d;
|
---|
| 787 | (*npt)++;
|
---|
| 788 | } } }
|
---|
| 789 |
|
---|
| 790 | if(I2<ndata) {
|
---|
| 791 | for(i=I2+1;i<ndata;i++) {
|
---|
| 792 | if( err[i] > 0.) {
|
---|
| 793 | d = (mag[i] - mean) / err[i];
|
---|
| 794 | chi2+= d*d;
|
---|
| 795 | (*npt)++;
|
---|
| 796 | } } }
|
---|
| 797 |
|
---|
| 798 | return(chi2);
|
---|
| 799 | }
|
---|
| 800 |
|
---|
| 801 | /*===================================================================*/
|
---|
| 802 | double Dt_PacZin(double u0,double tau,double A)
|
---|
| 803 | /* pour calculer le DT ou la paczinsky a une ampli de A */
|
---|
| 804 | {
|
---|
| 805 | double x;
|
---|
| 806 | if( A <= 1. ) return(-1.);
|
---|
| 807 | x = 2.*( A / sqrt(A*A-1.) - 1. ) - u0*u0;
|
---|
| 808 | if( x <= 0. ) return(-2.);
|
---|
| 809 | x = tau * sqrt(x);
|
---|
| 810 | return(x);
|
---|
| 811 | }
|
---|
| 812 |
|
---|
| 813 | /*==================================================================*/
|
---|
| 814 | int_4 Most_3D2D(float *Y,float *EY,int_4 *ndata,float Ymin,float Ymax
|
---|
| 815 | ,float *Res_2D,float *Res_3D)
|
---|
| 816 | /*
|
---|
| 817 | Pour calculer la valeur la + probable par estimation des parametres
|
---|
| 818 | d'une distribution parabolique / polynome de degre 3
|
---|
| 819 | INPUT:
|
---|
| 820 | Y: tableau des valeurs
|
---|
| 821 | EY: tableau des erreurs (<=0 point non traite)
|
---|
| 822 | ndata: nombre de valeurs
|
---|
| 823 | Ymin,Ymax: limites des valeurs a considerees pour Y
|
---|
| 824 | OUTPUT:
|
---|
| 825 | ndata: nombre de valeurs utilisees pour le calcul
|
---|
| 826 | Res_2D: resultat du fit parabolique
|
---|
| 827 | Res_3D: resultat du fit polynome d'ordre 3
|
---|
| 828 | rc: validation des resultats
|
---|
| 829 | =0 : probleme
|
---|
| 830 | =1 : fit parabolique ok
|
---|
| 831 | =2 : fit polynome_ordre_3 ok
|
---|
| 832 | =3 : fit parabolique + polynome_ordre_3 ok
|
---|
| 833 | */
|
---|
| 834 | {
|
---|
| 835 | int i,n,Flag,lp=0;
|
---|
| 836 | double xmoy,x2moy,x3moy;
|
---|
| 837 | double v1,v2,VN,det;
|
---|
| 838 | double M3[3][3],M2[2][2],B[3],AX[4];
|
---|
| 839 |
|
---|
| 840 | if(lp) printf("Most_3D2D: ndata=%d Ymin=%g Ymax=%g\n",*ndata,Ymin,Ymax);
|
---|
| 841 |
|
---|
| 842 | *Res_3D = 0.;
|
---|
| 843 | *Res_2D = 0.;
|
---|
| 844 | Flag = 0;
|
---|
| 845 |
|
---|
| 846 | if( *ndata<=0 || Ymax <= Ymin ) goto END;
|
---|
| 847 |
|
---|
| 848 | /* on recentre tout entre 0 et 1 donc Ymin=0 YMax=1 */
|
---|
| 849 | VN = Ymax-Ymin;
|
---|
| 850 | n = 0;
|
---|
| 851 | xmoy = x2moy = x3moy = 0.;
|
---|
| 852 |
|
---|
| 853 | for(i=0;i<*ndata;i++)
|
---|
| 854 | {
|
---|
| 855 | if( EY[i]>0. && Y[i]>Ymin && Y[i]<Ymax )
|
---|
| 856 | {
|
---|
| 857 | v1 = (Y[i]-Ymin)/VN;
|
---|
| 858 | xmoy += v1;
|
---|
| 859 | x2moy += v1*v1;
|
---|
| 860 | x3moy += v1*v1*v1;
|
---|
| 861 | n++;
|
---|
| 862 | }
|
---|
| 863 | }
|
---|
| 864 | if(n<=0) goto END;
|
---|
| 865 | xmoy /= n;
|
---|
| 866 | x2moy /= n;
|
---|
| 867 | x3moy /= n;
|
---|
| 868 | if(lp) printf(" <x>=%g <x2>=%g <x3>=%g\n",xmoy,x2moy,x3moy);
|
---|
| 869 |
|
---|
| 870 | /* On remplit la matrice 2x2 pour le fit parabolique */
|
---|
| 871 | M2[0][0] = 1./5. -1./9.;
|
---|
| 872 | M2[0][1] = M2[1][0] = M2[1][1] = 1./12.; /* = 1./4. -1./6. = 1./3. -1./4. */
|
---|
| 873 | B[0] = x2moy - 1./3.;
|
---|
| 874 | B[1] = xmoy - 0.5;
|
---|
| 875 | det = SolveDLinSyst(&(M2[0][0]), B, AX, 2);
|
---|
| 876 | if(lp) printf("Solve_2D: det=%g sol=%g %g\n",det,AX[0],AX[1]);
|
---|
| 877 | if ( det != 0. )
|
---|
| 878 | {
|
---|
| 879 | if ( AX[0] != 0. )
|
---|
| 880 | {
|
---|
| 881 | Flag += 1;
|
---|
| 882 | *Res_2D = -AX[1]/(2.*AX[0]);
|
---|
| 883 | if(lp) printf(" s1=%g\n",*Res_2D);
|
---|
| 884 | *Res_2D = Ymin + *Res_2D*VN;
|
---|
| 885 | }
|
---|
| 886 | }
|
---|
| 887 |
|
---|
| 888 | /* On remplit la matrice 3x3 pour le fit polynome d'ordre 3 */
|
---|
| 889 | M3[0][0] = M3[2][2] = 1./5. -1./8.;
|
---|
| 890 | /* 1./12. = 1./4. -1./6. = 1./3. -1./4. = 1./6. -1./12 */
|
---|
| 891 | M3[0][1] = M3[1][2] = M3[0][2] = M3[1][0] = M3[2][1] = 1./12.;
|
---|
| 892 | M3[1][1] = 1./5. -1./9.;
|
---|
| 893 | M3[2][0] = 1./7. -1./16.;
|
---|
| 894 | B[0] = xmoy - 0.5;
|
---|
| 895 | B[1] = x2moy - 1./3.;
|
---|
| 896 | B[2] = x3moy - 0.25;
|
---|
| 897 | det = SolveDLinSyst(&(M3[0][0]), B, AX, 3);
|
---|
| 898 | if(lp) printf("Solve_3D: det=%g sol=%g %g %g\n",det,AX[0],AX[1],AX[2]);
|
---|
| 899 | if ( det != 0. )
|
---|
| 900 | {
|
---|
| 901 | /* on cherche les 2 racines de l'annulation de la derivee */
|
---|
| 902 | det = AX[1]*AX[1] - 3.*AX[0]*AX[2];
|
---|
| 903 | if(lp) printf(" det=%g\n",det);
|
---|
| 904 | if ( det >= 0. && AX[0] != 0. )
|
---|
| 905 | {
|
---|
| 906 | xmoy = (-AX[1] + sqrt(det))/(3.*AX[0]);
|
---|
| 907 | v1 = 6.*AX[0]*xmoy+2.*AX[1];
|
---|
| 908 | x2moy = (-AX[1] - sqrt(det))/(3.*AX[0]);
|
---|
| 909 | v2 = 6.*AX[0]*x2moy+2.*AX[1];
|
---|
| 910 | if(lp) printf(" s1=%g (%g) s2=%g (%g)\n",xmoy,v1,x2moy,v2);
|
---|
| 911 | Flag += 2;
|
---|
| 912 | *Res_3D = xmoy;
|
---|
| 913 | if(v2<0.) *Res_3D = x2moy;
|
---|
| 914 | *Res_3D = Ymin + *Res_3D*VN;
|
---|
| 915 | }
|
---|
| 916 | }
|
---|
| 917 |
|
---|
| 918 |
|
---|
| 919 | END:
|
---|
| 920 | if(lp) printf("Most_3D2D: *Res_2D=%g *Res_3D=%g Flag=%d\n"
|
---|
| 921 | ,*Res_2D,*Res_3D,Flag);
|
---|
| 922 | return(Flag);
|
---|
| 923 | }
|
---|
| 924 |
|
---|
| 925 | /*==================================================================*/
|
---|
| 926 | double correlation(int_4 npts,double *x,double *y)
|
---|
| 927 | {
|
---|
| 928 | /* Cecile Numerical Recipies p. 503
|
---|
| 929 | Calcule le coefficient de correlation de x et y sur npts points
|
---|
| 930 | ENTREE :
|
---|
| 931 | npts nombre de points
|
---|
| 932 | x, y tableau des valeurs
|
---|
| 933 | SORTIE:
|
---|
| 934 | correlation : coefficient de correlation
|
---|
| 935 | -2 si nb de points OK < 3
|
---|
| 936 | -3 si produit des (x[i]-ax)(y[i]-ay)<=0
|
---|
| 937 | */
|
---|
| 938 | int_4 i,n;
|
---|
| 939 | double ax,ay,xt,yt,sxx,syy,sxy;
|
---|
| 940 | n=0; ay = ax= 0.;
|
---|
| 941 | for(i=0;i<npts;i++) {ax += x[i]; ay += y[i]; n++;}
|
---|
| 942 | if( n<3 ) {
|
---|
| 943 | printf("correlation: moins de 3 points pour le calcul de la correlation (%d)\n",n);
|
---|
| 944 | return(-2.);
|
---|
| 945 | }
|
---|
| 946 | ax /= n; ay /= n;
|
---|
| 947 | xt = yt = syy = sxy = sxx = 0.;
|
---|
| 948 | for(i=0;i<npts;i++) {
|
---|
| 949 | xt = x[i]-ax; yt = y[i]-ay;
|
---|
| 950 | sxx += xt*xt; syy += yt*yt; sxy += xt*yt;
|
---|
| 951 | }
|
---|
| 952 | return( ((sxx*syy>0.) ? sxy/sqrt(sxx*syy) : -3.) );
|
---|
| 953 | }
|
---|
| 954 |
|
---|
| 955 | /*==================================================================*/
|
---|
| 956 | double CorrelatioN(int_4 nptX,float *X,float *Y,int_4* IndXvY)
|
---|
| 957 | /* cmv 17/4/99
|
---|
| 958 | Calcule le coefficient de correlation de X[] et Y[] sur nptX points
|
---|
| 959 | ENTREE :
|
---|
| 960 | nptX nombre de points dans le tableau X[]
|
---|
| 961 | X[], Y[] : tableau des valeurs a correler
|
---|
| 962 | IndXvY[] : tableau des indices de Y[] a correler a X[]
|
---|
| 963 | SORTIE: coefficient de correlation
|
---|
| 964 | -2 si nb de points OK (>3)
|
---|
| 965 | -3 si somme des (X[i]-ax)^2 ou (Y[i]-ay)^2 <=0
|
---|
| 966 | EXPLICATION:
|
---|
| 967 | X[1,nptX-1], Y[....], IndXvY[1,nptX-1]
|
---|
| 968 | - le point X[i] correspond au point Y[IndXvY[i]] si IndXvY[i]>=0
|
---|
| 969 | - le point X[i] n'est pas pris en compte si IndXvY[i]<0
|
---|
| 970 | */
|
---|
| 971 | {
|
---|
| 972 | int_4 i,n;
|
---|
| 973 | double ax,ay,xt,yt,sxx,syy,sxy;
|
---|
| 974 | n=0; ay=ax=0.;
|
---|
| 975 | for(i=0;i<nptX;i++) if(IndXvY[i]>=0) {ax+=X[i]; ay+=Y[IndXvY[i]]; n++;}
|
---|
| 976 | if(n<3)
|
---|
| 977 | {printf("CorrelatioN: %d<3 points pour le calcul\n",n); return(-2.);}
|
---|
| 978 | ax /= n; ay /= n;
|
---|
| 979 | xt = yt = syy = sxy = sxx = 0.;
|
---|
| 980 | for(i=0;i<nptX;i++) if(IndXvY[i]>=0)
|
---|
| 981 | { xt = X[i]-ax; yt = Y[IndXvY[i]]-ay;
|
---|
| 982 | sxx += xt*xt; syy += yt*yt; sxy += xt*yt; }
|
---|
| 983 | return( ((sxx*syy>0.) ? sxy/sqrt(sxx*syy) : -3.) );
|
---|
| 984 | }
|
---|
| 985 |
|
---|
| 986 | /*=========================================================================*/
|
---|
| 987 | int_4 MeanLine(float *mag,float *err,int_4 *ndata
|
---|
| 988 | ,int passmx,float nsigma,float *mean,float *sigma)
|
---|
| 989 | /*
|
---|
| 990 | Calcul de la moyenne et du sigma en plusieurs passes avec nettoyage
|
---|
| 991 | ENTREE:
|
---|
| 992 | mag: magnitude
|
---|
| 993 | err: erreur sur la magnitude (Si NULL pas d'erreur)
|
---|
| 994 | ndata: nombre de donnees
|
---|
| 995 | nsigma: nombre de sigma dans lequel on calcule le mean
|
---|
| 996 | passmx: nombre de passes
|
---|
| 997 | SORTIE:
|
---|
| 998 | ndata: nombre de data utilises pour calculer le most
|
---|
| 999 | mean: moyenne des donnees
|
---|
| 1000 | sigma: sigma des donnees
|
---|
| 1001 | MeanLine: 0 si calcul ok, <0 sinon
|
---|
| 1002 | */
|
---|
| 1003 | {
|
---|
| 1004 | int_4 pass,n,i;
|
---|
| 1005 | double m,s2,scut,v;
|
---|
| 1006 | if( passmx<=0 ) passmx = 1;
|
---|
| 1007 |
|
---|
| 1008 | *mean = *sigma = 0.;
|
---|
| 1009 | for (pass=1;pass<=passmx;pass++) {
|
---|
| 1010 | m = s2 = 0.; n=0;
|
---|
| 1011 | if( pass>=2 ) scut=*sigma*nsigma; else scut=GRAND;
|
---|
| 1012 | for (i=0;i<*ndata;i++) {
|
---|
| 1013 | v = mag[i];
|
---|
| 1014 | if(err!=NULL) if( err[i] <= 0. ) continue;
|
---|
| 1015 | if( fabs(v-*mean) >= scut ) continue;
|
---|
| 1016 | n++;
|
---|
| 1017 | m += v;
|
---|
| 1018 | s2 += v * v;
|
---|
| 1019 | }
|
---|
| 1020 | if ( n>0 ) {
|
---|
| 1021 | m /= (double) n;
|
---|
| 1022 | v = s2/n - m*m;
|
---|
| 1023 | *mean = m;
|
---|
| 1024 | *sigma = (v>0) ? sqrt(v) : 0.;
|
---|
| 1025 | } else {
|
---|
| 1026 | *mean = *sigma = 0.;
|
---|
| 1027 | *ndata=n;
|
---|
| 1028 | return(-1);
|
---|
| 1029 | }
|
---|
| 1030 | /* printf("MeanLine: pass=%d mean=%f sigma=%f n=%d\n"
|
---|
| 1031 | ,pass,*mean,*sigma,n); */
|
---|
| 1032 | }
|
---|
| 1033 | return(0);
|
---|
| 1034 | }
|
---|
| 1035 |
|
---|
| 1036 | /*=========================================================================*/
|
---|
| 1037 | int_4 BaseLine(float *mag,float *err,int_4 *ndata,float nsigma
|
---|
| 1038 | ,float binini,float *mean,float *sigma,float *most)
|
---|
| 1039 | /* Christophe 10/11/93 La Silla + modif 28/7/94 Saclay
|
---|
| 1040 | **** calcul de la ligne de base d'une etoile par maxi d'histogramme ****
|
---|
| 1041 | Methode: 1-/ moyenne, 2-/ moyenne tronquee,
|
---|
| 1042 | 3-/ maximum d'histogramme,
|
---|
| 1043 | 4-/ puis deuxieme passe sur histo plus lache
|
---|
| 1044 | ENTREE:
|
---|
| 1045 | mag: magnitude
|
---|
| 1046 | err: erreur sur la magnitude
|
---|
| 1047 | ndata: nombre de donnees
|
---|
| 1048 | nsigma: nombre de sigma dans lequel on calcule le maximum
|
---|
| 1049 | si <=0, une seule passe pour la moyenne et dynamique histo = 5.
|
---|
| 1050 | binini: bin minimum de la methode d'histogramme
|
---|
| 1051 | SORTIE:
|
---|
| 1052 | ndata: nombre de data utilises pour calculer le most
|
---|
| 1053 | mean: moyenne des donnees
|
---|
| 1054 | sigma: sigma des donnees
|
---|
| 1055 | most: maximum de probabilite
|
---|
| 1056 | RETURN: nombre d entrees dans le bin du maximum, <0 si echec
|
---|
| 1057 | */
|
---|
| 1058 | {
|
---|
| 1059 | int_4 deb=DEB_BaseLine;
|
---|
| 1060 | int_4 pass,passmx,i,ib0,ib1,n=0,ibin,nbin=0,tab0mx,nbinmx=100,tab0[101];
|
---|
| 1061 | float mini,maxi,binw;
|
---|
| 1062 | double m,s2,v,vv,scut;
|
---|
| 1063 | double SX4,SX3,SX2,SX,S1,SYX2,SYX,SY;
|
---|
| 1064 | double MX33[3][3],BB[3],AX[3],det;
|
---|
| 1065 |
|
---|
| 1066 | if(deb) printf("BaseLine: n=%d nsigma=%f binini=%f\n",*ndata,nsigma,binini);
|
---|
| 1067 |
|
---|
| 1068 | /*********** D'abord une moyenne et sigma ************/
|
---|
| 1069 | *mean = *sigma = 0.;
|
---|
| 1070 | passmx = ( nsigma <= 0. ) ? 1 : 2 ;
|
---|
| 1071 | for (pass=1;pass<=passmx;pass++) {
|
---|
| 1072 | m = s2 = 0.; n=0;
|
---|
| 1073 | scut = GRAND;
|
---|
| 1074 | if( pass == 2 ) scut = nsigma* *sigma;
|
---|
| 1075 | for (i=0;i<*ndata;i++) {
|
---|
| 1076 | v = mag[i];
|
---|
| 1077 | if( err[i] <= 0. || fabs(v-*mean) >= scut ) continue;
|
---|
| 1078 | n++; m += v; s2 += v*v;
|
---|
| 1079 | }
|
---|
| 1080 | if ( n >= 2 ) {
|
---|
| 1081 | *mean = m / n;
|
---|
| 1082 | v = s2 / n - m/n * m/n;
|
---|
| 1083 | *sigma = ( v>0. ) ? sqrt(v) : 0.;
|
---|
| 1084 | } else {
|
---|
| 1085 | *mean = *sigma = 0.;
|
---|
| 1086 | *ndata=n;
|
---|
| 1087 | return(-1);
|
---|
| 1088 | }
|
---|
| 1089 | if(deb) printf("BaseLine: pass=%d mean=%f sigma=%f n=%d\n"
|
---|
| 1090 | ,pass,*mean,*sigma,n);
|
---|
| 1091 | if( *sigma == 0. ) return(-1);
|
---|
| 1092 | }
|
---|
| 1093 |
|
---|
| 1094 | /***** Puis une methode de maximum d'histogramme *****/
|
---|
| 1095 | if ( nsigma <= 0. ) nsigma = 5.;
|
---|
| 1096 | mini = *mean - nsigma * *sigma;
|
---|
| 1097 | maxi = *mean + nsigma * *sigma;
|
---|
| 1098 |
|
---|
| 1099 | for (pass=1;pass<=2;pass++) {
|
---|
| 1100 |
|
---|
| 1101 | if( binini > 0. ) {
|
---|
| 1102 | if ( pass == 1 ) nbin = (maxi-mini)/(2.*binini) + 0.5; /* 1ere pass a 2*binini */
|
---|
| 1103 | if ( pass == 2 ) nbin = (maxi-mini)/binini + 0.5; /* 2sd pass a binini */
|
---|
| 1104 | if ( nbin >= nbinmx ) nbin = nbinmx;
|
---|
| 1105 | if ( nbin < 3 ) nbin = 3;
|
---|
| 1106 | } else nbin = nbinmx;
|
---|
| 1107 | binw = (maxi-mini)/nbin;
|
---|
| 1108 | if(deb) printf("mini=%f maxi=%f binw=%f nbin=%d\n",mini,maxi,binw,nbin);
|
---|
| 1109 |
|
---|
| 1110 | /*fill histogramme tab0*/
|
---|
| 1111 | for (i=0;i<nbin;i++) tab0[i] = 0;
|
---|
| 1112 | for (i=0;i<*ndata;i++) {
|
---|
| 1113 | if( err[i] <= 0. ) continue;
|
---|
| 1114 | ibin = (mag[i]-mini)/binw;
|
---|
| 1115 | if( ibin >= 0 && ibin < nbin ) tab0[ibin] += 1;
|
---|
| 1116 | }
|
---|
| 1117 |
|
---|
| 1118 | /*maximum de l'histogramme tab0*/
|
---|
| 1119 | ibin=0;
|
---|
| 1120 | tab0mx = 0;
|
---|
| 1121 | for (i=0;i<nbin;i++) if ( tab0[i] > tab0mx ) {tab0mx = tab0[i]; ibin=i;}
|
---|
| 1122 | ib0 = ibin-1; ib1 = ibin+1;
|
---|
| 1123 | if(ib0<0) { ib0 = 0; ib1++;}
|
---|
| 1124 | if(ib1>=nbin) { ib1 = nbin-1; ib0--;}
|
---|
| 1125 | if (deb>1) {
|
---|
| 1126 | printf("Maximum tab0=%d (%d [%d,%d])\n",tab0mx,ibin,ib0,ib1);
|
---|
| 1127 | if (deb>2) { printf("Tableau final tab0:\n");
|
---|
| 1128 | for (i=0;i<nbin;i++) printf(" %d=%d",i,tab0[i]);
|
---|
| 1129 | printf("\n"); }
|
---|
| 1130 | }
|
---|
| 1131 |
|
---|
| 1132 | /* calcul de la valeur maximale par fit parabole +/- 1 bin autour du maximum */
|
---|
| 1133 | S1 = SY = SYX = SYX2 = SX4 = SX3 = SX2 = SX = 0.;
|
---|
| 1134 | for (i=ib0;i<=ib1;i++) {
|
---|
| 1135 | v = mini + (i+0.5)*binw;
|
---|
| 1136 | vv = v*v;
|
---|
| 1137 | m = tab0[i];
|
---|
| 1138 | s2=1.;
|
---|
| 1139 | S1 += s2;
|
---|
| 1140 | SX += s2*v;
|
---|
| 1141 | SY += s2*m;
|
---|
| 1142 | SYX += s2*v*m;
|
---|
| 1143 | SYX2 += s2*m*vv;
|
---|
| 1144 | SX2 += s2*vv;
|
---|
| 1145 | SX3 += s2*vv*v;
|
---|
| 1146 | SX4 += s2*vv*vv;
|
---|
| 1147 | }
|
---|
| 1148 | MX33[0][0] = S1;
|
---|
| 1149 | MX33[1][1] = SX2;
|
---|
| 1150 | MX33[2][2] = SX4;
|
---|
| 1151 | MX33[0][1] = MX33[1][0] = SX;
|
---|
| 1152 | MX33[0][2] = MX33[2][0] = SX2;
|
---|
| 1153 | MX33[1][2] = MX33[2][1] = SX3;
|
---|
| 1154 | BB[0] = SY;
|
---|
| 1155 | BB[1] = SYX;
|
---|
| 1156 | BB[2] = SYX2;
|
---|
| 1157 | det = SolveDLinSyst(&(MX33[0][0]), BB, AX, 3);
|
---|
| 1158 | if( det == 0. ) return(-2);
|
---|
| 1159 | if( AX[2] == 0. ) return(-2);
|
---|
| 1160 | *most = -AX[1]/(2.*AX[2]);
|
---|
| 1161 |
|
---|
| 1162 | if(deb)
|
---|
| 1163 | printf("BaseLine: pass=%d most_probable=%f ibin=%d\n",pass,*most,ibin);
|
---|
| 1164 |
|
---|
| 1165 | if( *most<=mini || *most >= maxi ) return(-3);
|
---|
| 1166 |
|
---|
| 1167 | /*nouveaux parametres de l'histogramme tab0 */
|
---|
| 1168 | mini = *most-2.5*binw;
|
---|
| 1169 | maxi = *most+2.5*binw;
|
---|
| 1170 |
|
---|
| 1171 | }
|
---|
| 1172 |
|
---|
| 1173 | *ndata=n;
|
---|
| 1174 | return(tab0mx);
|
---|
| 1175 | }
|
---|
| 1176 |
|
---|
| 1177 | /*=========================================================================*/
|
---|
| 1178 | int BaseLineS(float *y,float *ey,int ny,int nfiltre,float *mean,float *sigma)
|
---|
| 1179 | /* D'apres Alain M. + modifs + code cmv 5/5/97
|
---|
| 1180 | Determination de la ligne de base comme sequence de nfiltre points
|
---|
| 1181 | consecutifs de dispersion minimale:
|
---|
| 1182 | y : tableau des flux
|
---|
| 1183 | ey : tableau des erreurs sur les flux (pt non util. si <=0)
|
---|
| 1184 | ny : nombre de points
|
---|
| 1185 | nfiltre : nombre de points consecutifs pour calculer le sigma
|
---|
| 1186 | si <0 y est d'abord range par flux croissants
|
---|
| 1187 | mean : valeur du fond de ciel retourne
|
---|
| 1188 | sigma : valeur du sigma mini trouve
|
---|
| 1189 | rc : nombre d essais ( si <=0 echec)
|
---|
| 1190 | */
|
---|
| 1191 | {
|
---|
| 1192 | int rc=0, isort=0,i,j,npt,n;
|
---|
| 1193 | double s,m;
|
---|
| 1194 | float *ys=NULL;
|
---|
| 1195 |
|
---|
| 1196 | *mean = *sigma = -1.;
|
---|
| 1197 | if( ny<=1 ) return(-1);
|
---|
| 1198 |
|
---|
| 1199 | if( nfiltre<0 ) {
|
---|
| 1200 | isort = 1;
|
---|
| 1201 | nfiltre *= -1;
|
---|
| 1202 | npt = 0;
|
---|
| 1203 | ys = (float *) malloc(ny*sizeof(float));
|
---|
| 1204 | if( ys==NULL ) return(-2);
|
---|
| 1205 | for(i=0;i<ny;i++) if(ey[i]>0.) ys[npt++] = y[i];
|
---|
| 1206 | qsort(ys,(size_t) npt,(size_t) sizeof(float),qSort_Float);
|
---|
| 1207 | } else { npt=ny; ys = y;}
|
---|
| 1208 | if( nfiltre>npt || nfiltre<=1 ) { if(isort) free(ys); return(-3);}
|
---|
| 1209 |
|
---|
| 1210 | for(i=0;i<npt-nfiltre+1;i++) {
|
---|
| 1211 | if( !isort && ey[i]<=0. ) continue;
|
---|
| 1212 | s = m = 0.; n = 0;
|
---|
| 1213 | for(j=i;j<npt;j++) {
|
---|
| 1214 | if( !isort && ey[j]<=0. ) continue;
|
---|
| 1215 | m += ys[j]; s += ys[j]*ys[j]; n++;
|
---|
| 1216 | if( n<nfiltre ) continue;
|
---|
| 1217 | rc++;
|
---|
| 1218 | m /= (double) n;
|
---|
| 1219 | s = s/n - m*m;
|
---|
| 1220 | s = ( s>0. ) ? sqrt(s) : 0.;
|
---|
| 1221 | if( s<*sigma || rc==1 ) { *sigma=s; *mean=m; }
|
---|
| 1222 | break;
|
---|
| 1223 | }
|
---|
| 1224 | }
|
---|
| 1225 |
|
---|
| 1226 | if(isort) free(ys);
|
---|
| 1227 | return(rc);
|
---|
| 1228 | }
|
---|
| 1229 |
|
---|
| 1230 | /*=========================================================================*/
|
---|
| 1231 | int BaseLineP(float *y,float *ey,int ny,int nfiltre,float *mean)
|
---|
| 1232 | /* D'apres Alain M. + modifs + code cmv 5/5/97
|
---|
| 1233 | Determination de la ligne de base comme endroit de pente minimale
|
---|
| 1234 | entre le point [i] et [i+nfiltre-1]. Ceci marche mieux avec
|
---|
| 1235 | le tableau trie mais la possibilite de ne pas trier est laissee:
|
---|
| 1236 | y : tableau des flux
|
---|
| 1237 | ey : tableau des erreurs sur les flux (pt non util. si <=0)
|
---|
| 1238 | ny : nombre de points
|
---|
| 1239 | nfiltre : nombre de points pour calculer la pente
|
---|
| 1240 | si <0 y est d'abord range par flux croissants
|
---|
| 1241 | mean : valeur du fond de ciel retourne
|
---|
| 1242 | rc : nombre d essais ( si <=0 echec)
|
---|
| 1243 | */
|
---|
| 1244 | {
|
---|
| 1245 | int rc=0, isort=0,i,j,npt,n;
|
---|
| 1246 | float p=-1.,pmin=-1.,m;
|
---|
| 1247 | float *ys=NULL;
|
---|
| 1248 |
|
---|
| 1249 | *mean = -1.;
|
---|
| 1250 | if( ny<=1 ) return(-1);
|
---|
| 1251 |
|
---|
| 1252 | if( nfiltre<0 ) {
|
---|
| 1253 | isort = 1;
|
---|
| 1254 | nfiltre *= -1;
|
---|
| 1255 | npt = 0;
|
---|
| 1256 | ys = (float *) malloc(ny*sizeof(float));
|
---|
| 1257 | if( ys==NULL ) return(-2);
|
---|
| 1258 | for(i=0;i<ny;i++) if(ey[i]>0.) ys[npt++] = y[i];
|
---|
| 1259 | qsort(ys,(size_t) npt,(size_t) sizeof(float),qSort_Float);
|
---|
| 1260 | } else { npt=ny; ys = y;}
|
---|
| 1261 | if( nfiltre>npt || nfiltre<=1 ) { if(isort) free(ys); return(-3);}
|
---|
| 1262 |
|
---|
| 1263 | for(i=0;i<npt-nfiltre+1;i++) {
|
---|
| 1264 | if( !isort && ey[i]<=0. ) continue;
|
---|
| 1265 | m = 0.; n = 0;
|
---|
| 1266 | for(j=i;j<npt;j++) {
|
---|
| 1267 | if( !isort && ey[j]<=0. ) continue;
|
---|
| 1268 | m += ys[j]; n++;
|
---|
| 1269 | p = ys[j];
|
---|
| 1270 | if( n<nfiltre ) continue;
|
---|
| 1271 | rc++;
|
---|
| 1272 | p = fabs(ys[i]-p);
|
---|
| 1273 | if( p<pmin || rc==1 ) { pmin = p; *mean = m/n;}
|
---|
| 1274 | break;
|
---|
| 1275 | }
|
---|
| 1276 | }
|
---|
| 1277 |
|
---|
| 1278 | if(isort) free(ys);
|
---|
| 1279 | return(rc);
|
---|
| 1280 | }
|
---|