File: groopsAscii2Orbit.cpp

package info (click to toggle)
groops 0%2Bgit20250907%2Bds-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 11,140 kB
  • sloc: cpp: 135,607; fortran: 1,603; makefile: 20
file content (137 lines) | stat: -rw-r--r-- 4,137 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/***********************************************/
/**
* @file groopsAscii2Orbit.cpp
*
* @brief Read Orbits given in groops kinematic orbit ASCII format.
*
* @author Norbert Zehentner
* @date 2015-01-23
*
*/
/***********************************************/

// Latex documentation
#define DOCSTRING docstring
static const char *docstring = R"(
Read Orbits given in groops kinematic orbit ASCII format with covariance information.

See also \program{Orbit2GroopsAscii}.
)";

/***********************************************/

#include "programs/program.h"
#include "files/fileInstrument.h"
#include "classes/earthRotation/earthRotation.h"

/***** CLASS ***********************************/

/** @brief Read Orbits given in groops kinematic orbit ASCII format.
* @ingroup programsConversionGroup */
class GroopsAscii2Orbit
{
  void readFile(const FileName &fileName, OrbitArc &arcOrb, Covariance3dArc &arcCov);

public:
  void run(Config &config, Parallel::CommunicatorPtr comm);
};

GROOPS_REGISTER_PROGRAM(GroopsAscii2Orbit, SINGLEPROCESS, "read Orbits given in groosp kinematic ASCII format", Conversion, Orbit, Covariance, Instrument)
GROOPS_RENAMED_PROGRAM(AsciiKinematic2OrbitCovariance, GroopsAscii2Orbit, date2time(2020, 6, 14))

/***********************************************/

void GroopsAscii2Orbit::run(Config &config, Parallel::CommunicatorPtr /*comm*/)
{
  try
  {
    FileName              fileNameOrbit, fileNameCovariance;
    std::vector<FileName> fileNamesIn;
    EarthRotationPtr      earthRotation;

    readConfig(config, "outputfileOrbit",      fileNameOrbit,      Config::OPTIONAL,  "", "");
    readConfig(config, "outputfileCovariance", fileNameCovariance, Config::OPTIONAL,  "", "");
    readConfig(config, "earthRotation",        earthRotation,      Config::MUSTSET,   "", "");
    readConfig(config, "inputfile",            fileNamesIn,        Config::MUSTSET,   "", "");
    if(isCreateSchema(config)) return;

    // ===============================================

    logStatus<<"read input files"<<Log::endl;
    OrbitArc        orbit;
    Covariance3dArc cov;
    for(const auto &fileName : fileNamesIn)
    {
      try
      {
        logStatus<<"read file <"<<fileName<<">"<<Log::endl;
        InFile file(fileName);

        // skip header
        std::string line;
        std::getline(file, line);
        std::getline(file, line);

        while(std::getline(file, line))
        {
          if(line.empty())
            break;
          std::stringstream ss(line);
          ss.exceptions(std::ios::badbit | std::ios::failbit);

          LongDouble mjd;
          Vector3d   pos;
          Vector     x(6);

          ss>>mjd>>pos.x()>>pos.y()>>pos.z()>>x(0)>>x(1)>>x(2)>>x(3)>>x(4)>>x(5);

          OrbitEpoch        epochOrb;
          Covariance3dEpoch epochCov;
          epochOrb.time = epochCov.time = mjd2time(mjd);
          epochOrb.position = pos;
          epochCov.setData(x);

          orbit.push_back(epochOrb);
          cov.push_back(epochCov);
        }
      }
      catch(std::exception &e)
      {
        logError<<e.what()<<": continue..."<<Log::endl;
      }
    } // for(fileName)

    // Rotation TRF -> CRF
    // -------------------
    if(earthRotation)
    {
      logStatus<<"rotation from TRF to CRF"<<Log::endl;
      Single::forEach(orbit.size(), [&](UInt i)
      {
        const Rotary3d rotation = inverse(earthRotation->rotaryMatrix(orbit.at(i).time));
        orbit.at(i).position = rotation.rotate(orbit.at(i).position);
        cov.at(i).covariance = rotation.rotate(cov.at(i).covariance);
      });
    }

    if(!fileNameOrbit.empty())
    {
      logStatus<<"write orbit data to file <"<<fileNameOrbit<<">"<<Log::endl;
      InstrumentFile::write(fileNameOrbit, orbit);
      Arc::printStatistics(orbit);
    }

    if(!fileNameCovariance.empty())
    {
      logStatus<<"write covariance data to file <"<<fileNameCovariance<<">"<<Log::endl;
      InstrumentFile::write(fileNameCovariance, cov);
      Arc::printStatistics(cov);
    }
  }
  catch(std::exception &e)
  {
    GROOPS_RETHROW(e)
  }
}

/***********************************************/