#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().