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