Skip to content

Commit 7adccee

Browse files
authored
O4 realtime (#51)
* load up to 5000s to check for events in realtime * add internal public webpage fxn * event time def earlier * get gcn in case p<0.1 * try for pickle load * index at 1 instead of 0 for events on skymap * add a try to convert from moc * add email/sms notif * internal alerts pub webpage updates * formatting for alerts webpage * increment versioning * dont send most prob direction if no coinc events * change header for public wp * make plots w file modification time * precomp gw bg trials * fix document, slack poster * print central energy range min,max * fix documenting bugs * send llama results for 1det event * adding config for sender * add a version of combine_results run on classic * remove uneeded, switch to rel paths * no config needed, switch back to kafka * stop it timing out while waiting for data * correct error processing * add nside param * generate high sig gcn templ, calc per event p when gt 0.1 * add note about plot in pub wp * get type of event and pass to make_call * should be a float for probs * fix bug in 2d webpage link * fix paths * fix paths, handle llama res if no ontime neutrinos * update sender to match schema * update with new key names * add calls to shifters if results not found; 35 min timeout * ra_unc is a list * move incoming alert printing so rev1 doesn't print * seperate alert and gw trials scripts * update submission script for both * call shifters if results not found if not a mock * remove try/except from debugging * increment version
1 parent 3bd9f61 commit 7adccee

17 files changed

+956
-147
lines changed

fast_response/FastResponseAnalysis.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -995,6 +995,7 @@ def make_dNdE(self):
995995

996996
self.energy_range = (np.min([low_5_min_dec, low_5_max_dec]),
997997
np.max([high_5_min_dec, high_5_max_dec]))
998+
print('90% Central Energy Range: {}, {} GeV'.format(round(self.energy_range[0]), round(self.energy_range[1])))
998999
self.save_items['energy_range'] = self.energy_range
9991000

10001001
def ns_scan(self):
@@ -1246,6 +1247,7 @@ def make_dNdE(self):
12461247
plt.legend(loc=4, fontsize=18)
12471248
plt.savefig(self.analysispath + '/central_90_dNdE.png',bbox_inches='tight')
12481249

1250+
print('90% Central Energy Range: {}, {} GeV'.format(round(low_5), round(high_5)))
12491251
self.save_items['energy_range'] = (self.low5, self.high5)
12501252

12511253
def write_circular(self):

fast_response/GWFollowup.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -326,12 +326,12 @@ def write_circular(self):
326326
except:
327327
noticeID = 'NOTICEID'
328328

329-
if pvalue > 0.1:
329+
if pvalue > 0.2:
330330
template_path = os.path.join(base, 'circular_templates/gw_gcn_template_low.txt')
331331
else:
332332
template_path = os.path.join(base, 'circular_templates/gw_gcn_template_high.txt')
333333

334-
if pvalue>0.1:
334+
if pvalue>0.2:
335335
with open(template_path, 'r') as gcn_template:
336336

337337
gcn = gcn_template.read()
@@ -568,7 +568,7 @@ def per_event_pvalue(self):
568568
usemask=False
569569
)
570570

571-
if self.p < 0.05:
571+
if self.p < 0.1:
572572
for i in range(self.events_rec_array.size):
573573
ts, p = self.per_event_scan(self.events_rec_array[i])
574574
self.events_rec_array['pvalue'][i] = p

fast_response/MonitoringAndMocks/Data_Display.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
warnings.filterwarnings('ignore', module='astropy._erfa')
2323

2424
def dial_up(who="jessie"):
25-
cell_tower = "/cvmfs/icecube.opensciencegrid.org/users/jthwaites/"
25+
cell_tower = "/home/jthwaites/private/"
2626
#halp = "https://icecube.wisc.edu/~jthwaites/FastResponse/error_call.xml"
2727
subprocess.call([cell_tower+"make_call.py", f"--{who}=True", '--troubleshoot=True'])#, "--call_file", halp])
2828
#print([cell_tower+"make_call.py", f"--{who}=True", '--troubleshoot=True'])
@@ -747,11 +747,8 @@ def make_bg_pval_dist(fontsize=15, lower_y_bound=-3.5):
747747
print('Loading %i mocks (may take a while)'%(len(saved_mock_pkl)))
748748
for mock in saved_mock_pkl:
749749
with open(mock,'rb') as f:
750-
try:
751-
result=pickle.load(f)
752-
except:
753-
print('skipped {}'.format(mock))
754-
continue
750+
result=pickle.load(f)
751+
#print('skipped {}'.format(mock))
755752
all_mocks[result['name']]=result['p']
756753
print('Done loading mocks.')
757754

fast_response/listeners/gcn_listener.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
gcn.notice_types.ICECUBE_CASCADE)
1414

1515
def process_gcn(payload, root):
16-
print("INCOMING ALERT: ",datetime.utcnow())
17-
1816
analysis_path = os.environ.get('FAST_RESPONSE_SCRIPTS')
1917
if analysis_path is None:
2018
try:
@@ -37,19 +35,22 @@ def process_gcn(payload, root):
3735
stream = params['Stream']
3836
eventtime = root.find('.//ISOTime').text
3937
if stream == '26':
38+
print("INCOMING ALERT: ",datetime.utcnow())
4039
print("Detected cascade type alert, running cascade followup. . . ")
4140
alert_type='cascade'
4241
event_name='IceCube-Cascade_{}{}{}'.format(eventtime[2:4],eventtime[5:7],eventtime[8:10])
4342

