<?php // ------------------------------------------------------------------------------ // A php script which reads an ascii data file and converts it into VOTable file // // Usage from command line: // php asciiURL_to_votableURL.php asciiURL // asciiURL url of the ascii file // // Usage from browser: // http://impex-fp7.fmi.fi/ws/asciiURL_to_votableURL.php?asciiURL // asciiURL url of the ascii file // // The script returns the url of the created VOTable file. // // This script is written for handling ascii data files (from Cluster) provided // by Vincent Genot. It makes assumptions about the format of data in the ascii // file so it is probably not suitable for handling other ascii files. // ------------------------------------------------------------------------------ // ----------------------------------- // Get the URL of the ascii data file // ----------------------------------- if (isset($_GET['url'])) { // For html calls $url_ascii = $_GET['url']; } else { // For command line if (!isset($argv[1])) die("No url given" . "\n"); $url_ascii = $argv[1]; } // -------------------------------- // Read the ascii file into memory // -------------------------------- $ch = curl_init($url_ascii); curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSLVERSION,3); $ascii_file = curl_exec($ch); curl_close($ch); if ($ascii_file === false) die("Could not read url " . $url_ascii . "\n"); // ------------------------------------------------- // A simple test that this is indeed our data file: // Must start with '# ' string. // ------------------------------------------------- if (substr($ascii_file,0,2) !== "# ") die("Ascii file not in proper format " . "\n"); // ------------------------------------------------------ // Define input parameter array for getVOTableURL method // ------------------------------------------------------ $params = array( 'Table_name' => $url_ascii, 'Description' => "", 'Fields' => array() ); // ------------------------------------------------------------------- // Go through the file line by line and extract field names and data // ------------------------------------------------------------------- $ascii_table = preg_split("/[\n]+/", $ascii_file); // Split the ascii file into an array of lines $First = true; // Flag for detecting the first non-comment line (= line with field names) foreach($ascii_table as $line) { // Store comment lines into VOT table description // Comment lines start with character '#' if (substr($line,0,1) == "#") { $params['Description'] .= $line . "\n"; continue; } // If first non-comment line read field names and units. The line content is something like: // it year mo dy hr mn sc msc X Y Z rho ux uy uz Bx(nT) By(nT) Bz(nT) p jx jy jz if ($First) { $lineX = str_replace ('X' , 'X(Re)' , $line); $lineY = str_replace ('Y' , 'Y(Re)' , $lineX); $lineZ = str_replace ('Z' , 'Z(Re)' , $lineY); $lineRho = str_replace ('rho' , 'rho(cm-3)' , $lineZ); $lineUx = str_replace ('ux' , 'ux(km/s)' , $lineRho); $lineUy = str_replace ('uy' , 'uy(km/s)' , $lineUx); $lineUz = str_replace ('uz' , 'uz(km/s)' , $lineUy); $lineP = str_replace ('P' , 'P(nPa)' , $lineUz); $lineJx = str_replace ('jx' , 'jx(mA/m2)' , $lineP); $lineJy = str_replace ('jy' , 'jy(mA/m2)' , $lineJx); $lineJz = str_replace ('jz' , 'jz(mA/m2)' , $lineJy); $Field_list = preg_split("/[\s,]+/", trim($lineJz)); // Create an array of field names foreach($Field_list as $field) { $params['Fields'][] = array(); // Create a new associative array for this field $index = count($params['Fields']) - 1; // Get name and possible unit (included in parenthesis) preg_match("/([^(]+)[(]*([^)]*)[)]*$/", $field, $matches); $params['Fields'][$index]['name'] = $matches[1]; $params['Fields'][$index]['unit'] = $matches[2]; // unit string is "" if no unit defined // Set the datatype attribute. Otherwise Topcat won't recognize the variable if (in_array($matches[1], array('it','year','mo','dy','hr','mn','sc','msc'))) $params['Fields'][$index]['datatype'] = 'int'; else $params['Fields'][$index]['datatype'] = 'float'; $params['Fields'][$index]['data'] = array(); // Define the array for data values } $First = false; continue; } // Read data line $i = 0; $Value_list = preg_split("/[\s,]+/", trim($line)); // Make an array of data values in this line foreach($Value_list as $value) { $params['Fields'][$i++]['data'][] = $value; // Add the data value into field's data array } } // --------------------------------------- // Add the time column in ISO8601 format. // --------------------------------------- // First try to locate the data arrays for year, mo, dy, hr, mn, sc and msc columns foreach($params['Fields'] as $field) { if ($field['name'] == 'year') $year_data = $field['data']; if ($field['name'] == 'mo') $mo_data = $field['data']; if ($field['name'] == 'dy') $dy_data = $field['data']; if ($field['name'] == 'hr') $hr_data = $field['data']; if ($field['name'] == 'mn') $mn_data = $field['data']; if ($field['name'] == 'sc') $sc_data = $field['data']; if ($field['name'] == 'msc') $msc_data = $field['data']; } // If all date arrays are found then create the date string in ISO8601 format if (isset($year_data) and isset($mo_data) and isset($dy_data) and isset($hr_data) and isset($mn_data) and isset($sc_data) and isset($msc_data)) { $params['Fields'][] = array(); // Add new field to $params array $index = count($params['Fields']) - 1; // Index of the new field $params['Fields'][$index]['name'] = 'Time'; // Set the name to 'Time' $params['Fields'][$index]['data'] = array(); // Create array for data values for ($i = 0; $i < count($year_data); $i++) { // Fill the data array $time_stamp = gmmktime($hr_data[$i], $mn_data[$i], $sc_data[$i], $mo_data[$i], $dy_data[$i], $year_data[$i]); $time_str = gmdate("Y-m-d\TH:i:s", $time_stamp) . "." . substr("000" . $msc_data[$i],-3); $params['Fields'][$index]['data'][] = $time_str; // Add the value to the end of the data table } } // ------------------------------------------------------------------------- // More computable quantities (e.g. Btot, Utot) may be added here similarly // ------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------- // Finally call the getVOTableURL method to create a VOTtable file and store it into FMI's server // ----------------------------------------------------------------------------------------------- $methods_file = "http://impex-fp7.fmi.fi/ws/Methods_FMI.wsdl"; $client = new SoapClient($methods_file); try { $data_url = $client->getVOTableURL($params); } catch (Exception $e) { echo "Error : <br />"; echo $e->getMessage(); exit(); } if ($data_url){ $contenu = file_get_contents($data_url); echo $contenu; } // echo $data_url . "\n"; ?>