G4ElasticHNScattering Class Reference

#include <G4ElasticHNScattering.hh>


Public Member Functions

 G4ElasticHNScattering ()
virtual ~G4ElasticHNScattering ()
virtual G4bool ElasticScattering (G4VSplitableHadron *aPartner, G4VSplitableHadron *bPartner, G4FTFParameters *theParameters) const


Detailed Description

Definition at line 47 of file G4ElasticHNScattering.hh.


Constructor & Destructor Documentation

G4ElasticHNScattering::G4ElasticHNScattering (  ) 

Definition at line 52 of file G4ElasticHNScattering.cc.

00053 {
00054 }

G4ElasticHNScattering::~G4ElasticHNScattering (  )  [virtual]

Definition at line 259 of file G4ElasticHNScattering.cc.

00260 {
00261 }


Member Function Documentation

G4bool G4ElasticHNScattering::ElasticScattering ( G4VSplitableHadron aPartner,
G4VSplitableHadron bPartner,
G4FTFParameters theParameters 
) const [virtual]

Definition at line 57 of file G4ElasticHNScattering.cc.

References G4VSplitableHadron::Get4Momentum(), G4FTFParameters::GetAvaragePt2ofElasticScattering(), G4VSplitableHadron::GetDefinition(), G4ParticleDefinition::GetPDGMass(), G4VSplitableHadron::GetPosition(), G4VSplitableHadron::GetTimeOfCreation(), G4VSplitableHadron::IncrementCollisionCount(), G4VSplitableHadron::Set4Momentum(), G4VSplitableHadron::SetPosition(), G4VSplitableHadron::SetStatus(), and G4VSplitableHadron::SetTimeOfCreation().

Referenced by G4DiffractiveExcitation::ExciteParticipants().

