_util.py 4.35 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

def parse_args():
    '''
    Parse command line arguments. Many of the following
    can be set in the .yaml config file as well.
    '''
    parser = argparse.ArgumentParser()
Fang Yuedong's avatar
Fang Yuedong committed
15
    parser.add_argument('--config_file', type=str, required=True, help='.yaml config file for simulation settings.')
16
    parser.add_argument('--catalog', type=str, help='name of the catalog interface class to be loaded.')
Fang Yuedong's avatar
Fang Yuedong committed
17
18
19
    parser.add_argument('-c', '--config_dir', type=str, help='Directory that houses the .yaml config file.')
    parser.add_argument('-d', '--data_dir', type=str, help='Directory that houses the input data.')
    parser.add_argument('-w', '--work_dir', type=str, help='The path for output.')
Fang Yuedong's avatar
Fang Yuedong committed
20
    return parser.parse_args()
Fang Yuedong's avatar
Fang Yuedong committed
21

22
23
24
25
26
27
28
29
30
31
32
33
34
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)
    ipoint = 0

    run_pointings = config['obs_setting']['run_pointings']
35
36
37
38
    if "obs_config_file" in config['obs_setting']:
        obs_config_file = config['obs_setting']["obs_config_file"]
    else:
        obs_config_file = None
39
    
40
41
42
43
44
45
    # if pointing_filename and data_dir:
    if pointing_filename:
        if data_dir:
            pointing_file = os.path.join(data_dir, pointing_filename)
        else:
            pointing_file = pointing_filename
46
        f = open(pointing_file, 'r')
47
48
        # for _ in range(1):
        #     header = f.readline()
49
50
        iline = 0
        for line in f:
51
52
            if len(line.strip()) == 0 or line[0]=='#':
                continue
53
54
            if run_pointings and iline not in run_pointings:
                iline += 1
Fang Yuedong's avatar
Fang Yuedong committed
55
                ipoint += 1
56
                continue
57
58
            line = line.strip()
            columns = line.split()
59
            pointing = Pointing(obs_config_file=obs_config_file)
60
            pointing.read_pointing_columns(columns=columns, id=ipoint)
61
62
63
64
            t += delta_t * 60.
            pointing_list.append(pointing)
            iline += 1
            ipoint += 1
65
66
        f.close()
    else:
67
68
69
70
        if config["obs_setting"]["exp_time"]:
            exp_time = config["obs_setting"]["exp_time"]
        else:
            exp_time = 150.
71
72
73
74
75
76
        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
77
            exp_time=exp_time,
78
79
            pointing_type='SCI',
            obs_config_file=obs_config_file
80
81
82
83
84
            )
        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
    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
98
    return imgDir
99

100
def make_output_pointing_dir(path_dict, config, pointing_ID=0):
Fang Yuedong's avatar
Fang Yuedong committed
101
102
103
104
105
106
    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
107
    prefix = "MSC_" + str(pointing_ID).rjust(8, '0')
Fang Yuedong's avatar
Fang Yuedong committed
108
109
110
111
112
113
114
    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
115

116
117
def get_shear_field(config):
    if not config["shear_setting"]["shear_type"] in ["constant", "catalog"]:
Fang Yuedong's avatar
Fang Yuedong committed
118
        raise ValueError("Please set a right 'shear_method' parameter.")
Fang Yuedong's avatar
Fang Yuedong committed
119

Fang Yuedong's avatar
Fang Yuedong committed
120
121
122
123
124
    if config["shear_setting"]["shear_type"] == "constant":
        g1 = config["shear_setting"]["reduced_g1"]
        g2 = config["shear_setting"]["reduced_g2"]
        nshear = 1
        # TODO logging
Fang Yuedong's avatar
Fang Yuedong committed
125
126
127
    else:
        g1, g2 = 0., 0.
        nshear = 0
Fang Yuedong's avatar
Fang Yuedong committed
128
    return g1, g2, nshear