#! /bin/csh -f
set pn = "splitmrc"
@ maxsize = 650
set equal = 0
setenv LC_NUMERIC C

set destdir = ""

if ($#argv == 0)then
    echo "This program splits apart MRC files into CD-sized chunks"
    echo "Usage: $pn [options]  mrc_filename"
    cat <<EOF
Options:  -d pathname   Path of directory to place files into
          -m size       Maximum size of files in MBytes (default $maxsize)
          -b            Make all files but last as big as possible (default)
          -e            Make files equal in size
EOF
    exit 0
endif
if ($?IMOD_DIR) then
    setenv PATH "$IMOD_DIR/bin:$PATH"
endif

while ($#argv > 1)
  switch ($argv[1])
    case -d:
      set destdir = $argv[2]"/"
      if (! (-d $destdir))then
	echo "${pn}: Directory $destdir does not exist"
	exit 1
      endif
      shift; shift
      breaksw
    case -m
      @ maxsize = $argv[2]
      shift; shift
      breaksw
    case -e
      set equal = 1
      shift
      breaksw
    case -b
      set equal = 0
      shift
      breaksw
    default:
      echo "${pn}: bad argument $argv[1]"
      exit 1
  endsw
end

if ($#argv == 0) then
    echo "${pn}: need to enter an image file name"
    exit 1
endif
set infile = $argv[1]
if (! -e $infile)then
  echo "${pn}: input file $infile does not exist"
  exit 1
endif

set tailname = $infile:t
set listfile = $destdir$tailname.slist
set size = `header -si $infile | sed '/[[:cntrl:]]/s///g'`
@ nx = $size[1]
@ ny = $size[2]
@ nz = $size[3]

# Get file mode and use that to set up pixel size
@ mode = `header -mo $infile | sed '/[[:cntrl:]]/s///g'`
if ($mode == 0) then
    @ pixsize = 1
else if ($mode == 1 || ($mode > 8 && $mode < 16)) then
    @ pixsize = 2
else if ($mode == 2 || $mode == 3) then
    @ pixsize = 4
else if ($mode == 4) then
    @ pixsize = 8
else if ($mode == 16) then
    @ pixsize = 3
else
    echo "File mode $mode not recognized"
    exit 1
endif

@ maxsec = `echo $maxsize $nx  $ny  $pixsize | awk '{print int(($1 * 1000000) / ($2 * $3 * $4))}'`
@ nfiles = $nz / $maxsec
@ rem = $nz - $nfiles * $maxsec
if ($nfiles == 0 || ($nfiles == 1 && $rem == 0)) then
    echo "The file is already no larger than the maximum size"
    exit 1
endif
if ($rem > 0) @ nfiles++

if ($equal == 1) then
    @ maxsec =  $nz / $nfiles 
    @ rem = $nz - $nfiles * $maxsec
    if ($rem > 0) @ maxsec++
endif

if (-e $listfile) \mv $listfile $listfile~
echo $nfiles >! $listfile

@ ifile = 1
@ isec = 0
while ($ifile <= $nfiles)
    @ isecend = $isec + $maxsec - 1
    if ($isecend >= $nz) @ isecend = $nz - 1
    @ nsecm1 = $isecend - $isec
    set listname = $tailname.s$ifile
    set outfile = $destdir$listname
    echo "Extracting sections $isec-$isecend into $outfile ..."
    newstack -sec $isec-$isecend $infile $outfile > /dev/null
    echo $listname >> $listfile
    echo 0-$nsecm1 >> $listfile
    @ ifile++
    @ isec = $isecend + 1
end
echo "Save the split list file $listfile with the first fragment, $tailname.s1"
