def evaluate(self, x, K, piv, index, xc): if isinstance(x, astropy_units.Quantity): index_ = index.value K_ = K.value piv_ = piv.value xc_ = xc.value x_ = x.value unit_ = self.y_unit else: unit_ = 1.0 K_, piv_, x_, index_, xc_ = K, piv, x, index, xc result = nb_func.cplaw_eval(x_, K_, xc_, index_, piv_) return result * 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 = 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