diff --git a/CMakeLists.txt b/CMakeLists.txt index 200c68b..f4413ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,11 +60,7 @@ add_subdirectory(src/DECODERS/ascii2nc) add_subdirectory(src/DECODERS/cdf2nc) add_subdirectory(src/DECODERS/cdfnew2nc) add_subdirectory(src/DECODERS/nc2nc) -add_subdirectory(src/DECODERS/themis/esa2nc) -add_subdirectory(src/DECODERS/themis/esafull2nc) -add_subdirectory(src/DECODERS/themis/esamom2nc) -add_subdirectory(src/DECODERS/themis/fgm2nc) -add_subdirectory(src/DECODERS/themis/sst2nc) +add_subdirectory(src/DECODERS/themis) add_subdirectory(src/DATA/TOOLS) add_subdirectory(src/DDSERVICES/TOOLS) add_subdirectory(tests) diff --git a/src/CALLEXT/cdaweb_cfg.php b/src/CALLEXT/cdaweb_cfg.php deleted file mode 100644 index 4eb728a..0000000 --- a/src/CALLEXT/cdaweb_cfg.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - define("ftp_server", "cdaweb.gsfc.nasa.gov"); - define("ftp_user_name", "anonymous"); - define("ftp_user_pass", "budnik@irap.omp.eu"); - define("ftp_dir", "pub/software/cdawlib/0MASTERS/"); - - define ("wsdlCDAWEB", "http://cdaweb.gsfc.nasa.gov/WS/jaxrpc?WSDL"); - define ("viewID" , "istp_public"); -?> \ No newline at end of file diff --git a/src/CALLEXT/createHeaderMAPSKP.php b/src/CALLEXT/createHeaderMAPSKP.php deleted file mode 100644 index 2a07084..0000000 --- a/src/CALLEXT/createHeaderMAPSKP.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -/* $Id: createHeaderMAPSKP.php,v 1.5 2008/03/05 14:03:45 elena Exp $ */ -/** -* \file createHeaderMAPSKP.php -* \brief Function to create header.nc for MapsKP datasets which are not self-described -* \todo Exclude absolute path for /usr/local/bin/ncgen -*/ - -function createHeaderMAPSKP($remSetID) { - - $url = "http://planetoweb.cesr.fr/mapskp-amda/MapskpService.php?"; - $passwd = "ftp://amda:dd;mapskp@"; - - $args = array('service'=>'getInfoUrl', - 'datasetId'=>$remSetID); - - $url .= http_build_query($args); - $infoDom = new DOMDocument(); - $infoDom->load($url); - $File = $infoDom->getElementsByTagName("infoUrl")->item(0)->nodeValue; - - $fileName_ = explode("ftp://",$File); - $fileName = $fileName_[0].$passwd.$fileName_[1]; - - $infoDom->load($fileName); - - $sampling = $infoDom->getElementsByTagName("TIME_RESOLUTION")->item(0)->nodeValue; - $globalAttrs = ":minSampling = ".$sampling.";"; - - $params = $infoDom->getElementsByTagName("PARAM_METADATA"); - - $Dimensions = "Time = unlimited, TimeLength = 17 "; - $charVariables = "char Time(Time,TimeLength), StartTime(TimeLength), StopTime(TimeLength);"; - $floatVariables = "float "; - - $Size = array(); - $addDim = true; - - for ($i = 0; $i < $params->length; $i++) { - - $Name = $params->item($i)->getElementsByTagName("PARAM_ID")->item(0)->nodeValue; - $Size[$i] = $params->item($i)->getElementsByTagName("SIZES")->item(0)->nodeValue; - $Type = $params->item($i)->getElementsByTagName("DATA_TYPE")->item(0)->nodeValue; - - if ($i > 0) $floatVariables .= ","; - - if ($Size[$i] != "1" ) { - for ($j = 0; $j < $i+1; $j++) - if ($Size[$i] == $Size[$j]) { - if ($i != 0 && $j != $i) $addDim = false; - break; - } - if ($addDim) $Dimensions .= ", Dim".$j." = ".$Size[$j]; - $floatVariables .= $Name."(Time, Dim".$j.")"; - $addDim = true; - } - else - $floatVariables .= $Name."(Time)"; -// - } - -// Create CDL ASCII file - $cdl = fopen("header.cdl","w"); - fwrite($cdl, "netcdf header { \n \n dimensions: \n"); - fwrite($cdl,$Dimensions."; \n\n"); - - fwrite($cdl, "variables: \n "); - fwrite($cdl, $charVariables."\n"); - fwrite($cdl, $floatVariables."; \n \n"); - fwrite($cdl, $globalAttrs."\n"); - fwrite($cdl, "data: \n\n }"); - fclose($cdl); -// transform to nc - system("/usr/bin/ncgen -o header.nc header.cdl"); -// make constant Energy Tables in info.nc -// For MIMI also ... - if ($remSetID == "RPWS_KEY") { - $StartTime = $infoDom->getElementsByTagName("START_DATE")->item(0)->nodeValue; - $function = "make".$remSetID."info"; - include($function.".php"); - if ($OK = $function($StartTime)) system("join_nc ".strtolower($remSetID)."_constant.nc ".strtolower($remSetID)."_info.nc"); - } - } -?> diff --git a/src/CALLEXT/getData.php b/src/CALLEXT/getData.php index c54a7ab..5db670c 100644 --- a/src/CALLEXT/getData.php +++ b/src/CALLEXT/getData.php @@ -70,9 +70,12 @@ // Add nc to Vi $nc_prefix = strlen($id) > RemoteDataCenterClass::$MAX_VI_NAME_LENGTH ? substr($id, 0, RemoteDataCenterClass::$MAX_VI_NAME_LENGTH - 1): $id; + + $nc_prefix = strpos($id, ":") !== false ? + substr($id,strpos($id, ":")+1) : $id; $baseMgr = new DDBaseMgr(); - $baseMgr->setViId($id); + // $baseMgr->setViId($id); $baseMgr->setViInfo(strtolower($nc_prefix)); $baseMgr->setViDir($ViDir); $baseMgr->addRemoteData($id, $ncFiles, $startIso, $stopIso); diff --git a/src/CALLEXT/getDataMAPSKP.php b/src/CALLEXT/getDataMAPSKP.php deleted file mode 100644 index 9bd02cb..0000000 --- a/src/CALLEXT/getDataMAPSKP.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php -/** -* @file getDataMAPSKP.php -* @version $Id: getDataMAPSKP.php,v 1.6 2009/08/26 09:32:56 budnik Exp $ -* @brief DD_Server tools <br> Gets Data from MAPSKP -* -* Args: remDataSetID ddVIdir StartTime StopTime \n -* Env Vars: $DDBASE $DDBASEBIN \n -* Executables: ascii2nc(DECODERS) TimesUpdate TimesUpdateNoData clean -* -* -* @todo General getData.php(dataBaseID) -*/ - function name2DD($fileName) { - $pairs = array(".tab" => ".nc","__" => "_"); - return strtr(strtolower($fileName),$pairs) ; -} -// Args - $id = $argv[1]; - $ViDir = $argv[2]; - $Start = $argv[3]; - $Stop = $argv[4]; - -// Env variables - $DDBASEBIN = getenv("DDBASEBIN"); - $DDBASE = getenv("DDBASE"); - $MAX_NAME_LENGTH = 31; - $MAX_VI_NAME_LENGTH = 16; - -// MAPSKP STUFF - $passwd = "//amda:dd;mapskp@"; - $url = "http://planetoweb.cesr.fr/mapskp-amda/MapskpService.php?"; - - $args = array('service'=>'getDataUrl', - 'datasetId'=> $id, - 'dateBegin'=> strtr($Start,".000Z","Z"), - 'dateEnd'=> strtr($Stop,".000Z","Z")); - -// Open STDERR stream - $STDERR = fopen("php://stderr","w"); - -// Lock VI directory for Updating -// Stamp -> this directory is being updated - $LockName = $ViDir."/LOCK"; - touch($LockName); - -fprintf($STDERR,$ViDir." is LOCKED\n"); - -// Send - Receive query - $url .= http_build_query($args); - $fileList = new DOMDocument(); - $fileList->load($url); - - $Files = $fileList->getElementsByTagName("url"); - - fprintf($STDERR, "FILES RETURN ". $Files->length."\n"); - -// Clean VI directory - system("cd ".$ViDir."; ./clean"); -// If name is too long.... - $nc_prefix = strlen($id) > $MAX_VI_NAME_LENGTH ? substr(strtolower($id),0,15): strtolower($id); - - if ($Files->length > 0) { - for ($i = 0; $i < $Files->length; $i++) { - - copy($ViDir."/header.nc","temp.nc"); - $fileName_ = explode("//",$Files->item($i)->nodeValue); - $fileName = $fileName_[0].$passwd.$fileName_[1]; - $fileArr = split("/",$fileName); -// Copy URL file to DD_Server dir - $ok = copy($fileName, $fileArr[count($fileArr)-1]); - if ($ok) { -// Convert ascii TAB to nc using header.nc - system($DDBASEBIN."/ascii2nc ".$fileArr[count($fileArr)-1]); - fprintf($STDERR, "FILE $i TRANSLATED \n"); - unlink($fileArr[count($fileArr)-1]); - $ncFile = name2DD($fileArr[count($fileArr)-1]); -// Truncate file if it is too long - $ncFileTrue = ($strLength = strlen($ncFile)) > $MAX_NAME_LENGTH ? - $nc_prefix."_".time().$i.".nc" : $ncFile; -// Move nc file to VIdir - rename("temp.nc", $ViDir."/".$ncFileTrue); - -// Updates VI time info - system("cd ".$ViDir."; ".$DDBASEBIN."/TimesUpdate -u ".strtolower($id)."_times.nc ".$ncFileTrue); - } - } - fprintf($STDERR, "TIMES IS UPDATED \n"); - } - - system("cd ".$ViDir."; ".$DDBASEBIN."/TimesUpdateNoData ".strtolower($id)."_times.nc ".$argv[3]." ".$argv[4]); -// Unlock VI dir - unlink($LockName); - fprintf($STDERR, "UNLOCK \n"); -?> diff --git a/src/CALLEXT/getDataTHEMIS.php b/src/CALLEXT/getDataTHEMIS.php deleted file mode 100644 index 4caed41..0000000 --- a/src/CALLEXT/getDataTHEMIS.php +++ /dev/null @@ -1,152 +0,0 @@ -<?php -/** -* @file getDataTHEMIS.php -* @version $Id: getDataTHEMIS.php,v 1.7 2010/01/11 18:16:46 budnik Exp $ -* @brief DD_Server tools <br> Gets Data from /THEMIS_B1 (NFS) -* -* @arg remDataSetID ddVIdir StartTime StopTime \n -* Env Vars: $DDBASE $DDBASEBIN \n -* Executables: [DataSet]2nc(DECODERS) TimesUpdate TimesUpdateNoData clean -* -* -* @todo General getData.php(dataBaseID) -*/ - - - -// Open STDERR stream - $STDERR = fopen("php://stderr","w"); - -// Args - $id = $argv[1]; - - $ViDir = $argv[2]; - $Start = $argv[3]; - $Stop = $argv[4]; -// NFS direcory - define('ThemisDir', '/THEMIS_B1/themisdata/'); - define('DataSetDir', ThemisDir.strtr($id,"_","/")); -// Env variables - define('DDBASEBIN', getenv("DDBASEBIN")); - define('DDBASE', getenv("DDBASE")); - - - - $arr = explode("/", $ViDir); - $instrument = $arr[5]; - $mission = $arr[4]; - $mode = strpos($arr[6],"_") === false ? $arr[6] : substr($arr[6],0,4); - - - switch ($mode) { - case "psif" : - case "psef" : - case "peif" : - case "peef" : - case "peim" : - case "peem" : - case "h" : - case "l" : - $realDir = DDBASE."/".$mission."/".$instrument."/".$arr[6]."/"; - system("cd $realDir ; ./clean"); - touch($realDir."/LOCK"); -fprintf($STDERR,$realDir." is LOCKED\n"); - break; - case "peir" : - case "peer" : - case "peib" : - case "peeb" : - $dirAdd = array("/sp", "/mom"); - $fileAdd = array("s", ""); - $realDir = DDBASE."/".$mission."/".$instrument."/".$mode."/"; - for ($n = 0; $n < 2; $n++) { - $theDir = $realDir.$dirAdd[$n]; - system("cd $theDir ; ./clean "); - touch($theDir."/LOCK"); -fprintf($STDERR,$theDir." is LOCKED\n"); - } - break; - } - - - switch ($mode) { - case "peif" : - case "peef" : - $program = DDBASEBIN."/themis_esafull2nc "; - break; - case "peim" : - case "peem" : - $program = DDBASEBIN."/themis_esamom2nc "; - break; - case "peir" : - case "peer" : - case "peib" : - case "peeb" : - $program = DDBASEBIN."/themis_esa2nc "; - break; - case "psif" : - case "psef" : - $program = DDBASEBIN."/themis_sst2nc "; - break; - case "h" : - case "l" : - $program = DDBASEBIN."/themis_fgm2nc "; - break; - } -// fprintf($STDERR, "REALDIR ".$realDir." \n"); - -// Which files - $currTime = strtotime($Start); - $stopTime = strtotime($Stop); - - $currTime -= 3600.0; - - while ($currTime <= $stopTime) { - $fileName = DataSetDir."/".date('Y', $currTime)."/".$id."_".date('Ymd', $currTime)."_v01.cdf"; - - if (file_exists($fileName)) { - system($program." ".$fileName." ".$mission." ".$mode); - fprintf($STDERR, "FILE $fileName is TRANSLATED \n"); - - } - else { - fprintf($STDERR,"NO SUCH FILE $fileName \n"); - } - $currTime += 24*60*60; - } - - - switch ($mode) { - case "psif" : - case "psef" : - case "peif" : - case "peef" : - case "peim" : - case "peem" : - system("mv ".$mode."[0-9]*.nc $realDir"); - system("cd $realDir ;".DDBASEBIN."/TimesUpdate -u ".$mode."_times.nc ".$mode."[0-9]*.nc; ".DDBASEBIN."/TimesUpdateNoData ".$mode."_times.nc ".$argv[3]." ".$argv[4]); - unlink($realDir."/LOCK"); - break; - case "peir" : - case "peer" : - case "peib" : - case "peeb" : - for ($n = 0; $n < 2; $n++) { - $theDir = $realDir.$dirAdd[$n]; - system("mv ".$fileAdd[$n].$mode."[0-9]*.nc $theDir"); - system("cd $theDir ;".DDBASEBIN."/TimesUpdate -u ".$mode."_times.nc ".$fileAdd[$n].$mode."[0-9]*.nc; ".DDBASEBIN."/TimesUpdateNoData ".$mode."_times.nc ".$argv[3]." ".$argv[4]); - unlink($theDir."/LOCK"); - } - break; - case "h" : - case "l" : - system("mv fgm".$mode."[0-9]*.nc $realDir"); - system("cd $realDir ;".DDBASEBIN."/TimesUpdate -u fgm".$mode."_times.nc fgm".$mode."[0-9]*.nc; ".DDBASEBIN."/TimesUpdateNoData fgm".$mode."_times.nc ".$argv[3]." ".$argv[4]); - unlink($realDir."/LOCK"); - break; - } - - fprintf($STDERR, "TIMES IS UPDATED \n"); - - fprintf($STDERR, "UNLOCK \n"); -?> diff --git a/src/CALLEXT/makeRPWS_KEYinfo.php b/src/CALLEXT/makeRPWS_KEYinfo.php deleted file mode 100644 index 2046031..0000000 --- a/src/CALLEXT/makeRPWS_KEYinfo.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php -/* $Id: makeRPWS_KEYinfo.php,v 1.1 2008/03/05 14:04:22 elena Exp $ */ -/** -* \file makeRPWS_KEYinfo.php -* \brief Function to create energy info.nc for RPWS -* -*/ - - function makeRPWS_KEYinfo($StartTime) { - - $OK = false; - $E_PARAM = "ELECTRIC_SPECTRAL_DENSITIES"; - $M_PARAM = "MAGNETIC_SPECTRAL_DENSITIES"; - $OK = true; - $url = "http://planetoweb.cesr.fr/mapskp-amda/MapskpService.php?"; - $passwd = "//amda:dd;mapskp@"; - - $Stop = date("Y-m-d", strtotime("+10 days",strtotime($StartTime))); - - $args = array('service'=>'getDataUrl', - 'datasetId'=> "RPWS_KEY", - 'dateBegin'=> $StartTime."Z", - 'dateEnd'=> $Stop."T00:00:00Z"); - - - $url .= http_build_query($args); - $fileList = new DOMDocument(); - $fileList->load($url); - $Files = $fileList->getElementsByTagName("url"); - - if ($Files->length > 0) { - - $fileName_ = explode("//",$Files->item(0)->nodeValue); - $fileName = $fileName_[0].$passwd.$fileName_[1]; - $fileArr = split("/",$fileName); -// Copy URL file VI dir - copy($fileName, $fileArr[count($fileArr)-1]); - $file = fopen($fileArr[count($fileArr)-1], "r"); - $buffer = fgets($file); - $arrFreq = explode(" ", $buffer); - $Frequency_E = implode(",",array_slice($arrFreq,2,73)); - - $Frequency_M = implode(",",array_slice($arrFreq,75,42)); - - fclose($file); - unlink($fileArr[count($fileArr)-1]); - -// Create CDL ASCII file - $cdl = fopen("constant.cdl","w"); - fwrite($cdl, "netcdf header { \n \n dimensions: \n"); - fwrite($cdl," DIM_E = 73, DIM_M = 42; \n\n"); - - fwrite($cdl, "variables: \n"); - fwrite($cdl, " float ".$E_PARAM."(DIM_E), ".$M_PARAM."(DIM_M); \n\n"); - fwrite($cdl, ":units = \"Hz\"; \n"); - fwrite($cdl, "data: \n".$E_PARAM." = ".trim($Frequency_E).";\n".$M_PARAM." = ".trim($Frequency_M).";\n }"); - fclose($cdl); -// transform to nc - system("/usr/bin/ncgen -o rpws_key_constant.nc constant.cdl"); - $OK = true; - } - - return $OK; - } -?> diff --git a/src/CALLEXT/mapskp_cfg.php b/src/CALLEXT/mapskp_cfg.php deleted file mode 100644 index 3d8e05f..0000000 --- a/src/CALLEXT/mapskp_cfg.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php - - define("url","http://planetoweb2.cesr.fr/mapskp-amda/MapskpService.php?"); - define("passwd","ftp://amda:dd;mapskp@"); -?> diff --git a/src/DATA/MANAGER/DDBaseMgr.php b/src/DATA/MANAGER/DDBaseMgr.php index 0829d88..aa83d73 100644 --- a/src/DATA/MANAGER/DDBaseMgr.php +++ b/src/DATA/MANAGER/DDBaseMgr.php @@ -39,6 +39,11 @@ class DDBaseMgr $this->ViDir = $ViDir; } + public function setRemoteViId($ViId) + { + $this->remoteViId = $ViId; + } + public function setViId($ViId) { $this->ViId = $ViId; @@ -233,7 +238,7 @@ class DDBaseMgr // fprintf($STDERR,$ViDir." is UNLOCKED\n"); } - public function addRemoteData($id, $ncFiles, $start, $stop) + public function addRemoteData($id, $ncFiles, $start, $stop, $notFirst = true) { $WORKING_DIR = getcwd(); chdir($this->ViDir); @@ -247,8 +252,9 @@ class DDBaseMgr system("TimesUpdate -u ".$this->times." ".$ncFile); } - system("TimesUpdateNoData ".$this->times." ".$start." ".$stop); - + if ($notFirst) + system("TimesUpdateNoData ".$this->times." ".$start." ".$stop); + chdir($WORKING_DIR); } diff --git a/src/DECODERS/themis/CMakeLists.txt b/src/DECODERS/themis/CMakeLists.txt new file mode 100644 index 0000000..b6ef0ea --- /dev/null +++ b/src/DECODERS/themis/CMakeLists.txt @@ -0,0 +1,20 @@ + +PROJECT(THEMIS) + +include_directories( + ${DDCLIENTINCLUDE_DIR} + ${NETCDFINCLUDE_DIR} + ${libcdf_INCLUDE_DIR} +) + +#Configuration de l'exécutable + +file( GLOB SOURCE_FILES ./*.c ) + +foreach( sourcefile ${SOURCE_FILES} ) + get_filename_component( source ${sourcefile} NAME) + string( REPLACE ".c" "" exefile ${source} ) + add_executable( ${exefile} ${source} ) + target_link_libraries( ${exefile} ${DDCLIENTLIBRARY} ${NETCDFLIBRARY} ${libcdf_LIBRARIES} ) + install (TARGETS ${exefile} DESTINATION bin) +endforeach( sourcefile ${SOURCE_FILE} ) diff --git a/src/DECODERS/themis/esa2nc/CMakeLists.txt b/src/DECODERS/themis/esa2nc/CMakeLists.txt deleted file mode 100644 index f7c789c..0000000 --- a/src/DECODERS/themis/esa2nc/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ - -PROJECT(themis_esa2nc) - -include_directories( - ${DDCLIENTINCLUDE_DIR} - ${NETCDFINCLUDE_DIR} - ${libcdf_INCLUDE_DIR} -) - -#Configuration de l'exécutable -file( - GLOB_RECURSE - source_files - ./* -) - -ADD_EXECUTABLE (themis_esa2nc ${source_files} ) - -target_link_libraries( - themis_esa2nc - ${DDCLIENTLIBRARY} - ${NETCDFLIBRARY} - ${libcdf_LIBRARIES} -) - -install (TARGETS themis_esa2nc DESTINATION bin) diff --git a/src/DECODERS/themis/esa2nc/themis_esa2nc.c b/src/DECODERS/themis/esa2nc/themis_esa2nc.c deleted file mode 100644 index a1ea6d3..0000000 --- a/src/DECODERS/themis/esa2nc/themis_esa2nc.c +++ /dev/null @@ -1,551 +0,0 @@ -/** -* @file themis_esa2nc.c -* @brief Stand alone executable to tranform Themis (Burst & Reduced modes) CDF to DD netCDF -* @version $Id: themis_esa2nc.c,v 1.5 2013/11/29 14:11:56 budnik Exp $ -*/ - /**************************************************************/ - /* THEMIS ESA ION AND ELECTRON Burst & Reduced CDF -> DD netCDF */ - /* */ - /* Energy in info file */ - /* New CDF with peib & peir and new params */ - /* 04.01.2008 - 2 files (sp & mom) for peir[b] & peer[b] modes */ - /**************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <netcdf.h> -#include <cdf.h> -#include <DD.h> -#include <string.h> -#include <time.h> -#include <math.h> - -#define TimeGap 3600.0 -#define Source "themis@cdpp2" -#define MAX_FILE_NAME_LEN 250 // Max. file name length -#define MAX_VARS 250 // Max # of VARS in CDF - - -/************************************* - Global variables and structures -**************************************/ -long CDFDims, // Number of dimensions in a CDF file - CDFVars, // Number of variables in a CDF file - CDFDimSizes[CDF_MAX_DIMS], // Dimension Sizes in a CDF file - CDFencoding, // Data encoding - CDFmajority, // Variable majority - CDFmaxRec, // max Record number - CDFAttrs; // number of CDF Attributes - - -struct cdfvar { // CDF variable structure - char name[CDF_VAR_NAME_LEN+1]; - long num; //variable number - long datatype; - long numElem; // variable dimensionality - long recVariance; // variable rec Variance - long dimVariances[CDF_MAX_DIMS]; // # of data values in dimSizes -} cdfVar[MAX_VARS]; - -char mode[4]; -int ncID, ncSpID; -char ncFile[] = "peir000000000.nc"; -char ncSpFile[] = "speir000000000.nc"; -int TimeDimID, TimeLengthID, DataID, DataSpID, Data2ID; -int TimeDimSpID, TimeLengthSpID, FluxDimID; // ID of netCDF dimensions -int TimeDimVector[2], DataDimVector[2], Data2DimVector[2], FluxDimVector[2]; // netCDF Dim vectors -int TimeDimSpVector[2], DataDimSpVector[2]; -size_t Start[2] = {0L,0L}; -size_t TimeCount[2] = {1L,TIMELENGTH}; -size_t Data1Count[2] = {1L,1L}; -size_t DataCount[2] = {1L,3L}; -size_t Data2Count[2] = {1L,6L}; -size_t FluxCount[2] = {1L,32L}; - -CDFstatus cstatus; // CDF status code - -char Version[]="v01"; -char ThemisID[]="tha\0"; -char ThemisTime[]="tha_peif_time"; -char PAR0[]="tha_peif_delta_time"; -char PAR1[]="tha_peif_mode"; -char PAR2[]="tha_peif_density"; -char PAR3[]="tha_peif_velocity_gse"; -char PAR4[]="tha_peif_t3"; // Diagonilized Temperature -char PAR5[]="tha_peif_en_eflux"; -char PAR6[]="tha_peif_en_eflux_yaxis"; -char PAR7[]="tha_peif_avgtemp"; // trace of t3 divided by 3 -char PAR8[]="tha_peif_vthermal"; -char PAR9[]="tha_peif_sc_pot"; -char PAR10[]="tha_peif_sc_current"; -char PAR11[]="tha_peif_magt3"; // Temperature in Mag Field frame -char PAR12[]="tha_peif_ptens"; // Pressure Tensor DSL -char PAR13[]="tha_peif_mftens"; // Momentum Flux Tensor DSL -char PAR14[]="tha_peif_flux"; // particle flux -char PAR15[]="tha_peif_symm"; // Direction of pressure tensor symmetry in DSL -char PAR16[]="tha_peif_symm_ang"; // Angle between Direction of pressure tensor symmetry and B - - -int StartTimeID, StopTimeID; -int StartTimeSpID, StopTimeSpID; -int DeltaTID, DensID, AvTempID, ThVelID, PotID, CurrID, SymAngID; // 1D -int MfTempID, TempID, ModeID, ModeSpID, VelID, Flux2ID, SymmID; // 2D -> 3 -int prTenID, mfTenID; // 2D -> 6 -int FluxID; // 2D -> 32 -int TimeID; // Time netCDF variable -int TimeSpID; - -char StartT[TIMELENGTH]; // Start time from data -char StopT[TIMELENGTH]; // Stop time from data -/************************** - Function prototypes -**************************/ -void usage(); -void cdf_handle_error (CDFstatus); -void nc_handle_error (int); -void removeFilepath(); -void removeCDFext(); -void removeVers(); -void ncdefine(); -/*--------------------------------------------------------------------------*/ -void usage() -{ - printf ("\nDescription:\n"); - printf (" This program converts a themis CDF file into a netCDF file.\n"); - printf ("\n"); - printf ("Usage: esa2nc <CDF file name> <ThemisID> <mode>\n"); - printf ("\n"); - printf ("Example: esa2nc testfile tha peif\n"); - printf ("\n"); - exit(1); -} -/*-------------------------------------------------------------------------- - * Handles a CDF error. - *--------------------------------------------------------------------------*/ -void cdf_handle_error(CDFstatus status) -{ - - char message[CDF_STATUSTEXT_LEN+1]; - - CDFerror (status, message); /* Get the appropriate message */ - fprintf (stderr, "CDF: %s\n", message); -// exit(1); -} -/*-------------------------------------------------------------------------- - * Handles a netCDF error. - *--------------------------------------------------------------------------*/ -void nc_handle_error(int status) -{ - fprintf(stderr, "%s\n", nc_strerror(status)); - exit(1); -} - -/*-------------------------------------------------------------------------- - * NetCDF File Definition * - *--------------------------------------------------------------------------*/ - void ncdefine(double Time) - { - char *s; - time_t p; - int status; - char *STime; - -/*********************** Create netCDF file *****************************/ - memcpy(&(ncFile[0]),&(mode[0]), 4); - STime = Double2DD_Time(Time); - memcpy(&(ncFile[4]),&(STime[2]), 9); - if ((status = nc_create(ncFile, NC_CLOBBER, &ncID)) != NC_NOERR) - nc_handle_error(status); -/******************netCDF Dimensions *******************************/ - nc_def_dim (ncID, "Time", NC_UNLIMITED, &TimeDimID); - nc_def_dim (ncID, "TimeLength", TIMELENGTH, &TimeLengthID); - nc_def_dim (ncID, "Data",3L, &DataID); - nc_def_dim (ncID, "Data2",6L, &Data2ID); - -/********************netCDF Variables ******************/ - TimeDimVector[0] = TimeDimID; - DataDimVector[0] = TimeDimID; - Data2DimVector[0] = TimeDimID; - TimeDimVector[1] = TimeLengthID; - DataDimVector[1] = DataID; - Data2DimVector[1] = Data2ID; - -// - nc_def_var (ncID, "Time", NC_CHAR, 2, TimeDimVector, &TimeID); - - nc_def_var (ncID, "DeltaT", NC_DOUBLE, 1, &TimeDimID, &DeltaTID); - nc_def_var (ncID, "Mode", NC_FLOAT, 2, DataDimVector, &ModeID); - - nc_def_var (ncID, "Density", NC_DOUBLE, 1, &TimeDimID, &DensID); - nc_def_var (ncID, "AvTemp", NC_DOUBLE, 1, &TimeDimID, &AvTempID); - nc_def_var (ncID, "Potential", NC_DOUBLE, 1, &TimeDimID, &PotID); - nc_def_var (ncID, "Current", NC_DOUBLE, 1, &TimeDimID, &CurrID); - nc_def_var (ncID, "SymAngle", NC_DOUBLE, 1, &TimeDimID, &SymAngID); - nc_def_var (ncID, "V_thermal", NC_DOUBLE, 1, &TimeDimID, &ThVelID); - nc_def_var (ncID, "Velocity", NC_DOUBLE, 2, DataDimVector, &VelID); - nc_def_var (ncID, "Temperature", NC_DOUBLE, 2, DataDimVector, &TempID); - nc_def_var (ncID, "B_Temperature", NC_DOUBLE, 2, DataDimVector, &MfTempID); - nc_def_var (ncID, "Flux_tot", NC_DOUBLE, 2, DataDimVector, &Flux2ID); - nc_def_var (ncID, "Symm", NC_DOUBLE, 2, DataDimVector, &SymmID); - nc_def_var (ncID, "tensor_p", NC_DOUBLE, 2, Data2DimVector, &prTenID); - nc_def_var (ncID, "tensor_mf", NC_DOUBLE, 2, Data2DimVector, &mfTenID); - - nc_def_var (ncID, "StartTime",NC_CHAR, 1, &TimeLengthID, &StartTimeID); - nc_def_var (ncID, "StopTime",NC_CHAR, 1, &TimeLengthID , &StopTimeID); - - - - - nc_put_att_text(ncID, NC_GLOBAL, "Themis", 3, ThemisID); - nc_put_att_text(ncID, NC_GLOBAL, "Source", 12, Source); - nc_put_att_text(ncID, DensID, "Units", 5, "cm^-3"); - nc_put_att_text(ncID, TempID, "Units", 2, "eV"); - nc_put_att_text(ncID, TempID, "Frame", 2, "FA"); - nc_put_att_text(ncID, TempID, "Order", 16, "perp1,perp2,para"); - nc_put_att_text(ncID, MfTempID, "Units", 2, "eV"); - nc_put_att_text(ncID, MfTempID, "Frame", 2, "FA"); - nc_put_att_text(ncID, MfTempID, "Order", 16, "perp1,perp2,para"); - nc_put_att_text(ncID, AvTempID, "Units", 2, "eV"); - nc_put_att_text(ncID, prTenID, "Units", 2, "eV"); - nc_put_att_text(ncID, prTenID, "Frame", 3, "DSL"); - nc_put_att_text(ncID, prTenID, "Order", 17, "xx,xy,xz,yy,zz,yz"); - nc_put_att_text(ncID, mfTenID, "Units", 2, "eV"); - nc_put_att_text(ncID, mfTenID, "Frame", 3, "DSL"); - nc_put_att_text(ncID, mfTenID, "Order", 17, "xx,xy,xz,yy,zz,yz"); - nc_put_att_text(ncID, Flux2ID, "Units", 9, "#/sec/cm2"); - nc_put_att_text(ncID, PotID, "Units", 1, "V"); - nc_put_att_text(ncID, SymmID, "Frame", 3, "DSL"); - nc_put_att_text(ncID, CurrID, "Units", 7, "Unknown"); - nc_put_att_text(ncID, SymAngID, "Units", 7, "degrees"); - nc_put_att_text(ncID, VelID, "Units", 4, "km/s"); - nc_put_att_text(ncID, ThVelID, "Units", 4, "km/s"); - nc_put_att_text(ncID, VelID, "Frame", 3, "GSE"); - - - - time(&p); - s = ctime(&p); - nc_put_att_text(ncID, NC_GLOBAL, "Created", 24, s); - - - - memcpy(&(ncSpFile[1]),&(mode[0]), 4); - STime = Double2DD_Time(Time); - memcpy(&(ncSpFile[5]),&(STime[2]), 9); - if ((status = nc_create(ncSpFile, NC_CLOBBER, &ncSpID)) != NC_NOERR) - nc_handle_error(status); - - status = nc_def_dim (ncSpID, "Time", NC_UNLIMITED, &TimeDimSpID); - status = nc_def_dim (ncSpID, "TimeLength", TIMELENGTH, &TimeLengthSpID); - status = nc_def_dim (ncSpID, "Data",3L, &DataSpID); - status = nc_def_dim (ncSpID, "Flux",32L, &FluxDimID); - - FluxDimVector[0] = TimeDimSpID; - FluxDimVector[1] = FluxDimID; - -//ModeID, DensID, VelID, TempID; - - status = nc_def_var (ncSpID, "Time", NC_CHAR, 2, TimeDimVector, &TimeSpID); - status = nc_def_var (ncSpID, "Mode", NC_FLOAT, 2, DataDimVector, &ModeSpID); - status = nc_def_var (ncSpID, "Flux", NC_DOUBLE, 2, FluxDimVector, &FluxID); - - status = nc_def_var (ncSpID, "StartTime", NC_CHAR, 1, &TimeLengthSpID, &StartTimeSpID); - status = nc_def_var (ncSpID, "StopTime", NC_CHAR, 1, &TimeLengthSpID , &StopTimeSpID); - - status = nc_put_att_text(ncSpID, FluxID, "Units", 17, "eV/(cm^2-s-sr-eV)"); - status = nc_put_att_text(ncSpID, NC_GLOBAL, "Created", 24, s); - - status = nc_enddef(ncID); - status = nc_enddef(ncSpID); - - nc_put_vara_text(ncID, StartTimeID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time)); - nc_put_vara_text(ncSpID, StartTimeSpID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time)); - - } - - void put_double(RecStart, RecCount, ParCDF, ParNC) { - - - long RecInt = 1; - long indices[1] = {0}, intervals[1] = {1}, counts[1] = {1}; - - double *value; - - value = (double *)malloc(sizeof(double)*RecCount); - if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_double(ncID, ParNC, value); - - free(value); - } - - void put_double3(RecStart, RecCount, ParCDF, ParNC) { - - long RecInt = 1; - long indices[2] = {0,3}, intervals[1] = {1}, counts[1] = {3}; - double *value; - - value = (double *)malloc(sizeof(double)*RecCount*3); - if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_double(ncID, ParNC, value); - - free(value); - } - -void put_double6(RecStart, RecCount, ParCDF, ParNC) { - - long RecInt = 1; - long indices[2] = {0,6}, intervals[1] = {1}, counts[1] = {6}; - double *value; - - value = (double *)malloc(sizeof(double)*RecCount*6); - if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_double(ncID, ParNC, value); - - free(value); - } - - void put_mode(RecStart, RecCount, ParCDF, ParNC, ParSpNC) { - - float *value; - long indices[2] = {0,3}, intervals[1] = {1}, counts[1] = {3}; - long RecInt = 1; - - value = (float *)malloc(sizeof(float) * RecCount *3); - if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_float(ncID, ParNC, value); - nc_put_var_float(ncSpID, ParSpNC, value); - free(value); - } - -void put_spectra(RecStart, RecCount, ParCDF, ParNC) { - - double *value; - long indices[2] = {0,32}, intervals[1] = {1}, counts[1] = {32}; - long RecInt = 1; - - value = (double *)malloc(sizeof(double)*RecCount*32); - if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_double(ncSpID, ParNC, value); - free(value); - } -/*--------------------------------------------------------------------------*/ -int main(int argc, char *argv[]) -{ - long RecStart = 0, RecCount, RecCountF = 1, RecInt = 1, MaxRec; - long indices[1] = {0}, counts[1] = {3}, counts2[1] = {6}, countsFlux[1] = {32}, intervals[1] = {1}; - long countsE[1] = {1}, indicesF[2]={0,3}, indicesF2[2]={0,6}, indicesFlux[2] = {0, 32}; - double *value; - float *value_f; - size_t numElem; - long dimN, varN, par0, par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15, par16; - - CDFid id; - int i, j, status; - char fileName[MAX_FILE_NAME_LEN]; - dd_tmstr_t *dtm; - int First = 1; - double par[3], parr[6], doubleVal, parD[32]; - float parF[32], par_f[3], parr_f[6], floatVal; - double DayOld; - - - char *UT; - char data_set[8]="thx_pexx"; -/*-------------------------------- Arguments Decoding ----------------------------------------*/ - if (argc <= 3) usage(); // CDF input file name and THEMIS Number not specified - else - { - strcpy(fileName, argv[1]); - strncpy(ThemisID,argv[2],3); - strncpy(mode,argv[3],4); - } - -/*------------------------------------------ CDF Variables Names Updated according to THEMIS Number -------------*/ - - memcpy(&(data_set[2]),&(ThemisID[2]),1); - memcpy(&(data_set[6]),&(mode[2]),2); - - memcpy(&(ThemisTime[0]),&(data_set[0]),8); - memcpy(&(PAR0[0]),&(data_set[0]),8); - memcpy(&(PAR1[0]),&(data_set[0]),8); - memcpy(&(PAR2[0]),&(data_set[0]),8); - memcpy(&(PAR3[0]),&(data_set[0]),8); - memcpy(&(PAR4[0]),&(data_set[0]),8); - memcpy(&(PAR5[0]),&(data_set[0]),8); - memcpy(&(PAR6[0]),&(data_set[0]),8); - memcpy(&(PAR7[0]),&(data_set[0]),8); - memcpy(&(PAR8[0]),&(data_set[0]),8); - memcpy(&(PAR9[0]),&(data_set[0]),8); - memcpy(&(PAR10[0]),&(data_set[0]),8); - memcpy(&(PAR11[0]),&(data_set[0]),8); - memcpy(&(PAR12[0]),&(data_set[0]),8); - memcpy(&(PAR13[0]),&(data_set[0]),8); - memcpy(&(PAR14[0]),&(data_set[0]),8); - memcpy(&(PAR15[0]),&(data_set[0]),8); - memcpy(&(PAR16[0]),&(data_set[0]),8); - -/*********************** Open CDF file *****************************/ - if ((cstatus = CDFopen(fileName, &id)) != CDF_OK) - cdf_handle_error(cstatus); - printf(" THEMIS %s %s\n", ThemisID, mode); - -/*********** treat all vars as zVars with eliminated false dimensionality **********/ - - if ((cstatus = CDFlib(SELECT_, CDF_zMODE_, zMODEon2, NULL_)) != CDF_OK) - cdf_handle_error (cstatus); - -/************************ Get CDF Data ************************************/ - - cstatus = CDFlib(GET_, zVAR_NUMBER_, ThemisTime, &varN, NULL_); - cstatus = CDFlib( SELECT_, zVAR_, varN, GET_, zVAR_MAXREC_, &MaxRec, NULL_); - - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR0, &par0, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR1, &par1, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR2, &par2, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR3, &par3, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR4, &par4, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR5, &par5, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR6, &par6, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR7, &par7, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR8, &par8, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR9, &par9, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR10, &par10, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR11, &par11, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR12, &par12, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR13, &par13, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR14, &par14, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR15, &par15, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR16, &par16, NULL_); - - RecCount = (long)(MaxRec+1); - printf(" Max Rec %d\n", MaxRec); - - if (MaxRec <= 0) exit(0); - - value = (double *)malloc(sizeof(double)* RecCount); - if ((cstatus = CDFlib (SELECT_, - zVAR_, varN, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_) ) - != CDF_OK) cdf_handle_error(cstatus); - - for (i = 0; i < RecCount; i++) { - - - UT = Double2DD_Time(value[i]); - - if ((First == 0) && (value[i] - DayOld) > TimeGap) { - - printf("GAP %f\n",(value[i] - DayOld)/60.0); - put_double(RecStart, (long)i - RecStart, par0, DeltaTID); - put_mode(RecStart, (long)i - RecStart, par1, ModeID, ModeSpID); - put_double(RecStart, (long)i - RecStart, par2, DensID); - put_double3(RecStart, (long)i - RecStart, par3, VelID); - put_double3(RecStart,(long)i - RecStart, par4, TempID); - put_double3(RecStart, (long)i - RecStart, par11, MfTempID); - put_double3(RecStart, (long)i - RecStart, par14, Flux2ID); - put_double3(RecStart, (long)i - RecStart, par15, SymmID); - put_double6(RecStart, (long)i - RecStart, par12, prTenID); - put_double6(RecStart, (long)i - RecStart, par13, mfTenID); - put_double(RecStart, (long)i - RecStart, par7, AvTempID); - put_double(RecStart, (long)i - RecStart, par8, ThVelID); - put_double(RecStart, (long)i - RecStart, par9, PotID); - put_double(RecStart, (long)i - RecStart, par16, SymAngID); - put_spectra(RecStart, (long)i - RecStart, par5, FluxID); - - nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], Double2DD_Time(DayOld)); - nc_put_vara_text(ncSpID,StopTimeSpID, &Start[1], &TimeCount[1], Double2DD_Time(DayOld)); - - if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); - if ((status = nc_close(ncSpID)) != NC_NOERR) nc_handle_error(status); - First = 1; - RecStart = (long)i; - UT = Double2DD_Time(value[i]); - } - - dtm = ReadTime(UT); - if (First == 1) { - ncdefine(dtm->times); - - First = 0; - Start[0] = 0; - - } - nc_put_vara_text(ncID, TimeID, Start, TimeCount, UT); - nc_put_vara_text(ncSpID, TimeSpID, Start, TimeCount, UT); - Start[0]++; - DayOld = value[i]; - - } - free(value); - nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], UT); - nc_put_vara_text(ncSpID,StopTimeSpID, &Start[1], &TimeCount[1], UT); - - - put_double(RecStart, RecCount - RecStart, par0, DeltaTID); - put_mode(RecStart, RecCount - RecStart, par1, ModeID, ModeSpID); - put_double(RecStart, RecCount - RecStart, par2, DensID); - put_double3(RecStart, RecCount - RecStart, par3, VelID); - put_double3(RecStart, RecCount - RecStart, par4, TempID); - put_double3(RecStart, RecCount - RecStart, par11, MfTempID); - put_double3(RecStart, RecCount - RecStart, par14, Flux2ID); - put_double3(RecStart, RecCount - RecStart, par15, SymmID); - put_double6(RecStart, RecCount - RecStart, par12, prTenID); - put_double6(RecStart, RecCount - RecStart, par13, mfTenID); - put_double(RecStart, RecCount - RecStart, par7, AvTempID); - put_double(RecStart, RecCount - RecStart, par8, ThVelID); - put_double(RecStart, RecCount - RecStart, par9, PotID); - put_double(RecStart, RecCount - RecStart, par16, SymAngID); - put_spectra(RecStart, RecCount - RecStart, par5, FluxID); - -/********************Close Files******************/ - if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK) - cdf_handle_error (cstatus); - if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); - if ((status = nc_close(ncSpID)) != NC_NOERR) nc_handle_error(status); -} diff --git a/src/DECODERS/themis/esafull2nc/CMakeLists.txt b/src/DECODERS/themis/esafull2nc/CMakeLists.txt deleted file mode 100644 index 44424a2..0000000 --- a/src/DECODERS/themis/esafull2nc/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ - -PROJECT(themis_esafull2nc) - -include_directories( - ${DDCLIENTINCLUDE_DIR} - ${NETCDFINCLUDE_DIR} - ${libcdf_INCLUDE_DIR} -) - -#Configuration de l'exécutable -file( - GLOB_RECURSE - source_files - ./* -) - -ADD_EXECUTABLE (themis_esafull2nc ${source_files} ) - -target_link_libraries( - themis_esafull2nc - ${DDCLIENTLIBRARY} - ${NETCDFLIBRARY} - ${libcdf_LIBRARIES} -) - -install (TARGETS themis_esafull2nc DESTINATION bin) diff --git a/src/DECODERS/themis/esafull2nc/themis_esafull2nc.c b/src/DECODERS/themis/esafull2nc/themis_esafull2nc.c deleted file mode 100644 index 904ae49..0000000 --- a/src/DECODERS/themis/esafull2nc/themis_esafull2nc.c +++ /dev/null @@ -1,659 +0,0 @@ - /**************************************************************/ - /* THEMIS ESA ION AND ELECTRON MOMENTS CDF -> DD netCDF */ - /* 04.01.2008 */ - /* V 1.1 */ - /* Energy in info file */ - /* New CDF with ALL modes and new params */ - /* 04.01.2008 - 2 files for peir & peer modes */ - /**************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <netcdf.h> -#include <cdf.h> -#include <DD.h> -#include <string.h> -#include <time.h> -#include <math.h> - -#define TimeGap 1800000.0 -#define Source "themis@cdpp2" -#define MAX_FILE_NAME_LEN 250 // Max. file name length -#define MAX_VARS 250 // Max # of VARS in CDF - - -/************************************* - Global variables and structures -**************************************/ -long CDFDims, // Number of dimensions in a CDF file - CDFVars, // Number of variables in a CDF file - CDFDimSizes[CDF_MAX_DIMS], // Dimension Sizes in a CDF file - CDFencoding, // Data encoding - CDFmajority, // Variable majority - CDFmaxRec, // max Record number - CDFAttrs; // number of CDF Attributes - - -struct cdfvar { // CDF variable structure - char name[CDF_VAR_NAME_LEN+1]; - long num; //variable number - long datatype; - long numElem; // variable dimensionality - long recVariance; // variable rec Variance - long dimVariances[CDF_MAX_DIMS]; // # of data values in dimSizes -} cdfVar[MAX_VARS]; - -char mode[4]; -int ncID, ncSpID; -char ncFile[] = "peif000000000.nc"; -int TimeDimID, TimeLengthID, DataID, Data2ID, FluxDimID;; -int TimeDimVector[2], DataDimVector[2], Data2DimVector[2], FluxDimVector[2]; // netCDF Dim vectors -size_t Start[2] = {0L,0L}; -size_t TimeCount[2] = {1L,TIMELENGTH}; -size_t Data1Count[2] = {1L,1L}; -size_t DataCount[2] = {1L,3L}; -size_t Data2Count[2] = {1L,6L}; -size_t FluxCount[2] = {1L,32L}; - -char Version[]="v01"; -char ThemisID[]="tha\0"; -char ThemisTime[]="tha_peif_time"; -char PAR0[]="tha_peif_delta_time"; -char PAR1[]="tha_peif_mode"; -char PAR2[]="tha_peif_density"; -char PAR3[]="tha_peif_velocity_gse"; -char PAR4[]="tha_peif_t3"; // Diagonilized Temperature -char PAR5[]="tha_peif_en_eflux"; -char PAR6[]="tha_peif_en_eflux_yaxis"; -char PAR7[]="tha_peif_avgtemp"; // trace of t3 divided by 3 -char PAR8[]="tha_peif_vthermal"; -char PAR9[]="tha_peif_sc_pot"; -char PAR10[]="tha_peif_sc_current"; -char PAR11[]="tha_peif_magt3"; // Temperature in Mag Field frame -char PAR12[]="tha_peif_ptens"; // Pressure Tensor DSL -char PAR13[]="tha_peif_mftens"; // Momentum Flux Tensor DSL -char PAR14[]="tha_peif_flux"; // particle flux -char PAR15[]="tha_peif_symm"; // Direction of pressure tensor symmetry in DSL -char PAR16[]="tha_peif_symm_ang"; // Angle between Direction of pressure tensor symmetry and B - - -int StartTimeID, StopTimeID; -int DeltaTID, DensID, AvTempID, ThVelID, PotID, CurrID, SymAngID; // 1D -int MfTempID, TempID, ModeID, VelID, Flux2ID, SymmID; // 2D -> 3 -int prTenID, mfTenID; // 2D -> 6 -int EnID, FluxID; // 2D -> 32 -int TimeID; // Time netCDF variable - - -char StartT[TIMELENGTH]; // Start time from data -char StopT[TIMELENGTH]; // Stop time from data -/************************** - Function prototypes -**************************/ -void usage(); -void cdf_handle_error (CDFstatus); -void nc_handle_error (int); -void removeFilepath(); -void removeCDFext(); -void removeVers(); -void ncdefine(); -/*--------------------------------------------------------------------------*/ -void usage() -{ - printf ("\nDescription:\n"); - printf (" This program converts a themis CDF file into a netCDF file.\n"); - printf ("\n"); - printf ("Usage: esa2nc <CDF file name> <ThemisID> <mode>\n"); - printf ("\n"); - printf ("Example: esa2nc testfile tha peif\n"); - printf ("\n"); - exit(1); -} -/*-------------------------------------------------------------------------- - * Handles a CDF error. - *--------------------------------------------------------------------------*/ -void cdf_handle_error(CDFstatus status) -{ - - char message[CDF_STATUSTEXT_LEN+1]; - - CDFerror (status, message); /* Get the appropriate message */ - fprintf (stderr, "CDF: %s\n", message); -// exit(1); -} -/*-------------------------------------------------------------------------- - * Handles a netCDF error. - *--------------------------------------------------------------------------*/ -void nc_handle_error(int status) -{ - fprintf(stderr, "%s\n", nc_strerror(status)); - exit(1); -} -/*-------------------------------------------------------------------------- - * Remove the filepath from a file name. * - * Example: - * /home/data/mydata.txt => mydata.txt - *--------------------------------------------------------------------------*/ -void removeFilepath (char *fileName) -{ - char *ptr; - - ptr = strrchr(fileName, '/'); // Unix file path separator - if (ptr != NULL) - { - ptr++; - strcpy(fileName, ptr); - } -} -/*-------------------------------------------------------------------------- - * Decode CDF File Name * - *--------------------------------------------------------------------------*/ -void removeVers (char *fileName) -{ - char *ptr; - char zero = '\0'; - int i; - - for (i = 0; i < 9; i++) - { - ptr = strchr(fileName, '_'); - if (ptr != NULL) - { - ptr++; - strcpy(fileName, ptr); - } - } - ptr = strchr(fileName, '_'); // - - if (ptr != NULL) - { - ptr++; - strncpy(Version, ptr, 2); - } - } - - /*-------------------------------------------------------------------------- - * Remove the CDF extention * - *--------------------------------------------------------------------------*/ -void removeCDFext (char *fileName) -{ - char *ptr; - char zero = '\0'; - - ptr = strchr(fileName, '.'); - if (ptr != NULL) - strcpy(ptr, &zero); -} -/*-------------------------------------------------------------------------- - * NetCDF File Definition * - *--------------------------------------------------------------------------*/ - void ncdefine(double Time) - { - char *s; - time_t p; - int status; - char *STime; - -/*********************** Create netCDF file *****************************/ - memcpy(&(ncFile[0]),&(mode[0]), 4); - STime = Double2DD_Time(Time); - memcpy(&(ncFile[4]),&(STime[2]), 9); - if ((status = nc_create(ncFile, NC_CLOBBER, &ncID)) != NC_NOERR) - nc_handle_error(status); -/******************netCDF Dimensions *******************************/ - nc_def_dim (ncID, "Time", NC_UNLIMITED, &TimeDimID); - nc_def_dim (ncID, "TimeLength", TIMELENGTH, &TimeLengthID); - nc_def_dim (ncID, "Data",3L, &DataID); - nc_def_dim (ncID, "Data2",6L, &Data2ID); - - nc_def_dim (ncID, "Flux",32L, &FluxDimID); - -/********************netCDF Variables ******************/ - TimeDimVector[0] = TimeDimID; - DataDimVector[0] = TimeDimID; - Data2DimVector[0] = TimeDimID; - TimeDimVector[1] = TimeLengthID; - DataDimVector[1] = DataID; - FluxDimVector[0] = TimeDimID; - FluxDimVector[1] = FluxDimID; - Data2DimVector[1] = Data2ID; - -//ModeID, DensID, VelID, TempID; - nc_def_var (ncID, "Time", NC_CHAR, 2, TimeDimVector, &TimeID); - - nc_def_var (ncID, "DeltaT", NC_DOUBLE, 1, &TimeDimID, &DeltaTID); - nc_def_var (ncID, "Mode", NC_FLOAT, 2, DataDimVector, &ModeID); - nc_def_var (ncID, "Density", NC_DOUBLE, 1, &TimeDimID, &DensID); - nc_def_var (ncID, "AvTemp", NC_DOUBLE, 1, &TimeDimID, &AvTempID); - nc_def_var (ncID, "Potential", NC_DOUBLE, 1, &TimeDimID, &PotID); - nc_def_var (ncID, "Current", NC_DOUBLE, 1, &TimeDimID, &CurrID); - nc_def_var (ncID, "SymAngle", NC_DOUBLE, 1, &TimeDimID, &SymAngID); - nc_def_var (ncID, "V_thermal", NC_DOUBLE, 1, &TimeDimID, &ThVelID); - nc_def_var (ncID, "Velocity", NC_DOUBLE, 2, DataDimVector, &VelID); - nc_def_var (ncID, "Temperature", NC_DOUBLE, 2, DataDimVector, &TempID); - nc_def_var (ncID, "B_Temperature", NC_DOUBLE, 2, DataDimVector, &MfTempID); - nc_def_var (ncID, "Flux_tot", NC_DOUBLE, 2, DataDimVector, &Flux2ID); - nc_def_var (ncID, "Symm", NC_DOUBLE, 2, DataDimVector, &SymmID); - nc_def_var (ncID, "tensor_p", NC_DOUBLE, 2, Data2DimVector, &prTenID); - nc_def_var (ncID, "tensor_mf", NC_DOUBLE, 2, Data2DimVector, &mfTenID); - nc_def_var (ncID, "Flux", NC_DOUBLE, 2, FluxDimVector, &FluxID); - // nc_def_var (ncID, "Energy", NC_FLOAT, 2, FluxDimVector, &EnID); - nc_def_var (ncID, "StartTime",NC_CHAR, 1, &TimeLengthID, &StartTimeID); - nc_def_var (ncID, "StopTime",NC_CHAR, 1, &TimeLengthID , &StopTimeID); - - - - - nc_put_att_text(ncID, NC_GLOBAL, "Themis", 3, ThemisID); - nc_put_att_text(ncID, NC_GLOBAL, "Source", 12, Source); - nc_put_att_text(ncID, DensID, "Units", 5, "cm^-3"); - nc_put_att_text(ncID, TempID, "Units", 2, "eV"); - nc_put_att_text(ncID, TempID, "Frame", 2, "FA"); - nc_put_att_text(ncID, TempID, "Order", 16, "perp1,perp2,para"); - nc_put_att_text(ncID, MfTempID, "Units", 2, "eV"); - nc_put_att_text(ncID, MfTempID, "Frame", 2, "FA"); - nc_put_att_text(ncID, MfTempID, "Order", 16, "perp1,perp2,para"); - nc_put_att_text(ncID, AvTempID, "Units", 2, "eV"); - nc_put_att_text(ncID, prTenID, "Units", 2, "eV"); - nc_put_att_text(ncID, prTenID, "Frame", 3, "DSL"); - nc_put_att_text(ncID, prTenID, "Order", 17, "xx,xy,xz,yy,zz,yz"); - nc_put_att_text(ncID, mfTenID, "Units", 2, "eV"); - nc_put_att_text(ncID, mfTenID, "Frame", 3, "DSL"); - nc_put_att_text(ncID, mfTenID, "Order", 17, "xx,xy,xz,yy,zz,yz"); - nc_put_att_text(ncID, Flux2ID, "Units", 9, "#/sec/cm2"); - nc_put_att_text(ncID, PotID, "Units", 1, "V"); - nc_put_att_text(ncID, SymmID, "Frame", 3, "DSL"); - nc_put_att_text(ncID, CurrID, "Units", 7, "Unknown"); - nc_put_att_text(ncID, SymAngID, "Units", 7, "degrees"); - nc_put_att_text(ncID, VelID, "Units", 4, "km/s"); - nc_put_att_text(ncID, ThVelID, "Units", 4, "km/s"); - nc_put_att_text(ncID, VelID, "Frame", 3, "GSE"); - nc_put_att_text(ncID, EnID, "Units", 2, "eV"); - nc_put_att_text(ncID, FluxID, "Units", 17, "eV/(cm^2-s-sr-eV)"); - - time(&p); - s = ctime(&p); - nc_put_att_text(ncID, NC_GLOBAL, "Created", 24, s); - - nc_enddef(ncID); - - nc_put_vara_text(ncID, StartTimeID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time)); - - } -/*--------------------------------------------------------------------------*/ -int main(int argc, char *argv[]) -{ - long RecStart = 0, RecCount, RecCountF = 1, RecInt = 1, MaxRec; - long indices[1] = {0}, counts[1] = {3}, counts2[1] = {6}, countsFlux[1] = {32}, intervals[1] = {1}; - long countsE[1] = {1}, indicesF[2]={0,3}, indicesF2[2]={0,6}, indicesFlux[2] = {0, 32}; - double *value; - float *value_f; - size_t numElem; - long dimN, varN, par0, par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15, par16; - CDFstatus cstatus; // CDF status code - CDFid id; - int i, j, status; - char fileName[MAX_FILE_NAME_LEN]; - dd_tmstr_t *dtm; - int First = 1; - double par[3], parr[6], doubleVal, parD[32]; - float parF[32], par_f[3], parr_f[6], floatVal; - long DayOld; - - - char *UT; - char data_set[8]="thx_pexx"; -/*-------------------------------- Arguments Decoding ----------------------------------------*/ - if (argc <= 3) usage(); // CDF input file name and THEMIS Number not specified - else - { - strcpy(fileName, argv[1]); - strncpy(ThemisID,argv[2],3); - strncpy(mode,argv[3],4); - } - -/*------------------------------------------ CDF Variables Names Updated according to THEMIS Number -------------*/ - - memcpy(&(data_set[2]),&(ThemisID[2]),1); - memcpy(&(data_set[6]),&(mode[2]),2); - - memcpy(&(ThemisTime[0]),&(data_set[0]),8); - memcpy(&(PAR0[0]),&(data_set[0]),8); - memcpy(&(PAR1[0]),&(data_set[0]),8); - memcpy(&(PAR2[0]),&(data_set[0]),8); - memcpy(&(PAR3[0]),&(data_set[0]),8); - memcpy(&(PAR4[0]),&(data_set[0]),8); - memcpy(&(PAR5[0]),&(data_set[0]),8); - memcpy(&(PAR6[0]),&(data_set[0]),8); - memcpy(&(PAR7[0]),&(data_set[0]),8); - memcpy(&(PAR8[0]),&(data_set[0]),8); - memcpy(&(PAR9[0]),&(data_set[0]),8); - memcpy(&(PAR10[0]),&(data_set[0]),8); - memcpy(&(PAR11[0]),&(data_set[0]),8); - memcpy(&(PAR12[0]),&(data_set[0]),8); - memcpy(&(PAR13[0]),&(data_set[0]),8); - memcpy(&(PAR14[0]),&(data_set[0]),8); - memcpy(&(PAR15[0]),&(data_set[0]),8); - memcpy(&(PAR16[0]),&(data_set[0]),8); - -/*********************** Open CDF file *****************************/ - if ((cstatus = CDFopen(fileName, &id)) != CDF_OK) - cdf_handle_error(cstatus); - printf(" THEMIS %s %s\n", ThemisID, mode); - -/*********** treat all vars as zVars with eliminated false dimensionality **********/ - - if ((cstatus = CDFlib(SELECT_, CDF_zMODE_, zMODEon2, NULL_)) != CDF_OK) - cdf_handle_error (cstatus); - - // Remove the file path (/home/data/mydata => mydata) - removeFilepath(fileName); - // Remove Version Number - removeVers(fileName); - - // Remove .cdf extension - removeCDFext(fileName); - -/************************ Get CDF Data ************************************/ - - cstatus = CDFlib(GET_, zVAR_NUMBER_, ThemisTime, &varN, NULL_); - cstatus = CDFlib( SELECT_, zVAR_, varN, GET_, zVAR_MAXREC_, &MaxRec, NULL_); - - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR0, &par0, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR1, &par1, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR2, &par2, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR3, &par3, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR4, &par4, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR5, &par5, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR6, &par6, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR7, &par7, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR8, &par8, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR9, &par9, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR10, &par10, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR11, &par11, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR12, &par12, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR13, &par13, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR14, &par14, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR15, &par15, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR16, &par16, NULL_); - - RecCount = (long)(MaxRec+1); - printf(" Max Rec %d\n", MaxRec); - - value = (double *)malloc(sizeof(double)* RecCount); - if ((cstatus = CDFlib (SELECT_, - zVAR_, varN, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_) ) - != CDF_OK) cdf_handle_error(cstatus); - - for (i = 0; i < RecCount; i++) { - UT = Double2DD_Time(value[i]); - dtm = ReadTime(UT); - if (First == 1) { - ncdefine(dtm->times); - First = 0; - } - nc_put_vara_text(ncID, TimeID, Start, TimeCount, UT); - - Start[0]++; - - } - nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], UT); - - Start[0] = 0L; -// deltaT - if ((cstatus = CDFlib (SELECT_, zVAR_, par0, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_double(ncID, DeltaTID, value); - - - free(value); - value_f = (float *)malloc(sizeof(float)* RecCount * 3); - - -// Mode - if ((cstatus = CDFlib (SELECT_, zVAR_, par1, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value_f, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_float(ncID, ModeID, value_f); - free(value_f); - - value = (double *)malloc(sizeof(double)* RecCount * 3); - // peif_velocity_gse - if ((cstatus = CDFlib (SELECT_, zVAR_, par3, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - nc_put_var_double(ncID, VelID, value); - -// temperature - if ((cstatus = CDFlib (SELECT_, zVAR_, par4, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_double(ncID, TempID,value); - -// temperature regard to B-field - if ((cstatus = CDFlib (SELECT_, zVAR_, par11, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - nc_put_var_double(ncID, MfTempID, value); - -// Flux total - if ((cstatus = CDFlib (SELECT_, zVAR_, par14, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - nc_put_var_double(ncID, Flux2ID, value); - - -// symmetry - if ((cstatus = CDFlib (SELECT_, zVAR_, par15, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, SymmID, value); - - free(value); - value = (double *)malloc(sizeof(double)* RecCount * 6); - -// - if ((cstatus = CDFlib (SELECT_, zVAR_, par12, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF2, - zVAR_DIMCOUNTS_, counts2, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, prTenID, value); - -// Pressure Tensor with regard to B-field - if ((cstatus = CDFlib (SELECT_, zVAR_, par13, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF2, - zVAR_DIMCOUNTS_, counts2, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - nc_put_var_double(ncID, mfTenID, value); - free(value); - value = (double *)malloc(sizeof(double)* RecCount); - -// Density - if ((cstatus = CDFlib (SELECT_, zVAR_, par2, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - nc_put_var_double(ncID, DensID, value); -// Average Temperature - if ((cstatus = CDFlib (SELECT_, zVAR_, par7, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, AvTempID, value); -// Thermal Velocity - if ((cstatus = CDFlib (SELECT_, zVAR_, par8, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, ThVelID, value); -// Potential - if ((cstatus = CDFlib (SELECT_, zVAR_, par9, - zVAR_RECNUMBER_, RecStart, - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - nc_put_var_double(ncID, PotID, value); -// Current - /* if ((cstatus = CDFlib (SELECT_, zVAR_, par10, - zVAR_RECNUMBER_, RecStart, - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, CurrID, value); - */ -// Symmery Angle with B - if ((cstatus = CDFlib (SELECT_, zVAR_, par16, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, SymAngID, value); - - free(value); - value = (double *)malloc(sizeof(double)* RecCount *32); - - if ((cstatus = CDFlib (SELECT_, zVAR_, par5, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesFlux, - zVAR_DIMCOUNTS_, countsFlux, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, FluxID, value); - - /* - if ((cstatus = CDFlib (SELECT_, zVAR_, par6, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCountF, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesFlux, - zVAR_DIMCOUNTS_, countsFlux, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, parF, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - */ - /* if (!isnan(parF[0])) - nc_put_vara_float(ncID, EnID, Start, FluxCount, parF); - else nc_put_vara_float(ncID, EnID, Start, FluxCount, FillValueF); - */ // for (j = 0; j < 32; i++) printf(" %f ", parF[j]); - - - // } - - - free(value); -/********************Close Files******************/ - if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK) - cdf_handle_error (cstatus); - if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); - -} diff --git a/src/DECODERS/themis/esamom2nc/CMakeLists.txt b/src/DECODERS/themis/esamom2nc/CMakeLists.txt deleted file mode 100644 index 8a96509..0000000 --- a/src/DECODERS/themis/esamom2nc/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ - -PROJECT(themis_esamom2nc) - -include_directories( - ${DDCLIENTINCLUDE_DIR} - ${NETCDFINCLUDE_DIR} - ${libcdf_INCLUDE_DIR} -) - -#Configuration de l'exécutable -file( - GLOB_RECURSE - source_files - ./* -) - -ADD_EXECUTABLE (themis_esamom2nc ${source_files} ) - -target_link_libraries( - themis_esamom2nc - ${DDCLIENTLIBRARY} - ${NETCDFLIBRARY} - ${libcdf_LIBRARIES} -) - -install (TARGETS themis_esamom2nc DESTINATION bin) diff --git a/src/DECODERS/themis/esamom2nc/themis_esamom2nc.c b/src/DECODERS/themis/esamom2nc/themis_esamom2nc.c deleted file mode 100644 index 4c7b6bc..0000000 --- a/src/DECODERS/themis/esamom2nc/themis_esamom2nc.c +++ /dev/null @@ -1,456 +0,0 @@ - /**************************************************************/ - /* THEMIS ESA ION AND ELECTRON MOMENTS CDF -> DD netCDF */ - /* 04.01.2008 */ - /* V 1.1 */ - /* */ - /* New CDF with ALL modes and new params */ - /* */ - /**************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <netcdf.h> -#include <cdf.h> -#include <DD.h> -#include <string.h> -#include <time.h> -#include <math.h> - -#define TimeGap 1800000.0 -#define Source "themis@cdpp2" -#define MAX_FILE_NAME_LEN 250 // Max. file name length -#define MAX_VARS 250 // Max # of VARS in CDF - - -/************************************* - Global variables and structures -**************************************/ -long CDFDims, // Number of dimensions in a CDF file - CDFVars, // Number of variables in a CDF file - CDFDimSizes[CDF_MAX_DIMS], // Dimension Sizes in a CDF file - CDFencoding, // Data encoding - CDFmajority, // Variable majority - CDFmaxRec, // max Record number - CDFAttrs; // number of CDF Attributes - - -struct cdfvar { // CDF variable structure - char name[CDF_VAR_NAME_LEN+1]; - long num; //variable number - long datatype; - long numElem; // variable dimensionality - long recVariance; // variable rec Variance - long dimVariances[CDF_MAX_DIMS]; // # of data values in dimSizes -} cdfVar[MAX_VARS]; - -char mode[4]; -int ncID; -char ncFile[] = "peim000000000.nc"; -int TimeDimID, TimeLengthID, DataID, Data2ID; -int TimeDimVector[2], DataDimVector[2], Data2DimVector[2]; // netCDF Dim vectors -size_t Start[2] = {0L,0L}; -size_t TimeCount[2] = {1L,TIMELENGTH}; -size_t Data1Count[2] = {1L,1L}; -size_t DataCount[2] = {1L,3L}; -size_t Data2Count[2] = {1L,6L}; - -char Version[]="v01"; -char ThemisID[]="tha\0"; -char ThemisTime[]="tha_peim_time"; -char PAR0[]="tha_peim_density"; -char PAR1[]="tha_peim_ptot"; -char PAR2[]="tha_peim_flux"; -char PAR3[]="tha_peim_mftens"; // Momentum Flux Tensor DSL -char PAR4[]="tha_peim_eflux"; -char PAR5[]="tha_peim_velocity_gse"; -char PAR6[]="tha_peim_ptens"; // Pressure Tensor DSL -char PAR7[]="tha_peim_mag"; -char PAR8[]="tha_peim_velocity_mag"; -char PAR9[]="tha_peim_t3_mag"; // Diagonilized Temperature -char PAR10[]="tha_peim_ptens_mag"; // - - -int StartTimeID, StopTimeID; -int DeltaTID, DensID, PtotID; // 1D -int FluxID, EfluxID, VelID, MagID, VelMagID, TempMagID; // 2D -> 3 -int MfTensID, PtensID, PtensMagID ; // 2D -> 6 - -int TimeID; // Time netCDF variable - - -char StartT[TIMELENGTH]; // Start time from data -char StopT[TIMELENGTH]; // Stop time from data -/************************** - Function prototypes -**************************/ -void usage(); -void cdf_handle_error (CDFstatus); -void nc_handle_error (int); -void ncdefine(); -/*--------------------------------------------------------------------------*/ -void usage() -{ - printf ("\nDescription:\n"); - printf (" This program converts a themis CDF file into a netCDF file.\n"); - printf ("\n"); - printf ("Usage: esa2nc <CDF file name> <ThemisID>\n"); - printf ("\n"); - printf ("Example: esa2nc testfile tha\n"); - printf ("\n"); - exit(1); -} -/*-------------------------------------------------------------------------- - * Handles a CDF error. - *--------------------------------------------------------------------------*/ -void cdf_handle_error(CDFstatus status) -{ - - char message[CDF_STATUSTEXT_LEN+1]; - - CDFerror (status, message); /* Get the appropriate message */ - fprintf (stderr, "CDF: %s\n", message); -// exit(1); -} -/*-------------------------------------------------------------------------- - * Handles a netCDF error. - *--------------------------------------------------------------------------*/ -void nc_handle_error(int status) -{ - fprintf(stderr, "%s\n", nc_strerror(status)); - exit(1); -} - - -/*-------------------------------------------------------------------------- - * NetCDF File Definition * - *--------------------------------------------------------------------------*/ - void ncdefine(double Time) - { - char *s; - time_t p; - int status; - char *STime; - -/*********************** Create netCDF file *****************************/ - memcpy(&(ncFile[0]),&(mode[0]),4); - STime = Double2DD_Time(Time); - memcpy(&(ncFile[4]),&(STime[2]), 9); - if ((status = nc_create(ncFile, NC_CLOBBER, &ncID)) != NC_NOERR) - nc_handle_error(status); -/******************netCDF Dimensions *******************************/ - nc_def_dim (ncID, "Time", NC_UNLIMITED, &TimeDimID); - nc_def_dim (ncID, "TimeLength", TIMELENGTH, &TimeLengthID); - nc_def_dim (ncID, "Data",3L, &DataID); - nc_def_dim (ncID, "Data2",6L, &Data2ID); - -/********************netCDF Variables ******************/ - TimeDimVector[0] = TimeDimID; - DataDimVector[0] = TimeDimID; - Data2DimVector[0] = TimeDimID; - TimeDimVector[1] = TimeLengthID; - DataDimVector[1] = DataID; - - Data2DimVector[1] = Data2ID; - -//ModeID, DensID, VelID, TempID; - nc_def_var (ncID, "Time", NC_CHAR, 2, TimeDimVector, &TimeID); - nc_def_var (ncID, "Density", NC_DOUBLE, 1, &TimeDimID, &DensID); - nc_def_var (ncID, "Ptot", NC_DOUBLE, 1, &TimeDimID, &PtotID); - nc_def_var (ncID, "Flux", NC_DOUBLE, 2, DataDimVector, &FluxID); - nc_def_var (ncID, "MfTens", NC_DOUBLE, 2, Data2DimVector, &MfTensID); - nc_def_var (ncID, "Eflux", NC_DOUBLE, 2, DataDimVector, &EfluxID); - nc_def_var (ncID, "Velocity", NC_DOUBLE, 2, DataDimVector, &VelID); - nc_def_var (ncID, "Ptens", NC_DOUBLE, 2, Data2DimVector, &PtensID); - nc_def_var (ncID, "Mag", NC_DOUBLE, 2, DataDimVector, &MagID); - nc_def_var (ncID, "VelocityMag", NC_DOUBLE, 2, DataDimVector, &VelMagID); - nc_def_var (ncID, "TempMag", NC_DOUBLE, 2, DataDimVector, &TempMagID); - nc_def_var (ncID, "PtensMag", NC_DOUBLE, 2, Data2DimVector, &PtensMagID); - - nc_def_var (ncID, "StartTime",NC_CHAR, 1, &TimeLengthID, &StartTimeID); - nc_def_var (ncID, "StopTime",NC_CHAR, 1, &TimeLengthID , &StopTimeID); - - - - - nc_put_att_text(ncID, NC_GLOBAL, "Themis", 3, ThemisID); - nc_put_att_text(ncID, NC_GLOBAL, "Source", 12, Source); - nc_put_att_text(ncID, DensID, "Units", 5, "cm^-3"); - - - time(&p); - s = ctime(&p); - nc_put_att_text(ncID, NC_GLOBAL, "Created", 24, s); - - nc_enddef(ncID); - - nc_put_vara_text(ncID, StartTimeID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time)); - ; - } -/*--------------------------------------------------------------------------*/ -int main(int argc, char *argv[]) -{ - long RecStart = 0, RecCount, RecCountF = 1, RecInt = 1, MaxRec; - long indices[1] = {0}, counts[1] = {3}, counts2[1] = {6}, intervals[1] = {1}; - long countsE[1] = {1}, indicesF[2]={0,3}, indicesF2[2]={0,6}; - double *value; - float *value_f; - size_t numElem; - long dimN, varN, par0, par1, par2, par3, par4, par5, par6, par7, par8, par9, par10; - CDFstatus cstatus; // CDF status code - CDFid id; - int i, j, status; - char fileName[MAX_FILE_NAME_LEN]; - dd_tmstr_t *dtm; - int First = 1; - - char *UT; - char data_set[8]="thx_peim"; -/*-------------------------------- Arguments Decoding ----------------------------------------*/ - if (argc <= 2) usage(); // CDF input file name and THEMIS Number not specified - else - { - strcpy(fileName, argv[1]); - strncpy(ThemisID,argv[2],3); - strncpy(mode,argv[3],4); - } - -/*------------------------------------------ CDF Variables Names Updated according to THEMIS Number -------------*/ - memcpy(&(data_set[2]),&(ThemisID[2]),1); - memcpy(&(data_set[6]),&(mode[2]),2); - - memcpy(&(ThemisTime[0]),&(data_set[0]),8); - memcpy(&(PAR0[0]),&(data_set[0]),8); - memcpy(&(PAR1[0]),&(data_set[0]),8); - memcpy(&(PAR2[0]),&(data_set[0]),8); - memcpy(&(PAR3[0]),&(data_set[0]),8); - memcpy(&(PAR4[0]),&(data_set[0]),8); - memcpy(&(PAR5[0]),&(data_set[0]),8); - memcpy(&(PAR6[0]),&(data_set[0]),8); - memcpy(&(PAR7[0]),&(data_set[0]),8); - memcpy(&(PAR8[0]),&(data_set[0]),8); - memcpy(&(PAR9[0]),&(data_set[0]),8); - memcpy(&(PAR10[0]),&(data_set[0]),8); - -/*********************** Open CDF file *****************************/ - if ((cstatus = CDFopen(fileName, &id)) != CDF_OK) - cdf_handle_error(cstatus); - printf(" THEMIS %s \n", ThemisID); - -/*********** treat all vars as zVars with eliminated false dimensionality **********/ - - if ((cstatus = CDFlib(SELECT_, CDF_zMODE_, zMODEon2, NULL_)) != CDF_OK) - cdf_handle_error (cstatus); - - -/************************ Get CDF Data ************************************/ - - cstatus = CDFlib(GET_, zVAR_NUMBER_, ThemisTime, &varN, NULL_); - cstatus = CDFlib( SELECT_, zVAR_, varN, GET_, zVAR_MAXREC_, &MaxRec, NULL_); - - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR0, &par0, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR1, &par1, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR2, &par2, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR3, &par3, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR4, &par4, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR5, &par5, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR6, &par6, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR7, &par7, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR8, &par8, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR9, &par9, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR10, &par10, NULL_); - - - RecCount = (long)(MaxRec+1); - printf(" Max Rec %d\n", MaxRec); - if ( RecCount > 0) { - value = (double *)malloc(sizeof(double)* RecCount); - if ((cstatus = CDFlib (SELECT_, - zVAR_, varN, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_) ) - != CDF_OK) cdf_handle_error(cstatus); - - for (i = 0; i < RecCount; i++) { - UT = Double2DD_Time(value[i]); - dtm = ReadTime(UT); - if (First == 1) { - ncdefine(dtm->times); - First = 0; - } - nc_put_vara_text(ncID, TimeID, Start, TimeCount, UT); - - Start[0]++; - - } - nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], UT); - - -// Density - if ((cstatus = CDFlib (SELECT_, zVAR_, par0, - zVAR_RECNUMBER_, RecStart, - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - nc_put_var_double(ncID, DensID, value); -// Ion Total Pressure - if ((cstatus = CDFlib (SELECT_, zVAR_, par1, - zVAR_RECNUMBER_, RecStart, - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - nc_put_var_double(ncID, PtotID, value); - - free(value); - value = (double *)malloc(sizeof(double)* RecCount * 3); - // flux - if ((cstatus = CDFlib (SELECT_, zVAR_, par2, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - nc_put_var_double(ncID, FluxID, value); - -// Energy Flux - if ((cstatus = CDFlib (SELECT_, zVAR_, par4, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_double(ncID, EfluxID,value); - -// Velocity GSE - if ((cstatus = CDFlib (SELECT_, zVAR_, par5, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - nc_put_var_double(ncID, VelID, value); - -// Magnetic Field Vector DSL - if ((cstatus = CDFlib (SELECT_, zVAR_, par7, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, MagID, value); - -// Velocity Mag - if ((cstatus = CDFlib (SELECT_, zVAR_, par8, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, VelMagID, value); - - // Temperature Mag - if ((cstatus = CDFlib (SELECT_, zVAR_, par9, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, TempMagID, value); - - free(value); - value = (double *)malloc(sizeof(double)* RecCount * 6); - -// Momentum Flux Tensor - if ((cstatus = CDFlib (SELECT_, zVAR_, par3, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF2, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, MfTensID, value); - -// Pressure Tensor - if ((cstatus = CDFlib (SELECT_, zVAR_, par6, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF2, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, PtensID, value); - -// Pressure Tensor Mag - if ((cstatus = CDFlib (SELECT_, zVAR_, par10, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF2, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - - - nc_put_var_double(ncID, PtensMagID, value); - - - - free(value); -/********************Close Files******************/ - if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); - } - if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK) - cdf_handle_error (cstatus); - - - -} diff --git a/src/DECODERS/themis/fgm2nc/CMakeLists.txt b/src/DECODERS/themis/fgm2nc/CMakeLists.txt deleted file mode 100644 index 3acec22..0000000 --- a/src/DECODERS/themis/fgm2nc/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ - -PROJECT(themis_fgm2nc) - -include_directories( - ${DDCLIENTINCLUDE_DIR} - ${NETCDFINCLUDE_DIR} - ${libcdf_INCLUDE_DIR} -) - -#Configuration de l'exécutable -file( - GLOB_RECURSE - source_files - ./* -) - -ADD_EXECUTABLE (themis_fgm2nc ${source_files} ) - -target_link_libraries( - themis_fgm2nc - ${DDCLIENTLIBRARY} - ${NETCDFLIBRARY} - ${libcdf_LIBRARIES} -) - -install (TARGETS themis_fgm2nc DESTINATION bin) diff --git a/src/DECODERS/themis/fgm2nc/themis_fgm2nc.c b/src/DECODERS/themis/fgm2nc/themis_fgm2nc.c deleted file mode 100644 index ef853fb..0000000 --- a/src/DECODERS/themis/fgm2nc/themis_fgm2nc.c +++ /dev/null @@ -1,351 +0,0 @@ - /************************************************************/ - /* THEMIS FGM CDF -> DD netCDF */ -/* NaN -> -1.e31 */ - /* 12.10.2007 */ - /* V 1.0 */ - /***********************************************************/ -#include <stdio.h> -#include <stdlib.h> -#include <netcdf.h> -#include <cdf.h> -#include <DD.h> -#include <string.h> -#include <time.h> -#include <math.h> - -#define TimeGap 1800000.0 -#define Source "themis@cdpp2" -#define MAX_FILE_NAME_LEN 250 // Max. file name length -#define MAX_VARS 250 // Max # of VARS in CDF - - -/************************************* - Global variables and structures -**************************************/ -long CDFDims, // Number of dimensions in a CDF file - CDFVars, // Number of variables in a CDF file - CDFDimSizes[CDF_MAX_DIMS], // Dimension Sizes in a CDF file - CDFencoding, // Data encoding - CDFmajority, // Variable majority - CDFmaxRec, // max Record number - CDFAttrs; // number of CDF Attributes - - -struct cdfvar { // CDF variable structure - char name[CDF_VAR_NAME_LEN+1]; - long num; //variable number - long datatype; - long numElem; // variable dimensionality - long recVariance; // variable rec Variance - long dimVariances[CDF_MAX_DIMS]; // # of data values in dimSizes -} cdfVar[MAX_VARS]; - - -int ncID; -char ncFile[] = "fgmh000000000.nc"; -int TimeDimID, TimeLengthID, DataID; // ID of netCDF dimensions -int TimeDimVector[2], DataDimVector[2]; // netCDF Dim vectors -size_t Start[2] = {0L,0L}; -size_t TimeCount[2] = {1L,TIMELENGTH}; -size_t DataCount[2] = {1L,3L}; - -char Version[]="v01"; -char ThemisID[]="tha\0"; -char ThemisTime[]="tha_fgh_time"; -char PAR0[]="tha_fgh_gse"; -float FillValue[3] = {-1.e31,-1.e31,-1.e31}; - -int StartTimeID, StopTimeID; -int FGMID; // Data netCDF Variables -int TimeID; // Time netCDF variable - -char StartT[TIMELENGTH]; // Start time from data -char StopT[TIMELENGTH]; // Stop time from data -/************************** - Function prototypes -**************************/ -void usage(); -void cdf_handle_error (CDFstatus); -void nc_handle_error (int); -void removeFilepath(); -void removeCDFext(); -void removeVers(); - -/*--------------------------------------------------------------------------*/ -void usage() -{ - printf ("\nDescription:\n"); - printf (" This program converts a themis CDF file into a netCDF file.\n"); - printf ("\n"); - printf ("Usage: fgm2nc <CDF file name> <ThemisID> <Resolution>\n"); - printf ("\n"); - printf ("Example: fgm2nc testfile tha h\n"); - printf ("\n"); - exit(1); -} -/*-------------------------------------------------------------------------- - * Handles a CDF error. - *--------------------------------------------------------------------------*/ -void cdf_handle_error(CDFstatus status) -{ - - char message[CDF_STATUSTEXT_LEN+1]; - - CDFerror (status, message); /* Get the appropriate message */ - fprintf (stderr, "%s\n", message); - exit(1); -} -/*-------------------------------------------------------------------------- - * Handles a netCDF error. - *--------------------------------------------------------------------------*/ -void nc_handle_error(int status) -{ - fprintf(stderr, "%s\n", nc_strerror(status)); - exit(1); -} -/*-------------------------------------------------------------------------- - * Remove the filepath from a file name. * - * Example: - * /home/data/mydata.txt => mydata.txt - *--------------------------------------------------------------------------*/ -void removeFilepath (char *fileName) -{ - char *ptr; - - ptr = strrchr(fileName, '/'); // Unix file path separator - if (ptr != NULL) - { - ptr++; - strcpy(fileName, ptr); - } -} -/*-------------------------------------------------------------------------- - * Decode CDF File Name * - *--------------------------------------------------------------------------*/ -void removeVers (char *fileName) -{ - char *ptr; - char zero = '\0'; - int i; - - for (i = 0; i < 9; i++) - { - ptr = strchr(fileName, '_'); - if (ptr != NULL) - { - ptr++; - strcpy(fileName, ptr); - } - } - ptr = strchr(fileName, '_'); // - - if (ptr != NULL) - { - ptr++; - strncpy(Version, ptr, 2); - } - } - - /*-------------------------------------------------------------------------- - * Remove the CDF extention * - *--------------------------------------------------------------------------*/ -void removeCDFext (char *fileName) -{ - char *ptr; - char zero = '\0'; - - ptr = strchr(fileName, '.'); - if (ptr != NULL) - strcpy(ptr, &zero); -} -/*-------------------------------------------------------------------------- - * NetCDF File Definition * - *--------------------------------------------------------------------------*/ - void ncdefine(double Time, char *Sampling) - { - char *s; - time_t p; - int status; - char *STime; - -/*********************** Create netCDF file *****************************/ - STime = Double2DD_Time(Time); - - memcpy(&(ncFile[3]),&(Sampling[0]), 1); - memcpy(&(ncFile[4]),&(STime[2]), 9); - if ((status = nc_create(ncFile, NC_CLOBBER, &ncID)) != NC_NOERR) - nc_handle_error(status); -/******************netCDF Dimensions *******************************/ - nc_def_dim (ncID, "Time", NC_UNLIMITED, &TimeDimID); - nc_def_dim (ncID, "TimeLength", TIMELENGTH, &TimeLengthID); - nc_def_dim (ncID, "Data",3L, &DataID); - -/********************netCDF Variables ******************/ - TimeDimVector[0] = TimeDimID; - DataDimVector[0] = TimeDimID; - TimeDimVector[1] = TimeLengthID; - DataDimVector[1] = DataID; - -//ModeID, DensID, VelID, TempID; - nc_def_var (ncID, "Time", NC_CHAR, 2, TimeDimVector, &TimeID); - nc_def_var (ncID, "B", NC_FLOAT, 2, DataDimVector, &FGMID); - nc_def_var (ncID, "StartTime",NC_CHAR, 1, &TimeLengthID, &StartTimeID); - nc_def_var (ncID, "StopTime",NC_CHAR, 1, &TimeLengthID , &StopTimeID); - - nc_put_att_text(ncID, NC_GLOBAL, "Themis", 3, ThemisID); - nc_put_att_text(ncID, NC_GLOBAL, "Source", 12, Source); - nc_put_att_text(ncID, NC_GLOBAL, "Resolution", 1, Sampling); - // nc_put_att_text(ncID, NC_GLOBAL, "Version", 2, Version); - nc_put_att_text(ncID, FGMID, "Units", 2, "nT"); - nc_put_att_text(ncID, FGMID, "Frame", 3, "GSE"); - - time(&p); - s = ctime(&p); - nc_put_att_text(ncID, NC_GLOBAL, "Created", 24, s); - nc_enddef(ncID); - nc_put_vara_text(ncID, StartTimeID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time)); - - } -/*--------------------------------------------------------------------------*/ -int main(int argc, char *argv[]) -{ - long RecStart = 0, RecCount, RecCountF = 1, RecInt = 1, MaxRec; - long indices[1] = {0}, counts[1] = {3}, intervals[1] = {1}; - long countsE[1] = {1}, indicesF[2]={0,3}; - double *value; - size_t numElem; - long dimN, varN, par0, par1; - CDFstatus cstatus; // CDF status code - CDFid id; - int i, j, status; - char fileName[MAX_FILE_NAME_LEN]; - char Sampling[1]; - dd_tmstr_t *dtm; - int First = 1; - float par[3]; - long DayOld; - - char *UT; -/*-------------------------------- Arguments Decoding ----------------------------------------*/ - if (argc <= 3) usage(); // CDF input file name and HEMIS Number not specified - else - { - strcpy(fileName, argv[1]); - strncpy(ThemisID, argv[2], 3); - strncpy(Sampling, argv[3], 1); - } - - -/*------------------------------------------ CDF Variables Names Updated according to THEMIS Number -------------*/ - - memcpy(&(ThemisTime[2]),&(ThemisID[2]),1); - memcpy(&(PAR0[2]),&(ThemisID[2]),1); - memcpy(&(ThemisTime[6]),&(Sampling[0]),1); - memcpy(&(PAR0[6]),&(Sampling[0]),1); - -/*********************** Open CDF file *****************************/ - if ((cstatus = CDFopen(fileName, &id)) != CDF_OK) - cdf_handle_error(cstatus); - printf(" %s %s\n", argv[2],argv[3]); - -/*********** treat all vars as zVars with eliminated false dimensionality **********/ - - if ((cstatus = CDFlib(SELECT_, CDF_zMODE_, zMODEon2, NULL_)) != CDF_OK) - cdf_handle_error (cstatus); - - // Remove the file path (/home/data/mydata => mydata) - removeFilepath(fileName); - // Remove Version Number - removeVers(fileName); - - // Remove .cdf extension - removeCDFext(fileName); - -/************************ Get CDF Data ************************************/ - - if ((cstatus = CDFlib(GET_, zVAR_NUMBER_, ThemisTime, &varN, NULL_)) != CDF_OK) - cdf_handle_error(cstatus) ; - if ((cstatus = CDFlib( SELECT_, zVAR_, varN, - GET_, zVAR_MAXREC_, &MaxRec, NULL_)) != CDF_OK) - cdf_handle_error(cstatus) ; - - - if ((cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR0, &par0, NULL_)) != CDF_OK) - cdf_handle_error(cstatus) ; - - if ((cstatus = CDFlib( SELECT_, zVAR_, par0, - GET_, zVAR_DIMSIZES_, CDFDimSizes, NULL_)) != CDF_OK) - cdf_handle_error (cstatus) ; - - - RecCount = (long)(MaxRec+1); - printf(" Max Rec %d\n", MaxRec); - if (MaxRec > 1) { - value = (double *)malloc(sizeof(double)* RecCount); - if ((cstatus = CDFlib (SELECT_, - zVAR_, varN, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_) ) - != CDF_OK) cdf_handle_error (cstatus); - - for (i = 0; i < RecCount; i++) - { - - UT = Double2DD_Time(value[i]); - dtm = ReadTime(UT); - - if (i > 0 && (value[i]-value[i-1]) > TimeGap) - { - printf(" !!! Time GAP -> %f min\n", (value[i]-value[i-1])/60.0); - nc_put_vara_text(ncID,StopTimeID,&Start[1],&TimeCount[1], Double2DD_Time(dtm->times)); - if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); - } - - if (First == 1) - { - ncdefine(dtm->times, Sampling); - First = 0; - DayOld = dtm->day; - } - if (i > 0 && (value[i]-value[i-1]) > TimeGap) - { - ncdefine(dtm->times, Sampling); - Start[0] = 0L; - } - nc_put_vara_text(ncID, TimeID, Start, TimeCount, Double2DD_Time(dtm->times)); - - - RecStart = (long)i; - - if ((cstatus = CDFlib (SELECT_, zVAR_, par0, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCountF, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indicesF, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, par, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - if (!isnan(par[0])) - nc_put_vara_float(ncID, FGMID, Start, DataCount, par); - else nc_put_vara_float(ncID, FGMID, Start, DataCount, FillValue); - - - Start[0]++; - DayOld = dtm->day; - } - nc_put_vara_text(ncID,StopTimeID,&Start[1],&TimeCount[1], Double2DD_Time(dtm->times)); - free(value); - - if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); - } -/********************Close Files******************/ - if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK) - cdf_handle_error (cstatus); - -} diff --git a/src/DECODERS/themis/sst2nc/CMakeLists.txt b/src/DECODERS/themis/sst2nc/CMakeLists.txt deleted file mode 100644 index 6ff47d1..0000000 --- a/src/DECODERS/themis/sst2nc/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ - -PROJECT(themis_sst2nc) - -include_directories( - ${DDCLIENTINCLUDE_DIR} - ${NETCDFINCLUDE_DIR} - ${libcdf_INCLUDE_DIR} -) - -#Configuration de l'exécutable -file( - GLOB_RECURSE - source_files - ./* -) - -ADD_EXECUTABLE (themis_sst2nc ${source_files} ) - -target_link_libraries( - themis_sst2nc - ${DDCLIENTLIBRARY} - ${NETCDFLIBRARY} - ${libcdf_LIBRARIES} -) - -install (TARGETS themis_sst2nc DESTINATION bin) diff --git a/src/DECODERS/themis/sst2nc/themis_sst2nc.c b/src/DECODERS/themis/sst2nc/themis_sst2nc.c deleted file mode 100644 index 8555b3b..0000000 --- a/src/DECODERS/themis/sst2nc/themis_sst2nc.c +++ /dev/null @@ -1,363 +0,0 @@ - /**************************************************************/ - /* THEMIS ESA ION AND ELECTRON MOMENTS CDF -> DD netCDF */ - /* 04.01.2008 */ - /* V 1.1 */ - /* Energy in info file */ - /* New CDF with ALL modes and new params */ - /* 04.01.2008 - 2 files for peir & peer modes */ - /**************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <netcdf.h> -#include <cdf.h> -#include <DD.h> -#include <string.h> -#include <time.h> -#include <math.h> - -#define TimeGap 3600.0 -#define Source "themis@cdpp2" -#define MAX_FILE_NAME_LEN 250 // Max. file name length -#define MAX_VARS 250 // Max # of VARS in CDF - - -/************************************* - Global variables and structures -**************************************/ -long CDFDims, // Number of dimensions in a CDF file - CDFVars, // Number of variables in a CDF file - CDFDimSizes[CDF_MAX_DIMS], // Dimension Sizes in a CDF file - CDFencoding, // Data encoding - CDFmajority, // Variable majority - CDFmaxRec, // max Record number - CDFAttrs; // number of CDF Attributes - - -struct cdfvar { // CDF variable structure - char name[CDF_VAR_NAME_LEN+1]; - long num; //variable number - long datatype; - long numElem; // variable dimensionality - long recVariance; // variable rec Variance - long dimVariances[CDF_MAX_DIMS]; // # of data values in dimSizes -} cdfVar[MAX_VARS]; - -char mode[4]; -int ncID; -char ncFile[] = "psif000000000.nc"; -int TimeDimID, TimeLengthID, FluxDimID; -int TimeDimVector[2], FluxDimVector[2]; // netCDF Dim vectors - -size_t Start[2] = {0L,0L}; -size_t TimeCount[2] = {1L,TIMELENGTH}; -size_t FluxCount[2] = {1L,16L}; - -CDFstatus cstatus; // CDF status code - -char Version[]="v01"; -char ThemisID[]="tha\0"; -char ThemisTime[]="tha_psif_en_eflux_time"; -char PAR0[]="tha_psif_en_eflux_delta_time"; -char PAR1[]="tha_psif_en_eflux_mode"; -char PAR2[]="tha_psif_en_eflux"; - -int StartTimeID, StopTimeID; -int StartTimeSpID, StopTimeSpID; -int DeltaTID, DensID, AvTempID, ThVelID, PotID, CurrID, SymAngID; // 1D -int MfTempID, TempID, ModeID, ModeSpID, VelID, Flux2ID, SymmID; // 2D -> 3 -int prTenID, mfTenID; // 2D -> 6 -int FluxID; // 2D -> 32 -int TimeID; // Time netCDF variable -int TimeSpID; - -char StartT[TIMELENGTH]; // Start time from data -char StopT[TIMELENGTH]; // Stop time from data -/************************** - Function prototypes -**************************/ -void usage(); -void cdf_handle_error (CDFstatus); -void nc_handle_error (int); -void removeFilepath(); -void removeCDFext(); -void removeVers(); -void ncdefine(); -/*--------------------------------------------------------------------------*/ -void usage() -{ - printf ("\nDescription:\n"); - printf (" This program converts a themis CDF file into a netCDF file.\n"); - printf ("\n"); - printf ("Usage: esa2nc <CDF file name> <ThemisID> <mode>\n"); - printf ("\n"); - printf ("Example: esa2nc testfile tha peif\n"); - printf ("\n"); - exit(1); -} -/*-------------------------------------------------------------------------- - * Handles a CDF error. - *--------------------------------------------------------------------------*/ -void cdf_handle_error(CDFstatus status) -{ - - char message[CDF_STATUSTEXT_LEN+1]; - - CDFerror (status, message); /* Get the appropriate message */ - fprintf (stderr, "CDF: %s\n", message); -// exit(1); -} -/*-------------------------------------------------------------------------- - * Handles a netCDF error. - *--------------------------------------------------------------------------*/ -void nc_handle_error(int status) -{ - fprintf(stderr, "%s\n", nc_strerror(status)); - exit(1); -} - -/*-------------------------------------------------------------------------- - * NetCDF File Definition * - *--------------------------------------------------------------------------*/ - void ncdefine(double Time) - { - char *s; - time_t p; - int status; - char *STime; - -/*********************** Create netCDF file *****************************/ - memcpy(&(ncFile[0]),&(mode[0]), 4); - STime = Double2DD_Time(Time); - memcpy(&(ncFile[4]),&(STime[2]), 9); - if ((status = nc_create(ncFile, NC_CLOBBER, &ncID)) != NC_NOERR) - nc_handle_error(status); -/******************netCDF Dimensions *******************************/ - nc_def_dim (ncID, "Time", NC_UNLIMITED, &TimeDimID); - nc_def_dim (ncID, "TimeLength", TIMELENGTH, &TimeLengthID); - nc_def_dim (ncID, "Flux", 16L, &FluxDimID); - -/********************netCDF Variables ******************/ - TimeDimVector[0] = TimeDimID; - TimeDimVector[1] = TimeLengthID; - FluxDimVector[0] = TimeDimID; - FluxDimVector[1] = FluxDimID; -// - nc_def_var (ncID, "Time", NC_CHAR, 2, TimeDimVector, &TimeID); - - nc_def_var (ncID, "DeltaT", NC_DOUBLE, 1, &TimeDimID, &DeltaTID); - nc_def_var (ncID, "Mode", NC_FLOAT, 2, &TimeDimID, &ModeID); - nc_def_var (ncID, "Flux", NC_DOUBLE, 2, FluxDimVector, &FluxID); - - nc_def_var (ncID, "StartTime",NC_CHAR, 1, &TimeLengthID, &StartTimeID); - nc_def_var (ncID, "StopTime",NC_CHAR, 1, &TimeLengthID , &StopTimeID); - - - - - nc_put_att_text(ncID, NC_GLOBAL, "Themis", 3, ThemisID); - nc_put_att_text(ncID, NC_GLOBAL, "Source", 12, Source); - nc_put_att_text(ncID, FluxID, "Units", 17, "eV/(cm^2-s-sr-eV)"); - - - time(&p); - s = ctime(&p); - nc_put_att_text(ncID, NC_GLOBAL, "Created", 24, s); - - status = nc_enddef(ncID); - - - nc_put_vara_text(ncID, StartTimeID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time)); - - - } - - void put_double(RecStart, RecCount, ParCDF, ParNC) { - - - long RecInt = 1; - long indices[1] = {0}, intervals[1] = {1}, counts[1] = {1}; - - double *value; - - value = (double *)malloc(sizeof(double)*RecCount); - if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_double(ncID, ParNC, value); - - free(value); - } - - - void put_mode(RecStart, RecCount, ParCDF, ParNC) { - - float *value; - long indices[2] = {0,3}, intervals[1] = {1}, counts[1] = {3}; - long RecInt = 1; - - value = (float *)malloc(sizeof(float) * RecCount *3); - if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_float(ncID, ParNC, value); - - free(value); - } - -void put_spectra(RecStart, RecCount, ParCDF, ParNC) { - - double *value; - long indices[2] = {0,16}, intervals[1] = {1}, counts[1] = {16}; - long RecInt = 1; - - value = (double *)malloc(sizeof(double)*RecCount*16); - if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, counts, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_)) - != CDF_OK) cdf_handle_error(cstatus); - nc_put_var_double(ncID, ParNC, value); - free(value); - } -/*--------------------------------------------------------------------------*/ -int main(int argc, char *argv[]) -{ - long RecStart = 0, RecCount, RecCountF = 1, RecInt = 1, MaxRec; - long indices[1] = {0}, counts[1] = {3}, counts2[1] = {6}, countsFlux[1] = {32}, intervals[1] = {1}; - long countsE[1] = {1}, indicesF[2]={0,3}, indicesF2[2]={0,6}, indicesFlux[2] = {0, 32}; - double *value; - float *value_f; - size_t numElem; - long dimN, varN, par0, par1, par2; - - CDFid id; - int i, j, status; - char fileName[MAX_FILE_NAME_LEN]; - dd_tmstr_t *dtm; - int First = 1; - double DayOld; - - - char *UT; - char data_set[8]="thx_psxf"; -/*-------------------------------- Arguments Decoding ----------------------------------------*/ - if (argc <= 3) usage(); // CDF input file name and THEMIS Number not specified - else - { - strcpy(fileName, argv[1]); - strncpy(ThemisID,argv[2],3); - strncpy(mode,argv[3],4); - } - -/*------------------------------------------ CDF Variables Names Updated according to THEMIS Number -------------*/ - - memcpy(&(data_set[2]),&(ThemisID[2]),1); - memcpy(&(data_set[6]),&(mode[2]),2); - - memcpy(&(ThemisTime[0]),&(data_set[0]),8); - memcpy(&(PAR0[0]),&(data_set[0]),8); - memcpy(&(PAR1[0]),&(data_set[0]),8); - memcpy(&(PAR2[0]),&(data_set[0]),8); - - -/*********************** Open CDF file *****************************/ - if ((cstatus = CDFopen(fileName, &id)) != CDF_OK) - cdf_handle_error(cstatus); - printf(" THEMIS %s %s\n", ThemisID, mode); - -/*********** treat all vars as zVars with eliminated false dimensionality **********/ - - if ((cstatus = CDFlib(SELECT_, CDF_zMODE_, zMODEon2, NULL_)) != CDF_OK) - cdf_handle_error (cstatus); - -/************************ Get CDF Data ************************************/ - - cstatus = CDFlib(GET_, zVAR_NUMBER_, ThemisTime, &varN, NULL_); - cstatus = CDFlib( SELECT_, zVAR_, varN, GET_, zVAR_MAXREC_, &MaxRec, NULL_); - - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR0, &par0, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR1, &par1, NULL_); - cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR2, &par2, NULL_); - - - RecCount = (long)(MaxRec+1); - printf(" Max Rec %d\n", MaxRec); - - value = (double *)malloc(sizeof(double)* RecCount); - if ((cstatus = CDFlib (SELECT_, - zVAR_, varN, - zVAR_RECNUMBER_, RecStart , - zVAR_RECCOUNT_, RecCount, - zVAR_RECINTERVAL_, RecInt, - zVAR_DIMINDICES_, indices, - zVAR_DIMCOUNTS_, countsE, - zVAR_DIMINTERVALS_, intervals, - GET_, zVAR_HYPERDATA_, value, NULL_) ) - != CDF_OK) cdf_handle_error(cstatus); - - for (i = 0; i < RecCount; i++) { - - - UT = Double2DD_Time(value[i]); - - if ((First == 0) && (value[i] - DayOld) > TimeGap) { - - printf("GAP %f\n",(value[i] - DayOld)/60.0); - // put_double(RecStart, (long)i - RecStart, par0, DeltaTID); - // put_mode(RecStart, (long)i - RecStart, par1, ModeID, ModeSpID); - put_spectra(RecStart, (long)i - RecStart, par2, FluxID); - - nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], Double2DD_Time(DayOld)); - - if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); - - First = 1; - RecStart = (long)i; - UT = Double2DD_Time(value[i]); - } - - dtm = ReadTime(UT); - if (First == 1) { - ncdefine(dtm->times); - - First = 0; - Start[0] = 0; - - } - nc_put_vara_text(ncID, TimeID, Start, TimeCount, UT); - - Start[0]++; - DayOld = value[i]; - - } - free(value); - nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], UT); - - - // put_double(RecStart, RecCount - RecStart, par0, DeltaTID); - // put_mode(RecStart, RecCount - RecStart, par1, ModeID, ModeSpID); - put_spectra(RecStart, RecCount - RecStart, par2, FluxID); - -/********************Close Files******************/ - if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK) - cdf_handle_error (cstatus); - if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); - -} diff --git a/src/DECODERS/themis/themis_esa2nc.c b/src/DECODERS/themis/themis_esa2nc.c new file mode 100644 index 0000000..0ff25d0 --- /dev/null +++ b/src/DECODERS/themis/themis_esa2nc.c @@ -0,0 +1,656 @@ + /**************************************************************/ + /* THEMIS ESA ION AND ELECTRON MOMENTS CDF -> DD netCDF */ + /* 04.01.2008 */ + /* V 1.1 */ + /* Energy in info file */ + /* New CDF with ALL modes and new params */ + /* 04.01.2008 - 2 files for peir & peer modes */ + /**************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <netcdf.h> +#include <cdf.h> +#include <DD.h> +#include <string.h> +#include <time.h> +#include <math.h> + +#define TimeGap 1800000.0 +#define Source "themis@cdpp2" +#define MAX_FILE_NAME_LEN 250 // Max. file name length +#define MAX_VARS 250 // Max # of VARS in CDF + + +/************************************* + Global variables and structures +**************************************/ +long CDFDims, // Number of dimensions in a CDF file + CDFVars, // Number of variables in a CDF file + CDFDimSizes[CDF_MAX_DIMS], // Dimension Sizes in a CDF file + CDFencoding, // Data encoding + CDFmajority, // Variable majority + CDFmaxRec, // max Record number + CDFAttrs; // number of CDF Attributes + + +struct cdfvar { // CDF variable structure + char name[CDF_VAR_NAME_LEN+1]; + long num; //variable number + long datatype; + long numElem; // variable dimensionality + long recVariance; // variable rec Variance + long dimVariances[CDF_MAX_DIMS]; // # of data values in dimSizes +} cdfVar[MAX_VARS]; + +char mode[4]; +int ncID, ncSpID; +char ncFile[] = "peif_000000000.nc"; +int TimeDimID, TimeLengthID, DataID, Data2ID, FluxDimID;; +int TimeDimVector[2], DataDimVector[2], Data2DimVector[2], FluxDimVector[2]; // netCDF Dim vectors +size_t Start[2] = {0L,0L}; +size_t TimeCount[2] = {1L,TIMELENGTH}; +size_t Data1Count[2] = {1L,1L}; +size_t DataCount[2] = {1L,3L}; +size_t Data2Count[2] = {1L,6L}; +size_t FluxCount[2] = {1L,32L}; + +char Version[]="v01"; +char ThemisID[]="tha\0"; +char ThemisTime[]="tha_peif_time"; +char PAR0[]="tha_peif_delta_time"; +char PAR1[]="tha_peif_mode"; +char PAR2[]="tha_peif_density"; +char PAR3[]="tha_peif_velocity_gse"; +char PAR4[]="tha_peif_t3"; // Diagonilized Temperature +char PAR5[]="tha_peif_en_eflux"; +char PAR6[]="tha_peif_en_eflux_yaxis"; +char PAR7[]="tha_peif_avgtemp"; // trace of t3 divided by 3 +char PAR8[]="tha_peif_vthermal"; +char PAR9[]="tha_peif_sc_pot"; +char PAR10[]="tha_peif_sc_current"; +char PAR11[]="tha_peif_magt3"; // Temperature in Mag Field frame +char PAR12[]="tha_peif_ptens"; // Pressure Tensor DSL +char PAR13[]="tha_peif_mftens"; // Momentum Flux Tensor DSL +char PAR14[]="tha_peif_flux"; // particle flux +char PAR15[]="tha_peif_symm"; // Direction of pressure tensor symmetry in DSL +char PAR16[]="tha_peif_symm_ang"; // Angle between Direction of pressure tensor symmetry and B + + +int StartTimeID, StopTimeID; +int DeltaTID, DensID, AvTempID, ThVelID, PotID, CurrID, SymAngID; // 1D +int MfTempID, TempID, ModeID, VelID, Flux2ID, SymmID; // 2D -> 3 +int prTenID, mfTenID; // 2D -> 6 +int EnID, FluxID; // 2D -> 32 +int TimeID; // Time netCDF variable + + +char StartT[TIMELENGTH]; // Start time from data +char StopT[TIMELENGTH]; // Stop time from data +/************************** + Function prototypes +**************************/ +void usage(); +void cdf_handle_error (CDFstatus); +void nc_handle_error (int); +void removeFilepath(); +void removeCDFext(); +void removeVers(); +void ncdefine(); +/*--------------------------------------------------------------------------*/ +void usage() +{ + printf ("\nDescription:\n"); + printf (" This program converts a themis CDF file into a netCDF file.\n"); + printf ("\n"); + printf ("Usage: esa2nc <CDF file name> <ThemisID> <mode>\n"); + printf ("\n"); + printf ("Example: esa2nc testfile tha peif\n"); + printf ("\n"); + exit(1); +} +/*-------------------------------------------------------------------------- + * Handles a CDF error. + *--------------------------------------------------------------------------*/ +void cdf_handle_error(CDFstatus status) +{ + + char message[CDF_STATUSTEXT_LEN+1]; + + CDFerror (status, message); /* Get the appropriate message */ + fprintf (stderr, "CDF: %s\n", message); +// exit(1); +} +/*-------------------------------------------------------------------------- + * Handles a netCDF error. + *--------------------------------------------------------------------------*/ +void nc_handle_error(int status) +{ + fprintf(stderr, "%s\n", nc_strerror(status)); + exit(1); +} +/*-------------------------------------------------------------------------- + * Remove the filepath from a file name. * + * Example: + * /home/data/mydata.txt => mydata.txt + *--------------------------------------------------------------------------*/ +void removeFilepath (char *fileName) +{ + char *ptr; + + ptr = strrchr(fileName, '/'); // Unix file path separator + if (ptr != NULL) + { + ptr++; + strcpy(fileName, ptr); + } +} +/*-------------------------------------------------------------------------- + * Decode CDF File Name * + *--------------------------------------------------------------------------*/ +void removeVers (char *fileName) +{ + char *ptr; + char zero = '\0'; + int i; + + for (i = 0; i < 9; i++) + { + ptr = strchr(fileName, '_'); + if (ptr != NULL) + { + ptr++; + strcpy(fileName, ptr); + } + } + ptr = strchr(fileName, '_'); // + + if (ptr != NULL) + { + ptr++; + strncpy(Version, ptr, 2); + } + } + + /*-------------------------------------------------------------------------- + * Remove the CDF extention * + *--------------------------------------------------------------------------*/ +void removeCDFext (char *fileName) +{ + char *ptr; + char zero = '\0'; + + ptr = strchr(fileName, '.'); + if (ptr != NULL) + strcpy(ptr, &zero); +} +/*-------------------------------------------------------------------------- + * NetCDF File Definition * + *--------------------------------------------------------------------------*/ + void ncdefine(double Time) + { + char *s; + time_t p; + int status; + char *STime; + +/*********************** Create netCDF file *****************************/ + memcpy(&(ncFile[0]),&(mode[0]), 4); + STime = Double2DD_Time(Time); + memcpy(&(ncFile[5]),&(STime[2]), 9); + if ((status = nc_create(ncFile, NC_CLOBBER, &ncID)) != NC_NOERR) + nc_handle_error(status); +/******************netCDF Dimensions *******************************/ + nc_def_dim (ncID, "Time", NC_UNLIMITED, &TimeDimID); + nc_def_dim (ncID, "TimeLength", TIMELENGTH, &TimeLengthID); + nc_def_dim (ncID, "Data",3L, &DataID); + nc_def_dim (ncID, "Data2",6L, &Data2ID); + + nc_def_dim (ncID, "Flux",32L, &FluxDimID); + +/********************netCDF Variables ******************/ + TimeDimVector[0] = TimeDimID; + DataDimVector[0] = TimeDimID; + Data2DimVector[0] = TimeDimID; + TimeDimVector[1] = TimeLengthID; + DataDimVector[1] = DataID; + FluxDimVector[0] = TimeDimID; + FluxDimVector[1] = FluxDimID; + Data2DimVector[1] = Data2ID; + +//ModeID, DensID, VelID, TempID; + nc_def_var (ncID, "Time", NC_CHAR, 2, TimeDimVector, &TimeID); + + nc_def_var (ncID, "delta_time", NC_DOUBLE, 1, &TimeDimID, &DeltaTID); + nc_def_var (ncID, "mode", NC_FLOAT, 2, DataDimVector, &ModeID); + nc_def_var (ncID, "density", NC_DOUBLE, 1, &TimeDimID, &DensID); + nc_def_var (ncID, "avgtemp", NC_DOUBLE, 1, &TimeDimID, &AvTempID); + nc_def_var (ncID, "sc_pot", NC_DOUBLE, 1, &TimeDimID, &PotID); + nc_def_var (ncID, "sc_current", NC_DOUBLE, 1, &TimeDimID, &CurrID); + nc_def_var (ncID, "symm_ang", NC_DOUBLE, 1, &TimeDimID, &SymAngID); + nc_def_var (ncID, "vthermal", NC_DOUBLE, 1, &TimeDimID, &ThVelID); + nc_def_var (ncID, "velocity_gse", NC_DOUBLE, 2, DataDimVector, &VelID); + nc_def_var (ncID, "t3", NC_DOUBLE, 2, DataDimVector, &TempID); + nc_def_var (ncID, "magt3", NC_DOUBLE, 2, DataDimVector, &MfTempID); + nc_def_var (ncID, "flux", NC_DOUBLE, 2, DataDimVector, &Flux2ID); + nc_def_var (ncID, "symm", NC_DOUBLE, 2, DataDimVector, &SymmID); + nc_def_var (ncID, "ptens", NC_DOUBLE, 2, Data2DimVector, &prTenID); + nc_def_var (ncID, "mftens", NC_DOUBLE, 2, Data2DimVector, &mfTenID); + nc_def_var (ncID, "en_eflux", NC_DOUBLE, 2, FluxDimVector, &FluxID); + nc_def_var (ncID, "en_eflux_yaxis", NC_FLOAT, 2, FluxDimVector, &EnID); + nc_def_var (ncID, "StartTime",NC_CHAR, 1, &TimeLengthID, &StartTimeID); + nc_def_var (ncID, "StopTime",NC_CHAR, 1, &TimeLengthID , &StopTimeID); + + nc_put_att_text(ncID, NC_GLOBAL, "Themis", 3, ThemisID); + nc_put_att_text(ncID, NC_GLOBAL, "Source", 12, Source); + nc_put_att_text(ncID, DensID, "Units", 5, "cm^-3"); + nc_put_att_text(ncID, TempID, "Units", 2, "eV"); + nc_put_att_text(ncID, TempID, "Frame", 2, "FA"); + nc_put_att_text(ncID, TempID, "Order", 16, "perp1,perp2,para"); + nc_put_att_text(ncID, MfTempID, "Units", 2, "eV"); + nc_put_att_text(ncID, MfTempID, "Frame", 2, "FA"); + nc_put_att_text(ncID, MfTempID, "Order", 16, "perp1,perp2,para"); + nc_put_att_text(ncID, AvTempID, "Units", 2, "eV"); + nc_put_att_text(ncID, prTenID, "Units", 2, "eV"); + nc_put_att_text(ncID, prTenID, "Frame", 3, "DSL"); + nc_put_att_text(ncID, prTenID, "Order", 17, "xx,xy,xz,yy,zz,yz"); + nc_put_att_text(ncID, mfTenID, "Units", 2, "eV"); + nc_put_att_text(ncID, mfTenID, "Frame", 3, "DSL"); + nc_put_att_text(ncID, mfTenID, "Order", 17, "xx,xy,xz,yy,zz,yz"); + nc_put_att_text(ncID, Flux2ID, "Units", 9, "#/sec/cm2"); + nc_put_att_text(ncID, PotID, "Units", 1, "V"); + nc_put_att_text(ncID, SymmID, "Frame", 3, "DSL"); + nc_put_att_text(ncID, CurrID, "Units", 7, "Unknown"); + nc_put_att_text(ncID, SymAngID, "Units", 7, "degrees"); + nc_put_att_text(ncID, VelID, "Units", 4, "km/s"); + nc_put_att_text(ncID, ThVelID, "Units", 4, "km/s"); + nc_put_att_text(ncID, VelID, "Frame", 3, "GSE"); + nc_put_att_text(ncID, EnID, "Units", 2, "eV"); + nc_put_att_text(ncID, FluxID, "Units", 17, "eV/(cm^2-s-sr-eV)"); + + time(&p); + s = ctime(&p); + nc_put_att_text(ncID, NC_GLOBAL, "Created", 24, s); + + nc_enddef(ncID); + + nc_put_vara_text(ncID, StartTimeID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time)); + + } +/*--------------------------------------------------------------------------*/ +int main(int argc, char *argv[]) +{ + long RecStart = 0, RecCount, RecCountF = 1, RecInt = 1, MaxRec; + long indices[1] = {0}, counts[1] = {3}, counts2[1] = {6}, countsFlux[1] = {32}, intervals[1] = {1}; + long countsE[1] = {1}, indicesF[2]={0,3}, indicesF2[2]={0,6}, indicesFlux[2] = {0, 32}; + double *value; + float *value_f; + size_t numElem; + long dimN, varN, par0, par1, par2, par3, par4, par5, par6, par7, par8, par9, par10, par11, par12, par13, par14, par15, par16; + CDFstatus cstatus; // CDF status code + CDFid id; + int i, j, status; + char fileName[MAX_FILE_NAME_LEN]; + dd_tmstr_t *dtm; + int First = 1; + double par[3], parr[6], doubleVal, parD[32]; + float parF[32], par_f[3], parr_f[6], floatVal; + long DayOld; + + + char *UT; + char data_set[8]="thx_pexx"; +/*-------------------------------- Arguments Decoding ----------------------------------------*/ + if (argc <= 3) usage(); // CDF input file name and THEMIS Number not specified + else + { + strcpy(fileName, argv[1]); + strncpy(ThemisID,argv[2],3); + strncpy(mode,argv[3],4); + } + +/*------------------------------------------ CDF Variables Names Updated according to THEMIS Number -------------*/ + + memcpy(&(data_set[2]),&(ThemisID[2]),1); + memcpy(&(data_set[6]),&(mode[2]),2); + + memcpy(&(ThemisTime[0]),&(data_set[0]),8); + memcpy(&(PAR0[0]),&(data_set[0]),8); + memcpy(&(PAR1[0]),&(data_set[0]),8); + memcpy(&(PAR2[0]),&(data_set[0]),8); + memcpy(&(PAR3[0]),&(data_set[0]),8); + memcpy(&(PAR4[0]),&(data_set[0]),8); + memcpy(&(PAR5[0]),&(data_set[0]),8); + memcpy(&(PAR6[0]),&(data_set[0]),8); + memcpy(&(PAR7[0]),&(data_set[0]),8); + memcpy(&(PAR8[0]),&(data_set[0]),8); + memcpy(&(PAR9[0]),&(data_set[0]),8); + memcpy(&(PAR10[0]),&(data_set[0]),8); + memcpy(&(PAR11[0]),&(data_set[0]),8); + memcpy(&(PAR12[0]),&(data_set[0]),8); + memcpy(&(PAR13[0]),&(data_set[0]),8); + memcpy(&(PAR14[0]),&(data_set[0]),8); + memcpy(&(PAR15[0]),&(data_set[0]),8); + memcpy(&(PAR16[0]),&(data_set[0]),8); + +/*********************** Open CDF file *****************************/ + if ((cstatus = CDFopen(fileName, &id)) != CDF_OK) + cdf_handle_error(cstatus); + printf(" THEMIS %s %s\n", ThemisID, mode); + +/*********** treat all vars as zVars with eliminated false dimensionality **********/ + + if ((cstatus = CDFlib(SELECT_, CDF_zMODE_, zMODEon2, NULL_)) != CDF_OK) + cdf_handle_error (cstatus); + + // Remove the file path (/home/data/mydata => mydata) + removeFilepath(fileName); + // Remove Version Number + removeVers(fileName); + + // Remove .cdf extension + removeCDFext(fileName); + +/************************ Get CDF Data ************************************/ + + cstatus = CDFlib(GET_, zVAR_NUMBER_, ThemisTime, &varN, NULL_); + cstatus = CDFlib( SELECT_, zVAR_, varN, GET_, zVAR_MAXREC_, &MaxRec, NULL_); + + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR0, &par0, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR1, &par1, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR2, &par2, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR3, &par3, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR4, &par4, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR5, &par5, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR6, &par6, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR7, &par7, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR8, &par8, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR9, &par9, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR10, &par10, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR11, &par11, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR12, &par12, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR13, &par13, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR14, &par14, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR15, &par15, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR16, &par16, NULL_); + + RecCount = (long)(MaxRec+1); + printf(" Max Rec %d\n", MaxRec); + + value = (double *)malloc(sizeof(double)* RecCount); + if ((cstatus = CDFlib (SELECT_, + zVAR_, varN, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_) ) + != CDF_OK) cdf_handle_error(cstatus); + + for (i = 0; i < RecCount; i++) { + UT = Double2DD_Time(value[i]); + dtm = ReadTime(UT); + if (First == 1) { + ncdefine(dtm->times); + First = 0; + } + nc_put_vara_text(ncID, TimeID, Start, TimeCount, UT); + + Start[0]++; + + } + nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], UT); + + Start[0] = 0L; +// deltaT + if ((cstatus = CDFlib (SELECT_, zVAR_, par0, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + nc_put_var_double(ncID, DeltaTID, value); + + + free(value); + value_f = (float *)malloc(sizeof(float)* RecCount * 3); + + +// Mode + if ((cstatus = CDFlib (SELECT_, zVAR_, par1, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value_f, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + nc_put_var_float(ncID, ModeID, value_f); + free(value_f); + + value = (double *)malloc(sizeof(double)* RecCount * 3); + // peif_velocity_gse + if ((cstatus = CDFlib (SELECT_, zVAR_, par3, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + nc_put_var_double(ncID, VelID, value); + +// temperature + if ((cstatus = CDFlib (SELECT_, zVAR_, par4, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + nc_put_var_double(ncID, TempID,value); + +// temperature regard to B-field + if ((cstatus = CDFlib (SELECT_, zVAR_, par11, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + nc_put_var_double(ncID, MfTempID, value); + +// Flux total + if ((cstatus = CDFlib (SELECT_, zVAR_, par14, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + nc_put_var_double(ncID, Flux2ID, value); + + +// symmetry + if ((cstatus = CDFlib (SELECT_, zVAR_, par15, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, SymmID, value); + + free(value); + value = (double *)malloc(sizeof(double)* RecCount * 6); + +// + if ((cstatus = CDFlib (SELECT_, zVAR_, par12, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF2, + zVAR_DIMCOUNTS_, counts2, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, prTenID, value); + +// Pressure Tensor with regard to B-field + if ((cstatus = CDFlib (SELECT_, zVAR_, par13, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF2, + zVAR_DIMCOUNTS_, counts2, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + nc_put_var_double(ncID, mfTenID, value); + free(value); + value = (double *)malloc(sizeof(double)* RecCount); + +// Density + if ((cstatus = CDFlib (SELECT_, zVAR_, par2, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + nc_put_var_double(ncID, DensID, value); +// Average Temperature + if ((cstatus = CDFlib (SELECT_, zVAR_, par7, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, AvTempID, value); +// Thermal Velocity + if ((cstatus = CDFlib (SELECT_, zVAR_, par8, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, ThVelID, value); +// Potential + if ((cstatus = CDFlib (SELECT_, zVAR_, par9, + zVAR_RECNUMBER_, RecStart, + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + nc_put_var_double(ncID, PotID, value); +// Current + /* if ((cstatus = CDFlib (SELECT_, zVAR_, par10, + zVAR_RECNUMBER_, RecStart, + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, CurrID, value); + */ +// Symmery Angle with B + if ((cstatus = CDFlib (SELECT_, zVAR_, par16, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, SymAngID, value); + + free(value); + value = (double *)malloc(sizeof(double)* RecCount *32); + + if ((cstatus = CDFlib (SELECT_, zVAR_, par5, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesFlux, + zVAR_DIMCOUNTS_, countsFlux, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, FluxID, value); + + /* + if ((cstatus = CDFlib (SELECT_, zVAR_, par6, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCountF, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesFlux, + zVAR_DIMCOUNTS_, countsFlux, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, parF, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + */ + /* if (!isnan(parF[0])) + nc_put_vara_float(ncID, EnID, Start, FluxCount, parF); + else nc_put_vara_float(ncID, EnID, Start, FluxCount, FillValueF); + */ // for (j = 0; j < 32; i++) printf(" %f ", parF[j]); + + + // } + + + free(value); +/********************Close Files******************/ + if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK) + cdf_handle_error (cstatus); + if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); + +} diff --git a/src/DECODERS/themis/themis_esamom2nc.c b/src/DECODERS/themis/themis_esamom2nc.c new file mode 100644 index 0000000..4c7b6bc --- /dev/null +++ b/src/DECODERS/themis/themis_esamom2nc.c @@ -0,0 +1,456 @@ + /**************************************************************/ + /* THEMIS ESA ION AND ELECTRON MOMENTS CDF -> DD netCDF */ + /* 04.01.2008 */ + /* V 1.1 */ + /* */ + /* New CDF with ALL modes and new params */ + /* */ + /**************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <netcdf.h> +#include <cdf.h> +#include <DD.h> +#include <string.h> +#include <time.h> +#include <math.h> + +#define TimeGap 1800000.0 +#define Source "themis@cdpp2" +#define MAX_FILE_NAME_LEN 250 // Max. file name length +#define MAX_VARS 250 // Max # of VARS in CDF + + +/************************************* + Global variables and structures +**************************************/ +long CDFDims, // Number of dimensions in a CDF file + CDFVars, // Number of variables in a CDF file + CDFDimSizes[CDF_MAX_DIMS], // Dimension Sizes in a CDF file + CDFencoding, // Data encoding + CDFmajority, // Variable majority + CDFmaxRec, // max Record number + CDFAttrs; // number of CDF Attributes + + +struct cdfvar { // CDF variable structure + char name[CDF_VAR_NAME_LEN+1]; + long num; //variable number + long datatype; + long numElem; // variable dimensionality + long recVariance; // variable rec Variance + long dimVariances[CDF_MAX_DIMS]; // # of data values in dimSizes +} cdfVar[MAX_VARS]; + +char mode[4]; +int ncID; +char ncFile[] = "peim000000000.nc"; +int TimeDimID, TimeLengthID, DataID, Data2ID; +int TimeDimVector[2], DataDimVector[2], Data2DimVector[2]; // netCDF Dim vectors +size_t Start[2] = {0L,0L}; +size_t TimeCount[2] = {1L,TIMELENGTH}; +size_t Data1Count[2] = {1L,1L}; +size_t DataCount[2] = {1L,3L}; +size_t Data2Count[2] = {1L,6L}; + +char Version[]="v01"; +char ThemisID[]="tha\0"; +char ThemisTime[]="tha_peim_time"; +char PAR0[]="tha_peim_density"; +char PAR1[]="tha_peim_ptot"; +char PAR2[]="tha_peim_flux"; +char PAR3[]="tha_peim_mftens"; // Momentum Flux Tensor DSL +char PAR4[]="tha_peim_eflux"; +char PAR5[]="tha_peim_velocity_gse"; +char PAR6[]="tha_peim_ptens"; // Pressure Tensor DSL +char PAR7[]="tha_peim_mag"; +char PAR8[]="tha_peim_velocity_mag"; +char PAR9[]="tha_peim_t3_mag"; // Diagonilized Temperature +char PAR10[]="tha_peim_ptens_mag"; // + + +int StartTimeID, StopTimeID; +int DeltaTID, DensID, PtotID; // 1D +int FluxID, EfluxID, VelID, MagID, VelMagID, TempMagID; // 2D -> 3 +int MfTensID, PtensID, PtensMagID ; // 2D -> 6 + +int TimeID; // Time netCDF variable + + +char StartT[TIMELENGTH]; // Start time from data +char StopT[TIMELENGTH]; // Stop time from data +/************************** + Function prototypes +**************************/ +void usage(); +void cdf_handle_error (CDFstatus); +void nc_handle_error (int); +void ncdefine(); +/*--------------------------------------------------------------------------*/ +void usage() +{ + printf ("\nDescription:\n"); + printf (" This program converts a themis CDF file into a netCDF file.\n"); + printf ("\n"); + printf ("Usage: esa2nc <CDF file name> <ThemisID>\n"); + printf ("\n"); + printf ("Example: esa2nc testfile tha\n"); + printf ("\n"); + exit(1); +} +/*-------------------------------------------------------------------------- + * Handles a CDF error. + *--------------------------------------------------------------------------*/ +void cdf_handle_error(CDFstatus status) +{ + + char message[CDF_STATUSTEXT_LEN+1]; + + CDFerror (status, message); /* Get the appropriate message */ + fprintf (stderr, "CDF: %s\n", message); +// exit(1); +} +/*-------------------------------------------------------------------------- + * Handles a netCDF error. + *--------------------------------------------------------------------------*/ +void nc_handle_error(int status) +{ + fprintf(stderr, "%s\n", nc_strerror(status)); + exit(1); +} + + +/*-------------------------------------------------------------------------- + * NetCDF File Definition * + *--------------------------------------------------------------------------*/ + void ncdefine(double Time) + { + char *s; + time_t p; + int status; + char *STime; + +/*********************** Create netCDF file *****************************/ + memcpy(&(ncFile[0]),&(mode[0]),4); + STime = Double2DD_Time(Time); + memcpy(&(ncFile[4]),&(STime[2]), 9); + if ((status = nc_create(ncFile, NC_CLOBBER, &ncID)) != NC_NOERR) + nc_handle_error(status); +/******************netCDF Dimensions *******************************/ + nc_def_dim (ncID, "Time", NC_UNLIMITED, &TimeDimID); + nc_def_dim (ncID, "TimeLength", TIMELENGTH, &TimeLengthID); + nc_def_dim (ncID, "Data",3L, &DataID); + nc_def_dim (ncID, "Data2",6L, &Data2ID); + +/********************netCDF Variables ******************/ + TimeDimVector[0] = TimeDimID; + DataDimVector[0] = TimeDimID; + Data2DimVector[0] = TimeDimID; + TimeDimVector[1] = TimeLengthID; + DataDimVector[1] = DataID; + + Data2DimVector[1] = Data2ID; + +//ModeID, DensID, VelID, TempID; + nc_def_var (ncID, "Time", NC_CHAR, 2, TimeDimVector, &TimeID); + nc_def_var (ncID, "Density", NC_DOUBLE, 1, &TimeDimID, &DensID); + nc_def_var (ncID, "Ptot", NC_DOUBLE, 1, &TimeDimID, &PtotID); + nc_def_var (ncID, "Flux", NC_DOUBLE, 2, DataDimVector, &FluxID); + nc_def_var (ncID, "MfTens", NC_DOUBLE, 2, Data2DimVector, &MfTensID); + nc_def_var (ncID, "Eflux", NC_DOUBLE, 2, DataDimVector, &EfluxID); + nc_def_var (ncID, "Velocity", NC_DOUBLE, 2, DataDimVector, &VelID); + nc_def_var (ncID, "Ptens", NC_DOUBLE, 2, Data2DimVector, &PtensID); + nc_def_var (ncID, "Mag", NC_DOUBLE, 2, DataDimVector, &MagID); + nc_def_var (ncID, "VelocityMag", NC_DOUBLE, 2, DataDimVector, &VelMagID); + nc_def_var (ncID, "TempMag", NC_DOUBLE, 2, DataDimVector, &TempMagID); + nc_def_var (ncID, "PtensMag", NC_DOUBLE, 2, Data2DimVector, &PtensMagID); + + nc_def_var (ncID, "StartTime",NC_CHAR, 1, &TimeLengthID, &StartTimeID); + nc_def_var (ncID, "StopTime",NC_CHAR, 1, &TimeLengthID , &StopTimeID); + + + + + nc_put_att_text(ncID, NC_GLOBAL, "Themis", 3, ThemisID); + nc_put_att_text(ncID, NC_GLOBAL, "Source", 12, Source); + nc_put_att_text(ncID, DensID, "Units", 5, "cm^-3"); + + + time(&p); + s = ctime(&p); + nc_put_att_text(ncID, NC_GLOBAL, "Created", 24, s); + + nc_enddef(ncID); + + nc_put_vara_text(ncID, StartTimeID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time)); + ; + } +/*--------------------------------------------------------------------------*/ +int main(int argc, char *argv[]) +{ + long RecStart = 0, RecCount, RecCountF = 1, RecInt = 1, MaxRec; + long indices[1] = {0}, counts[1] = {3}, counts2[1] = {6}, intervals[1] = {1}; + long countsE[1] = {1}, indicesF[2]={0,3}, indicesF2[2]={0,6}; + double *value; + float *value_f; + size_t numElem; + long dimN, varN, par0, par1, par2, par3, par4, par5, par6, par7, par8, par9, par10; + CDFstatus cstatus; // CDF status code + CDFid id; + int i, j, status; + char fileName[MAX_FILE_NAME_LEN]; + dd_tmstr_t *dtm; + int First = 1; + + char *UT; + char data_set[8]="thx_peim"; +/*-------------------------------- Arguments Decoding ----------------------------------------*/ + if (argc <= 2) usage(); // CDF input file name and THEMIS Number not specified + else + { + strcpy(fileName, argv[1]); + strncpy(ThemisID,argv[2],3); + strncpy(mode,argv[3],4); + } + +/*------------------------------------------ CDF Variables Names Updated according to THEMIS Number -------------*/ + memcpy(&(data_set[2]),&(ThemisID[2]),1); + memcpy(&(data_set[6]),&(mode[2]),2); + + memcpy(&(ThemisTime[0]),&(data_set[0]),8); + memcpy(&(PAR0[0]),&(data_set[0]),8); + memcpy(&(PAR1[0]),&(data_set[0]),8); + memcpy(&(PAR2[0]),&(data_set[0]),8); + memcpy(&(PAR3[0]),&(data_set[0]),8); + memcpy(&(PAR4[0]),&(data_set[0]),8); + memcpy(&(PAR5[0]),&(data_set[0]),8); + memcpy(&(PAR6[0]),&(data_set[0]),8); + memcpy(&(PAR7[0]),&(data_set[0]),8); + memcpy(&(PAR8[0]),&(data_set[0]),8); + memcpy(&(PAR9[0]),&(data_set[0]),8); + memcpy(&(PAR10[0]),&(data_set[0]),8); + +/*********************** Open CDF file *****************************/ + if ((cstatus = CDFopen(fileName, &id)) != CDF_OK) + cdf_handle_error(cstatus); + printf(" THEMIS %s \n", ThemisID); + +/*********** treat all vars as zVars with eliminated false dimensionality **********/ + + if ((cstatus = CDFlib(SELECT_, CDF_zMODE_, zMODEon2, NULL_)) != CDF_OK) + cdf_handle_error (cstatus); + + +/************************ Get CDF Data ************************************/ + + cstatus = CDFlib(GET_, zVAR_NUMBER_, ThemisTime, &varN, NULL_); + cstatus = CDFlib( SELECT_, zVAR_, varN, GET_, zVAR_MAXREC_, &MaxRec, NULL_); + + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR0, &par0, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR1, &par1, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR2, &par2, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR3, &par3, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR4, &par4, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR5, &par5, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR6, &par6, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR7, &par7, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR8, &par8, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR9, &par9, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR10, &par10, NULL_); + + + RecCount = (long)(MaxRec+1); + printf(" Max Rec %d\n", MaxRec); + if ( RecCount > 0) { + value = (double *)malloc(sizeof(double)* RecCount); + if ((cstatus = CDFlib (SELECT_, + zVAR_, varN, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_) ) + != CDF_OK) cdf_handle_error(cstatus); + + for (i = 0; i < RecCount; i++) { + UT = Double2DD_Time(value[i]); + dtm = ReadTime(UT); + if (First == 1) { + ncdefine(dtm->times); + First = 0; + } + nc_put_vara_text(ncID, TimeID, Start, TimeCount, UT); + + Start[0]++; + + } + nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], UT); + + +// Density + if ((cstatus = CDFlib (SELECT_, zVAR_, par0, + zVAR_RECNUMBER_, RecStart, + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + nc_put_var_double(ncID, DensID, value); +// Ion Total Pressure + if ((cstatus = CDFlib (SELECT_, zVAR_, par1, + zVAR_RECNUMBER_, RecStart, + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + nc_put_var_double(ncID, PtotID, value); + + free(value); + value = (double *)malloc(sizeof(double)* RecCount * 3); + // flux + if ((cstatus = CDFlib (SELECT_, zVAR_, par2, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + nc_put_var_double(ncID, FluxID, value); + +// Energy Flux + if ((cstatus = CDFlib (SELECT_, zVAR_, par4, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + nc_put_var_double(ncID, EfluxID,value); + +// Velocity GSE + if ((cstatus = CDFlib (SELECT_, zVAR_, par5, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + nc_put_var_double(ncID, VelID, value); + +// Magnetic Field Vector DSL + if ((cstatus = CDFlib (SELECT_, zVAR_, par7, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, MagID, value); + +// Velocity Mag + if ((cstatus = CDFlib (SELECT_, zVAR_, par8, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, VelMagID, value); + + // Temperature Mag + if ((cstatus = CDFlib (SELECT_, zVAR_, par9, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, TempMagID, value); + + free(value); + value = (double *)malloc(sizeof(double)* RecCount * 6); + +// Momentum Flux Tensor + if ((cstatus = CDFlib (SELECT_, zVAR_, par3, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF2, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, MfTensID, value); + +// Pressure Tensor + if ((cstatus = CDFlib (SELECT_, zVAR_, par6, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF2, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, PtensID, value); + +// Pressure Tensor Mag + if ((cstatus = CDFlib (SELECT_, zVAR_, par10, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF2, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + + + nc_put_var_double(ncID, PtensMagID, value); + + + + free(value); +/********************Close Files******************/ + if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); + } + if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK) + cdf_handle_error (cstatus); + + + +} diff --git a/src/DECODERS/themis/themis_fgm2nc.c b/src/DECODERS/themis/themis_fgm2nc.c new file mode 100644 index 0000000..04aa971 --- /dev/null +++ b/src/DECODERS/themis/themis_fgm2nc.c @@ -0,0 +1,347 @@ +/***********************************************************/ +/* THEMIS FGM CDF -> DD netCDF */ +/* NaN -> -1.e31 */ +/* 12.10.2007 */ +/* V 1.0 */ +/***********************************************************/ +#include <stdio.h> +#include <stdlib.h> +#include <netcdf.h> +#include <cdf.h> +#include <DD.h> +#include <string.h> +#include <time.h> +#include <math.h> + +#define TimeGap 1800000.0 +#define Source "themis@cdpp2" +#define MAX_FILE_NAME_LEN 250 // Max. file name length +#define MAX_VARS 250 // Max # of VARS in CDF + + +/************************************* + Global variables and structures +**************************************/ +long CDFDims, // Number of dimensions in a CDF file + CDFVars, // Number of variables in a CDF file + CDFDimSizes[CDF_MAX_DIMS], // Dimension Sizes in a CDF file + CDFencoding, // Data encoding + CDFmajority, // Variable majority + CDFmaxRec, // max Record number + CDFAttrs; // number of CDF Attributes + + +struct cdfvar { // CDF variable structure + char name[CDF_VAR_NAME_LEN+1]; + long num; //variable number + long datatype; + long numElem; // variable dimensionality + long recVariance; // variable rec Variance + long dimVariances[CDF_MAX_DIMS]; // # of data values in dimSizes +} cdfVar[MAX_VARS]; + + +int ncID; +char ncFile[] = "high_000000000.nc"; +int TimeDimID, TimeLengthID, DataID; // ID of netCDF dimensions +int TimeDimVector[2], DataDimVector[2]; // netCDF Dim vectors +size_t Start[2] = {0L,0L}; +size_t TimeCount[2] = {1L,TIMELENGTH}; +size_t DataCount[2] = {1L,3L}; + +char Version[]="v01"; +char ThemisID[]="tha\0"; +char ThemisTime[]="tha_fgh_time"; +char PAR0[]="tha_fgh_gse"; +float FillValue[3] = {-1.e31,-1.e31,-1.e31}; + +int StartTimeID, StopTimeID; +int FGMID; // Data netCDF Variables +int TimeID; // Time netCDF variable + +char StartT[TIMELENGTH]; // Start time from data +char StopT[TIMELENGTH]; // Stop time from data +/************************** + Function prototypes +**************************/ +void usage(); +void cdf_handle_error (CDFstatus); +void nc_handle_error (int); +void removeFilepath(); +void removeCDFext(); +void removeVers(); + +/*--------------------------------------------------------------------------*/ +void usage() +{ + printf ("\nDescription:\n"); + printf ("This program converts a themis CDF file into a netCDF file.\n"); + printf ("\n"); + printf ("Usage: fgm2nc <CDF file name> <ThemisID> <Resolution>\n"); + printf ("\n"); + printf ("Example: fgm2nc testfile tha h\n"); + printf ("\n"); + exit(1); +} +/*-------------------------------------------------------------------------- + * Handles a CDF error. + *--------------------------------------------------------------------------*/ +void cdf_handle_error(CDFstatus status) +{ + + char message[CDF_STATUSTEXT_LEN+1]; + + CDFerror (status, message); /* Get the appropriate message */ + fprintf (stderr, "%s\n", message); + exit(1); +} +/*-------------------------------------------------------------------------- + * Handles a netCDF error. + *--------------------------------------------------------------------------*/ +void nc_handle_error(int status) +{ + fprintf(stderr, "%s\n", nc_strerror(status)); + exit(1); +} +/*-------------------------------------------------------------------------- + * Remove the filepath from a file name. * + * Example: + * /home/data/mydata.txt => mydata.txt + *--------------------------------------------------------------------------*/ +void removeFilepath (char *fileName) +{ + char *ptr; + + ptr = strrchr(fileName, '/'); // Unix file path separator + if (ptr != NULL) + { + ptr++; + strcpy(fileName, ptr); + } +} +/*-------------------------------------------------------------------------- + * Decode CDF File Name * + *--------------------------------------------------------------------------*/ +void removeVers (char *fileName) +{ + char *ptr; + char zero = '\0'; + int i; + + for (i = 0; i < 9; i++) + { + ptr = strchr(fileName, '_'); + if (ptr != NULL) + { + ptr++; + strcpy(fileName, ptr); + } + } + ptr = strchr(fileName, '_'); // + + if (ptr != NULL) + { + ptr++; + strncpy(Version, ptr, 2); + } +} + +/*-------------------------------------------------------------------------- +* Remove the CDF extention * +*--------------------------------------------------------------------------*/ +void removeCDFext (char *fileName) +{ + char *ptr; + char zero = '\0'; + + ptr = strchr(fileName, '.'); + if (ptr != NULL) + strcpy(ptr, &zero); +} +/*-------------------------------------------------------------------------- + * NetCDF File Definition * + *--------------------------------------------------------------------------*/ +void ncdefine(double Time, char *Sampling) +{ + char *s; + time_t p; + int status; + char *STime; + +/*********************** Create netCDF file *****************************/ + STime = Double2DD_Time(Time); + + // memcpy(&(ncFile[3]),&(Sampling[0]), 1); + memcpy(&(ncFile[5]),&(STime[2]), 9); + if ((status = nc_create(ncFile, NC_CLOBBER, &ncID)) != NC_NOERR) + nc_handle_error(status); +/******************netCDF Dimensions *******************************/ + nc_def_dim (ncID, "Time", NC_UNLIMITED, &TimeDimID); + nc_def_dim (ncID, "TimeLength", TIMELENGTH, &TimeLengthID); + nc_def_dim (ncID, "Data",3L, &DataID); + +/********************netCDF Variables ******************/ + TimeDimVector[0] = TimeDimID; + DataDimVector[0] = TimeDimID; + TimeDimVector[1] = TimeLengthID; + DataDimVector[1] = DataID; + + nc_def_var (ncID, "Time", NC_CHAR, 2, TimeDimVector, &TimeID); + nc_def_var (ncID, "gse", NC_FLOAT, 2, DataDimVector, &FGMID); + nc_def_var (ncID, "StartTime",NC_CHAR, 1, &TimeLengthID, &StartTimeID); + nc_def_var (ncID, "StopTime",NC_CHAR, 1, &TimeLengthID , &StopTimeID); + + nc_put_att_text(ncID, NC_GLOBAL, "Themis", 3, ThemisID); + nc_put_att_text(ncID, NC_GLOBAL, "Source", 12, Source); + nc_put_att_text(ncID, NC_GLOBAL, "Resolution", 1, Sampling); + // nc_put_att_text(ncID, NC_GLOBAL, "Version", 2, Version); + nc_put_att_text(ncID, FGMID, "Units", 2, "nT"); + nc_put_att_text(ncID, FGMID, "Frame", 3, "GSE"); + + time(&p); + s = ctime(&p); + nc_put_att_text(ncID, NC_GLOBAL, "Created", 24, s); + nc_enddef(ncID); + nc_put_vara_text(ncID, StartTimeID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time)); + +} +/*--------------------------------------------------------------------------*/ +int main(int argc, char *argv[]) +{ + long RecStart = 0, RecCount, RecCountF = 1, RecInt = 1, MaxRec; + long indices[1] = {0}, counts[1] = {3}, intervals[1] = {1}; + long countsE[1] = {1}, indicesF[2]={0,3}; + double *value; + size_t numElem; + long dimN, varN, par0, par1; + CDFstatus cstatus; // CDF status code + CDFid id; + int i, j, status; + char fileName[MAX_FILE_NAME_LEN]; + char Sampling[1]; + dd_tmstr_t *dtm; + int First = 1; + float par[3]; + long DayOld; + + char *UT; +/*-------------------------------- Arguments Decoding ----------------------------------------*/ + if (argc <= 3) usage(); // CDF input file name and HEMIS Number not specified + else + { + strcpy(fileName, argv[1]); + strncpy(ThemisID, argv[2], 3); + strncpy(Sampling, argv[3], 1); + } + +/*------------------------------------------ CDF Variables Names Updated according to THEMIS Number -------------*/ + + memcpy(&(ThemisTime[2]),&(ThemisID[2]),1); + memcpy(&(PAR0[2]),&(ThemisID[2]),1); + memcpy(&(ThemisTime[6]),&(Sampling[0]),1); + memcpy(&(PAR0[6]),&(Sampling[0]),1); + +/*********************** Open CDF file *****************************/ + if ((cstatus = CDFopen(fileName, &id)) != CDF_OK) + cdf_handle_error(cstatus); + printf(" %s %s\n", argv[2],argv[3]); + +/*********** treat all vars as zVars with eliminated false dimensionality **********/ + + if ((cstatus = CDFlib(SELECT_, CDF_zMODE_, zMODEon2, NULL_)) != CDF_OK) + cdf_handle_error (cstatus); + + // Remove the file path (/home/data/mydata => mydata) + removeFilepath(fileName); + // Remove Version Number + removeVers(fileName); + + // Remove .cdf extension + removeCDFext(fileName); + +/************************ Get CDF Data ************************************/ + + if ((cstatus = CDFlib(GET_, zVAR_NUMBER_, ThemisTime, &varN, NULL_)) != CDF_OK) + cdf_handle_error(cstatus) ; + if ((cstatus = CDFlib( SELECT_, zVAR_, varN, + GET_, zVAR_MAXREC_, &MaxRec, NULL_)) != CDF_OK) + cdf_handle_error(cstatus) ; + + if ((cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR0, &par0, NULL_)) != CDF_OK) + cdf_handle_error(cstatus) ; + + if ((cstatus = CDFlib( SELECT_, zVAR_, par0, + GET_, zVAR_DIMSIZES_, CDFDimSizes, NULL_)) != CDF_OK) + cdf_handle_error (cstatus) ; + + RecCount = (long)(MaxRec+1); + printf(" Max Rec %d\n", MaxRec); + if (MaxRec > 1) + { + value = (double *)malloc(sizeof(double)* RecCount); + if ((cstatus = CDFlib (SELECT_, + zVAR_, varN, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) != CDF_OK) + cdf_handle_error (cstatus); + + for (i = 0; i < RecCount; i++) + { + UT = Double2DD_Time(value[i]); + dtm = ReadTime(UT); + + if (i > 0 && (value[i]-value[i-1]) > TimeGap) + { + printf(" !!! Time GAP -> %f min\n", (value[i]-value[i-1])/60.0); + nc_put_vara_text(ncID,StopTimeID,&Start[1],&TimeCount[1], Double2DD_Time(dtm->times)); + if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); + } + + if (First == 1) + { + ncdefine(dtm->times, Sampling); + First = 0; + DayOld = dtm->day; + } + + if (i > 0 && (value[i]-value[i-1]) > TimeGap) + { + ncdefine(dtm->times, Sampling); + Start[0] = 0L; + } + nc_put_vara_text(ncID, TimeID, Start, TimeCount, Double2DD_Time(dtm->times)); + + RecStart = (long)i; + + if ((cstatus = CDFlib (SELECT_, zVAR_, par0, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCountF, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indicesF, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, par, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + if (!isnan(par[0])) + nc_put_vara_float(ncID, FGMID, Start, DataCount, par); + else + nc_put_vara_float(ncID, FGMID, Start, DataCount, FillValue); + + Start[0]++; + DayOld = dtm->day; + } + nc_put_vara_text(ncID,StopTimeID,&Start[1],&TimeCount[1], Double2DD_Time(dtm->times)); + free(value); + + if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); + } + +/********************Close Files******************/ + if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK) + cdf_handle_error (cstatus); +} diff --git a/src/DECODERS/themis/themis_sst2nc.c b/src/DECODERS/themis/themis_sst2nc.c new file mode 100644 index 0000000..cbc5e4c --- /dev/null +++ b/src/DECODERS/themis/themis_sst2nc.c @@ -0,0 +1,355 @@ + /**************************************************************/ + /* THEMIS SST CDF -> DD netCDF */ + /* 04.01.2008 */ + /* V 1.1 */ + /* Energy in info file */ + /* New CDF with ALL modes and new params */ + /**************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <netcdf.h> +#include <cdf.h> +#include <DD.h> +#include <string.h> +#include <time.h> +#include <math.h> + +#define TimeGap 3600.0 +#define Source "themis@cdpp2" +#define MAX_FILE_NAME_LEN 250 // Max. file name length +#define MAX_VARS 250 // Max # of VARS in CDF + + +/************************************* + Global variables and structures +**************************************/ +long CDFDims, // Number of dimensions in a CDF file + CDFVars, // Number of variables in a CDF file + CDFDimSizes[CDF_MAX_DIMS], // Dimension Sizes in a CDF file + CDFencoding, // Data encoding + CDFmajority, // Variable majority + CDFmaxRec, // max Record number + CDFAttrs; // number of CDF Attributes + + +struct cdfvar { // CDF variable structure + char name[CDF_VAR_NAME_LEN+1]; + long num; // Variable number + long datatype; + long numElem; // variable dimensionality + long recVariance; // variable rec Variance + long dimVariances[CDF_MAX_DIMS]; // # of data values in dimSizes +} cdfVar[MAX_VARS]; + +char mode[4]; +int ncID; +char ncFile[] = "psif_000000000.nc"; +int TimeDimID, TimeLengthID, FluxDimID; +int TimeDimVector[2], FluxDimVector[2]; // netCDF Dim vectors + +size_t Start[2] = {0L,0L}; +size_t TimeCount[2] = {1L,TIMELENGTH}; +size_t FluxCount[2] = {1L,16L}; + +CDFstatus cstatus; // CDF status code + +char Version[]="v01"; +char ThemisID[]="tha\0"; +char ThemisTime[]="tha_psif_time"; +char PAR0[]="tha_psif_delta_time"; +char PAR1[]="tha_psif_density"; +char PAR2[]="tha_psif_en_eflux"; + +int StartTimeID, StopTimeID; +int StartTimeSpID, StopTimeSpID; +int DeltaTID, DensID, AvTempID, ThVelID, PotID, CurrID, SymAngID; // 1D +int MfTempID, TempID, ModeID, ModeSpID, VelID, Flux2ID, SymmID; // 2D -> 3 +int prTenID, mfTenID; // 2D -> 6 +int FluxID; // 2D -> 32 +int TimeID; // Time netCDF variable +int TimeSpID; + +char StartT[TIMELENGTH]; // Start time from data +char StopT[TIMELENGTH]; // Stop time from data +/************************** + Function prototypes +**************************/ +void usage(); +void cdf_handle_error (CDFstatus); +void nc_handle_error (int); +void removeFilepath(); +void removeCDFext(); +void removeVers(); +void ncdefine(); +/*--------------------------------------------------------------------------*/ +void usage() +{ + printf ("\nDescription:\n"); + printf ("This program converts a themis CDF file into a netCDF file.\n"); + printf ("\n"); + printf ("Usage: esa2nc <CDF file name> <ThemisID> <mode>\n"); + printf ("\n"); + printf ("Example: esa2nc testfile tha peif\n"); + printf ("\n"); + exit(1); +} +/*-------------------------------------------------------------------------- + * Handles a CDF error. + *--------------------------------------------------------------------------*/ +void cdf_handle_error(CDFstatus status) +{ + + char message[CDF_STATUSTEXT_LEN+1]; + + CDFerror (status, message); /* Get the appropriate message */ + fprintf (stderr, "CDF: %s\n", message); + // exit(1); +} +/*-------------------------------------------------------------------------- + * Handles a netCDF error. + *--------------------------------------------------------------------------*/ +void nc_handle_error(int status) +{ + fprintf(stderr, "%s\n", nc_strerror(status)); + exit(1); +} + +/*-------------------------------------------------------------------------- + * NetCDF File Definition * + *--------------------------------------------------------------------------*/ +void ncdefine(double Time) +{ + char *s; + time_t p; + int status; + char *STime; + +/*********************** Create netCDF file *****************************/ + memcpy(&(ncFile[0]),&(mode[0]), 4); + STime = Double2DD_Time(Time); + memcpy(&(ncFile[5]),&(STime[2]), 9); + if ((status = nc_create(ncFile, NC_CLOBBER, &ncID)) != NC_NOERR) + nc_handle_error(status); +/******************netCDF Dimensions *******************************/ + nc_def_dim (ncID, "Time", NC_UNLIMITED, &TimeDimID); + nc_def_dim (ncID, "TimeLength", TIMELENGTH, &TimeLengthID); + nc_def_dim (ncID, "Flux", 16L, &FluxDimID); + +/********************netCDF Variables ******************/ + TimeDimVector[0] = TimeDimID; + TimeDimVector[1] = TimeLengthID; + FluxDimVector[0] = TimeDimID; + FluxDimVector[1] = FluxDimID; + + nc_def_var (ncID, "Time", NC_CHAR, 2, TimeDimVector, &TimeID); + + nc_def_var (ncID, "DeltaT", NC_DOUBLE, 1, &TimeDimID, &DeltaTID); + nc_def_var (ncID, "density", NC_DOUBLE, 1, &TimeDimID, &ModeID); + nc_def_var (ncID, "en_eflux", NC_DOUBLE, 2, FluxDimVector, &FluxID); + + nc_def_var (ncID, "StartTime",NC_CHAR, 1, &TimeLengthID, &StartTimeID); + nc_def_var (ncID, "StopTime",NC_CHAR, 1, &TimeLengthID , &StopTimeID); + + nc_put_att_text(ncID, NC_GLOBAL, "Themis", 3, ThemisID); + nc_put_att_text(ncID, NC_GLOBAL, "Source", 12, Source); + nc_put_att_text(ncID, FluxID, "Units", 17, "eV/(cm^2-s-sr-eV)"); + + time(&p); + s = ctime(&p); + nc_put_att_text(ncID, NC_GLOBAL, "Created", 24, s); + + status = nc_enddef(ncID); + + nc_put_vara_text(ncID, StartTimeID, &(Start[1]), &(TimeCount[1]), Double2DD_Time(Time)); +} + +void put_double(RecStart, RecCount, ParCDF, ParNC) +{ + long RecInt = 1; + long indices[1] = {0}, intervals[1] = {1}, counts[1] = {1}; + + double *value; + + value = (double *)malloc(sizeof(double)*RecCount); + if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + nc_put_var_double(ncID, ParNC, value); + + free(value); +} + + +void put_mode(RecStart, RecCount, ParCDF, ParNC) +{ + float *value; + long indices[2] = {0,3}, intervals[1] = {1}, counts[1] = {3}; + long RecInt = 1; + + value = (float *)malloc(sizeof(float) * RecCount *3); + if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + nc_put_var_float(ncID, ParNC, value); + + free(value); +} + +void put_spectra(RecStart, RecCount, ParCDF, ParNC) +{ + double *value; + long indices[2] = {0,16}, intervals[1] = {1}, counts[1] = {16}; + long RecInt = 1; + + value = (double *)malloc(sizeof(double)*RecCount*16); + if ((cstatus = CDFlib (SELECT_, zVAR_, ParCDF, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, counts, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_)) + != CDF_OK) cdf_handle_error(cstatus); + nc_put_var_double(ncID, ParNC, value); + free(value); +} + +/*--------------------------------------------------------------------------*/ +int main(int argc, char *argv[]) +{ + long RecStart = 0, RecCount, RecCountF = 1, RecInt = 1, MaxRec; + long indices[1] = {0}, counts[1] = {3}, counts2[1] = {6}, countsFlux[1] = {32}, intervals[1] = {1}; + long countsE[1] = {1}, indicesF[2]={0,3}, indicesF2[2]={0,6}, indicesFlux[2] = {0, 32}; + double *value; + float *value_f; + size_t numElem; + long dimN, varN, par0, par1, par2; + + CDFid id; + int i, j, status; + char fileName[MAX_FILE_NAME_LEN]; + dd_tmstr_t *dtm; + int First = 1; + double DayOld; + + char *UT; + char data_set[8]="thx_psxf"; +/*-------------------------------- Arguments Decoding ----------------------------------------*/ + if (argc <= 3) usage(); // CDF input file name and THEMIS Number not specified + else + { + strcpy(fileName, argv[1]); + strncpy(ThemisID,argv[2],3); + strncpy(mode,argv[3],4); + } + +/*------------------------------------------ CDF Variables Names Updated according to THEMIS Number -------------*/ + + memcpy(&(data_set[2]),&(ThemisID[2]),1); + memcpy(&(data_set[6]),&(mode[2]),2); + + memcpy(&(ThemisTime[0]),&(data_set[0]),8); + memcpy(&(PAR0[0]),&(data_set[0]),8); + memcpy(&(PAR1[0]),&(data_set[0]),8); + memcpy(&(PAR2[0]),&(data_set[0]),8); + +/*********************** Open CDF file *****************************/ + if ((cstatus = CDFopen(fileName, &id)) != CDF_OK) + cdf_handle_error(cstatus); + printf(" THEMIS %s %s\n", ThemisID, mode); + +/*********** treat all vars as zVars with eliminated false dimensionality **********/ + + if ((cstatus = CDFlib(SELECT_, CDF_zMODE_, zMODEon2, NULL_)) != CDF_OK) + cdf_handle_error (cstatus); + +/************************ Get CDF Data ************************************/ + + cstatus = CDFlib(GET_, zVAR_NUMBER_, ThemisTime, &varN, NULL_); + cstatus = CDFlib( SELECT_, zVAR_, varN, GET_, zVAR_MAXREC_, &MaxRec, NULL_); + + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR0, &par0, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR1, &par1, NULL_); + cstatus = CDFlib(GET_, zVAR_NUMBER_, PAR2, &par2, NULL_); + + + RecCount = (long)(MaxRec+1); + printf(" Max Rec %d\n", MaxRec); + if (MaxRec > 1) + { + value = (double *)malloc(sizeof(double)* RecCount); + if ((cstatus = CDFlib (SELECT_, + zVAR_, varN, + zVAR_RECNUMBER_, RecStart , + zVAR_RECCOUNT_, RecCount, + zVAR_RECINTERVAL_, RecInt, + zVAR_DIMINDICES_, indices, + zVAR_DIMCOUNTS_, countsE, + zVAR_DIMINTERVALS_, intervals, + GET_, zVAR_HYPERDATA_, value, NULL_) ) + != CDF_OK) cdf_handle_error(cstatus); + + for (i = 0; i < RecCount; i++) + { + UT = Double2DD_Time(value[i]); + + if ((First == 0) && (value[i] - DayOld) > TimeGap) + { + printf("GAP %f\n",(value[i] - DayOld)/60.0); + // put_double(RecStart, (long)i - RecStart, par0, DeltaTID); + // put_mode(RecStart, (long)i - RecStart, par1, ModeID, ModeSpID); + put_spectra(RecStart, (long)i - RecStart, par2, FluxID); + + nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], Double2DD_Time(DayOld)); + + if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); + + First = 1; + RecStart = (long)i; + UT = Double2DD_Time(value[i]); + } + + dtm = ReadTime(UT); + if (First == 1) { + ncdefine(dtm->times); + + First = 0; + Start[0] = 0; + } + + nc_put_vara_text(ncID, TimeID, Start, TimeCount, UT); + + Start[0]++; + DayOld = value[i]; + } + + free(value); + nc_put_vara_text(ncID,StopTimeID, &Start[1], &TimeCount[1], UT); + + + // put_double(RecStart, RecCount - RecStart, par0, DeltaTID); + // put_mode(RecStart, RecCount - RecStart, par1, ModeID, ModeSpID); + put_spectra(RecStart, RecCount - RecStart, par2, FluxID); +/********************Close Files******************/ + + if ((status = nc_close(ncID)) != NC_NOERR) nc_handle_error(status); + } + + if ((cstatus = CDFlib(CLOSE_, CDF_, NULL_)) != CDF_OK) + cdf_handle_error (cstatus); + +} diff --git a/src/REMOTEDATA/CDAWebConfigClass.php b/src/REMOTEDATA/CDAWebConfigClass.php index 868ffe7..60bb7ff 100644 --- a/src/REMOTEDATA/CDAWebConfigClass.php +++ b/src/REMOTEDATA/CDAWebConfigClass.php @@ -19,4 +19,5 @@ class CDAWebConfigClass // Service to get SPASE description by SPASE ID (from $spaseRegistry) public static $spaseResolver = "http://www.spase-group.org/registry/resolver?"; public static $format = "CDF"; -} \ No newline at end of file +} +?> diff --git a/src/REMOTEDATA/THEMIS.php b/src/REMOTEDATA/THEMIS.php new file mode 100644 index 0000000..b220cff --- /dev/null +++ b/src/REMOTEDATA/THEMIS.php @@ -0,0 +1,213 @@ +<?php +/** + * @class THEMIS + * @brief THEMIS + * @details + */ +class THEMIS extends RemoteDataCenterClass +{ + // /THEMIS_B1/themisdata + + protected $baseMgr; + protected $domTemplate; + + + public function init() + { + error_log("THEMIS Proxy creation on ".date("Y-m-d\TH:i:s").PHP_EOL,3,log); + error_log("THEMIS Proxy creation on ".date("Y-m-d\TH:i:s").PHP_EOL,3,err); + + } + + protected function getRemoteTree() + { + if (!file_exists(ThemisConfigClass::$TemplateXml)) { + error_log('Cannot find THEMIS tree template'.PHP_EOL,3,err); + exit('Cannot find THEMIS tree template'); + } + + $this->domTemplate = new DomDocument("1.0"); + if (!$this->domTemplate->load(ThemisConfigClass::$TemplateXml)) { + error_log('Cannot load THEMIS tree template'.PHP_EOL,3,err); + exit('Cannot load THEMIS tree template'); + } + } + + /* + * create base.xml from themis template xml + */ + protected function createMissionNodes() + { + $missionNodes = array(); + + $this->baseMgr = new DDBaseMgr(); + foreach (ThemisConfigClass::$themis as $suffix) + { + $mission = $this->domAmda->importNode($this->domTemplate->getElementsByTagName("mission")->item(0), true); + $template = $mission->getAttribute("name"); + $mission->setAttribute('name', str_replace("XXX", $suffix, $template)); + $mission->setAttribute('desc', str_replace("XXX", $suffix, $template)); + $template = $mission->getAttribute("xml:id"); + $mission->setAttribute('xml:id', str_replace("xxx", strtolower($suffix), $template)); + $instruments = $mission->getElementsByTagName("instrument"); + foreach ($instruments as $instrument) { + $template = $instrument->getAttribute("xml:id"); + $instrument->setAttribute('xml:id', str_replace("xxx", strtolower($suffix), $template)); + $datasets = $instrument->getElementsByTagName("dataset"); + foreach ($datasets as $dataset) { + $template = $dataset->getAttribute("xml:id"); + $dataset->setAttribute('xml:id', str_replace("xxx", strtolower($suffix), $template)); + $template = $dataset->getAttribute("rem_id"); + $dataset->setAttribute('rem_id', str_replace("xxx", strtolower($suffix), $template)); + $this->updateGlobalStartStop($dataset); + $this->createVi($dataset); + + $ncFiles = $this->getData($remSetID, $start, $stop); + $params = $dataset->getElementsByTagName("parameter"); + foreach ($params as $param) { + $template = $param->getAttribute("xml:id"); + $param->setAttribute('xml:id', str_replace("xxx", strtolower($suffix), $template)); + } + } + } + $missionNodes[] = $mission; + } + return $missionNodes; + } + + protected function updateGlobalStartStop($dataset) + { + $rem_id = $dataset->getAttribute('rem_id'); + $ViId = strtr(substr($dataset->getAttribute('xml:id'),7),":","_"); + + $dataset->setAttribute('dataStart',$this->getGlobalStart($rem_id)); + $dataset->setAttribute('dataStop',$this->getGlobalStop($rem_id)); + } + + protected function getGlobalStart($id) + { + $startTime = "1970-01-01T00:00:00.000Z"; + $datasetDir = ThemisConfigClass::$NFS_DIR."/".strtr($id,"_" , "/" )."/".ThemisConfigClass::$START_YEAR; + if (is_dir($datasetDir)) { + $fileNames = glob($datasetDir."/".$id."*.".ThemisConfigClass::$format); + // Get Start Time from the First File Name + $pos = strpos($fileNames[0],$id) + strlen($id) + 1; + $firstTime = substr($fileNames[0], $pos, 8); + $startTime = substr($firstTime,0,4)."-".substr($firstTime,4,2)."-".substr($firstTime,6,2)."T00:00:00.000Z"; + } + + return $startTime ; + } + + protected function getGlobalStop($id) + { + $stopTime = "1970-01-01T00:00:00.000Z"; + $datasetDir = ThemisConfigClass::$NFS_DIR."/".strtr($id,"_" , "/" )."/".date('Y'); + if (is_dir($datasetDir)) { + $fileNames = glob($datasetDir."/".$id."*.".ThemisConfigClass::$format); + // Get Stop Time from the Last File Name + $pos = strpos($fileNames[count($fileNames)-1],$id) + strlen($id) + 1; + $lastTime = substr($fileNames[count($fileNames)-1], $pos, 8); + $stopTime = substr($lastTime,0,4)."-".substr($lastTime,4,2)."-".substr($lastTime,6,2)."T23:59:59.000Z"; + } + + return $stopTime ; + } + + protected function createVi($dataset) + { + $ViId = strtr(substr($dataset->getAttribute('xml:id'),7),":","_"); + $globalStart = $dataset->getAttribute('dataStart'); + $globalStop = $dataset->getAttribute('dataStop'); + echo $globalStart." ".$globalStop.PHP_EOL; + if ($this->baseMgr->viExists($ViId, $this->baseID)) { + // error_log + // updateStartStop + + return; + } + $info = explode("_", $ViId); + + $this->baseMgr->setViId($ViId); + $rem_id = $dataset->getAttribute('rem_id').":".$info[2]; + $this->baseMgr->setRemoteViId($rem_id); + $this->baseMgr->setViInfo($info[2]); + $this->baseMgr->setViParentsInfo($this->baseID, $info[0], $info[1]); + + $this->baseMgr->setViLocation($this->baseID."/".$info[0], $info[1]."/".$info[2]."/"); + $min_sampling = $dataset->getAttribute('minSampling'); + $max_sampling = $dataset->hasAttribute('maxSampling') ? $dataset->getAttribute('maxSampling') : 0 ; + $this->baseMgr->setViSampling($min_sampling, $max_sampling); + $this->baseMgr->globalStart = $globalStart; + $this->baseMgr->globalStop = $globalStop; + + $this->baseMgr->createVi(); + + $ncFiles = array(); + $start = $globalStart; + + while (count($ncFiles) == 0) { + // get the very first data file + $stop = $start; + $ncFiles = $this->getData($rem_id, $start, $stop); + + $newStart = strtotime($start); + $newStart += 24*60*60; + $start = date("Y-m-d\TH:i:s",$newStart); + } + + $this->baseMgr->addRemoteData($rem_id, $ncFiles, $globalStart, $globalStart, false); + + $this->baseMgr->updateRemoteStart(); + } + + protected function setDataCenterAttributes(){ + $this->dataCenter->setAttribute('xml:id', $this->baseID); + $this->dataCenter->setAttribute('name', $this->baseID."_iRAP"); + } + + protected function makeArgumentsList(){} + + public function getData($remId, $start, $stop) + { + $info = explode(":", $remId); + $rem_id = $info[0]; + $mode = $info[1]; + + $info_1 = explode("_", $rem_id); + $mission = $info_1[0]; + + $sourceDir = ThemisConfigClass::$NFS_DIR."/".strtr($rem_id,"_" , "/" ); + // Which files + $currTime = strtotime($start); + $stopTime = strtotime($stop); + +// $currTime -= 3600.0; + + while ($currTime <= $stopTime ) { + $fileName = $sourceDir."/".date('Y', $currTime)."/".$rem_id."_".date('Ymd', $currTime)."_v01.cdf"; + if (file_exists($fileName)) { + system(ThemisConfigClass::$program[$mode]." ".$fileName." ".$mission." ".$mode); + } + else { + // fprintf($STDERR,"NO SUCH FILE $fileName \n"); + } + $currTime += 24*60*60; + } + + $files = glob($mode."*.nc"); + + return $files; + } + + public function monitor() + { + // check if NFS connection ok + if (glob(ThemisConfigClass::$NFS_DIR . "/*")) + return true; + + return false; + } +} +?> + diff --git a/src/REMOTEDATA/ThemisConfigClass.php b/src/REMOTEDATA/ThemisConfigClass.php new file mode 100644 index 0000000..c3aa5e8 --- /dev/null +++ b/src/REMOTEDATA/ThemisConfigClass.php @@ -0,0 +1,26 @@ +<?php + +/** + * @class ThemisConfigClass + * @brief Class that's contain all specific configuration of the IRAP Themis Mirror Site + * @details + */ + +class ThemisConfigClass +{ + // apus : sudo mount -t nfs rosina1.irap.omp.eu:/ROSINA_B1/themisdata /THEMIS_B1/themisdata -v -o nfsvers=3,vers=3 + + public static $NFS_DIR = "/THEMIS_B1/themisdata"; + public static $level = "l2"; + public static $format = "cdf"; + public static $themis = array('A'); //, 'B', 'C', 'D', 'E'); + public static $TemplateXml = "ThemisTreeTemplate.xml"; + public static $START_YEAR = "2007"; + public static $program = array('peim' => 'themis_esamom2nc', 'peem' => 'themis_esamom2nc', + 'peif' => 'themis_esa2nc', 'peef' => 'themis_esa2nc', + 'peir' => 'themis_esa2nc', 'peer' => 'themis_esa2nc', + 'peib' => 'themis_esa2nc', 'peeb' => 'themis_esa2nc', + 'psif' => 'themis_sst2nc', 'psef' => 'themis_sst2nc', + 'high' => 'themis_fgm2nc', 'low' => 'themis_fgm2nc'); +} +?> diff --git a/src/REMOTEDATA/ThemisTreeTemplate.xml b/src/REMOTEDATA/ThemisTreeTemplate.xml new file mode 100644 index 0000000..1a61f91 --- /dev/null +++ b/src/REMOTEDATA/ThemisTreeTemplate.xml @@ -0,0 +1,47 @@ +<?xml version="1.0"?> +<dataCenter name="THEMIS" xml:id="THEMIS-IRAP" desc="Mirror IRAP Data Base"> + <mission name="THEMIS-XXX" xml:id="THEMIS-xxx" desc="THEMIS-XXX"> + <instrument name="ESA" xml:id="THEMIS-xxx-esa" desc="Electrostatic Analyser"> + <dataset name="ion reduced" xml:id="THEMIS-thxxx:esa:peir" minSampling="3" rem_id="thxxx_l2_esa"> + <parameter name="ion density" units="cm-3" xml:id="thxxx_peir_density"/> + <parameter name="ion v gse" units="km/s" size="3" labels="vx_gse,vy_gse,vz_gse" xml:id="thxxx_peir_velocity_gse"/> + <parameter name="ion temperature" units="eV" size="3" labels="t_para,t_perp1,t_perp2" xml:id="thxxx_peir_t3"/> + <parameter name="ion eflux" display_type="spectrogram" units="eV/(cm^2-s-sr-eV)" size="32" xml:id="thxxx_peir_en_eflux"/> + <parameter name="sc_potential" units="V" xml:id="thxxx_peir_sc_pot"/> + </dataset> + <dataset name="electron reduced" xml:id="THEMIS-thxxx:esa:peer" minSampling="3" rem_id="thxxx_l2_esa"> + <parameter name="elec density" units="cm-3" xml:id="thxxx_peer_density"/> + <parameter name="elec temperature" units="eV" size="3" labels="t_para,t_perp1,t_perp2" xml:id="thxxx_peer_t3"/> + <parameter name="elec eflux" display_type="spectrogram" units="eV/(cm^2-s-sr-eV)" size="32" xml:id="thxxx_peer_en_eflux"/> + </dataset> + <dataset name="ion full" xml:id="THEMIS-thxxx:esa:peif" minSampling="96.27" maxSampling="385.1" rem_id="thxxx_l2_esa"> + <parameter name="ion density" units="cm-3" xml:id="thxxx_peif_density"/> + <parameter name="ion v gse" units="km/s" size="3" labels="vx_gse,vy_gse,vz_gse" xml:id="thxxx_peif_velocity_gse"/> + <parameter name="ion temperature" units="eV" size="3" labels="t_para,t_perp1,t_perp2" xml:id="thxxx_peif_t3"/> + <parameter name="ion eflux" display_type="spectrogram" units="eV/(cm^2-s-sr-eV)" size="32" xml:id="thxxx_peif_en_eflux"/> + <parameter name="sc_potential" units="V" xml:id="thxxx_peif_sc_pot"/> + </dataset> + <dataset name="ion burst" xml:id="THEMIS-thxxx:esa:peib" minSampling="3" rem_id="thxxx_l2_esa"> + <parameter name="ion density" units="cm-3" xml:id="thxxx_peib_density"/> + <parameter name="ion eflux" display_type="spectrogram" units="eV/(cm^2-s-sr-eV)" size="32" xml:id="thxxx_peib_en_eflux"/> + </dataset> + <dataset name="elec burst" xml:id="THEMIS-thxxx:esa:peeb" minSampling="3" rem_id="thxxx_l2_esa"> + <parameter name="elec density" units="cm-3" xml:id="thxxx_peeb_density"/> + <parameter name="elec eflux" display_type="spectrogram" units="eV/(cm^2-s-sr-eV)" size="32" xml:id="thxxx_peeb_en_eflux"/> + </dataset> + </instrument> + <instrument name="FGM" xml:id="THEMIS-xxx-fgm" desc="Fluxgate Magnetometer"> + <dataset name="fgm high" xml:id="THEMIS-thxxx:fgm:high" minSampling="0.08" rem_id="thxxx_l2_fgm"> + <parameter name="b gse" units="nT" size="3" labels="bx,by,bz" xml:id="thxxx_fgh_gse"/> + </dataset> + </instrument> + <instrument name="SST" xml:id="THEMIS-xxx-sst" desc="Solid State Telescope"> + <dataset name="ions" xml:id="THEMIS-thxxx:sst:psif" minSampling="3" maxSampling="192" rem_id="thxxx_l2_sst"> + <parameter name="ion eflux" display_type="spectrogram" units="eV/(cm^2-s-sr-eV)" size="16" xml:id="thxxx_psif_en_eflux"/> + </dataset> + <dataset name="electrons" xml:id="THEMIS-thxxx:sst:psef" minSampling="3" maxSampling="192" rem_id="thxxx_l2_sst"> + <parameter name="elec eflux" display_type="spectrogram" units="eV/(cm^2-s-sr-eV)" size="16" xml:id="thxxx_psef_en_eflux"/> + </dataset> + </instrument> + </mission> +</dataCenter> -- libgit2 0.21.2