//____________________________________________________________________
//
// Extended TDatabase PDG
// 
// Details about the PDG coding can be found at
// BEGIN_HTML
// <a href="http://pdg.lbl.gov/2008/reviews/rpp2008-rev-monte-carlo-numbering.pdf">http://pdg.lbl.gov/2008/reviews/rpp2008-rev-monte-carlo-numbering.pdf</a>
// END_HTML
//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: HepDatabasePDG.cxx,v 1.3 2009/11/23 16:44:46 kind Exp $
// Copyright: 2009 (C) Oliver Maria Kind
//
#ifndef HEP_HepDatabasePDG
#include <HepDatabasePDG.h>
#endif
#include <TSystem.h>

#ifndef __CINT__
ClassImp(HepDatabasePDG);
#endif

HepDatabasePDG *HepDatabasePDG::fgHepInstance = 0;

//____________________________________________________________________

HepDatabasePDG::HepDatabasePDG() : TDatabasePDG() {
    //
    // Default constructor
    //
    
    // Protect against multiple instances
    if ( fgHepInstance != 0 ) {
	Error("HepDatabasePDG", "Multiple instances of this object not allowed. Use HepDatabasePDG::Instance() instead!");
	gSystem->Abort(0);
    }
    fgHepInstance = this;
    
    // Include additional particles
    AddParticlesToPdgDbase();
}

//____________________________________________________________________

HepDatabasePDG::~HepDatabasePDG() {
    //
    // Default destructor
    //
    fgHepInstance = 0;
}

//____________________________________________________________________

HepDatabasePDG* HepDatabasePDG::Instance() {
    //
    // Create dbase singleton
    //
    return ( fgHepInstance != 0 ) ? (HepDatabasePDG*)fgHepInstance
	: new HepDatabasePDG();
}

//____________________________________________________________________

