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