Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/management/src/G4HadLeadBias.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 // 20110906  M. Kelsey -- Use reference to G4HadSecondary instead of pointer
 27 
 28 #include "G4HadLeadBias.hh"
 29 #include "G4Gamma.hh"
 30 #include "G4PionZero.hh"
 31 #include "Randomize.hh"
 32 #include "G4HadFinalState.hh"
 33 
 34   G4HadFinalState * G4HadLeadBias::Bias(G4HadFinalState * result)
 35   {
 36     // G4cerr << "bias enter"<<G4endl;
 37     G4int nMeson(0), nBaryon(0), npi0(0), ngamma(0), nLepton(0);
 38     G4int i(0);
 39     G4int maxE = -1;
 40     G4double emax = 0;
 41     if(result->GetStatusChange()==isAlive) 
 42     {
 43       emax = result->GetEnergyChange();
 44     }
 45     //G4cout << "max energy "<<G4endl;
 46     for(i=0;i<static_cast<G4int>(result->GetNumberOfSecondaries());i++)
 47     {
 48       if(result->GetSecondary(i)->GetParticle()->GetKineticEnergy()>emax)
 49       {
 50         maxE = i;
 51   emax = result->GetSecondary(i)->GetParticle()->GetKineticEnergy();
 52       }
 53     }
 54     //G4cout <<"loop1"<<G4endl;
 55     for(i=0; i<static_cast<G4int>(result->GetNumberOfSecondaries()); i++)
 56     {
 57       const G4DynamicParticle* aSecTrack = result->GetSecondary(i)->GetParticle();
 58       if(i==maxE)
 59       {
 60       }
 61       else if(aSecTrack->GetDefinition()->GetBaryonNumber()!=0) 
 62       {
 63         nBaryon++;
 64       }
 65       else if(aSecTrack->GetDefinition()->GetLeptonNumber()!=0) 
 66       {
 67         nLepton++;
 68       }
 69       else if(aSecTrack->GetDefinition()==G4Gamma::Gamma())
 70       {
 71         ngamma++;
 72       }
 73       else if(aSecTrack->GetDefinition()==G4PionZero::PionZero())
 74       {
 75         npi0++;
 76       }
 77       else
 78       {
 79         nMeson++;
 80       }
 81     }
 82      //G4cout << "BiasDebug 1 = "<<result->GetNumberOfSecondaries()<<" "
 83      //       <<nMeson<<" "<< nBaryon<<" "<< npi0<<" "<< ngamma<<" "<< nLepton<<G4endl;
 84     G4double mesonWeight = nMeson;
 85     G4double baryonWeight = nBaryon;
 86     G4double gammaWeight = ngamma;
 87     G4double npi0Weight = npi0;
 88     G4double leptonWeight = nLepton;
 89     G4int randomMeson = static_cast<G4int>((nMeson+1)*G4UniformRand());
 90     G4int randomBaryon = static_cast<G4int>((nBaryon+1)*G4UniformRand());
 91     G4int randomGamma = static_cast<G4int>((ngamma+1)*G4UniformRand());
 92     G4int randomPi0 = static_cast<G4int>((npi0+1)*G4UniformRand());
 93     G4int randomLepton = static_cast<G4int>((nLepton+1)*G4UniformRand());
 94     
 95     std::vector<G4HadSecondary> buffer;
 96     G4int cMeson(0), cBaryon(0), cpi0(0), cgamma(0), cLepton(0);
 97     for(i=0; i<static_cast<G4int>(result->GetNumberOfSecondaries()); i++)
 98     {
 99       G4bool aCatch = false;
100       G4double weight = 1;
101       const G4HadSecondary* aSecTrack = result->GetSecondary(i);
102       G4ParticleDefinition* aSecDef = aSecTrack->GetParticle()->GetDefinition();
103       if(i==maxE)
104       {
105         aCatch = true;
106   weight = 1;
107       }
108       else if(aSecDef->GetBaryonNumber()!=0) 
109       {
110   if(++cBaryon==randomBaryon) 
111   {
112     aCatch = true;
113     weight = baryonWeight;
114   }
115       }
116       else if(aSecDef->GetLeptonNumber()!=0) 
117       {
118         if(++cLepton==randomLepton) 
119   {
120     aCatch = true;
121     weight = leptonWeight;
122   }
123       }
124       else if(aSecDef==G4Gamma::Gamma())
125       {
126         if(++cgamma==randomGamma) 
127   {
128     aCatch = true;
129     weight = gammaWeight;
130   }
131       }
132       else if(aSecDef==G4PionZero::PionZero())
133       {
134         if(++cpi0==randomPi0) 
135   {
136     aCatch = true;
137     weight = npi0Weight;
138   }
139       }
140       else
141       {
142         if(++cMeson==randomMeson) 
143   {
144     aCatch = true;
145     weight = mesonWeight;
146   }
147       }
148       if(aCatch)
149       {
150   buffer.push_back(*aSecTrack);
151   buffer.back().SetWeight(aSecTrack->GetWeight()*weight);
152       }
153       else
154       {
155         delete aSecTrack;
156       }
157     }
158     result->ClearSecondaries();
159     // G4cerr << "pre"<<G4endl;
160     result->AddSecondaries(buffer);
161      // G4cerr << "bias exit"<<G4endl;
162     
163     return result;
164   }
165