From 6ac77ebcde9f5f2d8843dd2b61f84682b37087f2 Mon Sep 17 00:00:00 2001 From: Bryan Hilbert Date: Wed, 20 Dec 2023 12:38:23 -0500 Subject: [PATCH] Turn db additions back on. Limit apertures that it runs on --- .../common_monitors/dark_monitor.py | 145 ++-- .../dark_monitor_file_thresholds.txt | 709 +++--------------- jwql/shared_tasks/shared_tasks.py | 34 +- .../jwql/monitor_pages/monitor_dark_bokeh.py | 15 +- 4 files changed, 176 insertions(+), 727 deletions(-) diff --git a/jwql/instrument_monitors/common_monitors/dark_monitor.py b/jwql/instrument_monitors/common_monitors/dark_monitor.py index 74ff1dab1..a795ba261 100755 --- a/jwql/instrument_monitors/common_monitors/dark_monitor.py +++ b/jwql/instrument_monitors/common_monitors/dark_monitor.py @@ -923,15 +923,20 @@ def run(self): self.query_end = Time.now().mjd # Loop over all instruments - for instrument in ['miri']: #JWST_INSTRUMENT_NAMES: + for instrument in JWST_INSTRUMENT_NAMES: self.instrument = instrument + logging.info(f'\n\nWorking on {instrument}') # Identify which database tables to use self.identify_tables() # Get a list of all possible apertures from pysiaf - possible_apertures = list(Siaf(instrument).apernames) - possible_apertures = [ap for ap in possible_apertures if ap not in apertures_to_skip] + #possible_apertures = list(Siaf(instrument).apernames) + #possible_apertures = [ap for ap in possible_apertures if ap not in apertures_to_skip] + + # Run the monitor only on the apertures listed in the threshold file. Skip all others. + instrument_entries = limits['Instrument'] == instrument + possible_apertures = limits['Aperture'][instrument_entries] # Get a list of all possible readout patterns associated with the aperture possible_readpatts = RAPID_READPATTERNS[instrument] @@ -985,7 +990,7 @@ def run(self): new_entries = monitor_utils.exclude_asic_tuning(new_entries) len_no_asic = len(new_entries) num_asic = len_new_darks - len_no_asic - logging.info(f"\tFiltering out ASIC tuning files. Removed {num_asic} dark files.") + #logging.info(f"\tFiltering out ASIC tuning files. Removed {num_asic} dark files.") logging.info(f'\tAperture: {self.aperture}, Readpattern: {self.readpatt}, new entries: {len(new_entries)}') @@ -1029,27 +1034,22 @@ def run(self): else: bad_size_filenames.append(new_file) if len(temp_filenames) != len(new_filenames): - logging.info('\tSome files returned by MAST have unexpected aperture sizes. These files will be ignored: ') + logging.info('\t\tSome files returned by MAST have unexpected aperture sizes. These files will be ignored: ') for badfile in bad_size_filenames: - logging.info('\t\t{}'.format(badfile)) + logging.info('\t\t\t{}'.format(badfile)) new_filenames = deepcopy(temp_filenames) # Check to see if there are enough new integrations to meet the # monitor's signal-to-noise requirements - logging.info((f'\tFilesystem search for new dark integrations for {self.instrument}, {self.aperture}, ' - f'{self.readpatt} has found {total_integrations} integrations spread across {len(new_filenames)} files.')) + if len(new_filenames) > 0: + logging.info((f'\t\tFilesystem search for new dark integrations for {self.instrument}, {self.aperture}, ' + f'{self.readpatt} has found {total_integrations} integrations spread across {len(new_filenames)} files.')) if total_integrations >= integration_count_threshold: - - - # for testing - logging.info('FULL BATCH STARTING TIMES:') - logging.info(starting_times) - logging.info('ENDING TIMES:') - logging.info(ending_times) - - - + #logging.info('FULL BATCH STARTING TIMES:') + #logging.info(starting_times) + #logging.info('ENDING TIMES:') + #logging.info(ending_times) logging.info(f'\tThis meets the threshold of {integration_count_threshold} integrations.') monitor_run = True @@ -1075,10 +1075,10 @@ def run(self): - #dark_files, not_copied = copy_files(new_file_list, self.data_dir) + dark_files, not_copied = copy_files(new_file_list, self.data_dir) # Fake dark_files and not_copied, for testing - dark_files = new_file_list - not_copied = [] + #dark_files = new_file_list + #not_copied = [] @@ -1086,7 +1086,7 @@ def run(self): logging.info('\tNew_filenames: {}'.format(new_file_list)) logging.info('\tData dir: {}'.format(self.data_dir)) - logging.info('\tCopied to working dir: {}'.format(dark_files)) + logging.info('\tCopied to data dir: {}'.format(dark_files)) logging.info('\tNot copied: {}'.format(not_copied)) @@ -1104,8 +1104,8 @@ def run(self): # Run the dark monitor - #self.process(dark_files) - logging.info('HERE IS WHERE THE MONITOR WOULD RUN ON THE GIVEN BATCH OF FILES. THIS IS TURNED OFF FOR TESTING.') + self.process(dark_files) + #logging.info('HERE IS WHERE THE MONITOR WOULD RUN ON THE GIVEN BATCH OF FILES. THIS IS TURNED OFF FOR TESTING.') @@ -1126,13 +1126,13 @@ def run(self): - #with engine.begin() as connection: - # connection.execute( - # self.query_table.__table__.insert(), new_entry) - #logging.info('\tUpdated the query history table') + with engine.begin() as connection: + connection.execute( + self.query_table.__table__.insert(), new_entry) + logging.info('\tUpdated the query history table') logging.info('NEW ENTRY: ') logging.info(new_entry) - logging.info('TURNED OFF DATABASE UPDATES DURING TESTING') + #logging.info('TURNED OFF DATABASE UPDATES DURING TESTING') @@ -1155,13 +1155,13 @@ def run(self): - #with engine.begin() as connection: - # connection.execute( - # self.query_table.__table__.insert(), new_entry) - #logging.info('\tUpdated the query history table') + with engine.begin() as connection: + connection.execute( + self.query_table.__table__.insert(), new_entry) + logging.info('\tUpdated the query history table') logging.info('NEW ENTRY: ') logging.info(new_entry) - logging.info('TURNED OFF DATABASE UPDATES DURING TESTING') + #logging.info('TURNED OFF DATABASE UPDATES DURING TESTING') @@ -1302,13 +1302,10 @@ def split_files_into_sub_lists(self, files, start_times, end_times, integration_ - print('Splitting into sub-lists. Inputs at the beginning:') - print(files) - print(start_times) - print(end_times) - print(integration_list) - print(threshold) - print('\n') + logging.info('\t\tSplitting into sub-lists. Inputs at the beginning: (file, start time, end time, nints, threshold)') + for f, st, et, inte in zip(files, start_times, end_times, integration_list): + logging.info(f'\t\t {f}, {st}, {et}, {inte}, {threshold}') + logging.info('\n') @@ -1332,25 +1329,16 @@ def split_files_into_sub_lists(self, files, start_times, end_times, integration_ # dark current during each "epoch" within a calibration proposal dividers = np.where(delta_t >= DARK_MONITOR_BETWEEN_EPOCH_THRESHOLD_TIME[self.instrument])[0] - - print('Initial dividers: ', dividers) - - # Add dividers at the beginning index to make the coding easier dividers = np.insert(dividers, 0, 0) - print('Prepend zero to dividers: ', dividers) - # If there is no divider at the end of the list of files, then add one if dividers[-1] < len(delta_t): dividers = np.insert(dividers, len(dividers), len(delta_t)) - - print('delta_t', delta_t) - print('Final dividers (divide data based on time gaps between files):', dividers) - print('threshold (number of integrations):', threshold) - print('\n') - + logging.info(f'\t\t\tdelta_t between files: {delta_t}') + logging.info(f'\t\t\tFinal dividers (divide data based on time gaps between files): {dividers}') + logging.info('\n') # Loop over epochs. # Within each batch, divide up the exposures into multiple batches if the total @@ -1362,11 +1350,10 @@ def split_files_into_sub_lists(self, files, start_times, end_times, integration_ batch_end_times = end_times[dividers[i]:dividers[i+1]] batch_int_sum = np.sum(batch_ints) - print(f'Loop over time-based batches. Working on batch {i}') - print('batch_ints', batch_ints) - print('batch_files', batch_files) - - + logging.info(f'\t\t\tLoop over time-based batches. Working on batch {i}') + logging.info(f'\t\t\tBatch Files, Batch integrations') + for bi, bf in zip(batch_ints, batch_files): + logging.info(f'\t\t\t{bf}, {bi}') # Calculate how many subgroups to break up the batch into, # based on the threshold, and under the assumption that we @@ -1517,8 +1504,6 @@ def split_files_into_sub_lists(self, files, start_times, end_times, integration_ # Calculate the total number of integrations up to each file batch_int_sums = np.array([np.sum(batch_ints[0:jj]) for jj in range(1, len(batch_ints) + 1)]) - print('batch_int_sums: ', batch_int_sums) - base = 0 startidx = 0 endidx = 0 @@ -1532,9 +1517,6 @@ def split_files_into_sub_lists(self, files, start_times, end_times, integration_ endidx = np.where(batch_int_sums >= (base + threshold))[0] - print('startidx: ', startidx) - print('endidx: ', endidx) - # Check if we reach the end of the file list if len(endidx) == 0: endidx = len(batch_int_sums) - 1 @@ -1544,9 +1526,9 @@ def split_files_into_sub_lists(self, files, start_times, end_times, integration_ if endidx == (len(batch_int_sums) - 1): complete = True - print('startidx: ', startidx) - print('endidx: ', endidx) - print('complete: ', complete) + logging.info(f'\t\t\tstartidx: {startidx}') + logging.info(f'\t\t\tendidx: {endidx}') + logging.info(f'\t\t\tcomplete: {complete}') subgroup_ints = batch_ints[startidx: endidx + 1] subgroup_files = batch_files[startidx: endidx + 1] @@ -1555,9 +1537,9 @@ def split_files_into_sub_lists(self, files, start_times, end_times, integration_ subgroup_int_sum = np.sum(subgroup_ints) - print('subgroup_ints: ', subgroup_ints) - print('subgroup_files: ', subgroup_files) - print('subgroup_int_sum: ', subgroup_int_sum) + logging.info(f'\t\t\tsubgroup_ints: {subgroup_ints}') + logging.info(f'\t\t\tsubgroup_files: {subgroup_files}') + logging.info(f'\t\t\tsubgroup_int_sum: {subgroup_int_sum}') #print('batchnum: ', batchnum) #print(batch_ints[startidx: endidx + 1]) @@ -1582,10 +1564,10 @@ def split_files_into_sub_lists(self, files, start_times, end_times, integration_ #integrations and run if so. #print('final subgroup of final epoch. if the epoch is not over, so skipping files') - print('should be final epoch and final subgroup. epoch number: ', i) + logging.info(f'\t\t\tShould be final epoch and final subgroup. epoch number: {i}') if np.sum(subgroup_ints) >= threshold: - print('ADDED - final subgroup of final epoch') + logging.info('\t\t\tADDED - final subgroup of final epoch') self.file_batches.append(subgroup_files) self.start_time_batches.append(subgroup_start_times) self.end_time_batches.append(subgroup_end_times) @@ -1594,12 +1576,11 @@ def split_files_into_sub_lists(self, files, start_times, end_times, integration_ # Here the final subgroup does not have enough integrations to reach the threshold # and we're not sure if the epoch is complete, so we skip these files and save them # for a future dark monitor run + logging.info('\t\t\tSkipping final subgroup. Not clear if the epoch is complete') pass else: #if (i < len(dividers) - 1) and (batchnum < (n_subgroups - 1)): - print('Not the final epoch, and not the final subgroup') - print('ADDED') self.file_batches.append(subgroup_files) self.start_time_batches.append(subgroup_start_times) self.end_time_batches.append(subgroup_end_times) @@ -1613,15 +1594,15 @@ def split_files_into_sub_lists(self, files, start_times, end_times, integration_ # subgroups, then we quit. break - - - print('Epoch number: ', i) - print('batch_files: ', batch_files) - print('batch_ints: ', batch_ints) - print('self.file_batches: ', self.file_batches) - print('self.integration_batches: ', self.integration_batches) - print('threshold: ', threshold) - print('DONE WITH SUBGROUPS\n\n\n\n') + logging.info(f'\n\t\t\tEpoch number: {i}') + logging.info('\t\t\tBatch File, Bath integration') + for bi, bf in zip(batch_ints, batch_files): + logging.info(f'\t\t\t{bf}, {bi}') + logging.info(f'\n\t\t\tSplit into separate subgroups for processing:') + logging.info('\t\t\tFile batches, integration batches') + for fb, ib in zip(self.file_batches, self.integration_batches): + logging.info(f'\t\t\t{fb}, {ib}') + logging.info(f'\t\t\tDONE WITH SUBGROUPS\n\n\n\n') def stats_by_amp(self, image, amps): diff --git a/jwql/instrument_monitors/common_monitors/dark_monitor_file_thresholds.txt b/jwql/instrument_monitors/common_monitors/dark_monitor_file_thresholds.txt index f82f20810..010831446 100644 --- a/jwql/instrument_monitors/common_monitors/dark_monitor_file_thresholds.txt +++ b/jwql/instrument_monitors/common_monitors/dark_monitor_file_thresholds.txt @@ -1,624 +1,89 @@ Instrument Aperture Threshold N_skipped_integs -nircam NRCA1_FULL_OSS 10 0 -nircam NRCA2_FULL_OSS 10 0 -nircam NRCA3_FULL_OSS 10 0 -nircam NRCA4_FULL_OSS 10 0 -nircam NRCA5_FULL_OSS 10 0 -nircam NRCB1_FULL_OSS 10 0 -nircam NRCB2_FULL_OSS 10 0 -nircam NRCB3_FULL_OSS 10 0 -nircam NRCB4_FULL_OSS 10 0 -nircam NRCB5_FULL_OSS 10 0 -nircam NRCALL_FULL 10 0 -nircam NRCAS_FULL 10 0 -nircam NRCA1_FULL 2 0 -nircam NRCA2_FULL 2 0 -nircam NRCA3_FULL 2 0 -nircam NRCA4_FULL 2 0 -nircam NRCA5_FULL 2 0 -nircam NRCBS_FULL 2 0 -nircam NRCB1_FULL 2 0 -nircam NRCB2_FULL 2 0 -nircam NRCB3_FULL 2 0 -nircam NRCB4_FULL 2 0 -nircam NRCB5_FULL 2 0 -nircam NRCB1_FULLP 10 0 -nircam NRCB5_FULLP 10 0 -nircam NRCA1_SUB160 30 0 -nircam NRCA2_SUB160 30 0 -nircam NRCA3_SUB160 30 0 -nircam NRCA4_SUB160 30 0 -nircam NRCA5_SUB160 30 0 -nircam NRCB1_SUB160 30 0 -nircam NRCB2_SUB160 30 0 -nircam NRCB3_SUB160 30 0 -nircam NRCB4_SUB160 30 0 -nircam NRCB5_SUB160 30 0 -nircam NRCA1_SUB320 30 0 -nircam NRCA2_SUB320 30 0 -nircam NRCA3_SUB320 30 0 -nircam NRCA4_SUB320 30 0 -nircam NRCA5_SUB320 30 0 -nircam NRCB1_SUB320 30 0 -nircam NRCB2_SUB320 30 0 -nircam NRCB3_SUB320 30 0 -nircam NRCB4_SUB320 30 0 -nircam NRCB5_SUB320 30 0 -nircam NRCA1_SUB640 30 0 -nircam NRCA2_SUB640 30 0 -nircam NRCA3_SUB640 30 0 -nircam NRCA4_SUB640 30 0 -nircam NRCA5_SUB640 30 0 -nircam NRCB1_SUB640 30 0 -nircam NRCB2_SUB640 30 0 -nircam NRCB3_SUB640 30 0 -nircam NRCB4_SUB640 30 0 -nircam NRCB5_SUB640 30 0 -nircam NRCA5_GRISM256_F322W2 30 0 -nircam NRCA5_GRISM128_F322W2 30 0 -nircam NRCA5_GRISM64_F322W2 30 0 -nircam NRCA5_GRISM256_F277W 30 0 -nircam NRCA5_GRISM128_F277W 30 0 -nircam NRCA5_GRISM64_F277W 30 0 -nircam NRCA5_GRISM256_F356W 30 0 -nircam NRCA5_GRISM128_F356W 30 0 -nircam NRCA5_GRISM64_F356W 30 0 -nircam NRCA5_GRISM256_F444W 30 0 -nircam NRCA5_GRISM128_F444W 30 0 -nircam NRCA5_GRISM64_F444W 30 0 -nircam NRCA5_GRISM_F322W2 30 0 -nircam NRCA5_GRISM_F277W 30 0 -nircam NRCA5_GRISM_F356W 30 0 -nircam NRCA5_GRISM_F444W 30 0 -nircam NRCA1_GRISMTS 30 0 -nircam NRCA1_GRISMTS256 30 0 -nircam NRCA1_GRISMTS128 30 0 -nircam NRCA1_GRISMTS64 30 0 -nircam NRCA3_GRISMTS 30 0 -nircam NRCA3_GRISMTS256 30 0 -nircam NRCA3_GRISMTS128 30 0 -nircam NRCA3_GRISMTS64 30 0 -nircam NRCA5_TAGRISMTS32 30 0 -nircam NRCA5_TAGRISMTS32_F405N 30 0 -nircam NRCA5_TAGRISMTS_SCI_F322W2 30 0 -nircam NRCA5_TAGRISMTS_SCI_F444W 30 0 -nircam NRCA3_DHSPIL 30 0 -nircam NRCA3_DHSPIL_SUB96 30 0 -nircam NRCA3_DHSPIL_WEDGES 30 0 -nircam NRCB4_DHSPIL 30 0 -nircam NRCB4_DHSPIL_SUB96 30 0 -nircam NRCB4_DHSPIL_WEDGES 30 0 -nircam NRCA3_FP1 30 0 -nircam NRCA3_FP1_SUB8 30 0 -nircam NRCA3_FP1_SUB64 30 0 -nircam NRCA3_FP2MIMF 30 0 -nircam NRCA1_FP3MIMF 30 0 -nircam NRCA2_FP4MIMF 30 0 -nircam NRCA4_FP5MIMF 30 0 -nircam NRCB4_FP1 30 0 -nircam NRCB4_FP1_SUB8 30 0 -nircam NRCB4_FP1_SUB64 30 0 -nircam NRCB4_FP2MIMF 30 0 -nircam NRCB2_FP3MIMF 30 0 -nircam NRCB1_FP4MIMF 30 0 -nircam NRCB3_FP5MIMF 30 0 -nircam NRCA3_SUB64P 30 0 -nircam NRCA3_SUB160P 30 0 -nircam NRCA3_SUB400P 30 0 -nircam NRCA5_SUB64P 30 0 -nircam NRCA5_SUB160P 30 0 -nircam NRCA5_SUB400P 30 0 -nircam NRCB1_SUB64P 30 0 -nircam NRCB1_SUB160P 30 0 -nircam NRCB1_SUB400P 30 0 -nircam NRCB5_SUB64P 30 0 -nircam NRCB5_SUB160P 30 0 -nircam NRCB5_SUB400P 30 0 -nircam NRCB5_TAPSIMG32 30 0 -nircam NRCA5_GRISMC_WFSS 30 0 -nircam NRCA5_GRISMR_WFSS 30 0 -nircam NRCALL_GRISMC_WFSS 30 0 -nircam NRCALL_GRISMR_WFSS 30 0 -nircam NRCB5_GRISMC_WFSS 30 0 -nircam NRCB5_GRISMR_WFSS 30 0 -nircam NRCA2_MASK210R 30 0 -nircam NRCA5_MASK335R 30 0 -nircam NRCA5_MASK430R 30 0 -nircam NRCA4_MASKSWB 30 0 -nircam NRCA5_MASKLWB 30 0 -nircam NRCA2_TAMASK210R 30 0 -nircam NRCA5_TAMASK335R 30 0 -nircam NRCA5_TAMASK430R 30 0 -nircam NRCA4_TAMASKSWB 30 0 -nircam NRCA5_TAMASKLWB 30 0 -nircam NRCA5_TAMASKLWBL 30 0 -nircam NRCA4_TAMASKSWBS 30 0 -nircam NRCB1_MASK210R 30 0 -nircam NRCB5_MASK335R 30 0 -nircam NRCB5_MASK430R 30 0 -nircam NRCB3_MASKSWB 30 0 -nircam NRCB5_MASKLWB 30 0 -nircam NRCB1_TAMASK210R 30 0 -nircam NRCB5_TAMASK335R 30 0 -nircam NRCB5_TAMASK430R 30 0 -nircam NRCB3_TAMASKSWB 30 0 -nircam NRCB5_TAMASKLWB 30 0 -nircam NRCB5_TAMASKLWBL 30 0 -nircam NRCB3_TAMASKSWBS 30 0 -nircam NRCA2_FSTAMASK210R 30 0 -nircam NRCA4_FSTAMASKSWB 30 0 -nircam NRCA5_FSTAMASKLWB 30 0 -nircam NRCA5_FSTAMASK335R 30 0 -nircam NRCA5_FSTAMASK430R 30 0 -nircam NRCA4_MASKSWB_F182M 30 0 -nircam NRCA4_MASKSWB_F187N 30 0 -nircam NRCA4_MASKSWB_F210M 30 0 -nircam NRCA4_MASKSWB_F212N 30 0 -nircam NRCA4_MASKSWB_F200W 30 0 -nircam NRCA4_MASKSWB_NARROW 30 0 -nircam NRCA5_MASKLWB_F250M 30 0 -nircam NRCA5_MASKLWB_F300M 30 0 -nircam NRCA5_MASKLWB_F277W 30 0 -nircam NRCA5_MASKLWB_F335M 30 0 -nircam NRCA5_MASKLWB_F360M 30 0 -nircam NRCA5_MASKLWB_F356W 30 0 -nircam NRCA5_MASKLWB_F410M 30 0 -nircam NRCA5_MASKLWB_F430M 30 0 -nircam NRCA5_MASKLWB_F460M 30 0 -nircam NRCA5_MASKLWB_F480M 30 0 -nircam NRCA5_MASKLWB_F444W 30 0 -nircam NRCA5_MASKLWB_NARROW 30 0 -nircam NRCA2_FULL_MASK210R 10 0 -nircam NRCA5_FULL_MASK335R 10 0 -nircam NRCA5_FULL_MASK430R 10 0 -nircam NRCA4_FULL_MASKSWB 10 0 -nircam NRCA4_FULL_MASKSWB_F182M 10 0 -nircam NRCA4_FULL_MASKSWB_F187N 10 0 -nircam NRCA4_FULL_MASKSWB_F210M 10 0 -nircam NRCA4_FULL_MASKSWB_F212N 10 0 -nircam NRCA4_FULL_MASKSWB_F200W 10 0 -nircam NRCA5_FULL_MASKLWB 10 0 -nircam NRCA5_FULL_MASKLWB_F250M 10 0 -nircam NRCA5_FULL_MASKLWB_F300M 10 0 -nircam NRCA5_FULL_MASKLWB_F277W 10 0 -nircam NRCA5_FULL_MASKLWB_F335M 10 0 -nircam NRCA5_FULL_MASKLWB_F360M 10 0 -nircam NRCA5_FULL_MASKLWB_F356W 10 0 -nircam NRCA5_FULL_MASKLWB_F410M 10 0 -nircam NRCA5_FULL_MASKLWB_F430M 10 0 -nircam NRCA5_FULL_MASKLWB_F460M 10 0 -nircam NRCA5_FULL_MASKLWB_F480M 10 0 -nircam NRCA5_FULL_MASKLWB_F444W 10 0 -nircam NRCA2_FULL_WEDGE_RND 10 0 -nircam NRCA4_FULL_WEDGE_BAR 10 0 -nircam NRCA5_FULL_WEDGE_RND 10 0 -nircam NRCA5_FULL_WEDGE_BAR 10 0 -nircam NRCA2_FULL_TAMASK210R 10 0 -nircam NRCA5_FULL_TAMASK335R 10 0 -nircam NRCA5_FULL_TAMASK430R 10 0 -nircam NRCA4_FULL_TAMASKSWB 10 0 -nircam NRCA5_FULL_TAMASKLWB 10 0 -nircam NRCA5_FULL_TAMASKLWBL 10 0 -nircam NRCA4_FULL_TAMASKSWBS 10 0 -nircam NRCA2_FULL_FSTAMASK210R 10 0 -nircam NRCA4_FULL_FSTAMASKSWB 10 0 -nircam NRCA5_FULL_FSTAMASKLWB 10 0 -nircam NRCA5_FULL_FSTAMASK335R 10 0 -nircam NRCA5_FULL_FSTAMASK430R 10 0 -niriss NIS_CEN_OSS 10 0 -niriss NIS_CEN 10 0 -niriss NIS_AMI1 30 0 -niriss NIS_AMI2 30 0 -niriss NIS_AMI3 30 0 -niriss NIS_AMI4 30 0 -niriss NIS_AMITA 30 0 -niriss NIS_SOSSTA 30 0 -niriss NIS_WFSS_OFFSET 30 0 -niriss NIS_WFSS64 30 0 -niriss NIS_WFSS64R 30 0 -niriss NIS_WFSS64R3 30 0 -niriss NIS_WFSS64C 30 0 -niriss NIS_WFSS64C3 30 0 -niriss NIS_WFSS128 30 0 -niriss NIS_WFSS128R 30 0 -niriss NIS_WFSS128R3 30 0 -niriss NIS_WFSS128C 30 0 -niriss NIS_WFSS128C3 30 0 -niriss NIS_SUB64 30 0 -niriss NIS_SUB128 30 0 -niriss NIS_SUB256 30 0 -niriss NIS_SUBAMPCAL 30 0 -niriss NIS_SUBSTRIP96 30 0 -niriss NIS_SUBSTRIP256 30 0 -niriss NIS_FP1MIMF 30 0 -niriss NIS_FP2MIMF 30 0 -niriss NIS_FP3MIMF 30 0 -niriss NIS_FP4MIMF 30 0 -niriss NIS_FP5MIMF 30 0 -niriss NIS_AMIFULL 10 0 -niriss NIS_SOSSFULL 10 0 -niriss NIS_WFSS 10 0 -miri MIRIM_FULL_OSS 1 1 +nircam NRCA1_FULL 1 0 +nircam NRCA2_FULL 1 0 +nircam NRCA3_FULL 1 0 +nircam NRCA4_FULL 1 0 +nircam NRCA5_FULL 1 0 +nircam NRCB1_FULL 1 0 +nircam NRCB2_FULL 1 0 +nircam NRCB3_FULL 1 0 +nircam NRCB4_FULL 1 0 +nircam NRCB5_FULL 1 0 +nircam NRCA1_SUB160 4 0 +nircam NRCA2_SUB160 4 0 +nircam NRCA3_SUB160 4 0 +nircam NRCA4_SUB160 4 0 +nircam NRCA5_SUB160 4 0 +nircam NRCB1_SUB160 4 0 +nircam NRCB2_SUB160 4 0 +nircam NRCB3_SUB160 4 0 +nircam NRCB4_SUB160 4 0 +nircam NRCB5_SUB160 4 0 +nircam NRCA1_SUB320 4 0 +nircam NRCA2_SUB320 4 0 +nircam NRCA3_SUB320 4 0 +nircam NRCA4_SUB320 4 0 +nircam NRCA5_SUB320 4 0 +nircam NRCB1_SUB320 4 0 +nircam NRCB2_SUB320 4 0 +nircam NRCB3_SUB320 4 0 +nircam NRCB4_SUB320 4 0 +nircam NRCB5_SUB320 4 0 +nircam NRCA1_SUB640 4 0 +nircam NRCA2_SUB640 4 0 +nircam NRCA3_SUB640 4 0 +nircam NRCA4_SUB640 4 0 +nircam NRCA5_SUB640 4 0 +nircam NRCB1_SUB640 4 0 +nircam NRCB2_SUB640 4 0 +nircam NRCB3_SUB640 4 0 +nircam NRCB4_SUB640 4 0 +nircam NRCB5_SUB640 4 0 +niriss NIS_CEN 1 0 +niriss NIS_AMI1 1 0 +niriss NIS_AMI2 1 0 +niriss NIS_AMI3 1 0 +niriss NIS_AMI4 1 0 +niriss NIS_SUB64 1 0 +niriss NIS_SUB128 1 0 +niriss NIS_SUB256 1 0 miri MIRIM_FULL 1 1 -miri MIRIM_ILLUM 30 0 -miri MIRIM_BRIGHTSKY 30 0 -miri MIRIM_SUB256 30 0 -miri MIRIM_SUB128 30 0 -miri MIRIM_SUB64 30 0 -miri MIRIM_SLITLESSPRISM 30 0 -miri MIRIM_SLITLESSUPPER 30 0 -miri MIRIM_SLITLESSLOWER 30 0 -miri MIRIM_MASK1065 30 0 -miri MIRIM_MASK1140 30 0 -miri MIRIM_MASK1550 30 0 -miri MIRIM_MASKLYOT 30 0 -miri MIRIM_TAMRS 30 0 -miri MIRIM_TALRS 30 0 -miri MIRIM_TABLOCK 30 0 -miri MIRIM_TALYOT_UL 30 0 -miri MIRIM_TALYOT_UR 30 0 -miri MIRIM_TALYOT_LL 30 0 -miri MIRIM_TALYOT_LR 30 0 -miri MIRIM_TALYOT_CUL 30 0 -miri MIRIM_TALYOT_CUR 30 0 -miri MIRIM_TALYOT_CLL 30 0 -miri MIRIM_TALYOT_CLR 30 0 -miri MIRIM_TA1550_UL 30 0 -miri MIRIM_TA1550_UR 30 0 -miri MIRIM_TA1550_LL 30 0 -miri MIRIM_TA1550_LR 30 0 -miri MIRIM_TA1550_CUL 30 0 -miri MIRIM_TA1550_CUR 30 0 -miri MIRIM_TA1550_CLL 30 0 -miri MIRIM_TA1550_CLR 30 0 -miri MIRIM_TA1140_UL 30 0 -miri MIRIM_TA1140_UR 30 0 -miri MIRIM_TA1140_LL 30 0 -miri MIRIM_TA1140_LR 30 0 -miri MIRIM_TA1140_CUL 30 0 -miri MIRIM_TA1140_CUR 30 0 -miri MIRIM_TA1140_CLL 30 0 -miri MIRIM_TA1140_CLR 30 0 -miri MIRIM_TA1065_UL 30 0 -miri MIRIM_TA1065_UR 30 0 -miri MIRIM_TA1065_LL 30 0 -miri MIRIM_TA1065_LR 30 0 -miri MIRIM_TA1065_CUL 30 0 -miri MIRIM_TA1065_CUR 30 0 -miri MIRIM_TA1065_CLL 30 0 -miri MIRIM_TA1065_CLR 30 0 -miri MIRIM_TAFULL 10 0 -miri MIRIM_TAILLUM 30 0 -miri MIRIM_TABRIGHTSKY 30 0 -miri MIRIM_TASUB256 30 0 -miri MIRIM_TASUB128 30 0 -miri MIRIM_TASUB64 30 0 -miri MIRIM_TASLITLESSPRISM 30 0 -miri MIRIM_CORON1065 30 0 -miri MIRIM_CORON1140 30 0 -miri MIRIM_CORON1550 30 0 -miri MIRIM_CORONLYOT 30 0 -miri MIRIM_KNIFE 30 0 -miri MIRIM_FP1MIMF 30 0 -miri MIRIM_FP2MIMF 30 0 -miri MIRIM_FP3MIMF 30 0 -miri MIRIM_FP4MIMF 30 0 -miri MIRIM_FP5MIMF 30 0 -miri MIRIM_SLIT 30 0 -miri MIRIFU_CHANNEL1A 30 0 -miri MIRIFU_1ASLICE01 30 0 -miri MIRIFU_1ASLICE02 30 0 -miri MIRIFU_1ASLICE03 30 0 -miri MIRIFU_1ASLICE04 30 0 -miri MIRIFU_1ASLICE05 30 0 -miri MIRIFU_1ASLICE06 30 0 -miri MIRIFU_1ASLICE07 30 0 -miri MIRIFU_1ASLICE08 30 0 -miri MIRIFU_1ASLICE09 30 0 -miri MIRIFU_1ASLICE10 30 0 -miri MIRIFU_1ASLICE11 30 0 -miri MIRIFU_1ASLICE12 30 0 -miri MIRIFU_1ASLICE13 30 0 -miri MIRIFU_1ASLICE14 30 0 -miri MIRIFU_1ASLICE15 30 0 -miri MIRIFU_1ASLICE16 30 0 -miri MIRIFU_1ASLICE17 30 0 -miri MIRIFU_1ASLICE18 30 0 -miri MIRIFU_1ASLICE19 30 0 -miri MIRIFU_1ASLICE20 30 0 -miri MIRIFU_1ASLICE21 30 0 -miri MIRIFU_CHANNEL1B 30 0 -miri MIRIFU_1BSLICE01 30 0 -miri MIRIFU_1BSLICE02 30 0 -miri MIRIFU_1BSLICE03 30 0 -miri MIRIFU_1BSLICE04 30 0 -miri MIRIFU_1BSLICE05 30 0 -miri MIRIFU_1BSLICE06 30 0 -miri MIRIFU_1BSLICE07 30 0 -miri MIRIFU_1BSLICE08 30 0 -miri MIRIFU_1BSLICE09 30 0 -miri MIRIFU_1BSLICE10 30 0 -miri MIRIFU_1BSLICE11 30 0 -miri MIRIFU_1BSLICE12 30 0 -miri MIRIFU_1BSLICE13 30 0 -miri MIRIFU_1BSLICE14 30 0 -miri MIRIFU_1BSLICE15 30 0 -miri MIRIFU_1BSLICE16 30 0 -miri MIRIFU_1BSLICE17 30 0 -miri MIRIFU_1BSLICE18 30 0 -miri MIRIFU_1BSLICE19 30 0 -miri MIRIFU_1BSLICE20 30 0 -miri MIRIFU_1BSLICE21 30 0 -miri MIRIFU_CHANNEL1C 30 0 -miri MIRIFU_1CSLICE01 30 0 -miri MIRIFU_1CSLICE02 30 0 -miri MIRIFU_1CSLICE03 30 0 -miri MIRIFU_1CSLICE04 30 0 -miri MIRIFU_1CSLICE05 30 0 -miri MIRIFU_1CSLICE06 30 0 -miri MIRIFU_1CSLICE07 30 0 -miri MIRIFU_1CSLICE08 30 0 -miri MIRIFU_1CSLICE09 30 0 -miri MIRIFU_1CSLICE10 30 0 -miri MIRIFU_1CSLICE11 30 0 -miri MIRIFU_1CSLICE12 30 0 -miri MIRIFU_1CSLICE13 30 0 -miri MIRIFU_1CSLICE14 30 0 -miri MIRIFU_1CSLICE15 30 0 -miri MIRIFU_1CSLICE16 30 0 -miri MIRIFU_1CSLICE17 30 0 -miri MIRIFU_1CSLICE18 30 0 -miri MIRIFU_1CSLICE19 30 0 -miri MIRIFU_1CSLICE20 30 0 -miri MIRIFU_1CSLICE21 30 0 -miri MIRIFU_CHANNEL2A 30 0 -miri MIRIFU_2ASLICE01 30 0 -miri MIRIFU_2ASLICE02 30 0 -miri MIRIFU_2ASLICE03 30 0 -miri MIRIFU_2ASLICE04 30 0 -miri MIRIFU_2ASLICE05 30 0 -miri MIRIFU_2ASLICE06 30 0 -miri MIRIFU_2ASLICE07 30 0 -miri MIRIFU_2ASLICE08 30 0 -miri MIRIFU_2ASLICE09 30 0 -miri MIRIFU_2ASLICE10 30 0 -miri MIRIFU_2ASLICE11 30 0 -miri MIRIFU_2ASLICE12 30 0 -miri MIRIFU_2ASLICE13 30 0 -miri MIRIFU_2ASLICE14 30 0 -miri MIRIFU_2ASLICE15 30 0 -miri MIRIFU_2ASLICE16 30 0 -miri MIRIFU_2ASLICE17 30 0 -miri MIRIFU_CHANNEL2B 30 0 -miri MIRIFU_2BSLICE01 30 0 -miri MIRIFU_2BSLICE02 30 0 -miri MIRIFU_2BSLICE03 30 0 -miri MIRIFU_2BSLICE04 30 0 -miri MIRIFU_2BSLICE05 30 0 -miri MIRIFU_2BSLICE06 30 0 -miri MIRIFU_2BSLICE07 30 0 -miri MIRIFU_2BSLICE08 30 0 -miri MIRIFU_2BSLICE09 30 0 -miri MIRIFU_2BSLICE10 30 0 -miri MIRIFU_2BSLICE11 30 0 -miri MIRIFU_2BSLICE12 30 0 -miri MIRIFU_2BSLICE13 30 0 -miri MIRIFU_2BSLICE14 30 0 -miri MIRIFU_2BSLICE15 30 0 -miri MIRIFU_2BSLICE16 30 0 -miri MIRIFU_2BSLICE17 30 0 -miri MIRIFU_CHANNEL2C 30 0 -miri MIRIFU_2CSLICE01 30 0 -miri MIRIFU_2CSLICE02 30 0 -miri MIRIFU_2CSLICE03 30 0 -miri MIRIFU_2CSLICE04 30 0 -miri MIRIFU_2CSLICE05 30 0 -miri MIRIFU_2CSLICE06 30 0 -miri MIRIFU_2CSLICE07 30 0 -miri MIRIFU_2CSLICE08 30 0 -miri MIRIFU_2CSLICE09 30 0 -miri MIRIFU_2CSLICE10 30 0 -miri MIRIFU_2CSLICE11 30 0 -miri MIRIFU_2CSLICE12 30 0 -miri MIRIFU_2CSLICE13 30 0 -miri MIRIFU_2CSLICE14 30 0 -miri MIRIFU_2CSLICE15 30 0 -miri MIRIFU_2CSLICE16 30 0 -miri MIRIFU_2CSLICE17 30 0 -miri MIRIFU_CHANNEL3A 30 0 -miri MIRIFU_3ASLICE01 30 0 -miri MIRIFU_3ASLICE02 30 0 -miri MIRIFU_3ASLICE03 30 0 -miri MIRIFU_3ASLICE04 30 0 -miri MIRIFU_3ASLICE05 30 0 -miri MIRIFU_3ASLICE06 30 0 -miri MIRIFU_3ASLICE07 30 0 -miri MIRIFU_3ASLICE08 30 0 -miri MIRIFU_3ASLICE09 30 0 -miri MIRIFU_3ASLICE10 30 0 -miri MIRIFU_3ASLICE11 30 0 -miri MIRIFU_3ASLICE12 30 0 -miri MIRIFU_3ASLICE13 30 0 -miri MIRIFU_3ASLICE14 30 0 -miri MIRIFU_3ASLICE15 30 0 -miri MIRIFU_3ASLICE16 30 0 -miri MIRIFU_CHANNEL3B 30 0 -miri MIRIFU_3BSLICE01 30 0 -miri MIRIFU_3BSLICE02 30 0 -miri MIRIFU_3BSLICE03 30 0 -miri MIRIFU_3BSLICE04 30 0 -miri MIRIFU_3BSLICE05 30 0 -miri MIRIFU_3BSLICE06 30 0 -miri MIRIFU_3BSLICE07 30 0 -miri MIRIFU_3BSLICE08 30 0 -miri MIRIFU_3BSLICE09 30 0 -miri MIRIFU_3BSLICE10 30 0 -miri MIRIFU_3BSLICE11 30 0 -miri MIRIFU_3BSLICE12 30 0 -miri MIRIFU_3BSLICE13 30 0 -miri MIRIFU_3BSLICE14 30 0 -miri MIRIFU_3BSLICE15 30 0 -miri MIRIFU_3BSLICE16 30 0 -miri MIRIFU_CHANNEL3C 30 0 -miri MIRIFU_3CSLICE01 30 0 -miri MIRIFU_3CSLICE02 30 0 -miri MIRIFU_3CSLICE03 30 0 -miri MIRIFU_3CSLICE04 30 0 -miri MIRIFU_3CSLICE05 30 0 -miri MIRIFU_3CSLICE06 30 0 -miri MIRIFU_3CSLICE07 30 0 -miri MIRIFU_3CSLICE08 30 0 -miri MIRIFU_3CSLICE09 30 0 -miri MIRIFU_3CSLICE10 30 0 -miri MIRIFU_3CSLICE11 30 0 -miri MIRIFU_3CSLICE12 30 0 -miri MIRIFU_3CSLICE13 30 0 -miri MIRIFU_3CSLICE14 30 0 -miri MIRIFU_3CSLICE15 30 0 -miri MIRIFU_3CSLICE16 30 0 -miri MIRIFU_CHANNEL4A 30 0 -miri MIRIFU_4ASLICE01 30 0 -miri MIRIFU_4ASLICE02 30 0 -miri MIRIFU_4ASLICE03 30 0 -miri MIRIFU_4ASLICE04 30 0 -miri MIRIFU_4ASLICE05 30 0 -miri MIRIFU_4ASLICE06 30 0 -miri MIRIFU_4ASLICE07 30 0 -miri MIRIFU_4ASLICE08 30 0 -miri MIRIFU_4ASLICE09 30 0 -miri MIRIFU_4ASLICE10 30 0 -miri MIRIFU_4ASLICE11 30 0 -miri MIRIFU_4ASLICE12 30 0 -miri MIRIFU_CHANNEL4B 30 0 -miri MIRIFU_4BSLICE01 30 0 -miri MIRIFU_4BSLICE02 30 0 -miri MIRIFU_4BSLICE03 30 0 -miri MIRIFU_4BSLICE04 30 0 -miri MIRIFU_4BSLICE05 30 0 -miri MIRIFU_4BSLICE06 30 0 -miri MIRIFU_4BSLICE07 30 0 -miri MIRIFU_4BSLICE08 30 0 -miri MIRIFU_4BSLICE09 30 0 -miri MIRIFU_4BSLICE10 30 0 -miri MIRIFU_4BSLICE11 30 0 -miri MIRIFU_4BSLICE12 30 0 -miri MIRIFU_CHANNEL4C 30 0 -miri MIRIFU_4CSLICE01 30 0 -miri MIRIFU_4CSLICE02 30 0 -miri MIRIFU_4CSLICE03 30 0 -miri MIRIFU_4CSLICE04 30 0 -miri MIRIFU_4CSLICE05 30 0 -miri MIRIFU_4CSLICE06 30 0 -miri MIRIFU_4CSLICE07 30 0 -miri MIRIFU_4CSLICE08 30 0 -miri MIRIFU_4CSLICE09 30 0 -miri MIRIFU_4CSLICE10 30 0 -miri MIRIFU_4CSLICE11 30 0 -miri MIRIFU_4CSLICE12 30 0 -nirspec NRS1_FULL_OSS 10 0 -nirspec NRS1_FULL 10 0 -nirspec NRS2_FULL_OSS 10 0 -nirspec NRS2_FULL 10 0 -nirspec NRS_S200A1_SLIT 30 0 -nirspec NRS_S200A2_SLIT 30 0 -nirspec NRS_S400A1_SLIT 30 0 -nirspec NRS_S1600A1_SLIT 30 0 -nirspec NRS_S200B1_SLIT 30 0 -nirspec NRS_FULL_IFU 10 0 -nirspec NRS_IFU_SLICE00 30 0 -nirspec NRS_IFU_SLICE01 30 0 -nirspec NRS_IFU_SLICE02 30 0 -nirspec NRS_IFU_SLICE03 30 0 -nirspec NRS_IFU_SLICE04 30 0 -nirspec NRS_IFU_SLICE05 30 0 -nirspec NRS_IFU_SLICE06 30 0 -nirspec NRS_IFU_SLICE07 30 0 -nirspec NRS_IFU_SLICE08 30 0 -nirspec NRS_IFU_SLICE09 30 0 -nirspec NRS_IFU_SLICE10 30 0 -nirspec NRS_IFU_SLICE11 30 0 -nirspec NRS_IFU_SLICE12 30 0 -nirspec NRS_IFU_SLICE13 30 0 -nirspec NRS_IFU_SLICE14 30 0 -nirspec NRS_IFU_SLICE15 30 0 -nirspec NRS_IFU_SLICE16 30 0 -nirspec NRS_IFU_SLICE17 30 0 -nirspec NRS_IFU_SLICE18 30 0 -nirspec NRS_IFU_SLICE19 30 0 -nirspec NRS_IFU_SLICE20 30 0 -nirspec NRS_IFU_SLICE21 30 0 -nirspec NRS_IFU_SLICE22 30 0 -nirspec NRS_IFU_SLICE23 30 0 -nirspec NRS_IFU_SLICE24 30 0 -nirspec NRS_IFU_SLICE25 30 0 -nirspec NRS_IFU_SLICE26 30 0 -nirspec NRS_IFU_SLICE27 30 0 -nirspec NRS_IFU_SLICE28 30 0 -nirspec NRS_IFU_SLICE29 30 0 -nirspec NRS_FULL_MSA 10 0 -nirspec NRS_FULL_MSA1 10 0 -nirspec NRS_FULL_MSA2 10 0 -nirspec NRS_FULL_MSA3 10 0 -nirspec NRS_FULL_MSA4 10 0 -nirspec NRS_VIGNETTED_MSA 30 0 -nirspec NRS_VIGNETTED_MSA1 30 0 -nirspec NRS_VIGNETTED_MSA2 30 0 -nirspec NRS_VIGNETTED_MSA3 30 0 -nirspec NRS_VIGNETTED_MSA4 30 0 -nirspec NRS_FIELD1_MSA4 30 0 -nirspec NRS_FIELD2_MSA4 30 0 -nirspec NRS1_FP1MIMF 30 0 -nirspec NRS1_FP2MIMF 30 0 -nirspec NRS1_FP3MIMF 30 0 -nirspec NRS2_FP4MIMF 30 0 -nirspec NRS2_FP5MIMF 30 0 -nirspec CLEAR_GWA_OTE 30 0 -nirspec F110W_GWA_OTE 30 0 -nirspec F140X_GWA_OTE 30 0 -nirspec NRS_SKY_OTEIP 30 0 -nirspec NRS_CLEAR_OTEIP_MSA_L0 30 0 -nirspec NRS_CLEAR_OTEIP_MSA_L1 30 0 -nirspec NRS_F070LP_OTEIP_MSA_L0 30 0 -nirspec NRS_F070LP_OTEIP_MSA_L1 30 0 -nirspec NRS_F100LP_OTEIP_MSA_L0 30 0 -nirspec NRS_F100LP_OTEIP_MSA_L1 30 0 -nirspec NRS_F170LP_OTEIP_MSA_L0 30 0 -nirspec NRS_F170LP_OTEIP_MSA_L1 30 0 -nirspec NRS_F290LP_OTEIP_MSA_L0 30 0 -nirspec NRS_F290LP_OTEIP_MSA_L1 30 0 -nirspec NRS_F110W_OTEIP_MSA_L0 30 0 -nirspec NRS_F110W_OTEIP_MSA_L1 30 0 -nirspec NRS_F140X_OTEIP_MSA_L0 30 0 -nirspec NRS_F140X_OTEIP_MSA_L1 30 0 -fgs FGS1_FULL_OSS 10 0 -fgs FGS1_FULL 10 0 -fgs FGS2_FULL_OSS 10 0 -fgs FGS2_FULL 10 0 -fgs FGS1_SUB128LL 30 0 -fgs FGS1_SUB128DIAG 30 0 -fgs FGS1_SUB128CNTR 30 0 -fgs FGS1_SUB32LL 30 0 -fgs FGS1_SUB32DIAG 30 0 -fgs FGS1_SUB32CNTR 30 0 -fgs FGS1_SUB8LL 30 0 -fgs FGS1_SUB8DIAG 30 0 -fgs FGS1_SUB8CNTR 30 0 -fgs FGS2_SUB128LL 30 0 -fgs FGS2_SUB128DIAG 30 0 -fgs FGS2_SUB128CNTR 30 0 -fgs FGS2_SUB32LL 30 0 -fgs FGS2_SUB32DIAG 30 0 -fgs FGS2_SUB32CNTR 30 0 -fgs FGS2_SUB8LL 30 0 -fgs FGS2_SUB8DIAG 30 0 -fgs FGS2_SUB8CNTR 30 0 -fgs FGS1_FP1MIMF 30 0 -fgs FGS1_FP2MIMF 30 0 -fgs FGS1_FP3MIMF 30 0 -fgs FGS1_FP4MIMF 30 0 -fgs FGS1_FP5MIMF 30 0 -fgs FGS2_FP1MIMF 30 0 -fgs FGS2_FP2MIMF 30 0 -fgs FGS2_FP3MIMF 30 0 -fgs FGS2_FP4MIMF 30 0 -fgs FGS2_FP5MIMF 30 0 +miri MIRIM_BRIGHTSKY 1 0 +miri MIRIM_SUB256 1 0 +miri MIRIM_SUB128 1 0 +miri MIRIM_SUB64 1 0 +miri MIRIM_SLITLESSPRISM 1 0 +miri MIRIM_MASK1065 1 0 +miri MIRIM_MASK1140 1 0 +miri MIRIM_MASK1550 1 0 +miri MIRIM_MASKLYOT 1 0 +miri MIRIM_CORON1065 1 0 +miri MIRIM_CORON1140 1 0 +miri MIRIM_CORON1550 1 0 +miri MIRIM_CORONLYOT 1 0 +miri MIRIM_SLIT 1 0 +miri MIRIFU_CHANNEL1A 1 0 +miri MIRIFU_CHANNEL1B 1 0 +miri MIRIFU_CHANNEL1C 1 0 +miri MIRIFU_CHANNEL2A 1 0 +miri MIRIFU_CHANNEL2B 1 0 +miri MIRIFU_CHANNEL2C 1 0 +miri MIRIFU_CHANNEL3A 1 0 +miri MIRIFU_CHANNEL3B 1 0 +miri MIRIFU_CHANNEL3C 1 0 +miri MIRIFU_CHANNEL4A 1 0 +miri MIRIFU_CHANNEL4B 1 0 +miri MIRIFU_CHANNEL4C 1 0 +nirspec NRS1_FULL 1 0 +nirspec NRS2_FULL 1 0 +nirspec NRS_S200A1_SLIT 1 0 +nirspec NRS_S200A2_SLIT 1 0 +nirspec NRS_S400A1_SLIT 1 0 +nirspec NRS_S1600A1_SLIT 1 0 +nirspec NRS_S200B1_SLIT 1 0 +nirspec NRS_FULL_IFU 1 0 +nirspec NRS_FULL_MSA 1 0 +fgs FGS1_FULL 1 0 +fgs FGS2_FULL 1 0 +fgs FGS1_SUB128CNTR 1 0 +fgs FGS2_SUB128CNTR 1 0 diff --git a/jwql/shared_tasks/shared_tasks.py b/jwql/shared_tasks/shared_tasks.py index 516738ed0..070c0483d 100644 --- a/jwql/shared_tasks/shared_tasks.py +++ b/jwql/shared_tasks/shared_tasks.py @@ -231,7 +231,7 @@ def run_subprocess(name, cmd, outputs, cal_dir, ins, in_file, short_name, res_fi process = Popen(command, shell=True, executable="/bin/bash", stderr=PIPE) with process.stderr: log_subprocess_output(process.stderr) - result = process.wait() + result = process.wait() logging.info("Subprocess result was {}".format(result)) if not os.path.isfile(res_file): @@ -241,7 +241,7 @@ def run_subprocess(name, cmd, outputs, cal_dir, ins, in_file, short_name, res_fi for line in status: logging.error(line.strip()) return status - + with open(res_file, 'r') as inf: status = inf.readlines() return status @@ -251,17 +251,17 @@ def run_subprocess(name, cmd, outputs, cal_dir, ins, in_file, short_name, res_fi def run_calwebb_detector1(input_file_name, short_name, ext_or_exts, instrument, step_args={}): """Run the steps of ``calwebb_detector1`` on the input file, saving the result of each step as a separate output file, then return the name-and-path of the file as reduced - in the reduction directory. Once all requested extensions have been produced, the + in the reduction directory. Once all requested extensions have been produced, the pipeline will return. Parameters ---------- input_file_name : str File on which to run the pipeline steps - + short_name : str Name of the file to be calibrated after any extensions have been stripped off. - + ext_or_exts : list List of extensions to be retrieved. @@ -291,7 +291,7 @@ def run_calwebb_detector1(input_file_name, short_name, ext_or_exts, instrument, output_dir = os.path.join(config['transfer_dir'], "outgoing") msg = "Input from {}, calibrate in {}, output to {}" logging.info(msg.format(input_dir, cal_dir, output_dir)) - + input_file = os.path.join(input_dir, input_file_name) current_dir = os.path.dirname(__file__) cmd_name = os.path.join(current_dir, "run_pipeline.py") @@ -308,9 +308,9 @@ def run_calwebb_detector1(input_file_name, short_name, ext_or_exts, instrument, logging.info("Requesting {}".format(calibrated_files)) cores = 'all' - status = run_subprocess(cmd_name, "cal", outputs, cal_dir, instrument, input_file, + status = run_subprocess(cmd_name, "cal", outputs, cal_dir, instrument, input_file, short_name, result_file, cores) - + if status[-1].strip() == "SUCCEEDED": logging.info("Subprocess reports successful finish.") else: @@ -323,7 +323,7 @@ def run_calwebb_detector1(input_file_name, short_name, ext_or_exts, instrument, logging.error("\t{}".format(line.strip())) if core_fail: cores = "half" - status = run_subprocess(cmd_name, "cal", outputs, cal_dir, instrument, + status = run_subprocess(cmd_name, "cal", outputs, cal_dir, instrument, input_file, short_name, result_file, cores) if status[-1].strip() == "SUCCEEDED": logging.info("Subprocess reports successful finish.") @@ -337,7 +337,7 @@ def run_calwebb_detector1(input_file_name, short_name, ext_or_exts, instrument, logging.error("\t{}".format(line.strip())) if core_fail: cores = "none" - status = run_subprocess(cmd_name, "cal", outputs, cal_dir, instrument, + status = run_subprocess(cmd_name, "cal", outputs, cal_dir, instrument, input_file, short_name, result_file, cores) if status[-1].strip() == "SUCCEEDED": logging.info("Subprocess reports successful finish.") @@ -346,7 +346,7 @@ def run_calwebb_detector1(input_file_name, short_name, ext_or_exts, instrument, logging.error("Pipeline subprocess failed.") if not managed: raise ValueError("Pipeline Failed") - + for file in calibrated_files: logging.info("Checking for output {}".format(file)) if not os.path.isfile(os.path.join(cal_dir, file)): @@ -420,14 +420,14 @@ def calwebb_detector1_save_jump(input_file_name, instrument, ramp_fit=True, save short_name = input_file_name.replace("_uncal", "").replace("_0thgroup", "").replace(".fits", "") ensure_dir_exists(cal_dir) output_dir = os.path.join(config["transfer_dir"], "outgoing") - + cmd_name = os.path.join(os.path.dirname(__file__), "run_pipeline.py") result_file = os.path.join(cal_dir, short_name+"_status.txt") cores = 'all' - status = run_subprocess(cmd_name, "jump", "all", cal_dir, instrument, input_file, + status = run_subprocess(cmd_name, "jump", "all", cal_dir, instrument, input_file, short_name, result_file, cores) - + if status[-1].strip() == "SUCCEEDED": logging.info("Subprocess reports successful finish.") else: @@ -440,7 +440,7 @@ def calwebb_detector1_save_jump(input_file_name, instrument, ramp_fit=True, save logging.error("\t{}".format(line.strip())) if core_fail: cores = "half" - status = run_subprocess(cmd_name, "jump", "all", cal_dir, instrument, + status = run_subprocess(cmd_name, "jump", "all", cal_dir, instrument, input_file, short_name, result_file, cores) if status[-1].strip() == "SUCCEEDED": logging.info("Subprocess reports successful finish.") @@ -454,7 +454,7 @@ def calwebb_detector1_save_jump(input_file_name, instrument, ramp_fit=True, save logging.error("\t{}".format(line.strip())) if core_fail: cores = "none" - status = run_subprocess(cmd_name, "jump", "all", cal_dir, instrument, + status = run_subprocess(cmd_name, "jump", "all", cal_dir, instrument, input_file, short_name, result_file, cores) if status[-1].strip() == "SUCCEEDED": logging.info("Subprocess reports successful finish.") @@ -762,7 +762,7 @@ def run_parallel_pipeline(input_files, in_ext, ext_or_exts, instrument, jump_pip file_or_files : str or list-of-str Name (or names) of the result file(s), including path(s) """ - logging.info("Pipeline call requestion calibrated extensions {}".format(ext_or_exts)) + logging.info("Pipeline call requesting calibrated extensions {}".format(ext_or_exts)) for input_file in input_files: logging.info("\tCalibrating {}".format(input_file)) diff --git a/jwql/website/apps/jwql/monitor_pages/monitor_dark_bokeh.py b/jwql/website/apps/jwql/monitor_pages/monitor_dark_bokeh.py index e601127fd..9b7c44bc5 100755 --- a/jwql/website/apps/jwql/monitor_pages/monitor_dark_bokeh.py +++ b/jwql/website/apps/jwql/monitor_pages/monitor_dark_bokeh.py @@ -60,7 +60,7 @@ class DarkHistPlot(): plot : bokeh.figure Figure containing the histogram plot """ - def __init__(self, aperture, data): + def __init__(self, aperture, data, obsdate): """Create the plot Parameters @@ -74,6 +74,7 @@ def __init__(self, aperture, data): """ self.data = data self.aperture = aperture + self.obsdate = obsdate self.create_plot() def calc_bin_edges(self, centers): @@ -109,7 +110,7 @@ def create_plot(self): else: use_amp = '1' - title_str = f'{self.aperture}: Dark Rate Histogram' + title_str = f'{self.aperture}: Dark Rate Histogram. {self.obsdate.strftime("%d %b %Y")}' x_label = 'Dark Rate (DN/sec)' y_label = 'Number of Pixels' @@ -462,7 +463,7 @@ def __init__(self, instrument): # Retrieve data from database. Since the mean dark image plots are # produced by the dark monitor itself, all we need for that is the - # name of the file. then we need the histogram and trending data. All + # name of the file. Then we need the histogram and trending data. All # of this is in the dark monitor stats table. No need to query the # dark monitor pixel table. self.db.retrieve_data(self.aperture, get_pixtable_for_detector=False) @@ -479,7 +480,7 @@ def __init__(self, instrument): self.get_trending_data() # Now that we have all the data, create the acutal plots - self.hist_plots[aperture] = DarkHistPlot(self.aperture, self.hist_data).plot + self.hist_plots[aperture] = DarkHistPlot(self.aperture, self.hist_data, self.hist_date).plot self.trending_plots[aperture] = DarkTrendPlot(self.aperture, self.mean_dark, self.stdev_dark, self.obstime).plot def ensure_all_full_frame_apertures(self): @@ -549,12 +550,15 @@ def get_latest_histogram_data(self): most_recent_idx = np.where(self._entry_dates > (latest_date - delta_time))[0] # Store the histogram data in a dictionary where the keys are the - # amplifier values (note that these are strings e.g. '1''), and the + # amplifier values (note that these are strings e.g. '1'), and the # values are tuples of (x, y) lists for idx in most_recent_idx: self.hist_data[self.db.stats_data[idx].amplifier] = (self.db.stats_data[idx].hist_dark_values, self.db.stats_data[idx].hist_amplitudes) + # Keep track of the observation date of the most recent entry + self.hist_date = self.db.stats_data[most_recent_idx[0].obs_mid_time] + def get_trending_data(self): """Organize data for the trending plot. Here we need all the data for the aperture. Keep amplifier-specific data separated. @@ -576,7 +580,6 @@ def stats_data_to_lists(self): """Create arrays from some of the stats database columns that are used by multiple plot types """ - #apertures = np.array([e.aperture for e in self.db.stats_data]) self._amplifiers = np.array([e.amplifier for e in self.db.stats_data]) self._entry_dates = np.array([e.entry_date for e in self.db.stats_data]) self._mean = np.array([e.mean for e in self.db.stats_data])