getRow("select filetype, name, header from bedfile where bedfile_id = ?", array($bed_id)); if($r1['filetype'] == 'rawbed') { $filepath = $db->getOne("select filepath from rawbed where bedfile_id = ?", $bed_id); $chrom_list = explode("\n", `sort -u $filepath`); } else { $chrom_list = $db->getCol("select distinct chrom from $r1[filetype] where bedfile_id = $bed_id"); } // execute the extraction for each chromosome foreach($chrom_list as $c) { $_GET['chrom'] = $c; $metadata = executeExtr($_GET, $bed_id, $metadata); } } else { $metadata = executeExtr($_GET, $bed_id, $metadata); } } print json_encode(array("err" => $err, "filelist" => $metadata)); function executeExtr($_GET, $bed_id, $metadata) { global $err; $db = getDB(); $r1 = $db->getRow("select filetype, bedfile.name, header, genome_id, method_id, genome.name as genome_name, method.name as method_name from bedfile join genome using(genome_id) join method using(method_id) where bedfile_id = ?", array($bed_id)); $new['name'] = "Extract of $r1[name]"; if(isset($_GET['chrom']) && trim($_GET['chrom'])) { $new['name'] .= " - $_GET[chrom]"; } $new['descr'] = "Extracted from $r1[name]. Chromosome: " . ($_GET['chrom'] ? $_GET['chrom'] : 'Any') . " Start: " . ($_GET['start'] ? $_GET['start'] : 0) . " End: " . ($_GET['end'] ? $_GET['end'] : 'Any') . " RGB: " . ($_GET['rgb'] ? $_GET['rgb'] : 'Any'); if($_GET['chrom']) { //$r1['header'] .= " - $_GET[chrom]"; $r1['header'] = preg_replace("/name=(\S+)/", "name=$1"."_$_GET[chrom]", $r1['header']); $r1['header'] = preg_replace("/description=\"([^\"]+)\"/", "description=\"$1 - $_GET[chrom]\"", $r1['header']); } $stat = $db->query("insert into bedfile (name, upload_date, header, experiment_id, genome_id, method_id, descr) values (?,?,?,?,?,?,?)", $elts = array($new['name'], $date = date('Y-m-d H:i:s'), $r1['header'], $_GET['experiment_id'], $r1['genome_id'], $r1['method_id'], $new['descr'])); //print_r($elts); //if(PEAR::isError($stat)) { // print_r($stat); //} $output_bed_id = $db->getOne("select last_insert_id()"); //print "$output_bed_id\n"; if($r1['filetype'] == 'rawbed') { $fp = fopen($db->getOne("select filepath from rawbed where bedfile_id = ?", $bed_id), "r"); $output_path = FILE_REPOSITORY_PATH . "/" . uniqid() . date('YmdHis'); $outputfp = fopen($output_path, "w"); $have_data = false; while($r = fgetcsv($fp, 0, "\t")) { if(stripos($r[0], 'chr') !== 0) { fputs($outputfp, "$r[0]\n"); continue; } if((!$_GET['chrom'] || $_GET['chrom'] == $r[0]) && (!$_GET['start'] || $r[1] >= $_GET['start'] ) && (!$_GET['end'] || $r[2] <= $_GET['end']) && (!$_GET['rgb'] || $_GET['rgb'] == trim($r[8], "\"'"))) { //emit line fputs($outputfp, trim(join("\t", $r)) . "\n"); $have_data = true; } } fclose($fp); fclose($outputfp); if($have_data) { $db->query('update bedfile set filetype = ? where bedfile_id = ?', array('rawbed', $output_bed_id)); $db->query('insert into rawbed (bedfile_id, filepath) values (?,?)', array($output_bed_id, $output_path)); $db->commit(); $metadata[] = array('name' => $new['name'], 'header' => (string)$r1['header'], 'upload_date' => date('n/j/y', strtotime($date)), 'id' => $output_bed_id, 'genome' => $r1['genome_name'], 'method' => $r1['method_name'], 'descr' => (string)$new['descr']); } else { // todo: error: extract generated nothing! unlink($output_path); $err = "It looks like the extraction yielded no output for your chosen file."; } } else { $vals = array(); if($_GET['chrom']) { $fields[] = 'chrom'; $vals[] = $_GET['chrom']; $ops[] = '='; } if($_GET['start']) { $fields[] = 'chromstart'; $vals[] = $_GET['start']; $ops[] = '>='; } if($_GET['end']) { $fields[] = 'chromend'; $vals[] = $_GET['end']; $ops[] = '<='; } if($_GET['rgb']) { $fields[] = 'itemrgb'; $vals[] = $_GET['rgb']; $ops[] = '='; } $whr = array(); for($j = 0; isset($vals[$j]); $j++) { $whr[] = "$fields[$j] $ops[$j] ?"; } $whr_cl = "where bedfile_id = $bed_id"; if(count($whr)) { $whr_cl .= ' AND ' . join(' AND ', $whr); } $tbl_info = $db->tableInfo('summarybed'); $field_arr = array(); foreach($tbl_info as $f) { if($f['name'] != 'summarybed_id' && $f['name'] != 'bedfile_id') { $field_arr[] = $f['name']; } } $ifields = join(',', $field_arr); //$q = "insert into summarybed (bedfile_id,$ifields) select $output_bed_id as bedfile_id, $ifields from summarybed $whr_cl"; //$q = "select $output_bed_id as bedfile_id, $ifields from summarybed $whr_cl"; $q = "select $ifields from summarybed $whr_cl"; file_put_contents("/tmp/dasrextr.log", "$q\n\n". print_r($vals, true)); $result = $db->query($q, $vals); //if($db->getOne("select summarybed_id from summarybed where bedfile_id = ? limit 1", $output_bed_id)) { //$qmarks = join(',', array_fill(0, count($field_arr) + 1, '?')); if($result->numRows()) { $output_path = FILE_REPOSITORY_PATH . '/' . uniqid() . date('YmdHis'); $fp = fopen($output_path, "w"); fputs($fp, $r1['header'] . "\n"); while($r = $result->fetchRow()) { fputs($fp, join("\t", $r) . "\n"); //$stat = $db->query("insert into summarybed (bedfile_id,$ifields) values ($qmarks)", $r); //if(PEAR::isError($stat)) { // file_put_contents("/tmp/dasrextr.log", print_r($stat, true), FILE_APPEND); // die('insert failed'); //} //if($i % 10 == 0) { // $db->commit(); //} } fclose($fp); $db->query('update bedfile set filetype = ? where bedfile_id = ?', array('rawbed', $output_bed_id)); $db->query('insert into rawbed (bedfile_id, filepath) values (?,?)', array($output_bed_id, $output_path)); $db->commit(); $metadata[] = array('name' => $new['name'], 'header' => (string)$r1['header'], 'upload_date' => date('n/j/y', strtotime($date)), 'id' => $output_bed_id, 'genome' => $r1['genome_name'], 'method' => $r1['method_name'], 'descr' => (string)$new['descr']); } else { //todo: generate error: extract yielded nothing file_put_contents("/tmp/dasrextr.log", "\nno result...\n", FILE_APPEND); $err = "It looks like the extraction yielded no output for your chosen file."; } } return $metadata; }