RDataFrame Inputs for a Just-In-Time Compiled C++ Class

I’m trying to use Just-In-Time compilation with the following code:

cpp_code = """
typedef ROOT::VecOps::RVec<Float_t>                        RVec_f;
typedef ROOT::VecOps::RVec<Int_t>                          RVec_i;



class MatchOppositelyChargedMuons
{
    private:
        RVec_f Muon_pt;
        RVec_f Muon_eta;
        RVec_f Muon_phi;
        RVec_f Muon_mass;
        RVec_i Muon_charge;


    public:
        MatchOppositelyChargedMuons(RVec_f Muon_pt, RVec_f Muon_eta, RVec_f Muon_phi, RVec_f Muon_mass, RVec_i Muon_charge);
        int Test();
        RVec_f MuonSorter();
        RVec_f InvariantMassCalculator();
};

MatchOppositelyChargedMuons::MatchOppositelyChargedMuons(RVec_f Muon_pt, RVec_f Muon_eta, RVec_f Muon_phi, RVec_f Muon_mass, RVec_i Muon_charge)
{
    this->Muon_pt = Muon_pt;
    this->Muon_eta = Muon_eta;
    this->Muon_phi = Muon_phi;
    this->Muon_mass = Muon_mass;
    this->Muon_charge = Muon_charge;
}

int MatchOppositelyChargedMuons::Test()
{
    return 0;
}


/* This function matches each muon with oppositely charged muons. */
RVec_f MatchOppositelyChargedMuons::InvariantMassCalculator()
{ 
    RVec_f pt {};
    RVec_f eta {};
    RVec_f phi {};
    RVec_f mass {};
    RVec_f InvariantMasses {};
    int i = 0;
    float im = 0;
        
    /* Loop over the set of muons to determine which muons have +1 charge, then match them with all the ones with -1 charge. */
    for(int charge : this->Muon_charge)
    {
        if(charge == 1)
        {
            /* If charges are opposite, calculate the invariant mass of them */
            for(int j = i+1; j < this->Muon_charge.size(); j++)
            {
                if(charge == -1)
                {
                    pt.push_back(Muon_pt[i]);
                    eta.push_back(Muon_eta[i]);
                    phi.push_back(Muon_phi[i]);
                    mass.push_back(Muon_mass[i]);
                    
                    im = ROOT::VecOps::InvariantMass(pt, eta, phi, mass);
                        
                    InvariantMasses.push_back(im);
                    
                    pt.clear();
                    eta.clear();
                    phi.clear();
                    mass.clear();
                }
            }
        }
            
        i++;
    }
        
    return InvariantMasses;
}
"""

ROOT.gInterpreter.Declare(cpp_code)

rdfTriggersAndMasks[sample] = rdf[sample].Filter("HLT_IsoMu27 == true", "HLTTriggerSingleMuonTrigger").Define("LumiXS",wgtFormula[sample])\
        .Define("mu_mask", "Muon_pt > 30 && abs(Muon_eta) < 2.4 && Muon_tightId == true && Muon_pfIsoId >= 4")\
        .Define("mu_veto", "Muon_pt > 10 && abs(Muon_eta) < 2.4 && Muon_looseId == true && Muon_pfIsoId >= 4 && mu_mask == false")\
        .Define("InvariantMasses", "ROOT.MatchOppositelyChargedMuons(Muon_pt, Muon_eta, Muon_phi, Muon_mass, Muon_charge)")

However, I get a ton of error messages:

runtime_error: Template method resolution failed:
ROOT::RDF::RInterfaceROOT::Detail::RDF::RJittedFilter,void ROOT::RDF::RInterfaceROOT::Detail::RDF::RJittedFilter,void::Define(basic_string_view<char,char_traits > name, basic_string_view<char,char_traits > expression) =>
runtime_error:
RDataFrame: An error occurred during just-in-time compilation. The lines above might indicate the cause of the crash
All RDF objects that have not run an event loop yet should be considered in an invalid state.

                                                                                                                                                                                                  ^

input_line_102:2:199: error: unexpected namespace name ‘ROOT’: expected expression
auto lambda4 = [](ROOT::VecOps::RVec<Float_t>& var0, ROOT::VecOps::RVec<Float_t>& var1, ROOT::VecOps::RVec<Float_t>& var2, ROOT::VecOps::RVec<Float_t>& var3, ROOT::VecOps::RVec<Int_t>& var4){return ROOT.MatchOppositelyChargedMuons(var0, var1, var2, var3, var4)

How do I properly use pieces of an RDataFrame as inputs for an object of my class?


Please read tips for efficient and successful posting and posting code

ROOT Version: Not Provided
Platform: Not Provided
Compiler: Not Provided


Try changing this to ROOT::MatchOppositelyChargedMuons