JINJA: Plantilla automática de procesamiento para cada conjunto de datos.
- desde IA-UNAM Ensenada.
Se hace un procesamiento independiente para cada set de imagenes, ya sea dividido por filtro, noche o temporada de forma que cada imagen del conjunto pueda ser efectivamente alineada con el resto. De lo contrario, si intentamos alinear imagenes de distintas temporadas sin el cuidado de observar exactamente la misma porción de cielo podemos obtener monstruos como este:
Para cada uno de estos sets, corresponde una serie de modificaciones muy sutiles de los parametros de ISIS y del procesamiento anterior o posterior. En mi caso, a cada set le doy su propia entrada de bitácora que al igual que los parametros, cambia muy poco, aunque no suficiente para hacer menos agobiante y repetitiva la tarea cuando se trabaja con varios sets.
El formato de cada una de estas entradas corresponde simplemente a la serie de instrucciones que copio y pego en IRAF, ISIS o la terminal común, además de los parámetros que también copio y pego en los archivos de ISIS.
Fue al encontrarme con 10 sets de datos que recordé una herramienta que, entre otras cosas, permite realizar reportes parcialmente automatizados cuando lo que cambia entre cada uno son unicamente valores numericos o variables muy puntuales. Me supongo, por ejemplo, que es lo que se usa en industria y gobierno para la realizacion de reportes trimestrales.
Otro beneficio que viene al hacer las cosas de esta forma es que me libré de la incertidumbre de haber dejado uno de los valores sin cambiar.
Para que sirva como ejemplo tanto de flujo de trabajo como para la implementación de jinja, adjunto mi plantilla, guardada como template.j2
:
🏗️ Script para renderizar la plantilla en Markdown
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
from jinja2 import Template
import os
# Leer la plantilla
with open('template.j2', 'r') as f:
template_content = f.read()
template = Template(template_content)
# Variables para cada conjunto de datos
variables = {
'prev_register_dir': 'register202506A_I',
'register_dir': 'register202506B_I',
'images_dir': 'images202506B_I',
'outputs_dir': 'NGC6426_2506B_I'
}
# Renderizar la plantilla
output = template.render(**variables)
# Guardar el resultado
output_filename = f"{variables['outputs_dir']}.md"
with open(output_filename, 'w') as f:
f.write(output)
print(f"Archivo generado: {output_filename}")
🎨🖌️ Mi plantilla (ejemplo)
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# Para `{{ register_dir }}`
`{{ images_dir }}`
- [ ] dates
- [ ] FWHM list
- [ ] ref_list
- [ ] config params
- [ ] input list
- [ ] exportamos lcs
### directorios
```bash
# desde package
mkdir {{ register_dir }}
cp {{ prev_register_dir }}/* {{ register_dir }}/
```
### Dates
```bash
cd {{ images_dir }}
# extraer **HJD** de los headers
hselect 202*o.fit $I,**HJD** yes > ../{{ register_dir }}/dates
!xed ../{{ register_dir }}/dates
```
### FWHM list
```bash
hselect 202*o.fit $I,FWHM,SIGMA,E_AMASS,SKY yes > fwhm_sigma_amass_sky
!xed fwhm_sigma_amass_sky
# ordenar #ta columna (-k<#>) numericamente (-n)
!sort -k2 -n fwhm_sigma_amass_sky > FSAS_sortby_fwhm
!xed FSAS_sortby_fwhm
```
### ref_list:
```bash
imexam *.fit
```
```bash
# top 10 FSAS_sortby_fwhm
```
**verificamos integridad del top**
```python
!awk 'NR<=15 {print "display", $1, NR}' FSAS_sortby_fwhm
```
### parámetros:
(`{{ register_dir }}`)
(`{{ images_dir }}`)
```bash
xed process_config default_config phot_config ref_list &
```
=====
```bash
IM_DIR ../{{ images_dir }} Directory where the images are
MRJ_DIR .. Installation directory
REFERENCE REFERENCE.FIT Reference image for astrometry
REF_SUB ref.fits Reference image for subtraction
INFILE ../{{ register_dir }}/dates Dates of the frames
VARIABLES phot.data coordinates of objects for which we want to make light curves
DEGREE 1 The degree of the polynomial astrometric transform between frames
CONFIG_DIR ../{{ register_dir }} Where to find the configuration files
SIG_THRESH 10.0
COSMIC_THRESH 1000.0
REF_STACK REFERENCE.FIT
N_REJECT 2
MESH_SMOOTH 1
```
```bash
sub_x 1
sub_y 1
rad1_bg 15.0
rad2_bg 20.0
nstars 5
mesh 2
saturation 64000.0
min 5.0
psf_width 23
radphot 6.0
nstar_max 8
rad_aper 7.0
nb_adu_el 1
rmax 0.5
first 1
keep 5
```
```bash
nstamps_x 10 /*** Number of stamps along X axis ***/
nstamps_y 10 /*** Number of stamps along Y axis***/
sub_x 1 /*** Number of sub_division of the image along X axis ***/
sub_y 1 /*** Number of sub_division of the image along Y axis ***/
half_mesh_size 9 /*** Half kernel size ***/
half_stamp_size 15 /*** Half stamp size ***/
deg_bg 3 /** degree to fit differential bakground variations **/
saturation 64000.0 /** degree to fit background varaitions **/
pix_min 5.0 /*** Minimum vaue of the pixels to fit *****/
min_stamp_center 130 /*** Minimum value for object to enter kernel fit *****/
ngauss 3 /*** Number of Gaussians ****/
deg_gauss1 6 /*** Degree associated with 1st Gaussian ****/
deg_gauss2 4 /*** Degree associated with 2nd Gaussian ****/
deg_gauss3 3 /*** Degree associated with 3rd Gaussian ****/
sigma_gauss1 0.7 /*** Sigma of 1st Gaussian ****/
sigma_gauss2 2.0 /*** Sigma of 2nd Gaussian ****/
sigma_gauss3 4.0 /*** Sigma of 3rd Gaussian ****/
deg_spatial 2 /*** Degree of the fit of the spatial variations of the Kernel ****/
```
```bash
LISTA DE REFERENCES
```
.
=====
### Corremos hasta antes del phot
```bash
./process2.csh
```
### Generamos nuestro catalogo de coordenadas
- Usamos como referencia el REFERENCE`.fits`
```bash
mkdir ../isis_tools/{{ outputs_dir }}
cp interp_REFERENCE.FIT ../isis_tools/{{ outputs_dir }}/
```
- Lo metemos al https://nova.astrometry.net/
- corremos el `phot_input.py` con el REFERENCE`.fits`
- output = `202..._I`
- reemplazamos la lista en `phot.data`
```bash
xed phot.data
```
### Corremos el `./phot.csh`
…
### Corremos después del phot
…
### lista de `lc*.data`
```bash
# desde {{ images_dir }}
!ls lc*.data* | sort -u > LCS_LIST
```
### Copiar lista de archivo:
```bash
xargs -a LCS_LIST -I {} cp ../../../imagesDIR/{} directorio_destino/
# desde imagesXXXX
!mkdir ../isis_tools/{{ outputs_dir }}/lcs
!xargs -a LCS_LIST -I {} cp ../{{ images_dir }}/{} ../isis_tools/{{ outputs_dir }}/lcs
```
---