//____________________________________________________________________
//
// Abstract HEP particle class
// 
// Note for developers: Some often used values like Pt, Eta etc. are
// stored as transient data members for fast access. Their computation
// from the persistent data members is either done in the normal ctor
// or in SetPtEtaPhiE(), or triggered by the fCompute flag in case of
// using the default ctor.
//
// Also included here is a function allowing to print TLorentzVector
// Cartesian/(pt,eta,phi) coordinates.
//
// !!! IMPORTANT: Do not acces the transient data members directly,  !!!
// !!! but use ALWAYS their corresponding access function like Pt(), !!!
// !!! Eta()etc. to ensure that the variables are computed properly. !!!
//
// !!! IMPORTANT: Do not use Pt(), Pmag(), Thethe(), Phi(), Eta() in !!!
// !!! TTree::Draw() or TTree::Scan() since these functions make use !!!
// !!! of a cache which will NOT be updated when jumping to the next !!!
// !!! event inside TTree::Draw() or TTree::Scan().                  !!!
//
//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: HepParticle.cxx,v 1.28 2014/02/18 12:15:18 kind Exp $
// Copyright: 2008 (C) Oliver Maria Kind
//
#ifndef HEP_HepParticle
#include <HepParticle.h>
#endif
#include <HepJet.h>
#include <TSystem.h>
#include <iostream>

using namespace std;

#ifndef __CINT__
ClassImp(HepParticle);
#endif

HepDatabasePDG *HepParticle::fDbasePDG = HepDatabasePDG::Instance();

//____________________________________________________________________

HepParticle::HepParticle() {
    //
    // Default constructor
    //
    // The fCompute flag triggers the computation of the transient
    // member variables the next time one of them is accessed. This
    // mechanism is neccessary since the values of the persistent data
    // members needed for the computation are filles AFTER the call to
    // this ctor
    //
    fCompute = kTRUE;
}

//____________________________________________________________________

HepParticle::HepParticle(Int_t Id, Float_t Px, Float_t Py, Float_t Pz,
			 Float_t E, Int_t PdgCode) : fId(Id),
						     fPdgCode(PdgCode) {
    //
    // Normal constructor
    //
    fP.SetPxPyPzE(Px, Py, Pz, E);
    ComputeTransientVars();
}

//____________________________________________________________________

HepParticle::~HepParticle() {
    //
    // Default destructor
    //
}

//____________________________________________________________________

void HepParticle::Clear(Option_t *option) {
    //
    // Clear object
    //	
    fP.SetPxPyPzE(0, 0, 1., 0); // unit-vector in Pz direction
    // (instead of zero-vector). This is to avoid difficulties
    // when using polar coordinates
    fId      = 0;
    fPdgCode = 0;
    // Re-set cache
    fCompute = kTRUE;
}



//____________________________________________________________________

Double_t HepParticle::Mass(Option_t *option) const {
    //
    // Particle mass
    //
    // Options available:
    //    "PDG" = mass as given in the PDG dbase (default)
    //    "REC" = 'reconstructed' invariant mass stored in
    //             the 4-momentum vector
    //
    TString opt = option;
    opt.ToUpper();
    if ( opt.Contains("PDG") ) {
	return fDbasePDG->GetParticle(GetPdgCode())->Mass();
    } else {
	return fP.M();
    }
}

//____________________________________________________________________

Bool_t HepParticle::operator==(HepParticle Partner) {
    //
    // Compare Particle with Partner w.r.t. PdgCode and 4-Momentum
    // return kTRUE in case of Matching
    //
    // Comparison is made between Objects, not Pointers
    // 
    
    if (fPdgCode==Partner.GetPdgCode()
	&& TMath::Abs((fP.Px()-Partner.Px())/fP.Px())<1.e-05
	&& TMath::Abs((fP.Py()-Partner.Py())/fP.Py())<1.e-05
	&& TMath::Abs((fP.Pz()-Partner.Pz())/fP.Pz())<1.e-05
	&& TMath::Abs((fP.E()-Partner.E())/fP.E())<1.e-05) {return kTRUE;}
    return kFALSE;
}

//____________________________________________________________________

Int_t HepParticle::Compare(const TObject *obj) const {
    //
    // Compares transverse momentum of this particles with another.
    // Necessary for sorting
    //
    Float_t Pt = fP.Pt();
    if ( Pt <  ((HepParticle*)obj)->Pt() ) return -1;
    if ( Pt == ((HepParticle*)obj)->Pt() ) return  0;
    if ( Pt >  ((HepParticle*)obj)->Pt() ) return  1;
    return 0;
}

