| 1 | /* lecture des fichiers de suivi:     cmv 21/12/93 */
 | 
|---|
| 2 | #include "machdefs.h"
 | 
|---|
| 3 | #include <stdio.h>
 | 
|---|
| 4 | #include <stdlib.h>
 | 
|---|
| 5 | #include <string.h>
 | 
|---|
| 6 | #include <math.h>
 | 
|---|
| 7 | #include <signal.h>
 | 
|---|
| 8 | 
 | 
|---|
| 9 | #include "fsvcache.h"
 | 
|---|
| 10 | #include "nbtri.h"
 | 
|---|
| 11 | #include "nbrandom.h"
 | 
|---|
| 12 | #include "nbmath.h"
 | 
|---|
| 13 | #include "strutil.h"
 | 
|---|
| 14 | #include "fsvst.h"
 | 
|---|
| 15 | 
 | 
|---|
| 16 | // Ne pas changer l'ordre des 3 lignes suivantes!!!
 | 
|---|
| 17 | #define  FLAG_MAIN_NBSREAD
 | 
|---|
| 18 | #include "nbsread.h"
 | 
|---|
| 19 | #include "nbgene.h"
 | 
|---|
| 20 | 
 | 
|---|
| 21 | void INIT_NBSR(void);
 | 
|---|
| 22 | void OPENSUIV(int ic);
 | 
|---|
| 23 | void READST(int ic);
 | 
|---|
| 24 | void READET(int ic);
 | 
|---|
| 25 | void DATCLEAN(int ic);
 | 
|---|
| 26 | void DATSORT(int ic);
 | 
|---|
| 27 | 
 | 
|---|
| 28 | void SELSTAR(void);
 | 
|---|
| 29 | void GET_STAR_ID(void);
 | 
|---|
| 30 | 
 | 
|---|
| 31 | int  DECODESUIVINAME(char* str);
 | 
|---|
| 32 | void DECODE_GLOBINFO(GLOBINFO *p);
 | 
|---|
| 33 | void DECODE_STARINFO(STARINFO *p, int ic);
 | 
|---|
| 34 | void DECODE_TIMEINFO(TIMEINFO *p, int ic, int imes);
 | 
|---|
| 35 | void DECODE_MESURE  (MESURE   *p, int ic, int imes);
 | 
|---|
| 36 | 
 | 
|---|
| 37 | void DO_MALLOC(void);
 | 
|---|
| 38 | void DO_FREE(void);
 | 
|---|
| 39 | 
 | 
|---|
| 40 | GLOBINFO     glinf;
 | 
|---|
| 41 | STARINFO     star;
 | 
|---|
| 42 | TIMEINFO     timinf;
 | 
|---|
| 43 | MESURE       mes;
 | 
|---|
| 44 | 
 | 
|---|
| 45 | /* Pour catcher un CTRL-C ou des time limites */
 | 
|---|
| 46 | static struct sigaction Nbsread_Action;
 | 
|---|
| 47 | void Nbsread_SigCatchInit(void);
 | 
|---|
| 48 | void Nbsread_SigCatch(int s);
 | 
|---|
| 49 | 
 | 
|---|
| 50 | void usage(int);
 | 
|---|
| 51 | void usage(int lp) {
 | 
|---|
| 52 |  printf("nbsread\n");
 | 
|---|
| 53 |  printf("  nom du fichier des fichiers de suivi\n");
 | 
|---|
| 54 |  printf("  [-h] help detaille\n");
 | 
|---|
| 55 |  printf("  [-et et1,et2,etinc]\n");
 | 
|---|
| 56 |  printf("  [-prt niv]\n");
 | 
|---|
| 57 |  printf("  [-dbg et1,et2,ccd,niv]\n");
 | 
|---|
| 58 |  printf("  [-kill mes1 mes2 mes3 ...]\n");
 | 
|---|
| 59 |  printf("  [-mc ngenstar]\n");
 | 
|---|
| 60 |  printf("  [-u0 U0MinI,U0MaxI,U0SimI]\n");
 | 
|---|
| 61 |  printf("  [-t0 T0MinI,T0MaxI,T0SimI]\n");
 | 
|---|
| 62 |  printf("  [-tau TauMinI,TauMaxI,TauSimI]\n");
 | 
|---|
| 63 |  printf("  [-tf type(1ou2),UMinI,UMaxI,USimI,Usu0_Cut]\n");
 | 
|---|
| 64 |  printf("  [-bl Blending (1ou2)]\n");
 | 
|---|
| 65 |  printf("  [-seed seed1,seed2,seed3]\n");
 | 
|---|
| 66 |  if(lp<=0) exit(-1);
 | 
|---|
| 67 |  printf("\n");
 | 
|---|
| 68 |  printf("et1,et2,etinc: on utilise les etoiles de et1 a et2 par pas de etinc\n");
 | 
|---|
| 69 |  printf("niv: niveau de print\n");
 | 
|---|
| 70 |  printf("et1,et2,ccd,niv: debug etoiles et1 a et2 ccd ccd (-1=tous) niveau niv\n");
 | 
|---|
| 71 |  printf("mes1 mes2 mes3...: mesure a ne pas considerer dans les cdl\n"); 
 | 
|---|
| 72 |  printf("ngenstar: nombre de generations montecarlo par etoile\n");
 | 
|---|
| 73 |  printf("U0MinI,U0MaxI,U0SimI: generation du parametre d impact (def=0,0,0)\n"); 
 | 
|---|
| 74 |  printf("   si U0MinI<U0MaxI on tire u0 plat entre U0MinI,U0MaxI\n"); 
 | 
|---|
| 75 |  printf("   si U0MinI>=U0MaxI u0 est fixe a U0SimI\n"); 
 | 
|---|
| 76 |  printf("TauMinI,TauMaxI,TauSimI: generation du parametre tau (def=0.01,365.)\n"); 
 | 
|---|
| 77 |  printf("   ... meme logique que u0 ...\n"); 
 | 
|---|
| 78 |  printf("T0MinI,T0MaxI,T0SimI: generation du temps du maximum (def=1,-1,-1)\n"); 
 | 
|---|
| 79 |  printf("   si T0MinI<T0MaxI on tire t0 plat entre T0MinI,T0MaxI\n"); 
 | 
|---|
| 80 |  printf("   si T0MinI>=T0MaxI ET T0SimI>0 t0 est fixe a T0SimI\n"); 
 | 
|---|
| 81 |  printf("                     ET T0SimI<0 t0 tout l intervalle du suivi (def)\n"); 
 | 
|---|
| 82 |  printf("type,UMinI,UMaxI,USimI,Usu0_Cut: pour tirage taille finie (def=0,0,0,0.001)\n");
 | 
|---|
| 83 |  printf("   type = 1 taille finie tirage plat en U = Rs(proj)/Re\n"); 
 | 
|---|
| 84 |  printf("          2 taille finie tirage plat en UC (U = UC*Rs)\n");
 | 
|---|
| 85 |  printf("   si UMinI>=UMaxI U est fixe a U0SimI\n"); 
 | 
|---|
| 86 |  printf("   si UMinI<UMaxI on tire U plat entre UMinI,UMaxI si type=1\n"); 
 | 
|---|
| 87 |  printf("                                 entre UMinI*Rs,UMaxI*Rs si type=2\n"); 
 | 
|---|
| 88 |  printf("Blending = 1 sur l'etoile la + brillante du couple\n");
 | 
|---|
| 89 |  printf("           2 sur l'etoile la - brillante du couple\n");
 | 
|---|
| 90 |  printf("Il y a possibilite de definir ses propres fct de tirage (cf nbgene.c)\n");
 | 
|---|
| 91 |  printf("seed1,seed2,seed3: initialisation des aleatoires (def=36117,51106,21478)\n");
 | 
|---|
| 92 | exit(-1);
 | 
|---|
| 93 | }
 | 
|---|
| 94 | 
 | 
|---|
| 95 | /*==========================================================================*/
 | 
|---|
| 96 | int main (int narg, char *arg[])
 | 
