Ejemplo n.º 1
0
class RuptureData(object):
    """
    Container for information about the ruptures of a given
    tectonic region type.
    """
    def __init__(self, trt, samples, gsims):
        self.trt = trt
        self.samples = samples
        self.cmaker = ContextMaker(trt, gsims)
        self.params = sorted(self.cmaker.REQUIRES_RUPTURE_PARAMETERS -
                             set('mag strike dip rake hypo_depth'.split()))
        self.dt = numpy.dtype([('rup_id', U32), ('source_id', SOURCE_ID),
                               ('multiplicity', U32), ('occurrence_rate', F64),
                               ('mag', F32), ('lon', F32), ('lat', F32),
                               ('depth', F32), ('strike', F32), ('dip', F32),
                               ('rake', F32), ('boundaries', hdf5.vfloat32)] +
                              [(param, F32) for param in self.params])

    def to_array(self, proxies):
        """
        Convert a list of rupture proxies into an array of dtype RuptureRata.dt
        """
        data = []
        for proxy in proxies:
            ebr = proxy.to_ebr(self.trt, self.samples)
            rup = ebr.rupture
            ctx = self.cmaker.make_rctx(rup)
            ruptparams = tuple(getattr(ctx, param) for param in self.params)
            point = rup.surface.get_middle_point()
            boundaries = rup.surface.get_surface_boundaries_3d()
            try:
                rate = ebr.rupture.occurrence_rate
            except AttributeError:  # for nonparametric sources
                rate = numpy.nan
            data.append((ebr.id, ebr.source_id, ebr.n_occ, rate, rup.mag,
                         point.x, point.y, point.z, rup.surface.get_strike(),
                         rup.surface.get_dip(), rup.rake, boundaries) +
                        ruptparams)
        return numpy.array(data, self.dt)