Saturday, September 30, 2000

Seismic P1/90 Change/offset shotpoint number

Again one of those old seismic scripts pulled out of of my old failing harddisk. This one allows you to increment/decrement all the shotpoint numbers in a P1/90 file by a certain amount.

Once in a while the navigation department inputs the wrong SP start number
referenced to the preplots ex. start SP 3500 when it should be 3490. This script
takes as input the filename of the file you want to change, and the amount of SP
offset the recorded (wrong) SP number by.

IMPORTANT:
----------
You must add a "+" or a "-" in front of the SP change to be applied
 

SYNTAX: change_sp <FILENAME> <+/- SP TO CHANGE>

#!/opt/perl5/bin/perl

# Sub routine declaration
sub CheckCommandLineSyntax;
sub DisplayOnlineHelp;


# Main script
CheckCommandLineSyntax;
$outfile = "$ARGV[0]" . ".SPcor";

open (P190, "$ARGV[0]") or die ("Could not open $file.\n");
open (OUT, ">$outfile") or die ("Could not open $file.\n");
  $x = 0;
  $line = <P190>;
  while ($line ne "") {
    
    if (($line =~ /^V/g) or ($line =~ /^E/g) or ($line =~ /^S/g) or ($line =~ /^C/g) or ($line =~ /^T/g)) {
      $SPInFile = substr ($line,20,5);
      $CorrectedSP = eval($SPInFile . $ARGV[1]);
      
      $CorrectedSP = "      " . $CorrectedSP;
      $CorrectedSP = substr($CorrectedSP, length($CorrectedSP) - 5, length($CorrectedSP));
      
      $line =~ s/$SPInFile/$CorrectedSP/g;
      print OUT ($line);      
      $x++;
      if ($x == 500) {
        print ("Now processing: \'$SPInFile\'         ->         \'$CorrectedSP\'\n");
        $x = 0;
      }
    }
    else {
      print OUT ($line);      
    }    
    $line = <P190>;
  }
close(P190);
close(OUT);




# Sub routine implementation

sub CheckCommandLineSyntax{
  $arg_cnt = @ARGV;            
  if ($arg_cnt != 2){
    DisplayOnlineHelp;
    die ("SYNTAX: change_sp <FILENAME> <+/- SP TO CHANGE> ...\n\n");
  }
}

sub DisplayOnlineHelp{
  $~ = "HELP";
  write;
}
format HELP =

                change_sp  v1.0
                  by
                Kenneth Thorman
                      
DESCRIPTION:
------------
Once in a while the navigation department inputs the wrong SP start number
referenced to the preplots ex. start SP 3500 when it should be 3490. This script 
takes as input the filename of the file you want to change, and the amount of SP 
offset the recorded (wrong) SP number by. 

IMPORTANT:
----------
You must add a "+" or a "-" in front of the SP change to be applied

Script   : change_sp
Version  : 1.0
Author   : Kenneth Thorman
Date     : 21/6 - 2000

.

Sunday, August 13, 2000

P1/90 Tide correction script

This is an old C-shell script I wrote for a applying tide corrections to P1/90 files. I was running on HP-UX 9.20, so this is rather old :)

This script will apply tide corrections to a number of files
in the current directory.

It will need some things to work:

A tide correction file in the following format
(This file needs to be in the same directory as the p190 file)

Julian seconds:
23673600       .25     274  0 0: 0  11098

Woodside format:
0: 0  11098     0.25


The script will not change the original files, it will make
a copy with tidal corrections applied.


Tide corrected p190 files will be put at : ./tide_corrected/
Original p190 files will be moved to     : ./uncorrected/


#/bin/csh -f
###############################################################################
#                     SEARCH AND REPLACE TEXT STRINGS                         #
###############################################################################
set find_text        = ", NOT FOR TIDES"    
set replace_text     = ", AND FOR TIDES"


###############################################################################
#     DO NOT TOUCH ANYTHING BEYOND THIS POINT UNLESS YOU KNOW WHAT YOU        #
#      ARE DOING. THE CHANGES THAT YOU MAKE TO THE SCRIPT BEYOND THIS         #
#             POINT COULD MAKE THE SCRIPT MISBEHAVE OR CRASH.                 #
#                 IN WORST CASE IT MIGHT AFFECT YOU DATA                      #
#                                                                             #      
#                                                                             #
#                                                                             #
#                              KENNETH THORMAN                                #
#                                18/10-1998                                   #
#                                                                             #
###############################################################################

###############################################################################
#                         CONSTANTS AND VARIABLES                             #
###############################################################################

set file_extension   = "tc"            
set temp_directory   = "./temp"    

############################## OUTPUT TO USER #################################
clear
echo "This script will apply tide corrections to a number of files"
echo "in the current directory."
echo " "
echo "It will need some things to work:"
echo " "
echo "A tide correction file in the following format "
echo "(This file needs to be in the same directory as the p190 file)"   
echo " "
echo "Julian seconds:"
echo "23673600       .25     274  0 0: 0  11098"
echo " "
echo "Woodside format:"
echo "0: 0  11098     0.25"
echo " "
echo " "
echo "The script will not change the original files, it will make"
echo "a copy with tidal corrections applied." 
echo " "
echo " "
echo "Tide corrected p190 files will be put at : ./tide_corrected/"
echo "Original p190 files will be moved to     : ./uncorrected/"
echo " "
echo " "
tput bold
echo -n "        DO YOU WISH TO CONTINUE (Y/N):"
tput sgr0
set continue = $<




##################### YES I WANT TO APPLY TIDE CORRECTIONS ####################

