Storing indices of selected objects into a skim
In some cases it can be useful to store in a skim the original indices of objects passing a selection.
However, doing this:
genJets = op.select(t.GenJet, lambda j: j.pt > 20)
varsToKeep["idxs"] = op.map(genJets, lambda j: j.idx)
results in:
DEBUG:bamboo.dataframebackend:Defining new symbol with interpreter: ROOT::VecOps::RVec<std::size_t> myFun1(const ROOT::VecOps::RVec<Float_t>& myArg0, const UInt_t& myArg1)
{
return rdfhelpers::select(rdfhelpers::IndexRange<std::size_t>{myArg1},
[&myArg0, &myArg1] ( std::size_t i0 ) { return ( myArg0[i0] > 20 ); });
};
DEBUG:bamboo.dataframebackend:Defining myCol1 as myFun1(GenJet_pt, nGenJet)
DEBUG:bamboo.dataframebackend:Defining idxs as rdfhelpers::map<std::size_t>(myCol1,
[&myCol1, i0] ( std::size_t i0 ) { return i0; })
input_line_92:3:15: error: use of undeclared identifier 'i0'
I've managed to get it to work by doing simply
varsToKeep["idxs"] = genJets._idxs
so perhaps it's just a matter of documenting this and making _idxs
public, but there does seem to be an issue with the identification of the lambda captures above...?