def setUp(self, *args): self.numtests = 1000 self.precision = 1e-8 self.f_lower = 10. # create some component masses to work with self.m1 = numpy.random.uniform(1., 100., size=self.numtests) self.m2 = numpy.random.uniform(1., 100., size=self.numtests) # create some spins to work with spin_angledist = distributions.UniformSolidAngle() rvals = spin_angledist.rvs(size=self.numtests) self.spin1_polar = rvals['theta'] self.spin1_az = rvals['phi'] self.spin1_amp = numpy.random.uniform(0., 1., size=self.numtests) rvals = spin_angledist.rvs(size=self.numtests) self.spin2_polar = rvals['theta'] self.spin2_az = rvals['phi'] self.spin2_amp = numpy.random.uniform(0., 1., size=self.numtests) # calculate derived parameters from each self.mp = conversions.primary_mass(self.m1, self.m2) self.ms = conversions.secondary_mass(self.m1, self.m2) self.mtotal = conversions.mtotal_from_mass1_mass2(self.m1, self.m2) self.q = conversions.q_from_mass1_mass2(self.m1, self.m2) self.invq = conversions.invq_from_mass1_mass2(self.m1, self.m2) self.mchirp = conversions.mchirp_from_mass1_mass2(self.m1, self.m2) self.eta = conversions.eta_from_mass1_mass2(self.m1, self.m2) self.tau0 = conversions.tau0_from_mtotal_eta(self.mtotal, self.eta, self.f_lower) self.tau3 = conversions.tau3_from_mtotal_eta(self.mtotal, self.eta, self.f_lower) self.spin1x, self.spin1y, self.spin1z = \ coordinates.spherical_to_cartesian(self.spin1_amp, self.spin1_az, self.spin1_polar) self.spin2x, self.spin2y, self.spin2z = \ coordinates.spherical_to_cartesian(self.spin2_amp, self.spin2_az, self.spin2_polar) self.effective_spin = conversions.chi_eff(self.m1, self.m2, self.spin1z, self.spin2z) self.primary_spinx = conversions.primary_spin(self.m1, self.m2, self.spin1x, self.spin2x) self.primary_spiny = conversions.primary_spin(self.m1, self.m2, self.spin1y, self.spin2y) self.primary_spinz = conversions.primary_spin(self.m1, self.m2, self.spin1z, self.spin2z) self.secondary_spinx = conversions.secondary_spin(self.m1, self.m2, self.spin1x, self.spin2x) self.secondary_spiny = conversions.secondary_spin(self.m1, self.m2, self.spin1y, self.spin2y) self.secondary_spinz = conversions.secondary_spin(self.m1, self.m2, self.spin1z, self.spin2z)
def get_found_param(injfile, bankfile, trigfile, param, ifo): """ Translates some popular trigger parameters into functions that calculate them from an hdf found injection file Parameters ---------- injfile: hdf5 File object Injection file of format known to ANitz (DOCUMENTME) bankfile: hdf5 File object or None Template bank file trigfile: hdf5 File object or None Single-detector trigger file param: string Parameter to be calculated for the recovered triggers ifo: string or None Standard ifo name, ex. 'L1' Returns ------- [return value]: NumPy array of floats The calculated parameter values """ foundtmp = injfile["found_after_vetoes/template_id"][:] if trigfile is not None: # get the name of the ifo in the injection file, eg "detector_1" # and the integer from that name ifolabel = [name for name, val in injfile.attrs.items() if \ "detector" in name and val == ifo][0] foundtrg = injfile["found_after_vetoes/trigger_id" + ifolabel[-1]] if bankfile is not None and param in bankfile.keys(): return bankfile[param][:][foundtmp] elif trigfile is not None and param in trigfile[ifo].keys(): return trigfile[ifo][param][:][foundtrg] else: b = bankfile found_param_dict = { "mtotal" : (b['mass1'][:] + b['mass2'][:])[foundtmp], "mchirp" : conversions.mchirp_from_mass1_mass2(b['mass1'][:], b['mass2'][:])[foundtmp], "eta" : conversions.eta_from_mass1_mass2(b['mass1'][:], b['mass2'][:])[foundtmp], "effective_spin" : conversions.chi_eff(b['mass1'][:], b['mass2'][:], b['spin1z'][:], b['spin2z'][:])[foundtmp] } return found_param_dict[param]
def get_param(par, args, m1, m2, s1z, s2z): """ Helper function Parameters ---------- par : string Name of parameter to calculate args : Namespace object returned from ArgumentParser instance Calling code command line options, used for f_lower value m1 : float or array of floats First binary component mass (etc.) Returns ------- parvals : float or array of floats Calculated parameter values """ if par == 'mchirp': parvals, _ = pnutils.mass1_mass2_to_mchirp_eta(m1, m2) elif par == 'mtotal': parvals = m1 + m2 elif par =='eta': parvals = conversions.eta_from_mass1_mass2(m1, m2) elif par in ['chi_eff', 'effective_spin']: parvals = conversions.chi_eff(m1, m2, s1z, s2z) elif par == 'template_duration': # default to SEOBNRv4 duration function parvals = pnutils.get_imr_duration(m1, m2, s1z, s2z, args.f_lower, args.approximant or "SEOBNRv4") if args.min_duration: parvals += args.min_duration elif par == 'tau0': parvals = conversions.tau0_from_mass1_mass2(m1, m2, args.f_lower) elif par == 'tau3': parvals = conversions.tau3_from_mass1_mass2(m1, m2, args.f_lower) elif par in pnutils.named_frequency_cutoffs.keys(): parvals = pnutils.frequency_cutoff_from_name(par, m1, m2, s1z, s2z) else: # try asking for a LALSimulation frequency function parvals = pnutils.get_freq(par, m1, m2, s1z, s2z) return parvals
def get_inj_param(injfile, param, ifo): """ Translates some popular injection parameters into functions that calculate them from an hdf found injection file Parameters ---------- injfile: hdf5 File object Injection file of format known to ANitz (DOCUMENTME) param: string Parameter to be calculated for the injected signals ifo: string Standard detector name, ex. 'L1' Returns ------- [return value]: NumPy array of floats The calculated parameter values """ det = pycbc.detector.Detector(ifo) time_delay = numpy.vectorize(#lambda dec, ra, t : det.time_delay_from_earth_center)#(dec, ra, t)) inj = injfile["injections"] if param in inj.keys(): return inj["injections/"+param] inj_param_dict = { "mtotal" : inj['mass1'][:] + inj['mass2'][:], "mchirp" : conversions.mchirp_from_mass1_mass2(inj['mass1'][:], inj['mass2'][:]), "eta" : conversions.eta_from_mass1_mass2(inj['mass1'][:], inj['mass2'][:]), "effective_spin" : conversions.chi_eff(inj['mass1'][:], inj['mass2'][:], inj['spin1z'][:], inj['spin2z'][:]), "end_time_"+ifo[0].lower() : inj['end_time'][:] + time_delay(inj['longitude'][:], inj['latitude'][:], inj['end_time'][:]), } return inj_param_dict[param]
def inverse_transform(self, maps): """ This function transforms from component masses and cartesian spins to mass-weighted spin parameters aligned with the angular momentum. Parameters ---------- maps : a mapping object Returns ------- out : dict A dict with key as parameter name and value as numpy.array or float of transformed values. """ out = { parameters.chi_eff : conversions.chi_eff( maps[parameters.mass1], maps[parameters.mass2], maps[parameters.spin1z], maps[parameters.spin2z]), "chi_a" : conversions.chi_a( maps[parameters.mass1], maps[parameters.mass2], maps[parameters.spin1z], maps[parameters.spin2z]), } return self.format_output(maps, out)
def effective_spin(self): # FIXME assumes aligned spins return conversions.chi_eff(self.mass1, self.mass2, self.spin1z, self.spin2z)