|---|
| 97 | {
 | 
|---|
| 98 | int_4 i,ic,iet1,iet2,iet0,ietmax,ietinc=1;
 | 
|---|
| 99 | char str[NBSREAD_LSTR];
 | 
|---|
| 100 | 
 | 
|---|
| 101 | printf("=====> ");
 | 
|---|
| 102 | for(i=0;i<narg;i++) printf("%s ",arg[i]);
 | 
|---|
| 103 | printf("\n");
 | 
|---|
| 104 | 
 | 
|---|
| 105 | /* printf("main: narg=%d %s\n",narg,arg[0]); */
 | 
|---|
| 106 | if (narg < 2) usage(0);
 | 
|---|
| 107 | if( !strcmp(arg[1],"-h") != 0 ) usage(1);
 | 
|---|
| 108 | 
 | 
|---|
| 109 | /*------------------------------------------*/
 | 
|---|
| 110 | /*-------- Initialisation variables --------*/
 | 
|---|
| 111 | /*------------------------------------------*/
 | 
|---|
| 112 | 
 | 
|---|
| 113 | INIT_NBSR();
 | 
|---|
| 114 | 
 | 
|---|
| 115 | /*---------------------------------------*/
 | 
|---|
| 116 | /*-------- Lecture des arguments --------*/
 | 
|---|
| 117 | /*---------------------------------------*/
 | 
|---|
| 118 | 
 | 
|---|
| 119 | i=2;
 | 
|---|
| 120 | while ( i < narg ) {
 | 
|---|
| 121 |   /* printf("arg[%d] %s\n",i,arg[i]); */
 | 
|---|
| 122 |   if( !strcmp(arg[i],"-h") != 0 ) {
 | 
|---|
| 123 |     usage(1);
 | 
|---|
| 124 |   } else if( !strcmp(arg[i],"-et") != 0 ) {
 | 
|---|
| 125 |     i++;
 | 
|---|
| 126 |     sscanf(arg[i],"%d,%d,%d",&ietlim[0],&ietlim[1],&ietinc);
 | 
|---|
| 127 |     if( ietinc<=0 ) ietinc = 1;
 | 
|---|
| 128 |     printf("Etoiles traitees de %d a %d par pas de %d\n"
 | 
|---|
| 129 |           ,ietlim[0],ietlim[1],ietinc);
 | 
|---|
| 130 |   } else if( !strcmp(arg[i],"-prt") != 0 ) {
 | 
|---|
| 131 |     i++;
 | 
|---|
| 132 |     sscanf(arg[i],"%d",&ffprt);
 | 
|---|
| 133 |     printf("Niveau de print %d\n",ffprt);
 | 
|---|
| 134 |   } else if( !strcmp(arg[i],"-dbg") != 0 ) {
 | 
|---|
| 135 |     i++;
 | 
|---|
| 136 |     sscanf(arg[i],"%d,%d,%d,%d",&idebug[0],&idebug[1],&idebug[2],&idebug[3]);
 | 
|---|
| 137 |     printf("Debug de l'et %d a l'et %d ccd %d niveau %d\n"
 | 
|---|
| 138 |           ,idebug[0],idebug[1],idebug[2],idebug[3]);
 | 
|---|
| 139 |   } else if( !strcmp(arg[i],"-mc") != 0 ) {
 | 
|---|
| 140 |     i++;
 | 
|---|
| 141 |     sscanf(arg[i],"%d",&mc.NGenStar);
 | 
|---|
| 142 |     if(mc.NGenStar>0) mc.montecar=1;
 | 
|---|
| 143 |       else {mc.montecar=mc.NGenStar; mc.NGenStar=0;}
 | 
|---|
| 144 |     printf("MonteCarlo actif, %d generations par etoiles\n",mc.NGenStar);
 | 
|---|
| 145 |   } else if( !strcmp(arg[i],"-u0") != 0 ) {
 | 
|---|
| 146 |     i++;
 | 
|---|
| 147 |     sscanf(arg[i],"%f,%f,%f",&mc.U0MinI,&mc.U0MaxI,&mc.U0SimI);
 | 
|---|
| 148 |     printf("U0 generation de %g a %g ou %g\n"
 | 
|---|
| 149 |           ,mc.U0MinI,mc.U0MaxI,mc.U0SimI);
 | 
|---|
| 150 |   } else if( !strcmp(arg[i],"-tau") != 0 ) {
 | 
|---|
| 151 |     i++;
 | 
|---|
| 152 |     sscanf(arg[i],"%f,%f,%f",&mc.TauMinI,&mc.TauMaxI,&mc.TauSimI);
 | 
|---|
| 153 |     printf("Tau generation de %g a %g ou %g\n"
 | 
|---|
| 154 |           ,mc.TauMinI,mc.TauMaxI,mc.TauSimI);
 | 
|---|
| 155 |   } else if( !strcmp(arg[i],"-t0") != 0 ) {
 | 
|---|
| 156 |     i++;
 | 
|---|
| 157 |     sscanf(arg[i],"%lf,%lf,%lf",&mc.T0MinI,&mc.T0MaxI,&mc.T0SimI);
 | 
|---|
| 158 |     printf("T0 generation de %g a %g ou %g\n"
 | 
|---|
| 159 |           ,mc.T0MinI,mc.T0MaxI,mc.T0SimI);
 | 
|---|
| 160 |   } else if( !strcmp(arg[i],"-tf") != 0 ) {
 | 
|---|
| 161 |     i++;
 | 
|---|
| 162 |     sscanf(arg[i],"%d,%f,%f,%f,%f"
 | 
|---|
| 163 |           ,&mc.Taille_Finie,&mc.UMinI,&mc.UMaxI,&mc.USimI,&mc.Usu0_Cut);
 | 
|---|
| 164 |     printf("Taille finie %d generation de U %g a %g ou %g (prec=%g)\n"
 | 
|---|
| 165 |           ,mc.Taille_Finie,mc.UMinI,mc.UMaxI,mc.USimI,mc.Usu0_Cut);
 | 
|---|
| 166 |   } else if( !strcmp(arg[i],"-bl") != 0 ) {
 | 
|---|
| 167 |     i++;
 | 
|---|
| 168 |     sscanf(arg[i],"%d",&mc.Blending);
 | 
|---|
| 169 |     printf("Blending %d\n",mc.Blending);
 | 
|---|
| 170 |   } else if( !strcmp(arg[i],"-seed") != 0 ) {
 | 
|---|
| 171 |     i++;
 | 
|---|
| 172 |     sscanf(arg[i],"%d,%d,%d",&mc.iseed1,&mc.iseed2,&mc.iseed3);
 | 
|---|
| 173 |     printf("Seed %d %d %d\n",mc.iseed1,mc.iseed2,mc.iseed3);
 | 
|---|
| 174 |   } else if( !strcmp(arg[i],"-kill") != 0 ) {
 | 
|---|
| 175 |     i++;
 | 
|---|
| 176 |     while ( i<narg ) {
 | 
|---|
| 177 |       if ( arg[i][0] != '-' ) {
 | 
|---|
| 178 |         if ( nkillms<NKILLMSMX ) {
 | 
|---|
| 179 |           sscanf(arg[i],"%d",&killms[nkillms]);
 | 
|---|
| 180 |           nkillms++;
 | 
|---|
| 181 |           i++;
 | 
|---|
| 182 |         } else {
 | 
|---|
| 183 |           printf("Trop de mesures a tuer! nkillms=%d / %d\n",nkillms,NKILLMSMX);
 | 
|---|
| 184 |           exit(-1);
 | 
|---|
| 185 |         }
 | 
|---|
| 186 |       } else { i--; break;}
 | 
|---|
| 187 |     }
 | 
|---|
| 188 |     printf("Kill: %d mesures a tuer:",nkillms);
 | 
|---|
| 189 |     if(nkillms>0) for(ic=0;ic<nkillms;ic++) printf(" %d",killms[ic]);
 | 
|---|
| 190 |     printf("\n");
 | 
|---|
| 191 |   } else {
 | 
|---|
| 192 |     printf("arguments: cas non prevu: %s\n",arg[i]); usage(0);
 | 
|---|
| 193 |   }
 | 
|---|
| 194 |   i++;
 | 
|---|
| 195 | }
 | 
|---|
| 196 | ietlim[0] = ( ietlim[0] <= 0 ) ? 1 : ietlim[0] ;
 | 
|---|
| 197 | ietlim[1] = ( ietlim[1] < ietlim[0] ) ? IGRAND : ietlim[1] ;
 | 
|---|
| 198 | printf("Etoiles traitees de %d a %d\n",ietlim[0],ietlim[1]);
 | 
|---|
| 199 | 
 | 
|---|
| 200 | /*----------------------------------------------------------------*/
 | 
|---|
| 201 | /*----- Lecture nom de fichier data et selection des etoiles -----*/
 | 
|---|
| 202 | /*----------------------------------------------------------------*/
 | 
|---|
| 203 | 
 | 
|---|
| 204 | printf("Fichier de donnees suivi: %s\n",arg[1]);
 | 
|---|
| 205 | if( (dataccd = fopen(arg[1],"r") ) == 0 ) {
 | 
|---|
| 206 |   printf("impossible d'ouvrir .dataccd\n"); exit(-1);
 | 
|---|
| 207 | }
 | 
|---|
| 208 | 
 | 
|---|
| 209 | GET_STAR_ID();
 | 
|---|
| 210 | 
 | 
|---|
| 211 | /*-----------------------------------------*/
 | 
|---|
| 212 | /*-------- Initialisation generale --------*/
 | 
|---|
| 213 | /*-----------------------------------------*/
 | 
|---|
| 214 | 
 | 
|---|
| 215 | /* initialisation des compteurs et des variables */
 | 
|---|
| 216 | 
 | 
|---|
| 217 | numccd = nstdeb = netoiles = 0;
 | 
|---|
| 218 | 
 | 
|---|
| 219 | rewind(dataccd);
 | 
|---|
| 220 | if( fgets(str,NBSREAD_LSTR,dataccd) == 0 )
 | 
|---|
| 221 |     {printf("fichier dataccd illisible\n"); exit(-1);}
 | 
|---|
| 222 | nbccd = -1;
 | 
|---|
| 223 | sscanf(str,"%d",&nbccd);
 | 
|---|
| 224 | printf("on veut traiter %d ccd\n",nbccd);
 | 
|---|
| 225 | if( nbccd <= 0 ) exit(-1);
 | 
|---|
| 226 | 
 | 
|---|
| 227 | /* initialisation USER */
 | 
|---|
| 228 | 
 | 
|---|
| 229 | Calibration_Absolue = 0;
 | 
|---|
| 230 | Calibration_Absolue_UParms = 0;
 | 
|---|
| 231 | UINIT();
 | 
|---|
| 232 | 
 | 
|---|
| 233 | /* initialisation montecarlo */
 | 
|---|
| 234 | 
 | 
|---|
| 235 | AMPLML( 1 );
 | 
|---|
| 236 | 
 | 
|---|
| 237 | /* gestion des interrupts */
 | 
|---|
| 238 | 
 | 
|---|
| 239 | Nbsread_SigCatchInit();
 | 
|---|
| 240 | 
 | 
|---|
| 241 | /*-------------------------------------------------------*/
 | 
|---|
| 242 | /*-------- Boucle sur les CCD (ou paves Plaques) --------*/
 | 
|---|
| 243 | /*-------------------------------------------------------*/
 | 
|---|
| 244 | 
 | 
|---|
| 245 | while ( fgets(str,NBSREAD_LSTR,dataccd) != 0 ) {   /* While... */
 | 
|---|
| 246 | 
 | 
|---|
| 247 | strip(str,'B',' ');
 | 
|---|
| 248 | printf("%s\n",str);
 | 
|---|
| 249 | 
 | 
|---|
| 250 | if ( strstr(str,"@END") == str ) break;
 | 
|---|
| 251 | 
 | 
|---|
| 252 | if( strstr(str,"@CCD") == str) {
 | 
|---|
| 253 | 
 | 
|---|
| 254 |   numccd++;
 | 
|---|
| 255 |   sscanf(&str[4],"%d",&ccdnum);
 | 
|---|
| 256 |   printf("Nouveau CCD: c'est le %d ieme, de numero %d\n",numccd,ccdnum);
 | 
|---|
| 257 |   szMXBYTE=0;
 | 
|---|
| 258 |   nbmsMX=0;
 | 
|---|
| 259 |   for (ic=0;ic<NCOULMX;ic++) {
 | 
|---|
| 260 |     nbfil[ic] = iet[ic] = net[ic] = nmes[ic]= 0;
 | 
|---|
| 261 |     for (i=0;i<NBFILMX;i++) nbms[ic][i] = nms1fil[ic][i] = 0;
 | 
|---|
| 262 |   }
 | 
|---|
| 263 | 
 | 
|---|
| 264 | } else if( strstr(str,"@FINCCD") == str) {
 | 
|---|
| 265 | 
 | 
|---|
| 266 |   for(ic=0;ic<NCOULMX;ic++) {
 | 
|---|
| 267 |     if( nbfil[ic] <= 0 ) continue;
 | 
|---|
| 268 |     /* printf("Main_Debug: lunfil[%d][0]=%ld\n",ic,lunfil[ic][0]); */
 | 
|---|
| 269 |     sztmi[ic] = lunfil[ic][0]->Head.RecSize[3] / lunfil[ic][0]->Head.NItem;
 | 
|---|
| 270 |     szmes[ic] = lunfil[ic][0]->Head.RecSize[4] / lunfil[ic][0]->Head.NItem;
 | 
|---|
| 271 |     if( szMXBYTE < sztmi[ic] ) szMXBYTE = sztmi[ic];
 | 
|---|
| 272 |     if( szMXBYTE < szmes[ic] ) szMXBYTE = szmes[ic];
 | 
|---|
| 273 |     if(ffprt>0) printf("coul=%3d sztmi=%d szmes=%d\n",ic+1,sztmi[ic],szmes[ic]);
 | 
|---|
| 274 |   }
 | 
|---|
| 275 |   if(ffprt>0) printf("szMXBYTE=%d\n",szMXBYTE);
 | 
|---|
| 276 | 
 | 
|---|
| 277 |   DO_MALLOC();
 | 
|---|
| 278 |   for (ic=0;ic<NCOULMX;ic++) OPENSUIV(ic);
 | 
|---|
| 279 |   for (ic=0;ic<NCOULMX;ic++) DATCLEAN(ic);
 | 
|---|
| 280 |   for (ic=0;ic<NCOULMX;ic++) DATSORT (ic); /* fill indexu */
 | 
|---|
| 281 |   TFIRST = Tfirst[0]; TLAST  = Tlast[0];
 | 
|---|
| 282 |   for (ic=1;ic<NCOULMX;ic++) {
 | 
|---|
| 283 |     if( Tfirst[ic] != -1. && Tfirst[ic]<TFIRST ) TFIRST = Tfirst[ic];
 | 
|---|
| 284 |     if( Tlast[ic]  != -1. && Tlast[ic] >TLAST  ) TLAST  = Tlast[ic];
 | 
|---|
| 285 |   }
 | 
|---|
| 286 |   if(ffprt>0) printf("Tfirst=%.2f (1=.2%f,2=%.2f)  Tlast=%.2f (1=%.2f,2=%.2f)\n"
 | 
|---|
| 287 |                     ,TFIRST,Tfirst[0],Tfirst[1],TLAST,Tlast[0],Tlast[1]);
 | 
|---|
| 288 |   UINITCCD();
 | 
|---|
| 289 |   AMPLML( 2 );
 | 
|---|
| 290 | 
 | 
|---|
| 291 |   iet1 = ( ietlim[0] > 0 ) ? ietlim[0] : 1;
 | 
|---|
| 292 |   iet2 = ( ietlim[1] > net[0] ) ? net[0] : ietlim[1];
 | 
|---|
| 293 | 
 | 
|---|
| 294 |   for(iet0=iet1;iet0<=iet2; iet0+=ietinc) {   /* boucle sur les etoiles */
 | 
|---|
| 295 | 
 | 
|---|
| 296 |     netoiles++;
 | 
|---|
| 297 | 
 | 
|---|
| 298 |     for (ic=0;ic<NCOULMX;ic++) iet[ic]=iet0;
 | 
|---|
| 299 | 
 | 
|---|
| 300 |     debug=0;
 | 
|---|
| 301 |     if( iet0>=idebug[0] && iet0<=idebug[1] && ( ccdnum==idebug[2] || idebug[2]<0) ) {
 | 
|---|
| 302 |       nstdeb++;
 | 
|---|
| 303 |       debug=idebug[3];
 | 
|---|
| 304 |     }
 | 
|---|
| 305 |     if(debug!=0) printf("\n\n************** DEBUG CCD %d ET %d LUES %d \n"
 | 
|---|
| 306 |                        ,ccdnum,iet0,netoiles);
 | 
|---|
| 307 | 
 | 
|---|
| 308 |     /* lecture des starinfos */
 | 
|---|
| 309 |     for (ic=0;ic<NCOULMX;ic++) {
 | 
|---|
| 310 |       if( ic == 0 ) {   /*fichier non-composite ou couleur 1*/
 | 
|---|
| 311 |         READST(ic);
 | 
|---|
| 312 |       } else {
 | 
|---|
| 313 |         iet[ic] = staru[0].XRef;
 | 
|---|
| 314 |         READST(ic);
 | 
|---|
| 315 |       }
 | 
|---|
| 316 |     }
 | 
|---|
| 317 | 
 | 
|---|
| 318 |     /* calibration absolue */
 | 
|---|
| 319 |     starcal.Mag_B= starcal.Mag_V= starcal.Mag_R
 | 
|---|
| 320 |                  = starcal.Mag_I= starcal.Rstar= -GRAND;
 | 
|---|
| 321 |     starcal.Rtype = -1;
 | 
|---|
| 322 |     if( iet[0]>0 && iet[1]>0 && Calibration_Absolue!=0 )
 | 
|---|
| 323 |       Calibration_Absolue(staru[0].FluxRef,staru[1].FluxRef,
 | 
|---|
| 324 |                           &starcal,Calibration_Absolue_UParms);
 | 
|---|
| 325 | 
 | 
|---|
| 326 |     /* on saute l'etoile et la lecture des mesures ? */
 | 
|---|
| 327 |     if(starcut.Mag_B_cut>0 &&
 | 
|---|
| 328 |       (starcal.Mag_B<starcut.Mag_B_min || starcal.Mag_B>starcut.Mag_B_max) ) continue;
 | 
|---|
| 329 |     if(starcut.Mag_V_cut>0 &&
 | 
|---|
| 330 |       (starcal.Mag_V<starcut.Mag_V_min || starcal.Mag_V>starcut.Mag_V_max) ) continue;
 | 
|---|
| 331 |     if(starcut.Mag_R_cut>0 &&
 | 
|---|
| 332 |       (starcal.Mag_R<starcut.Mag_R_min || starcal.Mag_R>starcut.Mag_R_max) ) continue;
 | 
|---|
| 333 |     if(starcut.Mag_I_cut>0 &&
 | 
|---|
| 334 |       (starcal.Mag_I<starcut.Mag_I_min || starcal.Mag_I>starcut.Mag_I_max) ) continue;
 | 
|---|
| 335 |     if(starcut.Rstar_cut>0 &&
 | 
|---|
| 336 |       (starcal.Rstar<starcut.Rstar_min || starcal.Rstar>starcut.Rstar_max) ) continue;
 | 
|---|
| 337 | 
 | 
|---|
| 338 |     if(starcut.Rtype_cut>0 &&
 | 
|---|
| 339 |       (starcal.Rtype<starcut.Rtype_min || starcal.Rtype>starcut.Rtype_max) ) continue;
 | 
|---|
| 340 | 
 | 
|---|
| 341 |     if(starcut.Mag_BV_cut>0 &&
 | 
|---|
| 342 |       (starcal.Mag_B-starcal.Mag_V<starcut.Mag_BV_min ||
 | 
|---|
| 343 |        starcal.Mag_B-starcal.Mag_V>starcut.Mag_BV_max) ) continue;
 | 
|---|
| 344 |     if(starcut.Mag_BR_cut>0 &&
 | 
|---|
| 345 |       (starcal.Mag_B-starcal.Mag_R<starcut.Mag_BR_min ||
 | 
|---|
| 346 |        starcal.Mag_B-starcal.Mag_R>starcut.Mag_BR_max) ) continue;
 | 
|---|
| 347 |     if(starcut.Mag_VR_cut>0 &&
 | 
|---|
| 348 |       (starcal.Mag_V-starcal.Mag_R<starcut.Mag_VR_min ||
 | 
|---|
| 349 |        starcal.Mag_V-starcal.Mag_R>starcut.Mag_VR_max) ) continue;
 | 
|---|
| 350 |     if(starcut.Mag_RI_cut>0 &&
 | 
|---|
| 351 |       (starcal.Mag_R-starcal.Mag_I<starcut.Mag_RI_min ||
 | 
|---|
| 352 |        starcal.Mag_R-starcal.Mag_I>starcut.Mag_RI_max) ) continue;
 | 
|---|
| 353 | 
 | 
|---|
| 354 |     /* l'etoile a t-elle ete selectionnee ? */
 | 
|---|
| 355 |     SELSTAR();
 | 
|---|
| 356 | 
 | 
|---|
| 357 |     /* lecture des mesures */
 | 
|---|
| 358 |     for (ic=0;ic<NCOULMX;ic++) READET(ic);
 | 
|---|
| 359 | 
 | 
|---|
| 360 |     ietmax = (mc.montecar>0 && mc.NGenStar>0) ? mc.NGenStar : 1;
 | 
|---|
| 361 |     ietgen=0;
 | 
|---|
| 362 |     while( ietgen < ietmax ) {
 | 
|---|
| 363 |       if(mc.montecar>0) AMPLML( 3 );
 | 
|---|
| 364 |       UEVT();
 | 
|---|
| 365 |       ietgen++;
 | 
|---|
| 366 |     }
 | 
|---|
| 367 | 
 | 
|---|
| 368 |   }      /* fin de boucle sur les etoiles */
 | 
|---|
| 369 | 
 | 
|---|
| 370 |   UENDCCD();
 | 
|---|
| 371 | 
 | 
|---|
| 372 |   printf("on ferme les fichiers de suivi du ccd %d\n",ccdnum);
 | 
|---|
| 373 |   DO_FREE();
 | 
|---|
| 374 |   for(ic=0;ic<NCOULMX;ic++) {
 | 
|---|
| 375 |     printf("Couleur: %d\n",ic+1);
 | 
|---|
| 376 |     for(i=0;i<nbfil[ic];i++) {
 | 
|---|
| 377 |       printf("fichier %d\n",i);
 | 
|---|
| 378 |       SuiviClose(lunfil[ic][i]);
 | 
|---|
| 379 |   } }
 | 
|---|
| 380 | 
 | 
|---|
| 381 | } else if( strstr(str,"@COUL") == str) {
 | 
|---|
| 382 | 
 | 
|---|
| 383 |   sscanf(&str[5],"%d",&ic);
 | 
|---|
| 384 |   printf("Couleur: %d\n",ic);
 | 
|---|
| 385 |   ic--;
 | 
|---|
| 386 | 
 | 
|---|
| 387 | } else {
 | 
|---|
| 388 |   str[strlen(str)-1] = ' ';   /*  lu par fgets() */
 | 
|---|
| 389 |   strip(str,'B',' ');
 | 
|---|
| 390 |   DECODESUIVINAME(str);
 | 
|---|
| 391 |   printf("%s\n",str);
 | 
|---|
| 392 |   strcpy(lunnam[ic][nbfil[ic]], str);
 | 
|---|
| 393 |   printf("lunnam[%d][nbfil[%d]] == lunnam[%d][%d] = %s\n"
 | 
|---|
| 394 |         ,ic,ic,ic,nbfil[ic],lunnam[ic][nbfil[ic]]);
 | 
|---|
| 395 |   if( (lunfil[ic][nbfil[ic]] = SuiviOpen(str,OpenType)) == 0 ) {
 | 
|---|
| 396 |     printf("Impossible d'ouvrir le fichier %s\n",str);
 | 
|---|
| 397 |     exit(-1);
 | 
|---|
| 398 |   }
 | 
|---|
| 399 |   /* lecture du nombre de mesures */
 | 
|---|
| 400 |   nbms[ic][nbfil[ic]] = SuiviGetNbMesures(lunfil[ic][nbfil[ic]]);
 | 
|---|
| 401 |   if(ffprt>1) printf("Ouverture lunfil[%3d][%5d] = %d mes\n"
 | 
|---|
| 402 |                     ,ic,nbfil[ic],nbms[ic][nbfil[ic]]);
 | 
|---|
| 403 |   if( nbms[ic][nbfil[ic]] > nbmsMX ) nbmsMX = nbms[ic][nbfil[ic]];
 | 
|---|
| 404 |   /* numero du 1er fichier de l'unite nbfil[ic]: va de 0->nmes */
 | 
|---|
| 405 |   nms1fil[ic][nbfil[ic]] = nmes[ic];
 | 
|---|
| 406 |   nmes[ic] += nbms[ic][nbfil[ic]];
 | 
|---|
| 407 |   nbfil[ic]++;
 | 
|---|
| 408 | 
 | 
|---|
| 409 | }
 | 
|---|
| 410 | }   /* Fin du While... */
 | 
|---|
| 411 | 
 | 
|---|
| 412 | UEND();
 | 
|---|
| 413 | AMPLML( 5 );
 | 
|---|
| 414 | if( StId1 != 0 ) free(StId1);
 | 
|---|
| 415 | if( StId2 != 0 ) free(StId2);
 | 
|---|
| 416 | fclose(dataccd);
 | 
|---|
| 417 | 
 | 
|---|
| 418 | printf("Nombre total d'etoiles lues %d\n",netoiles);
 | 
|---|
| 419 | 
 | 
|---|
| 420 | exit(0);
 | 
|---|
| 421 | }
 | 
