pro thm_spinmodel::addseg,newseg
sp = self.segs_ptr
if (self.lastseg EQ -1) then begin
(*sp)[0] = newseg
self.lastseg = 0L
endif else begin
lseg=(*sp)[self.lastseg]
if (newseg.t1 EQ lseg.t2) then begin
;
; Normal case: segments are contiguous
;
self.lastseg = self.lastseg + 1
newseg.c1 = lseg.c2
newseg.c2 = lseg.c2 + newseg.c2
(*sp)[self.lastseg] = newseg
endif else begin
; Segments are not contiguous -- this should indicate
; a UTC date boundary, and the spin models on either side will
; need to be merged.
;
; There are several cases, depending on the delta-t between the
; end of the previous segment, and the start of the current segment:
;
; 1) Large gap, greater than 1/2 spin : create a new segment to
; bridge the gap.
; 2) Small gap, <= 1/2 spin, previous segment covers 2 or more spins:
; remove last spin from previous segment, converting the situation
; to the "large gap" case, then create a new segment to bridge
; the gap.
; 3) Small gap, previous segment only contains 1 spin : if current
; segment contains 2 or more spins, remove first spin from
; current segment, converting the situation to the "large gap"
; case, then create a new segment to bridge the gap.
; 4) Small gap, previous and current segments each contain only
; a single spin. This should never happen -- if no averaging
; was applied, the segments should be exactly contiguous.
; 5) Negative gap -- current segment starts more than 1/2 spin
; before end of previous segment. This should never happen,
; since it would imply that the apid 305 packets are incorrectly
; time ordered.
;dprint,'seam detected'
;print,'Before:
;print,lseg
;print,newseg
;print,'==================================='
spinper = 360.0D/lseg.b
gap_spin_count = (newseg.t1 - lseg.t2)/spinper
gap_time = newseg.t1 - lseg.t2
if (gap_spin_count GT 0.5) then begin
; Case 1: Gap of 1 or more spins between segments, add fill
;dprint,'case 1: 1+ spin gap, adding fill segment'
gap_nspins = floor(gap_spin_count + 0.5)
gap_spinper = (newseg.t1 - lseg.t2)/(1.0D * gap_nspins)
; Fill in eclipse delta_phi parameters
gap_idpu_spinper = (newseg.idpu_spinper + lseg.idpu_spinper)/2.0
gap_segflags = newseg.segflags AND lseg.segflags
; We need to calculate gap_initial_delta_phi by extrapolating
; from lseg to lseg.t2 = gapseg.t1
segment_interp_t,lseg,lseg.t2,dummy_spincount,dummy_tlast,dummy_spinphase,$
dummy_spinper,gap_initial_delta_phi
fillseg = {spinmodel_segment,t1:lseg.t2, t2:newseg.t1, c1:lseg.c2,$
c2:lseg.c2+gap_nspins,b:360.0D/gap_spinper,c:0.0D,npts:0L,$
maxgap:gap_time, phaserr:0.0D, $
initial_delta_phi: 0.0D, $
idpu_spinper:gap_idpu_spinper, segflags:gap_segflags}
fillseg.initial_delta_phi = gap_initial_delta_phi
self.lastseg = self.lastseg+1
(*sp)[self.lastseg] = fillseg
;print,fillseg
newseg.c1 = fillseg.c2
newseg.c2 = newseg.c1 + newseg.c2
self.lastseg = self.lastseg + 1
(*sp)[self.lastseg] = newseg
;print,newseg
endif else if (gap_spin_count GT -0.5) then begin
; Case 2, 3, 4, or 5
if ((lseg.c2 - lseg.c1) GE 2) then begin
; Case 2: small gap, previous segment has at least 2 spins
;dprint,'<1 spin gap, stealing spin from last segment'
c2_new = lseg.c2 - 1
segment_interp_n,lseg,c2_new,t_last,dummy
; Fill in eclipse delta_phi parameters
gap_idpu_spinper = (newseg.idpu_spinper + lseg.idpu_spinper)/2.0
gap_segflags = newseg.segflags AND lseg.segflags
; We need to calculate gap_initial_delta_phi by extrapolating
; from lseg to t_last = fillseg.t1
segment_interp_t,lseg,t_last,dummy_spincount,dummy_tlast,dummy_spinphase,$
dummy_spinper,gap_initial_delta_phi
lseg.c2 = c2_new
lseg.t2 = t_last
(*sp)[self.lastseg].c2 = c2_new
(*sp)[self.lastseg].t2 = t_last
;print,lseg
dt = newseg.t1-t_last
spinper = dt
fillseg = {spinmodel_segment,t1:t_last,t2:newseg.t1,c1:c2_new,$
c2:c2_new+1,b:360.0D/spinper,c:0.0D,npts:0L,maxgap:dt,$
phaserr:0.0D, initial_delta_phi: 0.0D, $
idpu_spinper: gap_idpu_spinper, segflags: gap_segflags}
fillseg.initial_delta_phi = gap_initial_delta_phi
self.lastseg = self.lastseg + 1
;print,fillseg
(*sp)[self.lastseg] = fillseg
newseg.c1 = fillseg.c2
newseg.c2 = newseg.c2 + newseg.c1
self.lastseg = self.lastseg + 1
(*sp)[self.lastseg] = newseg
endif else if (newseg.c2 GE 2) then begin
; Case 3: small gap, previous segment has only 1 spin,
; current segment has at least 2 spins
;print,'<1 spin gap, stealing spin from next segment'
; It is assumed that newseg is the first segment of a
; new UTC day, therefore the spin numbers start over
; at 0. So we want to change newseg to start
; at spin 1 instead of spin 0.
segment_interp_n,newseg,1,t_last,dummy
; Fill in eclipse delta_phi parameters
gap_idpu_spinper = (newseg.idpu_spinper + lseg.idpu_spinper)/2.0
gap_segflags = newseg.segflags AND lseg.segflags
; We need to calculate gap_initial_delta_phi by extrapolating
; from lseg to lseg.t2 = fillseg.t1
segment_interp_t,lseg,lseg.t2,dummy_spincount,dummy_tlast,dummy_spinphase,$
dummy_spinper,gap_initial_delta_phi
; We also need to calculate new_initial_delta_phi for newseg,
; since we've removed its first spin. New start time is t_last.
segment_interp_t,newseg,t_last,dummy_spincount,dummy_tlast,dummy_spinphase,$
dummy_spinper,newseg_initial_delta_phi
dt = t_last - newseg.t1
bp = newseg.b + 2.0D*newseg.c*dt
newseg.b = bp
newseg.t1 = newseg.t1 + dt
newseg.c1 = lseg.c2 + 1
newseg.c2 = newseg.c2 + newseg.c1
newseg.initial_delta_phi = newseg_initial_delta_phi
fill_spinper = newseg.t1 - lseg.t2
gap_time = fill_spinper
fillseg = {spinmodel_segment,t1:lseg.t2,t2:newseg.t1,c1:lseg.c2,$
c2:lseg.c2 + 1,b:360.0D/fill_spinper,c:0.0D, npts: 0L,$
maxgap: gap_time,phaserr:0.0D, initial_delta_phi: 0.0D,$
idpu_spinper: gap_idpu_spinper, segflags: gap_segflags}
fillseg.initial_delta_phi = gap_initial_delta_phi
self.lastseg = self.lastseg + 1
(*sp)[self.lastseg] = fillseg
self.lastseg = self.lastseg + 1
(*sp)[self.lastseg] = newseg
endif else begin
; Case 4: small gap, but segments on either side only contain
; one spin each. This should never happen.
message,'<1 spin gap, but neither segment has enough spins to steal. This should not happen!'
endelse
endif else begin
; Case 5: out of order sun pulse times. This should never happen.
message,'Unexpected (out of order) sun pulse time sequence...this should not happen!'
endelse
;print,'Modified segments:'
;print,lseg
;print,fillseg
;print,newseg
endelse
endelse
end