Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
weight.c
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*
* Part of: SExtractor
*
* Author: E.BERTIN (IAP)
*
* Contents: Handling of weight maps.
*
* Last modify: 28/11/2003
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "define.h"
#include "globals.h"
#include "field.h"
#include "weight.h"
/******************************* newweight **********************************/
/*
Load a weight map and initialize relevant parameters.
*/
picstruct *newweight(char *filename, picstruct *reffield,
weightenum wtype, int nok)
{
picstruct *wfield;
switch(wtype)
{
case WEIGHT_FROMINTERP:
wfield = inheritfield(reffield, INTERP_FIELD);
break;
case WEIGHT_FROMBACK:
wfield = inheritfield(reffield, BACKRMS_FIELD);
break;
case WEIGHT_FROMRMSMAP:
wfield = newfield(filename, RMS_FIELD, nok);
if ((wfield->width!=reffield->width)||(wfield->height!=reffield->height))
error(EXIT_FAILURE,
"*Error*: measured frame and weight map have different sizes","");
wfield->sigfac = 1.0;
break;
case WEIGHT_FROMVARMAP:
wfield = newfield(filename, VAR_FIELD, nok);
if ((wfield->width!=reffield->width)||(wfield->height!=reffield->height))
error(EXIT_FAILURE,
"*Error*: measured frame and weight map have different sizes","");
break;
case WEIGHT_FROMWEIGHTMAP:
wfield = newfield(filename, WEIGHT_FIELD, nok);
if ((wfield->width!=reffield->width)||(wfield->height!=reffield->height))
error(EXIT_FAILURE,
"*Error*: measured frame and weight map have different sizes","");
break;
default:
wfield = NULL; /* To avoid gcc -Wall warnings */
error(EXIT_FAILURE,
"*Internal Error*: Unknown weight-map type in ", "makeit()");
break;
}
/* Default normalization factor (will be changed if necessary later) */
wfield->sigfac = 1.0;
return wfield;
}
/******************************* weight_to_var *******************************/
/*
Transform an array of possibily unnormalized weights into a calibrated
variance map.
*/
void weight_to_var(picstruct *wfield, PIXTYPE *data, int npix)
{
float sigfac2;
int i;
switch(wfield->flags&(BACKRMS_FIELD|RMS_FIELD|VAR_FIELD|WEIGHT_FIELD))
{
case BACKRMS_FIELD:
case RMS_FIELD:
for (i=npix; i--; data++)
if (*data<BIG)
*data *= *data;
break;
case VAR_FIELD:
sigfac2 = wfield->sigfac*wfield->sigfac;
for (i=npix; i--;)
*(data++) *= sigfac2;
break;
case WEIGHT_FIELD:
sigfac2 = wfield->sigfac*wfield->sigfac;
for (i=npix; i--; data++)
if (*data > 0.0)
*data = sigfac2/(*data);
else
*data = BIG;
break;
default:
error(EXIT_FAILURE,
"*Internal Error*: Unknown weight-map type in ", "weight_to_var()");
break;
}
return;
}