|---|
| 422 | 
 | 
|---|
| 423 | /*==========================================================================*/
 | 
|---|
| 424 | void INIT_NBSR(void)
 | 
|---|
| 425 | {
 | 
|---|
| 426 | int i;
 | 
|---|
| 427 | 
 | 
|---|
| 428 | OpenType= SUOF_RO_MEM2;
 | 
|---|
| 429 | GRAND2_KILL = 5. * GRAND2;
 | 
|---|
| 430 | 
 | 
|---|
| 431 | ietlim[0]= -IGRAND;
 | 
|---|
| 432 | ietlim[1]= IGRAND;
 | 
|---|
| 433 | idebug[0]=idebug[1]=idebug[2]=idebug[3]=0;
 | 
|---|
| 434 | NStId = NSelStId = FgSelSt = 0;
 | 
|---|
| 435 | StId1 = StId2 = 0;
 | 
|---|
| 436 | nkillms = 0; for(i=0;i<NKILLMSMX;i++) killms[i]=0;
 | 
|---|
| 437 | ffprt=0;
 | 
|---|
| 438 | 
 | 
|---|
| 439 | starcut.Mag_B_cut  = 0;   starcut.Mag_B_min  = starcut.Mag_B_max = 0.;
 | 
|---|
| 440 | starcut.Mag_V_cut  = 0;   starcut.Mag_V_min  = starcut.Mag_V_max = 0.;
 | 
|---|
| 441 | starcut.Mag_R_cut  = 0;   starcut.Mag_R_min  = starcut.Mag_R_max = 0.;
 | 
|---|
| 442 | starcut.Mag_I_cut  = 0;   starcut.Mag_I_min  = starcut.Mag_I_max = 0.;
 | 
|---|
| 443 | starcut.Mag_BV_cut = 0;   starcut.Mag_BV_min = starcut.Mag_BV_max = 0.;
 | 
|---|
| 444 | starcut.Mag_BR_cut = 0;   starcut.Mag_BR_min = starcut.Mag_BR_max = 0.;
 | 
|---|
| 445 | starcut.Mag_VR_cut = 0;   starcut.Mag_VR_min = starcut.Mag_VR_max = 0.;
 | 
|---|
| 446 | starcut.Mag_RI_cut = 0;   starcut.Mag_RI_min = starcut.Mag_RI_max = 0.;
 | 
|---|
| 447 | starcut.Rstar_cut  = 0;   starcut.Rstar_min  = starcut.Rstar_max = 0.;
 | 
|---|
| 448 | starcut.Rtype_cut  = 0;   starcut.Rtype_min  = starcut.Rtype_max = 0;
 | 
|---|
| 449 | 
 | 
|---|
| 450 | mc.montecar=0;
 | 
|---|
| 451 | mc.Taille_Finie=0;
 | 
|---|
| 452 | mc.Blending=0;
 | 
|---|
| 453 | mc.NGenStar=1;
 | 
|---|
| 454 | mc.Usu0_Cut = 0.001;
 | 
|---|
| 455 | mc.U0SimI=0.; mc.U0MinI=0.; mc.U0MaxI=0.;
 | 
|---|
| 456 | mc.TireU0 = 0;
 | 
|---|
| 457 | mc.T0SimI= -1.; mc.T0MinI=1.; mc.T0MaxI= -1.;
 | 
|---|
| 458 | mc.TauSimI=0.; mc.TauMinI=0.01; mc.TauMaxI=365.;
 | 
|---|
| 459 | mc.TireTau = 0;
 | 
|---|
| 460 | mc.USimI=0.; mc.UMinI=0.; mc.UMaxI=0.;
 | 
|---|
| 461 | mc.TireU = 0;
 | 
|---|
| 462 | mc.Get_Par_Blending = 0;
 | 
|---|
| 463 | mc.coeff_Arec1[0] = mc.coeff_Arec1[1] = 0.;
 | 
|---|
| 464 | mc.coeff_Arec2[0] = mc.coeff_Arec2[1] = 0.;
 | 
|---|
| 465 | mc.starcal1.Rstar = mc.starcal2.Rstar = 0.;
 | 
|---|
| 466 | mc.iseed1 = 36117;
 | 
|---|
| 467 | mc.iseed2 = 51106;
 | 
|---|
| 468 | mc.iseed3 = 21478;
 | 
|---|
| 469 | 
 | 
|---|
| 470 | }
 | 
|---|
| 471 | 
 | 
|---|
| 472 | /*==========================================================================*/
 | 
|---|
| 473 | void OPENSUIV(int ic)
 | 
|---|
| 474 | /* ic = couleur (0 a 1) */
 | 
|---|
| 475 | {
 | 
|---|
| 476 | int_4 i,j,rc;
 | 
|---|
| 477 | int_4 l, i1, i2;
 | 
|---|
| 478 | int lp;
 | 
|---|
| 479 | 
 | 
|---|
| 480 | if(ffprt>0) printf("===> OPENSUIV couleur %3d\n",ic+1);
 | 
|---|
| 481 | 
 | 
|---|
| 482 | if( nbfil[ic] <= 0 ) return;
 | 
|---|
| 483 | 
 | 
|---|
| 484 | if(nmes[ic]>0 && ffprt>0) {
 | 
|---|
| 485 |   printf("Coul %2d nmes %5d on lit %4d fichiers, nbmsMAX %5d\n"
 | 
|---|
| 486 |         ,ic+1,nmes[ic],nbfil[ic],nbmsMX);
 | 
|---|
| 487 |   if(ffprt>1) {
 | 
|---|
| 488 |     printf("nbms:\n");
 | 
|---|
| 489 |     for(i=0;i<nbfil[ic];i++) {printf(" %6d",nbms[ic][i]); if(i%10==9) printf("\n");}
 | 
|---|
| 490 |     if((nbfil[ic]-1)%10!=9) printf("\n");
 | 
|---|
| 491 | 
 | 
|---|
| 492 |     printf("nms1fil:\n");
 | 
|---|
| 493 |     for(i=0;i<nbfil[ic];i++) {printf(" %6d",nms1fil[ic][i]); if(i%10==9) printf("\n");}
 | 
|---|
| 494 |     if((nbfil[ic]-1)%10!=9) printf("\n");
 | 
|---|
| 495 | } }
 | 
|---|
| 496 | 
 | 
|---|
| 497 | for(i=0;i<nbfil[ic];i++) {
 | 
|---|
| 498 | 
 | 
|---|
| 499 |   l = SuiviGetType(lunfil[ic][i]);
 | 
|---|
| 500 | 
 | 
|---|
| 501 |   /* type de fichier de suivi */
 | 
|---|
| 502 |   if( i==0 && ic==0 ) {
 | 
|---|
| 503 |     typsuivi=l;
 | 
|---|
| 504 |     printf("Type du fichier de Suivi: %d\n",typsuivi);
 | 
|---|
| 505 |   } else if ( typsuivi != l ) {
 | 
|---|
| 506 |     printf("couleur %3d fichier de suivi %5d mauvais type %d %d\n"
 | 
|---|
| 507 |           ,ic+1,i+1,l,typsuivi);
 | 
|---|
| 508 |     exit(-1);
 | 
|---|
| 509 |   }
 | 
|---|
| 510 | 
 | 
|---|
| 511 |   /* lecture de global info */
 | 
|---|
| 512 |   if( ( rc=SuiviReadGlobInfo( lunfil[ic][i],(char *) (&glinf) ) ) != 0 ) {
 | 
|---|
| 513 |     printf("Problemes lecture global info coul %3d fichier %d, rc=%d\n",ic+1,i+1,rc);
 | 
|---|
| 514 |     exit(-1);
 | 
|---|
| 515 |   }
 | 
|---|
| 516 |   DECODE_GLOBINFO(&glinf);
 | 
|---|
| 517 | 
 | 
|---|
| 518 |   //if( ffprt>3 || (ffprt>0 && i==0) ) PrtGlobInfo(&glinf,ffprt-3);
 | 
|---|
| 519 |   if( ffprt>3 || (ffprt>0 && i==0) ) PrtGlobInfo(&glinf,99);
 | 
|---|
| 520 |     
 | 
|---|
| 521 |   /* lecture du nombre d'etoiles */
 | 
|---|
| 522 |   l= SuiviGetNbStars(lunfil[ic][i]);
 | 
|---|
| 523 |   if( i==0 ) {
 | 
|---|
| 524 |     net[ic] = SuiviGetNbStars(lunfil[ic][i]);
 | 
|---|
| 525 |   } else if( l !=net[ic] ) {
 | 
|---|
| 526 |     printf("Probleme dans nombre d'etoiles coul %3d fichier %d: %d %d\n"
 | 
|---|
| 527 |           ,ic+1,i+1,l,net[ic]);
 | 
|---|
| 528 |     exit(-1);
 | 
|---|
| 529 |   }
 | 
|---|
| 530 | 
 | 
|---|
| 531 | }
 | 
|---|
| 532 | 
 | 
|---|
| 533 | /* REMARQUE
 | 
|---|
| 534 |    lecture de timeinfo:
 | 
|---|
| 535 |    attention: on passe par un buffer intermediaire car quand on definit
 | 
|---|
| 536 |    une structure, la longueur est un nombre entier de fois l'element
 | 
|---|
| 537 |    le plus long de la structure (ici (double)) et donc on a, pour TIMEINFO
 | 
|---|
| 538 |    sizeof(TIMEINFO)=416 au lieu de 412 effectivement ecrit 
 | 
|---|
| 539 |    Depuis la version avec gestion du Byte swap entre machine il n'est
 | 
|---|
| 540 |    plus possible de lire directement une serie de timeinfo (meme pb pour mesure),
 | 
|---|
| 541 |    il faut boucler sur toutes les photos! (debug 13/03/98 Reza)
 | 
|---|
| 542 |    Voici le commentaire exact de Reza:  
 | 
|---|
| 543 |      "On ne peut plus lire un groupe de mesure ou de timeinfo s'il faut
 | 
|---|
| 544 |       ByteSwaper et si Taille RecSuivi <> sizeof(structure)
 | 
|---|
| 545 |       il faut lire les mesures/timeinfo un a un"
 | 
|---|
| 546 |    Versions CVS ou il y avait encore la lecture par buffer:
 | 
|---|
| 547 |      nbsread.h 1.14 , nbsread.c 1.30
 | 
|---|
| 548 | */
 | 
|---|
| 549 | 
 | 
|---|
| 550 | lp = ffprt-2;
 | 
|---|
| 551 | 
 | 
|---|
| 552 | if(nmes[ic]>0) {
 | 
|---|
| 553 |   for(i=0;i<nbfil[ic];i++) {
 | 
|---|
| 554 |     i2=nbms[ic][i];
 | 
|---|
| 555 |     i1=nms1fil[ic][i];
 | 
|---|
| 556 |     for(j=0;j<i2;j++) {
 | 
|---|
| 557 |       if( (rc=SuiviReadTimeInfo(lunfil[ic][i], j+1, j+1, (char *)(&timinf))) != 0 ) {
 | 
|---|
| 558 |         printf("Problemes lecture timinf info coul %3d fichier %5d, rc=%d\n"
 | 
|---|
| 559 |               ,ic+1,i+1,rc);
 | 
|---|
| 560 |         exit(-1);
 | 
|---|
| 561 |       }
 | 
|---|
| 562 |       l = j+i1;
 | 
|---|
| 563 |       DECODE_TIMEINFO(&timinf,ic,l);
 | 
|---|
| 564 |       indexu[ic][l] = 0;
 | 
|---|
| 565 |       date  [ic][l] = (double) timeu[ic][l].TStart / JourSec;
 | 
|---|
| 566 |       ampli [ic][l] = 1.;
 | 
|---|
| 567 |       meslun[ic][l] = i;
 | 
|---|
| 568 |       if( ffprt>1 ) {
 | 
|---|
| 569 |         PrtTimeInfo (&timinf,l,ffprt-2);
 | 
|---|
| 570 |         if( ffprt>5 ) PrtTimeInfoU (&timeu[ic][l],l,1);
 | 
|---|
| 571 |       }
 | 
|---|
| 572 |     }
 | 
|---|
| 573 |   }
 | 
|---|
| 574 | }
 | 
|---|
| 575 | 
 | 
|---|
| 576 | /* some prints ? */
 | 
|---|
| 577 | if(nmes[ic]>0 && ffprt>0) {
 | 
|---|
| 578 |   printf("date:\n");
 | 
|---|
| 579 |   for(i=0;i<nmes[ic];i++) {printf(" %9.2f",date[ic][i]); if(i%10==9) printf("\n");}
 | 
|---|
| 580 |   if((nmes[ic]-1)%10!=9) printf("\n");
 | 
|---|
| 581 |   if(lp>=3) {
 | 
|---|
| 582 |     printf("meslun:\n");
 | 
|---|
| 583 |     for(i=0;i<nmes[ic];i++) {printf(" %9d",meslun[ic][i]); if(i%10==9) printf("\n");}
 | 
|---|
| 584 |     if((nmes[ic]-1)%10!=9) printf("\n");
 | 
|---|
| 585 | } }
 | 
|---|
| 586 | 
 | 
|---|
| 587 | }
 | 
