| [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 | } | 
|---|