_util.py 5.64 KB
Newer Older
Fang Yuedong's avatar
Fang Yuedong committed
1
2
3
import numpy as np
import os
from datetime import datetime
Fang Yuedong's avatar
Fang Yuedong committed
4
import argparse
5
6
7
from astropy.time import Time

from ObservationSim.Config import Pointing
Fang Yuedong's avatar
Fang Yuedong committed
8
9
10
11
12
13
14
15

def parse_args():
    '''
    Parse command line arguments. Many of the following
    can be set in the .yaml config file as well.
    '''
    parser = argparse.ArgumentParser()
    parser.add_argument('config_file', help='.yaml config file for simulation settings.')
Fang Yuedong's avatar
Fang Yuedong committed
16
    parser.add_argument('-c', '--config_dir', help='Directory that houses the .yaml config file.')
Fang Yuedong's avatar
Fang Yuedong committed
17
18
19
    parser.add_argument('-d', '--data_dir', help='Directory that houses the input data.')
    parser.add_argument('-w', '--work_dir', help='The path for output.')
    return parser.parse_args()
Fang Yuedong's avatar
Fang Yuedong committed
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
def generate_pointing_list(config, pointing_filename=None, data_dir=None):
    pointing_list = []

    # Only valid when the pointing list does not contain time stamp column
    t0 = datetime(2021, 5, 25, 12, 0, 0)
    delta_t = 10. # Time elapsed between exposures (minutes)

    # Calculate starting time(s) for CAL exposures
    # NOTE: temporary implementation
    t = datetime.timestamp(t0)
    ncal = config['obs_setting']['np_cal']
    ipoint = 0
    for i in range(ncal):
        pointing = Pointing(
            id = ipoint,
            ra=config["obs_setting"]["ra_center"],
            dec=config["obs_setting"]["dec_center"],
            img_pa=config["obs_setting"]["image_rot"],
            timestamp=t,
            pointing_type='CAL')
        t += 3 * delta_t * 60. # 3 calibration exposures for each pointing
        pointing_list.append(pointing)
        ipoint += 1

    run_pointings = config['obs_setting']['run_pointings']
Fang Yuedong's avatar
Fang Yuedong committed
46
47
48
49
    if config["obs_setting"]["exp_time"]:
        exp_time = config["obs_setting"]["exp_time"]
    else:
        exp_time = 150.
50
    
51
52
53
54
55
56
57
    if pointing_filename and data_dir:
        pointing_file = os.path.join(data_dir, pointing_filename)
        f = open(pointing_file, 'r')
        for _ in range(1):
            header = f.readline()
        iline = 0
        for line in f:
58
59
            if run_pointings and iline not in run_pointings:
                iline += 1
Fang Yuedong's avatar
Fang Yuedong committed
60
                ipoint += 1
61
                continue
62
63
            line = line.strip()
            columns = line.split()
Fang Yuedong's avatar
Fang Yuedong committed
64
            pointing = Pointing(exp_time=exp_time)
65
66
67
68
69
            pointing.read_pointing_columns(columns=columns, id=ipoint, t=t)
            t += delta_t * 60.
            pointing_list.append(pointing)
            iline += 1
            ipoint += 1
70
71
        f.close()
    else:
72
73
74
75
76
77
        pointing = Pointing(
            id=ipoint,
            ra=config["obs_setting"]["ra_center"],
            dec=config["obs_setting"]["dec_center"],
            img_pa=config["obs_setting"]["image_rot"],
            timestamp=t,
Fang Yuedong's avatar
Fang Yuedong committed
78
            exp_time=exp_time,
79
80
81
82
83
84
            pointing_type='MS'
            )
        t += delta_t * 60.
        pointing_list.append(pointing)
        ipoint += 1
    return pointing_list
85

86
def make_run_dirs(work_dir, run_name, pointing_list):
87
88
89
90
91
92
93
94
95
96
97
98
    if not os.path.exists(work_dir):
        try:
            os.makedirs(work_dir, exist_ok=True)
        except OSError:
            pass
    imgDir = os.path.join(work_dir, run_name)
    if not os.path.exists(imgDir):
        try:
            os.makedirs(imgDir, exist_ok=True)
        except OSError:
            pass
    prefix = "MSC_"
