// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // 1 2 3 4 5 6 7 8 9 //34567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 // // // $Id: G4QuasmonString.cc,v 1.7 2006/11/27 10:44:55 mkossov Exp $ // GEANT4 tag $Name: geant4-09-02-ref-02 $ // // ---------------- G4QuasmonString ---------------- // by Mikhail Kossov, August 2000. // class for Hadron-Hadron String Interaction used by the CHIPS Model // ------------------------------------------------------------------- //#define chdebug //#define debug //#define sdebug //#define ppdebug //#define cdebug //#define cldebug //#define edebug //#define fdebug //#define pdebug //#define rdebug //#define ffdebug //#define pcdebug //#define mudebug #include "G4QuasmonString.hh" #include using namespace std; G4QuasmonString::G4QuasmonString(G4QHadron projHadron, const G4bool projEnvFlag, const G4int targPDG, const G4bool targEnvFlag) : theProjEnvFlag(projEnvFlag), theTargEnvFlag(targEnvFlag), theWeight(1.) { //static const G4double mPi0 = G4QPDGCode(111).GetMass(); // Pi0 mass //static const G4double mPi0 = (1232.-938.272)/2; // between p&Delta (147.365) shift static const G4double mPi0 = sqrt((1232.*1232+938.272*938.272)/2)-938.272; // Pi0 mass //static const G4double mPi0 = 170.; // Pi0 mass static const G4double FreeFra = 1.; // @@ Free fraction for n-n scattering static const G4double interc = -1.; // @@ Pomeron intercept //static const G4double Temperature = 180.; // Temperature as a parameter //static const G4double Temp2 = Temperature*Temperature; // Squared Temperature static G4Quasmon classG4Quasmon(G4QContent(1,2,0,0,0,0)); //static const G4QPDGCode pimQPDG(-211); theWorld= G4QCHIPSWorld::Get(); // Get a pointer to the CHIPS World #ifdef debug G4cout<<"-->G4QString::Constr:pPDG="<1.) G4cout<<"-Wor-G4QS::Constr:dM2="<2) // ---> Baryon case (clusters are not implem.) { //if(nQProj>3)G4cout<<"-Wor-G4QS::Const:nQProj="<3 is not implem'd"<3)G4cout<<"-W-G4QS::Const: nQTarg="<3 is not implemented"< El // @@ Just to try ---- End #ifdef pdebug G4cout<<"G4QS::Cons: npM="<.00001) G4cout<<"***kp***G4QS::C:vk="<1.) { #ifdef pdebug G4cout<<"***p***>>>G4QS::C: cost="<0.) // --->>> cost>0. { valk=dmas/(vale-valp)/2; // Momentum is too big (must be reduced) G4ThreeVector tqf=upr*valk; // final targetQuark 3-vector tq4Mom.set(valk,tqf); // Fill new 4-mom for targetQuark tr4Mom.set(tM-valk,-tqf); // Fill new 4-mom for targetResidual newProj4M=tq4Mom+pr4Mom; // Final Projectile 4-mom in LS } else // --->>> cost<0. { G4double hvalk=dmas/(vale+valp); // Momentum's too small (must be increased, LIM) if(hvalk>tM) // Momentum can not be increased to this value { #ifdef pdebug G4cout<<"**p-Cor**>G4QS::C: hvalk="< tM="<G4QS::C: hvalk="<>>G4QS::C: cost="<.0001)G4cout<<"*G4QS::C:||="<.001)G4cout<<"*G4QS::C:"< projCM system pqc4M.boost(projRBoost); // projectileQuark => projCM system G4double valk=pqc4M.e(); // Momentum of the target quark in projCM //#ifdef pdebug G4double dvalk=valk-pqc4M.rho(); if(fabs(dvalk)>.00001) G4cout<<"***kt***G4QS::C:vk="< projCM system trc4M.boost(projRBoost); // targetResidual => projCM system G4double vale=trc4M.e(); // Energy of the targetResidual in projCM G4ThreeVector tr=trc4M.v(); // 3-mom of the targetResidual in projCM G4double valp=tr.mag(); // momentum of the targetResidual in projCM if(fabs(dmas-tM2+trc4M.m2())>.1) G4cout<<"**t**G4QS::C: trM2="<1.) { #ifdef pdebug G4cout<<"***t***>>>G4QS::C: cost="<0.) // --->>> cost>0. { valk=dmas/(vale-valp)/2; // Momentum is too big (must be reduced) G4ThreeVector pqf=utr*valk; // final projectileQuark 3-vector G4LorentzVector pqc4M(valk,pqf); // Fill new 4-mom for projectileQuark in CM pq4Mom=pqc4M; // // Fill new 4-mom for projectileQuark in LS pq4Mom.boost(projBoost); // // Fill new 4-mom for projectileQuark in LS G4LorentzVector prc4M(pM-valk,-pqf); // Fill new 4-mom for projectResidual in CM pr4Mom=prc4M; // // Fill new 4-mom for projectResidual in LS pr4Mom.boost(projBoost); // // Fill new 4-mom for projectResidual in LS newTarg4M=pq4Mom+tr4Mom; // Final Target 4-mom in LS } else // --->>> cost<-1 => cost=-1 { G4double hvalk=dmas/(vale+valp); // Momentum's too small (must be increased, LIM) if(hvalk>pM) // Momentum can not be increased to this value { #ifdef pdebug G4cout<<"**t-Cor**>G4QS::C: hvalk="< pM="<G4QS::C: hvalk="<>>G4QS::C: cost="< projCM system prc4M.boost(projRBoost); // projectileQuark => projCM system G4ThreeVector pq=pqc4M.v(); // 3-vector of the projQ in projCM G4double pqlp=utr.dot(pq); // Projection of pq on the target in projCM G4ThreeVector pql=utr*pqlp; // pq part along pr G4ThreeVector pqt=pq-pql; // pq part perpendicular to tr in projCM G4double cosi=pqlp/valk; // Initial cos(theta) G4ThreeVector pqlf=pql*(cost/cosi); // final pq part along tr G4double sini=sqrt(1.-cosi*cosi); // Initial sin(theta) G4double sint=sqrt(1.-cost*cost); // Desired sin(theta) G4ThreeVector pqpf=pqt*(sint/sini); // final pq part perpendicular tr G4ThreeVector pqf=pqlf+pqpf; // final pq pqc4M.setV(pqf); // Change the momentumDirection of projQ(CM) pq4Mom=pqc4M; // Fill new 4-mom for projQuark in LS pq4Mom.boost(projBoost); // Fill new 4-mom for projQuark in LS prc4M.setV(-pqf); // Change the momentumDirection of projR(CM) #ifdef pdebug G4LorentzVector nT4M=pqc4M+trc4M; if(fabs(nT4M.m()-tM)>.001)G4cout<<"****t****G4QS::C:M="< // Fill new 4-mom for projResidual in LS pr4Mom.boost(projBoost); // // Fill new 4-mom for projResidual in LS if(fabs(pqf.mag()-valk)>.0001)G4cout<<"*G4QS::C:||="<.001)G4cout<<"*G4QS::C:"< CMS cmsProj4M.boost(cmsRBoost); // LS projectile => CMS G4LorentzVector cmsTarg4M=theTarg4Mom; // LS target => CMS cmsTarg4M.boost(cmsRBoost); // LS target => CMS G4double pcm=cmsProj4M.rho(); // CMS momentum for the elastic scattering //#ifdef pdebug if(fabs(cmsTarg4M.rho()-pcm) > 0.0001) G4cout<<"-Worning-G4QuasmonString::Constr: P="< CMS cmsNewPr4M.boost(cmsRBoost); // LS finalProj => CMS G4ThreeVector puV=cmsNewPr4M.v()/cmsNewPr4M.rho(); // Direction of the projectile //#ifdef pdebug G4LorentzVector cmsNewTg4M=newTarg4M; // LS finalTarg => CMS @@ TMP cmsNewTg4M.boost(cmsRBoost); // LS finalTarg => CMS @@ TMP G4ThreeVector tuV=cmsNewTg4M.v()/cmsNewTg4M.rho(); // Direction of the projectile if(1.+puV.dot(tuV) > 0.001) G4cout<<"-Worning-G4QuasmonString::Constr: ct="< LS G4QHadron* projH = new G4QHadron(projHadron); // Prototype of the Projectile Hadron projH->Set4Momentum(newProj4M); theQHadrons.push_back(projH); // Fill theProjectileHadron(delete equivalent) #ifdef pdebug G4cout<<"G4QuasmonString::Constr: Fill ElastProjH="< LS G4QHadron* targH = new G4QHadron(targQPDG,newTarg4M); // Prototype of theTargetHadron theQHadrons.push_back(targH); // Fill the Target Hadron (delete equivalent) #ifdef pdebug G4cout<<"G4QuasmonString::Constr: Fill ElastTargH="<Set4Momentum(newProj4M); theQHadrons.push_back(projH); // Fill theProjectileHadron(delete equivalent) G4Quasmon* targQ = new G4Quasmon(targQPDG.GetQuarkContent(),newTarg4M); theQuasmons.push_back(targQ); // Insert Projectile Quasmon (delete equival.) } if(tcorFl) // Target is on the mass shell { G4Quasmon* projQ = new G4Quasmon(projHadron.GetQC(),newProj4M); theQuasmons.push_back(projQ); // Insert Projectile Quasmon (delete equival.) G4QHadron* targH = new G4QHadron(targQPDG,newTarg4M);//Prototype of theTargetHadron theQHadrons.push_back(targH); // Fill the Target Hadron (delete equivalent) } else // Both are excited (two Quasmons only) { G4Quasmon* projQ = new G4Quasmon(projHadron.GetQC(),newProj4M); theQuasmons.push_back(projQ); // Insert Projectile Quasmon (delete equival.) G4Quasmon* targQ = new G4Quasmon(targQPDG.GetQuarkContent(),newTarg4M); theQuasmons.push_back(targQ); // Insert Projectile Quasmon (delete equival.) } } } else G4cout<<"-Wor-G4QuasmonString::Constr:T="<GetQC()<Get4Momentum()<GetQC()<Get4Momentum()<theQuasmons.size(); if(nQ) for(G4int iq=0; iqtheQuasmons[iq]); #ifdef fdebug G4cout<<"G4QS::CopyByPoint:Q#"<GetQC()<Get4Momentum()<theProjEnvFlag; theTargEnvFlag = right->theTargEnvFlag; theWeight = right->theWeight; theProjQC = right->theProjQC; theTargQC = right->theTargQC; theProj4Mom = right->theProj4Mom; theTarg4Mom = right->theTarg4Mom; theWorld = right->theWorld; tot4Mom = right->tot4Mom; totCharge = right->totCharge; totBaryNum = right->totBaryNum; } G4QuasmonString::~G4QuasmonString() { #ifdef debug G4cout<<"~G4QuasmonString: before theQHadrons nH="<GetCharge(); fBaryoN+=theQHadrons[ih]->GetBaryonNumber(); } G4int nQuas=theQuasmons.size(); if(nQuas)for(G4int iqs=0; iqsGetCharge(); fBaryoN+=theQuasmons[iqs]->GetBaryonNumber(); } if(fCharge!=totCharge || fBaryoN!=totBaryNum) { G4cerr<<"***G4QS::Frag:tC="<1) { if(nPart<2) { G4cerr<<"**G4QuasmonString::RandMomFractionString: n="<4 return x; } //if(nPart!=3) G4cerr<<"*>>>>>*G4QuasmonString::RandMomFractionFree: n="<8) { if(nPart>10) { if(nPart>11) // >11 { pr=.614/pow((nPart+1.25),.75); pra=.915/pow((nPart+6.7),1.75); } else // 11 { pr=.09945; pra=.00667; } } else { if(nPart>9) // 10 { pr=.1064; pra=.00741; } else // 9 { pr=.11425; pra=.00828; } } } else { if(nPart>6) { if(nPart>7) // 8 { pr=.12347; pra=.00926; } else // 7 { pr=.13405; pra=.01027; } } else { if(nPart>5) // 6 { pr=.1454; pra=.01112; } else // 5 { pr=.15765; pra=.00965; } } } x=pow((r/p2),(1.-rr+pra))*(rr+pr*(r-p2)); } else { G4double sr=0.; if(nPart>8) { if(nPart>10) { if(nPart>11) sr=.86/(nPart+1.05); // >11 else sr=.0774; // 11 } else { if(nPart>9) sr=.0849; // 10 else sr=.0938; // 9 } } else { if(nPart>6) { if(nPart>7) sr=.1047; // 8 else sr=.1179; // 7 } else { if(nPart>5) sr=.1339; // 6 else sr=.15135; // 5 } } x=1.-sqrt((1.-r)/(1.-p2))*(1.-rr+sr*(p2-r)); } } } return x; } // End of RandomizeMomFractionFree // Randomize MomentumFraction for CHIPS of nPart partons for Pomeron exchange [(1-x)^(n-2)] G4double G4QuasmonString::RandomizeMomFractionString(G4int nPart) {// ================================================ if(nPart<2) { G4cerr<<"**G4QuasmonString::RandMomFractionString: n="<4 return x; } // End of RandomizeMomFractionString