def write2db(self, db_conn, percentiles): #,scenario_id,target,social): #def __write2db(self,scenario_id,target,economic,physical,social): ''' Writes the resulting losses to the risk schema Must be called AFTER calculate() ''' fat_labels = self._fatalities_labels dist = self.__fat fatalities_prob_dist =[v for v in glb.discretepdf(dist, fat_labels)] exc ='INSERT INTO risk.social_conseq (session_id, scenario_id, geocell_id, target_id, fatalities_prob_dist) VALUES (%s, %s, %s, %s, %s)' values = (self.__session_id, self.__scenario_id, self.__geocell_id, self.__target_id, fatalities_prob_dist) db_conn.execute(exc, values)
def write2db(self, db_conn, percentiles): #,scenario_id,target,social): #def __write2db(self,scenario_id,target,economic,physical,social): ''' Writes the resulting losses to the risk schema Must be called AFTER calculate() ''' fat_labels = self._fatalities_labels dist = self.__fat est_fat_perc = dist.percentile([0.05, 0.95]) #5th and 95th percentiles est_fat = [v for v in est_fat_perc] fatalities_prob_dist = [v for v in glb.discretepdf(dist, fat_labels)] fatalities_prob_dist.append( dist.percentile(0.5) if isinstance(dist, mcerp.UncertainFunction ) else dist) #fatalities_prob_dist.append(np.percentile(self.__fat._mcpts,0.5).astype(int)) exc = 'INSERT INTO risk.social_conseq (session_id, scenario_id, geocell_id, target_id, est_fatalities, fatalities_prob_dist) VALUES (%s, %s, %s, %s, %s, %s)' values = (self.__session_id, self.__scenario_id, self.__geocell_id, self.__target_id, est_fat, fatalities_prob_dist) db_conn.execute(exc, values)
def geocell_run(intensity, lat_sta, lon_sta, percentiles, target_id, geocell_id, ground_motion_only, scenario_id, session_id, logdir = None ): """ Performs a ground motion calculation given the above arguments. Writes to database the percentiles """ def val(value): #value should be either a scalar number or a numpy.ndarray element. Check below is WEAK, because it checks only if #len(value) can be called, but it avoids importing numpy etcetera return mcerp.UncertainFunction(value) if hasattr(value, '__len__') else float(value) try: #intensity = gmpe_func(val(M), val(lat_hyp), val(lon_hyp), val(depth_hyp), lat_sta, lon_sta) #intensity = gmpe_func(lat_sta, lon_sta) #INTENSITY IS EITHER A SCALAR OR A UNCERTAINFUNCTION.MCERP ARRAY (NUMPTY ARRAY) intensity = val(intensity) # _p = intensity.percentile(percentiles) if isinstance(intensity, mcerp.UncertainFunction) else len(percentiles)*[intensity] _dist = [v for v in globals.discretepdf(intensity,_intensity_labels)] _dist.append(intensity.percentile(0.5) if isinstance(intensity, mcerp.UncertainFunction) else intensity) #write to dbase arg1 = """INSERT INTO processing.ground_motion (target_id, geocell_id, scenario_id, session_id, ground_motion) VALUES (%s, %s, %s, %s, %s);""" arg2 = (target_id, geocell_id, scenario_id, session_id, _dist) # arg1 = """INSERT INTO processing.ground_motion (target_id, geocell_id, scenario_id, session_id, percentiles, ground_motion) VALUES (%s, %s, %s, %s, %s, %s);""" # arg2 = (target_id, geocell_id, scenario_id, session_id, _p, _dist) conn = globals.connection() conn.execute(arg1, arg2) conn.close() #do risk calculation (risk is Michael source, modified by me) if not ground_motion_only: risk_calc.calculaterisk(intensity, percentiles, session_id, scenario_id, target_id, geocell_id) except Exception as run_exc: if _DEBUG_: import traceback traceback.print_exc() #connect to the database and write the failed number: conn = globals.connection() conn.execute("UPDATE processing.sessions SET num_targets_failed = num_targets_failed + 1 where gid=%s",(session_id,)) conn.close() # log dir must be passed as argument problems when declaring global var (maybe multiprocess?) if _DEBUG_: if logdir is not None: try: folder = logdir if os.path.exists(folder): name = ''.join(random.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') for _ in range(10)) if geocell_id is None else str(geocell_id) file = os.path.join(folder, name+".log") output = open(file,'w') traceback.print_exc(file=output) output.close() except: traceback.print_exc()
def geocell_run(intensity, lat_sta, lon_sta, percentiles, target_id, geocell_id, ground_motion_only, scenario_id, session_id, logdir=None): """ Performs a ground motion calculation given the above arguments. Writes to database the percentiles """ def val(value): #value should be either a scalar number or a numpy.ndarray element. Check below is WEAK, because it checks only if #len(value) can be called, but it avoids importing numpy etcetera return mcerp.UncertainFunction(value) if hasattr( value, '__len__') else float(value) try: #intensity = gmpe_func(val(M), val(lat_hyp), val(lon_hyp), val(depth_hyp), lat_sta, lon_sta) #intensity = gmpe_func(lat_sta, lon_sta) #INTENSITY IS EITHER A SCALAR OR A UNCERTAINFUNCTION.MCERP ARRAY (NUMPTY ARRAY) intensity = val(intensity) # _p = intensity.percentile(percentiles) if isinstance(intensity, mcerp.UncertainFunction) else len(percentiles)*[intensity] _dist = [v for v in globals.discretepdf(intensity, _intensity_labels)] _dist.append( intensity.percentile(0.5) if isinstance(intensity, mcerp.UncertainFunction) else intensity) #write to dbase arg1 = """INSERT INTO processing.ground_motion (target_id, geocell_id, scenario_id, session_id, ground_motion) VALUES (%s, %s, %s, %s, %s);""" arg2 = (target_id, geocell_id, scenario_id, session_id, _dist) # arg1 = """INSERT INTO processing.ground_motion (target_id, geocell_id, scenario_id, session_id, percentiles, ground_motion) VALUES (%s, %s, %s, %s, %s, %s);""" # arg2 = (target_id, geocell_id, scenario_id, session_id, _p, _dist) conn = globals.connection() conn.execute(arg1, arg2) conn.close() #do risk calculation (risk is Michael source, modified by me) if not ground_motion_only: risk_calc.calculaterisk(intensity, percentiles, session_id, scenario_id, target_id, geocell_id) except Exception as run_exc: if _DEBUG_: import traceback traceback.print_exc() #connect to the database and write the failed number: conn = globals.connection() conn.execute( "UPDATE processing.sessions SET num_targets_failed = num_targets_failed + 1 where gid=%s", (session_id, )) conn.close() # log dir must be passed as argument problems when declaring global var (maybe multiprocess?) if _DEBUG_: if logdir is not None: try: folder = logdir if os.path.exists(folder): name = ''.join( random.choice( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') for _ in range(10)) if geocell_id is None else str( geocell_id) file = os.path.join(folder, name + ".log") output = open(file, 'w') traceback.print_exc(file=output) output.close() except: traceback.print_exc()