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 // INCL++ intra-nuclear cascade model 27 // Alain Boudard, CEA-Saclay, France 28 // Joseph Cugnon, University of Liege, Belgium 29 // Jean-Christophe David, CEA-Saclay, France 30 // Pekka Kaitaniemi, CEA-Saclay, France, and H 31 // Sylvie Leray, CEA-Saclay, France 32 // Davide Mancusi, CEA-Saclay, France 33 // 34 #define INCLXX_IN_GEANT4_MODE 1 35 36 #include "globals.hh" 37 38 /* 39 * G4INCLParticleSpecies.cc 40 * 41 * \date Nov 25, 2011 42 * \author Davide Mancusi 43 */ 44 45 #include "G4INCLParticleSpecies.hh" 46 #include "G4INCLParticleTable.hh" 47 #include <algorithm> 48 #include <cctype> 49 #include <sstream> 50 #include <algorithm> 51 52 namespace G4INCL { 53 54 ParticleSpecies::ParticleSpecies(std::string 55 // Normalise the string to lower case 56 if(pS=="p" || pS=="proton") { 57 theA = 1; 58 theZ = 1; 59 theS = 0; 60 theType = G4INCL::Proton; 61 } else if(pS=="n" || pS=="neutron") { 62 theA = 1; 63 theZ = 0; 64 theS = 0; 65 theType = G4INCL::Neutron; 66 } else if(pS=="delta++" || pS=="deltaplusp 67 theA = 1; 68 theZ = 2; 69 theS = 0; 70 theType = G4INCL::DeltaPlusPlus; 71 } else if(pS=="delta+" || pS=="deltaplus") 72 theA = 1; 73 theZ = 1; 74 theS = 0; 75 theType = G4INCL::DeltaPlus; 76 } else if(pS=="delta0" || pS=="deltazero") 77 theA = 1; 78 theZ = 0; 79 theS = 0; 80 theType = G4INCL::DeltaZero; 81 } else if(pS=="delta-" || pS=="deltaminus" 82 theA = 1; 83 theZ = -1; 84 theS = 0; 85 theType = G4INCL::DeltaMinus; 86 } else if(pS=="pi+" || pS=="pion+" || pS== 87 theA = 0; 88 theZ = 1; 89 theS = 0; 90 theType = G4INCL::PiPlus; 91 } else if(pS=="pi0" || pS=="pion0" || pS== 92 theA = 0; 93 theZ = 0; 94 theS = 0; 95 theType = G4INCL::PiZero; 96 } else if(pS=="pi-" || pS=="pion-" || pS== 97 theA = 0; 98 theZ = -1; 99 theS = 0; 100 theType = G4INCL::PiMinus; 101 } else if(pS=="lambda" || pS=="l" || pS==" 102 theA = 1; 103 theZ = 0; 104 theS = -1; 105 theType = G4INCL::Lambda; 106 } else if(pS=="s+" || pS=="sigma+" || pS== 107 theA = 1; 108 theZ = 1; 109 theS = -1; 110 theType = G4INCL::SigmaPlus; 111 } else if(pS=="s0" || pS=="sigma0" || pS== 112 theA = 1; 113 theZ = 0; 114 theS = -1; 115 theType = G4INCL::SigmaZero; 116 } else if(pS=="s-" || pS=="sigma-" || pS== 117 theA = 1; 118 theZ = -1; 119 theS = -1; 120 theType = G4INCL::SigmaMinus; 121 } else if(pS=="xi-" || pS=="x-") { 122 theA = 1; 123 theZ = -1; 124 theS = -2; 125 theType = G4INCL::XiMinus; 126 } else if(pS=="xi0" || pS=="x0") { 127 theA = 1; 128 theZ = 0; 129 theS = -2; 130 theType = G4INCL::XiZero; 131 } else if(pS=="pb" || pS=="antiproton") { 132 theA = -1; 133 theZ = -1; 134 theS = 0; 135 theType = G4INCL::antiProton; 136 } else if(pS=="nb" || pS=="antineutron") { 137 theA = -1; 138 theZ = 0; 139 theS = 0; 140 theType = G4INCL::antiNeutron; 141 } else if(pS=="s+b" || pS=="antisigma+" || 142 theA = -1; 143 theZ = -1; 144 theS = 1; 145 theType = G4INCL::antiSigmaPlus; 146 } else if(pS=="s0b" || pS=="antisigma0" || 147 theA = -1; 148 theZ = 0; 149 theS = 1; 150 theType = G4INCL::antiSigmaZero; 151 } else if(pS=="s-b" || pS=="antisigma-" || 152 theA = -1; 153 theZ = 1; 154 theS = 1; 155 theType = G4INCL::antiSigmaMinus; 156 } else if(pS=="antilambda" || pS=="lb" || 157 theA = -1; 158 theZ = 0; 159 theS = 1; 160 theType = G4INCL::antiLambda; 161 } else if(pS=="antixi-" || pS=="x-b") { 162 theA = -1; 163 theZ = 1; 164 theS = 2; 165 theType = G4INCL::antiXiMinus; 166 } else if(pS=="antixi0" || pS=="x0b") { 167 theA = -1; 168 theZ = 0; 169 theS = 2; 170 theType = G4INCL::antiXiZero; 171 } else if(pS=="k+" || pS=="kaon+" || pS==" 172 theA = 0; 173 theZ = 1; 174 theS = 1; 175 theType = G4INCL::KPlus; 176 } else if(pS=="k0" || pS=="kaon0" || pS==" 177 theA = 0; 178 theZ = 0; 179 theS = 1; 180 theType = G4INCL::KZero; 181 } else if(pS=="k0b" || pS=="kzb" || pS=="k 182 theA = 0; 183 theZ = 0; 184 theS = -1; 185 theType = G4INCL::KZeroBar; 186 } else if(pS=="k-" || pS=="kaon-" || pS==" 187 theA = 0; 188 theZ = -1; 189 theS = -1; 190 theType = G4INCL::KMinus; 191 } else if(pS=="k0s" || pS=="kshort" || pS= 192 theA = 0; 193 theZ = 0; 194 // theS not defined 195 theType = G4INCL::KShort; 196 } else if(pS=="k0l" || pS=="klong" || pS== 197 theA = 0; 198 theZ = 0; 199 // theS not defined 200 theType = G4INCL::KLong; 201 } else if(pS=="d" || pS=="deuteron") { 202 theA = 2; 203 theZ = 1; 204 theS = 0; 205 theType = G4INCL::Composite; 206 } else if(pS=="t" || pS=="triton") { 207 theA = 3; 208 theZ = 1; 209 theS = 0; 210 theType = G4INCL::Composite; 211 } else if(pS=="a" || pS=="alpha") { 212 theA = 4; 213 theZ = 2; 214 theS = 0; 215 theType = G4INCL::Composite; 216 } else if(pS=="eta") { 217 theA = 0; 218 theZ = 0; 219 theS = 0; 220 theType = G4INCL::Eta; 221 } else if(pS=="omega") { 222 theA = 0; 223 theZ = 0; 224 theS = 0; 225 theType = G4INCL::Omega; 226 } else if(pS=="etaprime" || pS=="etap") { 227 theA = 0; 228 theZ = 0; 229 theS = 0; 230 theType = G4INCL::EtaPrime; 231 } else if(pS=="photon") { 232 theA = 0; 233 theZ = 0; 234 theS = 0; 235 theType = G4INCL::Photon; 236 } else 237 parseNuclide(pS); 238 } 239 240 ParticleSpecies::ParticleSpecies(ParticleTyp 241 theType(t), 242 theA(ParticleTable::getMassNumber(theType) 243 theZ(ParticleTable::getChargeNumber(theTyp 244 theS(ParticleTable::getStrangenessNumber(t 245 {} 246 247 ParticleSpecies::ParticleSpecies(const G4int 248 theType(Composite), 249 theA(A), 250 theZ(Z), 251 theS(0) 252 {} 253 254 ParticleSpecies::ParticleSpecies(const G4int 255 theType(Composite), 256 theA(A), 257 theZ(Z), 258 theS(S) 259 {} 260 261 void ParticleSpecies::parseNuclide(std::stri 262 theType = Composite; 263 theS = 0; // no hypernuclei projectile or 264 265 // Allowed characters 266 const std::string separators("-_"); 267 std::string allowed("0123456789abcdefghijk 268 allowed += separators; 269 270 // There must be at least one character 271 if(pS.find_first_not_of(allowed)!=std::str 272 // Malformed input string 273 // Setting unknown particle species 274 (*this) = ParticleSpecies(UnknownParticl 275 return; 276 } 277 if(pS.size()<1) { 278 // Malformed input string 279 // Setting unknown particle species 280 (*this) = ParticleSpecies(UnknownParticl 281 return; 282 } 283 284 std::size_t firstSeparator = pS.find_first 285 std::size_t lastSeparator = pS.find_last_o 286 if(firstSeparator!=std::string::npos && fi 287 // Several separators in malformed input 288 // Setting unknown particle species 289 (*this) = ParticleSpecies(UnknownParticl 290 return; 291 } 292 293 // Identify the type of the first characte 294 G4int (*predicate)(G4int); 295 G4bool startsWithAlpha = std::isalpha(pS.a 296 if(startsWithAlpha) { 297 predicate=std::isdigit; 298 } else if(std::isdigit(pS.at(0))) { 299 predicate=std::isalpha; 300 } else { 301 // Non-alphanumeric character in string 302 // Setting unknown particle species 303 (*this) = ParticleSpecies(UnknownParticl 304 return; 305 } 306 307 G4bool hasIsotope = true; 308 size_t endFirstSection, beginSecondSection 309 if(firstSeparator==std::string::npos) { 310 // No separator, Fe56 or 56Fe style 311 // Identify the end of the first section 312 313 // Find the first character that is not 314 beginSecondSection = std::find_if(pS.beg 315 316 if(beginSecondSection>=pS.size()) { 317 if(startsWithAlpha) { 318 // Only alphabetic characters are pr 319 hasIsotope = false; 320 } else { 321 // Only numeric characters in the st 322 // Setting unknown particle species 323 (*this) = ParticleSpecies(UnknownPar 324 return; 325 } 326 } 327 328 endFirstSection = beginSecondSection; 329 330 } else { 331 // One separator, Fe-56 or 56-Fe style o 332 endFirstSection = firstSeparator; 333 beginSecondSection = firstSeparator+1; 334 } 335 336 std::string firstSection(pS.substr(0,endFi 337 std::string secondSection(pS.substr(beginS 338 std::stringstream parsingStream; 339 340 if(std::isalpha(firstSection.at(0)) && std 341 std::stringstream parseStrangeness; 342 parseStrangeness.str(secondSection); 343 parseStrangeness >> theS; 344 if(parsingStream.fail()) { 345 // Couldn't parse the strange charge s 346 // Setting unknown particle species 347 (*this) = ParticleSpecies(UnknownParti 348 return; 349 } 350 theS *= (-1); 351 beginSecondSection = std::find_if(pS.beg 352 firstSection = pS.substr(0, beginSecondS 353 secondSection = pS.substr(beginSecondSec 354 } 355 356 // Parse the sections 357 G4bool success; 358 if(startsWithAlpha) { 359 parsingStream.str(secondSection); 360 success = parseElement(firstSection); 361 } else { 362 parsingStream.str(firstSection); 363 success = parseElement(secondSection); 364 } 365 if(!success) { 366 // Couldn't parse the element section 367 // Setting unknown particle species 368 (*this) = ParticleSpecies(UnknownParticl 369 return; 370 } 371 372 if(hasIsotope) { 373 parsingStream >> theA; 374 if(parsingStream.fail()) { 375 // Couldn't parse the mass section 376 // Setting unknown particle species 377 (*this) = ParticleSpecies(UnknownParti 378 return; 379 } 380 } else 381 theA = 0; 382 383 // Check that Z<=A 384 if(theZ>theA && hasIsotope) { 385 // Setting unknown particle species 386 (*this) = ParticleSpecies(UnknownParticl 387 return; 388 } 389 390 // Special particle type for protons 391 if(theZ==1 && theA==1) 392 theType = Proton; 393 } 394 395 G4bool ParticleSpecies::parseElement(std::st 396 theZ = ParticleTable::parseElement(s); 397 398 if(theZ<0) 399 theZ = ParticleTable::parseIUPACElement( 400 401 if(theZ<0) 402 return false; 403 else 404 return true; 405 } 406 407 G4bool ParticleSpecies::parseIUPACElement(st 408 theZ = ParticleTable::parseIUPACElement(s) 409 if(theZ==0) 410 return false; 411 else 412 return true; 413 } 414 415 G4int ParticleSpecies::getPDGCode() const { 416 switch (theType) { 417 case Proton: 418 return 2212; 419 break; 420 case Neutron: 421 return 2112; 422 break; 423 case DeltaPlusPlus: 424 return 2224; 425 break; 426 case DeltaPlus: 427 return 2214; 428 break; 429 case DeltaZero: 430 return 2114; 431 break; 432 case DeltaMinus: 433 return 1114; 434 break; 435 case PiPlus: 436 return 211; 437 break; 438 case PiZero: 439 return 111; 440 break; 441 case PiMinus: 442 return -211; 443 break; 444 case Eta: 445 return 221; 446 break; 447 case Omega: 448 return 223; 449 break; 450 case EtaPrime: 451 return 331; 452 break; 453 case Photon: 454 return 22; 455 break; 456 case Lambda: 457 return 3122; 458 break; 459 case SigmaPlus: 460 return 3222; 461 break; 462 case SigmaZero: 463 return 3212; 464 break; 465 case SigmaMinus: 466 return 3112; 467 break; 468 case antiProton: 469 return -2212; 470 break; 471 case XiMinus: 472 return 3312; 473 break; 474 case XiZero: 475 return 3322; 476 break; 477 case antiNeutron: 478 return -2112; 479 break; 480 case antiLambda: 481 return -3122; 482 break; 483 case antiSigmaPlus: 484 return -3222; 485 break; 486 case antiSigmaZero: 487 return -3212; 488 break; 489 case antiSigmaMinus: 490 return -3112; 491 break; 492 case antiXiMinus: 493 return -3312; 494 break; 495 case antiXiZero: 496 return -3322; 497 break; 498 case KPlus: 499 return 321; 500 break; 501 case KZero: 502 return 311; 503 break; 504 case KZeroBar: 505 return -311; 506 break; 507 case KShort: 508 return 310; 509 break; 510 case KLong: 511 return 130; 512 break; 513 case KMinus: 514 return -321; 515 break; 516 case Composite: 517 if(theA == 1 && theZ == 1 && theS == 0) 518 else if(theA == 1 && theZ == 0 && theS = 519 else if(theA == 1 && theZ == 0 && theS = 520 else return theA+theZ*1000-theS*1e6; // 521 break; 522 default: 523 INCL_ERROR("ParticleSpecies::getPDGCode: 524 return 0; 525 break; 526 } 527 } 528 } 529 530