[Rivet] Common ParticleFinder interface for accessing composite vs. constituent particles? + 2.5.0 release plan

Christian Gutschow chris.g at cern.ch
Fri Jul 1 16:42:24 BST 2016


The interface promises to return a Particle object (or rather a vector of them), so it can't just be a bare momentum object... and cf. all this discussion it needs to know about its contents, etc. I guess we could set the Particle::pid() to 0, but for now we set it to 23.

And yes, caveat emptor re. Born Z's etc.! Not sure the solution to that is technical, unless we wanted to call it a "PseudoZFinder" cf. pseudo-tops.

Ok, that’s what I thought. Pid = 0 makes more sense to me than pid = 23, but I guess that’s debatable. PseudoZFinder is probably (hopefully?) not necessary…

Cheers,
Chris


On 1 Jul 2016, at 16:28, Andy Buckley <a.g.buckley at gmail.com<mailto:a.g.buckley at gmail.com>> wrote:

On 01/07/16 16:18, Christian Gutschow wrote:
Thanks for clarifying, Andy! I see the problem about the recursion now.
Will have to think about your points more carefully, but just to comment
on this one:

* 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!!)

What the ZFinder::particles() would actually return is the 4-momentum
combination of the (dressed) leptons for a given pair, no? Are we
currently assigning a pid to the ZFinder::bosons()? The pid = 23 makes
it look like it's the actual Z boson from the event record which (i)
doesn’t exist depending on the generator and (ii) I could imagine people
will use to cook up all sorts of Born-level nonsense not explicit enough
about this.

The interface promises to return a Particle object (or rather a vector of them), so it can't just be a bare momentum object... and cf. all this discussion it needs to know about its contents, etc. I guess we could set the Particle::pid() to 0, but for now we set it to 23.

And yes, caveat emptor re. Born Z's etc.! Not sure the solution to that is technical, unless we wanted to call it a "PseudoZFinder" cf. pseudo-tops.

How about components() for "constituent, maybe composite" and
constituents() for indivisible constituents then?

Actually, I rather like that. Only issue is that the words are quite similar, but I think it's neat. Other people's thoughts and suggestions?

Cheers,
Andy


On 1 Jul 2016, at 14:54, Andy Buckley <a.g.buckley at gmail.com<mailto:a.g.buckley at gmail.com>
<mailto:a.g.buckley at gmail.com>> wrote:

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>
<mailto: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>
<mailto: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> <mailto: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




 —

 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> <mailto:chris.g at cern.ch>






--
Dr Andy Buckley, Lecturer / Royal Society University Research Fellow
Particle Physics Expt Group, University of Glasgow




 —

 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>




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.hepforge.org/lists-archive/rivet/attachments/20160701/666b578a/attachment.html>


More information about the Rivet mailing list