#!/usr/bin/env php
<?php # (jEdit options) :folding=explicit:collapseFolds=1:
/*****************************************************************************
INPUTS / SWITCHES (via $_SERVER['argv']):
    inDir           a directory with PDB files to operate on, with hydrogens already added
    outDir          a place to put the output files
    -html           forces output to be HTML (the default)
    -coot           forces output to be a Scheme script for Coot

OUTPUTS / RESULTS:
    A copy of the multi-criterion chart for each PDB file written to outDir

*****************************************************************************/
// EVERY *top-level* page must start this way:
// 1. Define it's relationship to the root of the MolProbity installation.
// Pages in subdirectories of lib/ or public_html/ will need more "/.." 's.
    if(!defined('MP_BASE_DIR')) define('MP_BASE_DIR', realpath(dirname(__FILE__).'/..'));
// 2. Include core functionality - defines constants, etc.
    require_once(MP_BASE_DIR.'/lib/core.php');
    require_once(MP_BASE_DIR.'/lib/analyze.php');
    require_once(MP_BASE_DIR.'/lib/visualize.php');
// 3. Restore session data. If you don't want to access the session
// data for some reason, you must call mpInitEnvirons() instead.
    mpInitEnvirons();       // use std PATH, etc.
    //mpStartSession(true);   // create session dir
// 5. Set up reasonable values to emulate CLI behavior if we're CGI
    set_time_limit(0); // don't want to bail after 30 sec!
// 6. Unlimited memory for processing large files
    ini_set('memory_limit', -1);

#{{{ a_function_definition - sumary_statement_goes_here
############################################################################
/**
* Documentation for this function.
*/
//function someFunctionName() {}
#}}}########################################################################

# MAIN - the beginning of execution for this page
############################################################################
$mode = 'html';

// First argument is the name of this script...
if(is_array($_SERVER['argv'])) foreach(array_slice($_SERVER['argv'], 1) as $arg)
{
    if($arg == '-html')         $mode = 'html';
    elseif($arg == '-coot')     $mode = 'coot';
    elseif(!isset($inDir))      $inDir = $arg;
    elseif(!isset($outDir))     $outDir = $arg;
    else                        die("Too many or unrecognized arguments: '$arg'\n");
}

if(!isset($inDir))          die("No input directory specified.\n");
elseif(!is_dir($inDir))     die("Input directory '$inDir' does not exist.\n");
elseif(!isset($outDir))     die("No output directory specified.\n");
elseif(!is_dir($outDir))    die("Output directory '$outDir' does not exist.\n");

foreach(listDir($inDir) as $inFile) if(endsWith($inFile, ".pdb"))
{
  mpStartSession(true); // create a new session

  $inFile = realpath($inDir).'/'.$inFile;
  echo "reading ".$inFile."\n";

  $outFile = realpath($outDir).'/'.basename($inFile, ".pdb").".html";
  echo "writing ".$outFile."\n";


  $inpath = $inFile;
  $modelID = addModelOrEnsemble(
               $inpath,
               basename($inpath),
               false,
               true,
               true,
               false);

  $model =& $_SESSION['models'][$modelID];
  $reduce_blength = $_SESSION['reduce_blength'];
  //$bcutval = 40; TO-DO - make these user controllable
  //$ocutval = 10;
  $pdbfile = $_SESSION['dataDir'].'/'.MP_DIR_MODELS."/$model[pdb]";
  $rawDir  = $_SESSION['dataDir'].'/'.MP_DIR_RAWDATA;
  if(!file_exists($rawDir)) mkdir($rawDir, 0777);
  $filename = basename($pdbfile);

  $stats = $model['stats'];
  $hasProtein = ($stats['sidechains'] > 0 ? True : False);
  $hasNucAcid = ($stats['nucacids'] > 0 ? True : False);

  if($hasProtein)
  {
    runRotamer($pdbfile, "$rawDir/$model[prefix]rota.data");
    $rota = loadRotamer("$rawDir/$model[prefix]rota.data");

    runRamachandran($pdbfile, "$rawDir/$model[prefix]rama.data");
    $rama = loadRamachandran("$rawDir/$model[prefix]rama.data");

    runCbetaDev($pdbfile, "$rawDir/$model[prefix]cbdev.data");
    $cbdev = loadCbetaDev("$rawDir/$model[prefix]cbdev.data");

    runValidationReport($pdbfile, "$rawDir/$model[prefix]geom.data", "protein");
  }
  else
  {
    $rota = null;
    $rama = null;
    $cbdev = null;
  }

  runClashlist($pdbfile, "$rawDir/$model[prefix]clash.data", $reduce_blength);
  $clash = loadClashlist("$rawDir/$model[prefix]clash.data");

  if($hasNucAcid)
  {
    runBasePhosPerp($pdbfile, "$rawDir/$model[prefix]pperp.data");
    $pperp = loadBasePhosPerp("$rawDir/$model[prefix]pperp.data");

    runSuitenameReport($pdbfile, "$rawDir/$model[prefix]suite.data");
    $suites = loadSuitenameReport("$rawDir/$model[prefix]suite.data");

    runValidationReport($pdbfile, "$rawDir/$model[prefix]rna.data", "rna");
  }
  {
    $pperp = null;
    $suites = null;
  }

  if($hasProtein && $hasNucAcid)
  {
    $bbonds = array_merge(loadValidationBondReport("$rawDir/$model[prefix]geom.data","protein"), loadValidationBondReport("$rawDir/$model[prefix]rna.data", "rna"));
    if (count($bbonds) == 0) $bbonds = null;
    $bangles = array_merge(loadValidationAngleReport("$rawDir/$model[prefix]geom.data", "protein"), loadValidationAngleReport("$rawDir/$model[prefix]rna.data", "rna"));
    if (count($bangles) == 0) $bangles = null;
  }
  elseif($hasProtein)
  {
    $bbonds = loadValidationBondReport("$rawDir/$model[prefix]geom.data", "protein");
    if (count($bbonds) == 0) $bbonds = null;
    $bangles = loadValidationAngleReport("$rawDir/$model[prefix]geom.data", "protein");
    if (count($bangles) == 0) $bangles = null;
  }
  elseif($hasNucAcid)
  {
    $bbonds = loadValidationBondReport("$rawDir/$model[prefix]rna.data", "rna");
    if (count($bbonds) == 0) $bbonds = null;
    $bangles = loadValidationAngleReport("$rawDir/$model[prefix]rna.data", "rna");
    if (count($bangles) == 0) $bangles = null;
  }

  if($mode == 'coot')
    makeCootClusteredChart($pdbfile, $outFile, $clash, $rama, $rota, $cbdev, $pperp);
  else
    writeMulticritChart($pdbfile, "/dev/null", $outFile, $clash, $rama, $rota, $cbdev, $pperp, $suites, $bbonds, $bangles);

  mpDestroySession();
}
############################################################################
// Clean up and go home
//mpDestroySession(); // only call this if we created one
?>