99
100
    for pointing in pointing_list:
        fname=prefix + str(pointing.id).rjust(7, '0')
101
102
103
104
105
106
        subImgDir = os.path.join(imgDir, fname)
        if not os.path.exists(subImgDir):
            try:
                os.makedirs(subImgDir, exist_ok=True)
            except OSError:
                pass
107
    return imgDir
108

Fang Yuedong's avatar
Fang Yuedong committed
109
def imgName(tt=0):
Fang Yuedong's avatar
Fang Yuedong committed
110
111
112
113
114
115
116
117
    ut = datetime.utcnow()
    eye, emo, eda, eho, emi, ese = str(ut.year), str(ut.month), str(ut.day), str(ut.hour), str(ut.minute), str(ut.second)
    emse = str(ut.microsecond)
    if int(emo)<10: emo = "0%s"%emo
    if int(eda)<10: eda = "0%s"%eda
    if int(eho)<10: eho = "0%s"%eho
    if int(emi)<10: emi = "0%s"%emi
    if int(ese)<10: ese = "0%s"%ese
Fang Yuedong's avatar
Fang Yuedong committed
118

Fang Yuedong's avatar
Fang Yuedong committed
119
120
121
122
123
124
125
126
    if tt==0:
        namekey = "CSST%s%s%sT%s%s%s"%(eye,emo,eda,eho,emi,ese)
    elif tt==1:
        namekey = "%s-%s-%sT%s:%s:%s.%s"%(eye,emo,eda,eho,emi,ese,emse)
    elif tt==2:
        namekey = "%s%s%s%s%s%s"%(eye,emo,eda,eho,emi,ese)
    else:
        raise ValueError("!!! Give a right 'tt' value.")
Fang Yuedong's avatar
Fang Yuedong committed
127

Fang Yuedong's avatar
Fang Yuedong committed
128
    return namekey
Fang Yuedong's avatar
Fang Yuedong committed
129
130

def makeSubDir_PointingList(path_dict, config, pointing_ID=0):
Fang Yuedong's avatar
Fang Yuedong committed
131
132
133
134
135
136
137
138
139
140
141
142
143
144
    imgDir = os.path.join(path_dict["work_dir"], config["run_name"])
    if not os.path.exists(imgDir):
        try:
            os.makedirs(imgDir, exist_ok=True)
        except OSError:
            pass
    prefix = "MSC_" + str(pointing_ID).rjust(7, '0')
    subImgdir = os.path.join(imgDir, prefix)
    if not os.path.exists(subImgdir):
        try:
            os.makedirs(subImgdir, exist_ok=True)
        except OSError:
            pass
    return subImgdir, prefix
Fang Yuedong's avatar
Fang Yuedong committed
145

146
def get_shear_field(config, shear_cat_file=None):
Fang Yuedong's avatar
Fang Yuedong committed
147
148
    if not config["shear_setting"]["shear_type"] in ["constant", "extra"]:
        raise ValueError("Please set a right 'shear_method' parameter.")
Fang Yuedong's avatar
Fang Yuedong committed
149

Fang Yuedong's avatar
Fang Yuedong committed
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
    if config["shear_setting"]["shear_type"] == "constant":
        g1 = config["shear_setting"]["reduced_g1"]
        g2 = config["shear_setting"]["reduced_g2"]
        nshear = 1
        # TODO logging
    else:
        # TODO logging
        if not os.path.exists(shear_cat_file):
            raise ValueError("Cannot find shear catalog file.")
        try:
            shearCat = np.loadtxt(shear_cat_file)
            nshear = shearCat.shape[0]
            g1, g2 = shearCat[:, 0], shearCat[:, 1]
        except:
            print("Failed to the shear catalog file.")
            print("Setting to no shear.")
            g1, g2 = 0., 0.
    return g1, g2, nshear