|---|
| 588 | 
 | 
|---|
| 589 | /*==========================================================================*/
 | 
|---|
| 590 | void READST(int ic)
 | 
|---|
| 591 | /* ic = couleur (0 a 1) */
 | 
|---|
| 592 | {
 | 
|---|
| 593 | int_4 i,rc;
 | 
|---|
| 594 | 
 | 
|---|
| 595 | staru[ic].XRef=0;
 | 
|---|
| 596 | 
 | 
|---|
| 597 | if(nmes[ic]>0)
 | 
|---|
| 598 |   for(i=0;i<nmes[ic];i++) mesu[ic][i].Flux=mesu[ic][i].Fond=0.;
 | 
|---|
| 599 | 
 | 
|---|
| 600 | if(debug>0) printf("READST: coul %3d et %d\n",ic+1,iet[ic]);
 | 
|---|
| 601 | 
 | 
|---|
| 602 | if( iet[ic]<=0 || iet[ic]>net[ic] ) return;
 | 
|---|
| 603 | 
 | 
|---|
| 604 | /*lecture de star info sur premier fichier */
 | 
|---|
| 605 | if((rc=SuiviReadStarInfo(lunfil[ic][0],iet[ic],(char *)(&star))) != 0) {
 | 
|---|
| 606 |   printf("Problemes lecture star info coul %3d etoile %d, rc=%d\n"
 | 
|---|
| 607 |         ,ic+1,iet[ic],rc);
 | 
|---|
| 608 |   exit(-1);
 | 
|---|
| 609 | }
 | 
|---|
| 610 | 
 | 
|---|
| 611 | DECODE_STARINFO(&star,ic);
 | 
|---|
| 612 | 
 | 
|---|
| 613 | if(debug>1) {
 | 
|---|
| 614 |   printf("starinfo: coul %3d nbfil=%5d\n",ic+1,nbfil[ic]);
 | 
|---|
| 615 |   PrtStarInfo(&staru[ic],ic,5);
 | 
|---|
| 616 | }
 | 
|---|
| 617 | 
 | 
|---|
| 618 | }
 | 
|---|
| 619 | 
 | 
|---|
| 620 | /*==========================================================================*/
 | 
|---|
| 621 | void READET(int ic)
 | 
|---|
| 622 | /* ic = couleur (0 a 1) */
 | 
|---|
| 623 | {
 | 
|---|
| 624 | int_4 i,j,rc;
 | 
|---|
| 625 | int_4 i1,i2;
 | 
|---|
| 626 | 
 | 
|---|
| 627 | if( iet[ic]<=0 || iet[ic]>net[ic] ) return;
 | 
|---|
| 628 | if( nmes[ic]<=0 ) return;
 | 
|---|
| 629 | 
 | 
|---|
| 630 | /* lecture des mesures: cf lecture expliquee pour timeinfo */
 | 
|---|
| 631 | for(i=0;i<nbfil[ic];i++) {
 | 
|---|
| 632 |   if(debug>1) printf("    Fichier %5d nbms %5d\n",i,nbms[ic][i]);
 | 
|---|
| 633 |   i2=nbms[ic][i];
 | 
|---|
| 634 |   i1=nms1fil[ic][i];
 | 
|---|
| 635 |   for(j=0;j<i2;j++) {
 | 
|---|
| 636 |     if((rc=SuiviReadMesures(lunfil[ic][i],iet[ic],j+1,j+1,(char *)(&mes))) != 0) {
 | 
|---|
| 637 |       printf("Problemes lecture mes coul %3d etoile %d lim %5d %5d, rc=%d\n"
 | 
|---|
| 638 |             ,ic+1,iet[ic],i1,i2,rc);
 | 
|---|
| 639 |       exit(-1);
 | 
|---|
| 640 |     }
 | 
|---|
| 641 |     DECODE_MESURE(&mes,ic,j+i1);
 | 
|---|
| 642 |     if(debug>5) PrtMesure(&mes,j+i1,5);
 | 
|---|
| 643 |   }
 | 
|---|
| 644 | }
 | 
|---|
| 645 | 
 | 
|---|
| 646 | 
 | 
|---|
| 647 | if(debug>3) {
 | 
|---|
| 648 |   if(debug>4) for(i=0;i<nmes[ic];i++) PrtMesureU(&mesu[ic][i],i,5);
 | 
|---|
| 649 |   printf("\nmesu.Flux couleur=%d:\n",ic);
 | 
|---|
| 650 |   for(i=0;i<nmesure[ic];i++) {
 | 
|---|
| 651 |     j=indexu[ic][i];
 | 
|---|
| 652 |     printf(" %12.5g",mesu[ic][j].Flux);
 | 
|---|
| 653 |     if(i%10==9 || i==nmesure[ic]-1) printf("\n");
 | 
|---|
| 654 |   }
 | 
|---|
| 655 |   if(debug>4) {
 | 
|---|
| 656 |     printf("mesu.ErrFlux couleur=%d:\n",ic);
 | 
|---|
| 657 |     for(i=0;i<nmesure[ic];i++) {
 | 
|---|
| 658 |        j=indexu[ic][i]; printf(" %12.5g",mesu[ic][j].ErrFlux);
 | 
|---|
| 659 |        if(i%10==9 || i==nmesure[ic]-1) printf("\n");
 | 
|---|
| 660 |      }
 | 
|---|
| 661 |     printf("mesu.FluxB couleur=%d:\n",ic);
 | 
|---|
| 662 |     for(i=0;i<nmesure[ic];i++) {
 | 
|---|
| 663 |        j=indexu[ic][i]; printf(" %12.5g",mesu[ic][j].FluxB);
 | 
|---|
| 664 |        if(i%10==9 || i==nmesure[ic]-1) printf("\n");
 | 
|---|
| 665 |     }
 | 
|---|
| 666 |   }
 | 
|---|
| 667 | }
 | 
|---|
| 668 | 
 | 
|---|
| 669 | }
 | 
|---|
| 670 | 
 | 
|---|
| 671 | /*==========================================================================*/
 | 
|---|
| 672 | void DATCLEAN(int ic)
 | 
|---|
| 673 | /* ic = couleur (0 a 1) */
 | 
|---|
| 674 | {
 | 
|---|
| 675 | int_4 i,j,k;
 | 
|---|
| 676 | double d1,d2;
 | 
|---|
| 677 | 
 | 
|---|
| 678 | if(ffprt>0) printf("=====> DATCLEAN coul=%3d ccd %5d\n",ic+1,ccdnum);
 | 
|---|
| 679 | 
 | 
|---|
| 680 | if(nmes[ic]<=0) return;
 | 
|---|
| 681 | 
 | 
|---|
| 682 | /* on tue selon les criteres utilisateur */
 | 
|---|
| 683 | UDATCLEAN(ic+1);
 | 
|---|
| 684 | /* a ce niveau les dates=GRAND2_KILL ne doivent absolument plus servir */
 | 
|---|
| 685 | 
 | 
|---|
| 686 | /* on tue les mesures 'n' pour chaque fichier de suivi */
 | 
|---|
| 687 | if( nbfil[ic] > 0 ) {
 | 
|---|
| 688 |   for(i=0;i<nbfil[ic];i++) {
 | 
|---|
| 689 |     if( nbms[ic][i]<= 0 ) continue;
 | 
|---|
| 690 |     for(j=0;j<nbms[ic][i];j++) {
 | 
|---|
| 691 |       if( date[ic][nms1fil[ic][i]+j] >= GRAND2_KILL) continue;
 | 
|---|
| 692 |       for(k=0;k<nkillms;k++) if ( j+1 == killms[k] ) {
 | 
|---|
| 693 |         if(ffprt>1)
 | 
|---|
| 694 |           printf(" Kill: mesure %6d (seq=%6d) du fichier suivi %4d\n"
 | 
|---|
| 695 |                          ,j,nms1fil[ic][i]+j,i);
 | 
|---|
| 696 |         date[ic][nms1fil[ic][i]+j] = GRAND2;
 | 
|---|
| 697 |       }
 | 
|---|
| 698 |     }
 | 
|---|
| 699 |   }
 | 
|---|
| 700 | }
 | 
|---|
| 701 | 
 | 
|---|
| 702 | 
 | 
|---|
| 703 | /* on tue les temps en double et on prend le dernier */
 | 
|---|
| 704 | if( nmes[ic]>1 ) {
 | 
|---|
| 705 |   for(i=0;i<nmes[ic]-1;i++) {
 | 
|---|
| 706 |     d1=date[ic][i];
 | 
|---|
| 707 |     if( d1 >= GRAND2 ) continue;
 | 
|---|
| 708 |     for(j=i+1;j<nmes[ic];j++) {
 | 
|---|
| 709 |       d2=date[ic][j];
 | 
|---|
| 710 |       if( d2 >= GRAND2 ) continue;
 | 
|---|
| 711 |       if( fabs(d1-d2) < (double) 0.00000001 ) {
 | 
|---|
| 712 |         if(ffprt>1)
 | 
|---|
| 713 |           printf(" Kill: %5d t=%f car dupliquee avec %5d t=%f soit %f\n"
 | 
|---|
| 714 |                 ,i,d1,j,d2,fabs(d1-d2));
 | 
|---|
| 715 |         date[ic][i] = GRAND2;
 | 
|---|
| 716 |         break;
 | 
|---|
| 717 |       }
 | 
|---|
| 718 |     }
 | 
|---|
| 719 |   }
 | 
|---|
| 720 | }
 | 
|---|
| 721 | 
 | 
|---|
| 722 | }
 | 
|---|
| 723 | 
 | 
|---|
| 724 | /*==========================================================================*/
 | 
|---|
| 725 | void DATSORT(int ic)
 | 
|---|
| 726 | /* ic = couleur (0 a 1) */
 | 
|---|
| 727 | {
 | 
|---|
| 728 | int_4 i,j;
 | 
|---|
| 729 | 
 | 
|---|
| 730 | if(ffprt>0) printf("DATSORT: coul %3d ccd %5d\n",ic+1,ccdnum);
 | 
|---|
| 731 | 
 | 
|---|
| 732 | nmesure[ic]=0;
 | 
|---|
| 733 | Tfirst[ic] = Tlast[ic] = -1.;
 | 
|---|
| 734 | 
 | 
|---|
| 735 | if(nmes[ic]<=0) return;
 | 
|---|
| 736 | 
 | 
|---|
| 737 | tri_double (date[ic],indexu[ic],nmes[ic]);
 | 
|---|
| 738 | 
 | 
|---|
| 739 | for(i=0;i<nmes[ic];i++) if(date[ic][i]<GRAND2) nmesure[ic]++;
 | 
|---|
| 740 | 
 | 
|---|
| 741 | if(nmesure[ic]>0) {
 | 
|---|
| 742 |   Tfirst[ic]=date[ic][indexu[ic][0]];
 | 
|---|
| 743 |   Tlast[ic]=date[ic][indexu[ic][nmesure[ic]-1]];
 | 
|---|
| 744 | }
 | 
|---|
| 745 | 
 | 
|---|
| 746 | if(ffprt>0) {
 | 
|---|
| 747 |   printf("coul %3d nmesure %6d nmes %6d Tint %.3f %.3f\n"
 | 
|---|
| 748 |                   ,ic+1,nmesure[ic],nmes[ic],Tfirst[ic],Tlast[ic]);
 | 
|---|
| 749 |   if(ffprt>1) {
 | 
|---|
| 750 |     printf("date:\n");
 | 
|---|
| 751 |     for(i=0;i<nmes[ic];i++)
 | 
|---|
| 752 |       {
 | 
|---|
| 753 |       j=indexu[ic][i];
 | 
|---|
| 754 |       if(date[ic][j]<GRAND2) printf(" %9.2f",date[ic][j]);
 | 
|---|
| 755 |         else printf(" %9.2f",-1.);
 | 
|---|
| 756 |       if(i%10==9) printf("\n");
 | 
|---|
| 757 |       }
 | 
|---|
| 758 |     if((nmes[ic]-1)%10!=9) printf("\n");
 | 
|---|
| 759 |   
 | 
|---|
| 760 |     printf("timeu.NumPhoto:\n");
 | 
|---|
| 761 |     for(i=0;i<nmes[ic];i++) {
 | 
|---|
| 762 |        j=indexu[ic][i]; printf(" %9d",timeu[ic][j].NumPhoto); if(i%10==9) printf("\n");}
 | 
|---|
| 763 |     if((nmes[ic]-1)%10!=9) printf("\n");
 | 
|---|
| 764 | 
 | 
|---|
| 765 |     if(ffprt>2) {
 | 
|---|
| 766 |       printf("indexu:\n");
 | 
|---|
| 767 |       for(i=0;i<nmes[ic];i++) {
 | 
|---|
| 768 |          printf(" %9d",indexu[ic][i]); if(i%10==9) printf("\n");}
 | 
|---|
| 769 |       if((nmes[ic]-1)%10!=9) printf("\n");
 | 
|---|
| 770 | } } }
 | 
|---|
| 771 | 
 | 
|---|
| 772 | }
 | 
|---|
| 773 | 
 | 
|---|
| 774 | /*==========================================================================*/
 | 
|---|
| 775 | int DECODESUIVINAME(char* str)
 | 
|---|
| 776 | /*
 | 
|---|
| 777 | Pour decoder les noms des variables d'environnement dans une chaine de characteres
 | 
|---|
| 778 | - La chaine "str" est mofifiee (et doit donc etre modifiable)
 | 
|---|
| 779 | - Variable d'environnement = /home/.../toto/ ou /home/.../toto (avec ou sans / final)
 | 
|---|
| 780 | - La chaine "str" peut etre:
 | 
|---|
| 781 |   $AAA ${AAA} $(AAA) $AAA/blabla ${AAA}/blabla $(AAA)/blabla /.../$AAA/... etc...
 | 
|---|
| 782 |   Le cas ${AAA}blabla $(AAA)blabla n'est pas traite (/ impose en fin de nom de variable)
 | 
|---|
| 783 | - Retourne: -1 si echec, 0 si pas de variable a decoder, sinon nombre de variables decodees
 | 
|---|
| 784 | */
 | 
