getInputs.cpp 10.1 KB
////////////////
// CPP HEADER //
////////////////
#include <iostream>
#include <string>
#include <vector>
#include <fstream>

////////////
/// DDLIB //
////////////
#include "DD.h"

using namespace std;

///////////////////////////
/// FUNCTIONS PROTOTYPES //
//////////////////////////
void getPlasmaData(string plasmaVi, string ddStart, string ddInterval,
	string timeParameter, string vnormParameter, string rampParameter,
	string velParameter, string magParameter,
	vector<string>& plasmaTimeArray, vector<float>& vnormArray,
	vector<float>& rampArray, 
	vector<float>& vxArray, vector<float>& vyArray, vector<float>& vzArray,
	vector<float>& bxArray, vector<float>& byArray, vector<float>& bzArray);


void getOrbitData(string satelliteVi, string ddStart, string ddInterval,
	string timeParameter, string orbitParameter, 
	vector<string>& satelliteTimeArray,
	vector<float>& x, vector<float>& y, vector<float>& z);


void getSymIndexData(string symIndexVi, string ddStart, string ddInterval,
	string timeParameter, string symIndexParameter, 
	vector<string>& symIndexTimeArray, vector<float>& symIndexArray);


///////////
/// MAIN //
///////////
int main(int argc, char const *argv[])
{
	// CHECK ARGS
	if (argc != 11)
	{
		cerr << "[ERROR] Usage : GetData (Plasma VI) (Plasma DD Start) (Plasma DD Interval) (Satellite VI) (Satellite Orbit parameter) (Satellite DD Start) (Satellite DD Interval) (Sym Index VI) (Sym Index DD Start) (Sym Index DD Interval)" << endl;
		exit(EXIT_FAILURE);
	}

	// CONSTANTS
	string timeParameter  = "Time";
	string plasmaVNorm    = "V";
	string plasmaRamP     = "RamP";
	string plasmaVel      = "Vel";
	string plasmaMag      = "B";
	string indexSym       = "SYM";

	// GET PLASMA DATA
	string plasmaVi      = argv[1];
	string pddStart      = argv[2];
	string pddInterval   = argv[3];

	vector<string> plasmaTimeArray; 
	vector<float> vnormArray,rampArray, vx, vy, vz, bx, by, bz;

	getPlasmaData(plasmaVi, pddStart, pddInterval,
	timeParameter, plasmaVNorm, plasmaRamP, plasmaVel, plasmaMag,
	plasmaTimeArray, vnormArray, rampArray, vx, vy, vz, bx, by, bz);

	ofstream plasmaData("plasma.txt", ios::out | ios::trunc);
	
	int plasmaSize = plasmaTimeArray.size();

	plasmaData << "Time,V,ramP,vx,vy,vz,bx,by,bz" << endl; 

	for (int i = 0; i < plasmaSize; ++i)
	{
		plasmaData << plasmaTimeArray[i] << "," 
					<< vnormArray[i] << "," 
					<< rampArray[i] << "," 
					<< vx[i] << "," << vy[i] << "," << vz[i] << "," 
					<< bx[i] << "," << by[i] << "," << bz[i] << endl;
	}

	plasmaData.close();

	cout << "getPlasmaData ok"<< endl;

	// GET SATELLITE DATA
	string satelliteVi       = argv[4];
	string satelliteOrbParam = argv[5];
	string satddStart        = argv[6];
	string satddInterval     = argv[7];
	
	vector<string> satelliteTimeArray;
	vector<float> x, y, z;

	getOrbitData(satelliteVi, satddStart, satddInterval,
	timeParameter, satelliteOrbParam, satelliteTimeArray, 
	x, y, z);

	ofstream satelliteData("orbit.txt", ios::out | ios::trunc);
	
	int satelliteSize = satelliteTimeArray.size();

	satelliteData << "Time,x,y,z" << endl;

	for (int i = 0; i < satelliteSize; ++i)
	{
		satelliteData << satelliteTimeArray[i] << "," 
					<< x[i] << "," << y[i] << "," << z[i] << endl;
	}

	satelliteData.close();

	cout << "getOrbitData ok"<< endl;

	// GET SYM H DATA
	string indexVi       = argv[8];
	string symddStart    = argv[9];
	string symddInterval = argv[10];

	vector<string> symIndexTimeArray;
	vector<float> symIndexArray;

	getSymIndexData(indexVi, symddStart, symddInterval, 
	timeParameter, indexSym, 
	symIndexTimeArray, symIndexArray);

	cout << "getSymIndexData ok"<< endl;
	
	ofstream symData("sym.txt", ios::out | ios::trunc);
	
	int symSize = symIndexTimeArray.size();

	symData << "Time,symIndex" << endl;

	for (int i = 0; i < symSize; ++i)
	{
		symData << symIndexTimeArray[i] << "," << symIndexArray[i] << endl;
	}

	symData.close();

	return 0;
}



