Functions | Variables
gptomoinfo/main.cpp File Reference
#include <GeopsyCore.h>
#include <QGpCoreTools.h>
#include "gptomoinfoVersion.h"
#include "gptomoinfoInstallPath.h"

Functions

int fileToGeopsy (const SubSignalPool &sigs)
int geopsyToFile (const SubSignalPool &sigs)
ApplicationHelphelp ()
int main (int argc, char **argv)
 PACKAGE_INFO (gptomoinfo, GPTOMOINFO)

Variables

QDir baseDir

Function Documentation

int fileToGeopsy ( const SubSignalPool sigs)

References QGpCoreTools::endl(), and QGpCoreTools::tr().

{
  App::stream() << tr("gptomoinfo: '-ftogp' still to implement") << endl;
  return 2;
}
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;
}
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   
)

Variable Documentation

QDir baseDir
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines