// // ******************************************************************** // * 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. * // ******************************************************************** // // // $Id: G4KL3DecayChannel.cc,v 1.8 2006/06/29 19:25:32 gunter Exp $ // GEANT4 tag $Name: HEAD $ // // // ------------------------------------------------------------ // GEANT 4 class header file // // History: first implementation, based on object model of // 30 May 1997 H.Kurashige // ------------------------------------------------------------ #include "G4ParticleDefinition.hh" #include "G4DecayProducts.hh" #include "G4VDecayChannel.hh" #include "G4KL3DecayChannel.hh" #include "Randomize.hh" #include "G4LorentzVector.hh" #include "G4LorentzRotation.hh" G4KL3DecayChannel::G4KL3DecayChannel( const G4String& theParentName, G4double theBR, const G4String& thePionName, const G4String& theLeptonName, const G4String& theNutrinoName) :G4VDecayChannel("KL3 Decay",theParentName, theBR, 3, thePionName,theLeptonName,theNutrinoName) { //#ifdef G4VERBOSE //if (GetVerboseLevel()>1) { // G4cout << "G4KL3DecayChannel:: constructor "; // G4cout << "addr[" << this << "]" << G4endl; //} //#endif // check modes if ( ((theParentName == "kaon+")&&(theLeptonName == "e+")) || ((theParentName == "kaon-")&&(theLeptonName == "e-")) ) { // K+- (Ke3) pLambda = 0.0286; pXi0 = -0.35; } else if ( ((theParentName == "kaon+")&&(theLeptonName == "mu+")) || ((theParentName == "kaon-")&&(theLeptonName == "mu-")) ) { // K+- (Kmu3) pLambda = 0.033; pXi0 = -0.35; } else if ( (theParentName == "kaon0L") && ((theLeptonName == "e+") ||(theLeptonName == "e-")) ){ // K0L (Ke3) pLambda = 0.0300; pXi0 = -0.11; } else if ( (theParentName == "kaon0L") && ((theLeptonName == "mu+") ||(theLeptonName == "mu-")) ){ // K0L (Kmu3) pLambda = 0.034; pXi0 = -0.11; } else { //#ifdef G4VERBOSE //if (GetVerboseLevel()>0) { // G4cout << "G4KL3DecayChannel:: constructor :"; // G4cout << "illegal arguments " << G4endl;; // DumpInfo(); // } //#endif // set values for K0L (Ke3) temporarily pLambda = 0.0300; pXi0 = -0.11; } } G4KL3DecayChannel::~G4KL3DecayChannel() { } G4DecayProducts* G4KL3DecayChannel::DecayIt(G4double) { // this version neglects muon polarization // assumes the pure V-A coupling // gives incorrect energy spectrum for Nutrinos #ifdef G4VERBOSE if (GetVerboseLevel()>1) G4cout << "G4KL3DecayChannel::DecayIt " << G4endl; #endif // fill parent particle and its mass if (parent == 0) { FillParent(); } massK = parent->GetPDGMass(); // fill daughter particles and their mass if (daughters == 0) { FillDaughters(); } daughterM[idPi] = daughters[idPi]->GetPDGMass(); daughterM[idLepton] = daughters[idLepton]->GetPDGMass(); daughterM[idNutrino] = daughters[idNutrino]->GetPDGMass(); // determine momentum/energy of daughters // according to DalitzDensity G4double daughterP[3], daughterE[3]; G4double w; G4double r; do { r = G4UniformRand(); PhaseSpace(massK, &daughterM[0], &daughterE[0], &daughterP[0]); w = DalitzDensity(daughterE[idPi],daughterE[idLepton],daughterE[idNutrino]); } while ( r > w); // output message #ifdef G4VERBOSE if (GetVerboseLevel()>1) { G4cout << *daughters_name[0] << ":" << daughterP[0]/GeV << "[GeV/c]" <PushProducts(daughterparticle); // neutrino costhetan = (daughterP[1]*daughterP[1]-daughterP[2]*daughterP[2]-daughterP[0]*daughterP[0])/(2.0*daughterP[2]*daughterP[0]); sinthetan = std::sqrt((1.0-costhetan)*(1.0+costhetan)); phin = twopi*G4UniformRand()*rad; sinphin = std::sin(phin); cosphin = std::cos(phin); direction->setX( sinthetan*cosphin*costheta*cosphi - sinthetan*sinphin*sinphi + costhetan*sintheta*cosphi); direction->setY( sinthetan*cosphin*costheta*sinphi + sinthetan*sinphin*cosphi + costhetan*sintheta*sinphi); direction->setZ( -sinthetan*cosphin*sintheta + costhetan*costheta); G4ThreeVector momentum2 = (*direction)*daughterP[2]; daughterparticle = new G4DynamicParticle( daughters[2], momentum2); products->PushProducts(daughterparticle); //lepton G4ThreeVector momentum1 = (momentum0 + momentum2) * (-1.0); daughterparticle = new G4DynamicParticle( daughters[1], momentum1); products->PushProducts(daughterparticle); #ifdef G4VERBOSE if (GetVerboseLevel()>1) { G4cout << "G4KL3DecayChannel::DecayIt "; G4cout << " create decay products in rest frame " <0.0) Fmax = (1.0 + pLambda*(massK*massK/massPi/massPi+1.0)); G4double Xi = pXi0*(1.0 + pLambda*q2/massPi/massPi); G4double coeffA = massK*(2.0*El*Enu-massK*E)+massL*massL*(E/4.0-Enu); G4double coeffB = massL*massL*(Enu-E/2.0); G4double coeffC = massL*massL*E/4.0; G4double RhoMax = (Fmax*Fmax)*(massK*massK*massK/8.0); G4double Rho = (F*F)*(coeffA + coeffB*Xi + coeffC*Xi*Xi); #ifdef G4VERBOSE if (GetVerboseLevel()>2) { G4cout << "G4KL3DecayChannel::DalitzDensity " <