Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // $Id: G4ANuElNucleusCcModel.cc 91806 2015-08 27 // 28 // Geant4 Header : G4ANuElNucleusCcModel 29 // 30 // Author : V.Grichine 12.2.19 31 // 32 33 #include <iostream> 34 #include <fstream> 35 #include <sstream> 36 37 #include "G4ANuElNucleusCcModel.hh" 38 // #include "G4NuMuNuclCcDistrKR.hh" 39 40 // #include "G4NuMuResQX.hh" 41 42 #include "G4SystemOfUnits.hh" 43 #include "G4ParticleTable.hh" 44 #include "G4ParticleDefinition.hh" 45 #include "G4IonTable.hh" 46 #include "Randomize.hh" 47 #include "G4RandomDirection.hh" 48 // #include "G4Threading.hh" 49 50 // #include "G4Integrator.hh" 51 #include "G4DataVector.hh" 52 #include "G4PhysicsTable.hh" 53 /* 54 #include "G4CascadeInterface.hh" 55 // #include "G4BinaryCascade.hh" 56 #include "G4TheoFSGenerator.hh" 57 #include "G4LundStringFragmentation.hh" 58 #include "G4ExcitedStringDecay.hh" 59 #include "G4FTFModel.hh" 60 // #include "G4BinaryCascade.hh" 61 #include "G4HadFinalState.hh" 62 #include "G4HadSecondary.hh" 63 #include "G4HadronicInteractionRegistry.hh" 64 // #include "G4INCLXXInterface.hh" 65 #include "G4QGSModel.hh" 66 #include "G4QGSMFragmentation.hh" 67 #include "G4QGSParticipants.hh" 68 */ 69 #include "G4KineticTrack.hh" 70 #include "G4DecayKineticTracks.hh" 71 #include "G4KineticTrackVector.hh" 72 #include "G4Fragment.hh" 73 #include "G4NucleiProperties.hh" 74 #include "G4ReactionProductVector.hh" 75 76 #include "G4GeneratorPrecompoundInterface.hh" 77 #include "G4PreCompoundModel.hh" 78 #include "G4ExcitationHandler.hh" 79 80 81 #include "G4Positron.hh" 82 // #include "G4MuonPlus.hh" 83 #include "G4Nucleus.hh" 84 #include "G4LorentzVector.hh" 85 86 using namespace std; 87 using namespace CLHEP; 88 89 #ifdef G4MULTITHREADED 90 G4Mutex G4ANuElNucleusCcModel::numuNucleus 91 #endif 92 93 94 G4ANuElNucleusCcModel::G4ANuElNucleusCcModel(c 95 : G4NeutrinoNucleusModel(name) 96 { 97 thePositron = G4Positron::Positron(); 98 fData = fMaster = false; 99 fMel = electron_mass_c2; 100 InitialiseModel(); 101 } 102 103 104 G4ANuElNucleusCcModel::~G4ANuElNucleusCcModel( 105 {} 106 107 108 void G4ANuElNucleusCcModel::ModelDescription(s 109 { 110 111 outFile << "G4ANuElNucleusCcModel is a neu 112 << "model which uses the standard 113 << "transfer parameterization. Th 114 115 } 116 117 ////////////////////////////////////////////// 118 // 119 // Read data from G4PARTICLEXSDATA (locally PA 120 121 void G4ANuElNucleusCcModel::InitialiseModel() 122 { 123 G4String pName = "anti_nu_e"; 124 125 G4int nSize(0), i(0), j(0), k(0); 126 127 if(!fData) 128 { 129 #ifdef G4MULTITHREADED 130 G4MUTEXLOCK(&numuNucleusModel); 131 if(!fData) 132 { 133 #endif 134 fMaster = true; 135 #ifdef G4MULTITHREADED 136 } 137 G4MUTEXUNLOCK(&numuNucleusModel); 138 #endif 139 } 140 141 if(fMaster) 142 { 143 const char* path = G4FindDataDir("G4PARTIC 144 std::ostringstream ost1, ost2, ost3, ost4; 145 ost1 << path << "/" << "neutrino" << "/" < 146 147 std::ifstream filein1( ost1.str().c_str() 148 149 // filein.open("$PARTICLEXSDATA/"); 150 151 filein1>>nSize; 152 153 for( k = 0; k < fNbin; ++k ) 154 { 155 for( i = 0; i <= fNbin; ++i ) 156 { 157 filein1 >> fNuMuXarrayKR[k][i]; 158 // G4cout<< fNuMuXarrayKR[k][i] << " 159 } 160 } 161 // G4cout<<G4endl<<G4endl; 162 163 ost2 << path << "/" << "neutrino" << "/" < 164 std::ifstream filein2( ost2.str().c_str() 165 166 filein2>>nSize; 167 168 for( k = 0; k < fNbin; ++k ) 169 { 170 for( i = 0; i < fNbin; ++i ) 171 { 172 filein2 >> fNuMuXdistrKR[k][i]; 173 // G4cout<< fNuMuXdistrKR[k][i] << " 174 } 175 } 176 // G4cout<<G4endl<<G4endl; 177 178 ost3 << path << "/" << "neutrino" << "/" < 179 std::ifstream filein3( ost3.str().c_str() 180 181 filein3>>nSize; 182 183 for( k = 0; k < fNbin; ++k ) 184 { 185 for( i = 0; i <= fNbin; ++i ) 186 { 187 for( j = 0; j <= fNbin; ++j ) 188 { 189 filein3 >> fNuMuQarrayKR[k][i][j]; 190 // G4cout<< fNuMuQarrayKR[k][i][j] < 191 } 192 } 193 } 194 // G4cout<<G4endl<<G4endl; 195 196 ost4 << path << "/" << "neutrino" << "/" < 197 std::ifstream filein4( ost4.str().c_str() 198 199 filein4>>nSize; 200 201 for( k = 0; k < fNbin; ++k ) 202 { 203 for( i = 0; i <= fNbin; ++i ) 204 { 205 for( j = 0; j < fNbin; ++j ) 206 { 207 filein4 >> fNuMuQdistrKR[k][i][j]; 208 // G4cout<< fNuMuQdistrKR[k][i][j] < 209 } 210 } 211 } 212 fData = true; 213 } 214 } 215 216 ////////////////////////////////////////////// 217 218 G4bool G4ANuElNucleusCcModel::IsApplicable(con 219 G4Nucleus & ) 220 { 221 G4bool result = false; 222 G4String pName = aPart.GetDefinition()->GetP 223 G4double energy = aPart.GetTotalEnergy(); 224 fMinNuEnergy = GetMinNuElEnergy(); 225 226 if( pName == "anti_nu_e" 227 && 228 energy > fMinNuEnergy 229 { 230 result = true; 231 } 232 233 return result; 234 } 235 236 /////////////////////////////////////////// Cl 237 // 238 // 239 240 G4HadFinalState* G4ANuElNucleusCcModel::ApplyY 241 const G4HadProjectile& aTrack, G4Nucleus& 242 { 243 theParticleChange.Clear(); 244 fProton = f2p2h = fBreak = false; 245 fCascade = fString = false; 246 fLVh = fLVl = fLVt = fLVcpi = G4LorentzVecto 247 248 const G4HadProjectile* aParticle = &aTrack; 249 G4double energy = aParticle->GetTotalEnergy( 250 251 G4String pName = aParticle->GetDefinition() 252 253 if( energy < fMinNuEnergy ) 254 { 255 theParticleChange.SetEnergyChange(energy); 256 theParticleChange.SetMomentumChange(aTrack 257 return &theParticleChange; 258 } 259 260 SampleLVkr( aTrack, targetNucleus); 261 262 if( fBreak == true || fEmu < fMel ) // ~5*10 263 { 264 // G4cout<<"ni, "; 265 theParticleChange.SetEnergyChange(energy); 266 theParticleChange.SetMomentumChange(aTrack 267 return &theParticleChange; 268 } 269 270 // LVs of initial state 271 272 G4LorentzVector lvp1 = aParticle->Get4Moment 273 G4LorentzVector lvt1( 0., 0., 0., fM1 ); 274 G4double mPip = G4ParticleTable::GetParticle 275 276 // 1-pi by fQtransfer && nu-energy 277 G4LorentzVector lvpip1( 0., 0., 0., mPip ); 278 G4LorentzVector lvsum, lv2, lvX; 279 G4ThreeVector eP; 280 G4double cost(1.), sint(0.), phi(0.), muMom( 281 G4DynamicParticle* aLept = nullptr; // lepto 282 283 G4int Z = targetNucleus.GetZ_asInt(); 284 G4int A = targetNucleus.GetA_asInt(); 285 G4double mTarg = targetNucleus.AtomicMass(A 286 G4int pdgP(0), qB(0); 287 // G4double mSum = G4ParticleTable::GetParti 288 289 G4int iPi = GetOnePionIndex(energy); 290 G4double p1pi = GetNuMuOnePionProb( iPi, ene 291 292 if( p1pi > G4UniformRand() && fCosTheta > 0 293 { 294 // lvsum = lvp1 + lvpip1; 295 lvsum = lvp1 + lvt1; 296 // cost = fCosThetaPi; 297 cost = fCosTheta; 298 sint = std::sqrt( (1.0 - cost)*(1.0 + cost 299 phi = G4UniformRand()*CLHEP::twopi; 300 eP = G4ThreeVector( sint*std::cos(phi), 301 302 // muMom = sqrt(fEmuPi*fEmuPi-fMel*fMel); 303 muMom = sqrt(fEmu*fEmu-fMel*fMel); 304 305 eP *= muMom; 306 307 // lv2 = G4LorentzVector( eP, fEmuPi ); 308 // lv2 = G4LorentzVector( eP, fEmu ); 309 lv2 = fLVl; 310 311 // lvX = lvsum - lv2; 312 lvX = fLVh; 313 massX2 = lvX.m2(); 314 massX = lvX.m(); 315 massR = fLVt.m(); 316 317 if ( massX2 <= 0. ) // vmg: very rarely ~ 318 { 319 fCascade = true; 320 theParticleChange.SetEnergyChange(energy 321 theParticleChange.SetMomentumChange(aTra 322 return &theParticleChange; 323 } 324 fW2 = massX2; 325 326 if( pName == "anti_nu_e" ) aLept 327 else 328 { 329 theParticleChange.SetEnergyChange(energy 330 theParticleChange.SetMomentumChange(aTra 331 return &theParticleChange; 332 } 333 if( pName == "anti_nu_e" ) pdgP = 211; 334 // else pdgP = -211; 335 // eCut = fMpi + 0.5*(fMpi*fMpi-massX2)/mT 336 337 if( A > 1 ) 338 { 339 eCut = (fMpi + mTarg)*(fMpi + mTarg) - ( 340 eCut /= 2.*massR; 341 eCut += massX; 342 } 343 else eCut = fM1 + fMpi; 344 345 if ( lvX.e() > eCut ) // && sqrt( GetW2() 346 { 347 CoherentPion( lvX, pdgP, targetNucleus); 348 } 349 else 350 { 351 fCascade = true; 352 theParticleChange.SetEnergyChange(energy 353 theParticleChange.SetMomentumChange(aTra 354 return &theParticleChange; 355 } 356 theParticleChange.AddSecondary( aLept, fSe 357 358 return &theParticleChange; 359 } 360 else // lepton part in lab 361 { 362 lvsum = lvp1 + lvt1; 363 cost = fCosTheta; 364 sint = std::sqrt( (1.0 - cost)*(1.0 + cost 365 phi = G4UniformRand()*CLHEP::twopi; 366 eP = G4ThreeVector( sint*std::cos(phi), 367 368 muMom = sqrt(fEmu*fEmu-fMel*fMel); 369 370 eP *= muMom; 371 372 lv2 = G4LorentzVector( eP, fEmu ); 373 lv2 = fLVl; 374 lvX = lvsum - lv2; 375 lvX = fLVh; 376 massX2 = lvX.m2(); 377 378 if ( massX2 <= 0. ) // vmg: very rarely ~ 379 { 380 fCascade = true; 381 theParticleChange.SetEnergyChange(energy 382 theParticleChange.SetMomentumChange(aTra 383 return &theParticleChange; 384 } 385 fW2 = massX2; 386 387 if( pName == "anti_nu_e" ) aLept 388 else 389 { 390 theParticleChange.SetEnergyChange(energy 391 theParticleChange.SetMomentumChange(aTra 392 return &theParticleChange; 393 } 394 theParticleChange.AddSecondary( aLept, fSe 395 } 396 397 // hadron part 398 399 fRecoil = nullptr; 400 401 if( A == 1 ) 402 { 403 if( pName == "anti_nu_e" ) qB = 2; 404 // else qB = 0; 405 406 // if( G4UniformRand() > 0.1 ) // > 0.999 407 { 408 ClusterDecay( lvX, qB ); 409 } 410 return &theParticleChange; 411 } 412 /* 413 // else 414 { 415 if( pName == "nu_mu" ) pdgP = 211; 416 else pdgP = -211; 417 418 419 if ( fQtransfer < 0.95*GeV ) // < 0.35*G 420 { 421 if( lvX.m() > mSum ) CoherentPion( lvX, pdgP 422 } 423 } 424 return &theParticleChange; 425 } 426 */ 427 G4Nucleus recoil; 428 G4double ratio = G4double(Z)/G4double(A); 429 430 if( ratio > G4UniformRand() ) // proton is e 431 { 432 fProton = true; 433 recoil = G4Nucleus(A-1,Z-1); 434 fRecoil = &recoil; 435 if( pName == "anti_nu_e" ) // (++) state - 436 { 437 fMt = G4ParticleTable::GetParticleTable( 438 + G4ParticleTable::GetParticleTable( 439 } 440 else // (0) state -> p + pi-, n + pi0 441 { 442 // fMt = G4ParticleTable::GetParticleTab 443 // + G4ParticleTable::GetParticleTab 444 } 445 } 446 else // excited neutron 447 { 448 fProton = false; 449 recoil = G4Nucleus(A-1,Z); 450 fRecoil = &recoil; 451 if( pName == "anti_nu_e" ) // (+) state -> 452 { 453 fMt = G4ParticleTable::GetParticleTable( 454 + G4ParticleTable::GetParticleTable( 455 } 456 else // (-) state -> n + pi-, // n + pi0 457 { 458 // fMt = G4ParticleTable::GetParticleTab 459 // + G4ParticleTable::GetParticleTab 460 } 461 } 462 // G4int index = GetEnergyIndex(energy 463 G4int nepdg = aParticle->GetDefinition()->Ge 464 465 G4double qeTotRat; // = GetNuMuQeTotRat(ind 466 qeTotRat = CalculateQEratioA( Z, A, energy, 467 468 G4ThreeVector dX = (lvX.vect()).unit(); 469 G4double eX = lvX.e(); // excited nucleon 470 G4double mX = sqrt(massX2); 471 // G4double pX = sqrt( eX*eX - mX*mX ); 472 // G4double sumE = eX + rM; 473 474 if( qeTotRat > G4UniformRand() || mX <= fMt 475 { 476 fString = false; 477 478 G4double rM; 479 if( fProton ) 480 { 481 fPDGencoding = 2212; 482 fMr = proton_mass_c2; 483 recoil = G4Nucleus(A-1,Z-1); 484 fRecoil = &recoil; 485 rM = recoil.AtomicMass(A-1,Z-1); 486 } 487 else 488 { 489 fPDGencoding = 2112; 490 fMr = G4ParticleTable::GetParticleTabl 491 FindParticle(fPDGencoding)->GetPDGMass(); // 492 recoil = G4Nucleus(A-1,Z); 493 fRecoil = &recoil; 494 rM = recoil.AtomicMass(A-1,Z); 495 } 496 // sumE = eX + rM; 497 G4double eTh = fMr + 0.5*(fMr*fMr - mX*mX) 498 499 if( eX <= eTh ) // vmg, very rarely out of 500 { 501 fString = true; 502 theParticleChange.SetEnergyChange(energy 503 theParticleChange.SetMomentumChange(aTra 504 return &theParticleChange; 505 } 506 // FinalBarion( fLVh, 0, fPDGencoding ); / 507 FinalBarion( lvX, 0, fPDGencoding ); // p( 508 } 509 else // if ( eX < 9500000.*GeV ) // < 25.*G 510 { 511 if ( fProton && pName == "anti_nu_e" 512 else if( !fProton && pName == "anti_nu_e" 513 514 ClusterDecay( lvX, qB ); 515 } 516 return &theParticleChange; 517 } 518 519 520 ////////////////////////////////////////////// 521 ////////////////////////////////////////////// 522 ////////////////////////////////////////////// 523 524 ////////////////////////////////////////////// 525 // 526 // sample x, then Q2 527 528 void G4ANuElNucleusCcModel::SampleLVkr(const G 529 { 530 fBreak = false; 531 G4int A = targetNucleus.GetA_asInt(), iTer(0 532 G4int Z = targetNucleus.GetZ_asInt(); 533 G4double e3(0.), pMu2(0.), pX2(0.), nMom(0.) 534 G4double Ex(0.), ei(0.), nm2(0.); 535 G4double cost(1.), sint(0.), phi(0.), muMom( 536 G4ThreeVector eP, bst; 537 const G4HadProjectile* aParticle = &aTrack; 538 G4LorentzVector lvp1 = aParticle->Get4Moment 539 540 if( A == 1 ) // hydrogen, no Fermi motion ?? 541 { 542 fNuEnergy = aParticle->GetTotalEnergy(); 543 iTer = 0; 544 545 do 546 { 547 fXsample = SampleXkr(fNuEnergy); 548 fQtransfer = SampleQkr(fNuEnergy, fXsamp 549 fQ2 = fQtransfer*fQtransfer; 550 551 if( fXsample > 0. ) 552 { 553 fW2 = fM1*fM1 - fQ2 + fQ2/fXsample; // 554 fEmu = fNuEnergy - fQ2/2./fM1/fXsample 555 } 556 else 557 { 558 fW2 = fM1*fM1; 559 fEmu = fNuEnergy; 560 } 561 e3 = fNuEnergy + fM1 - fEmu; 562 563 if( e3 < sqrt(fW2) ) G4cout<<"energyX = 564 565 pMu2 = fEmu*fEmu - fMel*fMel; 566 567 if(pMu2 < 0.) { fBreak = true; return; } 568 569 pX2 = e3*e3 - fW2; 570 571 fCosTheta = fNuEnergy*fNuEnergy + pMu2 572 fCosTheta /= 2.*fNuEnergy*sqrt(pMu2); 573 iTer++; 574 } 575 while( ( abs(fCosTheta) > 1. || fEmu < fMe 576 577 if( iTer >= iTerMax ) { fBreak = true; ret 578 579 if( abs(fCosTheta) > 1.) // vmg: due to bi 580 { 581 G4cout<<"H2: fCosTheta = "<<fCosTheta<<" 582 // fCosTheta = -1. + 2.*G4UniformRand(); 583 if(fCosTheta < -1.) fCosTheta = -1.; 584 if(fCosTheta > 1.) fCosTheta = 1.; 585 } 586 // LVs 587 588 G4LorentzVector lvt1 = G4LorentzVector( 0 589 G4LorentzVector lvsum = lvp1 + lvt1; 590 591 cost = fCosTheta; 592 sint = std::sqrt( (1.0 - cost)*(1.0 + cost 593 phi = G4UniformRand()*CLHEP::twopi; 594 eP = G4ThreeVector( sint*std::cos(phi), 595 muMom = sqrt(fEmu*fEmu-fMel*fMel); 596 eP *= muMom; 597 fLVl = G4LorentzVector( eP, fEmu ); 598 599 fLVh = lvsum - fLVl; 600 fLVt = G4LorentzVector( 0., 0., 0., 0. ); 601 } 602 else // Fermi motion, Q2 in nucleon rest fra 603 { 604 G4Nucleus recoil1( A-1, Z ); 605 rM = recoil1.AtomicMass(A-1,Z); 606 do 607 { 608 // nMom = NucleonMomentumBR( targetNucle 609 nMom = GgSampleNM( targetNucleus ); // G 610 Ex = GetEx(A-1, fProton); 611 ei = tM - sqrt( (rM + Ex)*(rM + Ex) + nM 612 // ei = 0.5*( tM - s2M - 2*eX ); 613 614 nm2 = ei*ei - nMom*nMom; 615 iTer++; 616 } 617 while( nm2 < 0. && iTer < iTerMax ); 618 619 if( iTer >= iTerMax ) { fBreak = true; ret 620 621 G4ThreeVector nMomDir = nMom*G4RandomDirec 622 623 if( !f2p2h || A < 3 ) // 1p1h 624 { 625 // hM = tM - rM; 626 627 fLVt = G4LorentzVector( -nMomDir, sqrt( 628 fLVh = G4LorentzVector( nMomDir, ei ); 629 } 630 else // 2p2h 631 { 632 G4Nucleus recoil(A-2,Z-1); 633 rM = recoil.AtomicMass(A-2,Z-1)+sqrt(nMo 634 hM = tM - rM; 635 636 fLVt = G4LorentzVector( nMomDir, sqrt( r 637 fLVh = G4LorentzVector(-nMomDir, sqrt( h 638 } 639 // G4cout<<hM<<", "; 640 // bst = fLVh.boostVector(); 641 642 // lvp1.boost(-bst); // -> nucleon rest sy 643 644 fNuEnergy = lvp1.e(); 645 // G4double mN = fLVh.m(); // better mN = 646 iTer = 0; 647 648 do // no FM!?, 5.4.20 vmg 649 { 650 fXsample = SampleXkr(fNuEnergy); 651 fQtransfer = SampleQkr(fNuEnergy, fXsamp 652 fQ2 = fQtransfer*fQtransfer; 653 654 // G4double mR = mN + fM1*(A-1.)*std::ex 655 656 if( fXsample > 0. ) 657 { 658 fW2 = fM1*fM1 - fQ2 + fQ2/fXsample; // 659 660 // fW2 = mN*mN - fQ2 + fQ2/fXsample; / 661 // fEmu = fNuEnergy - fQ2/2./mR/fXsamp 662 663 fEmu = fNuEnergy - fQ2/2./fM1/fXsample 664 } 665 else 666 { 667 // fW2 = mN*mN; 668 669 fW2 = fM1*fM1; 670 fEmu = fNuEnergy; 671 } 672 // if(fEmu < 0.) G4cout<<"fEmu = "<<fEmu 673 // e3 = fNuEnergy + mR - fEmu; 674 675 e3 = fNuEnergy + fM1 - fEmu; 676 677 // if( e3 < sqrt(fW2) ) G4cout<<"energy 678 679 pMu2 = fEmu*fEmu - fMel*fMel; 680 pX2 = e3*e3 - fW2; 681 682 if(pMu2 < 0.) { fBreak = true; return; } 683 684 fCosTheta = fNuEnergy*fNuEnergy + pMu2 685 fCosTheta /= 2.*fNuEnergy*sqrt(pMu2); 686 iTer++; 687 } 688 while( ( abs(fCosTheta) > 1. || fEmu < fMe 689 690 if( iTer >= iTerMax ) { fBreak = true; ret 691 692 if( abs(fCosTheta) > 1.) // vmg: due to bi 693 { 694 G4cout<<"FM: fCosTheta = "<<fCosTheta<<" 695 // fCosTheta = -1. + 2.*G4UniformRand(); 696 if( fCosTheta < -1.) fCosTheta = -1.; 697 if( fCosTheta > 1.) fCosTheta = 1.; 698 } 699 // LVs 700 // G4LorentzVector lvt1 = G4LorentzVector 701 702 G4LorentzVector lvt1 = G4LorentzVector( 0 703 G4LorentzVector lvsum = lvp1 + lvt1; 704 705 cost = fCosTheta; 706 sint = std::sqrt( (1.0 - cost)*(1.0 + cost 707 phi = G4UniformRand()*CLHEP::twopi; 708 eP = G4ThreeVector( sint*std::cos(phi), 709 muMom = sqrt(fEmu*fEmu-fMel*fMel); 710 eP *= muMom; 711 fLVl = G4LorentzVector( eP, fEmu ); 712 fLVh = lvsum - fLVl; 713 714 // if( fLVh.e() < mN || fLVh.m2() < 0.) { 715 716 if( fLVh.e() < fM1 || fLVh.m2() < 0.) { fB 717 718 // back to lab system 719 720 // fLVl.boost(bst); 721 // fLVh.boost(bst); 722 } 723 //G4cout<<iTer<<", "<<fBreak<<"; "; 724 } 725 726 // 727 // 728 /////////////////////////// 729