Limitation to one user defined ion removed.
authormorsch <morsch@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 18 Apr 2008 07:00:28 +0000 (07:00 +0000)
committermorsch <morsch@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 18 Apr 2008 07:00:28 +0000 (07:00 +0000)
TFluka/TFluka.cxx
TFluka/TFluka.h
TFluka/TFlukaIon.cxx
TFluka/TFlukaIon.h

index a02c34f..eaeab8d 100644 (file)
@@ -151,7 +151,7 @@ TFluka::TFluka()
    fMCGeo(0),
    fUserConfig(0), 
    fUserScore(0),
-   fUserIon(0)
+   fUserIons(0)
 { 
   //
   // Default constructor
@@ -194,7 +194,7 @@ TFluka::TFluka(const char *title, Int_t verbosity, Bool_t isRootGeometrySupporte
    fMCGeo(0),
    fUserConfig(new TObjArray(100)),
    fUserScore(new TObjArray(100)),
-   fUserIon(0)
+   fUserIons(0)
 {
   // create geometry interface
     for (Int_t i = 0; i < 4; i++) fPint[i] = 0.;
@@ -1037,14 +1037,14 @@ Int_t TFluka::IdFromPDG(Int_t pdg) const
                          TFlukaIon::GetIonPdg(1,2)};    
     // Catch the feedback photons
     if (pdg == 50000051) return (kFLUKAoptical);
-    // Ion as primary
+
+    // Light ions (d,t,h3,alpha)
     for (Int_t i = 0; i < 4; i++) {
        if (pdg == idSpecial[i]) return (i + kFLUKAcodemin);
     }
     
-    if ((!fUserIon && pdg == TFlukaIon::GetIonPdg(6,12)) ||
-       ( fUserIon && pdg == fUserIon->GetPdgCode())) 
-       return (-2);
+    // Heavy ions
+    if (pdg > TFlukaIon::GetIonPdg(1,1)) return (-2);
 
     // MCIHAD() goes from pdg to fluka internal.
     Int_t intfluka = mcihad(pdg);
@@ -1330,7 +1330,7 @@ void TFluka::InitPhysics()
 // Add RANDOMIZ card
     fprintf(pFlukaVmcInp,"RANDOMIZ  %10.1f%10.0f\n", 1., Float_t(gRandom->GetSeed()));
 // User defined ion
-    if (fUserIon) fUserIon->WriteUserInputCard(pFlukaVmcInp);
+//    if (fUserIon) fUserIon->WriteUserInputCard(pFlukaVmcInp);
 // Add START and STOP card
     fprintf(pFlukaVmcInp,"START     %10.1f\n",fEventsPerRun);
     fprintf(pFlukaVmcInp,"STOP      \n");
@@ -2768,11 +2768,7 @@ void TFluka::CalcPrimaryIonisationTime()
 Bool_t TFluka::DefineIon(const char* name , Int_t z, Int_t a, Int_t q, Double_t exE, Double_t mass)
 {
     // User defined ion that can be used as a primary
-    if (fUserIon) {
-       Warning("DefineIon", "Only one user ion can be defined !");
-       return kFALSE;
-    } else {
-       fUserIon = new TFlukaIon(name, z, a, q, exE, mass);
-       return kTRUE;
-    }
+    fUserIons = kTRUE;
+    TFlukaIon::AddIon(name, z, a, q,exE, mass);
+    return kTRUE;
 }
index 438ef67..21545c1 100644 (file)
@@ -23,7 +23,6 @@
 class TGeoMCGeometry;
 //class TFlukaMCGeometry;
 class TGeoMaterial;
-class TFlukaIon;
 
 class TFluka : public TVirtualMC {
   
@@ -461,7 +460,8 @@ class TFluka : public TVirtualMC {
   TObjArray* fUserConfig;            // List of user physics configuration 
   TObjArray* fUserScore;             // List of user scoring options
   // User defined Ion
-  TFlukaIon* fUserIon;               // User defined ion
+  Bool_t               fUserIons;    // User requests ion transport
+  
   //
 
   ClassDef(TFluka,1)                 // C++ interface to Fluka montecarlo
index 11a4802..e888a08 100644 (file)
@@ -95,6 +95,19 @@ void TFlukaIon::AddIon(Int_t a, Int_t z)
                       0, 3 * z, "Ion", pdg);
 }
 
+void  TFlukaIon::AddIon(const char* name, Int_t z, Int_t a, Int_t /*q*/,
+                       Double_t /*exE*/, Double_t mass)
+{
+// User defined ion
+    TDatabasePDG *pdgDB = TDatabasePDG::Instance();
+    const Double_t kAu2Gev   = 0.9314943228;
+    Int_t pdg =  GetIonPdg(z, a);
+    if (pdgDB->GetParticle(pdg)) return;
+    if (mass = 0.) mass = Float_t(a) * kAu2Gev + 8.071e-3;
+
+    pdgDB->AddParticle(name, "User Ion", mass, kTRUE, 0, 3 * z, "Ion", pdg);
+}
+
 void TFlukaIon::WriteUserInputCard(FILE* pFlukaVmcInp) const
 {
     // Write the user input card
index 7d1619f..989b642 100644 (file)
@@ -35,6 +35,8 @@ public:
     void     WriteUserInputCard(FILE* file) const;
     //
     static void  AddIon(Int_t a, Int_t z);
+    static void  AddIon(const char* name, Int_t z, Int_t a, Int_t q,
+                       Double_t exE, Double_t mass);
     static Int_t GetIonPdg(Int_t z, Int_t a, Int_t i = 0);
     static Int_t    GetZ(Int_t pdg);
     static Int_t    GetA(Int_t pdg);