[Rivet] Memory error

Alan Kaptanoglu alank2 at alumni.stanford.edu
Mon Oct 17 16:38:24 BST 2016


Thank you very much! I read that in useJetArea() but was not sure how to
get around it. Your line "  fj.useJetArea(new
fastjet::AreaDefinition(fastjet::VoronoiAreaSpec()));"
works perfectly. Passing it by value was a typo!

Cheers,
Alan

On Mon, Oct 17, 2016 at 4:47 PM, Andy Buckley <andy.buckley at cern.ch> wrote:

> On 17/10/16 15:29, Alan Kaptanoglu wrote:
>
>> Hello,
>>
>> I am trying to declare jets with area in the initialization section of
>> my Rivet Analysis. I originally tried:
>>
>>       fastjet::GhostedAreaSpec areaspec(2.5,1,0.01);
>>       fastjet::AreaDefinition
>> area_def(fastjet::active_area_explicit_ghosts,areaspec);
>>       FastJets jets(vfs, FastJets::ANTIKT, Rsmall);
>>       jets.useJetArea(area_def);
>>       jets.useInvisibles(JetAlg::ALL_INVISIBLES);
>>       jets.useMuons(JetAlg::DECAY_MUONS);
>>       declare(jets, "jets");
>>
>> but this definition goes out of scope so when I ask for jet areas in my
>> "analysis" section of my code, it complains the jets have no valid jet
>> area associated with them. I next tried several versions of:
>>
>>       areaspec = new fastjet::GhostedAreaSpec(2.5,1,0.01);
>>       area_def = new
>> fastjet::AreaDefinition(fastjet::active_area_explicit_ghosts,*areaspec);
>>       FastJets jets(vfs, FastJets::ANTIKT, Rsmall);
>>       jets.useJetArea(area_def);
>>       jets.useInvisibles(JetAlg::ALL_INVISIBLES);
>>       jets.useMuons(JetAlg::DECAY_MUONS);
>>       declare(jets, "jets");
>>
>> where areaspec and area_def are private members of my Analysis class. I
>> also tried initializing these variables in my constructor using
>> initialization lists, as well as declaring them global variables (and
>> yes, to my knowledge, I am also deleting them correctly if I use "new").
>> In all these cases, the code runs correctly but complains at the end of
>> a memory error, which is attached in a text file. Any idea why this is
>> happening or how to fix?
>>
>
> Hi Alan,
>
> The AreaDefinition provided to FastJets must be a heap-allocated pointer
> whose ownership is then taken over by the FastJets object: it will delete
> the pointer at the end of the run so you shouldn't try to do that yourself.
> (This is documented on the useJetArea() function)
>
> To this end I usually make sure that I don't have a variable of my own
> pointing at that area def objects, e.g.
>  fj.useJetArea(new fastjet::AreaDefinition(fastjet::VoronoiAreaSpec()));
>
> As you noticed, if you pass in a locally allocated object, it goes out of
> scope and you get a crash. Although I'm not sure how you're able to pass it
> in by value rather than by pointer!
>
> I would like, if possible, to avoid this pointer ownership stuff in the
> FastJets interface... I'm sure it's possible, just needs a bit of care and
> thought about backward compatibility. Pointers were used historically
> because we need the option of a null AreaDefinition, and there's no such
> thing as a null reference in C++.
>
> Hope that helps,
> Andy
>
> --
> Dr Andy Buckley, Lecturer / Royal Society University Research Fellow
> Particle Physics Expt Group, University of Glasgow
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.hepforge.org/lists-archive/rivet/attachments/20161017/c895aa66/attachment.html>


More information about the Rivet mailing list