def infer_nonwear_triaxial(x, y, z, minimum_length=timedelta(hours=1), noise_cutoff_mg=13, return_nonwear_binary=False): ''' Use the 3 channels of triaxial acceleration to infer periods of nonwear ''' # Get an exhaustive list of bouts where the monitor was still x_intersect_y_intersect_z = infer_still_bouts_triaxial(x,y,z, noise_cutoff_mg=noise_cutoff_mg, minimum_length=minimum_length) # Restrict those bouts to only those with a length that exceeds the minimum length criterion x_intersect_y_intersect_z = Bout.limit_to_lengths(x_intersect_y_intersect_z, min_length=minimum_length) # Legacy code - probably going to delete this if return_nonwear_binary: # Create a parallel, binary channel indicating if that time point was in or out of wear nonwear_binary = Channel.channel_from_bouts(x_intersect_y_intersect_z, x.timeframe, False, "nonwear", skeleton=x) return (x_intersect_y_intersect_z, nonwear_binary) else: return x_intersect_y_intersect_z
def produce_binary_channels(bouts, lengths, skeleton_channel): Bout.cache_lengths(bouts) bouts.sort(key=lambda x: x.length, reverse=True) channels = [] for length in lengths: # Drop bouts from list if their length is less than x minutes bouts = Bout.limit_to_lengths(bouts, min_length=length, sorted=True) channel_name = "{}_mt{}".format(skeleton_channel.name,length) # Clone the blank channel, set data to 1 where time is inside any of the bouts skeleton_copy = copy.deepcopy(skeleton_channel) chan = Channel.channel_from_bouts(bouts, False, False, channel_name, skeleton=skeleton_copy) channels.append(chan) return channels