source: Sophya/trunk/FrEROS/AnaLC/nbsread.cc@ 3311

Last change on this file since 3311 was 3308, checked in by ansari, 18 years ago

Creation du module AnaLC (lecture suivi EROS avec SOPHYA) dans la base
SOPHYA - cmv+reza 22/08/2007

  • Property svn:executable set to *
File size: 53.1 KB
Line 
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
21void INIT_NBSR(void);
22void OPENSUIV(int ic);
23void READST(int ic);
24void READET(int ic);
25void DATCLEAN(int ic);
26void DATSORT(int ic);
27
28void SELSTAR(void);
29void GET_STAR_ID(void);
30
31int DECODESUIVINAME(char* str);
32void DECODE_GLOBINFO(GLOBINFO *p);
33void DECODE_STARINFO(STARINFO *p, int ic);
34void DECODE_TIMEINFO(TIMEINFO *p, int ic, int imes);
35void DECODE_MESURE (MESURE *p, int ic, int imes);
36
37void DO_MALLOC(void);
38void DO_FREE(void);
39
40GLOBINFO glinf;
41STARINFO star;
42TIMEINFO timinf;
43MESURE mes;
44
45/* Pour catcher un CTRL-C ou des time limites */
46static struct sigaction Nbsread_Action;
47void Nbsread_SigCatchInit(void);
48void Nbsread_SigCatch(int s);
49
50void usage(int);
51void 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");
92exit(-1);
93}
94
95/*==========================================================================*/
96int main (int narg, char *arg[])
97{
98int_4 i,ic,iet1,iet2,iet0,ietmax,ietinc=1;
99char str[NBSREAD_LSTR];
100
101printf("=====> ");
102for(i=0;i<narg;i++) printf("%s ",arg[i]);
103printf("\n");
104
105/* printf("main: narg=%d %s\n",narg,arg[0]); */
106if (narg < 2) usage(0);
107if( !strcmp(arg[1],"-h") != 0 ) usage(1);
108
109/*------------------------------------------*/
110/*-------- Initialisation variables --------*/
111/*------------------------------------------*/
112
113INIT_NBSR();
114
115/*---------------------------------------*/
116/*-------- Lecture des arguments --------*/
117/*---------------------------------------*/
118
119i=2;
120while ( 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}
196ietlim[0] = ( ietlim[0] <= 0 ) ? 1 : ietlim[0] ;
197ietlim[1] = ( ietlim[1] < ietlim[0] ) ? IGRAND : ietlim[1] ;
198printf("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
204printf("Fichier de donnees suivi: %s\n",arg[1]);
205if( (dataccd = fopen(arg[1],"r") ) == 0 ) {
206 printf("impossible d'ouvrir .dataccd\n"); exit(-1);
207}
208
209GET_STAR_ID();
210
211/*-----------------------------------------*/
212/*-------- Initialisation generale --------*/
213/*-----------------------------------------*/
214
215/* initialisation des compteurs et des variables */
216
217numccd = nstdeb = netoiles = 0;
218
219rewind(dataccd);
220if( fgets(str,NBSREAD_LSTR,dataccd) == 0 )
221 {printf("fichier dataccd illisible\n"); exit(-1);}
222nbccd = -1;
223sscanf(str,"%d",&nbccd);
224printf("on veut traiter %d ccd\n",nbccd);
225if( nbccd <= 0 ) exit(-1);
226
227/* initialisation USER */
228
229Calibration_Absolue = 0;
230Calibration_Absolue_UParms = 0;
231UINIT();
232
233/* initialisation montecarlo */
234
235AMPLML( 1 );
236
237/* gestion des interrupts */
238
239Nbsread_SigCatchInit();
240
241/*-------------------------------------------------------*/
242/*-------- Boucle sur les CCD (ou paves Plaques) --------*/
243/*-------------------------------------------------------*/
244
245while ( fgets(str,NBSREAD_LSTR,dataccd) != 0 ) { /* While... */
246
247strip(str,'B',' ');
248printf("%s\n",str);
249
250if ( strstr(str,"@END") == str ) break;
251
252if( 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
412UEND();
413AMPLML( 5 );
414if( StId1 != 0 ) free(StId1);
415if( StId2 != 0 ) free(StId2);
416fclose(dataccd);
417
418printf("Nombre total d'etoiles lues %d\n",netoiles);
419
420exit(0);
421}
422
423/*==========================================================================*/
424void INIT_NBSR(void)
425{
426int i;
427
428OpenType= SUOF_RO_MEM2;
429GRAND2_KILL = 5. * GRAND2;
430
431ietlim[0]= -IGRAND;
432ietlim[1]= IGRAND;
433idebug[0]=idebug[1]=idebug[2]=idebug[3]=0;
434NStId = NSelStId = FgSelSt = 0;
435StId1 = StId2 = 0;
436nkillms = 0; for(i=0;i<NKILLMSMX;i++) killms[i]=0;
437ffprt=0;
438
439starcut.Mag_B_cut = 0; starcut.Mag_B_min = starcut.Mag_B_max = 0.;
440starcut.Mag_V_cut = 0; starcut.Mag_V_min = starcut.Mag_V_max = 0.;
441starcut.Mag_R_cut = 0; starcut.Mag_R_min = starcut.Mag_R_max = 0.;
442starcut.Mag_I_cut = 0; starcut.Mag_I_min = starcut.Mag_I_max = 0.;
443starcut.Mag_BV_cut = 0; starcut.Mag_BV_min = starcut.Mag_BV_max = 0.;
444starcut.Mag_BR_cut = 0; starcut.Mag_BR_min = starcut.Mag_BR_max = 0.;
445starcut.Mag_VR_cut = 0; starcut.Mag_VR_min = starcut.Mag_VR_max = 0.;
446starcut.Mag_RI_cut = 0; starcut.Mag_RI_min = starcut.Mag_RI_max = 0.;
447starcut.Rstar_cut = 0; starcut.Rstar_min = starcut.Rstar_max = 0.;
448starcut.Rtype_cut = 0; starcut.Rtype_min = starcut.Rtype_max = 0;
449
450mc.montecar=0;
451mc.Taille_Finie=0;
452mc.Blending=0;
453mc.NGenStar=1;
454mc.Usu0_Cut = 0.001;
455mc.U0SimI=0.; mc.U0MinI=0.; mc.U0MaxI=0.;
456mc.TireU0 = 0;
457mc.T0SimI= -1.; mc.T0MinI=1.; mc.T0MaxI= -1.;
458mc.TauSimI=0.; mc.TauMinI=0.01; mc.TauMaxI=365.;
459mc.TireTau = 0;
460mc.USimI=0.; mc.UMinI=0.; mc.UMaxI=0.;
461mc.TireU = 0;
462mc.Get_Par_Blending = 0;
463mc.coeff_Arec1[0] = mc.coeff_Arec1[1] = 0.;
464mc.coeff_Arec2[0] = mc.coeff_Arec2[1] = 0.;
465mc.starcal1.Rstar = mc.starcal2.Rstar = 0.;
466mc.iseed1 = 36117;
467mc.iseed2 = 51106;
468mc.iseed3 = 21478;
469
470}
471
472/*==========================================================================*/
473void OPENSUIV(int ic)
474/* ic = couleur (0 a 1) */
475{
476int_4 i,j,rc;
477int_4 l, i1, i2;
478int lp;
479
480if(ffprt>0) printf("===> OPENSUIV couleur %3d\n",ic+1);
481
482if( nbfil[ic] <= 0 ) return;
483
484if(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
497for(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
550lp = ffprt-2;
551
552if(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 ? */
577if(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/*==========================================================================*/
590void READST(int ic)
591/* ic = couleur (0 a 1) */
592{
593int_4 i,rc;
594
595staru[ic].XRef=0;
596
597if(nmes[ic]>0)
598 for(i=0;i<nmes[ic];i++) mesu[ic][i].Flux=mesu[ic][i].Fond=0.;
599
600if(debug>0) printf("READST: coul %3d et %d\n",ic+1,iet[ic]);
601
602if( iet[ic]<=0 || iet[ic]>net[ic] ) return;
603
604/*lecture de star info sur premier fichier */
605if((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
611DECODE_STARINFO(&star,ic);
612
613if(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/*==========================================================================*/
621void READET(int ic)
622/* ic = couleur (0 a 1) */
623{
624int_4 i,j,rc;
625int_4 i1,i2;
626
627if( iet[ic]<=0 || iet[ic]>net[ic] ) return;
628if( nmes[ic]<=0 ) return;
629
630/* lecture des mesures: cf lecture expliquee pour timeinfo */
631for(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
647if(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/*==========================================================================*/
672void DATCLEAN(int ic)
673/* ic = couleur (0 a 1) */
674{
675int_4 i,j,k;
676double d1,d2;
677
678if(ffprt>0) printf("=====> DATCLEAN coul=%3d ccd %5d\n",ic+1,ccdnum);
679
680if(nmes[ic]<=0) return;
681
682/* on tue selon les criteres utilisateur */
683UDATCLEAN(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 */
687if( 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 */
704if( 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/*==========================================================================*/
725void DATSORT(int ic)
726/* ic = couleur (0 a 1) */
727{
728int_4 i,j;
729
730if(ffprt>0) printf("DATSORT: coul %3d ccd %5d\n",ic+1,ccdnum);
731
732nmesure[ic]=0;
733Tfirst[ic] = Tlast[ic] = -1.;
734
735if(nmes[ic]<=0) return;
736
737tri_double (date[ic],indexu[ic],nmes[ic]);
738
739for(i=0;i<nmes[ic];i++) if(date[ic][i]<GRAND2) nmesure[ic]++;
740
741if(nmesure[ic]>0) {
742 Tfirst[ic]=date[ic][indexu[ic][0]];
743 Tlast[ic]=date[ic][indexu[ic][nmesure[ic]-1]];
744}
745
746if(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/*==========================================================================*/
775int DECODESUIVINAME(char* str)
776/*
777Pour 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{
786char *str1,*vnam,*cenv;
787int ls=0,lce,rc=0,i,ip,jp;
788
789ls = strlen(str);
790/* Pas de $ ou chaine trop courte */
791if(posc(str,'$')<0 || ls<1) return rc;
792str1 = (char *) malloc((NBSREAD_LSTR+5)*sizeof(char));
793vnam = (char *) malloc(NBSREAD_LSTR*sizeof(char));
794
795i= ip = rc = 0;
796while( 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}
827str1[ip] = '\0';
828strcpy(str,str1);
829
830free(str1); free(vnam);
831return rc;
832}
833
834/*==========================================================================*/
835void DECODE_GLOBINFO(GLOBINFO *p)
836{
837globu = *p;
838}
839
840/*==========================================================================*/
841void DECODE_TIMEINFO(TIMEINFO *p, int ic, int imes)
842/* ic = couleur (0 a 1), imes = mesure (0 a nmes-1) */
843{
844DecodeTim( p , &timeu[ic][imes]);
845}
846
847/*==========================================================================*/
848void DECODE_STARINFO(STARINFO *p, int ic)
849/* ic = couleur (0 a 1) */
850{
851staru[ic] = *p;
852}
853
854/*==========================================================================*/
855void DECODE_MESURE(MESURE *p, int ic, int imes)
856/* ic = couleur (0 a 1), imes = mesure (0 a nmes-1) */
857{
858if(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/*==========================================================================*/
867void DO_MALLOC(void)
868{
869int n,ic;
870size_t ll,sof, sofM, sofT;
871
872if(ffprt>1)
873 printf("DO_MALLOC: nbmsMX=%d szMXBYTE=%d\n",nbmsMX,szMXBYTE);
874
875for(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/*==========================================================================*/
944void DO_FREE(void)
945{
946int ic;
947for(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/*==========================================================================*/
957int read_timeinfo(int ic,int imes,TIMEINFO *tim)
958/*
959Lecture de timeinfo pour la couleur ic (0->1), mesure imes (0->nmes[ic]-1)
960 return 0 si OK, <0 si problemes
961*/
962{
963int rc,ifil,ime;
964
965if ( imes<0 || imes>=nmes[ic] ) return(-1);
966ifil = meslun[ic][imes];
967if ( ifil<0 || ifil>=nbfil[ic] ) return(-2);
968ime = imes-nms1fil[ic][ifil];
969if ( ime<0 || ime>=nbms[ic][ifil] ) return(-3);
970
971rc=SuiviReadTimeInfo(lunfil[ic][ifil], ime+1, ime+1, (char *)(tim));
972if( 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/*
979printf("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);
981printf(" 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
985return(0);
986}
987
988/*==========================================================================*/
989void SELSTAR(void)
990/* selection de l etoile courante ? */
991{
992int i;
993FgSelSt = 0;
994if( NSelStId <= 0 || NStId <= 0 || StId1 == 0 || StId2 == 0 ) return;
995for(i=0;i<NSelStId;i++)
996 if( StId1[i]<=iet[0] && iet[0]<=StId2[i] ) {FgSelSt = iet[0]; break;}
997}
998
999/*==========================================================================*/
1000void GET_STAR_ID(void)
1001/*
1002Lecture du fichier dataccd pour identifier les cartes de selection des etoiles.
1003*/
1004{
1005char str[NBSREAD_LSTR];
1006int nallmin = 50, l;
1007
1008NStId = NSelStId = FgSelSt = 0;
1009if( StId1 != 0 ) { free(StId1); StId1 = 0;}
1010if( StId2 != 0 ) { free(StId2); StId2 = 0;}
1011
1012StId1 = (int *)malloc(nallmin*sizeof(int));
1013StId2 = (int *)malloc(nallmin*sizeof(int));
1014if( 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
1020rewind(dataccd);
1021while ( 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
1042if(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/*==========================================================================*/
1055void Nbsread_SigCatchInit(void)
1056{
1057int rc;
1058#ifdef OSF1
1059Nbsread_Action.sa_mask = 0;
1060Nbsread_Action.sa_flags = SA_RESTART;
1061#endif
1062#ifdef HPUX
1063memset( &(Nbsread_Action.sa_mask), 0, sizeof(sigset_t) );
1064Nbsread_Action.sa_flags = 0;
1065#endif
1066#ifdef Linux
1067memset( &(Nbsread_Action.sa_mask), 0, sizeof(sigset_t) );
1068Nbsread_Action.sa_flags = 0;
1069#endif
1070Nbsread_Action.sa_handler = Nbsread_SigCatch;
1071
1072if( (rc=sigaction(SIGINT, &Nbsread_Action, NULL)) != 0 )
1073 printf("Nbsread_SigCatchInit_Error: signal SIGINT=%d rc=%d\n",SIGINT,rc);
1074if( (rc=sigaction(SIGUSR1, &Nbsread_Action, NULL)) != 0 )
1075 printf("Nbsread_SigCatchInit_Error: signal SIGUSR1=%d rc=%d\n",SIGUSR1,rc);
1076if( (rc=sigaction(SIGUSR2, &Nbsread_Action, NULL)) != 0 )
1077 printf("Nbsread_SigCatchInit_Error: signal SIGUSR2=%d rc=%d\n",SIGUSR2,rc);
1078}
1079
1080/*==========================================================================*/
1081void Nbsread_SigCatch(int s)
1082{
1083switch(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}
1097printf("UENDCCD is called\n");
1098UENDCCD();
1099printf("UEND is called\n");
1100UEND();
1101printf("exit is called\n");
1102exit(-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*/
Note: See TracBrowser for help on using the repository browser.