from django.core.management.base import BaseCommand from apps.main.models import Experiment from django.shortcuts import get_object_or_404 import os, fnmatch import time from datetime import datetime import h5py import numpy as np class Command(BaseCommand): """ Check pedestal acquisition each 10 minutes. Example: manage.py restart_pedestal """ def handle(self, *args, **options): #start = time.time() #time.sleep(1) restart_pedestal(self) #end = time.time() #self.stdout.write(f'TIME: "{end - start}"') def check_experiment(): if len(Experiment.objects.filter(status=2)) > 0: return True else: return False def pedestal_start(self, id_exp): all_status = Experiment.objects.filter(status=2) check_id = False if len(all_status) > 0: check_id = all_status[0].pk if check_id and check_id == id_exp: exp = get_object_or_404(Experiment, pk=id_exp) name = '{}-R@{}'.format(exp.name, datetime.now().strftime('%Y-%m-%dT%H-%M-%S')) exp.pedestal.start_device(name_experiment=name) self.stdout.write(f'"{exp.name}" experiment: Pedestal acquisition was restarted') def pedestal_reset(self, id_exp): all_status = Experiment.objects.filter(status=2) check_id = False if len(all_status) > 0: check_id = all_status[0].pk if check_id and check_id == id_exp: exp = get_object_or_404(Experiment, pk=id_exp) exp.pedestal.reset_device() self.stdout.write(f'"{exp.name}" experiment: Pedestal acquisition is resetting') def pedestal_stop(self, id_exp): all_status = Experiment.objects.filter(status=2) check_id = False if len(all_status) > 0: check_id = all_status[0].pk if check_id and check_id == id_exp: exp = get_object_or_404(Experiment, pk=id_exp) exp.pedestal.stop_device() self.stdout.write(f'"{exp.name}" experiment: Pedestal acquisition was stopped') def hdf5_list_content(get_file): table_records = np.array(get_file).tolist() table_dim = get_file.ndim table_rows = get_file.shape[0] if table_dim == 1 and table_rows >= 1: #type(table_records[0]) -> float return table_records else: return False def hdf5_read(file): dataspeed = {"ele_speed": False, "azi_speed": False} for key, value in dataspeed.items(): with h5py.File(file, 'r') as hdf: get = hdf.get('Data'+'/'+key) if get is not None: # 10 values dataspeed[key] = hdf5_list_content(get)[-10:] return dataspeed def count_data(last_position): pattern = "pos@*.h5" count = 0 list_data = [] list_position = os.listdir(last_position) for entry in sorted(list_position): if fnmatch.fnmatch(entry, pattern): count = count + 1 list_data.append(os.path.join(last_position, entry)) if len(list_data) > 1: list_data = list_data[-2] else: list_data = False return count, list_data def response_data(datadir, old_path_datetime, old_position, new_position): path_position = True path_datetime = False read_files = False rootdir = os.path.join(datadir, 'position') if os.path.isdir(rootdir): path_datetime = path_data(os.path.join(datadir, 'position')) if path_datetime: if not old_path_datetime or path_datetime != old_path_datetime: old_position, read_files = count_data(path_datetime) time.sleep(65) new_position, read_files = count_data(path_datetime) else: time.sleep(65) else: path_position = False return path_position, path_datetime, old_position, new_position, read_files def path_data(rootdir): list_=[] for it in os.scandir(rootdir): if it.is_dir(): try: datetime.strptime(it.path.split("/")[-1], "%Y-%m-%dT%H-00-00") list_.append(it.path) except ValueError: pass list_ = sorted(list_, reverse=True) try: return list_[0] except: return False def check_count(datadir): old_numbers = 0 new_numbers = 0 validation = False path_datetime = False speed = {"ele_speed": False, "azi_speed": False} path_position, path_datetime, old_numbers, new_numbers, read_files = response_data(datadir, path_datetime, old_numbers, new_numbers) for u in range(2): if new_numbers > old_numbers: validation = True data = hdf5_read(read_files) for key, value in data.items(): try: if not max(data[key]) <= 0.1: speed[key] = True except: pass break else: if u < 1: path_position, path_datetime, old_numbers, new_numbers, read_files = response_data(datadir, path_datetime, old_numbers, new_numbers) return path_position, path_datetime, validation, speed def restart_pedestal(self): if check_experiment(): all_status = Experiment.objects.filter(status=2) id_exp = all_status[0].pk datadir_exp = all_status[0].reception_rx.datadir datadir_exp = datadir_exp.replace(os.environ.get('EXPOSE_NAS', '/DATA_RM/DATA'), '/data') datadir_exp = datadir_exp.replace('/rawdata', '') path_position, path_datetime, validation, speed = check_count(datadir_exp) if path_position: # Execute the process if validation: self.stdout.write(f'Acquisition pedestal is running') if speed['ele_speed'] or speed['azi_speed']: self.stdout.write(f'Pedestal speeds on Azimuth and Elevation are running') else: for key, value in speed.items(): if not value: self.stdout.write(f'Speed on {key} is <= 0.1, retry') pedestal_stop(self, id_exp) time.sleep(14) pedestal_start(self, id_exp) else: if not path_datetime: self.stdout.write(f'No such directory with datetime format "%Y-%m-%dT%H-00-00", retry!') else: self.stdout.write(f'No file increment, retry') pedestal_reset(self, id_exp) time.sleep(14) pedestal_stop(self, id_exp) time.sleep(14) pedestal_start(self, id_exp) else: self.stdout.write(f'No such directory: position, fail!')