Skip to content

Commit

Permalink
multiifo p/t/a, first testing version
Browse files Browse the repository at this point in the history
  • Loading branch information
tdent committed Jul 28, 2019
1 parent 8cb8459 commit 4b39e7a
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 117 deletions.
85 changes: 47 additions & 38 deletions bin/hdfcoinc/pycbc_multiifo_coinc_findtrigs
Original file line number Diff line number Diff line change
Expand Up @@ -175,31 +175,35 @@ num_templates = len(h5py.File(args.template_bank, "r")['template_hash'])
tmin, tmax = parse_template_range(num_templates, args.template_fraction_range)
logging.info('Analyzing template %s - %s' % (tmin, tmax-1))

# Create dictionary for trigger files indexed on ifo name
trigs = {}
class MultiifoTrigs(object):
"""store trigger info in parallel with ifo name and shift vector"""
def __init__(self):
self.ifos = []
self.to_shift = []
self.singles = []

trigs = MultiifoTrigs()
for i in range(len(args.trigger_files)):
logging.info('Opening trigger file %s: %s' % (i,args.trigger_files[i]))
reader = ReadByTemplate(args.trigger_files[i],
args.template_bank,
args.segment_name,
args.veto_files)
trigs[reader.ifo] = reader

# Assign shift vectors
ifolist = trigs.keys()
# time shift is subtracted from pivot ifo time
slidevec = [(-1 if i == args.pivot_ifo else 0) for i in ifolist]
logging.info('Applying time shifts', slidevec, 'to ifos', ifolist)
slidedict = {i: s for i, s in zip(ifolist, slidevec)}
ifo = reader.ifo
trigs.ifos.append(ifo)
# time shift is subtracted from pivot ifo time
trigs.to_shift.append(-1 if i == args.pivot_ifo else 0)
logging.info('Applying time shifts *', trigs.to_shift[-1], 'to ifo',
trigs.ifo[-1])
trigs.singles.append(reader)

# Coinc_segs contains only segments where all ifos are analyzed
coinc_segs = trigs[args.pivot_ifo].segs
for ifo in trigs:
coinc_segs = (coinc_segs & trigs[ifo].segs).coalesce()

for ifo in trigs:
trigs[ifo].segs = coinc_segs
trigs[ifo].valid = veto.segments_to_start_end(trigs[ifo].segs)
coinc_segs = veto.start_end_to_segments([], [])
for i, sngl in zip(trigs.ifos, trigs.singles):
coinc_segs = (coinc_segs & sngl.segs)
for sngl in trigs.singles:
sngl.segs = coinc_segs
sngl.valid = veto.segments_to_start_end(sngl.segs)

# Stat class instance to calculate the coinc ranking statistic
rank_method = stat.get_statistic(args.ranking_statistic)(args.statistic_files)
Expand Down Expand Up @@ -230,21 +234,25 @@ data = {'stat': [], 'decimation_factor': [], 'timeslide_id': [], 'template_id':

for tnum in template_ids:
tids = {}
for ifo in trigs:
tids[ifo] = trigs[ifo].set_template(tnum)

for ifo in tids:
if not len(tids[ifo]): # no triggers in this template
continue

times_full = {ifo:trigs[ifo]['end_time'] for ifo in trigs}
logging.info('Trigs for template %s, '% (tnum))
for ifo in times_full:
logging.info('%s:%s' % (ifo, len(times_full[ifo])))

logging.info('Calculating Single Detector Statistic')
sds_full = {ifo: rank_method.single(trigs[ifo]) for ifo in trigs}

for i, sngl in zip(trigs.ifos, trigs.singles):
# restrict trigger information to current template
tids[i] = sngl.set_template(tnum)

mintrigs = min([len(ti) for ti in tids.values()])
if mintrigs == 0:
logging.info('No triggers in at least one ifo for template %i, '
'skipping' % tnum)
continue

times_full = {}
sds_full = {}
logging.info('Obtaining trigs for template %i, ' % (tnum))
for i, sngl in zip(trigs.ifos, trigs.singles):
logging.info('%s:%s' % (i, len(tids[i])))
times_full[i] = sngl['end_time']
# get single-detector statistic
sds_full[i] = rank_method.single(sngl)

# Loop over the single triggers and calculate the coincs they can form
start0 = 0
while start0 < len(sds_full[args.pivot_ifo]):
Expand All @@ -271,13 +279,14 @@ for tnum in template_ids:
args.coinc_threshold,
args.pivot_ifo,
args.fixed_ifo)
logging.info('Coincident Trigs: %s' % (len(ids[args.pivot_ifo])))
logging.info('Calculating Multi-Detector Combined Statistic')
sdswithids = {}
for ifo in sds:
sdswithids[ifo] = sds[ifo][ids[ifo]]
logging.info('Coincident trigs: %s' % (len(ids[args.pivot_ifo])))

logging.info('Calculating multi-detector combined statistic')
# list in ifo order of remaining trigger data
single_info = [(i, sds[i][ids[i]]) for i in trigs.ifos]
cstat = rank_method.coinc_multiifo(
sdswithids, slide, args.timeslide_interval, to_shift=None,
single_info, slide, args.timeslide_interval,
to_shift=trigs.to_shift,
time_addition=args.coinc_threshold)

# index values of the zerolag triggers
Expand Down
Loading

0 comments on commit 4b39e7a

Please sign in to comment.