00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef G4CASCADE_CHECK_BALANCE_HH
00027 #define G4CASCADE_CHECK_BALANCE_HH
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 #include "G4VCascadeCollider.hh"
00051 #include "globals.hh"
00052 #include "G4CollisionOutput.hh"
00053 #include "G4LorentzVector.hh"
00054 #include <cmath>
00055 #include <vector>
00056
00057 class G4CascadParticle;
00058 class G4InuclElementaryParticle;
00059 class G4InuclNuclei;
00060 class G4InuclParticle;
00061
00062 class G4CascadeCheckBalance : public G4VCascadeCollider {
00063 public:
00064 static const G4double tolerance;
00065
00066 explicit G4CascadeCheckBalance(const char* owner="G4CascadeCheckBalance");
00067
00068 G4CascadeCheckBalance(G4double relative, G4double absolute,
00069 const char* owner="G4CascadeCheckBalance");
00070 virtual ~G4CascadeCheckBalance() {};
00071
00072 void setOwner(const char* owner) { setName(owner); }
00073
00074 void setLimits(G4double relative, G4double absolute) {
00075 setRelativeLimit(relative);
00076 setAbsoluteLimit(absolute);
00077 }
00078
00079 void setRelativeLimit(G4double limit) { relativeLimit = limit; }
00080 void setAbsoluteLimit(G4double limit) { absoluteLimit = limit; }
00081
00082 void collide(G4InuclParticle* bullet, G4InuclParticle* target,
00083 G4CollisionOutput& output);
00084
00085
00086 void collide(G4InuclParticle* bullet, G4InuclParticle* target,
00087 const std::vector<G4InuclElementaryParticle>& particles);
00088
00089
00090 void collide(G4InuclParticle* bullet, G4InuclParticle* target,
00091 const std::vector<G4InuclNuclei>& fragments);
00092
00093
00094 void collide(G4InuclParticle* bullet, G4InuclParticle* target,
00095 const std::vector<G4CascadParticle>& particles);
00096
00097
00098 void collide(G4InuclParticle* bullet, G4InuclParticle* target,
00099 G4CollisionOutput& output,
00100 const std::vector<G4CascadParticle>& cparticles);
00101
00102
00103 G4bool energyOkay() const;
00104 G4bool ekinOkay() const;
00105 G4bool momentumOkay() const;
00106 G4bool baryonOkay() const;
00107 G4bool chargeOkay() const;
00108 G4bool strangeOkay() const;
00109
00110
00111
00112 G4bool okay() const { return (energyOkay() && momentumOkay() &&
00113 baryonOkay() && chargeOkay()); }
00114
00115
00116
00117 G4double deltaE() const { return (final.e() - initial.e()); }
00118 G4double relativeE() const {
00119 return ( (std::abs(deltaE())<tolerance) ? 0. :
00120 (initial.e()<tolerance) ? 1. : deltaE()/initial.e() );
00121 }
00122
00123 G4double deltaKE() const { return (ekin(final) - ekin(initial)); }
00124 G4double relativeKE() const {
00125 return ( (std::abs(deltaKE())<tolerance) ? 0. :
00126 (ekin(initial)<tolerance) ? 1. : deltaKE()/ekin(initial) );
00127 }
00128
00129 G4double deltaP() const { return deltaLV().rho(); }
00130 G4double relativeP() const {
00131 return ( (std::abs(deltaP())<tolerance) ? 0. :
00132 (initial.rho()<tolerance) ? 1. : deltaP()/initial.rho() );
00133 }
00134
00135 G4LorentzVector deltaLV() const { return final - initial; }
00136
00137
00138 G4int deltaB() const { return (finalBaryon - initialBaryon); }
00139 G4int deltaQ() const { return (finalCharge - initialCharge); }
00140 G4int deltaS() const { return (finalStrange- initialStrange); }
00141
00142 protected:
00143
00144 G4double ekin(const G4LorentzVector& p) const { return (p.e() - p.m()); }
00145
00146 private:
00147 G4double relativeLimit;
00148 G4double absoluteLimit;
00149
00150 G4LorentzVector initial;
00151 G4LorentzVector final;
00152
00153 G4int initialBaryon;
00154 G4int finalBaryon;
00155
00156 G4int initialCharge;
00157 G4int finalCharge;
00158
00159 G4int initialStrange;
00160 G4int finalStrange;
00161
00162 G4CollisionOutput tempOutput;
00163 };
00164
00165 #endif