def evaluate(self, x, K, alpha, xc, beta, piv): if (alpha < beta): raise ModelAssertionViolation("Alpha cannot be less than beta") idx = x < (alpha - beta) * xc # The K * 0 part is a trick so that out will have the right units (if the input # has units) out = np.zeros(x.shape) * K * 0 out[idx] = K * np.power(x[idx] / piv, alpha) * np.exp(-x[idx] / xc) out[~idx] = K * np.power((alpha - beta) * xc / piv, alpha - beta) * np.exp(beta - alpha) * \ np.power(x[~idx] / piv, beta) return out
def evaluate(self, x, K, alpha, xp, beta, piv): E0 = old_div(xp, (2 + alpha)) if alpha < beta: raise ModelAssertionViolation("Alpha cannot be less than beta") if isinstance(x, astropy_units.Quantity): alpha_ = alpha.value beta_ = alpha.value K_ = K.value E0_ = E0.value piv_ = piv.value x_ = x.value unit_ = self.y_unit else: unit_ = 1.0 alpha_, beta_, K_, piv_, x_, E0_ = alpha, beta, K, piv, x, E0 return nb_func.band_eval(x_, K_, alpha_, beta_, E0_, piv_) * unit_
def evaluate(self, x, alpha, beta, xp, F, a, b, opt): assert opt == 0 or opt == 1, "Opt must be either 0 or 1" if alpha < beta: raise ModelAssertionViolation("Alpha cannot be smaller than beta") if alpha < -2: raise ModelAssertionViolation("Alpha cannot be smaller than -2") # Cutoff energy if alpha == -2: Ec = xp / 0.0001 # TRICK: avoid a=-2 else: Ec = xp / (2 + alpha) # Split energy Esplit = (alpha - beta) * Ec # Evaluate model integrated flux and normalization if isinstance(alpha, astropy_units.Quantity): # The following functions do not allow the use of units alpha_ = alpha.value Ec_ = Ec.value a_ = a.value b_ = b.value Esplit_ = Esplit.value beta_ = beta.value unit_ = self.x_unit else: alpha_, Ec_, a_, b_, Esplit_, beta_ = alpha, Ec, a, b, Esplit, beta unit_ = 1.0 if opt == 0: # Cutoff power law intflux = self.ggrb_int_cpl(alpha_, Ec_, a_, b_) else: # Band model if a <= Esplit and Esplit <= b: intflux = (self.ggrb_int_cpl(alpha_, Ec_, a_, Esplit_) + self.ggrb_int_pl(alpha_, beta_, Ec_, Esplit_, b_)) else: if Esplit < a: intflux = self.ggrb_int_pl(alpha_, beta_, Ec_, a_, b_) else: raise RuntimeError("Esplit > emax!") erg2keV = 6.24151e8 norm = F * erg2keV / (intflux * unit_) if opt == 0: # Cutoff power law flux = np.power(x / Ec, alpha) * np.exp(-x / Ec) else: # The norm * 0 is to keep the units right flux = np.zeros(x.shape) * norm * 0 idx = x < Esplit flux[idx] = norm * np.power(x[idx] / Ec, alpha) * np.exp( -x[idx] / Ec) flux[~idx] = norm * pow(alpha - beta, alpha - beta) * math.exp(beta - alpha) * np.power( x[~idx] / Ec, beta) return flux
def evaluate(self, x, alpha, beta, xp, F, a, b, opt): assert opt == 0 or opt == 1, "Opt must be either 0 or 1" if alpha < beta: raise ModelAssertionViolation("Alpha cannot be smaller than beta") if alpha < -2: raise ModelAssertionViolation("Alpha cannot be smaller than -2") # Cutoff energy if alpha == -2: Ec = old_div(xp, 0.0001) # TRICK: avoid a=-2 else: Ec = old_div(xp, (2 + alpha)) # Split energy Esplit = (alpha - beta) * Ec # Evaluate model integrated flux and normalization if isinstance(alpha, astropy_units.Quantity): # The following functions do not allow the use of units alpha_ = alpha.value Ec_ = Ec.value a_ = a.value b_ = b.value Esplit_ = Esplit.value beta_ = beta.value x_ = x.value unit_ = self.x_unit else: alpha_, Ec_, a_, b_, Esplit_, beta_, x_ = alpha, Ec, a, b, Esplit, beta, x unit_ = 1.0 if opt == 0: # Cutoff power law intflux = self.ggrb_int_cpl(alpha_, Ec_, a_, b_) else: # Band model if a <= Esplit and Esplit <= b: intflux = self.ggrb_int_cpl( alpha_, Ec_, a_, Esplit_ ) + nb_func.ggrb_int_pl(alpha_, beta_, Ec_, Esplit_, b_) else: if Esplit < a: intflux = nb_func.ggrb_int_pl(alpha_, beta_, Ec_, a_, b_) else: intflux = nb_func.ggrb_int_cpl(alpha_, Ec_, a_, b_) norm = F * erg2keV / (intflux * unit_) if opt == 0: # Cutoff power law flux = nb_func.cplaw_eval(x_, 1.0, Ec_, alpha_, Ec_) # flux = norm * np.power(old_div(x, Ec), alpha) * \ # np.exp(old_div(- x, Ec)) else: # The norm * 0 is to keep the units right flux = nb_func.band_eval(x_, 1.0, alpha_, beta_, Ec_, Ec_) return norm * flux