Exemplo n.º 1
0
 def get_elements(self, aei_data: List[str]) -> Iterable[str]:
     """
     :param aei_data:
     :return:
     """
     for orbital_elements in self._get_body_orbital_elements(aei_data):
         small_body = orbital_elements.small_body
         resonant_phase = self._resonance.compute_resonant_phase(
             _get_longitudes(orbital_elements.big_bodies + [small_body]))
         resonant_phase = cutoff_angle(resonant_phase)
         resonance_data = "%f %f %s %s\n" % (
             orbital_elements.small_body.time, resonant_phase,
             orbital_elements.small_body.serialize_as_asteroid(),
             ' '.join([x.serialize_as_planet() for x in orbital_elements.big_bodies])
         )
         yield resonance_data
Exemplo n.º 2
0
    def get_time_breaks(self) -> List[float]:
        """Find circulations in file.
        """
        result_breaks = []  # circulation breaks by OX
        p_break = 0
        previous_resonant_phase = None
        prev_year = None

        if not self._in_serialized_phases:
            raise NoPhaseException('no resonant phases for resonance_id: %i' %
                                   self._resonance_id)

        for phase in self._in_serialized_phases:
            # If the distance (OY axis) between new point and previous morf
            # than PI then there is a break (circulation)
            if self._is_for_apocentric:
                resonant_phase = cutoff_angle(phase['value'] + math.pi)
            else:
                resonant_phase = phase['value']
            if resonant_phase:
                if (previous_resonant_phase and
                        (abs(previous_resonant_phase - resonant_phase) >= math.pi)):
                    c_break = 1 if (previous_resonant_phase - resonant_phase) > 0 else -1

                    # For apocentric libration there could be some breaks by
                    # following schema: break on 2*Pi, then break on 2*Pi e.t.c
                    # So if the breaks are on the same value there is no
                    # circulation at this moment
                    if (c_break != p_break) and (p_break != 0):
                        del result_breaks[len(result_breaks) - 1]

                    assert prev_year is not None
                    result_breaks.append(prev_year)
                    p_break = c_break

            previous_resonant_phase = resonant_phase
            prev_year = phase['year']

        return result_breaks
Exemplo n.º 3
0
def test_compute_resonant_phase(asteroid_mockcls, jupiter_mockcls, saturn_mockcls,
                                jupiter, saturn, asteroid, cutoffed_resonant_phase,
                                jupiter_coeffs, saturn_coeffs, asteroid_coeffs):
    asteroid_mock = asteroid_mockcls()
    asteroid_mock.longitude_coeff = asteroid_coeffs[LONG]
    asteroid_mock.perihelion_longitude_coeff = asteroid_coeffs[PERI]

    jupiter_mock = jupiter_mockcls()
    jupiter_mock.longitude_coeff = jupiter_coeffs[LONG]
    jupiter_mock.perihelion_longitude_coeff = jupiter_coeffs[PERI]

    saturn_mock = saturn_mockcls()
    saturn_mock.longitude_coeff = saturn_coeffs[LONG]
    saturn_mock.perihelion_longitude_coeff = saturn_coeffs[PERI]

    resonance = ThreeBodyResonance()
    resonance.first_body = jupiter_mock
    resonance.second_body = saturn_mock
    resonance.small_body = asteroid_mock

    resonant_phase = resonance.compute_resonant_phase(jupiter, saturn, asteroid)

    assert cutoff_angle(resonant_phase) == cutoffed_resonant_phase
Exemplo n.º 4
0
 def get_resonant_phases(self, aei_data: List[str]) -> Iterable[Tuple[float, float]]:
     for orbital_elements in self._get_body_orbital_elements(aei_data):
         small_body = orbital_elements.small_body
         resonant_phase = self._resonance.compute_resonant_phase(
             *_get_longitudes(orbital_elements.big_bodies + [small_body]))
         yield small_body.time, cutoff_angle(resonant_phase)
Exemplo n.º 5
0
def plot(start: int, stop: int, phase_storage: PhaseStorage, for_librations: bool,
         integers: List[str], aei_paths: Tuple[str, ...], is_recursive: bool, planets: Tuple[str],
         output: str, build_phases: bool):
    is_s3 = _is_s3(output)
    is_tar = _is_tar(output)
    tarf = None
    s3_bucket_key = None

    if is_tar:
        output_dir = opjoin(PROJECT_DIR, '.output')
    else:
        output_dir = output

    if is_s3:
        if not is_tar:
            logging.error('You must point tar archive in AWS S3 bucket.')
            exit(-1)
        output = opjoin(PROJECT_DIR, os.path.basename(output))
        s3_bucket_key = create_aws_s3_key(CONFIG['s3']['access_key'],
                                          CONFIG['s3']['secret_key'],
                                          CONFIG['s3']['bucket'], output)

    output_images = opjoin(output_dir, CONFIG['output']['images'])
    output_res_path = opjoin(output_dir, CONFIG['output']['angle'])
    output_gnu_path = opjoin(output_dir, CONFIG['output']['gnuplot'])

    pathbuilder = FilepathBuilder(aei_paths, is_recursive)
    planet_aei_paths = [pathbuilder.build('%s.aei' % x) for x in planets]
    resmaker = ResfileMaker(planets, planet_aei_paths)

    if not os.path.exists(output_images):
        os.makedirs(output_images)

    if not os.path.exists(output_gnu_path):
        os.makedirs(output_gnu_path)

    phase_builder = PhaseBuilder(phase_storage)
    orbital_element_sets = None
    if build_phases:
        orbital_element_sets = build_bigbody_elements(planet_aei_paths)
    phase_loader = PhaseLoader(phase_storage)
    aei_getter = AEIDataGetter(pathbuilder)

    if is_tar:
        tarf = tarfile.open(output, 'w')

    for resonance, aei_data in get_aggregated_resonances(start, stop, for_librations, planets,
                                                         aei_getter, integers):
        if build_phases:
            orbital_elem_set_facade = ResonanceOrbitalElementSetFacade(
                orbital_element_sets, resonance)
            phase_builder.build(aei_data, resonance.id, orbital_elem_set_facade)
        phases = phase_loader.load(resonance.id)
        apocentric_phases = [cutoff_angle(x + pi) for x in phases]
        res_filepath = opjoin(output_res_path, 'A%i_%i.res' %
                              (resonance.asteroid_number, resonance.id))
        gnu_filepath = opjoin(output_gnu_path, 'A%i_%i.gnu' %
                              (resonance.asteroid_number, resonance.id))

        title = 'Asteroid %i %s %s' % (resonance.asteroid_number, str(resonance), ' '.join(planets))
        resmaker.make(phases, aei_data, res_filepath)
        png_path = opjoin(PROJECT_DIR, output_images, 'A%i-res%i%s.png' % (
            resonance.asteroid_number, resonance.id, ''))
        make_plot(res_filepath, gnu_filepath, png_path, title)
        if is_tar:
            tarf.add(png_path, arcname=os.path.basename(png_path))

        resmaker.make(apocentric_phases, aei_data, res_filepath)
        png_path = opjoin(PROJECT_DIR, output_images, 'A%i-res%i%s.png' % (
            resonance.asteroid_number, resonance.id, '-apocentric'))
        make_plot(res_filepath, gnu_filepath, png_path, title)
        if is_tar:
            tarf.add(png_path, arcname=os.path.basename(png_path))

    if is_tar:
        tarf.close()
        shutil.rmtree(output_dir, True)

    if is_s3:
        s3_bucket_key.set_contents_from_filename(output)