Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
PyFstat
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Gregory Ashton
PyFstat
Commits
8ffae7e2
Commit
8ffae7e2
authored
8 years ago
by
Gregory Ashton
Browse files
Options
Downloads
Patches
Plain Diff
Adds in-memory injection capabilities
parent
5d115632
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
pyfstat/core.py
+52
-18
52 additions, 18 deletions
pyfstat/core.py
pyfstat/mcmc_based_searches.py
+10
-10
10 additions, 10 deletions
pyfstat/mcmc_based_searches.py
tests.py
+23
-0
23 additions, 0 deletions
tests.py
with
85 additions
and
28 deletions
pyfstat/core.py
+
52
−
18
View file @
8ffae7e2
...
...
@@ -151,9 +151,9 @@ class ComputeFstat(object):
@helper_functions.initializer
def
__init__
(
self
,
tref
,
sftfilepath
=
None
,
minStartTime
=
None
,
maxStartTime
=
None
,
binary
=
False
,
transient
=
True
,
BSGL
=
False
,
detector
=
None
,
minCoverFreq
=
None
,
maxCoverFreq
=
None
,
detector
s
=
None
,
minCoverFreq
=
None
,
maxCoverFreq
=
None
,
earth_ephem
=
None
,
sun_ephem
=
None
,
injectSources
=
None
,
assumeSqrtSX
=
None
):
injectSqrtSX
=
None
,
assumeSqrtSX
=
None
):
"""
Parameters
----------
...
...
@@ -170,9 +170,9 @@ class ComputeFstat(object):
If true, allow for the Fstat to be computed over a transient range.
BSGL: bool
If true, compute the BSGL rather than the twoF value.
detector: str
detector
s
: str
Two character reference to the data to use, specify None for no
contraint.
contraint.
If multiple-separate by comma.
minCoverFreq, maxCoverFreq: float
The min and max cover frequency passed to CreateFstatInput, if
either is None the range of frequencies in the SFT less 1Hz is
...
...
@@ -181,6 +181,11 @@ class ComputeFstat(object):
Paths of the two files containing positions of Earth and Sun,
respectively at evenly spaced times, as passed to CreateFstatInput.
If None defaults defined in BaseSearchClass will be used.
injectSources: dict or str
Either a dictionary of the values to inject, or a string pointing
to the .cff file to inject
injectSqrtSX:
Not yet implemented
assumeSqrtSX: float
Don
'
t estimate noise-floors but assume (stationary) per-IFO
sqrt{SX} (if single value: use for all IFOs). If signal only,
...
...
@@ -198,10 +203,32 @@ class ComputeFstat(object):
def
get_SFTCatalog
(
self
):
if
hasattr
(
self
,
'
SFTCatalog
'
):
return
if
self
.
sftfilepath
is
None
:
for
k
in
[
'
minStartTime
'
,
'
maxStartTime
'
,
'
detectors
'
]:
if
getattr
(
self
,
k
)
is
None
:
raise
ValueError
(
'
You must provide
"
{}
"
to injectSources
'
.
format
(
k
))
C1
=
getattr
(
self
,
'
injectSources
'
,
None
)
is
None
C2
=
getattr
(
self
,
'
injectSqrtSX
'
,
None
)
is
None
if
C1
and
C2
:
raise
ValueError
(
'
You must specify either one of injectSources
'
'
or injectSqrtSX
'
)
SFTCatalog
=
lalpulsar
.
SFTCatalog
()
Tsft
=
1800
Toverlap
=
0
Tspan
=
self
.
maxStartTime
-
self
.
minStartTime
detNames
=
lal
.
CreateStringVector
(
*
[
d
for
d
in
self
.
detectors
.
split
(
'
,
'
)])
multiTimestamps
=
lalpulsar
.
MakeMultiTimestamps
(
self
.
minStartTime
,
Tspan
,
Tsft
,
Toverlap
,
detNames
.
length
)
SFTCatalog
=
lalpulsar
.
MultiAddToFakeSFTCatalog
(
SFTCatalog
,
detNames
,
multiTimestamps
)
return
SFTCatalog
logging
.
info
(
'
Initialising SFTCatalog
'
)
constraints
=
lalpulsar
.
SFTConstraints
()
if
self
.
detector
:
constraints
.
detector
=
self
.
detector
if
self
.
detector
s
:
constraints
.
detector
s
=
self
.
detector
s
if
self
.
minStartTime
:
constraints
.
minStartTime
=
lal
.
LIGOTimeGPS
(
self
.
minStartTime
)
if
self
.
maxStartTime
:
...
...
@@ -231,12 +258,12 @@ class ComputeFstat(object):
int
(
SFT_timestamps
[
-
1
]),
subprocess
.
check_output
(
'
lalapps_tconvert {}
'
.
format
(
int
(
SFT_timestamps
[
-
1
])),
shell
=
True
).
rstrip
(
'
\n
'
)))
self
.
SFTCatalog
=
SFTCatalog
return
SFTCatalog
def
init_computefstatistic_single_point
(
self
):
"""
Initilisation step of run_computefstatistic for a single point
"""
self
.
get_SFTCatalog
()
SFTCatalog
=
self
.
get_SFTCatalog
()
logging
.
info
(
'
Initialising ephems
'
)
ephems
=
lalpulsar
.
InitBarycenter
(
self
.
earth_ephem
,
self
.
sun_ephem
)
...
...
@@ -254,7 +281,6 @@ class ComputeFstat(object):
FstatOAs
.
Dterms
=
lalpulsar
.
FstatOptionalArgsDefaults
.
Dterms
FstatOAs
.
runningMedianWindow
=
lalpulsar
.
FstatOptionalArgsDefaults
.
runningMedianWindow
FstatOAs
.
FstatMethod
=
lalpulsar
.
FstatOptionalArgsDefaults
.
FstatMethod
FstatOAs
.
InjectSqrtSX
=
lalpulsar
.
FstatOptionalArgsDefaults
.
injectSqrtSX
if
self
.
assumeSqrtSX
is
None
:
FstatOAs
.
assumeSqrtSX
=
lalpulsar
.
FstatOptionalArgsDefaults
.
assumeSqrtSX
else
:
...
...
@@ -282,20 +308,28 @@ class ComputeFstat(object):
if
'
t0
'
not
in
self
.
injectSources
:
PP
.
Transient
.
type
=
lalpulsar
.
TRANSIENT_NONE
FstatOAs
.
injectSources
=
PPV
if
hasattr
(
self
,
'
injectSources
'
)
and
type
(
self
.
injectSources
)
==
str
:
logging
.
info
(
'
Injecting source from param file: {}
'
.
format
(
self
.
injectSources
))
PPV
=
lalpulsar
.
PulsarParamsFromFile
(
self
.
injectSources
,
self
.
tref
)
FstatOAs
.
injectSources
=
PPV
else
:
FstatOAs
.
injectSources
=
lalpulsar
.
FstatOptionalArgsDefaults
.
injectSources
if
hasattr
(
self
,
'
injectSqrtSX
'
)
and
self
.
injectSqrtSX
is
not
None
:
raise
ValueError
(
'
injectSqrtSX not implemented
'
)
else
:
FstatOAs
.
InjectSqrtSX
=
lalpulsar
.
FstatOptionalArgsDefaults
.
injectSqrtSX
if
self
.
minCoverFreq
is
None
or
self
.
maxCoverFreq
is
None
:
fAs
=
[
d
.
header
.
f0
for
d
in
self
.
SFTCatalog
.
data
]
fAs
=
[
d
.
header
.
f0
for
d
in
SFTCatalog
.
data
]
fBs
=
[
d
.
header
.
f0
+
(
d
.
numBins
-
1
)
*
d
.
header
.
deltaF
for
d
in
self
.
SFTCatalog
.
data
]
for
d
in
SFTCatalog
.
data
]
self
.
minCoverFreq
=
np
.
min
(
fAs
)
+
0.5
self
.
maxCoverFreq
=
np
.
max
(
fBs
)
-
0.5
logging
.
info
(
'
Min/max cover freqs not provided, using
'
'
{} and {}, est. from SFTs
'
.
format
(
self
.
minCoverFreq
,
self
.
maxCoverFreq
))
self
.
FstatInput
=
lalpulsar
.
CreateFstatInput
(
self
.
SFTCatalog
,
self
.
FstatInput
=
lalpulsar
.
CreateFstatInput
(
SFTCatalog
,
self
.
minCoverFreq
,
self
.
maxCoverFreq
,
dFreq
,
...
...
@@ -316,7 +350,7 @@ class ComputeFstat(object):
if
self
.
BSGL
:
if
len
(
self
.
detector_names
)
<
2
:
raise
ValueError
(
"
Can
'
t use BSGL with single detector data
"
)
raise
ValueError
(
"
Can
'
t use BSGL with single detector
s
data
"
)
else
:
logging
.
info
(
'
Initialising BSGL
'
)
...
...
@@ -471,7 +505,7 @@ class SemiCoherentSearch(BaseSearchClass, ComputeFstat):
def
__init__
(
self
,
label
,
outdir
,
tref
,
nsegs
=
None
,
sftfilepath
=
None
,
binary
=
False
,
BSGL
=
False
,
minStartTime
=
None
,
maxStartTime
=
None
,
minCoverFreq
=
None
,
maxCoverFreq
=
None
,
detector
=
None
,
earth_ephem
=
None
,
sun_ephem
=
None
,
detector
s
=
None
,
earth_ephem
=
None
,
sun_ephem
=
None
,
injectSources
=
None
,
assumeSqrtSX
=
None
):
"""
Parameters
...
...
@@ -583,7 +617,7 @@ class SemiCoherentGlitchSearch(BaseSearchClass, ComputeFstat):
def
__init__
(
self
,
label
,
outdir
,
tref
,
minStartTime
,
maxStartTime
,
nglitch
=
0
,
sftfilepath
=
None
,
theta0_idx
=
0
,
BSGL
=
False
,
minCoverFreq
=
None
,
maxCoverFreq
=
None
,
assumeSqrtSX
=
None
,
detector
=
None
,
earth_ephem
=
None
,
sun_ephem
=
None
):
detector
s
=
None
,
earth_ephem
=
None
,
sun_ephem
=
None
):
"""
Parameters
----------
...
...
@@ -682,7 +716,7 @@ class Writer(BaseSearchClass):
dtglitch
=
None
,
delta_phi
=
0
,
delta_F0
=
0
,
delta_F1
=
0
,
delta_F2
=
0
,
tref
=
None
,
F0
=
30
,
F1
=
1e-10
,
F2
=
0
,
Alpha
=
5e-3
,
Delta
=
6e-2
,
h0
=
0.1
,
cosi
=
0.0
,
psi
=
0.0
,
phi
=
0
,
Tsft
=
1800
,
outdir
=
"
.
"
,
sqrtSX
=
1
,
Band
=
4
,
detector
=
'
H1
'
,
outdir
=
"
.
"
,
sqrtSX
=
1
,
Band
=
4
,
detector
s
=
'
H1
'
,
minStartTime
=
None
,
maxStartTime
=
None
,
add_noise
=
True
):
"""
Parameters
...
...
@@ -888,7 +922,7 @@ transientTauDays={:1.3f}\n""")
cl
.
append
(
'
--outSingleSFT=TRUE
'
)
cl
.
append
(
'
--outSFTdir=
"
{}
"'
.
format
(
self
.
outdir
))
cl
.
append
(
'
--outLabel=
"
{}
"'
.
format
(
self
.
label
))
cl
.
append
(
'
--IFOs=
"
{}
"'
.
format
(
self
.
detector
))
cl
.
append
(
'
--IFOs=
"
{}
"'
.
format
(
self
.
detector
s
))
if
self
.
add_noise
:
cl
.
append
(
'
--sqrtSX=
"
{}
"'
.
format
(
self
.
sqrtSX
))
if
self
.
minStartTime
is
None
:
...
...
This diff is collapsed.
Click to expand it.
pyfstat/mcmc_based_searches.py
+
10
−
10
View file @
8ffae7e2
...
...
@@ -28,7 +28,7 @@ class MCMCSearch(BaseSearchClass):
nwalkers
=
100
,
ntemps
=
1
,
log10temperature_min
=-
5
,
theta_initial
=
None
,
scatter_val
=
1e-10
,
binary
=
False
,
BSGL
=
False
,
minCoverFreq
=
None
,
maxCoverFreq
=
None
,
detector
=
None
,
earth_ephem
=
None
,
maxCoverFreq
=
None
,
detector
s
=
None
,
earth_ephem
=
None
,
sun_ephem
=
None
,
injectSources
=
None
,
assumeSqrtSX
=
None
):
"""
Parameters
...
...
@@ -60,7 +60,7 @@ class MCMCSearch(BaseSearchClass):
generated from np.logspace(0, log10temperature_min, ntemps).
binary: Bool
If true, search over binary parameters
detector: str
detector
s
: str
Two character reference to the data to use, specify None for no
contraint.
minCoverFreq, maxCoverFreq: float
...
...
@@ -112,7 +112,7 @@ class MCMCSearch(BaseSearchClass):
tref
=
self
.
tref
,
sftfilepath
=
self
.
sftfilepath
,
minCoverFreq
=
self
.
minCoverFreq
,
maxCoverFreq
=
self
.
maxCoverFreq
,
earth_ephem
=
self
.
earth_ephem
,
sun_ephem
=
self
.
sun_ephem
,
detector
=
self
.
detector
,
BSGL
=
self
.
BSGL
,
transient
=
False
,
detector
s
=
self
.
detector
s
,
BSGL
=
self
.
BSGL
,
transient
=
False
,
minStartTime
=
self
.
minStartTime
,
maxStartTime
=
self
.
maxStartTime
,
binary
=
self
.
binary
,
injectSources
=
self
.
injectSources
,
assumeSqrtSX
=
self
.
assumeSqrtSX
)
...
...
@@ -1016,7 +1016,7 @@ class MCMCGlitchSearch(MCMCSearch):
minStartTime
,
maxStartTime
,
nglitch
=
1
,
nsteps
=
[
100
,
100
],
nwalkers
=
100
,
ntemps
=
1
,
log10temperature_min
=-
5
,
theta_initial
=
None
,
scatter_val
=
1e-10
,
dtglitchmin
=
1
*
86400
,
theta0_idx
=
0
,
detector
=
None
,
BSGL
=
False
,
minCoverFreq
=
None
,
theta0_idx
=
0
,
detector
s
=
None
,
BSGL
=
False
,
minCoverFreq
=
None
,
maxCoverFreq
=
None
,
earth_ephem
=
None
,
sun_ephem
=
None
):
"""
Parameters
...
...
@@ -1060,7 +1060,7 @@ class MCMCGlitchSearch(MCMCSearch):
Index (zero-based) of which segment the theta refers to - uyseful
if providing a tight prior on theta to allow the signal to jump
too theta (and not just from)
detector: str
detector
s
: str
Two character reference to the data to use, specify None for no
contraint.
minCoverFreq, maxCoverFreq: float
...
...
@@ -1104,7 +1104,7 @@ class MCMCGlitchSearch(MCMCSearch):
tref
=
self
.
tref
,
minStartTime
=
self
.
minStartTime
,
maxStartTime
=
self
.
maxStartTime
,
minCoverFreq
=
self
.
minCoverFreq
,
maxCoverFreq
=
self
.
maxCoverFreq
,
earth_ephem
=
self
.
earth_ephem
,
sun_ephem
=
self
.
sun_ephem
,
detector
=
self
.
detector
,
BSGL
=
self
.
BSGL
,
sun_ephem
=
self
.
sun_ephem
,
detector
s
=
self
.
detector
s
,
BSGL
=
self
.
BSGL
,
nglitch
=
self
.
nglitch
,
theta0_idx
=
self
.
theta0_idx
)
def
logp
(
self
,
theta_vals
,
theta_prior
,
theta_keys
,
search
):
...
...
@@ -1263,10 +1263,10 @@ class MCMCGlitchSearch(MCMCSearch):
class
MCMCSemiCoherentSearch
(
MCMCSearch
):
"""
MCMC search for a signal using the semi-coherent ComputeFstat
"""
@helper_functions.initializer
def
__init__
(
self
,
label
,
outdir
,
sftfilepath
,
theta_prior
,
tref
,
def
__init__
(
self
,
label
,
outdir
,
theta_prior
,
tref
,
sftfilepath
=
None
,
nsegs
=
None
,
nsteps
=
[
100
,
100
,
100
],
nwalkers
=
100
,
binary
=
False
,
ntemps
=
1
,
log10temperature_min
=-
5
,
theta_initial
=
None
,
scatter_val
=
1e-10
,
detector
=
None
,
BSGL
=
False
,
scatter_val
=
1e-10
,
detector
s
=
None
,
BSGL
=
False
,
minStartTime
=
None
,
maxStartTime
=
None
,
minCoverFreq
=
None
,
maxCoverFreq
=
None
,
earth_ephem
=
None
,
sun_ephem
=
None
,
injectSources
=
None
,
assumeSqrtSX
=
None
):
...
...
@@ -1304,7 +1304,7 @@ class MCMCSemiCoherentSearch(MCMCSearch):
nsegs
=
self
.
nsegs
,
sftfilepath
=
self
.
sftfilepath
,
binary
=
self
.
binary
,
BSGL
=
self
.
BSGL
,
minStartTime
=
self
.
minStartTime
,
maxStartTime
=
self
.
maxStartTime
,
minCoverFreq
=
self
.
minCoverFreq
,
maxCoverFreq
=
self
.
maxCoverFreq
,
detector
=
self
.
detector
,
maxCoverFreq
=
self
.
maxCoverFreq
,
detector
s
=
self
.
detector
s
,
earth_ephem
=
self
.
earth_ephem
,
sun_ephem
=
self
.
sun_ephem
,
injectSources
=
self
.
injectSources
,
assumeSqrtSX
=
self
.
assumeSqrtSX
)
...
...
@@ -1641,7 +1641,7 @@ class MCMCTransientSearch(MCMCSearch):
tref
=
self
.
tref
,
sftfilepath
=
self
.
sftfilepath
,
minCoverFreq
=
self
.
minCoverFreq
,
maxCoverFreq
=
self
.
maxCoverFreq
,
earth_ephem
=
self
.
earth_ephem
,
sun_ephem
=
self
.
sun_ephem
,
detector
=
self
.
detector
,
transient
=
True
,
detector
s
=
self
.
detector
s
,
transient
=
True
,
minStartTime
=
self
.
minStartTime
,
maxStartTime
=
self
.
maxStartTime
,
BSGL
=
self
.
BSGL
,
binary
=
self
.
binary
)
...
...
This diff is collapsed.
Click to expand it.
tests.py
+
23
−
0
View file @
8ffae7e2
...
...
@@ -123,6 +123,29 @@ class TestComputeFstat(Test):
print
predicted_FS
,
FS
self
.
assertTrue
(
np
.
abs
(
predicted_FS
-
FS
)
/
FS
<
0.2
)
def
test_injectSources_from_file
(
self
):
Writer
=
pyfstat
.
Writer
(
self
.
label
,
outdir
=
outdir
,
add_noise
=
False
)
Writer
.
make_cff
()
injectSources
=
Writer
.
config_file_name
search
=
pyfstat
.
ComputeFstat
(
tref
=
Writer
.
tref
,
assumeSqrtSX
=
1
,
injectSources
=
injectSources
,
minCoverFreq
=
28
,
maxCoverFreq
=
32
,
minStartTime
=
Writer
.
tstart
,
maxStartTime
=
Writer
.
tstart
+
Writer
.
duration
,
detectors
=
Writer
.
detectors
)
FS
=
search
.
run_computefstatistic_single_point
(
Writer
.
tstart
,
Writer
.
tend
,
Writer
.
F0
,
Writer
.
F1
,
Writer
.
F2
,
Writer
.
Alpha
,
Writer
.
Delta
)
Writer
.
make_data
()
predicted_FS
=
Writer
.
predict_fstat
()
print
predicted_FS
,
FS
self
.
assertTrue
(
np
.
abs
(
predicted_FS
-
FS
)
/
FS
<
0.2
)
class
TestSemiCoherentGlitchSearch
(
Test
):
label
=
"
Test
"
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment