Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.92 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. if [ ! $# -eq 4 ]
  4. then
  5.     echo "Incorrect number of arguments:" $# "/ 4"
  6.     exit
  7. fi
  8.  
  9. error=0
  10.  
  11. if [ ! -f $1 ]
  12. then
  13.     echo "Log file" $1 "not found"
  14.     error=1
  15. fi
  16.  
  17. if [ ! -f $2 ]
  18. then
  19.     echo "Eeg file" $2 "not found"
  20.     error=1
  21. fi
  22.  
  23. if [ ! -f $3 ]
  24. then
  25.     echo "Audio file" $3 "not found"
  26.     error=1
  27. fi
  28.  
  29. if [ $error -eq 1 ]
  30. then
  31.     echo "At least one file doesn't exist, goodbye"
  32.     exit
  33. fi
  34.  
  35. if [ ! -r $1 ]
  36. then
  37.     echo "Log file" $1 "not readable"
  38.     error=1
  39. fi
  40.  
  41. if [ ! -r $2 ]
  42. then
  43.     echo "Eeg file" $2 "not readable"
  44.     error=1
  45. fi
  46.  
  47. if [ ! -r $3 ]
  48. then
  49.     echo "Audio file" $3 "not readable"
  50.     error=1
  51. fi
  52.  
  53. if [ $error -eq 1 ]
  54. then
  55.     echo "At least one file is unreadable, goodbye"
  56.     exit 0
  57. fi
  58.  
  59.  
  60. if [ ! -d $4 ]
  61. then
  62.     echo "Directory $4 doesnt exist, trying to create it"
  63.     mkdir -p $4
  64.     if [ $? -ne 0 ]
  65.     then
  66.         echo "Couldn't create directory $4, bye"
  67.         exit
  68.     fi
  69. fi
  70.  
  71. if [ ! -w $4 ]
  72. then
  73.     echo "No write permissions for directory $4, bye"
  74.     exit
  75. fi
  76.  
  77. if [ "${EEG_TZ}" == "" ]
  78. then
  79.     EEG_TZ="UTC"
  80. fi
  81.  
  82. eegDate=$(grep -E '^<StartRecordingDate>' "$2" | sed -E 's_.*>(.*)[.](.*)[.](.*)<.*_\3-\2-\1_')
  83. eegFullHour=$(grep -E '^<StartRecordingTime>' "$2" | sed -E 's_.*>(.*)<.*_\1_')
  84.  
  85. if [ $eegDate = "" -o $eegFullHour = "" ]
  86. then
  87.     echo "Eeg start not found, bye"
  88. fi
  89.  
  90. eegS=$(echo $eegDate $eegFullHour)
  91. eegStart=$(date --date "$eegS" +%s.%N | sed -E 's_0+$__')
  92. hz=$(grep -E '^<SamplingRate>' $2 | grep -oE '[0-9]+')
  93.  
  94. duplicates=$(grep -oE '^[^ ]+' timetable.log | sort | uniq -d)
  95. # TODO check if not empty
  96.  
  97. wavStart=$(grep -E '^beep' $1 | grep -oE '[0-9.]+$')
  98. #TODO check if eeg/wav start is empty
  99.  
  100. tickCount=$(grep -cE '^<tick>' $2)
  101. firstTick=$(grep -nE '^<tick>' eeg.xml | head -n 1 | cut -d':' -f1)
  102. echo "ticks = $tickCount"
  103. eegDuration=$(echo "$tickCount / $hz" | bc -l)
  104. eegEnd=$(echo "$eegStart + $eegDuration" | bc)
  105.  
  106. wavDuration=$(sox $3 -n stat 2>&1 | grep '^Length' | sed -E 's_.*[[:space:]]([.0-9]+$)_\1_')
  107. wavEnd=$(echo "$wavStart + $wavDuration" | bc)
  108.  
  109. echo "[file] [start] [end] [duration]"
  110. echo "eeg $eegStart $eegEnd $eegDuration"
  111. echo "wav $wavStart $wavEnd $wavDuration"
  112.  
  113. st=$(cat $1)
  114. IFS=$'\n'
  115. for x in $st; do
  116.     name=$(echo $x | grep -oE '^[^ ]+')
  117.  
  118.     # in case someone decides to put multiple spaces
  119.     durationExpr=$(echo $x | sed -E 's_^.*[[:space:]]+([0-9.]+)[[:space:]]([0-9.]+)$_\2-\1_')
  120.  
  121.     # in unix time
  122.     uStart=$(echo $durationExpr | cut -d'-' -f2)
  123.     uEnd=$(echo $durationExpr | cut -d'-' -f1)
  124.     duration=$(echo $durationExpr | bc | sed -E 's_^[.]_0._')
  125.  
  126.     pissOff="0"
  127.     fail=$(echo "$duration < 0.2" | bc)
  128.     if [ $fail -eq "1" ]
  129.     then
  130.         echo "Duration for $name is too short ($duration)"
  131.         pissOff="1"
  132.     fi
  133.  
  134.     fail=$(echo "$uStart < $eegStart" | bc)
  135.     if [ $fail -eq "1" ]
  136.     then
  137.         echo "Start of $name is before eeg start"
  138.         pissOff="1"
  139.     fi
  140.  
  141.     fail=$(echo "$uStart < $wavStart" | bc)
  142.     if [ $fail -eq "1" ]
  143.     then
  144.         echo "Start of $name is before wav start"
  145.         pissOff="1"
  146.     fi
  147.  
  148.     fail=$(echo "$uEnd > $eegEnd" | bc)
  149.     if [ $fail -eq "1" ]
  150.     then
  151.         echo "End of $name is after eeg end"
  152.         pissOff="1"
  153.     fi
  154.  
  155.     fail=$(echo "$uEnd > $wavEnd" | bc)
  156.     if [ $fail -eq "1" ]
  157.     then
  158.         echo "End of $name is after wav end"
  159.         pissOff="1"
  160.     fi
  161.  
  162.     if [ $pissOff -eq "1" ]
  163.     then
  164.         echo "At least one error encountered with $name, skipping"
  165.         continue
  166.     fi
  167.  
  168.     audioFileName="${4}/${name}_lar.wav"
  169.     audioStart=$(echo "$uStart-$wavStart" | bc)
  170.     #echo $audioFileName
  171.     sox "$3" "$audioFileName" trim $audioStart $duration
  172.  
  173.     eegFileName="${4}/${name}_eeg.xml"
  174.     startTick=$(echo "($uStart - $eegStart) * $hz" | bc | awk -F'.' '{print $1}')
  175.     endTick=$(echo "($uEnd - $eegStart) * $hz" | bc | awk -F'.' '{print $1}')
  176.     tickDiff=$(echo "$endTick - $startTick + 1" | bc)
  177.  
  178.     tailArg=$((endTick + firstTick))
  179.     #echo "$startTick $endTick $tailArg"
  180.  
  181.     head -n $tailArg $2 | tail -n $tickDiff > $eegFileName
  182.     echo "$name - done"
  183. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement