|
[Rivet] Memory errorAlan Kaptanoglu alank2 at alumni.stanford.eduMon 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 |