//____________________________________________________________________

Bool_t HepParticle::HasInvalidPdgCode() const {
    //
    // Test validity of PDG code
    // Compounds like eg. deuteron, tritium or alphas etc. are
    // unknown to the PDG database
    //
    TString prt_name(GetPdgName());
    if ( prt_name.Contains("invalid") ) return kTRUE;
    return kFALSE;
}

//____________________________________________________________________

const char* HepParticle::GetPdgName() const {
    //
    // Return particle's name
    //
    TParticlePDG *prt = fDbasePDG->GetParticle(fPdgCode);
    return ( prt != 0 ) ? prt->GetName() : "invalid";
}

//____________________________________________________________________

Float_t HepParticle::Charge() const {
    //
    // Get charge in units of e
    // (Note that in the PDG dbase the charges are stored in 1/3 of e)
    //
    return (Float_t)fDbasePDG->GetParticle(GetPdgCode())->Charge()/3.;
}

//____________________________________________________________________

Float_t HepParticle::DeltaPhi(HepParticle* prt) const {
    //
    // Compute azimuth difference between this and the given particle
    // in the range from -pi to +pi
    //
    return fP.DeltaPhi(prt->P());
}

//____________________________________________________________________

Float_t HepParticle::DeltaPhi(HepJet *jet) const {
    //
    // Compute azimuth difference between this particle and the given
    // jet in the range from -pi to +pi
    //
    return fP.DeltaPhi(jet->P());
}

//____________________________________________________________________

Float_t HepParticle::DeltaEta(HepParticle *prt) {
    //
    // Compute (signed) pseudo-rapidity difference between this and
    // the given particle
    //
    return Eta() - prt->Eta();
}

//____________________________________________________________________

Float_t HepParticle::DeltaEta(HepJet *jet) {
    //
    // Compute (signed) pseudo-rapidity difference between this
    // particle and the given jet
    //
    return Eta() - jet->Eta();
}

//____________________________________________________________________

Float_t HepParticle::DeltaR(HepParticle *prt) {
    //
    // Compute distance in eta-phi plane between this and the given
    // particle
    //
    Float_t dEta = Eta() - prt->Eta();
    Float_t dPhi = fP.DeltaPhi(prt->P());
    return TMath::Sqrt(dEta*dEta + dPhi*dPhi);
}

//____________________________________________________________________

Float_t HepParticle::DeltaR(HepJet *jet) {
    //
    // Compute distance in eta-phi plane between this particle and the
    // given jet
    //
    Float_t dEta = Eta() - jet->Eta();
    Float_t dPhi = fP.DeltaPhi(jet->P());
    return TMath::Sqrt(dEta*dEta + dPhi*dPhi);
}

//____________________________________________________________________

Float_t HepParticle::Mperp2() const {
    //
    // Mt^2 = Et^2 - Pt^2
    //
    // Use this function for the Jacobian-peak method
    //
    Float_t Et = fP.Et();
    Float_t Et2 = Et*Et;
    Float_t Pt2 = fP.Perp2();
    return Et2-Pt2;
}

//____________________________________________________________________

Float_t HepParticle::DeltaPtFrac(HepParticle *prt) {
    //
    // DeltaPtFrac = (Pt_1 - Pt_2)Pt_1
    //
    // Unsigned, for better checking systematic errors 
    // 
    Float_t pt = Pt();
    if( pt > 0. ){  return (pt - prt->Pt()) / pt; }
    return 10e10;
}

//____________________________________________________________________

Float_t HepParticle::DeltaPtFrac(HepJet *jet) {
  Float_t pt = Pt();
  if( pt > 0. ){  return (pt - jet->Pt()) / pt; }
  return 10e10;
}

//____________________________________________________________________

Float_t HepParticle::InvDeltaPtFrac(HepParticle *prt) {
    //
    // An "Inverse" DeltaPtFrac is needed, due to Multiple Scattering in 
    // the Inner Detector
    // InvDeltaPtFrac = ( 1/Pt_1 - 1/Pt_2)*Pt_1
    //
    // Unsigned again, for better checking systematic errors 
    // I dont know yet if I can write the same algorithm for the jets
    //
    Float_t pt1 = Pt();
    Float_t pt2 = prt->Pt();
    if( (pt1 > 0.) && (pt2 > 0.) ) {
	return ( 1/pt1 - 1/pt2 ) * pt1;
    }
    return 10e10; 
}