void HepDatabasePDG::AddParticlesToPdgDbase() {
    //
    // Add more particles to ROOT's PDG databse
    // Courtesy of the ALICE collaboration. See
    // BEGIN_HTML
    // <a href="http://alisoft.cern.ch/viewvc/trunk/STEER/AliPDG.cxx?root=AliRoot&view=markup">http://alisoft.cern.ch/viewvc/trunk/STEER/AliPDG.cxx?root=AliRoot&view=markup</a>
    // END_HTML
    //
    static Bool_t bAdded = kFALSE;
    // Check if already called
    if(bAdded)return;
    bAdded = true;
    
    // PDG nuclear states are 10-digit numbers
    // 10LZZZAAAI e.g. deuteron is 
    // 1000010020
    const Int_t kion=1000000000;
    
    const Double_t kAu2Gev=0.9314943228;
    const Double_t khSlash = 1.0545726663e-27;
    const Double_t kErg2Gev = 1/1.6021773349e-3;
    const Double_t khShGev = khSlash*kErg2Gev;
    const Double_t kYear2Sec = 3600*24*365.25;
    
    //
    // Bottom mesons
    // mass and life-time from PDG
    //
    this->AddParticle("Upsilon(3S)","Upsilon(3S)",10.3552,kTRUE,
		       0,1,"Bottonium",200553);
    
    // QCD diffractive states
    this->AddParticle("rho_diff0","rho_diff0",0,kTRUE,
		       0,0,"QCD diffr. state",9900110);
    this->AddParticle("pi_diffr+","pi_diffr+",0,kTRUE,
		       0,1,"QCD diffr. state",9900210);
    this->AddParticle("omega_di","omega_di",0,kTRUE,
		       0,0,"QCD diffr. state",9900220);
    this->AddParticle("phi_diff","phi_diff",0,kTRUE,
		       0,0,"QCD diffr. state",9900330);
    this->AddParticle("J/psi_di","J/psi_di",0,kTRUE,
		       0,0,"QCD diffr. state",9900440);
    this->AddParticle("n_diffr0","n_diffr0",0,kTRUE,
		       0,0,"QCD diffr. state",9902110);
    this->AddParticle("p_diffr+","p_diffr+",0,kTRUE,
		       0,1,"QCD diffr. state",9902210);
    
    // From Herwig
    this->AddParticle("PSID    ", " ", 3.7699, kFALSE, 0.0, 0, "meson",   30443);
    
    this->AddParticle("A_00    ", " ", 0.9960, kFALSE, 0.0, 0, "meson",  9000111); 
    this->AddParticle("A_0+    ", " ", 0.9960, kFALSE, 0.0,+1, "meson",  9000211);  
    this->AddParticle("A_0-    ", " ", 0.9960, kFALSE, 0.0,-1, "meson", -9000211);  
    
    this->AddParticle("F0P0    ", " ", 0.9960, kFALSE, 0.0, 0, "meson",  9010221); 
    
    this->AddParticle("KDL_2+  ", " ", 1.773,  kFALSE, 0.0,+1, "meson",   10325); 
    this->AddParticle("KDL_2-  ", " ", 1.773,  kFALSE, 0.0,-1, "meson",  -10325); 
    
    this->AddParticle("KDL_20  ", " ", 1.773,  kFALSE, 0.0, 0, "meson",   10315); 
    this->AddParticle("KDL_2BR0", " ", 1.773,  kFALSE, 0.0, 0, "meson",  -10315); 
    
    this->AddParticle("PI_2+   ", " ", 1.670,  kFALSE, 0.0,+1, "meson",   10215);
    this->AddParticle("PI_2-   ", " ", 1.670,  kFALSE, 0.0,-1, "meson",  -10215);
    this->AddParticle("PI_20   ", " ", 1.670,  kFALSE, 0.0, 0, "meson",   10115);
    
    this->AddParticle("KD*+    ", " ", 1.717,  kFALSE, 0.0,+1, "meson",   30323); 
    this->AddParticle("KD*-    ", " ", 1.717,  kFALSE, 0.0,-1, "meson",  -30323); 

    this->AddParticle("KD*0    ", " ", 1.717,  kFALSE, 0.0, 0, "meson",   30313); 
    this->AddParticle("KDBR*0  ", " ", 1.717,  kFALSE, 0.0, 0, "meson",  -30313); 
    
    this->AddParticle("RHOD+   ", " ", 1.700,  kFALSE, 0.0,+1, "meson",   30213); 
    this->AddParticle("RHOD-   ", " ", 1.700,  kFALSE, 0.0,-1, "meson",  -30213); 
    this->AddParticle("RHOD0   ", " ", 1.700,  kFALSE, 0.0, 0, "meson",   30113); 
    
    this->AddParticle("ETA_2(L)", " ", 1.632,  kFALSE, 0.0, 0, "meson",   10225); 
    this->AddParticle("ETA_2(H)", " ", 1.854,  kFALSE, 0.0, 0, "meson",   10335); 
    this->AddParticle("OMEGA(H)", " ", 1.649,  kFALSE, 0.0, 0, "meson",   30223);
    
    this->AddParticle("KDH_2+  ", " ", 1.816,  kFALSE, 0.0,+1, "meson",   20325);
    this->AddParticle("KDH_2-  ", " ", 1.816,  kFALSE, 0.0,-1, "meson",  -20325);
    
    this->AddParticle("KDH_20  ", " ", 1.816,  kFALSE, 0.0, 0, "meson",   20315);
    this->AddParticle("KDH_2BR0", " ", 1.816,  kFALSE, 0.0, 0, "meson",  -20315);
    
    this->AddParticle("KD_3+   ", " ", 1.773,  kFALSE, 0.0,+1, "meson",     327);
    this->AddParticle("KD_3-   ", " ", 1.773,  kFALSE, 0.0,-1, "meson",    -327);
    
    this->AddParticle("KD_30   ", " ", 1.773,  kFALSE, 0.0, 0, "meson",     317);
    this->AddParticle("KD_3BR0 ", " ", 1.773,  kFALSE, 0.0, 0, "meson",    -317);
    
    this->AddParticle("RHO_3+  ", " ", 1.691,  kFALSE, 0.0,+1, "meson",     217);
    this->AddParticle("RHO_3-  ", " ", 1.691,  kFALSE, 0.0,-1, "meson",    -217);
    this->AddParticle("RHO_30  ", " ", 1.691,  kFALSE, 0.0, 0, "meson",     117);
    this->AddParticle("OMEGA_3 ", " ", 1.667,  kFALSE, 0.0, 0, "meson",     227);
    this->AddParticle("PHI_3   ", " ", 1.854,  kFALSE, 0.0, 0, "meson",     337);
    
    this->AddParticle("CHI2P_B0", " ", 10.232, kFALSE, 0.0, 0, "meson", 110551);
    this->AddParticle("CHI2P_B1", " ", 10.255, kFALSE, 0.0, 0, "meson", 120553);
    this->AddParticle("CHI2P_B2", " ", 10.269, kFALSE, 0.0, 0, "meson", 100555);
    this->AddParticle("UPSLON4S", " ", 10.580, kFALSE, 0.0, 0, "meson", 300553);
    
    // Ions
    //
    // Done by default now from Pythia6 table
    // Needed for other generators
    // So check if already defined
    Int_t ionCode = kion+10020;
    if(!this->GetParticle(ionCode)){
	this->AddParticle("Deuteron","Deuteron",2*kAu2Gev+8.071e-3,kTRUE,
			   0,1,"Ion",ionCode);
    }
    
    this->AddAntiParticle("Anti Deuteron", - ionCode);
    
    ionCode = kion+10030;
    if(!this->GetParticle(ionCode)){
	this->AddParticle("Triton","Triton",3*kAu2Gev+14.931e-3,kFALSE,
			   khShGev/(12.33*kYear2Sec),1,"Ion",ionCode);
    }
    
    ionCode = kion+20030;
    if(!this->GetParticle(ionCode)){
	this->AddParticle("HE3","HE3",3*kAu2Gev+14.931e-3,kFALSE,
			   0,2,"Ion",ionCode);
    }
    
    ionCode = kion+20040;
    if(!this->GetParticle(ionCode)){
	this->AddParticle("Alpha","Alpha",4*kAu2Gev+2.424e-3,kTRUE,
			   khShGev/(12.33*kYear2Sec),2,"Ion",ionCode);
    }

    // Special particles
    const Int_t kspe=50000000;
    this->AddParticle("Cherenkov","Cherenkov",0,kFALSE,
		       0,0,"Special",kspe+50);
    this->AddParticle("FeedbackPhoton","FeedbackPhoton",0,kFALSE,
		       0,0,"Special",kspe+51);
    this->AddParticle("Lambda1520","Lambda1520",1.5195,kFALSE,
		       0.0156,0,"Resonance",3124);
    this->AddAntiParticle("Lambda1520bar",-3124);
}

 HepDatabasePDG.cxx:1
 HepDatabasePDG.cxx:2
 HepDatabasePDG.cxx:3
 HepDatabasePDG.cxx:4
 HepDatabasePDG.cxx:5
 HepDatabasePDG.cxx:6
 HepDatabasePDG.cxx:7
 HepDatabasePDG.cxx:8
 HepDatabasePDG.cxx:9
 HepDatabasePDG.cxx:10
 HepDatabasePDG.cxx:11
 HepDatabasePDG.cxx:12
 HepDatabasePDG.cxx:13
 HepDatabasePDG.cxx:14
 HepDatabasePDG.cxx:15
 HepDatabasePDG.cxx:16
 HepDatabasePDG.cxx:17
 HepDatabasePDG.cxx:18
 HepDatabasePDG.cxx:19
 HepDatabasePDG.cxx:20
 HepDatabasePDG.cxx:21
 HepDatabasePDG.cxx:22
 HepDatabasePDG.cxx:23
 HepDatabasePDG.cxx:24
 HepDatabasePDG.cxx:25
 HepDatabasePDG.cxx:26
 HepDatabasePDG.cxx:27
 HepDatabasePDG.cxx:28
 HepDatabasePDG.cxx:29
 HepDatabasePDG.cxx:30
 HepDatabasePDG.cxx:31
 HepDatabasePDG.cxx:32
 HepDatabasePDG.cxx:33
 HepDatabasePDG.cxx:34
 HepDatabasePDG.cxx:35
 HepDatabasePDG.cxx:36
 HepDatabasePDG.cxx:37
 HepDatabasePDG.cxx:38
 HepDatabasePDG.cxx:39
 HepDatabasePDG.cxx:40
 HepDatabasePDG.cxx:41
 HepDatabasePDG.cxx:42
 HepDatabasePDG.cxx:43
 HepDatabasePDG.cxx:44
 HepDatabasePDG.cxx:45
 HepDatabasePDG.cxx:46
 HepDatabasePDG.cxx:47
 HepDatabasePDG.cxx:48
 HepDatabasePDG.cxx:49
 HepDatabasePDG.cxx:50
 HepDatabasePDG.cxx:51
 HepDatabasePDG.cxx:52
 HepDatabasePDG.cxx:53
 HepDatabasePDG.cxx:54
 HepDatabasePDG.cxx:55
 HepDatabasePDG.cxx:56
 HepDatabasePDG.cxx:57
 HepDatabasePDG.cxx:58
 HepDatabasePDG.cxx:59
 HepDatabasePDG.cxx:60
 HepDatabasePDG.cxx:61
 HepDatabasePDG.cxx:62
 HepDatabasePDG.cxx:63
 HepDatabasePDG.cxx:64
 HepDatabasePDG.cxx:65
 HepDatabasePDG.cxx:66
 HepDatabasePDG.cxx:67
 HepDatabasePDG.cxx:68
 HepDatabasePDG.cxx:69
 HepDatabasePDG.cxx:70
 HepDatabasePDG.cxx:71
 HepDatabasePDG.cxx:72
 HepDatabasePDG.cxx:73
 HepDatabasePDG.cxx:74
 HepDatabasePDG.cxx:75
 HepDatabasePDG.cxx:76
 HepDatabasePDG.cxx:77
 HepDatabasePDG.cxx:78
 HepDatabasePDG.cxx:79
 HepDatabasePDG.cxx:80
 HepDatabasePDG.cxx:81
 HepDatabasePDG.cxx:82
 HepDatabasePDG.cxx:83
 HepDatabasePDG.cxx:84
 HepDatabasePDG.cxx:85
 HepDatabasePDG.cxx:86
 HepDatabasePDG.cxx:87
 HepDatabasePDG.cxx:88
 HepDatabasePDG.cxx:89
 HepDatabasePDG.cxx:90
 HepDatabasePDG.cxx:91
 HepDatabasePDG.cxx:92
 HepDatabasePDG.cxx:93
 HepDatabasePDG.cxx:94
 HepDatabasePDG.cxx:95
 HepDatabasePDG.cxx:96
 HepDatabasePDG.cxx:97
 HepDatabasePDG.cxx:98
 HepDatabasePDG.cxx:99
 HepDatabasePDG.cxx:100
 HepDatabasePDG.cxx:101
 HepDatabasePDG.cxx:102
 HepDatabasePDG.cxx:103
 HepDatabasePDG.cxx:104
 HepDatabasePDG.cxx:105
 HepDatabasePDG.cxx:106
 HepDatabasePDG.cxx:107
 HepDatabasePDG.cxx:108
 HepDatabasePDG.cxx:109
 HepDatabasePDG.cxx:110
 HepDatabasePDG.cxx:111
 HepDatabasePDG.cxx:112
 HepDatabasePDG.cxx:113
 HepDatabasePDG.cxx:114
 HepDatabasePDG.cxx:115
 HepDatabasePDG.cxx:116
 HepDatabasePDG.cxx:117
 HepDatabasePDG.cxx:118
 HepDatabasePDG.cxx:119
 HepDatabasePDG.cxx:120
 HepDatabasePDG.cxx:121
 HepDatabasePDG.cxx:122
 HepDatabasePDG.cxx:123
 HepDatabasePDG.cxx:124
 HepDatabasePDG.cxx:125
 HepDatabasePDG.cxx:126
 HepDatabasePDG.cxx:127
 HepDatabasePDG.cxx:128
 HepDatabasePDG.cxx:129
 HepDatabasePDG.cxx:130
 HepDatabasePDG.cxx:131
 HepDatabasePDG.cxx:132
 HepDatabasePDG.cxx:133
 HepDatabasePDG.cxx:134
 HepDatabasePDG.cxx:135
 HepDatabasePDG.cxx:136
 HepDatabasePDG.cxx:137
 HepDatabasePDG.cxx:138
 HepDatabasePDG.cxx:139
 HepDatabasePDG.cxx:140
 HepDatabasePDG.cxx:141
 HepDatabasePDG.cxx:142
 HepDatabasePDG.cxx:143
 HepDatabasePDG.cxx:144
 HepDatabasePDG.cxx:145
 HepDatabasePDG.cxx:146
 HepDatabasePDG.cxx:147
 HepDatabasePDG.cxx:148
 HepDatabasePDG.cxx:149
 HepDatabasePDG.cxx:150
 HepDatabasePDG.cxx:151
 HepDatabasePDG.cxx:152
 HepDatabasePDG.cxx:153
 HepDatabasePDG.cxx:154
 HepDatabasePDG.cxx:155
 HepDatabasePDG.cxx:156
 HepDatabasePDG.cxx:157
 HepDatabasePDG.cxx:158
 HepDatabasePDG.cxx:159
 HepDatabasePDG.cxx:160
 HepDatabasePDG.cxx:161
 HepDatabasePDG.cxx:162
 HepDatabasePDG.cxx:163
 HepDatabasePDG.cxx:164
 HepDatabasePDG.cxx:165
 HepDatabasePDG.cxx:166
 HepDatabasePDG.cxx:167
 HepDatabasePDG.cxx:168
 HepDatabasePDG.cxx:169
 HepDatabasePDG.cxx:170
 HepDatabasePDG.cxx:171
 HepDatabasePDG.cxx:172
 HepDatabasePDG.cxx:173
 HepDatabasePDG.cxx:174
 HepDatabasePDG.cxx:175
 HepDatabasePDG.cxx:176
 HepDatabasePDG.cxx:177
 HepDatabasePDG.cxx:178
 HepDatabasePDG.cxx:179
 HepDatabasePDG.cxx:180
 HepDatabasePDG.cxx:181
 HepDatabasePDG.cxx:182
 HepDatabasePDG.cxx:183
 HepDatabasePDG.cxx:184
 HepDatabasePDG.cxx:185
 HepDatabasePDG.cxx:186
 HepDatabasePDG.cxx:187
 HepDatabasePDG.cxx:188
 HepDatabasePDG.cxx:189
 HepDatabasePDG.cxx:190
 HepDatabasePDG.cxx:191
 HepDatabasePDG.cxx:192
 HepDatabasePDG.cxx:193
 HepDatabasePDG.cxx:194
 HepDatabasePDG.cxx:195
 HepDatabasePDG.cxx:196
 HepDatabasePDG.cxx:197
 HepDatabasePDG.cxx:198
 HepDatabasePDG.cxx:199
 HepDatabasePDG.cxx:200
 HepDatabasePDG.cxx:201
 HepDatabasePDG.cxx:202
 HepDatabasePDG.cxx:203
 HepDatabasePDG.cxx:204
 HepDatabasePDG.cxx:205
 HepDatabasePDG.cxx:206
 HepDatabasePDG.cxx:207
 HepDatabasePDG.cxx:208