yet another time about TLorentzVector and TVector3

From: Pasha Murat (630)840-8237 FNAL (630)859-3463 home (murat@murat.fnal.gov)
Date: Sat Oct 30 1999 - 02:26:07 MEST


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