#!/bin/sh
#
# process_day.sh
#
# Collect Q transform based analysis results for one day of science mode data.
#
# usage:
#
#   process_day.sh startTime [triggers] [event] [properties] [report]
#
# The requested startTime may be in GPS seconds or a format understood
# by the LIGOTools tconvert utility.
#
# The remaining optional arguments specify whether or not trigger production,
# a qscan of the loudest event, plots of trigger properties, or an html report
# is produced.  By default nothing is produced.

# Shourov K. Chatterji
# shourov@ligo.caltech.edu

# $Id: process_day.sh,v 1.16 2007/08/25 11:03:15 shourov Exp $

################################################################################
#                              Setup environment                               #
################################################################################

# change to directory containing this script
cd `dirname $0`

# path to Q transform installation
Q=../..

# setup environment
. ${Q}/bin/qsetup.sh

################################################################################
#                            Command line arguments                            #
################################################################################

# usage information
if [ $# -eq 0 ]; then
  echo "usage: `basename $0` startTime [triggers] [event] [properties] [report]" 1>&2
  exit 1
fi

# analysis start time
echo "$1" | grep -qv [^0-9] >/dev/null
if [ $? -eq 0 ]; then
   startTime="$1"
else
   startTime=`tconvert "$1"`
fi

# requested products
if [ $# -gt 1 ]; then
  shift 1
  requested="$*"
else
  requested=""
fi

################################################################################
#                              Timing information                              #
################################################################################

# analysis time string truncated to nearest day
startYear=`tconvert -f "%Y" ${startTime}`
startMonth=`tconvert -f "%m" ${startTime}`
startDay=`tconvert -f "%d" ${startTime}`
startTimeString=`tconvert -f "%Y-%m-%d 00:00:00" ${startTime}`

# analysis start time truncated to nearest day
startTime=`tconvert "${startTimeString}"`

# analysis duration in days
analysisDuration="1"

# analysis stop time
stopTime=`expr ${startTime} + 86400 \* ${analysisDuration}`

# minimum segment duration in seconds
minimumSegmentDuration=`grep blockDuration parameters.txt | \
                        awk ' { print int($2) } '`

# append minimum segment duration to analysis stop time
stopTime=`expr ${stopTime} + ${minimumSegmentDuration}`

# time of previous day
previousDay=`tconvert "${startYear}-${startMonth}-${startDay} \
                       00:00:00 UTC" - ${analysisDuration}day`
previousDayYear=`tconvert -f "%Y" ${previousDay}`
previousDayMonth=`tconvert -f "%m" ${previousDay}`
previousDayDay=`tconvert -f "%d" ${previousDay}`

# time of next day
nextDay=`tconvert "${startYear}-${startMonth}-${startDay} \
                   00:00:00 UTC" + ${analysisDuration}day`
nextDayYear=`tconvert -f "%Y" ${nextDay}`
nextDayMonth=`tconvert -f "%m" ${nextDay}`
nextDayDay=`tconvert -f "%d" ${nextDay}`

################################################################################
#                             Detector information                             #
################################################################################

# gravitational wave channel name
# *** THIS NEEDS TO BE UPDATED TO HANDLE MULTIPLE DETECTORS ***
channelName=`grep channelName parameters.txt | \
             awk ' { print $2 } ' | sed -e "s|[{}']||g"`

# interferometer identifier
# *** THIS NEEDS TO BE UPDATED TO HANDLE MULTIPLE DETECTORS ***
interferometer=`echo ${channelName} | sed -e 's|:.*$||'`

################################################################################
#                             Directory structure                              #
################################################################################

# day directory name
dayDirectory="${startYear}/${startMonth}/${startDay}"

# create output directory
mkdir -p ${dayDirectory}

# initialize log file
date -u +"%Y-%m-%d %H:%M:%S %Z" >>${dayDirectory}/log.txt

################################################################################
#                              Trigger production                              #
################################################################################

# begin if triggers requested
if [ -n "`echo ${requested} | grep -e triggers`" ]; then

  # copy parameter file
  echo "copying parameter file..." >>${dayDirectory}/log.txt
  cp parameters.txt ${dayDirectory}/parameters.txt

  # determine science mode segments
  echo "getting science mode segments..." >>${dayDirectory}/log.txt
  getsegments.sh ${interferometer} ${startTime} ${stopTime} >${dayDirectory}/segments.txt

  # collect triggers
  echo "collecting triggers..." >>${dayDirectory}/log.txt
  cat ${dayDirectory}/*/triggers.txt \
    >${dayDirectory}/triggers.txt 2>/dev/null

  # down-select triggers
  echo "down-selecting triggers..." >>${dayDirectory}/log.txt
  ${Q}/postprocess/bin/select ${dayDirectory}/triggers.txt \
                              ${dayDirectory}/triggers.txt.tmp
  mv ${dayDirectory}/triggers.txt.tmp ${dayDirectory}/triggers.txt

  # cluster triggers
  echo "clustering triggers..." >>${dayDirectory}/log.txt
  ${Q}/postprocess/bin/select 1.0 \
                              ${dayDirectory}/triggers.txt \
                              ${dayDirectory}/clusters.txt

  # sort triggers by time
  sort -g ${dayDirectory}/triggers.txt >${dayDirectory}/triggers.txt.tmp
  sort -g ${dayDirectory}/clusters.txt >${dayDirectory}/clusters.txt.tmp
  mv ${dayDirectory}/triggers.txt.tmp ${dayDirectory}/triggers.txt
  mv ${dayDirectory}/clusters.txt.tmp ${dayDirectory}/clusters.txt

  # collect livetimes
  echo "collecting livetimes..." >>${dayDirectory}/log.txt
  cat ${dayDirectory}/*/livetime.txt 2>/dev/null | sort -g \
    >${dayDirectory}/livetime.txt

  # merge livetimes
  echo "merging livetimes..." >>${dayDirectory}/log.txt
  segexpr ${dayDirectory}/livetime.txt ${dayDirectory}/livetime.txt.tmp
  mv ${dayDirectory}/livetime.txt.tmp ${dayDirectory}/livetime.txt

# end if triggers requested
fi

################################################################################
#                           Loudest event properties                           #
################################################################################

# begin if loudest event qscan, trigger properties, or html report requested
if [ -n "`echo ${requested} | grep -e event -e properties -e report`" ]; then

  # find loudest event
  echo "finding loudest event..." >>${dayDirectory}/log.txt
  loudestEventProperties=`sort -gk 5,5 ${dayDirectory}/clusters.txt \
                          2>/dev/null | tail -n 1`
  if [ -n "${loudestEventProperties}" ]; then
    loudestEventTime=`echo ${loudestEventProperties} | awk ' { print $1 } '`
    loudestEventFrequency=`echo ${loudestEventProperties} | awk ' { print $2 } '`
    loudestEventDuration=`echo ${loudestEventProperties} | awk ' { print $3 } '`
    loudestEventBandwidth=`echo ${loudestEventProperties} | awk ' { print $4 } '`
    loudestEventSNR=`echo ${loudestEventProperties} | awk ' { printf "%9.3e", sqrt(2 * $5) } '`
  fi

  # retrieve loudest event spectrogram
  rm -f ${dayDirectory}/loudestevent_thumbnail.png
  if [ -n "${loudestEventProperties}" ]; then
    echo "retrieving loudest event spectrogram..." >>${dayDirectory}/log.txt
    loudestEventHour=`tconvert -f "%H" ${loudestEventTime} `
    cp ${dayDirectory}/${loudestEventHour}/loudestevent_thumbnail.png \
       ${dayDirectory}/loudestevent_thumbnail.png
  fi

# end if loudest event qscan, trigger properties, or html report requested
fi

################################################################################
#                              Trigger properties                              #
################################################################################

# begin if trigger properties requested
if [ -n "`echo ${requested} | grep -e properties`" ]; then

  # produce trigger properties
  # *** THIS NEEDS TO BE UPDATED TO HANDLE MULTIPLE DETECTORS ***
  echo "plotting trigger properties..." >>${dayDirectory}/log.txt
  ${Q}/bin/qproperties.sh ${startTime} ${stopTime} \
                          ${dayDirectory}/parameters.txt \
                          ${dayDirectory}/triggers.txt \
                          ${dayDirectory}/clusters.txt \
                          ${dayDirectory}/livetime.txt \
                          ${channelName} \
                          ${dayDirectory}/properties

# end if trigger properties requested
fi

################################################################################
#                                 HTML report                                  #
################################################################################

# begin if html report requested
if [ -n "`echo ${requested} | grep -e report`" ]; then

  # current time stamp
  currentTime=`date -u "+%Y-%m-%d %H:%M:%S %Z"`

  # create day html report
  echo "creating html report..." >>${dayDirectory}/log.txt
  rm -f ${dayDirectory}/style.css
  ln -s ../../../style.css ${dayDirectory}/style.css
  sed -e "s|\[START_YEAR\]|${startYear}|g" \
      -e "s|\[START_MONTH\]|${startMonth}|g" \
      -e "s|\[START_DAY\]|${startDay}|g" \
      -e "s|\[PREVIOUSDAY_YEAR\]|${previousDayYear}|g" \
      -e "s|\[PREVIOUSDAY_MONTH\]|${previousDayMonth}|g" \
      -e "s|\[PREVIOUSDAY_DAY\]|${previousDayDay}|g" \
      -e "s|\[NEXTDAY_YEAR\]|${nextDayYear}|g" \
      -e "s|\[NEXTDAY_MONTH\]|${nextDayMonth}|g" \
      -e "s|\[NEXTDAY_DAY\]|${nextDayDay}|g" \
      -e "s|\[CURRENT_TIME\]|${currentTime}|g" \
      -e "s|\[ANALYSIS_DURATION\]|${analysisDuration}|g" \
      -e "s|\[INTERFEROMETER\]|${interferometer}|g" \
      -e "s|\[LOUDEST_EVENT_TIME\]|${loudestEventTime}|g" \
      -e "s|\[LOUDEST_EVENT_FREQUENCY\]|${loudestEventFrequency}|g" \
      -e "s|\[LOUDEST_EVENT_DURATION\]|${loudestEventDuration}|g" \
      -e "s|\[LOUDEST_EVENT_BANDWIDTH\]|${loudestEventBandwidth}|g" \
      -e "s|\[LOUDEST_EVENT_SNR\]|${loudestEventSNR}|g" \
      -e "s|\[CHANNEL_NAME\]|${channelName}|g" \
    ../html/index_day.html >${dayDirectory}/index.html

  # update link to most recent results
  lastStopTime=`awk ' END { printf "%d", $2 } ' \
                latest_day/livetime.txt 2>/dev/null`
  thisStopTime=`awk ' END { printf "%d", $2 } ' \
                ${dayDirectory}/livetime.txt 2>/dev/null`
  if [ ${thisStopTime:-0} -ge ${lastStopTime:-0} ]; then
    echo "linking html report..." >>${dayDirectory}/log.txt
    rm -f latest_day
    ln -s ${dayDirectory} latest_day
  fi

# end if html report requested
fi

################################################################################
#                             Loudest event QScan                              #
################################################################################

# begin if loudest event qscan requested
if [ -n "`echo ${requested} | grep -e event`" ]; then

  # remove existing loudest event qscan
  existingLoudestEvent=`find ${dayDirectory}/loudestevent -printf "%l" 2>/dev/null`
  if [ -n "${existingLoudestEvent}" ]; then
    echo "removing existing loudest event scan..." >>${dayDirectory}/log.txt
    rm -rf ${dayDirectory}/${existingLoudestEvent}
  fi

  # perform loudest event qscan
  # *** THIS NEEDS TO BE UPDATED TO HANDLE MULTIPLE DETECTORS ***
  rm -f ${dayDirectory}/loudestevent
  if [ -n "${loudestEventProperties}" ]; then
    echo "scanning loudest event..." >>${dayDirectory}/log.txt
    ln -s ${loudestEventTime} ${dayDirectory}/loudestevent
    ${Q}/bin/qscan.sh ${loudestEventTime} \
                      configuration_day.txt \
                      @online \
                      ${dayDirectory}
  fi

# end if loudest event qscan requested
fi

################################################################################
#                                     End                                      #
################################################################################

# return to calling function
echo "done." >>${dayDirectory}/log.txt
exit 0

