Changeset 12905 for trunk/FACT++/src


Ignore:
Timestamp:
02/18/12 10:12:17 (13 years ago)
Author:
tbretz
Message:
Added the possibility to give a start row and limit on row-numbers; implemented th epossibility to filter the dump.
File:
1 edited

Legend:

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

    r12887 r12905  
    1717#include "Time.h"
    1818#include "externals/fits.h"
     19
     20#ifdef HAVE_ROOT
     21#include "TFormula.h"
     22#endif
    1923
    2024using namespace std;
     
    7276    vector<MyColumn> InitColumns(vector<string> list);
    7377
     78    double GetDouble(const MyColumn &, size_t) const;
     79
    7480    ///Display the selected columns values VS time
    75     void Dump(ofstream &, const vector<MyColumn> &, const string &);
    76     void DumpMinMax(ofstream &, const vector<MyColumn> &, bool);
    77     void DumpStats(ofstream &, const vector<MyColumn> &);
     81    void Dump(ofstream &, const vector<MyColumn> &, const string &, size_t, size_t, const string &);
     82    void DumpMinMax(ofstream &, const vector<MyColumn> &, size_t, size_t, bool);
     83    void DumpStats(ofstream &, const vector<MyColumn> &, size_t, size_t);
    7884
    7985public:
     
    246252}
    247253
     254double FitsDumper::GetDouble(const MyColumn &it, size_t i) const
     255{
     256    switch (it.col.type)
     257    {
     258    case 'A':
     259        return reinterpret_cast<const char*>(it.ptr)[i];
     260
     261    case 'L':
     262        return reinterpret_cast<const bool*>(it.ptr)[i];
     263
     264    case 'B':
     265        return (unsigned int)reinterpret_cast<const uint8_t*>(it.ptr)[i];
     266
     267    case 'I':
     268        return reinterpret_cast<const int16_t*>(it.ptr)[i];
     269
     270    case 'J':
     271        return reinterpret_cast<const int32_t*>(it.ptr)[i];
     272
     273    case 'K':
     274        return reinterpret_cast<const int64_t*>(it.ptr)[i];
     275
     276    case 'E':
     277        return reinterpret_cast<const float*>(it.ptr)[i];
     278
     279    case 'D':
     280        return reinterpret_cast<const double*>(it.ptr)[i];
     281    }
     282
     283    return 0;
     284}
     285
    248286// --------------------------------------------------------------------------
    249287//
    250288//! Perform the actual dump, based on the current parameters
    251289//
    252 void FitsDumper::Dump(ofstream &fout, const vector<MyColumn> &cols, const string &filename)
     290void FitsDumper::Dump(ofstream &fout, const vector<MyColumn> &cols, const string &filter, size_t first, size_t limit, const string &filename)
    253291{
    254292    const fits::Table::Keys &fKeyMap = GetKeys();
    255293
     294    TFormula select;
     295    if (!filter.empty() && select.Compile(filter.c_str()))
     296        throw runtime_error("Syntax Error: TFormula::Compile failed for '"+filter+"'");
     297
    256298    fout << "## --------------------------------------------------------------------------\n";
    257     fout << "## Fits file:\t" << fFilename << '\n';
     299    fout << "## Fits file:  \t" << fFilename << '\n';
    258300    if (filename!="-")
    259         fout << "## File:    \t" << filename << '\n';
    260     fout << "## Table:   \t" << fKeyMap.find("EXTNAME")->second.value << '\n';
    261     fout << "## NumRows: \t" << GetInt("NAXIS2") << '\n';
    262     fout << "## Comment: \t" << ((fKeyMap.find("COMMENT") != fKeyMap.end()) ? fKeyMap.find("COMMENT")->second.value : "") << '\n';
     301        fout << "## File:      \t" << filename << '\n';
     302    fout << "## Table:     \t" << fKeyMap.find("EXTNAME")->second.value << '\n';
     303    fout << "## NumRows:   \t" << GetInt("NAXIS2") << '\n';
     304    fout << "## Comment:   \t" << ((fKeyMap.find("COMMENT") != fKeyMap.end()) ? fKeyMap.find("COMMENT")->second.value : "") << '\n';
     305    if (!filter.empty())
     306        fout << "## Selection: \t" << select.GetExpFormula() << '\n';
    263307    fout << "## --------------------------------------------------------------------------\n";
    264308    ListKeywords(fout);
     
    266310    fout << "#\n";
    267311
     312    size_t num = 0;
    268313    for (auto it=cols.begin(); it!=cols.end(); it++)
    269314    {
     
    279324
    280325        fout << ": " << it->col.unit << '\n';
     326
     327        num += it->last-it->first+1;
    281328    }
    282329    fout << "#" << endl;
     
    284331    // -----------------------------------------------------------------
    285332
    286     while (GetNextRow())
     333    vector<Double_t> data(num);
     334
     335    const size_t last = limit ? first + limit : size_t(-1);
     336
     337    while (GetRow(first++))
    287338    {
    288339        const size_t row = GetRow();
    289         if (row==GetNumRows())
    290             break;
    291 
     340        if (row==GetNumRows() || row==last)
     341            break;
     342
     343        size_t p = 0;
     344
     345        ostringstream out;
    292346        for (auto it=cols.begin(); it!=cols.end(); it++)
    293347        {
    294348            string msg;
    295             for (uint32_t i=it->first; i<=it->last; i++)
     349            for (uint32_t i=it->first; i<=it->last; i++, p++)
    296350            {
    297351                switch (it->col.type)
     
    301355                    break;
    302356                case 'B':
    303                     fout << (unsigned int)reinterpret_cast<const unsigned char*>(it->ptr)[i] << " ";
     357                    out << (unsigned int)reinterpret_cast<const unsigned char*>(it->ptr)[i] << " ";
    304358                    break;
    305359                case 'L':
    306                     fout << reinterpret_cast<const bool*>(it->ptr)[i] << " ";
     360                    out << reinterpret_cast<const bool*>(it->ptr)[i] << " ";
    307361                    break;
    308362                case 'I':
    309                     fout << reinterpret_cast<const int16_t*>(it->ptr)[i] << " ";
     363                    out << reinterpret_cast<const int16_t*>(it->ptr)[i] << " ";
    310364                    break;
    311365                case 'J':
    312                     fout << reinterpret_cast<const int32_t*>(it->ptr)[i] << " ";
     366                    out << reinterpret_cast<const int32_t*>(it->ptr)[i] << " ";
    313367                    break;
    314368                case 'K':
    315                     fout << reinterpret_cast<const int64_t*>(it->ptr)[i] << " ";
     369                    out << reinterpret_cast<const int64_t*>(it->ptr)[i] << " ";
    316370                    break;
    317371                case 'E':
    318                     fout << reinterpret_cast<const float*>(it->ptr)[i] << " ";
     372                    out << reinterpret_cast<const float*>(it->ptr)[i] << " ";
    319373                    break;
    320374                case 'D':
    321                     fout << reinterpret_cast<const double*>(it->ptr)[i] << " ";
     375                    out << reinterpret_cast<const double*>(it->ptr)[i] << " ";
    322376                    break;
    323377                default:
    324378                    ;
    325379                }
     380
     381                if (!filter.empty())
     382                    data[p] = GetDouble(*it, i);
    326383            }
    327384
    328385            if (it->col.type=='A')
    329                 fout << "'" << msg << "' ";
    330         }
    331         fout << endl;
    332     }
    333 }
    334 
    335 void FitsDumper::DumpMinMax(ofstream &fout, const vector<MyColumn> &cols, bool fNoZeroPlease)
     386                out << "'" << msg << "' ";
     387        }
     388
     389        if (!filter.empty() && select.EvalPar(0, data.data())<0.5)
     390            continue;
     391
     392        fout << out.str() << endl;
     393    }
     394}
     395
     396void FitsDumper::DumpMinMax(ofstream &fout, const vector<MyColumn> &cols, size_t first, size_t limit, bool fNoZeroPlease)
    336397{
    337398    vector<minMaxStruct> statData(cols.size());
    338399
    339400    // Loop over all columns in our list of requested columns
    340     while (GetNextRow())
     401    const size_t last = limit ? first + limit : size_t(-1);
     402
     403    while (GetRow(first++))
    341404    {
    342405        const size_t row = GetRow();
    343         if (row==GetNumRows())
     406        if (row==GetNumRows() || row==last)
    344407            break;
    345408
     
    360423            for (uint32_t i=it->first; i<=it->last; i++)
    361424            {
    362                 double cValue = 0;
    363                 switch (it->col.type)
    364                 {
    365                 case 'L':
    366                         cValue = reinterpret_cast<const bool*>(it->ptr)[i];
    367                         break;
    368                 case 'B':
    369                         cValue = reinterpret_cast<const int8_t*>(it->ptr)[i];
    370                         break;
    371                 case 'I':
    372                         cValue = reinterpret_cast<const int16_t*>(it->ptr)[i];
    373                         break;
    374                 case 'J':
    375                         cValue = reinterpret_cast<const int32_t*>(it->ptr)[i];
    376                         break;
    377                 case 'K':
    378                         cValue = reinterpret_cast<const int64_t*>(it->ptr)[i];
    379                         break;
    380                 case 'E':
    381                         cValue = reinterpret_cast<const float*>(it->ptr)[i];
    382                         break;
    383                 case 'D':
    384                         cValue = reinterpret_cast<const double*>(it->ptr)[i];
    385                         break;
    386                 default:
    387                     ;
    388                 }
     425                const double cValue = GetDouble(*it, i);
    389426
    390427                if (fNoZeroPlease && cValue == 0)
     
    469506}
    470507
    471 void FitsDumper::DumpStats(ofstream &fout, const vector<MyColumn> &cols)
     508void FitsDumper::DumpStats(ofstream &fout, const vector<MyColumn> &cols, size_t first, size_t limit)
    472509{
    473510    // Loop over all columns in our list of requested columns
    474511    vector<vector<char>> statData;
    475512
     513    const size_t num = limit==0 || GetNumRows()<limit ? GetNumRows() : limit;
     514
    476515    for (auto it=cols.begin(); it!=cols.end(); it++)
    477         statData.push_back(vector<char>(it->col.size*GetNumRows()*(it->last-it->first+1)));
    478 
    479     while (GetNextRow())
     516        statData.push_back(vector<char>(it->col.size*num*(it->last-it->first+1)));
     517
     518    // Loop over all columns in our list of requested columns
     519    const size_t last = limit ? first + limit : size_t(-1);
     520
     521    while (GetRow(first++))
    480522    {
    481523        const size_t row = GetRow();
    482         if (row==GetNumRows())
    483             break;
     524        if (row==GetNumRows() || row==last)
     525            break;
     526
    484527
    485528        auto statsIt = statData.begin();
     
    576619        return false;
    577620
     621    const string filter = conf.Has("filter") ? conf.Get<string>("filter") : "";
     622
     623    const size_t first  = conf.Get<size_t>("first");
     624    const size_t limit  = conf.Get<size_t>("limit");
     625
    578626    if (conf.Get<bool>("minmax"))
    579627    {
    580         DumpMinMax(fout, cols, conf.Get<bool>("nozero"));
     628        DumpMinMax(fout, cols, first, limit, conf.Get<bool>("nozero"));
    581629        return 0;
    582630    }
     
    584632    if (conf.Get<bool>("stat"))
    585633    {
    586         DumpStats(fout, cols);
     634        DumpStats(fout, cols, first, limit);
    587635        return 0;
    588636    }
    589637
    590     Dump(fout, cols, filename);
     638    Dump(fout, cols, filter, first, limit, filename);
    591639
    592640    return 0;
     
    626674        ("nozero,z",    po_switch(),                "skip 0 values for stats")
    627675        ("force",       po_switch(),                "Force reading the fits file even if END key is missing")
     676        ("first",       var<size_t>(size_t(0)),     "First number of row to read")
     677        ("limit",       var<size_t>(size_t(0)),     "Limit for the maximum number of rows to read (0=unlimited)")
     678#ifdef HAVE_ROOT
     679        ("filter,r",    var<string>(""),            "Filter to restrict the selection of events (does not work with stat and minmax yet)")
     680#endif
    628681        ;
    629682
Note: See TracChangeset for help on using the changeset viewer.