1- function get_total_gti_length (gti:: AbstractMatrix{<:Real} ; minlen:: Real = 0.0 )
2- lengths = diff (gti; dims = 2 )
3- return sum (x-> x > minlen ? x : zero (x), lengths)
1+ function get_total_gti_length (gti:: AbstractMatrix{<:Real} ; minlen:: Real = 0.0 )
2+ lengths = diff (gti; dims = 2 )
3+ return sum (x -> x > minlen ? x : zero (x), lengths)
44end
55
6- function load_gtis (fits_file:: String , gtistring:: String = " GTI" )
6+ function load_gtis (fits_file:: String , gtistring:: String = " GTI" )
77 gti = FITS (fits_file) do lchdulist
88 gtihdu = lchdulist[gtistring]
99 get_gti_from_hdu (gtihdu)
@@ -21,16 +21,15 @@ function get_gti_from_hdu(gtihdu::TableHDU)
2121 stopstr = " Stop"
2222 end
2323
24- gtistart = read (gtihdu,startstr)
25- gtistop = read (gtihdu,stopstr)
24+ gtistart = read (gtihdu, startstr)
25+ gtistop = read (gtihdu, stopstr)
2626
27- return mapreduce (permutedims, vcat,
28- [[a, b] for (a,b) in zip (gtistart, gtistop)])
27+ return mapreduce (permutedims, vcat, [[a, b] for (a, b) in zip (gtistart, gtistop)])
2928end
3029
3130function check_gtis (gti:: AbstractMatrix )
3231
33- if ndims (gti) != 2 || size (gti,2 ) != 2
32+ if ndims (gti) != 2 || size (gti, 2 ) != 2
3433 throw (ArgumentError (" Please check the formatting of the GTIs.
3534 They need to be provided as [[gti00 gti01]; [gti10 gti11]; ...]." ))
3635 end
@@ -39,71 +38,80 @@ function check_gtis(gti::AbstractMatrix)
3938 gti_end = @view gti[:, 2 ]
4039
4140 if any (gti_end < gti_start)
42- throw (ArgumentError (
43- " The GTI end times must be larger than the GTI start times."
44- ))
41+ throw (ArgumentError (" The GTI end times must be larger than the GTI start times." ))
4542 end
4643
4744 if any (@view (gti_start[begin + 1 : end ]) < @view (gti_end[begin : end - 1 ]))
48- throw (ArgumentError (
49- " This GTI has overlaps"
50- ))
45+ throw (ArgumentError (" This GTI has overlaps" ))
5146 end
5247end
5348
54- function create_gti_mask (times:: AbstractVector{<:Real} ,gtis:: AbstractMatrix{<:Real} ;
55- safe_interval:: AbstractVector{<:Real} = [0 ,0 ], min_length:: Real = 0 ,
56- dt:: Real = - 1 , epsilon:: Real = 0.001 )
49+ function create_gti_mask (
50+ times:: AbstractVector{<:Real} ,
51+ gtis:: AbstractMatrix{<:Real} ;
52+ safe_interval:: AbstractVector{<:Real} = [0 , 0 ],
53+ min_length:: Real = 0 ,
54+ dt:: Real = - 1 ,
55+ epsilon:: Real = 0.001 ,
56+ )
5757
5858 if isempty (times)
5959 throw (ArgumentError (" Passing an empty time array to create_gti_mask" ))
6060 end
6161
6262 check_gtis (gtis)
63- mask = zeros (Bool,length (times))
63+ mask = zeros (Bool, length (times))
6464
65- if min_length> 0
66- gtis = gtis[min_length .< @view (gtis[:,2 ]) - @view (gtis[:,1 ]),:]
67-
68- if size (gtis,1 ) < 1
65+ if min_length > 0
66+ gtis = gtis[min_length.< @view (gtis[:, 2 ])- @view (gtis[:, 1 ]), :]
67+
68+ if size (gtis, 1 ) < 1
6969 @warn " No GTIs longer than min_length $(min_length) "
7070 return mask, gtis
7171 end
72- end
72+ end
7373
7474 if dt < 0
7575 dt = Statistics. median (diff (times))
7676 end
7777 epsilon_times_dt = epsilon * dt
7878
79- new_gtis = [[0.0 , 0.0 ] for _ in range (1 ,size (gtis,1 ))]
80- new_gti_mask = zeros (Bool, size (gtis,1 ))
79+ new_gtis = [[0.0 , 0.0 ] for _ in range (1 , size (gtis, 1 ))]
80+ new_gti_mask = zeros (Bool, size (gtis, 1 ))
8181
8282 gti_start = @view gtis[:, 1 ]
8383 gti_end = @view gtis[:, 2 ]
8484
85- for (ig,(limmin,limmax)) in enumerate (zip (gti_start,gti_end))
85+ for (ig, (limmin, limmax)) in enumerate (zip (gti_start, gti_end))
8686 limmin += safe_interval[1 ]
8787 limmax -= safe_interval[2 ]
8888 if limmax - limmin >= min_length
8989 new_gtis[ig][:] .= limmin, limmax
90- for (i,t) in enumerate (times)
91- if (limmin + dt / 2 - epsilon_times_dt) <= t <= (limmax - dt / 2 + epsilon_times_dt)
90+ for (i, t) in enumerate (times)
91+ if (limmin + dt / 2 - epsilon_times_dt) <=
92+ t <=
93+ (limmax - dt / 2 + epsilon_times_dt)
9294 mask[i] = true
9395 end
9496 end
9597 new_gti_mask[ig] = true
9698 end
9799 end
98100
99- return mask, mapreduce (permutedims, vcat, keepat! (new_gtis,new_gti_mask))
101+ return mask, mapreduce (permutedims, vcat, keepat! (new_gtis, new_gti_mask))
100102end
101103
102- function create_gti_from_condition (time:: AbstractVector{<:Real} , condition:: AbstractVector{Bool} ;
103- safe_interval:: AbstractVector{<:Real} = [0 ,0 ], dt:: AbstractVector{<:Real} = Float64[])
104-
104+ function create_gti_from_condition (
105+ time:: AbstractVector{<:Real} ,
106+ condition:: AbstractVector{Bool} ;
107+ safe_interval:: AbstractVector{<:Real} = [0 , 0 ],
108+ dt:: AbstractVector{<:Real} = Float64[],
109+ )
110+
105111 if length (time) != length (condition)
106- throw (ArgumentError (" The length of the condition and time arrays must be the same." ))
112+ throw (
113+ ArgumentError (" The length of the condition and time arrays must be the same." ),
114+ )
107115 end
108116
109117 idxs = contiguous_regions (condition)
@@ -122,13 +130,15 @@ function create_gti_from_condition(time::AbstractVector{<:Real}, condition::Abst
122130 if t1 - t0 < 0
123131 continue
124132 end
125- push! (gtis,[t0, t1])
133+ push! (gtis, [t0, t1])
126134 end
127135 return mapreduce (permutedims, vcat, gtis)
128136end
129137
130- function operations_on_gtis (gti_list:: AbstractVector{<:AbstractMatrix{T}} ,
131- operation:: Function ) where {T<: Real }
138+ function operations_on_gtis (
139+ gti_list:: AbstractVector{<:AbstractMatrix{T}} ,
140+ operation:: Function ,
141+ ) where {T<: Real }
132142
133143 required_interval = nothing
134144
@@ -137,7 +147,7 @@ function operations_on_gtis(gti_list::AbstractVector{<:AbstractMatrix{T}},
137147
138148 combined_gti = Interval{T}[]
139149 for ig in eachrow (gti)
140- push! (combined_gti,Interval {Closed,Open} (ig[1 ],ig[2 ]))
150+ push! (combined_gti, Interval {Closed,Open} (ig[1 ], ig[2 ]))
141151 end
142152 if isnothing (required_interval)
143153 required_interval = IntervalSet (combined_gti)
@@ -159,7 +169,7 @@ function get_btis(gtis::AbstractMatrix{<:Real})
159169 if isempty (gtis)
160170 throw (ArgumentError (" Empty GTI and no valid start_time and stop_time" ))
161171 end
162- return get_btis (gtis, gtis[1 ,1 ], gtis[end ,2 ])
172+ return get_btis (gtis, gtis[1 , 1 ], gtis[end , 2 ])
163173end
164174
165175function get_btis (gtis:: AbstractMatrix{T} , start_time, stop_time) where {T<: Real }
@@ -168,12 +178,12 @@ function get_btis(gtis::AbstractMatrix{T}, start_time, stop_time) where {T<:Real
168178 end
169179 check_gtis (gtis)
170180
171- total_interval = Interval{T, Closed, Open}[Interval {T, Closed, Open} (start_time, stop_time)]
181+ total_interval = Interval{T,Closed,Open}[Interval {T,Closed,Open} (start_time, stop_time)]
172182 total_interval_set = IntervalSet (total_interval)
173183
174- gti_interval = Interval{T, Closed, Open}[]
184+ gti_interval = Interval{T,Closed,Open}[]
175185 for ig in eachrow (gtis)
176- push! (gti_interval,Interval {T, Closed, Open} (ig[1 ],ig[2 ]))
186+ push! (gti_interval, Interval {T,Closed,Open} (ig[1 ], ig[2 ]))
177187 end
178188 gti_interval_set = IntervalSet (gti_interval)
179189
@@ -188,27 +198,36 @@ function get_btis(gtis::AbstractMatrix{T}, start_time, stop_time) where {T<:Real
188198 return mapreduce (permutedims, vcat, btis)
189199end
190200
191- function time_intervals_from_gtis (gtis:: AbstractMatrix{<:Real} , segment_size:: Real ;
192- fraction_step:: Real = 1 , epsilon:: Real = 1e-5 )
201+ function time_intervals_from_gtis (
202+ gtis:: AbstractMatrix{<:Real} ,
203+ segment_size:: Real ;
204+ fraction_step:: Real = 1 ,
205+ epsilon:: Real = 1e-5 ,
206+ )
193207 spectrum_start_times = Float64[]
194208
195- gti_low = @view gtis[:,1 ]
196- gti_up = @view gtis[:,2 ]
209+ gti_low = @view gtis[:, 1 ]
210+ gti_up = @view gtis[:, 2 ]
197211
198- for (g1,g2) in zip (gti_low,gti_up)
212+ for (g1, g2) in zip (gti_low, gti_up)
199213 if g2 - g1 + epsilon < segment_size
200214 continue
201215 end
202216
203- newtimes = range (g1, g2 - segment_size + epsilon, step = segment_size* fraction_step)
204- append! (spectrum_start_times,newtimes)
217+ newtimes =
218+ range (g1, g2 - segment_size + epsilon, step = segment_size * fraction_step)
219+ append! (spectrum_start_times, newtimes)
205220 end
206221 return spectrum_start_times, spectrum_start_times .+ segment_size
207222end
208223
209- function calculate_segment_bin_start (startbin:: Integer , stopbin:: Integer ,
210- nbin:: Integer ; fraction_step:: Real = 1 )
211- st = floor .(range (startbin, stopbin, step= Int (nbin * fraction_step)))
224+ function calculate_segment_bin_start (
225+ startbin:: Integer ,
226+ stopbin:: Integer ,
227+ nbin:: Integer ;
228+ fraction_step:: Real = 1 ,
229+ )
230+ st = floor .(range (startbin, stopbin, step = Int (nbin * fraction_step)))
212231 if st[end ] == stopbin
213232 pop! (st)
214233 end
@@ -218,9 +237,14 @@ function calculate_segment_bin_start(startbin::Integer, stopbin::Integer,
218237 return st
219238end
220239
221- function bin_intervals_from_gtis (gtis:: AbstractMatrix{<:Real} , segment_size:: Real ,
222- time:: AbstractVector{<:Real} ; dt= nothing ,
223- fraction_step:: Real = 1 , epsilon:: Real = 0.001 )
240+ function bin_intervals_from_gtis (
241+ gtis:: AbstractMatrix{<:Real} ,
242+ segment_size:: Real ,
243+ time:: AbstractVector{<:Real} ;
244+ dt = nothing ,
245+ fraction_step:: Real = 1 ,
246+ epsilon:: Real = 0.001 ,
247+ )
224248 if isnothing (dt)
225249 dt = Statistics. median (diff (time))
226250 end
@@ -253,16 +277,22 @@ function bin_intervals_from_gtis(gtis::AbstractMatrix{<:Real}, segment_size::Rea
253277 end
254278
255279 newbins = calculate_segment_bin_start (
256- startbin, stopbin, nbin, fraction_step= fraction_step)
257-
258- append! (spectrum_start_bins,newbins)
259- end
260- return spectrum_start_bins, spectrum_start_bins.+ nbin
280+ startbin,
281+ stopbin,
282+ nbin,
283+ fraction_step = fraction_step,
284+ )
285+
286+ append! (spectrum_start_bins, newbins)
287+ end
288+ return spectrum_start_bins, spectrum_start_bins .+ nbin
261289end
262290
263- @resumable function generate_indices_of_segment_boundaries_unbinned (times:: AbstractVector{<:Real} ,
264- gti:: AbstractMatrix{<:Real} ,
265- segment_size:: Real )
291+ @resumable function generate_indices_of_segment_boundaries_unbinned (
292+ times:: AbstractVector{<:Real} ,
293+ gti:: AbstractMatrix{<:Real} ,
294+ segment_size:: Real ,
295+ )
266296 start, stop = time_intervals_from_gtis (gti, segment_size)
267297
268298 startidx = searchsortedfirst .(Ref (times), start)
@@ -273,16 +303,21 @@ end
273303 end
274304end
275305
276- @resumable function generate_indices_of_segment_boundaries_binned (times:: AbstractVector{<:Real} ,
277- gti:: AbstractMatrix{<:Real} ,
278- segment_size:: Real ; dt= nothing )
279- startidx, stopidx = bin_intervals_from_gtis (gti, segment_size, times;
280- dt= dt)
306+ @resumable function generate_indices_of_segment_boundaries_binned (
307+ times:: AbstractVector{<:Real} ,
308+ gti:: AbstractMatrix{<:Real} ,
309+ segment_size:: Real ;
310+ dt = nothing ,
311+ )
312+ startidx, stopidx = bin_intervals_from_gtis (gti, segment_size, times; dt = dt)
281313
282314 if isnothing (dt)
283315 dt = 0
284316 end
285317 for (idx0, idx1) in zip (startidx, stopidx)
286- @yield times[idx0+ 1 ] - dt / 2 , times[min (idx1, length (times) - 1 )] - dt / 2 ,idx0, idx1
318+ @yield times[idx0+ 1 ] - dt / 2 ,
319+ times[min (idx1, length (times) - 1 )] - dt / 2 ,
320+ idx0,
321+ idx1
287322 end
288323end
0 commit comments