////////////////////////////
/// FUNCTIONS DEFINITIONS //
////////////////////////////
void getPlasmaData(string plasmaVi, string ddStart, string ddInterval,
	string timeParameter, string vnormParameter, string rampParameter,
	string velParameter, string magParameter,
	vector<string>& plasmaTimeArray, vector<float>& vnormArray,
	vector<float>& rampArray, 
	vector<float>& vxArray, vector<float>& vyArray, vector<float>& vzArray,
	vector<float>& bxArray, vector<float>& byArray, vector<float>& bzArray)
{
	int id = DD_SetVariable( const_cast<char*>( plasmaVi.c_str() ) );

	cout << "getPlasmaData id : "<< id << endl;

	char *st = const_cast<char*>( ddStart.c_str() );

	cout << "getPlasmaData st : "<< st << endl;

	int error = DD_SetTime(id, st);

	cout << "getPlasmaData error : "<< error << endl;

	if (error < 0)
	{
		std::string ddSetTimeErr = "[ERROR] getPlasmaData : bad time pointer init in DD_SetTime -> err value : " +  error;
		throw std::string(ddSetTimeErr);
	}

	// GET DATA
	char *params[5];
	
	params[0] = const_cast<char*>( timeParameter.c_str() );
	params[1] = const_cast<char*>( vnormParameter.c_str() );
	params[2] = const_cast<char*>( rampParameter.c_str() );
	params[3] = const_cast<char*>( velParameter.c_str() );
	params[4] = const_cast<char*>( magParameter.c_str() );
	
	char *timeIntervall = const_cast<char*>( ddInterval.c_str() );
	
	DD_data_t *data;

	int status = 0;

	do {

		status = DD_GetMultiData(id, 5, static_cast<char**>(params), timeIntervall, &data, 1);
		
		if (status < 0)
		{
			std::string ddGetDataErr = "[ERROR] getPlasmaData : failed to get data -> status : " + status;
			throw std::string(ddGetDataErr);
		}

		for (int j = 0; j < data->VarNumber; ++j)
		{
			plasmaTimeArray.push_back( static_cast<char*>(data[0].Variables[j]) );
		  	vnormArray.push_back( *(static_cast<float*>(data[1].Variables[j])) );
			rampArray.push_back( *(static_cast<float*>(data[2].Variables[j])) );
			vxArray.push_back( static_cast<float*>(data[3].Variables[j])[0] );
		  	vyArray.push_back( static_cast<float*>(data[3].Variables[j])[1] );
		  	vzArray.push_back( static_cast<float*>(data[3].Variables[j])[2] );
		  	bxArray.push_back( static_cast<float*>(data[4].Variables[j])[0] );
		  	byArray.push_back( static_cast<float*>(data[4].Variables[j])[1] );
		  	bzArray.push_back( static_cast<float*>(data[4].Variables[j])[2] );

		}


	} while (status == MOREDATA);
	
    DD_Close(id);
}

