def make(self, src, sites, pmap, rup_data): """ :param src: a hazardlib source :param sites: the sites affected by it :returns: the probability map generated by the source """ with self.cmaker.mon('iter_ruptures', measuremem=False): self.mag_rups = [(mag, list(rups)) for mag, rups in itertools.groupby( src.iter_ruptures(shift_hypo=self.shift_hypo), key=operator.attrgetter('mag'))] rupdata = RupData(self.cmaker) totrups, numrups, nsites = 0, 0, 0 L, G = len(self.imtls.array), len(self.gsims) poemap = ProbabilityMap(L, G) for rups, sites in self._gen_rups_sites(src, sites): with self.ctx_mon: ctxs = self.cmaker.make_ctxs(rups, sites) if ctxs: totrups += len(ctxs) ctxs = self.collapse(ctxs) numrups += len(ctxs) for rup, r_sites, dctx in ctxs: if self.fewsites: # store rupdata rupdata.add(rup, r_sites, dctx) sids, poes = self._sids_poes(rup, r_sites, dctx, src.id) with self.pne_mon: pnes = rup.get_probability_no_exceedance(poes) if self.rup_indep: for sid, pne in zip(sids, pnes): poemap.setdefault(sid, self.rup_indep).array *= pne else: for sid, pne in zip(sids, pnes): poemap.setdefault( sid, self.rup_indep).array += (1. - pne) * rup.weight nsites += len(sids) poemap.totrups = totrups poemap.numrups = numrups poemap.nsites = nsites self._update(pmap, poemap, src) if len(rupdata.data): for gid in src.src_group_ids: rup_data['grp_id'].extend([gid] * numrups) for k, v in rupdata.data.items(): rup_data[k].extend(v) return poemap
def make(self): """ :param src: a hazardlib source :param s_sites: the sites affected by it :returns: the probability map generated by the source """ totrups, numrups, nsites = 0, 0, 0 L, G = len(self.imtls.array), len(self.gsims) poemap = ProbabilityMap(L, G) dists = [] for rups, sites, mdist in self._gen_rups_sites(): if mdist is not None: dists.append(mdist) with self.ctx_mon: ctxs = self.cmaker.make_ctxs(rups, sites, mdist) if ctxs: totrups += len(ctxs) ctxs = self.collapse(ctxs) numrups += len(ctxs) for rup, r_sites, dctx in ctxs: sids, poes = self._sids_poes(rup, r_sites, dctx) with self.pne_mon: pnes = rup.get_probability_no_exceedance(poes) if self.rup_indep: for sid, pne in zip(sids, pnes): poemap.setdefault(sid, self.rup_indep).array *= pne else: for sid, pne in zip(sids, pnes): poemap.setdefault( sid, self.rup_indep).array += (1. - pne) * rup.weight nsites += len(sids) poemap.totrups = totrups poemap.numrups = numrups poemap.nsites = nsites poemap.maxdist = numpy.mean(dists) if dists else None poemap.data = self.rupdata.data return poemap