4443
skymap = params['skymap_fits']
4544
else:
46-
print("Found track type alert, running track followup. . . ")
4745
alert_type='track'
4846
event_name='IceCube-{}{}{}'.format(eventtime[2:4],eventtime[5:7],eventtime[8:10])
4947

5048
# IceCube sends 2: a notice and a revision, only want to run once
5149
if int(params['Rev']) !=0:
52-
return
50+
return
51+
52+
print("INCOMING ALERT: ",datetime.utcnow())
53+
print("Found track type alert, running track followup. . . ")
5354

5455
event_id = params['event_id']
5556
run_id = params['run_id']
@@ -111,14 +112,17 @@ def process_gcn(payload, root):
111112
'--suffix={}'.format(suffix)]
112113
)
113114

115+
event_name=event_name+suffix
116+
doc = False
114117
if args.document:
115118
try:
116-
dir_1000 = glob.glob(os.path.join(os.environ.get('FAST_RESPONSE_OUTPUT'),
119+
dir_1000 = glob(os.path.join(os.environ.get('FAST_RESPONSE_OUTPUT'),
117120
'*{}_1.0e+03_s').format(event_name))
118121
subprocess.call([analysis_path+'document.py', '--path', dir_1000[0]])
119-
dir_2d = glob.glob(os.path.join(os.environ.get('FAST_RESPONSE_OUTPUT'),
122+
dir_2d = glob(os.path.join(os.environ.get('FAST_RESPONSE_OUTPUT'),
120123
'*{}_1.7e+05_s').format(event_name))
121124
subprocess.call([analysis_path+'document.py', '--path', dir_2d[0]])
125+
doc=True
122126
except:
123127
print('Failed to document to private webpage')
124128

@@ -130,13 +134,18 @@ def process_gcn(payload, root):
130134
if shifters['start'][i]<datetime.utcnow()<shifters['stop'][i]:
131135
on_shift+='<@{}> '.format(shifters['slack_id'][i])
132136
link = 'https://user-web.icecube.wisc.edu/~jthwaites/FastResponse/webpage/output/'
133-
wp_link_1000 = '{}{}_1.0e+03_s.html'.format(link, eventtime[0:10].replace('-','_')+'_'+event_name)
134-
wp_link_2d = '{}{}_1.7e+05_s.html'.format(link, eventtime[0:10].replace('-','_')+'_'+event_name)
135-
bot.send_message(f'Done running FRA for {alert_type} alert, {event_name}.\n ' +
136-
"Results for 1000s: <{}|link>. \n ".format(wp_link_1000) +
137-
"Results for 2d: <{}|link>. \n".format(wp_link_2d) +
138-
+ on_shift +'on shift',
137+
wp_link_1000 = '{}{}_{}_1.0e+03_s.html'.format(link, eventtime[0:10].replace('-','_'),event_name)
138+
139+
day_before = '{}'.format(int(eventtime[8:10])-1)
140+
if len(day_before)==1: day_before='0'+day_before
141+
str_2d = '{}_{}'.format(eventtime[0:7].replace('-','_'),day_before)
142+
wp_link_2d = '{}{}_{}_1.7e+05_s.html'.format(link, str_2d, event_name)
143+
bot.send_message(f'Done running FRA for {alert_type} alert, {event_name}.\n '+ on_shift +'on shift',
139144
'blanket_blob')
145+
if doc:
146+
bot.send_message("-Results for 1000s: <{}|link> \n-Results for 2d: <{}|link>".format(
147+
wp_link_1000, wp_link_2d),
148+
'blanket_blob')
140149
print(' - slack message sent \n')
141150
except Exception as e:
142151
print(e)

fast_response/listeners/gw_gcn_listener.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,29 @@ def process_gcn(payload, root):
6161

6262
print('\n' +'INCOMING ALERT FOUND: ',datetime.utcnow())
6363
log_file.flush()
64+
65+
#get type of event (burst, bbh, nsbh, bns)
66+
try:
67+
if params['Group'] == 'Burst':
68+
merger_type = 'Burst'
69+
else:
70+
k = ['BNS','NSBH','BBH']
71+
probs = {j: float(params[j]) for j in k}
72+
merger_type = max(zip(probs.values(), probs.keys()))[1]
73+
except:
74+
print('Could not determine type of event')
75+
merger_type = None
6476

6577
if root.attrib['role']=='observation' and not mock:
6678
## Call everyone because it's a real event!
67-
call_command=['/cvmfs/icecube.opensciencegrid.org/users/jthwaites/make_call.py']
79+
call_command=['/home/jthwaites/private/make_call.py']
6880

6981
call_args = ['--justin']
7082
for arg in call_args:
7183
call_command.append(arg+'=True')
84+
if merger_type is not None:
85+
call_command.append(f'--type={merger_type}')
86+
7287
try:
7388
subprocess.call(call_command)
7489
#print('Call here.')

fast_response/precomputed_background/glob_precomputed_trials.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
help='Time Window in seconds')
1515
parser.add_argument('--dir',type=str, default='./',
1616
help='directory for where trials are, will save npz to dir+/glob_trials/')
17+
parser.add_argument('--nside',type=int, default=256,
18+
help='nside used when running trials (default 256)')
1719
args = parser.parse_args()
1820

1921
def glob_allsky_scans(delta_t, rate, dir, low_stats=False):
@@ -24,7 +26,7 @@ def glob_allsky_scans(delta_t, rate, dir, low_stats=False):
2426
#jobs_per_window = {1000.: 20, 172800.: 100, 2678400.: 100}
2527

2628
files = glob(dir+'/gw_{:.1f}_mHz_seed_*_delta_t_{:.1e}.npz'.format(rate, delta_t))
27-
nside = 256
29+
nside = 512
2830
npix = hp.nside2npix(nside)
2931
maps = sparse.csr_matrix((0, npix), dtype=float)
3032

@@ -52,7 +54,7 @@ def glob_allsky_scans(delta_t, rate, dir, low_stats=False):
5254

5355
return maps
5456

55-
for rate in [6.0]:#, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2]:
57+
for rate in [6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2]:
5658
for low_stats in [False]:#[True, False]:
5759
print("Rate: {} mHz, low stats: {}".format(rate, low_stats))
5860
maps = glob_allsky_scans(args.deltaT, rate, args.dir, low_stats=low_stats)

fast_response/precomputed_background/precompute_ts.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
import healpy as hp
1010
import os, sys, argparse
1111
from astropy.time import Time
12-
#from numpy.lib.recfunctions import append_fields
12+
from numpy.lib.recfunctions import append_fields
1313
from scipy import sparse
14+
from glob import glob
1415

15-
from fast_response.GWFollowup import GWFollowup
1616
from fast_response.AlertFollowup import AlertFollowup
1717

1818
parser = argparse.ArgumentParser(description='Fast Response Analysis')
@@ -24,8 +24,6 @@
2424
help="Expected background rate in mHz (defualt 6.4)")
2525
parser.add_argument('--seed', default=1, type=int,
2626
help='Unique seed for running on the cluster')
27-
parser.add_argument('--type', default='gw', type=str,
28-
help='type of follow up (gw or alert) to use')
2927
parser.add_argument('--outdir',type=str, default=None,
3028
help='Output directory to save npz (default = FAST_RESPONSE_OUTPUT env variable or cwd)')
3129
args = parser.parse_args()
@@ -40,7 +38,8 @@
4038
if not os.path.exists(outdir+'/trials/'):
4139
os.mkdir(outdir+'/trials/')
4240
outdir=outdir+'/trials/'
43-
#skymap_files = glob('/data/ana/realtime/alert_catalog_v2/2yr_prelim/fits_files/Run13*.fits.gz')
41+
42+
skymap_files = glob('/data/ana/realtime/alert_catalog_v2/2yr_prelim/fits_files/Run13*.fits.gz')
4443

4544
start_mjd = 58484.0 #Jan 1, 2019
4645
stop_mjd = start_mjd + (args.deltaT / 86400.)
@@ -51,14 +50,9 @@
5150
trials_per_sig = args.ntrials
5251
seed_counter = args.seed
5352

54-
#skymap required for either initialization, but not used here
55-
if args.type=='gw':
56-
f = GWFollowup('Precompute_trials_test', '/data/user/jthwaites/o3-gw-skymaps/S191216ap.fits.gz',
57-
start, stop, save=False)
58-
else:
59-
f = AlertFollowup('Precompute_trials_test',
60-
'/data/user/jthwaites/cascade_skymaps/hese_59546_run00135946.evt000006354173.fits',
61-
start, stop, save=False)
53+
#skymap required for initialization, but not used here
54+
f = AlertFollowup('Precompute_trials_test', skymap_files[0],
55+
start, stop, save=False)
6256
f.llh.nbackground=args.bkg*args.deltaT/1000.
6357
#inj = f.initialize_injector(gamma=2.5) #just put this here to initialize f.spatial_prior
6458
#print f.llh.nbackground
@@ -80,9 +74,7 @@
8074
maps[jj, pixels] = val['TS']
8175
print("DONE")
8276
hp_sparse = maps.tocsr()
83-
if args.type=='gw':
84-
outfilename = outdir+'gw_{:.1f}_mHz_seed_{}_delta_t_{:.1e}.npz'.format(args.bkg, args.seed, args.deltaT)
85-
else:
86-
outfilename = outdir+'{:.1f}_mHz_seed_{}_delta_t_{:.1e}.npz'.format(args.bkg, args.seed, args.deltaT)
77+
78+
outfilename = outdir+'{:.1f}_mHz_seed_{}_delta_t_{:.1e}.npz'.format(args.bkg, args.seed, args.deltaT)
8779
sparse.save_npz(outfilename, hp_sparse)
8880
print("Saved to {}".format(outfilename))

0 commit comments

Comments
 (0)