Changeset 19068


Ignore:
Timestamp:
07/21/18 14:57:22 (6 years ago)
Author:
tbretz
Message:
Made the code and output more consistent, added the option to update and some more details.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/calcsource.cc

    r19053 r19068  
    4949    control.add_options()
    5050        ("uri,u",          var<string>()->required(), "Database link as in\n\tuser:password@server[:port]/database.")
    51         ("ra",             var<double>()/*5.575539)*/,                "")
    52         ("dec",            var<double>()/*22.014500)*/,                "")
    53         ("focal-dist",     var<double>(4889.),                "")
    5451        //("source-key",     var<uint32_t>(5),                "")
    5552        //("source-name",    var<string>(""),               "")
    56         ("file",           var<uint32_t>(171011115)->required(),           "")
    57         ("drop",           po_switch(),               "Drop the table (implied create)")
    58         ("list-files",     po_switch(),               "")
    59         ("tree,t",         var<string>("Events"),     "Name of the root tree to convert")
    60         ("table",          var<string>("Events"),     "")
    61         ("update",         var<string>(""),     "")
    62         ("create",         po_switch(),     "")
     53        ("file",           var<uint32_t>(0),          "FileId (YYMMDDXXX), defined the events to be processed (if omitted (=0), a list of possible numbers is printed)")
     54        ("table.events",   var<string>("Events"),     "Name of the table where the events are stored")
     55        ("table.runinfo",  var<string>("RunInfo"),    "Name of the table where the run-info data is stored")
     56        ("table.source",   var<string>("Source"),     "Name of the table where the sources are stored")
     57        ("table.position", var<string>("Position"),   "Name of the table where the calculated posiiton will be stored")
     58        ("force",          po_switch(),               "Force processing even if there is no database connection")
     59        ("drop",           po_switch(),               "Drop the table (implies create)")
     60        ("create",         po_switch(),               "Create the table if it does not yet exist")
     61        ("update",         po_switch(),               "Update the table.position instead of inserting it (disables drop, create and delete)")
     62        ("no-insert",      po_switch(),               "Does not insert or update any data to any table")
     63        ("dry-run",        po_switch(),               "Skip any query which changes the databse (might result in consecutive failures)")
     64        ("ra",             var<double>(),             "Right ascension of the source (use together with --dec)")
     65        ("dec",            var<double>(),             "Declination of the source (use together with --ra)")
     66        ("focal-dist",     var<double>(4889.),        "Focal distance of the camera in millimeter")
    6367        ("verbose,v",      var<uint16_t>(1),          "Verbosity (0: quiet, 1: default, 2: more, 3, ...)")
    64         ("no-insert",      po_switch(),               "Does not insert any data to the table")
    65         //("print-insert",   po_switch(),               "Print the INSERT query (note that it contains all data)")
    66         //("print-create",   po_switch(),               "Print the CREATE query")
     68        ("print-meta",     po_switch(),               "Print meta-queries (DROP, CREATE, DELETE, SELECT)")
     69        ("print-insert",   po_switch(),               "Print the INSERT/UPDATE queries")
    6770        ;
    6871
     
    192195
    193196    // ----------------------------- Evaluate options --------------------------
     197    if (conf.Has("ra")^conf.Has("dec"))
     198        throw runtime_error("--ra and --dec can only be used together");
     199
    194200    const bool has_radec = conf.Has("ra") && conf.Has("dec");
    195201
    196     const string   uri         = conf.Get<string>("uri");
    197     const uint32_t file        = conf.Get<uint32_t>("file");
    198     const string   tree        = conf.Get<string>("tree");
    199     const string   table       = conf.Get<string>("table");
     202    double source_ra            = conf.Has("ra")  ? conf.Get<double>("ra")  : 0;
     203    double source_dec           = conf.Has("dec") ? conf.Get<double>("dec") : 0;
     204
    200205    //string  source_name      = conf.Get<string>("source-name");
    201206    //uint32_t source_key      = conf.Has("source-key")  ? conf.Get<uint32_t>("source-key") : 0;
    202     double   source_ra       = conf.Has("ra")  ? conf.Get<double>("ra")  : 0;
    203     double   source_dec      = conf.Has("dec") ? conf.Get<double>("dec") : 0;
    204     double   focal_dist    = conf.Get<double>("focal-dist");
    205     //const bool     print_create   = conf.Get<bool>("print-create");
    206     //const bool     print_insert   = conf.Get<bool>("print-insert");
    207     const bool     drop        = conf.Get<bool>("drop");
    208     const bool     create      = conf.Get<bool>("create") || drop;
    209     const string   update      = conf.Get<string>("update");
    210     const bool     list_files  = conf.Get<bool>("list-files");
    211     const uint16_t verbose     = conf.Get<uint16_t>("verbose");
     207
     208    const string   uri          = conf.Get<string>("uri");
     209    const string   tab_events   = conf.Get<string>("table.events");
     210    const string   tab_runinfo  = conf.Get<string>("table.runinfo");
     211    const string   tab_source   = conf.Get<string>("table.source");
     212    const string   tab_position = conf.Get<string>("table.position");
     213
     214    const uint32_t file         = conf.Get<uint32_t>("file");
     215
     216    const double   focal_dist   = conf.Get<double>("focal-dist");
     217
     218    const bool     print_meta   = conf.Get<bool>("print-meta");
     219    const bool     print_insert = conf.Get<bool>("print-insert");
     220
     221    const bool     force        = conf.Get<bool>("force");
     222    const bool     drop         = conf.Get<bool>("drop");
     223    const bool     create       = conf.Get<bool>("create") || drop;
     224    const bool     update       = conf.Get<bool>("update");
     225    const bool     noinsert     = conf.Get<bool>("no-insert");
     226    const bool     dry_run      = conf.Get<bool>("dry-run");
     227    const uint16_t verbose      = conf.Get<uint16_t>("verbose");
    212228
    213229    // -------------------------------------------------------------------------
    214 
    215     if (list_files)
     230    // Checking for database connection
     231
     232    Database connection(uri); // Keep alive while fetching rows
     233
     234    try
     235    {
     236        if (!force)
     237            connection.connected();
     238    }
     239    catch (const exception &e)
     240    {
     241        cerr << "SQL connection failed: " << e.what() << endl;
     242        return 1;
     243    }
     244
     245    // -------------------------------------------------------------------------
     246    // list file-ids in the events table
     247
     248    if (file==0)
    216249    {
    217250        const string query =
    218             "SELECT FileId FROM Events GROUP BY FileId";
    219 
    220         cout << query << endl;
     251            "SELECT FileId FROM `"+tab_events+"` GROUP BY FileId";
     252
     253        if (print_meta)
     254            cout << query << endl;
    221255
    222256        const mysqlpp::StoreQueryResult res =
    223             Database(uri).query(query).store();
     257            connection.query(query).store();
    224258
    225259        for (size_t i=0; i<res.num_rows(); i++)
     
    230264    }
    231265
     266    // -------------------------------------------------------------------------
     267    // retrieve source from the database
     268
    232269    if (verbose>0)
     270    {
    233271        cout << "\n------------------------- Evaluating source ------------------------" << endl;
    234 
    235     cout << "Requesting coordinates from RunInfo/Source table for 20" << file/1000 << "/" << file%1000 << endl;
     272        cout << "Requesting coordinates from " << tab_runinfo << "/" << tab_source << " table for 20" << file/1000 << "/" << file%1000 << endl;
     273    }
    236274
    237275    if (!has_radec)
    238276    {
    239277        const string query =
    240             "SELECT Source.fRightAscension, Source.fDeclination, Source.fSourceName"
    241             " FROM RunInfo"
    242             " LEFT JOIN Source"
     278            "SELECT "+tab_source+".fRightAscension, "+tab_source+".fDeclination, "+tab_source+".fSourceName"
     279            " FROM `"+tab_runinfo+"`"+
     280            " LEFT JOIN `"+tab_source+"`"+
    243281            " USING (fSourceKey)"
    244282            " WHERE fNight=20"+to_string(file/1000)+
    245283            " AND fRunID="+to_string(file%1000);
    246284
    247         cout << query << endl;
     285        if (print_meta)
     286            cout << query << endl;
     287
     288        try
     289        {
     290            const mysqlpp::StoreQueryResult res =
     291                connection.query(query).store();
     292
     293            if (res.num_rows()!=1)
     294            {
     295                cerr << "No coordinates from " << tab_runinfo << " for " << file << endl;
     296                return 2;
     297            }
     298
     299            source_ra  = res[0][0];
     300            source_dec = res[0][1];
     301
     302            if (verbose>0)
     303                cout << "Using coordinates " << source_ra << "h / " << source_dec << " deg for '" << res[0][2] << "'" << endl;
     304        }
     305        catch (const exception &e)
     306        {
     307            cerr << query << "\n";
     308            cerr << "SQL query failed:\n" << e.what() << endl;
     309            return 3;
     310        }
     311    }
     312    else
     313        if (verbose>0)
     314            cout << "Using coordinates " << source_ra << "h / " << source_dec << " deg from resources." << endl;
     315
     316/*
     317    if (!source_name.empty())
     318    {
     319        cout << "Requesting coordinates for '" << source_name << "'" << endl;
    248320
    249321        const mysqlpp::StoreQueryResult res =
    250             Database(uri).query(query).store();
     322            connection.query("SELECT `Ra`, `Dec` WHERE fSourceName='"+source_name+"'").store();
    251323
    252324        if (res.num_rows()!=1)
    253325        {
    254             cerr << "No coordinates from RunInfo for " << file << endl;
     326            cerr << "No " << (res.num_rows()>1?"unique ":"") << "coordinates found for '" << source_name << "'" << endl;
    255327            return 1;
    256328        }
     
    258330        source_ra  = res[0][0];
    259331        source_dec = res[0][1];
    260 
    261         cout << "Using coordinates " << source_ra << "h / " << source_dec << " deg for " << res[0][2] << endl;
    262     }
    263     else
    264         cout << "Using coordinates " << source_ra << "h / " << source_dec << " deg from resources." << endl;
    265 
    266 /*
    267     if (!source_name.empty())
    268     {
    269         cout << "Requesting coordinates for '" << source_name << "'" << endl;
    270 
    271         const mysqlpp::StoreQueryResult res =
    272             Database(uri).query("SELECT `Ra`, `Dec` WHERE fSourceName='"+source_name+"'").store();
    273 
    274         if (res.num_rows()!=1)
    275         {
    276             cerr << "No " << (res.num_rows()>1?"unique ":"") << "coordinates found for '" << source_name << "'" << endl;
    277             return 1;
    278         }
    279 
    280         source_ra  = res[0][0];
    281         source_dec = res[0][1];
    282332    }
    283333*/
    284334
     335    // -------------------------------------------------------------------------
     336    // create INSERT/UPDATE query (calculate positions)
     337
    285338    if (verbose>0)
    286         cout << "\n-------------------------- Evaluating file ------------------------" << endl;
    287 
    288 
    289     Database connection(uri); // Keep alive while fetching rows
     339    {
     340        cout << "\n-------------------------- Evaluating file ------------------------";
     341        cout << "\nRequesting data from table `" << tab_events << "`" << endl;
     342    }
    290343
    291344    const string query =
    292345        "SELECT `Ra`, `Dec`, MJD, MilliSec, NanoSec, Zd, Az, EvtNumber"
    293         " FROM `"+table+"`"
     346        " FROM `"+tab_events+"`"
    294347        " WHERE FileId="+to_string(file);
    295348
    296     cout << query << endl;
     349    if (print_meta)
     350        cout << query << endl;
    297351
    298352    const mysqlpp::UseQueryResult res1 =
     
    314368    ins << setprecision(16);
    315369
    316     ostringstream upd;
    317     upd << setprecision(16);
     370    vector<string> upd;
    318371
    319372    size_t count = 0;
     
    468521        */
    469522
    470         if (1/*insert*/)
     523        if (!update)
    471524            ins << "( " << file << ", " << event << ", " << v.X() << ", " << v.Y() << " ),\n";
    472 
    473         if (!update.empty())
    474             upd << "UPDATE " << update << " SET X=" << v.X() << ", Y=" << v.Y() << " WHERE FileId=" << file << " AND EvtNumber=" << event <<";\n";
    475     };
     525        else
     526        {
     527            ostringstream out;
     528            out << setprecision(16);
     529            out << "UPDATE `" << tab_position << "` SET X=" << v.X() << ", Y=" << v.Y() << " WHERE FileId=" << file << " AND EvtNumber=" << event;
     530            upd.emplace_back(out.str());
     531        }
     532    }
    476533
    477534    if (connection.errnum())
    478535    {
    479536        cerr << "SQL error fetching row: " << connection.error() << endl;
    480         return 7;
    481     }
    482 
    483 
    484     if (drop)
    485     {
    486         cout << "Drop table Position." << endl;
    487         const mysqlpp::SimpleResult res2 =
    488             Database(uri).query("DROP TABLE Position").execute();
    489 
    490         //cout << res.rows() << " rows affected." << res.info() << endl;
    491     }
    492 
    493 
    494     if (create)
    495     {
    496         cout << "Create table Position." << endl;
    497         const mysqlpp::SimpleResult res3 =
    498             Database(uri).query("CREATE TABLE IF NOT EXISTS Position\n"
    499                                 "(\n"
    500                                 "   FileId INT UNSIGNED NOT NULL,\n"
    501                                 "   EvtNumber INT UNSIGNED NOT NULL,\n"
    502                                 "   X FLOAT NOT NULL,\n"
    503                                 "   Y FLOAT NOT NULL,\n"
    504                                 "   PRIMARY KEY (FileId, EvtNumber)\n"
    505                                 ")\n"
    506                                 "DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci\n"
    507                                 "ENGINE=MyISAM\n"
    508                                 "COMMENT='created by root2db'\n").execute();
    509 
    510         //cout << res.rows() << " rows affected." << res.info() << endl;
    511 
    512     }
    513     else
    514     {
    515         // FIXME: Only if entries exist?
    516         cout << "Delete old entries from Position." << endl;
    517         const mysqlpp::SimpleResult res3 =
    518             Database(uri).query("DELETE FROM Position WHERE FileId="+to_string(file)).execute();
    519 
    520         cout << res3.rows() << " rows affected." << endl;
    521     }
    522 
    523     if (1/*insert*/)
    524     {
    525         cout << "Insert data into table Position." << endl;
    526         const string query3 =
    527             "INSERT `Position` (FileId, EvtNumber, X, Y) VALUES\n"+
     537        return 4;
     538    }
     539
     540    if (verbose>0)
     541        cout << "Processed " << count << " events.\n" << endl;
     542
     543    // -------------------------------------------------------------------------
     544    // drop table if requested
     545
     546    if (drop && !update)
     547    {
     548        try
     549        {
     550            if (verbose>0)
     551                cout << "Dropping table `" << tab_position << "`" << endl;
     552
     553            if (!dry_run)
     554                connection.query("DROP TABLE `"+tab_position+"`").execute();
     555
     556            if (verbose>0)
     557                cout << "Table `" << tab_position << "` dropped.\n" << endl;
     558        }
     559        catch (const exception &e)
     560        {
     561            cerr << "DROP TABLE `" << tab_position << "`\n\n";
     562            cerr << "SQL query failed:\n" << e.what() << endl;
     563            return 5;
     564        }
     565    }
     566
     567    // -------------------------------------------------------------------------
     568    // crate table if requested
     569
     570    if (create && !update)
     571    {
     572        if (verbose>0)
     573            cout << "Creating table `" << tab_position << "`" << endl;
     574
     575        const string query2 =
     576            "CREATE TABLE IF NOT EXISTS `"+tab_position+"`\n"
     577            "(\n"
     578            "   FileId INT UNSIGNED NOT NULL,\n"
     579            "   EvtNumber INT UNSIGNED NOT NULL,\n"
     580            "   X FLOAT NOT NULL,\n"
     581            "   Y FLOAT NOT NULL,\n"
     582            "   PRIMARY KEY (FileId, EvtNumber)\n"
     583            ")\n"
     584            "DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci\n"
     585            "ENGINE=MyISAM\n"
     586            "COMMENT='created by "+conf.GetName()+"'\n";
     587
     588        try
     589        {
     590            if (!dry_run)
     591                connection.query(query2).execute();
     592        }
     593        catch (const exception &e)
     594        {
     595            cerr << query2 << "\n\n";
     596            cerr << "SQL query failed:\n" << e.what() << endl;
     597            return 6;
     598        }
     599
     600        if (print_meta)
     601            cout << query2 << endl;
     602
     603        if (verbose>0)
     604            cout << "Table `" << tab_position << "` created.\n" << endl;
     605    }
     606
     607    // -------------------------------------------------------------------------
     608    // delete old entries from table
     609
     610    if (!drop && !update)
     611    {
     612        if (verbose>0)
     613            cout << "Deleting old entries from table `" << tab_position << "`" << endl;
     614
     615        const string query2 =
     616            "DELETE FROM `"+tab_position+"` WHERE FileId="+to_string(file);
     617
     618        try
     619        {
     620            if (!dry_run)
     621            {
     622                const mysqlpp::SimpleResult res =
     623                    connection.query(query2).execute();
     624
     625                if (verbose>0)
     626                    cout << res.rows() << " row(s) affected.\n" << endl;
     627            }
     628        }
     629        catch (const exception &e)
     630        {
     631            cerr << query2 << "\n\n";
     632            cerr << "SQL query failed:\n" << e.what() << endl;
     633            return 7;
     634        }
     635
     636        if (print_meta)
     637            cout << query2 << endl;
     638    }
     639
     640    // -------------------------------------------------------------------------
     641    // insert data into table
     642
     643    if (!update)
     644    {
     645        if (verbose>0)
     646            cout << "Inserting data into table " << tab_position << "." << endl;
     647
     648        const string query2 =
     649            "INSERT `"+tab_position+"` (FileId, EvtNumber, X, Y) VALUES\n"+
    528650            ins.str().substr(0, ins.str().size()-2)+
    529651            "\n";
    530652
    531         if (0/*print_insert*/)
    532             cout << query3 << endl;
    533 
    534         const mysqlpp::SimpleResult res3 =
    535             Database(uri).query(query3).execute();
    536 
    537         cout << res3.info() << endl;
    538     }
    539 
    540     if (!update.empty())
    541     {
    542         cout << upd.str() << endl;
    543         const mysqlpp::StoreQueryResult res3 =
    544             connection.query(upd.str()).store();
    545 
    546         /*
    547          mysqlpp::Connection con(db, server, user, pass);
    548          // Set option to allow multiple queries to be issued.
    549          mysqlpp::MultiStatementsOption* opt = new mysqlpp::MultiStatementsOption(true);
    550          con.set_option(opt);
    551          // Build either single queries or multiple queries strung together.
    552          mysqlpp::Query query = con.query();
    553          ....
    554          // Issue query
    555          query.store();
    556          // Do NOT delete 'opt'; it will be destroyed by the 'con' object when it
    557          // falls out of scope.
    558          */
    559     }
    560 
    561     //cout << ins.str().substr(0, ins.str().size()-2) << endl;
    562     //cout << count << endl;
     653        try
     654        {
     655            if (!noinsert)
     656            {
     657                const mysqlpp::SimpleResult res =
     658                    connection.query(query2).execute();
     659
     660                if (verbose>0)
     661                    cout << res.rows() << " row(s) affected.\n" << endl;
     662            }
     663        }
     664        catch (const exception &e)
     665        {
     666            cerr << query2 << "\n\n";
     667            cerr << "SQL query failed:\n" << e.what() << endl;
     668            return 8;
     669        }
     670
     671        if (print_insert)
     672            cout << query2 << endl;
     673    }
     674
     675
     676
     677    // -------------------------------------------------------------------------
     678    // update data in table
     679
     680    if (update)
     681    {
     682        if (verbose>0)
     683            cout << "Updating data in table " << tab_position << "." << endl;
     684
     685        size_t cnt = 0;
     686        for (const auto &str : upd)
     687        {
     688            try
     689            {
     690                if (!noinsert && !dry_run)
     691                {
     692                    const mysqlpp::SimpleResult res =
     693                        connection.query(str).execute();
     694
     695                    cnt += res.rows();
     696                }
     697            }
     698            catch (const exception &e)
     699            {
     700                cerr << str << "\n\n";
     701                cerr << "SQL query failed:\n" << e.what() << endl;
     702                return 9;
     703            }
     704        }
     705
     706        if (verbose>0)
     707            cout << cnt << " row(s) out of " << upd.size() << " affected.\n" << endl;
     708
     709        if (print_insert)
     710        {
     711            for (const auto &str : upd)
     712                cout << str << '\n';
     713            cout << endl;
     714        }
     715    }
     716
     717    if (verbose>0)
     718        cout << "Total execution time: " << Time().UnixTime()-start.UnixTime() << "s\n" << endl;
    563719
    564720    return 0;
Note: See TracChangeset for help on using the changeset viewer.