Dear Rooters,
I'd like to raise once again the issue of the relationship between
TLorentzVector and TVector3. I'm coming back to it every time I realize
that I can't do something as efficient and convenient as I'd like to.
I've been clustering the tracks around the jets such that in the end
each jet would have tracks within the a certain eta-phi cone from jet
direction associated to it. By reconstruction a jet is a 4-vector -
calorimeter reconstructs its energy and angle, however for the same
reason a track is a 3-vector (you may not know its mass...).
To associate a track and a jet one needs to calculate a distance
between them in eta-phi space
dr(eta-phi) = sqrt((phi1-phi2)**2+(eta1-eta2)**2)
where phi is an angle in XY and eta is a pseudorapidity of the track/jet.
The caveat is that while mathematically the operation itself is defined
for 2 3-vectors, what physicist has in hands is not 2 3-vectors, but a
3-vector and a 4-vector. In case when 4-vector inherits from a 3-vector
one needs to provide a single function
double TVector3::DrEtaPhi(TVector3*)
which would do the job for all the possible cases. If however
TLorentzVector does not inherit from TVector3 (and this is what is
currently implemented in ROOT) to make life convenient one needs to
define at least 3 functions:
(1) double TVector3::DrEtaPhi(TVector3*)
(2) double TLorentzVector::DrEtaPhi(TLorentzVector*)
(3) double TLorentzVector::DrEtaPhi(TVector3*)
Also in this case one can't preserve symmetry between the arguments
because one can't have
double TVector3::DrEtaPhi(TLorentzVector*)
without 3-vectors "knowing" about 4-vectors...
In the present implementation (2.23/07) of ROOT physics vectors the
3rd function is missing, so the calculation of dr(eta-phi) becomes
a bit more cumbersome. Given
TLorentzVector jet;
TVector3 track;
instead of
double dr = jet.DrEtaphi(track);
one needs to type
double dr = jet.Vect().DrEtaPhi(track);
The calculation also becomes less efficient because now it includes
creation/deletion of an intermediate 3-vector - jet.Vect().
In high energy physics there are quite a few operations which should be
symmetric with respect to 3-vectors and 4-vectors. I'd also argue that
when calculating any kind of angle between the 2 reconstructed objects
- tracks, muons, jets, photons etc, each of which could be either a
3-vector or a 4-vector, - a physicist should not worry about the order
in which he types these 2 objects in in his code. I'd really like to be
able to type
jet.DrEtaPhi(track) as well as track.DrEtaPhi(jet)
without thinking about the C++-related issues at all. The language itself
allows to do this, for example via inheritance. There also could be other
possibilities and I'm wondering if this can be implemented?
-Best, Pasha
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:41 MET