Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // 27 // 28 // ------------------------------------------- 28 // ----------------------------------------------------------------------------- 29 // GEANT 4 class implementation file 29 // GEANT 4 class implementation file 30 // 30 // 31 // History: first implementation, Maxim K 31 // History: first implementation, Maxim Komogorov, 1-Jul-1998 32 // redesign Gunter Folger, Augu 32 // redesign Gunter Folger, August/September 2001 33 // ------------------------------------------- 33 // ----------------------------------------------------------------------------- 34 #include "G4VLongitudinalStringDecay.hh" 34 #include "G4VLongitudinalStringDecay.hh" 35 #include "G4PhysicalConstants.hh" 35 #include "G4PhysicalConstants.hh" 36 #include "G4SystemOfUnits.hh" 36 #include "G4SystemOfUnits.hh" 37 #include "G4ios.hh" 37 #include "G4ios.hh" 38 #include "Randomize.hh" 38 #include "Randomize.hh" 39 #include "G4FragmentingString.hh" 39 #include "G4FragmentingString.hh" 40 40 41 #include "G4ParticleDefinition.hh" 41 #include "G4ParticleDefinition.hh" 42 #include "G4ParticleTypes.hh" 42 #include "G4ParticleTypes.hh" 43 #include "G4ParticleChange.hh" 43 #include "G4ParticleChange.hh" 44 #include "G4VShortLivedParticle.hh" 44 #include "G4VShortLivedParticle.hh" 45 #include "G4ShortLivedConstructor.hh" 45 #include "G4ShortLivedConstructor.hh" 46 #include "G4ParticleTable.hh" 46 #include "G4ParticleTable.hh" 47 #include "G4PhaseSpaceDecayChannel.hh" 47 #include "G4PhaseSpaceDecayChannel.hh" 48 #include "G4VDecayChannel.hh" 48 #include "G4VDecayChannel.hh" 49 #include "G4DecayTable.hh" 49 #include "G4DecayTable.hh" 50 50 51 #include "G4DiQuarks.hh" 51 #include "G4DiQuarks.hh" 52 #include "G4Quarks.hh" 52 #include "G4Quarks.hh" 53 #include "G4Gluons.hh" 53 #include "G4Gluons.hh" 54 54 55 #include "G4Exp.hh" 55 #include "G4Exp.hh" 56 #include "G4Log.hh" 56 #include "G4Log.hh" 57 57 58 #include "G4HadronicException.hh" << 59 << 60 //------------------------debug switches 58 //------------------------debug switches 61 //#define debug_VStringDecay 59 //#define debug_VStringDecay 62 //#define debug_heavyHadrons << 63 60 64 //******************************************** << 61 //******************************************************************************** 65 // Constructors 62 // Constructors 66 63 67 G4VLongitudinalStringDecay::G4VLongitudinalStr << 64 G4VLongitudinalStringDecay::G4VLongitudinalStringDecay() : ProbCCbar(0.0), ProbBBbar(0.0) 68 : G4HadronicInteraction(name), ProbCCbar(0.0 << 69 { 65 { 70 MassCut = 210.0*MeV; // Mpi + Delta 66 MassCut = 210.0*MeV; // Mpi + Delta 71 67 72 StringLoopInterrupt = 1000; 68 StringLoopInterrupt = 1000; 73 ClusterLoopInterrupt = 500; 69 ClusterLoopInterrupt = 500; 74 70 75 // Changable Parameters below. 71 // Changable Parameters below. 76 SigmaQT = 0.5 * GeV; 72 SigmaQT = 0.5 * GeV; 77 73 78 StrangeSuppress = 0.44; // =0.27/2.27 s << 74 StrangeSuppress = 0.44; // =0.27/2.27 suppresion of strange quark pait prodution, ie. u:d:s=1:1:0.27 79 DiquarkSuppress = 0.07; // Probability 75 DiquarkSuppress = 0.07; // Probability of qq-qqbar pair production 80 DiquarkBreakProb = 0.1; // Probability 76 DiquarkBreakProb = 0.1; // Probability of (qq)->h+(qq)' 81 77 82 //... pspin_meson is probability to create 78 //... pspin_meson is probability to create pseudo-scalar meson 83 pspin_meson.resize(3); << 79 pspin_meson = 0.5; 84 pspin_meson[0] = 0.5; // u or d + anti-u o << 80 85 pspin_meson[1] = 0.4; // one of the quark << 86 pspin_meson[2] = 0.3; // both of the quark << 87 << 88 //... pspin_barion is probability to create 81 //... pspin_barion is probability to create 1/2 barion 89 pspin_barion = 0.5; 82 pspin_barion = 0.5; 90 83 91 //... vectorMesonMix[] is quark mixing para 84 //... vectorMesonMix[] is quark mixing parameters for vector mesons (Variable spin = 3) 92 vectorMesonMix.resize(6); 85 vectorMesonMix.resize(6); 93 vectorMesonMix[0] = 0.0; 86 vectorMesonMix[0] = 0.0; 94 vectorMesonMix[1] = 0.5; << 87 vectorMesonMix[1] = 0.375; 95 vectorMesonMix[2] = 0.0; 88 vectorMesonMix[2] = 0.0; 96 vectorMesonMix[3] = 0.5; << 89 vectorMesonMix[3] = 0.375; 97 vectorMesonMix[4] = 1.0; 90 vectorMesonMix[4] = 1.0; 98 vectorMesonMix[5] = 1.0; 91 vectorMesonMix[5] = 1.0; 99 92 100 //... scalarMesonMix[] is quark mixing para 93 //... scalarMesonMix[] is quark mixing parameters for scalar mesons (Variable spin=1) 101 scalarMesonMix.resize(6); 94 scalarMesonMix.resize(6); 102 scalarMesonMix[0] = 0.5; 95 scalarMesonMix[0] = 0.5; 103 scalarMesonMix[1] = 0.25; 96 scalarMesonMix[1] = 0.25; 104 scalarMesonMix[2] = 0.5; 97 scalarMesonMix[2] = 0.5; 105 scalarMesonMix[3] = 0.25; 98 scalarMesonMix[3] = 0.25; 106 scalarMesonMix[4] = 1.0; 99 scalarMesonMix[4] = 1.0; 107 scalarMesonMix[5] = 0.5; 100 scalarMesonMix[5] = 0.5; 108 101 109 SetProbCCbar(0.0); // Probability of CCbar << 102 // For the time being, set to 0.0 the probabilities for c-cbar and b-bbar creation. >> 103 SetProbCCbar(0.0); //SetProbCCbar(0.43e-11); // Probability of CCbar pair creation >> 104 //Pythia8 and Pythia 6.4 Comp. Phys. Commun. 191 (2015) 159; arXiv:1410.3012 110 SetProbEta_c(0.1); // Mixing of Eta_c and 105 SetProbEta_c(0.1); // Mixing of Eta_c and J/Psi 111 SetProbBBbar(0.0); // Probability of BBbar << 106 SetProbBBbar(0.0); // Probability of BBbar pair creation, 112 SetProbEta_b(0.0); // Mixing of Eta_b and << 107 SetProbEta_b(0.0); // Mixing of Eta_b and Ipsilon_b 113 108 114 // Parameters may be changed until the firs 109 // Parameters may be changed until the first fragmentation starts 115 PastInitPhase=false; 110 PastInitPhase=false; 116 hadronizer = new G4HadronBuilder( pspin_mes << 111 hadronizer = new G4HadronBuilder(pspin_meson,pspin_barion, 117 ProbEta_c << 112 scalarMesonMix,vectorMesonMix, >> 113 ProbEta_c, ProbEta_b); 118 114 119 MaxMass=-350.0*GeV; // If there will be a 115 MaxMass=-350.0*GeV; // If there will be a particle with mass larger than Higgs the value must be changed. 120 116 121 SetMinMasses(); // Re-calculation of minim 117 SetMinMasses(); // Re-calculation of minimal mass of strings and weights of particles in 2-part. decays 122 118 123 Kappa = 1.0 * GeV/fermi; 119 Kappa = 1.0 * GeV/fermi; 124 DecayQuark = NewQuark = 0; << 125 } 120 } 126 121 >> 122 127 G4VLongitudinalStringDecay::~G4VLongitudinalSt 123 G4VLongitudinalStringDecay::~G4VLongitudinalStringDecay() 128 { 124 { 129 delete hadronizer; 125 delete hadronizer; 130 } 126 } 131 127 132 G4HadFinalState* << 128 //============================================================================= 133 G4VLongitudinalStringDecay::ApplyYourself(cons << 129 >> 130 // Operators >> 131 >> 132 //----------------------------------------------------------------------------- >> 133 >> 134 G4bool G4VLongitudinalStringDecay::operator==(const G4VLongitudinalStringDecay &) const 134 { 135 { 135 return nullptr; << 136 throw G4HadronicException(__FILE__, __LINE__, "G4VLongitudinalStringDecay::operator== forbidden"); >> 137 return false; 136 } 138 } 137 139 138 //============================================ << 140 //------------------------------------------------------------------------------------- >> 141 >> 142 G4bool G4VLongitudinalStringDecay::operator!=(const G4VLongitudinalStringDecay &) const >> 143 { >> 144 throw G4HadronicException(__FILE__, __LINE__, "G4VLongitudinalStringDecay::operator!= forbidden"); >> 145 return true; >> 146 } >> 147 >> 148 //*********************************************************************************** 139 149 140 // For changing Mass Cut used for selection of 150 // For changing Mass Cut used for selection of very small mass strings 141 void G4VLongitudinalStringDecay::SetMassCut(G4 << 151 void G4VLongitudinalStringDecay::SetMassCut(G4double aValue){ MassCut=aValue; } 142 G4double G4VLongitudinalStringDecay::GetMassCu 152 G4double G4VLongitudinalStringDecay::GetMassCut() { return MassCut; } 143 153 144 //-------------------------------------------- 154 //----------------------------------------------------------------------------- 145 155 146 // For handling a string with very low mass 156 // For handling a string with very low mass 147 157 148 G4KineticTrackVector* G4VLongitudinalStringDec 158 G4KineticTrackVector* G4VLongitudinalStringDecay::ProduceOneHadron(const G4ExcitedString * const string) 149 { 159 { 150 G4KineticTrackVector* result = nullptr << 160 // Check string decay threshold 151 pDefPair hadrons( nullptr, nullptr ); << 161 G4KineticTrackVector * result=0; // return 0 when string exceeds the mass cut 152 G4FragmentingString aString( *string ) << 162 >> 163 pDefPair hadrons((G4ParticleDefinition *)0,(G4ParticleDefinition *)0); >> 164 >> 165 G4FragmentingString aString(*string); 153 166 154 #ifdef debug_VStringDecay 167 #ifdef debug_VStringDecay 155 G4cout<<"G4VLongitudinalStringDecay::P 168 G4cout<<"G4VLongitudinalStringDecay::ProduceOneHadron: PossibleHmass StrMass " 156 <<aString.Mass()<<" MassCut "<<M 169 <<aString.Mass()<<" MassCut "<<MassCut<<G4endl; >> 170 G4cout<<"G4VLongitudinalStringDecay::ProduceOneHadron: PossibleHmass StrMass WWW " >> 171 <<aString.Mass()<<G4endl; 157 #endif 172 #endif >> 173 >> 174 if ( sqr(PossibleHadronMass(&aString,0,&hadrons)+MassCut) < aString.Mass2()) { >> 175 return 0; >> 176 } >> 177 >> 178 // The string mass has low mass--------------------------- >> 179 >> 180 result=new G4KineticTrackVector; 158 181 159 SetMinimalStringMass( &aString ); << 182 if ( hadrons.second ==0 ) 160 PossibleHadronMass( &aString, 0, &hadr << 183 { 161 result = new G4KineticTrackVector; << 162 if ( hadrons.first != nullptr ) { << 163 if ( hadrons.second == nullptr ) { << 164 // Substitute string by light h 184 // Substitute string by light hadron, Note that Energy is not conserved here! 165 185 166 #ifdef debug_VStringDecay 186 #ifdef debug_VStringDecay 167 G4cout << "VlongSD Warning repl << 187 G4cout << "VlongSF Warning replacing string by single hadron (G4VLongitudinalStringDecay)" <<G4endl; 168 G4cout << hadrons.first->GetPar << 188 G4cout << hadrons.first->GetParticleName()<<G4endl 169 << "string .. " << strin << 189 << "string .. " << string->Get4Momentum() << " " 170 << string->Get4Momentum( << 190 << string->Get4Momentum().m() << G4endl; 171 #endif << 191 #endif 172 192 173 G4ThreeVector Mom3 = string-> 193 G4ThreeVector Mom3 = string->Get4Momentum().vect(); 174 G4LorentzVector Mom( Mom3, std: << 194 G4LorentzVector Mom( Mom3, std::sqrt( Mom3.mag2() + sqr(hadrons.first->GetPDGMass())) ); 175 result->push_back( new G4Kineti 195 result->push_back( new G4KineticTrack( hadrons.first, 0, string->GetPosition(), Mom ) ); 176 } else { << 196 } else >> 197 { >> 198 // I do not know if this part work? 177 //... string was qq--qqbar type 199 //... string was qq--qqbar type: Build two stable hadrons, 178 200 179 #ifdef debug_VStringDecay 201 #ifdef debug_VStringDecay 180 G4cout << "VlongSD Warning repl << 202 G4cout << "VlongSF Warning replacing qq-qqbar string by TWO hadrons (G4VLongitudinalStringDecay)" 181 << hadrons.first->GetPar << 203 << hadrons.first->GetParticleName() << " / " 182 << hadrons.second->GetPa << 204 << hadrons.second->GetParticleName() 183 << "string .. " << strin << 205 << "string .. " << string->Get4Momentum() << " " 184 << string->Get4Momentum( << 206 << string->Get4Momentum().m() << G4endl; 185 #endif 207 #endif 186 208 187 G4LorentzVector Mom1, Mom2; << 209 G4LorentzVector Mom1, Mom2; 188 Sample4Momentum( &Mom1, hadrons << 210 Sample4Momentum(&Mom1, hadrons.first->GetPDGMass(), 189 &Mom2, hadrons << 211 &Mom2,hadrons.second->GetPDGMass(), 190 string->Get4Mo << 212 string->Get4Momentum().mag()); 191 213 192 result->push_back( new G4Kineti << 214 result->push_back( new G4KineticTrack( hadrons.first, 0, string->GetPosition(), Mom1 ) ); 193 result->push_back( new G4Kineti << 215 result->push_back( new G4KineticTrack( hadrons.second, 0, string->GetPosition(), Mom2) ); 194 216 195 G4ThreeVector Velocity = string 217 G4ThreeVector Velocity = string->Get4Momentum().boostVector(); 196 result->Boost(Velocity); 218 result->Boost(Velocity); 197 } << 219 } 198 } << 220 199 return result; << 221 return result; 200 } 222 } 201 223 202 //-------------------------------------------- 224 //---------------------------------------------------------------------------------------- 203 225 204 G4double G4VLongitudinalStringDecay::PossibleH 226 G4double G4VLongitudinalStringDecay::PossibleHadronMass( const G4FragmentingString * const string, 205 227 Pcreate build, pDefPair * pdefs ) 206 { 228 { 207 G4double mass = 0.0; << 229 G4double mass; 208 230 209 if ( build==0 ) build=&G4HadronBuilder::Buil 231 if ( build==0 ) build=&G4HadronBuilder::BuildLowSpin; 210 232 211 G4ParticleDefinition* Hadron1 = nullpt << 233 G4ParticleDefinition *Hadron1, *Hadron2=0; 212 G4ParticleDefinition* Hadron2 = nullptr; << 213 234 214 if (!string->IsAFourQuarkString() ) 235 if (!string->IsAFourQuarkString() ) 215 { 236 { 216 // spin 0 meson or spin 1/2 barion 237 // spin 0 meson or spin 1/2 barion will be built 217 238 218 Hadron1 = (hadronizer->*build)(stri 239 Hadron1 = (hadronizer->*build)(string->GetLeftParton(), string->GetRightParton()); 219 #ifdef debug_VStringDecay 240 #ifdef debug_VStringDecay 220 G4cout<<"VlongSD PossibleHadronMass"<<G4e << 241 G4cout<<"VlongSF Quarks at the string ends "<<string->GetLeftParton()->GetParticleName() 221 G4cout<<"VlongSD Quarks at the stri << 222 <<" "<<string->GetRightParton 242 <<" "<<string->GetRightParton()->GetParticleName()<<G4endl; 223 if ( Hadron1 != nullptr) { << 243 if ( Hadron1 != NULL) { 224 G4cout<<"(G4VLongitudinalStringDe 244 G4cout<<"(G4VLongitudinalStringDecay) Hadron "<<Hadron1->GetParticleName() 225 <<" "<<Hadron1->GetPDGMass( 245 <<" "<<Hadron1->GetPDGMass()<<G4endl; 226 } 246 } 227 #endif 247 #endif 228 if ( Hadron1 != nullptr) { mass = ( << 248 if ( Hadron1 != NULL) { mass = (Hadron1)->GetPDGMass();} 229 else { mass = MaxM 249 else { mass = MaxMass;} 230 } else 250 } else 231 { 251 { 232 //... string is qq--qqbar: Build tw 252 //... string is qq--qqbar: Build two stable hadrons, >> 253 //... with extra uubar or ddbar quark pair 233 254 234 #ifdef debug_VStringDecay 255 #ifdef debug_VStringDecay 235 G4cout<<"VlongSD PossibleHadronMass << 256 G4cout<<"VlongSF string is qq--qqbar: Build two stable hadrons"<<G4endl; 236 G4cout<<"VlongSD string is qq--qqba << 237 #endif 257 #endif 238 258 239 G4double StringMass = string->Mas << 259 G4int iflc = (G4UniformRand() < 0.5)? 1 : 2; 240 G4int cClusterInterrupt = 0; << 260 if (string->GetLeftParton()->GetPDGEncoding() < 0) iflc = -iflc; 241 do << 261 242 { << 262 //... theSpin = 4; spin 3/2 baryons will be built 243 if (cClusterInterrupt++ >= Cluste << 263 Hadron1 = (hadronizer->*build)(string->GetLeftParton(), FindParticle(iflc)); 244 << 264 Hadron2 = (hadronizer->*build)(string->GetRightParton(), FindParticle(-iflc)); 245 G4int LeftQuark1= string->GetLeft << 246 G4int LeftQuark2=(string->GetLeft << 247 << 248 G4int RightQuark1= string->GetRig << 249 G4int RightQuark2=(string->GetRig << 250 << 251 if (G4UniformRand()<0.5) { << 252 Hadron1 =hadronizer->Build(Find << 253 Hadron2 =hadronizer->Build(Find << 254 } else { << 255 Hadron1 =hadronizer->Build(Find << 256 Hadron2 =hadronizer->Build(Find << 257 } << 258 //... repeat procedure, if mass o << 259 //... ClusterMassCut = 0.15*GeV m << 260 } << 261 while ( Hadron1 == nullptr || Hadro << 262 ( StringMass <= Hadron1->Ge << 263 265 264 mass = (Hadron1)->GetPDGMass() + (Hadron2 << 266 if ( (Hadron1 != NULL) && (Hadron2 != NULL) ) { mass = (Hadron1)->GetPDGMass() + (Hadron2)->GetPDGMass();} >> 267 else { mass = MaxMass;} 265 } 268 } 266 269 267 #ifdef debug_VStringDecay 270 #ifdef debug_VStringDecay 268 G4cout<<"VlongSD *Hadrons 1 and 2, pro << 271 G4cout<<"VlongSF *Hadrons 1 and 2, proposed mass "<<Hadron1<<" "<<Hadron2<<" "<<mass<<G4endl; 269 #endif 272 #endif 270 273 271 if ( pdefs != 0 ) 274 if ( pdefs != 0 ) 272 { // need to return hadrons as well.... 275 { // need to return hadrons as well.... 273 pdefs->first = Hadron1; 276 pdefs->first = Hadron1; 274 pdefs->second = Hadron2; 277 pdefs->second = Hadron2; 275 } 278 } 276 279 277 return mass; 280 return mass; 278 } 281 } 279 282 280 //-------------------------------------------- 283 //---------------------------------------------------------------------------- 281 284 282 G4ParticleDefinition* G4VLongitudinalStringDec 285 G4ParticleDefinition* G4VLongitudinalStringDecay::FindParticle(G4int Encoding) 283 { 286 { 284 /* 287 /* 285 G4cout<<Encoding<<" G4VLongitudinalStringDec 288 G4cout<<Encoding<<" G4VLongitudinalStringDecay::FindParticle Check di-quarks *******************"<<G4endl; 286 for (G4int i=4; i<6;i++){ 289 for (G4int i=4; i<6;i++){ 287 for (G4int j=1;j<6;j++){ 290 for (G4int j=1;j<6;j++){ 288 G4cout<<i<<" "<<j<<" "; 291 G4cout<<i<<" "<<j<<" "; 289 G4int Code = 1000 * i + 100 * j +1; 292 G4int Code = 1000 * i + 100 * j +1; 290 G4ParticleDefinition* ptr1 = G4ParticleT 293 G4ParticleDefinition* ptr1 = G4ParticleTable::GetParticleTable()->FindParticle(Code); 291 Code +=2; 294 Code +=2; 292 G4ParticleDefinition* ptr2 = G4ParticleT 295 G4ParticleDefinition* ptr2 = G4ParticleTable::GetParticleTable()->FindParticle(Code); 293 G4cout<<"Code "<<Code - 2<<" ptr "<<ptr1 296 G4cout<<"Code "<<Code - 2<<" ptr "<<ptr1<<" :: Code "<<Code<<" ptr "<<ptr2<<G4endl; 294 } 297 } 295 G4cout<<G4endl; 298 G4cout<<G4endl; 296 } 299 } 297 */ 300 */ 298 301 299 G4ParticleDefinition* ptr = G4ParticleTable: 302 G4ParticleDefinition* ptr = G4ParticleTable::GetParticleTable()->FindParticle(Encoding); 300 303 301 if (ptr == nullptr) << 304 if (ptr == NULL) 302 { 305 { 303 for (size_t i=0; i < NewParticles.size(); 306 for (size_t i=0; i < NewParticles.size(); i++) 304 { 307 { 305 if ( Encoding == NewParticles[i]->GetPD 308 if ( Encoding == NewParticles[i]->GetPDGEncoding() ) { ptr = NewParticles[i]; return ptr;} 306 } 309 } 307 } 310 } 308 311 309 return ptr; 312 return ptr; 310 } 313 } 311 314 312 //******************************************** 315 //********************************************************************************* 313 // For decision on continue or stop string f 316 // For decision on continue or stop string fragmentation 314 // virtual G4bool StopFragmenting(const G4Fr 317 // virtual G4bool StopFragmenting(const G4FragmentingString * const string)=0; 315 // virtual G4bool IsItFragmentable(const G4F 318 // virtual G4bool IsItFragmentable(const G4FragmentingString * const string)=0; 316 // 319 // 317 // If a string can not fragment, make last b 320 // If a string can not fragment, make last break into 2 hadrons 318 // virtual G4bool SplitLast(G4FragmentingStr 321 // virtual G4bool SplitLast(G4FragmentingString * string, 319 // G4KineticTrackVe 322 // G4KineticTrackVector * LeftVector, 320 // G4KineticTrackVe 323 // G4KineticTrackVector * RightVector)=0; 321 //-------------------------------------------- 324 //----------------------------------------------------------------------------- 322 // 325 // 323 // If a string can fragment, do the followin 326 // If a string can fragment, do the following 324 // 327 // 325 // For transver of a string to its CMS frame 328 // For transver of a string to its CMS frame 326 //-------------------------------------------- 329 //----------------------------------------------------------------------------- 327 330 328 G4ExcitedString *G4VLongitudinalStringDecay::C 331 G4ExcitedString *G4VLongitudinalStringDecay::CopyExcited(const G4ExcitedString & in) 329 { 332 { 330 G4Parton *Left=new G4Parton(*in.GetLeftParto 333 G4Parton *Left=new G4Parton(*in.GetLeftParton()); 331 G4Parton *Right=new G4Parton(*in.GetRightPar 334 G4Parton *Right=new G4Parton(*in.GetRightParton()); 332 return new G4ExcitedString(Left,Right,in.Get 335 return new G4ExcitedString(Left,Right,in.GetDirection()); 333 } 336 } 334 337 335 //-------------------------------------------- 338 //----------------------------------------------------------------------------- 336 339 337 G4ParticleDefinition * G4VLongitudinalStringDe 340 G4ParticleDefinition * G4VLongitudinalStringDecay::QuarkSplitup( G4ParticleDefinition* decay, 338 341 G4ParticleDefinition *&created ) 339 { 342 { 340 #ifdef debug_VStringDecay 343 #ifdef debug_VStringDecay 341 G4cout<<"VlongSD QuarkSplitup: quark ID "<< << 344 G4cout<<"VlongSF QuarkSplitup: quark ID "<<decay->GetPDGEncoding()<<G4endl; 342 #endif 345 #endif 343 << 346 344 G4int IsParticle=(decay->GetPDGEncoding()>0 347 G4int IsParticle=(decay->GetPDGEncoding()>0) ? -1 : +1; // if we have a quark, we need antiquark (or diquark) 345 348 346 pDefPair QuarkPair = CreatePartonPair(IsPar 349 pDefPair QuarkPair = CreatePartonPair(IsParticle); 347 created = QuarkPair.second; 350 created = QuarkPair.second; 348 351 349 DecayQuark = decay->GetPDGEncoding(); 352 DecayQuark = decay->GetPDGEncoding(); 350 NewQuark = created->GetPDGEncoding(); 353 NewQuark = created->GetPDGEncoding(); 351 354 352 #ifdef debug_VStringDecay 355 #ifdef debug_VStringDecay 353 G4cout<<"VlongSD QuarkSplitup: "<<decay->Ge << 356 G4cout<<"VlongSF QuarkSplitup: "<<decay->GetPDGEncoding()<<" -> "<<QuarkPair.second->GetPDGEncoding()<<G4endl; 354 G4cout<<"hadronizer->Build(QuarkPair.first, 357 G4cout<<"hadronizer->Build(QuarkPair.first, decay)"<<G4endl; 355 #endif 358 #endif 356 << 357 return hadronizer->Build(QuarkPair.first, d 359 return hadronizer->Build(QuarkPair.first, decay); 358 } 360 } 359 361 360 //-------------------------------------------- 362 //----------------------------------------------------------------------------- 361 363 362 G4VLongitudinalStringDecay::pDefPair G4VLongit 364 G4VLongitudinalStringDecay::pDefPair G4VLongitudinalStringDecay:: 363 CreatePartonPair(G4int NeedParticle,G4bool All 365 CreatePartonPair(G4int NeedParticle,G4bool AllowDiquarks) 364 { 366 { 365 // NeedParticle = +1 for Particle, -1 for 367 // NeedParticle = +1 for Particle, -1 for Antiparticle 366 if ( AllowDiquarks && G4UniformRand() < Di 368 if ( AllowDiquarks && G4UniformRand() < DiquarkSuppress ) 367 { 369 { 368 // Create a Diquark - AntiDiquark pair , 370 // Create a Diquark - AntiDiquark pair , first in pair is anti to IsParticle 369 #ifdef debug_VStringDecay 371 #ifdef debug_VStringDecay 370 G4cout<<"VlongSD Create a Diquark - Anti << 372 G4cout<<"VlongSF Create a Diquark - AntiDiquark pair"<<G4endl; 371 #endif 373 #endif 372 G4int q1(0), q2(0), spin(0), PDGcode(0); 374 G4int q1(0), q2(0), spin(0), PDGcode(0); 373 375 374 q1 = SampleQuarkFlavor(); 376 q1 = SampleQuarkFlavor(); 375 q2 = SampleQuarkFlavor(); 377 q2 = SampleQuarkFlavor(); 376 378 377 spin = (q1 != q2 && G4UniformRand() <= 0 379 spin = (q1 != q2 && G4UniformRand() <= 0.5)? 1 : 3; 378 // conv 380 // convention: quark with higher PDG number is first 379 PDGcode = (std::max(q1,q2) * 1000 + std: 381 PDGcode = (std::max(q1,q2) * 1000 + std::min(q1,q2) * 100 + spin) * NeedParticle; 380 382 381 return pDefPair (FindParticle(-PDGcode), 383 return pDefPair (FindParticle(-PDGcode),FindParticle(PDGcode)); 382 384 383 } else { 385 } else { 384 // Create a Quark - AntiQuark pair, firs 386 // Create a Quark - AntiQuark pair, first in pair IsParticle 385 #ifdef debug_VStringDecay 387 #ifdef debug_VStringDecay 386 G4cout<<"VlongSD Create a Quark - AntiQu << 388 G4cout<<"VlongSF Create a Quark - AntiQuark pair"<<G4endl; 387 #endif 389 #endif 388 G4int PDGcode=SampleQuarkFlavor()*NeedPa 390 G4int PDGcode=SampleQuarkFlavor()*NeedParticle; 389 return pDefPair (FindParticle(PDGcode),F 391 return pDefPair (FindParticle(PDGcode),FindParticle(-PDGcode)); 390 } 392 } 391 } 393 } 392 394 393 //-------------------------------------------- 395 //----------------------------------------------------------------------------- 394 396 395 G4int G4VLongitudinalStringDecay::SampleQuarkF 397 G4int G4VLongitudinalStringDecay::SampleQuarkFlavor(void) 396 { 398 { 397 G4int quark(1); 399 G4int quark(1); 398 G4double ksi = G4UniformRand(); 400 G4double ksi = G4UniformRand(); 399 if ( ksi < ProbCB ) { 401 if ( ksi < ProbCB ) { 400 if ( ksi < ProbCCbar ) {quark = 4;} // 402 if ( ksi < ProbCCbar ) {quark = 4;} // c quark 401 else {quark = 5;} // 403 else {quark = 5;} // b quark 402 #ifdef debug_heavyHadrons << 403 G4cout << "G4VLongitudinalStringDecay::S << 404 << quark << G4endl; << 405 #endif << 406 } else { 404 } else { 407 quark = 1 + (int)(G4UniformRand()/Strange 405 quark = 1 + (int)(G4UniformRand()/StrangeSuppress); 408 } 406 } 409 #ifdef debug_VStringDecay 407 #ifdef debug_VStringDecay 410 G4cout<<"VlongSD SampleQuarkFlavor "<<quark << 408 G4cout<<"VlongSF SampleQuarkFlavor "<<quark<<" (ProbCB ProbCCbar ProbBBbar "<<ProbCB 411 <<" "<<ProbCCbar<<" "<<ProbBBbar<<" ) 409 <<" "<<ProbCCbar<<" "<<ProbBBbar<<" )"<<G4endl; 412 #endif 410 #endif 413 return quark; 411 return quark; 414 } 412 } 415 413 416 //-------------------------------------------- 414 //----------------------------------------------------------------------------- 417 415 418 G4ThreeVector G4VLongitudinalStringDecay::Samp 416 G4ThreeVector G4VLongitudinalStringDecay::SampleQuarkPt(G4double ptMax) 419 { 417 { 420 G4double Pt; 418 G4double Pt; 421 if ( ptMax < 0 ) { 419 if ( ptMax < 0 ) { 422 // sample full gaussian 420 // sample full gaussian 423 Pt = -G4Log(G4UniformRand()); 421 Pt = -G4Log(G4UniformRand()); 424 } else { 422 } else { 425 // sample in limited range 423 // sample in limited range 426 G4double q = ptMax/SigmaQT; << 424 Pt = -G4Log(G4RandFlat::shoot(G4Exp(-sqr(ptMax)/sqr(SigmaQT)), 1.)); 427 G4double ymin = (q > 20.) ? 0.0 : G4Exp( << 428 Pt = -G4Log(G4RandFlat::shoot(ymin, 1.)) << 429 } 425 } 430 Pt = SigmaQT * std::sqrt(Pt); 426 Pt = SigmaQT * std::sqrt(Pt); 431 G4double phi = 2.*pi*G4UniformRand(); 427 G4double phi = 2.*pi*G4UniformRand(); 432 return G4ThreeVector(Pt * std::cos(phi),Pt 428 return G4ThreeVector(Pt * std::cos(phi),Pt * std::sin(phi),0); 433 } 429 } 434 430 435 //******************************************** 431 //****************************************************************************** 436 432 437 void G4VLongitudinalStringDecay::CalculateHadr 433 void G4VLongitudinalStringDecay::CalculateHadronTimePosition(G4double theInitialStringMass, 438 434 G4KineticTrackVector* Hadrons) 439 { 435 { 440 // `yo-yo` formation time 436 // `yo-yo` formation time 441 // const G4double kappa = 1.0 * GeV/fermi 437 // const G4double kappa = 1.0 * GeV/fermi/4.; 442 G4double kappa = GetStringTensionParameter( 438 G4double kappa = GetStringTensionParameter(); 443 for (size_t c1 = 0; c1 < Hadrons->size(); c 439 for (size_t c1 = 0; c1 < Hadrons->size(); c1++) 444 { 440 { 445 G4double SumPz = 0; 441 G4double SumPz = 0; 446 G4double SumE = 0; 442 G4double SumE = 0; 447 for (size_t c2 = 0; c2 < c1; c2++) 443 for (size_t c2 = 0; c2 < c1; c2++) 448 { 444 { 449 SumPz += Hadrons->operator[](c2)->Get 445 SumPz += Hadrons->operator[](c2)->Get4Momentum().pz(); 450 SumE += Hadrons->operator[](c2)->Get 446 SumE += Hadrons->operator[](c2)->Get4Momentum().e(); 451 } 447 } 452 G4double HadronE = Hadrons->operator[]( 448 G4double HadronE = Hadrons->operator[](c1)->Get4Momentum().e(); 453 G4double HadronPz = Hadrons->operator[]( 449 G4double HadronPz = Hadrons->operator[](c1)->Get4Momentum().pz(); 454 Hadrons->operator[](c1)->SetFormationTim 450 Hadrons->operator[](c1)->SetFormationTime( 455 (theInitialStringMass - 2.*SumPz + Had 451 (theInitialStringMass - 2.*SumPz + HadronE - HadronPz ) / (2.*kappa) / c_light ); 456 G4ThreeVector aPosition( 0, 0, 452 G4ThreeVector aPosition( 0, 0, 457 (theInitialStringMass - 2.*SumE - Had 453 (theInitialStringMass - 2.*SumE - HadronE + HadronPz) / (2.*kappa) ); 458 Hadrons->operator[](c1)->SetPosition(aPo 454 Hadrons->operator[](c1)->SetPosition(aPosition); 459 } 455 } 460 } 456 } 461 457 462 //-------------------------------------------- 458 //----------------------------------------------------------------------------- 463 459 464 void G4VLongitudinalStringDecay::SetSigmaTrans 460 void G4VLongitudinalStringDecay::SetSigmaTransverseMomentum(G4double aValue) 465 { 461 { 466 if ( PastInitPhase ) { 462 if ( PastInitPhase ) { 467 throw G4HadronicException(__FILE__, __LIN 463 throw G4HadronicException(__FILE__, __LINE__, 468 "G4VLongitudinalStringDecay::SetSigmaTr 464 "G4VLongitudinalStringDecay::SetSigmaTransverseMomentum after FragmentString() not allowed"); 469 } else { 465 } else { 470 SigmaQT = aValue; 466 SigmaQT = aValue; 471 } 467 } 472 } 468 } 473 469 474 //-------------------------------------------- 470 //---------------------------------------------------------------------------------------------------------- 475 471 476 void G4VLongitudinalStringDecay::SetStrangenes 472 void G4VLongitudinalStringDecay::SetStrangenessSuppression(G4double aValue) 477 { 473 { 478 StrangeSuppress = aValue; 474 StrangeSuppress = aValue; 479 } 475 } 480 476 481 //-------------------------------------------- 477 //---------------------------------------------------------------------------------------------------------- 482 478 483 void G4VLongitudinalStringDecay::SetDiquarkSup 479 void G4VLongitudinalStringDecay::SetDiquarkSuppression(G4double aValue) 484 { 480 { 485 DiquarkSuppress = aValue; 481 DiquarkSuppress = aValue; 486 } 482 } 487 483 488 //-------------------------------------------- 484 //---------------------------------------------------------------------------------------- 489 485 490 void G4VLongitudinalStringDecay::SetDiquarkBre 486 void G4VLongitudinalStringDecay::SetDiquarkBreakProbability(G4double aValue) 491 { 487 { 492 if ( PastInitPhase ) { 488 if ( PastInitPhase ) { 493 throw G4HadronicException(__FILE__, __LINE 489 throw G4HadronicException(__FILE__, __LINE__, 494 "G4VLongitudinalStringDecay::SetDiquarkB 490 "G4VLongitudinalStringDecay::SetDiquarkBreakProbability after FragmentString() not allowed"); 495 } else { 491 } else { 496 DiquarkBreakProb = aValue; 492 DiquarkBreakProb = aValue; 497 } 493 } 498 } 494 } 499 495 500 //-------------------------------------------- 496 //---------------------------------------------------------------------------------------------------------- 501 497 >> 498 void G4VLongitudinalStringDecay::SetVectorMesonProbability(G4double aValue) >> 499 { >> 500 if ( PastInitPhase ) { >> 501 throw G4HadronicException(__FILE__, __LINE__, >> 502 "G4VLongitudinalStringDecay::SetVectorMesonProbability after FragmentString() not allowed"); >> 503 } else { >> 504 pspin_meson = aValue; >> 505 delete hadronizer; >> 506 hadronizer = new G4HadronBuilder( pspin_meson, pspin_barion, scalarMesonMix, vectorMesonMix, ProbEta_c, ProbEta_b ); >> 507 } >> 508 } >> 509 >> 510 //---------------------------------------------------------------------------------------------------------- >> 511 502 void G4VLongitudinalStringDecay::SetSpinThreeH 512 void G4VLongitudinalStringDecay::SetSpinThreeHalfBarionProbability(G4double aValue) 503 { 513 { 504 if ( PastInitPhase ) { 514 if ( PastInitPhase ) { 505 throw G4HadronicException(__FILE__, __LINE 515 throw G4HadronicException(__FILE__, __LINE__, 506 "G4VLongitudinalStringDecay::SetSpinThre 516 "G4VLongitudinalStringDecay::SetSpinThreeHalfBarionProbability after FragmentString() not allowed"); 507 } else { 517 } else { 508 pspin_barion = aValue; 518 pspin_barion = aValue; 509 delete hadronizer; 519 delete hadronizer; 510 hadronizer = new G4HadronBuilder( pspin_me << 520 hadronizer = new G4HadronBuilder( pspin_meson, pspin_barion, scalarMesonMix, vectorMesonMix, ProbEta_c, ProbEta_b ); 511 ProbEta_ << 512 } 521 } 513 } 522 } 514 523 515 //-------------------------------------------- 524 //---------------------------------------------------------------------------------------------------------- 516 525 517 void G4VLongitudinalStringDecay::SetScalarMeso 526 void G4VLongitudinalStringDecay::SetScalarMesonMixings(std::vector<G4double> aVector) 518 { 527 { 519 if ( PastInitPhase ) { 528 if ( PastInitPhase ) { 520 throw G4HadronicException(__FILE__, __LINE 529 throw G4HadronicException(__FILE__, __LINE__, 521 "G4VLongitudinalStringDecay::SetScalarMe 530 "G4VLongitudinalStringDecay::SetScalarMesonMixings after FragmentString() not allowed"); 522 } else { 531 } else { 523 if ( aVector.size() < 6 ) 532 if ( aVector.size() < 6 ) 524 throw G4HadronicException(__FILE__, __LI 533 throw G4HadronicException(__FILE__, __LINE__, 525 "G4VLongitudinalStringDecay::SetScalar 534 "G4VLongitudinalStringDecay::SetScalarMesonMixings( argument Vector too small"); 526 scalarMesonMix[0] = aVector[0]; 535 scalarMesonMix[0] = aVector[0]; 527 scalarMesonMix[1] = aVector[1]; 536 scalarMesonMix[1] = aVector[1]; 528 scalarMesonMix[2] = aVector[2]; 537 scalarMesonMix[2] = aVector[2]; 529 scalarMesonMix[3] = aVector[3]; 538 scalarMesonMix[3] = aVector[3]; 530 scalarMesonMix[4] = aVector[4]; 539 scalarMesonMix[4] = aVector[4]; 531 scalarMesonMix[5] = aVector[5]; 540 scalarMesonMix[5] = aVector[5]; 532 delete hadronizer; 541 delete hadronizer; 533 hadronizer = new G4HadronBuilder( pspin_me << 542 hadronizer = new G4HadronBuilder( pspin_meson, pspin_barion, scalarMesonMix, vectorMesonMix, ProbEta_c, ProbEta_b ); 534 ProbEta_ << 535 } 543 } 536 } 544 } 537 545 538 //-------------------------------------------- 546 //---------------------------------------------------------------------------------------------------------- 539 547 540 void G4VLongitudinalStringDecay::SetVectorMeso 548 void G4VLongitudinalStringDecay::SetVectorMesonMixings(std::vector<G4double> aVector) 541 { 549 { 542 if ( PastInitPhase ) { 550 if ( PastInitPhase ) { 543 throw G4HadronicException(__FILE__, __LINE 551 throw G4HadronicException(__FILE__, __LINE__, 544 "G4VLongitudinalStringDecay::SetVectorMe 552 "G4VLongitudinalStringDecay::SetVectorMesonMixings after FragmentString() not allowed"); 545 } else { 553 } else { 546 if ( aVector.size() < 6 ) 554 if ( aVector.size() < 6 ) 547 throw G4HadronicException(__FILE__, __LI 555 throw G4HadronicException(__FILE__, __LINE__, 548 "G4VLongitudinalStringDecay::SetVector 556 "G4VLongitudinalStringDecay::SetVectorMesonMixings( argument Vector too small"); 549 vectorMesonMix[0] = aVector[0]; 557 vectorMesonMix[0] = aVector[0]; 550 vectorMesonMix[1] = aVector[1]; 558 vectorMesonMix[1] = aVector[1]; 551 vectorMesonMix[2] = aVector[2]; 559 vectorMesonMix[2] = aVector[2]; 552 vectorMesonMix[3] = aVector[3]; 560 vectorMesonMix[3] = aVector[3]; 553 vectorMesonMix[4] = aVector[4]; 561 vectorMesonMix[4] = aVector[4]; 554 vectorMesonMix[5] = aVector[5]; 562 vectorMesonMix[5] = aVector[5]; 555 delete hadronizer; 563 delete hadronizer; 556 hadronizer = new G4HadronBuilder( pspin_me << 564 hadronizer = new G4HadronBuilder( pspin_meson, pspin_barion, scalarMesonMix, vectorMesonMix, ProbEta_c, ProbEta_b ); 557 ProbEta_ << 558 } 565 } 559 } 566 } 560 567 561 //-------------------------------------------- 568 //------------------------------------------------------------------------------------------- 562 569 563 void G4VLongitudinalStringDecay::SetProbCCbar( 570 void G4VLongitudinalStringDecay::SetProbCCbar(G4double aValue) 564 { 571 { 565 ProbCCbar = aValue; 572 ProbCCbar = aValue; 566 ProbCB = ProbCCbar + ProbBBbar; 573 ProbCB = ProbCCbar + ProbBBbar; 567 } 574 } 568 575 569 //-------------------------------------------- 576 //------------------------------------------------------------------------------------------- 570 577 571 void G4VLongitudinalStringDecay::SetProbEta_c( 578 void G4VLongitudinalStringDecay::SetProbEta_c(G4double aValue) 572 { 579 { 573 ProbEta_c = aValue; 580 ProbEta_c = aValue; 574 } 581 } 575 582 576 //-------------------------------------------- 583 //------------------------------------------------------------------------------------------- 577 584 578 void G4VLongitudinalStringDecay::SetProbBBbar( 585 void G4VLongitudinalStringDecay::SetProbBBbar(G4double aValue) 579 { 586 { 580 ProbBBbar = aValue; 587 ProbBBbar = aValue; 581 ProbCB = ProbCCbar + ProbBBbar; 588 ProbCB = ProbCCbar + ProbBBbar; 582 } 589 } 583 590 584 //-------------------------------------------- 591 //------------------------------------------------------------------------------------------- 585 592 586 void G4VLongitudinalStringDecay::SetProbEta_b( 593 void G4VLongitudinalStringDecay::SetProbEta_b(G4double aValue) 587 { 594 { 588 ProbEta_b = aValue; 595 ProbEta_b = aValue; 589 } 596 } 590 597 591 //-------------------------------------------- 598 //------------------------------------------------------------------------------------------- 592 599 593 void G4VLongitudinalStringDecay::SetStringTens 600 void G4VLongitudinalStringDecay::SetStringTensionParameter(G4double aValue) 594 { 601 { 595 Kappa = aValue * GeV/fermi; 602 Kappa = aValue * GeV/fermi; 596 } 603 } 597 604 598 //-------------------------------------------- 605 //----------------------------------------------------------------------- 599 606 600 void G4VLongitudinalStringDecay::SetMinMasses( 607 void G4VLongitudinalStringDecay::SetMinMasses() 601 { 608 { 602 // ------ For estimation of a minimal stri 609 // ------ For estimation of a minimal string mass --------------- 603 Mass_of_light_quark =140.*MeV; 610 Mass_of_light_quark =140.*MeV; 604 Mass_of_s_quark =500.*MeV; 611 Mass_of_s_quark =500.*MeV; 605 Mass_of_c_quark =1600.*MeV; << 612 Mass_of_c_quark = 0.*MeV; // ??? 606 Mass_of_b_quark =4500.*MeV; << 613 Mass_of_b_quark = 0.*MeV; // ??? 607 Mass_of_string_junction=720.*MeV; 614 Mass_of_string_junction=720.*MeV; 608 615 609 // ---------------- Determination of minim 616 // ---------------- Determination of minimal mass of q-qbar strings ------------------- 610 G4ParticleDefinition * hadron1; G4int C 617 G4ParticleDefinition * hadron1; G4int Code1; 611 G4ParticleDefinition * hadron2; G4int C 618 G4ParticleDefinition * hadron2; G4int Code2; 612 for (G4int i=1; i < 6; i++) { 619 for (G4int i=1; i < 6; i++) { 613 Code1 = 100*i + 10*1 + 1; 620 Code1 = 100*i + 10*1 + 1; 614 hadron1 = FindParticle(Code1); 621 hadron1 = FindParticle(Code1); 615 622 616 if (hadron1 != nullptr) { << 623 if (hadron1 != NULL) { 617 for (G4int j=1; j < 6; j++) { 624 for (G4int j=1; j < 6; j++) { 618 Code2 = 100*j + 10*1 + 1; 625 Code2 = 100*j + 10*1 + 1; 619 hadron2 = FindParticle(Code2); 626 hadron2 = FindParticle(Code2); 620 if (hadron2 != nullptr) { << 627 if (hadron2 != NULL) { 621 minMassQQbarStr[i-1][j-1] = h 628 minMassQQbarStr[i-1][j-1] = hadron1->GetPDGMass() + hadron2->GetPDGMass() + 70.0 * MeV; 622 } 629 } 623 } 630 } 624 } 631 } 625 } 632 } 626 633 627 minMassQQbarStr[1][1] = minMassQQbarStr[0] 634 minMassQQbarStr[1][1] = minMassQQbarStr[0][0]; // u-ubar = 0.5 Pi0 + 0.24 Eta + 0.25 Eta' 628 635 629 // ---------------- Determination of minim 636 // ---------------- Determination of minimal mass of qq-q strings ------------------- 630 G4ParticleDefinition * hadron3; 637 G4ParticleDefinition * hadron3; 631 G4int kfla, kflb; 638 G4int kfla, kflb; 632 // MaxMass = -350.0*GeV; // If there wi 639 // MaxMass = -350.0*GeV; // If there will be a particle with mass larger than Higgs the value must be changed. 633 640 634 for (G4int i=1; i < 6; i++) { //i=1 641 for (G4int i=1; i < 6; i++) { //i=1 635 Code1 = 100*i + 10*1 + 1; 642 Code1 = 100*i + 10*1 + 1; 636 hadron1 = FindParticle(Code1); 643 hadron1 = FindParticle(Code1); 637 for (G4int j=1; j < 6; j++) { 644 for (G4int j=1; j < 6; j++) { 638 for (G4int k=1; k < 6; k++) { 645 for (G4int k=1; k < 6; k++) { 639 kfla = std::max(j,k); 646 kfla = std::max(j,k); 640 kflb = std::min(j,k); 647 kflb = std::min(j,k); 641 648 642 // Add d-quark 649 // Add d-quark 643 Code2 = 1000*kfla + 100*kflb + 650 Code2 = 1000*kfla + 100*kflb + 10*1 + 2; 644 if ( (j == 1) && (k==1)) Code2 = 1000*2 + 651 if ( (j == 1) && (k==1)) Code2 = 1000*2 + 100*1 + 10*1 + 2; // In the case - add u-quark. 645 652 646 hadron2 = G4ParticleTable::Get 653 hadron2 = G4ParticleTable::GetParticleTable()->FindParticle(Code2); 647 hadron3 = G4ParticleTable::Get 654 hadron3 = G4ParticleTable::GetParticleTable()->FindParticle(Code2 + 2); 648 655 649 if ((hadron2 == nullptr) && (h << 656 if ((hadron2 == NULL) && (hadron3 == NULL)) {minMassQDiQStr[i-1][j-1][k-1] = MaxMass; continue;}; 650 657 651 if ((hadron2 != nullptr) && (h << 658 if ((hadron2 != NULL) && (hadron3 != NULL)) { 652 if (hadron2->GetPDGMass() > 659 if (hadron2->GetPDGMass() > hadron3->GetPDGMass() ) { hadron2 = hadron3; } 653 }; 660 }; 654 661 655 if ((hadron2 != nullptr) && (h << 662 if ((hadron2 != NULL) && (hadron3 == NULL)) {}; 656 663 657 if ((hadron2 == nullptr) && (h << 664 if ((hadron2 == NULL) && (hadron3 != NULL)) {hadron2 = hadron3;}; 658 665 659 minMassQDiQStr[i-1][j-1][k-1] 666 minMassQDiQStr[i-1][j-1][k-1] = hadron1->GetPDGMass() + hadron2->GetPDGMass() + 70.0 * MeV; 660 } 667 } 661 } 668 } 662 } 669 } 663 670 664 // ------ An estimated minimal string mass 671 // ------ An estimated minimal string mass ---------------------- 665 MinimalStringMass = 0.; 672 MinimalStringMass = 0.; 666 MinimalStringMass2 = 0.; 673 MinimalStringMass2 = 0.; 667 // q charges d u 674 // q charges d u s c b 668 Qcharge[0] = -1; Qcharge[1] = 2; Qcharge[2 675 Qcharge[0] = -1; Qcharge[1] = 2; Qcharge[2] = -1; Qcharge[3] = 2; Qcharge[4] = -1; 669 676 670 // For treating of small string decays 677 // For treating of small string decays 671 for (G4int i=0; i<5; i++) 678 for (G4int i=0; i<5; i++) 672 { for (G4int j=0; j<5; j++) 679 { for (G4int j=0; j<5; j++) 673 { for (G4int k=0; k<7; k++) 680 { for (G4int k=0; k<7; k++) 674 { 681 { 675 Meson[i][j][k]=0; MesonWeight[i][j 682 Meson[i][j][k]=0; MesonWeight[i][j][k]=0.; 676 } 683 } 677 } 684 } 678 } 685 } 679 //-------------------------- 686 //-------------------------- 680 G4int StrangeQ = 0; << 681 G4int StrangeAQ = 0; << 682 for (G4int i=0; i<5; i++) 687 for (G4int i=0; i<5; i++) 683 { << 688 { for (G4int j=0; j<5; j++) 684 if( i >= 2 ) StrangeQ=1; << 689 { 685 for (G4int j=0; j<5; j++) << 686 { << 687 StrangeAQ = 0; << 688 if( j >= 2 ) StrangeAQ=1; << 689 Meson[i][j][0] = 100 * (std::ma 690 Meson[i][j][0] = 100 * (std::max(i,j)+1) + 10 * (std::min(i,j)+1) + 1; // Scalar meson 690 MesonWeight[i][j][0] = ( pspin_meso << 691 MesonWeight[i][j][0] = ( pspin_meson); 691 Meson[i][j][1] = 100 * (std::ma 692 Meson[i][j][1] = 100 * (std::max(i,j)+1) + 10 * (std::min(i,j)+1) + 3; // Vector meson 692 MesonWeight[i][j][1] = (1.-pspin_meso << 693 MesonWeight[i][j][1] = (1.-pspin_meson); 693 } 694 } 694 } 695 } 695 696 696 //qqs 697 //qqs indexes 697 //dd1 -> scalarMesonMix[0] * 111 + (1-scal 698 //dd1 -> scalarMesonMix[0] * 111 + (1-scalarMesonMix[0]-scalarMesonMix[1]) * 221 + scalarMesonMix[1] * 331 (000) 698 //dd1 -> Pi0 699 //dd1 -> Pi0 Eta Eta' 699 700 700 Meson[0][0][0] = 111; MesonWeight[0][0][0] << 701 Meson[0][0][0] = 111; MesonWeight[0][0][0] = ( pspin_meson) * ( scalarMesonMix[0] ); // Pi0 701 Meson[0][0][2] = 221; MesonWeight[0][0][3] << 702 Meson[0][0][2] = 221; MesonWeight[0][0][3] = ( pspin_meson) * (1-scalarMesonMix[0]-scalarMesonMix[1]); // Eta 702 Meson[0][0][3] = 331; MesonWeight[0][0][4] << 703 Meson[0][0][3] = 331; MesonWeight[0][0][4] = ( pspin_meson) * ( scalarMesonMix[1]); // Eta' 703 << 704 704 //dd3 -> (1-vectorMesonMix[1] * 113 + vect << 705 //dd3 -> vectorMesonMix[0] * 113 + (1-vectorMesonMix[0]-vectorMesonMix[1]) * 223 + vectorMesonMix[1] * 333 (001) 705 //dd3 -> rho_0 << 706 //dd3 -> rho_0 omega fi 706 << 707 707 Meson[0][0][1] = 113; MesonWeight[0][0][1] << 708 Meson[0][0][1] = 113; MesonWeight[0][0][1] = (1.-pspin_meson) * ( vectorMesonMix[0] ); // Rho 708 Meson[0][0][4] = 223; MesonWeight[0][0][4] << 709 Meson[0][0][4] = 223; MesonWeight[0][0][4] = (1.-pspin_meson) * (1-vectorMesonMix[0]-vectorMesonMix[1]); // omega >> 710 Meson[0][0][5] = 333; MesonWeight[0][0][5] = (1.-pspin_meson) * ( vectorMesonMix[1]); // fi 709 711 710 //uu1 -> scalarMesonMix[0] * 111 + (1-scal 712 //uu1 -> scalarMesonMix[0] * 111 + (1-scalarMesonMix[0]-scalarMesonMix[1]) * 221 + scalarMesonMix[1] * 331 (110) 711 //uu1 -> Pi0 713 //uu1 -> Pi0 Eta Eta' 712 714 713 Meson[1][1][0] = 111; MesonWeight[1][1][0] << 715 Meson[1][1][0] = 111; MesonWeight[1][1][0] = ( pspin_meson) * ( scalarMesonMix[0] ); // Pi0 714 Meson[1][1][2] = 221; MesonWeight[1][1][2] << 716 Meson[1][1][2] = 221; MesonWeight[1][1][2] = ( pspin_meson) * (1-scalarMesonMix[0]-scalarMesonMix[1]); // Eta 715 Meson[1][1][3] = 331; MesonWeight[1][1][3] << 717 Meson[1][1][3] = 331; MesonWeight[1][1][3] = ( pspin_meson) * ( scalarMesonMix[1]); // Eta' 716 << 718 717 //uu3 -> (1-vectorMesonMix[1]) * 113 + vec << 719 //uu3 -> vectorMesonMix[0] * 113 + (1-vectorMesonMix[0]-vectorMesonMix[1]) * 223 + vectorMesonMix[1] * 333 (111) 718 //uu3 -> rho_0 << 720 //uu3 -> rho_0 omega fi 719 << 721 720 Meson[1][1][1] = 113; MesonWeight[1][1][1] << 722 Meson[1][1][1] = 113; MesonWeight[1][1][1] = (1.-pspin_meson) * ( vectorMesonMix[0] ); // Rho 721 Meson[1][1][4] = 223; MesonWeight[1][1][4] << 723 Meson[1][1][4] = 223; MesonWeight[1][1][4] = (1.-pspin_meson) * (1-vectorMesonMix[0]-vectorMesonMix[1]); // omega >> 724 Meson[1][1][5] = 333; MesonWeight[1][1][5] = (1.-pspin_meson) * ( vectorMesonMix[1]); // fi 722 725 723 //ss1 -> 726 //ss1 -> (1-scalarMesonMix[5]) * 221 + scalarMesonMix[5] * 331 (220) 724 //ss1 -> 727 //ss1 -> Eta Eta' 725 728 726 Meson[2][2][0] = 221; MesonWeight[2][2][0] << 729 Meson[2][2][0] = 221; MesonWeight[2][2][0] = ( pspin_meson) * (1-scalarMesonMix[5] ); // Eta 727 Meson[2][2][2] = 331; MesonWeight[2][2][2] << 730 Meson[2][2][2] = 331; MesonWeight[2][2][2] = ( pspin_meson) * ( scalarMesonMix[5]); // Eta' 728 731 729 //ss3 -> << 732 //ss3 -> (1-vectorMesonMix[5]) * 223 + vectorMesonMix[5] * 333 (221) 730 //ss3 -> << 733 //ss3 -> omega fi 731 734 732 Meson[2][2][1] = 333; MesonWeight[2][2][1] << 735 Meson[2][2][1] = 223; MesonWeight[2][2][1] = (1.-pspin_meson) * (1-vectorMesonMix[5] ); // omega >> 736 Meson[2][2][3] = 333; MesonWeight[2][2][3] = (1.-pspin_meson) * ( vectorMesonMix[5]); // fi 733 737 734 //cc1 -> ProbEta_c /(1-pspin_meson) 738 //cc1 -> ProbEta_c /(1-pspin_meson) 441 (330) Probability of Eta_c 735 //cc3 -> (1-ProbEta_c)/( pspin_meson) 739 //cc3 -> (1-ProbEta_c)/( pspin_meson) 443 (331) Probability of J/Psi 736 740 737 //bb1 -> ProbEta_b /pspin_meson 551 741 //bb1 -> ProbEta_b /pspin_meson 551 (440) Probability of Eta_b 738 //bb3 -> (1-ProbEta_b)/pspin_meson 553 << 742 //bb3 -> (1-ProbEta_b)/pspin_meson 553 (441) Probability of ipsilon 739 743 740 if ( pspin_meson[2] != 0. ) { << 744 if ( pspin_meson != 0. ) { 741 Meson[3][3][0] *= ( ProbEta_c)/( p << 745 Meson[3][3][0] *= ( ProbEta_c)/( pspin_meson); // Eta_c 742 Meson[3][3][1] *= (1.0-ProbEta_c)/(1.-p << 746 Meson[3][3][1] *= (1.0-ProbEta_c)/(1.-pspin_meson); // J/Psi 743 747 744 Meson[4][4][0] *= ( ProbEta_b)/( p << 748 Meson[4][4][0] *= ( ProbEta_b)/( pspin_meson); // Eta_b 745 Meson[4][4][1] *= (1.0-ProbEta_b)/(1.-p << 749 Meson[4][4][1] *= (1.0-ProbEta_b)/(1.-pspin_meson); // ipsilon 746 } 750 } 747 751 748 //-------------------------- 752 //-------------------------- 749 753 750 for (G4int i=0; i<5; i++) 754 for (G4int i=0; i<5; i++) 751 { for (G4int j=0; j<5; j++) 755 { for (G4int j=0; j<5; j++) 752 { for (G4int k=0; k<5; k++) 756 { for (G4int k=0; k<5; k++) 753 { for (G4int l=0; l<4; l++) 757 { for (G4int l=0; l<4; l++) 754 { Baryon[i][j][k][l]=0; BaryonWei 758 { Baryon[i][j][k][l]=0; BaryonWeight[i][j][k][l]=0.;} 755 } 759 } 756 } 760 } 757 } 761 } 758 762 759 kfla =0; kflb =0; 763 kfla =0; kflb =0; 760 G4int kflc(0), kfld(0), 764 G4int kflc(0), kfld(0), kfle(0), kflf(0); 761 for (G4int i=0; i<5; i++) 765 for (G4int i=0; i<5; i++) 762 { for (G4int j=0; j<5; j++) 766 { for (G4int j=0; j<5; j++) 763 { for (G4int k=0; k<5; k++) 767 { for (G4int k=0; k<5; k++) 764 { 768 { 765 kfla = i+1; kflb = j+1; kflc = k+1; 769 kfla = i+1; kflb = j+1; kflc = k+1; 766 kfld = std::max(kfla,kflb); 770 kfld = std::max(kfla,kflb); 767 kfld = std::max(kfld,kflc); 771 kfld = std::max(kfld,kflc); 768 772 769 kflf = std::min(kfla,kflb); 773 kflf = std::min(kfla,kflb); 770 kflf = std::min(kflf,kflc); 774 kflf = std::min(kflf,kflc); 771 775 772 kfle = kfla + kflb + kflc - kfld - 776 kfle = kfla + kflb + kflc - kfld - kflf; 773 777 774 Baryon[i][j][k][0] = 1000 * k 778 Baryon[i][j][k][0] = 1000 * kfld + 100 * kfle + 10 * kflf + 2; // spin=1/2 775 BaryonWeight[i][j][k][0] = ( pspi 779 BaryonWeight[i][j][k][0] = ( pspin_barion); 776 Baryon[i][j][k][1] = 1000 * k 780 Baryon[i][j][k][1] = 1000 * kfld + 100 * kfle + 10 * kflf + 4; // spin=3/2 777 BaryonWeight[i][j][k][1] = (1.-pspi 781 BaryonWeight[i][j][k][1] = (1.-pspin_barion); 778 } 782 } 779 } 783 } 780 } 784 } 781 785 782 // Delta- ddd - only 1114 786 // Delta- ddd - only 1114 783 Baryon[0][0][0][0] = 1114; BaryonWeight 787 Baryon[0][0][0][0] = 1114; BaryonWeight[0][0][0][0] = 1.0; 784 Baryon[0][0][0][1] = 0; BaryonWeight 788 Baryon[0][0][0][1] = 0; BaryonWeight[0][0][0][1] = 0.0; 785 789 786 // Delta++ uuu - only 2224 790 // Delta++ uuu - only 2224 787 Baryon[1][1][1][0] = 2224; BaryonWeight 791 Baryon[1][1][1][0] = 2224; BaryonWeight[1][1][1][0] = 1.0; 788 Baryon[1][1][1][1] = 0; BaryonWeight 792 Baryon[1][1][1][1] = 0; BaryonWeight[1][1][1][1] = 0.0; 789 793 790 // Omega- sss - only 3334 794 // Omega- sss - only 3334 791 Baryon[2][2][2][0] = 3334; BaryonWeight 795 Baryon[2][2][2][0] = 3334; BaryonWeight[2][2][2][0] = 1.0; 792 Baryon[2][2][2][1] = 0; BaryonWeight 796 Baryon[2][2][2][1] = 0; BaryonWeight[2][2][2][1] = 0.0; 793 797 794 // Omega_cc++ ccc - only 4444 798 // Omega_cc++ ccc - only 4444 795 Baryon[3][3][3][0] = 4444; BaryonWeight 799 Baryon[3][3][3][0] = 4444; BaryonWeight[3][3][3][0] = 1.0; 796 Baryon[3][3][3][1] = 0; BaryonWeight 800 Baryon[3][3][3][1] = 0; BaryonWeight[3][3][3][1] = 0.0; 797 801 798 // Omega_bb- bbb - only 5554 << 802 // Omega_bb- bbb - only 5454 799 Baryon[4][4][4][0] = 5554; BaryonWeight 803 Baryon[4][4][4][0] = 5554; BaryonWeight[4][4][4][0] = 1.0; 800 Baryon[4][4][4][1] = 0; BaryonWeight 804 Baryon[4][4][4][1] = 0; BaryonWeight[4][4][4][1] = 0.0; 801 805 802 // Lambda/Sigma0 sud - 3122/3212 806 // Lambda/Sigma0 sud - 3122/3212 803 Baryon[0][1][2][0] = 3122; BaryonWeight 807 Baryon[0][1][2][0] = 3122; BaryonWeight[0][1][2][0] *= 0.5; // Lambda 804 Baryon[0][2][1][0] = 3122; BaryonWeight 808 Baryon[0][2][1][0] = 3122; BaryonWeight[0][2][1][0] *= 0.5; 805 Baryon[1][0][2][0] = 3122; BaryonWeight 809 Baryon[1][0][2][0] = 3122; BaryonWeight[1][0][2][0] *= 0.5; 806 Baryon[1][2][0][0] = 3122; BaryonWeight 810 Baryon[1][2][0][0] = 3122; BaryonWeight[1][2][0][0] *= 0.5; 807 Baryon[2][0][1][0] = 3122; BaryonWeight 811 Baryon[2][0][1][0] = 3122; BaryonWeight[2][0][1][0] *= 0.5; 808 Baryon[2][1][0][0] = 3122; BaryonWeight 812 Baryon[2][1][0][0] = 3122; BaryonWeight[2][1][0][0] *= 0.5; 809 813 810 Baryon[0][1][2][2] = 3212; BaryonWeight 814 Baryon[0][1][2][2] = 3212; BaryonWeight[0][1][2][2] = 0.5 * pspin_barion; // Sigma0 811 Baryon[0][2][1][2] = 3212; BaryonWeight 815 Baryon[0][2][1][2] = 3212; BaryonWeight[0][2][1][2] = 0.5 * pspin_barion; 812 Baryon[1][0][2][2] = 3212; BaryonWeight 816 Baryon[1][0][2][2] = 3212; BaryonWeight[1][0][2][2] = 0.5 * pspin_barion; 813 Baryon[1][2][0][2] = 3212; BaryonWeight 817 Baryon[1][2][0][2] = 3212; BaryonWeight[1][2][0][2] = 0.5 * pspin_barion; 814 Baryon[2][0][1][2] = 3212; BaryonWeight 818 Baryon[2][0][1][2] = 3212; BaryonWeight[2][0][1][2] = 0.5 * pspin_barion; 815 Baryon[2][1][0][2] = 3212; BaryonWeight 819 Baryon[2][1][0][2] = 3212; BaryonWeight[2][1][0][2] = 0.5 * pspin_barion; 816 820 817 // Lambda_c+/Sigma_c+ cud - 4122/4212 821 // Lambda_c+/Sigma_c+ cud - 4122/4212 818 Baryon[0][1][3][0] = 4122; BaryonWeight 822 Baryon[0][1][3][0] = 4122; BaryonWeight[0][1][3][0] *= 0.5; // Lambda_c+ 819 Baryon[0][3][1][0] = 4122; BaryonWeight 823 Baryon[0][3][1][0] = 4122; BaryonWeight[0][3][1][0] *= 0.5; 820 Baryon[1][0][3][0] = 4122; BaryonWeight 824 Baryon[1][0][3][0] = 4122; BaryonWeight[1][0][3][0] *= 0.5; 821 Baryon[1][3][0][0] = 4122; BaryonWeight 825 Baryon[1][3][0][0] = 4122; BaryonWeight[1][3][0][0] *= 0.5; 822 Baryon[3][0][1][0] = 4122; BaryonWeight 826 Baryon[3][0][1][0] = 4122; BaryonWeight[3][0][1][0] *= 0.5; 823 Baryon[3][1][0][0] = 4122; BaryonWeight 827 Baryon[3][1][0][0] = 4122; BaryonWeight[3][1][0][0] *= 0.5; 824 828 825 Baryon[0][1][3][2] = 4212; BaryonWeight 829 Baryon[0][1][3][2] = 4212; BaryonWeight[0][1][3][2] = 0.5 * pspin_barion; // SigmaC+ 826 Baryon[0][3][1][2] = 4212; BaryonWeight 830 Baryon[0][3][1][2] = 4212; BaryonWeight[0][3][1][2] = 0.5 * pspin_barion; 827 Baryon[1][0][3][2] = 4212; BaryonWeight 831 Baryon[1][0][3][2] = 4212; BaryonWeight[1][0][3][2] = 0.5 * pspin_barion; 828 Baryon[1][3][0][2] = 4212; BaryonWeight 832 Baryon[1][3][0][2] = 4212; BaryonWeight[1][3][0][2] = 0.5 * pspin_barion; 829 Baryon[3][0][1][2] = 4212; BaryonWeight 833 Baryon[3][0][1][2] = 4212; BaryonWeight[3][0][1][2] = 0.5 * pspin_barion; 830 Baryon[3][1][0][2] = 4212; BaryonWeight 834 Baryon[3][1][0][2] = 4212; BaryonWeight[3][1][0][2] = 0.5 * pspin_barion; 831 835 832 // Xi_c+/Xi_c+' cus - 4232/4322 836 // Xi_c+/Xi_c+' cus - 4232/4322 833 Baryon[1][2][3][0] = 4232; BaryonWeight 837 Baryon[1][2][3][0] = 4232; BaryonWeight[1][2][3][0] *= 0.5; // Xi_c+ 834 Baryon[1][3][2][0] = 4232; BaryonWeight 838 Baryon[1][3][2][0] = 4232; BaryonWeight[1][3][2][0] *= 0.5; 835 Baryon[2][1][3][0] = 4232; BaryonWeight 839 Baryon[2][1][3][0] = 4232; BaryonWeight[2][1][3][0] *= 0.5; 836 Baryon[2][3][1][0] = 4232; BaryonWeight 840 Baryon[2][3][1][0] = 4232; BaryonWeight[2][3][1][0] *= 0.5; 837 Baryon[3][1][2][0] = 4232; BaryonWeight 841 Baryon[3][1][2][0] = 4232; BaryonWeight[3][1][2][0] *= 0.5; 838 Baryon[3][2][1][0] = 4232; BaryonWeight 842 Baryon[3][2][1][0] = 4232; BaryonWeight[3][2][1][0] *= 0.5; 839 843 840 Baryon[1][2][3][2] = 4322; BaryonWeight 844 Baryon[1][2][3][2] = 4322; BaryonWeight[1][2][3][2] = 0.5 * pspin_barion; // Xi_c+' 841 Baryon[1][3][2][2] = 4322; BaryonWeight 845 Baryon[1][3][2][2] = 4322; BaryonWeight[1][3][2][2] = 0.5 * pspin_barion; 842 Baryon[2][1][3][2] = 4322; BaryonWeight 846 Baryon[2][1][3][2] = 4322; BaryonWeight[2][1][3][2] = 0.5 * pspin_barion; 843 Baryon[2][3][1][2] = 4322; BaryonWeight 847 Baryon[2][3][1][2] = 4322; BaryonWeight[2][3][1][2] = 0.5 * pspin_barion; 844 Baryon[3][1][2][2] = 4322; BaryonWeight 848 Baryon[3][1][2][2] = 4322; BaryonWeight[3][1][2][2] = 0.5 * pspin_barion; 845 Baryon[3][2][1][2] = 4322; BaryonWeight 849 Baryon[3][2][1][2] = 4322; BaryonWeight[3][2][1][2] = 0.5 * pspin_barion; 846 850 847 // Xi_c0/Xi_c0' cus - 4132/4312 << 851 // Xi_c0/Xi_c0' cus - 4232/4322 848 Baryon[0][2][3][0] = 4132; BaryonWeight 852 Baryon[0][2][3][0] = 4132; BaryonWeight[0][2][3][0] *= 0.5; // Xi_c0 849 Baryon[0][3][2][0] = 4132; BaryonWeight 853 Baryon[0][3][2][0] = 4132; BaryonWeight[0][3][2][0] *= 0.5; 850 Baryon[2][0][3][0] = 4132; BaryonWeight 854 Baryon[2][0][3][0] = 4132; BaryonWeight[2][0][3][0] *= 0.5; 851 Baryon[2][3][0][0] = 4132; BaryonWeight 855 Baryon[2][3][0][0] = 4132; BaryonWeight[2][3][0][0] *= 0.5; 852 Baryon[3][0][2][0] = 4132; BaryonWeight 856 Baryon[3][0][2][0] = 4132; BaryonWeight[3][0][2][0] *= 0.5; 853 Baryon[3][2][0][0] = 4132; BaryonWeight 857 Baryon[3][2][0][0] = 4132; BaryonWeight[3][2][0][0] *= 0.5; 854 858 855 Baryon[0][2][3][2] = 4312; BaryonWeight 859 Baryon[0][2][3][2] = 4312; BaryonWeight[0][2][3][2] = 0.5 * pspin_barion; // Xi_c0' 856 Baryon[0][3][2][2] = 4312; BaryonWeight 860 Baryon[0][3][2][2] = 4312; BaryonWeight[0][3][2][2] = 0.5 * pspin_barion; 857 Baryon[2][0][3][2] = 4312; BaryonWeight 861 Baryon[2][0][3][2] = 4312; BaryonWeight[2][0][3][2] = 0.5 * pspin_barion; 858 Baryon[2][3][0][2] = 4312; BaryonWeight 862 Baryon[2][3][0][2] = 4312; BaryonWeight[2][3][0][2] = 0.5 * pspin_barion; 859 Baryon[3][0][2][2] = 4312; BaryonWeight 863 Baryon[3][0][2][2] = 4312; BaryonWeight[3][0][2][2] = 0.5 * pspin_barion; 860 Baryon[3][2][0][2] = 4312; BaryonWeight 864 Baryon[3][2][0][2] = 4312; BaryonWeight[3][2][0][2] = 0.5 * pspin_barion; 861 865 862 // Lambda_b0/Sigma_b0 bud - 5122/5212 866 // Lambda_b0/Sigma_b0 bud - 5122/5212 863 Baryon[0][1][4][0] = 5122; BaryonWeight 867 Baryon[0][1][4][0] = 5122; BaryonWeight[0][1][4][0] *= 0.5; // Lambda_b0 864 Baryon[0][4][1][0] = 5122; BaryonWeight 868 Baryon[0][4][1][0] = 5122; BaryonWeight[0][4][1][0] *= 0.5; 865 Baryon[1][0][4][0] = 5122; BaryonWeight 869 Baryon[1][0][4][0] = 5122; BaryonWeight[1][0][4][0] *= 0.5; 866 Baryon[1][4][0][0] = 5122; BaryonWeight 870 Baryon[1][4][0][0] = 5122; BaryonWeight[1][4][0][0] *= 0.5; 867 Baryon[4][0][1][0] = 5122; BaryonWeight 871 Baryon[4][0][1][0] = 5122; BaryonWeight[4][0][1][0] *= 0.5; 868 Baryon[4][1][0][0] = 5122; BaryonWeight 872 Baryon[4][1][0][0] = 5122; BaryonWeight[4][1][0][0] *= 0.5; 869 873 870 Baryon[0][1][4][2] = 5212; BaryonWeight 874 Baryon[0][1][4][2] = 5212; BaryonWeight[0][1][4][2] = 0.5 * pspin_barion; // Sigma_b0 871 Baryon[0][4][1][2] = 5212; BaryonWeight 875 Baryon[0][4][1][2] = 5212; BaryonWeight[0][4][1][2] = 0.5 * pspin_barion; 872 Baryon[1][0][4][2] = 5212; BaryonWeight 876 Baryon[1][0][4][2] = 5212; BaryonWeight[1][0][4][2] = 0.5 * pspin_barion; 873 Baryon[1][4][0][2] = 5212; BaryonWeight 877 Baryon[1][4][0][2] = 5212; BaryonWeight[1][4][0][2] = 0.5 * pspin_barion; 874 Baryon[4][0][1][2] = 5212; BaryonWeight 878 Baryon[4][0][1][2] = 5212; BaryonWeight[4][0][1][2] = 0.5 * pspin_barion; 875 Baryon[4][1][0][2] = 5212; BaryonWeight 879 Baryon[4][1][0][2] = 5212; BaryonWeight[4][1][0][2] = 0.5 * pspin_barion; 876 880 877 // Xi_b0/Xi_b0' bus - 5232/5322 << 881 // Xi_b-/Xi_b-' bus - 5232/5322 878 Baryon[1][2][4][0] = 5232; BaryonWeight << 882 Baryon[1][2][4][0] = 5232; BaryonWeight[1][2][4][0] *= 0.5; // Xi_b- 879 Baryon[1][4][2][0] = 5232; BaryonWeight 883 Baryon[1][4][2][0] = 5232; BaryonWeight[1][4][2][0] *= 0.5; 880 Baryon[2][1][4][0] = 5232; BaryonWeight 884 Baryon[2][1][4][0] = 5232; BaryonWeight[2][1][4][0] *= 0.5; 881 Baryon[2][4][1][0] = 5232; BaryonWeight 885 Baryon[2][4][1][0] = 5232; BaryonWeight[2][4][1][0] *= 0.5; 882 Baryon[4][1][2][0] = 5232; BaryonWeight 886 Baryon[4][1][2][0] = 5232; BaryonWeight[4][1][2][0] *= 0.5; 883 Baryon[4][2][1][0] = 5232; BaryonWeight 887 Baryon[4][2][1][0] = 5232; BaryonWeight[4][2][1][0] *= 0.5; 884 888 885 Baryon[1][2][4][2] = 5322; BaryonWeight << 889 Baryon[1][2][4][2] = 5322; BaryonWeight[1][2][4][2] = 0.5 * pspin_barion; // Xi_b-' 886 Baryon[1][4][2][2] = 5322; BaryonWeight 890 Baryon[1][4][2][2] = 5322; BaryonWeight[1][4][2][2] = 0.5 * pspin_barion; 887 Baryon[2][1][4][2] = 5322; BaryonWeight 891 Baryon[2][1][4][2] = 5322; BaryonWeight[2][1][4][2] = 0.5 * pspin_barion; 888 Baryon[2][4][1][2] = 5322; BaryonWeight 892 Baryon[2][4][1][2] = 5322; BaryonWeight[2][4][1][2] = 0.5 * pspin_barion; 889 Baryon[4][1][2][2] = 5322; BaryonWeight 893 Baryon[4][1][2][2] = 5322; BaryonWeight[4][1][2][2] = 0.5 * pspin_barion; 890 Baryon[4][2][1][2] = 5322; BaryonWeight 894 Baryon[4][2][1][2] = 5322; BaryonWeight[4][2][1][2] = 0.5 * pspin_barion; 891 895 892 // Xi_b-/Xi_b-' bus - 5132/5312 << 896 // Xi_b0/Xi_b0' bus - 5232/5322 893 Baryon[0][2][4][0] = 5132; BaryonWeight << 897 Baryon[0][2][4][0] = 5132; BaryonWeight[0][2][4][0] *= 0.5; // Xi_b0 894 Baryon[0][4][2][0] = 5132; BaryonWeight 898 Baryon[0][4][2][0] = 5132; BaryonWeight[0][4][2][0] *= 0.5; 895 Baryon[2][0][4][0] = 5132; BaryonWeight 899 Baryon[2][0][4][0] = 5132; BaryonWeight[2][0][4][0] *= 0.5; 896 Baryon[2][4][0][0] = 5132; BaryonWeight 900 Baryon[2][4][0][0] = 5132; BaryonWeight[2][4][0][0] *= 0.5; 897 Baryon[4][0][2][0] = 5132; BaryonWeight 901 Baryon[4][0][2][0] = 5132; BaryonWeight[4][0][2][0] *= 0.5; 898 Baryon[4][2][0][0] = 5132; BaryonWeight 902 Baryon[4][2][0][0] = 5132; BaryonWeight[4][2][0][0] *= 0.5; 899 903 900 Baryon[0][2][4][2] = 5312; BaryonWeight << 904 Baryon[0][2][4][2] = 5312; BaryonWeight[0][2][4][2] = 0.5 * pspin_barion; // Xi_b0' 901 Baryon[0][4][2][2] = 5312; BaryonWeight 905 Baryon[0][4][2][2] = 5312; BaryonWeight[0][4][2][2] = 0.5 * pspin_barion; 902 Baryon[2][0][4][2] = 5312; BaryonWeight 906 Baryon[2][0][4][2] = 5312; BaryonWeight[2][0][4][2] = 0.5 * pspin_barion; 903 Baryon[2][4][0][2] = 5312; BaryonWeight 907 Baryon[2][4][0][2] = 5312; BaryonWeight[2][4][0][2] = 0.5 * pspin_barion; 904 Baryon[4][0][2][2] = 5312; BaryonWeight 908 Baryon[4][0][2][2] = 5312; BaryonWeight[4][0][2][2] = 0.5 * pspin_barion; 905 Baryon[4][2][0][2] = 5312; BaryonWeight 909 Baryon[4][2][0][2] = 5312; BaryonWeight[4][2][0][2] = 0.5 * pspin_barion; 906 910 907 for (G4int i=0; i<5; i++) 911 for (G4int i=0; i<5; i++) 908 { for (G4int j=0; j<5; j++) 912 { for (G4int j=0; j<5; j++) 909 { for (G4int k=0; k<5; k++) 913 { for (G4int k=0; k<5; k++) 910 { for (G4int l=0; l<4; l++) 914 { for (G4int l=0; l<4; l++) 911 { 915 { 912 G4ParticleDefinition * Te 916 G4ParticleDefinition * TestHadron= 913 G4ParticleTable::GetPar 917 G4ParticleTable::GetParticleTable()->FindParticle(Baryon[i][j][k][l]); 914 /* 918 /* 915 G4cout<<i<<" "<<j<<" "<<k 919 G4cout<<i<<" "<<j<<" "<<k<<" "<<l<<" "<<Baryon[i][j][k][l]<<" "<<TestHadron<<" "<<BaryonWeight[i][j][k][l]; 916 if (TestHadron != nullptr << 920 if (TestHadron != NULL) G4cout<<" "<<TestHadron->GetParticleName(); 917 if ((TestHadron == nullpt << 921 if ((TestHadron == NULL)&&(Baryon[i][j][k][l] != 0)) G4cout<<" *****"; 918 if ((TestHadron == nullpt << 922 if ((TestHadron == NULL)&&(Baryon[i][j][k][l] == 0)) G4cout<<" ---------------"; 919 G4cout<<G4endl; 923 G4cout<<G4endl; 920 */ 924 */ 921 if ((TestHadron == nullpt << 925 if ((TestHadron == NULL)&&(Baryon[i][j][k][l] != 0)) Baryon[i][j][k][l] = 0; 922 } 926 } 923 } 927 } 924 } 928 } 925 } 929 } 926 930 927 // --------- Probabilities of q-qbar pair 931 // --------- Probabilities of q-qbar pair productions for kink or gluons. 928 G4double ProbUUbar = 0.33; 932 G4double ProbUUbar = 0.33; 929 Prob_QQbar[0]=ProbUUbar; // Probab 933 Prob_QQbar[0]=ProbUUbar; // Probability of ddbar production 930 Prob_QQbar[1]=ProbUUbar; // Probab 934 Prob_QQbar[1]=ProbUUbar; // Probability of uubar production 931 Prob_QQbar[2]=1.0-2.*ProbUUbar; // Probab 935 Prob_QQbar[2]=1.0-2.*ProbUUbar; // Probability of ssbar production 932 Prob_QQbar[3]=0.0; // Probab 936 Prob_QQbar[3]=0.0; // Probability of ccbar production 933 Prob_QQbar[4]=0.0; // Probab 937 Prob_QQbar[4]=0.0; // Probability of bbbar production 934 938 935 for ( G4int i=0 ; i<350 ; i++ ) { // Must 939 for ( G4int i=0 ; i<350 ; i++ ) { // Must be checked 936 FS_LeftHadron[i] = 0; 940 FS_LeftHadron[i] = 0; 937 FS_RightHadron[i] = 0; 941 FS_RightHadron[i] = 0; 938 FS_Weight[i] = 0.0; 942 FS_Weight[i] = 0.0; 939 } 943 } 940 944 941 NumberOf_FS = 0; 945 NumberOf_FS = 0; 942 } 946 } 943 947 944 // ------------------------------------------- 948 // -------------------------------------------------------------- 945 949 946 void G4VLongitudinalStringDecay::SetMinimalStr 950 void G4VLongitudinalStringDecay::SetMinimalStringMass(const G4FragmentingString * const string) 947 { 951 { 948 //MaxMass = -350.0*GeV; 952 //MaxMass = -350.0*GeV; 949 G4double EstimatedMass=MaxMass; << 953 G4double EstimatedMass=0.; 950 954 951 G4ParticleDefinition* LeftParton = st << 952 G4ParticleDefinition* RightParton = st << 953 if( LeftParton->GetParticleSubType() = << 954 if( LeftParton->GetPDGEncoding() * R << 955 // Not allowed combination of the << 956 throw G4HadronicException(__FILE__ << 957 "G4VLongitudinalStringDecay::Set << 958 } << 959 } << 960 if( LeftParton->GetParticleSubType() ! << 961 if( LeftParton->GetPDGEncoding() * R << 962 // Not allowed combination of the << 963 throw G4HadronicException(__FILE__ << 964 "G4VLongitudinalStringDecay::Set << 965 } << 966 } << 967 << 968 G4int Qleft =std::abs(string->GetLeftP 955 G4int Qleft =std::abs(string->GetLeftParton()->GetPDGEncoding()); 969 G4int Qright=std::abs(string->GetRight 956 G4int Qright=std::abs(string->GetRightParton()->GetPDGEncoding()); 970 957 971 if ((Qleft < 6) && (Qright < 6)) { / 958 if ((Qleft < 6) && (Qright < 6)) { // Q-Qbar string 972 EstimatedMass=minMassQQbarStr[Qleft- 959 EstimatedMass=minMassQQbarStr[Qleft-1][Qright-1]; 973 MinimalStringMass=EstimatedMass; 960 MinimalStringMass=EstimatedMass; 974 SetMinimalStringMass2(EstimatedMass) 961 SetMinimalStringMass2(EstimatedMass); 975 return; 962 return; 976 } 963 } 977 964 978 if ((Qleft < 6) && (Qright > 1000)) { 965 if ((Qleft < 6) && (Qright > 1000)) { // Q - DiQ string 979 G4int q1=Qright/1000; 966 G4int q1=Qright/1000; 980 G4int q2=(Qright/100)%10; 967 G4int q2=(Qright/100)%10; 981 EstimatedMass=minMassQDiQStr[Qleft-1 968 EstimatedMass=minMassQDiQStr[Qleft-1][q1-1][q2-1]; 982 MinimalStringMass=EstimatedMass; 969 MinimalStringMass=EstimatedMass; // It can be negative! 983 SetMinimalStringMass2(EstimatedMass) 970 SetMinimalStringMass2(EstimatedMass); 984 return; 971 return; 985 } 972 } 986 973 987 if ((Qleft > 1000) && (Qright < 6)) { 974 if ((Qleft > 1000) && (Qright < 6)) { // DiQ - Q string 6 6 6 988 G4int q1=Qleft/1000; 975 G4int q1=Qleft/1000; 989 G4int q2=(Qleft/100)%10; 976 G4int q2=(Qleft/100)%10; 990 EstimatedMass=minMassQDiQStr[Qright- 977 EstimatedMass=minMassQDiQStr[Qright-1][q1-1][q2-1]; 991 MinimalStringMass=EstimatedMass; 978 MinimalStringMass=EstimatedMass; // It can be negative! 992 SetMinimalStringMass2(EstimatedMass) 979 SetMinimalStringMass2(EstimatedMass); 993 return; 980 return; 994 } 981 } 995 982 996 // DiQuark - Anti DiQuark string ----- 983 // DiQuark - Anti DiQuark string ----------------- 997 984 998 G4double StringM=string->Get4Momentum().mag( 985 G4double StringM=string->Get4Momentum().mag(); 999 986 1000 #ifdef debug_LUNDfragmentation 987 #ifdef debug_LUNDfragmentation 1001 // G4cout<<"MinStringMass// Input Str 988 // G4cout<<"MinStringMass// Input String mass "<<string->Get4Momentum().mag()<<" Qleft "<<Qleft<<G4endl; 1002 #endif 989 #endif 1003 990 1004 G4int q1= Qleft/1000 ; 991 G4int q1= Qleft/1000 ; 1005 G4int q2=(Qleft/100)%10 ; 992 G4int q2=(Qleft/100)%10 ; 1006 993 1007 G4int q3= Qright/1000 ; 994 G4int q3= Qright/1000 ; 1008 G4int q4=(Qright/100)%10; 995 G4int q4=(Qright/100)%10; 1009 996 1010 // -------------- 2 baryon production 997 // -------------- 2 baryon production or 2 mesons production -------- 1011 998 1012 G4double EstimatedMass1 = minMassQDiQ 999 G4double EstimatedMass1 = minMassQDiQStr[q1-1][q2-1][0]; 1013 G4double EstimatedMass2 = minMassQDiQ 1000 G4double EstimatedMass2 = minMassQDiQStr[q3-1][q4-1][0]; 1014 // Mass is negative if there is no co 1001 // Mass is negative if there is no corresponding particle. 1015 1002 1016 if ( (EstimatedMass1 > 0.) && (Estima 1003 if ( (EstimatedMass1 > 0.) && (EstimatedMass2 > 0.)) { 1017 EstimatedMass = EstimatedMass1 + E 1004 EstimatedMass = EstimatedMass1 + EstimatedMass2; 1018 if ( StringM > EstimatedMass ) { 1005 if ( StringM > EstimatedMass ) { // 2 baryon production is possible. 1019 MinimalStringMass=EstimatedMass 1006 MinimalStringMass=EstimatedMass1 + EstimatedMass2; 1020 SetMinimalStringMass2(Estimated 1007 SetMinimalStringMass2(EstimatedMass); 1021 return; 1008 return; 1022 } 1009 } 1023 } 1010 } 1024 1011 1025 if ( (EstimatedMass1 < 0.) && (Estima 1012 if ( (EstimatedMass1 < 0.) && (EstimatedMass2 > 0.)) { 1026 EstimatedMass = MaxMass; 1013 EstimatedMass = MaxMass; 1027 MinimalStringMass=EstimatedMass; 1014 MinimalStringMass=EstimatedMass; 1028 SetMinimalStringMass2(EstimatedMas 1015 SetMinimalStringMass2(EstimatedMass); 1029 return; 1016 return; 1030 } 1017 } 1031 1018 1032 if ( (EstimatedMass1 > 0.) && (Estima 1019 if ( (EstimatedMass1 > 0.) && (EstimatedMass2 < 0.)) { 1033 EstimatedMass = EstimatedMass1; 1020 EstimatedMass = EstimatedMass1; 1034 MinimalStringMass=EstimatedMass; 1021 MinimalStringMass=EstimatedMass; 1035 SetMinimalStringMass2(EstimatedMas 1022 SetMinimalStringMass2(EstimatedMass); 1036 return; 1023 return; 1037 } 1024 } 1038 1025 1039 // if ( EstimatedMass >= StringM 1026 // if ( EstimatedMass >= StringM ) { 1040 // ------------- Re-orangement ------ 1027 // ------------- Re-orangement --------------- 1041 EstimatedMass=std::min(minMassQQbarSt 1028 EstimatedMass=std::min(minMassQQbarStr[q1-1][q3-1] + minMassQQbarStr[q2-1][q4-1], 1042 minMassQQbarSt 1029 minMassQQbarStr[q1-1][q4-1] + minMassQQbarStr[q2-1][q3-1]); 1043 1030 1044 // In principle, re-arrangement and 2 << 1031 // In principle, re-orangement and 2 baryon production can compite. 1045 // More physics consideration is need 1032 // More physics consideration is needed. 1046 1033 1047 MinimalStringMass=EstimatedMass; 1034 MinimalStringMass=EstimatedMass; 1048 SetMinimalStringMass2(EstimatedMass); 1035 SetMinimalStringMass2(EstimatedMass); 1049 1036 1050 return; 1037 return; 1051 } 1038 } 1052 1039 1053 //------------------------------------------- 1040 //-------------------------------------------------------------------------------------- 1054 1041 1055 void G4VLongitudinalStringDecay::SetMinimalSt 1042 void G4VLongitudinalStringDecay::SetMinimalStringMass2(const G4double aValue) 1056 { 1043 { 1057 MinimalStringMass2=aValue * aValue; 1044 MinimalStringMass2=aValue * aValue; 1058 } 1045 } 1059 1046 1060 1047