Skip to content
Snippets Groups Projects
at_time_file.py 2.52 KiB
Newer Older
mads's avatar
mads committed
'''
Created on 24/04/2014

@author: MMPE
'''
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import division
from __future__ import absolute_import
from io import open
from builtins import range
from future import standard_library
standard_library.install_aliases()
mads's avatar
mads committed

import numpy as np
class AtTimeFile(object):
    """Loads an at time file generated by HAWC2

    >>> atfile = AtTimeFile("at_time.dat") # load file
    >>> atfile.attribute_names # Attribute names
    ['radius_s', 'twist', 'chord']
    >>> atfile[:3,1]) # first 3 twist rows
    [ 0.       -0.775186 -2.91652 ]
    >>> atfile.twist()[:3]) # first 3 twist rows
    [ 0.       -0.775186 -2.91652 ]
    >>> atfile.twist(10) # Twist at radius = 10 (interpolated)
    -5.34743208242399
    """
    def __init__(self, filename):
        with open(filename, encoding='utf-8') as fid:
mads's avatar
mads committed
            lines = fid.readlines()
        self.attribute_names = lines[2].lower().replace("#", "").split()
        data = np.array([[float(l) for l in lines[i].split() ] for i in range(3, len(lines))])
        self.data = data
        def func_factory(column):
            def values(radius=None):
                if radius is None:
                    return self.data[:, column]
                else:
                    return np.interp(radius, self.data[:, 0], self.data[:, column])
            return values
        for column, att_name in enumerate(self.attribute_names):
            setattr(self, att_name, func_factory(column))

mads's avatar
mads committed
    def curved_radius(self, radius=None):
mads's avatar
mads committed
        """Radius of calculation point(s)

        Parameters
        ----------
        radius : int or float, optional
            - if None (default): Radius of calculation points\n
            - if int or float: Radius of calculation point nearest radius

        Returns
        -------
        radius : float or array_like
            Radius of calculation points or radius of calculation point nearest radius
        """
        if radius is None:
            return self.radius_s(radius)
        else:
            return self.radius_s()[np.argmin(np.abs(self.radius_s() - radius))]

    def value(self, radius, column):
        return np.interp(radius, self.data[:, 0], self.data[:, column])

    def __getitem__(self, subset):
        return self.data[subset]


if __name__ == "__main__":
    at = AtTimeFile(r"tests/test_files/at_time.dat")
    print (at.attribute_names)
    print (at.twist(36))
    print (at.chord(36))