Changeset 19809


Ignore:
Timestamp:
10/27/19 16:44:59 (5 years ago)
Author:
tbretz
Message:
Found and corrected the problem why aliases of aliases stay empty... the bracnhes are not read as no address is set as TTreeFormula does not recognize them... or I have not yet found how to find out which ones need to be enabled.
File:
1 edited

Legend:

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

    r19806 r19809  
    4242        //("const.*",        var<string>(),             "Insert a constant number into the given column (--const.mycolumn=5). A special case is `/.../.../`")
    4343        ("dry-run",        po_switch(),               "Do not create or manipulate any output file")
     44        ("no-indirection", po_switch(),               "Column of alias of alias need all auto-aliases to be enables. This is slow. If you know that you do not have any, use this for faster processing.")
    4445        ;
    4546
     
    124125        "automatically allowing to access the columns in a formula with the new name.\n"
    125126        "\n"
     127        "Note that in the default configuration, all data which is auto-alias'ed is read "
     128        "from the file. This can become quite slow if there is a lot. An alternative is "
     129        "to switch on no-indirections with --no-indirection. The ensures that only "
     130        "references leaves are read, which can signiifcantly accelerate reading. "
     131        "The disadvantage is that adding a column which reference an alias which "
     132        "itself references an alias will fail.\n"
     133        "\n"
    126134        "Sometimes it might also be convenient to skip a leaf, i.e. not writing the "
    127135        "coresponding column in the output file. This can be done with "
     
    222230}
    223231
    224 void GetLeaves(vector<string> &list, const TTreeFormula &f)
     232void GetLeaves(set<string> &list, const TTreeFormula &f)
    225233{
    226234    int i=0;
     
    230238        if (!l)
    231239            return;
    232         list.emplace_back(l->GetName());
     240
     241        list.emplace(l->GetName());
    233242    }
    234243}
     
    257266    const bool dryrun            = conf.Get<bool>("dry-run");
    258267    const bool skip              = conf.Get<bool>("skip");
     268    const bool noindirect        = conf.Get<bool>("no-indirection");
    259269
    260270    const uint16_t verbose       = conf.Get<uint16_t>("verbose");
     
    396406    */
    397407
     408    set<string> leaflist;
     409
    398410    // ------------------------- Setup all branches in tree -------------------
    399411
     
    402414        while ((o=Next()))
    403415        {
    404             TLeaf *L = c.GetLeaf(o->GetName());
     416            TLeaf *L = dynamic_cast<TLeaf*>(o);//c.GetLeaf(o->GetName());
     417            if (!L)
     418                continue;
    405419
    406420            string name = o->GetName();
    407 
    408             for (auto m=autoalias.cbegin(); m!=autoalias.cend(); m++)
    409                 name = boost::regex_replace(name, boost::regex(m->first), m->second);
    410 
    411             if (name!=o->GetName())
    412             {
    413                 if (verbose>0)
    414                     cout << "Auto-alias: " << name << " = " << o->GetName() << endl;
    415                 if (!c.SetAlias(name.c_str(), o->GetName()))
    416                     cout << "WARNING - Alias could not be established!" << endl;
    417             }
    418 
    419             if (skip)
    420                 continue;
    421 
    422421            if (verbose>2)
    423422                cout << '\n' << L->GetTitle() << " {" << L->GetTypeName() << "}";
    424423
     424            const string tn = L->GetTypeName();
     425
     426            // Check if this is a basic type, otherwise skip
     427            const auto it = FileEntry::LUT.root(tn);
     428            if (it==FileEntry::LUT.cend())
     429            {
     430                if (verbose>2)
     431                    cout << " (-n/a-)";
     432                continue;
     433            }
     434
     435            // Check if this is an array, otherwise skip
    425436            if (L->GetLenStatic()!=L->GetLen())
    426437            {
     
    430441            }
    431442
    432             bool found = false;
     443            // Check for renaming via auto-alias
     444            for (auto m=autoalias.cbegin(); m!=autoalias.cend(); m++)
     445                name = boost::regex_replace(name, boost::regex(m->first), m->second);
     446
     447            // if renaming has changed name, define alias
     448            if (name!=o->GetName())
     449            {
     450                if (!c.SetAlias(name.c_str(), o->GetName()))
     451                {
     452                    cerr << "\nERROR - Alias could not be established!\n";
     453                    cerr << "   " << name << " = " << o->GetName() << endl;
     454                    return 1;
     455                }
     456                if (verbose==1 || verbose==2)
     457                    cout << "\nAuto-alias: " << name << " = " << o->GetName();
     458                if (verbose>2)
     459                    cout << " <alias:" << name << ">";
     460
     461                if (!noindirect)
     462                    leaflist.emplace(o->GetTitle());
     463            }
     464
     465            // Check whether the un-aliased column is in the ignore list
     466            bool found = skip;
    433467            for (auto b=_ignore.cbegin(); b!=_ignore.cend(); b++)
    434468            {
     
    441475                }
    442476            }
     477
     478            // Check whether the aliased column is in the ignore list
    443479            for (auto b=_ignore.cbegin(); b!=_ignore.cend(); b++)
    444480            {
     
    452488            }
    453489
    454             if (found)
    455                 continue;
    456 
    457             const string tn = L->GetTypeName();
    458 
    459             const auto it = FileEntry::LUT.root(tn);
    460             if (it==FileEntry::LUT.cend())
    461             {
    462                 if (verbose>2)
    463                     cout << " (-n/a-)";
    464                 continue;
    465             }
    466 
    467             if (verbose==2)
    468                 cout << '\n' << L->GetTitle() << " {" << L->GetTypeName() << "}";
    469 
    470             if (verbose>1)
    471                 cout << " (" << name << ")";
    472 
     490            if (!found)
     491                leaflist.emplace(o->GetTitle());
     492
     493            // As it is easier, we setup addresses for all branches
     494            // also for the ones not requested. They might later be
     495            // requested by a formula.
    473496            vec.emplace_back(o->GetTitle(), name, it->type, L->GetLenStatic());
    474497            c.SetBranchAddress(o->GetTitle(), vec.back().ptr);
     
    477500        if (verbose>0)
    478501        {
     502            cout << '\n';
    479503            if (skip)
    480504                cout << "Default columns skipped: ";
    481505            cout << vec.size() << " default leaf/leaves setup for reading." << endl;
    482506        }
    483 
    484507
    485508    // ------------------- Configure manual aliases ----------------------------
     
    498521        if (!c.SetAlias(name.c_str(), val.c_str()))
    499522        {
    500             cerr << "Alias could not be established!" << endl;
     523            cerr << "\nERROR - Alias could not be established!\n";
     524            cerr << "   " << name << " = " << val << endl;
    501525            return 2;
    502526        }
     
    504528
    505529    // -------------------------- Configure Selector --------------------------
    506 
    507     vector<string> leaflist;
    508     c.SetBranchStatus("*", 1);
    509530
    510531    TTreeFormulaManager *manager = new TTreeFormulaManager;
     
    554575        cout << '\n' << formulas.size() << " additional columns setup for writing." << endl;
    555576
    556     // --------------------- Setup all branches in formulas -------------------
    557 
    558     for (auto l=leaflist.cbegin(); l!=leaflist.cend(); l++)
    559     {
    560         // Branch address already set
    561         if (c.GetBranch(l->c_str())->GetAddress())
    562             continue;
    563 
    564         TLeaf *L = c.GetLeaf(l->c_str());
    565 
    566         if (verbose>2)
    567             cout << '\n' << L->GetTitle() << " {" << L->GetTypeName() << "}";
    568 
    569         if (L->GetLenStatic()!=L->GetLen())
    570         {
    571             if (verbose>2)
    572                 cout << " (-skipped-)";
    573             continue;
    574         }
    575 
    576         const string tn = L->GetTypeName();
    577 
    578         const auto it = FileEntry::LUT.root(tn);
    579         if (it==FileEntry::LUT.cend())
    580         {
    581             if (verbose>2)
    582                 cout << " (-n/a-)";
    583             continue;
    584         }
    585 
    586         if (verbose==2)
    587             cout << '\n' << L->GetTitle() << " {" << L->GetTypeName() << "}";
    588 
    589         if (verbose>1)
    590             cout << " (" << *l << ")";
    591 
    592         vec.emplace_back(l->c_str(), l->c_str(), it->type, L->GetLenStatic());
    593         c.SetBranchAddress(l->c_str(), vec.back().ptr);
    594     }
    595     if (verbose>1)
    596         cout << '\n';
    597 
    598577    // ------------------------- Enable branch reading ------------------------
    599578
    600579    UInt_t datatype = 0;
    601580    const bool has_datatype = c.SetBranchAddress("DataType.fVal", &datatype) >= 0;
     581    if (has_datatype && verbose>0)
     582        cout << "\nRows with DataType.fVal!=1 will be skipped." << endl;
     583
    602584
    603585    // Seting up branch status (must be after all SetBranchAddress)
    604586    c.SetBranchStatus("*", 0);
    605     for (auto v=vec.cbegin(); v!=vec.cend(); v++)
    606         if (v->type!=FileEntry::kConst)
    607             c.SetBranchStatus(v->branch.c_str(), 1);
    608 
    609     if (has_datatype)
    610     {
    611         c.SetBranchStatus("DataType.fVal", 1);
    612         if (verbose>0)
    613             cout << "Rows with DataType.fVal!=1 will be skipped." << endl;
    614     }
     587
     588    for (auto it=leaflist.cbegin(); it!=leaflist.cend(); it++)
     589    {
     590        c.SetBranchStatus(it->c_str(), 1);
     591        if (verbose>2)
     592            cout << "\nEnable Branch: " << *it;
     593    }
     594    if (verbose>2)
     595        cout << endl;
     596
     597    /*
     598    Next.Reset();
     599    while ((o=Next()))
     600    {
     601        const TLeaf *L = dynamic_cast<TLeaf*>(o);//c.GetLeaf(o->GetName());
     602        if (!L)
     603            continue;
     604
     605        const TBranch *B = L->GetBranch();
     606        if (!B)
     607            continue;
     608
     609        if (!B->GetAddress())
     610            continue;
     611
     612        c.SetBranchStatus(B->GetName(), 1);
     613        if (verbose>2)
     614            cout << "\nEnable Branch: " << B->GetName();
     615    }
     616    if (verbose>2)
     617        cout << endl;
     618    */
    615619
    616620    // -------------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.