forked from pohuigin/smart_library
-
Notifications
You must be signed in to change notification settings - Fork 1
/
ar_track_yafta.pro
426 lines (270 loc) · 10.7 KB
/
ar_track_yafta.pro
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
;Run YAFTA for a range of times on a stack of SMART detection masks.
;----------------------------------------------------------------------------->
;initialise the state structure so that AR_TRACK_YAFTA can be continued in
;subsequent runs for subsequent times.
;That won't work because it will be a different size each time!
;!! but maybe I should standardise the AR track struct so the tracking routines all use the same blank structures
;----------------------------------------------------------------------------->
;initialise the state structure so that AR_TRACK_YAFTA can be continued in
;subsequent runs for subsequent times.
;
;function ar_track_yafta_state_init
;
;
;
;return,state
;
;end
;----------------------------------------------------------------------------->
;Run the tracking for a stack of masks
;
;Mandatory Keywords:
; MAGSTACK =
; MASKSTACK =
; MDIMETA =
; SMARTMETA =
;
;Optional Keywords:
; PARAMS =
; OUTFILE =
;
;In/Out Variable: STATE = a structure that can be read out from and read back into
; AR_TRACK_YAFTA so the tracking can be continued over subsequent runs.
;NOTE: if a previous state is read-in then it must have been run on the
; same size masks/data that are read in also.
;
;Resturns: STRUCTURE = The YAFTA tracking structure that corresponds to the input
; SMART AR detection meta info structure
;
function ar_track_yafta,state,magstack=inmags,maskstack=insmmask, $
mdimeta=inthissmart,smartmeta=inmdimetastrar, $
params=inparams, fparam=fparam, fstruct=fstruct, $
doplot=doplot, plotdir=plotdir, $
outsingle=outsingle ;out put a single map if there was only one on the day
;so that it can be included with the next set and still be useful
if data_type(inparams) eq 8 then params=inparams $
else params=ar_loadparam(fparam=fparam) ;get the default SMART parameter list
outsinglemap=''
help,state,/str
mags=inmags
smmask=insmmask
thissmart=inthissmart
mdimetastrar=inmdimetastrar
;Initialise a blank tracking structure
yaftastrblank=ar_struct_init(yaftaformat,structid='ar_track_yafta', fstruct=fstruct)
yaftastrarr=replicate(yaftastrblank,n_elements(mdimetastrar))
yaftastrarr.yaftaid=-1
if data_type(state) eq 8 then begin
;This is for a continued run...
;Pull out the variables for the current YAFTA run
mgram1 = state.mgram1
ar_mask1 = state.ar_mask1
ars1 = state.ars1
ip1 = state.ip1 ;saves the last tracking 'step'
if data_type(ars1) ne 8 then undefine,ars1
tlastarsfound = state.tlastarsfound
;!!! Will need to add the following check into the loop
; if delta time matching threshold is below 24 hrs
;Check to make sure the map was not from too long ago so that incorrect associations won't be made
thisdeltatlastfound=thissmart[0].tim-tlastarsfound
if thisdeltatlastfound ge params.tlastfoundthresh then begin
;Resets the tracking
undefine,ars1
endif
maxtrackid=state.maxtrackid
hasstate=1
endif else begin
;This is for an initialised tracking run...
;Might need to make the state structure at the end...
; state=ar_track_yafta_state_init(size())
;to guard against a crash when this variable is checked for, if there are no ARs found in an initial YAFTA run
tlastarsfound=0.
maxtrackid=0.
ip1=0l
hasstate=0
endelse
;Determine the size of input data
imgsz=size(mags,/dim)
nx=imgsz[0]
ny=imgsz[1]
if n_elements(imgsz) eq 2 then begin
outsingle={mags:mags,smmask:smmask,thissmart:thissmart,mdimetastrar:mdimetastrar}
print,'ONLY ONE FILE TO TRACK. ABORTING.'
return,''
endif
nt=imgsz[2]
for i = 0,nt-1 do begin
;Pull out the AR meta structure for this time
wthisarmeta=where(mdimetastrar.datafile eq thissmart[i].datafile)
if wthisarmeta[0] ne -1 then begin
thisarmeta=mdimetastrar[wthisarmeta]
nsmars=n_elements(wthisarmeta)
;FILL TRACK STRUCTURE
yaftastrarr[wthisarmeta].datafile=mdimetastrar[wthisarmeta].datafile
yaftastrarr[wthisarmeta].arid=mdimetastrar[wthisarmeta].arid
endif else nsmars=0
print, "Tracking step:",string(i+1)
mags_i = mags[*,*,i]
ar_mask2 = smmask[*,*,i]
;FOR DEBUGGING!!!
print,'SM MAX MASK = ',max(ar_mask2)
print,'SM NARS = ',n_elements(uniqpx(ar_mask2))-1
print,'NARS SM META = ',n_elements(thisarmeta)
create_features, abs(mags_i), ar_mask2, ars2, dx=params.yaftadx, min_size=params.yaftaminsize, peakthreshold=params.yaftapeakthresh
;If no features were found to track then keep track of how much time has elapsed since features were last found
if n_elements(ars2) eq 0 then begin
if keyword_Set(doplot) then begin
plot_image,magscl(mags_i),title='NO ARS FOUND!'
contour,ar_mask2,level=0.5,color=0,/over
endif
thisdeltatlastfound=thissmart[i].tim-tlastarsfound
if thisdeltatlastfound lt params.tlastfoundthresh then begin
;Pretends like the current map didn't happen and continues tracking
continue
endif else begin
;Resets the tracking
mgram1 = temporary(mags_i)
ar_mask1 = temporary(ar_mask2)
if n_elements(ars1) gt 0 then undefine,ars1
continue
endelse
endif else begin
;Save the time that ARs were last found
tlastarsfound=thissmart[i].tim
ip1=ip1+1l
ars2.step = ip1
endelse
;Check if ARs existed previously and if they exist now
;print,'line 131'
n_ar1 = n_elements(ars1)
n_ar2 = n_elements(ars2)
help,n_ar1,n_ar2
possible_match = 0 ; default assumption
;If previous and current time have ARs, tracking will be attempted
;print,'line 138'
if (n_ar1 gt 0) and (n_ar2 gt 0) then possible_match = 1
if (possible_match eq 1) then begin
step1 = mean(ars1.step) ; it's clumsy to use "mean", but oh well
step2 = mean(ars2.step)
if (step2 - step1 ne 1) then possible_match = 0 ; not consecutive
;Update Max Label variable
maxtrackid = maxtrackid > max(ars1.LABEL)
help,maxtrackid
;FILL TRACK STRUCTURE
yaftastrarr[wthisarmeta].step=step2
endif
;Attempt tracking
;print,'line 148'
if (possible_match eq 1) then begin
match_features_v01, ars1, ars2, ar_mask1, ar_mask2, abs(mgram1), abs(mags_i), old_max_label = maxtrackid
orig_ars2 = ars2
orig_armask = ar_mask2
;Attempt to prevent fragmentation
;print,'line 156'
merge_fragments, ars2, ar_mask2
endif ; ends if check for possible match
;Save the tracking YAFTA ID, ARID, data file name, and tim into a structure
if (n_ar2 gt 0) then begin
;print,'line 162'
if n_elements(ars2) ne n_elements(wthisarmeta) then begin
print,'YAFTA NARS NE SM NARS!!!!'
thissmid=mdimetastrar[wthisarmeta].arid
thistrackedid=(smmask[*,*,i])[long(strmid(ars2.mask_str,0,12))]
match,thissmid,thistrackedid,msmid,mtrackid
wthisarmeta=wthisarmeta[msmid]
stop
endif
if nsmars ne n_ar2 then begin
stop
print,'YAFTA NARS NE SM NARS!!!!'
;!!!!!!!!!!NOT SURE IF THIS IS LEGIT!!!
;check nars in mask
;choose ars to keep from thisarmeta, from the ars appearing in the tracked mask string
thisgoodarid=ar_mask2[strmid(ars2.MASK_STR,0,12)]
match,thisarmeta.arid,thisgoodarid,mmetaid,mmaskid
thisgoodarmeta=thisarmeta[mmetaid]
thisarmeta=thisgoodarmeta
endif
thisyaftastr=replicate(yaftastrblank,n_elements(thisarmeta))
thisyaftastr.datafile=thisarmeta.datafile
thisyaftastr.arid=thisarmeta.arid
thisyaftastr.yaftaid=-1
;print,'line 170'
;Loop over ARS2 and find which tracked feature structure corresponds to which SMART detection
;AR detections with tracking (YAFTA) ID = -1 were not tracked/were discarded by YAFTA for some reason
for ys=0,n_elements(ars2)-1 do begin
;Check the value of the original mask at the first point of the tracked mask to determine what the original detection ID was.
thissmid=(smmask[*,*,i])[(long(strsplit(ars2[ys].mask_str,/extract)))[0]]
wsmid=where(thisyaftastr.arid eq thissmid)
if wsmid[0] eq -1 then continue
thisyaftastr[wsmid].yaftaid=ars2[ys].label
thisyaftastr[wsmid].src=ars2[ys].src
thisyaftastr[wsmid].trm=ars2[ys].trm
thisyaftastr[wsmid].step=ars2[ys].step
endfor
;print,'line 185'
if n_elements(thisyaftastrarr) ne 0 then thisyaftastrarr=[thisyaftastrarr,thisyaftastr] $
else thisyaftastrarr=thisyaftastr
endif
;Concatenate current mask with array of previous masks
;print,'line 192'
if (n_elements(ar_masks) eq 0) then ar_masks = ar_mask2 $
else ar_masks = [[[ar_masks]],[[ar_mask2]]]
;Over write previous arrays with current arrays for the next iteration
;print,'line 198'
mgram1 = temporary(mags_i)
ar_mask1 = temporary(ar_mask2)
if (n_ar2 gt 0) then begin
;Concatenate current AR meta tracking info with array of previous ARs meta info
;print,'line 208'
;!!!!!!!TEMP this is a hack... Need to make the output structure array of ARS1 correspond to the magnetograms. So, need to read in the last one from yesterday, then write that one out to the proper magnetogram file.
;ARS1 needs to be read through match struct to get its TRM number updated
if n_elements(ars1) ne 0 then begin
if (n_elements(all_ars) eq 0) then all_ars = ars1 $
else all_ars = [all_ars, ars1]
endif
ars1 = temporary(ars2)
;Plot the AR detections with the persistent tracking names
;print,'line 215'
if keyword_Set(doplot) then begin
if n_elements(plotdir) eq 1 then setplotenv,file=plotdir+thissmart[i].maskfile,/ps,/eps,ys=15,xs=15
loadct,0,/sil
display_yafta,magscl(mags[*,*,i]),/asp
setcolors,/sys
contour,smmask[*,*,i],level=0.5,color=0,thick=1,/over
plot_edges, ar_mask1,thick=2
plot_labels, ars1
if n_elements(plotdir) eq 1 then closeplotenv
; if n_elements(plotdir) eq 1 then window_capture,file=plotdir+thissmart[i].maskfile
endif
endif
help,all_ars,yaftastrarr
;FILL TRACK STRUCTURE
yaftastrarr[wthisarmeta].yaftaid=ars1.label
yaftastrarr[wthisarmeta].src=ars1.src
yaftastrarr[wthisarmeta].trm=ars1.trm
endfor ; ends loop over a given day's data
;print,'line 230'
;Add the last batch of tracked ARs onto the end of the struct array
if n_elements(ars1) ne 0 and hasstate eq 0 then all_ars = [all_ars, ars1]
if n_elements(ars1) eq 0 then ars1=''
;Update the STATE variable and output it through the procedural call.
state={mgram1:mgram1,ar_mask1:ar_mask1,ars1:ars1,tlastarsfound:tlastarsfound,maxtrackid:maxtrackid,ip1:ip1,all_ars:all_ars}
help,state,/str
if n_elements(yaftastrarr) gt 0 then outstruct=yaftastrarr else outstruct=''
;outstruct=replicate(yaftastrblank,n_elements(all_ars))
;outstruct.datafile=thisyaftastrarr.datafile
;outstruct.arid=thisyaftastrarr.arid
;outstruct.yaftaid=all_ars.label
;outstruct.src=all_ars.src
;outstruct.trm=all_ars.trm
;outstruct.step=all_ars.step
;outstruct=replicate(yaftastrblank,n_elements(thisyaftastrarr))
;outstruct.datafile=thisyaftastrarr.datafile
;outstruct.arid=thisyaftastrarr.arid
;outstruct.yaftaid=thisyaftastrarr.yaftaid
;outstruct.src=thisyaftastrarr.src
;outstruct.trm=thisyaftastrarr.trm
;outstruct.step=thisyaftastrarr.step
return,outstruct
end