|---|
| 785 | {
 | 
|---|
| 786 | char *str1,*vnam,*cenv;
 | 
|---|
| 787 | int ls=0,lce,rc=0,i,ip,jp;
 | 
|---|
| 788 | 
 | 
|---|
| 789 | ls = strlen(str);
 | 
|---|
| 790 | /* Pas de $ ou chaine trop courte */
 | 
|---|
| 791 | if(posc(str,'$')<0 || ls<1) return rc;
 | 
|---|
| 792 | str1 = (char *) malloc((NBSREAD_LSTR+5)*sizeof(char));
 | 
|---|
| 793 | vnam = (char *) malloc(NBSREAD_LSTR*sizeof(char));
 | 
|---|
| 794 | 
 | 
|---|
| 795 | i= ip = rc = 0;
 | 
|---|
| 796 | while( i<ls ) {
 | 
|---|
| 797 |   if(str[i] == ' ') {               /* on vire les blancs */
 | 
|---|
| 798 |     i++;
 | 
|---|
| 799 |   } else if(str[i] == '/') {        /* on vire les doubles "/" */
 | 
|---|
| 800 |     if(str1[ip]=='/') i++; else {str1[ip] = str[i]; ip++; i++;}
 | 
|---|
| 801 |   } else if(str[i] != '$') {        /* pas de variable d'environnement */
 | 
|---|
| 802 |     str1[ip] = str[i]; ip++; i++;
 | 
|---|
| 803 |   } else {                          /* variable d'environnement */
 | 
|---|
| 804 |     jp = 0;
 | 
|---|
| 805 |     while( i<ls ) {
 | 
|---|
| 806 |       if(str[i]=='/') {i++; break;}
 | 
|---|
| 807 |       else if(str[i]=='$'||str[i]=='{'||str[i]=='}'||str[i]=='('||str[i]==')')  i++;
 | 
|---|
| 808 |       else {vnam[jp]=str[i]; jp++; i++;}
 | 
|---|
| 809 |     }
 | 
|---|
| 810 |     vnam[jp] = '\0';
 | 
|---|
| 811 |     if( (cenv=getenv(vnam)) == NULL )
 | 
|---|
| 812 |       {printf("variable inconnue=%s.\n",vnam); free(str1); free(vnam); return -1;}
 | 
|---|
| 813 |     lce = strlen(cenv);
 | 
|---|
| 814 |     rc++;
 | 
|---|
| 815 |     if(lce>0) {
 | 
|---|
| 816 |       jp = 0;
 | 
|---|
| 817 |       while( jp<lce ) {
 | 
|---|
| 818 |         /* on evite TOTO=/home/toto/ et blabla/$TOTO -> blabla//home/toto */
 | 
|---|
| 819 |         if(ip>0) if(jp==0 && cenv[jp]=='/' && str1[ip-1]=='/') {jp++; continue;}
 | 
|---|
| 820 |         str1[ip] = cenv[jp]; ip++; jp++;
 | 
|---|
| 821 |       }
 | 
|---|
| 822 |       /* on evite TOTO=/home/toto/ et $TOTO/blabla -> /home/toto//blabla */
 | 
|---|
| 823 |       if(cenv[lce-1]!='/') {str1[ip] = '/'; ip++;}
 | 
|---|
| 824 |     }
 | 
|---|
| 825 |   }
 | 
|---|
| 826 | }
 | 
|---|
| 827 | str1[ip] = '\0';
 | 
|---|
| 828 | strcpy(str,str1);
 | 
|---|
| 829 | 
 | 
|---|
| 830 | free(str1); free(vnam);
 | 
|---|
| 831 | return rc;
 | 
|---|
| 832 | }
 | 
|---|
| 833 | 
 | 
|---|
| 834 | /*==========================================================================*/
 | 
|---|
| 835 | void DECODE_GLOBINFO(GLOBINFO *p)
 | 
|---|
| 836 | {
 | 
|---|
| 837 | globu = *p;
 | 
|---|
| 838 | }
 | 
|---|
| 839 | 
 | 
|---|
| 840 | /*==========================================================================*/
 | 
|---|
| 841 | void DECODE_TIMEINFO(TIMEINFO *p, int ic, int imes)
 | 
|---|
| 842 | /* ic = couleur (0 a 1), imes = mesure (0 a nmes-1) */
 | 
|---|
| 843 | {
 | 
|---|
| 844 | DecodeTim( p , &timeu[ic][imes]);
 | 
|---|
| 845 | }
 | 
|---|
| 846 | 
 | 
|---|
| 847 | /*==========================================================================*/
 | 
|---|
| 848 | void DECODE_STARINFO(STARINFO *p, int ic)
 | 
|---|
| 849 | /* ic = couleur (0 a 1) */
 | 
|---|
| 850 | {
 | 
|---|
| 851 | staru[ic] = *p;
 | 
|---|
| 852 | }
 | 
|---|
| 853 | 
 | 
|---|
| 854 | /*==========================================================================*/
 | 
|---|
| 855 | void DECODE_MESURE(MESURE *p, int ic, int imes)
 | 
|---|
| 856 | /* ic = couleur (0 a 1), imes = mesure (0 a nmes-1) */
 | 
|---|
| 857 | {
 | 
|---|
| 858 | if(date[ic][imes]<GRAND2_KILL) {
 | 
|---|
| 859 |   DecodeMes( p , &mesu[ic][imes] );
 | 
|---|
| 860 |   Calibre_F_E( &mesu[ic][imes], &timeu[ic][imes]);
 | 
|---|
| 861 | } else {
 | 
|---|
| 862 |   Mes_a_zero(&mesu[ic][imes]);
 | 
|---|
| 863 | }
 | 
|---|
| 864 | }
 | 
|---|
| 865 | 
 | 
|---|
| 866 | /*==========================================================================*/
 | 
|---|
| 867 | void DO_MALLOC(void)
 | 
|---|
| 868 | {
 | 
|---|
| 869 | int n,ic;
 | 
|---|
| 870 | size_t ll,sof, sofM, sofT;
 | 
|---|
| 871 | 
 | 
|---|
| 872 | if(ffprt>1)
 | 
|---|
| 873 |   printf("DO_MALLOC: nbmsMX=%d  szMXBYTE=%d\n",nbmsMX,szMXBYTE);
 | 
|---|
| 874 | 
 | 
|---|
| 875 | for(ic=0;ic<NCOULMX;ic++) {          /* BOUCLE SUR LES COULEURS */
 | 
|---|
| 876 | 
 | 
|---|
| 877 |   n = (nmes[ic] > 0) ? nmes[ic] : 1;
 | 
|---|
| 878 | 
 | 
|---|
| 879 |   sofT = sizeof(TIMEINFOU);
 | 
|---|
| 880 |   ll= n * sofT;
 | 
|---|
| 881 |   if(ffprt>0)
 | 
|---|
| 882 |     printf("timeu: allocation de %5d unites de %d bytes soit %d\n"
 | 
|---|
| 883 |           ,n,(int)sofT,(int)ll);
 | 
|---|
| 884 |   if( ( timeu[ic] = (TIMEINFOU *) malloc(ll) ) == 0 ) {
 | 
|---|
| 885 |     printf("impossible d'allouer *timeu par malloc coul %3d\n",ic+1);
 | 
|---|
| 886 |     exit(-1);
 | 
|---|
| 887 |   }
 | 
|---|
| 888 | 
 | 
|---|
| 889 |   sofM = sizeof(MESUREU);
 | 
|---|
| 890 |   ll= n * sofM;
 | 
|---|
| 891 |   if(ffprt>0)
 | 
|---|
| 892 |     printf("mesu: allocation de %5d unites de %d bytes soit %d\n"
 | 
|---|
| 893 |           ,n,(int)sofM,(int)ll);
 | 
|---|
| 894 |   if( (mesu[ic] = (MESUREU *) malloc(ll) ) == 0 ) {
 | 
|---|
| 895 |     printf("impossible d'allouer *mesu par malloc coul %3d\n",ic+1);
 | 
|---|
| 896 |     exit(-1);
 | 
|---|
| 897 |   }
 | 
|---|
| 898 | 
 | 
|---|
| 899 |   sof = sizeof(int_4);
 | 
|---|
| 900 |   ll= n * sof;
 | 
|---|
| 901 |   if(ffprt>0)
 | 
|---|
| 902 |     printf("indexu: allocation de %5d unites de %d bytes soit %d\n"
 | 
|---|
| 903 |           ,n,(int)sof,(int)ll);
 | 
|---|
| 904 |   if( (indexu[ic] = (int_4 *) malloc(ll) ) == 0 ) {
 | 
|---|
| 905 |     printf("impossible d'allouer *indexu par malloc coul %3d\n",ic+1);
 | 
|---|
| 906 |     exit(-1);
 | 
|---|
| 907 |   }
 | 
|---|
| 908 | 
 | 
|---|
| 909 |   sof = sizeof(unsigned short);
 | 
|---|
| 910 |   ll= n * sof;
 | 
|---|
| 911 |   if(ffprt>0)
 | 
|---|
| 912 |     printf("meslun: allocation de %5d unites de %d bytes soit %d\n"
 | 
|---|
| 913 |           ,n,(int)sof,(int)ll);
 | 
|---|
| 914 |   if( (meslun[ic] = (unsigned short *) malloc(ll) ) == 0 ) {
 | 
|---|
| 915 |     printf("impossible d'allouer *meslun par malloc coul %3d\n",ic+1);
 | 
|---|
| 916 |     exit(-1);
 | 
|---|
| 917 |   }
 | 
|---|
| 918 | 
 | 
|---|
| 919 |   sof = sizeof(double);
 | 
|---|
| 920 |   ll= n * sof;
 | 
|---|
| 921 |   if(ffprt>0)
 | 
|---|
| 922 |     printf("date: allocation de %5d unites de %d bytes soit %d\n"
 | 
|---|
| 923 |           ,n,(int)sof,(int)ll);
 | 
|---|
| 924 |   if( (date[ic] = (double *) malloc(ll) ) == 0 ) {
 | 
|---|
| 925 |     printf("impossible d'allouer *date par malloc coul %3d\n",ic+1);
 | 
|---|
| 926 |     exit(-1);
 | 
|---|
| 927 |   }
 | 
|---|
| 928 | 
 | 
|---|
| 929 |   sof = sizeof(float);
 | 
|---|
| 930 |   ll= n * sof;
 | 
|---|
| 931 |   if(ffprt>0)
 | 
|---|
| 932 |     printf("ampli: allocation de %5d unites de %d bytes soit %d\n"
 | 
|---|
| 933 |           ,n,(int)sof,(int)ll);
 | 
|---|
| 934 |   if( (ampli[ic] = (float *) malloc(ll) ) == 0 ) {
 | 
|---|
| 935 |     printf("impossible d'allouer *ampli par malloc coul %3d\n",ic+1);
 | 
|---|
| 936 |     exit(-1);
 | 
|---|
| 937 |   }
 | 
|---|
| 938 | 
 | 
|---|
| 939 | }             /* BOUCLE SUR LES COULEURS */
 | 
|---|
| 940 | 
 | 
|---|
| 941 | }
 | 
|---|
| 942 | 
 | 
|---|
| 943 | /*==========================================================================*/
 | 
|---|
| 944 | void DO_FREE(void)
 | 
|---|
| 945 | {
 | 
|---|
| 946 | int ic;
 | 
|---|
| 947 | for(ic=0;ic<NCOULMX;ic++) {
 | 
|---|
| 948 |   free(timeu[ic]);
 | 
|---|
| 949 |   free(mesu[ic]);
 | 
|---|
| 950 |   free(indexu[ic]);
 | 
|---|
| 951 |   free(date[ic]);
 | 
|---|
| 952 |   free(ampli[ic]);
 | 
|---|
| 953 | }
 | 
|---|
| 954 | }
 | 
|---|
| 955 | 
 | 
|---|
| 956 | /*==========================================================================*/
 | 
|---|
| 957 | int read_timeinfo(int ic,int imes,TIMEINFO *tim)
 | 
|---|
| 958 | /*
 | 
|---|
| 959 | Lecture de timeinfo pour la couleur ic (0->1), mesure imes (0->nmes[ic]-1)
 | 
|---|
| 960 |   return 0 si OK, <0 si problemes
 | 
|---|
| 961 | */
 | 
|---|
| 962 | {
 | 
|---|
| 963 | int rc,ifil,ime;
 | 
|---|
| 964 | 
 | 
|---|
| 965 | if ( imes<0 || imes>=nmes[ic] ) return(-1);
 | 
|---|
| 966 | ifil = meslun[ic][imes];
 | 
|---|
| 967 | if ( ifil<0 || ifil>=nbfil[ic] ) return(-2);
 | 
|---|
| 968 | ime = imes-nms1fil[ic][ifil];
 | 
|---|
| 969 | if ( ime<0 || ime>=nbms[ic][ifil] ) return(-3);
 | 
|---|
| 970 | 
 | 
|---|
| 971 | rc=SuiviReadTimeInfo(lunfil[ic][ifil], ime+1, ime+1, (char *)(tim));
 | 
|---|
| 972 | if( rc != 0 ) {
 | 
|---|
| 973 |   printf("read_timeinfo: problemes lecture timinf info coul %3d fichier %5d, rc=%d\n"
 | 
|---|
| 974 |         ,ic+1,imes+1,rc);
 | 
|---|
| 975 |   return(-4);
 | 
|---|
| 976 | }
 | 
|---|
| 977 | 
 | 
|---|
| 978 | /*
 | 
|---|
| 979 | printf("ic=%2d imes=%5d ifil=%4d ime=%5d NumPhoto=%d TStart=%d Expose=%d\n"
 | 
|---|
| 980 |       ,ic,imes,ifil,ime,tim->NumPhoto,tim->TStart,tim->Expose);
 | 
|---|
| 981 | printf("          Calib=%f %f sig=%f %f %f\n"
 | 
|---|
| 982 |       ,tim->Calib[0][0],tim->Calib[0][1],tim->SigX,tim->SigY,tim->Rho);
 | 
|---|
| 983 | */
 | 
|---|
| 984 | 
 | 
|---|
| 985 | return(0);
 | 
|---|
| 986 | }
 | 
|---|
| 987 | 
 | 
|---|
| 988 | /*==========================================================================*/
 | 
|---|
| 989 | void SELSTAR(void)
 | 
|---|
| 990 | /* selection de l etoile courante ? */
 | 
|---|
| 991 | {
 | 
|---|
| 992 | int i;
 | 
|---|
| 993 | FgSelSt = 0;
 | 
|---|
| 994 | if( NSelStId <= 0 || NStId <= 0 || StId1 == 0 || StId2 == 0 ) return;
 | 
|---|
| 995 | for(i=0;i<NSelStId;i++)
 | 
|---|
| 996 |   if( StId1[i]<=iet[0] && iet[0]<=StId2[i] ) {FgSelSt = iet[0]; break;}
 | 
|---|
| 997 | }
 | 
|---|
| 998 | 
 | 
|---|
| 999 | /*==========================================================================*/
 | 
|---|
| 1000 | void GET_STAR_ID(void)
 | 
|---|
| 1001 | /*
 | 
|---|
| 1002 | Lecture du fichier dataccd pour identifier les cartes de selection des etoiles.
 | 
|---|
| 1003 | */
 | 
