// Copyright 2000, CERN, Geneva, Switzerland package hep.physics.yappi; /** * Implements a decoder for the Monte Carlo Particle Numbering Scheme. * The scheme is documented in D.E. Groom et al., European Physical Journal C15, 1 (2000) * or on the web: http://pdg.lbl.gov/ * * The implementation refers to the document of June 14, 2000 10:40. * * @author Mark Donszelmann * @version $Id: PDGID.java 8584 2006-08-10 23:06:37Z duns $ */ public class PDGID { private int id; protected boolean particle = true; protected String family = "undefined"; protected boolean likely = false; protected boolean excited = false; protected boolean technicolor = false; protected boolean susy = false; protected int susyState = 0; protected double I = Double.NaN; protected double J = Double.NaN; protected int P = 0; protected int C = 0; protected int G = 0; protected int n = 0; protected int nr = 0; protected int nL = 0; protected int nq1 = 0; protected int nq2 = 0; protected int nq3 = 0; protected int nJ = 0; /** * Creates a PDGID given the number * * @param id PDG ID for particle */ public PDGID(int id) { this.id = id; decode(id); } /** * @return id */ public int getID() { return id; } /** * @return true if particle, false if antiParticle */ public boolean isParticle() { return particle; } /** * @return true if particle excited */ public boolean isExcited() { return excited; } /** * @return true if particle is technicolor */ public boolean isTechnicolor() { return technicolor; } /** * @return true if particle is super symmetric */ public boolean isSusy() { return susy; } /** * @return susy state, or 0 if not a susy particle */ public int getSusyState() { return susyState; } /** * @return family name */ public String getFamily() { return family; } /** * @return true if particles qq states are unassigned or likely. */ public boolean isLikely() { return likely; } /** * returns n */ public int getN() { return n; } /** * returns nr */ public int getNr() { return nr; } /** * returns nL */ public int getNL() { return nL; } /** * returns nq1 */ public int getNq1() { return nq1; } /** * returns nq2 */ public int getNq2() { return nq2; } /** * returns nq3 */ public int getNq3() { return nq3; } /** * returns nJ */ public int getNJ() { return nJ; } /** * returns I */ public double getI() { return I; } /** * returns J */ public double getJ() { return J; } /** * returns P or 0 if unspecified */ public int getP() { return P; } /** * returns C or 0 if unspecified */ public int getC() { return C; } /** * decodes id */ protected void decode(int id) { // is particle or anti particle ? particle = (id > 0); id = Math.abs(id); n = (id / 1000000); int r = (id % 1000000); switch (n) { case 0: // standard particle break; case 1: // left handed susy case 2: // right handed susy susy = true; susyState = n; break; case 3: // technicolor technicolor = true; break; case 4: // excited excited = true; break; case 9: // likely likely = true; break; default: break; } if (likely && (((id / 100000) % 10)) == 9) { decodeUser(id); } else { decodeBase(r); } } /** * user decoding method */ protected void decodeUser(int r) { } /** * decodes id */ protected void decodeBase(int id) { if (id < 11) { family = "quarks"; switch (id) { case 1: I=.5; J=.5; P=+1; // d break; case 2: I=.5; J=.5; P=+1; // u break; case 3: I= 0; J=.5; P=+1; // s break; case 4: I= 0; J=.5; P=+1; // c break; case 5: I= 0; J=.5; P=+1; // b break; case 6: I= 0; J=.5; P=+1; // t break; case 7: // b' case 8: // t' break; case 9: I= 0; J=1; P=-1; // gluon for glueballs break; default: throw new IllegalArgumentException("Not a valid PDGID: "+id); } } else if (id < 21) { family = "leptons"; switch (id) { case 11: // e- case 12: // nue case 13: // mu- case 14: // numu case 15: // tau- case 16: // nutau J=.5; break; case 17: // tau'- case 18: // nutau' break; default: throw new IllegalArgumentException("Not a valid PDGID: "+id); } } else if (id < 31) { family = "bosons"; switch (id) { case 21: I= 0; J=1; P=-1; // gluon break; // FIXME: I can be 0, 1 case 22: I= 0; J=1; P=-1; C=-1; // gamma break; case 23: J=1; // Z0 break; case 24: J=1; // W+ break; case 25: // h0/H10 break; default: throw new IllegalArgumentException("Not a valid PDGID: "+id); } } else if (id < 39) { family = "bosons"; switch (id) { case 32: // Z'/Z20 case 33: // Z"/Z30 case 34: // W'/W2+ case 35: // H0/H20 case 36: // A0/H30 case 37: // H+ break; default: throw new IllegalArgumentException("Not a valid PDGID: "+id); } } else if (id < 81) { family = "exotic"; switch (id) { case 39: // G (graviton) case 41: // R0 case 42: // LQc break; default: throw new IllegalArgumentException("Not a valid PDGID: "+id); } } else if (id < 101) { family = "reserved"; } else { switch (id) { case 110: // reggeon case 990: // pomeron case 9990: // odderon family = "special"; decodeFlavors(id); break; default: family = "composites"; decodeComposites(id); break; } } } protected void decodeFlavors(int id) { // FIXME: there should be something special for 11, 22 and 33 // decode nq1..3 nq3 = (id / 10) % 10; nq2 = (id / 100) % 10; nq1 = (id / 1000) % 10; } protected void decodeComposites(int id) { // special cases if (id == 130) { // Kl0 family = "mesons"; I=.5; J=0; P=-1; nq1=0; nq2=3; nq3=1; nJ=1; return; } if (id == 310) { // Ks0 family = "mesons"; I=.5; J=0; P=-1; nq1=0; nq2=3; nq3=1; nJ=1; return; } // calculate J nJ = id % 10; J = (nJ - 1 / 2.0); decodeFlavors(id); // which one ? if (nq3 == 0) { family = "diquarks"; } else if (nq1 == 0) { family = "mesons"; decodeMesons(id); } else { family = "baryons"; decodeBaryons(id); } // decode nr; nr = (id / 100000) % 10; } protected void decodeMesons(int id) { // calculate P and C nL = (id / 1000) % 10; int L, S; if (J > 0) { switch (nL) { case 0: L=(int)J-1; S=1; break; case 1: L=(int)J; S=0; break; case 2: L=(int)J; S=1; break; case 3: L=(int)J+1; S=1; break; default: throw new RuntimeException("nL contains a wrong number: "+nL); } } else { switch (nL) { case 0: L=0; S=0; break; case 1: L=1; S=1; break; default: throw new RuntimeException("nL contains a wrong number: "+nL); } } // P = (-1)^(L+1) P = (((L+1) % 2) == 0) ? +1 : -1; // C = (-1)^(L+S) C = (((L+S) % 2) == 0) ? +1 : -1; // G = (-1)^(L+S+I) } protected void decodeBaryons(int id) { // FIXME: look up table 13.4 } // FIXME: should include some more stuff public String toString() { return "[PDGID:"+id+"] Family="+family+"; "+((particle)?"particle":"anti-particle")+"; \n"+ " I="+I+"; J="+J+"; P="+((P==1)?"+":"-")+"; C="+((C==1)?"+":"-")+"; \n"+ " q1="+nq1+"; q2="+nq2+"; q3="+nq3+"; \n"+ " n="+n+"; nr="+nr+"; nL="+nL+"; nJ="+nJ+"; \n"+ " "+((excited)?"excited, ":"")+((technicolor)?"techicolor, ":"")+ ((likely)?"likely, ":"")+((susy)?"susy("+susyState+"), ":"")+"; \n"+ " \n"; } public static void main(String[] args) { System.out.println(new PDGID( 4)); System.out.println(new PDGID( 14)); System.out.println(new PDGID( 4000002)); System.out.println(new PDGID( 35)); System.out.println(new PDGID( 4301)); System.out.println(new PDGID( 3000113)); System.out.println(new PDGID( 1000015)); System.out.println(new PDGID( 2000011)); System.out.println(new PDGID( 41)); System.out.println(new PDGID( 110)); System.out.println(new PDGID( -990)); System.out.println(new PDGID( 9990)); System.out.println(new PDGID( 211)); System.out.println(new PDGID( 100213)); System.out.println(new PDGID(-9020215)); System.out.println(new PDGID( 130)); System.out.println(new PDGID( 310)); System.out.println(new PDGID( 9010325)); System.out.println(new PDGID( 412)); System.out.println(new PDGID( 20423)); System.out.println(new PDGID( -20533)); System.out.println(new PDGID( 9000445)); System.out.println(new PDGID( 110553)); System.out.println(new PDGID( 2212)); System.out.println(new PDGID( 1114)); System.out.println(new PDGID( 3324)); System.out.println(new PDGID( 4322)); System.out.println(new PDGID( 5414)); } }