|
[Rivet] Common ParticleFinder interface for accessing composite vs. constituent particles? + 2.5.0 release planAndy Buckley andy.buckley at cern.chFri Jul 1 14:54:22 BST 2016
Thanks Chris, great to have feedback. These are some of the awkward points I've been juggling internally. I pretty much agree with your first 3 paragraphs and think they are what I'm saying. I absolutely agree that if running an XFinder, then I expect the Particles to be returned by XFinder::particles() to be Xs. Which is not the current behaviour. One nuance: if ZFinder is a ParticleFinder (I think it is...) then the bosons would also be accessed through the inherited particles() method. Of course we won't want to apply smearing to Z bosons, but it would be an obvious consequence of defining that particles/constituents access on the base class, and a const ParticleFinder& is what SmearedParticles accepts as an input. Other points: * consitutents() vs rawConstituents()/etc.: the distinction is recursion. Let's say I have a ZFinder, and I ask it for its particles(). It returns me a vector of Particles with pid = 23. I then call Particle:: constituents() on each of those and what do I get? I'd expect the two DressedLeptons*. And if I call constituents() on each of _those_, I finally get down to the fundamental bare leptons and photons which have corresponding GenParticles. So my distinction between Particle::constituents() and Particle::rawConstituents() (please, a better name!) is that the latter would recurse to find the indivisible consitutents, possibly through several layers of composition. Make sense? I guess an indivisible would be defined as a Particle with an empty constituents vector (the existence of which is essential if Particles are to have finite size!!) * bosons() vs. boson(): IIRC the ZFinder code says something specific about only being able to find one candidate boson per event. But since C++ has no NULL/None "invalid value" that can be returned from a boson() function (unless using pointers), we started with bosons() and hence lots of code that looked like bosons()[0]. boson() is just syntactic sugar for that -- I think it throws an exception if there is no boson to be returned, but haven't explicitly checked for that. * Thanks for input on the "release something imperfect, soon". I also think it's the way forward. Any objections? "Release early, release often", as Linus said. Cheers, Andy * Eek. Here's an awkwardness: a vector<Particle> will have sliced each contained DressedParticle down to its Particle base class. To use them as DressedLeptons would require a dynamic_cast (or reinterpret_cast?), or be impossible. Hopefully adding constituent-awareness to Particle will make DressedLepton unnecessary so we can avoid this problem, but this is the sort of thing that makes seemingly simple reorganisations difficult. On 01/07/16 14:27, Christian Gutschow wrote: > Hi Andy, > > why do we need a new name and cannot stick to particles and > constituents, but make them distinct? Is there a technical reason or is > it just backward compatibility? > > Ignoring the status quo, naively I would think that if I call > particles(), say on the DressedLeptons projection, it should return what > I asked it to find, i.e. the dressed leptons, whereas if I run > constituents(), it will give me the raw particles used in the making of > dressed leptons, all of them. Whereas if I run constituents on an > individual DressedLepton object, it will only give me the raw particles > for the individual dressed lepton. > > If I apply the same logic to the ZFinder, I would think we need > something like bosons() which returns the (dressed) dilepton pairs, on > each of which I can call particles() which will give me the two dressed > leptons (for said candidate), and on each of those I can call > constituents(), which will give me the bare electron and the photons, as > above. If I then ask for the smeared versions, I would get a smeared > dressed lepton on the particles() level and individually smeared bare > leptons and photons on the constituent level. > > I think this is more or less what you’re suggesting in step a), I’m just > not sure why we need rawConstituents or simpleConstituents and can’t > just use constituents for this. > > Right now, the ZFinder already has the plural bosons(), but then we also > have the singular boson() which doesn’t make any sense if there are > multiple bosons to be found, so why exactly is it there in the first > place? I’m also unsure about what the ZFinder is going to give me when I > call constituents() on the projection, especially if there are multiple > Z candidates. (Is it the bosons? Is it an even number of dressed > leptons? How are they ordered? …) > > Anyway, the distinction between particles and constituents may work > conceptually for composite particles, but admittedly the same logic > doesn’t work with jets. At the moment we can call either particles or > constituents on a Jet object and they will both return the same thing, > which I think is fine for Jet objects, but it’s not immediately obvious > that these two are aliases for one another in this case. Perhaps that’s > not really a problem though? > > I’m all in favour of your last suggestion, i.e. pushing out something > 95% useful asap. For all we know, we may end up receiving some feedback > which could well influence the ironing out of the remaining details. > > Cheers, > Chris > > >> On 29 Jun 2016, at 14:00, Andy Buckley <andy.buckley at cern.ch >> <mailto:andy.buckley at cern.ch>> wrote: >> >> Hi, >> >> Time to grasp a nettle. Remember some weeks back, when putting >> together a smearing machinery for Rivet, we had some discussion about >> how to uniformly access composite vs. simple particles from "finder" >> projections? It seemed awkward, so we stopped. >> >> The reason it's important is that at the moment the "finder" >> projections, more by consensus than explicit design, only return >> *simple* (i.e. indivisible & directly matched to HepMC objects) >> constituent particles via the particles() method. There is no >> equivalent uniform method for accessing composite particles like >> reconstructed Z bosons or dressed leptons. >> >> And that creates a problem, because if I apply an electron smearing or >> efficiency to an IdentifiedFinalState of simple electrons then what I >> get out is reasonable, but if I apply the same thing to a >> DressedLeptons projection then what comes out is a list of simple >> electrons and photons, which have all had the electron efficiencies >> applied to them individually. Bad idea. >> >> I think to fix this we have to: >> >> a) provide *two* methods on the ParticleFinder base class: one for the >> composite particles that are the semantic output of that projection, >> i.e. the things we asked it to "find"; and a second for the >> constituents of those things. I personally feel that changing the >> meaning of particles() to mean "semantic 'found' particles, maybe >> composite", and adding a new simpleParticles(), rawParticles() or >> similar is nicer (but more work) than keeping particles() as-is and >> adding some even-more-awkwardly named maybeCompositeParticles(). >> >> b) implement these by adding some access to constituents to the >> Particle interface, e.g. const vector<Particle>& >> Particle::constituents(). And maybe a recursively-assembled >> Particle::rawConstituents() or simpleConstituents(): good, short & >> intuitive naming ideas welcome! Care needed to avoid object size >> blow-ups. Use these methods to implement the >> ParticleFinder::rawParticles() etc. >> >> I think this can work -- but it's not clear to me whether the >> implementation will be smooth or full of pitfalls. Probably we should >> plan for the latter. Any particular concerns or better ideas? >> >> Now we've got 2.5.0beta2 out, and the next step should be a full 2.5.0 >> release. *Ideally* well before the tutorial at CERN on 14th (?) July, >> so the participants can use that and play with the new machinery. And >> I'm wondering if we can fix this issue in time for that, or should we >> put it out now for BSMers to play with and just warn to stick to using >> projections with "simple" returns for now -- which most will be happy >> to do, because BSM analyses don't usually bother with details like >> dressing their leptons. I am drifting toward pushing "full >> consistency" back to 2.6.0 (since an API change would be involved) and >> giving them something 95% useful asap. Thoughts? >> >> Cheers, >> Andy >> >> -- >> Dr Andy Buckley, Lecturer / Royal Society University Research Fellow >> Particle Physics Expt Group, University of Glasgow >> _______________________________________________ >> Rivet mailing list >> Rivet at projects.hepforge.org <mailto:Rivet at projects.hepforge.org> >> https://www.hepforge.org/lists/listinfo/rivet > > > > > — > > Dr. Christian Gütschow > > University College London > Department of Physics and Astronomy > Gower Street > London WC1E 6BT > > > D10 Physics Building > > +44 (0)20 7679 3775 > > chris.g at cern.ch <mailto:chris.g at cern.ch> > > > > -- Dr Andy Buckley, Lecturer / Royal Society University Research Fellow Particle Physics Expt Group, University of Glasgow
More information about the Rivet mailing list |