|---|
| 1004 | {
 | 
|---|
| 1005 | char str[NBSREAD_LSTR];
 | 
|---|
| 1006 | int nallmin = 50, l;
 | 
|---|
| 1007 | 
 | 
|---|
| 1008 | NStId = NSelStId = FgSelSt = 0;
 | 
|---|
| 1009 | if( StId1 != 0 ) { free(StId1); StId1 = 0;}
 | 
|---|
| 1010 | if( StId2 != 0 ) { free(StId2); StId2 = 0;}
 | 
|---|
| 1011 | 
 | 
|---|
| 1012 | StId1 = (int *)malloc(nallmin*sizeof(int));
 | 
|---|
| 1013 | StId2 = (int *)malloc(nallmin*sizeof(int));
 | 
|---|
| 1014 | if( StId1==0 || StId2==0 ) {
 | 
|---|
| 1015 |   printf("GET_STAR_ID: Impossible d allouer StId1/2 pour la premiere fois %d\n"
 | 
|---|
| 1016 |         ,nallmin);
 | 
|---|
| 1017 |   return;
 | 
|---|
| 1018 | } else NStId = nallmin;
 | 
|---|
| 1019 | 
 | 
|---|
| 1020 | rewind(dataccd);
 | 
|---|
| 1021 | while ( fgets(str,NBSREAD_LSTR,dataccd) != 0 ) {
 | 
|---|
| 1022 |   strip(str,'B',' ');
 | 
|---|
| 1023 |   if ( strstr(str,"@SELET") != str ) continue;
 | 
|---|
| 1024 |   if( NSelStId >= NStId ) {
 | 
|---|
| 1025 |     l = NStId + nallmin;
 | 
|---|
| 1026 |     StId1 = (int *)realloc(StId1,l*sizeof(int));
 | 
|---|
| 1027 |     StId2 = (int *)realloc(StId2,l*sizeof(int));
 | 
|---|
| 1028 |     if( StId1==0 || StId2==0 ) {
 | 
|---|
| 1029 |       printf("GET_STAR_ID: Impossible de re-allouer %d pour StId1/2\n",l);
 | 
|---|
| 1030 |       return;
 | 
|---|
| 1031 |     } else {
 | 
|---|
| 1032 |       NStId = l;
 | 
|---|
| 1033 |       /* printf("GET_STAR_ID: reallocation de %d pour StId1/2 reussie\n",NStId); */
 | 
|---|
| 1034 |     }
 | 
|---|
| 1035 |   }
 | 
|---|
| 1036 |   StId1[NSelStId]=StId2[NSelStId]=-1;
 | 
|---|
| 1037 |   sscanf(&str[6],"%d %d",&StId1[NSelStId],&StId2[NSelStId]);
 | 
|---|
| 1038 |   if( StId2[NSelStId]<StId1[NSelStId] ) StId2[NSelStId]=StId1[NSelStId];
 | 
|---|
| 1039 |   NSelStId++;
 | 
|---|
| 1040 | }
 | 
|---|
| 1041 | 
 | 
|---|
| 1042 | if(ffprt>0) {
 | 
|---|
| 1043 |   printf("GET_STAR_ID: %d selections d etoiles (lim=%d)\n",NSelStId,NStId);
 | 
|---|
| 1044 |   if(ffprt>5)
 | 
|---|
| 1045 |     for(l=0;l<NSelStId;l++) {
 | 
|---|
| 1046 |       printf("    sel[%d]   et %d",l+1,StId1[l]);
 | 
|---|
| 1047 |       if( StId1[l]!=StId2[l] ) printf("  a %d\n",StId2[l]);
 | 
|---|
| 1048 |         else printf("\n");
 | 
|---|
| 1049 |     }
 | 
|---|
| 1050 | }
 | 
|---|
| 1051 | 
 | 
|---|
| 1052 | }
 | 
|---|
| 1053 | 
 | 
|---|
| 1054 | /*==========================================================================*/
 | 
|---|
| 1055 | void Nbsread_SigCatchInit(void)
 | 
|---|
| 1056 | {
 | 
|---|
| 1057 | int rc;
 | 
|---|
| 1058 | #ifdef OSF1
 | 
|---|
| 1059 | Nbsread_Action.sa_mask = 0;
 | 
|---|
| 1060 | Nbsread_Action.sa_flags = SA_RESTART;
 | 
|---|
| 1061 | #endif
 | 
|---|
| 1062 | #ifdef HPUX
 | 
|---|
| 1063 | memset( &(Nbsread_Action.sa_mask), 0, sizeof(sigset_t) ); 
 | 
|---|
| 1064 | Nbsread_Action.sa_flags = 0;
 | 
|---|
| 1065 | #endif
 | 
|---|
| 1066 | #ifdef Linux
 | 
|---|
| 1067 | memset( &(Nbsread_Action.sa_mask), 0, sizeof(sigset_t) ); 
 | 
|---|
| 1068 | Nbsread_Action.sa_flags = 0;
 | 
|---|
| 1069 | #endif
 | 
|---|
| 1070 | Nbsread_Action.sa_handler = Nbsread_SigCatch;
 | 
|---|
| 1071 | 
 | 
|---|
| 1072 | if( (rc=sigaction(SIGINT, &Nbsread_Action, NULL)) != 0 )
 | 
|---|
| 1073 |   printf("Nbsread_SigCatchInit_Error: signal SIGINT=%d rc=%d\n",SIGINT,rc);
 | 
|---|
| 1074 | if( (rc=sigaction(SIGUSR1, &Nbsread_Action, NULL)) != 0 )
 | 
|---|
| 1075 |   printf("Nbsread_SigCatchInit_Error: signal SIGUSR1=%d rc=%d\n",SIGUSR1,rc);
 | 
|---|
| 1076 | if( (rc=sigaction(SIGUSR2, &Nbsread_Action, NULL)) != 0 )
 | 
|---|
| 1077 |   printf("Nbsread_SigCatchInit_Error: signal SIGUSR2=%d rc=%d\n",SIGUSR2,rc);
 | 
|---|
| 1078 | }
 | 
|---|
| 1079 | 
 | 
|---|
| 1080 | /*==========================================================================*/
 | 
|---|
| 1081 | void Nbsread_SigCatch(int s)
 | 
|---|
| 1082 | {
 | 
|---|
| 1083 | switch(s) {
 | 
|---|
| 1084 |   case SIGINT :
 | 
|---|
| 1085 |     printf("\n\nNbsread_SigCatch: signal SIGINT=%d catched\n\n",s);
 | 
|---|
| 1086 |     break;
 | 
|---|
| 1087 |   case SIGUSR1 :
 | 
|---|
| 1088 |     printf("n\nNbsread_SigCatch: signal SIGUSR1=%d catched\n\n",s);
 | 
|---|
| 1089 |     break;
 | 
|---|
| 1090 |   case SIGUSR2 :
 | 
|---|
| 1091 |     printf("n\nNbsread_SigCatch: signal SIGUSR2=%d catched\n\n",s);
 | 
|---|
| 1092 |     break;
 | 
|---|
| 1093 |   default :
 | 
|---|
| 1094 |     printf("n\nNbsread_SigCatch: signal 1=%d catched et non traite\n\n",s);
 | 
|---|
| 1095 |     break;
 | 
|---|
| 1096 | }
 | 
|---|
| 1097 | printf("UENDCCD is called\n");
 | 
|---|
| 1098 | UENDCCD();
 | 
|---|
| 1099 | printf("UEND is called\n");
 | 
|---|
| 1100 | UEND();
 | 
|---|
| 1101 | printf("exit is called\n");
 | 
|---|
| 1102 | exit(-1);
 | 
|---|
| 1103 | }
 | 
|---|
| 1104 | 
 | 
|---|
| 1105 | 
 | 
|---|
| 1106 | /*************************************************************************/
 | 
|---|
| 1107 | /*************************************************************************/
 | 
|---|
| 1108 | /*******************  Commentaire nbsread et nbgene **********************/
 | 
|---|
| 1109 | /*************************************************************************/
 | 
|---|
| 1110 | /*************************************************************************/
 | 
