#include <GeopsyCore.h>#include <QGpCoreTools.h>#include "gptomoinfoVersion.h"#include "gptomoinfoInstallPath.h"Functions | |
| int | fileToGeopsy (const SubSignalPool &sigs) |
| int | geopsyToFile (const SubSignalPool &sigs) |
| ApplicationHelp * | help () |
| int | main (int argc, char **argv) |
| PACKAGE_INFO (gptomoinfo, GPTOMOINFO) | |
Variables | |
| QDir | baseDir |
| int fileToGeopsy | ( | const SubSignalPool & | sigs | ) |
References QGpCoreTools::endl(), and QGpCoreTools::tr().
| int geopsyToFile | ( | const SubSignalPool & | sigs | ) |
References baseDir, GeopsyCore::SubSignalPool::begin(), GeopsyCore::SubSignalPool::count(), GeopsyCore::SubSignalPool::end(), QGpCoreTools::endl(), GeopsyCore::Signal::id(), GeopsyCore::Signal::name(), GeopsyCore::Signal::receiver(), GeopsyCore::Signal::source(), GeopsyCore::Signal::timePick(), QGpCoreTools::tr(), QGpCoreTools::Point2D::x(), QGpCoreTools::Point2D::y(), and QGpCoreTools::Point::z().
Referenced by main().
{
// Source identification
QMap<Point, int> sources;
QMap<Point, int>::iterator itSrc;
int id=0;
for(SubSignalPool::const_iterator it=sigs.begin(); it!=sigs.end(); it++) {
Signal * sig=*it;
itSrc=sources.find(sig->source());
if(itSrc==sources.end()) {
sources.insert(sig->source(),id++);
}
}
// build the source file "fsrc" NEW FORMAT
// un peu complexe avec les seismes, les blasts (temps inconnu) et les tirs
// format acces direct du fichier 32 octets =8 fois 4 octets
// rec=1 : src eqks shot blast eqks_out 0 0 0 (three dummy integers)
// rec=1+i : x(i) y(i) z(i) t0(i) kp(i) kt(i) in(i) id(i)
// rec=1+src : x(src) ....
// ::::::::::::::::: position et temps origine
// ::::::::::::::::: kp=0 sauf pour les seismes et il vaut de 1 e eqks
// ::::::::::::::::: kt=0 sauf pour les seismes et les explosions
// ::::::::::::::::: in 0/1 suivant que la source se trouve dans le milieu ou dehors
// ::::::::::::::::: id est un ID qui doit etre unique et qui ne change pas durant toute une manip
QFile f;
f.setFileName(baseDir.absoluteFilePath("fsrc"));
if(!f.open(QIODevice::WriteOnly)) {
App::stream() << tr("Cannot open file %1 for writing.").arg(baseDir.absoluteFilePath("fsrc")) << endl;
return 2;
}
qint32 nsrc=sources.count();
for(int i=0;i<8;i++) {
f.write((const char *)&nsrc, 4);
}
float x, y, z, dummy=0;
int icount=1;
for(itSrc=sources.begin();itSrc!=sources.end();itSrc++) {
const Point& p=itSrc.key();
id=itSrc.value();
x=p.x();
y=p.y();
z=p.z();
f.write((const char *)&x, 4); /* source position x */
f.write((const char *)&y, 4); /* source position y */
f.write((const char *)&z, 4); /* source position z */
f.write((const char *)&dummy, 4); /* starting date */
f.write((const char *)&dummy, 4); /* index for quakes */
f.write((const char *)&dummy, 4); /* index for quakes and blasts */
f.write((const char *)&dummy, 4); /* current flag for event in/out */
f.write((const char *)&id, 4); /* id of this event same during tomography */
}
f.close();
// build the time file "fobs" NEW FORMAT
// format acces direct du fichier 24 octets 6 fois 4
// rec=1 : nt nt_p nt_s 0 0 0
// rec=1+i : id_obs(i) t(i) dt_obs(i) lut_src(i) lut_sta(i) lut_ray(i)
// rec=1+nt : id_obs* and so on
//:::::::::::::::::: t est la date pointee==ce n'est pas un temps
//::::::::::::::::::
f.setFileName(baseDir.absoluteFilePath("fobs"));
if(!f.open(QIODevice::WriteOnly)) {
App::stream() << tr("Cannot open file %1 for writing.").arg(baseDir.absoluteFilePath("fobs")) << endl;
return 2;
}
// header
qint32 nt=sigs.count();
qint32 nt_p=0;
qint32 nt_s=0;
f.write((const char *)&nt, 4); /* number of data */
f.write((const char *)&nt_p, 4); /* number of P data time set to zero here */
f.write((const char *)&nt_s, 4); /* number of S data time set to zero here */
f.write((const char *)&dummy, 4); /* dummy */
f.write((const char *)&dummy, 4); /* dummy */
f.write((const char *)&dummy, 4); /* dummy */
ASSERT(sizeof(float)==4);
float t;
qint32 signalId;
// Save P
for(SubSignalPool::const_iterator it=sigs.begin(); it!=sigs.end(); it++) {
Signal * sig=*it;
id=sources[sig->source()];
if(sig->name().count()>4) {
App::stream() << "Maximum 4 char for rec name" << endl;
return 2;
}
t=sig->timePick("P");
if(t>0.0) { // P
nt_p++;
f.write((const char *)&id, 4); /* id of the record */
f.write((const char *)&t, 4); /* t date of P wave */
f.write((const char *)&dummy, 4); /* dt error in picking */
signalId=sig->id();
f.write((const char *)&signalId, 4); /* lut_src a discuter avec Marc */
f.write((const char *)&signalId, 4); /* lut_sta a discuter avec Marc */
f.write((const char *)&signalId, 4); /* lut_ray id rayon voir avec Marc mais genere par tomoTV */
}
}
// Save S
for(SubSignalPool::const_iterator it=sigs.begin(); it!=sigs.end(); it++) {
Signal * sig=*it;
id=sources[sig->source()];
t=sig->timePick("S");
if(t>0.0) { // S
nt_s++;
f.write((const char *)&id, 4); /* id of the record */
f.write((const char *)&t, 4); /* t date of S wave */
f.write((const char *)&dummy, 4); /* dt error in picking */
f.write((const char *)&signalId, 4); /* lut_src a discuter avec Marc */
f.write((const char *)&signalId, 4); /* lut_sta a discuter avec Marc */
f.write((const char *)&signalId, 4); /* lut_ray id rayon voir avec Marc mais genere par tomoTV */
}
}
f.seek(4);
f.write((const char *)&nt_p, 4); /* ecriture du nombre des ondes P */
f.seek(8);
f.write((const char *)&nt_s, 4); /* ecriture du nombre des ondes S */
f.close();
//::::::::::::::::::
// build the station file "fsta" NEW FORMAT
// format acces direct du fichier 28 octets
// rec=1 : sta 0 0 0 0 0 0 (SIX dummy integers)
// rec=1+i : id_sta(i) x(i) y(i) z(i) tstat_p(i) tstat_s(i) name(i)(4 caracteres)
// rec=1+sta : id_sta* ..... and so on
//::::::::::::::::::
//::::::::::::::::::
// Receiver save
f.setFileName(baseDir.absoluteFilePath("fsta"));
if(!f.open(QIODevice::WriteOnly)) {
App::stream() << tr("Cannot open file %1 for writing.").arg(baseDir.absoluteFilePath("fsta")) << endl;
return 2;
}
// header
qint32 nstat=0;
f.write((const char *)&nstat, 4); /* number of stations */
f.write((const char *)&dummy, 4);
f.write((const char *)&dummy, 4);
f.write((const char *)&dummy, 4);
f.write((const char *)&dummy, 4);
f.write((const char *)&dummy, 4);
f.write((const char *)&dummy, 4); /* six dummy parameters rec=1 */
QMap<Point, int> rec;
for(SubSignalPool::const_iterator it=sigs.begin(); it!=sigs.end(); it++) {
Signal * sig=*it;
const Point& p=sig->receiver();
if(!rec.contains(p)) {
rec.insert(p, 0);
x=p.x();
y=p.y();
z=p.z();
f.write((const char *)&icount, 4); icount++; /* id of station check with Marc sinon genere ici */
f.write((const char *)&x, 4); /* x coordinate */
f.write((const char *)&y, 4); /* y coordinate */
f.write((const char *)&z, 4); /* z coordinate */
f.write((const char *)&dummy, 4); /* t static P dummy now */
f.write((const char *)&dummy, 4); /* t static S dummy now */
f.write(sig->name().toAscii().data(), 4); /* name of the station 4 characters */
}
}
nstat=rec.count();
f.seek(0);
f.write((const char *)&nstat, 4);
f.close();
return 0;
}
| ApplicationHelp* help | ( | ) |
| int main | ( | int | argc, |
| char ** | argv | ||
| ) |
References baseDir, GeopsyCore::GeopsyCoreEngine::currentDB(), database, QGpCoreTools::endl(), GeopsyCore::SignalDB::findGroup(), geopsyToFile(), groupName, help(), mode, GeopsyCore::SignalDB::open(), GeopsyCore::AbstractSignalGroup::subPool(), and QGpCoreTools::tr().
{
CoreApplication a(argc, argv, help);
// Options
enum Mode {GeopsyToFile, FileToGeopsy};
Mode mode=GeopsyToFile;
QString database, groupName, basePath;
// Check arguments
int i, j=1;
for(i=1; i<argc; i++) {
QByteArray arg=argv[i];
if(arg[0]=='-') {
if(arg=="-db") {
CoreApplication::checkOptionArg(i, argc, argv);
database=argv[i];
} else if(arg=="-group") {
CoreApplication::checkOptionArg(i, argc, argv);
groupName=argv[i];
} else if(arg=="-C") {
CoreApplication::checkOptionArg(i, argc, argv);
basePath=argv[i];
} else if(arg=="-gptof") {
mode=GeopsyToFile;
} else if(arg=="-ftogp") {
mode=FileToGeopsy;
} else {
App::stream() << tr("gptomoinfo: bad option %1, see -help").arg(argv[i]) << endl;
return 2;
}
} else {
argv[j++]=argv[i];
}
}
if(database.isEmpty()) {
App::stream() << tr("gptomoinfo: missing database, see option '-db'.") << endl;
return 2;
}
if(groupName.isEmpty()) {
App::stream() << tr("gptomoinfo: missing group, see option '-group'.") << endl;
return 2;
}
if(!basePath.isEmpty()) {
baseDir.setPath(basePath);
if(!baseDir.exists()) {
App::stream() << tr("gptomoinfo: %1 does not exist.").arg(basePath) << endl;
return 2;
}
}
GeopsyCoreEngine gp;
if( !gp.currentDB()->open(database) ) {
App::stream() << tr("gptomoinfo: error opening database %1").arg(database) << endl;
return 2;
}
AbstractSignalGroup * g=gp.currentDB()->findGroup(groupName);
if( !g) {
App::stream() << tr("gptomoinfo: group '%1' does not exist").arg(groupName) << endl;
return 2;
}
SubSignalPool sigs=g->subPool();
int exitCode=0;
switch(mode) {
case GeopsyToFile:
exitCode=geopsyToFile(sigs);
break;
case FileToGeopsy:
exitCode=geopsyToFile(sigs);
break;
}
return exitCode;
}
| PACKAGE_INFO | ( | gptomoinfo | , |
| GPTOMOINFO | |||
| ) |
| QDir baseDir |
Referenced by geopsyToFile(), GeopsyMainWindow::loadFilePattern(), and main().