//____________________________________________________________________

void HepParticle::ComputeTransientVars() {
    //
    // Compute transient variables like Pt, Theta, Eta etc. for fast
    // access
    //
    fCompute = kFALSE;
    
    fPmag = fP.P();
    fPt = fP.Perp();
    fTheta = fP.Theta();
    fCosTheta = fP.CosTheta();
    fPhi = fP.Phi();
    // Suppress Root warning when computing eta
    if ( fCosTheta*fCosTheta < 1. ) {
	fEta = fP.Eta();
    } else {
	fEta = ( Pz() > 0. ) ? 10e10 : -10e10;
    }
}

//____________________________________________________________________

void HepParticle::Print(Option_t *option) {
    //
    // Print object information
    //
    // Options available:
    //   "nohead" - No header containing the variable names is
    //              displayed. Useful when printing a whole table
    //              for a list of particles
    //
    TString opt = option;
    opt.ToLower();

    // Header
    if ( !opt.Contains("nohead") ) PrintHeader();

    // Main
    cout.setf(ios::showpoint | ios::fixed, ios::floatfield);
    cout.width(4); cout << fId;
    cout.width(12);  cout << GetPdgName();
    cout.precision(3);
    cout.width(12); cout << fP.E();
    cout.width(12); cout << fP.P();
    cout.width(12); cout << fP.Pt();
    cout.width(12); cout << fP.Theta()*180/TMath::Pi();
    cout.width(12); cout << fP.Phi()*180/TMath::Pi();
    if ( fP.Pt() != 0. ) {
	cout.width(11); cout << fP.Eta();
    } else {
	if ( fP.Pz() > 0. ) {
	    cout << "    infinity";
	} else {
	    cout << "   -infinity";
	}
    }
    cout.width(12); cout << Mass("rec");
    cout << endl;
    
    // Footer
    if ( !opt.Contains("nohead") ) PrintFooter();
}

//____________________________________________________________________

void HepParticle::PrintHeader() {
    //
    // Print information header
    //
    //
    // GINUS denotes (in this order):
    //
    // IsGenerator()
    // IsGenInteracting()
    // IsGenNonInteracting()
    // IsGenSimulStable()
    // IsGenStable()
    //
    cout << "---------------------------------------------------------------------------------------------------" << endl
         << " Id     Type            E           P           Pt         Theta       Phi          Eta       M_inv" << endl
         << "---------------------------------------------------------------------------------------------------" << endl; 
}

//____________________________________________________________________

void HepParticle::PrintFooter() {
    //
    // Print footer
    //
    cout << "---------------------------------------------------------------------------------------------------" << endl;
}

//____________________________________________________________________

void HepParticle::GetCovMatrixPtEtaPhi(TMatrixD& CovMatPtEtaPhi) const {
    //
    // Dummy for returning the covariance matrix in some derived
    // classes (reconstructed electrons and muons, ...)
    //
    Error("GetCovMatEtaPhi",
	  "Not yet implemented for this particle type. Abort!");
    gSystem->Abort(0);
}

//____________________________________________________________________

