def get_current_and_upcoming_variables(self, instrument_name): """ Fetches the instrument variables for: - The next run number - Upcoming run numbers - Upcoming known experiments as a tuple of (current_variables, upcoming_variables_by_run, upcoming_variables_by_experiment) """ instrument = InstrumentUtils().get_instrument(instrument_name) completed_status = StatusUtils().get_completed() # First, we find the latest run number to determine what's upcoming. try: latest_completed_run_number = ReductionRun.objects.filter( instrument=instrument, run_version=0, status=completed_status).order_by( '-run_number').first().run_number except AttributeError: latest_completed_run_number = 1 # Then we find all the upcoming runs and force updating of all subsequent variables. upcoming_run_variables = InstrumentVariable.objects.filter( instrument=instrument, start_run__isnull=False, start_run__gt=latest_completed_run_number + 1).order_by('start_run') upcoming_run_numbers = set( [var.start_run for var in upcoming_run_variables]) [ self.show_variables_for_run(instrument_name, run_number) for run_number in upcoming_run_numbers ] # Get the most recent run variables. current_variables = self.show_variables_for_run( instrument_name, latest_completed_run_number) if not current_variables: # If no variables are saved, we'll use the default ones, and set them while we're at it. current_variables = self.get_default_variables(instrument_name) self.set_variables_for_runs(instrument_name, current_variables) # And then select the variables for all subsequent run numbers; collect the immediate upcoming variables and all subsequent sets. upcoming_variables_by_run = self.show_variables_for_run( instrument_name, latest_completed_run_number + 1) upcoming_variables_by_run += list( InstrumentVariable.objects.filter( instrument=instrument, start_run__in=upcoming_run_numbers).order_by('start_run')) # Get the upcoming experiments, and then select all variables for these experiments. upcoming_experiments = [] with ICATCommunication() as icat: upcoming_experiments = list( icat.get_upcoming_experiments_for_instrument(instrument_name)) upcoming_variables_by_experiment = InstrumentVariable.objects.filter( instrument=instrument, experiment_reference__in=upcoming_experiments).order_by( 'experiment_reference') return current_variables, upcoming_variables_by_run, upcoming_variables_by_experiment
def open_icat(self): """ Try to open an ICAT session, if we don't have one already. """ try: if self.icat is None: self.icat = ICATCommunication(**self.kwargs) except Exception as e: logger.error("Failed to connect to ICAT: %s - %s" % (type(e).__name, e)) raise ICATConnectionException()
def get_current_and_upcoming_variables(self, instrument_name, last_run_object=None): """ :param instrument_name: The name of the instrument :param last_run_object: Optionally provide an object of the last run on the instrument Fetches the instrument variables for: - The next run number - Upcoming run numbers - Upcoming known experiments as a tuple of (current_variables, upcoming_variables_by_run, upcoming_variables_by_experiment) """ instrument = InstrumentUtils().get_instrument(instrument_name) completed_status = StatusUtils().get_completed() # First, we find the latest run number to determine what's upcoming. try: if last_run_object and last_run_object.status.value_verbose( ) == 'Completed': latest_completed_run_number = last_run_object.run_number else: latest_completed_run_number = ReductionRun.objects.filter(instrument=instrument, run_version=0, status=completed_status)\ .order_by('-run_number').first().run_number except AttributeError: latest_completed_run_number = 1 # Then we find all the upcoming runs and force updating of all subsequent variables. # pylint:disable=no-member upcoming_run_variables = InstrumentVariable.objects.\ filter(instrument=instrument, start_run__isnull=False, start_run__gt=latest_completed_run_number + 1).order_by('start_run') upcoming_run_numbers = set( [var.start_run for var in upcoming_run_variables]) # pylint:disable=expression-not-assigned [ self.show_variables_for_run(instrument_name, run_number) for run_number in upcoming_run_numbers ] # Get the most recent run variables. current_variables = self.show_variables_for_run( instrument_name, latest_completed_run_number) if not current_variables: # If no variables are saved, we'll use the default ones, and set them while we're at it. current_variables = self.get_default_variables(instrument_name) self.set_variables_for_runs(instrument_name, current_variables) # And then select the variables for all subsequent run numbers; # collect the immediate upcoming variables and all subsequent sets. upcoming_variables_by_run = self.show_variables_for_run( instrument_name, latest_completed_run_number + 1) # pylint:disable=no-member upcoming_variables_by_run += list( InstrumentVariable.objects.filter( instrument=instrument, start_run__in=upcoming_run_numbers).order_by('start_run')) # Get the upcoming experiments, and then select all variables for these experiments. upcoming_experiments = [] with ICATCommunication() as icat: upcoming_experiments = list( icat.get_upcoming_experiments_for_instrument(instrument_name)) # pylint:disable=line-too-long,no-member upcoming_variables_by_experiment = InstrumentVariable.objects.\ filter(instrument=instrument, experiment_reference__in=upcoming_experiments).order_by('experiment_reference') return current_variables, upcoming_variables_by_run, upcoming_variables_by_experiment