if (($continue == "y") || ($continue == "Y")) then
  repeat 2 echo " "
  tput bold
  


  # ASKING THE USER FOR THE FILE PREFIX
  echo -n "What is the prefix for the files you want to tide correct(HZI98..): "
  tput sgr0
  set file_prefix = $<
  


  # WRITING INFORMATION HEADER TO THE LOG (Tide.log)
  echo "        TIDE CORRECTION LOG" > Tide.log
  echo "        -------------------" >>Tide.log
  repeat 4 echo " " >> Tide.log
  


  # GETTING A LIST OVER ALL THE FILES IN THE CURRENT DIRECTORY THAT MATCH 
  # THE FILE PREFIX THE USER HAS TYPED IN
  set file_list = `ls -1 ${file_prefix}*`
  


  # WRITING ALL THE FILES OCCURING IN THE FILE_LIST TO THE LOG
  echo "Files specified for tidal correction" >> Tide.log

  foreach file($file_list)
    echo "${file}" >> Tide.log
  end
    


  # IF THE file_list IS EMPTY THEN THER IS NO FILES IN THE CURRENT
  # DIRECTORY, WITH THE USER SPECIFIED FIL PREFIX. WRITING THE OUTPUT
  # TO BOTH THE SCREEN AND TO THE LOG. IF THERE IS NO FILES WITH THE
  # SAME PREFIX AS SPECIFIED THEN EXIT
  if ($#file_list == 0) then
    tput bold
    echo " "
    echo "There is no file with the prefix ${file_prefix} in `pwd`" | tee -a Tide.log
    echo "Exiting..." | tee -a Tide.log
    tput sgr0
    exit
  endif  
  
  

  # ASKING THE USER FOR WHICH TIDAL CORRECTION FILE HE/SHE WANTS TO USE
  repeat 2 echo " "
  tput bold
  echo -n "What is the name of the tide correction file: " 
  tput sgr0
  set tide_cor_file = $<      

  

  # CHECKING IF THE TIDE CORRECTION FILE SPECIFIED BY THE USER 
  # EXISTS IN THE CURRENT DIRECTORY. KEEPS ON ASKING THE USER 
  # UNTIL A FILE THAT ACTUALLY EXITS IN THE CURRENT DIRECTORY IS
  # SPECIFIED. TO BREAK THE LOOP PRESS <CTRL> + C
  set tide_file_found = `ls -1 ${tide_cor_file}`
  
  while ($#tide_file_found == 0) 
    echo "There is no tide correction file named '$tide_cor_file' in this directory" | tee -a Tide.log
    repeat 2 echo " "
    tput bold
    echo -n "What is the name of the tide correction file: " 
    tput sgr0
    set tide_cor_file = $<      
    set tide_file_found = `ls -1 ${tide_cor_file}`
  end
  
  

  # WRITING INFORMATION TO THE LOG
  echo "Tide correction file set to ${tide_cor_file}" >> Tide.log
  
  

  # ASKING THE UDER WHAT FORMAT THE TIDE CORRECTION FILE IS IN
  repeat 2 echo " "
  tput bold
  echo "What format is ${tide_cor_file} (1, 2 or 3)? "
  tput sgr0
  echo " "
  echo "1. Julian seconds:"
  echo "   23673600       .25     274  0 0: 0  11098"
  echo "2. Woodside format:"
  echo "   0: 0  11098     0.25"
  echo "3. Other Format"
  echo " "
  tput bold
  echo -n "Format(1, 2 or 3): "
  tput sgr0
  set format = $<
  


  # IF THE FORMAT SPECIFIED BY THE USER IS JULIAN SECONDS THEN THE 
  # TIDE CORRECTION PROGRAM CAN USE THE FILE DIRECTLY. 
  if ($format == 1) then
    echo "Tide corretion file format is Julian seconds" >> Tide.log
  
  

  # IF THE FORMAT SPECIFIED BY THE USER IS WOODSIDE TIDE CORRECTION
  # FILE FORMAT THEN THE PROGRAM CANNOT USE THE FILE DIRECTLY. THE SCRIPT
  # WILL THEN CHANGE THE FORMAT TO JULIAN SECONDS.
  else if ($format == 2) then
    repeat 2 echo " "
    tput bold



    # WRITING INFORMATION TO THE LOG
    echo "Tide correction file is in Woodside format." >> Tide.log
    echo "Woodside format not compatible." >> Tide.log
    echo "Converting Woodside format to Julian seconds format" >> Tide.log



    # LETTING THE USER KNOW WHAT IS HAPPENING
    echo "Creating Julian seconds formatted tide correction file."
    echo "Please wait, this may take a while..."
    tput sgr0
    echo " "
    echo " "
    echo " "
    
    

    # CREATING THE TEXT FILE NEEDED FOR THE CONVERTION
    # FORMAT FOR THE TEXT FILE IS:
    #
    # LINE 1: NAME OF TIDE CORRECTION FILE IN WOODSIDE FORMAT
    # LINE 2: NAME OF THE OUTPUT FILE IN JULIAN SECONDS FORMAT
    #         (THIS IS THE ORIGINAL NAME + .js)
    echo $tide_cor_file > c2jtime_hp.script
    echo "$tide_cor_file.js" >> c2jtime_hp.script
    
    

    # USE THE TEXT FILE JUST CREATED TO CREATE THE NEW FORMATED
    # TIDE CORRECTION FILE AUTOMATICALLY. CALL TO C PROGRAM.
    # THE PROGRAM IS RESIDING IN /home.sprint/bin/
    c2jtime_hp <c2jtime_hp.script >> Tide.log
    
    

    # REMOVE THE TEXT FILE
    rm -f c2jtime_hp.script
  
  

  # IF THE USER SPECIFIES ANOTHER FORMAT THAN EITHER WOODSIDE OR
  # JULIAN SECONDS THEN THE SCRIPT CANNOT HANDLE IT SO EXIT
  else                         # If other format then abort
    repeat 2 echo " "
    tput bold



    # WRITE INFORMATION TO THE LOG
    echo "The format for the tide correction file is neither Woodside format" >> Tide.log
    echo "or Julian seconds format. Format not supported." >> Tide.log
    echo "Aborting." >> Tide.log
    echo "Exiting script" >> Tide.log



    # OUTPUT INFORMATION FOR THE USER
    echo "            FORMAT NOT SUPPORTED - ABORTING."
    tput sgr0
    exit
  endif
  
  

  # NOW GETTING READY TO TIDE CORRECT THE P190 FILES IN THIS DIRECTORY
  # THIS IS DONE BY A PROGRAM. THIS PROGRAM NORMALLY NEEDS USER INPUT
  # IN THIS FORM:
  # 1. WHAT IS THE TIDE CORRECTION YOU WANT TO USE CALLED?
  # 2. WHAT P190 FILE DO YOU WANT TO TIDE CORRECT?
  # 3. WHAT IS THE NAME FOR THE NEW P190 OUTPUT FILE?
  # 4. USE THE SAME TIDE CORRECTION FILE FOR ANOTHER P190 FILE?  
  repeat 2 echo " "
  tput bold
  echo "Creating script file needed by tide correction program: p190tide_hp"  
  echo "Please wait, this may take some time"
  echo "Creating script file needed for tide correction program." >> Tide.log
  echo "Script file named: tide.script" >> Tide.log
  tput sgr0
  echo " "
  
  set IsJulianSeconds = `ls -1 $tide_cor_file | grep -c ".js"`
  
  

  # IF THE TIDE CORRECTION FILE FORMAT IS JULIAN SECONDS
  # THEN JUST USE THE FILENAME AS SPECIFIED BY THE USER
  # BUT IF THE INITIAL FILE GIVEN BY THE USER IS WOODSIDE FORMAT
  # THEN THE SCRIPT HAS RENAMED THE CONVERTED FILE TO FILENAME + .js
  # THEN UED THIS FILENAME.
  # WRITE THIS INFORMATION TO THE SCRIPT FILE REQUIRED BY THE
  # P190 CONVERTION PROGRAM
  if ($IsJulianSeconds > 0) then 
    echo "${tide_cor_file}" > tide_script
  else
    echo "${tide_cor_file}.js" > tide_script
  endif
  
  

  # CREATING THE SCRIPT FILE FOR ALL OF THE P190 FILES THAT NEED
  # TIDE CORRECTIONS
  set file_list = `ls -1 ${file_prefix}*`
  foreach file ($file_list)
    


    # WRITE INPUT P190 FILE TO FILE
    echo $file >> tide_script
    


    # WRITE INFO TO LOG
    echo "${file} added to scriptfile." >> Tide.log
    


    # WRITE WHERE TO PUT THE TIDE CORRECTED OUTPUT FILE
    echo "./tide_corrected/${file}" >> tide_script
  


    # IF THE FILE IS NOT THE LAST FILE THE WRITE AN "y"
    # THIS IS THE ANSWER TO THE QUESTION
    # USE THE SAME TIDE CORRECTION FILE FOR ANOTHER P190 FILE?
    # IF IT IS THE LAST FILE THEN WRITE "n"
    if $file != $file_list[$#file_list] then
      echo "y" >> tide_script
    else
      echo "n" >> tide_script
    endif  
  end #foreach
  
  

  # TELL THE USER AND WRITE TO THE LOG THAT THE SCRIPT FILE IS FINISHED
  echo "Finished creating script file." | tee -a Tide.log
  
  

  # CHECKING THAT THE NECESARY DIRECTORY STRUCTURE IS EXISTING
  # IF IT IS NOT THEN CREATE WHAT IS MISSING
  echo "Now checking directory structure" | tee -a Tide.log
  if ! -d tide_corrected then         # checking if directory exits
    mkdir ./tide_corrected
    echo "Directory ./tide_corrected not found." | tee -a Tide.log
    echo "Creating directory ./tide_corrected." | tee -a Tide.log 
  else
    echo "Directory ./tide_corrected allready exists, so do not create." | tee -a Tide.log
  endif

  if ! -d uncorrected then        # checking if directory exits
    mkdir ./uncorrected
    echo "Directory ./uncorrected not found." | tee -a Tide.log
    echo "Creating directory ./uncorrected." | tee -a Tide.log 
  else
    echo "Directory ./uncorrected allready exists, so do not create." | tee -a Tide.log
  endif
  
  
  # TELL THE USER THAT THE SCRIPT IS FINISHED CREATING DIRECTORY
  # STRUCTURE
  echo "Finished checking directory structure" | tee -a Tide.log
  echo " "
  echo " "
  tput bold
  echo "Now tide correcting p190 files." | tee -a Tide.log
  echo "This may take a long time depending on how many files you are correcting"
  echo "Note: If you files contains SRG's this may take hours"
  tput sgr0
  repeat 2 echo " " | tee -a Tide.log
  
  
  
  # CALL TO THE TIDE CORRECTION PROGRAM. THIS PROGRAM IS A C PROGRAM
  # RESIDING IN /home/sprint/bin/.
  # THE PROGRAM IS CALLED WITH THE TEST FILE THAT CONTAINS THE
  # INFORMATION ABOUT WHICH FILES TO CORRECT, WHAT TO NAME THE OUTPUT
  # FILES AND WHAT TIDE CORRECTION FILE TO USE
  p190tide_hp <tide_script | tee -a Tide.log
  
  repeat 2 echo " " | tee -a Tide.log
  


  # WRINTING INFORMATION TO THE LOG
  cd ./tide_corrected
  set file_list = `ls ${file_prefix}*.p190`
  foreach file ($file_list)
    echo "${file} has been tide corrected" >> ../Tide.log 
  end
  cd ..
  

  
  # INFORMATION
  echo " " >> Tide.log
  echo "All files have now been tide corrected." | tee -a Tide.log
  
  
  
  # REMOVING THE TEXTFILE / SCRIPTFILE USED BY THE TIDE CCORRECTION
  # PROGRAM 
  rm -f tide_script
  echo "Removing tide.script" >> Tide.log
  
  
  
  # MOVING THE ORIGINAL FILES TO DIRECTORY ./uncorrected/ 
  tput bold
  echo " " 
  echo " "
  echo "Moving original p190 files to ./uncorrected" | tee -a Tide.log
  echo " "
  tput sgr0
  mv ./$file_prefix* ./uncorrected/
  
  cd tide_corrected
  
  
  
  # IF THERE IS NO TEMPORARY DIRECTORY IN ./tide_corrected THEN MAKE ONE
  if (! -d temp) then
    echo "Creating temp directory." >> ../Tide.log
    mkdir temp
  endif



  # GETTING READY TO TRY TO CHANGE THE HEADER IN THE TIDE
  # CORRECTED P190 FILES
  set file_list = `ls -1 ${file_prefix}*.p190`
  
  repeat 4 echo " "
  tput bold
  echo "The script is now going to try to change the header on the files"
  echo "that has been tide corrected."
  echo " "
  echo "The script makes a search/replace from the first line of the p190"
  echo "to line 40."
  echo " "
  echo "The search and replace values are specified in the script."
  echo "If the search and replace values does not suit you then"
  echo "you will have to change them in the script."
  echo " "
  echo " "
  echo "The current search value is : ${find_text}"
  echo "The current replace value is: ${replace_text}"
  echo " "
  echo " "
  echo "If you know that you p190 header specifies tidal correction in"
  echo "different way or with other textstrings than these mentioned"
  echo "above, then exit the script now and change the search and"
  echo "replace strings in the script before continuing"
  echo " "
  echo "You can find the script /home/sprint/bin/tide_correct "
  echo " "
  echo -n "          Do you wish to continue(Y/N):"
  set exit = $<
  echo " "
  
  if (($exit == "n") || ($exit == "N")) then
    echo "Script aborted by user." >> ../Tide.log
    exit
  endif
  
  
  
  # INFORMATION
  echo "Trying to change header for tide corrected files." | tee -a ../Tide.log
  tput sgr0
     
    
    
    # GET A LIST OVER ALL THE FILES THAT JUST HAVE BEEN TIDE CORRECTED
    # IF THE USER TIDE CORRECTS HIS FILES SEVERAL TIMES THE SCRIPT WILL
    # AUTOMATICALLY KNOW THIS AND IT WILL NOT TOUCH ANY FILES WITH THE
    # CORRECT HEADER
    set file_list = `ls -1 ${file_prefix}*{.p190,.cmb,.srg}` 
    foreach file ($file_list)
      
      
      
      # LOOKING FOR THE FIND_TEST IN THE P190.
      # IF THE USER USES ANOTHER WAY OF DESCRIBING IF THE P190 FILE IS 
      #    TIDE CORRECTED OR NOT TIDE CORRECTED THEN THE USER MUST CHANGE 
      # THE SEARCH STRING IN THE TOP OF THE SCRIPT. AS DEFAULT THE SCRIPT 
      # LOOKS FOR ", NOT FOR TIDES" AND REPLACES THIS WITH ", AND FOR TIDES"
      #
      # THIS IS A NORMAL HEADER IN A P190 (NO TIDE CORRECTION)
      #
      # H2600DEPTH DATA REDUCTION   CORRECTED FOR TRANSDUCER DEPTH, NOT FOR TIDES 
      #
      #
      #
      # THE SCRIPT COPIES THE P190 TO A TEMP DIRECTORY AND CHANGES THE 
      # HEADER TO THIS
      #
      # H2600DEPTH DATA REDUCTION   CORRECTED FOR TRANSDUCER DEPTH, AND FOR TIDES
      set number_of_finds = `cat ${file} | grep -c -E -e ", ${find_text}"`
      
      if ($#number_of_finds > 0) then
        echo "${#number_of_finds} match(es) to '${find_text}' found in ${file}" | tee -a ../Tide.log 
        echo "Now changing header for file: ${file}" | tee -a ../Tide.log
        sed "1,40 s/${find_text}/${replace_text}/g" ${file} > ${temp_directory}/${file}.${file_extension}
        rm -f ./${file}
      else
        echo "${file} does not contain any matches to '${find_text}'" | tee -a ../Tide.log
      endif  
    end
    
    
    
    # MOVING ALL THE TIDE CORRECTED P190 FILES WITH THE CORRECT HEADER
    # TO ./tide_corrected
    mv $temp_directory/* ./
    echo "Moving all files from temp directory to ./tide_corrected" >> ../Tide.log
    rm -f -r $temp_directory
  echo " "
  tput bold
 
 
 
 
  # CHECKING DIRECTORY ""./tide_corrected" IF ANY COMBINED FILES EXISTS
  # IF ANY .cmb    IS FOUND THEN CREATE README FILE.
  # BEFORE CREATING THE README FILE CHECK IF IT ALLREAY EXISTS
  echo "Checking ./tide_corrected for any .cmb files" | tee -a ../Tide.log
  set temp = `ls -1 $file_prefix* | grep -c 'cmb'`
  if ($temp > 0) then
    echo ".cmb files found."
    echo "Checking for README file in ./tide_corrected" | tee -a ../Tide.log 
    set temp = `ls -1 | grep -c 'README'`
    if ($temp == 0) then
      echo "No README file found in ./tide_corrected" |tee -a ../Tide.log
      echo "Creating README file in ./tide_corrected" |tee -a ../Tide.log
      makeREADME
    else
      echo "README exists" |tee -a ../Tide.log
    endif
  else
    echo "No .cmb files found" | tee -a ../Tide.log
  endif
  
  
  
  cd ..
  cd uncorrected
  echo " "
  
 
 
  # CHECKING DIRECTORY ""./uncorrected" IF ANY COMBINED FILES EXISTS
  # IF ANY .cmb    IS FOUND THEN CREATE README FILE.
  # BEFORE CREATING THE README FILE CHECK IF IT ALLREAY EXISTS
  echo "Checking ./uncorrected for any .cmb files" | tee -a ../Tide.log
  set temp = `ls -1 $file_prefix* | grep -c 'cmb'`
  if ($temp > 0) then
    echo ".cmb files found."
    echo "Checking for README file in ./uncorrected" | tee -a ../Tide.log 
    set temp = `ls -1 | grep -c 'README'`
    if ($temp == 0) then
      echo "No README file found in ./uncorrected" |tee -a ../Tide.log
      echo "Creating README file in /uncorrected" |tee -a ../Tide.log
      makeREADME
    else
      echo "README exists" |tee -a ../Tide.log
    endif
  else
    echo "No .cmb files found" | tee -a ../Tide.log
  endif
  
  cd ..
   
  echo " "
  tput sgr0
  echo "Finished" 
  
  ############### NO, I DON'T WANT TO APPLY TIDE CORRECTIONS ##################
else 
  exit
endif

Thursday, June 22, 2000

Perl P2/91 & P2/94 fathometer data correction script (code nostalgia)

This is the last posting of a series of postings initiated by me finding an old backup hard disk containing some scripts written when I was working in the Marine Seismic industry.

I remember hacking these scripts in the ed editor on HP-UX, with no version control apart from manually maintaining the versions in different directories. Code wise the script is not something to look at for code structure etc... but it worked well at the time over a period of almost 3 years.

Perl 5 did have full support for classes but for some reason I did not implement this using OO.

The help information in the script states:

DESCRIPTION:
------------
This script comes in handy when your echosounder data in the P291/P294
file either is extremly noisy or non existing. The script can:
- correct noisy data, by deleting corrupt data and inserting new data
- insert new data where data is missing
The script needs the P291/P294 file with the bad data, also needed is a
"WD" file where each line contains a data pair of (SP/Water depths).


WHERE TO GET THE WD FILE:
-------------------------
SEISMIC data processors. To see more help type: "correct_P2_fatho HELPSEISMIC"
at the command prompt.

This version the script allows multiple SP ranges in the WD file.
What happens is that when the SEISMIC data operators pick the water bootom for the
SP range that are bad, the normally pick all SP ranges at one time so you
get at WD file consisting of several SP range-datasets like this (SP/depth):

 992      1285    (start first SP range)
  .         .
 999      1022    (end first SP range)
1245      1000    (start second SP range)
  .         .
1255       995    (end second SP range)   
The script will insert or remove the values for the SP ranges in the WD file
(in this example: 992-999, 1245-1255). The SP range in between the 2 ranges will
not be changed and will retain the original values from the echosounder.


IMPORTANT:
----------
The water depth file cannot have any text/empty lines in the beginning
of the file. The last line must be the last data set (no empty lines).
The script does not care about spaces or TABs on a line. Leading spaces
in a line is no problem. Some times the file from SEISMIC data processing can have double
values for the same shotpoint, this is not a problem.

 992      1285    (double values, not a problem)
 992      1285
      993              1285    (different spacing, not a problem)

and for seismic data processors the help states the following

             correct_p2_fatho v1.3
                  by
                Kenneth Thorman
             SEISMIC data - HELP
                     
1. Migrate the Near Trace Gather
2. Pick the water depth of migrated near trace gather in QCTOOL
3. Output formatted listing of DBU (this will be shotrec/time pairs)
4. In DBU examine file created in QCTOOL

EXAMPLE DBU FORMATTED OUTPUT LISTING

  Enter project name [exnor] :
  Enter access mode (r[eadonly], u[pdate]) [readonly] : u
  Enter selection (h|...|q) [l] : e 17awbpick
  Enter examine option (h|l|o|d|f|g|...|q) [l] : o
  Enter output listing file name (or "stdout") [stdout] : 17wblist.txt
  Enter examine option (h|l|o|d|f|g|...|q) [l] : f
  Enter filename of an existing format [] :
  Enter maximum line length for the list (max 255) [79] :
  Enter number of chars for instance number (0=none) [0] :
  Enter repeat factor for header line (0=no header) [50] : 0
  Select fields to tabulate :
  Enter field (q to quit, \ to list) [KEY1] :
  Enter number of characters to display field data in [4] : 8
  Enter field (q to quit, \ to list) [key1] : time
  Enter number of characters to display field data in [4] : 8
  Enter number of decimal places to display [2] : 4
  Enter field (q to quit, \ to list) [time] : q
  Enter filename to save format (leave blank for none) [] :
  Enter first instance to list (0 to quit) [1] :
  Enter last instance to list [21] :
  Enter first instance to list (0 to quit) [1] : 0
  Enter examine option (h|l|o|d|f|g|...|q) [l] : q
  Enter selection (h|...|q) [e] : q


5. run the following command from the command line:
SYNTAX:

awk '{printf "%s \t %.2f\n", $1+SPRec->SP, $2*Water_Vel}' inputfile > outputfile       

Variables:
SPRec-SP    -     difference from shot record to SP (1000)
Water_Vel   -     water velocity used / 2       ( 750)
inputfile   -     the DBU list
outputfile  -     file to give to the QC

Example:
awk '{printf "%s \t %.2f\n", $1+1000, $2*750}' EX00-22.WD.dbu > EX00-22.waterdepth

.
And finally here is the script


#!/opt/perl5/bin/perl

#################################################################################
#   GENERAL COMMENTS FOR THIS SCRIPT   #
#################################################################################
#           #
# THE TOP LINE YOU SEE IN THIS SCRIPT IS THE LINE THAT TELLS THE COMPUTER WHERE #
# TO LOOK FOR THE PERL - EXECUTOR. (NO IT HAS NOTHING TO DO WITH HANGING :-) #
# IF YOU DO NOT KNOW WHERE PERL IS LOCATED/INSTALLED ON YOUR COMPUTER THEN TRY  #
# TYPING THE FOLLOWING AT THE COMMAND PROMPT.     #
#           #
# whereis perl         #
# which perl         #
#           #
# IMPORTANT:  THIS SCRIPT WAS WRITTEN FOR PERL VERSION 5. SINCE THERE WAS A  #
#   BIG RE-WRITE/CHANGE FROM V4 TO V5 I DOUBT IT WILL RUN ON PERL 4 #
#           #
# 17 Dec 1999,          #
# Kenneth Thorman        #
#################################################################################




 

#################################################################################
#    SUB ROUTINE DECLARATION     #
#################################################################################
sub GetFileBaseName;
sub CheckCommandLineSyntax;
sub OpenFiles;
sub DecideDepthOutput;
sub PutWaterDepthFileIntoArray;
sub ExtractSP;
sub ExtractWD;
sub FormatEchosounderTimeStamp;
sub CreateEchosounderDataCard;
sub Presentation1;
sub Presentation2;
sub Presentation3;
sub Presentation4;
sub DisplayOnlineHelp;
sub DisplayHELPSEISMIC;

#################################################################################
#   VARABLE DECLARATION     #
#################################################################################
$wd_file = $ARGV[1];
$outfile = "$ARGV[0]" . ".wd";
$log_dir = "./";



#################################################################################
#   MAIN SCRIPT FLOW     #
#################################################################################
CheckCommandLineSyntax;
OpenFiles;
$filebasename = GetFileBaseName($ARGV[0]);
$wd_line = <WDFILE>;
$firstsp = int (ExtractSP ($wd_line));
PutWaterDepthFileIntoArray;
$fields_in_array = @wd_file;
$wdc = 0;

$min_sp = 100000;
$x = $fields_in_array;
while ($x >= 0) {    # Loop through the array backwards
  if (($min_sp > $x) and (@wd_file[$x] ne "")) {
    $min_sp = $x;
  }
  $x--;
}

$x = $min_sp;
while ($x <= $fields_in_array) {
  if ((@wd_file[$x] eq "") and (@wd_file[$x-1] ne "")){
    @wd_sp_string[$wdc] = $x-1;
    $wdc++;
  }
  elsif ((@wd_file[$x] ne "") and (@wd_file[$x-1] eq "")){
    @wd_sp_string[$wdc] = $x;
    $wdc++;
  }  
  $x++;
}
print (@wd_sp_string);

$x = 1;
while (@wd_sp_string[$x] ne ""){
  if (@wd_sp_string[$x+1] eq ""){
    $wd_sp_ranges = $wd_sp_ranges . $wd_sp_string[$x-1] . "-" . $wd_sp_string[$x] . ".";
  }
  else{
   $wd_sp_ranges = $wd_sp_ranges . $wd_sp_string[$x-1] . "-" . $wd_sp_string[$x] . ", ";
  } 
  $x = $x + 2;
}
 
$fields_in_array = @wd_file;
$lastsp = $fields_in_array - 1;
$T14101_Cards_Encountered = 1;
Presentation1;


$sp_count = 0;
$line = <P291FILE>;
while ($line ne ""){
  if (($line =~ /E1000/) and ($line =~ /$filebasename/)){
    $p291sp = int(substr($line,24,8));
    if ($sp_count == 0){
      Presentation2;
      $sp_count = 1;
    }
    elsif (($p291sp % 500) == 0){
      Presentation3;
    }
    if (($T14101_Cards_Encountered == 0) and ($wd_file[$p291sp] ne "")){
      $ETimeStamp = FormatEchosounderTimeStamp($line);
      $wd = @wd_file[$p291sp];
      $string = CreateEchosounderDataCard($wd, $ETimeStamp, "                                                                     ");
      print OUTFILE ($string);
      print OUTFILE ($line);
      $T14101_Cards_Encountered = 0;
    }  
    else{
      print OUTFILE ($line);
      $T14101_Cards_Encountered = 0;
    }
  }
  elsif (($line =~ /T14101/) and ($wd_file[$p291sp] ne "")){
    $wd = @wd_file[$p291sp];
    $rest_str = substr($line,12,68);
    $string = CreateEchosounderDataCard($wd, $rest_str);
    print OUTFILE ($string);
    $T14101_Cards_Encountered = 1;
  }
  else{
    print OUTFILE ($line);
  }
  $line = <P291FILE>;
}
$date = `date -u +%x`;
chop ($date);
print LOGFILE ("$date     $outfile     $wd_sp_ranges\n");  
Presentation4;





#################################################################################
#   SUB ROUTINES      #
#################################################################################

#################################################################################
#COMMENTS: "CheckCommandLineSyntax"      #
#-------------------------------------------------------------------------------#
#          #
# ASSIGN THE NUMBER OF CMD. LINE ARG. TO $arg_cnt    #
# IF NUMBER OF CMD. LINE .ARG. NOT EQUALS 2     #
# EXIT PROGRAM AND DISPLAY THE FOLLOWING LINE     #
# "SYNTAX: correct_p291_wb <P291 File> <Waterdepth file> ..."   #
#################################################################################

sub CheckCommandLineSyntax{
  $arg_cnt = @ARGV;   
  if ($ARGV[0] eq "HELPSEISMIC"){
    DisplayHELPSEISMIC;
    die ("SYNTAX: correct_p2_fatho <P2 File> <Waterdepth file> ...\n\n");
  }
  elsif ($arg_cnt != 2){
    DisplayOnlineHelp;
    die ("SYNTAX: correct_p2_fatho <P2 File> <Waterdepth file> ...\n\n");
  }
}








sub DisplayOnlineHelp{
  $~ = "HELP";
  write;
}
format HELP =

     correct_p2_fatho v1.3
      by
       Kenneth Thorman
          
DESCRIPTION:
------------
This script comes in handy when your echosounder data in the P291/P294
file either is extremly noisy or non existing. The script can:
- correct noisy data, by deleting corrupt data and inserting new data
- insert new data where data is missing
The script needs the P291/P294 file with the bad data, also needed is a 
"WD" file where each line contains a data pair of (SP/Water depths).


WHERE TO GET THE WD FILE: 
-------------------------
SEISMIC data processors. To see more help type: "correct_P2_fatho HELPSEISMIC"
at the command prompt.

This version the script allows multiple SP ranges in the WD file.
What happens is that when the SEISMIC data operators pick the water bootom for the 
SP range that are bad, the normally pick all SP ranges at one time so you 
get at WD file consisting of several SP range-datasets like this (SP/depth):

 992   1285 (start first SP range)
  .         .
 999    1022 (end first SP range)
1245   1000 (start second SP range)
  .         .
1255   995 (end second SP range) 
The script will insert or remove the values for the SP ranges in the WD file
(in this example: 992-999, 1245-1255). The SP range in between the 2 ranges will 
not be changed and will retain the original values from the echosounder.


IMPORTANT: 
----------
The water depth file cannot have any text/empty lines in the beginning 
of the file. The last line must be the last data set (no empty lines). 
The script does not care about spaces or TABs on a line. Leading spaces 
in a line is no problem. Some times the file from SEISMIC data processing can have double
values for the same shotpoint, this is not a problem.

 992   1285 (double values, not a problem)
 992   1285
   993     1285 (different spacing, not a problem)
   
.






sub DisplayHELPSEISMIC{
  $~ = "HELPSEISMIC";
  write;
}
format HELPSEISMIC =

     correct_p2_fatho v1.3
      by
       Kenneth Thorman
    SEISMIC data - HELP
          
1. Migrate the Near Trace Gather
2. Pick the water depth of migrated near trace gather in QCTOOL
3. Output formatted listing of DBU (this will be shotrec/time pairs)
4. In DBU examine file created in QCTOOL

EXAMPLE DBU FORMATTED OUTPUT LISTING

  Enter project name [exnor] : 
  Enter access mode (r[eadonly], u[pdate]) [readonly] : u
  Enter selection (h|...|q) [l] : e 17awbpick
  Enter examine option (h|l|o|d|f|g|...|q) [l] : o
  Enter output listing file name (or "stdout") [stdout] : 17wblist.txt
  Enter examine option (h|l|o|d|f|g|...|q) [l] : f
  Enter filename of an existing format [] : 
  Enter maximum line length for the list (max 255) [79] : 
  Enter number of chars for instance number (0=none) [0] : 
  Enter repeat factor for header line (0=no header) [50] : 0
  Select fields to tabulate :
  Enter field (q to quit, \ to list) [KEY1] : 
  Enter number of characters to display field data in [4] : 8
  Enter field (q to quit, \ to list) [key1] : time
  Enter number of characters to display field data in [4] : 8
  Enter number of decimal places to display [2] : 4
  Enter field (q to quit, \ to list) [time] : q
  Enter filename to save format (leave blank for none) [] : 
  Enter first instance to list (0 to quit) [1] : 
  Enter last instance to list [21] : 
  Enter first instance to list (0 to quit) [1] : 0
  Enter examine option (h|l|o|d|f|g|...|q) [l] : q
  Enter selection (h|...|q) [e] : q


5. run the following command fron the command line:
SYNTAX:

awk '{printf "%s \t %.2f\n", $1+SPRec->SP, $2*Water_Vel}' inputfile > outputfile  

Variables:
SPRec-SP    -  difference from shot record to SP (1000)
Water_Vel   -  water velocity used / 2    ( 750)
inputfile   -  the DBU list 
outputfile  -   file to give to the QC

Example:
awk '{printf "%s \t %.2f\n", $1+1000, $2*750}' EX00-22.WD.dbu > EX00-22.waterdepth

.




#################################################################################
#COMMENTS: "GetFileBaseName"       #
#-------------------------------------------------------------------------------#
#          #
# INPUT  : FILENAME (TEXT STRING) EX. BR98-092.0.P291    #
# FUNCTION: READ THE STRING FROM THE START WHEN ENCOUNTING A "." THROW THE REST #
#    AWAY         #
# OUTPUT  : FILE BASE NAME (LINENAME) EX. BR98-092    #
#################################################################################

sub GetFileBaseName{
  my ($input_str) = @_;
  my ($end_pos, $temp);
      
  if ($input_str =~ /\./g)
  {
    $end_pos = pos ($input_str);
  }
  
  $temp = substr ($input_str, 0, $end_pos-1);
  return ($temp);
}








#################################################################################
#COMMENTS: "OpenFiles"        #
#-------------------------------------------------------------------------------#
#          #
# OPENS ALL NECCESARY FILES (P291 ORIGINAL, WATER DEPTH FILE, OUTFILE)  #
# IF A PROBLEM IS ENCOUNTERED OPENING ANY OF THE FILE AN ERROR MESSAGE IS  #
# DISPLAYED.         #
#################################################################################

sub OpenFiles{
  open (WDFILE, "$wd_file") or die ("Could not open infile $ARGV[1].\n");
  open (P291FILE, "$ARGV[0]") or die ("Could not open infile $ARGV[0].\n");
  open (OUTFILE, ">$outfile") or die ("Could not open outfile $outfile.\n");
  $log = $log_dir . "correct_P2_fatho.LOG";
  if (-e $log){
    open (LOGFILE, ">>$log") or die ("Could not open logfile.\n");
  }
  else{
    open (LOGFILE, ">$log") or die ("Could not open logfile.\n");
    print LOGFILE ("\n\n\n     Echosounder data\n");
    print LOGFILE ("Date:      Filename:   corrected for SP range:\n");
    print LOGFILE ("-----------------------------------------------------------\n");
  }
}







#################################################################################
#COMMENT: "Presentation 1-3"       #
#-------------------------------------------------------------------------------#
#          #
# THIS SUB ROUTINE PRESENTS IMPORTANT INFORMATION TO THE USER IN A EASIER #
# READABLE WAY THAN IF IT HAD BEEN TRHOWN OUT ON THE SCREEN.   #
#################################################################################

sub Presentation1{
$~ = "MYFORMAT1";
write;
}

sub Presentation2{
$~ = "MYFORMAT2";
write;
}

sub Presentation3{
$~ = "MYFORMAT3";
write;
}

sub Presentation4{
$~ = "MYFORMAT4";
write;
}


format MYFORMAT1 =




***************************************************************************
*      FILE       |  FIRST SP  |  LAST SP  |  NOW PROCESSING  *
***************************************************************************
* Water depth correction file: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*
           $wd_sp_ranges
***************************************************************************
.

format MYFORMAT2 =
* @<<<<<<<<<<<<<<<<<<<<<<<<<< |  @|||||||  |           |      *
  @ARGV[0]     $p291sp
.

format MYFORMAT3 =
* @<<<<<<<<<<<<<<<<<<<<<<<<<< |       |           |@|||||||||||||||||*
  @ARGV[0]          $p291sp
.

format MYFORMAT4 =
* @<<<<<<<<<<<<<<<<<<<<<<<<<< |       |  @||||||  |    *
  @ARGV[0]        $p291sp
***************************************************************************
* STATUS: FINISHED PROCESSING            *
* CORRECTED P291 FILE: @<<<<<<<<<<<<<<<<<<<<<<      *
   $outfile
***************************************************************************

Author  : Kenneth Thorman        
Script  : correct_p291_fatho v1.3      
Date    : 19/6 - 1999        


*********************************************************************
* This script is shareware, if you find this script usefull a small *
* contribution would be appreciated.                                *
* It encourages to write more usefull scripts and programs.         *
*********************************************************************
       
.








#################################################################################
#COMMENT: "ExtractSP"        #
#-------------------------------------------------------------------------------#
#           #
# THIS SUB ROUTINE EXTRACTS THE SHOTPOINT NUMBER IN A TEXT FILE   #
# THE FILE CAN HAVE LEADEING SPACES, IT CAN BE UNEVENLY SEPARATED BY SPACES #
# BUT IT MUST CONTAIN 2 NUMBERS PER LINE, SHOTPOINT NUMBER / WATERDEPTH  #
# EXAMPLES: 993   1285       #
#    994       1285   #
#          #
# BASICALLY IT DOES NOT CARE ABOUT SPACES, AT THE TOP OF THE FILE THE CAN BE #
# NO TEXT, AND THERE CAN BE NO BLANK LINES INBETWEEN LINES   #
#          #
# INPUT:  ONE LINE OF TEXT      #
# RETURN VALUE: SHOTPOINT NUMBER      #
#################################################################################

sub ExtractSP{

  my ($temp_line) = @_;
  my (@temp_array, $SP);
  
  @temp_array = split (/[\t ]+/, $temp_line);
  if (@temp_array[0] eq ""){
    $SP = @temp_array[1];
  }
  else{
    $SP = @temp_array[0];
  }
  return ($SP);
}








#################################################################################
#COMMENT: "ExtractWD"        #
#-------------------------------------------------------------------------------#
#           #
# THIS SUB ROUTINE EXTRACTS THE WATER DEPTH NUMBER IN A TEXT FILE  #
# THE FILE CAN HAVE LEADEING SPACES, IT CAN BE UNEVENLY SEPARATED BY SPACES #
# BUT IT MUST CONTAIN 2 NUMBERS PER LINE, SHOTPOINT NUMBER / WATERDEPTH  #
# EXAMPLES: 993   1285       #
#    994       1285   #
#          #
# BASICALLY IT DOES NOT CARE ABOUT SPACES, AT THE TOP OF THE FILE THE CAN BE #
# NO TEXT, AND THERE CAN BE NO BLANK LINES INBETWEEN LINES   #
#          #
# INPUT:  ONE LINE OF TEXT      #
# RETURN VALUE: WATER DEPTH       #
#################################################################################

sub ExtractWD{

  my ($temp_line) = @_;
  my (@temp_array, $WD);

  @temp_array = split (/[\t ]+/, $temp_line);
  if (@temp_array[0] eq ""){
    $WD = @temp_array[2];
  }
  else{
    $WD = @temp_array[1];
  }
  return ($WD);
}








#################################################################################
#COMMENT: "PutWaterDepthFileIntoArray"      #
#-------------------------------------------------------------------------------#
#          #
# THIS SUB ROUTINE DOES EXACTLY WHAT THE NAME IMPLIES. IT USES THE 2 ABOVE  #
# MENTIONED SUB ROUTINES TO EXTRACT THE SP NUMBER AND THE WATER DEPTH FROM A  #
# FILE AND THE IT PUTS THESE VALUE INTO AN ARRAY BUILT UP AS FOLLOWS  #
# SP NUMBER (INDEX VALUE) / WATER DEPTH (FIELD VALUE)    #
#          #
# SO NOW YOU CAN REFERENCE THE ARRAY BY SHOTPOINT NUMBER AND THEN GET THE  #
# WATER DEPTH AT THE SPECIFIC SHOTPOINT      #
#################################################################################

sub PutWaterDepthFileIntoArray{
  while ($wd_line ne ""){
    $sp = int (ExtractSP ($wd_line));
    $wd = int (ExtractWD ($wd_line));
    @wd_file[$sp] = $wd;
    $wd_line = <WDFILE>;
  }
}







#################################################################################
#COMMENT: "FormatEchosounderTimeStamp"      #
#-------------------------------------------------------------------------------#
#          #
# THIS SUB ROUTINE EXTRACTS AND FORMATS THE TIMESTAMP FROM THE E1000 GENERAL    #
# CARD  IN THE P291 FILE AND SUBTRACTS 0.1 SECOND.     #
# THIS IS DONE SO THE ECHOSOUNDER CARD CREATED LATER        #
# WILL HAVE A SEQUENTIAL INCREASING TIMESTAMP COMPARED TO THE CARDS LOCATED     #
# BEFORE AND AFTER IT IN THE P291 FILE. THE TIME STAMP IN THE GENERAL CARD IS   #
# NOT IN THE SAME FORMAT AS THE TIMESTAMP NEEDED FOR THE ECHOSOUNDER CARD #
#          #
# GENERAL CARD: HHMMSS.S       #
# ECHO CARD   : HHMMSSS        #
#          #
# INPUT  : E1000 - GENERAL LINE FROM P291 FILE     #
# OUTPUT : TIMESTAMP IN CORRECT FORMAT FOR A T14101 CARD IN THE P291 FILE #
#################################################################################

sub FormatEchosounderTimeStamp{
  
  my ($temp_line) = @_;
  my ($string);
  
  $time = substr ($temp_line,58,9);
  $string = sprintf("%7.1f", ($time - 0.1));
  $string =~ s/\.//;
  return ($string);
}







#################################################################################
#COMMENT: "CreateEchosounderDataCard"      #
#-------------------------------------------------------------------------------#
#          #
# THIS SUB ROUTINE CREATES/OR MODIFIES THE ECHOSOUNDER CARD DEPENDING ON WHICH  #
# ROUTINE IT IS CALLED FROM, AND WHAT VARIABLE THAT IS PASSED TO IT.  #
#################################################################################

sub CreateEchosounderDataCard{

  my ($wd, $TimeStamp, $end_string) = @_;
  my ($temp_string);

  if ($wd < 100){      
    $water_depth = sprintf("  %5.1f", $wd);
  }
  elsif ($wd < 1000){
    $water_depth = sprintf(" %5.1f", $wd);
  }
  else{
    $water_depth = sprintf("%5.1f", $wd);
  }

  $temp_string = "T14101" . "$water_depth" . "$TimeStamp" . "$end_string";
  $string = substr($temp_string,0,80) . "\n";
  return ($string);
}








# Version History:

# 1.3:  The online help and the comments in the script clarified
# plus check for compatibility with the new P294 format
# 1.2:  Seperate SP-ranges in the WD file allowed
# 1.1:  The output to a log file was created.
# 1.0:  Script created

Wednesday, June 21, 2000

Perl P190 Navigation Merge script (code nostalgia)

Continuing my explorations of the newly found old backup hard disk I found this small gem :). The code and structure could arguably be improved on a lot but considering this stared out as a small utility script that was immensely useful and it just worked back in 1997-1999 it never got rewritten.

When you are doing marine seismic exploration you are  gathering navigation data (where have the boat been and where have the recording equipment been located) when recording the seismic data. Quite a lot of the time a "seismic line" cannot be completed due to equipment failure, noise on the hydrophones ... If this happens you circle the boat and try again with an Alpha, Beta ... part of the line.
 
The navigation data is recorded in P2/91 & P2/94 (P2/94 EXCHANGE FORMAT FOR RAW MARINE POSITIONING DATA) format and the processed navigational data can be in P1/90 format (U.K.O.O.A. P1/90 POST PLOT DATA EXCHANGE TAPE).

Anyway this perl script processes and combines any Alpha, Beta ... lines into one file.

#!/opt/perl5/bin/perl

# Script : Navigation Merging v1.52

# Description 

# This script takes any number of P190 files and merges them 
# file1, file2,file3. It can deal with incrementing SP as well
# as decrementing SP. It also searches Alpha, Bravo, Charlie 
# linename prefixes in the final .cmb file. and changes this to
# the basic linename. Corrects LSP in the header if Streamer Model
# comment is exported to file.

# Linename P98-030
# Alphaname P98-030A

# The script looks for
# VP98-030A       1    3141145154.97S12115 5.23E...

# and changes this to
# VP98-030        1    3141145154.97S12115 5.23E...

# Author :     Kenneth Thorman
# Date      :     27/12/1998




# MAJOR SUBROUTINES
sub CheckCommandLineSyntax;
sub CreateOutputFile;
sub WriteFirstFile;
sub WriteMiddleFiles;
sub GetSPRangeForAllFiles;
sub CreateSPRangeHeaderRemark;



# MINOR SUBROUTINES
sub Author;
sub GetFileBaseName;
sub MakeReadmeFile;
sub Presentation1;
sub HeadFileInfo;
sub BodyFileInfo;
sub Finish;
sub HeaderStatus;



################################### MAIN SCRIPT ################################

    # Check that the user has entered the right amount of command line arguments
    CheckCommandLineSyntax;
    
    # Open the "cmb" file for writing
    CreateOutputFile;

    # In order to put a remark in the header about the streamer shaping we need
    # to know the SP range for the files we are combining
    GetSPRangeForAllFiles;

    # Create the header remark
    CreateSPRangeHeaderRemark;

    # Since we have to process the first file different than the remaining files
    # we do it here in a seperate procedure
    WriteFirstFile;

    # Since we have processed the first file above lets set the pointer to the 
    # second supplied file
    $counter = 1;

    # Run through the files one by one as long as there files left to process
    while ($counter < ($arg_cnt))
    {
         WriteMiddleFiles ($ARGV[$counter]);

         # Move to the next file
         $counter++;
    }

    # Make a README file in the current directory explaining the "cmb" file
    MakeReadmeFile;

    # Before finishing of time for a little bit of narcisim from my side
    # Print the author information
    Finish;



################################### SUB ROUTINES ###############################

sub CheckCommandLineSyntax
{
  $arg_cnt = @ARGV;   # GET NUMBER OF CMD LINE ARGUMENTS
  if ($arg_cnt < 2)   # IF 0 CMD ARGUMENTS THEN ERROR!
  {
    print ($info);
    print ("\nYou need at least 2 command line arguments!\n");
    die ("SYNTAX: nav_merge file1 file2 file3 file4 ...\n\n");
    Author;
  }
}



sub GetSPRangeForAllFiles{
  
  $arg_cnt = @ARGV;
  $file_cnt = 0;
  
  foreach $file (@ARGV){
    open (P190FILE, "$file") or die ("Could not open $file.\n");
    #print ("Checking SP range for file: $file...\n");
    $filebasename = GetFileBaseName($file);
    $vessel_record = "V" . $filebasename;
    $count = 1;
     
    $line = <P190FILE>;
    while ($line !~ /EOF/g){
      if ($line =~ /^V/) {
         $last_sp = substr($line,20,5);    
      }
      $line = <P190FILE>;
      if (($line =~ /$vessel_record/) and ($count != 0)){
        $first_sp = substr($line,20,5); 
        $count--;
      }
    }
    
    if ($file_cnt == 0){
      $final_FSP = $first_sp;
      #print ("Final FSP is: $final_FSP\n");
      $FSP = 1;
    }
    if ($file_cnt == $arg_cnt-1){
      $final_LSP = $last_sp;
      #print ("Final LSP is: $final_LSP\n");
    }
    $file_cnt++;
    close (P190FILE);
  }
  #print ("FSP: $final_FSP   LSP: $final_LSP\n");
}



sub CreateOutputFile
{
  $output_filename = $ARGV[0] . ".cmb";
  open (OUTFILE,">$output_filename") or die ("Cannot create file $output_filename");
}



sub CreateSPRangeHeaderRemark
{
  $cmb_line_name = GetFileBaseName ($ARGV[0]);
  $temp_str1 = sprintf("H2600 Streamer_001 Model Line %s shots %d to %d: Arc                                          ",
                        $cmb_line_name, $final_FSP, $final_LSP);  
  $temp_str2 = substr($temp_str1,0,80);
  $str_to_add = $temp_str2 . "\n";
}



sub WriteFirstFile
{
  open (HEADFILE, "$ARGV[0]") or die ("Could not open file $ARGV[0].\n");
  $filebasename = GetFileBaseName($ARGV[0]);
  $count = 1;
     
  $line = <HEADFILE>;
  $file_card = substr($line,0,1);
  $SPrangeheader = "no";
  $vessel_record = "V" . $filebasename;

  while ($line !~ /EOF/g){
    if ($file_card eq "H"){
      if (($line =~ /H2600/) and ($line =~ /$final_FSP/) and ($line !~ /$final_LSP/)){ 
        print OUTFILE ($str_to_add);
 $error =  "LSP in the header was incorrect.\n";
        $status = "Corrected. Now reflecting actual SP range in .cmb file";
        HeaderStatus;
        $SPrangeheader = "yes";
      }
      else{
        print OUTFILE ($line);
      }
    }
    elsif ($SPrangeheader eq "no"){
      print OUTFILE ($str_to_add);
      print OUTFILE ($line);
      $error =  "No SP range comment found in header";
      $status = "Corrected. Comment inserted: $str_to_add";
      HeaderStatus;
      $SPrangeheader = "yes";
    }
    else{ 
      print OUTFILE ($line);
    }   
    if ($line =~ /^V/) {
       $headfile_lsp = substr($line,20,5);
    }
    if (($line =~ /$vessel_record/) and ($count != 0)){
      $headfile_fsp = substr($line,20,5); 
      $count--;
    }
    $line = <HEADFILE>;
    $file_card = substr($line,0,1);
    
  }
  Presentation1;
  HeadFileInfo;
  close (HEADFILE);
}   



sub WriteMiddleFiles
{
  my ($file_name) = @_;    #  ASSIGN PASSED PARA. TO $file_name
  
  open (BODYFILE, $file_name) or die ("Could not open file $file_name.\n");
   
  $line = <BODYFILE>;
  $count = 1;
  
  if ($headfile_fsp < $headfile_lsp)             # INCREMENTING SP NUMBER
  { 
    while ($line ne "")
    {
      
      if  ($line =~ /^V/) {
        $temp = substr($line,20,5);
      }
             
      if (((~ /$filebasename/) and ($temp > $headfile_lsp) and ($line !~ /H2600/)) or ($line =~ /EOF/)) {
        if ($line =~ /$filebasename[A-Z]/)
        {
          $line =~ s/$filebasename[A-Z]/$filebasename /;
          print OUTFILE ($line);
        }
        elsif ($counter == ($arg_cnt-1))
        { 
          print OUTFILE ($line);
        }
        if (($line =~ /$vessel_record/) and ($count != 0)) #  GET FIRST EXPORTED SP
        {
          $tailfile_fsp = substr($line,20,5); 
          $count = 0;
        }
      }

      if (($line =~ /^R/) and ($temp < $headfile_lsp)){
       print OUTFILE ($line);
      }

      if ($line =~ /^V/) {
        $tailfile_lsp = substr($line,20,5);
      } 

      $line = <BODYFILE>;
    }
  }
  
  
  elsif ($headfile_fsp > $headfile_ls)
  {
    while ($line ne "")    # DECREMENTING SP NUMBER
    {
      
      
      if  ($line =~ /^V/) {
        $temp = substr($line,20,5);
      }
      
      
      if ((($line =~ /$filebasename/) and ($temp < $headfile_lsp) and ($line !~ /H2600/)) or ($line =~ /EOF/))      {      
        if ($line =~ /$filebasename[A-Z]/) {
          $line =~ s/$filebasename[A-Z]/$filebasename /;
          print OUTFILE ($line);
        }
        elsif ($counter == ($arg_cnt-1)) { 
          print OUTFILE ($line);
        }
        if (($line =~ /$vessel_record/) and ($count != 0)) {
          $tailfile_fsp = substr($line,20,5); 
          $count = 0;
        }
      }

      if (($line =~ /^R/) and ($temp < $headfile_lsp)){
       print OUTFILE ($line);
      }

      
      if ($line =~ /^V/) {
        $tailfile_lsp = substr($line,20,5);
      } 

      $line = <BODYFILE>;
    }
  }
  BodyFileInfo;
  $headfile_fsp = $tailfile_fsp;
  $headfile_lsp = $tailfile_lsp;  
  close (BODYFILE);
}



sub MakeReadmeFile
{ 
  open (READMEFILE,"> README");
  print READMEFILE ("Note: All \"cmb\" files are combined from multiple line segments\n");
  print READMEFILE ("      as per the seismic merge.\n");
  close (READMEFILE);
}



sub Author
{
  print ("\n\nNavigation Merge v1.5\n\n");
  print ("Author: Kenneth Thorman\n");
  print ("Date  : 27 dec 1998\n");
}



sub HeaderStatus{
$~ = "HEADERSTATUS";
write;
}



sub Presentation1{
$~ = "MYFORMAT1";
write;
}



sub HeadFileInfo{
$~ = "HEADFILEINFO";
write;
}



sub BodyFileInfo{
$~ = "BODYFILEINFO";
write;
}



sub Finish{
$~ = "FINISH";
write;
}



format HEADERSTATUS =



Header Check                                  
------------
Output File : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
$output_filename
Error       : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
$error
Status      : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
$status
.



format MYFORMAT1 =


Combining Files
---------------
.

format HEADFILEINFO =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<       @<<<<<              @<<<<<      
 $ARGV[0]                    $headfile_fsp        $headfile_lsp   
.

format BODYFILEINFO =
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<        @<<<<<              @<<<<<      
 $ARGV[$counter]                   $tailfile_fsp        $tailfile_lsp   
.  



format FINISH =





                                    
27-Dec-1998, Kenneth Thorman 

.



sub GetFileBaseName
{
  my ($input_str) = @_;
  my ($end_pos, $temp);
      
 if ($input_str =~/_/g){
    $start_pos = pos ($input_str);
  }    
  if ($input_str =~ /\./g){
    $end_pos = pos ($input_str) - $start_pos ;
  }
  
  $temp = substr ($input_str, $start_pos, $end_pos-1);
  return ($temp);
}


#Script   : navigation_merge
#Version  : 1.5
#Author   : Kenneth Thorman

Hydrogeologic : Extract data from seismic files for use in surfer

I recently found a backup storage hard disk. This hard disk holds scripts and programs going back to 1998.

This specific perl script I am posting here is/was used to extract water depth data from p190 seismic files and convert it into a format Surfer could read and in turn generate images as the one below (image source: Schlumberger Water Services)





If I were to write this today I would probably write it rather differently, but alas it worked.

Pure nostalgia.

#!/opt/perl5/bin/perl

# SUB ROUTINE DECLARATION     
sub GetFileBaseName;
sub Grab_XYZ;
sub Presentation1;
sub Presentation2;
sub Presentation3;


# VARABLE DECLARATION  
@file_list = `ls -1 *.{p190,WGS84,tc,AGD84,AGD66,WGS-84,AGD-84,AGD-66,Kertau}`;
chop @file_list;
open (OUTFILE, ">surfer_file") or die ("Could not open surfer_file.\n");


# MAIN SCRIPT FLOW
Presentation1;
foreach $file (@file_list){
  open (P190FILE, "$file") or die ("Could not open $file.\n");
  $filebasename = GetFileBaseName($file);
  $shot_record = "S" . $filebasename;
  $counter = 0;
  print ("Filebasename: $filebasename\n");  
  $line = <P190FILE>;
  while ($line ne ""){
    Grab_XYZ;
  }
  close (P190FILE);
   
  if ($counter == 0){
    $status = "FAILED";
  }
  else{
    $status = "OK";
  }
  Presentation2;
}
close (OUTFILE);
Presentation3;



# SUB ROUTINE IMPLEMENTATIONS

sub Grab_XYZ{
 if ($line =~ /$shot_record/){
   $x = substr($line,46,9);
   $y = substr($line,55,9);
   $z = -substr($line,64,6);
   print OUTFILE ("$x $y $z\n");
   $line = <P190FILE>;
   $counter++;
   #print ("$counter\n");
 }
 else{
   $line = <P190FILE>;
 }
}



sub GetFileBaseName
{
  my ($input_str) = @_;
  my ($end_pos, $temp);
  
  if ($input_str =~/_/g){
    $start_pos = pos ($input_str);
  }    
  if ($input_str =~ /\./g){
    $end_pos = pos ($input_str) - $start_pos ;
  }
  
  $temp = substr ($input_str, $start_pos, $end_pos-1);
  return ($temp);
}






sub Presentation1{
$~ = "MYFORMAT1";
write;
}

sub Presentation2{
$~ = "MYFORMAT2";
write;
}

sub Presentation3{
$~ = "MYFORMAT3";
write;
}

format MYFORMAT1 =




********************************************************************************
*           |     NUMBER OF VALUES GRABBED      |          *
*              FILE     |-----------------------------------|  STATUS  *
*    |     X     |     Y     |     Z     |          *
********************************************************************************
.


format MYFORMAT2 =
* @<<<<<<<<<<<<<<<<<<<<<<<<<<   |  @||||||  |  @||||||  |  @||||||  | @||||||| *
  $file        $counter    $counter    $counter   $status
.

format MYFORMAT3 =
********************************************************************************
* STATUS: FINISHED PROCESSING             *
* OUTPUT FILE: surfer_file                  *
********************************************************************************

Author  : Kenneth Thorman        
Script  : make_surfer_file      
Date    : 26/4 - 1999        
.