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

Last change on this file since 3736 was 3615, checked in by cmv, 16 years ago

Modifs relatives a l'introduction de RandomGeneratorInterface + delete de srandgen.c, cmv 01/05/2009

  • Property svn:executable set to *
File size: 53.4 KB
Line 
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
22void INIT_NBSR(void);
23void OPENSUIV(int ic);
24void READST(int ic);
25void READET(int ic);
26void DATCLEAN(int ic);
27void DATSORT(int ic);
28
29void SELSTAR(void);
30void GET_STAR_ID(void);
31
32int DECODESUIVINAME(char* str);
33void DECODE_GLOBINFO(GLOBINFO *p);
34void DECODE_STARINFO(STARINFO *p, int ic);
35void DECODE_TIMEINFO(TIMEINFO *p, int ic, int imes);
36void DECODE_MESURE (MESURE *p, int ic, int imes);
37
38void DO_MALLOC(void);
39void DO_FREE(void);
40
41GLOBINFO glinf;
42STARINFO star;
43TIMEINFO timinf;
44MESURE mes;
45
46/* Pour catcher un CTRL-C ou des time limites */
47static struct sigaction Nbsread_Action;
48void Nbsread_SigCatchInit(void);
49void Nbsread_SigCatch(int s);
50
51void usage(int);
52void 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");
93exit(-1);
94}
95
96/*==========================================================================*/
97int main (int narg, char *arg[])
98{
99int_4 i,ic,iet1,iet2,iet0,ietmax,ietinc=1;
100char str[NBSREAD_LSTR];
101
102printf("=====> ");
103for(i=0;i<narg;i++) printf("%s ",arg[i]);
104printf("\n");
105
106/* printf("main: narg=%d %s\n",narg,arg[0]); */
107if (narg < 2) usage(0);
108if( !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
122INIT_NBSR();
123
124/*---------------------------------------*/
125/*-------- Lecture des arguments --------*/
126/*---------------------------------------*/
127
128i=2;
129while ( 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}
205ietlim[0] = ( ietlim[0] <= 0 ) ? 1 : ietlim[0] ;
206ietlim[1] = ( ietlim[1] < ietlim[0] ) ? IGRAND : ietlim[1] ;
207printf("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
213printf("Fichier de donnees suivi: %s\n",arg[1]);
214if( (dataccd = fopen(arg[1],"r") ) == 0 ) {
215 printf("impossible d'ouvrir .dataccd\n"); exit(-1);
216}
217
218GET_STAR_ID();
219
220/*-----------------------------------------*/
221/*-------- Initialisation generale --------*/
222/*-----------------------------------------*/
223
224/* initialisation des compteurs et des variables */
225
226numccd = nstdeb = netoiles = 0;
227
228rewind(dataccd);
229if( fgets(str,NBSREAD_LSTR,dataccd) == 0 )
230 {printf("fichier dataccd illisible\n"); exit(-1);}
231nbccd = -1;
232sscanf(str,"%d",&nbccd);
233printf("on veut traiter %d ccd\n",nbccd);
234if( nbccd <= 0 ) exit(-1);
235
236/* initialisation USER */
237
238Calibration_Absolue = 0;
239Calibration_Absolue_UParms = 0;
240UINIT();
241
242/* initialisation montecarlo */
243
244AMPLML( 1 );
245
246/* gestion des interrupts */
247
248Nbsread_SigCatchInit();
249
250/*-------------------------------------------------------*/
251/*-------- Boucle sur les CCD (ou paves Plaques) --------*/
252/*-------------------------------------------------------*/
253
254while ( fgets(str,NBSREAD_LSTR,dataccd) != 0 ) { /* While... */
255
256strip(str,'B',' ');
257printf("%s\n",str);
258
259if ( strstr(str,"@END") == str ) break;
260
261if( 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
421UEND();
422AMPLML( 5 );
423if( StId1 != 0 ) free(StId1);
424if( StId2 != 0 ) free(StId2);
425fclose(dataccd);
426
427printf("Nombre total d'etoiles lues %d\n",netoiles);
428delete RandGen;
429
430return(0);
431}
432
433/*==========================================================================*/
434void INIT_NBSR(void)
435{
436int i;
437
438OpenType= SUOF_RO_MEM2;
439GRAND2_KILL = 5. * GRAND2;
440
441ietlim[0]= -IGRAND;
442ietlim[1]= IGRAND;
443idebug[0]=idebug[1]=idebug[2]=idebug[3]=0;
444NStId = NSelStId = FgSelSt = 0;
445StId1 = StId2 = 0;
446nkillms = 0; for(i=0;i<NKILLMSMX;i++) killms[i]=0;
447ffprt=0;
448
449starcut.Mag_B_cut = 0; starcut.Mag_B_min = starcut.Mag_B_max = 0.;
450starcut.Mag_V_cut = 0; starcut.Mag_V_min = starcut.Mag_V_max = 0.;
451starcut.Mag_R_cut = 0; starcut.Mag_R_min = starcut.Mag_R_max = 0.;
452starcut.Mag_I_cut = 0; starcut.Mag_I_min = starcut.Mag_I_max = 0.;
453starcut.Mag_BV_cut = 0; starcut.Mag_BV_min = starcut.Mag_BV_max = 0.;
454starcut.Mag_BR_cut = 0; starcut.Mag_BR_min = starcut.Mag_BR_max = 0.;
455starcut.Mag_VR_cut = 0; starcut.Mag_VR_min = starcut.Mag_VR_max = 0.;
456starcut.Mag_RI_cut = 0; starcut.Mag_RI_min = starcut.Mag_RI_max = 0.;
457starcut.Rstar_cut = 0; starcut.Rstar_min = starcut.Rstar_max = 0.;
458starcut.Rtype_cut = 0; starcut.Rtype_min = starcut.Rtype_max = 0;
459
460mc.montecar=0;
461mc.Taille_Finie=0;
462mc.Blending=0;
463mc.NGenStar=1;
464mc.Usu0_Cut = 0.001;
465mc.U0SimI=0.; mc.U0MinI=0.; mc.U0MaxI=0.;
466mc.TireU0 = 0;
467mc.T0SimI= -1.; mc.T0MinI=1.; mc.T0MaxI= -1.;
468mc.TauSimI=0.; mc.TauMinI=0.01; mc.TauMaxI=365.;
469mc.TireTau = 0;
470mc.USimI=0.; mc.UMinI=0.; mc.UMaxI=0.;
471mc.TireU = 0;
472mc.Get_Par_Blending = 0;
473mc.coeff_Arec1[0] = mc.coeff_Arec1[1] = 0.;
474mc.coeff_Arec2[0] = mc.coeff_Arec2[1] = 0.;
475mc.starcal1.Rstar = mc.starcal2.Rstar = 0.;
476mc.iseed1 = 36117;
477mc.iseed2 = 51106;
478mc.iseed3 = 21478;
479
480}
481
482/*==========================================================================*/
483void OPENSUIV(int ic)
484/* ic = couleur (0 a 1) */
485{
486int_4 i,j,rc;
487int_4 l, i1, i2;
488int lp;
489
490if(ffprt>0) printf("===> OPENSUIV couleur %3d\n",ic+1);
491
492if( nbfil[ic] <= 0 ) return;
493
494if(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
507for(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
560lp = ffprt-2;
561
562if(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 ? */
587if(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/*==========================================================================*/
600void READST(int ic)
601/* ic = couleur (0 a 1) */
602{
603int_4 i,rc;
604
605staru[ic].XRef=0;
606
607if(nmes[ic]>0)
608 for(i=0;i<nmes[ic];i++) mesu[ic][i].Flux=mesu[ic][i].Fond=0.;
609
610if(debug>0) printf("READST: coul %3d et %d\n",ic+1,iet[ic]);
611
612if( iet[ic]<=0 || iet[ic]>net[ic] ) return;
613
614/*lecture de star info sur premier fichier */
615if((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
621DECODE_STARINFO(&star,ic);
622
623if(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/*==========================================================================*/
631void READET(int ic)
632/* ic = couleur (0 a 1) */
633{
634int_4 i,j,rc;
635int_4 i1,i2;
636
637if( iet[ic]<=0 || iet[ic]>net[ic] ) return;
638if( nmes[ic]<=0 ) return;
639
640/* lecture des mesures: cf lecture expliquee pour timeinfo */
641for(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
657if(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/*==========================================================================*/
682void DATCLEAN(int ic)
683/* ic = couleur (0 a 1) */
684{
685int_4 i,j,k;
686double d1,d2;
687
688if(ffprt>0) printf("=====> DATCLEAN coul=%3d ccd %5d\n",ic+1,ccdnum);
689
690if(nmes[ic]<=0) return;
691
692/* on tue selon les criteres utilisateur */
693UDATCLEAN(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 */
697if( 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 */
714if( 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/*==========================================================================*/
735void DATSORT(int ic)
736/* ic = couleur (0 a 1) */
737{
738int_4 i,j;
739
740if(ffprt>0) printf("DATSORT: coul %3d ccd %5d\n",ic+1,ccdnum);
741
742nmesure[ic]=0;
743Tfirst[ic] = Tlast[ic] = -1.;
744
745if(nmes[ic]<=0) return;
746
747tri_double (date[ic],indexu[ic],nmes[ic]);
748
749for(i=0;i<nmes[ic];i++) if(date[ic][i]<GRAND2) nmesure[ic]++;
750
751if(nmesure[ic]>0) {
752 Tfirst[ic]=date[ic][indexu[ic][0]];
753 Tlast[ic]=date[ic][indexu[ic][nmesure[ic]-1]];
754}
755
756if(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/*==========================================================================*/
785int DECODESUIVINAME(char* str)
786/*
787Pour 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{
796char *str1,*vnam,*cenv;
797int ls=0,lce,rc=0,i,ip,jp;
798
799ls = strlen(str);
800/* Pas de $ ou chaine trop courte */
801if(posc(str,'$')<0 || ls<1) return rc;
802str1 = (char *) malloc((NBSREAD_LSTR+5)*sizeof(char));
803vnam = (char *) malloc(NBSREAD_LSTR*sizeof(char));
804
805i= ip = rc = 0;
806while( 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}
837str1[ip] = '\0';
838strcpy(str,str1);
839
840free(str1); free(vnam);
841return rc;
842}
843
844/*==========================================================================*/
845void DECODE_GLOBINFO(GLOBINFO *p)
846{
847globu = *p;
848}
849
850/*==========================================================================*/
851void DECODE_TIMEINFO(TIMEINFO *p, int ic, int imes)
852/* ic = couleur (0 a 1), imes = mesure (0 a nmes-1) */
853{
854DecodeTim( p , &timeu[ic][imes]);
855}
856
857/*==========================================================================*/
858void DECODE_STARINFO(STARINFO *p, int ic)
859/* ic = couleur (0 a 1) */
860{
861staru[ic] = *p;
862}
863
864/*==========================================================================*/
865void DECODE_MESURE(MESURE *p, int ic, int imes)
866/* ic = couleur (0 a 1), imes = mesure (0 a nmes-1) */
867{
868if(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/*==========================================================================*/
877void DO_MALLOC(void)
878{
879int n,ic;
880size_t ll,sof, sofM, sofT;
881
882if(ffprt>1)
883 printf("DO_MALLOC: nbmsMX=%d szMXBYTE=%d\n",nbmsMX,szMXBYTE);
884
885for(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/*==========================================================================*/
954void DO_FREE(void)
955{
956int ic;
957for(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/*==========================================================================*/
967int read_timeinfo(int ic,int imes,TIMEINFO *tim)
968/*
969Lecture de timeinfo pour la couleur ic (0->1), mesure imes (0->nmes[ic]-1)
970 return 0 si OK, <0 si problemes
971*/
972{
973int rc,ifil,ime;
974
975if ( imes<0 || imes>=nmes[ic] ) return(-1);
976ifil = meslun[ic][imes];
977if ( ifil<0 || ifil>=nbfil[ic] ) return(-2);
978ime = imes-nms1fil[ic][ifil];
979if ( ime<0 || ime>=nbms[ic][ifil] ) return(-3);
980
981rc=SuiviReadTimeInfo(lunfil[ic][ifil], ime+1, ime+1, (char *)(tim));
982if( 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/*
989printf("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);
991printf(" 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
995return(0);
996}
997
998/*==========================================================================*/
999void SELSTAR(void)
1000/* selection de l etoile courante ? */
1001{
1002int i;
1003FgSelSt = 0;
1004if( NSelStId <= 0 || NStId <= 0 || StId1 == 0 || StId2 == 0 ) return;
1005for(i=0;i<NSelStId;i++)
1006 if( StId1[i]<=iet[0] && iet[0]<=StId2[i] ) {FgSelSt = iet[0]; break;}
1007}
1008
1009/*==========================================================================*/
1010void GET_STAR_ID(void)
1011/*
1012Lecture du fichier dataccd pour identifier les cartes de selection des etoiles.
1013*/
1014{
1015char str[NBSREAD_LSTR];
1016int nallmin = 50, l;
1017
1018NStId = NSelStId = FgSelSt = 0;
1019if( StId1 != 0 ) { free(StId1); StId1 = 0;}
1020if( StId2 != 0 ) { free(StId2); StId2 = 0;}
1021
1022StId1 = (int *)malloc(nallmin*sizeof(int));
1023StId2 = (int *)malloc(nallmin*sizeof(int));
1024if( 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
1030rewind(dataccd);
1031while ( 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
1052if(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/*==========================================================================*/
1065void Nbsread_SigCatchInit(void)
1066{
1067int rc;
1068#ifdef OSF1
1069Nbsread_Action.sa_mask = 0;
1070Nbsread_Action.sa_flags = SA_RESTART;
1071#endif
1072#ifdef HPUX
1073memset( &(Nbsread_Action.sa_mask), 0, sizeof(sigset_t) );
1074Nbsread_Action.sa_flags = 0;
1075#endif
1076#ifdef Linux
1077memset( &(Nbsread_Action.sa_mask), 0, sizeof(sigset_t) );
1078Nbsread_Action.sa_flags = 0;
1079#endif
1080Nbsread_Action.sa_handler = Nbsread_SigCatch;
1081
1082if( (rc=sigaction(SIGINT, &Nbsread_Action, NULL)) != 0 )
1083 printf("Nbsread_SigCatchInit_Error: signal SIGINT=%d rc=%d\n",SIGINT,rc);
1084if( (rc=sigaction(SIGUSR1, &Nbsread_Action, NULL)) != 0 )
1085 printf("Nbsread_SigCatchInit_Error: signal SIGUSR1=%d rc=%d\n",SIGUSR1,rc);
1086if( (rc=sigaction(SIGUSR2, &Nbsread_Action, NULL)) != 0 )
1087 printf("Nbsread_SigCatchInit_Error: signal SIGUSR2=%d rc=%d\n",SIGUSR2,rc);
1088}
1089
1090/*==========================================================================*/
1091void Nbsread_SigCatch(int s)
1092{
1093switch(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}
1107printf("UENDCCD is called\n");
1108UENDCCD();
1109printf("UEND is called\n");
1110UEND();
1111printf("exit is called\n");
1112exit(-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*/
Note: See TracBrowser for help on using the repository browser.