1
C===========================================================================
2
C Copyright (C) 1995,2004 European Southern Observatory (ESO)
4
C This program is free software; you can redistribute it and/or
5
C modify it under the terms of the GNU General Public License as
6
C published by the Free Software Foundation; either version 2 of
7
C the License, or (at your option) any later version.
9
C This program is distributed in the hope that it will be useful,
10
C but WITHOUT ANY WARRANTY; without even the implied warranty of
11
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
C GNU General Public License for more details.
14
C You should have received a copy of the GNU General Public
15
C License along with this program; if not, write to the Free
16
C Software Foundation, Inc., 675 Massachusetts Ave, Cambridge,
19
C Correspondence concerning ESO-MIDAS should be addressed as follows:
20
C Internet e-mail: midas@eso.org
21
C Postal address: European Southern Observatory
22
C Data Management Division
23
C Karl-Schwarzschild-Strasse 2
24
C D 85748 Garching bei Muenchen
26
C===========================================================================
28
SUBROUTINE ADDSTR (PAR, MAXPAR, PSF, MAXPSF, MAXEXP,
29
. F, NCOL, NROW, WATCH)
31
C=======================================================================
33
C This subroutine generates random x,y coordinates and magnitudes,
34
C appropriately scales the point-spread function, and adds these
35
C artificial stars into a copy of the original picture at the
36
C appropriate locations. As an alternative, it will read positions
37
C and magnitudes in from a disk file, and add synthetic stars with
38
C simulated photon noise.
40
C OFFICIAL DAO VERSION: 1991 April 18
45
C=======================================================================
48
INTEGER MAXPSF, MAXPAR, MAXEXP, NCOL, NROW
52
C MAXPSF is the largest permissible number of elements in the look-up
53
C table for the point-spread function.
55
REAL F(NCOL,NROW), PSF(MAXPSF,MAXPSF,MAXEXP)
56
REAL PAR(MAXPAR), RMAG(2)
59
REAL SQRT, AMAX1, DAORAN, USEPSF
60
INTEGER RDPSF, MIN0, MAX0, NINT
63
CHARACTER*30 ADDPIC, OUTSTM, ADDFIL, EXTEND
64
CHARACTER*30 COOFIL, MAGFIL, PSFFIL, PROFIL, GRPFIL, SWITCH
65
CHARACTER CASE*5, NTOCHR*2
66
DOUBLE PRECISION SUMPHOT, SUMERR
67
REAL LOBAD, NRML, STRMAG, X, Y, DIFMAX, DIFSQ, DX, DY, DYSQ
68
REAL DIFF, SCALE, DELTAX, DELTAY, DVDXC, DVDYC, ERR
69
REAL HIBAD, THRESH, AP1, DUMMY, READNS, FRAD, XWIDE, YWIDE
70
REAL PSFRSQ, WATCH, PSFMAG, BRIGHT, XPSF, YPSF, PSFRAD, PHPADU
72
INTEGER I, J, ID, ISTAR, IDUM, IFRAME, LX, LY, NX, NY, ISTAT
73
INTEGER IPSTYP, NPSF, NPAR, NEXP, NFRAC, NSTAR
77
COMMON /FILNAM/ COOFIL, MAGFIL, PSFFIL, PROFIL, GRPFIL
79
C-----------------------------------------------------------------------
81
CALL TBLANK ! Type a blank line
82
950 CALL GETNAM ('File with the PSF:', PSFFIL)
83
IF ((PSFFIL .EQ. 'END OF FILE') .OR.
84
. (PSFFIL .EQ. 'GIVE UP')) THEN
88
PSFFIL=EXTEND(PSFFIL, CASE('psf'))
92
ISTAT = RDPSF(PSFFIL, IPSTYP, PAR, MAXPAR, NPAR,
93
. PSF, MAXPSF, MAXEXP, NPSF, NEXP, NFRAC,
94
. PSFMAG, BRIGHT, XPSF, YPSF)
95
IF (ISTAT .NE. 0) THEN
100
PSFRAD = (REAL(NPSF-1)/2. - 1.)/2.
103
CALL GETDAT ('Photons per ADU:', PHPADU,1)
104
IF (PHPADU .LE. 0) RETURN
105
ADDFIL='RANDOM STARS'
106
1015 CALL GETNAM ('Input data file:', ADDFIL)
107
IF ((ADDFIL .EQ. 'END OF FILE') .OR. (ADDFIL .EQ. 'EXIT') .OR.
108
. (ADDFIL .EQ. 'GIVE UP')) THEN
110
ELSE IF (ADDFIL .EQ. 'RANDOM STARS') THEN
113
610 FORMAT (/' Magnitude of PSF star is', F7.3/)
114
CALL GETDAT ('Minimum, maximum magnitudes desired:', RMAG, 2)
115
IF (RMAG(1) .LT. -1.E38) RETURN ! CTRL-Z was entered
117
CALL GETDAT ('Number of stars to add to each frame:',
119
IF (DATUM .LT. -1.E38) RETURN ! CTRL-Z was entered
120
NSTAR=MAX0(1, NINT(DATUM))
122
CALL GETDAT ('Number of new frames:', DATUM, 1)
123
IF (DATUM .LT. -1.E38) RETURN ! CTRL-Z was entered
124
NFRAME=MAX0(1, MIN0(NINT(DATUM), 99))
126
CALL GETNAM ('File-name stem:', OUTSTM)
127
IF (OUTSTM .EQ. 'END OF FILE') RETURN ! CTRL-Z was entered
128
OUTSTM=EXTEND(OUTSTM, CASE('add'))
131
ADDFIL = EXTEND(ADDFIL, CASE('add'))
132
CALL INFILE (2, ADDFIL, ISTAT)
133
IF (ISTAT .NE. 0) THEN
134
CALL STUPID ('Error opening input file '//ADDFIL)
138
ADDPIC=SWITCH(ADDFIL, ' ')
139
CALL GETNAM ('Output picture name:', ADDPIC)
141
CALL RDHEAD (2, NL, IDUM, IDUM, LOBAD, HIBAD, THRESH, AP1,
142
. DUMMY, READNS, FRAD)
146
C-----------------------------------------------------------------------
153
IF (WATCH .GT. 0.5) THEN
156
. ' Star Picture Data file', 1)
159
C Beginning of loop over output frames.
161
DO 2900 IFRAME=1,NFRAME
163
C Build up output stellar-data filename, and open file.
165
ADDFIL=NTOCHR(IFRAME)//CASE('.add')
166
ADDFIL=SWITCH(OUTSTM,ADDFIL)
167
952 CALL OUTFIL (3, ADDFIL, ISTAT)
168
IF (ISTAT .NE. 0) THEN
169
CALL STUPID ('Error opening output file '//ADDFIL)
171
CALL GETNAM ('New output file name:', ADDFIL)
172
IF ((ADDFIL .EQ. 'END OF FILE') .OR.
173
. (ADDFIL .EQ. 'GIVE UP')) RETURN
174
ADDFIL = EXTEND(ADDFIL, CASE('add'))
177
CALL WRHEAD (3, 1, NCOL, NROW, 7, 0., 0., 0., 0., 0., 0., 0.)
179
C Create output picture filename.
181
ADDPIC=SWITCH(ADDFIL, ' ')
183
C Copy the input picture verbatim into the output picture.
185
CALL COPPIC (ADDPIC, F, NCOL, NROW, ISTAT)
186
IF (ISTAT .NE. 0) THEN
187
CALL STUPID ('Error creating output picture.')
194
CALL RDARAY ('COPY', LX, LY, NX, NY, NCOL, F, ISTAT)
196
C Beginning of loop over artificial stars.
198
XWIDE = REAL(NCOL)-1.
199
YWIDE = REAL(NROW)-1.
200
DO 2500 ISTAR=1,NSTAR
202
C Make up centroid and magnitude.
204
X=1.+XWIDE*DAORAN(ISEED(1))
205
Y=1.+YWIDE*DAORAN(ISEED(2))
206
STRMAG=RMAG(1)+DAORAN(ISEED(3))*(RMAG(2)-RMAG(1))
208
C Write them to the data file.
210
WRITE (3,320) ISTAR+8999, X, Y, STRMAG
211
320 FORMAT (1X, I5, 14F9.3)
212
IF (WATCH .GT. 0.5) THEN
213
WRITE (LINE,622) ISTAR, ADDPIC, ADDFIL
214
622 FORMAT (I6, 7X, A30, 2X, A30)
215
CALL OVRWRT (LINE(1:75), 2)
217
DELTAX=(X-1.)/XPSF - 1.
218
DELTAY=(Y-1.)/YPSF - 1.
219
LX = MAX0( 1, INT(X-PSFRAD)+1 )
220
LY = MAX0( 1, INT(Y-PSFRAD)+1 )
221
NX = MIN0( NCOL, INT(X+PSFRAD) )
222
NY = MIN0( NROW, INT(Y+PSFRAD) )
223
SCALE=10.**(0.4*(PSFMAG-STRMAG))
227
C Beginning of double loop over pixels in the subarray.
237
IF (DX**2+DYSQ .GE. PSFRSQ) THEN
238
IF (DX .GT. 0.) GO TO 2210
240
DIFF=SCALE*USEPSF(IPSTYP, DX, DY, BRIGHT, PAR, PSF,
241
. NPSF, NPAR, NEXP, NFRAC, DELTAX, DELTAY, DVDXC,
244
C DIFF represents the value of the stellar profile at this pixel.
245
C Compute a Poisson random error using a normal approximation,
246
C sigma(DIFF)=sqrt(DIFF/PHPADU).
248
ERR=SQRT(AMAX1(0.,DIFF/PHPADU))*
249
. NRML(DAORAN(ISEED(MOD(I+J,3)+1)))
250
SUMPHOT = SUMPHOT + DBLE(DIFF)
251
SUMERR = SUMERR + DBLE(ERR)
252
F(I,J)=F(I,J)+DIFF+ERR
256
2500 CONTINUE ! End of loop over stars
261
CALL WRARAY ('COPY', LX, LY, NX, NY, NCOL, F, ISTAT)
262
CALL CLPIC ('COPY') ! Close copy
266
2900 CONTINUE ! End of loop over frames
268
CALL COPPIC (ADDPIC, F, NCOL, NROW, ISTAT)
269
IF (ISTAT .NE. 0) THEN
270
CALL STUPID ('Error creating output picture.')
273
IF (WATCH .GT. 0.5) THEN
275
CALL OVRWRT (' Star', 1)
281
CALL RDARAY ('COPY', LX, LY, NX, NY, NCOL, F, ISTAT)
287
3010 CALL RDSTAR (2, NL, ID, X, Y, STRMAG, SKY)
288
IF (ID .LT. 0) GO TO 3900 ! End-of-file encountered
289
IF (ID .EQ. 0) GO TO 3010 ! Ignore a blank line
290
IF (STRMAG .GE. 99.) GO TO 3000 ! Ignore a bad star
291
IF (WATCH .GT. 0.5) THEN
292
WRITE (LINE,622) ISTAR
293
CALL OVRWRT (LINE(1:6), 2)
295
DELTAX=(X-1.)/XPSF-1.
296
DELTAY=(Y-1.)/YPSF-1.
297
SCALE=10.**(0.4*(PSFMAG-STRMAG))
299
C Add the shifted scaled PSF
301
LX = MAX0(1, INT(X-PSFRAD)+1 )
302
LY = MAX0(1, INT(Y-PSFRAD)+1 )
303
NX = MIN0(NCOL, INT(X+PSFRAD) )
304
NY = MIN0(NROW, INT(Y+PSFRAD) )
312
IF (DX**2+DYSQ .GE. PSFRSQ) THEN
313
IF (DX .GT. 0.) GO TO 3030
315
DIFF=SCALE*USEPSF(IPSTYP, DX, DY, BRIGHT, PAR, PSF,
316
. NPSF, NPAR, NEXP, NFRAC, DELTAX, DELTAY, DVDXC,
319
C DIFF represents the value of the stellar profile at this pixel.
320
C Compute a Poisson random error using a normal approximation,
321
C sigma(DIFF)=sqrt(DIFF/PHPADU).
323
ERR=DAORAN(ISEED(MOD(I+J,3)+1))
324
ERR=SQRT(AMAX1(0.,DIFF/PHPADU))*NRML(ERR)
325
SUMPHOT = SUMPHOT + DBLE(DIFF)
326
SUMERR = SUMERR + DBLE(ERR)
327
F(I,J)=F(I,J)+DIFF+ERR
331
GO TO 3000 ! Go to next star
337
CALL WRARAY ('COPY', LX, LY, NX, NY, NCOL, F, ISTAT)
349
C#######################################################################
351
CHARACTER*2 FUNCTION NTOCHR (N)
353
C Converts an integer in the range 1-99 to two characters representing
358
IF ((N .GT. 0) .AND. (N .LT. 100)) GO TO 1010
363
NTOCHR=CHAR(48+ITENS)//CHAR(48+N-10*ITENS)
368
C###################################################################
370
SUBROUTINE SEED3 (ISEED)
372
C Seed the random number generator, based on a floating-point number
373
C entered by the user.
384
CALL GETDAT ('Seed (any integer):', SEED, 1)
386
ISEED(1) = INT(524288.*DAORAN(I)) + 1
387
ISEED(2) = INT(524288.*DAORAN(I)) + 1
388
ISEED(3) = INT(524288.*DAORAN(I)) + 1
393
C######################################################################
395
REAL FUNCTION NRML (RANNUM)
397
C Convert a uniform probability distribution to a Gaussian distribution
398
C with mean zero and standard deviation unity.
404
REAL P, RANNUM, SIGN, T
410
ELSE IF (P .LE. 0.) THEN
415
NRML=SIGN*(T- (2.30753+.27061*T) / (1.+T*(.99229+T*.04481)) )
419
C#######################################################################
421
REAL FUNCTION DAORAN (IDUM)
424
C RAN2 from Numerical Recipes
446
IF ((IDUM .LT. 0) .OR. (IFF .EQ. 0)) THEN
448
IDUM = MOD(IABS(IC-IDUM), M)
450
IDUM = MOD(IA*IDUM+IC,M)
453
IDUM = MOD(IA*IDUM+IC,M)
458
IF ((J .GT. 97) .OR. (J .LT. 1))
459
+ CALL STETER(33,'Problems in random number generator DAORAN')
461
CC was: IF ((J .GT. 97) .OR. (J .LT. 1)) PAUSE
465
IDUM = MOD(IA*IDUM+IC,M)
467
IF (DAORAN .LE. 0.) GO TO 1000 ! Stetson's modification