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