void HepParticle::PrintLorentzVector(TLorentzVector vec) {
    //
    // Print the Cartesian and (pt, eta, phi) coordinates of a
    // TLorentVector. Needed, since this functionality is not
    // provided by RooT. Guards Eta() from Pt = 0.
    //
    cout << endl;
    Printf("(x,y,z,t)=(%f,%f,%f,%f)\n(Pt,eta,theta,phi)=(%f,%f,%f,%f)\n(Pt,eta,theta_deg,phi_deg)=(%f,%f,%f,%f)",
	   vec.Px(),vec.Py(),vec.Pz(),vec.E(),
	   vec.Perp(),vec.Eta(),vec.Theta(),vec.Phi(),
	   vec.Perp(),vec.Eta(),vec.Theta()*180./TMath::Pi(),
	   vec.Phi()*180./TMath::Pi());
    cout << endl;
}
 HepParticle.cxx:1
 HepParticle.cxx:2
 HepParticle.cxx:3
 HepParticle.cxx:4
 HepParticle.cxx:5
 HepParticle.cxx:6
 HepParticle.cxx:7
 HepParticle.cxx:8
 HepParticle.cxx:9
 HepParticle.cxx:10
 HepParticle.cxx:11
 HepParticle.cxx:12
 HepParticle.cxx:13
 HepParticle.cxx:14
 HepParticle.cxx:15
 HepParticle.cxx:16
 HepParticle.cxx:17
 HepParticle.cxx:18
 HepParticle.cxx:19
 HepParticle.cxx:20
 HepParticle.cxx:21
 HepParticle.cxx:22
 HepParticle.cxx:23
 HepParticle.cxx:24
 HepParticle.cxx:25
 HepParticle.cxx:26
 HepParticle.cxx:27
 HepParticle.cxx:28
 HepParticle.cxx:29
 HepParticle.cxx:30
 HepParticle.cxx:31
 HepParticle.cxx:32
 HepParticle.cxx:33
 HepParticle.cxx:34
 HepParticle.cxx:35
 HepParticle.cxx:36
 HepParticle.cxx:37
 HepParticle.cxx:38
 HepParticle.cxx:39
 HepParticle.cxx:40
 HepParticle.cxx:41
 HepParticle.cxx:42
 HepParticle.cxx:43
 HepParticle.cxx:44
 HepParticle.cxx:45
 HepParticle.cxx:46
 HepParticle.cxx:47
 HepParticle.cxx:48
 HepParticle.cxx:49
 HepParticle.cxx:50
 HepParticle.cxx:51
 HepParticle.cxx:52
 HepParticle.cxx:53
 HepParticle.cxx:54
 HepParticle.cxx:55
 HepParticle.cxx:56
 HepParticle.cxx:57
 HepParticle.cxx:58
 HepParticle.cxx:59
 HepParticle.cxx:60
 HepParticle.cxx:61
 HepParticle.cxx:62
 HepParticle.cxx:63
 HepParticle.cxx:64
 HepParticle.cxx:65
 HepParticle.cxx:66
 HepParticle.cxx:67
 HepParticle.cxx:68
 HepParticle.cxx:69
 HepParticle.cxx:70
 HepParticle.cxx:71
 HepParticle.cxx:72
 HepParticle.cxx:73
 HepParticle.cxx:74
 HepParticle.cxx:75
 HepParticle.cxx:76
 HepParticle.cxx:77
 HepParticle.cxx:78
 HepParticle.cxx:79
 HepParticle.cxx:80
 HepParticle.cxx:81
 HepParticle.cxx:82
 HepParticle.cxx:83
 HepParticle.cxx:84
 HepParticle.cxx:85
 HepParticle.cxx:86
 HepParticle.cxx:87
 HepParticle.cxx:88
 HepParticle.cxx:89
 HepParticle.cxx:90
 HepParticle.cxx:91
 HepParticle.cxx:92
 HepParticle.cxx:93
 HepParticle.cxx:94
 HepParticle.cxx:95
 HepParticle.cxx:96
 HepParticle.cxx:97
 HepParticle.cxx:98
 HepParticle.cxx:99
 HepParticle.cxx:100
 HepParticle.cxx:101
 HepParticle.cxx:102
 HepParticle.cxx:103
 HepParticle.cxx:104
 HepParticle.cxx:105
 HepParticle.cxx:106
 HepParticle.cxx:107
 HepParticle.cxx:108
 HepParticle.cxx:109
 HepParticle.cxx:110
 HepParticle.cxx:111
 HepParticle.cxx:112
 HepParticle.cxx:113
 HepParticle.cxx:114
 HepParticle.cxx:115
 HepParticle.cxx:116
 HepParticle.cxx:117
 HepParticle.cxx:118
 HepParticle.cxx:119
 HepParticle.cxx:120
 HepParticle.cxx:121
 HepParticle.cxx:122
 HepParticle.cxx:123
 HepParticle.cxx:124
 HepParticle.cxx:125
 HepParticle.cxx:126
 HepParticle.cxx:127
 HepParticle.cxx:128
 HepParticle.cxx:129
 HepParticle.cxx:130
 HepParticle.cxx:131
 HepParticle.cxx:132
 HepParticle.cxx:133
 HepParticle.cxx:134
 HepParticle.cxx:135
 HepParticle.cxx:136
 HepParticle.cxx:137
 HepParticle.cxx:138
 HepParticle.cxx:139
 HepParticle.cxx:140
 HepParticle.cxx:141
 HepParticle.cxx:142
 HepParticle.cxx:143
 HepParticle.cxx:144
 HepParticle.cxx:145
 HepParticle.cxx:146
 HepParticle.cxx:147
 HepParticle.cxx:148
 HepParticle.cxx:149
 HepParticle.cxx:150
 HepParticle.cxx:151
 HepParticle.cxx:152
 HepParticle.cxx:153
 HepParticle.cxx:154
 HepParticle.cxx:155
 HepParticle.cxx:156
 HepParticle.cxx:157
 HepParticle.cxx:158
 HepParticle.cxx:159
 HepParticle.cxx:160
 HepParticle.cxx:161
 HepParticle.cxx:162
 HepParticle.cxx:163
 HepParticle.cxx:164
 HepParticle.cxx:165
 HepParticle.cxx:166
 HepParticle.cxx:167
 HepParticle.cxx:168
 HepParticle.cxx:169
 HepParticle.cxx:170
 HepParticle.cxx:171
 HepParticle.cxx:172
 HepParticle.cxx:173
 HepParticle.cxx:174
 HepParticle.cxx:175
 HepParticle.cxx:176
 HepParticle.cxx:177
 HepParticle.cxx:178
 HepParticle.cxx:179
 HepParticle.cxx:180
 HepParticle.cxx:181
 HepParticle.cxx:182
 HepParticle.cxx:183
 HepParticle.cxx:184
 HepParticle.cxx:185
 HepParticle.cxx:186
 HepParticle.cxx:187
 HepParticle.cxx:188
 HepParticle.cxx:189
 HepParticle.cxx:190
 HepParticle.cxx:191
 HepParticle.cxx:192
 HepParticle.cxx:193
 HepParticle.cxx:194
 HepParticle.cxx:195
 HepParticle.cxx:196
 HepParticle.cxx:197
 HepParticle.cxx:198
 HepParticle.cxx:199
 HepParticle.cxx:200
 HepParticle.cxx:201
 HepParticle.cxx:202
 HepParticle.cxx:203
 HepParticle.cxx:204
 HepParticle.cxx:205
 HepParticle.cxx:206
 HepParticle.cxx:207
 HepParticle.cxx:208
 HepParticle.cxx:209
 HepParticle.cxx:210
 HepParticle.cxx:211
 HepParticle.cxx:212
 HepParticle.cxx:213
 HepParticle.cxx:214
 HepParticle.cxx:215
 HepParticle.cxx:216
 HepParticle.cxx:217
 HepParticle.cxx:218
 HepParticle.cxx:219
 HepParticle.cxx:220
 HepParticle.cxx:221
 HepParticle.cxx:222
 HepParticle.cxx:223
 HepParticle.cxx:224
 HepParticle.cxx:225
 HepParticle.cxx:226
 HepParticle.cxx:227
 HepParticle.cxx:228
 HepParticle.cxx:229
 HepParticle.cxx:230
 HepParticle.cxx:231
 HepParticle.cxx:232
 HepParticle.cxx:233
 HepParticle.cxx:234
 HepParticle.cxx:235
 HepParticle.cxx:236
 HepParticle.cxx:237
 HepParticle.cxx:238
 HepParticle.cxx:239
 HepParticle.cxx:240
 HepParticle.cxx:241
 HepParticle.cxx:242
 HepParticle.cxx:243
 HepParticle.cxx:244
 HepParticle.cxx:245
 HepParticle.cxx:246
 HepParticle.cxx:247
 HepParticle.cxx:248
 HepParticle.cxx:249
 HepParticle.cxx:250
 HepParticle.cxx:251
 HepParticle.cxx:252
 HepParticle.cxx:253
 HepParticle.cxx:254
 HepParticle.cxx:255
 HepParticle.cxx:256
 HepParticle.cxx:257
 HepParticle.cxx:258
 HepParticle.cxx:259
 HepParticle.cxx:260
 HepParticle.cxx:261
 HepParticle.cxx:262
 HepParticle.cxx:263
 HepParticle.cxx:264
 HepParticle.cxx:265
 HepParticle.cxx:266
 HepParticle.cxx:267
 HepParticle.cxx:268
 HepParticle.cxx:269
 HepParticle.cxx:270
 HepParticle.cxx:271
 HepParticle.cxx:272
 HepParticle.cxx:273
 HepParticle.cxx:274
 HepParticle.cxx:275
 HepParticle.cxx:276
 HepParticle.cxx:277
 HepParticle.cxx:278
 HepParticle.cxx:279
 HepParticle.cxx:280
 HepParticle.cxx:281
 HepParticle.cxx:282
 HepParticle.cxx:283
 HepParticle.cxx:284
 HepParticle.cxx:285
 HepParticle.cxx:286
 HepParticle.cxx:287
 HepParticle.cxx:288
 HepParticle.cxx:289
 HepParticle.cxx:290
 HepParticle.cxx:291
 HepParticle.cxx:292
 HepParticle.cxx:293
 HepParticle.cxx:294
 HepParticle.cxx:295
 HepParticle.cxx:296
 HepParticle.cxx:297
 HepParticle.cxx:298
 HepParticle.cxx:299
 HepParticle.cxx:300
 HepParticle.cxx:301
 HepParticle.cxx:302
 HepParticle.cxx:303
 HepParticle.cxx:304
 HepParticle.cxx:305
 HepParticle.cxx:306
 HepParticle.cxx:307
 HepParticle.cxx:308
 HepParticle.cxx:309
 HepParticle.cxx:310
 HepParticle.cxx:311
 HepParticle.cxx:312
 HepParticle.cxx:313
 HepParticle.cxx:314
 HepParticle.cxx:315
 HepParticle.cxx:316
 HepParticle.cxx:317
 HepParticle.cxx:318
 HepParticle.cxx:319
 HepParticle.cxx:320
 HepParticle.cxx:321
 HepParticle.cxx:322
 HepParticle.cxx:323
 HepParticle.cxx:324
 HepParticle.cxx:325
 HepParticle.cxx:326
 HepParticle.cxx:327
 HepParticle.cxx:328
 HepParticle.cxx:329
 HepParticle.cxx:330
 HepParticle.cxx:331
 HepParticle.cxx:332
 HepParticle.cxx:333
 HepParticle.cxx:334
 HepParticle.cxx:335
 HepParticle.cxx:336
 HepParticle.cxx:337
 HepParticle.cxx:338
 HepParticle.cxx:339
 HepParticle.cxx:340
 HepParticle.cxx:341
 HepParticle.cxx:342
 HepParticle.cxx:343
 HepParticle.cxx:344
 HepParticle.cxx:345
 HepParticle.cxx:346
 HepParticle.cxx:347
 HepParticle.cxx:348
 HepParticle.cxx:349
 HepParticle.cxx:350
 HepParticle.cxx:351
 HepParticle.cxx:352
 HepParticle.cxx:353
 HepParticle.cxx:354
 HepParticle.cxx:355
 HepParticle.cxx:356
 HepParticle.cxx:357
 HepParticle.cxx:358
 HepParticle.cxx:359
 HepParticle.cxx:360
 HepParticle.cxx:361
 HepParticle.cxx:362
 HepParticle.cxx:363
 HepParticle.cxx:364
 HepParticle.cxx:365
 HepParticle.cxx:366
 HepParticle.cxx:367
 HepParticle.cxx:368
 HepParticle.cxx:369
 HepParticle.cxx:370
 HepParticle.cxx:371
 HepParticle.cxx:372
 HepParticle.cxx:373
 HepParticle.cxx:374
 HepParticle.cxx:375
 HepParticle.cxx:376
 HepParticle.cxx:377
 HepParticle.cxx:378
 HepParticle.cxx:379
 HepParticle.cxx:380
 HepParticle.cxx:381
 HepParticle.cxx:382
 HepParticle.cxx:383
 HepParticle.cxx:384
 HepParticle.cxx:385
 HepParticle.cxx:386
 HepParticle.cxx:387
 HepParticle.cxx:388
 HepParticle.cxx:389
 HepParticle.cxx:390
 HepParticle.cxx:391
 HepParticle.cxx:392
 HepParticle.cxx:393
 HepParticle.cxx:394
 HepParticle.cxx:395
 HepParticle.cxx:396
 HepParticle.cxx:397
 HepParticle.cxx:398
 HepParticle.cxx:399
 HepParticle.cxx:400
 HepParticle.cxx:401
 HepParticle.cxx:402
 HepParticle.cxx:403
 HepParticle.cxx:404
 HepParticle.cxx:405
 HepParticle.cxx:406
 HepParticle.cxx:407
 HepParticle.cxx:408
 HepParticle.cxx:409
 HepParticle.cxx:410
 HepParticle.cxx:411
 HepParticle.cxx:412
 HepParticle.cxx:413
 HepParticle.cxx:414
 HepParticle.cxx:415
 HepParticle.cxx:416
 HepParticle.cxx:417
 HepParticle.cxx:418
 HepParticle.cxx:419