26 #include <sys/types.h>
29 #include <QtCore/QCoreApplication>
30 #include <QtCore/QDir>
31 #include <QtCore/QFile>
32 #include <QtCore/QFileInfo>
33 #include <QtCore/QSettings>
34 #include <QtCore/QString>
35 #include <QtCore/QStringList>
36 #include <QtCore/QTextStream>
39 #if QT_VERSION >= 0x050000
40 # include <QtWidgets/QApplication>
42 # include <QtGui/QApplication>
63 void saveSettings(QSettings&,
bool shouldInvokeSystemWideWizard);
97 static int parse_opt(
int key,
char *arg,
struct argp_state *state)
116 ": parse_opt(): it is dangerous to use a string \"" + options->
altSetupName +
117 "\" as an alternative config name");
119 ": parse_opt(): you can overwrite another file (un)intentionally");
150 if (1 < state->arg_num)
157 if (state->arg_num < 1 &&
162 return ARGP_ERR_UNKNOWN;
173 bool createCalcOnnFile(
const QString& calcOnnFileName,
int fd,
const QString& sessionName,
int version,
174 const QString& acName,
const QString& userName);
185 return new QApplication(argc, argv);
187 return new QCoreApplication(argc, argv);
201 int main(
int argc,
char** argv)
205 const QString path2SystemWideConfig(SWCONFIG
"/xdg");
207 const QString path2SystemWideConfig(
"");
209 QString userCommand(
"");
214 const char *calcMode =
"mark3 ";
228 QCoreApplication::setOrganizationName(
origOrgName);
229 QCoreApplication::setOrganizationDomain(
origDmnName);
233 QSettings::setPath(QSettings::NativeFormat, QSettings::SystemScope, path2SystemWideConfig);
240 for (
int i=0; i<6; i++)
241 mode_.c_mode[i] = *(calcMode + i);
243 memset(
extrnl_.External_inputs, 0,
sizeof(
extrnl_.External_inputs));
262 QString sArg1(argv[1]), sArg2(argv[2]), sArg3(argv[3]), sArg4(argv[4]);
266 nArg1 = sArg1.toInt(&isOk);
268 nArg2 = sArg2.toInt(&isOk);
272 if (!(fi.exists() && fi.isReadable()))
278 if (!(fi.exists() && fi.isReadable()))
287 ": one of the external a priori files is missed, exiting");
300 const char* envDisplay=NULL;
302 isGuiEnabled = (envDisplay=getenv(
"DISPLAY"))!=NULL && 0<strlen(envDisplay);
304 QScopedPointer<QCoreApplication>
306 if (qobject_cast<QApplication *>(app.data()))
319 for (
int i=0; i<argc; i++)
320 userCommand += QString(argv[i]) +
" ";
326 struct argp_option argp_options[] =
328 {0, 0, 0, 0,
"General options:", 10},
329 {
"std-locale",
'l', 0, 0,
330 "Use the standard locale"},
332 {0, 0, 0, 0,
"Configuration control:", 11},
333 {
"alt",
'a',
"STRING", 0,
334 "Use an alternative configuration STRING"},
336 {0, 0, 0, 0,
"Invocation of startup wizard:", 15},
337 {
"sys-wide-wizard",
'W', 0, 0,
338 "Run startup wizard for the system-wide settings"},
339 {
"wizard",
'w', 0, 0,
340 "Force call of the startup wizard"},
342 {0, 0, 0, 0,
"Operation modes:", -1},
343 {
"print-setup",
'p', 0, 0,
344 "Print set up and exit"},
345 {
"dry-mode",
'q', 0, 0,
346 "Process in a \"dry run\" mode: files will not be created, instead names of the files "
348 {
"version",
'V', 0, 0,
349 "Print program version"},
353 QString salute(
"vgosDbCalc is a program that reads vgosDb database, "
354 "calculates theoretical values of delays and rates as well as partials for many parameters and "
355 "stores them in a new version of the database. The mandatory argument DATABASE is a name of a "
356 "database (with or without version part) or a name of wrapper file (absolute or relative to the "
357 "default path of the vgosDb files).\v");
364 QString(
"\n\nThe utility vgosDbCalc is a part of nuSolve package. See the datails in "
365 "\"vgosDbCalc User Guide\", a part of nuSolve distribution. You can get the latest version of "
366 "nuSolve at\n\t\thttps://sourceforge.net/projects/nusolve");
368 struct argp argp={argp_options,
parse_opt,
"DATABASE", salute.toLatin1()};
370 argp_parse (&argp, argc, argv, 0, 0, &options);
374 isFirstRun = options.
settings->allKeys().size()>0 ? false :
true;
382 ": using alternative config name \"" + options.
altSetupName +
"\"");
401 QSettings *swSettings =
403 if (!swSettings->isWritable())
406 ": cannot write system wide config");
415 ": using an alternative config name, system wide config edit request ignored");
420 if ((rc=startup.exec())==0)
443 ": cannot run graphical application.");
452 ": no input files provided.");
460 ": one of the external a priori files is missed, exiting");
465 QString path2wrapperFile(
"");
466 QString wrapperFileName(
"");
467 QString sessionName(
"");
469 QRegExp reDatabaseName(
"^[0-9]{2}[A-Z]{3}[0-9]{2}[A-Z0-9]{1,2}$");
470 QRegExp reDatabaseVersionName(
"^[0-9]{2}[A-Z]{3}[0-9]{2}[A-Z0-9]{1,2}_V[0-9]{3}$");
472 if (options.
inputArg.right(4) ==
".wrp")
477 else if (reDatabaseName.exactMatch(options.
inputArg) ||
478 reDatabaseVersionName.exactMatch(options.
inputArg))
482 path2wrapperFile, wrapperFileName, sessionName, version);
487 ": cannot guess input data.");
491 QString calcExtFileName(
"");
492 QString calcOnnFileName(
"");
493 QString userLoginName(
"unkn");
494 QString path2tmpDir(
"/tmp");
498 if (getenv(
"TMPDIR") && strlen(getenv(
"TMPDIR"))>0)
500 path2tmpDir = QString(getenv(
"TMPDIR"));
502 ": the path to tmp dir has been alternated: \"" + path2tmpDir +
"\"");
508 struct passwd *pw=getpwuid(uid);
510 perror(
"getpwuid: ");
512 userLoginName = pw->pw_name;
516 memset(buff, 0,
sizeof(buff));
517 sprintf(buff,
"%s/%s.calcExt.%s-XXXXXX",
518 qPrintable(path2tmpDir),
520 if ((fd=mkstemp(buff)) == -1)
523 ": cannot create calcExt file.");
529 calcExtFileName = buff;
535 memset(buff, 0,
sizeof(buff));
536 sprintf(buff,
"%s/%s.calcOn.%s-XXXXXX",
537 qPrintable(path2tmpDir),
539 if ((fd=mkstemp(buff)) == -1)
542 ": cannot create calcOn file.");
548 calcOnnFileName = buff;
554 QString sLang(
""), sLcAll(
"");
558 sLang = QString(getenv(
"LANG"));
559 setenv(
"LANG",
"C", 1);
560 if (getenv(
"LC_ALL"))
561 sLcAll = QString(getenv(
"LC_ALL"));
562 setenv(
"LC_ALL",
"C", 1);
564 ": the env.variable LANG was set to \"C\"");
566 ": the env.variable LC_ALL was set to \"C\"");
590 alHistory =
new SgLogger(0,
false,
"");
610 ": the vgosDb object has been created");
612 isOk = vgosDb->
init(path2wrapperFile, wrapperFileName);
614 ": parsing of wrapper file " + path2wrapperFile +
"/" + wrapperFileName +
615 (isOk?
" complete":
" failed"));
639 ": User command: \"" + userCommand +
"\"");
641 ": Input data : " + path2wrapperFile +
"/" + wrapperFileName);
644 ": External a priori setup: ");
666 ") has been imported from vgosDb data set");
672 if (sessionName.size()==8)
673 sessionName = sessionName +
' ';
680 QString bandKey(
""), bandList(
"");
684 bands.append(bandKey);
685 bandList = bandKey +
", ";
687 for (
int i=0; i<session.
bands().size(); i++)
688 if (session.
bands().at(i)->getKey() != bandKey)
690 bands.append(session.
bands().at(i)->getKey());
691 bandList += session.
bands().at(i)->getKey() +
", ";
693 if (bandList.size() > 2)
696 ": collected " + QString(
"").setNum(bands.size()) +
" bands: " + bandList);
700 mimicCalcMain2(0, -1, qPrintable(calcOnnFileName), qPrintable(calcExtFileName), bands);
703 ": running observations through CALC has " + (isOk?
"been complete":
"failed"));
714 ": export of data into vgosDB tree has " + (isOk?
"been complete":
"failed"));
718 ": nothing to write");
722 ": import data of " + path2wrapperFile +
"/" + wrapperFileName +
" failed");
732 ": vgosDb object has been destroyed.");
737 ": the elapsed time to process " + QString(
"").setNum(session.
observations().size()) +
738 " observations is: " +
interval2Str(finisEpoch - startEpoch) +
739 " (" + QString(
"").sprintf(
"%.2f", (finisEpoch - startEpoch)*86400.0) +
" sec)",
true);
744 setenv(
"LANG", qPrintable(sLang), 1);
745 setenv(
"LC_ALL", qPrintable(sLcAll), 1);
747 ": the env.variable LANG was set to \"" + sLang +
"\"");
749 ": the env.variable LC_ALL was set to \"" + sLcAll +
"\"");
752 if (QFile::exists(calcExtFileName))
753 QFile::remove(calcExtFileName);
754 if (QFile::exists(calcOnnFileName))
755 QFile::remove(calcOnnFileName);
768 if (!f.open(QIODevice::WriteOnly))
771 "createCalcExtFile(): error opening calcExt file: " + fileName);
778 ts <<
"SITES " << str <<
"\n";
780 ts <<
"Sources " << str <<
"\n";
782 ts <<
"Ocean " << str <<
"\n";
784 ts <<
"EOPs " << str <<
"\n";
786 ts <<
"Tilts " << str <<
"\n";
788 ts <<
"OPTL " << str <<
"\n";
792 "createCalcExtFile(): the external a priori parameters were saved in the file \"" + fileName +
"\"");
799 bool createCalcOnnFile(
const QString& calcOnnFileName,
int fd,
const QString& sessionName,
int version,
800 const QString& acName,
const QString& userName)
802 QFile f(calcOnnFileName);
804 if (!f.open(QIODevice::WriteOnly))
807 "createCalcOnnFile(): error opening calcExt file: " + calcOnnFileName);
813 histIntroRec =
"Calc 11 at " + acName +
" -" + userName +
"-";
815 str.sprintf(
"$%-9s %8d $%-9s", qPrintable(sessionName), version, qPrintable(sessionName));
816 ts << qPrintable(str) <<
"\n"
817 <<
"00000000000000000000000000000000000000000000000000000000000000\n";
822 "createCalcOnnFile(): the CALC control data were saved in the file \"" +
823 calcOnnFileName +
"\"");
836 if (!QFile::exists(fileName))
839 "checkAprioriFiles(): the external a priori file for sites \"" + fileName +
"\" does not exist");
844 if (!QFile::exists(fileName))
847 "checkAprioriFiles(): the external a priori file for sources \"" + fileName +
"\" does not exist");
852 if (!QFile::exists(fileName))
855 "checkAprioriFiles(): the external a priori file for ocean loading \"" + fileName +
856 "\" does not exist");
861 if (!QFile::exists(fileName))
864 "checkAprioriFiles(): the external a priori file for EOPs \"" + fileName +
"\" does not exist");
869 if (!QFile::exists(fileName))
872 "checkAprioriFiles(): the external a priori file for tilts \"" + fileName +
"\" does not exist");
878 if (!QFile::exists(fileName))
881 "checkAprioriFiles(): the external a priori file for ocean pole tide loading \"" + fileName +
882 "\" does not exist");
897 settings.value(
"Identities/UserName",
900 settings.value(
"Identities/UserEmailAddress",
903 settings.value(
"Identities/UserDefaultInitials",
906 settings.value(
"Identities/AcFullName",
909 settings.value(
"Identities/AcAbbreviatedName",
912 settings.value(
"Identities/AcShortAbbreviatedName",
918 settings.value(
"Setup/Path2Home",
921 settings.value(
"Setup/Path2SolveAPrioriFiles",
924 settings.value(
"Setup/Path2VgosDbFiles",
927 settings.value(
"Setup/Path2MasterFiles",
930 settings.value(
"Setup/CalcAprioriFileSites",
933 settings.value(
"Setup/CalcAprioriFileSources",
936 settings.value(
"Setup/CalcAprioriFileOceanLd",
939 settings.value(
"Setup/CalcAprioriFileEops",
942 settings.value(
"Setup/CalcAprioriFileTilts",
945 settings.value(
"Setup/CalcAprioriFileOceanPoleTideLd",
948 settings.value(
"Setup/Path2AuxLogs",
951 settings.value(
"Setup/Have2SavePerSessionLog",
954 settings.value(
"Setup/UseLocalLocale",
959 settings.value(
"Logger/FileName",
960 "vgosDbCalc.log").toString());
963 settings.value(
"Logger/Capacity", 400).toInt());
968 logLevel = settings.value(
"Logger/LogLevel", 2).toInt();
979 void saveSettings(QSettings& settings,
bool shouldInvokeSystemWideWizard)
982 if (!shouldInvokeSystemWideWizard)
984 settings.setValue(
"Identities/UserName",
986 settings.setValue(
"Identities/UserEmailAddress",
988 settings.setValue(
"Identities/UserDefaultInitials",
991 settings.setValue(
"Identities/AcFullName",
993 settings.setValue(
"Identities/AcAbbreviatedName",
995 settings.setValue(
"Identities/AcShortAbbreviatedName",
999 if (!shouldInvokeSystemWideWizard)
1001 settings.setValue(
"Setup/Path2Home",
1004 settings.setValue(
"Setup/Path2SolveAPrioriFiles",
1006 settings.setValue(
"Setup/Path2VgosDbFiles",
1008 settings.setValue(
"Setup/Path2MasterFiles",
1010 settings.setValue(
"Setup/CalcAprioriFileSites",
1012 settings.setValue(
"Setup/CalcAprioriFileSources",
1014 settings.setValue(
"Setup/CalcAprioriFileOceanLd",
1016 settings.setValue(
"Setup/CalcAprioriFileEops",
1018 settings.setValue(
"Setup/CalcAprioriFileTilts",
1020 settings.setValue(
"Setup/CalcAprioriFileOceanPoleTideLd",
1022 settings.setValue(
"Setup/Path2AuxLogs",
1024 settings.setValue(
"Setup/Have2SavePerSessionLog",
1026 settings.setValue(
"Setup/UseLocalLocale",
1030 settings.setValue(
"Logger/FileName",
1033 settings.setValue(
"Logger/Capacity",
1035 settings.setValue(
"Logger/IsStoreInFile",
1037 settings.setValue(
"Logger/IsNeedTimeMark",
QString interval2Str(double days)
SgVersion libraryVersion("SgLib", 0, 7, 5, "Tuscarora (rc1)", SgMJD(2022, 2, 18, 17, 34))
SgVersion vgosDbCalcVersion("vgosDbCalc", 0, 4, 4, "Tabler Run", SgMJD(2022, 2, 27, 16, 28))
const QString & getAcAbbrevName() const
const QString & getAcAbbName() const
void setAcAbbrevName(const QString &)
void setAcFullName(const QString &)
const QString & getUserEmailAddress() const
void setAcAbbName(const QString &)
const QString & getMachineMachineName() const
const QString & getMachineRelease() const
const QString & getMachineNodeName() const
const QString & getUserDefaultInitials() const
const QString & getAcFullName() const
void setUserDefaultInitials(const QString &)
void setUserEmailAddress(const QString &)
void setUserName(const QString &)
const QString & getUserName() const
const QString & getMachineSysName() const
virtual void write(LogLevel, quint32, const QString &, bool=false)
bool getIsStoreInFile() const
void attachSupplementLog(const QString &name, SgLogger *auxLogger)
void setIsStoreInFile(bool isStoreInFile)
void setLogFacility(LogLevel lvl, quint32 f)
void setFileName(const QString &fileName)
void setIsNeedTimeMark(bool isNeedTimeMark)
void setDirName(const QString &dirName)
virtual void clearSpool()
void setCapacity(int capacity)
bool getIsNeedTimeMark() const
const QString & getFileName() const
void detachSupplementLog(const QString &name)
@ F_DDMonYYYY
Date: 2010 Apr 02.
QString toString(Format format=F_Verbose) const
static SgMJD currentMJD()
const QString & getKey() const
const SgMJD & getReleaseEpoch() const
const QString & getSoftwareName() const
QString name(NameFormat fmt=NF_Human) const
void setOperationMode(SgNetCdf::OperationMode om)
bool init(const QString path, const QString fileName)
const QString & getName() const
@ Attr_FF_CALC_DATA_MODIFIED
the theoretical values were modified; //vgosDbCalc
const QString & getSessionCode() const
SgVlbiBand * primaryBand()
bool getDataFromVgosDb(SgVgosDb *vgosDb, bool have2LoadImmatureSession, bool guiExpected)
QList< SgVlbiBand * > & bands()
QList< SgVlbiObservation * > & observations()
static bool guessSessionByWrapperFileName(const QString &inputArg, const QString &path2VgosDb, QString &path2wrapperFile, QString &wrapperFileName, QString &sessionName, int &version)
static bool guessWrapperFileNameBySession(const QString &inputArg, const QString &path2VgosDb, const QString &acAbbName, QString &path2wrapperFile, QString &wrapperFileName, QString &sessionName, int &version, bool noYears=false)
void setPath2Masterfile(const QString &)
bool putDataIntoVgosDb(SgVgosDb *vgosDb)
void setWrapperFileName(const QString &)
SgVlbiSession *& session()
void setCalcCallingMode(CalcCallingMode mode)
void setPath2Data(const QString &)
void setInputDbName(const QString &)
void setPath2SolveAprioriFiles(const QString &)
const QString & getAprioriFile4Sources() const
const QString & getAprioriFile4Sites() const
const QString & getAprioriFile4Tilts() const
void setAprioriFile4Tilts(const QString &file)
bool getHave2SavePerSessionLog() const
const QString & getPath2Home() const
const QString & getPath2SolveAprioriFiles() const
void setAprioriFile4OceanPoleTideLd(const QString &file)
void setAprioriFile4Sites(const QString &file)
void setPath2MasterFiles(const QString &)
QString path2(const QString &) const
const QString & getAprioriFile4OceanLd() const
void setPath2AuxLogs(const QString &)
const QString & getPath2VgosDbFiles() const
const QString & getPath2MasterFiles() const
bool getUseLocalLocale() const
void setAprioriFile4Eops(const QString &file)
void setPath2VgosDbFiles(const QString &)
void setUseLocalLocale(bool use)
const QString & getAprioriFile4Eops() const
const QString & getPath2AuxLogs() const
SgIdentities & identities()
const QString & getAprioriFile4OceanPoleTideLd() const
void setHave2SavePerSessionLog(bool)
void setAprioriFile4Sources(const QString &file)
void setPath2Home(const QString &)
void setUpBinaryIdentities(const QString &)
void setAprioriFile4OceanLd(const QString &file)
static int serialNumber()
bool shouldInvokeSystemWideWizard
void loadSettings(QSettings &)
QCoreApplication * createApplication(int &argc, char *argv[], bool isGuiEnabled)
const QString origOrgName("NASA GSFC")
int main(int argc, char **argv)
const QString origDmnName("gsfc.nasa.gov")
const char * argp_program_bug_address
static int parse_opt(int key, char *arg, struct argp_state *state)
bool createCalcExtFile(const QString &fileName, int fd)
const QString origAppName("vgosDbCalc")
void saveSettings(QSettings &, bool shouldInvokeSystemWideWizard)
bool createCalcOnnFile(const QString &calcOnnFileName, int fd, const QString &sessionName, int version, const QString &acName, const QString &userName)
void mimicCalcMain(int arg1, int arg2, const char *arg3, const char *arg4)
void mimicCalcMain2(int arg1, int arg2, const char *arg3, const char *arg4, const QList< QString > &bands)