void getOrbitData(string satelliteVi, string ddStart, string ddInterval,
				string timeParameter, string orbitParameter, 
				vector<string>& satelliteTimeArray,
				vector<float>& x, vector<float>& y, vector<float>& z)
{
	int id = DD_SetVariable( const_cast<char*>( satelliteVi.c_str() ) );

	cout << "getOrbitData id : "<< id << endl;

    char *st = const_cast<char*>( ddStart.c_str() );

    cout << "getOrbitData st : " << st<< endl;

	int error = DD_SetTime(id, st);

	cout << "getOrbitData error: " << error<< endl;

	if (error < 0)
	{
		std::string ddSetTimeErr = "[ERROR] getOrbitData : bad time pointer init in DD_SetTime -> err value : " +  error;
		throw std::string(ddSetTimeErr);
	}


	char *params[2];
	
	params[0] = const_cast<char*>( timeParameter.c_str() );
	params[1] = const_cast<char*>( orbitParameter.c_str() );

	char *timeIntervall = const_cast<char*>( ddInterval.c_str() );

	DD_data_t *data;

	int status = 0;

	do {

		cout << "getOrbitData DD_GetMultiData ... " << endl;
		cout << "getOrbitData id : "<< id << endl;
		cout << "getOrbitData param 1 : " << params[0] << endl;
		cout << "getOrbitData param 2 : " << params[1] << endl;
		cout << "getOrbitData timeIntervall : " << timeIntervall << endl;

		status = DD_GetMultiData(id, 2, static_cast<char**>(params), timeIntervall, &data, 1);
		
		cout << "getOrbitData DD_GetMultiData OK " << endl;

		if (status < 0)
		{
			std::string ddGetDataErr = "[ERROR] getOrbitData : failed to get data -> status : " + status;
			throw std::string(ddGetDataErr);
		}

		int dataType = data[1].type;
		
		for (int j = 0; j < data->VarNumber; j++)	
		{
			satelliteTimeArray.push_back( static_cast<char*>(data[0].Variables[j]) );
		  	
			if ( dataType == 3 ) // DOUBLE
			{
				x.push_back( static_cast<float>(static_cast<double*>(data[1].Variables[j])[0]) );
		  		y.push_back( static_cast<float>(static_cast<double*>(data[1].Variables[j])[1]) );
		  		z.push_back( static_cast<float>(static_cast<double*>(data[1].Variables[j])[2]) );

			}
			else if ( dataType == 2 ) // FLOAT
			{
				
				x.push_back( static_cast<float*>(data[1].Variables[j])[0] );
		  		y.push_back( static_cast<float*>(data[1].Variables[j])[1] );
		  		z.push_back( static_cast<float*>(data[1].Variables[j])[2] );

			}
			else
			{
				std::string ddGetDataTypeErr = "[ERROR] getOrbitData : failed to get data -> Unknown data type (not double nor float)";
				throw std::string(ddGetDataTypeErr);	
			}
		}


	} while (status == MOREDATA);
	
    DD_Close(id);
}

void getSymIndexData(string symIndexVi, string ddStart, string ddInterval,
	string timeParameter, string symIndexParameter, 
	vector<string>& symIndexTimeArray, vector<float>& symIndexArray)
{
	int id = DD_SetVariable( const_cast<char*>( symIndexVi.c_str() ) );

	cout << "getSymIndexData id : "<< id << endl;

    char *st = const_cast<char*>( ddStart.c_str() );

    cout << "getSymIndexData st : "<< st << endl;

	int error = DD_SetTime(id, st);

	cout << "getSymIndexData error : "<< error << endl;

	if (error < 0)
	{
		std::string ddSetTimeErr = "[ERROR] getSymIndexData : bad time pointer init in DD_SetTime -> err value : " +  error;
		throw std::string(ddSetTimeErr);
	}

	char *params[2];
	
	params[0] = const_cast<char*>( timeParameter.c_str() );
	params[1] = const_cast<char*>( symIndexParameter.c_str() );
	
	char *timeIntervall = const_cast<char*>( ddInterval.c_str() );

	DD_data_t *data;

	int status = 0;

	do {

		status = DD_GetMultiData(id, 2, static_cast<char**>(params), timeIntervall, &data, 1);
		
		if (status < 0)
		{
			std::string ddGetDataErr = "[ERROR] getSymIndexData : failed to get data -> status : " + status;
			throw std::string(ddGetDataErr);
		}

		// 5 min to 1 min resampling
		for (int j = 0; j < data->VarNumber; j+=5)
		{
			symIndexTimeArray.push_back( static_cast<char*>(data[0].Variables[j]) );
		  	symIndexArray.push_back( static_cast<float*>(data[1].Variables[j])[0] );
		}


	} while (status == MOREDATA);
	
    DD_Close(id);
}