00060 {
00061 // -------------------- Projectile parameters -----------------------------------
00062            G4LorentzVector Pprojectile=projectile->Get4Momentum();
00063 
00064            if(Pprojectile.z() < 0.)
00065            {
00066             target->SetStatus(2);
00067             return false;
00068            } 
00069 
00070            G4bool PutOnMassShell(false);
00071 
00072            G4double M0projectile = Pprojectile.mag();                        
00073            if(M0projectile < projectile->GetDefinition()->GetPDGMass()) 
00074            {
00075               PutOnMassShell=true;
00076               M0projectile=projectile->GetDefinition()->GetPDGMass();
00077            }
00078 
00079            G4double Mprojectile2 = M0projectile * M0projectile;
00080 
00081            G4double AveragePt2=theParameters->GetAvaragePt2ofElasticScattering();
00082 
00083 // -------------------- Target parameters ----------------------------------------------
00084 
00085            G4LorentzVector Ptarget=target->Get4Momentum();
00086 
00087            G4double M0target = Ptarget.mag();
00088 
00089            if(M0target < target->GetDefinition()->GetPDGMass()) 
00090            {
00091               PutOnMassShell=true;
00092               M0target=target->GetDefinition()->GetPDGMass();
00093            }
00094      
00095            G4double Mtarget2 = M0target * M0target;                      
00096 
00097 // Transform momenta to cms and then rotate parallel to z axis;
00098 
00099            G4LorentzVector Psum;
00100            Psum=Pprojectile+Ptarget;
00101 
00102            G4LorentzRotation toCms(-1*Psum.boostVector());
00103 
00104            G4LorentzVector Ptmp=toCms*Pprojectile;
00105 
00106            if ( Ptmp.pz() <= 0. )                                
00107            {
00108            // "String" moving backwards in  CMS, abort collision !!
00109            //G4cout << " abort Collision!! " << G4endl;
00110                    target->SetStatus(2);
00111                    return false; 
00112            }
00113                            
00114            toCms.rotateZ(-1*Ptmp.phi());
00115            toCms.rotateY(-1*Ptmp.theta());
00116         
00117            G4LorentzRotation toLab(toCms.inverse());
00118 
00119            Pprojectile.transform(toCms);
00120            Ptarget.transform(toCms);
00121 
00122 // ---------------------- Putting on mass-on-shell, if needed ------------------------
00123            G4double PZcms2, PZcms;                                          
00124 
00125            G4double S=Psum.mag2();                                          
00126 //         G4double SqrtS=std::sqrt(S);                                     
00127 
00128            PZcms2=(S*S+Mprojectile2*Mprojectile2+Mtarget2*Mtarget2-
00129                                  2*S*Mprojectile2-2*S*Mtarget2-2*Mprojectile2*Mtarget2)/4./S;
00130 
00131            if(PZcms2 < 0.)
00132            {  // It can be in an interaction with off-shell nuclear nucleon
00133             if(M0projectile > projectile->GetDefinition()->GetPDGMass()) 
00134             {  // An attempt to de-excite the projectile
00135                // It is assumed that the target is in the ground state
00136              M0projectile = projectile->GetDefinition()->GetPDGMass();
00137              Mprojectile2=M0projectile*M0projectile;
00138              PZcms2=(S*S+Mprojectile2*Mprojectile2+Mtarget2*Mtarget2-
00139                     2*S*Mprojectile2 - 2*S*Mtarget2 - 2*Mprojectile2*Mtarget2)
00140                     /4./S;
00141 
00142              if(PZcms2 < 0.){ return false;} // Non succesful attempt after the de-excitation
00143             }
00144             else // if(M0projectile > projectile->GetDefinition()->GetPDGMass())
00145             {
00146              target->SetStatus(2);                                   
00147              return false;                   // The projectile was not excited,
00148                                              // but the energy was too low to put
00149                                              // the target nucleon on mass-shell
00150             }   // end of if(M0projectile > projectile->GetDefinition()->GetPDGMass())
00151            }    // end of if(PZcms2 < 0.)
00152 
00153            PZcms = std::sqrt(PZcms2);
00154 
00155            if(PutOnMassShell)
00156            {
00157               if(Pprojectile.z() > 0.)
00158               {
00159                  Pprojectile.setPz( PZcms);
00160                  Ptarget.setPz(    -PZcms);
00161               }
00162               else  // if(Pprojectile.z() > 0.)
00163               {
00164                  Pprojectile.setPz(-PZcms);
00165                  Ptarget.setPz(     PZcms);
00166               };
00167 
00168               Pprojectile.setE(std::sqrt(Mprojectile2+
00169                                                       Pprojectile.x()*Pprojectile.x()+
00170                                                       Pprojectile.y()*Pprojectile.y()+
00171                                                       PZcms2));
00172               Ptarget.setE(std::sqrt(    Mtarget2    +
00173                                                       Ptarget.x()*Ptarget.x()+
00174                                                       Ptarget.y()*Ptarget.y()+
00175                                                       PZcms2));
00176            }  // end of if(PutOnMassShell)
00177 
00178            G4double maxPtSquare = PZcms2;
00179 
00180 // ------ Now we can calculate the transfered Pt --------------------------
00181            G4double Pt2;                                                    
00182            G4double ProjMassT2; //, ProjMassT;                                  
00183            G4double TargMassT2; //, TargMassT;
00184 
00185            G4LorentzVector Qmomentum;
00186            Qmomentum=G4LorentzVector(GaussianPt(AveragePt2,maxPtSquare),0);
00187 
00188            Pt2=G4ThreeVector(Qmomentum.vect()).mag2();                  
00189 
00190            ProjMassT2=Mprojectile2+Pt2;                           
00191 //           ProjMassT =std::sqrt(ProjMassT2);                            
00192 
00193            TargMassT2=Mtarget2+Pt2;                               
00194 //           TargMassT =std::sqrt(TargMassT2);                            
00195 
00196            PZcms2=(S*S+ProjMassT2*ProjMassT2+                           
00197                        TargMassT2*TargMassT2-                           
00198                     2.*S*ProjMassT2-2.*S*TargMassT2-                 
00199                     2.*ProjMassT2*TargMassT2)/4./S;                  
00200            if(PZcms2 < 0 ) {PZcms2=0;};// to avoid the exactness problem
00201            PZcms =std::sqrt(PZcms2);                                    
00202 
00203            Pprojectile.setPz( PZcms);  
00204            Ptarget.setPz(    -PZcms); 
00205 
00206            Pprojectile += Qmomentum;
00207            Ptarget     -= Qmomentum;
00208 
00209 // Transform back and update SplitableHadron Participant.
00210            Pprojectile.transform(toLab);
00211            Ptarget.transform(toLab);
00212 /*  // Maybe it will be needed for an exact calculations--------------------
00213            G4double TargetMomentum=std::sqrt(Ptarget.x()*Ptarget.x()+
00214                                              Ptarget.y()*Ptarget.y()+
00215                                              Ptarget.z()*Ptarget.z());
00216 */
00217 
00218 // Calculation of the creation time ---------------------
00219       projectile->SetTimeOfCreation(target->GetTimeOfCreation());
00220       projectile->SetPosition(target->GetPosition());
00221 // Creation time and position of target nucleon were determined at
00222 // ReggeonCascade() of G4FTFModel
00223 // ------------------------------------------------------
00224 
00225            projectile->Set4Momentum(Pprojectile);
00226            target->Set4Momentum(Ptarget);
00227 
00228            projectile->IncrementCollisionCount(1);
00229            target->IncrementCollisionCount(1);
00230 
00231            return true;
00232 }


The documentation for this class was generated from the following files:
Generated on Mon May 27 17:51:50 2013 for Geant4 by  doxygen 1.4.7