|---|
| 1111 | /* 
 | 
|---|
| 1112 | ++ 
 | 
|---|
| 1113 |   Module        nbsread (C et C++)
 | 
|---|
| 1114 |   Lib   libnbsread++.a et libnbsread.a
 | 
|---|
| 1115 |   include       nbsread.h nbgene.h
 | 
|---|
| 1116 | |
 | 
|---|
| 1117 |         *- nbsread*
 | 
|---|
| 1118 |         
 | 
|---|
| 1119 |         C'est un programme qui permet de lire des fichiers de suivi
 | 
|---|
| 1120 |         pour 2 couleurs associees. Il fournit des points d'entrees permettant
 | 
|---|
| 1121 |         a l'utilisateur de piloter une analyse sans devoir s'occuper de
 | 
|---|
| 1122 |         la machinerie relative a la lecture de fichiers de suivis.
 | 
|---|
| 1123 | |   nbsread  nbsread.dataccd.Exemple
 | 
|---|
| 1124 |         Les noms des fichiers de suivi a lire doivent etre mis dans un fichier
 | 
|---|
| 1125 |         dont un descriptif est donne dans le fichier
 | 
|---|
| 1126 |         `AnaSuiv/nbsread.dataccd.Exemple'. La lecture de plusieurs fichiers
 | 
|---|
| 1127 |         de suivi pour plusieurs CCD dans 2 couleurs est permise.
 | 
|---|
| 1128 |         Ce fichier permet aussi de selectionner des etoiles par leur
 | 
|---|
| 1129 |         numero ou un intervalle de numeros, le programme renvoie `FgSelSt'
 | 
|---|
| 1130 |         non nulle si l'etoile a ete selectionnee par les datacards.
 | 
|---|
| 1131 | |
 | 
|---|
| 1132 |         *- Structure des donnees*
 | 
|---|
| 1133 |         
 | 
|---|
| 1134 |         Le programme lit les etoiles les unes apres les autres.
 | 
|---|
| 1135 |         Pour chaque etoile il remplit diverses structure ou tableau
 | 
|---|
| 1136 |         de structures permettant l'analyse de sa courbe de lumiere
 | 
|---|
| 1137 |         (la description des structures se trouve dans `fsvst.h'):
 | 
|---|
| 1138 | |  EXTERN GLOBINFO globu : decodage de GLOBINFO
 | 
|---|
| 1139 | |  EXTERN STARINFO staru[NCOULMX] : decodage de STARINFO
 | 
|---|
| 1140 | |  EXTERN int_4 nmes[NCOULMX] : nombre de mesures pour le CCD courant
 | 
|---|
| 1141 | |                               et les couleurs 0 et 1
 | 
|---|
| 1142 | |  EXTERN TIMEINFOU *timeu[NCOULMX] : tableau de structures TIMEINFOU
 | 
|---|
| 1143 | |  EXTERN MESUREU *mesu[NCOULMX] : tableau de structures MESUREU
 | 
|---|
| 1144 | |  EXTERN double *date[NCOULMX] : tableau des dates en jours
 | 
|---|
| 1145 | |  EXTERN float *ampli[NCOULMX] : tableau des amplifications montecarlo
 | 
|---|
| 1146 | |  EXTERN int_4 nmesure[NCOULMX] : nombre de mesure valides
 | 
|---|
| 1147 | |                                  pour le CCD courant
 | 
|---|
| 1148 | |  EXTERN int_4 *indexu[NCOULMX] : tableau des images valides
 | 
|---|
| 1149 | |                                  rangees chronologiquement
 | 
|---|
| 1150 | |  EXTERN STARCALU starcal : strucure de magnitude absolue
 | 
|---|
| 1151 | |  EXTERN STARCUTU starcut : structure de coupure sur les magnitudes
 | 
|---|
| 1152 | |                            et les couleurs (permet de ne pas lire
 | 
|---|
| 1153 | |                            certaines etoiles pour gagner du temps)
 | 
|---|
| 1154 | 
 | 
|---|
| 1155 |         Les tableaux de structures ont `nmes[0] / nmes[1]' elements correspondant
 | 
|---|
| 1156 |         au nombre total d'images pour les couleurs 0 et 1 dans les fichiers
 | 
|---|
| 1157 |         de suivi d'un CCD.
 | 
|---|
| 1158 | |
 | 
|---|
| 1159 |         *- Les points d'entree utilisateurs et structure de nbsread*
 | 
|---|
| 1160 |         
 | 
|---|
| 1161 |         Ce sont les routine commencant par la lettre `U...()'
 | 
|---|
| 1162 |         ayant un nom en majuscule.
 | 
|---|
| 1163 | 
 | 
|---|
| 1164 | |  Initialisation du job {
 | 
|---|
| 1165 | |
 | 
|---|
| 1166 | |    void UINIT(void);  <*********** USER
 | 
|---|
| 1167 | |    Initialisation montecarlo
 | 
|---|
| 1168 | |
 | 
|---|
| 1169 | |    Boucle sur les CCD a lire {
 | 
|---|
| 1170 | |
 | 
|---|
| 1171 | |      ---> Lecture de GLOBINFO et de TIMEINFOU pour un CCD
 | 
|---|
| 1172 | |      void UDATCLEAN(int coul);  <*********** USER
 | 
|---|
| 1173 | |      Classement des images valides par dates croissantes
 | 
|---|
| 1174 | |      void UINITCCD(void);  <*********** USER 
 | 
|---|
| 1175 | |      Initialisation montecarlo pour le CCD courant
 | 
|---|
| 1176 | |
 | 
|---|
| 1177 | |      Boucle sur les etoiles a lire {
 | 
|---|
| 1178 | |
 | 
|---|
| 1179 | |        ---> lecture de MESUREU
 | 
|---|
| 1180 | |        Calcul des magnitudes absolues
 | 
|---|
| 1181 | |        Coupure sur les magnitudes absolues et la couleur des etoiles
 | 
|---|
| 1182 | |        Generation montecarlo pour chaque etoile
 | 
|---|
| 1183 | |          (eventuellement plusieurs generation sur la meme etoile)
 | 
|---|
| 1184 | |        void UEVT(void);   <*********** USER
 | 
|---|
| 1185 | |
 | 
|---|
| 1186 | |      } Fin de la boucle sur les etoiles
 | 
|---|
| 1187 | |
 | 
|---|
| 1188 | |      void UENDCCD(void);  <*********** USER
 | 
|---|
| 1189 | |
 | 
|---|
| 1190 | |    } Fin de la boucle sur les CCD
 | 
|---|
| 1191 | |
 | 
|---|
| 1192 | |    void UEND(void);  <*********** USER
 | 
|---|
| 1193 | |    Fin du montecarlo, impression des statistiques des generations
 | 
|---|
| 1194 | |
 | 
|---|
| 1195 | |  } Fin du job
 | 
|---|
| 1196 | |
 | 
|---|
| 1197 |         *- void UINIT(void)*
 | 
|---|
| 1198 |         
 | 
|---|
| 1199 |         Tout ce qui ne doit etre fait qu'une fois par job
 | 
|---|
| 1200 |         definitions de parametres generaux, ouverture hbook etc...
 | 
|---|
| 1201 | |
 | 
|---|
| 1202 |         *- UDATCLEAN(int icoul)*
 | 
|---|
| 1203 |         
 | 
|---|
| 1204 |         Permet de tuer des images
 | 
|---|
| 1205 |         Si date[icoul][imes] est mise a `GRAND2' l'image correspondante
 | 
|---|
| 1206 |         ne sera pas prise en compte dans la sequence en temps.
 | 
|---|
| 1207 |         Si date[icoul][imes] est mise a `GRAND2_KILL', l'image correspondante
 | 
|---|
| 1208 |         ne sera ni decodee ni prise en compte (structure `MESUREU' mis a zero).
 | 
|---|
| 1209 |         Ceci permet d'eliminer des images ou il y a eu des erreurs de codage
 | 
|---|
| 1210 |         qui conduisent a un core dump.
 | 
|---|
| 1211 | |
 | 
|---|
| 1212 |         *- Classement et elimination des images*
 | 
|---|
| 1213 |         
 | 
|---|
| 1214 |         Les images sont ensuite rangees chronologiquement en ne tenant pas
 | 
|---|
| 1215 |         compte des images tuees. Pour les images ayant la meme date, seules
 | 
|---|
| 1216 |         celles de plus grand indice sont prises en compte.
 | 
|---|
| 1217 |         Le tableau `indexu[icoul][]' est fournit: il contient les indices des images
 | 
|---|
| 1218 |         valides rangees chronologiquement et sans doublons. L'indice de indexu
 | 
|---|
| 1219 |         varie de `0 a nmesure[icoul]' valeur qui represente le nombre d'images
 | 
|---|
| 1220 |         utilisables pour l'analyse.
 | 
|---|
| 1221 |         Par exemple, l'indice de la 5ieme image valide de la couleur bleue (reference
 | 
|---|
| 1222 |         secondaire) est:
 | 
|---|
| 1223 | |   j = indexu[1][5];
 | 
|---|
| 1224 |         et l'acces au flux brut est donne par:
 | 
|---|
| 1225 | |   fb = mesu[1][j].FluxB;
 | 
|---|
| 1226 |         Toutes les images sont encore accessibles directement, par exemple
 | 
|---|
| 1227 |         le flux brut de la 7ieme image (la 7ieme des fichiers de suivi
 | 
|---|
| 1228 |         sans aucun choix ni classement chronologique) est, pour la reference
 | 
|---|
| 1229 |         primaire (couleur rouge):
 | 
|---|
| 1230 | |   fb = mesu[0][7].FluxB;
 | 
|---|
| 1231 | |
 | 
|---|
| 1232 |         *- UINITCCD(void)*
 | 
|---|
| 1233 |         
 | 
|---|
| 1234 |         C'est un point d'entree a la fin de l'initialisation
 | 
|---|
| 1235 |         du CCD courant. A ce niveau toutes les informations de `TIMEINFOU',
 | 
|---|
| 1236 |         les notions d'images valides et le classement chronologique sont
 | 
|---|
| 1237 |         connus. Les variables `TFIRST' et `TLAST' representent respectivement
 | 
|---|
| 1238 |         la valeur de `date[][]' la plus petit et la plus grande pour les images
 | 
|---|
| 1239 |         valides. A ce niveau peuvent etre faites des initialisation montecarlo
 | 
|---|
| 1240 |         propres a un CCD.
 | 
|---|
| 1241 | |
 | 
|---|
| 1242 |         *- Calcul des magnitudes absolues*
 | 
|---|
| 1243 |                 
 | 
|---|
| 1244 |         Par defaut, il n'y a pas
 | 
|---|
| 1245 |         de calcul de magnitudes absolues. L'utilisateur peut fournir une
 | 
|---|
| 1246 |         routine de prototype:
 | 
|---|
| 1247 | |   void mycalib(float,float,STARCALU *);
 | 
|---|
| 1248 |         puis la connecter (dans `UINIT' ou `UINITCCD') au prototype:
 | 
|---|
| 1249 | |   void (*Calibration_Absolue)(float,float,STARCALU *, void*);
 | 
|---|
| 1250 |         en ecrivant: `Calibration_Absolue = mycalib;'.
 | 
|---|
| 1251 |         Cette routine sera appelee automatiquement pour chaque etoile
 | 
|---|
| 1252 |         avec les arguments:
 | 
|---|
| 1253 | |   Calibration_Absolue(staru[0].FluxRef,staru[1].FluxRef,&starcal,uparms);
 | 
|---|
| 1254 |         et remplira la structure `starcal'. Dand sa propre routine,
 | 
|---|
| 1255 |         l'utilisateur peut remplir des magnitudes `B,V,R,I' ainsi
 | 
|---|
| 1256 |         que le type de l'etoile (`SP=1 ou GR=2 ou indefini=0') et
 | 
|---|
| 1257 |         son rayon en unites de rayon solaire. Le remplissage de
 | 
|---|
| 1258 |         toutes ces valeurs n'est pas obligatoire, il depend de ce qui
 | 
|---|
| 1259 |         doit etre fait apres, soit par l'utilisateur dans son analyse,
 | 
|---|
| 1260 |         soit par la simulation montecarlo (l'effet de taille finie par
 | 
|---|
| 1261 |         exemple a besoin du rayon de l'etoile).
 | 
|---|
| 1262 |         Pour passer des parametres supplementaires a la fonction,
 | 
|---|
| 1263 |         il faut initialiser le pointeur par l'assignation:
 | 
|---|
| 1264 | |   Calibration_Absolue_UParms = &user_data_block
 | 
|---|
| 1265 |         et l'adresse sera passee comme 4eme argument de Calibration_Absolue.
 | 
|---|
| 1266 |         `user_data_block' doit etre declaree comme variable `globale'
 | 
|---|
| 1267 |         dans le fichier ou comme variable `static' dans la routine
 | 
|---|
| 1268 |         ou est faite l'assignation.
 | 
|---|
| 1269 | |
 | 
|---|
| 1270 |         *- Coupure sur les magnitudes absolues et la couleur des etoiles*
 | 
|---|
| 1271 |         
 | 
|---|
| 1272 |         Pour des raisons de rapidite, l'utilisateur peut couper sur la
 | 
|---|
| 1273 |         magnitude absolue ou la couleur de l'etoile en remplissant la
 | 
|---|
| 1274 |         structure `starcut'. Le temps de lecture de l'etoile est
 | 
|---|
| 1275 |         economise, et le point d'entree `UEVT()' n'est pas appele.
 | 
|---|
| 1276 | |
 | 
|---|
| 1277 |         *- Generation montecarlo pour chaque etoile*
 | 
|---|
| 1278 |         
 | 
|---|
| 1279 |         L'effet de microlentille est simule sur chaque etoile
 | 
|---|
| 1280 |         (ou plusieurs fois par etoile). Une description detaillee des
 | 
|---|
| 1281 |         possibilites de simulation est donnee plus loin.
 | 
|---|
| 1282 | |
 | 
|---|
| 1283 |         *- UEVT(void)*
 | 
|---|
| 1284 |         
 | 
|---|
| 1285 |         C'est l'endroit ou l'utilisateur met le code
 | 
|---|
| 1286 |         d'analyse et de traitement des courbes de lumieres. A ce niveau
 | 
|---|
| 1287 |         les etoiles selectionnees dans le fichier datacard par une carte
 | 
|---|
| 1288 |         `@SELET' sont identifier par le flag `FgSelSt>0'. Les variables
 | 
|---|
| 1289 |         de niveau d'impression, debug, etc... sont accessibles:
 | 
|---|
| 1290 | |  iet[NCOULMX] : numero de l'etoile (ref ou ref sec)
 | 
|---|
| 1291 | |  FgSelSt : flag de selection
 | 
|---|
| 1292 | |  idebug[4] : niveau de debug [iet1,iet2,ccd,niveau de debug]
 | 
|---|
| 1293 | |  ffprt : niveau d'impression
 | 
|---|
| 1294 | |  etc...
 | 
|---|
| 1295 | |
 | 
|---|
| 1296 |         *- void UENDCCD(void)*
 | 
|---|
| 1297 |                 
 | 
|---|
| 1298 |         Point d'entree a la fin du traitement
 | 
|---|
| 1299 |         d'un CCD. Il permet de fermer ou d'imprimer toute structure
 | 
|---|
| 1300 |         relative a un CCD.
 | 
|---|
| 1301 | |       
 | 
|---|
| 1302 |         *- void UEND(void)*
 | 
|---|
| 1303 |                 
 | 
|---|
| 1304 |         Point d'entree a la fin du job. C'est l'endroit
 | 
|---|
| 1305 |         pour desallouer les tableaux et pour imprimer les conclusions du job
 | 
|---|
| 1306 | |
 | 
|---|
| 1307 |         *- Arguments de l'executable*
 | 
|---|
| 1308 |         
 | 
|---|
| 1309 | |     [-h] :  help tres tres detaille
 | 
|---|
| 1310 | |     [-et et1,et2,etinc] :  numeros des etoiles a traiter
 | 
|---|
| 1311 | |     [-prt niv] :  niveau de print
 | 
|---|
| 1312 | |     [-dbg et1,et2,ccd,niv] : debug de certaine etoiles/ccd
 | 
|---|
| 1313 | |     [-kill mes1 mes2 mes3 ...] : pour tuer les images mes1...
 | 
|---|
| 1314 |         -kill permet de tuer les images mes1,mes2,mes3,... de `chaque'
 | 
|---|
| 1315 |         fichier de suivi pour un CCD et une couleur. C'est particulierement
 | 
|---|
| 1316 |         utile si, par exemple, la premiere image de chaque fichier de suivi
 | 
|---|
| 1317 |         est l'images de reference: on s'en debarasse en indiquant:
 | 
|---|
| 1318 | |  -kill 1
 | 
|---|
| 1319 | |
 | 
|---|
| 1320 |         Pour les arguments de nbsread, conformenent aux conventions prises
 | 
|---|
| 1321 |         pour les routines de lecture de fichiers de suivi,
 | 
|---|
| 1322 |         les numeros d'etoiles et d'images vont de `1 a nmes[]'
 | 
|---|
| 1323 |         (et non pas de `0 a nmes[]-1').
 | 
|---|
| 1324 | |
 | 
|---|
| 1325 |         *- Comment creer ses propres routines utilisateur*
 | 
|---|
| 1326 |         
 | 
|---|
| 1327 |         Il faut ecrire un fichier dans lequel sont definies
 | 
|---|
| 1328 |         les point d'entree utilisateurs:
 | 
|---|
| 1329 |         `UINIT(), UDATCLEAN(int), UINITCCD(), UEVT(), UENDCCD() et UEND()'.
 | 
|---|
| 1330 |         Le nom du fichier doit obligatoirement s'appeler
 | 
|---|
| 1331 | |  nbsreadu_myroutine.cc  (meme si on compile en C)
 | 
|---|
| 1332 | |  nbsreaduF_myroutine.f  pour la partie Fortran (si il y a des hbook)
 | 
|---|
| 1333 |         myroutine est un nom choisi librement par l'utilisateur.
 | 
|---|
| 1334 |         La compilation et le link s'effectue en executant:
 | 
|---|
| 1335 | |  make -f Makeus++ nbsread_myroutine   (si on travaille en C++)
 | 
|---|
| 1336 | |  make -f Makeus   nbsread_myroutine   (si on travaille en C  )
 | 
|---|
| 1337 |         Un exemple detaille a ete sauve dans la base CVS:
 | 
|---|
| 1338 | |  nbsreadu_squel.cc , nbsreaduF_squel.f
 | 
|---|
| 1339 |         Pour l'executer et regarder ses impressions,
 | 
|---|
| 1340 |         copiez `nbsreadu_squel.cc' et `nbsreaduF_squel.f' dans un de
 | 
|---|
| 1341 |         vos repertoires, et recuperez dans la base CVS `AnaSuiv/Makeus++'
 | 
|---|
| 1342 |         (ou `AnaSuiv/Makeus' si vous voulez compiler et linker en C).
 | 
|---|
| 1343 |         Compilez et linkez:
 | 
|---|
| 1344 | |  make -f Makeus++ nbsread_squel
 | 
|---|
| 1345 | |  (ou make -f Makeus nbsread_squel)
 | 
|---|
| 1346 |         Creez un fichier `fichier.dataccd' contenant des fichiers de suivi.
 | 
|---|
| 1347 |         Executez `nbsreadu_squel' en tapant la ligne de commande suivante:
 | 
|---|
| 1348 | |  nbsreadu_squel fichier.dataccd -prt 1 \
 | 
|---|
| 1349 | |          -mc 2 -u0 0.01,0.5 -t0 1,-1,-1 -tau 2,10,-1 -tf 2,0,2 -bl 1
 | 
|---|
| 1350 |         (cette procedure est egalement decrite aussi dans `nbsreadu_squel.cc')
 | 
|---|
| 1351 | |
 | 
|---|
| 1352 |         *- Initialisation du montecarlo et generation*
 | 
|---|
| 1353 |         
 | 
|---|
| 1354 |         L'initialisatuon peut etre effectuee, soit par arguments de
 | 
|---|
| 1355 |         l'executable:
 | 
|---|
| 1356 | |     [-mc ngenstar]
 | 
|---|
| 1357 | |     [-u0 U0MinI,U0MaxI,U0SimI]
 | 
|---|
| 1358 | |     [-t0 T0MinI,T0MaxI,T0SimI]
 | 
|---|
| 1359 | |     [-tau TauMinI,TauMaxI,TauSimI]
 | 
|---|
| 1360 | |     [-tf type(1ou2),UMinI,UMaxI,USimI,Usu0_Cut]
 | 
|---|
| 1361 | |     [-bl Blending (1ou2)]
 | 
|---|
| 1362 | |     [-seed seed1,seed2,seed3]
 | 
|---|
| 1363 |         soit en remplissant directement la structure `MONTECARLO mc' dans
 | 
|---|
| 1364 |         UINIT() et eventuellement UINITCCD() pour l'initialisation du `t0'.
 | 
|---|
| 1365 |         `nbsread -h' donne un help online tres detaille sur la facon de piloter
 | 
|---|
| 1366 |         la generation. La description des variables de la structure `mc'
 | 
|---|
| 1367 |         se trouve dans le fichier `nbgene.h'.
 | 
|---|
| 1368 |         La description des possibilites du montecarlo est donnee
 | 
|---|
| 1369 |         ci-apres en fonction des variables de la structure `mc':
 | 
|---|
| 1370 | 
 | 
|---|
| 1371 | | ----- CHOIX DU TYPE DE SIMULATION -----
 | 
|---|
| 1372 | | mc.Taille_Finie = 0 : generation taille ponctuelle
 | 
|---|
| 1373 | |                   1 :            taille finie tirage plat en U = Rs(proj)/Re
 | 
|---|
| 1374 | |                   2 :            taille finie tirage plat en UC (U = UC*Rs)
 | 
|---|
| 1375 | | mc.Blending = 1 : simulation du "blending" sur l'etoile principale (la + brillante)
 | 
|---|
| 1376 | |               2 : simulation du "blending" sur l'etoile cachee (la - brillante)
 | 
|---|
| 1377 | | 
 | 
|---|
| 1378 | | ----- GENERATION PLATE -----
 | 
|---|
| 1379 | | si max<=min
 | 
|---|
| 1380 | |   - TauSim=TauSimI Tau du phenomene
 | 
|---|
| 1381 | |   - T0Sim=T0SimI   instant du maximum si T0SimI>0
 | 
|---|
| 1382 | |   - U0Sim=U0SimI   parametre d'impact (en Re) si U0SimI>0
 | 
|---|
| 1383 | |   - USim=USimI     projection rayon etoile dans plan naine (en Re) si USimI>0
 | 
|---|
| 1384 | | si max>min
 | 
|---|
| 1385 | |   - TauSim est engendre avec une loi plate entre TauMinI ET TauMaxI
 | 
|---|
| 1386 | |   - T0Sim  est engendre avec une loi plate entre T0MinI  ET T0MaxI
 | 
|---|
| 1387 | |            si T0MaxI<T0MinI et T0SimI<0 on prend plat sur toute la periode
 | 
|---|
| 1388 | |   - U0Sim  est engendre avec une loi plate entre U0MinI  ET U0MaxI
 | 
|---|
| 1389 | |   - USim   est engendre avec une loi plate entre UMinI ET UMaxI si mc.Taille_Finie=1
 | 
|---|
| 1390 | |                                      entre UMinI*Rs ET UMaxI*Rs si mc.Taille_Finie=2
 | 
|---|
| 1391 | | 
 | 
|---|
| 1392 | | ----- GENERATION SELON UNE LOI DETERMINEE PAR L'UTILISATEUR -----
 | 
|---|
| 1393 | | l'utilisateur peut fournir la loi de tirage aleatoire pour u0,tau et u:
 | 
|---|
| 1394 | |   - mc.TireU0(float), mc.TireT0(float), mc.TireTau(float) et 
 | 
|---|
| 1395 | |        mc.TireU(float) sont 3 pointeurs sur des fonctions 
 | 
|---|
| 1396 | |        "float (*TireU0)(float alea)"
 | 
|---|
| 1397 | |        Il sont initialises a 0 dans nbsread.c
 | 
|---|
| 1398 | |   - mise en oeuvre (ex: pour le tirage de tau plat en log):
 | 
|---|
| 1399 | |     1-/ dans nbsreadu.c, l'utilisateur ecrit les routines de tirage
 | 
|---|
| 1400 | |         ( alea est uniformement distribue entre [0.,1.[ )
 | 
|---|
| 1401 | |       float my_tiretau(float alea)
 | 
|---|
| 1402 | |         {
 | 
|---|
| 1403 | |         float tau;
 | 
|---|
| 1404 | |         tau = log(mc.TauMinI)
 | 
|---|
| 1405 | |             + alea * ( log(mc.TauMaxI) - log(mc.TauMinI) );
 | 
|---|
| 1406 | |         return( (float) exp( (double) tau ) );
 | 
|---|
| 1407 | |         }
 | 
|---|
| 1408 | |      2-/ dans UINIT (par exemple)
 | 
|---|
| 1409 | |         mc.TireTau = my_tiretau;
 | 
|---|
| 1410 | 
 | 
|---|
| 1411 |         Evidemment dans l'hypothese d'un tirage avec effet de taille finie
 | 
|---|
| 1412 |         le rayon de l'etoile (starcal.Rstar) doit etre rempli
 | 
|---|
| 1413 |         dans la calibration absolue donnee par l'utilisateur.
 | 
|---|
| 1414 | 
 | 
|---|
| 1415 |         Pour une generation avec effet de blending, l'utilisateur doit
 | 
|---|
| 1416 |         une routine de simulation de l'effet de blending et la connecter
 | 
|---|
| 1417 |         au prototype mc.Get_Par_Blending dans UINIT() ou UINITCCD().
 | 
|---|
| 1418 | |  mc.Get_Par_Blending = my_blending_gene
 | 
|---|
| 1419 | 
 | 
|---|
| 1420 |         Pour une simulation avec effet de blending sur l'etoile la plus
 | 
|---|
| 1421 |         brillante du couple, il faut remplir
 | 
|---|
| 1422 | |  mc.coeff_Arec1[ic] pour les 2 couleurs (ic=0,1)
 | 
|---|
| 1423 |         Arec est le coefficient de blending:
 | 
|---|
| 1424 | |  Ampli(blend) = (Ampli-1.)*Arec +1
 | 
|---|
| 1425 | 
 | 
|---|
| 1426 |         Pour une simulation avec effet de blending sur l'etoile la moins
 | 
|---|
| 1427 |         brillante du couple, il faut remplir
 | 
|---|
| 1428 | |  mc.coeff_Arec2[ic] pour les 2 couleurs (ic=0,1)
 | 
|---|
| 1429 | 
 | 
|---|
| 1430 |         Pour une simulation avec effet de blending sur l'etoile la plus
 | 
|---|
| 1431 |         brillante du couple et avec effet de taille finie, il faut remplir
 | 
|---|
| 1432 | |  mc.coeff_Arec1[ic] pour les 2 couleurs (ic=0,1)
 | 
|---|
| 1433 | |  mc.starcal1.Rstar :   rayon de l'etoile la plus brillante
 | 
|---|
| 1434 | 
 | 
|---|
| 1435 |         Pour une simulation avec effet de blending sur l'etoile la moins
 | 
|---|
| 1436 |         brillante du couple et avec effet de taille finie, il faut remplir
 | 
|---|
| 1437 | |  mc.coeff_Arec2[ic] pour les 2 couleurs (ic=0,1)
 | 
|---|
| 1438 | |  mc.starcal2.Rstar :   rayon de l'etoile la moins brillante
 | 
|---|
| 1439 | |
 | 
|---|
| 1440 |         *- Initialisation des aleatoires*
 | 
|---|
| 1441 |         
 | 
|---|
| 1442 |         Le generateur utilise est "drand48" standard unix.
 | 
|---|
| 1443 |         Il est prevu 3 variables permettant d'initialiser le generateur:
 | 
|---|
| 1444 | |  mc.iseed1, mc.iseed2, mc.iseed3
 | 
|---|
| 1445 |         A la fin du job l'etat des graines est automatiquement imprime
 | 
|---|
| 1446 |         et permet de redemarrer un autre job pour la suite de la
 | 
|---|
| 1447 |         sequence d'aleatoires.
 | 
|---|
| 1448 | |
 | 
|---|
| 1449 |         *- Exemple de fichier datacard*
 | 
|---|
| 1450 |         
 | 
|---|
| 1451 |          Cf AnaSuiv/nbsread.dataccd.Exemple
 | 
|---|
| 1452 | |4                  nombre de CCD a traiter
 | 
|---|
| 1453 | |@CCD 03            numero du 1er CCD a traiter
 | 
|---|
| 1454 | |@COUL 1            numero de la couleur de reference
 | 
|---|
| 1455 | |/home/suivi/file1_coul1_ccd03.suivi
 | 
|---|
| 1456 | |/home/suivi/file2_coul1_ccd03.suivi
 | 
|---|
| 1457 | |@COUL 2            numero de la couleur secondaire (facultatif)
 | 
|---|
| 1458 | |/home/suivi/file1_coul2_ccd03.suivi
 | 
|---|
| 1459 | |/home/suivi/file2_coul2_ccd03.suivi
 | 
|---|
| 1460 | |/home/suivi/file3_coul2_ccd03.suivi
 | 
|---|
| 1461 | |@FINCCD            carte de fin de CCD
 | 
|---|
| 1462 | |@CCD 01            numero du 2sd CCD a traiter
 | 
|---|
| 1463 | |@COUL 1            numero de la couleur de reference
 | 
|---|
| 1464 | |/home/suivi/file1_coul1_ccd01.suivi
 | 
|---|
| 1465 | |/home/suivi/file2_coul1_ccd01.suivi
 | 
|---|
| 1466 | |@COUL 2            numero de la couleur secondaire (facultatif)
 | 
|---|
| 1467 | |/home/suivi/file1_coul2_ccd01.suivi
 | 
|---|
| 1468 | |@FINCCD            carte de fin de CCD
 | 
|---|
| 1469 | |@CCD 05            numero du 3ieme CCD a traiter
 | 
|---|
| 1470 | |@COUL 1            numero de la couleur de reference
 | 
|---|
| 1471 | |/home/suivi/file1_coul1_ccd05.suivi
 | 
|---|
| 1472 | |/home/suivi/file2_coul1_ccd05.suivi
 | 
|---|
| 1473 | |/home/suivi/file3_coul1_ccd05.suivi
 | 
|---|
| 1474 | |/home/suivi/file4_coul1_ccd05.suivi
 | 
|---|
| 1475 | |@COUL 2            numero de la couleur secondaire (facultatif)
 | 
|---|
| 1476 | |/home/suivi/file1_coul2_ccd05.suivi
 | 
|---|
| 1477 | |/home/suivi/file2_coul2_ccd05.suivi
 | 
|---|
| 1478 | |/home/suivi/file3_coul2_ccd05.suivi
 | 
|---|
| 1479 | |@FINCCD            carte de fin de CCD
 | 
|---|
| 1480 | |@CCD 07            numero du 4ieme CCD a traiter
 | 
|---|
| 1481 | |@COUL 1            numero de la couleur de reference
 | 
|---|
| 1482 | |/home/suivi/file1_coul1_ccd07.suivi
 | 
|---|
| 1483 | |/home/suivi/file2_coul1_ccd07.suivi
 | 
|---|
| 1484 | |/home/suivi/file3_coul1_ccd07.suivi
 | 
|---|
| 1485 | |@FINCCD            carte de fin de CCD
 | 
|---|
| 1486 | |@END               carte de fin de fichier datacard
 | 
|---|
| 1487 | |
 | 
|---|
| 1488 | |.... liste d etoiles a selectionner: FgSelSt != 0 dans nbsread.h
 | 
|---|
| 1489 | |@SELET 1001
 | 
|---|
| 1490 | |@SELET 1234
 | 
|---|
| 1491 | |@SELET 2032 2050
 | 
|---|
| 1492 | |@SELET 5044
 | 
|---|
| 1493 | |@SELET 10001 10100
 | 
|---|
| 1494 | |@SELET 6022
 | 
|---|
| 1495 | 
 | 
|---|
| 1496 |         A l'exception de la 1ere carte et des noms de fichiers de suivi
 | 
|---|
| 1497 |         toute carte valide commence par un caractere @.
 | 
|---|
| 1498 |         Il est fournit un moyen de selectionner des etoiles dans le
 | 
|---|
| 1499 |         fichier datacard et de les identifier dans `UEVT()'.
 | 
|---|
| 1500 |         grace au flag `FgSelSt'.
 | 
|---|
| 1501 | |  @SELET 1001        selection de l'etoile 1001 (attention et=[1,...])
 | 
|---|
| 1502 | |  @SELET 1001 2001   selection des etoiles de 1001 a 2001 inclusif
 | 
|---|
| 1503 | |
 | 
|---|
| 1504 |         *- Commentaire sur les structures des fichers de suivi et de nbsread*
 | 
|---|
| 1505 |         
 | 
|---|
| 1506 |         Dans le fichier de suivi sont codees les structures:
 | 
|---|
| 1507 | |     GLOBINFO STARINFO MESURE TIMEINFO
 | 
|---|
| 1508 |         La description des diverses structures et variables qu'elles
 | 
|---|
| 1509 |         contiennent se trouve dans `fsvst.h'.
 | 
|---|
| 1510 |         Pour gagner de la place, certaines d'entre elles (`TIMEINFO,MESURE')
 | 
|---|
| 1511 |         ont des variables codees de facon non triviale dans les mots
 | 
|---|
| 1512 |         de 16 bits. A la relecture du fichier de suivi, `nbsread'
 | 
|---|
| 1513 |         decode automatiquement les variables pour les ranger en clair
 | 
|---|
| 1514 |         dans des structures utilisateurs (dont le nom se termine par un `U').
 | 
|---|
| 1515 |         Notamment la structure `MESUREU' decode la structure `MESURE' et
 | 
|---|
| 1516 |         renvoit le flux et les erreurs calibrees et tenant compte des
 | 
|---|
| 1517 |         informations codees dans la structure `TIMEINFO'.
 | 
|---|
| 1518 | |     TIMEINFO  -> TIMEINFOU (qui ne contient qu'une partie des infos)
 | 
|---|
| 1519 | |     MESURE    -> MESUREU
 | 
|---|
| 1520 |         Les routines de decodage sont dans fsvst.h mais ne doivent
 | 
|---|
| 1521 |         en pratique pas etre utilisees directement par
 | 
|---|
| 1522 |         l'utilisateur de `nbsread':
 | 
|---|
| 1523 | |     TIMEINFOU * DecodeTim( TIMEINFO *time, TIMEINFOU *timeu);
 | 
|---|
| 1524 | |     MESUREU * DecodeMes( MESURE *mesc, MESUREU *mesu);
 | 
|---|
| 1525 | |
 | 
|---|
| 1526 |         *- Routines pratiques utilisables dans nbsread*
 | 
|---|
| 1527 |         
 | 
|---|
| 1528 | |  int read_timeinfo(int ic,int imes,TIMEINFO *tim)
 | 
|---|
| 1529 |         Comme `TIMEINFOU' ne contient qu'une partie des informations
 | 
|---|
| 1530 |         de la structure `TIMEINFO' du fichier de suivi, il peut etre pratique
 | 
|---|
| 1531 |         de pouvoir recuprer `TIMEINFO'. `read_timeinfo' permet de
 | 
|---|
| 1532 |         recuperer `TIMEINFO' pour la couleur `ic (0,1)' et la mesure
 | 
|---|
| 1533 |         `imes (0,nmes[ic]-1)'.
 | 
|---|
| 1534 | |    void PrtGlobInfo (GLOBINFO *glinf, int lp);
 | 
|---|
| 1535 | |    void PrtStarInfo (STARINFO *sti, int n, int lp);
 | 
|---|
| 1536 | |    void PrtMesure (MESURE *mes, int n, int lp);
 | 
|---|
| 1537 | |    void PrtMesureU (MESUREU *mesu, int n, int lp);
 | 
|---|
| 1538 | |    void PrtTimeInfo (TIMEINFO *tim, int n, int lp);
 | 
|---|
| 1539 | |    void PrtTimeInfoU (TIMEINFOU *tim, int n, int lp);
 | 
|---|
| 1540 |         Ces routines permettent d'imprimer les diverses structures
 | 
|---|
| 1541 |         d'un fichiers de suivi. Elles sont dans `fsvst.h'
 | 
|---|
| 1542 | |
 | 
|---|
| 1543 |         *- Routines de travail avec les transformations*
 | 
|---|
| 1544 |         
 | 
|---|
| 1545 |         Elles permettent, par exemple, de calculer les coordonnees
 | 
|---|
| 1546 |         sur l'image courante a partir des coordonnees de references de STARINFO.
 | 
|---|
| 1547 |         Les rputines se trouvent dans `fsvst.h' et `transfost.h'.
 | 
|---|
| 1548 | |    void GlobInfoToTransf(GLOBINFO *gli, TRANSFO *t1, TRANSFO *t2);
 | 
|---|
| 1549 | |    void TimeInfoToTransf(&timloc,&t1,&t2);
 | 
|---|
| 1550 | |    void CordTransf(double xS, double yS, double *xD, double *yD, 
 | 
|---|
| 1551 | |                    TRANSFO *transf)
 | 
|---|
| 1552 |         Voici un exemple d'utilisation a mettre dans `UEVT()' pour l'etoile
 | 
|---|
| 1553 |         courante.
 | 
|---|
| 1554 | |   TIMEINFO timloc;
 | 
|---|
| 1555 | |   TRANSFO t1,t2;
 | 
|---|
| 1556 | |   double Xcur[2],Ycur[2],x,y;
 | 
|---|
| 1557 | |   for(ic=0;ic<NCOULMX;ic++) {
 | 
|---|
| 1558 | |     for(k=0;k<nmes[ic];k++) {
 | 
|---|
| 1559 | |       read_timeinfo(ic,k,&timloc);
 | 
|---|
| 1560 | |       TimeInfoToTransf(&timloc,&t1,&t2);
 | 
|---|
| 1561 | |       -- des coordonnees de reference vers les courantes
 | 
|---|
| 1562 | |       x = staru[ic].XPos; y = staru[ic].YPos;
 | 
|---|
| 1563 | |       CordTransf(x,y,&Xcur[ic],&Ycur[ic],&t1);
 | 
|---|
| 1564 | |       PrintTransfo(&t1);
 | 
|---|
| 1565 | |       PrintTransfo(&t2);
 | 
|---|
| 1566 | |       -- des coordonnees courantes vers celles de reference
 | 
|---|
| 1567 | |       CordTransf(Xcur[ic],Ycur[ic],&x,&y,&t2);
 | 
|---|
| 1568 | |     }
 | 
|---|
| 1569 | |   }
 | 
|---|
| 1570 | 
 | 
|---|
| 1571 | --
 | 
|---|
| 1572 | */
 | 
|---|