gtienlarge.pro
4.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
;+
; NAME:
; GTIENLARGE
;
;
; AUTHOR:
; Craig B. Markwardt, NASA/GSFC Code 662, Greenbelt, MD 20770
; craigm@lheamail.gsfc.nasa.gov
;
; PURPOSE:
; Enlarge (or shrink) each Good Time Interval (GTI) by fixed amounts
;
; CALLING SEQUENCE:
; NEWGTI = GTIENLARGE(GTI, COUNT=COUNT, PRE=PRE, POST=POST)
;
; DESCRIPTION:
;
; The function GTIENLARGE accepts an existing valid Good Time
; Interval (GTI) array and creates a new GTI array in which the
; intervals have been enlarged (or shrunken) by a fixed amount.
;
; The keywords PRE and POST are used to specify the enlargement.
; Given an existing good interval such as this one:
;
; 100 200 GTI=[[100,200]]
; <------------|===================|------------->
;
; a positive value of PRE will enlarge the lead edge of the interval
; and a positive value of POST will enlarge the trailing edge of the
; interval. Thus PRE=10 and POST=20 will create a new interval from
; the above example:
;
; 90<-- --->220 NEWGTI=[[ 90,220]]
; <---------|==.===================.====|-------->
; PRE=10 POST=20
;
; Negative values of PRE and POST are allowed, which will shrink the
; interval from the leading and trailing edges respectively.
;
; Users should be aware that the number of intervals may shrink
; under this operation, since it is possible either for two
; intervals to be merged if they are enlarged and overlap, or if
; they are shrunken to a size of zero.
;
; It should be noted that this function is not constrained to
; operation only on time arrays. It should work on any
; one-dimensional quantity with intervals.
;
; INPUTS:
;
; GTI - a 2xNINTERVAL array where NINTERVAL is the number of
; intervals. GTI(*,i) represents the start and stop times of
; interval number i. The intervals must be non-overlapping
; and time-ordered (use GTITRIM to achieve this).
;
; A scalar value of zero indicates that the GTI is empty, ie,
; there are no good intervals.
;
; KEYWORDS:
;
; PRE - the amount each interval should be enlarged from its leading
; edge. A negative value indicates the interval should
; shrink.
; Default: 0
;
; POST - the amount each interval should be enlarged from its
; trailing edge. A negative value indicates the interval
; should shrink.
; Default: 0
;
; COUNT - upon return, the number of resulting intervals. A value
; of zero indicates no good time intervals.
;
; RETURNS:
;
; A new GTI array containing the enlarged or shrunken intervals.
; The array is 2xCOUNT where COUNT is the number of resulting
; intervals. GTI(*,i) represents the start and stop times of
; interval number i. The intervals are non-overlapping and
; time-ordered.
;
; If COUNT is zero then the returned array is a scalar value of
; zero, indicating no good intervals were found.
;
;
; SEE ALSO:
;
; GTITRIM, GTIENLARGE
;
; MODIFICATION HISTORY:
; Written, CM, 1997-2001
; Documented, CM, Apr 2001
;
; $Id: gtienlarge.pro,v 1.3 2001/04/30 16:03:03 craigm Exp $
;
;-
; Copyright (C) 1997-2001, Craig Markwardt
; This software is provided as is without any warranty whatsoever.
; Permission to use, copy, modify, and distribute modified or
; unmodified copies is granted, provided this copyright and disclaimer
; are included unchanged.
;-
function gtienlarge, gti, count=count, pre=pre, post=post, query=query
if keyword_set(query) then return, 1
;; When PRE and POST are given, we must be very careful, for the
;; GTIs may become overlapping. That will confuse everything else.
;; The strategy I choose here is to look at adjacent GTIs and remove
;; any that overlap. I think that gets everything, but I worry that
;; it won't get (say) triply overlapping GTIs.
count = n_elements(gti)/2
if count EQ 0 then return, 0L
if n_elements(pre) EQ 0 AND n_elements(post) EQ 0 then return, gti
newgti = gti
if n_elements(pre) GT 0 then newgti(0,*) = newgti(0,*) - pre(0)
if n_elements(post) GT 0 then newgti(1,*) = newgti(1,*) + post(0)
wh = where(newgti(1,*) GT newgti(0,*), count)
if count EQ 0 then return, 0
;; If only one GTI entry, then no need for special treatment
if count EQ 1 then return, reform(newgti(*, wh), 2, 1)
newgti = newgti(*,wh)
;; Get first and last GTI values
t0 = newgti(0)
t1 = newgti(count*2-1)
;; Get possibly "overlapping" values
vgti = reform(newgti(1:count*2-2), 2, count-1)
;; Make sure they *don't* overlap
wh = where(vgti(1,*) GT vgti(0,*), ct)
if ct GT 0 then begin
count = ct + 1
newgti = reform([t0, (vgti(*,wh))(*), t1], 2, count)
endif else begin
count = 1L
newgti = reform([t0, t1], 2, 1)
endelse
return, newgti
end