def get_pmap(self, src, s_sites, rup_indep=True): """ :param src: a hazardlib source :param s_sites: the sites affected by it :returns: the probability map generated by the source """ imts = self.imts sitecol = s_sites.complete N, M = len(sitecol), len(imts) fewsites = N <= self.max_sites_disagg rupdata = RupData(self) nrups, nsites = 0, 0 L, G = len(self.imtls.array), len(self.gsims) poemap = ProbabilityMap(L, G) for rup, sites in self._gen_rup_sites(src, s_sites): try: with self.ctx_mon: r_sites, dctx = self.make_contexts(sites, rup) except FarAwayRupture: continue with self.gmf_mon: mean_std = numpy.zeros((2, len(r_sites), M, G)) for g, gsim in enumerate(self.gsims): dctx_ = dctx.roundup(gsim.minimum_distance) mean_std[:, :, :, g] = gsim.get_mean_std(r_sites, rup, dctx_, imts) with self.poe_mon: pairs = zip(r_sites.sids, self._make_pnes(rup, mean_std)) with self.pne_mon: if rup_indep: for sid, pne in pairs: poemap.setdefault(sid, rup_indep).array *= pne else: for sid, pne in pairs: poemap.setdefault( sid, rup_indep).array += (1. - pne) * rup.weight nrups += 1 nsites += len(r_sites) if fewsites: # store rupdata rupdata.add(rup, src.id, r_sites, dctx) poemap.nrups = nrups poemap.nsites = nsites poemap.data = rupdata.data return poemap
def get_pmap(self, src, s_sites, rup_indep=True): """ :param src: a hazardlib source :param s_sites: the sites affected by it :returns: the probability map generated by the source """ imts = self.imts fewsites = len(s_sites.complete) <= self.max_sites_disagg rupdata = RupData(self) nrups, nsites = 0, 0 L, G = len(self.imtls.array), len(self.gsims) poemap = ProbabilityMap(L, G) dists = [] for rup, sites, maxdist in self._gen_rup_sites(src, s_sites): if maxdist is not None: dists.append(maxdist) try: with self.ctx_mon: r_sites, dctx = self.make_contexts(sites, rup, maxdist) except FarAwayRupture: continue with self.gmf_mon: mean_std = base.get_mean_std( # shape (2, N, M, G) r_sites, rup, dctx, imts, self.gsims) with self.poe_mon: pairs = zip(r_sites.sids, self._make_pnes(rup, mean_std)) with self.pne_mon: if rup_indep: for sid, pne in pairs: poemap.setdefault(sid, rup_indep).array *= pne else: for sid, pne in pairs: poemap.setdefault(sid, rup_indep).array += ( 1.-pne) * rup.weight nrups += 1 nsites += len(r_sites) if fewsites: # store rupdata rupdata.add(rup, src.id, r_sites, dctx) poemap.nrups = nrups poemap.nsites = nsites poemap.maxdist = numpy.mean(dists) if dists else None poemap.data = rupdata.data return poemap