#!/usr/bin/env ruby THRESHOLD = (0.2 * (10**6))..(10**6) FIFO_SIZE = 20 * 2 # even !! #TARGET_CH = 3..5 target = nil if ARGV.size == 0 then target = $stdin elsif ARGV.size == 1 then target = open(ARGV.shift, 'r') rescue nil else puts "Usage1 : #{__FILE__} log_CSV" puts "Usage2 : | #{__FILE__}" exit end unless target then puts "target not found!!" exit end =begin 移動平均を前後でとって、不連続点を発見する =end sum_0 = [] sum_1 = [] values_fifo = [] target.each{|line| values = line.split(/,/) values[0] = values[0].to_i values[1..-1] = values[1..-1].collect{|item| item.to_f} values_fifo.push(values) sum_1 = values[2..-1].zip(sum_1).collect{|item| item[0] + (item[1] || 0)} if values_fifo.size <= (FIFO_SIZE / 2) then next end boundary = (values_fifo.size - (FIFO_SIZE / 2).to_i) - 1 sum_1 = values_fifo[boundary][2..-1].zip(sum_1).collect{|item| item[1] - item[0]} sum_0 = values_fifo[boundary][2..-1].zip(sum_0).collect{|item| item[0] + (item[1] || 0)} if values_fifo.size < FIFO_SIZE then next end hits = [] diff_abs = sum_0.zip(sum_1).collect{|item| (item[0] - item[1]).abs / (FIFO_SIZE / 2)} diff_abs.each_with_index{|v, ch| #unless TARGET_CH.include?(ch) then next end if THRESHOLD.include?(v) then hits << ch #puts "Hit! : Ch => #{ch}, Time => #{values_fifo[boundary + 1][1]}, Diff => #{v}" end } if hits.empty? then sum_0 = (values_fifo.shift)[2..-1].zip(sum_0).collect{|item| item[1] - item[0]} next end scores = {} search_target = values_fifo[boundary..-1] #p search_target (0..(search_target.size-2)).each{|i| sum = 0 t = search_target[i][1] target0 = search_target[i][2..-1] target1 = search_target[i+1][2..-1] hits.each{|ch| sum += (target0[ch] - target1[ch]).abs} scores[t] = sum } max_elm = (scores.max{|tv_0, tv_1| tv_0[1] <=> tv_1[1]}) puts "Hit! : Ch => #{hits.inspect}, Time => #{max_elm[0]}, Score => #{max_elm[1]}" sum_0 = [] sum_1 = [] values_fifo = [] }