From 311a17dbc7ab35ff544ddb10b54e2b1235b6cc7b Mon Sep 17 00:00:00 2001 From: AAAlvesJr <aalvesju@gmail.com> Date: Fri, 17 Apr 2020 04:50:26 +0200 Subject: [PATCH] g# This is a combination of 3 commits. initial refactory Refactoring corsika/core corsica/framework/geometry ... refactory: corsika/framework/sequence refactorying... header.h -> header.hpp + other refacorying... ... refactory media directory... refactory: corsika/processes ... refactoring... testing... Sibyll headers... Pythia headers... module sub-dir some floating cc files around eliminate relative include paths on top directories fixing include file paths, remove quotes from include directives, fix remaining include guards and correct file names ... unit tests: fixing include file paths, remove quotes from include directives, fix remaining include guards and correct file names ... corsika/detail inclusion corsika/detail changes corsika::secondary_namespaces supressed in favor of detail more include guards, relative file path, etc ... nested class promotion to corsika::detail Inteface to Pythia one more relative path... eliminating files... dependencies managment... ... dependencies refactory adding corsika/modules and catch2 build scripts for UrQMD make modules compile cmake first working vesion of new fwk need to generate some header files build scripts for dependencies sibyll works now proper file endings in many places --- CMakeLists.txt | 279 +- COAST/CMakeLists.txt | 66 - COAST/COASTProcess.cc | 43 - COAST/COASTProcess.h | 41 - COAST/COASTStack.h | 187 - COAST/COASTUserLib.cc | 107 - COAST/ParticleConversion.cc | 35 - COAST/ParticleConversion.h | 209 - COAST/README.md | 65 - CONTRIBUTING.md | 30 +- Documentation/CMakeLists.txt | 3 - Documentation/Doxygen/CMakeLists.txt | 33 - Documentation/Examples/stack_example.cc | 59 - Environment/CMakeLists.txt | 116 - Environment/Environment.h | 61 - Environment/FlatExponential.h | 66 - Environment/HomogeneousMedium.h | 60 - Environment/LinearApproximationIntegrator.h | 50 - Environment/NuclearComposition.h | 148 - Environment/SlidingPlanarExponential.h | 72 - Environment/VolumeTreeNode.h | 134 - FIXME.md | 5129 ++++ Framework/CMakeLists.txt | 18 - Framework/Cascade/CMakeLists.txt | 55 - Framework/Cascade/Cascade.dox | 8 - Framework/Cascade/Cascade.h | 395 - Framework/Cascade/testCascade.h | 45 - Framework/Geometry/BaseTrajectory.h | 59 - Framework/Geometry/BaseVector.h | 34 - Framework/Geometry/CMakeLists.txt | 78 - Framework/Geometry/CoordinateSystem.h | 129 - Framework/Geometry/FourVector.h | 214 - Framework/Geometry/Helix.h | 76 - Framework/Geometry/Line.h | 64 - Framework/Geometry/Point.h | 74 - Framework/Geometry/QuantityVector.h | 138 - Framework/Geometry/Sphere.h | 36 - Framework/Geometry/Trajectory.h | 261 - Framework/Geometry/Vector.h | 181 - Framework/Logging/CMakeLists.txt | 51 - Framework/Particles/CMakeLists.txt | 93 - Framework/Particles/particles.dox | 15 - Framework/ProcessSequence/CMakeLists.txt | 82 - Framework/ProcessSequence/ProcessSequence.h | 396 - Framework/Random/CMakeLists.txt | 53 - Framework/Random/RNGManager.cc | 64 - Framework/StackInterface/CMakeLists.txt | 51 - Framework/StackInterface/Stack.dox | 20 - Framework/Testing/CMakeLists.txt | 52 - Framework/Units/CMakeLists.txt | 23 - Framework/Utilities/CMakeLists.txt | 118 - Framework/Utilities/COMBoost.h | 99 - Processes/CMakeLists.txt | 51 - Processes/EnergyLoss/CMakeLists.txt | 63 - Processes/EnergyLoss/EnergyLoss.cc | 279 - Processes/EnergyLoss/Properties8.dat | 2907 --- Processes/EnergyLoss/ReadData.py | 73 - Processes/EnergyLoss/SummaryPropTable.dat | 138 - Processes/HadronicElasticModel/CMakeLists.txt | 61 - .../HadronicElasticModel.cc | 194 - Processes/NullModel/CMakeLists.txt | 60 - Processes/ObservationPlane/CMakeLists.txt | 44 - Processes/ParticleCut/CMakeLists.txt | 66 - Processes/QGSJetII/CMakeLists.txt | 107 - Processes/Sibyll/CMakeLists.txt | 111 - Processes/Sibyll/Interaction.h | 70 - Processes/StackInspector/CMakeLists.txt | 61 - .../StackInspector/testStackInspector.cc | 49 - Processes/SwitchProcess/CMakeLists.txt | 40 - Processes/TrackWriter/CMakeLists.txt | 61 - Processes/TrackingLine/CMakeLists.txt | 37 - .../TrackingLine/testTrackingLineStack.h | 39 - Processes/UrQMD/CMakeLists.txt | 96 - Setup/CMakeLists.txt | 39 - Setup/SetupEnvironment.h | 79 - Setup/SetupStack.h | 173 - Stack/CMakeLists.txt | 5 - Stack/DummyStack/CMakeLists.txt | 37 - Stack/NuclearStackExtension/CMakeLists.txt | 42 - .../testNuclearStackExtension.cc | 258 - Stack/SuperStupidStack/CMakeLists.txt | 39 - .../SuperStupidStack/testSuperStupidStack.cc | 63 - ThirdParty/.gitignore | 1 - ThirdParty/CMakeLists.txt | 292 - ThirdParty/ThirdParty.dox | 70 - ThirdParty/eigen-eigen-b3f3d4950030.tar.bz2 | Bin 1663467 -> 0 bytes ThirdParty/lcov/.version | 3 - ThirdParty/lcov/CHANGES | 3454 --- ThirdParty/lcov/CONTRIBUTING | 93 - ThirdParty/lcov/COPYING | 339 - ThirdParty/lcov/Makefile | 122 - ThirdParty/lcov/README | 135 - ThirdParty/lcov/bin/copy_dates.sh | 36 - ThirdParty/lcov/bin/gendesc | 226 - ThirdParty/lcov/bin/genhtml | 5974 ----- ThirdParty/lcov/bin/geninfo | 4014 --- ThirdParty/lcov/bin/genpng | 389 - ThirdParty/lcov/bin/get_changes.sh | 13 - ThirdParty/lcov/bin/get_version.sh | 34 - ThirdParty/lcov/bin/install.sh | 76 - ThirdParty/lcov/bin/lcov | 4329 ---- ThirdParty/lcov/bin/updateversion.pl | 194 - ThirdParty/lcov/example/Makefile | 98 - ThirdParty/lcov/example/README | 6 - ThirdParty/lcov/example/descriptions.txt | 10 - ThirdParty/lcov/example/example.c | 60 - ThirdParty/lcov/example/gauss.h | 6 - ThirdParty/lcov/example/iterate.h | 6 - ThirdParty/lcov/example/methods/gauss.c | 48 - ThirdParty/lcov/example/methods/iterate.c | 45 - ThirdParty/lcov/lcovrc | 169 - ThirdParty/lcov/man/gendesc.1 | 78 - ThirdParty/lcov/man/genhtml.1 | 600 - ThirdParty/lcov/man/geninfo.1 | 578 - ThirdParty/lcov/man/genpng.1 | 101 - ThirdParty/lcov/man/lcov.1 | 930 - ThirdParty/lcov/man/lcovrc.5 | 913 - ThirdParty/lcov/rpm/lcov.spec | 59 - ThirdParty/lcov/test/Makefile | 27 - ThirdParty/lcov/test/bin/common | 103 - ThirdParty/lcov/test/bin/mkinfo | 952 - ThirdParty/lcov/test/bin/norminfo | 243 - ThirdParty/lcov/test/bin/test_run | 99 - ThirdParty/lcov/test/bin/test_skip | 19 - ThirdParty/lcov/test/bin/testsuite_exit | 71 - ThirdParty/lcov/test/bin/testsuite_init | 28 - ThirdParty/lcov/test/common.mak | 50 - ThirdParty/lcov/test/genhtml_output/Makefile | 31 - .../lcov/test/genhtml_output/genhtml_test | 36 - ThirdParty/lcov/test/lcov_add_files/Makefile | 47 - ThirdParty/lcov/test/lcov_add_files/add_test | 46 - ThirdParty/lcov/test/lcov_diff/Makefile | 9 - ThirdParty/lcov/test/lcov_diff/diff_test | 35 - ThirdParty/lcov/test/lcov_diff/new/Makefile | 17 - ThirdParty/lcov/test/lcov_diff/new/prog.c | 41 - ThirdParty/lcov/test/lcov_diff/old/Makefile | 17 - ThirdParty/lcov/test/lcov_diff/old/prog.c | 22 - ThirdParty/lcov/test/lcov_misc/Makefile | 5 - ThirdParty/lcov/test/lcov_summary/Makefile | 41 - .../lcov/test/lcov_summary/check_counts | 70 - ThirdParty/lcov/test/lcovrc | 4 - ThirdParty/lcov/test/profiles/large | 51 - ThirdParty/lcov/test/profiles/medium | 51 - ThirdParty/lcov/test/profiles/small | 51 - Tools/CMakeLists.txt | 6 - {CMakeModules => cmake}/CodeCoverage | 0 {CMakeModules => cmake}/CodeCoverage.cmake | 0 .../CorsikaUtilities.cmake | 0 cmake/FindCORSIKA.cmake | 6 + cmake/FindCORSIKA8.cmake | 9 + cmake/FindCatch2.cmake | 8 + cmake/FindCorsika8.cmake | 63 + cmake/FindEigen3.cmake | 107 + cmake/FindPhysUnits.cmake | 8 + {CMakeModules => cmake}/FindPythia8.cmake | 0 corsika/corsika.hpp | 0 corsika/detail/framework/core/Cascade.inl | 262 + .../detail/framework/geometry/BaseVector.inl | 26 + .../framework/geometry/CoordinateSystem.inl | 152 + .../detail/framework/geometry/FourVector.inl | 189 + corsika/detail/framework/geometry/Helix.inl | 51 + corsika/detail/framework/geometry/Line.inl | 54 + corsika/detail/framework/geometry/Plane.inl | 42 + corsika/detail/framework/geometry/Point.inl | 82 + .../framework/geometry/QuantityVector.inl | 152 + corsika/detail/framework/geometry/Sphere.inl | 36 + .../detail/framework/geometry/Trajectory.inl | 61 + corsika/detail/framework/geometry/Vector.inl | 195 + .../detail/framework/random/RNGManager.inl | 59 + .../framework/sequence/ProcessSequence.inl | 258 + .../detail/framework/stack/CombinedStack.inl | 119 + .../detail/framework/stack/SecondaryView.inl | 80 + corsika/detail/framework/utility/COMBoost.inl | 126 + .../framework/utility/CorsikaFenvFallback.inl | 20 + .../framework/utility/CorsikaFenvOSX.inl | 2 +- corsika/detail/media/BaseExponential.inl | 63 + corsika/detail/media/Environment.inl | 39 + corsika/detail/media/FlatExponential.inl | 41 + .../LayeredSphericalAtmosphereBuilder.inl | 87 + .../media/LinearApproximationIntegrator.inl | 57 + .../detail/media/SlidingPlanarExponential.inl | 38 + corsika/detail/media/Universe.inl | 31 + corsika/detail/media/VolumeTreeNode.inl | 92 + corsika/detail/modules/sibyll/Decay.inl | 163 + corsika/detail/modules/sibyll/Interaction.inl | 365 + .../modules/sibyll/NuclearInteraction.inl | 600 + .../modules/sibyll/ParticleConversion.inl | 26 + corsika/framework/CMakeLists.txt | 21 + corsika/framework/core/CMakeLists.txt | 18 + corsika/framework/core/Cascade.hpp | 125 + .../framework/core}/NuclearData.xml | 0 .../framework/core}/ParticleClassNames.xml | 0 corsika/framework/core/ParticleData.xml | 9721 ++++++++ .../framework/core/ParticleProperties.hpp | 65 +- .../framework/core/PhysicalConstants.hpp | 1 + .../framework/core/PhysicalUnits.hpp | 3 +- .../core/detail}/ParticleProperties.cc | 0 corsika/framework/core/pdxml_reader.py | 516 + corsika/framework/geometry/BaseVector.hpp | 49 + .../framework/geometry/CoordinateSystem.hpp | 90 + corsika/framework/geometry/FourVector.hpp | 207 + corsika/framework/geometry/Helix.hpp | 66 + corsika/framework/geometry/Line.hpp | 56 + .../framework/geometry/Plane.hpp | 30 +- corsika/framework/geometry/Point.hpp | 66 + corsika/framework/geometry/QuantityVector.hpp | 100 + .../geometry/RootCoordinateSystem.hpp | 24 +- corsika/framework/geometry/Sphere.hpp | 36 + corsika/framework/geometry/Trajectory.hpp | 111 + corsika/framework/geometry/Vector.hpp | 117 + .../framework/geometry/Volume.hpp | 7 +- .../geometry/detail}/CoordinateSystem.cc | 0 corsika/framework/logging/BufferedSink.h | 80 + corsika/framework/logging/Logger.h | 90 + corsika/framework/logging/MessageOff.h | 30 + corsika/framework/logging/MessageOn.h | 70 + corsika/framework/logging/NoSink.h | 26 + corsika/framework/logging/Sink.h | 47 + .../random/ExponentialDistribution.hpp | 11 +- .../framework/random/RNGManager.hpp | 24 +- .../random/UniformRealDistribution.hpp | 11 +- .../framework/sequence/BaseProcess.hpp | 12 +- .../sequence/BoundaryCrossingProcess.hpp | 18 +- .../framework/sequence/ContinuousProcess.hpp | 14 +- .../framework/sequence/DecayProcess.hpp | 11 +- .../framework/sequence/InteractionProcess.hpp | 16 +- .../framework/sequence/ProcessReturn.hpp | 19 +- .../framework/sequence/ProcessSequence.hpp | 175 + .../framework/sequence/ProcessSignature.hpp | 1 + .../framework/sequence/SecondariesProcess.hpp | 14 +- .../framework/sequence/StackProcess.hpp | 13 +- .../framework/stack/CombinedStack.hpp | 95 +- .../framework/stack/ParticleBase.hpp | 6 +- .../framework/stack/SecondaryView.hpp | 110 +- .../framework/stack/Stack.hpp | 51 +- .../stack/StackIteratorInterface.hpp | 34 +- .../framework/utility/Bit.hpp | 5 +- corsika/framework/utility/COMBoost.hpp | 52 + .../framework/utility/CorsikaFenv.hpp | 0 .../framework/utility/MetaProgramming.hpp | 15 +- .../framework/utility/Singleton.hpp | 7 +- .../framework/utility/detail}/COMBoost.cc | 0 corsika/framework/utility/detail/COMBoost.inl | 125 + .../utility/detail}/CorsikaFenvDefault.cc | 0 .../utility/detail/CorsikaFenvFallback.inl | 2 +- .../framework/utility/sgn.hpp | 5 +- .../media/BaseExponential.hpp | 78 +- .../media/DensityFunction.hpp | 21 +- corsika/media/Environment.hpp | 60 + corsika/media/FlatExponential.hpp | 51 + corsika/media/HomogeneousMedium.hpp | 70 + .../media/IMediumModel.hpp | 26 +- .../media/InhomogeneousMedium.hpp | 58 +- .../LayeredSphericalAtmosphereBuilder.hpp | 103 +- .../media/LinearApproximationIntegrator.hpp | 38 + .../media/NameModel.hpp | 2 +- corsika/media/NuclearComposition.hpp | 145 + corsika/media/SlidingPlanarExponential.hpp | 62 + corsika/media/Universe.hpp | 26 + corsika/media/VolumeTreeNode.hpp | 98 + .../modules}/Sibyll/Decay.cc | 23 +- .../modules}/Sibyll/Interaction.cc | 28 +- .../modules}/Sibyll/NuclearInteraction.cc | 116 +- .../modules}/Sibyll/ParticleConversion.cc | 4 +- .../modules}/Sibyll/code_generator.py | 4 +- .../modules}/Sibyll/sibyll_codes.dat | 0 .../modules}/Sibyll/testSibyll.cc | 85 +- corsika/modules/UrQMD/UrQMD.cc | 385 + corsika/modules/UrQMD/UrQMD.h | 148 + .../modules}/UrQMD/testUrQMD.cc | 100 +- .../modules}/UrQMD/urqmdInterface.F | 0 corsika/modules/sibyll/CMakeLists.txt | 22 + corsika/modules/sibyll/Decay.hpp | 86 + corsika/modules/sibyll/Interaction.hpp | 92 + .../modules/sibyll/NuclearInteraction.hpp | 35 +- corsika/modules/sibyll/ParticleConversion.hpp | 70 + corsika/modules/sibyll/Random.hpp | 22 + corsika/modules/sibyll/SibStack.hpp | 147 + corsika/modules/sibyll/code_generator.py | 136 + corsika/modules/sibyll/sibyll_codes.dat | 132 + .../process/EnergyLoss.hpp | 33 +- .../process/HadronicElasticModel.hpp | 25 +- .../process/ObservationPlane.hpp | 29 +- .../process/ParticleCut.hpp | 24 +- corsika/process/Pythia/Decay.hpp | 58 + .../process/Pythia/Interaction.hpp | 38 +- corsika/process/Pythia/Random.hpp | 30 + corsika/process/QGSJetII/Interaction.hpp | 63 + .../process/QGSJetII/ParticleConversion.hpp | 88 + .../QGSJetII/QGSJetIIFragmentsStack.hpp | 76 + corsika/process/QGSJetII/QGSJetIIStack.hpp | 129 + .../process}/QGSJetII/qgsjet-II-04.h | 0 .../process/Sibyll/Decay.hpp | 30 +- corsika/process/Sibyll/Interaction.hpp | 93 + corsika/process/Sibyll/NuclearInteraction.hpp | 79 + .../process}/Sibyll/ParticleConversion.h | 26 +- .../process/Sibyll/SibStack.hpp | 40 +- .../process/StackInspector.hpp | 15 +- .../process/SwitchProcess.hpp | 13 +- .../process/TrackWriter.hpp | 13 +- corsika/process/detail/EnergyLoss.cc | 303 + .../process/detail/HadronicElasticModel.cc | 122 + .../process/detail}/ObservationPlane.cc | 10 +- .../process/detail}/ParticleCut.cc | 68 +- .../process/detail}/Pythia/Decay.cc | 23 +- .../process/detail}/Pythia/Interaction.cc | 36 +- .../process/detail}/Pythia/Random.cc | 4 +- .../process/detail}/QGSJetII/Interaction.cc | 60 +- .../detail}/QGSJetII/ParticleConversion.cc | 4 +- .../process/detail}/QGSJetII/qgsjet-II-04.cc | 6 +- .../process/detail}/StackInspector.cc | 18 +- .../process/detail}/TrackWriter.cc | 19 +- corsika/setup/SetupEnvironment.hpp | 19 + .../setup/SetupLogger.hpp | 10 +- corsika/setup/SetupStack.hpp | 204 + .../setup/SetupTrajectory.hpp | 28 +- .../DummyStack => corsika/stack}/DummyStack.h | 11 +- .../stack}/NuclearStackExtension.h | 108 +- .../stack}/SuperStupidStack.h | 100 +- dependencies/CMakeLists.txt | 32 + .../Pythia/CMakeLists.txt | 2 +- dependencies/Pythia/Decay.cc | 262 + {Processes => dependencies}/Pythia/Decay.h | 39 +- dependencies/Pythia/Interaction.cc | 389 + dependencies/Pythia/Interaction.h | 66 + dependencies/Pythia/Random.cc | 15 + {Processes => dependencies}/Pythia/Random.h | 2 +- dependencies/Pythia/testPythia8.cc | 185 + dependencies/QGSJetII/CMakeLists.txt | 21 + dependencies/QGSJetII/Interaction.cc | 403 + .../QGSJetII/Interaction.h | 27 +- dependencies/QGSJetII/ParticleConversion.cc | 12 + .../QGSJetII/ParticleConversion.h | 31 +- .../QGSJetII/QGSJetIIFragmentsStack.h | 10 +- .../QGSJetII/QGSJetIIStack.h | 20 +- dependencies/QGSJetII/code_generator.py | 203 + dependencies/QGSJetII/qgsjet-II-04-codes.dat | 44 + dependencies/QGSJetII/qgsjet-II-04.cc | 33 + .../QGSJetII/qgsjet-II-04.f | 0 dependencies/QGSJetII/qgsjet-II-04.h | 100 + dependencies/QGSJetII/testQGSJetII.cc | 186 + dependencies/UrQMD/CMakeLists.txt | 51 + {Processes => dependencies}/UrQMD/Copyright | 0 {Processes => dependencies}/UrQMD/README | 0 {Processes => dependencies}/UrQMD/UrQMD.cc | 128 +- {Processes => dependencies}/UrQMD/UrQMD.h | 31 +- {Processes => dependencies}/UrQMD/addpart.f | 0 {Processes => dependencies}/UrQMD/angdis.f | 0 {Processes => dependencies}/UrQMD/anndec.f | 0 {Processes => dependencies}/UrQMD/blockres.f | 0 {Processes => dependencies}/UrQMD/boxinc.f | 0 {Processes => dependencies}/UrQMD/boxprg.f | 0 {Processes => dependencies}/UrQMD/cascinit.f | 0 {Processes => dependencies}/UrQMD/colltab.f | 0 {Processes => dependencies}/UrQMD/coload.f | 0 {Processes => dependencies}/UrQMD/comnorm.f | 0 {Processes => dependencies}/UrQMD/comres.f | 0 {Processes => dependencies}/UrQMD/coms.f | 0 {Processes => dependencies}/UrQMD/comstr.f | 0 {Processes => dependencies}/UrQMD/comwid.f | 0 {Processes => dependencies}/UrQMD/dectim.f | 0 {Processes => dependencies}/UrQMD/delpart.f | 0 {Processes => dependencies}/UrQMD/detbal.f | 0 {Processes => dependencies}/UrQMD/dwidth.f | 0 {Processes => dependencies}/UrQMD/error.f | 0 {Processes => dependencies}/UrQMD/freezeout.f | 0 {Processes => dependencies}/UrQMD/getmass.f | 0 {Processes => dependencies}/UrQMD/getspin.f | 0 {Processes => dependencies}/UrQMD/init.f | 0 {Processes => dependencies}/UrQMD/inputs.f | 0 {Processes => dependencies}/UrQMD/iso.f | 0 {Processes => dependencies}/UrQMD/ityp2pdg.f | 0 {Processes => dependencies}/UrQMD/jdecay2.f | 0 {Processes => dependencies}/UrQMD/make22.f | 0 {Processes => dependencies}/UrQMD/newpart.f | 0 {Processes => dependencies}/UrQMD/numrec.f | 0 {Processes => dependencies}/UrQMD/options.f | 0 {Processes => dependencies}/UrQMD/outcom.f | 0 {Processes => dependencies}/UrQMD/output.f | 0 {Processes => dependencies}/UrQMD/paulibl.f | 0 {Processes => dependencies}/UrQMD/proppot.f | 0 {Processes => dependencies}/UrQMD/saveinfo.f | 0 {Processes => dependencies}/UrQMD/scatter.f | 0 {Processes => dependencies}/UrQMD/siglookup.f | 0 {Processes => dependencies}/UrQMD/string.f | 0 {Processes => dependencies}/UrQMD/tabinit.f | 0 dependencies/UrQMD/testUrQMD.cc | 222 + {Processes => dependencies}/UrQMD/urqmd.f | 0 dependencies/UrQMD/urqmdInterface.F | 447 + dependencies/UrQMD/urqmd_xs.cc | 39 + {Processes => dependencies}/UrQMD/whichres.f | 0 dependencies/sibyll/CMakeLists.txt | 47 + .../Sibyll => dependencies/sibyll}/gasdev.f | 0 .../Sibyll => dependencies/sibyll}/nuclib.f | 0 .../sibyll/nuclib.hpp | 0 .../Sibyll => dependencies/sibyll}/rndm_dbl.f | 0 dependencies/sibyll/sibyll2.3d.cpp | 19 + dependencies/sibyll/sibyll2.3d.f | 20471 ++++++++++++++++ dependencies/sibyll/sibyll2.3d.hpp | 120 + .../Sibyll => dependencies/sibyll}/signuc.f | 0 do-copyright.py | 4 +- .../Doxygen => documentation}/Doxyfile.in | 2 +- .../Examples => examples}/CMakeLists.txt | 0 .../Examples => examples}/boundary_example.cc | 51 +- .../Examples => examples}/cascade_example.cc | 49 +- .../cascade_proton_example.cc | 49 +- .../geometry_example.cpp | 12 +- .../helix_example.cpp | 12 +- examples/stack_example.cpp | 55 + .../staticsequence_example.cpp | 10 +- .../Examples => examples}/stopping_power.cc | 23 +- .../Examples => examples}/vertical_EAS.cc | 85 +- .../catch2}/catch2/catch.hpp | 4739 +++- .../catch2/catch2/catch_reporter_automake.hpp | 62 + .../catch2/catch_reporter_sonarqube.hpp | 181 + .../catch2/catch2/catch_reporter_tap.hpp | 254 + .../catch2/catch2/catch_reporter_teamcity.hpp | 219 + .../phys_units}/phys/units/io.hpp | 0 .../phys_units}/phys/units/io_output.hpp | 0 .../phys_units}/phys/units/io_output_eng.hpp | 0 .../phys_units}/phys/units/io_symbols.hpp | 0 .../phys_units}/phys/units/other_units.hpp | 0 .../phys/units/physical_constants.hpp | 0 .../phys_units}/phys/units/quantity.hpp | 5 - .../phys_units}/phys/units/quantity_io.hpp | 0 .../phys/units/quantity_io_ampere.hpp | 0 .../phys/units/quantity_io_becquerel.hpp | 0 .../phys/units/quantity_io_candela.hpp | 0 .../phys/units/quantity_io_celsius.hpp | 0 .../phys/units/quantity_io_coulomb.hpp | 0 .../phys/units/quantity_io_dimensionless.hpp | 0 .../phys/units/quantity_io_engineering.hpp | 0 .../phys/units/quantity_io_farad.hpp | 0 .../phys/units/quantity_io_gray.hpp | 0 .../phys/units/quantity_io_henry.hpp | 0 .../phys/units/quantity_io_hertz.hpp | 0 .../phys/units/quantity_io_joule.hpp | 0 .../phys/units/quantity_io_kelvin.hpp | 0 .../phys/units/quantity_io_kilogram.hpp | 0 .../phys/units/quantity_io_lumen.hpp | 0 .../phys/units/quantity_io_lux.hpp | 0 .../phys/units/quantity_io_meter.hpp | 0 .../phys/units/quantity_io_mole.hpp | 0 .../phys/units/quantity_io_newton.hpp | 0 .../phys/units/quantity_io_ohm.hpp | 0 .../phys/units/quantity_io_pascal.hpp | 0 .../phys/units/quantity_io_radian.hpp | 0 .../phys/units/quantity_io_second.hpp | 0 .../phys/units/quantity_io_siemens.hpp | 0 .../phys/units/quantity_io_sievert.hpp | 0 .../phys/units/quantity_io_speed.hpp | 0 .../phys/units/quantity_io_steradian.hpp | 0 .../phys/units/quantity_io_symbols.hpp | 0 .../phys/units/quantity_io_tesla.hpp | 0 .../phys/units/quantity_io_volt.hpp | 0 .../phys/units/quantity_io_watt.hpp | 0 .../phys/units/quantity_io_weber.hpp | 0 {Main => src/Main}/CMakeLists.txt | 0 Main/shower.cc => src/Main/shower.cpp | 0 tests/framework/CMakeLists.txt | 38 + .../framework/TestMain.cpp | 0 .../framework/testCOMBoost.cpp | 14 +- .../framework/testCascade.cpp | 69 +- tests/framework/testCascade.h | 40 + .../framework/testCombinedStack.cpp | 29 +- .../framework/testCorsikaFenv.cpp | 19 +- .../framework/testFourVector.cpp | 15 +- .../framework/testGeometry.cpp | 27 +- .../framework/testLogging.cpp | 2 +- .../framework/testParticles.cpp | 6 +- .../framework/testProcessSequence.cpp | 122 +- .../framework/testRandom.cpp | 53 +- .../framework/testSecondaryView.cpp | 13 +- .../framework/testStackInterface.cpp | 12 +- .../framework}/testTestStack.h | 11 +- .../framework/testUnits.cpp | 2 +- tests/media/CMakeLists.txt | 26 + tests/media/TestMain.cpp | 13 + .../media/testEnvironment.cpp | 52 +- tests/modules/CMakeLists.txt | 26 + tests/modules/TestMain.cpp | 13 + tests/modules/testSibyll.cpp | 191 + .../TrackingLine/testTrackingLineStack.h | 34 + .../processes}/testNullModel.cc | 23 +- .../processes}/testObservationPlane.cc | 40 +- .../processes}/testParticleCut.cc | 68 +- .../processes}/testQGSJetII.cc | 90 +- tests/stack/CMakeLists.txt | 28 + tests/stack/TestMain.cpp | 13 + tests/stack/testNuclearStackExtension.cpp | 262 + tests/stack/testSuperStupidStack.cpp | 68 + {Tools => tools}/plot_crossings.sh | 0 {Tools => tools}/plot_tracks.sh | 0 493 files changed, 54183 insertions(+), 38610 deletions(-) delete mode 100644 COAST/CMakeLists.txt delete mode 100644 COAST/COASTProcess.cc delete mode 100644 COAST/COASTProcess.h delete mode 100644 COAST/COASTStack.h delete mode 100644 COAST/COASTUserLib.cc delete mode 100644 COAST/ParticleConversion.cc delete mode 100644 COAST/ParticleConversion.h delete mode 100644 COAST/README.md delete mode 100644 Documentation/CMakeLists.txt delete mode 100644 Documentation/Doxygen/CMakeLists.txt delete mode 100644 Documentation/Examples/stack_example.cc delete mode 100644 Environment/CMakeLists.txt delete mode 100644 Environment/Environment.h delete mode 100644 Environment/FlatExponential.h delete mode 100644 Environment/HomogeneousMedium.h delete mode 100644 Environment/LinearApproximationIntegrator.h delete mode 100644 Environment/NuclearComposition.h delete mode 100644 Environment/SlidingPlanarExponential.h delete mode 100644 Environment/VolumeTreeNode.h create mode 100644 FIXME.md delete mode 100644 Framework/CMakeLists.txt delete mode 100644 Framework/Cascade/CMakeLists.txt delete mode 100644 Framework/Cascade/Cascade.dox delete mode 100644 Framework/Cascade/Cascade.h delete mode 100644 Framework/Cascade/testCascade.h delete mode 100644 Framework/Geometry/BaseTrajectory.h delete mode 100644 Framework/Geometry/BaseVector.h delete mode 100644 Framework/Geometry/CMakeLists.txt delete mode 100644 Framework/Geometry/CoordinateSystem.h delete mode 100644 Framework/Geometry/FourVector.h delete mode 100644 Framework/Geometry/Helix.h delete mode 100644 Framework/Geometry/Line.h delete mode 100644 Framework/Geometry/Point.h delete mode 100644 Framework/Geometry/QuantityVector.h delete mode 100644 Framework/Geometry/Sphere.h delete mode 100644 Framework/Geometry/Trajectory.h delete mode 100644 Framework/Geometry/Vector.h delete mode 100644 Framework/Logging/CMakeLists.txt delete mode 100644 Framework/Particles/CMakeLists.txt delete mode 100644 Framework/Particles/particles.dox delete mode 100644 Framework/ProcessSequence/CMakeLists.txt delete mode 100644 Framework/ProcessSequence/ProcessSequence.h delete mode 100644 Framework/Random/CMakeLists.txt delete mode 100644 Framework/Random/RNGManager.cc delete mode 100644 Framework/StackInterface/CMakeLists.txt delete mode 100644 Framework/StackInterface/Stack.dox delete mode 100644 Framework/Testing/CMakeLists.txt delete mode 100644 Framework/Units/CMakeLists.txt delete mode 100644 Framework/Utilities/CMakeLists.txt delete mode 100644 Framework/Utilities/COMBoost.h delete mode 100644 Processes/CMakeLists.txt delete mode 100644 Processes/EnergyLoss/CMakeLists.txt delete mode 100644 Processes/EnergyLoss/EnergyLoss.cc delete mode 100644 Processes/EnergyLoss/Properties8.dat delete mode 100644 Processes/EnergyLoss/ReadData.py delete mode 100644 Processes/EnergyLoss/SummaryPropTable.dat delete mode 100644 Processes/HadronicElasticModel/CMakeLists.txt delete mode 100644 Processes/HadronicElasticModel/HadronicElasticModel.cc delete mode 100644 Processes/NullModel/CMakeLists.txt delete mode 100644 Processes/ObservationPlane/CMakeLists.txt delete mode 100644 Processes/ParticleCut/CMakeLists.txt delete mode 100644 Processes/QGSJetII/CMakeLists.txt delete mode 100644 Processes/Sibyll/CMakeLists.txt delete mode 100644 Processes/Sibyll/Interaction.h delete mode 100644 Processes/StackInspector/CMakeLists.txt delete mode 100644 Processes/StackInspector/testStackInspector.cc delete mode 100644 Processes/SwitchProcess/CMakeLists.txt delete mode 100644 Processes/TrackWriter/CMakeLists.txt delete mode 100644 Processes/TrackingLine/CMakeLists.txt delete mode 100644 Processes/TrackingLine/testTrackingLineStack.h delete mode 100644 Processes/UrQMD/CMakeLists.txt delete mode 100644 Setup/CMakeLists.txt delete mode 100644 Setup/SetupEnvironment.h delete mode 100644 Setup/SetupStack.h delete mode 100644 Stack/CMakeLists.txt delete mode 100644 Stack/DummyStack/CMakeLists.txt delete mode 100644 Stack/NuclearStackExtension/CMakeLists.txt delete mode 100644 Stack/NuclearStackExtension/testNuclearStackExtension.cc delete mode 100644 Stack/SuperStupidStack/CMakeLists.txt delete mode 100644 Stack/SuperStupidStack/testSuperStupidStack.cc delete mode 100644 ThirdParty/.gitignore delete mode 100644 ThirdParty/CMakeLists.txt delete mode 100644 ThirdParty/ThirdParty.dox delete mode 100644 ThirdParty/eigen-eigen-b3f3d4950030.tar.bz2 delete mode 100644 ThirdParty/lcov/.version delete mode 100644 ThirdParty/lcov/CHANGES delete mode 100644 ThirdParty/lcov/CONTRIBUTING delete mode 100644 ThirdParty/lcov/COPYING delete mode 100644 ThirdParty/lcov/Makefile delete mode 100644 ThirdParty/lcov/README delete mode 100755 ThirdParty/lcov/bin/copy_dates.sh delete mode 100755 ThirdParty/lcov/bin/gendesc delete mode 100755 ThirdParty/lcov/bin/genhtml delete mode 100755 ThirdParty/lcov/bin/geninfo delete mode 100755 ThirdParty/lcov/bin/genpng delete mode 100755 ThirdParty/lcov/bin/get_changes.sh delete mode 100755 ThirdParty/lcov/bin/get_version.sh delete mode 100755 ThirdParty/lcov/bin/install.sh delete mode 100755 ThirdParty/lcov/bin/lcov delete mode 100755 ThirdParty/lcov/bin/updateversion.pl delete mode 100644 ThirdParty/lcov/example/Makefile delete mode 100644 ThirdParty/lcov/example/README delete mode 100644 ThirdParty/lcov/example/descriptions.txt delete mode 100644 ThirdParty/lcov/example/example.c delete mode 100644 ThirdParty/lcov/example/gauss.h delete mode 100644 ThirdParty/lcov/example/iterate.h delete mode 100644 ThirdParty/lcov/example/methods/gauss.c delete mode 100644 ThirdParty/lcov/example/methods/iterate.c delete mode 100644 ThirdParty/lcov/lcovrc delete mode 100644 ThirdParty/lcov/man/gendesc.1 delete mode 100644 ThirdParty/lcov/man/genhtml.1 delete mode 100644 ThirdParty/lcov/man/geninfo.1 delete mode 100644 ThirdParty/lcov/man/genpng.1 delete mode 100644 ThirdParty/lcov/man/lcov.1 delete mode 100644 ThirdParty/lcov/man/lcovrc.5 delete mode 100644 ThirdParty/lcov/rpm/lcov.spec delete mode 100644 ThirdParty/lcov/test/Makefile delete mode 100644 ThirdParty/lcov/test/bin/common delete mode 100755 ThirdParty/lcov/test/bin/mkinfo delete mode 100755 ThirdParty/lcov/test/bin/norminfo delete mode 100755 ThirdParty/lcov/test/bin/test_run delete mode 100755 ThirdParty/lcov/test/bin/test_skip delete mode 100755 ThirdParty/lcov/test/bin/testsuite_exit delete mode 100755 ThirdParty/lcov/test/bin/testsuite_init delete mode 100644 ThirdParty/lcov/test/common.mak delete mode 100644 ThirdParty/lcov/test/genhtml_output/Makefile delete mode 100755 ThirdParty/lcov/test/genhtml_output/genhtml_test delete mode 100644 ThirdParty/lcov/test/lcov_add_files/Makefile delete mode 100755 ThirdParty/lcov/test/lcov_add_files/add_test delete mode 100644 ThirdParty/lcov/test/lcov_diff/Makefile delete mode 100755 ThirdParty/lcov/test/lcov_diff/diff_test delete mode 100644 ThirdParty/lcov/test/lcov_diff/new/Makefile delete mode 100644 ThirdParty/lcov/test/lcov_diff/new/prog.c delete mode 100644 ThirdParty/lcov/test/lcov_diff/old/Makefile delete mode 100644 ThirdParty/lcov/test/lcov_diff/old/prog.c delete mode 100644 ThirdParty/lcov/test/lcov_misc/Makefile delete mode 100644 ThirdParty/lcov/test/lcov_summary/Makefile delete mode 100755 ThirdParty/lcov/test/lcov_summary/check_counts delete mode 100644 ThirdParty/lcov/test/lcovrc delete mode 100644 ThirdParty/lcov/test/profiles/large delete mode 100644 ThirdParty/lcov/test/profiles/medium delete mode 100644 ThirdParty/lcov/test/profiles/small delete mode 100644 Tools/CMakeLists.txt rename {CMakeModules => cmake}/CodeCoverage (100%) rename {CMakeModules => cmake}/CodeCoverage.cmake (100%) rename {CMakeModules => cmake}/CorsikaUtilities.cmake (100%) create mode 100644 cmake/FindCORSIKA.cmake create mode 100644 cmake/FindCORSIKA8.cmake create mode 100644 cmake/FindCatch2.cmake create mode 100644 cmake/FindCorsika8.cmake create mode 100644 cmake/FindEigen3.cmake create mode 100644 cmake/FindPhysUnits.cmake rename {CMakeModules => cmake}/FindPythia8.cmake (100%) create mode 100644 corsika/corsika.hpp create mode 100644 corsika/detail/framework/core/Cascade.inl create mode 100644 corsika/detail/framework/geometry/BaseVector.inl create mode 100644 corsika/detail/framework/geometry/CoordinateSystem.inl create mode 100644 corsika/detail/framework/geometry/FourVector.inl create mode 100644 corsika/detail/framework/geometry/Helix.inl create mode 100644 corsika/detail/framework/geometry/Line.inl create mode 100644 corsika/detail/framework/geometry/Plane.inl create mode 100644 corsika/detail/framework/geometry/Point.inl create mode 100644 corsika/detail/framework/geometry/QuantityVector.inl create mode 100644 corsika/detail/framework/geometry/Sphere.inl create mode 100644 corsika/detail/framework/geometry/Trajectory.inl create mode 100644 corsika/detail/framework/geometry/Vector.inl create mode 100644 corsika/detail/framework/random/RNGManager.inl create mode 100644 corsika/detail/framework/sequence/ProcessSequence.inl create mode 100644 corsika/detail/framework/stack/CombinedStack.inl create mode 100644 corsika/detail/framework/stack/SecondaryView.inl create mode 100644 corsika/detail/framework/utility/COMBoost.inl create mode 100644 corsika/detail/framework/utility/CorsikaFenvFallback.inl rename Framework/Utilities/CorsikaFenvOSX.cc => corsika/detail/framework/utility/CorsikaFenvOSX.inl (96%) create mode 100644 corsika/detail/media/BaseExponential.inl create mode 100644 corsika/detail/media/Environment.inl create mode 100644 corsika/detail/media/FlatExponential.inl create mode 100644 corsika/detail/media/LayeredSphericalAtmosphereBuilder.inl create mode 100644 corsika/detail/media/LinearApproximationIntegrator.inl create mode 100644 corsika/detail/media/SlidingPlanarExponential.inl create mode 100644 corsika/detail/media/Universe.inl create mode 100644 corsika/detail/media/VolumeTreeNode.inl create mode 100644 corsika/detail/modules/sibyll/Decay.inl create mode 100644 corsika/detail/modules/sibyll/Interaction.inl create mode 100644 corsika/detail/modules/sibyll/NuclearInteraction.inl create mode 100644 corsika/detail/modules/sibyll/ParticleConversion.inl create mode 100644 corsika/framework/CMakeLists.txt create mode 100644 corsika/framework/core/CMakeLists.txt create mode 100644 corsika/framework/core/Cascade.hpp rename {Framework/Particles => corsika/framework/core}/NuclearData.xml (100%) rename {Framework/Particles => corsika/framework/core}/ParticleClassNames.xml (100%) create mode 100644 corsika/framework/core/ParticleData.xml rename Framework/Particles/ParticleProperties.h => corsika/framework/core/ParticleProperties.hpp (63%) rename Framework/Units/PhysicalConstants.h => corsika/framework/core/PhysicalConstants.hpp (99%) rename Framework/Units/PhysicalUnits.h => corsika/framework/core/PhysicalUnits.hpp (98%) rename {Framework/Particles => corsika/framework/core/detail}/ParticleProperties.cc (100%) create mode 100755 corsika/framework/core/pdxml_reader.py create mode 100644 corsika/framework/geometry/BaseVector.hpp create mode 100644 corsika/framework/geometry/CoordinateSystem.hpp create mode 100644 corsika/framework/geometry/FourVector.hpp create mode 100644 corsika/framework/geometry/Helix.hpp create mode 100644 corsika/framework/geometry/Line.hpp rename Framework/Geometry/Plane.h => corsika/framework/geometry/Plane.hpp (55%) create mode 100644 corsika/framework/geometry/Point.hpp create mode 100644 corsika/framework/geometry/QuantityVector.hpp rename Framework/Geometry/RootCoordinateSystem.h => corsika/framework/geometry/RootCoordinateSystem.hpp (50%) create mode 100644 corsika/framework/geometry/Sphere.hpp create mode 100644 corsika/framework/geometry/Trajectory.hpp create mode 100644 corsika/framework/geometry/Vector.hpp rename Framework/Geometry/Volume.h => corsika/framework/geometry/Volume.hpp (81%) rename {Framework/Geometry => corsika/framework/geometry/detail}/CoordinateSystem.cc (100%) create mode 100644 corsika/framework/logging/BufferedSink.h create mode 100644 corsika/framework/logging/Logger.h create mode 100644 corsika/framework/logging/MessageOff.h create mode 100644 corsika/framework/logging/MessageOn.h create mode 100644 corsika/framework/logging/NoSink.h create mode 100644 corsika/framework/logging/Sink.h rename Framework/Random/ExponentialDistribution.h => corsika/framework/random/ExponentialDistribution.hpp (69%) rename Framework/Random/RNGManager.h => corsika/framework/random/RNGManager.hpp (76%) rename Framework/Random/UniformRealDistribution.h => corsika/framework/random/UniformRealDistribution.hpp (73%) rename Framework/ProcessSequence/BaseProcess.h => corsika/framework/sequence/BaseProcess.hpp (78%) rename Framework/ProcessSequence/BoundaryCrossingProcess.h => corsika/framework/sequence/BoundaryCrossingProcess.hpp (61%) rename Framework/ProcessSequence/ContinuousProcess.h => corsika/framework/sequence/ContinuousProcess.hpp (74%) rename Framework/ProcessSequence/DecayProcess.h => corsika/framework/sequence/DecayProcess.hpp (84%) rename Framework/ProcessSequence/InteractionProcess.h => corsika/framework/sequence/InteractionProcess.hpp (73%) rename Framework/ProcessSequence/ProcessReturn.h => corsika/framework/sequence/ProcessReturn.hpp (69%) create mode 100644 corsika/framework/sequence/ProcessSequence.hpp rename Framework/ProcessSequence/ProcessSignature.h => corsika/framework/sequence/ProcessSignature.hpp (99%) rename Framework/ProcessSequence/SecondariesProcess.h => corsika/framework/sequence/SecondariesProcess.hpp (66%) rename Framework/ProcessSequence/StackProcess.h => corsika/framework/sequence/StackProcess.hpp (76%) rename Framework/StackInterface/CombinedStack.h => corsika/framework/stack/CombinedStack.hpp (59%) rename Framework/StackInterface/ParticleBase.h => corsika/framework/stack/ParticleBase.hpp (98%) rename Framework/StackInterface/SecondaryView.h => corsika/framework/stack/SecondaryView.hpp (79%) rename Framework/StackInterface/Stack.h => corsika/framework/stack/Stack.hpp (92%) rename Framework/StackInterface/StackIteratorInterface.h => corsika/framework/stack/StackIteratorInterface.hpp (92%) rename Framework/Utilities/Bit.h => corsika/framework/utility/Bit.hpp (97%) create mode 100644 corsika/framework/utility/COMBoost.hpp rename Framework/Utilities/CorsikaFenv.h => corsika/framework/utility/CorsikaFenv.hpp (100%) rename Framework/Utilities/MetaProgramming.h => corsika/framework/utility/MetaProgramming.hpp (77%) rename Framework/Utilities/Singleton.h => corsika/framework/utility/Singleton.hpp (93%) rename {Framework/Utilities => corsika/framework/utility/detail}/COMBoost.cc (100%) create mode 100644 corsika/framework/utility/detail/COMBoost.inl rename {Framework/Utilities => corsika/framework/utility/detail}/CorsikaFenvDefault.cc (100%) rename Framework/Utilities/CorsikaFenvFallback.cc => corsika/framework/utility/detail/CorsikaFenvFallback.inl (89%) rename Framework/Utilities/sgn.h => corsika/framework/utility/sgn.hpp (88%) rename Environment/BaseExponential.h => corsika/media/BaseExponential.hpp (52%) rename Environment/DensityFunction.h => corsika/media/DensityFunction.hpp (55%) create mode 100644 corsika/media/Environment.hpp create mode 100644 corsika/media/FlatExponential.hpp create mode 100644 corsika/media/HomogeneousMedium.hpp rename Environment/IMediumModel.h => corsika/media/IMediumModel.hpp (58%) rename Environment/InhomogeneousMedium.h => corsika/media/InhomogeneousMedium.hpp (50%) rename Environment/LayeredSphericalAtmosphereBuilder.h => corsika/media/LayeredSphericalAtmosphereBuilder.hpp (56%) create mode 100644 corsika/media/LinearApproximationIntegrator.hpp rename Environment/NameModel.h => corsika/media/NameModel.hpp (93%) create mode 100644 corsika/media/NuclearComposition.hpp create mode 100644 corsika/media/SlidingPlanarExponential.hpp create mode 100644 corsika/media/Universe.hpp create mode 100644 corsika/media/VolumeTreeNode.hpp rename {Processes => corsika/modules}/Sibyll/Decay.cc (92%) rename {Processes => corsika/modules}/Sibyll/Interaction.cc (95%) rename {Processes => corsika/modules}/Sibyll/NuclearInteraction.cc (86%) rename {Processes => corsika/modules}/Sibyll/ParticleConversion.cc (89%) rename {Processes => corsika/modules}/Sibyll/code_generator.py (96%) rename {Processes => corsika/modules}/Sibyll/sibyll_codes.dat (100%) rename {Processes => corsika/modules}/Sibyll/testSibyll.cc (76%) create mode 100644 corsika/modules/UrQMD/UrQMD.cc create mode 100644 corsika/modules/UrQMD/UrQMD.h rename {Processes => corsika/modules}/UrQMD/testUrQMD.cc (62%) rename {Processes => corsika/modules}/UrQMD/urqmdInterface.F (100%) create mode 100644 corsika/modules/sibyll/CMakeLists.txt create mode 100644 corsika/modules/sibyll/Decay.hpp create mode 100644 corsika/modules/sibyll/Interaction.hpp rename Processes/Sibyll/NuclearInteraction.h => corsika/modules/sibyll/NuclearInteraction.hpp (68%) create mode 100644 corsika/modules/sibyll/ParticleConversion.hpp create mode 100644 corsika/modules/sibyll/Random.hpp create mode 100644 corsika/modules/sibyll/SibStack.hpp create mode 100755 corsika/modules/sibyll/code_generator.py create mode 100644 corsika/modules/sibyll/sibyll_codes.dat rename Processes/EnergyLoss/EnergyLoss.h => corsika/process/EnergyLoss.hpp (73%) rename Processes/HadronicElasticModel/HadronicElasticModel.h => corsika/process/HadronicElasticModel.hpp (74%) rename Processes/ObservationPlane/ObservationPlane.h => corsika/process/ObservationPlane.hpp (63%) rename Processes/ParticleCut/ParticleCut.h => corsika/process/ParticleCut.hpp (82%) create mode 100644 corsika/process/Pythia/Decay.hpp rename Processes/Pythia/Interaction.h => corsika/process/Pythia/Interaction.hpp (58%) create mode 100644 corsika/process/Pythia/Random.hpp create mode 100644 corsika/process/QGSJetII/Interaction.hpp create mode 100644 corsika/process/QGSJetII/ParticleConversion.hpp create mode 100644 corsika/process/QGSJetII/QGSJetIIFragmentsStack.hpp create mode 100644 corsika/process/QGSJetII/QGSJetIIStack.hpp rename {Processes => corsika/process}/QGSJetII/qgsjet-II-04.h (100%) rename Processes/Sibyll/Decay.h => corsika/process/Sibyll/Decay.hpp (76%) create mode 100644 corsika/process/Sibyll/Interaction.hpp create mode 100644 corsika/process/Sibyll/NuclearInteraction.hpp rename {Processes => corsika/process}/Sibyll/ParticleConversion.h (58%) rename Processes/Sibyll/SibStack.h => corsika/process/Sibyll/SibStack.hpp (78%) rename Processes/StackInspector/StackInspector.h => corsika/process/StackInspector.hpp (75%) rename Processes/SwitchProcess/SwitchProcess.h => corsika/process/SwitchProcess.hpp (92%) rename Processes/TrackWriter/TrackWriter.h => corsika/process/TrackWriter.hpp (68%) create mode 100644 corsika/process/detail/EnergyLoss.cc create mode 100644 corsika/process/detail/HadronicElasticModel.cc rename {Processes/ObservationPlane => corsika/process/detail}/ObservationPlane.cc (95%) rename {Processes/ParticleCut => corsika/process/detail}/ParticleCut.cc (71%) rename {Processes => corsika/process/detail}/Pythia/Decay.cc (93%) rename {Processes => corsika/process/detail}/Pythia/Interaction.cc (94%) rename {Processes => corsika/process/detail}/Pythia/Random.cc (81%) rename {Processes => corsika/process/detail}/QGSJetII/Interaction.cc (90%) rename {Processes => corsika/process/detail}/QGSJetII/ParticleConversion.cc (76%) rename {Processes => corsika/process/detail}/QGSJetII/qgsjet-II-04.cc (83%) rename {Processes/StackInspector => corsika/process/detail}/StackInspector.cc (87%) rename {Processes/TrackWriter => corsika/process/detail}/TrackWriter.cc (82%) create mode 100644 corsika/setup/SetupEnvironment.hpp rename Framework/Utilities/try_feenableexcept.cc => corsika/setup/SetupLogger.hpp (74%) create mode 100644 corsika/setup/SetupStack.hpp rename Setup/SetupTrajectory.h => corsika/setup/SetupTrajectory.hpp (78%) rename {Stack/DummyStack => corsika/stack}/DummyStack.h (90%) rename {Stack/NuclearStackExtension => corsika/stack}/NuclearStackExtension.h (77%) rename {Stack/SuperStupidStack => corsika/stack}/SuperStupidStack.h (64%) create mode 100644 dependencies/CMakeLists.txt rename {Processes => dependencies}/Pythia/CMakeLists.txt (97%) create mode 100644 dependencies/Pythia/Decay.cc rename {Processes => dependencies}/Pythia/Decay.h (58%) create mode 100644 dependencies/Pythia/Interaction.cc create mode 100644 dependencies/Pythia/Interaction.h create mode 100644 dependencies/Pythia/Random.cc rename {Processes => dependencies}/Pythia/Random.h (92%) create mode 100644 dependencies/Pythia/testPythia8.cc create mode 100644 dependencies/QGSJetII/CMakeLists.txt create mode 100644 dependencies/QGSJetII/Interaction.cc rename {Processes => dependencies}/QGSJetII/Interaction.h (61%) create mode 100644 dependencies/QGSJetII/ParticleConversion.cc rename {Processes => dependencies}/QGSJetII/ParticleConversion.h (67%) rename {Processes => dependencies}/QGSJetII/QGSJetIIFragmentsStack.h (90%) rename {Processes => dependencies}/QGSJetII/QGSJetIIStack.h (86%) create mode 100755 dependencies/QGSJetII/code_generator.py create mode 100644 dependencies/QGSJetII/qgsjet-II-04-codes.dat create mode 100644 dependencies/QGSJetII/qgsjet-II-04.cc rename {Processes => dependencies}/QGSJetII/qgsjet-II-04.f (100%) create mode 100644 dependencies/QGSJetII/qgsjet-II-04.h create mode 100644 dependencies/QGSJetII/testQGSJetII.cc create mode 100644 dependencies/UrQMD/CMakeLists.txt rename {Processes => dependencies}/UrQMD/Copyright (100%) rename {Processes => dependencies}/UrQMD/README (100%) rename {Processes => dependencies}/UrQMD/UrQMD.cc (78%) rename {Processes => dependencies}/UrQMD/UrQMD.h (83%) rename {Processes => dependencies}/UrQMD/addpart.f (100%) rename {Processes => dependencies}/UrQMD/angdis.f (100%) rename {Processes => dependencies}/UrQMD/anndec.f (100%) rename {Processes => dependencies}/UrQMD/blockres.f (100%) rename {Processes => dependencies}/UrQMD/boxinc.f (100%) rename {Processes => dependencies}/UrQMD/boxprg.f (100%) rename {Processes => dependencies}/UrQMD/cascinit.f (100%) rename {Processes => dependencies}/UrQMD/colltab.f (100%) rename {Processes => dependencies}/UrQMD/coload.f (100%) rename {Processes => dependencies}/UrQMD/comnorm.f (100%) rename {Processes => dependencies}/UrQMD/comres.f (100%) rename {Processes => dependencies}/UrQMD/coms.f (100%) rename {Processes => dependencies}/UrQMD/comstr.f (100%) rename {Processes => dependencies}/UrQMD/comwid.f (100%) rename {Processes => dependencies}/UrQMD/dectim.f (100%) rename {Processes => dependencies}/UrQMD/delpart.f (100%) rename {Processes => dependencies}/UrQMD/detbal.f (100%) rename {Processes => dependencies}/UrQMD/dwidth.f (100%) rename {Processes => dependencies}/UrQMD/error.f (100%) rename {Processes => dependencies}/UrQMD/freezeout.f (100%) rename {Processes => dependencies}/UrQMD/getmass.f (100%) rename {Processes => dependencies}/UrQMD/getspin.f (100%) rename {Processes => dependencies}/UrQMD/init.f (100%) rename {Processes => dependencies}/UrQMD/inputs.f (100%) rename {Processes => dependencies}/UrQMD/iso.f (100%) rename {Processes => dependencies}/UrQMD/ityp2pdg.f (100%) rename {Processes => dependencies}/UrQMD/jdecay2.f (100%) rename {Processes => dependencies}/UrQMD/make22.f (100%) rename {Processes => dependencies}/UrQMD/newpart.f (100%) rename {Processes => dependencies}/UrQMD/numrec.f (100%) rename {Processes => dependencies}/UrQMD/options.f (100%) rename {Processes => dependencies}/UrQMD/outcom.f (100%) rename {Processes => dependencies}/UrQMD/output.f (100%) rename {Processes => dependencies}/UrQMD/paulibl.f (100%) rename {Processes => dependencies}/UrQMD/proppot.f (100%) rename {Processes => dependencies}/UrQMD/saveinfo.f (100%) rename {Processes => dependencies}/UrQMD/scatter.f (100%) rename {Processes => dependencies}/UrQMD/siglookup.f (100%) rename {Processes => dependencies}/UrQMD/string.f (100%) rename {Processes => dependencies}/UrQMD/tabinit.f (100%) create mode 100644 dependencies/UrQMD/testUrQMD.cc rename {Processes => dependencies}/UrQMD/urqmd.f (100%) create mode 100644 dependencies/UrQMD/urqmdInterface.F create mode 100644 dependencies/UrQMD/urqmd_xs.cc rename {Processes => dependencies}/UrQMD/whichres.f (100%) create mode 100644 dependencies/sibyll/CMakeLists.txt rename {Processes/Sibyll => dependencies/sibyll}/gasdev.f (100%) rename {Processes/Sibyll => dependencies/sibyll}/nuclib.f (100%) rename Processes/Sibyll/nuclib.h => dependencies/sibyll/nuclib.hpp (100%) rename {Processes/Sibyll => dependencies/sibyll}/rndm_dbl.f (100%) create mode 100644 dependencies/sibyll/sibyll2.3d.cpp create mode 100644 dependencies/sibyll/sibyll2.3d.f create mode 100644 dependencies/sibyll/sibyll2.3d.hpp rename {Processes/Sibyll => dependencies/sibyll}/signuc.f (100%) rename {Documentation/Doxygen => documentation}/Doxyfile.in (96%) rename {Documentation/Examples => examples}/CMakeLists.txt (100%) rename {Documentation/Examples => examples}/boundary_example.cc (81%) rename {Documentation/Examples => examples}/cascade_example.cc (82%) rename {Documentation/Examples => examples}/cascade_proton_example.cc (80%) rename Documentation/Examples/geometry_example.cc => examples/geometry_example.cpp (90%) rename Documentation/Examples/helix_example.cc => examples/helix_example.cpp (83%) create mode 100644 examples/stack_example.cpp rename Documentation/Examples/staticsequence_example.cc => examples/staticsequence_example.cpp (90%) rename {Documentation/Examples => examples}/stopping_power.cc (81%) rename {Documentation/Examples => examples}/vertical_EAS.cc (81%) rename {ThirdParty => externals/catch2}/catch2/catch.hpp (78%) create mode 100644 externals/catch2/catch2/catch_reporter_automake.hpp create mode 100644 externals/catch2/catch2/catch_reporter_sonarqube.hpp create mode 100644 externals/catch2/catch2/catch_reporter_tap.hpp create mode 100644 externals/catch2/catch2/catch_reporter_teamcity.hpp rename {ThirdParty => externals/phys_units}/phys/units/io.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/io_output.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/io_output_eng.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/io_symbols.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/other_units.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/physical_constants.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity.hpp (99%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_ampere.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_becquerel.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_candela.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_celsius.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_coulomb.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_dimensionless.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_engineering.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_farad.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_gray.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_henry.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_hertz.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_joule.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_kelvin.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_kilogram.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_lumen.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_lux.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_meter.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_mole.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_newton.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_ohm.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_pascal.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_radian.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_second.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_siemens.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_sievert.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_speed.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_steradian.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_symbols.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_tesla.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_volt.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_watt.hpp (100%) rename {ThirdParty => externals/phys_units}/phys/units/quantity_io_weber.hpp (100%) rename {Main => src/Main}/CMakeLists.txt (100%) rename Main/shower.cc => src/Main/shower.cpp (100%) create mode 100644 tests/framework/CMakeLists.txt rename Framework/Testing/TestMain.cc => tests/framework/TestMain.cpp (100%) rename Framework/Utilities/testCOMBoost.cc => tests/framework/testCOMBoost.cpp (96%) rename Framework/Cascade/testCascade.cc => tests/framework/testCascade.cpp (68%) create mode 100644 tests/framework/testCascade.h rename Framework/StackInterface/testCombinedStack.cc => tests/framework/testCombinedStack.cpp (92%) rename Framework/Utilities/testCorsikaFenv.cc => tests/framework/testCorsikaFenv.cpp (52%) rename Framework/Geometry/testFourVector.cc => tests/framework/testFourVector.cpp (93%) rename Framework/Geometry/testGeometry.cc => tests/framework/testGeometry.cpp (93%) rename Framework/Logging/testLogging.cc => tests/framework/testLogging.cpp (98%) rename Framework/Particles/testParticles.cc => tests/framework/testParticles.cpp (97%) rename Framework/ProcessSequence/testProcessSequence.cc => tests/framework/testProcessSequence.cpp (72%) rename Framework/Random/testRandom.cc => tests/framework/testRandom.cpp (57%) rename Framework/StackInterface/testSecondaryView.cc => tests/framework/testSecondaryView.cpp (95%) rename Framework/StackInterface/testStackInterface.cc => tests/framework/testStackInterface.cpp (94%) rename {Framework/StackInterface => tests/framework}/testTestStack.h (89%) rename Framework/Units/testUnits.cc => tests/framework/testUnits.cpp (98%) create mode 100644 tests/media/CMakeLists.txt create mode 100644 tests/media/TestMain.cpp rename Environment/testEnvironment.cc => tests/media/testEnvironment.cpp (91%) create mode 100644 tests/modules/CMakeLists.txt create mode 100644 tests/modules/TestMain.cpp create mode 100644 tests/modules/testSibyll.cpp create mode 100644 tests/processes/TrackingLine/testTrackingLineStack.h rename {Processes/NullModel => tests/processes}/testNullModel.cc (64%) rename {Processes/ObservationPlane => tests/processes}/testObservationPlane.cc (70%) rename {Processes/ParticleCut => tests/processes}/testParticleCut.cc (75%) rename {Processes/QGSJetII => tests/processes}/testQGSJetII.cc (63%) create mode 100644 tests/stack/CMakeLists.txt create mode 100644 tests/stack/TestMain.cpp create mode 100644 tests/stack/testNuclearStackExtension.cpp create mode 100644 tests/stack/testSuperStupidStack.cpp rename {Tools => tools}/plot_crossings.sh (100%) rename {Tools => tools}/plot_tracks.sh (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index e24a55b95..c06fdca0a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,171 +1,146 @@ cmake_minimum_required (VERSION 3.9) # we would need 3.16 to have CMP0097 for external subproject submodule (non) support -# prevent in-source builds and give warning message -if ("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}") - message (FATAL_ERROR "In-source builds are disabled. - Please create a build-dir and use `cmake <source-dir>` inside it. - NOTE: cmake will now create CMakeCache.txt and CMakeFiles/*. - You must delete them, or cmake will refuse to work.") -endif () - -project ( - corsika - VERSION 8.0.0 - DESCRIPTION "CORSIKA C++ project" - LANGUAGES CXX - ) - -include (FeatureSummary) - -# as long as there still are modules using it: -enable_language (Fortran) - -# TEMPORARY: this should be removed, the sanitizers should be always enabled -option (WITH_CORSIKA_SANITIZERS_ENABLED "temporary way to globally disable sanitizers until the currently failing tests are fixed" OFF) -add_feature_info (CORSIKA_SANITIZERS_ENABLED WITH_CORSIKA_SANITIZERS_ENABLED "Switch to run c++ sanitzers on CORSIKA objects and code.") - -option (WITH_COAST "Flag to switch on/off COAST (reverse) interface" OFF) -add_feature_info (COAST WITH_COAST "The COAST interface, so that you can write C8 processes to run inside C7.") - -# HISTORY option selection -option (WITH_HISTORY "Flag to switch on/off HISTORY" ON) -add_feature_info (HISTORY WITH_HISTORY "The Foo feature provides very cool stuffdddd.") - -# check for python -set (Python_ADDITIONAL_VERSIONS 3) -find_package (PythonInterp 3 REQUIRED) - -# ignore many irrelevant Up-to-date messages during install -set (CMAKE_INSTALL_MESSAGE LAZY) - -# directory for local cmake modules -set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeModules) -include (CorsikaUtilities) # a few cmake function - +#+++++++++++++++++++++++++++++ +# project name +# +project( CORSIKA8_Modules_Tests_Examples ) +# +# +#+++++++++++++++++++++++++++++ +# warn user if system is not UNIX +# +if(NOT UNIX) + message(FATAL_ERROR "| CORSIKA8 > This is an unsupported system.") +endif() +# +#+++++++++++++++++++++++++++++ +# cmake path dir +# +SET(CORSIKA8_CMAKE_DIR "${PROJECT_SOURCE_DIR}/cmake") +SET(CMAKE_MODULE_PATH "${CORSIKA8_CMAKE_DIR}" ${CMAKE_MODULE_PATH}) +SET(CMAKE_VERBOSE_MAKEFILE ON) +# +#+++++++++++++++++++++++++++++ +# check if compiler is C++17 compliant +# +include(CheckCXXCompilerFlag) +CHECK_CXX_COMPILER_FLAG("--std=c++17" COMPILER_SUPPORTS_CXX17) +if(NOT COMPILER_SUPPORTS_CXX17) + message(FATAL "| CORSIKA8 > The compiler ${CMAKE_CXX_COMPILER} has no C++17 support. Please use a different C++ compiler.") +endif() + +# set CXX compile flags and options and warning settings set (CMAKE_CXX_STANDARD 17) set (CMAKE_CXX_EXTENSIONS OFF) -enable_testing () -set (CTEST_OUTPUT_ON_FAILURE 1) -list (APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure") - -# Set the possible values of build type for cmake-gui and command line check -set (ALLOWED_BUILD_TYPES Debug Release MinSizeRel RelWithDebInfo Coverage) -set_property (CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${ALLOWED_BUILD_TYPES}) - -# Set a default build type if none was specified -# by default: "Debug", if local ".git" directory is found, otherwise "Release" -set (DEFAULT_BUILD_TYPE "Release") -if (EXISTS "${CMAKE_SOURCE_DIR}/.git") - set (DEFAULT_BUILD_TYPE "Debug") -endif () - -if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - message (STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as no other was specified.") - set (CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE - STRING "Choose the type of build." FORCE) -else (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - # Ignore capitalization when build type is selected manually and check for valid setting - string (TOLOWER ${CMAKE_BUILD_TYPE} SELECTED_LOWER) - string (TOLOWER "${ALLOWED_BUILD_TYPES}" BUILD_TYPES_LOWER) - if (NOT SELECTED_LOWER IN_LIST BUILD_TYPES_LOWER) - message (FATAL_ERROR "Unknown build type: ${CMAKE_BUILD_TYPE} [allowed: ${ALLOWED_BUILD_TYPES}]") - endif () - message (STATUS "Build type is: ${CMAKE_BUILD_TYPE}") -endif (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) # enable warnings and disallow non-standard language # configure the various build types here, too # FYI: optimizer flags: -O2 would not trade speed for size, neither O2/3 use fast-math -# debug: O0, relwithdebinfo: 02, release: O3, minsizerel: Os (all defaults), coverage -> O0 +# debug: O0, relwithdebinfo: 02, release: O3, minsizerel: Os (all defaults) set (CMAKE_CXX_FLAGS "-Wall -pedantic -Wextra -Wno-ignored-qualifiers") set (CMAKE_Fortran_FLAGS "-std=legacy -Wfunction-elimination") -# setup coverage build type -set (CMAKE_CXX_FLAGS_COVERAGE "-g --coverage") -set (CMAKE_EXE_LINKER_FLAGS_COVERAGE "--coverage") -set (CMAKE_SHARED_LINKER_FLAGS_COVERAGE "--coverage") - # clang produces a lot of unecessary warnings without this: add_compile_options ("$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:-Wno-nonportable-include-path>") -# set a flag to inform code that we are in debug mode -set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG") - -# COAST - interface, this requires CORSIKA7 to be installed first -# COAST will allow you to program code in CORSIKA8 and execute it inside CORSIKA7 -if (WITH_COAST) - message (STATUS "Compiling CORSIKA8 for the use with COAST/corsika7.") - add_compile_options ("-fPIC") -endif () - -# targets and settings needed to generate coverage reports -if (CMAKE_BUILD_TYPE STREQUAL Coverage) - find_package (Perl REQUIRED) - - # compile coverage under -O2 to remove unused functions - # add_compile_options ("-O2") - # compile coverage under -O0 to avoid any optimization, function elimation etc. - add_compile_options ("-O0") - - set (GCOV gcov CACHE STRING "gcov executable" FORCE) - set (LCOV_BIN_DIR "${PROJECT_SOURCE_DIR}/ThirdParty/lcov/bin") - # collect coverage data - add_custom_command ( - OUTPUT raw-coverage.info - COMMAND ${CMAKE_COMMAND} -E echo "Note: you need to run ctest at least once to generate the coverage data" - COMMAND ${LCOV_BIN_DIR}/lcov --gcov-tool=${GCOV} --directory . --capture --output-file raw-coverage.info - ) - # remove uninteresting entries - add_custom_command ( - OUTPUT coverage.info - COMMAND ${LCOV_BIN_DIR}/lcov -q --remove raw-coverage.info "*/usr/*" --output-file coverage2.info - COMMAND ${LCOV_BIN_DIR}/lcov --remove coverage2.info "*/ThirdParty/*" --output-file coverage.info - COMMAND ${CMAKE_COMMAND} -E remove coverage2.info - DEPENDS raw-coverage.info - ) - # generate html report - add_custom_command ( - OUTPUT coverage-report - COMMAND ${LCOV_BIN_DIR}/genhtml --demangle-cpp coverage.info -o coverage-report - DEPENDS coverage.info - ) - add_custom_target (coverage DEPENDS coverage-report) -endif () - -# include this test only if NOT run on gitlab-ci, since there we have a dedicated job for it: -if (NOT DEFINED ENV{CI}) - # add call to ./do-copyright.py to run as unit-test-case - add_test (NAME copyright_notices COMMAND ./do-copyright.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) -endif (NOT DEFINED ENV{CI}) - -if (DEFINED ENV{CORSIKA_DATA}) - message ("Found corsika-data in $ENV{CORSIKA_DATA}") - set (CORSIKA_DATA $ENV{CORSIKA_DATA}) - add_subdirectory ($ENV{CORSIKA_DATA} corsika_data) -else () - message ("CORSIKA_DATA not defined: NEED to download AirShowerPhysics/corsika-data via git submodule") - message ("cmake will fail if you did not do this already.") - set (CORSIKA_DATA ${PROJECT_SOURCE_DIR}/Data) - add_subdirectory (Data) -endif () - -# include potential ThirdParty code provided with CORSIKA -add_subdirectory (ThirdParty) - -# order of subdirectories -add_subdirectory (Framework) -add_subdirectory (Environment) -add_subdirectory (Stack) -add_subdirectory (Setup) -add_subdirectory (Processes) -add_subdirectory (Documentation) -add_subdirectory (Main) -add_subdirectory (Tools) -if (WITH_COAST) - add_subdirectory (COAST) -endif () +# ctest config +enable_testing () +set (CTEST_OUTPUT_ON_FAILURE 1) +#+++++++++++++++++++++++++++++ +# get CORSIKA8 +# +find_package(CORSIKA8 REQUIRED) +include_directories(${CORSIKA8_INCLUDE_DIR}) +# those are needed, since some headers (namely GeneratedParticleProperties.inc) are produced by python script from ParticleData.xml +add_subdirectory(corsika/framework) +add_subdirectory(corsika/modules/sibyll) +# +#+++++++++++++++++++++++++++++ +# get Eigen3 +# +find_package( Eigen3 REQUIRED ) +include_directories(${EIGEN3_INCLUDE_DIR}) + +#+++++++++++++++++++++++++++++ +# get catch2 +# +find_package( Catch2 REQUIRED ) + +#+++++++++++++++++++++++++++++ +# use spdlog +# +add_subdirectory(externals/spdlog) +add_dependencies(CORSIKA8 spdlog::spdlog) + +#+++++++++++++++++++++++++++++ +# get phys_units +# +find_package( PhysUnits REQUIRED ) + +#+++++++++++++++++++++++++++++ +# get Pythia +# +find_package( Pythia8 REQUIRED ) +if(Pythia_FOUND) +include_directories(${Pythia_INCLUDE_DIR}) +endif(Pythia_FOUND) +# +#+++++++++++++++++++++++++++++ +# get UrQMD +# +#find_package( UrQMD REQUIRED ) +if(UrQMD_FOUND) +include_directories(${UrQMD_INCLUDE_DIR}) +endif(UrQMD_FOUND) +# +#+++++++++++++++++++++++++++++ +# get Sybill +# +# find_package( Sibyll REQUIRED ) +add_subdirectory (dependencies/sibyll) +if(Sibyll_FOUND) +include_directories(${Sibyll_INCLUDE_DIR}) +endif(Sibyll_FOUND) +# +#+++++++++++++++++++++++++++++ +# get QGSJETII +# +#find_package( QGSJETII REQUIRED ) +if(QGSJETII_FOUND) +include_directories(${QGSJETII_INCLUDE_DIR}) +endif(QGSJETII_FOUND) +# +# +#+++++++++++++++++++++++++++++ +# =~~~~~~~~~~~~~~~~~~~~~~~~~= +# = Add of subdirectories = +# =~~~~~~~~~~~~~~~~~~~~~~~~~= +#+++++++++++++++++++++++++++++ +# +# modules +# +#add_subdirectory (dependencies/Pythia) +#add_subdirectory (dependencies/Sibyll) +#add_subdirectory (dependencies/QGSJetII) +#add_subdirectory (dependencies/UrQMD) +# +#+++++++++++++++++++++++++++++++ +# tests +# +add_subdirectory (tests/framework) +add_subdirectory (tests/media) +add_subdirectory (tests/stack) +add_subdirectory (tests/modules) +# +#+++++++++++++++++++++++++++++++ +# examples +# +#add_subdirectory (examples) +# +#+++++++++++++++++++++++++++++++ +# # final summary output feature_summary (WHAT ALL) diff --git a/COAST/CMakeLists.txt b/COAST/CMakeLists.txt deleted file mode 100644 index dc09ce62d..000000000 --- a/COAST/CMakeLists.txt +++ /dev/null @@ -1,66 +0,0 @@ -set ( - COAST_HEADERS - COASTProcess.h - COASTStack.h - ParticleConversion.h - ) - -set ( - COAST_SOURCES - COASTUserLib.cc - COASTProcess.cc - ParticleConversion.cc - ) - -set ( - COAST_NAMESPACE - corsika/coast - ) - -add_library (COAST SHARED ${COAST_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (COAST ${COAST_NAMESPACE} ${COAST_HEADERS}) - -set_target_properties ( - COAST - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 -# PUBLIC_HEADER "${MODEL_HEADERS}" - ) - -target_link_libraries ( - COAST - PUBLIC - CORSIKAgeometry - CORSIKAunits - CORSIKAparticles - CORSIKAgeometry - CORSIKAsetup - # SuperStupidStack - ) - -target_include_directories ( - COAST - PUBLIC - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -target_include_directories ( - COAST - SYSTEM - PUBLIC - $ENV{COAST_DIR}/include - ) - -install ( - TARGETS COAST - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION include/${COAST_NAMESPACE} - ) - -#install ( -# FILES ${COAST_HEADERS} -# DESTINATION include/${COAST_NAMESPACE} -# ) diff --git a/COAST/COASTProcess.cc b/COAST/COASTProcess.cc deleted file mode 100644 index 827d2f0fa..000000000 --- a/COAST/COASTProcess.cc +++ /dev/null @@ -1,43 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#include <corsika/coast/COASTProcess.h> -#include <corsika/coast/COASTStack.h> - -#include <iostream> - -using namespace std; - -namespace corsika::coast { - - /** - the init function is called during the start of corsika. - */ - void COASTProcess::Init() { - cout << "************* Greetings from CORSIKA8 *****************" << endl; - } - - /** - the docontinous function is called for each tracking step in - corsika. Take care: you cannot modify the particle, the track or - the stack from here (docontinuous) inside corisika7. In corsika8 - you will be able to do that. - */ - corsika::process::EProcessReturn COASTProcess::DoContinuous(const Particle& p, - const Track& t, - const Stack&) { - using namespace corsika::units::si; - auto const start = t.GetPosition(0).GetCoordinates(); - auto const delta = t.GetPosition(1).GetCoordinates() - start; - auto const name = corsika::particles::GetName(p.GetPID()); - cout << "CORSIKA8: particle=" << name << ", pos=" << start - << " track-l=" << delta.norm() << ", track-t=" << t.GetDuration() << endl; - return corsika::process::EProcessReturn::eOk; - } - -} // namespace corsika::coast diff --git a/COAST/COASTProcess.h b/COAST/COASTProcess.h deleted file mode 100644 index 2886d13c4..000000000 --- a/COAST/COASTProcess.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/particles/ParticleProperties.h> -#include <corsika/process/ContinuousProcess.h> -#include <corsika/setup/SetupTrajectory.h> -#include <corsika/units/PhysicalUnits.h> - -#include <corsika/coast/COASTStack.h> - -#include <limits> - -typedef corsika::coast::COASTStack Stack; -typedef corsika::coast::COASTStack::ParticleType Particle; -typedef corsika::geometry::Trajectory<corsika::geometry::Line> Track; - -namespace corsika::coast { - - class COASTProcess : public corsika::process::ContinuousProcess<COASTProcess> { - - public: - void Init(); - - corsika::process::EProcessReturn DoContinuous(const Particle&, const Track&, - const Stack&); - - corsika::units::si::LengthType MaxStepLength(Particle&, Track&) { - return corsika::units::si::meter * std::numeric_limits<double>::infinity(); - } - - private: - }; - -} // namespace corsika::coast diff --git a/COAST/COASTStack.h b/COAST/COASTStack.h deleted file mode 100644 index 72e0594a7..000000000 --- a/COAST/COASTStack.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/coast/ParticleConversion.h> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/stack/ParticleBase.h> -#include <corsika/stack/Stack.h> -#include <corsika/units/PhysicalUnits.h> - -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> // remove -#include <corsika/geometry/Vector.h> - -#include <crs/CParticle.h> -#include <crs/CorsikaTypes.h> - -#include <algorithm> -#include <vector> - -namespace corsika::coast { - - typedef corsika::geometry::Vector<corsika::units::si::hepmomentum_d> MomentumVector; - - /** - * Example of a particle object on the stack. - */ - - template <typename StackIteratorInterface> - class ParticleInterface : public corsika::stack::ParticleBase<StackIteratorInterface> { - - using corsika::stack::ParticleBase<StackIteratorInterface>::GetStackData; - using corsika::stack::ParticleBase<StackIteratorInterface>::GetIndex; - - public: - corsika::particles::Code GetPID() const { return GetStackData().GetPID(GetIndex()); } - - corsika::units::si::HEPEnergyType GetEnergy() const { - return GetStackData().GetEnergy(GetIndex()); - } - - MomentumVector GetMomentum(const corsika::geometry::CoordinateSystem& cs) const { - using namespace corsika::units::si; - const HEPEnergyType mass = corsika::particles::GetMass(GetPID()); - const auto P = sqrt((GetEnergy() - mass) * (GetEnergy() + mass)); - const auto p = GetStackData().GetDirection(cs); - return p * P; - } - - corsika::geometry::Point GetPosition( - const corsika::geometry::CoordinateSystem& cs) const { - return GetStackData().GetPosition(cs, GetIndex()); - } - - corsika::geometry::Vector<corsika::units::si::speed_d> GetVelocity( - const corsika::geometry::CoordinateSystem& cs) const { - return GetStackData().GetVelocity(cs, GetIndex()); - } - - corsika::units::si::TimeType GetTime() const { - return GetStackData().GetTime(GetIndex()); - } - - corsika::geometry::Vector<corsika::units::si::dimensionless_d> GetDirection( - const corsika::geometry::CoordinateSystem& cs) const { - return GetStackData().GetDirection(cs); - } - - corsika::units::si::TimeType GetTimeInterval() const { - return GetStackData().GetTimeInterval(); - } - }; - - /** - * - * Memory implementation of the most simple (stupid) particle stack object. - */ - - class COASTStackImpl { - - const crs::CParticle* fParticle1 = 0; - const crs::CParticle* fParticle2 = 0; - - public: - COASTStackImpl(const crs::CParticle* v1, const crs::CParticle* v2) { - fParticle1 = v1; - fParticle2 = v2; - } - - void Init() {} - void Clear() {} - - // there is one particle only - int GetSize() const { return 1; } - int GetCapacity() const { return 1; } - - // you cannot modify the particle: - // there are no Set... function defined - - // readout particle data, there is just one particle! - /* - double x; - double y; - double z; - double depth; - double time; - double energy; - double weight; - int particleId; - int hadronicGeneration; - */ - corsika::particles::Code GetPID(const int) const { - return ConvertFromCoast(static_cast<CoastCode>(fParticle1->particleId)); - } - corsika::units::si::HEPEnergyType GetEnergy(const int) const { - using namespace corsika::units::si; - return fParticle1->energy * 1_GeV; - } - corsika::geometry::Vector<corsika::units::si::dimensionless_d> GetDirection( - const corsika::geometry::CoordinateSystem& cs) const { - using namespace corsika::units::si; - corsika::geometry::Point p1( - cs, {fParticle1->x * 1_cm, fParticle1->y * 1_cm, fParticle1->z * 1_cm}); - corsika::geometry::Point p2( - cs, {fParticle2->x * 1_cm, fParticle2->y * 1_cm, fParticle2->z * 1_cm}); - const corsika::geometry::Vector D = p2 - p1; - const auto magD = D.norm(); - const corsika::geometry::Vector dir = D / magD; - return dir; - } - corsika::geometry::Vector<corsika::units::si::speed_d> GetVelocity( - const corsika::geometry::CoordinateSystem& cs, const int) const { - using namespace corsika::units::si; - corsika::geometry::Vector<corsika::units::si::dimensionless_d> dir = - GetDirection(cs); - corsika::geometry::Point p1( - cs, {fParticle1->x * 1_cm, fParticle1->y * 1_cm, fParticle1->z * 1_cm}); - corsika::geometry::Point p2( - cs, {fParticle2->x * 1_cm, fParticle2->y * 1_cm, fParticle2->z * 1_cm}); - const corsika::geometry::Vector D = p2 - p1; - const LengthType magD = D.norm(); - const TimeType deltaT = GetTimeInterval(); - return dir * magD / deltaT; - } - corsika::geometry::Point GetPosition(const corsika::geometry::CoordinateSystem& cs, - const int) const { - using namespace corsika::units::si; - return corsika::geometry::Point( - cs, {fParticle1->x * 1_cm, fParticle1->y * 1_cm, fParticle1->z * 1_cm}); - } - corsika::units::si::TimeType GetTime(const int) const { - using namespace corsika::units::si; - return fParticle1->time * 1_s; - } - - corsika::units::si::TimeType GetTimeInterval() const { - using namespace corsika::units::si; - return (fParticle2->time - fParticle1->time) * 1_s; - } - - /** - * We do not allow copying! - */ - void Copy(const int, const int) {} - - /** - * We do not allow swapping particles, there is just one... - */ - void Swap(const int, const int) {} - - // size cannot be increased, do nothing - void IncrementSize() {} - - // size cannot be decremented, do nothing - void DecrementSize() {} - - }; // end class COASTStackImpl - - typedef corsika::stack::Stack<COASTStackImpl, ParticleInterface> COASTStack; - -} // namespace corsika::coast diff --git a/COAST/COASTUserLib.cc b/COAST/COASTUserLib.cc deleted file mode 100644 index d5b8b0b7c..000000000 --- a/COAST/COASTUserLib.cc +++ /dev/null @@ -1,107 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#include <interface/CorsikaInterface.h> - -#include <corsika/coast/COASTProcess.h> -#include <corsika/coast/COASTStack.h> -#include <corsika/geometry/CoordinateSystem.h> -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Trajectory.h> -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> - -#include <crs/CInteraction.h> -#include <crs/CParticle.h> -#include <crs/CorsikaTypes.h> -#include <crs/TSubBlock.h> - -#include <iostream> -#include <sstream> - -using namespace std; -using namespace corsika; -using namespace corsika::units::si; - -corsika::coast::COASTProcess gCorsikaProcess; - -/* - Data is one CORSIKA data-block constining of 21 SubBlocks. - A SubBlock can be: - - thinned mode: 39 (Particles) * 8 (ENTRIES) * 4 (BYTES) - - not-thinned mode: 39 (Particles) * 7 (ENTRIES) * 4 (BYTES) -*/ -extern "C" void wrida_([[maybe_unused]] const CREAL* Data) { - // crs::CParticleFortranPtr p; - // const bool isF = prminfo_(p); -} - -extern "C" void inida_([[maybe_unused]] const char* filename, - [[maybe_unused]] const int& thinning, - [[maybe_unused]] const int& /*curved*/, - [[maybe_unused]] const int& /*slant*/, - [[maybe_unused]] const int& /*stackinput*/, - [[maybe_unused]] const int& /*preshower*/, - [[maybe_unused]] int str_length) { - gCorsikaProcess.Init(); -} - -extern "C" void cloda_() { - // crs::CParticleFortranPtr pptr; - // const bool isF = prminfo_(pptr); - // gCorsikaProcess.Close(); -} - -void interaction_([[maybe_unused]] const crs::CInteraction& interaction) { - /* - all interactions in the shower are available in this function ! - the information availabel in the CInteraction class are: - double x; - double y; - double z; - double etot; // lab energy - double sigma; // cross-section of process - double kela; // elasticity - int projId; // projectile - int targetId; // target - double time; - */ -} - -extern "C" void track_([[maybe_unused]] const crs::CParticle& pre, - [[maybe_unused]] const crs::CParticle& post) { - /* - all particles in the shower are available in this function ! - The pre and post objecte are the two endpoints for one single track - in the shower, where the information available in CParticle is: - double x; - double y; - double z; - double depth; - double time; - double energy; - double weight; - int particleId; - int hadronicGeneration; - */ - coast::COASTStack stack(&pre, &post); - const auto particle = stack.GetNextParticle(); - const geometry::CoordinateSystem& rootCS = - geometry::RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); - geometry::Line const line(particle.GetPosition(rootCS), particle.GetVelocity(rootCS)); - const TimeType time = particle.GetTimeInterval(); - const geometry::Trajectory<geometry::Line> track(line, time); - gCorsikaProcess.DoContinuous(particle, track, stack); -} - -extern "C" void tabularizedatmosphere_([[maybe_unused]] const int& nPoints, - [[maybe_unused]] const double* height, - [[maybe_unused]] const double* refractiveIndex) { - // for special use only but should be defined because it is delcared in CORSIKA.F -} diff --git a/COAST/ParticleConversion.cc b/COAST/ParticleConversion.cc deleted file mode 100644 index de8ca909f..000000000 --- a/COAST/ParticleConversion.cc +++ /dev/null @@ -1,35 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#include <corsika/coast/ParticleConversion.h> -#include <corsika/particles/ParticleProperties.h> - -#include <exception> -#include <iostream> -#include <sstream> - -using namespace std; - -namespace corsika::coast { - - /** - Convert particle code, and check if it does exists. Throw exeption, if not! - */ - - corsika::particles::Code ConvertFromCoast(CoastCode pCode) { - if (coast2corsika.count(pCode) == 0) { - ostringstream err; - err << "corsika::coast::ConvertFromCoast CoastCode does not exists=" - << static_cast<CoastCodeIntType>(pCode) << endl; - cout << err.str() << endl; - throw std::runtime_error(err.str()); - } - return coast2corsika.find(pCode)->second; - } - -} // namespace corsika::coast diff --git a/COAST/ParticleConversion.h b/COAST/ParticleConversion.h deleted file mode 100644 index 68613783b..000000000 --- a/COAST/ParticleConversion.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/particles/ParticleProperties.h> - -#include <map> - -namespace corsika::coast { - - /** - Here we define the original CORSIKA particle codes, see corsika manual - */ - enum class CoastCode : int16_t { - Gamma = 1, - Positron = 2, - Electron = 3, - MuonBar = 5, - Muon = 6, - Pi0 = 7, - PiP = 8, - PiM = 9, - Klong = 10, - KP = 11, - KM = 12, - Neutron = 13, - Proton = 14, - ProtonBar = 15, - Kshort = 16, - Eta = 17, - Lambda = 18, - SigmaPlus = 19, - Sigma0 = 20, - SigmaMinus = 21, - Xi0 = 22, - XiMinus = 23, - OmegaMinus = 24, - NeutronBar = 25, - LambdaBar = 26, - SigmaMinusBar = 27, - Sigma0Bar = 28, - SigmaPlusBar = 29, - Xi0Bar = 30, - XiPlusBar = 31, - OmegaPlusBar = 32, - - EtaPrime = 48, - Phi = 49, - omega = 50, - Rho0 = 51, - RhoPlus = 52, - RhoMinus = 53, - DeltaPlusPlus = 54, - DeltaPlus = 55, - Delta0 = 56, - DeltaMinus = 57, - DeltaMinusMinusBar = 58, - DeltaMinusBar = 59, - Delta0Bar = 60, - DeltaPlusBar = 61, - KStar0 = 62, - KStarPlus = 63, - KStarMinus = 64, - KStar0Bar = 65, - - NeutrinoE = 66, - NeutrinoEBar = 67, - NeutrinoMu = 68, - NeutrinoMuBar = 69, - - Code71 = 71, - Code72 = 72, - Code73 = 73, - Code74 = 74, - Code75 = 75, - Code76 = 76, - - Code85 = 85, - Code86 = 86, - - Code95 = 95, - Code96 = 96, - - ProtonNucleus = 101, - Deuterium = 201, - Tritium = 301, - He3 = 302, - Helium = 402, - Lithium = 603, - Beryllium = 904, - Boron = 1005, - Carbon = 1206, - Carbon13 = 1306, - Nitrogen = 1407, - Oxygen = 1608, - Fluor = 1809, - Neon21 = 2110, - Neon = 2210, - Argon = 1838, - Iron = 5628, - Xenon = 12854, - Radon = 13888, - }; - - using CoastCodeIntType = std::underlying_type<CoastCode>::type; - - /** - Here we convert CORSIKA7 to CORSIKA8 codes - */ - - const std::map<corsika::coast::CoastCode, corsika::particles::Code> coast2corsika = { - {CoastCode::Gamma, corsika::particles::Code::Gamma}, - {CoastCode::Positron, corsika::particles::Code::Positron}, - {CoastCode::Electron, corsika::particles::Code::Electron}, - //{CoastCode:: ,corsika::particles::Code::Unknown}, // 4 - {CoastCode::MuonBar, corsika::particles::Code::MuPlus}, - {CoastCode::Muon, corsika::particles::Code::MuMinus}, - {CoastCode::Pi0, corsika::particles::Code::Pi0}, - {CoastCode::PiP, corsika::particles::Code::PiPlus}, - {CoastCode::PiM, corsika::particles::Code::PiMinus}, - {CoastCode::Klong, corsika::particles::Code::K0Long}, // 10 - {CoastCode::KP, corsika::particles::Code::KPlus}, - {CoastCode::KM, corsika::particles::Code::KMinus}, - {CoastCode::Neutron, corsika::particles::Code::Neutron}, - {CoastCode::Proton, corsika::particles::Code::Proton}, // 14 - {CoastCode::ProtonBar, corsika::particles::Code::AntiProton}, - {CoastCode::Kshort, corsika::particles::Code::K0Short}, - {CoastCode::Eta, corsika::particles::Code::Eta}, // 17 - {CoastCode::Lambda, corsika::particles::Code::Lambda0}, - {CoastCode::SigmaPlus, corsika::particles::Code::SigmaPlus}, - {CoastCode::Sigma0, corsika::particles::Code::Sigma0}, // 20 - {CoastCode::SigmaMinus, corsika::particles::Code::SigmaMinus}, - {CoastCode::Xi0, corsika::particles::Code::Xi0}, - {CoastCode::XiMinus, corsika::particles::Code::XiMinus}, - {CoastCode::OmegaMinus, corsika::particles::Code::OmegaMinus}, - {CoastCode::NeutronBar, corsika::particles::Code::AntiNeutron}, // 25 - {CoastCode::LambdaBar, corsika::particles::Code::Lambda0Bar}, - {CoastCode::SigmaMinusBar, corsika::particles::Code::SigmaMinusBar}, - {CoastCode::Sigma0Bar, corsika::particles::Code::Sigma0Bar}, - {CoastCode::SigmaPlusBar, corsika::particles::Code::SigmaPlusBar}, - {CoastCode::Xi0Bar, corsika::particles::Code::Xi0Bar}, - {CoastCode::XiPlusBar, corsika::particles::Code::XiPlusBar}, - {CoastCode::OmegaPlusBar, corsika::particles::Code::OmegaPlusBar}, // 32 - //{CoastCode:: ,corsika::particles::Code::Unknown}, // eta-prime - //{CoastCode:: ,corsika::particles::Code::Unknown}, // PHI - //{CoastCode:: ,corsika::particles::Code::Unknown}, // omega - {CoastCode::Rho0, corsika::particles::Code::Rho0}, // 51 - {CoastCode::RhoPlus, corsika::particles::Code::RhoPlus}, - {CoastCode::RhoMinus, corsika::particles::Code::RhoMinus}, - {CoastCode::DeltaPlusPlus, corsika::particles::Code::DeltaPlusPlus}, - {CoastCode::DeltaPlus, corsika::particles::Code::DeltaPlus}, - {CoastCode::Delta0, corsika::particles::Code::Delta0}, // 56 - //{CoastCode:: ,corsika::particles::Code::Unknown}, // DeltaMinus}, - {CoastCode::DeltaMinusMinusBar, corsika::particles::Code::DeltaMinusMinusBar}, - {CoastCode::DeltaMinusBar, corsika::particles::Code::DeltaMinusBar}, - {CoastCode::Delta0Bar, corsika::particles::Code::Delta0Bar}, - //{CoastCode:: ,corsika::particles::Code::Unknown}, // DeltaPlusBar - {CoastCode::KStar0, corsika::particles::Code::KStar0}, // 62 - {CoastCode::KStarPlus, corsika::particles::Code::KStarPlus}, - {CoastCode::KStarMinus, corsika::particles::Code::KStarMinus}, - {CoastCode::KStar0Bar, corsika::particles::Code::KStar0Bar}, - {CoastCode::NeutrinoE, corsika::particles::Code::NuE}, - {CoastCode::NeutrinoEBar, corsika::particles::Code::NuEBar}, - {CoastCode::NeutrinoMu, corsika::particles::Code::NuMu}, - {CoastCode::NeutrinoMuBar, corsika::particles::Code::NuMuBar}, // 69 - {CoastCode::Code71, corsika::particles::Code::Unknown}, - {CoastCode::Code72, corsika::particles::Code::Unknown}, - {CoastCode::Code73, corsika::particles::Code::Unknown}, - {CoastCode::Code74, corsika::particles::Code::Unknown}, - {CoastCode::Code75, corsika::particles::Code::Unknown}, - {CoastCode::Code76, corsika::particles::Code::Unknown}, - {CoastCode::Code85, corsika::particles::Code::Unknown}, - {CoastCode::Code86, corsika::particles::Code::Unknown}, - {CoastCode::Code95, corsika::particles::Code::Unknown}, - {CoastCode::Code96, corsika::particles::Code::Unknown}, - - {CoastCode::ProtonNucleus, corsika::particles::Code::Proton}, // 101 - {CoastCode::Deuterium, corsika::particles::Code::Deuterium}, - {CoastCode::Tritium, corsika::particles::Code::Tritium}, - {CoastCode::He3, corsika::particles::Code::Helium3}, - {CoastCode::Helium, corsika::particles::Code::Helium}, // 402 - //{CoastCode::Lithium, corsika::particles::Code::Lithium}, - //{CoastCode::Beryllium, corsika::particles::Code::Beryllium}, - //{CoastCode::Boron, corsika::particles::Code::Boron}, - //{CoastCode::Carbon, corsika::particles::Code::Carbon}, - //{CoastCode::Carbon13, corsika::particles::Code::Carbon13}, - //{CoastCode::Nitrogen, corsika::particles::Code::Nitrogen}, - //{CoastCode::Fluor, corsika::particles::Code::Fluor}, - //{CoastCode::Oxygen, corsika::particles::Code::Oxygen}, - //{CoastCode::Neon21, corsika::particles::Code::Neon21}, - //{CoastCode::Neon, corsika::particles::Code::Neon}, - //{CoastCode::Argon, corsika::particles::Code::Argon}, - //{CoastCode::Xenon, corsika::particles::Code::Xenon}, - //{CoastCode::Radon, corsika::particles::Code::Radon}, - {CoastCode::Iron, corsika::particles::Code::Iron}, // 5628 - - //{CoastCode::, corsika::particles::Code::}, - - }; - - corsika::particles::Code ConvertFromCoast(CoastCode pCode); - -} // namespace corsika::coast diff --git a/COAST/README.md b/COAST/README.md deleted file mode 100644 index 96e62845b..000000000 --- a/COAST/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# COAST interface {#COAST} - -With the COAST interface of CORSIKA 8 you can write a CORSIKA 8 -"process" class and link it to CORSIKA 7. This can be very powerful to -benchmark new CORSIKA 8 physics code in the context of "old" CORSIKA 7 -simulations. - -This is based on corsika7/trunk/coast/CoastOptions/example with an -additional interface to CORSIKA 8. See code in namespace corsika::coast for all details. - -We provide a step-by-step example for a "COAST user library" using CORSIKA 8 -technology. It explains the steps, how to use the COAST_USER_LIB -option of CORSIKA together with CORSIKA8/COAST - - -Step 1: -------- - -Configure CORSIKA8 with 'cmake -DWITH_COAST=1' and other options you -prefer. You have to define COAST_DIR environment variable to the -location of your existing CORSIKA7 installation. Check that 'ls -$COAST_DIR/include/interface' contains the file -'CorsikaInterface.h'. If this is not the case, this is not a valid or -proper installation of CORSIKA. First compile CORSIKA, e.g. with -ROOTOUT option, or CoReas to get COAST installed! - - -Step 2: -------- - -Compile CORSIKA8, edit COAST/COASTProcess.cc to modify/add your -physics module. - -There should be a libCOAST.so as a result! This is what you need. - - -Step 3: -------- - -Create COAST_USER_LIB environment variable to point at your current -directory, where now the 'libCOAST.so' library is located. -Add the path in $COAST_USER_LIB to your LD_LIBRARY_PATH environment -variable. - - -Step 4: -------- - -Go back to your CORSIKA directory and re-start 'coconut'. The option -COAST_USER_LIB will now be visible. Please select it, copile CORSIKA -and start the executable. In the generated console output you will the -statements from your COAST library during Init and Close of the -simulation. -Add any kind of code now working on the CParticle or -CInteraction class to start using the full power of COAST. - -Note: the default COASTProcess just prints out tons of ASCII. This is -not very useful, don't run a full MC with this... - - -Step 5: -------- - -enjoy... - diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 000470412..e2e3262aa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -81,20 +81,24 @@ While `clang-format` does the structural formatting, we still need to agree on n - *Everything* is part of one of those namespaces: - ```corsika::framework```, ```corsika::physics```, or ```corsika::process``` - All classes and objects are encapsulated into suited sub-namespaces, - thus ```corsika::framework::geometry```, ```corsika::physics::process```, ```corsika::physics::units```, etc. + thus corsika, corsikaes, corsika::units, etc. - Namespace names do not use capital letters. - - Every header file is located in the source tree in ```include/corsika/[namespace]```, which also means that in almost all cases each header file - can only provide definitions for a _single_ namespace. It is one - main purpose of namespaces to structure the location of header - files. - - Each header file uses an include protection ```#pragma once``` - immediately below the copyright statement. - - Header files should always be included with `<..>`, thus, - `#include <corsika/geometry/Point.h>` since the build system - will always provide the correct include directives (and files - anyway cannot be found in file-system paths, which generally do - not follow the namespace naming conventions outlined - here). + - Every header file is copied during build and install into + "include/corsika/[namespace]" which also means, each header file + can only provide definitions for a _single_ namespace. It is one + main purpose of namespaces to structure the location of header + files. + - Each header file uses an include protection that includes at + least the namespace name, and header file name, thus, `#ifndef + __include_geometry_Point_h__` or `#ifndef __geometry_Point_h__`, + or similar are acceptable. + - Header files should always be included with `<..>`, thus, + `#include <corsika/framework/geometry/Point.hpp>` since the build system + will always provide the correct include directives (and files + anyway cannot be found in file-system paths, which generally do + not follow the namespace naming conventions outlined + here). + - Header files are named after the main class (or object) they define. This also means each header file name starts with a capital letter. diff --git a/Documentation/CMakeLists.txt b/Documentation/CMakeLists.txt deleted file mode 100644 index ffab73c84..000000000 --- a/Documentation/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -add_subdirectory (Doxygen) -add_subdirectory (Examples) - diff --git a/Documentation/Doxygen/CMakeLists.txt b/Documentation/Doxygen/CMakeLists.txt deleted file mode 100644 index b3511f84d..000000000 --- a/Documentation/Doxygen/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ -find_package (Doxygen OPTIONAL_COMPONENTS dot mscgen dia) - -if (DOXYGEN_FOUND) - if (NOT DOXYGEN_DOT_EXECUTABLE) - message (FATAL_ERROR "Found doxygen but not 'dot' command, please install graphviz or set DOXYGEN_DOT_EXECUTABLE") - endif() - - set (DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in) - set (DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) - set (DOXYGEN_GENERATE_HTML YES) - set (DOXYGEN_GENERATE_MAN YES) - configure_file (${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY) - message ("Start doxygen with \"make doxygen\"") - - # note the option ALL which allows to build the docs together with the application - add_custom_target (doxygen # ALL - COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Generating API documentation with Doxygen" - VERBATIM) - - add_custom_command(TARGET doxygen POST_BUILD - COMMAND cd ${CMAKE_CURRENT_BINARY_DIR}/latex; pdflatex refman.tex - ) - - install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html DESTINATION share/doc OPTIONAL) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/latex/refman.pdf DESTINATION share/doc OPTIONAL) - -else (DOXYGEN_FOUND) - - message ("Doxygen need to be installed to generate the doxygen documentation") - -endif (DOXYGEN_FOUND) diff --git a/Documentation/Examples/stack_example.cc b/Documentation/Examples/stack_example.cc deleted file mode 100644 index cc638dbe8..000000000 --- a/Documentation/Examples/stack_example.cc +++ /dev/null @@ -1,59 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#include <corsika/particles/ParticleProperties.h> -#include <corsika/stack/super_stupid/SuperStupidStack.h> - -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> - -#include <cassert> -#include <iomanip> -#include <iostream> - -using namespace corsika; -using namespace corsika::units::si; -using namespace corsika::stack; -using namespace corsika::geometry; -using namespace std; - -void fill(corsika::stack::super_stupid::SuperStupidStack& s) { - const geometry::CoordinateSystem& rootCS = - geometry::RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); - for (int i = 0; i < 11; ++i) { - s.AddParticle( - std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ - particles::Code::Electron, 1.5_GeV * i, - corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, 1_GeV}), - geometry::Point(rootCS, 0_m, 0_m, 0_m), 0_ns}); - } -} - -void read(corsika::stack::super_stupid::SuperStupidStack& s) { - assert(s.getEntries() == 11); // stack has 11 particles - - HEPEnergyType total_energy; - int i = 0; - for (auto& p : s) { - total_energy += p.GetEnergy(); - // particles are electrons with 1.5 GeV energy times i - assert(p.GetPID() == particles::Code::Electron); - assert(p.GetEnergy() == 1.5_GeV * (i++)); - } -} - -int main() { - - std::cout << "stack_example" << std::endl; - - corsika::stack::super_stupid::SuperStupidStack s; - fill(s); - read(s); - return 0; -} diff --git a/Environment/CMakeLists.txt b/Environment/CMakeLists.txt deleted file mode 100644 index 3231ab4a8..000000000 --- a/Environment/CMakeLists.txt +++ /dev/null @@ -1,116 +0,0 @@ -add_custom_command ( - OUTPUT ${PROJECT_BINARY_DIR}/Environment/GeneratedMediaProperties.inc - COMMAND ${PROJECT_SOURCE_DIR}/Environment/readProperties.py - ${PROJECT_SOURCE_DIR}/Environment/properties8.dat - DEPENDS readProperties.py - properties8.dat - WORKING_DIRECTORY - ${PROJECT_BINARY_DIR}/Environment - COMMENT "Read NIST properties8 data file and produce C++ source code GeneratedMediaProperties.inc" - VERBATIM - ) - - -set ( - ENVIRONMENT_SOURCES - ShowerAxis.cc -) - -set ( - ENVIRONMENT_HEADERS - VolumeTreeNode.h - IEmpty.hpp - IMediumModel.h - NuclearComposition.h - HomogeneousMedium.h - InhomogeneousMedium.h - HomogeneousMedium.h - LinearApproximationIntegrator.h - DensityFunction.h - Environment.h - NameModel.h - BaseExponential.h - FlatExponential.h - SlidingPlanarExponential.h - LayeredSphericalAtmosphereBuilder.h - ShowerAxis.h - IMagneticFieldModel.h - UniformMagneticField.h - NoMagneticField.h - IRefractiveIndexModel.h - UniformRefractiveIndex.h - IMediumPropertyModel.h - MediumProperties.h - MediumPropertyModel.h - ${PROJECT_BINARY_DIR}/Environment/GeneratedMediaProperties.inc # this one is auto-generated - ) - -set ( - ENVIRONMENT_NAMESPACE - corsika/environment - ) - -add_library (CORSIKAenvironment STATIC ${ENVIRONMENT_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAenvironment ${ENVIRONMENT_NAMESPACE} ${ENVIRONMENT_HEADERS}) - -set_target_properties ( - CORSIKAenvironment - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 - PUBLIC_HEADER "${ENVIRONMENT_HEADERS}" - ) - -# .................................................... -# since GeneratedMediaProperties.inc is an automatically produced file in the build directory, -# create a symbolic link into the source tree, so that it can be found and edited more easily -# this is not needed for the build to succeed! ....... -add_custom_command ( - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/GeneratedParticleProperties.inc - COMMAND ${CMAKE_COMMAND} -E create_symlink ${PROJECT_BINARY_DIR}/include/corsika/environment/GeneratedMediaProperties.inc ${CMAKE_CURRENT_SOURCE_DIR}/GeneratedMediaProperties.inc - COMMENT "Generate link in source-dir: ${CMAKE_CURRENT_SOURCE_DIR}/GeneratedMediaProperties.inc" - ) -add_custom_target (SourceDirLinkMedia DEPENDS ${PROJECT_BINARY_DIR}/Environment/GeneratedMediaProperties.inc) -add_dependencies (CORSIKAenvironment SourceDirLinkMedia) -# ..................................................... - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - CORSIKAenvironment - CORSIKAgeometry - CORSIKAparticles - CORSIKAunits - CORSIKAlogging - ) - -target_include_directories ( - CORSIKAenvironment - PUBLIC - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include> - ) - -install ( - TARGETS CORSIKAenvironment - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION include/${ENVIRONMENT_NAMESPACE} - ) - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST(testEnvironment) -target_link_libraries ( - testEnvironment - CORSIKAsetup - CORSIKAenvironment - CORSIKAtesting - ) - -CORSIKA_ADD_TEST(testShowerAxis) -target_link_libraries ( - testShowerAxis - CORSIKAsetup - CORSIKAenvironment - CORSIKAtesting - ) diff --git a/Environment/Environment.h b/Environment/Environment.h deleted file mode 100644 index 1f807de45..000000000 --- a/Environment/Environment.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/environment/VolumeTreeNode.h> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Sphere.h> -#include <limits> - -namespace corsika::environment { - struct Universe : public corsika::geometry::Sphere { - Universe(corsika::geometry::CoordinateSystem const& pCS) - : corsika::geometry::Sphere( - corsika::geometry::Point{pCS, 0 * corsika::units::si::meter, - 0 * corsika::units::si::meter, - 0 * corsika::units::si::meter}, - corsika::units::si::meter * std::numeric_limits<double>::infinity()) {} - - bool Contains(corsika::geometry::Point const&) const override { return true; } - }; - - template <typename IEnvironmentModel> - class Environment { - public: - using BaseNodeType = VolumeTreeNode<IEnvironmentModel>; - - Environment() - : fCoordinateSystem{corsika::geometry::RootCoordinateSystem::GetInstance() - .GetRootCoordinateSystem()} - , fUniverse(std::make_unique<BaseNodeType>( - std::make_unique<Universe>(fCoordinateSystem))) {} - - auto& GetUniverse() { return fUniverse; } - auto const& GetUniverse() const { return fUniverse; } - - auto const& GetCoordinateSystem() const { return fCoordinateSystem; } - - // factory method for creation of VolumeTreeNodes - template <class TVolumeType, typename... TVolumeArgs> - static auto CreateNode(TVolumeArgs&&... args) { - static_assert(std::is_base_of_v<corsika::geometry::Volume, TVolumeType>, - "unusable type provided, needs to be derived from " - "\"corsika::geometry::Volume\""); - - return std::make_unique<BaseNodeType>( - std::make_unique<TVolumeType>(std::forward<TVolumeArgs>(args)...)); - } - - private: - corsika::geometry::CoordinateSystem const& fCoordinateSystem; - typename BaseNodeType::VTNUPtr fUniverse; - }; - -} // namespace corsika::environment diff --git a/Environment/FlatExponential.h b/Environment/FlatExponential.h deleted file mode 100644 index 8aeafbce4..000000000 --- a/Environment/FlatExponential.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/environment/BaseExponential.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Point.h> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/units/PhysicalUnits.h> - -#include <corsika/setup/SetupTrajectory.h> - -namespace corsika::environment { - - //clang-format off - /** - * flat exponential density distribution with - * \f[ - * \varrho(r) = \varrho_0 \exp\left( \frac{1}{\lambda} (r - p) \cdot - * \vec{a} \right). - * \f] - * \f$ \vec{a} \f$ denotes the axis and should be normalized to avoid degeneracy - * with the scale parameter \f$ \lambda \f$. - */ - //clang-format on - template <class T> - class FlatExponential : public BaseExponential<FlatExponential<T>>, public T { - geometry::Vector<units::si::dimensionless_d> const fAxis; - NuclearComposition const fNuclComp; - - using Base = BaseExponential<FlatExponential<T>>; - - public: - FlatExponential(geometry::Point const& vP0, - geometry::Vector<units::si::dimensionless_d> const& vAxis, - units::si::MassDensityType vRho, units::si::LengthType vLambda, - NuclearComposition vNuclComp) - : Base(vP0, vRho, vLambda) - , fAxis(vAxis) - , fNuclComp(vNuclComp) {} - - units::si::MassDensityType GetMassDensity(geometry::Point const& vP) const override { - return Base::fRho0 * exp(Base::fInvLambda * (vP - Base::fP0).dot(fAxis)); - } - - NuclearComposition const& GetNuclearComposition() const override { return fNuclComp; } - - units::si::GrammageType IntegratedGrammage(setup::Trajectory const& vLine, - units::si::LengthType vTo) const override { - return Base::IntegratedGrammage(vLine, vTo, fAxis); - } - - units::si::LengthType ArclengthFromGrammage( - setup::Trajectory const& vLine, - units::si::GrammageType vGrammage) const override { - return Base::ArclengthFromGrammage(vLine, vGrammage, fAxis); - } - }; -} // namespace corsika::environment diff --git a/Environment/HomogeneousMedium.h b/Environment/HomogeneousMedium.h deleted file mode 100644 index f39cc7061..000000000 --- a/Environment/HomogeneousMedium.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/environment/NuclearComposition.h> -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Trajectory.h> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/random/RNGManager.h> -#include <corsika/units/PhysicalUnits.h> - -#include <corsika/setup/SetupTrajectory.h> - -#include <cassert> - -/** - * a homogeneous medium - */ - -namespace corsika::environment { - - template <class T> - class HomogeneousMedium : public T { - corsika::units::si::MassDensityType const fDensity; - NuclearComposition const fNuclComp; - - public: - HomogeneousMedium(corsika::units::si::MassDensityType pDensity, - NuclearComposition pNuclComp) - : fDensity(pDensity) - , fNuclComp(pNuclComp) {} - - corsika::units::si::MassDensityType GetMassDensity( - corsika::geometry::Point const&) const override { - return fDensity; - } - NuclearComposition const& GetNuclearComposition() const override { return fNuclComp; } - - corsika::units::si::GrammageType IntegratedGrammage( - corsika::setup::Trajectory const&, - corsika::units::si::LengthType pTo) const override { - using namespace corsika::units::si; - return pTo * fDensity; - } - - corsika::units::si::LengthType ArclengthFromGrammage( - corsika::setup::Trajectory const&, - corsika::units::si::GrammageType pGrammage) const override { - return pGrammage / fDensity; - } - }; - -} // namespace corsika::environment diff --git a/Environment/LinearApproximationIntegrator.h b/Environment/LinearApproximationIntegrator.h deleted file mode 100644 index 3a6c37ccb..000000000 --- a/Environment/LinearApproximationIntegrator.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <limits> - -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Point.h> -#include <corsika/setup/SetupTrajectory.h> - -namespace corsika::environment { - template <class TDerived> - class LinearApproximationIntegrator { - auto const& GetImplementation() const { return *static_cast<TDerived const*>(this); } - - public: - auto IntegrateGrammage(corsika::setup::Trajectory const& line, - corsika::units::si::LengthType length) const { - auto const c0 = GetImplementation().EvaluateAt(line.GetPosition(0)); - auto const c1 = GetImplementation().fRho.FirstDerivative(line.GetPosition(0), - line.GetDirection(0)); - return (c0 + 0.5 * c1 * length) * length; - } - - auto ArclengthFromGrammage(corsika::setup::Trajectory const& line, - corsika::units::si::GrammageType grammage) const { - auto const c0 = GetImplementation().fRho(line.GetPosition(0)); - auto const c1 = GetImplementation().fRho.FirstDerivative(line.GetPosition(0), - line.GetDirection(0)); - - return (1 - 0.5 * grammage * c1 / (c0 * c0)) * grammage / c0; - } - - auto MaximumLength(corsika::setup::Trajectory const& line, - [[maybe_unused]] double relError) const { - using namespace corsika::units::si; - [[maybe_unused]] auto const c1 = GetImplementation().fRho.SecondDerivative( - line.GetPosition(0), line.GetDirection(0)); - - // todo: provide a real, working implementation - return 1_m * std::numeric_limits<double>::infinity(); - } - }; -} // namespace corsika::environment diff --git a/Environment/NuclearComposition.h b/Environment/NuclearComposition.h deleted file mode 100644 index 42b1beca0..000000000 --- a/Environment/NuclearComposition.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/particles/ParticleProperties.h> -#include <corsika/units/PhysicalUnits.h> - -#include <cassert> -#include <functional> -#include <numeric> -#include <random> -#include <stdexcept> -#include <vector> - -namespace corsika::environment { - class NuclearComposition { - std::vector<float> const fNumberFractions; //!< relative fractions of number density - std::vector<corsika::particles::Code> const - fComponents; //!< particle codes of consitutents - - double const fAvgMassNumber; - - std::size_t hash_; - - template <class AConstIterator, class BConstIterator> - class WeightProviderIterator { - AConstIterator fAIter; - BConstIterator fBIter; - - public: - using value_type = double; - using iterator_category = std::input_iterator_tag; - using pointer = value_type*; - using reference = value_type&; - using difference_type = ptrdiff_t; - - WeightProviderIterator(AConstIterator a, BConstIterator b) - : fAIter(a) - , fBIter(b) {} - - value_type operator*() const { return ((*fAIter) * (*fBIter)).magnitude(); } - - WeightProviderIterator& operator++() { // prefix ++ - ++fAIter; - ++fBIter; - return *this; - } - - auto operator==(WeightProviderIterator other) { return fAIter == other.fAIter; } - - auto operator!=(WeightProviderIterator other) { return !(*this == other); } - }; - - public: - NuclearComposition(std::vector<corsika::particles::Code> pComponents, - std::vector<float> pFractions) - : fNumberFractions(pFractions) - , fComponents(pComponents) - , fAvgMassNumber(std::inner_product( - pComponents.cbegin(), pComponents.cend(), pFractions.cbegin(), 0., - std::plus<double>(), [](auto const compID, auto const fraction) -> double { - if (particles::IsNucleus(compID)) { - return particles::GetNucleusA(compID) * fraction; - } else { - return particles::GetMass(compID) / - units::si::ConvertSIToHEP(units::constants::u) * fraction; - } - })) { - assert(pComponents.size() == pFractions.size()); - auto const sumFractions = - std::accumulate(pFractions.cbegin(), pFractions.cend(), 0.f); - - if (!(0.999f < sumFractions && sumFractions < 1.001f)) { - throw std::runtime_error("element fractions do not add up to 1"); - } - updateHash(); - } - - template <typename TFunction> - auto WeightedSum(TFunction func) const { - using ResultQuantity = decltype(func(*fComponents.cbegin())); - - auto const prod = [&](auto const compID, auto const fraction) { - return func(compID) * fraction; - }; - - if constexpr (phys::units::is_quantity_v<ResultQuantity>) { - return std::inner_product( - fComponents.cbegin(), fComponents.cend(), fNumberFractions.cbegin(), - ResultQuantity::zero(), // .zero() is defined for quantity types only - std::plus<ResultQuantity>(), prod); - } else { - return std::inner_product( - fComponents.cbegin(), fComponents.cend(), fNumberFractions.cbegin(), - ResultQuantity(0), // in other cases we have to use a bare 0 - std::plus<ResultQuantity>(), prod); - } - } - - auto size() const { return fNumberFractions.size(); } - - auto const& GetFractions() const { return fNumberFractions; } - auto const& GetComponents() const { return fComponents; } - auto const GetAverageMassNumber() const { return fAvgMassNumber; } - - template <class TRNG> - corsika::particles::Code SampleTarget( - std::vector<corsika::units::si::CrossSectionType> const& sigma, - TRNG& randomStream) const { - using namespace corsika::units::si; - - assert(sigma.size() == fNumberFractions.size()); - - std::discrete_distribution channelDist( - WeightProviderIterator<decltype(fNumberFractions.begin()), - decltype(sigma.begin())>(fNumberFractions.begin(), - sigma.begin()), - WeightProviderIterator<decltype(fNumberFractions.begin()), - decltype(sigma.end())>(fNumberFractions.end(), - sigma.end())); - - auto const iChannel = channelDist(randomStream); - return fComponents[iChannel]; - } - - // Note: when this class ever modifies its internal data, the hash - // must be updated, too! - size_t hash() const { return hash_; } - - private: - void updateHash() { - std::vector<std::size_t> hashes; - for (float ifrac : GetFractions()) hashes.push_back(std::hash<float>{}(ifrac)); - for (corsika::particles::Code icode : GetComponents()) - hashes.push_back(std::hash<int>{}(static_cast<int>(icode))); - std::size_t h = std::hash<double>{}(GetAverageMassNumber()); - for (std::size_t ih : hashes) h = h ^ (ih << 1); - hash_ = h; - } - }; - -} // namespace corsika::environment diff --git a/Environment/SlidingPlanarExponential.h b/Environment/SlidingPlanarExponential.h deleted file mode 100644 index aae3ccef1..000000000 --- a/Environment/SlidingPlanarExponential.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/environment/FlatExponential.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Trajectory.h> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/random/RNGManager.h> -#include <corsika/units/PhysicalUnits.h> - -namespace corsika::environment { - - // clang-format off - /** - * The SlidingPlanarExponential models mass density as - * \f[ - * \varrho(r) = \varrho_0 \exp\left( \frac{|p_0 - r|}{\lambda} \right). - * \f] - * For grammage/length conversion, the density distribution is approximated as - * locally flat at the starting point \f$ r_0 \f$ of the trajectory with the axis pointing - * from \f$ p_0 \f$ to \f$ r_0 \f$. - */ - //clang-format on - - template <class T> - class SlidingPlanarExponential : public BaseExponential<SlidingPlanarExponential<T>>, - public T { - NuclearComposition const nuclComp_; - units::si::LengthType const referenceHeight_; - - using Base = BaseExponential<SlidingPlanarExponential<T>>; - - public: - SlidingPlanarExponential(geometry::Point const& p0, units::si::MassDensityType rho0, - units::si::LengthType lambda, NuclearComposition nuclComp, units::si::LengthType referenceHeight = units::si::LengthType::zero()) - : Base(p0, rho0, lambda) - , nuclComp_(nuclComp), - referenceHeight_(referenceHeight) {} - - units::si::MassDensityType GetMassDensity( - geometry::Point const& p) const override { - auto const height = (p - Base::fP0).norm() - referenceHeight_; - return Base::fRho0 * exp(Base::fInvLambda * height); - } - - NuclearComposition const& GetNuclearComposition() const override { return nuclComp_; } - - units::si::GrammageType IntegratedGrammage( - setup::Trajectory const& line, - units::si::LengthType l) const override { - auto const axis = (line.GetLine().GetR0() - Base::fP0).normalized(); - return Base::IntegratedGrammage(line, l, axis); - } - - units::si::LengthType ArclengthFromGrammage( - setup::Trajectory const& line, - units::si::GrammageType grammage) const override { - auto const axis = (line.GetLine().GetR0() - Base::fP0).normalized(); - return Base::ArclengthFromGrammage(line, grammage, axis); - } - }; - -} // namespace corsika::environment diff --git a/Environment/VolumeTreeNode.h b/Environment/VolumeTreeNode.h deleted file mode 100644 index ad3306810..000000000 --- a/Environment/VolumeTreeNode.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/environment/IEmpty.hpp> -#include <corsika/geometry/Volume.h> -#include <memory> -#include <vector> - -namespace corsika::environment { - - template <typename TModelProperties = IEmpty> - class VolumeTreeNode { - public: - using IModelProperties = TModelProperties; - using VTN_type = VolumeTreeNode<IModelProperties>; - using VTNUPtr = std::unique_ptr<VolumeTreeNode<IModelProperties>>; - using IMPSharedPtr = std::shared_ptr<IModelProperties>; - using VolUPtr = std::unique_ptr<corsika::geometry::Volume>; - - VolumeTreeNode(VolUPtr pVolume = nullptr) - : fGeoVolume(std::move(pVolume)) {} - - //! convenience function equivalent to Volume::Contains - bool Contains(corsika::geometry::Point const& p) const { - return fGeoVolume->Contains(p); - } - - VolumeTreeNode<IModelProperties> const* Excludes( - corsika::geometry::Point const& p) const { - auto exclContainsIter = - std::find_if(fExcludedNodes.cbegin(), fExcludedNodes.cend(), - [&](auto const& s) { return bool(s->Contains(p)); }); - - return exclContainsIter != fExcludedNodes.cend() ? *exclContainsIter : nullptr; - } - - /** returns a pointer to the sub-VolumeTreeNode which is "responsible" for the given - * \class Point \p p, or nullptr iff \p p is not contained in this volume. - */ - VolumeTreeNode<IModelProperties> const* GetContainingNode( - corsika::geometry::Point const& p) const { - if (!Contains(p)) { return nullptr; } - - if (auto const childContainsIter = - std::find_if(fChildNodes.cbegin(), fChildNodes.cend(), - [&](auto const& s) { return bool(s->Contains(p)); }); - childContainsIter == fChildNodes.cend()) // not contained in any of the children - { - if (auto const exclContainsIter = Excludes(p)) // contained in any excluded nodes - { - return exclContainsIter->GetContainingNode(p); - } else { - return this; - } - } else { - return (*childContainsIter)->GetContainingNode(p); - } - } - - /** - * Traverses the VolumeTree pre- or post-order and calls the functor \p func for each - * node. \p func takes a reference to VolumeTreeNode as argument. The return value \p - * func is ignored. - */ - template <typename TCallable, bool preorder = true> - void walk(TCallable func) { - if constexpr (preorder) { func(*this); } - - std::for_each(fChildNodes.begin(), fChildNodes.end(), - [&](auto& v) { v->walk(func); }); - - if constexpr (!preorder) { func(*this); }; - } - - void AddChild(VTNUPtr pChild) { - pChild->fParentNode = this; - fChildNodes.push_back(std::move(pChild)); - // It is a bad idea to return an iterator to the inserted element - // because it might get invalidated when the vector needs to grow - // later and the caller won't notice. - } - - void ExcludeOverlapWith(VTNUPtr const& pNode) { - fExcludedNodes.push_back(pNode.get()); - } - - const VTN_type* GetParent() const { return fParentNode; }; - - auto const& GetChildNodes() const { return fChildNodes; } - - auto const& GetExcludedNodes() const { return fExcludedNodes; } - - auto const& GetVolume() const { return *fGeoVolume; } - - auto const& GetModelProperties() const { return *fModelProperties; } - - bool HasModelProperties() const { return fModelProperties.get() != nullptr; } - - template <typename ModelProperties, typename... Args> - auto SetModelProperties(Args&&... args) { - static_assert(std::is_base_of_v<IModelProperties, ModelProperties>, - "unusable model properties type provided"); - - fModelProperties = std::make_shared<ModelProperties>(std::forward<Args>(args)...); - return fModelProperties; - } - - void SetModelProperties(IMPSharedPtr ptr) { fModelProperties = ptr; } - - /* - template <class MediumType, typename... Args> - static auto CreateMedium(Args&&... args) { - static_assert(std::is_base_of_v<, MediumType>, - "unusable type provided, needs to be derived from \"IMediumModel\""); - - return std::make_shared<MediumType>(std::forward<Args>(args)...); - } - */ - private: - std::vector<VTNUPtr> fChildNodes; - std::vector<VolumeTreeNode<IModelProperties> const*> fExcludedNodes; - VolumeTreeNode<IModelProperties> const* fParentNode = nullptr; - VolUPtr fGeoVolume; - IMPSharedPtr fModelProperties; - }; - -} // namespace corsika::environment diff --git a/FIXME.md b/FIXME.md new file mode 100644 index 000000000..9a5acb220 --- /dev/null +++ b/FIXME.md @@ -0,0 +1,5129 @@ +#All files: + +1. In all files do `#define guards` -> `#pragma once` to get faster compile times +2. Redefine the folder structure: + + +``` +#include <corsika/coast/...> +#include <hydra/...> + +corsika +|-- cmake +| |-- CodeCoverage +| |-- CodeCoverage.cmake +| |-- CorsikaUtilities.cmake +| `-- FindPythia8.cmake +|-- coast +| |-- COASTProcess.h +| |-- COASTStack.h +| `-- ParticleConversion.h +|-- docs +|-- |doxygen +| `-- Doxyfile.in +|-- testing +| +|-- examples +| |-- boundary_example.cc +| |-- cascade_example.cc +| |-- cascade_proton_example.cc +| |-- CMakeLists.txt +| |-- geometry_example.cc +| |-- helix_example.cc +| |-- logger_example.cc +| |-- stack_example.cc +| |-- staticsequence_example.cc +| |-- stopping_power.cc +| `-- vertical_EAS.cc +|-- environment +| |-- BaseExponential.h +| |-- DensityFunction.h +| |-- Environment.h +| |-- FlatExponential.h +| |-- HomogeneousMedium.h +| |-- IMediumModel.hpp +| |-- InhomogeneousMedium.h +| |-- LayeredSphericalAtmosphereBuilder.h +| |-- LinearApproximationIntegrator.h +| |-- NameModel.h +| |-- NuclearComposition.h +| |-- SlidingPlanarExponential.h +| `-- VolumeTreeNode.hpp +|-- framework +| |-- cascade +| | |-- Cascade.h +| |-- geometry +| | |-- BaseTrajectory.h +| | |-- BaseVector.h +| | |-- CMakeLists.txt +| | |-- CoordinateSystem.h +| | |-- FourVector.h +| | |-- Helix.h +| | |-- Line.h +| | |-- Plane.h +| | |-- Point.h +| | |-- QuantityVector.h +| | |-- RootCoordinateSystem.h +| | |-- Sphere.h +| | |-- Trajectory.h +| | |-- Vector.h +| | `-- Volume.h +| |-- logging +| | |-- BufferedSink.h +| | |-- Logger.h +| | |-- MessageOff.h +| | |-- MessageOn.h +| | |-- NoSink.h +| | `-- Sink.h +| |-- Particles +| | `-- ParticleProperties.h +| |-- ProcessSequence +| | |-- BaseProcess.h +| | |-- BoundaryCrossingProcess.h +| | |-- ContinuousProcess.h +| | |-- DecayProcess.h +| | |-- InteractionProcess.h +| | |-- ProcessReturn.h +| | |-- ProcessSequence.h +| | |-- ProcessSignature.h +| | |-- SecondariesProcess.h +| | `-- StackProcess.h +| |-- Random +| | |-- CMakeLists.txt +| | |-- ExponentialDistribution.h +| | |-- RNGManager.h +| | `-- UniformRealDistribution.h +| |-- StackInterface +| | |-- CMakeLists.txt +| | |-- CombinedStack.h +| | |-- comp +| | |-- ParticleBase.h +| | |-- SecondaryView.h +| | |-- Stack.dox +| | |-- Stack.h +| | `-- StackIteratorInterface.h +| |-- Testing +| | |-- test{...}.cc +| |-- Units +| | |-- CMakeLists.txt +| | |-- PhysicalConstants.h +| | |-- PhysicalUnits.h +| | `-- testUnits.cc +| |-- Utilities +| | |-- Bit.h +| | |-- CMakeLists.txt +| | |-- COMBoost.cc +| | |-- COMBoost.h +| | |-- CorsikaFenvDefault.cc +| | |-- CorsikaFenvFallback.cc +| | |-- CorsikaFenv.h +| | |-- CorsikaFenvOSX.cc +| | |-- MetaProgramming.h +| | |-- sgn.h +| | |-- Singleton.h +| | |-- testCOMBoost.cc +| | |-- testCorsikaFenv.cc +| | `-- try_feenableexcept.cc +| `-- CMakeLists.txt +|-- Main +| |-- CMakeLists.txt +| `-- shower.cc +|-- nuc +| |-- DataSet04.dat +| |-- ExpDatabase_Fortran77_v04.tar.gz +| |-- input04.f +| |-- main04.f +| `-- Makefile_ifc +|-- Processes +| |-- EnergyLoss +| | |-- CMakeLists.txt +| | |-- EnergyLoss.cc +| | |-- EnergyLoss.h +| | |-- Properties8.dat +| | |-- ReadData.py +| | `-- SummaryPropTable.dat +| |-- HadronicElasticModel +| | |-- CMakeLists.txt +| | |-- HadronicElasticModel.cc +| | `-- HadronicElasticModel.h +| |-- NullModel +| | |-- CMakeLists.txt +| | |-- NullModel.cc +| | |-- NullModel.h +| | `-- testNullModel.cc +| |-- ObservationPlane +| | |-- CMakeLists.txt +| | |-- ObservationPlane.cc +| | |-- ObservationPlane.h +| | `-- testObservationPlane.cc +| |-- ParticleCut +| | |-- CMakeLists.txt +| | |-- ParticleCut.cc +| | |-- ParticleCut.h +| | `-- testParticleCut.cc +| |-- Pythia +| | |-- CMakeLists.txt +| | |-- Decay.cc +| | |-- Decay.h +| | |-- Interaction.cc +| | |-- Interaction.h +| | |-- Random.cc +| | |-- Random.h +| | `-- testPythia.cc +| |-- QGSJetII +| | |-- CMakeLists.txt +| | |-- code_generator.py +| | |-- Interaction.cc +| | |-- Interaction.h +| | |-- ParticleConversion.cc +| | |-- ParticleConversion.h +| | |-- qgsjet-II-04.cc +| | |-- qgsjet-II-04-codes.dat +| | |-- qgsjet-II-04.f +| | |-- qgsjet-II-04.h +| | |-- QGSJetIIFragmentsStack.h +| | |-- QGSJetIIStack.h +| | `-- testQGSJetII.cc +| |-- Sibyll +| | |-- CMakeLists.txt +| | |-- code_generator.py +| | |-- Decay.cc +| | |-- Decay.h +| | |-- gasdev.f +| | |-- Interaction.cc +| | |-- Interaction.h +| | |-- NuclearInteraction.cc +| | |-- NuclearInteraction.h +| | |-- nuclib.f +| | |-- nuclib.h +| | |-- ParticleConversion.cc +| | |-- ParticleConversion.h +| | |-- rndm_dbl.f +| | |-- SibStack.h +| | |-- sibyll2.3c.cc +| | |-- sibyll2.3c.f +| | |-- sibyll2.3c.h +| | |-- sibyll_codes.dat +| | |-- signuc.f +| | `-- testSibyll.cc +| |-- StackInspector +| | |-- CMakeLists.txt +| | |-- StackInspector.cc +| | |-- StackInspector.h +| | `-- testStackInspector.cc +| |-- SwitchProcess +| | |-- CMakeLists.txt +| | |-- SwitchProcess.h +| | `-- testSwitchProcess.cc +| |-- TrackingLine +| | |-- CMakeLists.txt +| | |-- testTrackingLine.cc +| | |-- testTrackingLineStack.h +| | |-- TrackingLine.cc +| | `-- TrackingLine.h +| |-- TrackWriter +| | |-- CMakeLists.txt +| | |-- TrackWriter.cc +| | `-- TrackWriter.h +| |-- UrQMD +| | |-- addpart.f +| | |-- angdis.f +| | |-- anndec.f +| | |-- blockres.f +| | |-- boxinc.f +| | |-- boxprg.f +| | |-- cascinit.f +| | |-- CMakeLists.txt +| | |-- colltab.f +| | |-- coload.f +| | |-- comnorm.f +| | |-- comres.f +| | |-- coms.f +| | |-- comstr.f +| | |-- comwid.f +| | |-- Copyright +| | |-- dectim.f +| | |-- delpart.f +| | |-- detbal.f +| | |-- dwidth.f +| | |-- error.f +| | |-- freezeout.f +| | |-- getmass.f +| | |-- getspin.f +| | |-- init.f +| | |-- inputs.f +| | |-- iso.f +| | |-- ityp2pdg.f +| | |-- jdecay2.f +| | |-- make22.f +| | |-- newpart.f +| | |-- numrec.f +| | |-- options.f +| | |-- outcom.f +| | |-- output.f +| | |-- paulibl.f +| | |-- proppot.f +| | |-- README +| | |-- saveinfo.f +| | |-- scatter.f +| | |-- siglookup.f +| | |-- string.f +| | |-- tabinit.f +| | |-- testUrQMD.cc +| | |-- UrQMD.cc +| | |-- urqmd.f +| | |-- UrQMD.h +| | |-- urqmdInterface.F +| | `-- whichres.f +| `-- CMakeLists.txt +|-- Setup +| |-- CMakeLists.txt +| |-- SetupEnvironment.h +| |-- SetupLogger.h +| |-- SetupStack.h +| `-- SetupTrajectory.h +|-- Stack +| |-- DummyStack +| | |-- CMakeLists.txt +| | `-- DummyStack.h +| |-- NuclearStackExtension +| | |-- CMakeLists.txt +| | |-- NuclearStackExtension.h +| | `-- testNuclearStackExtension.cc +| |-- SuperStupidStack +| | |-- CMakeLists.txt +| | |-- SuperStupidStack.h +| | `-- testSuperStupidStack.cc +| `-- CMakeLists.txt +|-- ThirdParty +| |-- boost +| | |-- algorithm +| | | |-- cxx11 +| | | | `-- all_of.hpp +| | | |-- string +| | | | |-- detail +| | | | | |-- case_conv.hpp +| | | | | |-- classification.hpp +| | | | | |-- finder.hpp +| | | | | |-- find_format_all.hpp +| | | | | |-- find_format.hpp +| | | | | |-- find_format_store.hpp +| | | | | |-- find_iterator.hpp +| | | | | |-- formatter.hpp +| | | | | |-- predicate.hpp +| | | | | |-- replace_storage.hpp +| | | | | |-- sequence.hpp +| | | | | |-- trim.hpp +| | | | | `-- util.hpp +| | | | |-- std +| | | | | |-- list_traits.hpp +| | | | | |-- slist_traits.hpp +| | | | | `-- string_traits.hpp +| | | | |-- case_conv.hpp +| | | | |-- classification.hpp +| | | | |-- compare.hpp +| | | | |-- concept.hpp +| | | | |-- config.hpp +| | | | |-- constants.hpp +| | | | |-- erase.hpp +| | | | |-- finder.hpp +| | | | |-- find_format.hpp +| | | | |-- find.hpp +| | | | |-- find_iterator.hpp +| | | | |-- formatter.hpp +| | | | |-- iter_find.hpp +| | | | |-- join.hpp +| | | | |-- predicate_facade.hpp +| | | | |-- predicate.hpp +| | | | |-- replace.hpp +| | | | |-- sequence_traits.hpp +| | | | |-- split.hpp +| | | | |-- std_containers_traits.hpp +| | | | |-- trim.hpp +| | | | `-- yes_no_type.hpp +| | | `-- string.hpp +| | |-- assign +| | | |-- assignment_exception.hpp +| | | `-- list_of.hpp +| | |-- bind +| | | |-- apply.hpp +| | | |-- arg.hpp +| | | |-- bind_cc.hpp +| | | |-- bind.hpp +| | | |-- bind_mf2_cc.hpp +| | | |-- bind_mf_cc.hpp +| | | |-- bind_template.hpp +| | | |-- mem_fn_cc.hpp +| | | |-- mem_fn.hpp +| | | |-- mem_fn_template.hpp +| | | |-- mem_fn_vw.hpp +| | | |-- placeholders.hpp +| | | `-- storage.hpp +| | |-- chrono +| | | |-- detail +| | | | |-- inlined +| | | | | |-- mac +| | | | | | |-- chrono.hpp +| | | | | | |-- process_cpu_clocks.hpp +| | | | | | `-- thread_clock.hpp +| | | | | |-- posix +| | | | | | |-- chrono.hpp +| | | | | | |-- process_cpu_clocks.hpp +| | | | | | `-- thread_clock.hpp +| | | | | |-- win +| | | | | | |-- chrono.hpp +| | | | | | |-- process_cpu_clocks.hpp +| | | | | | `-- thread_clock.hpp +| | | | | |-- chrono.hpp +| | | | | |-- process_cpu_clocks.hpp +| | | | | `-- thread_clock.hpp +| | | | |-- is_evenly_divisible_by.hpp +| | | | |-- static_assert.hpp +| | | | `-- system.hpp +| | | |-- chrono.hpp +| | | |-- clock_string.hpp +| | | |-- config.hpp +| | | |-- duration.hpp +| | | |-- process_cpu_clocks.hpp +| | | |-- system_clocks.hpp +| | | |-- thread_clock.hpp +| | | `-- time_point.hpp +| | |-- concept +| | | |-- detail +| | | | |-- backward_compatibility.hpp +| | | | |-- borland.hpp +| | | | |-- concept_def.hpp +| | | | |-- concept_undef.hpp +| | | | |-- general.hpp +| | | | |-- has_constraints.hpp +| | | | `-- msvc.hpp +| | | |-- assert.hpp +| | | `-- usage.hpp +| | |-- config +| | | |-- abi +| | | | |-- borland_prefix.hpp +| | | | |-- borland_suffix.hpp +| | | | |-- msvc_prefix.hpp +| | | | `-- msvc_suffix.hpp +| | | |-- compiler +| | | | |-- borland.hpp +| | | | |-- clang.hpp +| | | | |-- codegear.hpp +| | | | |-- comeau.hpp +| | | | |-- common_edg.hpp +| | | | |-- compaq_cxx.hpp +| | | | |-- cray.hpp +| | | | |-- diab.hpp +| | | | |-- digitalmars.hpp +| | | | |-- gcc.hpp +| | | | |-- gcc_xml.hpp +| | | | |-- greenhills.hpp +| | | | |-- hp_acc.hpp +| | | | |-- intel.hpp +| | | | |-- kai.hpp +| | | | |-- metrowerks.hpp +| | | | |-- mpw.hpp +| | | | |-- nvcc.hpp +| | | | |-- pathscale.hpp +| | | | |-- pgi.hpp +| | | | |-- sgi_mipspro.hpp +| | | | |-- sunpro_cc.hpp +| | | | |-- vacpp.hpp +| | | | |-- visualc.hpp +| | | | |-- xlcpp.hpp +| | | | `-- xlcpp_zos.hpp +| | | |-- detail +| | | | |-- posix_features.hpp +| | | | |-- select_compiler_config.hpp +| | | | |-- select_platform_config.hpp +| | | | |-- select_stdlib_config.hpp +| | | | `-- suffix.hpp +| | | |-- no_tr1 +| | | | |-- cmath.hpp +| | | | |-- complex.hpp +| | | | |-- functional.hpp +| | | | |-- memory.hpp +| | | | `-- utility.hpp +| | | |-- platform +| | | | |-- aix.hpp +| | | | |-- amigaos.hpp +| | | | |-- beos.hpp +| | | | |-- bsd.hpp +| | | | |-- cloudabi.hpp +| | | | |-- cray.hpp +| | | | |-- cygwin.hpp +| | | | |-- haiku.hpp +| | | | |-- hpux.hpp +| | | | |-- irix.hpp +| | | | |-- linux.hpp +| | | | |-- macos.hpp +| | | | |-- qnxnto.hpp +| | | | |-- solaris.hpp +| | | | |-- symbian.hpp +| | | | |-- vms.hpp +| | | | |-- vxworks.hpp +| | | | |-- win32.hpp +| | | | `-- zos.hpp +| | | |-- stdlib +| | | | |-- dinkumware.hpp +| | | | |-- libcomo.hpp +| | | | |-- libcpp.hpp +| | | | |-- libstdcpp3.hpp +| | | | |-- modena.hpp +| | | | |-- msl.hpp +| | | | |-- roguewave.hpp +| | | | |-- sgi.hpp +| | | | |-- stlport.hpp +| | | | |-- vacpp.hpp +| | | | `-- xlcpp_zos.hpp +| | | |-- abi_prefix.hpp +| | | |-- abi_suffix.hpp +| | | |-- auto_link.hpp +| | | |-- header_deprecated.hpp +| | | |-- helper_macros.hpp +| | | |-- pragma_message.hpp +| | | |-- requires_threads.hpp +| | | |-- user.hpp +| | | |-- warning_disable.hpp +| | | `-- workaround.hpp +| | |-- container +| | | |-- detail +| | | | |-- addressof.hpp +| | | | |-- algorithm.hpp +| | | | |-- allocation_type.hpp +| | | | |-- allocator_version_traits.hpp +| | | | |-- alloc_helpers.hpp +| | | | |-- compare_functors.hpp +| | | | |-- config_begin.hpp +| | | | |-- config_end.hpp +| | | | |-- construct_in_place.hpp +| | | | |-- destroyers.hpp +| | | | |-- iterator.hpp +| | | | |-- iterators.hpp +| | | | |-- mpl.hpp +| | | | |-- multiallocation_chain.hpp +| | | | |-- node_alloc_holder.hpp +| | | | |-- placement_new.hpp +| | | | |-- std_fwd.hpp +| | | | |-- transform_iterator.hpp +| | | | |-- type_traits.hpp +| | | | |-- value_functors.hpp +| | | | |-- value_init.hpp +| | | | |-- variadic_templates_tools.hpp +| | | | |-- version_type.hpp +| | | | `-- workaround.hpp +| | | |-- allocator_traits.hpp +| | | |-- container_fwd.hpp +| | | |-- new_allocator.hpp +| | | |-- slist.hpp +| | | `-- throw_exception.hpp +| | |-- container_hash +| | | |-- detail +| | | | |-- float_functions.hpp +| | | | |-- hash_float.hpp +| | | | `-- limits.hpp +| | | |-- extensions.hpp +| | | |-- hash_fwd.hpp +| | | `-- hash.hpp +| | |-- core +| | | |-- addressof.hpp +| | | |-- checked_delete.hpp +| | | |-- demangle.hpp +| | | |-- empty_value.hpp +| | | |-- enable_if.hpp +| | | |-- exchange.hpp +| | | |-- explicit_operator_bool.hpp +| | | |-- ignore_unused.hpp +| | | |-- is_same.hpp +| | | |-- lightweight_test.hpp +| | | |-- lightweight_test_trait.hpp +| | | |-- no_exceptions_support.hpp +| | | |-- noncopyable.hpp +| | | |-- null_deleter.hpp +| | | |-- pointer_traits.hpp +| | | |-- quick_exit.hpp +| | | |-- ref.hpp +| | | |-- scoped_enum.hpp +| | | |-- swap.hpp +| | | |-- typeinfo.hpp +| | | |-- uncaught_exceptions.hpp +| | | |-- underlying_type.hpp +| | | `-- use_default.hpp +| | |-- detail +| | | |-- winapi +| | | | |-- detail +| | | | | `-- deprecated_namespace.hpp +| | | | |-- get_current_process.hpp +| | | | |-- get_current_thread.hpp +| | | | |-- get_last_error.hpp +| | | | |-- get_process_times.hpp +| | | | `-- get_thread_times.hpp +| | | |-- basic_pointerbuf.hpp +| | | |-- bitmask.hpp +| | | |-- call_traits.hpp +| | | |-- container_fwd.hpp +| | | |-- fenv.hpp +| | | |-- indirect_traits.hpp +| | | |-- is_incrementable.hpp +| | | |-- iterator.hpp +| | | |-- lcast_precision.hpp +| | | |-- lightweight_test.hpp +| | | |-- numeric_traits.hpp +| | | |-- reference_content.hpp +| | | |-- select_type.hpp +| | | |-- sp_typeinfo.hpp +| | | |-- templated_streams.hpp +| | | |-- utf8_codecvt_facet.hpp +| | | |-- utf8_codecvt_facet.ipp +| | | `-- workaround.hpp +| | |-- exception +| | | |-- detail +| | | | |-- error_info_impl.hpp +| | | | |-- is_output_streamable.hpp +| | | | |-- object_hex_dump.hpp +| | | | |-- shared_ptr.hpp +| | | | `-- type_info.hpp +| | | |-- current_exception_cast.hpp +| | | |-- diagnostic_information.hpp +| | | |-- exception.hpp +| | | |-- get_error_info.hpp +| | | |-- info.hpp +| | | |-- to_string.hpp +| | | `-- to_string_stub.hpp +| | |-- filesystem +| | | |-- detail +| | | | `-- utf8_codecvt_facet.hpp +| | | |-- config.hpp +| | | |-- convenience.hpp +| | | |-- fstream.hpp +| | | |-- operations.hpp +| | | |-- path.hpp +| | | |-- path_traits.hpp +| | | `-- string_file.hpp +| | |-- format +| | | |-- detail +| | | | |-- compat_workarounds.hpp +| | | | |-- config_macros.hpp +| | | | |-- msvc_disambiguater.hpp +| | | | |-- unset_macros.hpp +| | | | |-- workarounds_gcc-2_95.hpp +| | | | `-- workarounds_stlport.hpp +| | | |-- alt_sstream.hpp +| | | |-- alt_sstream_impl.hpp +| | | |-- exceptions.hpp +| | | |-- feed_args.hpp +| | | |-- format_class.hpp +| | | |-- format_fwd.hpp +| | | |-- format_implementation.hpp +| | | |-- free_funcs.hpp +| | | |-- group.hpp +| | | |-- internals_fwd.hpp +| | | |-- internals.hpp +| | | `-- parsing.hpp +| | |-- function +| | | |-- detail +| | | | |-- function_iterate.hpp +| | | | |-- gen_maybe_include.pl +| | | | |-- maybe_include.hpp +| | | | `-- prologue.hpp +| | | |-- function0.hpp +| | | |-- function10.hpp +| | | |-- function1.hpp +| | | |-- function2.hpp +| | | |-- function3.hpp +| | | |-- function4.hpp +| | | |-- function5.hpp +| | | |-- function6.hpp +| | | |-- function7.hpp +| | | |-- function8.hpp +| | | |-- function9.hpp +| | | |-- function_base.hpp +| | | |-- function_fwd.hpp +| | | `-- function_template.hpp +| | |-- functional +| | | `-- hash_fwd.hpp +| | |-- function_types +| | | |-- config +| | | | |-- cc_names.hpp +| | | | |-- compiler.hpp +| | | | `-- config.hpp +| | | |-- detail +| | | | |-- classifier_impl +| | | | | |-- arity10_0.hpp +| | | | | |-- arity10_1.hpp +| | | | | |-- arity20_0.hpp +| | | | | |-- arity20_1.hpp +| | | | | |-- arity30_0.hpp +| | | | | |-- arity30_1.hpp +| | | | | |-- arity40_0.hpp +| | | | | |-- arity40_1.hpp +| | | | | |-- arity50_0.hpp +| | | | | |-- arity50_1.hpp +| | | | | `-- master.hpp +| | | | |-- components_impl +| | | | | |-- arity10_0.hpp +| | | | | |-- arity10_1.hpp +| | | | | |-- arity20_0.hpp +| | | | | |-- arity20_1.hpp +| | | | | |-- arity30_0.hpp +| | | | | |-- arity30_1.hpp +| | | | | |-- arity40_0.hpp +| | | | | |-- arity40_1.hpp +| | | | | |-- arity50_0.hpp +| | | | | |-- arity50_1.hpp +| | | | | `-- master.hpp +| | | | |-- encoding +| | | | | |-- aliases_def.hpp +| | | | | |-- aliases_undef.hpp +| | | | | |-- def.hpp +| | | | | `-- undef.hpp +| | | | |-- pp_cc_loop +| | | | | |-- master.hpp +| | | | | `-- preprocessed.hpp +| | | | |-- pp_retag_default_cc +| | | | | |-- master.hpp +| | | | | `-- preprocessed.hpp +| | | | |-- pp_tags +| | | | | |-- cc_tag.hpp +| | | | | |-- master.hpp +| | | | | `-- preprocessed.hpp +| | | | |-- pp_variate_loop +| | | | | |-- master.hpp +| | | | | `-- preprocessed.hpp +| | | | |-- synthesize_impl +| | | | | |-- arity10_0.hpp +| | | | | |-- arity10_1.hpp +| | | | | |-- arity20_0.hpp +| | | | | |-- arity20_1.hpp +| | | | | |-- arity30_0.hpp +| | | | | |-- arity30_1.hpp +| | | | | |-- arity40_0.hpp +| | | | | |-- arity40_1.hpp +| | | | | |-- arity50_0.hpp +| | | | | |-- arity50_1.hpp +| | | | | `-- master.hpp +| | | | |-- classifier.hpp +| | | | |-- class_transform.hpp +| | | | |-- components_as_mpl_sequence.hpp +| | | | |-- cv_traits.hpp +| | | | |-- pp_arity_loop.hpp +| | | | |-- pp_loop.hpp +| | | | |-- retag_default_cc.hpp +| | | | |-- synthesize.hpp +| | | | `-- to_sequence.hpp +| | | |-- components.hpp +| | | |-- is_callable_builtin.hpp +| | | |-- is_function_pointer.hpp +| | | |-- property_tags.hpp +| | | `-- result_type.hpp +| | |-- fusion +| | | |-- adapted +| | | | |-- boost_tuple +| | | | | |-- detail +| | | | | | |-- at_impl.hpp +| | | | | | |-- begin_impl.hpp +| | | | | | |-- build_cons.hpp +| | | | | | |-- category_of_impl.hpp +| | | | | | |-- convert_impl.hpp +| | | | | | |-- end_impl.hpp +| | | | | | |-- is_sequence_impl.hpp +| | | | | | |-- is_view_impl.hpp +| | | | | | |-- size_impl.hpp +| | | | | | `-- value_at_impl.hpp +| | | | | |-- mpl +| | | | | | `-- clear.hpp +| | | | | |-- boost_tuple_iterator.hpp +| | | | | `-- tag_of.hpp +| | | | |-- mpl +| | | | | |-- detail +| | | | | | |-- at_impl.hpp +| | | | | | |-- begin_impl.hpp +| | | | | | |-- category_of_impl.hpp +| | | | | | |-- empty_impl.hpp +| | | | | | |-- end_impl.hpp +| | | | | | |-- has_key_impl.hpp +| | | | | | |-- is_sequence_impl.hpp +| | | | | | |-- is_view_impl.hpp +| | | | | | |-- size_impl.hpp +| | | | | | `-- value_at_impl.hpp +| | | | | `-- mpl_iterator.hpp +| | | | |-- std_tuple +| | | | | |-- detail +| | | | | | |-- at_impl.hpp +| | | | | | |-- begin_impl.hpp +| | | | | | |-- build_std_tuple.hpp +| | | | | | |-- category_of_impl.hpp +| | | | | | |-- convert_impl.hpp +| | | | | | |-- end_impl.hpp +| | | | | | |-- is_sequence_impl.hpp +| | | | | | |-- is_view_impl.hpp +| | | | | | |-- size_impl.hpp +| | | | | | `-- value_at_impl.hpp +| | | | | |-- mpl +| | | | | | `-- clear.hpp +| | | | | |-- std_tuple_iterator.hpp +| | | | | `-- tag_of.hpp +| | | | |-- struct +| | | | | |-- detail +| | | | | | |-- preprocessor +| | | | | | | `-- is_seq.hpp +| | | | | | |-- adapt_auto.hpp +| | | | | | |-- adapt_base_attr_filler.hpp +| | | | | | |-- adapt_base.hpp +| | | | | | |-- adapt_is_tpl.hpp +| | | | | | |-- at_impl.hpp +| | | | | | |-- begin_impl.hpp +| | | | | | |-- category_of_impl.hpp +| | | | | | |-- deref_impl.hpp +| | | | | | |-- end_impl.hpp +| | | | | | |-- extension.hpp +| | | | | | |-- is_sequence_impl.hpp +| | | | | | |-- is_view_impl.hpp +| | | | | | |-- size_impl.hpp +| | | | | | |-- value_at_impl.hpp +| | | | | | `-- value_of_impl.hpp +| | | | | `-- adapt_struct.hpp +| | | | |-- boost_tuple.hpp +| | | | |-- mpl.hpp +| | | | |-- std_pair.hpp +| | | | `-- std_tuple.hpp +| | | |-- algorithm +| | | | |-- iteration +| | | | | |-- detail +| | | | | | |-- preprocessed +| | | | | | | `-- fold.hpp +| | | | | | |-- fold.hpp +| | | | | | |-- for_each.hpp +| | | | | | |-- segmented_fold.hpp +| | | | | | `-- segmented_for_each.hpp +| | | | | |-- fold_fwd.hpp +| | | | | |-- fold.hpp +| | | | | |-- for_each_fwd.hpp +| | | | | `-- for_each.hpp +| | | | |-- query +| | | | | |-- detail +| | | | | | |-- find_if.hpp +| | | | | | `-- segmented_find.hpp +| | | | | |-- find_fwd.hpp +| | | | | |-- find.hpp +| | | | | `-- find_if_fwd.hpp +| | | | `-- transformation +| | | | |-- erase.hpp +| | | | |-- erase_key.hpp +| | | | |-- insert.hpp +| | | | |-- insert_range.hpp +| | | | |-- pop_back.hpp +| | | | |-- pop_front.hpp +| | | | |-- push_back.hpp +| | | | |-- push_front.hpp +| | | | `-- transform.hpp +| | | |-- container +| | | | |-- deque +| | | | | |-- detail +| | | | | | |-- cpp03 +| | | | | | | |-- preprocessed +| | | | | | | | |-- as_deque10.hpp +| | | | | | | | |-- as_deque20.hpp +| | | | | | | | |-- as_deque30.hpp +| | | | | | | | |-- as_deque40.hpp +| | | | | | | | |-- as_deque50.hpp +| | | | | | | | |-- as_deque.hpp +| | | | | | | | |-- deque10_fwd.hpp +| | | | | | | | |-- deque10.hpp +| | | | | | | | |-- deque20_fwd.hpp +| | | | | | | | |-- deque20.hpp +| | | | | | | | |-- deque30_fwd.hpp +| | | | | | | | |-- deque30.hpp +| | | | | | | | |-- deque40_fwd.hpp +| | | | | | | | |-- deque40.hpp +| | | | | | | | |-- deque50_fwd.hpp +| | | | | | | | |-- deque50.hpp +| | | | | | | | |-- deque_fwd.hpp +| | | | | | | | |-- deque.hpp +| | | | | | | | |-- deque_initial_size10.hpp +| | | | | | | | |-- deque_initial_size20.hpp +| | | | | | | | |-- deque_initial_size30.hpp +| | | | | | | | |-- deque_initial_size40.hpp +| | | | | | | | |-- deque_initial_size50.hpp +| | | | | | | | |-- deque_initial_size.hpp +| | | | | | | | |-- deque_keyed_values10.hpp +| | | | | | | | |-- deque_keyed_values20.hpp +| | | | | | | | |-- deque_keyed_values30.hpp +| | | | | | | | |-- deque_keyed_values40.hpp +| | | | | | | | |-- deque_keyed_values50.hpp +| | | | | | | | `-- deque_keyed_values.hpp +| | | | | | | |-- as_deque.hpp +| | | | | | | |-- build_deque.hpp +| | | | | | | |-- deque_forward_ctor.hpp +| | | | | | | |-- deque_fwd.hpp +| | | | | | | |-- deque.hpp +| | | | | | | |-- deque_initial_size.hpp +| | | | | | | |-- deque_keyed_values_call.hpp +| | | | | | | |-- deque_keyed_values.hpp +| | | | | | | `-- limits.hpp +| | | | | | |-- at_impl.hpp +| | | | | | |-- begin_impl.hpp +| | | | | | |-- build_deque.hpp +| | | | | | |-- convert_impl.hpp +| | | | | | |-- deque_keyed_values.hpp +| | | | | | |-- end_impl.hpp +| | | | | | |-- is_sequence_impl.hpp +| | | | | | |-- keyed_element.hpp +| | | | | | `-- value_at_impl.hpp +| | | | | |-- back_extended_deque.hpp +| | | | | |-- convert.hpp +| | | | | |-- deque_fwd.hpp +| | | | | |-- deque.hpp +| | | | | |-- deque_iterator.hpp +| | | | | `-- front_extended_deque.hpp +| | | | |-- generation +| | | | | |-- detail +| | | | | | |-- preprocessed +| | | | | | | |-- make_deque10.hpp +| | | | | | | |-- make_deque20.hpp +| | | | | | | |-- make_deque30.hpp +| | | | | | | |-- make_deque40.hpp +| | | | | | | |-- make_deque50.hpp +| | | | | | | |-- make_deque.hpp +| | | | | | | |-- make_list10.hpp +| | | | | | | |-- make_list20.hpp +| | | | | | | |-- make_list30.hpp +| | | | | | | |-- make_list40.hpp +| | | | | | | |-- make_list50.hpp +| | | | | | | |-- make_list.hpp +| | | | | | | |-- make_vector10.hpp +| | | | | | | |-- make_vector20.hpp +| | | | | | | |-- make_vector30.hpp +| | | | | | | |-- make_vector40.hpp +| | | | | | | |-- make_vector50.hpp +| | | | | | | `-- make_vector.hpp +| | | | | | |-- pp_make_deque.hpp +| | | | | | |-- pp_make_list.hpp +| | | | | | `-- pp_make_vector.hpp +| | | | | |-- make_deque.hpp +| | | | | |-- make_list.hpp +| | | | | `-- make_vector.hpp +| | | | |-- list +| | | | | |-- detail +| | | | | | |-- cpp03 +| | | | | | | |-- preprocessed +| | | | | | | | |-- list10_fwd.hpp +| | | | | | | | |-- list10.hpp +| | | | | | | | |-- list20_fwd.hpp +| | | | | | | | |-- list20.hpp +| | | | | | | | |-- list30_fwd.hpp +| | | | | | | | |-- list30.hpp +| | | | | | | | |-- list40_fwd.hpp +| | | | | | | | |-- list40.hpp +| | | | | | | | |-- list50_fwd.hpp +| | | | | | | | |-- list50.hpp +| | | | | | | | |-- list_fwd.hpp +| | | | | | | | |-- list.hpp +| | | | | | | | |-- list_to_cons10.hpp +| | | | | | | | |-- list_to_cons20.hpp +| | | | | | | | |-- list_to_cons30.hpp +| | | | | | | | |-- list_to_cons40.hpp +| | | | | | | | |-- list_to_cons50.hpp +| | | | | | | | `-- list_to_cons.hpp +| | | | | | | |-- limits.hpp +| | | | | | | |-- list_forward_ctor.hpp +| | | | | | | |-- list_fwd.hpp +| | | | | | | |-- list.hpp +| | | | | | | |-- list_to_cons_call.hpp +| | | | | | | `-- list_to_cons.hpp +| | | | | | |-- at_impl.hpp +| | | | | | |-- begin_impl.hpp +| | | | | | |-- build_cons.hpp +| | | | | | |-- convert_impl.hpp +| | | | | | |-- deref_impl.hpp +| | | | | | |-- empty_impl.hpp +| | | | | | |-- end_impl.hpp +| | | | | | |-- equal_to_impl.hpp +| | | | | | |-- list_to_cons.hpp +| | | | | | |-- next_impl.hpp +| | | | | | |-- reverse_cons.hpp +| | | | | | |-- value_at_impl.hpp +| | | | | | `-- value_of_impl.hpp +| | | | | |-- cons_fwd.hpp +| | | | | |-- cons.hpp +| | | | | |-- cons_iterator.hpp +| | | | | |-- convert.hpp +| | | | | |-- list_fwd.hpp +| | | | | |-- list.hpp +| | | | | `-- nil.hpp +| | | | |-- map +| | | | | |-- detail +| | | | | | `-- cpp03 +| | | | | | |-- preprocessed +| | | | | | | |-- map10_fwd.hpp +| | | | | | | |-- map20_fwd.hpp +| | | | | | | |-- map30_fwd.hpp +| | | | | | | |-- map40_fwd.hpp +| | | | | | | |-- map50_fwd.hpp +| | | | | | | `-- map_fwd.hpp +| | | | | | |-- limits.hpp +| | | | | | `-- map_fwd.hpp +| | | | | `-- map_fwd.hpp +| | | | |-- set +| | | | | |-- detail +| | | | | | `-- cpp03 +| | | | | | |-- preprocessed +| | | | | | | |-- set10_fwd.hpp +| | | | | | | |-- set20_fwd.hpp +| | | | | | | |-- set30_fwd.hpp +| | | | | | | |-- set40_fwd.hpp +| | | | | | | |-- set50_fwd.hpp +| | | | | | | `-- set_fwd.hpp +| | | | | | |-- limits.hpp +| | | | | | `-- set_fwd.hpp +| | | | | `-- set_fwd.hpp +| | | | |-- vector +| | | | | |-- detail +| | | | | | |-- cpp03 +| | | | | | | |-- preprocessed +| | | | | | | | |-- as_vector10.hpp +| | | | | | | | |-- as_vector20.hpp +| | | | | | | | |-- as_vector30.hpp +| | | | | | | | |-- as_vector40.hpp +| | | | | | | | |-- as_vector50.hpp +| | | | | | | | |-- as_vector.hpp +| | | | | | | | |-- vector10_fwd.hpp +| | | | | | | | |-- vector10.hpp +| | | | | | | | |-- vector20_fwd.hpp +| | | | | | | | |-- vector20.hpp +| | | | | | | | |-- vector30_fwd.hpp +| | | | | | | | |-- vector30.hpp +| | | | | | | | |-- vector40_fwd.hpp +| | | | | | | | |-- vector40.hpp +| | | | | | | | |-- vector50_fwd.hpp +| | | | | | | | |-- vector50.hpp +| | | | | | | | |-- vector_chooser10.hpp +| | | | | | | | |-- vector_chooser20.hpp +| | | | | | | | |-- vector_chooser30.hpp +| | | | | | | | |-- vector_chooser40.hpp +| | | | | | | | |-- vector_chooser50.hpp +| | | | | | | | |-- vector_chooser.hpp +| | | | | | | | |-- vector_fwd.hpp +| | | | | | | | |-- vector.hpp +| | | | | | | | |-- vvector10_fwd.hpp +| | | | | | | | |-- vvector10.hpp +| | | | | | | | |-- vvector20_fwd.hpp +| | | | | | | | |-- vvector20.hpp +| | | | | | | | |-- vvector30_fwd.hpp +| | | | | | | | |-- vvector30.hpp +| | | | | | | | |-- vvector40_fwd.hpp +| | | | | | | | |-- vvector40.hpp +| | | | | | | | |-- vvector50_fwd.hpp +| | | | | | | | `-- vvector50.hpp +| | | | | | | |-- as_vector.hpp +| | | | | | | |-- limits.hpp +| | | | | | | |-- value_at_impl.hpp +| | | | | | | |-- vector10_fwd.hpp +| | | | | | | |-- vector10.hpp +| | | | | | | |-- vector20_fwd.hpp +| | | | | | | |-- vector20.hpp +| | | | | | | |-- vector30_fwd.hpp +| | | | | | | |-- vector30.hpp +| | | | | | | |-- vector40_fwd.hpp +| | | | | | | |-- vector40.hpp +| | | | | | | |-- vector50_fwd.hpp +| | | | | | | |-- vector50.hpp +| | | | | | | |-- vector_forward_ctor.hpp +| | | | | | | |-- vector_fwd.hpp +| | | | | | | |-- vector.hpp +| | | | | | | |-- vector_n_chooser.hpp +| | | | | | | `-- vector_n.hpp +| | | | | | |-- advance_impl.hpp +| | | | | | |-- as_vector.hpp +| | | | | | |-- at_impl.hpp +| | | | | | |-- begin_impl.hpp +| | | | | | |-- config.hpp +| | | | | | |-- convert_impl.hpp +| | | | | | |-- deref_impl.hpp +| | | | | | |-- distance_impl.hpp +| | | | | | |-- end_impl.hpp +| | | | | | |-- equal_to_impl.hpp +| | | | | | |-- next_impl.hpp +| | | | | | |-- prior_impl.hpp +| | | | | | |-- value_at_impl.hpp +| | | | | | `-- value_of_impl.hpp +| | | | | |-- convert.hpp +| | | | | |-- vector10.hpp +| | | | | |-- vector_fwd.hpp +| | | | | |-- vector.hpp +| | | | | `-- vector_iterator.hpp +| | | | |-- deque.hpp +| | | | |-- list.hpp +| | | | `-- vector.hpp +| | | |-- include +| | | | |-- at.hpp +| | | | |-- deque.hpp +| | | | |-- list.hpp +| | | | |-- make_deque.hpp +| | | | |-- make_list.hpp +| | | | |-- make_vector.hpp +| | | | `-- vector.hpp +| | | |-- iterator +| | | | |-- detail +| | | | | |-- adapt_deref_traits.hpp +| | | | | |-- adapt_value_traits.hpp +| | | | | |-- advance.hpp +| | | | | |-- distance.hpp +| | | | | |-- segmented_equal_to.hpp +| | | | | |-- segmented_iterator.hpp +| | | | | |-- segmented_next_impl.hpp +| | | | | `-- segment_sequence.hpp +| | | | |-- mpl +| | | | | |-- convert_iterator.hpp +| | | | | `-- fusion_iterator.hpp +| | | | |-- advance.hpp +| | | | |-- basic_iterator.hpp +| | | | |-- deref_data.hpp +| | | | |-- deref.hpp +| | | | |-- distance.hpp +| | | | |-- equal_to.hpp +| | | | |-- iterator_adapter.hpp +| | | | |-- iterator_facade.hpp +| | | | |-- key_of.hpp +| | | | |-- mpl.hpp +| | | | |-- next.hpp +| | | | |-- prior.hpp +| | | | |-- segmented_iterator.hpp +| | | | |-- value_of_data.hpp +| | | | `-- value_of.hpp +| | | |-- mpl +| | | | |-- detail +| | | | | `-- clear.hpp +| | | | |-- at.hpp +| | | | |-- back.hpp +| | | | |-- begin.hpp +| | | | |-- clear.hpp +| | | | |-- empty.hpp +| | | | |-- end.hpp +| | | | |-- erase.hpp +| | | | |-- erase_key.hpp +| | | | |-- front.hpp +| | | | |-- has_key.hpp +| | | | |-- insert.hpp +| | | | |-- insert_range.hpp +| | | | |-- pop_back.hpp +| | | | |-- pop_front.hpp +| | | | |-- push_back.hpp +| | | | |-- push_front.hpp +| | | | `-- size.hpp +| | | |-- sequence +| | | | |-- comparison +| | | | | |-- detail +| | | | | | `-- equal_to.hpp +| | | | | |-- enable_comparison.hpp +| | | | | `-- equal_to.hpp +| | | | |-- intrinsic +| | | | | |-- detail +| | | | | | |-- segmented_begin.hpp +| | | | | | |-- segmented_begin_impl.hpp +| | | | | | |-- segmented_end.hpp +| | | | | | |-- segmented_end_impl.hpp +| | | | | | `-- segmented_size.hpp +| | | | | |-- at_c.hpp +| | | | | |-- at.hpp +| | | | | |-- begin.hpp +| | | | | |-- empty.hpp +| | | | | |-- end.hpp +| | | | | |-- has_key.hpp +| | | | | |-- segments.hpp +| | | | | |-- size.hpp +| | | | | `-- value_at.hpp +| | | | |-- convert.hpp +| | | | `-- intrinsic_fwd.hpp +| | | |-- support +| | | | |-- detail +| | | | | |-- access.hpp +| | | | | |-- and.hpp +| | | | | |-- as_fusion_element.hpp +| | | | | |-- enabler.hpp +| | | | | |-- index_sequence.hpp +| | | | | |-- is_mpl_sequence.hpp +| | | | | |-- is_native_fusion_sequence.hpp +| | | | | |-- mpl_iterator_category.hpp +| | | | | |-- pp_round.hpp +| | | | | `-- segmented_fold_until_impl.hpp +| | | | |-- as_const.hpp +| | | | |-- category_of.hpp +| | | | |-- config.hpp +| | | | |-- is_iterator.hpp +| | | | |-- is_segmented.hpp +| | | | |-- is_sequence.hpp +| | | | |-- is_view.hpp +| | | | |-- iterator_base.hpp +| | | | |-- segmented_fold_until.hpp +| | | | |-- sequence_base.hpp +| | | | |-- tag_of_fwd.hpp +| | | | |-- tag_of.hpp +| | | | `-- void.hpp +| | | |-- view +| | | | |-- detail +| | | | | `-- strictest_traversal.hpp +| | | | |-- iterator_range +| | | | | |-- detail +| | | | | | |-- at_impl.hpp +| | | | | | |-- begin_impl.hpp +| | | | | | |-- end_impl.hpp +| | | | | | |-- is_segmented_impl.hpp +| | | | | | |-- segmented_iterator_range.hpp +| | | | | | |-- segments_impl.hpp +| | | | | | |-- size_impl.hpp +| | | | | | `-- value_at_impl.hpp +| | | | | `-- iterator_range.hpp +| | | | |-- joint_view +| | | | | |-- detail +| | | | | | |-- begin_impl.hpp +| | | | | | |-- deref_data_impl.hpp +| | | | | | |-- deref_impl.hpp +| | | | | | |-- end_impl.hpp +| | | | | | |-- key_of_impl.hpp +| | | | | | |-- next_impl.hpp +| | | | | | |-- value_of_data_impl.hpp +| | | | | | `-- value_of_impl.hpp +| | | | | |-- joint_view_fwd.hpp +| | | | | |-- joint_view.hpp +| | | | | `-- joint_view_iterator.hpp +| | | | |-- single_view +| | | | | |-- detail +| | | | | | |-- advance_impl.hpp +| | | | | | |-- at_impl.hpp +| | | | | | |-- begin_impl.hpp +| | | | | | |-- deref_impl.hpp +| | | | | | |-- distance_impl.hpp +| | | | | | |-- end_impl.hpp +| | | | | | |-- equal_to_impl.hpp +| | | | | | |-- next_impl.hpp +| | | | | | |-- prior_impl.hpp +| | | | | | |-- size_impl.hpp +| | | | | | |-- value_at_impl.hpp +| | | | | | `-- value_of_impl.hpp +| | | | | |-- single_view.hpp +| | | | | `-- single_view_iterator.hpp +| | | | |-- transform_view +| | | | | |-- detail +| | | | | | |-- advance_impl.hpp +| | | | | | |-- at_impl.hpp +| | | | | | |-- begin_impl.hpp +| | | | | | |-- deref_impl.hpp +| | | | | | |-- distance_impl.hpp +| | | | | | |-- end_impl.hpp +| | | | | | |-- equal_to_impl.hpp +| | | | | | |-- next_impl.hpp +| | | | | | |-- prior_impl.hpp +| | | | | | |-- value_at_impl.hpp +| | | | | | `-- value_of_impl.hpp +| | | | | |-- transform_view_fwd.hpp +| | | | | |-- transform_view.hpp +| | | | | `-- transform_view_iterator.hpp +| | | | `-- iterator_range.hpp +| | | `-- mpl.hpp +| | |-- integer +| | | |-- common_factor_rt.hpp +| | | `-- static_log2.hpp +| | |-- intrusive +| | | |-- detail +| | | | |-- algorithm.hpp +| | | | |-- algo_type.hpp +| | | | |-- array_initializer.hpp +| | | | |-- assert.hpp +| | | | |-- common_slist_algorithms.hpp +| | | | |-- config_begin.hpp +| | | | |-- config_end.hpp +| | | | |-- default_header_holder.hpp +| | | | |-- ebo_functor_holder.hpp +| | | | |-- equal_to_value.hpp +| | | | |-- exception_disposer.hpp +| | | | |-- function_detector.hpp +| | | | |-- generic_hook.hpp +| | | | |-- get_value_traits.hpp +| | | | |-- has_member_function_callable_with.hpp +| | | | |-- hook_traits.hpp +| | | | |-- iiterator.hpp +| | | | |-- is_stateful_value_traits.hpp +| | | | |-- iterator.hpp +| | | | |-- key_nodeptr_comp.hpp +| | | | |-- minimal_less_equal_header.hpp +| | | | |-- minimal_pair_header.hpp +| | | | |-- mpl.hpp +| | | | |-- node_holder.hpp +| | | | |-- parent_from_member.hpp +| | | | |-- reverse_iterator.hpp +| | | | |-- simple_disposers.hpp +| | | | |-- size_holder.hpp +| | | | |-- slist_iterator.hpp +| | | | |-- slist_node.hpp +| | | | |-- std_fwd.hpp +| | | | |-- tree_value_compare.hpp +| | | | |-- uncast.hpp +| | | | `-- workaround.hpp +| | | |-- circular_slist_algorithms.hpp +| | | |-- intrusive_fwd.hpp +| | | |-- linear_slist_algorithms.hpp +| | | |-- link_mode.hpp +| | | |-- options.hpp +| | | |-- pack_options.hpp +| | | |-- pointer_rebind.hpp +| | | |-- pointer_traits.hpp +| | | |-- slist_hook.hpp +| | | `-- slist.hpp +| | |-- io +| | | |-- detail +| | | | `-- quoted_manip.hpp +| | | `-- ios_state.hpp +| | |-- iterator +| | | |-- detail +| | | | |-- any_conversion_eater.hpp +| | | | |-- config_def.hpp +| | | | |-- config_undef.hpp +| | | | |-- enable_if.hpp +| | | | |-- facade_iterator_category.hpp +| | | | `-- minimum_category.hpp +| | | |-- advance.hpp +| | | |-- counting_iterator.hpp +| | | |-- distance.hpp +| | | |-- filter_iterator.hpp +| | | |-- function_input_iterator.hpp +| | | |-- function_output_iterator.hpp +| | | |-- indirect_iterator.hpp +| | | |-- interoperable.hpp +| | | |-- is_lvalue_iterator.hpp +| | | |-- is_readable_iterator.hpp +| | | |-- iterator_adaptor.hpp +| | | |-- iterator_archetypes.hpp +| | | |-- iterator_categories.hpp +| | | |-- iterator_concepts.hpp +| | | |-- iterator_facade.hpp +| | | |-- iterator_traits.hpp +| | | |-- minimum_category.hpp +| | | |-- new_iterator_tests.hpp +| | | |-- permutation_iterator.hpp +| | | |-- reverse_iterator.hpp +| | | |-- transform_iterator.hpp +| | | `-- zip_iterator.hpp +| | |-- lexical_cast +| | | |-- detail +| | | | |-- converter_lexical.hpp +| | | | |-- converter_lexical_streams.hpp +| | | | |-- converter_numeric.hpp +| | | | |-- inf_nan.hpp +| | | | |-- is_character.hpp +| | | | |-- lcast_char_constants.hpp +| | | | |-- lcast_unsigned_converters.hpp +| | | | `-- widest_char.hpp +| | | |-- bad_lexical_cast.hpp +| | | `-- try_lexical_convert.hpp +| | |-- math +| | | |-- policies +| | | | `-- policy.hpp +| | | |-- special_functions +| | | | |-- detail +| | | | | |-- fp_traits.hpp +| | | | | `-- round_fwd.hpp +| | | | |-- fpclassify.hpp +| | | | |-- math_fwd.hpp +| | | | `-- sign.hpp +| | | `-- tools +| | | |-- config.hpp +| | | |-- promotion.hpp +| | | |-- real_cast.hpp +| | | `-- user.hpp +| | |-- move +| | | |-- detail +| | | | |-- config_begin.hpp +| | | | |-- config_end.hpp +| | | | |-- fwd_macros.hpp +| | | | |-- iterator_to_raw_pointer.hpp +| | | | |-- iterator_traits.hpp +| | | | |-- meta_utils_core.hpp +| | | | |-- meta_utils.hpp +| | | | |-- move_helpers.hpp +| | | | |-- pointer_element.hpp +| | | | |-- std_ns_begin.hpp +| | | | |-- std_ns_end.hpp +| | | | |-- to_raw_pointer.hpp +| | | | |-- type_traits.hpp +| | | | `-- workaround.hpp +| | | |-- adl_move_swap.hpp +| | | |-- core.hpp +| | | |-- iterator.hpp +| | | |-- traits.hpp +| | | |-- utility_core.hpp +| | | `-- utility.hpp +| | |-- mp11 +| | | |-- detail +| | | | |-- config.hpp +| | | | |-- mp_append.hpp +| | | | |-- mp_copy_if.hpp +| | | | |-- mp_count.hpp +| | | | |-- mp_fold.hpp +| | | | |-- mp_is_list.hpp +| | | | |-- mp_list.hpp +| | | | |-- mp_map_find.hpp +| | | | |-- mp_min_element.hpp +| | | | |-- mp_plus.hpp +| | | | |-- mp_remove_if.hpp +| | | | |-- mp_void.hpp +| | | | `-- mp_with_index.hpp +| | | |-- algorithm.hpp +| | | |-- bind.hpp +| | | |-- function.hpp +| | | |-- integer_sequence.hpp +| | | |-- integral.hpp +| | | |-- list.hpp +| | | |-- map.hpp +| | | |-- mpl.hpp +| | | |-- set.hpp +| | | |-- tuple.hpp +| | | |-- utility.hpp +| | | `-- version.hpp +| | |-- mpl +| | | |-- aux_ +| | | | |-- config +| | | | | |-- adl.hpp +| | | | | |-- arrays.hpp +| | | | | |-- bcc.hpp +| | | | | |-- bind.hpp +| | | | | |-- compiler.hpp +| | | | | |-- ctps.hpp +| | | | | |-- dependent_nttp.hpp +| | | | | |-- dmc_ambiguous_ctps.hpp +| | | | | |-- dtp.hpp +| | | | | |-- eti.hpp +| | | | | |-- forwarding.hpp +| | | | | |-- gcc.hpp +| | | | | |-- gpu.hpp +| | | | | |-- has_apply.hpp +| | | | | |-- has_xxx.hpp +| | | | | |-- integral.hpp +| | | | | |-- intel.hpp +| | | | | |-- lambda.hpp +| | | | | |-- msvc.hpp +| | | | | |-- msvc_typename.hpp +| | | | | |-- nttp.hpp +| | | | | |-- overload_resolution.hpp +| | | | | |-- pp_counter.hpp +| | | | | |-- preprocessor.hpp +| | | | | |-- static_constant.hpp +| | | | | |-- ttp.hpp +| | | | | |-- typeof.hpp +| | | | | |-- use_preprocessed.hpp +| | | | | `-- workaround.hpp +| | | | |-- preprocessed +| | | | | |-- bcc +| | | | | | |-- advance_backward.hpp +| | | | | | |-- advance_forward.hpp +| | | | | | |-- and.hpp +| | | | | | |-- apply_fwd.hpp +| | | | | | |-- apply.hpp +| | | | | | |-- apply_wrap.hpp +| | | | | | |-- arg.hpp +| | | | | | |-- basic_bind.hpp +| | | | | | |-- bind_fwd.hpp +| | | | | | |-- bind.hpp +| | | | | | |-- bitand.hpp +| | | | | | |-- bitor.hpp +| | | | | | |-- bitxor.hpp +| | | | | | |-- deque.hpp +| | | | | | |-- divides.hpp +| | | | | | |-- equal_to.hpp +| | | | | | |-- fold_impl.hpp +| | | | | | |-- full_lambda.hpp +| | | | | | |-- greater_equal.hpp +| | | | | | |-- greater.hpp +| | | | | | |-- inherit.hpp +| | | | | | |-- iter_fold_if_impl.hpp +| | | | | | |-- iter_fold_impl.hpp +| | | | | | |-- lambda_no_ctps.hpp +| | | | | | |-- less_equal.hpp +| | | | | | |-- less.hpp +| | | | | | |-- list_c.hpp +| | | | | | |-- list.hpp +| | | | | | |-- map.hpp +| | | | | | |-- minus.hpp +| | | | | | |-- modulus.hpp +| | | | | | |-- not_equal_to.hpp +| | | | | | |-- or.hpp +| | | | | | |-- placeholders.hpp +| | | | | | |-- plus.hpp +| | | | | | |-- quote.hpp +| | | | | | |-- reverse_fold_impl.hpp +| | | | | | |-- reverse_iter_fold_impl.hpp +| | | | | | |-- set_c.hpp +| | | | | | |-- set.hpp +| | | | | | |-- shift_left.hpp +| | | | | | |-- shift_right.hpp +| | | | | | |-- template_arity.hpp +| | | | | | |-- times.hpp +| | | | | | |-- unpack_args.hpp +| | | | | | |-- vector_c.hpp +| | | | | | `-- vector.hpp +| | | | | |-- bcc551 +| | | | | | |-- advance_backward.hpp +| | | | | | |-- advance_forward.hpp +| | | | | | |-- and.hpp +| | | | | | |-- apply_fwd.hpp +| | | | | | |-- apply.hpp +| | | | | | |-- apply_wrap.hpp +| | | | | | |-- arg.hpp +| | | | | | |-- basic_bind.hpp +| | | | | | |-- bind_fwd.hpp +| | | | | | |-- bind.hpp +| | | | | | |-- bitand.hpp +| | | | | | |-- bitor.hpp +| | | | | | |-- bitxor.hpp +| | | | | | |-- deque.hpp +| | | | | | |-- divides.hpp +| | | | | | |-- equal_to.hpp +| | | | | | |-- fold_impl.hpp +| | | | | | |-- full_lambda.hpp +| | | | | | |-- greater_equal.hpp +| | | | | | |-- greater.hpp +| | | | | | |-- inherit.hpp +| | | | | | |-- iter_fold_if_impl.hpp +| | | | | | |-- iter_fold_impl.hpp +| | | | | | |-- lambda_no_ctps.hpp +| | | | | | |-- less_equal.hpp +| | | | | | |-- less.hpp +| | | | | | |-- list_c.hpp +| | | | | | |-- list.hpp +| | | | | | |-- map.hpp +| | | | | | |-- minus.hpp +| | | | | | |-- modulus.hpp +| | | | | | |-- not_equal_to.hpp +| | | | | | |-- or.hpp +| | | | | | |-- placeholders.hpp +| | | | | | |-- plus.hpp +| | | | | | |-- quote.hpp +| | | | | | |-- reverse_fold_impl.hpp +| | | | | | |-- reverse_iter_fold_impl.hpp +| | | | | | |-- set_c.hpp +| | | | | | |-- set.hpp +| | | | | | |-- shift_left.hpp +| | | | | | |-- shift_right.hpp +| | | | | | |-- template_arity.hpp +| | | | | | |-- times.hpp +| | | | | | |-- unpack_args.hpp +| | | | | | |-- vector_c.hpp +| | | | | | `-- vector.hpp +| | | | | |-- bcc_pre590 +| | | | | | |-- advance_backward.hpp +| | | | | | |-- advance_forward.hpp +| | | | | | |-- and.hpp +| | | | | | |-- apply_fwd.hpp +| | | | | | |-- apply.hpp +| | | | | | |-- apply_wrap.hpp +| | | | | | |-- arg.hpp +| | | | | | |-- basic_bind.hpp +| | | | | | |-- bind_fwd.hpp +| | | | | | |-- bind.hpp +| | | | | | |-- bitand.hpp +| | | | | | |-- bitor.hpp +| | | | | | |-- bitxor.hpp +| | | | | | |-- deque.hpp +| | | | | | |-- divides.hpp +| | | | | | |-- equal_to.hpp +| | | | | | |-- fold_impl.hpp +| | | | | | |-- full_lambda.hpp +| | | | | | |-- greater_equal.hpp +| | | | | | |-- greater.hpp +| | | | | | |-- inherit.hpp +| | | | | | |-- iter_fold_if_impl.hpp +| | | | | | |-- iter_fold_impl.hpp +| | | | | | |-- lambda_no_ctps.hpp +| | | | | | |-- less_equal.hpp +| | | | | | |-- less.hpp +| | | | | | |-- list_c.hpp +| | | | | | |-- list.hpp +| | | | | | |-- map.hpp +| | | | | | |-- minus.hpp +| | | | | | |-- modulus.hpp +| | | | | | |-- not_equal_to.hpp +| | | | | | |-- or.hpp +| | | | | | |-- placeholders.hpp +| | | | | | |-- plus.hpp +| | | | | | |-- quote.hpp +| | | | | | |-- reverse_fold_impl.hpp +| | | | | | |-- reverse_iter_fold_impl.hpp +| | | | | | |-- set_c.hpp +| | | | | | |-- set.hpp +| | | | | | |-- shift_left.hpp +| | | | | | |-- shift_right.hpp +| | | | | | |-- template_arity.hpp +| | | | | | |-- times.hpp +| | | | | | |-- unpack_args.hpp +| | | | | | |-- vector_c.hpp +| | | | | | `-- vector.hpp +| | | | | |-- dmc +| | | | | | |-- advance_backward.hpp +| | | | | | |-- advance_forward.hpp +| | | | | | |-- and.hpp +| | | | | | |-- apply_fwd.hpp +| | | | | | |-- apply.hpp +| | | | | | |-- apply_wrap.hpp +| | | | | | |-- arg.hpp +| | | | | | |-- basic_bind.hpp +| | | | | | |-- bind_fwd.hpp +| | | | | | |-- bind.hpp +| | | | | | |-- bitand.hpp +| | | | | | |-- bitor.hpp +| | | | | | |-- bitxor.hpp +| | | | | | |-- deque.hpp +| | | | | | |-- divides.hpp +| | | | | | |-- equal_to.hpp +| | | | | | |-- fold_impl.hpp +| | | | | | |-- full_lambda.hpp +| | | | | | |-- greater_equal.hpp +| | | | | | |-- greater.hpp +| | | | | | |-- inherit.hpp +| | | | | | |-- iter_fold_if_impl.hpp +| | | | | | |-- iter_fold_impl.hpp +| | | | | | |-- lambda_no_ctps.hpp +| | | | | | |-- less_equal.hpp +| | | | | | |-- less.hpp +| | | | | | |-- list_c.hpp +| | | | | | |-- list.hpp +| | | | | | |-- map.hpp +| | | | | | |-- minus.hpp +| | | | | | |-- modulus.hpp +| | | | | | |-- not_equal_to.hpp +| | | | | | |-- or.hpp +| | | | | | |-- placeholders.hpp +| | | | | | |-- plus.hpp +| | | | | | |-- quote.hpp +| | | | | | |-- reverse_fold_impl.hpp +| | | | | | |-- reverse_iter_fold_impl.hpp +| | | | | | |-- set_c.hpp +| | | | | | |-- set.hpp +| | | | | | |-- shift_left.hpp +| | | | | | |-- shift_right.hpp +| | | | | | |-- template_arity.hpp +| | | | | | |-- times.hpp +| | | | | | |-- unpack_args.hpp +| | | | | | |-- vector_c.hpp +| | | | | | `-- vector.hpp +| | | | | |-- gcc +| | | | | | |-- advance_backward.hpp +| | | | | | |-- advance_forward.hpp +| | | | | | |-- and.hpp +| | | | | | |-- apply_fwd.hpp +| | | | | | |-- apply.hpp +| | | | | | |-- apply_wrap.hpp +| | | | | | |-- arg.hpp +| | | | | | |-- basic_bind.hpp +| | | | | | |-- bind_fwd.hpp +| | | | | | |-- bind.hpp +| | | | | | |-- bitand.hpp +| | | | | | |-- bitor.hpp +| | | | | | |-- bitxor.hpp +| | | | | | |-- deque.hpp +| | | | | | |-- divides.hpp +| | | | | | |-- equal_to.hpp +| | | | | | |-- fold_impl.hpp +| | | | | | |-- full_lambda.hpp +| | | | | | |-- greater_equal.hpp +| | | | | | |-- greater.hpp +| | | | | | |-- inherit.hpp +| | | | | | |-- iter_fold_if_impl.hpp +| | | | | | |-- iter_fold_impl.hpp +| | | | | | |-- lambda_no_ctps.hpp +| | | | | | |-- less_equal.hpp +| | | | | | |-- less.hpp +| | | | | | |-- list_c.hpp +| | | | | | |-- list.hpp +| | | | | | |-- map.hpp +| | | | | | |-- minus.hpp +| | | | | | |-- modulus.hpp +| | | | | | |-- not_equal_to.hpp +| | | | | | |-- or.hpp +| | | | | | |-- placeholders.hpp +| | | | | | |-- plus.hpp +| | | | | | |-- quote.hpp +| | | | | | |-- reverse_fold_impl.hpp +| | | | | | |-- reverse_iter_fold_impl.hpp +| | | | | | |-- set_c.hpp +| | | | | | |-- set.hpp +| | | | | | |-- shift_left.hpp +| | | | | | |-- shift_right.hpp +| | | | | | |-- template_arity.hpp +| | | | | | |-- times.hpp +| | | | | | |-- unpack_args.hpp +| | | | | | |-- vector_c.hpp +| | | | | | `-- vector.hpp +| | | | | |-- msvc60 +| | | | | | |-- advance_backward.hpp +| | | | | | |-- advance_forward.hpp +| | | | | | |-- and.hpp +| | | | | | |-- apply_fwd.hpp +| | | | | | |-- apply.hpp +| | | | | | |-- apply_wrap.hpp +| | | | | | |-- arg.hpp +| | | | | | |-- basic_bind.hpp +| | | | | | |-- bind_fwd.hpp +| | | | | | |-- bind.hpp +| | | | | | |-- bitand.hpp +| | | | | | |-- bitor.hpp +| | | | | | |-- bitxor.hpp +| | | | | | |-- deque.hpp +| | | | | | |-- divides.hpp +| | | | | | |-- equal_to.hpp +| | | | | | |-- fold_impl.hpp +| | | | | | |-- full_lambda.hpp +| | | | | | |-- greater_equal.hpp +| | | | | | |-- greater.hpp +| | | | | | |-- inherit.hpp +| | | | | | |-- iter_fold_if_impl.hpp +| | | | | | |-- iter_fold_impl.hpp +| | | | | | |-- lambda_no_ctps.hpp +| | | | | | |-- less_equal.hpp +| | | | | | |-- less.hpp +| | | | | | |-- list_c.hpp +| | | | | | |-- list.hpp +| | | | | | |-- map.hpp +| | | | | | |-- minus.hpp +| | | | | | |-- modulus.hpp +| | | | | | |-- not_equal_to.hpp +| | | | | | |-- or.hpp +| | | | | | |-- placeholders.hpp +| | | | | | |-- plus.hpp +| | | | | | |-- quote.hpp +| | | | | | |-- reverse_fold_impl.hpp +| | | | | | |-- reverse_iter_fold_impl.hpp +| | | | | | |-- set_c.hpp +| | | | | | |-- set.hpp +| | | | | | |-- shift_left.hpp +| | | | | | |-- shift_right.hpp +| | | | | | |-- template_arity.hpp +| | | | | | |-- times.hpp +| | | | | | |-- unpack_args.hpp +| | | | | | |-- vector_c.hpp +| | | | | | `-- vector.hpp +| | | | | |-- msvc70 +| | | | | | |-- advance_backward.hpp +| | | | | | |-- advance_forward.hpp +| | | | | | |-- and.hpp +| | | | | | |-- apply_fwd.hpp +| | | | | | |-- apply.hpp +| | | | | | |-- apply_wrap.hpp +| | | | | | |-- arg.hpp +| | | | | | |-- basic_bind.hpp +| | | | | | |-- bind_fwd.hpp +| | | | | | |-- bind.hpp +| | | | | | |-- bitand.hpp +| | | | | | |-- bitor.hpp +| | | | | | |-- bitxor.hpp +| | | | | | |-- deque.hpp +| | | | | | |-- divides.hpp +| | | | | | |-- equal_to.hpp +| | | | | | |-- fold_impl.hpp +| | | | | | |-- full_lambda.hpp +| | | | | | |-- greater_equal.hpp +| | | | | | |-- greater.hpp +| | | | | | |-- inherit.hpp +| | | | | | |-- iter_fold_if_impl.hpp +| | | | | | |-- iter_fold_impl.hpp +| | | | | | |-- lambda_no_ctps.hpp +| | | | | | |-- less_equal.hpp +| | | | | | |-- less.hpp +| | | | | | |-- list_c.hpp +| | | | | | |-- list.hpp +| | | | | | |-- map.hpp +| | | | | | |-- minus.hpp +| | | | | | |-- modulus.hpp +| | | | | | |-- not_equal_to.hpp +| | | | | | |-- or.hpp +| | | | | | |-- placeholders.hpp +| | | | | | |-- plus.hpp +| | | | | | |-- quote.hpp +| | | | | | |-- reverse_fold_impl.hpp +| | | | | | |-- reverse_iter_fold_impl.hpp +| | | | | | |-- set_c.hpp +| | | | | | |-- set.hpp +| | | | | | |-- shift_left.hpp +| | | | | | |-- shift_right.hpp +| | | | | | |-- template_arity.hpp +| | | | | | |-- times.hpp +| | | | | | |-- unpack_args.hpp +| | | | | | |-- vector_c.hpp +| | | | | | `-- vector.hpp +| | | | | |-- mwcw +| | | | | | |-- advance_backward.hpp +| | | | | | |-- advance_forward.hpp +| | | | | | |-- and.hpp +| | | | | | |-- apply_fwd.hpp +| | | | | | |-- apply.hpp +| | | | | | |-- apply_wrap.hpp +| | | | | | |-- arg.hpp +| | | | | | |-- basic_bind.hpp +| | | | | | |-- bind_fwd.hpp +| | | | | | |-- bind.hpp +| | | | | | |-- bitand.hpp +| | | | | | |-- bitor.hpp +| | | | | | |-- bitxor.hpp +| | | | | | |-- deque.hpp +| | | | | | |-- divides.hpp +| | | | | | |-- equal_to.hpp +| | | | | | |-- fold_impl.hpp +| | | | | | |-- full_lambda.hpp +| | | | | | |-- greater_equal.hpp +| | | | | | |-- greater.hpp +| | | | | | |-- inherit.hpp +| | | | | | |-- iter_fold_if_impl.hpp +| | | | | | |-- iter_fold_impl.hpp +| | | | | | |-- lambda_no_ctps.hpp +| | | | | | |-- less_equal.hpp +| | | | | | |-- less.hpp +| | | | | | |-- list_c.hpp +| | | | | | |-- list.hpp +| | | | | | |-- map.hpp +| | | | | | |-- minus.hpp +| | | | | | |-- modulus.hpp +| | | | | | |-- not_equal_to.hpp +| | | | | | |-- or.hpp +| | | | | | |-- placeholders.hpp +| | | | | | |-- plus.hpp +| | | | | | |-- quote.hpp +| | | | | | |-- reverse_fold_impl.hpp +| | | | | | |-- reverse_iter_fold_impl.hpp +| | | | | | |-- set_c.hpp +| | | | | | |-- set.hpp +| | | | | | |-- shift_left.hpp +| | | | | | |-- shift_right.hpp +| | | | | | |-- template_arity.hpp +| | | | | | |-- times.hpp +| | | | | | |-- unpack_args.hpp +| | | | | | |-- vector_c.hpp +| | | | | | `-- vector.hpp +| | | | | |-- no_ctps +| | | | | | |-- advance_backward.hpp +| | | | | | |-- advance_forward.hpp +| | | | | | |-- and.hpp +| | | | | | |-- apply_fwd.hpp +| | | | | | |-- apply.hpp +| | | | | | |-- apply_wrap.hpp +| | | | | | |-- arg.hpp +| | | | | | |-- basic_bind.hpp +| | | | | | |-- bind_fwd.hpp +| | | | | | |-- bind.hpp +| | | | | | |-- bitand.hpp +| | | | | | |-- bitor.hpp +| | | | | | |-- bitxor.hpp +| | | | | | |-- deque.hpp +| | | | | | |-- divides.hpp +| | | | | | |-- equal_to.hpp +| | | | | | |-- fold_impl.hpp +| | | | | | |-- full_lambda.hpp +| | | | | | |-- greater_equal.hpp +| | | | | | |-- greater.hpp +| | | | | | |-- inherit.hpp +| | | | | | |-- iter_fold_if_impl.hpp +| | | | | | |-- iter_fold_impl.hpp +| | | | | | |-- lambda_no_ctps.hpp +| | | | | | |-- less_equal.hpp +| | | | | | |-- less.hpp +| | | | | | |-- list_c.hpp +| | | | | | |-- list.hpp +| | | | | | |-- map.hpp +| | | | | | |-- minus.hpp +| | | | | | |-- modulus.hpp +| | | | | | |-- not_equal_to.hpp +| | | | | | |-- or.hpp +| | | | | | |-- placeholders.hpp +| | | | | | |-- plus.hpp +| | | | | | |-- quote.hpp +| | | | | | |-- reverse_fold_impl.hpp +| | | | | | |-- reverse_iter_fold_impl.hpp +| | | | | | |-- set_c.hpp +| | | | | | |-- set.hpp +| | | | | | |-- shift_left.hpp +| | | | | | |-- shift_right.hpp +| | | | | | |-- template_arity.hpp +| | | | | | |-- times.hpp +| | | | | | |-- unpack_args.hpp +| | | | | | |-- vector_c.hpp +| | | | | | `-- vector.hpp +| | | | | |-- no_ttp +| | | | | | |-- advance_backward.hpp +| | | | | | |-- advance_forward.hpp +| | | | | | |-- and.hpp +| | | | | | |-- apply_fwd.hpp +| | | | | | |-- apply.hpp +| | | | | | |-- apply_wrap.hpp +| | | | | | |-- arg.hpp +| | | | | | |-- basic_bind.hpp +| | | | | | |-- bind_fwd.hpp +| | | | | | |-- bind.hpp +| | | | | | |-- bitand.hpp +| | | | | | |-- bitor.hpp +| | | | | | |-- bitxor.hpp +| | | | | | |-- deque.hpp +| | | | | | |-- divides.hpp +| | | | | | |-- equal_to.hpp +| | | | | | |-- fold_impl.hpp +| | | | | | |-- full_lambda.hpp +| | | | | | |-- greater_equal.hpp +| | | | | | |-- greater.hpp +| | | | | | |-- inherit.hpp +| | | | | | |-- iter_fold_if_impl.hpp +| | | | | | |-- iter_fold_impl.hpp +| | | | | | |-- lambda_no_ctps.hpp +| | | | | | |-- less_equal.hpp +| | | | | | |-- less.hpp +| | | | | | |-- list_c.hpp +| | | | | | |-- list.hpp +| | | | | | |-- map.hpp +| | | | | | |-- minus.hpp +| | | | | | |-- modulus.hpp +| | | | | | |-- not_equal_to.hpp +| | | | | | |-- or.hpp +| | | | | | |-- placeholders.hpp +| | | | | | |-- plus.hpp +| | | | | | |-- quote.hpp +| | | | | | |-- reverse_fold_impl.hpp +| | | | | | |-- reverse_iter_fold_impl.hpp +| | | | | | |-- set_c.hpp +| | | | | | |-- set.hpp +| | | | | | |-- shift_left.hpp +| | | | | | |-- shift_right.hpp +| | | | | | |-- template_arity.hpp +| | | | | | |-- times.hpp +| | | | | | |-- unpack_args.hpp +| | | | | | |-- vector_c.hpp +| | | | | | `-- vector.hpp +| | | | | `-- plain +| | | | | |-- advance_backward.hpp +| | | | | |-- advance_forward.hpp +| | | | | |-- and.hpp +| | | | | |-- apply_fwd.hpp +| | | | | |-- apply.hpp +| | | | | |-- apply_wrap.hpp +| | | | | |-- arg.hpp +| | | | | |-- basic_bind.hpp +| | | | | |-- bind_fwd.hpp +| | | | | |-- bind.hpp +| | | | | |-- bitand.hpp +| | | | | |-- bitor.hpp +| | | | | |-- bitxor.hpp +| | | | | |-- deque.hpp +| | | | | |-- divides.hpp +| | | | | |-- equal_to.hpp +| | | | | |-- fold_impl.hpp +| | | | | |-- full_lambda.hpp +| | | | | |-- greater_equal.hpp +| | | | | |-- greater.hpp +| | | | | |-- inherit.hpp +| | | | | |-- iter_fold_if_impl.hpp +| | | | | |-- iter_fold_impl.hpp +| | | | | |-- lambda_no_ctps.hpp +| | | | | |-- less_equal.hpp +| | | | | |-- less.hpp +| | | | | |-- list_c.hpp +| | | | | |-- list.hpp +| | | | | |-- map.hpp +| | | | | |-- minus.hpp +| | | | | |-- modulus.hpp +| | | | | |-- not_equal_to.hpp +| | | | | |-- or.hpp +| | | | | |-- placeholders.hpp +| | | | | |-- plus.hpp +| | | | | |-- quote.hpp +| | | | | |-- reverse_fold_impl.hpp +| | | | | |-- reverse_iter_fold_impl.hpp +| | | | | |-- set_c.hpp +| | | | | |-- set.hpp +| | | | | |-- shift_left.hpp +| | | | | |-- shift_right.hpp +| | | | | |-- template_arity.hpp +| | | | | |-- times.hpp +| | | | | |-- unpack_args.hpp +| | | | | |-- vector_c.hpp +| | | | | `-- vector.hpp +| | | | |-- preprocessor +| | | | | |-- add.hpp +| | | | | |-- default_params.hpp +| | | | | |-- def_params_tail.hpp +| | | | | |-- enum.hpp +| | | | | |-- ext_params.hpp +| | | | | |-- filter_params.hpp +| | | | | |-- is_seq.hpp +| | | | | |-- params.hpp +| | | | | |-- partial_spec_params.hpp +| | | | | |-- range.hpp +| | | | | |-- repeat.hpp +| | | | | |-- sub.hpp +| | | | | |-- token_equal.hpp +| | | | | `-- tuple.hpp +| | | | |-- adl_barrier.hpp +| | | | |-- advance_backward.hpp +| | | | |-- advance_forward.hpp +| | | | |-- arg_typedef.hpp +| | | | |-- arithmetic_op.hpp +| | | | |-- arity.hpp +| | | | |-- arity_spec.hpp +| | | | |-- at_impl.hpp +| | | | |-- back_impl.hpp +| | | | |-- begin_end_impl.hpp +| | | | |-- clear_impl.hpp +| | | | |-- common_name_wknd.hpp +| | | | |-- comparison_op.hpp +| | | | |-- contains_impl.hpp +| | | | |-- count_args.hpp +| | | | |-- empty_impl.hpp +| | | | |-- erase_impl.hpp +| | | | |-- erase_key_impl.hpp +| | | | |-- find_if_pred.hpp +| | | | |-- fold_impl_body.hpp +| | | | |-- fold_impl.hpp +| | | | |-- front_impl.hpp +| | | | |-- full_lambda.hpp +| | | | |-- has_apply.hpp +| | | | |-- has_begin.hpp +| | | | |-- has_key_impl.hpp +| | | | |-- has_rebind.hpp +| | | | |-- has_size.hpp +| | | | |-- has_tag.hpp +| | | | |-- has_type.hpp +| | | | |-- include_preprocessed.hpp +| | | | |-- inserter_algorithm.hpp +| | | | |-- insert_impl.hpp +| | | | |-- insert_range_impl.hpp +| | | | |-- integral_wrapper.hpp +| | | | |-- is_msvc_eti_arg.hpp +| | | | |-- iter_apply.hpp +| | | | |-- iter_fold_if_impl.hpp +| | | | |-- iter_fold_impl.hpp +| | | | |-- iter_push_front.hpp +| | | | |-- joint_iter.hpp +| | | | |-- lambda_arity_param.hpp +| | | | |-- lambda_no_ctps.hpp +| | | | |-- lambda_spec.hpp +| | | | |-- lambda_support.hpp +| | | | |-- largest_int.hpp +| | | | |-- logical_op.hpp +| | | | |-- msvc_dtw.hpp +| | | | |-- msvc_eti_base.hpp +| | | | |-- msvc_is_class.hpp +| | | | |-- msvc_never_true.hpp +| | | | |-- msvc_type.hpp +| | | | |-- na_assert.hpp +| | | | |-- na_fwd.hpp +| | | | |-- na.hpp +| | | | |-- na_spec.hpp +| | | | |-- nested_type_wknd.hpp +| | | | |-- nttp_decl.hpp +| | | | |-- numeric_cast_utils.hpp +| | | | |-- numeric_op.hpp +| | | | |-- O1_size_impl.hpp +| | | | |-- pop_back_impl.hpp +| | | | |-- pop_front_impl.hpp +| | | | |-- push_back_impl.hpp +| | | | |-- push_front_impl.hpp +| | | | |-- reverse_fold_impl_body.hpp +| | | | |-- reverse_fold_impl.hpp +| | | | |-- sequence_wrapper.hpp +| | | | |-- size_impl.hpp +| | | | |-- static_cast.hpp +| | | | |-- template_arity_fwd.hpp +| | | | |-- template_arity.hpp +| | | | |-- traits_lambda_spec.hpp +| | | | |-- type_wrapper.hpp +| | | | |-- unwrap.hpp +| | | | |-- value_wknd.hpp +| | | | `-- yes_no.hpp +| | | |-- limits +| | | | |-- arity.hpp +| | | | |-- list.hpp +| | | | |-- unrolling.hpp +| | | | `-- vector.hpp +| | | |-- list +| | | | |-- aux_ +| | | | | |-- preprocessed +| | | | | | `-- plain +| | | | | | |-- list10_c.hpp +| | | | | | |-- list10.hpp +| | | | | | |-- list20_c.hpp +| | | | | | |-- list20.hpp +| | | | | | |-- list30_c.hpp +| | | | | | |-- list30.hpp +| | | | | | |-- list40_c.hpp +| | | | | | |-- list40.hpp +| | | | | | |-- list50_c.hpp +| | | | | | `-- list50.hpp +| | | | | |-- begin_end.hpp +| | | | | |-- clear.hpp +| | | | | |-- empty.hpp +| | | | | |-- front.hpp +| | | | | |-- include_preprocessed.hpp +| | | | | |-- item.hpp +| | | | | |-- iterator.hpp +| | | | | |-- numbered_c.hpp +| | | | | |-- numbered.hpp +| | | | | |-- O1_size.hpp +| | | | | |-- pop_front.hpp +| | | | | |-- push_back.hpp +| | | | | |-- push_front.hpp +| | | | | |-- size.hpp +| | | | | `-- tag.hpp +| | | | |-- list0_c.hpp +| | | | |-- list0.hpp +| | | | |-- list10_c.hpp +| | | | |-- list10.hpp +| | | | |-- list20_c.hpp +| | | | |-- list20.hpp +| | | | |-- list30_c.hpp +| | | | |-- list30.hpp +| | | | |-- list40_c.hpp +| | | | |-- list40.hpp +| | | | |-- list50_c.hpp +| | | | `-- list50.hpp +| | | |-- vector +| | | | |-- aux_ +| | | | | |-- preprocessed +| | | | | | |-- no_ctps +| | | | | | | |-- vector10_c.hpp +| | | | | | | |-- vector10.hpp +| | | | | | | |-- vector20_c.hpp +| | | | | | | |-- vector20.hpp +| | | | | | | |-- vector30_c.hpp +| | | | | | | |-- vector30.hpp +| | | | | | | |-- vector40_c.hpp +| | | | | | | |-- vector40.hpp +| | | | | | | |-- vector50_c.hpp +| | | | | | | `-- vector50.hpp +| | | | | | |-- plain +| | | | | | | |-- vector10_c.hpp +| | | | | | | |-- vector10.hpp +| | | | | | | |-- vector20_c.hpp +| | | | | | | |-- vector20.hpp +| | | | | | | |-- vector30_c.hpp +| | | | | | | |-- vector30.hpp +| | | | | | | |-- vector40_c.hpp +| | | | | | | |-- vector40.hpp +| | | | | | | |-- vector50_c.hpp +| | | | | | | `-- vector50.hpp +| | | | | | `-- typeof_based +| | | | | | |-- vector10_c.hpp +| | | | | | |-- vector10.hpp +| | | | | | |-- vector20_c.hpp +| | | | | | |-- vector20.hpp +| | | | | | |-- vector30_c.hpp +| | | | | | |-- vector30.hpp +| | | | | | |-- vector40_c.hpp +| | | | | | |-- vector40.hpp +| | | | | | |-- vector50_c.hpp +| | | | | | `-- vector50.hpp +| | | | | |-- at.hpp +| | | | | |-- back.hpp +| | | | | |-- begin_end.hpp +| | | | | |-- clear.hpp +| | | | | |-- empty.hpp +| | | | | |-- front.hpp +| | | | | |-- include_preprocessed.hpp +| | | | | |-- item.hpp +| | | | | |-- iterator.hpp +| | | | | |-- numbered_c.hpp +| | | | | |-- numbered.hpp +| | | | | |-- O1_size.hpp +| | | | | |-- pop_back.hpp +| | | | | |-- pop_front.hpp +| | | | | |-- push_back.hpp +| | | | | |-- push_front.hpp +| | | | | |-- size.hpp +| | | | | |-- tag.hpp +| | | | | `-- vector0.hpp +| | | | |-- vector0_c.hpp +| | | | |-- vector0.hpp +| | | | |-- vector10_c.hpp +| | | | |-- vector10.hpp +| | | | |-- vector20_c.hpp +| | | | |-- vector20.hpp +| | | | |-- vector30_c.hpp +| | | | |-- vector30.hpp +| | | | |-- vector40_c.hpp +| | | | |-- vector40.hpp +| | | | |-- vector50_c.hpp +| | | | `-- vector50.hpp +| | | |-- advance_fwd.hpp +| | | |-- advance.hpp +| | | |-- always.hpp +| | | |-- and.hpp +| | | |-- apply_fwd.hpp +| | | |-- apply.hpp +| | | |-- apply_wrap.hpp +| | | |-- arg_fwd.hpp +| | | |-- arg.hpp +| | | |-- assert.hpp +| | | |-- at_fwd.hpp +| | | |-- at.hpp +| | | |-- back_fwd.hpp +| | | |-- back.hpp +| | | |-- back_inserter.hpp +| | | |-- begin_end_fwd.hpp +| | | |-- begin_end.hpp +| | | |-- begin.hpp +| | | |-- bind_fwd.hpp +| | | |-- bind.hpp +| | | |-- bitand.hpp +| | | |-- bitxor.hpp +| | | |-- bool_fwd.hpp +| | | |-- bool.hpp +| | | |-- clear_fwd.hpp +| | | |-- clear.hpp +| | | |-- comparison.hpp +| | | |-- contains_fwd.hpp +| | | |-- contains.hpp +| | | |-- copy.hpp +| | | |-- deref.hpp +| | | |-- distance_fwd.hpp +| | | |-- distance.hpp +| | | |-- empty_base.hpp +| | | |-- empty_fwd.hpp +| | | |-- empty.hpp +| | | |-- end.hpp +| | | |-- equal_to.hpp +| | | |-- erase_fwd.hpp +| | | |-- erase.hpp +| | | |-- erase_key_fwd.hpp +| | | |-- erase_key.hpp +| | | |-- eval_if.hpp +| | | |-- find.hpp +| | | |-- find_if.hpp +| | | |-- fold.hpp +| | | |-- for_each.hpp +| | | |-- front_fwd.hpp +| | | |-- front.hpp +| | | |-- front_inserter.hpp +| | | |-- greater_equal.hpp +| | | |-- greater.hpp +| | | |-- has_key_fwd.hpp +| | | |-- has_key.hpp +| | | |-- has_xxx.hpp +| | | |-- identity.hpp +| | | |-- if.hpp +| | | |-- inherit.hpp +| | | |-- inserter.hpp +| | | |-- insert_fwd.hpp +| | | |-- insert.hpp +| | | |-- insert_range_fwd.hpp +| | | |-- insert_range.hpp +| | | |-- integral_c_fwd.hpp +| | | |-- integral_c.hpp +| | | |-- integral_c_tag.hpp +| | | |-- int_fwd.hpp +| | | |-- int.hpp +| | | |-- is_placeholder.hpp +| | | |-- is_sequence.hpp +| | | |-- iterator_category.hpp +| | | |-- iterator_range.hpp +| | | |-- iterator_tags.hpp +| | | |-- iter_fold.hpp +| | | |-- iter_fold_if.hpp +| | | |-- joint_view.hpp +| | | |-- lambda_fwd.hpp +| | | |-- lambda.hpp +| | | |-- less_equal.hpp +| | | |-- less.hpp +| | | |-- list.hpp +| | | |-- logical.hpp +| | | |-- long_fwd.hpp +| | | |-- long.hpp +| | | |-- min_max.hpp +| | | |-- minus.hpp +| | | |-- multiplies.hpp +| | | |-- negate.hpp +| | | |-- next.hpp +| | | |-- next_prior.hpp +| | | |-- not_equal_to.hpp +| | | |-- not.hpp +| | | |-- numeric_cast.hpp +| | | |-- O1_size_fwd.hpp +| | | |-- O1_size.hpp +| | | |-- or.hpp +| | | |-- pair.hpp +| | | |-- pair_view.hpp +| | | |-- placeholders.hpp +| | | |-- plus.hpp +| | | |-- pop_back_fwd.hpp +| | | |-- pop_back.hpp +| | | |-- pop_front_fwd.hpp +| | | |-- pop_front.hpp +| | | |-- prior.hpp +| | | |-- protect.hpp +| | | |-- push_back_fwd.hpp +| | | |-- push_back.hpp +| | | |-- push_front_fwd.hpp +| | | |-- push_front.hpp +| | | |-- quote.hpp +| | | |-- remove.hpp +| | | |-- remove_if.hpp +| | | |-- reverse_fold.hpp +| | | |-- reverse.hpp +| | | |-- same_as.hpp +| | | |-- sequence_tag_fwd.hpp +| | | |-- sequence_tag.hpp +| | | |-- size_fwd.hpp +| | | |-- size.hpp +| | | |-- size_t_fwd.hpp +| | | |-- size_t.hpp +| | | |-- tag.hpp +| | | |-- times.hpp +| | | |-- transform.hpp +| | | |-- vector.hpp +| | | |-- void_fwd.hpp +| | | `-- void.hpp +| | |-- numeric +| | | `-- conversion +| | | |-- detail +| | | | |-- preprocessed +| | | | | |-- numeric_cast_traits_common.hpp +| | | | | `-- numeric_cast_traits_long_long.hpp +| | | | |-- bounds.hpp +| | | | |-- conversion_traits.hpp +| | | | |-- converter.hpp +| | | | |-- int_float_mixture.hpp +| | | | |-- is_subranged.hpp +| | | | |-- meta.hpp +| | | | |-- numeric_cast_traits.hpp +| | | | |-- old_numeric_cast.hpp +| | | | |-- sign_mixture.hpp +| | | | `-- udt_builtin_mixture.hpp +| | | |-- bounds.hpp +| | | |-- cast.hpp +| | | |-- conversion_traits.hpp +| | | |-- converter.hpp +| | | |-- converter_policies.hpp +| | | |-- int_float_mixture_enum.hpp +| | | |-- numeric_cast_traits.hpp +| | | |-- sign_mixture_enum.hpp +| | | `-- udt_builtin_mixture_enum.hpp +| | |-- optional +| | | |-- detail +| | | | |-- experimental_traits.hpp +| | | | |-- old_optional_implementation.hpp +| | | | |-- optional_aligned_storage.hpp +| | | | |-- optional_config.hpp +| | | | |-- optional_factory_support.hpp +| | | | |-- optional_reference_spec.hpp +| | | | |-- optional_relops.hpp +| | | | |-- optional_swap.hpp +| | | | `-- optional_trivially_copyable_base.hpp +| | | |-- bad_optional_access.hpp +| | | |-- optional_fwd.hpp +| | | |-- optional.hpp +| | | `-- optional_io.hpp +| | |-- pending +| | | `-- iterator_tests.hpp +| | |-- predef +| | | |-- architecture +| | | | |-- x86 +| | | | | |-- 32.h +| | | | | `-- 64.h +| | | | |-- alpha.h +| | | | |-- arm.h +| | | | |-- blackfin.h +| | | | |-- convex.h +| | | | |-- ia64.h +| | | | |-- m68k.h +| | | | |-- mips.h +| | | | |-- parisc.h +| | | | |-- ppc.h +| | | | |-- ptx.h +| | | | |-- pyramid.h +| | | | |-- rs6k.h +| | | | |-- sparc.h +| | | | |-- superh.h +| | | | |-- sys370.h +| | | | |-- sys390.h +| | | | |-- x86.h +| | | | `-- z.h +| | | |-- compiler +| | | | |-- borland.h +| | | | |-- clang.h +| | | | |-- comeau.h +| | | | |-- compaq.h +| | | | |-- diab.h +| | | | |-- digitalmars.h +| | | | |-- dignus.h +| | | | |-- edg.h +| | | | |-- ekopath.h +| | | | |-- gcc.h +| | | | |-- gcc_xml.h +| | | | |-- greenhills.h +| | | | |-- hp_acc.h +| | | | |-- iar.h +| | | | |-- ibm.h +| | | | |-- intel.h +| | | | |-- kai.h +| | | | |-- llvm.h +| | | | |-- metaware.h +| | | | |-- metrowerks.h +| | | | |-- microtec.h +| | | | |-- mpw.h +| | | | |-- nvcc.h +| | | | |-- palm.h +| | | | |-- pgi.h +| | | | |-- sgi_mipspro.h +| | | | |-- sunpro.h +| | | | |-- tendra.h +| | | | |-- visualc.h +| | | | `-- watcom.h +| | | |-- detail +| | | | |-- _cassert.h +| | | | |-- comp_detected.h +| | | | |-- _exception.h +| | | | |-- os_detected.h +| | | | |-- platform_detected.h +| | | | `-- test.h +| | | |-- hardware +| | | | |-- simd +| | | | | |-- arm +| | | | | | `-- versions.h +| | | | | |-- ppc +| | | | | | `-- versions.h +| | | | | |-- x86 +| | | | | | `-- versions.h +| | | | | |-- x86_amd +| | | | | | `-- versions.h +| | | | | |-- arm.h +| | | | | |-- ppc.h +| | | | | |-- x86_amd.h +| | | | | `-- x86.h +| | | | `-- simd.h +| | | |-- language +| | | | |-- cuda.h +| | | | |-- objc.h +| | | | |-- stdc.h +| | | | `-- stdcpp.h +| | | |-- library +| | | | |-- c +| | | | | |-- cloudabi.h +| | | | | |-- gnu.h +| | | | | |-- _prefix.h +| | | | | |-- uc.h +| | | | | |-- vms.h +| | | | | `-- zos.h +| | | | |-- std +| | | | | |-- cxx.h +| | | | | |-- dinkumware.h +| | | | | |-- libcomo.h +| | | | | |-- modena.h +| | | | | |-- msl.h +| | | | | |-- _prefix.h +| | | | | |-- roguewave.h +| | | | | |-- sgi.h +| | | | | |-- stdcpp3.h +| | | | | |-- stlport.h +| | | | | `-- vacpp.h +| | | | |-- c.h +| | | | `-- std.h +| | | |-- os +| | | | |-- bsd +| | | | | |-- bsdi.h +| | | | | |-- dragonfly.h +| | | | | |-- free.h +| | | | | |-- net.h +| | | | | `-- open.h +| | | | |-- aix.h +| | | | |-- amigaos.h +| | | | |-- android.h +| | | | |-- beos.h +| | | | |-- bsd.h +| | | | |-- cygwin.h +| | | | |-- haiku.h +| | | | |-- hpux.h +| | | | |-- ios.h +| | | | |-- irix.h +| | | | |-- linux.h +| | | | |-- macos.h +| | | | |-- os400.h +| | | | |-- qnxnto.h +| | | | |-- solaris.h +| | | | |-- unix.h +| | | | |-- vms.h +| | | | `-- windows.h +| | | |-- other +| | | | `-- endian.h +| | | |-- platform +| | | | |-- android.h +| | | | |-- cloudabi.h +| | | | |-- ios.h +| | | | |-- mingw32.h +| | | | |-- mingw64.h +| | | | |-- mingw.h +| | | | |-- windows_desktop.h +| | | | |-- windows_phone.h +| | | | |-- windows_runtime.h +| | | | |-- windows_server.h +| | | | |-- windows_store.h +| | | | |-- windows_system.h +| | | | `-- windows_uwp.h +| | | |-- architecture.h +| | | |-- compiler.h +| | | |-- hardware.h +| | | |-- language.h +| | | |-- library.h +| | | |-- make.h +| | | |-- os.h +| | | |-- other.h +| | | |-- platform.h +| | | |-- version.h +| | | `-- version_number.h +| | |-- preprocessor +| | | |-- arithmetic +| | | | |-- detail +| | | | | `-- div_base.hpp +| | | | |-- add.hpp +| | | | |-- dec.hpp +| | | | |-- inc.hpp +| | | | |-- mod.hpp +| | | | `-- sub.hpp +| | | |-- array +| | | | |-- data.hpp +| | | | |-- elem.hpp +| | | | `-- size.hpp +| | | |-- comparison +| | | | |-- equal.hpp +| | | | |-- less_equal.hpp +| | | | |-- less.hpp +| | | | `-- not_equal.hpp +| | | |-- config +| | | | `-- config.hpp +| | | |-- control +| | | | |-- detail +| | | | | |-- dmc +| | | | | | `-- while.hpp +| | | | | |-- edg +| | | | | | `-- while.hpp +| | | | | |-- msvc +| | | | | | `-- while.hpp +| | | | | `-- while.hpp +| | | | |-- deduce_d.hpp +| | | | |-- expr_if.hpp +| | | | |-- expr_iif.hpp +| | | | |-- if.hpp +| | | | |-- iif.hpp +| | | | `-- while.hpp +| | | |-- debug +| | | | `-- error.hpp +| | | |-- detail +| | | | |-- dmc +| | | | | `-- auto_rec.hpp +| | | | |-- auto_rec.hpp +| | | | |-- check.hpp +| | | | |-- is_binary.hpp +| | | | |-- is_unary.hpp +| | | | `-- split.hpp +| | | |-- facilities +| | | | |-- detail +| | | | | `-- is_empty.hpp +| | | | |-- empty.hpp +| | | | |-- expand.hpp +| | | | |-- identity.hpp +| | | | |-- intercept.hpp +| | | | |-- is_1.hpp +| | | | |-- is_empty.hpp +| | | | |-- is_empty_variadic.hpp +| | | | `-- overload.hpp +| | | |-- iteration +| | | | |-- detail +| | | | | |-- bounds +| | | | | | |-- lower1.hpp +| | | | | | |-- lower2.hpp +| | | | | | |-- lower3.hpp +| | | | | | |-- lower4.hpp +| | | | | | |-- lower5.hpp +| | | | | | |-- upper1.hpp +| | | | | | |-- upper2.hpp +| | | | | | |-- upper3.hpp +| | | | | | |-- upper4.hpp +| | | | | | `-- upper5.hpp +| | | | | |-- iter +| | | | | | |-- forward1.hpp +| | | | | | |-- forward2.hpp +| | | | | | |-- forward3.hpp +| | | | | | |-- forward4.hpp +| | | | | | |-- forward5.hpp +| | | | | | |-- reverse1.hpp +| | | | | | |-- reverse2.hpp +| | | | | | |-- reverse3.hpp +| | | | | | |-- reverse4.hpp +| | | | | | `-- reverse5.hpp +| | | | | |-- finish.hpp +| | | | | |-- local.hpp +| | | | | |-- rlocal.hpp +| | | | | |-- self.hpp +| | | | | `-- start.hpp +| | | | |-- iterate.hpp +| | | | |-- local.hpp +| | | | `-- self.hpp +| | | |-- list +| | | | |-- detail +| | | | | |-- dmc +| | | | | | `-- fold_left.hpp +| | | | | |-- edg +| | | | | | |-- fold_left.hpp +| | | | | | `-- fold_right.hpp +| | | | | |-- fold_left.hpp +| | | | | `-- fold_right.hpp +| | | | |-- adt.hpp +| | | | |-- fold_left.hpp +| | | | |-- fold_right.hpp +| | | | |-- for_each_i.hpp +| | | | `-- reverse.hpp +| | | |-- logical +| | | | |-- and.hpp +| | | | |-- bitand.hpp +| | | | |-- bitor.hpp +| | | | |-- bool.hpp +| | | | |-- compl.hpp +| | | | |-- not.hpp +| | | | `-- or.hpp +| | | |-- punctuation +| | | | |-- detail +| | | | | `-- is_begin_parens.hpp +| | | | |-- comma.hpp +| | | | |-- comma_if.hpp +| | | | |-- is_begin_parens.hpp +| | | | `-- paren.hpp +| | | |-- repetition +| | | | |-- detail +| | | | | |-- dmc +| | | | | | `-- for.hpp +| | | | | |-- edg +| | | | | | `-- for.hpp +| | | | | |-- msvc +| | | | | | `-- for.hpp +| | | | | `-- for.hpp +| | | | |-- enum_binary_params.hpp +| | | | |-- enum.hpp +| | | | |-- enum_params.hpp +| | | | |-- enum_params_with_a_default.hpp +| | | | |-- enum_shifted.hpp +| | | | |-- enum_shifted_params.hpp +| | | | |-- enum_trailing.hpp +| | | | |-- enum_trailing_params.hpp +| | | | |-- for.hpp +| | | | |-- repeat_from_to.hpp +| | | | `-- repeat.hpp +| | | |-- seq +| | | | |-- detail +| | | | | |-- is_empty.hpp +| | | | | `-- split.hpp +| | | | |-- cat.hpp +| | | | |-- elem.hpp +| | | | |-- enum.hpp +| | | | |-- first_n.hpp +| | | | |-- fold_left.hpp +| | | | |-- for_each.hpp +| | | | |-- for_each_i.hpp +| | | | |-- push_front.hpp +| | | | |-- rest_n.hpp +| | | | |-- seq.hpp +| | | | |-- size.hpp +| | | | |-- subseq.hpp +| | | | |-- to_tuple.hpp +| | | | `-- transform.hpp +| | | |-- slot +| | | | |-- detail +| | | | | |-- counter.hpp +| | | | | |-- def.hpp +| | | | | |-- shared.hpp +| | | | | |-- slot1.hpp +| | | | | |-- slot2.hpp +| | | | | |-- slot3.hpp +| | | | | |-- slot4.hpp +| | | | | `-- slot5.hpp +| | | | `-- slot.hpp +| | | |-- tuple +| | | | |-- detail +| | | | | `-- is_single_return.hpp +| | | | |-- eat.hpp +| | | | |-- elem.hpp +| | | | |-- rem.hpp +| | | | |-- size.hpp +| | | | |-- to_list.hpp +| | | | `-- to_seq.hpp +| | | |-- variadic +| | | | |-- elem.hpp +| | | | |-- size.hpp +| | | | `-- to_seq.hpp +| | | |-- cat.hpp +| | | |-- comma_if.hpp +| | | |-- dec.hpp +| | | |-- empty.hpp +| | | |-- enum.hpp +| | | |-- enum_params.hpp +| | | |-- enum_params_with_a_default.hpp +| | | |-- enum_shifted_params.hpp +| | | |-- expr_if.hpp +| | | |-- identity.hpp +| | | |-- if.hpp +| | | |-- inc.hpp +| | | |-- iterate.hpp +| | | |-- repeat_from_to.hpp +| | | |-- repeat.hpp +| | | `-- stringize.hpp +| | |-- program_options +| | | |-- detail +| | | | |-- cmdline.hpp +| | | | |-- config_file.hpp +| | | | |-- convert.hpp +| | | | |-- parsers.hpp +| | | | |-- utf8_codecvt_facet.hpp +| | | | `-- value_semantic.hpp +| | | |-- cmdline.hpp +| | | |-- config.hpp +| | | |-- environment_iterator.hpp +| | | |-- eof_iterator.hpp +| | | |-- errors.hpp +| | | |-- option.hpp +| | | |-- options_description.hpp +| | | |-- parsers.hpp +| | | |-- positional_options.hpp +| | | |-- value_semantic.hpp +| | | |-- variables_map.hpp +| | | `-- version.hpp +| | |-- range +| | | |-- algorithm +| | | | `-- equal.hpp +| | | |-- detail +| | | | |-- as_literal.hpp +| | | | |-- begin.hpp +| | | | |-- common.hpp +| | | | |-- detail_str.hpp +| | | | |-- end.hpp +| | | | |-- extract_optional_type.hpp +| | | | |-- has_member_size.hpp +| | | | |-- implementation_help.hpp +| | | | |-- misc_concept.hpp +| | | | |-- msvc_has_iterator_workaround.hpp +| | | | |-- remove_extent.hpp +| | | | |-- safe_bool.hpp +| | | | |-- sfinae.hpp +| | | | |-- size_type.hpp +| | | | |-- str_types.hpp +| | | | `-- value_type.hpp +| | | |-- as_literal.hpp +| | | |-- begin.hpp +| | | |-- concepts.hpp +| | | |-- config.hpp +| | | |-- const_iterator.hpp +| | | |-- difference_type.hpp +| | | |-- distance.hpp +| | | |-- empty.hpp +| | | |-- end.hpp +| | | |-- functions.hpp +| | | |-- has_range_iterator.hpp +| | | |-- iterator.hpp +| | | |-- iterator_range_core.hpp +| | | |-- iterator_range.hpp +| | | |-- iterator_range_io.hpp +| | | |-- mutable_iterator.hpp +| | | |-- range_fwd.hpp +| | | |-- rbegin.hpp +| | | |-- rend.hpp +| | | |-- reverse_iterator.hpp +| | | |-- size.hpp +| | | |-- size_type.hpp +| | | `-- value_type.hpp +| | |-- ratio +| | | |-- detail +| | | | |-- mpl +| | | | | |-- abs.hpp +| | | | | |-- gcd.hpp +| | | | | |-- lcm.hpp +| | | | | `-- sign.hpp +| | | | `-- overflow_helpers.hpp +| | | |-- mpl +| | | | `-- rational_c_tag.hpp +| | | |-- config.hpp +| | | |-- ratio_fwd.hpp +| | | `-- ratio.hpp +| | |-- smart_ptr +| | | |-- detail +| | | | |-- atomic_count_gcc.hpp +| | | | |-- atomic_count_gcc_x86.hpp +| | | | |-- atomic_count.hpp +| | | | |-- atomic_count_nt.hpp +| | | | |-- atomic_count_pt.hpp +| | | | |-- atomic_count_spin.hpp +| | | | |-- atomic_count_std_atomic.hpp +| | | | |-- atomic_count_sync.hpp +| | | | |-- atomic_count_win32.hpp +| | | | |-- lightweight_mutex.hpp +| | | | |-- local_counted_base.hpp +| | | | |-- local_sp_deleter.hpp +| | | | |-- lwm_nop.hpp +| | | | |-- lwm_pthreads.hpp +| | | | |-- lwm_win32_cs.hpp +| | | | |-- operator_bool.hpp +| | | | |-- quick_allocator.hpp +| | | | |-- shared_count.hpp +| | | | |-- sp_convertible.hpp +| | | | |-- sp_counted_base_acc_ia64.hpp +| | | | |-- sp_counted_base_aix.hpp +| | | | |-- sp_counted_base_clang.hpp +| | | | |-- sp_counted_base_cw_ppc.hpp +| | | | |-- sp_counted_base_gcc_ia64.hpp +| | | | |-- sp_counted_base_gcc_mips.hpp +| | | | |-- sp_counted_base_gcc_ppc.hpp +| | | | |-- sp_counted_base_gcc_sparc.hpp +| | | | |-- sp_counted_base_gcc_x86.hpp +| | | | |-- sp_counted_base.hpp +| | | | |-- sp_counted_base_nt.hpp +| | | | |-- sp_counted_base_pt.hpp +| | | | |-- sp_counted_base_snc_ps3.hpp +| | | | |-- sp_counted_base_spin.hpp +| | | | |-- sp_counted_base_std_atomic.hpp +| | | | |-- sp_counted_base_sync.hpp +| | | | |-- sp_counted_base_vacpp_ppc.hpp +| | | | |-- sp_counted_base_w32.hpp +| | | | |-- sp_counted_impl.hpp +| | | | |-- sp_disable_deprecated.hpp +| | | | |-- sp_forward.hpp +| | | | |-- sp_has_sync.hpp +| | | | |-- spinlock_gcc_arm.hpp +| | | | |-- spinlock.hpp +| | | | |-- spinlock_nt.hpp +| | | | |-- spinlock_pool.hpp +| | | | |-- spinlock_pt.hpp +| | | | |-- spinlock_std_atomic.hpp +| | | | |-- spinlock_sync.hpp +| | | | |-- spinlock_w32.hpp +| | | | |-- sp_interlocked.hpp +| | | | |-- sp_noexcept.hpp +| | | | |-- sp_nullptr_t.hpp +| | | | `-- yield_k.hpp +| | | |-- allocate_shared_array.hpp +| | | |-- bad_weak_ptr.hpp +| | | |-- intrusive_ptr.hpp +| | | |-- intrusive_ref_counter.hpp +| | | |-- make_shared_array.hpp +| | | |-- make_shared.hpp +| | | |-- make_shared_object.hpp +| | | |-- scoped_array.hpp +| | | |-- scoped_ptr.hpp +| | | `-- shared_ptr.hpp +| | |-- system +| | | |-- detail +| | | | |-- config.hpp +| | | | |-- generic_category.hpp +| | | | |-- std_interoperability.hpp +| | | | |-- system_category_posix.hpp +| | | | `-- system_category_win32.hpp +| | | |-- api_config.hpp +| | | |-- config.hpp +| | | |-- error_code.hpp +| | | `-- system_error.hpp +| | |-- test +| | | |-- detail +| | | | |-- config.hpp +| | | | |-- enable_warnings.hpp +| | | | |-- fwd_decl.hpp +| | | | |-- global_typedef.hpp +| | | | |-- log_level.hpp +| | | | |-- pp_variadic.hpp +| | | | |-- suppress_warnings.hpp +| | | | `-- throw_exception.hpp +| | | |-- impl +| | | | |-- compiler_log_formatter.ipp +| | | | |-- cpp_main.ipp +| | | | |-- debug.ipp +| | | | |-- decorator.ipp +| | | | |-- execution_monitor.ipp +| | | | |-- framework.ipp +| | | | |-- junit_log_formatter.ipp +| | | | |-- plain_report_formatter.ipp +| | | | |-- progress_monitor.ipp +| | | | |-- results_collector.ipp +| | | | |-- results_reporter.ipp +| | | | |-- test_framework_init_observer.ipp +| | | | |-- test_main.ipp +| | | | |-- test_tools.ipp +| | | | |-- test_tree.ipp +| | | | |-- unit_test_log.ipp +| | | | |-- unit_test_main.ipp +| | | | |-- unit_test_monitor.ipp +| | | | |-- unit_test_parameters.ipp +| | | | |-- xml_log_formatter.ipp +| | | | `-- xml_report_formatter.ipp +| | | |-- output +| | | | |-- compiler_log_formatter.hpp +| | | | |-- junit_log_formatter.hpp +| | | | |-- plain_report_formatter.hpp +| | | | |-- xml_log_formatter.hpp +| | | | `-- xml_report_formatter.hpp +| | | |-- tools +| | | | |-- detail +| | | | | |-- bitwise_manip.hpp +| | | | | |-- expression_holder.hpp +| | | | | |-- fwd.hpp +| | | | | |-- indirections.hpp +| | | | | |-- it_pair.hpp +| | | | | |-- lexicographic_manip.hpp +| | | | | |-- per_element_manip.hpp +| | | | | |-- print_helper.hpp +| | | | | `-- tolerance_manip.hpp +| | | | |-- old +| | | | | |-- impl.hpp +| | | | | `-- interface.hpp +| | | | |-- assertion.hpp +| | | | |-- assertion_result.hpp +| | | | |-- collection_comparison_op.hpp +| | | | |-- context.hpp +| | | | |-- cstring_comparison_op.hpp +| | | | |-- floating_point_comparison.hpp +| | | | |-- fpc_op.hpp +| | | | |-- fpc_tolerance.hpp +| | | | |-- interface.hpp +| | | | `-- output_test_stream.hpp +| | | |-- tree +| | | | |-- auto_registration.hpp +| | | | |-- decorator.hpp +| | | | |-- fixture.hpp +| | | | |-- global_fixture.hpp +| | | | |-- observer.hpp +| | | | |-- test_case_counter.hpp +| | | | |-- test_case_template.hpp +| | | | |-- test_unit.hpp +| | | | |-- traverse.hpp +| | | | `-- visitor.hpp +| | | |-- utils +| | | | |-- basic_cstring +| | | | | |-- basic_cstring_fwd.hpp +| | | | | |-- basic_cstring.hpp +| | | | | |-- bcs_char_traits.hpp +| | | | | |-- compare.hpp +| | | | | `-- io.hpp +| | | | |-- iterator +| | | | | |-- input_iterator_facade.hpp +| | | | | `-- token_iterator.hpp +| | | | |-- runtime +| | | | | |-- cla +| | | | | | |-- argv_traverser.hpp +| | | | | | `-- parser.hpp +| | | | | |-- env +| | | | | | `-- fetch.hpp +| | | | | |-- argument_factory.hpp +| | | | | |-- argument.hpp +| | | | | |-- errors.hpp +| | | | | |-- finalize.hpp +| | | | | |-- fwd.hpp +| | | | | |-- modifier.hpp +| | | | | `-- parameter.hpp +| | | | |-- algorithm.hpp +| | | | |-- assign_op.hpp +| | | | |-- class_properties.hpp +| | | | |-- custom_manip.hpp +| | | | |-- foreach.hpp +| | | | |-- is_cstring.hpp +| | | | |-- is_forward_iterable.hpp +| | | | |-- lazy_ostream.hpp +| | | | |-- named_params.hpp +| | | | |-- rtti.hpp +| | | | |-- setcolor.hpp +| | | | |-- string_cast.hpp +| | | | |-- timer.hpp +| | | | |-- wrap_stringstream.hpp +| | | | `-- xml_printer.hpp +| | | |-- debug_config.hpp +| | | |-- debug.hpp +| | | |-- execution_monitor.hpp +| | | |-- framework.hpp +| | | |-- minimal.hpp +| | | |-- progress_monitor.hpp +| | | |-- results_collector.hpp +| | | |-- results_reporter.hpp +| | | |-- test_framework_init_observer.hpp +| | | |-- test_tools.hpp +| | | |-- unit_test_log_formatter.hpp +| | | |-- unit_test_log.hpp +| | | |-- unit_test_monitor.hpp +| | | |-- unit_test_parameters.hpp +| | | `-- unit_test_suite.hpp +| | |-- timer +| | | |-- config.hpp +| | | `-- timer.hpp +| | |-- tuple +| | | |-- detail +| | | | `-- tuple_basic.hpp +| | | `-- tuple.hpp +| | |-- type_index +| | | |-- detail +| | | | |-- compile_time_type_info.hpp +| | | | |-- ctti_register_class.hpp +| | | | `-- stl_register_class.hpp +| | | |-- ctti_type_index.hpp +| | | |-- stl_type_index.hpp +| | | `-- type_index_facade.hpp +| | |-- typeof +| | | |-- dmc +| | | | `-- typeof_impl.hpp +| | | |-- msvc +| | | | `-- typeof_impl.hpp +| | | |-- constant.hpp +| | | |-- decltype.hpp +| | | |-- encode_decode.hpp +| | | |-- encode_decode_params.hpp +| | | |-- integral_template_param.hpp +| | | |-- int_encoding.hpp +| | | |-- message.hpp +| | | |-- modifiers.hpp +| | | |-- native.hpp +| | | |-- pointers_data_members.hpp +| | | |-- register_functions.hpp +| | | |-- register_functions_iterate.hpp +| | | |-- register_fundamental.hpp +| | | |-- register_mem_functions.hpp +| | | |-- template_encoding.hpp +| | | |-- template_template_param.hpp +| | | |-- type_encoding.hpp +| | | |-- typeof.hpp +| | | |-- typeof_impl.hpp +| | | |-- type_template_param.hpp +| | | |-- unsupported.hpp +| | | |-- vector100.hpp +| | | |-- vector150.hpp +| | | |-- vector200.hpp +| | | |-- vector50.hpp +| | | `-- vector.hpp +| | |-- type_traits +| | | |-- detail +| | | | |-- bool_trait_undef.hpp +| | | | |-- common_arithmetic_type.hpp +| | | | |-- common_type_impl.hpp +| | | | |-- composite_member_pointer_type.hpp +| | | | |-- composite_pointer_type.hpp +| | | | |-- config.hpp +| | | | |-- has_binary_operator.hpp +| | | | |-- has_postfix_operator.hpp +| | | | |-- has_prefix_operator.hpp +| | | | |-- is_function_cxx_03.hpp +| | | | |-- is_function_cxx_11.hpp +| | | | |-- is_function_msvc10_fix.hpp +| | | | |-- is_function_ptr_helper.hpp +| | | | |-- is_function_ptr_tester.hpp +| | | | |-- is_likely_lambda.hpp +| | | | |-- is_member_function_pointer_cxx_03.hpp +| | | | |-- is_member_function_pointer_cxx_11.hpp +| | | | |-- is_mem_fun_pointer_impl.hpp +| | | | |-- is_mem_fun_pointer_tester.hpp +| | | | |-- is_rvalue_reference_msvc10_fix.hpp +| | | | |-- mp_defer.hpp +| | | | `-- yes_no_type.hpp +| | | |-- add_const.hpp +| | | |-- add_cv.hpp +| | | |-- add_lvalue_reference.hpp +| | | |-- add_pointer.hpp +| | | |-- add_reference.hpp +| | | |-- add_rvalue_reference.hpp +| | | |-- add_volatile.hpp +| | | |-- aligned_storage.hpp +| | | |-- alignment_of.hpp +| | | |-- common_type.hpp +| | | |-- composite_traits.hpp +| | | |-- conditional.hpp +| | | |-- conversion_traits.hpp +| | | |-- copy_cv.hpp +| | | |-- copy_cv_ref.hpp +| | | |-- copy_reference.hpp +| | | |-- cv_traits.hpp +| | | |-- decay.hpp +| | | |-- declval.hpp +| | | |-- enable_if.hpp +| | | |-- extent.hpp +| | | |-- floating_point_promotion.hpp +| | | |-- function_traits.hpp +| | | |-- has_bit_and_assign.hpp +| | | |-- has_bit_and.hpp +| | | |-- has_bit_or_assign.hpp +| | | |-- has_bit_or.hpp +| | | |-- has_bit_xor_assign.hpp +| | | |-- has_bit_xor.hpp +| | | |-- has_complement.hpp +| | | |-- has_dereference.hpp +| | | |-- has_divides_assign.hpp +| | | |-- has_divides.hpp +| | | |-- has_equal_to.hpp +| | | |-- has_greater_equal.hpp +| | | |-- has_greater.hpp +| | | |-- has_left_shift_assign.hpp +| | | |-- has_left_shift.hpp +| | | |-- has_less_equal.hpp +| | | |-- has_less.hpp +| | | |-- has_logical_and.hpp +| | | |-- has_logical_not.hpp +| | | |-- has_logical_or.hpp +| | | |-- has_minus_assign.hpp +| | | |-- has_minus.hpp +| | | |-- has_modulus_assign.hpp +| | | |-- has_modulus.hpp +| | | |-- has_multiplies_assign.hpp +| | | |-- has_multiplies.hpp +| | | |-- has_negate.hpp +| | | |-- has_new_operator.hpp +| | | |-- has_not_equal_to.hpp +| | | |-- has_nothrow_assign.hpp +| | | |-- has_nothrow_constructor.hpp +| | | |-- has_nothrow_copy.hpp +| | | |-- has_nothrow_destructor.hpp +| | | |-- has_plus_assign.hpp +| | | |-- has_plus.hpp +| | | |-- has_post_decrement.hpp +| | | |-- has_post_increment.hpp +| | | |-- has_pre_decrement.hpp +| | | |-- has_pre_increment.hpp +| | | |-- has_right_shift_assign.hpp +| | | |-- has_right_shift.hpp +| | | |-- has_trivial_assign.hpp +| | | |-- has_trivial_constructor.hpp +| | | |-- has_trivial_copy.hpp +| | | |-- has_trivial_destructor.hpp +| | | |-- has_trivial_move_assign.hpp +| | | |-- has_trivial_move_constructor.hpp +| | | |-- has_unary_minus.hpp +| | | |-- has_unary_plus.hpp +| | | |-- has_virtual_destructor.hpp +| | | |-- integral_constant.hpp +| | | |-- integral_promotion.hpp +| | | |-- intrinsics.hpp +| | | |-- is_abstract.hpp +| | | |-- is_arithmetic.hpp +| | | |-- is_array.hpp +| | | |-- is_assignable.hpp +| | | |-- is_base_and_derived.hpp +| | | |-- is_base_of.hpp +| | | |-- is_bounded_array.hpp +| | | |-- is_class.hpp +| | | |-- is_complete.hpp +| | | |-- is_complex.hpp +| | | |-- is_compound.hpp +| | | |-- is_const.hpp +| | | |-- is_constructible.hpp +| | | |-- is_convertible.hpp +| | | |-- is_copy_assignable.hpp +| | | |-- is_copy_constructible.hpp +| | | |-- is_default_constructible.hpp +| | | |-- is_destructible.hpp +| | | |-- is_empty.hpp +| | | |-- is_enum.hpp +| | | |-- is_final.hpp +| | | |-- is_float.hpp +| | | |-- is_floating_point.hpp +| | | |-- is_function.hpp +| | | |-- is_fundamental.hpp +| | | |-- is_integral.hpp +| | | |-- is_list_constructible.hpp +| | | |-- is_lvalue_reference.hpp +| | | |-- is_member_function_pointer.hpp +| | | |-- is_member_object_pointer.hpp +| | | |-- is_member_pointer.hpp +| | | |-- is_noncopyable.hpp +| | | |-- is_nothrow_move_assignable.hpp +| | | |-- is_nothrow_move_constructible.hpp +| | | |-- is_nothrow_swappable.hpp +| | | |-- is_object.hpp +| | | |-- is_pod.hpp +| | | |-- is_pointer.hpp +| | | |-- is_polymorphic.hpp +| | | |-- is_reference.hpp +| | | |-- is_rvalue_reference.hpp +| | | |-- is_same.hpp +| | | |-- is_scalar.hpp +| | | |-- is_signed.hpp +| | | |-- is_stateless.hpp +| | | |-- is_unbounded_array.hpp +| | | |-- is_union.hpp +| | | |-- is_unsigned.hpp +| | | |-- is_virtual_base_of.hpp +| | | |-- is_void.hpp +| | | |-- is_volatile.hpp +| | | |-- make_signed.hpp +| | | |-- make_unsigned.hpp +| | | |-- make_void.hpp +| | | |-- promote.hpp +| | | |-- rank.hpp +| | | |-- remove_all_extents.hpp +| | | |-- remove_bounds.hpp +| | | |-- remove_const.hpp +| | | |-- remove_cv.hpp +| | | |-- remove_cv_ref.hpp +| | | |-- remove_extent.hpp +| | | |-- remove_pointer.hpp +| | | |-- remove_reference.hpp +| | | |-- remove_volatile.hpp +| | | |-- same_traits.hpp +| | | |-- type_identity.hpp +| | | `-- type_with_alignment.hpp +| | |-- utility +| | | |-- detail +| | | | |-- in_place_factory_prefix.hpp +| | | | |-- in_place_factory_suffix.hpp +| | | | `-- result_of_iterate.hpp +| | | |-- addressof.hpp +| | | |-- base_from_member.hpp +| | | |-- binary.hpp +| | | |-- compare_pointees.hpp +| | | |-- declval.hpp +| | | |-- enable_if.hpp +| | | |-- explicit_operator_bool.hpp +| | | |-- identity_type.hpp +| | | |-- in_place_factory.hpp +| | | |-- result_of.hpp +| | | |-- swap.hpp +| | | |-- typed_in_place_factory.hpp +| | | `-- value_init.hpp +| | |-- winapi +| | | |-- basic_types.hpp +| | | |-- character_code_conversion.hpp +| | | |-- config.hpp +| | | |-- dll.hpp +| | | |-- error_codes.hpp +| | | |-- error_handling.hpp +| | | |-- get_current_process.hpp +| | | |-- get_current_thread.hpp +| | | |-- get_last_error.hpp +| | | |-- get_process_times.hpp +| | | |-- get_thread_times.hpp +| | | |-- local_memory.hpp +| | | |-- time.hpp +| | | `-- timers.hpp +| | |-- aligned_storage.hpp +| | |-- any.hpp +| | |-- array.hpp +| | |-- assert.hpp +| | |-- bind.hpp +| | |-- blank_fwd.hpp +| | |-- blank.hpp +| | |-- call_traits.hpp +| | |-- cast.hpp +| | |-- cerrno.hpp +| | |-- checked_delete.hpp +| | |-- concept_archetype.hpp +| | |-- concept_check.hpp +| | |-- config.hpp +| | |-- cstdint.hpp +| | |-- cstdlib.hpp +| | |-- current_function.hpp +| | |-- filesystem.hpp +| | |-- format.hpp +| | |-- function_equal.hpp +| | |-- function.hpp +| | |-- function_output_iterator.hpp +| | |-- generator_iterator.hpp +| | |-- get_pointer.hpp +| | |-- implicit_cast.hpp +| | |-- indirect_reference.hpp +| | |-- integer_fwd.hpp +| | |-- integer.hpp +| | |-- integer_traits.hpp +| | |-- io_fwd.hpp +| | |-- is_placeholder.hpp +| | |-- iterator_adaptors.hpp +| | |-- iterator.hpp +| | |-- lexical_cast.hpp +| | |-- limits.hpp +| | |-- make_shared.hpp +| | |-- mem_fn.hpp +| | |-- mp11.hpp +| | |-- next_prior.hpp +| | |-- noncopyable.hpp +| | |-- none.hpp +| | |-- none_t.hpp +| | |-- non_type.hpp +| | |-- operators.hpp +| | |-- optional.hpp +| | |-- pointee.hpp +| | |-- polymorphic_cast.hpp +| | |-- predef.h +| | |-- program_options.hpp +| | |-- rational.hpp +| | |-- ref.hpp +| | |-- scoped_array.hpp +| | |-- scoped_ptr.hpp +| | |-- shared_container_iterator.hpp +| | |-- shared_ptr.hpp +| | |-- static_assert.hpp +| | |-- swap.hpp +| | |-- throw_exception.hpp +| | |-- timer.hpp +| | |-- token_functions.hpp +| | |-- token_iterator.hpp +| | |-- tokenizer.hpp +| | |-- type.hpp +| | |-- type_index.hpp +| | |-- type_traits.hpp +| | |-- utility.hpp +| | |-- version.hpp +| | `-- visit_each.hpp +| |-- catch2 +| | `-- catch.hpp +| |-- eigen-eigen-b3f3d4950030 +| | |-- bench +| | | |-- btl +| | | | |-- actions +| | | | | |-- action_aat_product.hh +| | | | | |-- action_ata_product.hh +| | | | | |-- action_atv_product.hh +| | | | | |-- action_axpby.hh +| | | | | |-- action_axpy.hh +| | | | | |-- action_cholesky.hh +| | | | | |-- action_ger.hh +| | | | | |-- action_hessenberg.hh +| | | | | |-- action_lu_decomp.hh +| | | | | |-- action_lu_solve.hh +| | | | | |-- action_matrix_matrix_product_bis.hh +| | | | | |-- action_matrix_matrix_product.hh +| | | | | |-- action_matrix_vector_product.hh +| | | | | |-- action_partial_lu.hh +| | | | | |-- action_rot.hh +| | | | | |-- action_symv.hh +| | | | | |-- action_syr2.hh +| | | | | |-- action_trisolve.hh +| | | | | |-- action_trisolve_matrix.hh +| | | | | |-- action_trmm.hh +| | | | | `-- basic_actions.hh +| | | | |-- cmake +| | | | | |-- FindACML.cmake +| | | | | |-- FindATLAS.cmake +| | | | | |-- FindBLAZE.cmake +| | | | | |-- FindBlitz.cmake +| | | | | |-- FindCBLAS.cmake +| | | | | |-- FindGMM.cmake +| | | | | |-- FindMKL.cmake +| | | | | |-- FindMTL4.cmake +| | | | | |-- FindOPENBLAS.cmake +| | | | | |-- FindPackageHandleStandardArgs.cmake +| | | | | |-- FindTvmet.cmake +| | | | | `-- MacroOptionalAddSubdirectory.cmake +| | | | |-- data +| | | | | |-- action_settings.txt +| | | | | |-- CMakeLists.txt +| | | | | |-- gnuplot_common_settings.hh +| | | | | |-- go_mean +| | | | | |-- mean.cxx +| | | | | |-- mk_gnuplot_script.sh +| | | | | |-- mk_mean_script.sh +| | | | | |-- mk_new_gnuplot.sh +| | | | | |-- perlib_plot_settings.txt +| | | | | |-- regularize.cxx +| | | | | |-- smooth_all.sh +| | | | | `-- smooth.cxx +| | | | |-- generic_bench +| | | | | |-- init +| | | | | | |-- init_function.hh +| | | | | | |-- init_matrix.hh +| | | | | | `-- init_vector.hh +| | | | | |-- static +| | | | | | |-- bench_static.hh +| | | | | | |-- intel_bench_fixed_size.hh +| | | | | | `-- static_size_generator.hh +| | | | | |-- timers +| | | | | | |-- mixed_perf_analyzer.hh +| | | | | | |-- portable_perf_analyzer.hh +| | | | | | |-- portable_perf_analyzer_old.hh +| | | | | | |-- portable_timer.hh +| | | | | | |-- STL_perf_analyzer.hh +| | | | | | |-- STL_timer.hh +| | | | | | |-- x86_perf_analyzer.hh +| | | | | | `-- x86_timer.hh +| | | | | |-- utils +| | | | | | |-- size_lin_log.hh +| | | | | | |-- size_log.hh +| | | | | | |-- utilities.h +| | | | | | `-- xy_file.hh +| | | | | |-- bench.hh +| | | | | |-- bench_parameter.hh +| | | | | `-- btl.hh +| | | | |-- libs +| | | | | |-- BLAS +| | | | | | |-- blas.h +| | | | | | |-- blas_interface.hh +| | | | | | |-- blas_interface_impl.hh +| | | | | | |-- c_interface_base.h +| | | | | | |-- CMakeLists.txt +| | | | | | `-- main.cpp +| | | | | |-- blaze +| | | | | | |-- blaze_interface.hh +| | | | | | |-- CMakeLists.txt +| | | | | | `-- main.cpp +| | | | | |-- blitz +| | | | | | |-- blitz_interface.hh +| | | | | | |-- blitz_LU_solve_interface.hh +| | | | | | |-- btl_blitz.cpp +| | | | | | |-- btl_tiny_blitz.cpp +| | | | | | |-- CMakeLists.txt +| | | | | | `-- tiny_blitz_interface.hh +| | | | | |-- eigen2 +| | | | | | |-- btl_tiny_eigen2.cpp +| | | | | | |-- CMakeLists.txt +| | | | | | |-- eigen2_interface.hh +| | | | | | |-- main_adv.cpp +| | | | | | |-- main_linear.cpp +| | | | | | |-- main_matmat.cpp +| | | | | | `-- main_vecmat.cpp +| | | | | |-- eigen3 +| | | | | | |-- btl_tiny_eigen3.cpp +| | | | | | |-- CMakeLists.txt +| | | | | | |-- eigen3_interface.hh +| | | | | | |-- main_adv.cpp +| | | | | | |-- main_linear.cpp +| | | | | | |-- main_matmat.cpp +| | | | | | `-- main_vecmat.cpp +| | | | | |-- gmm +| | | | | | |-- CMakeLists.txt +| | | | | | |-- gmm_interface.hh +| | | | | | |-- gmm_LU_solve_interface.hh +| | | | | | `-- main.cpp +| | | | | |-- mtl4 +| | | | | | |-- CMakeLists.txt +| | | | | | |-- main.cpp +| | | | | | |-- mtl4_interface.hh +| | | | | | `-- mtl4_LU_solve_interface.hh +| | | | | |-- STL +| | | | | | |-- CMakeLists.txt +| | | | | | |-- main.cpp +| | | | | | `-- STL_interface.hh +| | | | | |-- tensors +| | | | | | |-- CMakeLists.txt +| | | | | | |-- main_linear.cpp +| | | | | | |-- main_matmat.cpp +| | | | | | |-- main_vecmat.cpp +| | | | | | `-- tensor_interface.hh +| | | | | |-- tvmet +| | | | | | |-- CMakeLists.txt +| | | | | | |-- main.cpp +| | | | | | `-- tvmet_interface.hh +| | | | | `-- ublas +| | | | | |-- CMakeLists.txt +| | | | | |-- main.cpp +| | | | | `-- ublas_interface.hh +| | | | |-- CMakeLists.txt +| | | | |-- COPYING +| | | | `-- README +| | | |-- perf_monitoring +| | | | `-- gemm +| | | | |-- changesets.txt +| | | | |-- gemm.cpp +| | | | |-- gemm_settings.txt +| | | | |-- lazy_gemm.cpp +| | | | |-- lazy_gemm_settings.txt +| | | | |-- make_plot.sh +| | | | `-- run.sh +| | | |-- spbench +| | | | |-- CMakeLists.txt +| | | | |-- spbench.dtd +| | | | |-- spbenchsolver.cpp +| | | | |-- spbenchsolver.h +| | | | |-- spbenchstyle.h +| | | | |-- sp_solver.cpp +| | | | `-- test_sparseLU.cpp +| | | |-- tensors +| | | | |-- benchmark.h +| | | | |-- benchmark_main.cc +| | | | |-- contraction_benchmarks_cpu.cc +| | | | |-- README +| | | | |-- tensor_benchmarks_cpu.cc +| | | | |-- tensor_benchmarks_fp16_gpu.cu +| | | | |-- tensor_benchmarks_gpu.cu +| | | | |-- tensor_benchmarks.h +| | | | `-- tensor_benchmarks_sycl.cc +| | | |-- analyze-blocking-sizes.cpp +| | | |-- basicbench.cxxlist +| | | |-- basicbenchmark.cpp +| | | |-- basicbenchmark.h +| | | |-- benchBlasGemm.cpp +| | | |-- benchCholesky.cpp +| | | |-- benchEigenSolver.cpp +| | | |-- benchFFT.cpp +| | | |-- bench_gemm.cpp +| | | |-- benchGeometry.cpp +| | | |-- benchmark-blocking-sizes.cpp +| | | |-- benchmark.cpp +| | | |-- benchmarkSlice.cpp +| | | |-- benchmark_suite +| | | |-- benchmarkX.cpp +| | | |-- benchmarkXcwise.cpp +| | | |-- bench_multi_compilers.sh +| | | |-- bench_norm.cpp +| | | |-- bench_reverse.cpp +| | | |-- BenchSparseUtil.h +| | | |-- bench_sum.cpp +| | | |-- BenchTimer.h +| | | |-- bench_unrolling +| | | |-- BenchUtil.h +| | | |-- benchVecAdd.cpp +| | | |-- check_cache_queries.cpp +| | | |-- dense_solvers.cpp +| | | |-- eig33.cpp +| | | |-- geometry.cpp +| | | |-- product_threshold.cpp +| | | |-- quatmul.cpp +| | | |-- quat_slerp.cpp +| | | |-- README.txt +| | | |-- sparse_cholesky.cpp +| | | |-- sparse_dense_product.cpp +| | | |-- sparse_lu.cpp +| | | |-- sparse_product.cpp +| | | |-- sparse_randomsetter.cpp +| | | |-- sparse_setter.cpp +| | | |-- sparse_transpose.cpp +| | | |-- sparse_trisolver.cpp +| | | |-- spmv.cpp +| | | `-- vdw_new.cpp +| | |-- blas +| | | |-- f2c +| | | | |-- chbmv.c +| | | | |-- chpmv.c +| | | | |-- complexdots.c +| | | | |-- ctbmv.c +| | | | |-- datatypes.h +| | | | |-- d_cnjg.c +| | | | |-- drotm.c +| | | | |-- drotmg.c +| | | | |-- dsbmv.c +| | | | |-- dspmv.c +| | | | |-- dtbmv.c +| | | | |-- lsame.c +| | | | |-- r_cnjg.c +| | | | |-- srotm.c +| | | | |-- srotmg.c +| | | | |-- ssbmv.c +| | | | |-- sspmv.c +| | | | |-- stbmv.c +| | | | |-- zhbmv.c +| | | | |-- zhpmv.c +| | | | `-- ztbmv.c +| | | |-- fortran +| | | | `-- complexdots.f +| | | |-- testing +| | | | |-- cblat1.f +| | | | |-- cblat2.dat +| | | | |-- cblat2.f +| | | | |-- cblat3.dat +| | | | |-- cblat3.f +| | | | |-- CMakeLists.txt +| | | | |-- dblat1.f +| | | | |-- dblat2.dat +| | | | |-- dblat2.f +| | | | |-- dblat3.dat +| | | | |-- dblat3.f +| | | | |-- runblastest.sh +| | | | |-- sblat1.f +| | | | |-- sblat2.dat +| | | | |-- sblat2.f +| | | | |-- sblat3.dat +| | | | |-- sblat3.f +| | | | |-- zblat1.f +| | | | |-- zblat2.dat +| | | | |-- zblat2.f +| | | | |-- zblat3.dat +| | | | `-- zblat3.f +| | | |-- BandTriangularSolver.h +| | | |-- CMakeLists.txt +| | | |-- common.h +| | | |-- complex_double.cpp +| | | |-- complex_single.cpp +| | | |-- double.cpp +| | | |-- GeneralRank1Update.h +| | | |-- level1_cplx_impl.h +| | | |-- level1_impl.h +| | | |-- level1_real_impl.h +| | | |-- level2_cplx_impl.h +| | | |-- level2_impl.h +| | | |-- level2_real_impl.h +| | | |-- level3_impl.h +| | | |-- PackedSelfadjointProduct.h +| | | |-- PackedTriangularMatrixVector.h +| | | |-- PackedTriangularSolverVector.h +| | | |-- Rank2Update.h +| | | |-- README.txt +| | | |-- single.cpp +| | | `-- xerbla.cpp +| | |-- cmake +| | | |-- Eigen3Config.cmake.in +| | | |-- Eigen3ConfigLegacy.cmake.in +| | | |-- EigenConfigureTesting.cmake +| | | |-- EigenDetermineOSVersion.cmake +| | | |-- EigenDetermineVSServicePack.cmake +| | | |-- EigenTesting.cmake +| | | |-- EigenUninstall.cmake +| | | |-- FindAdolc.cmake +| | | |-- FindBLAS.cmake +| | | |-- FindBLASEXT.cmake +| | | |-- FindCholmod.cmake +| | | |-- FindComputeCpp.cmake +| | | |-- FindEigen2.cmake +| | | |-- FindEigen3.cmake +| | | |-- FindFFTW.cmake +| | | |-- FindGLEW.cmake +| | | |-- FindGMP.cmake +| | | |-- FindGoogleHash.cmake +| | | |-- FindGSL.cmake +| | | |-- FindHWLOC.cmake +| | | |-- FindLAPACK.cmake +| | | |-- FindMetis.cmake +| | | |-- FindMPFR.cmake +| | | |-- FindPastix.cmake +| | | |-- FindPTSCOTCH.cmake +| | | |-- FindScotch.cmake +| | | |-- FindSPQR.cmake +| | | |-- FindStandardMathLibrary.cmake +| | | |-- FindSuperLU.cmake +| | | |-- FindUmfpack.cmake +| | | |-- language_support.cmake +| | | |-- RegexUtils.cmake +| | | `-- UseEigen3.cmake +| | |-- debug +| | | |-- gdb +| | | | |-- __init__.py +| | | | `-- printers.py +| | | `-- msvc +| | | |-- eigen_autoexp_part.dat +| | | `-- eigen.natvis +| | |-- demos +| | | |-- mandelbrot +| | | | |-- CMakeLists.txt +| | | | |-- mandelbrot.cpp +| | | | |-- mandelbrot.h +| | | | `-- README +| | | |-- mix_eigen_and_c +| | | | |-- binary_library.cpp +| | | | |-- binary_library.h +| | | | |-- example.c +| | | | `-- README +| | | |-- opengl +| | | | |-- camera.cpp +| | | | |-- camera.h +| | | | |-- CMakeLists.txt +| | | | |-- gpuhelper.cpp +| | | | |-- gpuhelper.h +| | | | |-- icosphere.cpp +| | | | |-- icosphere.h +| | | | |-- quaternion_demo.cpp +| | | | |-- quaternion_demo.h +| | | | |-- README +| | | | |-- trackball.cpp +| | | | `-- trackball.h +| | | `-- CMakeLists.txt +| | |-- doc +| | | |-- examples +| | | | |-- class_Block.cpp +| | | | |-- class_CwiseBinaryOp.cpp +| | | | |-- class_CwiseUnaryOp.cpp +| | | | |-- class_CwiseUnaryOp_ptrfun.cpp +| | | | |-- class_FixedBlock.cpp +| | | | |-- class_FixedVectorBlock.cpp +| | | | |-- class_VectorBlock.cpp +| | | | |-- CMakeLists.txt +| | | | |-- CustomizingEigen_Inheritance.cpp +| | | | |-- Cwise_erfc.cpp +| | | | |-- Cwise_erf.cpp +| | | | |-- Cwise_lgamma.cpp +| | | | |-- DenseBase_middleCols_int.cpp +| | | | |-- DenseBase_middleRows_int.cpp +| | | | |-- DenseBase_template_int_middleCols.cpp +| | | | |-- DenseBase_template_int_middleRows.cpp +| | | | |-- function_taking_eigenbase.cpp +| | | | |-- function_taking_ref.cpp +| | | | |-- make_circulant2.cpp +| | | | |-- make_circulant.cpp +| | | | |-- make_circulant.cpp.entry +| | | | |-- make_circulant.cpp.evaluator +| | | | |-- make_circulant.cpp.expression +| | | | |-- make_circulant.cpp.main +| | | | |-- make_circulant.cpp.preamble +| | | | |-- make_circulant.cpp.traits +| | | | |-- matrixfree_cg.cpp +| | | | |-- nullary_indexing.cpp +| | | | |-- QuickStart_example2_dynamic.cpp +| | | | |-- QuickStart_example2_fixed.cpp +| | | | |-- QuickStart_example.cpp +| | | | |-- TemplateKeyword_flexible.cpp +| | | | |-- TemplateKeyword_simple.cpp +| | | | |-- tut_arithmetic_add_sub.cpp +| | | | |-- tut_arithmetic_dot_cross.cpp +| | | | |-- tut_arithmetic_matrix_mul.cpp +| | | | |-- tut_arithmetic_redux_basic.cpp +| | | | |-- tut_arithmetic_scalar_mul_div.cpp +| | | | |-- tut_matrix_coefficient_accessors.cpp +| | | | |-- tut_matrix_resize.cpp +| | | | |-- tut_matrix_resize_fixed_size.cpp +| | | | |-- Tutorial_ArrayClass_accessors.cpp +| | | | |-- Tutorial_ArrayClass_addition.cpp +| | | | |-- Tutorial_ArrayClass_cwise_other.cpp +| | | | |-- Tutorial_ArrayClass_interop.cpp +| | | | |-- Tutorial_ArrayClass_interop_matrix.cpp +| | | | |-- Tutorial_ArrayClass_mult.cpp +| | | | |-- Tutorial_BlockOperations_block_assignment.cpp +| | | | |-- Tutorial_BlockOperations_colrow.cpp +| | | | |-- Tutorial_BlockOperations_corner.cpp +| | | | |-- Tutorial_BlockOperations_print_block.cpp +| | | | |-- Tutorial_BlockOperations_vector.cpp +| | | | |-- TutorialInplaceLU.cpp +| | | | |-- TutorialLinAlgComputeTwice.cpp +| | | | |-- TutorialLinAlgExComputeSolveError.cpp +| | | | |-- TutorialLinAlgExSolveColPivHouseholderQR.cpp +| | | | |-- TutorialLinAlgExSolveLDLT.cpp +| | | | |-- TutorialLinAlgInverseDeterminant.cpp +| | | | |-- TutorialLinAlgRankRevealing.cpp +| | | | |-- TutorialLinAlgSelfAdjointEigenSolver.cpp +| | | | |-- TutorialLinAlgSetThreshold.cpp +| | | | |-- TutorialLinAlgSVDSolve.cpp +| | | | |-- Tutorial_PartialLU_solve.cpp +| | | | |-- Tutorial_ReductionsVisitorsBroadcasting_broadcast_1nn.cpp +| | | | |-- Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple.cpp +| | | | |-- Tutorial_ReductionsVisitorsBroadcasting_broadcast_simple_rowwise.cpp +| | | | |-- Tutorial_ReductionsVisitorsBroadcasting_colwise.cpp +| | | | |-- Tutorial_ReductionsVisitorsBroadcasting_maxnorm.cpp +| | | | |-- Tutorial_ReductionsVisitorsBroadcasting_reductions_bool.cpp +| | | | |-- Tutorial_ReductionsVisitorsBroadcasting_reductions_norm.cpp +| | | | |-- Tutorial_ReductionsVisitorsBroadcasting_reductions_operatornorm.cpp +| | | | |-- Tutorial_ReductionsVisitorsBroadcasting_rowwise.cpp +| | | | |-- Tutorial_ReductionsVisitorsBroadcasting_visitors.cpp +| | | | |-- Tutorial_simple_example_dynamic_size.cpp +| | | | `-- Tutorial_simple_example_fixed_size.cpp +| | | |-- snippets +| | | | |-- AngleAxis_mimic_euler.cpp +| | | | |-- BiCGSTAB_simple.cpp +| | | | |-- BiCGSTAB_step_by_step.cpp +| | | | |-- class_FullPivLU.cpp +| | | | |-- CMakeLists.txt +| | | | |-- ColPivHouseholderQR_solve.cpp +| | | | |-- compile_snippet.cpp.in +| | | | |-- ComplexEigenSolver_compute.cpp +| | | | |-- ComplexEigenSolver_eigenvalues.cpp +| | | | |-- ComplexEigenSolver_eigenvectors.cpp +| | | | |-- ComplexSchur_compute.cpp +| | | | |-- ComplexSchur_matrixT.cpp +| | | | |-- ComplexSchur_matrixU.cpp +| | | | |-- Cwise_abs2.cpp +| | | | |-- Cwise_abs.cpp +| | | | |-- Cwise_acos.cpp +| | | | |-- Cwise_arg.cpp +| | | | |-- Cwise_array_power_array.cpp +| | | | |-- Cwise_asin.cpp +| | | | |-- Cwise_atan.cpp +| | | | |-- Cwise_boolean_and.cpp +| | | | |-- Cwise_boolean_not.cpp +| | | | |-- Cwise_boolean_or.cpp +| | | | |-- Cwise_boolean_xor.cpp +| | | | |-- Cwise_ceil.cpp +| | | | |-- Cwise_cos.cpp +| | | | |-- Cwise_cosh.cpp +| | | | |-- Cwise_cube.cpp +| | | | |-- Cwise_equal_equal.cpp +| | | | |-- Cwise_exp.cpp +| | | | |-- Cwise_floor.cpp +| | | | |-- Cwise_greater.cpp +| | | | |-- Cwise_greater_equal.cpp +| | | | |-- Cwise_inverse.cpp +| | | | |-- Cwise_isFinite.cpp +| | | | |-- Cwise_isInf.cpp +| | | | |-- Cwise_isNaN.cpp +| | | | |-- Cwise_less.cpp +| | | | |-- Cwise_less_equal.cpp +| | | | |-- Cwise_log10.cpp +| | | | |-- Cwise_log.cpp +| | | | |-- Cwise_max.cpp +| | | | |-- Cwise_min.cpp +| | | | |-- Cwise_minus.cpp +| | | | |-- Cwise_minus_equal.cpp +| | | | |-- Cwise_not_equal.cpp +| | | | |-- Cwise_plus.cpp +| | | | |-- Cwise_plus_equal.cpp +| | | | |-- Cwise_pow.cpp +| | | | |-- Cwise_product.cpp +| | | | |-- Cwise_quotient.cpp +| | | | |-- Cwise_round.cpp +| | | | |-- Cwise_scalar_power_array.cpp +| | | | |-- Cwise_sign.cpp +| | | | |-- Cwise_sin.cpp +| | | | |-- Cwise_sinh.cpp +| | | | |-- Cwise_slash_equal.cpp +| | | | |-- Cwise_sqrt.cpp +| | | | |-- Cwise_square.cpp +| | | | |-- Cwise_tan.cpp +| | | | |-- Cwise_tanh.cpp +| | | | |-- Cwise_times_equal.cpp +| | | | |-- DenseBase_LinSpaced.cpp +| | | | |-- DenseBase_LinSpacedInt.cpp +| | | | |-- DenseBase_LinSpaced_seq.cpp +| | | | |-- DenseBase_setLinSpaced.cpp +| | | | |-- DirectionWise_hnormalized.cpp +| | | | |-- DirectionWise_replicate.cpp +| | | | |-- DirectionWise_replicate_int.cpp +| | | | |-- EigenSolver_compute.cpp +| | | | |-- EigenSolver_EigenSolver_MatrixType.cpp +| | | | |-- EigenSolver_eigenvalues.cpp +| | | | |-- EigenSolver_eigenvectors.cpp +| | | | |-- EigenSolver_pseudoEigenvectors.cpp +| | | | |-- FullPivHouseholderQR_solve.cpp +| | | | |-- FullPivLU_image.cpp +| | | | |-- FullPivLU_kernel.cpp +| | | | |-- FullPivLU_solve.cpp +| | | | |-- GeneralizedEigenSolver.cpp +| | | | |-- HessenbergDecomposition_compute.cpp +| | | | |-- HessenbergDecomposition_matrixH.cpp +| | | | |-- HessenbergDecomposition_packedMatrix.cpp +| | | | |-- HouseholderQR_householderQ.cpp +| | | | |-- HouseholderQR_solve.cpp +| | | | |-- HouseholderSequence_HouseholderSequence.cpp +| | | | |-- IOFormat.cpp +| | | | |-- Jacobi_makeGivens.cpp +| | | | |-- Jacobi_makeJacobi.cpp +| | | | |-- JacobiSVD_basic.cpp +| | | | |-- LeastSquaresNormalEquations.cpp +| | | | |-- LeastSquaresQR.cpp +| | | | |-- LLT_example.cpp +| | | | |-- LLT_solve.cpp +| | | | |-- Map_general_stride.cpp +| | | | |-- Map_inner_stride.cpp +| | | | |-- Map_outer_stride.cpp +| | | | |-- Map_placement_new.cpp +| | | | |-- Map_simple.cpp +| | | | |-- MatrixBase_adjoint.cpp +| | | | |-- MatrixBase_all.cpp +| | | | |-- MatrixBase_applyOnTheLeft.cpp +| | | | |-- MatrixBase_applyOnTheRight.cpp +| | | | |-- MatrixBase_array_const.cpp +| | | | |-- MatrixBase_array.cpp +| | | | |-- MatrixBase_asDiagonal.cpp +| | | | |-- MatrixBase_block_int_int.cpp +| | | | |-- MatrixBase_block_int_int_int_int.cpp +| | | | |-- MatrixBase_bottomLeftCorner_int_int.cpp +| | | | |-- MatrixBase_bottomRightCorner_int_int.cpp +| | | | |-- MatrixBase_bottomRows_int.cpp +| | | | |-- MatrixBase_cast.cpp +| | | | |-- MatrixBase_col.cpp +| | | | |-- MatrixBase_colwise.cpp +| | | | |-- MatrixBase_computeInverseAndDetWithCheck.cpp +| | | | |-- MatrixBase_computeInverseWithCheck.cpp +| | | | |-- MatrixBase_cwiseAbs2.cpp +| | | | |-- MatrixBase_cwiseAbs.cpp +| | | | |-- MatrixBase_cwiseEqual.cpp +| | | | |-- MatrixBase_cwiseInverse.cpp +| | | | |-- MatrixBase_cwiseMax.cpp +| | | | |-- MatrixBase_cwiseMin.cpp +| | | | |-- MatrixBase_cwiseNotEqual.cpp +| | | | |-- MatrixBase_cwiseProduct.cpp +| | | | |-- MatrixBase_cwiseQuotient.cpp +| | | | |-- MatrixBase_cwiseSign.cpp +| | | | |-- MatrixBase_cwiseSqrt.cpp +| | | | |-- MatrixBase_diagonal.cpp +| | | | |-- MatrixBase_diagonal_int.cpp +| | | | |-- MatrixBase_diagonal_template_int.cpp +| | | | |-- MatrixBase_eigenvalues.cpp +| | | | |-- MatrixBase_end_int.cpp +| | | | |-- MatrixBase_eval.cpp +| | | | |-- MatrixBase_fixedBlock_int_int.cpp +| | | | |-- MatrixBase_hnormalized.cpp +| | | | |-- MatrixBase_homogeneous.cpp +| | | | |-- MatrixBase_identity.cpp +| | | | |-- MatrixBase_identity_int_int.cpp +| | | | |-- MatrixBase_inverse.cpp +| | | | |-- MatrixBase_isDiagonal.cpp +| | | | |-- MatrixBase_isIdentity.cpp +| | | | |-- MatrixBase_isOnes.cpp +| | | | |-- MatrixBase_isOrthogonal.cpp +| | | | |-- MatrixBase_isUnitary.cpp +| | | | |-- MatrixBase_isZero.cpp +| | | | |-- MatrixBase_leftCols_int.cpp +| | | | |-- MatrixBase_noalias.cpp +| | | | |-- MatrixBase_ones.cpp +| | | | |-- MatrixBase_ones_int.cpp +| | | | |-- MatrixBase_ones_int_int.cpp +| | | | |-- MatrixBase_operatorNorm.cpp +| | | | |-- MatrixBase_prod.cpp +| | | | |-- MatrixBase_random.cpp +| | | | |-- MatrixBase_random_int.cpp +| | | | |-- MatrixBase_random_int_int.cpp +| | | | |-- MatrixBase_replicate.cpp +| | | | |-- MatrixBase_replicate_int_int.cpp +| | | | |-- MatrixBase_reverse.cpp +| | | | |-- MatrixBase_rightCols_int.cpp +| | | | |-- MatrixBase_row.cpp +| | | | |-- MatrixBase_rowwise.cpp +| | | | |-- MatrixBase_segment_int_int.cpp +| | | | |-- MatrixBase_select.cpp +| | | | |-- MatrixBase_selfadjointView.cpp +| | | | |-- MatrixBase_set.cpp +| | | | |-- MatrixBase_setIdentity.cpp +| | | | |-- MatrixBase_setOnes.cpp +| | | | |-- MatrixBase_setRandom.cpp +| | | | |-- MatrixBase_setZero.cpp +| | | | |-- MatrixBase_start_int.cpp +| | | | |-- MatrixBase_template_int_bottomRows.cpp +| | | | |-- MatrixBase_template_int_end.cpp +| | | | |-- MatrixBase_template_int_int_block_int_int_int_int.cpp +| | | | |-- MatrixBase_template_int_int_bottomLeftCorner.cpp +| | | | |-- MatrixBase_template_int_int_bottomLeftCorner_int_int.cpp +| | | | |-- MatrixBase_template_int_int_bottomRightCorner.cpp +| | | | |-- MatrixBase_template_int_int_bottomRightCorner_int_int.cpp +| | | | |-- MatrixBase_template_int_int_topLeftCorner.cpp +| | | | |-- MatrixBase_template_int_int_topLeftCorner_int_int.cpp +| | | | |-- MatrixBase_template_int_int_topRightCorner.cpp +| | | | |-- MatrixBase_template_int_int_topRightCorner_int_int.cpp +| | | | |-- MatrixBase_template_int_leftCols.cpp +| | | | |-- MatrixBase_template_int_rightCols.cpp +| | | | |-- MatrixBase_template_int_segment.cpp +| | | | |-- MatrixBase_template_int_start.cpp +| | | | |-- MatrixBase_template_int_topRows.cpp +| | | | |-- MatrixBase_topLeftCorner_int_int.cpp +| | | | |-- MatrixBase_topRightCorner_int_int.cpp +| | | | |-- MatrixBase_topRows_int.cpp +| | | | |-- MatrixBase_transpose.cpp +| | | | |-- MatrixBase_triangularView.cpp +| | | | |-- MatrixBase_zero.cpp +| | | | |-- MatrixBase_zero_int.cpp +| | | | |-- MatrixBase_zero_int_int.cpp +| | | | |-- Matrix_Map_stride.cpp +| | | | |-- Matrix_resize_int.cpp +| | | | |-- Matrix_resize_int_int.cpp +| | | | |-- Matrix_resize_int_NoChange.cpp +| | | | |-- Matrix_resize_NoChange_int.cpp +| | | | |-- Matrix_setConstant_int.cpp +| | | | |-- Matrix_setConstant_int_int.cpp +| | | | |-- Matrix_setIdentity_int_int.cpp +| | | | |-- Matrix_setOnes_int.cpp +| | | | |-- Matrix_setOnes_int_int.cpp +| | | | |-- Matrix_setRandom_int.cpp +| | | | |-- Matrix_setRandom_int_int.cpp +| | | | |-- Matrix_setZero_int.cpp +| | | | |-- Matrix_setZero_int_int.cpp +| | | | |-- PartialPivLU_solve.cpp +| | | | |-- PartialRedux_count.cpp +| | | | |-- PartialRedux_maxCoeff.cpp +| | | | |-- PartialRedux_minCoeff.cpp +| | | | |-- PartialRedux_norm.cpp +| | | | |-- PartialRedux_prod.cpp +| | | | |-- PartialRedux_squaredNorm.cpp +| | | | |-- PartialRedux_sum.cpp +| | | | |-- RealQZ_compute.cpp +| | | | |-- RealSchur_compute.cpp +| | | | |-- RealSchur_RealSchur_MatrixType.cpp +| | | | |-- SelfAdjointEigenSolver_compute_MatrixType2.cpp +| | | | |-- SelfAdjointEigenSolver_compute_MatrixType.cpp +| | | | |-- SelfAdjointEigenSolver_eigenvalues.cpp +| | | | |-- SelfAdjointEigenSolver_eigenvectors.cpp +| | | | |-- SelfAdjointEigenSolver_operatorInverseSqrt.cpp +| | | | |-- SelfAdjointEigenSolver_operatorSqrt.cpp +| | | | |-- SelfAdjointEigenSolver_SelfAdjointEigenSolver.cpp +| | | | |-- SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.cpp +| | | | |-- SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.cpp +| | | | |-- SelfAdjointView_eigenvalues.cpp +| | | | |-- SelfAdjointView_operatorNorm.cpp +| | | | |-- SparseMatrix_coeffs.cpp +| | | | |-- TopicAliasing_block_correct.cpp +| | | | |-- TopicAliasing_block.cpp +| | | | |-- TopicAliasing_cwise.cpp +| | | | |-- TopicAliasing_mult1.cpp +| | | | |-- TopicAliasing_mult2.cpp +| | | | |-- TopicAliasing_mult3.cpp +| | | | |-- TopicAliasing_mult4.cpp +| | | | |-- TopicAliasing_mult5.cpp +| | | | |-- TopicStorageOrders_example.cpp +| | | | |-- Triangular_solve.cpp +| | | | |-- Tridiagonalization_compute.cpp +| | | | |-- Tridiagonalization_decomposeInPlace.cpp +| | | | |-- Tridiagonalization_diagonal.cpp +| | | | |-- Tridiagonalization_householderCoefficients.cpp +| | | | |-- Tridiagonalization_packedMatrix.cpp +| | | | |-- Tridiagonalization_Tridiagonalization_MatrixType.cpp +| | | | |-- tut_arithmetic_redux_minmax.cpp +| | | | |-- tut_arithmetic_transpose_aliasing.cpp +| | | | |-- tut_arithmetic_transpose_conjugate.cpp +| | | | |-- tut_arithmetic_transpose_inplace.cpp +| | | | |-- tut_matrix_assignment_resizing.cpp +| | | | |-- Tutorial_AdvancedInitialization_Block.cpp +| | | | |-- Tutorial_AdvancedInitialization_CommaTemporary.cpp +| | | | |-- Tutorial_AdvancedInitialization_Join.cpp +| | | | |-- Tutorial_AdvancedInitialization_LinSpaced.cpp +| | | | |-- Tutorial_AdvancedInitialization_ThreeWays.cpp +| | | | |-- Tutorial_AdvancedInitialization_Zero.cpp +| | | | |-- Tutorial_commainit_01b.cpp +| | | | |-- Tutorial_commainit_01.cpp +| | | | |-- Tutorial_commainit_02.cpp +| | | | |-- Tutorial_Map_rowmajor.cpp +| | | | |-- Tutorial_Map_using.cpp +| | | | |-- Tutorial_ReshapeMat2Mat.cpp +| | | | |-- Tutorial_ReshapeMat2Vec.cpp +| | | | |-- Tutorial_SlicingCol.cpp +| | | | |-- Tutorial_SlicingVec.cpp +| | | | |-- Tutorial_solve_matrix_inverse.cpp +| | | | |-- Tutorial_solve_multiple_rhs.cpp +| | | | |-- Tutorial_solve_reuse_decomposition.cpp +| | | | |-- Tutorial_solve_singular.cpp +| | | | |-- Tutorial_solve_triangular.cpp +| | | | |-- Tutorial_solve_triangular_inplace.cpp +| | | | |-- VectorwiseOp_homogeneous.cpp +| | | | `-- Vectorwise_reverse.cpp +| | | |-- special_examples +| | | | |-- CMakeLists.txt +| | | | |-- random_cpp11.cpp +| | | | |-- Tutorial_sparse_example.cpp +| | | | `-- Tutorial_sparse_example_details.cpp +| | | |-- A05_PortingFrom2To3.dox +| | | |-- AsciiQuickReference.txt +| | | |-- B01_Experimental.dox +| | | |-- ClassHierarchy.dox +| | | |-- CMakeLists.txt +| | | |-- CoeffwiseMathFunctionsTable.dox +| | | |-- CustomizingEigen_CustomScalar.dox +| | | |-- CustomizingEigen_InheritingMatrix.dox +| | | |-- CustomizingEigen_NullaryExpr.dox +| | | |-- CustomizingEigen_Plugins.dox +| | | |-- DenseDecompositionBenchmark.dox +| | | |-- Doxyfile.in +| | | |-- eigendoxy.css +| | | |-- eigendoxy_footer.html.in +| | | |-- eigendoxy_header.html.in +| | | |-- eigendoxy_layout.xml.in +| | | |-- eigendoxy_tabs.css +| | | |-- eigen_navtree_hacks.js +| | | |-- Eigen_Silly_Professor_64x64.png +| | | |-- FixedSizeVectorizable.dox +| | | |-- ftv2node.png +| | | |-- ftv2pnode.png +| | | |-- FunctionsTakingEigenTypes.dox +| | | |-- HiPerformance.dox +| | | |-- InplaceDecomposition.dox +| | | |-- InsideEigenExample.dox +| | | |-- LeastSquares.dox +| | | |-- Manual.dox +| | | |-- MatrixfreeSolverExample.dox +| | | |-- NewExpressionType.dox +| | | |-- Overview.dox +| | | |-- PassingByValue.dox +| | | |-- Pitfalls.dox +| | | |-- PreprocessorDirectives.dox +| | | |-- QuickReference.dox +| | | |-- QuickStartGuide.dox +| | | |-- SparseLinearSystems.dox +| | | |-- SparseQuickReference.dox +| | | |-- StlContainers.dox +| | | |-- StorageOrders.dox +| | | |-- StructHavingEigenMembers.dox +| | | |-- TemplateKeyword.dox +| | | |-- TopicAliasing.dox +| | | |-- TopicAssertions.dox +| | | |-- TopicCMakeGuide.dox +| | | |-- TopicEigenExpressionTemplates.dox +| | | |-- TopicLazyEvaluation.dox +| | | |-- TopicLinearAlgebraDecompositions.dox +| | | |-- TopicMultithreading.dox +| | | |-- TopicResizing.dox +| | | |-- TopicScalarTypes.dox +| | | |-- TopicVectorization.dox +| | | |-- TutorialAdvancedInitialization.dox +| | | |-- TutorialArrayClass.dox +| | | |-- TutorialBlockOperations.dox +| | | |-- tutorial.cpp +| | | |-- TutorialGeometry.dox +| | | |-- TutorialLinearAlgebra.dox +| | | |-- TutorialMapClass.dox +| | | |-- TutorialMatrixArithmetic.dox +| | | |-- TutorialMatrixClass.dox +| | | |-- TutorialReductionsVisitorsBroadcasting.dox +| | | |-- TutorialReshapeSlicing.dox +| | | |-- TutorialSparse.dox +| | | |-- TutorialSparse_example_details.dox +| | | |-- UnalignedArrayAssert.dox +| | | |-- UsingBlasLapackBackends.dox +| | | |-- UsingIntelMKL.dox +| | | |-- UsingNVCC.dox +| | | `-- WrongStackAlignment.dox +| | |-- Eigen +| | | |-- src +| | | | |-- Cholesky +| | | | | |-- LDLT.h +| | | | | |-- LLT.h +| | | | | `-- LLT_LAPACKE.h +| | | | |-- CholmodSupport +| | | | | `-- CholmodSupport.h +| | | | |-- Core +| | | | | |-- arch +| | | | | | |-- AltiVec +| | | | | | | |-- Complex.h +| | | | | | | |-- MathFunctions.h +| | | | | | | `-- PacketMath.h +| | | | | | |-- AVX +| | | | | | | |-- Complex.h +| | | | | | | |-- MathFunctions.h +| | | | | | | |-- PacketMath.h +| | | | | | | `-- TypeCasting.h +| | | | | | |-- AVX512 +| | | | | | | |-- MathFunctions.h +| | | | | | | `-- PacketMath.h +| | | | | | |-- CUDA +| | | | | | | |-- Complex.h +| | | | | | | |-- Half.h +| | | | | | | |-- MathFunctions.h +| | | | | | | |-- PacketMath.h +| | | | | | | |-- PacketMathHalf.h +| | | | | | | `-- TypeCasting.h +| | | | | | |-- Default +| | | | | | | |-- ConjHelper.h +| | | | | | | `-- Settings.h +| | | | | | |-- NEON +| | | | | | | |-- Complex.h +| | | | | | | |-- MathFunctions.h +| | | | | | | `-- PacketMath.h +| | | | | | |-- SSE +| | | | | | | |-- Complex.h +| | | | | | | |-- MathFunctions.h +| | | | | | | |-- PacketMath.h +| | | | | | | `-- TypeCasting.h +| | | | | | `-- ZVector +| | | | | | |-- Complex.h +| | | | | | |-- MathFunctions.h +| | | | | | `-- PacketMath.h +| | | | | |-- functors +| | | | | | |-- AssignmentFunctors.h +| | | | | | |-- BinaryFunctors.h +| | | | | | |-- NullaryFunctors.h +| | | | | | |-- StlFunctors.h +| | | | | | |-- TernaryFunctors.h +| | | | | | `-- UnaryFunctors.h +| | | | | |-- products +| | | | | | |-- GeneralBlockPanelKernel.h +| | | | | | |-- GeneralMatrixMatrix_BLAS.h +| | | | | | |-- GeneralMatrixMatrix.h +| | | | | | |-- GeneralMatrixMatrixTriangular_BLAS.h +| | | | | | |-- GeneralMatrixMatrixTriangular.h +| | | | | | |-- GeneralMatrixVector_BLAS.h +| | | | | | |-- GeneralMatrixVector.h +| | | | | | |-- Parallelizer.h +| | | | | | |-- SelfadjointMatrixMatrix_BLAS.h +| | | | | | |-- SelfadjointMatrixMatrix.h +| | | | | | |-- SelfadjointMatrixVector_BLAS.h +| | | | | | |-- SelfadjointMatrixVector.h +| | | | | | |-- SelfadjointProduct.h +| | | | | | |-- SelfadjointRank2Update.h +| | | | | | |-- TriangularMatrixMatrix_BLAS.h +| | | | | | |-- TriangularMatrixMatrix.h +| | | | | | |-- TriangularMatrixVector_BLAS.h +| | | | | | |-- TriangularMatrixVector.h +| | | | | | |-- TriangularSolverMatrix_BLAS.h +| | | | | | |-- TriangularSolverMatrix.h +| | | | | | `-- TriangularSolverVector.h +| | | | | |-- util +| | | | | | |-- BlasUtil.h +| | | | | | |-- Constants.h +| | | | | | |-- DisableStupidWarnings.h +| | | | | | |-- ForwardDeclarations.h +| | | | | | |-- Macros.h +| | | | | | |-- Memory.h +| | | | | | |-- Meta.h +| | | | | | |-- MKL_support.h +| | | | | | |-- NonMPL2.h +| | | | | | |-- ReenableStupidWarnings.h +| | | | | | |-- StaticAssert.h +| | | | | | `-- XprHelper.h +| | | | | |-- ArrayBase.h +| | | | | |-- Array.h +| | | | | |-- ArrayWrapper.h +| | | | | |-- AssignEvaluator.h +| | | | | |-- Assign.h +| | | | | |-- Assign_MKL.h +| | | | | |-- BandMatrix.h +| | | | | |-- Block.h +| | | | | |-- BooleanRedux.h +| | | | | |-- CommaInitializer.h +| | | | | |-- ConditionEstimator.h +| | | | | |-- CoreEvaluators.h +| | | | | |-- CoreIterators.h +| | | | | |-- CwiseBinaryOp.h +| | | | | |-- CwiseNullaryOp.h +| | | | | |-- CwiseTernaryOp.h +| | | | | |-- CwiseUnaryOp.h +| | | | | |-- CwiseUnaryView.h +| | | | | |-- DenseBase.h +| | | | | |-- DenseCoeffsBase.h +| | | | | |-- DenseStorage.h +| | | | | |-- Diagonal.h +| | | | | |-- DiagonalMatrix.h +| | | | | |-- DiagonalProduct.h +| | | | | |-- Dot.h +| | | | | |-- EigenBase.h +| | | | | |-- ForceAlignedAccess.h +| | | | | |-- Fuzzy.h +| | | | | |-- GeneralProduct.h +| | | | | |-- GenericPacketMath.h +| | | | | |-- GlobalFunctions.h +| | | | | |-- Inverse.h +| | | | | |-- IO.h +| | | | | |-- MapBase.h +| | | | | |-- Map.h +| | | | | |-- MathFunctions.h +| | | | | |-- MathFunctionsImpl.h +| | | | | |-- MatrixBase.h +| | | | | |-- Matrix.h +| | | | | |-- NestByValue.h +| | | | | |-- NoAlias.h +| | | | | |-- NumTraits.h +| | | | | |-- PermutationMatrix.h +| | | | | |-- PlainObjectBase.h +| | | | | |-- ProductEvaluators.h +| | | | | |-- Product.h +| | | | | |-- Random.h +| | | | | |-- Redux.h +| | | | | |-- Ref.h +| | | | | |-- Replicate.h +| | | | | |-- ReturnByValue.h +| | | | | |-- Reverse.h +| | | | | |-- Select.h +| | | | | |-- SelfAdjointView.h +| | | | | |-- SelfCwiseBinaryOp.h +| | | | | |-- Solve.h +| | | | | |-- SolverBase.h +| | | | | |-- SolveTriangular.h +| | | | | |-- StableNorm.h +| | | | | |-- Stride.h +| | | | | |-- Swap.h +| | | | | |-- Transpose.h +| | | | | |-- Transpositions.h +| | | | | |-- TriangularMatrix.h +| | | | | |-- VectorBlock.h +| | | | | |-- VectorwiseOp.h +| | | | | `-- Visitor.h +| | | | |-- Eigenvalues +| | | | | |-- ComplexEigenSolver.h +| | | | | |-- ComplexSchur.h +| | | | | |-- ComplexSchur_LAPACKE.h +| | | | | |-- EigenSolver.h +| | | | | |-- GeneralizedEigenSolver.h +| | | | | |-- GeneralizedSelfAdjointEigenSolver.h +| | | | | |-- HessenbergDecomposition.h +| | | | | |-- MatrixBaseEigenvalues.h +| | | | | |-- RealQZ.h +| | | | | |-- RealSchur.h +| | | | | |-- RealSchur_LAPACKE.h +| | | | | |-- SelfAdjointEigenSolver.h +| | | | | |-- SelfAdjointEigenSolver_LAPACKE.h +| | | | | `-- Tridiagonalization.h +| | | | |-- Geometry +| | | | | |-- arch +| | | | | | `-- Geometry_SSE.h +| | | | | |-- AlignedBox.h +| | | | | |-- AngleAxis.h +| | | | | |-- EulerAngles.h +| | | | | |-- Homogeneous.h +| | | | | |-- Hyperplane.h +| | | | | |-- OrthoMethods.h +| | | | | |-- ParametrizedLine.h +| | | | | |-- Quaternion.h +| | | | | |-- Rotation2D.h +| | | | | |-- RotationBase.h +| | | | | |-- Scaling.h +| | | | | |-- Transform.h +| | | | | |-- Translation.h +| | | | | `-- Umeyama.h +| | | | |-- Householder +| | | | | |-- BlockHouseholder.h +| | | | | |-- Householder.h +| | | | | `-- HouseholderSequence.h +| | | | |-- IterativeLinearSolvers +| | | | | |-- BasicPreconditioners.h +| | | | | |-- BiCGSTAB.h +| | | | | |-- ConjugateGradient.h +| | | | | |-- IncompleteCholesky.h +| | | | | |-- IncompleteLUT.h +| | | | | |-- IterativeSolverBase.h +| | | | | |-- LeastSquareConjugateGradient.h +| | | | | `-- SolveWithGuess.h +| | | | |-- Jacobi +| | | | | `-- Jacobi.h +| | | | |-- LU +| | | | | |-- arch +| | | | | | `-- Inverse_SSE.h +| | | | | |-- Determinant.h +| | | | | |-- FullPivLU.h +| | | | | |-- InverseImpl.h +| | | | | |-- PartialPivLU.h +| | | | | `-- PartialPivLU_LAPACKE.h +| | | | |-- MetisSupport +| | | | | `-- MetisSupport.h +| | | | |-- misc +| | | | | |-- blas.h +| | | | | |-- Image.h +| | | | | |-- Kernel.h +| | | | | |-- lapacke.h +| | | | | |-- lapacke_mangling.h +| | | | | |-- lapack.h +| | | | | `-- RealSvd2x2.h +| | | | |-- OrderingMethods +| | | | | |-- Amd.h +| | | | | |-- Eigen_Colamd.h +| | | | | `-- Ordering.h +| | | | |-- PardisoSupport +| | | | | `-- PardisoSupport.h +| | | | |-- PaStiXSupport +| | | | | `-- PaStiXSupport.h +| | | | |-- plugins +| | | | | |-- ArrayCwiseBinaryOps.h +| | | | | |-- ArrayCwiseUnaryOps.h +| | | | | |-- BlockMethods.h +| | | | | |-- CommonCwiseBinaryOps.h +| | | | | |-- CommonCwiseUnaryOps.h +| | | | | |-- MatrixCwiseBinaryOps.h +| | | | | `-- MatrixCwiseUnaryOps.h +| | | | |-- QR +| | | | | |-- ColPivHouseholderQR.h +| | | | | |-- ColPivHouseholderQR_LAPACKE.h +| | | | | |-- CompleteOrthogonalDecomposition.h +| | | | | |-- FullPivHouseholderQR.h +| | | | | |-- HouseholderQR.h +| | | | | `-- HouseholderQR_LAPACKE.h +| | | | |-- SparseCholesky +| | | | | |-- SimplicialCholesky.h +| | | | | `-- SimplicialCholesky_impl.h +| | | | |-- SparseCore +| | | | | |-- AmbiVector.h +| | | | | |-- CompressedStorage.h +| | | | | |-- ConservativeSparseSparseProduct.h +| | | | | |-- MappedSparseMatrix.h +| | | | | |-- SparseAssign.h +| | | | | |-- SparseBlock.h +| | | | | |-- SparseColEtree.h +| | | | | |-- SparseCompressedBase.h +| | | | | |-- SparseCwiseBinaryOp.h +| | | | | |-- SparseCwiseUnaryOp.h +| | | | | |-- SparseDenseProduct.h +| | | | | |-- SparseDiagonalProduct.h +| | | | | |-- SparseDot.h +| | | | | |-- SparseFuzzy.h +| | | | | |-- SparseMap.h +| | | | | |-- SparseMatrixBase.h +| | | | | |-- SparseMatrix.h +| | | | | |-- SparsePermutation.h +| | | | | |-- SparseProduct.h +| | | | | |-- SparseRedux.h +| | | | | |-- SparseRef.h +| | | | | |-- SparseSelfAdjointView.h +| | | | | |-- SparseSolverBase.h +| | | | | |-- SparseSparseProductWithPruning.h +| | | | | |-- SparseTranspose.h +| | | | | |-- SparseTriangularView.h +| | | | | |-- SparseUtil.h +| | | | | |-- SparseVector.h +| | | | | |-- SparseView.h +| | | | | `-- TriangularSolver.h +| | | | |-- SparseLU +| | | | | |-- SparseLU_column_bmod.h +| | | | | |-- SparseLU_column_dfs.h +| | | | | |-- SparseLU_copy_to_ucol.h +| | | | | |-- SparseLU_gemm_kernel.h +| | | | | |-- SparseLU.h +| | | | | |-- SparseLU_heap_relax_snode.h +| | | | | |-- SparseLUImpl.h +| | | | | |-- SparseLU_kernel_bmod.h +| | | | | |-- SparseLU_Memory.h +| | | | | |-- SparseLU_panel_bmod.h +| | | | | |-- SparseLU_panel_dfs.h +| | | | | |-- SparseLU_pivotL.h +| | | | | |-- SparseLU_pruneL.h +| | | | | |-- SparseLU_relax_snode.h +| | | | | |-- SparseLU_Structs.h +| | | | | |-- SparseLU_SupernodalMatrix.h +| | | | | `-- SparseLU_Utils.h +| | | | |-- SparseQR +| | | | | `-- SparseQR.h +| | | | |-- SPQRSupport +| | | | | `-- SuiteSparseQRSupport.h +| | | | |-- StlSupport +| | | | | |-- details.h +| | | | | |-- StdDeque.h +| | | | | |-- StdList.h +| | | | | `-- StdVector.h +| | | | |-- SuperLUSupport +| | | | | `-- SuperLUSupport.h +| | | | |-- SVD +| | | | | |-- BDCSVD.h +| | | | | |-- JacobiSVD.h +| | | | | |-- JacobiSVD_LAPACKE.h +| | | | | |-- SVDBase.h +| | | | | `-- UpperBidiagonalization.h +| | | | `-- UmfPackSupport +| | | | `-- UmfPackSupport.h +| | | |-- Cholesky +| | | |-- CholmodSupport +| | | |-- CMakeLists.txt +| | | |-- Core +| | | |-- Dense +| | | |-- Eigen +| | | |-- Eigenvalues +| | | |-- Geometry +| | | |-- Householder +| | | |-- IterativeLinearSolvers +| | | |-- Jacobi +| | | |-- LU +| | | |-- MetisSupport +| | | |-- OrderingMethods +| | | |-- PardisoSupport +| | | |-- PaStiXSupport +| | | |-- QR +| | | |-- QtAlignedMalloc +| | | |-- Sparse +| | | |-- SparseCholesky +| | | |-- SparseCore +| | | |-- SparseLU +| | | |-- SparseQR +| | | |-- SPQRSupport +| | | |-- StdDeque +| | | |-- StdList +| | | |-- StdVector +| | | |-- SuperLUSupport +| | | |-- SVD +| | | `-- UmfPackSupport +| | |-- failtest +| | | |-- bdcsvd_int.cpp +| | | |-- block_nonconst_ctor_on_const_xpr_0.cpp +| | | |-- block_nonconst_ctor_on_const_xpr_1.cpp +| | | |-- block_nonconst_ctor_on_const_xpr_2.cpp +| | | |-- block_on_const_type_actually_const_0.cpp +| | | |-- block_on_const_type_actually_const_1.cpp +| | | |-- CMakeLists.txt +| | | |-- colpivqr_int.cpp +| | | |-- const_qualified_block_method_retval_0.cpp +| | | |-- const_qualified_block_method_retval_1.cpp +| | | |-- const_qualified_diagonal_method_retval.cpp +| | | |-- const_qualified_transpose_method_retval.cpp +| | | |-- cwiseunaryview_nonconst_ctor_on_const_xpr.cpp +| | | |-- cwiseunaryview_on_const_type_actually_const.cpp +| | | |-- diagonal_nonconst_ctor_on_const_xpr.cpp +| | | |-- diagonal_on_const_type_actually_const.cpp +| | | |-- eigensolver_cplx.cpp +| | | |-- eigensolver_int.cpp +| | | |-- failtest_sanity_check.cpp +| | | |-- fullpivlu_int.cpp +| | | |-- fullpivqr_int.cpp +| | | |-- jacobisvd_int.cpp +| | | |-- ldlt_int.cpp +| | | |-- llt_int.cpp +| | | |-- map_nonconst_ctor_on_const_ptr_0.cpp +| | | |-- map_nonconst_ctor_on_const_ptr_1.cpp +| | | |-- map_nonconst_ctor_on_const_ptr_2.cpp +| | | |-- map_nonconst_ctor_on_const_ptr_3.cpp +| | | |-- map_nonconst_ctor_on_const_ptr_4.cpp +| | | |-- map_on_const_type_actually_const_0.cpp +| | | |-- map_on_const_type_actually_const_1.cpp +| | | |-- partialpivlu_int.cpp +| | | |-- qr_int.cpp +| | | |-- ref_1.cpp +| | | |-- ref_2.cpp +| | | |-- ref_3.cpp +| | | |-- ref_4.cpp +| | | |-- ref_5.cpp +| | | |-- selfadjointview_nonconst_ctor_on_const_xpr.cpp +| | | |-- selfadjointview_on_const_type_actually_const.cpp +| | | |-- sparse_ref_1.cpp +| | | |-- sparse_ref_2.cpp +| | | |-- sparse_ref_3.cpp +| | | |-- sparse_ref_4.cpp +| | | |-- sparse_ref_5.cpp +| | | |-- sparse_storage_mismatch.cpp +| | | |-- swap_1.cpp +| | | |-- swap_2.cpp +| | | |-- ternary_1.cpp +| | | |-- ternary_2.cpp +| | | |-- transpose_nonconst_ctor_on_const_xpr.cpp +| | | |-- transpose_on_const_type_actually_const.cpp +| | | |-- triangularview_nonconst_ctor_on_const_xpr.cpp +| | | `-- triangularview_on_const_type_actually_const.cpp +| | |-- lapack +| | | |-- cholesky.cpp +| | | |-- clacgv.f +| | | |-- cladiv.f +| | | |-- clarfb.f +| | | |-- clarf.f +| | | |-- clarfg.f +| | | |-- clarft.f +| | | |-- CMakeLists.txt +| | | |-- complex_double.cpp +| | | |-- complex_single.cpp +| | | |-- dladiv.f +| | | |-- dlamch.f +| | | |-- dlapy2.f +| | | |-- dlapy3.f +| | | |-- dlarfb.f +| | | |-- dlarf.f +| | | |-- dlarfg.f +| | | |-- dlarft.f +| | | |-- double.cpp +| | | |-- dsecnd_NONE.f +| | | |-- eigenvalues.cpp +| | | |-- ilaclc.f +| | | |-- ilaclr.f +| | | |-- iladlc.f +| | | |-- iladlr.f +| | | |-- ilaslc.f +| | | |-- ilaslr.f +| | | |-- ilazlc.f +| | | |-- ilazlr.f +| | | |-- lapack_common.h +| | | |-- lu.cpp +| | | |-- second_NONE.f +| | | |-- single.cpp +| | | |-- sladiv.f +| | | |-- slamch.f +| | | |-- slapy2.f +| | | |-- slapy3.f +| | | |-- slarfb.f +| | | |-- slarf.f +| | | |-- slarfg.f +| | | |-- slarft.f +| | | |-- svd.cpp +| | | |-- zlacgv.f +| | | |-- zladiv.f +| | | |-- zlarfb.f +| | | |-- zlarf.f +| | | |-- zlarfg.f +| | | `-- zlarft.f +| | |-- scripts +| | | |-- buildtests.in +| | | |-- cdashtesting.cmake.in +| | | |-- check.in +| | | |-- CMakeLists.txt +| | | |-- debug.in +| | | |-- eigen_gen_credits.cpp +| | | |-- eigen_gen_docs +| | | |-- release.in +| | | `-- relicense.py +| | |-- test +| | | |-- adjoint.cpp +| | | |-- array.cpp +| | | |-- array_for_matrix.cpp +| | | |-- array_of_string.cpp +| | | |-- array_replicate.cpp +| | | |-- array_reverse.cpp +| | | |-- bandmatrix.cpp +| | | |-- basicstuff.cpp +| | | |-- bdcsvd.cpp +| | | |-- bicgstab.cpp +| | | |-- block.cpp +| | | |-- boostmultiprec.cpp +| | | |-- bug1213.cpp +| | | |-- bug1213.h +| | | |-- bug1213_main.cpp +| | | |-- cholesky.cpp +| | | |-- cholmod_support.cpp +| | | |-- CMakeLists.txt +| | | |-- commainitializer.cpp +| | | |-- conjugate_gradient.cpp +| | | |-- conservative_resize.cpp +| | | |-- constructor.cpp +| | | |-- corners.cpp +| | | |-- ctorleak.cpp +| | | |-- cuda_basic.cu +| | | |-- cuda_common.h +| | | |-- denseLM.cpp +| | | |-- dense_storage.cpp +| | | |-- determinant.cpp +| | | |-- diagonal.cpp +| | | |-- diagonalmatrices.cpp +| | | |-- dontalign.cpp +| | | |-- dynalloc.cpp +| | | |-- eigen2support.cpp +| | | |-- eigensolver_complex.cpp +| | | |-- eigensolver_generalized_real.cpp +| | | |-- eigensolver_generic.cpp +| | | |-- eigensolver_selfadjoint.cpp +| | | |-- evaluator_common.h +| | | |-- evaluators.cpp +| | | |-- exceptions.cpp +| | | |-- fastmath.cpp +| | | |-- first_aligned.cpp +| | | |-- geo_alignedbox.cpp +| | | |-- geo_eulerangles.cpp +| | | |-- geo_homogeneous.cpp +| | | |-- geo_hyperplane.cpp +| | | |-- geo_orthomethods.cpp +| | | |-- geo_parametrizedline.cpp +| | | |-- geo_quaternion.cpp +| | | |-- geo_transformations.cpp +| | | |-- half_float.cpp +| | | |-- hessenberg.cpp +| | | |-- householder.cpp +| | | |-- incomplete_cholesky.cpp +| | | |-- inplace_decomposition.cpp +| | | |-- integer_types.cpp +| | | |-- inverse.cpp +| | | |-- is_same_dense.cpp +| | | |-- jacobi.cpp +| | | |-- jacobisvd.cpp +| | | |-- linearstructure.cpp +| | | |-- lscg.cpp +| | | |-- lu.cpp +| | | |-- main.h +| | | |-- mapped_matrix.cpp +| | | |-- mapstaticmethods.cpp +| | | |-- mapstride.cpp +| | | |-- meta.cpp +| | | |-- metis_support.cpp +| | | |-- miscmatrices.cpp +| | | |-- mixingtypes.cpp +| | | |-- mpl2only.cpp +| | | |-- nesting_ops.cpp +| | | |-- nomalloc.cpp +| | | |-- nullary.cpp +| | | |-- numext.cpp +| | | |-- packetmath.cpp +| | | |-- pardiso_support.cpp +| | | |-- pastix_support.cpp +| | | |-- permutationmatrices.cpp +| | | |-- prec_inverse_4x4.cpp +| | | |-- product_extra.cpp +| | | |-- product.h +| | | |-- product_large.cpp +| | | |-- product_mmtr.cpp +| | | |-- product_notemporary.cpp +| | | |-- product_selfadjoint.cpp +| | | |-- product_small.cpp +| | | |-- product_symm.cpp +| | | |-- product_syrk.cpp +| | | |-- product_trmm.cpp +| | | |-- product_trmv.cpp +| | | |-- product_trsolve.cpp +| | | |-- qr_colpivoting.cpp +| | | |-- qr.cpp +| | | |-- qr_fullpivoting.cpp +| | | |-- qtvector.cpp +| | | |-- rand.cpp +| | | |-- real_qz.cpp +| | | |-- redux.cpp +| | | |-- ref.cpp +| | | |-- resize.cpp +| | | |-- rvalue_types.cpp +| | | |-- schur_complex.cpp +| | | |-- schur_real.cpp +| | | |-- selfadjoint.cpp +| | | |-- simplicial_cholesky.cpp +| | | |-- sizeof.cpp +| | | |-- sizeoverflow.cpp +| | | |-- smallvectors.cpp +| | | |-- sparse_basic.cpp +| | | |-- sparse_block.cpp +| | | |-- sparse.h +| | | |-- sparseLM.cpp +| | | |-- sparselu.cpp +| | | |-- sparse_permutations.cpp +| | | |-- sparse_product.cpp +| | | |-- sparseqr.cpp +| | | |-- sparse_ref.cpp +| | | |-- sparse_solver.h +| | | |-- sparse_solvers.cpp +| | | |-- sparse_vector.cpp +| | | |-- special_numbers.cpp +| | | |-- spqr_support.cpp +| | | |-- stable_norm.cpp +| | | |-- stddeque.cpp +| | | |-- stddeque_overload.cpp +| | | |-- stdlist.cpp +| | | |-- stdlist_overload.cpp +| | | |-- stdvector.cpp +| | | |-- stdvector_overload.cpp +| | | |-- superlu_support.cpp +| | | |-- svd_common.h +| | | |-- svd_fill.h +| | | |-- swap.cpp +| | | |-- triangular.cpp +| | | |-- umeyama.cpp +| | | |-- umfpack_support.cpp +| | | |-- unalignedassert.cpp +| | | |-- unalignedcount.cpp +| | | |-- upperbidiagonalization.cpp +| | | |-- vectorization_logic.cpp +| | | |-- vectorwiseop.cpp +| | | |-- visitor.cpp +| | | `-- zerosized.cpp +| | |-- unsupported +| | | |-- bench +| | | | `-- bench_svd.cpp +| | | |-- doc +| | | | |-- examples +| | | | | |-- BVH_Example.cpp +| | | | | |-- CMakeLists.txt +| | | | | |-- EulerAngles.cpp +| | | | | |-- FFT.cpp +| | | | | |-- MatrixExponential.cpp +| | | | | |-- MatrixFunction.cpp +| | | | | |-- MatrixLogarithm.cpp +| | | | | |-- MatrixPower.cpp +| | | | | |-- MatrixPower_optimal.cpp +| | | | | |-- MatrixSine.cpp +| | | | | |-- MatrixSinh.cpp +| | | | | |-- MatrixSquareRoot.cpp +| | | | | |-- PolynomialSolver1.cpp +| | | | | `-- PolynomialUtils1.cpp +| | | | |-- snippets +| | | | | `-- CMakeLists.txt +| | | | |-- CMakeLists.txt +| | | | |-- eigendoxy_layout.xml.in +| | | | `-- Overview.dox +| | | |-- Eigen +| | | | |-- CXX11 +| | | | | |-- src +| | | | | | |-- Tensor +| | | | | | | |-- README.md +| | | | | | | |-- TensorArgMax.h +| | | | | | | |-- TensorAssign.h +| | | | | | | |-- TensorBase.h +| | | | | | | |-- TensorBroadcasting.h +| | | | | | | |-- TensorChipping.h +| | | | | | | |-- TensorConcatenation.h +| | | | | | | |-- TensorContractionBlocking.h +| | | | | | | |-- TensorContractionCuda.h +| | | | | | | |-- TensorContraction.h +| | | | | | | |-- TensorContractionMapper.h +| | | | | | | |-- TensorContractionThreadPool.h +| | | | | | | |-- TensorConversion.h +| | | | | | | |-- TensorConvolution.h +| | | | | | | |-- TensorCostModel.h +| | | | | | | |-- TensorCustomOp.h +| | | | | | | |-- TensorDeviceCuda.h +| | | | | | | |-- TensorDeviceDefault.h +| | | | | | | |-- TensorDevice.h +| | | | | | | |-- TensorDeviceSycl.h +| | | | | | | |-- TensorDeviceThreadPool.h +| | | | | | | |-- TensorDimensionList.h +| | | | | | | |-- TensorDimensions.h +| | | | | | | |-- TensorEvalTo.h +| | | | | | | |-- TensorEvaluator.h +| | | | | | | |-- TensorExecutor.h +| | | | | | | |-- TensorExpr.h +| | | | | | | |-- TensorFFT.h +| | | | | | | |-- TensorFixedSize.h +| | | | | | | |-- TensorForcedEval.h +| | | | | | | |-- TensorForwardDeclarations.h +| | | | | | | |-- TensorFunctors.h +| | | | | | | |-- TensorGenerator.h +| | | | | | | |-- TensorGlobalFunctions.h +| | | | | | | |-- Tensor.h +| | | | | | | |-- TensorImagePatch.h +| | | | | | | |-- TensorIndexList.h +| | | | | | | |-- TensorInflation.h +| | | | | | | |-- TensorInitializer.h +| | | | | | | |-- TensorIntDiv.h +| | | | | | | |-- TensorIO.h +| | | | | | | |-- TensorLayoutSwap.h +| | | | | | | |-- TensorMacros.h +| | | | | | | |-- TensorMap.h +| | | | | | | |-- TensorMeta.h +| | | | | | | |-- TensorMorphing.h +| | | | | | | |-- TensorPadding.h +| | | | | | | |-- TensorPatch.h +| | | | | | | |-- TensorRandom.h +| | | | | | | |-- TensorReductionCuda.h +| | | | | | | |-- TensorReduction.h +| | | | | | | |-- TensorReductionSycl.h +| | | | | | | |-- TensorRef.h +| | | | | | | |-- TensorReverse.h +| | | | | | | |-- TensorScan.h +| | | | | | | |-- TensorShuffling.h +| | | | | | | |-- TensorStorage.h +| | | | | | | |-- TensorStriding.h +| | | | | | | |-- TensorSyclConvertToDeviceExpression.h +| | | | | | | |-- TensorSyclExprConstructor.h +| | | | | | | |-- TensorSyclExtractAccessor.h +| | | | | | | |-- TensorSyclExtractFunctors.h +| | | | | | | |-- TensorSycl.h +| | | | | | | |-- TensorSyclLeafCount.h +| | | | | | | |-- TensorSyclPlaceHolderExpr.h +| | | | | | | |-- TensorSyclRun.h +| | | | | | | |-- TensorSyclTuple.h +| | | | | | | |-- TensorTraits.h +| | | | | | | |-- TensorUInt128.h +| | | | | | | `-- TensorVolumePatch.h +| | | | | | |-- TensorSymmetry +| | | | | | | |-- util +| | | | | | | | `-- TemplateGroupTheory.h +| | | | | | | |-- DynamicSymmetry.h +| | | | | | | |-- StaticSymmetry.h +| | | | | | | `-- Symmetry.h +| | | | | | |-- ThreadPool +| | | | | | | |-- EventCount.h +| | | | | | | |-- NonBlockingThreadPool.h +| | | | | | | |-- RunQueue.h +| | | | | | | |-- SimpleThreadPool.h +| | | | | | | |-- ThreadEnvironment.h +| | | | | | | |-- ThreadLocal.h +| | | | | | | |-- ThreadPoolInterface.h +| | | | | | | `-- ThreadYield.h +| | | | | | `-- util +| | | | | | |-- CXX11Meta.h +| | | | | | |-- CXX11Workarounds.h +| | | | | | |-- EmulateArray.h +| | | | | | |-- EmulateCXX11Meta.h +| | | | | | `-- MaxSizeVector.h +| | | | | |-- CMakeLists.txt +| | | | | |-- Tensor +| | | | | |-- TensorSymmetry +| | | | | `-- ThreadPool +| | | | |-- src +| | | | | |-- AutoDiff +| | | | | | |-- AutoDiffJacobian.h +| | | | | | |-- AutoDiffScalar.h +| | | | | | `-- AutoDiffVector.h +| | | | | |-- BVH +| | | | | | |-- BVAlgorithms.h +| | | | | | `-- KdBVH.h +| | | | | |-- Eigenvalues +| | | | | | `-- ArpackSelfAdjointEigenSolver.h +| | | | | |-- EulerAngles +| | | | | | |-- CMakeLists.txt +| | | | | | |-- EulerAngles.h +| | | | | | `-- EulerSystem.h +| | | | | |-- FFT +| | | | | | |-- ei_fftw_impl.h +| | | | | | `-- ei_kissfft_impl.h +| | | | | |-- IterativeSolvers +| | | | | | |-- ConstrainedConjGrad.h +| | | | | | |-- DGMRES.h +| | | | | | |-- GMRES.h +| | | | | | |-- IncompleteLU.h +| | | | | | |-- IterationController.h +| | | | | | |-- MINRES.h +| | | | | | `-- Scaling.h +| | | | | |-- KroneckerProduct +| | | | | | `-- KroneckerTensorProduct.h +| | | | | |-- LevenbergMarquardt +| | | | | | |-- CopyrightMINPACK.txt +| | | | | | |-- LevenbergMarquardt.h +| | | | | | |-- LMcovar.h +| | | | | | |-- LMonestep.h +| | | | | | |-- LMpar.h +| | | | | | `-- LMqrsolv.h +| | | | | |-- MatrixFunctions +| | | | | | |-- MatrixExponential.h +| | | | | | |-- MatrixFunction.h +| | | | | | |-- MatrixLogarithm.h +| | | | | | |-- MatrixPower.h +| | | | | | |-- MatrixSquareRoot.h +| | | | | | `-- StemFunction.h +| | | | | |-- MoreVectorization +| | | | | | `-- MathFunctions.h +| | | | | |-- NonLinearOptimization +| | | | | | |-- chkder.h +| | | | | | |-- covar.h +| | | | | | |-- dogleg.h +| | | | | | |-- fdjac1.h +| | | | | | |-- HybridNonLinearSolver.h +| | | | | | |-- LevenbergMarquardt.h +| | | | | | |-- lmpar.h +| | | | | | |-- qrsolv.h +| | | | | | |-- r1mpyq.h +| | | | | | |-- r1updt.h +| | | | | | `-- rwupdt.h +| | | | | |-- NumericalDiff +| | | | | | `-- NumericalDiff.h +| | | | | |-- Polynomials +| | | | | | |-- Companion.h +| | | | | | |-- PolynomialSolver.h +| | | | | | `-- PolynomialUtils.h +| | | | | |-- Skyline +| | | | | | |-- SkylineInplaceLU.h +| | | | | | |-- SkylineMatrixBase.h +| | | | | | |-- SkylineMatrix.h +| | | | | | |-- SkylineProduct.h +| | | | | | |-- SkylineStorage.h +| | | | | | `-- SkylineUtil.h +| | | | | |-- SparseExtra +| | | | | | |-- BlockOfDynamicSparseMatrix.h +| | | | | | |-- BlockSparseMatrix.h +| | | | | | |-- DynamicSparseMatrix.h +| | | | | | |-- MarketIO.h +| | | | | | |-- MatrixMarketIterator.h +| | | | | | `-- RandomSetter.h +| | | | | |-- SpecialFunctions +| | | | | | |-- arch +| | | | | | | `-- CUDA +| | | | | | | `-- CudaSpecialFunctions.h +| | | | | | |-- SpecialFunctionsArrayAPI.h +| | | | | | |-- SpecialFunctionsFunctors.h +| | | | | | |-- SpecialFunctionsHalf.h +| | | | | | |-- SpecialFunctionsImpl.h +| | | | | | `-- SpecialFunctionsPacketMath.h +| | | | | `-- Splines +| | | | | |-- SplineFitting.h +| | | | | |-- SplineFwd.h +| | | | | `-- Spline.h +| | | | |-- AdolcForward +| | | | |-- AlignedVector3 +| | | | |-- ArpackSupport +| | | | |-- AutoDiff +| | | | |-- BVH +| | | | |-- CMakeLists.txt +| | | | |-- EulerAngles +| | | | |-- FFT +| | | | |-- IterativeSolvers +| | | | |-- KroneckerProduct +| | | | |-- LevenbergMarquardt +| | | | |-- MatrixFunctions +| | | | |-- MoreVectorization +| | | | |-- MPRealSupport +| | | | |-- NonLinearOptimization +| | | | |-- NumericalDiff +| | | | |-- OpenGLSupport +| | | | |-- Polynomials +| | | | |-- Skyline +| | | | |-- SparseExtra +| | | | |-- SpecialFunctions +| | | | `-- Splines +| | | |-- test +| | | | |-- mpreal +| | | | | `-- mpreal.h +| | | | |-- alignedvector3.cpp +| | | | |-- autodiff.cpp +| | | | |-- autodiff_scalar.cpp +| | | | |-- BVH.cpp +| | | | |-- CMakeLists.txt +| | | | |-- cxx11_eventcount.cpp +| | | | |-- cxx11_meta.cpp +| | | | |-- cxx11_non_blocking_thread_pool.cpp +| | | | |-- cxx11_runqueue.cpp +| | | | |-- cxx11_tensor_argmax.cpp +| | | | |-- cxx11_tensor_argmax_cuda.cu +| | | | |-- cxx11_tensor_assign.cpp +| | | | |-- cxx11_tensor_broadcasting.cpp +| | | | |-- cxx11_tensor_broadcast_sycl.cpp +| | | | |-- cxx11_tensor_cast_float16_cuda.cu +| | | | |-- cxx11_tensor_casts.cpp +| | | | |-- cxx11_tensor_chipping.cpp +| | | | |-- cxx11_tensor_comparisons.cpp +| | | | |-- cxx11_tensor_complex_cuda.cu +| | | | |-- cxx11_tensor_complex_cwise_ops_cuda.cu +| | | | |-- cxx11_tensor_concatenation.cpp +| | | | |-- cxx11_tensor_const.cpp +| | | | |-- cxx11_tensor_contract_cuda.cu +| | | | |-- cxx11_tensor_contraction.cpp +| | | | |-- cxx11_tensor_convolution.cpp +| | | | |-- cxx11_tensor_cuda.cu +| | | | |-- cxx11_tensor_custom_index.cpp +| | | | |-- cxx11_tensor_custom_op.cpp +| | | | |-- cxx11_tensor_device.cu +| | | | |-- cxx11_tensor_device_sycl.cpp +| | | | |-- cxx11_tensor_dimension.cpp +| | | | |-- cxx11_tensor_empty.cpp +| | | | |-- cxx11_tensor_expr.cpp +| | | | |-- cxx11_tensor_fft.cpp +| | | | |-- cxx11_tensor_fixed_size.cpp +| | | | |-- cxx11_tensor_forced_eval.cpp +| | | | |-- cxx11_tensor_forced_eval_sycl.cpp +| | | | |-- cxx11_tensor_generator.cpp +| | | | |-- cxx11_tensor_ifft.cpp +| | | | |-- cxx11_tensor_image_patch.cpp +| | | | |-- cxx11_tensor_index_list.cpp +| | | | |-- cxx11_tensor_inflation.cpp +| | | | |-- cxx11_tensor_intdiv.cpp +| | | | |-- cxx11_tensor_io.cpp +| | | | |-- cxx11_tensor_layout_swap.cpp +| | | | |-- cxx11_tensor_lvalue.cpp +| | | | |-- cxx11_tensor_map.cpp +| | | | |-- cxx11_tensor_math.cpp +| | | | |-- cxx11_tensor_mixed_indices.cpp +| | | | |-- cxx11_tensor_morphing.cpp +| | | | |-- cxx11_tensor_notification.cpp +| | | | |-- cxx11_tensor_of_complex.cpp +| | | | |-- cxx11_tensor_of_const_values.cpp +| | | | |-- cxx11_tensor_of_float16_cuda.cu +| | | | |-- cxx11_tensor_of_strings.cpp +| | | | |-- cxx11_tensor_padding.cpp +| | | | |-- cxx11_tensor_patch.cpp +| | | | |-- cxx11_tensor_random.cpp +| | | | |-- cxx11_tensor_random_cuda.cu +| | | | |-- cxx11_tensor_reduction.cpp +| | | | |-- cxx11_tensor_reduction_cuda.cu +| | | | |-- cxx11_tensor_reduction_sycl.cpp +| | | | |-- cxx11_tensor_ref.cpp +| | | | |-- cxx11_tensor_reverse.cpp +| | | | |-- cxx11_tensor_roundings.cpp +| | | | |-- cxx11_tensor_scan.cpp +| | | | |-- cxx11_tensor_scan_cuda.cu +| | | | |-- cxx11_tensor_shuffling.cpp +| | | | |-- cxx11_tensor_simple.cpp +| | | | |-- cxx11_tensor_striding.cpp +| | | | |-- cxx11_tensor_sugar.cpp +| | | | |-- cxx11_tensor_sycl.cpp +| | | | |-- cxx11_tensor_symmetry.cpp +| | | | |-- cxx11_tensor_thread_pool.cpp +| | | | |-- cxx11_tensor_uint128.cpp +| | | | |-- cxx11_tensor_volume_patch.cpp +| | | | |-- dgmres.cpp +| | | | |-- EulerAngles.cpp +| | | | |-- FFT.cpp +| | | | |-- FFTW.cpp +| | | | |-- forward_adolc.cpp +| | | | |-- gmres.cpp +| | | | |-- kronecker_product.cpp +| | | | |-- levenberg_marquardt.cpp +| | | | |-- matrix_exponential.cpp +| | | | |-- matrix_function.cpp +| | | | |-- matrix_functions.h +| | | | |-- matrix_power.cpp +| | | | |-- matrix_square_root.cpp +| | | | |-- minres.cpp +| | | | |-- mpreal_support.cpp +| | | | |-- NonLinearOptimization.cpp +| | | | |-- NumericalDiff.cpp +| | | | |-- openglsupport.cpp +| | | | |-- polynomialsolver.cpp +| | | | |-- polynomialutils.cpp +| | | | |-- sparse_extra.cpp +| | | | |-- special_functions.cpp +| | | | `-- splines.cpp +| | | |-- CMakeLists.txt +| | | `-- README.txt +| | |-- CMakeLists.txt +| | |-- COPYING.BSD +| | |-- COPYING.GPL +| | |-- COPYING.LGPL +| | |-- COPYING.MINPACK +| | |-- COPYING.MPL2 +| | |-- COPYING.README +| | |-- CTestConfig.cmake +| | |-- CTestCustom.cmake.in +| | |-- eigen3.pc.in +| | |-- INSTALL +| | |-- README.md +| | `-- signature_of_eigen3_matrix_library +| |-- lcov +| | |-- bin +| | | |-- copy_dates.sh +| | | |-- gendesc +| | | |-- genhtml +| | | |-- geninfo +| | | |-- genpng +| | | |-- get_changes.sh +| | | |-- get_version.sh +| | | |-- install.sh +| | | |-- lcov +| | | `-- updateversion.pl +| | |-- example +| | | |-- methods +| | | | |-- gauss.c +| | | | `-- iterate.c +| | | |-- descriptions.txt +| | | |-- example.c +| | | |-- gauss.h +| | | |-- iterate.h +| | | |-- Makefile +| | | `-- README +| | |-- man +| | | |-- gendesc.1 +| | | |-- genhtml.1 +| | | |-- geninfo.1 +| | | |-- genpng.1 +| | | |-- lcov.1 +| | | `-- lcovrc.5 +| | |-- rpm +| | | `-- lcov.spec +| | |-- test +| | | |-- bin +| | | | |-- common +| | | | |-- mkinfo +| | | | |-- norminfo +| | | | |-- test_run +| | | | |-- test_skip +| | | | |-- testsuite_exit +| | | | `-- testsuite_init +| | | |-- genhtml_output +| | | | |-- genhtml_test +| | | | `-- Makefile +| | | |-- lcov_add_files +| | | | |-- add_test +| | | | `-- Makefile +| | | |-- lcov_diff +| | | | |-- new +| | | | | |-- Makefile +| | | | | `-- prog.c +| | | | |-- old +| | | | | |-- Makefile +| | | | | `-- prog.c +| | | | |-- diff_test +| | | | `-- Makefile +| | | |-- lcov_misc +| | | | `-- Makefile +| | | |-- lcov_summary +| | | | |-- check_counts +| | | | `-- Makefile +| | | |-- profiles +| | | | |-- large +| | | | |-- medium +| | | | `-- small +| | | |-- common.mak +| | | |-- lcovrc +| | | `-- Makefile +| | |-- CHANGES +| | |-- CONTRIBUTING +| | |-- COPYING +| | |-- lcovrc +| | |-- Makefile +| | `-- README +| |-- phys +| | `-- units +| | |-- io.hpp +| | |-- io_output_eng.hpp +| | |-- io_output.hpp +| | |-- io_symbols.hpp +| | |-- other_units.hpp +| | |-- physical_constants.hpp +| | |-- quantity.hpp +| | |-- quantity_io_ampere.hpp +| | |-- quantity_io_becquerel.hpp +| | |-- quantity_io_candela.hpp +| | |-- quantity_io_celsius.hpp +| | |-- quantity_io_coulomb.hpp +| | |-- quantity_io_dimensionless.hpp +| | |-- quantity_io_engineering.hpp +| | |-- quantity_io_farad.hpp +| | |-- quantity_io_gray.hpp +| | |-- quantity_io_henry.hpp +| | |-- quantity_io_hertz.hpp +| | |-- quantity_io.hpp +| | |-- quantity_io_joule.hpp +| | |-- quantity_io_kelvin.hpp +| | |-- quantity_io_kilogram.hpp +| | |-- quantity_io_lumen.hpp +| | |-- quantity_io_lux.hpp +| | |-- quantity_io_meter.hpp +| | |-- quantity_io_mole.hpp +| | |-- quantity_io_newton.hpp +| | |-- quantity_io_ohm.hpp +| | |-- quantity_io_pascal.hpp +| | |-- quantity_io_radian.hpp +| | |-- quantity_io_second.hpp +| | |-- quantity_io_siemens.hpp +| | |-- quantity_io_sievert.hpp +| | |-- quantity_io_speed.hpp +| | |-- quantity_io_steradian.hpp +| | |-- quantity_io_symbols.hpp +| | |-- quantity_io_tesla.hpp +| | |-- quantity_io_volt.hpp +| | |-- quantity_io_watt.hpp +| | `-- quantity_io_weber.hpp +| |-- CMakeLists.txt +| |-- eigen-eigen-b3f3d4950030.tar.bz2 +| |-- pythia8235.tar.bz2 +| `-- ThirdParty.dox +|-- Tools +| |-- CMakeLists.txt +| |-- plot_crossings.sh +| `-- plot_tracks.sh +|-- AUTHORS +|-- CHANGELOG +|-- CMakeLists.txt +|-- COLLABORATION_AGREEMENT.md +|-- CONTRIBUTING.md +|-- corsika.dox +|-- do-clang-format.py +|-- do-copyright.py +|-- FIXME.md +|-- LICENSE +|-- MCNET_GUIDELINES +|-- README.md +`-- SCIENTIFIC_AUTHORS +``` diff --git a/Framework/CMakeLists.txt b/Framework/CMakeLists.txt deleted file mode 100644 index 4e7baba25..000000000 --- a/Framework/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -add_subdirectory (Analytics) -add_subdirectory (Cascade) -add_subdirectory (Geometry) -add_subdirectory (Logging) -add_subdirectory (Particles) -add_subdirectory (ProcessSequence) -add_subdirectory (Random) -add_subdirectory (StackInterface) -add_subdirectory (Testing) -add_subdirectory (Utilities) -add_subdirectory (Units) - - - - - - - diff --git a/Framework/Cascade/CMakeLists.txt b/Framework/Cascade/CMakeLists.txt deleted file mode 100644 index 2a1209973..000000000 --- a/Framework/Cascade/CMakeLists.txt +++ /dev/null @@ -1,55 +0,0 @@ -# namespace of library -> location of header files -set ( - CORSIKAcascade_NAMESPACE - corsika/cascade - ) - -# header files of this library -set ( - CORSIKAcascade_HEADERS - Cascade.h - testCascade.h - ) - -add_library (CORSIKAcascade INTERFACE) - -CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAcascade ${CORSIKAcascade_NAMESPACE} ${CORSIKAcascade_HEADERS}) - -target_link_libraries( - CORSIKAcascade - INTERFACE - CORSIKAsetup - CORSIKArandom - CORSIKAstackinterface - CORSIKAparticles - CORSIKAgeometry - CORSIKAenvironment - CORSIKAprocesssequence - CORSIKAunits - CORSIKAlogging - ) - -# include directive for upstream code -target_include_directories ( - CORSIKAcascade - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/> - ) - -# install library -install ( - FILES ${CORSIKAcascade_HEADERS} - DESTINATION include/${CORSIKAcascade_NAMESPACE} - ) - -# ---------------- -# code unit testing -CORSIKA_ADD_TEST(testCascade) -target_link_libraries ( - testCascade - CORSIKAcascade - ProcessStackInspector - ProcessTrackingLine - CORSIKAtesting - ) diff --git a/Framework/Cascade/Cascade.dox b/Framework/Cascade/Cascade.dox deleted file mode 100644 index 7ea74e9c5..000000000 --- a/Framework/Cascade/Cascade.dox +++ /dev/null @@ -1,8 +0,0 @@ -/** - - - Here are have to explain the corsika::cascade::Cascade class and its - functionality. - - -*/ \ No newline at end of file diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h deleted file mode 100644 index bc29bb620..000000000 --- a/Framework/Cascade/Cascade.h +++ /dev/null @@ -1,395 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/environment/Environment.h> -#include <corsika/logging/Logging.h> -#include <corsika/process/ProcessReturn.h> -#include <corsika/random/ExponentialDistribution.h> -#include <corsika/random/RNGManager.h> -#include <corsika/random/UniformRealDistribution.h> -#include <corsika/stack/SecondaryView.h> -#include <corsika/units/PhysicalUnits.h> -#include <corsika/stack/history/EventType.hpp> -#include <corsika/stack/history/HistorySecondaryProducer.hpp> - -/* see Issue 161, we need to include SetupStack only because we need - to globally define StackView. This is clearly not nice and should - be changed, when possible. It might be that StackView needs to be - templated in Cascade, but this would be even worse... so we don't - do that until it is really needed. - */ -#include <corsika/setup/SetupStack.h> - -#include <cassert> -#include <cmath> -#include <limits> - -#include <boost/type_index.hpp> -using boost::typeindex::type_id_with_cvr; - -#include <fstream> - -/** - * The cascade namespace assembles all objects needed to simulate full particles cascades. - */ - -namespace corsika::cascade { - - /** - * \class Cascade - * - * The Cascade class is constructed from template arguments making - * it very versatile. Via the template arguments physics models are - * plugged into the cascade simulation. - * - * <b>TTracking</b> must be a class according to the - * TrackingInterface providing the functions: - * <code>auto GetTrack(Particle const& p)</auto>, - * with the return type <code>geometry::Trajectory<corsika::geometry::Line> - * </code> - * - * <b>TProcessList</b> must be a ProcessSequence. * - * <b>Stack</b> is the storage object for particle data, i.e. with - * Particle class type <code>Stack::ParticleType</code> - * - * - */ - - template <typename TTracking, typename TProcessList, typename TStack, - /* - TStackView is needed as explicit template parameter because - of issue 161 and the - inability of clang to understand "stack::MakeView" so far. - */ - typename TStackView = corsika::setup::StackView> - class Cascade { - using Particle = typename TStack::ParticleType; - using VolumeTreeNode = - std::remove_pointer_t<decltype(((Particle*)nullptr)->GetNode())>; - using MediumInterface = typename VolumeTreeNode::IModelProperties; - - // we only want fully configured objects - Cascade() = delete; - - public: - /** - * Cascade class cannot be default constructed, but needs a valid - * list of physics processes for configuration at construct time. - */ - Cascade(corsika::environment::Environment<MediumInterface> const& env, TTracking& tr, - TProcessList& pl, TStack& stack) - : environment_(env) - , tracking_(tr) - , process_sequence_(pl) - , stack_(stack) - , count_(0) { - C8LOG_INFO(c8_ascii_); - if constexpr (TStackView::has_event) { - C8LOG_INFO(" - With full cascade HISTORY."); - } - } - - ~Cascade(){}; - - /** - * The Run function is the main simulation loop, which processes - * particles from the Stack until the Stack is empty. - */ - void Run() { - setNodes(); - - while (!stack_.IsEmpty()) { - while (!stack_.IsEmpty()) { - C8LOG_TRACE("Stack: {}", stack_.as_string()); - count_++; - auto pNext = stack_.GetNextParticle(); - C8LOG_DEBUG( - "============== next particle : count={}, pid={} " - ", stack entries={}" - ", stack deleted={}", - count_, pNext.GetPID(), stack_.getEntries(), stack_.getDeleted()); - Step(pNext); - process_sequence_.DoStack(stack_); - } - // do cascade equations, which can put new particles on Stack, - // thus, the double loop - // DoCascadeEquations(); - } - } - - /** - * Force an interaction of the top particle of the stack at its current position. - * Note that SetNodes() or an equivalent procedure needs to be called first if you - * want to call forceInteraction() for the primary interaction. - */ - void forceInteraction() { - C8LOG_DEBUG("forced interaction!"); - setNodes(); - auto vParticle = stack_.GetNextParticle(); - TStackView secondaries(vParticle); - interaction(secondaries); - process_sequence_.DoSecondaries(secondaries); - vParticle.Delete(); // primary particle has interacted and is gone - } - - private: - /** - * The Step function is executed for each particle from the - * stack. It will calcualte geometric transport of the particles, - * and apply continuous and stochastic processes to it, which may - * lead to energy losses, scattering, absorption, decays and the - * production of secondary particles. - * - * New particles produced in one step are subject to further - * processing, e.g. thinning, etc. - */ - void Step(Particle& vParticle) { - using namespace corsika; - using namespace corsika::units::si; - - // determine combined total interaction length (inverse) - InverseGrammageType const total_inv_lambda = - process_sequence_.GetInverseInteractionLength(vParticle); - - // sample random exponential step length in grammage - corsika::random::ExponentialDistribution expDist(1 / total_inv_lambda); - GrammageType const next_interact = expDist(rng_); - - C8LOG_DEBUG( - "total_lambda={} g/cm2, " - ", next_interact={} g/cm2", - double((1. / total_inv_lambda) / 1_g * 1_cm * 1_cm), - double(next_interact / 1_g * 1_cm * 1_cm)); - - auto const* currentLogicalNode = vParticle.GetNode(); - - // assert that particle stays outside void Universe if it has no - // model properties set - assert((currentLogicalNode != &*environment_.GetUniverse() || - environment_.GetUniverse()->HasModelProperties()) && - "FATAL: The environment model has no valid properties set!"); - - // determine combined total inverse decay time - InverseTimeType const total_inv_lifetime = - process_sequence_.GetInverseLifetime(vParticle); - - // sample random exponential decay time - corsika::random::ExponentialDistribution expDistDecay(1 / total_inv_lifetime); - TimeType const next_decay = expDistDecay(rng_); - C8LOG_DEBUG( - "total_lifetime={} s" - ", next_decay={} s", - (1 / total_inv_lifetime) / 1_s, next_decay / 1_s); - - // convert next_decay from time to length [m] - LengthType const distance_decay = next_decay * vParticle.GetMomentum().norm() / - vParticle.GetEnergy() * units::constants::c; - - // determine geometric tracking - auto [step, nextVol] = tracking_.GetTrack(vParticle); - auto geomMaxLength = step.GetLength(1); - - // convert next_step from grammage to length - LengthType const distance_interact = - currentLogicalNode->GetModelProperties().ArclengthFromGrammage(step, - next_interact); - - // determine the maximum geometric step length - LengthType const continuous_max_dist = process_sequence_.MaxStepLength(vParticle, step); - - // take minimum of geometry, interaction, decay for next step - auto min_distance = - std::min({distance_interact, distance_decay, continuous_max_dist, geomMaxLength}); - - C8LOG_DEBUG( - "transport particle by : {} m " - "Medium transition after: {} m " - "Decay after: {} m " - "Interaction after: {} m " - "Continuous limit: {} m ", - min_distance / 1_m, geomMaxLength / 1_m, distance_decay / 1_m, - distance_interact / 1_m, continuous_max_dist / 1_m); - - // here the particle is actually moved along the trajectory to new position: - step.SetLength(min_distance); - vParticle.SetPosition(step.GetPosition(1)); - vParticle.SetMomentum(step.GetDirection(1) * vParticle.GetMomentum().norm()); - vParticle.SetTime(vParticle.GetTime() + step.GetDuration()); - std::cout << "New Position: " << vParticle.GetPosition().GetCoordinates() - << std::endl; - - // apply all continuous processes on particle + track - process::EProcessReturn status = process_sequence_.DoContinuous(vParticle, step); - - if (status == process::EProcessReturn::eParticleAbsorbed) { - C8LOG_DEBUG("Cascade: delete absorbed particle PID={} E={} GeV", - vParticle.GetPID(), vParticle.GetEnergy() / 1_GeV); - if (!vParticle.isDeleted()) vParticle.Delete(); - return; - } - - C8LOG_DEBUG("sth. happening before geometric limit ? {}", - ((min_distance < geomMaxLength) ? "yes" : "no")); - - if (min_distance < geomMaxLength) { // interaction to happen within geometric limit - - // check whether decay or interaction limits this step the - // outcome of decay or interaction MAY be a) new particles in - // secondaries, b) the projectile particle deleted (or - // changed) - - TStackView secondaries(vParticle); - - if (min_distance < continuous_max_dist) { - /* - Create SecondaryView object on Stack. The data container - remains untouched and identical, and 'projectil' is identical - to 'vParticle' above this line. However, - projectil.AddSecondaries populate the SecondaryView, which can - then be used afterwards for further processing. Thus: it is - important to use projectle/view (and not vParticle) for Interaction, - and Decay! - */ - - [[maybe_unused]] auto projectile = secondaries.GetProjectile(); - - if (distance_interact < distance_decay) { - interaction(secondaries); - } else { - decay(secondaries); - // make sure particle actually did decay if it should have done so - if (secondaries.getSize() == 1 && - projectile.GetPID() == secondaries.GetNextParticle().GetPID()) - throw std::runtime_error( - fmt::format("Cascade: {} decayed into itself!", - particles::GetName(projectile.GetPID()))); - } - - process_sequence_.DoSecondaries(secondaries); - vParticle.Delete(); - - } else { // step-length limitation within volume - C8LOG_DEBUG("step-length limitation"); - // no extra physics happens here. just proceed to next step. - } - - [[maybe_unused]] auto const assertion = [&] { - auto const* numericalNodeAfterStep = - environment_.GetUniverse()->GetContainingNode(vParticle.GetPosition()); - C8LOG_TRACE("Geometry check: numericalNodeAfterStep={} currentLogicalNode={}", - fmt::ptr(numericalNodeAfterStep), fmt::ptr(currentLogicalNode)); - return numericalNodeAfterStep == currentLogicalNode; - }; - assert(assertion()); // numerical and logical nodes should - // match, we did not cross any volume - // boundary - - } else { // boundary crossing, step is limited by volume boundary - - if (nextVol != currentLogicalNode) { - - C8LOG_DEBUG("volume boundary crossing to {}", fmt::ptr(nextVol)); - - if (nextVol == environment_.GetUniverse().get()) { - C8LOG_DEBUG("particle left physics world, is now in unknown space -> delete"); - vParticle.Delete(); - } - vParticle.SetNode(nextVol); - /* - DoBoundary may delete the particle (or not) - - caveat: any changes to vParticle, or even the production - of new secondaries is currently not passed to ParticleCut, - thus, particles outside the desired phase space may be produced. - - todo: this must be fixed. - */ - process_sequence_.DoBoundaryCrossing(vParticle, *currentLogicalNode, *nextVol); - } - } - } - - process::EProcessReturn decay(TStackView& view) { - C8LOG_DEBUG("decay"); - units::si::InverseTimeType const actual_decay_time = - process_sequence_.GetInverseLifetime(view.parent()); - - random::UniformRealDistribution<units::si::InverseTimeType> uniDist( - actual_decay_time); - const auto sample_process = uniDist(rng_); - auto const returnCode = process_sequence_.SelectDecay(view, sample_process); - if (returnCode != process::EProcessReturn::eDecayed) { - C8LOG_WARN("Particle did not decay!"); - } - SetEventType(view, history::EventType::Decay); - return returnCode; - } - - process::EProcessReturn interaction(TStackView& view) { - C8LOG_DEBUG("collide"); - - units::si::InverseGrammageType const current_inv_length = - process_sequence_.GetInverseInteractionLength(view.parent()); - - random::UniformRealDistribution<units::si::InverseGrammageType> uniDist( - current_inv_length); - const auto sample_process = uniDist(rng_); - auto const returnCode = process_sequence_.SelectInteraction(view, sample_process); - if (returnCode != process::EProcessReturn::eInteracted) { - C8LOG_WARN("Particle did not interact!"); - } - SetEventType(view, history::EventType::Interaction); - return returnCode; - } - - /** - * set the nodes for all particles on the stack according to their numerical - * position - */ - void setNodes() { - std::for_each(stack_.begin(), stack_.end(), [&](auto& p) { - auto const* numericalNode = - environment_.GetUniverse()->GetContainingNode(p.GetPosition()); - p.SetNode(numericalNode); - }); - } - - void SetEventType(TStackView& view, [[maybe_unused]] history::EventType eventType) { - if constexpr (TStackView::has_event) { - for (auto&& sec : view) { sec.GetEvent()->setEventType(eventType); } - } - } - - // but this here temporarily. Should go into dedicated file later: - const char* c8_ascii_ = - R"V0G0N( - ,ad8888ba, ,ad8888ba, 88888888ba ad88888ba 88 88 a8P db ad88888ba - d8"' `"8b d8"' `"8b 88 "8b d8" "8b 88 88 ,88' d88b d8" "8b -d8' d8' `8b 88 ,8P Y8, 88 88 ,88" d8'`8b Y8a a8P -88 88 88 88aaaaaa8P' `Y8aaaaa, 88 88,d88' d8' `8b "Y8aaa8P" -88 88 88 88""""88' `"""""8b, 88 8888"88, d8YaaaaY8b ,d8"""8b, -Y8, Y8, ,8P 88 `8b `8b 88 88P Y8b d8""""""""8b d8" "8b - Y8a. .a8P Y8a. .a8P 88 `8b Y8a a8P 88 88 "88, d8' `8b Y8a a8P - `"Y8888Y"' `"Y8888Y"' 88 `8b "Y88888P" 88 88 Y8b d8' `8b "Y88888P" - )V0G0N"; - - private: - // Data members - corsika::environment::Environment<MediumInterface> const& environment_; - TTracking& tracking_; - TProcessList& process_sequence_; - TStack& stack_; - corsika::random::RNG& rng_ = - corsika::random::RNGManager::GetInstance().GetRandomStream("cascade"); - unsigned int count_ = 0; - - }; // end class Cascade - -} // namespace corsika::cascade diff --git a/Framework/Cascade/testCascade.h b/Framework/Cascade/testCascade.h deleted file mode 100644 index e05744143..000000000 --- a/Framework/Cascade/testCascade.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/environment/Environment.h> -#include <corsika/environment/IEmpty.hpp> - -#include <corsika/stack/CombinedStack.h> -#include <corsika/stack/SecondaryView.h> -#include <corsika/stack/node/GeometryNodeStackExtension.h> -#include <corsika/stack/nuclear_extension/NuclearStackExtension.h> - -using TestEnvironmentInterface = corsika::environment::IEmpty; -using TestEnvironmentType = corsika::environment::Environment<TestEnvironmentInterface>; - -template <typename T> -using SetupGeometryDataInterface = - corsika::stack::node::GeometryDataInterface<T, TestEnvironmentType>; - -// combine particle data stack with geometry information for tracking -template <typename StackIter> -using StackWithGeometryInterface = corsika::stack::CombinedParticleInterface< - corsika::stack::nuclear_extension::ParticleDataStack::MPIType, - SetupGeometryDataInterface, StackIter>; - -using TestCascadeStack = corsika::stack::CombinedStack< - typename corsika::stack::nuclear_extension::ParticleDataStack::StackImpl, - corsika::stack::node::GeometryData<TestEnvironmentType>, StackWithGeometryInterface>; - -/* - See also Issue 161 -*/ -#if defined(__clang__) -using TestCascadeStackView = - corsika::stack::SecondaryView<typename TestCascadeStack::StackImpl, - StackWithGeometryInterface>; -#elif defined(__GNUC__) || defined(__GNUG__) -using TestCascadeStackView = corsika::stack::MakeView<TestCascadeStack>::type; -#endif diff --git a/Framework/Geometry/BaseTrajectory.h b/Framework/Geometry/BaseTrajectory.h deleted file mode 100644 index 6d61e2eeb..000000000 --- a/Framework/Geometry/BaseTrajectory.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> -#include <string> - -namespace corsika::geometry { - - /*! - * Interface / base class for trajectories. - */ - class BaseTrajectory { - - BaseTrajectory() = delete; - - public: - BaseTrajectory(corsika::units::si::TimeType start, corsika::units::si::TimeType end) - : fTStart(start) - , fTEnd(end) {} - - //!< for \f$ t = 0 \f$, the starting Point shall be returned. - virtual Point GetPosition(corsika::units::si::TimeType) const = 0; - - //!< the Point is return from u=0 (start) to u=1 (end) - virtual Point GetPosition(double u) const = 0; - - /*! - * returns the length between two points of the trajectory - * parameterized by \arg t1 and \arg t2. Requires \arg t2 > \arg t1. - */ - - virtual corsika::units::si::TimeType TimeFromArclength( - corsika::units::si::LengthType) const = 0; - - virtual LengthType ArcLength(corsika::units::si::TimeType t1, - corsika::units::si::TimeType t2) const = 0; - - virtual corsika::units::si::TimeType GetDuration( - corsika::units::si::TimeType t1, corsika::units::si::TimeType t2) const { - return t2 - t1; - } - - virtual Point GetEndpoint() const { return GetPosition(fTEnd); } - virtual Point GetStartpoint() const { return GetPosition(fTStart); } - - protected: - corsika::units::si::TimeType const fTStart, fTEnd; - }; - -} // namespace corsika::geometry diff --git a/Framework/Geometry/BaseVector.h b/Framework/Geometry/BaseVector.h deleted file mode 100644 index f66ee84e2..000000000 --- a/Framework/Geometry/BaseVector.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/geometry/CoordinateSystem.h> -#include <corsika/geometry/QuantityVector.h> - -namespace corsika::geometry { - - /*! - * Common base class for Vector and Point. Currently it does basically nothing. - */ - - template <typename dim> - class BaseVector { - protected: - QuantityVector<dim> qVector; - CoordinateSystem const* cs; - - public: - BaseVector(CoordinateSystem const& pCS, QuantityVector<dim> pQVector) - : qVector(pQVector) - , cs(&pCS) {} - - auto const& GetCoordinateSystem() const { return *cs; } - }; - -} // namespace corsika::geometry diff --git a/Framework/Geometry/CMakeLists.txt b/Framework/Geometry/CMakeLists.txt deleted file mode 100644 index d302289b0..000000000 --- a/Framework/Geometry/CMakeLists.txt +++ /dev/null @@ -1,78 +0,0 @@ -set ( - GEOMETRY_SOURCES - CoordinateSystem.cc - ) - -set ( - GEOMETRY_HEADERS - Vector.h - Point.h - Line.h - Sphere.h - Plane.h - Volume.h - CoordinateSystem.h - RootCoordinateSystem.h - Helix.h - BaseVector.h - QuantityVector.h - Trajectory.h - FourVector.h - Intersections.hpp - ) - -set ( - GEOMETRY_NAMESPACE - corsika/geometry - ) - -add_library (CORSIKAgeometry STATIC ${GEOMETRY_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAgeometry ${GEOMETRY_NAMESPACE} ${GEOMETRY_HEADERS}) - -set_target_properties ( - CORSIKAgeometry - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 - PUBLIC_HEADER "${GEOMETRY_HEADERS}" - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - CORSIKAgeometry - CORSIKAunits - CORSIKAutilities - C8::ext::eigen3 - ) - -target_include_directories ( - CORSIKAgeometry - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS CORSIKAgeometry - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION include/${GEOMETRY_NAMESPACE} - ) - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST(testGeometry) -target_link_libraries ( - testGeometry - CORSIKAgeometry - CORSIKAunits - CORSIKAtesting - ) - -CORSIKA_ADD_TEST(testFourVector) -target_link_libraries ( - testFourVector - CORSIKAgeometry - CORSIKAunits - CORSIKAtesting - ) diff --git a/Framework/Geometry/CoordinateSystem.h b/Framework/Geometry/CoordinateSystem.h deleted file mode 100644 index bc9ecd9a2..000000000 --- a/Framework/Geometry/CoordinateSystem.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/geometry/QuantityVector.h> -#include <corsika/units/PhysicalUnits.h> -#include <corsika/utl/sgn.h> -#include <Eigen/Dense> -#include <stdexcept> - -typedef Eigen::Transform<double, 3, Eigen::Affine> EigenTransform; -typedef Eigen::Translation<double, 3> EigenTranslation; - -namespace corsika::geometry { - - class RootCoordinateSystem; - template <typename T> - class Vector; - - using corsika::units::si::length_d; - - class CoordinateSystem { - CoordinateSystem const* reference = nullptr; - EigenTransform transf; - - CoordinateSystem() - : // for creating the root CS - transf(EigenTransform::Identity()) {} - - protected: - static auto CreateCS() { return CoordinateSystem(); } - friend corsika::geometry::RootCoordinateSystem; /// this is the only class that can - /// create ONE unique root CS - - public: - static EigenTransform GetTransformation(CoordinateSystem const& c1, - CoordinateSystem const& c2); - - CoordinateSystem(CoordinateSystem const& reference, EigenTransform const& transf) - : reference(&reference) - , transf(transf) {} - - auto& operator=(const CoordinateSystem& pCS) { - reference = pCS.reference; - transf = pCS.transf; - return *this; - } - - auto translate(QuantityVector<length_d> vector) const { - EigenTransform const translation{EigenTranslation(vector.eVector)}; - - return CoordinateSystem(*this, translation); - } - - /** - * creates a new CS in which vVec points in direction of the new z-axis - */ - template <typename TDim> - auto RotateToZ(Vector<TDim> vVec) const { - auto const a = vVec.normalized().GetComponents(*this).eVector; - auto const a1 = a(0), a2 = a(1); - - auto const s = utl::sgn(a(2)); - auto const c = 1 / (1 + s * a(2)); - - Eigen::Matrix3d A, B; - - if (s > 0) { - A << 1, 0, a1, // comment to prevent clang-format - 0, 1, a2, // . - -a1, -a2, 1; // . - B << -a1 * a1 * c, -a1 * a2 * c, 0, // . - -a1 * a2 * c, -a2 * a2 * c, 0, // . - 0, 0, -(a1 * a1 + a2 * a2) * c; // . - - } else { - A << 1, 0, a1, // . - 0, -1, a2, // . - a1, -a2, -1; // . - B << -a1 * a1 * c, +a1 * a2 * c, 0, // . - -a1 * a2 * c, +a2 * a2 * c, 0, // . - 0, 0, (a1 * a1 + a2 * a2) * c; // . - } - - return CoordinateSystem(*this, EigenTransform(A + B)); - } - - template <typename TDim> - auto rotate(QuantityVector<TDim> axis, double angle) const { - if (axis.eVector.isZero()) { - throw std::runtime_error("null-vector given as axis parameter"); - } - - EigenTransform const rotation{Eigen::AngleAxisd(angle, axis.eVector.normalized())}; - - return CoordinateSystem(*this, rotation); - } - - template <typename TDim> - auto translateAndRotate(QuantityVector<phys::units::length_d> translation, - QuantityVector<TDim> axis, double angle) { - if (axis.eVector.isZero()) { - throw std::runtime_error("null-vector given as axis parameter"); - } - - EigenTransform const transf{Eigen::AngleAxisd(angle, axis.eVector.normalized()) * - EigenTranslation(translation.eVector)}; - - return CoordinateSystem(*this, transf); - } - - auto const* GetReference() const { return reference; } - - auto const& GetTransform() const { return transf; } - - bool operator==(CoordinateSystem const& cs) const { - return reference == cs.reference && transf.matrix() == cs.transf.matrix(); - } - - bool operator!=(CoordinateSystem const& cs) const { return !(cs == *this); } - }; - -} // namespace corsika::geometry diff --git a/Framework/Geometry/FourVector.h b/Framework/Geometry/FourVector.h deleted file mode 100644 index 2ea2b28d4..000000000 --- a/Framework/Geometry/FourVector.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> - -#include <iostream> - -namespace corsika::geometry { - - /** - FourVector supports "full" units, e.g. E in [GeV/c] and p in [GeV], - or also t in [s] and r in [m], etc. - - However, for HEP applications it is also possible to use E and p - both in [GeV]. - - The FourVector can return NormSqr and Norm, whereas Norm is - sqrt(abs(NormSqr)). The physical units are always calculated and - returned properly. - - FourVector can also return if it is TimeLike, SpaceLike or PhotonLike. - - When a FourVector is initialized with a lvalue reference, this is - also used for the internal storage, which should lead to complete - disappearance of the FourVector class during optimization. - */ - - template <typename TimeType, typename SpaceVecType> - class FourVector { - - public: - using SpaceType = typename std::decay<SpaceVecType>::type::Quantity; - - //! check the types and the physical units here: - static_assert( - std::is_same<typename std::decay<TimeType>::type, SpaceType>::value || - std::is_same<typename std::decay<TimeType>::type, - decltype(std::declval<SpaceType>() / corsika::units::si::meter * - corsika::units::si::second)>::value, - "Units of time-like and space-like coordinates must either be idential " - "(e.g. GeV) or [E/c]=[p]"); - - public: - FourVector(const TimeType& eT, const SpaceVecType& eS) - : fTimeLike(eT) - , fSpaceLike(eS) {} - - TimeType GetTimeLikeComponent() const { return fTimeLike; } - SpaceVecType& GetSpaceLikeComponents() { return fSpaceLike; } - const SpaceVecType& GetSpaceLikeComponents() const { return fSpaceLike; } - - auto GetNormSqr() const { return GetTimeSquared() - fSpaceLike.squaredNorm(); } - - SpaceType GetNorm() const { return sqrt(abs(GetNormSqr())); } - - bool IsTimelike() const { - return GetTimeSquared() < fSpaceLike.squaredNorm(); - } //! Norm2 < 0 - - bool IsSpacelike() const { - return GetTimeSquared() > fSpaceLike.squaredNorm(); - } //! Norm2 > 0 - - /* this is not numerically stable - bool IsPhotonlike() const { - return GetTimeSquared() == fSpaceLike.squaredNorm(); - } //! Norm2 == 0 - */ - - FourVector& operator+=(const FourVector& b) { - fTimeLike += b.fTimeLike; - fSpaceLike += b.fSpaceLike; - return *this; - } - - FourVector& operator-=(const FourVector& b) { - fTimeLike -= b.fTimeLike; - fSpaceLike -= b.fSpaceLike; - return *this; - } - - FourVector& operator*=(const double b) { - fTimeLike *= b; - fSpaceLike *= b; - return *this; - } - - FourVector& operator/=(const double b) { - fTimeLike /= b; - fSpaceLike.GetComponents() /= b; // TODO: WHY IS THIS?????? - return *this; - } - - FourVector& operator/(const double b) { - *this /= b; - return *this; - } - - /** - Note that the product between two 4-vectors assumes that you use - the same "c" convention for both. Only the LHS vector is checked - for this. You cannot mix different conventions due to - unit-checking. - */ - SpaceType operator*(const FourVector& b) { - if constexpr (std::is_same<typename std::decay<TimeType>::type, - decltype(std::declval<SpaceType>() / - corsika::units::si::meter * - corsika::units::si::second)>::value) - return fTimeLike * b.fTimeLike * - (corsika::units::constants::c * corsika::units::constants::c) - - fSpaceLike.norm(); - else - return fTimeLike * fTimeLike - fSpaceLike.norm(); - } - - private: - /** - This function is automatically compiled to use of ignore the - extra factor of "c" for the time-like quantity - */ - auto GetTimeSquared() const { - if constexpr (std::is_same<typename std::decay<TimeType>::type, - decltype(std::declval<SpaceType>() / - corsika::units::si::meter * - corsika::units::si::second)>::value) - return fTimeLike * fTimeLike * - (corsika::units::constants::c * corsika::units::constants::c); - else - return fTimeLike * fTimeLike; - } - - protected: - //! the data members - TimeType fTimeLike; - SpaceVecType fSpaceLike; - - //! the friends: math operators - template <typename T, typename U> - friend FourVector<typename std::decay<T>::type, typename std::decay<U>::type> - operator+(const FourVector<T, U>&, const FourVector<T, U>&); - - template <typename T, typename U> - friend FourVector<typename std::decay<T>::type, typename std::decay<U>::type> - operator-(const FourVector<T, U>&, const FourVector<T, U>&); - - template <typename T, typename U> - friend FourVector<typename std::decay<T>::type, typename std::decay<U>::type> - operator*(const FourVector<T, U>&, const double); - - template <typename T, typename U> - friend FourVector<typename std::decay<T>::type, typename std::decay<U>::type> - operator/(const FourVector<T, U>&, const double); - }; - - /** - The math operator+ - */ - template <typename TimeType, typename SpaceVecType> - inline FourVector<typename std::decay<TimeType>::type, - typename std::decay<SpaceVecType>::type> - operator+(const FourVector<TimeType, SpaceVecType>& a, - const FourVector<TimeType, SpaceVecType>& b) { - return FourVector<typename std::decay<TimeType>::type, - typename std::decay<SpaceVecType>::type>( - a.fTimeLike + b.fTimeLike, a.fSpaceLike + b.fSpaceLike); - } - - /** - The math operator- - */ - template <typename TimeType, typename SpaceVecType> - inline FourVector<typename std::decay<TimeType>::type, - typename std::decay<SpaceVecType>::type> - operator-(const FourVector<TimeType, SpaceVecType>& a, - const FourVector<TimeType, SpaceVecType>& b) { - return FourVector<typename std::decay<TimeType>::type, - typename std::decay<SpaceVecType>::type>( - a.fTimeLike - b.fTimeLike, a.fSpaceLike - b.fSpaceLike); - } - - /** - The math operator* - */ - template <typename TimeType, typename SpaceVecType> - inline FourVector<typename std::decay<TimeType>::type, - typename std::decay<SpaceVecType>::type> - operator*(const FourVector<TimeType, SpaceVecType>& a, const double b) { - return FourVector<typename std::decay<TimeType>::type, - typename std::decay<SpaceVecType>::type>(a.fTimeLike * b, - a.fSpaceLike * b); - } - - /** - The math operator/ - */ - template <typename TimeType, typename SpaceVecType> - inline FourVector<typename std::decay<TimeType>::type, - typename std::decay<SpaceVecType>::type> - operator/(const FourVector<TimeType, SpaceVecType>& a, const double b) { - return FourVector<typename std::decay<TimeType>::type, - typename std::decay<SpaceVecType>::type>(a.fTimeLike / b, - a.fSpaceLike / b); - } - -} // namespace corsika::geometry diff --git a/Framework/Geometry/Helix.h b/Framework/Geometry/Helix.h deleted file mode 100644 index 5deaa0822..000000000 --- a/Framework/Geometry/Helix.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> -#include <cmath> - -namespace corsika::geometry { - /*! - * A Helix is defined by the cyclotron frequency \f$ \omega_c \f$, the initial - * Point r0 and - * the velocity vectors \f$ \vec{v}_{\parallel} \f$ and \f$ \vec{v}_{\perp} \f$ - * denoting the projections of the initial velocity \f$ \vec{v}_0 \f$ parallel - * and perpendicular to the axis \f$ \vec{B} \f$, respectively, i.e. - * \f{align*}{ - \vec{v}_{\parallel} &= \frac{\vec{v}_0 \cdot \vec{B}}{\vec{B}^2} \vec{B} \\ - \vec{v}_{\perp} &= \vec{v}_0 - \vec{v}_{\parallel} - \f} - */ - - class Helix { - - using VelocityVec = Vector<corsika::units::si::SpeedType::dimension_type>; - - Point const r0; - corsika::units::si::FrequencyType const omegaC; - VelocityVec const vPar; - VelocityVec const vPerp, uPerp; - - corsika::units::si::LengthType const radius; - - public: - Helix(Point const& pR0, corsika::units::si::FrequencyType pOmegaC, - VelocityVec const& pvPar, VelocityVec const& pvPerp) - : r0(pR0) - , omegaC(pOmegaC) - , vPar(pvPar) - , vPerp(pvPerp) - , uPerp(vPerp.cross(vPar.normalized())) - , radius(pvPar.norm() / abs(pOmegaC)) {} - - Point GetPosition(corsika::units::si::TimeType t) const { - return r0 + vPar * t + - (vPerp * (cos(omegaC * t) - 1) + uPerp * sin(omegaC * t)) / omegaC; - } - - VelocityVec GetVelocity(corsika::units::si::TimeType t) const { - return vPar + (vPerp * (cos(omegaC * t) - 1) + uPerp * sin(omegaC * t)); - } - - Point PositionFromArclength(corsika::units::si::LengthType l) const { - return GetPosition(TimeFromArclength(l)); - } - - auto GetRadius() const { return radius; } - - corsika::units::si::LengthType ArcLength(corsika::units::si::TimeType t1, - corsika::units::si::TimeType t2) const { - return (vPar + vPerp).norm() * (t2 - t1); - } - - corsika::units::si::TimeType TimeFromArclength( - corsika::units::si::LengthType l) const { - return l / (vPar + vPerp).norm(); - } - }; - -} // namespace corsika::geometry diff --git a/Framework/Geometry/Line.h b/Framework/Geometry/Line.h deleted file mode 100644 index f54b02dbd..000000000 --- a/Framework/Geometry/Line.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> - -namespace corsika::geometry { - - /** - * \class Line - * - * A Line describes a movement in three dimensional space. It - * consists of a Point `$\vec{p_0}$` and and a speed-Vector - * `$\vec{v}$`, so that it can return GetPosition as - * `$\vec{p_0}*\vec{v}*t$` for any value of time `$t$`. - * - **/ - - class Line { - - using VelocityVec = Vector<corsika::units::si::SpeedType::dimension_type>; - - Point const r0; - VelocityVec const v0; - - public: - Line() = delete; - Line(const Line&) = default; - Line(Line&&) = default; - Line& operator=(const Line&) = delete; - Line(Point const& pR0, VelocityVec const& pV0) - : r0(pR0) - , v0(pV0) {} - - Point GetPosition(corsika::units::si::TimeType t) const { return r0 + v0 * t; } - VelocityVec GetVelocity(corsika::units::si::TimeType) const { return v0; } - - Point PositionFromArclength(corsika::units::si::LengthType l) const { - return r0 + v0.normalized() * l; - } - - LengthType ArcLength(corsika::units::si::TimeType t1, - corsika::units::si::TimeType t2) const { - return v0.norm() * (t2 - t1); - } - - corsika::units::si::TimeType TimeFromArclength( - corsika::units::si::LengthType t) const { - return t / v0.norm(); - } - - auto GetR0() const { return r0; } - auto GetV0() const { return v0; } - }; - -} // namespace corsika::geometry diff --git a/Framework/Geometry/Point.h b/Framework/Geometry/Point.h deleted file mode 100644 index 20e46032c..000000000 --- a/Framework/Geometry/Point.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/geometry/BaseVector.h> -#include <corsika/geometry/QuantityVector.h> -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> - -namespace corsika::geometry { - - using corsika::units::si::length_d; - using corsika::units::si::LengthType; - - /*! - * A Point represents a point in position space. It is defined by its - * coordinates with respect to some CoordinateSystem. - */ - class Point : public BaseVector<length_d> { - public: - Point(CoordinateSystem const& pCS, QuantityVector<length_d> pQVector) - : BaseVector<length_d>(pCS, pQVector) {} - - Point(CoordinateSystem const& cs, LengthType x, LengthType y, LengthType z) - : BaseVector<length_d>(cs, {x, y, z}) {} - - // TODO: this should be private or protected, we don NOT want to expose numbers - // without reference to outside: - auto GetCoordinates() const { return BaseVector<length_d>::qVector; } - auto GetX() const { return BaseVector<length_d>::qVector.GetX(); } - auto GetY() const { return BaseVector<length_d>::qVector.GetY(); } - auto GetZ() const { return BaseVector<length_d>::qVector.GetZ(); } - - /// this always returns a QuantityVector as triple - auto GetCoordinates(CoordinateSystem const& pCS) const { - if (&pCS == BaseVector<length_d>::cs) { - return BaseVector<length_d>::qVector; - } else { - return QuantityVector<length_d>( - CoordinateSystem::GetTransformation(*BaseVector<length_d>::cs, pCS) * - BaseVector<length_d>::qVector.eVector); - } - } - - /*! - * transforms the Point into another CoordinateSystem by changing its - * coordinates interally - */ - void rebase(CoordinateSystem const& pCS) { - BaseVector<length_d>::qVector = GetCoordinates(pCS); - BaseVector<length_d>::cs = &pCS; - } - - Point operator+(Vector<length_d> const& pVec) const { - return Point(*BaseVector<length_d>::cs, - GetCoordinates() + pVec.GetComponents(*BaseVector<length_d>::cs)); - } - - /*! - * returns the distance Vector between two points - */ - Vector<length_d> operator-(Point const& pB) const { - auto& cs = *BaseVector<length_d>::cs; - return Vector<length_d>(cs, GetCoordinates() - pB.GetCoordinates(cs)); - } - }; - -} // namespace corsika::geometry diff --git a/Framework/Geometry/QuantityVector.h b/Framework/Geometry/QuantityVector.h deleted file mode 100644 index b45138bf7..000000000 --- a/Framework/Geometry/QuantityVector.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/units/PhysicalUnits.h> - -#include <Eigen/Dense> - -#include <iostream> -#include <utility> - -namespace corsika::geometry { - - /*! - * A QuantityVector is a three-component container based on Eigen::Vector3d - * with a phys::units::si::dimension. Arithmethic operators are defined that - * propagate the dimensions by dimensional analysis. - */ - - template <typename dim> - class QuantityVector { - public: - using Quantity = phys::units::quantity<dim, double>; //< the phys::units::quantity - // corresponding to the dimension - - public: - Eigen::Vector3d eVector; //!< the actual container where the raw numbers are stored - - typedef dim dimension; //!< should be a phys::units::dimension - - QuantityVector(Quantity a, Quantity b, Quantity c) - : eVector{a.magnitude(), b.magnitude(), c.magnitude()} {} - - QuantityVector(double a, double b, double c) - : eVector{a, b, c} { - static_assert( - std::is_same_v<dim, phys::units::dimensionless_d>, - "initialization of dimensionful QuantityVector with pure numbers not allowed!"); - } - - QuantityVector(Eigen::Vector3d pBareVector) - : eVector(pBareVector) {} - - auto operator[](size_t index) const { - return Quantity(phys::units::detail::magnitude_tag, eVector[index]); - } - - auto GetX() const { return (*this)[0]; } - - auto GetY() const { return (*this)[1]; } - - auto GetZ() const { return (*this)[2]; } - - auto norm() const { - return Quantity(phys::units::detail::magnitude_tag, eVector.norm()); - } - - auto squaredNorm() const { - using QuantitySquared = - decltype(std::declval<Quantity>() * std::declval<Quantity>()); - return QuantitySquared(phys::units::detail::magnitude_tag, eVector.squaredNorm()); - } - - auto operator+(QuantityVector<dim> const& pQVec) const { - return QuantityVector<dim>(eVector + pQVec.eVector); - } - - auto operator-(QuantityVector<dim> const& pQVec) const { - return QuantityVector<dim>(eVector - pQVec.eVector); - } - - template <typename ScalarDim> - auto operator*(phys::units::quantity<ScalarDim, double> const p) const { - using ResQuantity = phys::units::detail::Product<ScalarDim, dim, double, double>; - - if constexpr (std::is_same<ResQuantity, double>::value) // result dimensionless, not - // a "Quantity" anymore - { - return QuantityVector<phys::units::dimensionless_d>(eVector * p.magnitude()); - } else { - return QuantityVector<typename ResQuantity::dimension_type>(eVector * - p.magnitude()); - } - } - - template <typename ScalarDim> - auto operator/(phys::units::quantity<ScalarDim, double> const p) const { - return (*this) * (1 / p); - } - - auto operator*(double const p) const { return QuantityVector<dim>(eVector * p); } - - auto operator/(double const p) const { return QuantityVector<dim>(eVector / p); } - - auto& operator/=(double const p) { - eVector /= p; - return *this; - } - - auto& operator*=(double const p) { - eVector *= p; - return *this; - } - - auto& operator+=(QuantityVector<dim> const& pQVec) { - eVector += pQVec.eVector; - return *this; - } - - auto& operator-=(QuantityVector<dim> const& pQVec) { - eVector -= pQVec.eVector; - return *this; - } - - auto& operator-() const { return QuantityVector<dim>(-eVector); } - - auto normalized() const { return QuantityVector<dim>(eVector.normalized()); } - - auto operator==(QuantityVector<dim> const& p) const { return eVector == p.eVector; } - }; - - template <typename dim> - auto& operator<<(std::ostream& os, corsika::geometry::QuantityVector<dim> qv) { - using Quantity = phys::units::quantity<dim, double>; - - os << '(' << qv.eVector(0) << ' ' << qv.eVector(1) << ' ' << qv.eVector(2) << ") " - << phys::units::to_unit_symbol<dim, double>( - Quantity(phys::units::detail::magnitude_tag, 1)); - return os; - } - -} // namespace corsika::geometry diff --git a/Framework/Geometry/Sphere.h b/Framework/Geometry/Sphere.h deleted file mode 100644 index a2a77efec..000000000 --- a/Framework/Geometry/Sphere.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Volume.h> -#include <corsika/geometry/Line.h> -#include <corsika/units/PhysicalUnits.h> - -namespace corsika::geometry { - - class Sphere : public Volume { - Point const fCenter; - LengthType const fRadius; - - public: - Sphere(Point const& pCenter, LengthType const pRadius) - : fCenter(pCenter) - , fRadius(pRadius) {} - - //! returns true if the Point p is within the sphere - bool Contains(Point const& p) const override { - return fRadius * fRadius > (fCenter - p).squaredNorm(); - } - - const Point& GetCenter() const { return fCenter; } - LengthType GetRadius() const { return fRadius; } - }; - -} // namespace corsika::geometry diff --git a/Framework/Geometry/Trajectory.h b/Framework/Geometry/Trajectory.h deleted file mode 100644 index 1580a0db3..000000000 --- a/Framework/Geometry/Trajectory.h +++ /dev/null @@ -1,261 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Point.h> -#include <corsika/units/PhysicalUnits.h> - -namespace corsika::geometry { - - /** - * \class LineTrajectory - * - * A Trajectory is a description of a momvement of an object in - * three-dimensional space that describes the trajectory (connection - * between two Points in space), as well as the direction of motion - * at any given point. - * - * A Trajectory has a start `0` and an end `1`, where - * e.g. GetPosition(0) returns the start point and GetDirection(1) - * the direction of motion at the end. Values outside 0...1 are not - * defined. - * - * A Trajectory has a length in [m], GetLength, a duration in [s], GetDuration. - * - * Note: so far it is assumed that the speed (d|vec{r}|/dt) between - * start and end does not change and is constant for the entire - * Trajectory. - * - **/ - - class LineTrajectory { - - using VelocityVec = Vector<corsika::units::si::SpeedType::dimension_type>; - - public: - LineTrajectory() = delete; - LineTrajectory(const LineTrajectory&) = default; - LineTrajectory(LineTrajectory&&) = default; - LineTrajectory& operator=(const LineTrajectory&) = delete; - - /** - * \param theLine The geometric \sa Line object that represents a straight-line - * connection - * - * \param timeLength The time duration to traverse the straight trajectory - * in units of \sa TimeType - */ - LineTrajectory(Line const& theLine, corsika::units::si::TimeType timeLength) - : line_(theLine) - , timeLength_(timeLength) - , timeStep_(timeLength) - , initialVelocity_(theLine.GetVelocity(corsika::units::si::TimeType::zero())) - , finalVelocity_(theLine.GetVelocity(timeLength)) {} - - /** - * \param theLine The geometric \sa Line object that represents a straight-line - * connection - * - * \param timeLength The time duration to traverse the straight trajectory - * in units of \sa TimeType - * - * \param timeStep Time duration to folow eventually curved - * trajectory in units of \sa TimesType - * - * \param initialV Initial velocity vector at - * start of trajectory \param finalV Final velocity vector at start of trajectory - */ - LineTrajectory( - Line const& theLine, - corsika::units::si::TimeType timeLength, // length of theLine (straight) - corsika::units::si::TimeType timeStep, // length of bend step (curved) - const VelocityVec& initialV, const VelocityVec& finalV) - : line_(theLine) - , timeLength_(timeLength) - , timeStep_(timeStep) - , initialVelocity_(initialV) - , finalVelocity_(finalV) {} - - const Line& GetLine() const { return line_; } - Point GetPosition(double u) const { return line_.GetPosition(timeLength_ * u); } - VelocityVec GetVelocity(double u) const { - return initialVelocity_ * (1 - u) + finalVelocity_ * u; - } - Vector<corsika::units::si::dimensionless_d> GetDirection(double u) const { - return GetVelocity(u).normalized(); - } - - ///! duration along potentially bend trajectory - corsika::units::si::TimeType GetDuration(double u = 1) const { return u * timeStep_; } - - ///! total length along potentially bend trajectory - corsika::units::si::LengthType GetLength(double u = 1) const { - using namespace corsika::units::si; - if (timeLength_ == 0_s) return 0_m; - if (timeStep_ == - std::numeric_limits<corsika::units::si::TimeType::value_type>::infinity() * 1_s) - return std::numeric_limits< - corsika::units::si::LengthType::value_type>::infinity() * - 1_m; - return GetDistance(u) * timeStep_ / timeLength_; - } - - ///! set new duration along potentially bend trajectory. - void SetLength(corsika::units::si::LengthType limit) { - SetDuration(line_.TimeFromArclength(limit)); - } - - ///! set new duration along potentially bend trajectory. - // Scale other properties by "limit/timeLength_" - void SetDuration(corsika::units::si::TimeType limit) { - using namespace corsika::units::si; - if (timeStep_ == 0_s) { - timeLength_ = 0_s; - SetFinalVelocity(GetVelocity(0)); - timeStep_ = limit; - } else { - // for infinite steps there can't be a difference between - // curved and straight trajectory, this is fundamentally - // undefined: assume they are the same (which, i.e. is always correct for a - // straight line trajectory). - // - // Final note: only straight-line trajectories should have - // infinite steps! Everything else is ill-defined. - if (timeStep_ == std::numeric_limits< - corsika::units::si::TimeType::value_type>::infinity() * - 1_s || - timeLength_ == std::numeric_limits< - corsika::units::si::TimeType::value_type>::infinity() * - 1_s) { - timeLength_ = limit; - timeStep_ = limit; - // ...and don't touch velocity - } else { - const double scale = limit / timeStep_; - timeLength_ *= scale; - SetFinalVelocity(GetVelocity(scale)); - timeStep_ = limit; - } - } - } - - protected: - ///! total length along straight trajectory - corsika::units::si::LengthType GetDistance(double u) const { - assert(u <= 1); - assert(u >= 0); - return line_.ArcLength(0 * corsika::units::si::second, u * timeLength_); - } - - void SetFinalVelocity(const VelocityVec& v) { finalVelocity_ = v; } - - private: - Line line_; - corsika::units::si::TimeType - timeLength_; ///! length of straight step (shortest connecting line) - corsika::units::si::TimeType timeStep_; ///! length of bend step (curved) - VelocityVec initialVelocity_; - VelocityVec finalVelocity_; - }; - - /** - * \class LeapFrogTrajectory - * - * - **/ - - class LeapFrogTrajectory { - - using VelocityVec = Vector<corsika::units::si::SpeedType::dimension_type>; - typedef corsika::geometry::Vector<corsika::units::si::magnetic_flux_density_d> - MagneticFieldVector; - - public: - LeapFrogTrajectory() = delete; - LeapFrogTrajectory(const LeapFrogTrajectory&) = default; - LeapFrogTrajectory(LeapFrogTrajectory&&) = default; - LeapFrogTrajectory& operator=(const LeapFrogTrajectory&) = delete; - LeapFrogTrajectory(const Point& pos, const VelocityVec& initialVelocity, - MagneticFieldVector Bfield, - const decltype(square(corsika::units::si::meter) / - (square(corsika::units::si::second) * - corsika::units::si::volt)) k, - corsika::units::si::TimeType timeStep) // leap-from total length - : initialPosition_(pos) - , initialVelocity_(initialVelocity) - , initialDirection_(initialVelocity.normalized()) - , magneticfield_(Bfield) - , k_(k) - , timeStep_(timeStep) {} - - const Line GetLine() const { - using namespace corsika::units::si; - auto D = GetPosition(1) - GetPosition(0); - auto d = D.norm(); - auto v = initialVelocity_; - if (d>1_um) { // if trajectory is ultra-short, we do not - // re-calculate velocity, just use initial - // value. Otherwise, this is numerically unstable - v = D/d * GetVelocity(0).norm(); - } - return Line(GetPosition(0), v); - } - Point GetPosition(double u) const { - Point position = initialPosition_ + initialVelocity_ * timeStep_ * u / 2; - VelocityVec velocity = - initialVelocity_ + initialVelocity_.cross(magneticfield_) * timeStep_ * u * k_; - return position + velocity * timeStep_ * u / 2; - } - VelocityVec GetVelocity(double u) const { - return initialVelocity_ + - initialVelocity_.cross(magneticfield_) * timeStep_ * u * k_; - } - - Vector<corsika::units::si::dimensionless_d> GetDirection(double u) const { - return GetVelocity(u).normalized(); - } - - ///! duration along potentially bend trajectory - corsika::units::si::TimeType GetDuration(double u = 1) const { - return u * timeStep_ * - (double(GetVelocity(u).norm() / initialVelocity_.norm()) + 1.0) / 2; - } - - ///! total length along potentially bend trajectory - corsika::units::si::LengthType GetLength(double u = 1) const { - using namespace corsika::units::si; - return timeStep_ * initialVelocity_.norm() * u; - } - - ///! set new duration along potentially bend trajectory. - void SetLength(corsika::units::si::LengthType limit) { - using namespace corsika::units::si; - if (initialVelocity_.norm() == 0_m / 1_s) SetDuration(0_s); - SetDuration(limit / initialVelocity_.norm()); - } - - ///! set new duration along potentially bend trajectory. - // Scale other properties by "limit/timeLength_" - void SetDuration(corsika::units::si::TimeType limit) { - using namespace corsika::units::si; - timeStep_ = limit; - } - - private: - Point initialPosition_; - VelocityVec initialVelocity_; - geometry::Vector<corsika::units::si::dimensionless_d> initialDirection_; - MagneticFieldVector magneticfield_; - decltype(square(corsika::units::si::meter) / - (square(corsika::units::si::second) * corsika::units::si::volt)) k_; - corsika::units::si::TimeType timeStep_; - }; - -} // namespace corsika::geometry diff --git a/Framework/Geometry/Vector.h b/Framework/Geometry/Vector.h deleted file mode 100644 index 8be8fcfef..000000000 --- a/Framework/Geometry/Vector.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/geometry/BaseVector.h> -#include <corsika/geometry/QuantityVector.h> - -#include <corsika/units/PhysicalUnits.h> - -/*! - * A Vector represents a 3-vector in Euclidean space. It is defined by components - * given in a specific CoordinateSystem. It has a physical dimension ("unit") - * as part of its type, so you cannot mix up e.g. electric with magnetic fields - * (but you could calculate their cross-product to get an energy flux vector). - * - * When transforming coordinate systems, a Vector is subject to the rotational - * part only and invariant under translations. - */ - -namespace corsika::geometry { - - template <typename dim> - class Vector : public BaseVector<dim> { - public: - using Quantity = phys::units::quantity<dim, double>; - - public: - Vector(CoordinateSystem const& pCS, QuantityVector<dim> pQVector) - : BaseVector<dim>(pCS, pQVector) {} - - Vector(CoordinateSystem const& cs, Quantity x, Quantity y, Quantity z) - : BaseVector<dim>(cs, QuantityVector<dim>(x, y, z)) {} - - /*! - * returns a QuantityVector with the components given in the "home" - * CoordinateSystem of the Vector - */ - auto GetComponents() const { return BaseVector<dim>::qVector; } - - /*! - * returns a QuantityVector with the components given in an arbitrary - * CoordinateSystem - */ - auto GetComponents(CoordinateSystem const& pCS) const { - if (&pCS == BaseVector<dim>::cs) { - return BaseVector<dim>::qVector; - } else { - return QuantityVector<dim>( - CoordinateSystem::GetTransformation(*BaseVector<dim>::cs, pCS).linear() * - BaseVector<dim>::qVector.eVector); - } - } - - /*! - * transforms the Vector into another CoordinateSystem by changing - * its components internally - */ - void rebase(CoordinateSystem const& pCS) { - BaseVector<dim>::qVector = GetComponents(pCS); - BaseVector<dim>::cs = &pCS; - } - - /*! - * returns the norm/length of the Vector. Before using this method, - * think about whether squaredNorm() might be cheaper for your computation. - */ - auto norm() const { return BaseVector<dim>::qVector.norm(); } - auto GetNorm() const { return BaseVector<dim>::qVector.norm(); } - - /*! - * returns the squared norm of the Vector. Before using this method, - * think about whether norm() might be cheaper for your computation. - */ - auto squaredNorm() const { return BaseVector<dim>::qVector.squaredNorm(); } - auto GetSquaredNorm() const { return BaseVector<dim>::qVector.squaredNorm(); } - - /*! - * returns a Vector \f$ \vec{v}_{\parallel} \f$ which is the parallel projection - * of this vector \f$ \vec{v}_1 \f$ along another Vector \f$ \vec{v}_2 \f$ given by - * \f[ - * \vec{v}_{\parallel} = \frac{\vec{v}_1 \cdot \vec{v}_2}{\vec{v}_2^2} \vec{v}_2 - * \f] - */ - template <typename dim2> - auto parallelProjectionOnto(Vector<dim2> const& pVec, - CoordinateSystem const& pCS) const { - auto const ourCompVec = GetComponents(pCS); - auto const otherCompVec = pVec.GetComponents(pCS); - auto const& a = ourCompVec.eVector; - auto const& b = otherCompVec.eVector; - - return Vector<dim>(pCS, QuantityVector<dim>(b * ((a.dot(b)) / b.squaredNorm()))); - } - - template <typename dim2> - auto parallelProjectionOnto(Vector<dim2> const& pVec) const { - return parallelProjectionOnto<dim2>(pVec, *BaseVector<dim>::cs); - } - - auto operator+(Vector<dim> const& pVec) const { - auto const components = - GetComponents(*BaseVector<dim>::cs) + pVec.GetComponents(*BaseVector<dim>::cs); - return Vector<dim>(*BaseVector<dim>::cs, components); - } - - auto operator-(Vector<dim> const& pVec) const { - auto const components = GetComponents() - pVec.GetComponents(*BaseVector<dim>::cs); - return Vector<dim>(*BaseVector<dim>::cs, components); - } - - auto& operator*=(double const p) { - BaseVector<dim>::qVector *= p; - return *this; - } - - template <typename ScalarDim> - auto operator*(phys::units::quantity<ScalarDim, double> const p) const { - using ProdDim = phys::units::detail::product_d<dim, ScalarDim>; - - return Vector<ProdDim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p); - } - - template <typename ScalarDim> - auto operator/(phys::units::quantity<ScalarDim, double> const p) const { - return (*this) * (1 / p); - } - - auto operator*(double const p) const { - return Vector<dim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p); - } - - auto operator/(double const p) const { - return Vector<dim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector / p); - } - - auto& operator+=(Vector<dim> const& pVec) { - BaseVector<dim>::qVector += pVec.GetComponents(*BaseVector<dim>::cs); - return *this; - } - - auto& operator-=(Vector<dim> const& pVec) { - BaseVector<dim>::qVector -= pVec.GetComponents(*BaseVector<dim>::cs); - return *this; - } - - auto& operator-() const { - return Vector<dim>(*BaseVector<dim>::cs, -BaseVector<dim>::qVector); - } - - auto normalized() const { return (*this) * (1 / norm()); } - - template <typename dim2> - auto cross(Vector<dim2> pV) const { - auto const c1 = GetComponents().eVector; - auto const c2 = pV.GetComponents(*BaseVector<dim>::cs).eVector; - auto const bareResult = c1.cross(c2); - - using ProdDim = phys::units::detail::product_d<dim, dim2>; - return Vector<ProdDim>(*BaseVector<dim>::cs, bareResult); - } - - template <typename dim2> - auto dot(Vector<dim2> pV) const { - auto const c1 = GetComponents().eVector; - auto const c2 = pV.GetComponents(*BaseVector<dim>::cs).eVector; - auto const bareResult = c1.dot(c2); - - using ProdDim = phys::units::detail::product_d<dim, dim2>; - - return phys::units::quantity<ProdDim, double>(phys::units::detail::magnitude_tag, - bareResult); - } - }; - -} // namespace corsika::geometry diff --git a/Framework/Logging/CMakeLists.txt b/Framework/Logging/CMakeLists.txt deleted file mode 100644 index 8aa0abe3c..000000000 --- a/Framework/Logging/CMakeLists.txt +++ /dev/null @@ -1,51 +0,0 @@ -# create the library -add_library (CORSIKAlogging INTERFACE) - -# namespace of library -> location of header files -set ( - CORSIKAlogging_NAMESPACE - corsika/logging - ) - -# header files of this library -set ( - CORSIKAlogging_HEADERS - Logging.h - ) - -# copy the headers into the namespace -CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAlogging - ${CORSIKAlogging_NAMESPACE} - ${CORSIKAlogging_HEADERS} - ) - -# include directive for upstream code -target_include_directories ( - CORSIKAlogging - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/> - ) - -# and link against spdlog -target_link_libraries( - CORSIKAlogging - INTERFACE - spdlog::spdlog -) - -# install library -install ( - FILES ${CORSIKAlogging_HEADERS} - DESTINATION include/${CORSIKAlogging_NAMESPACE} - ) - -# ---------------- -# code unit testing - -CORSIKA_ADD_TEST (testLogging) -target_link_libraries ( - testLogging - CORSIKAlogging - CORSIKAtesting - ) diff --git a/Framework/Particles/CMakeLists.txt b/Framework/Particles/CMakeLists.txt deleted file mode 100644 index 96d89ebeb..000000000 --- a/Framework/Particles/CMakeLists.txt +++ /dev/null @@ -1,93 +0,0 @@ -add_custom_command ( - OUTPUT ${PROJECT_BINARY_DIR}/Framework/Particles/GeneratedParticleProperties.inc - ${PROJECT_BINARY_DIR}/Framework/Particles/particle_db.pkl - COMMAND ${PROJECT_SOURCE_DIR}/Framework/Particles/pdxml_reader.py - ${PROJECT_SOURCE_DIR}/Framework/Particles/ParticleData.xml - ${PROJECT_SOURCE_DIR}/Framework/Particles/NuclearData.xml - ${PROJECT_SOURCE_DIR}/Framework/Particles/ParticleClassNames.xml - DEPENDS pdxml_reader.py - ParticleData.xml - NuclearData.xml - ParticleClassNames.xml - WORKING_DIRECTORY - ${PROJECT_BINARY_DIR}/Framework/Particles/ - COMMENT "Read PYTHIA8 particle data and produce C++ source code GeneratedParticleProperties.inc" - VERBATIM - ) - -set ( - PARTICLE_SOURCES - ParticleProperties.cc - ) - -# all public header files of library, includes automatic generated file(s) -set ( - PARTICLE_HEADERS - ParticleProperties.h - ${PROJECT_BINARY_DIR}/Framework/Particles/GeneratedParticleProperties.inc # this one is auto-generated - ) - -set ( - PARTICLE_NAMESPACE - corsika/particles - ) - -add_library (CORSIKAparticles STATIC ${PARTICLE_SOURCES}) - -CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAparticles ${PARTICLE_NAMESPACE} ${PARTICLE_HEADERS}) - -# .................................................... -# since GeneratedParticleProperties.inc is an automatically produced file in the build directory, -# create a symbolic link into the source tree, so that it can be found and edited more easily -# this is not needed for the build to succeed! ....... -add_custom_command ( - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/GeneratedParticleProperties.inc - COMMAND ${CMAKE_COMMAND} -E create_symlink ${PROJECT_BINARY_DIR}/include/corsika/particles/GeneratedParticleProperties.inc ${CMAKE_CURRENT_SOURCE_DIR}/GeneratedParticleProperties.inc - COMMENT "Generate link in source-dir: ${CMAKE_CURRENT_SOURCE_DIR}/GeneratedParticleProperties.inc" - ) -add_custom_target (SourceDirLink DEPENDS ${PROJECT_BINARY_DIR}/Framework/Particles/GeneratedParticleProperties.inc) -add_dependencies (CORSIKAparticles SourceDirLink) -# ..................................................... - -target_link_libraries ( - CORSIKAparticles - PUBLIC - CORSIKAunits - CORSIKAlogging - ) - -set_target_properties ( - CORSIKAparticles - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 - PUBLIC_HEADER "${PARTICLE_HEADERS}" - ) - -target_include_directories ( - CORSIKAparticles - PUBLIC - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include> - ) - -install ( - FILES - ${PARTICLE_HEADERS} - DESTINATION - include/${PARTICLE_NAMESPACE} - ) - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST(testParticles - SOURCES - testParticles.cc - ${PROJECT_BINARY_DIR}/Framework/Particles/GeneratedParticleProperties.inc -) -target_link_libraries ( - testParticles - CORSIKAparticles - CORSIKAunits - CORSIKAtesting - ) diff --git a/Framework/Particles/particles.dox b/Framework/Particles/particles.dox deleted file mode 100644 index 22a36c59f..000000000 --- a/Framework/Particles/particles.dox +++ /dev/null @@ -1,15 +0,0 @@ -/** -@page Particles Particle properties - -The properties of all particles are saved in static and flat -arrays. There is a enum corsika::particles::Code to identify each -particles, and each individual particles has its own static class, -which can be used to retrieve its physical properties. - - - -See namespace corsika::particles for all classes. - - - -*/ \ No newline at end of file diff --git a/Framework/ProcessSequence/CMakeLists.txt b/Framework/ProcessSequence/CMakeLists.txt deleted file mode 100644 index 7a7554893..000000000 --- a/Framework/ProcessSequence/CMakeLists.txt +++ /dev/null @@ -1,82 +0,0 @@ -add_library (CORSIKAprocesssequence INTERFACE) - -#namespace of library->location of header files -set ( - CORSIKAprocesssequence_NAMESPACE - corsika/process - ) - -#header files of this library -set ( - CORSIKAprocesssequence_HEADERS - BaseProcess.h - BoundaryCrossingProcess.h - ContinuousProcess.h - SecondariesProcess.h - InteractionProcess.h - StackProcess.h - DecayProcess.h - ProcessSequence.h - SwitchProcessSequence.h - ProcessReturn.h - ProcessTraits.h - NullModel.h - ) - -CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAprocesssequence ${CORSIKAprocesssequence_NAMESPACE} ${CORSIKAprocesssequence_HEADERS}) - -#include directive for upstream code -target_link_libraries ( - CORSIKAprocesssequence - INTERFACE - CORSIKAsetup - CORSIKAlogging - ) - -target_include_directories ( - CORSIKAprocesssequence - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/> - ) - -#install library -install ( - FILES ${CORSIKAprocesssequence_HEADERS} - DESTINATION include/${CORSIKAprocesssequence_NAMESPACE} - ) - -target_link_libraries ( - CORSIKAprocesssequence - INTERFACE - CORSIKAenvironment -) - -#-- -- -- -- -- -- -- -- -#code unit testing -CORSIKA_ADD_TEST (testProcessSequence) -target_link_libraries ( - testProcessSequence - CORSIKAgeometry - CORSIKAprocesssequence - CORSIKAtesting - ) - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST (testNullModel) -target_link_libraries ( - testNullModel - CORSIKAsetup - CORSIKAgeometry - CORSIKAunits - CORSIKAtesting - ) - -# # CORSIKA_ADD_TEST (testSwitchProcessSequence) -# # target_link_libraries ( -# # testSwitchProcessSequence -# # CORSIKAgeometry -# # CORSIKAprocesssequence -# # CORSIKAtesting -# # ) diff --git a/Framework/ProcessSequence/ProcessSequence.h b/Framework/ProcessSequence/ProcessSequence.h deleted file mode 100644 index 02a3d062e..000000000 --- a/Framework/ProcessSequence/ProcessSequence.h +++ /dev/null @@ -1,396 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/process/BaseProcess.h> -#include <corsika/process/ProcessTraits.h> -#include <corsika/process/BoundaryCrossingProcess.h> -#include <corsika/process/ContinuousProcess.h> -#include <corsika/process/DecayProcess.h> -#include <corsika/process/InteractionProcess.h> -#include <corsika/process/ProcessReturn.h> -#include <corsika/process/SecondariesProcess.h> -#include <corsika/process/StackProcess.h> -#include <corsika/process/NullModel.h> -#include <corsika/units/PhysicalUnits.h> -#include <corsika/logging/Logging.h> - -#include <cmath> -#include <limits> - -namespace corsika::process { - - /** - \class ProcessSequence - - A compile time static list of processes. The compiler will - generate a new type based on template logic containing all the - elements provided by the user. - - TProcess1 and TProcess2 must both be derived from BaseProcess, - and are both references if possible (lvalue), otherwise (rvalue) - they are just classes. This allows us to handle both, rvalue as - well as lvalue Processes in the ProcessSequence. - - \comment Using CRTP pattern, - https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern - */ - template <typename TProcess1, typename TProcess2 = NullModel> - class ProcessSequence : public BaseProcess<ProcessSequence<TProcess1, TProcess2>> { - - using TProcess1type = typename std::decay_t<TProcess1>; - using TProcess2type = typename std::decay_t<TProcess2>; - - static bool constexpr t1ProcSeq = is_process_sequence_v<TProcess1type>; - static bool constexpr t2ProcSeq = is_process_sequence_v<TProcess2type>; - - static bool constexpr t1SwitchProcSeq = is_switch_process_sequence_v<TProcess1type>; - static bool constexpr t2SwitchProcSeq = is_switch_process_sequence_v<TProcess2type>; - - // make sure only BaseProcess types TProcess1/2 are passed - static_assert(std::is_base_of_v<BaseProcess<TProcess1type>, TProcess1type>, - "can only use process derived from BaseProcess in " - "ProcessSequence, for Process 1"); - static_assert(std::is_base_of_v<BaseProcess<TProcess2type>, TProcess2type>, - "can only use process derived from BaseProcess in " - "ProcessSequence, for Process 2"); - - TProcess1 A_; // this is a reference, if possible - TProcess2 B_; // this is a reference, if possible - - public: - ProcessSequence(TProcess1 in_A, TProcess2 in_B) - : A_(in_A) - , B_(in_B) {} - - template <typename TParticle, typename TVTNType> - EProcessReturn DoBoundaryCrossing(TParticle& particle, TVTNType const& from, - TVTNType const& to) { - EProcessReturn ret = EProcessReturn::eOk; - - if constexpr (std::is_base_of_v<BoundaryCrossingProcess<TProcess1type>, - TProcess1type> || - t1ProcSeq) { - ret |= A_.DoBoundaryCrossing(particle, from, to); - } - - if constexpr (std::is_base_of_v<BoundaryCrossingProcess<TProcess2type>, - TProcess2type> || - t2ProcSeq) { - ret |= B_.DoBoundaryCrossing(particle, from, to); - } - - return ret; - } - - template <typename TParticle, typename TTrack> - inline EProcessReturn DoContinuous(TParticle& particle, TTrack& vT) { - EProcessReturn ret = EProcessReturn::eOk; - if constexpr (std::is_base_of_v<ContinuousProcess<TProcess1type>, TProcess1type> || - t1ProcSeq) { - ret |= A_.DoContinuous(particle, vT); - } - if constexpr (std::is_base_of_v<ContinuousProcess<TProcess2type>, TProcess2type> || - t2ProcSeq) { - if (!isAbsorbed(ret)) { ret |= B_.DoContinuous(particle, vT); } - } - return ret; - } - - template <typename TSecondaries> - inline void DoSecondaries(TSecondaries& vS) { - if constexpr (std::is_base_of_v<SecondariesProcess<TProcess1type>, TProcess1type> || - t1ProcSeq) { - A_.DoSecondaries(vS); - } - if constexpr (std::is_base_of_v<SecondariesProcess<TProcess2type>, TProcess2type> || - t2ProcSeq) { - B_.DoSecondaries(vS); - } - } - - /** - The processes of type StackProcess do have an internal counter, - so they can be exectuted only each N steps. Often these are - "maintenacne processes" that do not need to run after each - single step of the simulations. In the CheckStep function it is - tested if either A_ or B_ are StackProcess and if they are due - for execution. - */ - inline bool CheckStep() { - bool ret = false; - if constexpr (std::is_base_of_v<StackProcess<TProcess1type>, TProcess1type> || - (t1ProcSeq && !t1SwitchProcSeq)) { - ret |= A_.CheckStep(); - } - if constexpr (std::is_base_of_v<StackProcess<TProcess2type>, TProcess2type> || - (t2ProcSeq && !t2SwitchProcSeq)) { - ret |= B_.CheckStep(); - } - return ret; - } - - /** - Execute the StackProcess-es in the ProcessSequence - */ - template <typename TStack> - inline void DoStack(TStack& stack) { - if constexpr (std::is_base_of_v<StackProcess<TProcess1type>, TProcess1type> || - (t1ProcSeq && !t1SwitchProcSeq)) { - if (A_.CheckStep()) { A_.DoStack(stack); } - } - if constexpr (std::is_base_of_v<StackProcess<TProcess2type>, TProcess2type> || - (t2ProcSeq && !t2SwitchProcSeq)) { - if (B_.CheckStep()) { B_.DoStack(stack); } - } - } - - template <typename TParticle, typename TTrack> - inline corsika::units::si::LengthType MaxStepLength(TParticle& particle, - TTrack& vTrack) { - corsika::units::si::LengthType - max_length = // if no other process in the sequence implements it - std::numeric_limits<double>::infinity() * corsika::units::si::meter; - - if constexpr (std::is_base_of_v<ContinuousProcess<TProcess1type>, TProcess1type> || - t1ProcSeq) { - corsika::units::si::LengthType const len = A_.MaxStepLength(particle, vTrack); - max_length = std::min(max_length, len); - } - if constexpr (std::is_base_of_v<ContinuousProcess<TProcess2type>, TProcess2type> || - t2ProcSeq) { - corsika::units::si::LengthType const len = B_.MaxStepLength(particle, vTrack); - max_length = std::min(max_length, len); - } - return max_length; - } - - template <typename TParticle> - inline corsika::units::si::GrammageType GetInteractionLength(TParticle&& particle) { - return 1. / GetInverseInteractionLength(particle); - } - - template <typename TParticle> - inline corsika::units::si::InverseGrammageType GetInverseInteractionLength( - TParticle&& particle) { - using namespace corsika::units::si; - - InverseGrammageType tot = 0 * meter * meter / gram; // default value - - if constexpr (std::is_base_of_v<InteractionProcess<TProcess1type>, TProcess1type> || - t1ProcSeq) { - tot += A_.GetInverseInteractionLength(particle); - } - if constexpr (std::is_base_of_v<InteractionProcess<TProcess2type>, TProcess2type> || - t2ProcSeq) { - tot += B_.GetInverseInteractionLength(particle); - } - return tot; - } - - template <typename TSecondaryView> - inline EProcessReturn SelectInteraction( - TSecondaryView& view, - [[maybe_unused]] corsika::units::si::InverseGrammageType lambda_inv_select, - [[maybe_unused]] corsika::units::si::InverseGrammageType lambda_inv_sum = - corsika::units::si::InverseGrammageType::zero()) { - - // TODO: add check for lambda_inv_select>lambda_inv_tot - - if constexpr (t1ProcSeq) { - // if A is a process sequence --> check inside - const EProcessReturn ret = - A_.SelectInteraction(view, lambda_inv_select, lambda_inv_sum); - // if A_ did succeed, stop routine. Not checking other static branch B_. - if (ret != EProcessReturn::eOk) { return ret; } - } else if constexpr (std::is_base_of_v<InteractionProcess<TProcess1type>, - TProcess1type>) { - // if this is not a ContinuousProcess --> evaluate probability - const auto particle = view.parent(); - lambda_inv_sum += A_.GetInverseInteractionLength(particle); - // check if we should execute THIS process and then EXIT - if (lambda_inv_select <= lambda_inv_sum) { - A_.DoInteraction(view); - return EProcessReturn::eInteracted; - } - } // end branch A_ - - if constexpr (t2ProcSeq) { - // if B_ is a process sequence --> check inside - return B_.SelectInteraction(view, lambda_inv_select, lambda_inv_sum); - } else if constexpr (std::is_base_of_v<InteractionProcess<TProcess2type>, - TProcess2type>) { - // if this is not a ContinuousProcess --> evaluate probability - lambda_inv_sum += B_.GetInverseInteractionLength(view.parent()); - // check if we should execute THIS process and then EXIT - if (lambda_inv_select <= lambda_inv_sum) { - B_.DoInteraction(view); - return EProcessReturn::eInteracted; - } - } // end branch B_ - return EProcessReturn::eOk; - } - - template <typename TParticle> - inline corsika::units::si::TimeType GetLifetime(TParticle& particle) { - return 1. / GetInverseLifetime(particle); - } - - template <typename TParticle> - inline corsika::units::si::InverseTimeType GetInverseLifetime(TParticle&& particle) { - using namespace corsika::units::si; - - corsika::units::si::InverseTimeType tot = 0 / second; // default value - - if constexpr (std::is_base_of_v<DecayProcess<TProcess1type>, TProcess1type> || - t1ProcSeq) { - tot += A_.GetInverseLifetime(particle); - } - if constexpr (std::is_base_of_v<DecayProcess<TProcess2type>, TProcess2type> || - t2ProcSeq) { - tot += B_.GetInverseLifetime(particle); - } - return tot; - } - - // select decay process - template <typename TSecondaryView> - inline EProcessReturn SelectDecay( - TSecondaryView& view, - [[maybe_unused]] corsika::units::si::InverseTimeType decay_inv_select, - [[maybe_unused]] corsika::units::si::InverseTimeType decay_inv_sum = - corsika::units::si::InverseTimeType::zero()) { - - // TODO: add check for decay_inv_select>decay_inv_tot - - if constexpr (t1ProcSeq) { - // if A_ is a process sequence --> check inside - const EProcessReturn ret = A_.SelectDecay(view, decay_inv_select, decay_inv_sum); - // if A_ did succeed, stop routine here (not checking other static branch B_) - if (ret != EProcessReturn::eOk) { return ret; } - } else if constexpr (std::is_base_of_v<DecayProcess<TProcess1type>, - TProcess1type>) { - // if this is not a ContinuousProcess --> evaluate probability - decay_inv_sum += A_.GetInverseLifetime(view.parent()); - // check if we should execute THIS process and then EXIT - if (decay_inv_select <= decay_inv_sum) { // more pedagogical: rndm_select < - // decay_inv_sum / decay_inv_tot - A_.DoDecay(view); - return EProcessReturn::eDecayed; - } - } // end branch A_ - - if constexpr (t2ProcSeq) { - // if B_ is a process sequence --> check inside - return B_.SelectDecay(view, decay_inv_select, decay_inv_sum); - } else if constexpr (std::is_base_of_v<DecayProcess<TProcess2type>, - TProcess2type>) { - // if this is not a ContinuousProcess --> evaluate probability - decay_inv_sum += B_.GetInverseLifetime(view.parent()); - // check if we should execute THIS process and then EXIT - if (decay_inv_select <= decay_inv_sum) { - B_.DoDecay(view); - return EProcessReturn::eDecayed; - } - } // end branch B_ - return EProcessReturn::eOk; - } - }; - - /** - * \function sequence - * - * to construct ProcessSequences in a flexible and dynamic way the - * `sequence` factory functions are provided - * - * Any objects of type - * - BaseProcess, - * - ContinuousProcess, and - * - Interaction/DecayProcess, - * - StackProcess, - * - SecondariesProcess - * can be assembled into a ProcessSequence, all - * combinatorics are allowed. - - * The sequence function checks that all its arguments are all of - * types derived from BaseProcess. Also the ProcessSequence itself - * is derived from type BaseProcess - **/ - - template <typename... TProcesses, typename TProcess1> - inline typename std::enable_if_t< - std::is_base_of_v<BaseProcess<typename std::decay_t<TProcess1>>, - typename std::decay_t<TProcess1>>, - ProcessSequence<TProcess1, decltype(sequence(std::declval<TProcesses>()...))>> - sequence(TProcess1&& vA, TProcesses&&... vBs) { - return ProcessSequence<TProcess1, decltype(sequence(std::declval<TProcesses>()...))>( - vA, sequence(std::forward<TProcesses>(vBs)...)); - } - - template <typename TProcess1, typename TProcess2> - inline typename std::enable_if_t< - std::is_base_of_v<BaseProcess<typename std::decay_t<TProcess1>>, - typename std::decay_t<TProcess1>> && - std::is_base_of_v<BaseProcess<typename std::decay_t<TProcess2>>, - typename std::decay_t<TProcess2>>, - ProcessSequence<TProcess1, TProcess2>> - sequence(TProcess1&& vA, TProcess2&& vB) { - return ProcessSequence<TProcess1, TProcess2>(vA, vB); - } - - /** - * also allow a single Process in ProcessSequence, accompany by - * `NullModel` - **/ - template <typename TProcess> - inline typename std::enable_if_t< - std::is_base_of_v<BaseProcess<typename std::decay_t<TProcess>>, - typename std::decay_t<TProcess>>, - ProcessSequence<TProcess, NullModel>> - sequence(TProcess&& vA) { - return ProcessSequence<TProcess, NullModel>(vA, NullModel()); - } - - /** - * traits marker to identify objectas ProcessSequence - **/ - template <typename TProcess1, typename TProcess2> - struct is_process_sequence<ProcessSequence<TProcess1, TProcess2>> : std::true_type { - // only switch on for BaseProcesses - template <typename std::enable_if_t< - std::is_base_of_v<BaseProcess<typename std::decay_t<TProcess1>>, - typename std::decay_t<TProcess1>> && - std::is_base_of_v<BaseProcess<typename std::decay_t<TProcess2>>, - typename std::decay_t<TProcess2>>, - int>> - is_process_sequence() {} - }; - - /** - * traits marker to identify objects containing any StackProcesses - **/ - namespace detail { - // need helper alias to achieve this: - template <typename TProcess1, typename TProcess2, - typename = typename std::enable_if_t< - contains_stack_process_v<TProcess1> || - std::is_base_of_v<StackProcess<typename std::decay_t<TProcess1>>, - typename std::decay_t<TProcess1>> || - contains_stack_process_v<TProcess2> || - std::is_base_of_v<StackProcess<typename std::decay_t<TProcess2>>, - typename std::decay_t<TProcess2>>, - int>> - using enable_if_stack = ProcessSequence<TProcess1, TProcess2>; - } // namespace detail - - template <typename TProcess1, typename TProcess2> - struct contains_stack_process<detail::enable_if_stack<TProcess1, TProcess2>> - : std::true_type {}; - -} // namespace corsika::process diff --git a/Framework/Random/CMakeLists.txt b/Framework/Random/CMakeLists.txt deleted file mode 100644 index f909f77f1..000000000 --- a/Framework/Random/CMakeLists.txt +++ /dev/null @@ -1,53 +0,0 @@ -set ( - CORSIKArandom_SOURCES - RNGManager.cc - ) - -set ( - CORSIKArandom_HEADERS - RNGManager.h - UniformRealDistribution.h - ExponentialDistribution.h - ) - -set ( - CORSIKArandom_NAMESPACE - corsika/random - ) - -add_library (CORSIKArandom STATIC ${CORSIKArandom_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKArandom ${CORSIKArandom_NAMESPACE} ${CORSIKArandom_HEADERS}) - -target_link_libraries ( - CORSIKArandom - CORSIKAutilities - CORSIKAlogging - ) - -target_include_directories ( - CORSIKArandom - PUBLIC - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/> - ) - -# target dependencies on other libraries (also the header onlys) -# none - -install ( - TARGETS CORSIKArandom - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION include/${CORSIKArandom_NAMESPACE} - ) - - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST(testRandom) -target_link_libraries ( - testRandom - CORSIKArandom - CORSIKAtesting - CORSIKAunits - ) diff --git a/Framework/Random/RNGManager.cc b/Framework/Random/RNGManager.cc deleted file mode 100644 index 8bbcf15dd..000000000 --- a/Framework/Random/RNGManager.cc +++ /dev/null @@ -1,64 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#include <corsika/random/RNGManager.h> -#include <corsika/logging/Logging.h> - -#include <sstream> - -void corsika::random::RNGManager::RegisterRandomStream(std::string const& pStreamName) { - corsika::random::RNG rng; - - if (auto const& it = seeds.find(pStreamName); it != seeds.end()) { - rng.seed(it->second); - } - - rngs[pStreamName] = std::move(rng); -} - -corsika::random::RNG& corsika::random::RNGManager::GetRandomStream( - std::string const& pStreamName) { - if (IsRegistered(pStreamName)) { - return rngs.at(pStreamName); - } else { // this stream name is not in the map - throw std::runtime_error("'" + pStreamName + "' is not a registered stream."); - } -} - -bool corsika::random::RNGManager::IsRegistered(std::string const& pStreamName) const { - return rngs.count(pStreamName) > 0; -} - -std::stringstream corsika::random::RNGManager::dumpState() const { - std::stringstream buffer; - for (auto const& [streamName, rng] : rngs) { - buffer << '"' << streamName << "\" = \"" << rng << '"' << std::endl; - } - - return buffer; -} - -void corsika::random::RNGManager::SeedAll(uint64_t vSeed) { - for (auto& entry : rngs) { - auto seed = vSeed++; - C8LOG_TRACE("Random seed stream {} seed {}", entry.first, seed); - entry.second.seed(seed); - } -} - -void corsika::random::RNGManager::SeedAll() { - std::random_device rd; - std::seed_seq sseq{rd(), rd(), rd(), rd(), rd(), rd()}; - for (auto& entry : rngs) { - std::vector<std::uint32_t> seeds(1); - sseq.generate(seeds.begin(), seeds.end()); - std::uint32_t seed = seeds[0]; - C8LOG_TRACE("Random seed stream {} seed {}", entry.first, seed); - entry.second.seed(seed); - } -} diff --git a/Framework/StackInterface/CMakeLists.txt b/Framework/StackInterface/CMakeLists.txt deleted file mode 100644 index 956f1873b..000000000 --- a/Framework/StackInterface/CMakeLists.txt +++ /dev/null @@ -1,51 +0,0 @@ -set ( - CORSIKAstackinterface_HEADERS - ParticleBase.h - StackIteratorInterface.h - Stack.h - SecondaryView.h - CombinedStack.h - ) - -set ( - CORSIKAstackinterface_NAMESPACE - corsika/stack - ) - -add_library ( - CORSIKAstackinterface - INTERFACE - ) - -CORSIKA_COPY_HEADERS_TO_NAMESPACE ( - CORSIKAstackinterface ${CORSIKAstackinterface_NAMESPACE} ${CORSIKAstackinterface_HEADERS} - ) - -target_link_libraries ( - CORSIKAstackinterface - INTERFACE - CORSIKAlogging - CORSIKAsetup - ) - -target_include_directories ( - CORSIKAstackinterface - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include> - ) - -install ( - FILES ${CORSIKAstackinterface_HEADERS} - DESTINATION include/${CORSIKAstackinterface_NAMESPACE} - ) - -#code testing -CORSIKA_ADD_TEST(testStackInterface) -target_link_libraries (testStackInterface CORSIKAstackinterface CORSIKAtesting) - -CORSIKA_ADD_TEST(testSecondaryView) -target_link_libraries (testSecondaryView CORSIKAstackinterface CORSIKAtesting) - -CORSIKA_ADD_TEST(testCombinedStack) -target_link_libraries (testCombinedStack CORSIKAstackinterface CORSIKAtesting) diff --git a/Framework/StackInterface/Stack.dox b/Framework/StackInterface/Stack.dox deleted file mode 100644 index 8ac29c628..000000000 --- a/Framework/StackInterface/Stack.dox +++ /dev/null @@ -1,20 +0,0 @@ -/** - @page Stack Description of particle stacks - - In the CORSIKA 8 framework particle data is always stored in - particle stacks. A particle is, thus, always a reference (iterator) - to an entry on a stack, e.g. - - \verbatim - ModelStack stack; - stack.begin(); // returns an iterator: StackIterator, ConstStackIterator - - *stack.begin(); // return a reference to ParticleInterfaceType, which is the class provided by the user to read/write particle properties - - \endverbatim - - All functionality and algorithms for stack data access is located in the namespace corsika::stack - - The minimal example of how to use this is shown in stack_example.cc - -*/ \ No newline at end of file diff --git a/Framework/Testing/CMakeLists.txt b/Framework/Testing/CMakeLists.txt deleted file mode 100644 index 0c616e186..000000000 --- a/Framework/Testing/CMakeLists.txt +++ /dev/null @@ -1,52 +0,0 @@ -set ( - TESTING_SOURCES - TestMain.cc - ) - -set ( - TESTING_HEADERS - ) - -set ( - TESTING_NAMESPACE - corsika/testing - ) - -add_library (CORSIKAtesting STATIC ${TESTING_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAtesting ${TESTING_NAMESPACE} ${TESTING_HEADERS}) - -set_target_properties ( - CORSIKAtesting - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 - PUBLIC_HEADER "${TESTING_HEADERS}" - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - CORSIKAtesting - CORSIKAthirdparty - ) - -# target_include_directories ( -# CORSIKAtesting -# SYSTEM -# PUBLIC ${CATCH2_INCLUDE_DIR} -# INTERFACE ${CATCH2_INCLUDE_DIR} -# ) - -target_include_directories ( - CORSIKAtesting - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS CORSIKAtesting - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION include/${TESTING_NAMESPACE} - ) - diff --git a/Framework/Units/CMakeLists.txt b/Framework/Units/CMakeLists.txt deleted file mode 100644 index 8386ae026..000000000 --- a/Framework/Units/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -add_library (CORSIKAunits INTERFACE) - -set (CORSIKAunits_NAMESPACE corsika/units) -set ( - CORSIKAunits_HEADERS - PhysicalUnits.h - PhysicalConstants.h - ) - -CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAunits ${CORSIKAunits_NAMESPACE} ${CORSIKAunits_HEADERS}) - -target_include_directories (CORSIKAunits - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/ThirdParty> - $<INSTALL_INTERFACE:include> - ) - -install (FILES ${CORSIKAunits_HEADERS} DESTINATION include/${CORSIKAunits_NAMESPACE}) - -# code testing -CORSIKA_ADD_TEST (testUnits) -target_link_libraries (testUnits CORSIKAunits CORSIKAtesting) diff --git a/Framework/Utilities/CMakeLists.txt b/Framework/Utilities/CMakeLists.txt deleted file mode 100644 index 3373c0171..000000000 --- a/Framework/Utilities/CMakeLists.txt +++ /dev/null @@ -1,118 +0,0 @@ -# -# cfenv feature test - select implementation to use -# -try_compile (HAS_FEENABLEEXCEPT "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/try_feenableexcept.cc") -if (HAS_FEENABLEEXCEPT) - set (CORSIKA_FENV "CorsikaFenvDefault.cc") - set_property(DIRECTORY ${CMAKE_HOME_DIRECTORY} APPEND PROPERTY COMPILE_DEFINITIONS "HAS_FEENABLEEXCEPT") -else () - if (APPLE) - set (CORSIKA_FENV "CorsikaFenvOSX.cc") - else() - set (CORSIKA_FENV "CorsikaFenvFallback.cc") - endif() -endif () - -# -# library setup -# -set ( - UTILITIES_SOURCES - COMBoost.cc - CorsikaData.cc - quartic.cpp - ${CORSIKA_FENV}) - -set ( - UTILITIES_HEADERS - CorsikaData.h - COMBoost.h - Bit.h - Singleton.h - sgn.h - CorsikaFenv.h - MetaProgramming.h - quartic.h - ) - -set ( - UTILITIES_DEPENDS - CORSIKAgeometry - CORSIKAunits - CORSIKAlogging - C8::ext::boost # so far only for MetaProgramming - C8::ext::eigen3 # for COMboost - ) - -if (TARGET cnpy) - LIST (APPEND - UTILITIES_HEADERS - SaveBoostHistogram.hpp - ) - LIST (APPEND - UTILITIES_DEPENDS - cnpy # for SaveBoostHistogram - ) -endif (TARGET cnpy) - -set ( - UTILITIES_NAMESPACE - corsika/utl - ) - -add_library (CORSIKAutilities STATIC ${UTILITIES_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAutilities ${UTILITIES_NAMESPACE} ${UTILITIES_HEADERS}) - -set_target_properties ( - CORSIKAutilities - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 - PUBLIC_HEADER "${UTILITIES_HEADERS}" - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - CORSIKAutilities - ${UTILITIES_DEPENDS} - ) - -target_include_directories ( - CORSIKAutilities - PUBLIC - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS CORSIKAutilities - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - PUBLIC_HEADER DESTINATION include/${UTILITIES_NAMESPACE} - ) - - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST(testCOMBoost) -target_link_libraries ( - testCOMBoost - CORSIKAutilities - CORSIKAtesting - ) - -CORSIKA_ADD_TEST(testCorsikaFenv) -target_link_libraries ( - testCorsikaFenv - CORSIKAutilities - CORSIKAtesting -) - -if (TARGET cnpy) - CORSIKA_ADD_TEST(testSaveBoostHistogram) - target_link_libraries ( - testSaveBoostHistogram - CORSIKAutilities - CORSIKAtesting - ) -endif (TARGET cnpy) diff --git a/Framework/Utilities/COMBoost.h b/Framework/Utilities/COMBoost.h deleted file mode 100644 index 73b7c9300..000000000 --- a/Framework/Utilities/COMBoost.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/geometry/CoordinateSystem.h> -#include <corsika/geometry/FourVector.h> -#include <corsika/units/PhysicalUnits.h> -#include <corsika/logging/Logging.h> - -#include <Eigen/Dense> - -namespace corsika::utl { - - /** - This utility class handles Lorentz boost between different - referenence frames, using FourVectors. - */ - - class COMBoost { - Eigen::Matrix2d boost_, inverseBoost_; - corsika::geometry::CoordinateSystem const &originalCS_, rotatedCS_; - - void setBoost(double coshEta, double sinhEta); - - public: - //! construct a COMBoost given four-vector of projectile and mass of target - COMBoost( - const corsika::geometry::FourVector< - corsika::units::si::HEPEnergyType, - corsika::geometry::Vector<corsika::units::si::hepmomentum_d>>& Pprojectile, - const corsika::units::si::HEPEnergyType massTarget); - - //! construct a COMBoost to boost into the rest frame given a 3-momentum and mass - COMBoost(geometry::Vector<units::si::hepmomentum_d> const& momentum, - units::si::HEPEnergyType mass); - - //! transforms a 4-momentum from lab frame to the center-of-mass frame - template <typename FourVector> - FourVector toCoM(const FourVector& p) const { - using namespace corsika::units::si; - auto pComponents = p.GetSpaceLikeComponents().GetComponents(rotatedCS_); - Eigen::Vector3d eVecRotated = pComponents.eVector; - Eigen::Vector2d lab; - - lab << (p.GetTimeLikeComponent() * (1 / 1_GeV)), - (eVecRotated(2) * (1 / 1_GeV).magnitude()); - - auto const boostedZ = boost_ * lab; - auto const E_CoM = boostedZ(0) * 1_GeV; - - eVecRotated(2) = boostedZ(1) * (1_GeV).magnitude(); - - return FourVector( - E_CoM, corsika::geometry::Vector<hepmomentum_d>(rotatedCS_, eVecRotated)); - } - - //! transforms a 4-momentum from the center-of-mass frame back to lab frame - template <typename FourVector> - FourVector fromCoM(const FourVector& p) const { - using namespace corsika::units::si; - auto pCM = p.GetSpaceLikeComponents().GetComponents(rotatedCS_); - auto const Ecm = p.GetTimeLikeComponent(); - - Eigen::Vector2d com; - com << (Ecm * (1 / 1_GeV)), (pCM.eVector(2) * (1 / 1_GeV).magnitude()); - - C8LOG_TRACE( - "COMBoost::fromCoM Ecm={} GeV" - " pcm={} GeV (norm = {} GeV), invariant mass={} GeV", - Ecm / 1_GeV, pCM / 1_GeV, pCM.norm() / 1_GeV, p.GetNorm() / 1_GeV); - - auto const boostedZ = inverseBoost_ * com; - auto const E_lab = boostedZ(0) * 1_GeV; - - pCM.eVector(2) = boostedZ(1) * (1_GeV).magnitude(); - - geometry::Vector<typename decltype(pCM)::dimension> pLab{rotatedCS_, pCM}; - pLab.rebase(originalCS_); - - FourVector f(E_lab, pLab); - - C8LOG_TRACE("COMBoost::fromCoM --> Elab={} GeV", - " plab={} GeV (norm={} GeV) " - " GeV), invariant mass = {}", - E_lab / 1_GeV, f.GetNorm() / 1_GeV, pLab.GetComponents(), - pLab.norm() / 1_GeV); - - return f; - } - - geometry::CoordinateSystem const& GetRotatedCS() const; - }; -} // namespace corsika::utl diff --git a/Processes/CMakeLists.txt b/Processes/CMakeLists.txt deleted file mode 100644 index 63e66a331..000000000 --- a/Processes/CMakeLists.txt +++ /dev/null @@ -1,51 +0,0 @@ -# general -add_subdirectory (AnalyticProcessors) -add_subdirectory (ExampleProcessors) - -# tracking -add_subdirectory (Tracking) -add_subdirectory (TrackingLine) -add_subdirectory (TrackingLeapFrogStraight) -add_subdirectory (TrackingLeapFrogCurved) -# hadron interaction models -add_subdirectory (Sibyll) -add_subdirectory (QGSJetII) -if (Pythia8_FOUND) - add_subdirectory (Pythia) -endif (Pythia8_FOUND) -if (CONEX_FOUND) - add_subdirectory (CONEXSourceCut) -endif (CONEX_FOUND) -add_subdirectory (HadronicElasticModel) -add_subdirectory (UrQMD) -add_subdirectory (Proposal) - -# continuous physics -add_subdirectory (EnergyLoss) -add_subdirectory (LongitudinalProfile) -add_subdirectory (TrackWriter) -add_subdirectory (ObservationPlane) -# stack processes -add_subdirectory (StackInspector) -# secondaries process -# cuts, thinning, etc. -add_subdirectory (ParticleCut) -add_subdirectory (OnShellCheck) -# meta-processes -add_subdirectory (InteractionCounter) - - -########################################## -# add_custom_target(CORSIKAprocesses) -add_library (CORSIKAprocesses INTERFACE) -add_dependencies (CORSIKAprocesses ProcessSibyll) -add_dependencies (CORSIKAprocesses ProcessProposal) -if (Pythia8_FOUND) - add_dependencies (CORSIKAprocesses ProcessPythia8) -endif (Pythia8_FOUND) -add_dependencies (CORSIKAprocesses ProcessStackInspector) -add_dependencies (CORSIKAprocesses ProcessTrackingLine) -add_dependencies (CORSIKAprocesses ProcessEnergyLoss) -add_dependencies (CORSIKAprocesses ProcessUrQMD) -add_dependencies (CORSIKAprocesses ProcessParticleCut) -add_dependencies (CORSIKAprocesses ProcessOnShellCheck) diff --git a/Processes/EnergyLoss/CMakeLists.txt b/Processes/EnergyLoss/CMakeLists.txt deleted file mode 100644 index 3df3978d5..000000000 --- a/Processes/EnergyLoss/CMakeLists.txt +++ /dev/null @@ -1,63 +0,0 @@ -set ( - MODEL_SOURCES - EnergyLoss.cc - ) - -set ( - MODEL_HEADERS - EnergyLoss.h - ) - -set ( - MODEL_NAMESPACE - corsika/process/energy_loss - ) - -add_library (ProcessEnergyLoss STATIC ${MODEL_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessEnergyLoss ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -set_target_properties ( - ProcessEnergyLoss - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 -# PUBLIC_HEADER "${MODEL_HEADERS}" - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - ProcessEnergyLoss - CORSIKAunits - CORSIKAparticles - CORSIKAgeometry - CORSIKAenvironment - CORSIKAsetup - CORSIKAlogging - ) - -target_include_directories ( - ProcessEnergyLoss - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS ProcessEnergyLoss - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib -# PUBLIC_HEADER DESTINATION include/${MODEL_NAMESPACE} - ) - - -# -------------------- -# code unit testing -#CORSIKA_ADD_TEST (testNullModel testNullModel.cc) -#target_link_libraries ( -# testNullModel ProcessNullModel -# CORSIKAsetup -# CORSIKAgeometry -# CORSIKAunits -# CORSIKAthirdparty # for catch2 -# ) - diff --git a/Processes/EnergyLoss/EnergyLoss.cc b/Processes/EnergyLoss/EnergyLoss.cc deleted file mode 100644 index 66c8a76e2..000000000 --- a/Processes/EnergyLoss/EnergyLoss.cc +++ /dev/null @@ -1,279 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#include <corsika/process/energy_loss/EnergyLoss.h> - -#include <corsika/particles/ParticleProperties.h> - -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> - -#include <corsika/logging/Logging.h> - -#include <corsika/geometry/Line.h> - -#include <cmath> -#include <fstream> -#include <iostream> -#include <limits> -#include <numeric> - -using namespace std; - -using namespace corsika; -using namespace corsika::units::si; -using SetupParticle = corsika::setup::Stack::ParticleType; -using SetupTrack = corsika::setup::Trajectory; - -using namespace corsika::process::energy_loss; - -EnergyLoss::EnergyLoss(environment::ShowerAxis const& shower_axis, - corsika::units::si::HEPEnergyType emCut) - : shower_axis_(shower_axis) - , emCut_(emCut) - , profile_(int(shower_axis.maximumX() / dX_) + 1) {} - -auto elab2plab = [](HEPEnergyType Elab, HEPMassType m) { - return sqrt((Elab - m) * (Elab + m)); -}; - -/** - * PDG2018, passage of particles through matter - * - * Note, that \f$I_{\mathrm{eff}}\f$ of composite media a determined from \f$ \ln I = - * \sum_i a_i \ln(I_i) \f$ where \f$ a_i \f$ is the fraction of the electron population - * (\f$\sim Z_i\f$) of the \f$i\f$-th element. This can also be used for shell - * corrections or density effects. - * - * The \f$I_{\mathrm{eff}}\f$ of compounds is not better than a few percent, if not - * measured explicitly. - * - * For shell correction, see Sec 6 of https://www.nap.edu/read/20066/chapter/8#115 - * - */ -HEPEnergyType EnergyLoss::BetheBloch(SetupParticle const& p, GrammageType const dX) { - - // all these are material constants and have to come through Environment - // right now: values for nitrogen_D - // 7 nitrogen_gas 82.0 0.49976 D E 0.0011653 0.0 1.7378 4.1323 0.15349 3.2125 10.54 - auto Ieff = 82.0_eV; - [[maybe_unused]] auto Zmat = 7; - auto ZoverA = 0.49976_mol / 1_g; - const double x0 = 1.7378; - const double x1 = 4.1323; - const double Cbar = 10.54; - const double delta0 = 0.0; - const double aa = 0.15349; - const double sk = 3.2125; - // end of material constants - - // this is the Bethe-Bloch coefficiet 4pi N_A r_e^2 m_e c^2 - auto constexpr K = 0.307075_MeV / 1_mol * square(1_cm); - HEPEnergyType const E = p.GetEnergy(); - HEPMassType const m = p.GetMass(); - double const gamma = E / m; - int const Z = p.GetChargeNumber(); - int const Z2 = Z * Z; - HEPMassType constexpr me = particles::Electron::GetMass(); - auto const m2 = m * m; - auto constexpr me2 = me * me; - double const gamma2 = gamma * gamma; - - double const beta2 = (gamma2 - 1) / gamma2; // 1-1/gamma2 (1-1/gamma)*(1+1/gamma); - // (gamma_2-1)/gamma_2 = (1-1/gamma2); - double constexpr c2 = 1; // HEP convention here c=c2=1 - C8LOG_DEBUG("BetheBloch beta2={}, gamma2={}", beta2, gamma2); - [[maybe_unused]] double const eta2 = beta2 / (1 - beta2); - HEPMassType const Wmax = - 2 * me * c2 * beta2 * gamma2 / (1 + 2 * gamma * me / m + me2 / m2); - // approx, but <<1% HEPMassType const Wmax = 2*me*c2*beta2*gamma2; for HEAVY - // PARTICLES Wmax ~ 2me v2 for non-relativistic particles - C8LOG_DEBUG("BetheBloch Wmax={}", Wmax); - - // Sternheimer parameterization, density corrections towards high energies - // NOTE/TODO: when Cbar is 0 it needs to be approximated from parameterization -> - // MISSING - C8LOG_DEBUG("BetheBloch p.GetMomentum().GetNorm()/m{}=", p.GetMomentum().GetNorm() / m); - double const x = log10(p.GetMomentum().GetNorm() / m); - double delta = 0; - if (x >= x1) { - delta = 2 * (log(10)) * x - Cbar; - } else if (x < x1 && x >= x0) { - delta = 2 * (log(10)) * x - Cbar + aa * pow((x1 - x), sk); - } else if (x < x0) { // and IF conductor (otherwise, this is 0) - delta = delta0 * pow(100, 2 * (x - x0)); - } - C8LOG_DEBUG("BetheBloch delta={}", delta); - - // with further low energies correction, accurary ~1% down to beta~0.05 (1MeV for p) - - // shell correction, <~100MeV - // need more clarity about formulas and units - const double Cadj = 0; - /* - // https://www.nap.edu/read/20066/chapter/8#104 - HEPEnergyType Iadj = 12_eV * Z + 7_eV; // Iadj<163eV - if (Iadj>=163_eV) - Iadj = 9.76_eV * Z + 58.8_eV * pow(Z, -0.19); // Iadj>=163eV - double const Cadj = (0.422377/eta2 + 0.0304043/(eta2*eta2) - - 0.00038106/(eta2*eta2*eta2)) * 1e-6 * Iadj*Iadj + (3.858019/eta2 - - 0.1667989/(eta2*eta2) + 0.00157955/(eta2*eta2*eta2)) * 1e-9 * Iadj*Iadj*Iadj; - */ - - // Barkas correction O(Z3) higher-order Born approximation - // see Appl. Phys. 85 (1999) 1249 - // double A = 1; - // if (p.GetPID() == particles::Code::Nucleus) A = p.GetNuclearA(); - // double const Erel = (p.GetEnergy()-p.GetMass()) / A / 1_keV; - // double const Llow = 0.01 * Erel; - // double const Lhigh = 1.5/pow(Erel, 0.4) + 45000./Zmat * pow(Erel, 1.6); - // double const barkas = Z * Llow*Lhigh/(Llow+Lhigh); // RU, I think the Z was - // missing... - double const barkas = 1; // does not work yet - - // Bloch correction for O(Z4) higher-order Born approximation - // see Appl. Phys. 85 (1999) 1249 - const double alpha = 1. / 137.035999173; - double const y2 = Z * Z * alpha * alpha / beta2; - double const bloch = -y2 * (1.202 - y2 * (1.042 - 0.855 * y2 + 0.343 * y2 * y2)); - - double const aux = 2 * me * c2 * beta2 * gamma2 * Wmax / (Ieff * Ieff); - return -K * Z2 * ZoverA / beta2 * - (0.5 * log(aux) - beta2 - Cadj / Z - delta / 2 + barkas + bloch) * dX; -} - -// radiation losses according to PDG 2018, ch. 33 ref. [5] -HEPEnergyType EnergyLoss::RadiationLosses(SetupParticle const& vP, - GrammageType const vDX) { - // simple-minded hard-coded value for b(E) inspired by data from - // http://pdg.lbl.gov/2018/AtomicNuclearProperties/ for N and O. - auto constexpr b = 3.0 * 1e-6 * square(1_cm) / 1_g; - return -vP.GetEnergy() * b * vDX; -} - -HEPEnergyType EnergyLoss::TotalEnergyLoss(SetupParticle const& vP, - GrammageType const vDX) { - return BetheBloch(vP, vDX) + RadiationLosses(vP, vDX); -} - -process::EProcessReturn EnergyLoss::DoContinuous(SetupParticle& p, SetupTrack const& t) { - if (p.GetChargeNumber() == 0) return process::EProcessReturn::eOk; - - GrammageType const dX = - p.GetNode()->GetModelProperties().IntegratedGrammage(t, t.GetLength()); - C8LOG_DEBUG("EnergyLoss pid={}, z={}, dX={} g/cm2", p.GetPID(), p.GetChargeNumber(), - dX / 1_g * square(1_cm)); - HEPEnergyType dE = TotalEnergyLoss(p, dX); - auto E = p.GetEnergy(); - [[maybe_unused]] const auto Ekin = E - p.GetMass(); - auto Enew = E + dE; - C8LOG_DEBUG("EnergyLoss dE={} MeV, E={} GeV, Ekin={} GeV, Enew={} GeV", dE / 1_MeV, - E / 1_GeV, Ekin / 1_GeV, Enew / 1_GeV); - p.SetEnergy(Enew); - MomentumUpdate(p, Enew); - FillProfile(t, dE); - return process::EProcessReturn::eOk; -} - -LengthType EnergyLoss::MaxStepLength(SetupParticle const& vParticle, - SetupTrack const& vTrack) const { - if (vParticle.GetChargeNumber() == 0) { - return units::si::meter * std::numeric_limits<double>::infinity(); - } - - auto constexpr dX = 1_g / square(1_cm); - auto const dEdX = -TotalEnergyLoss(vParticle, dX) / dX; // dE > 0 - //~ auto const Ekin = vParticle.GetEnergy() - vParticle.GetMass(); - - // in any case: never go below 0.99*emCut_ This needs to be - // slightly smaller than emCut_ since, either this Step is limited - // by energy_lim, then the particle is stopped in a very short - // range (before doing anythin else) and is then removed - // instantly. The exact position where it reaches emCut is not - // important, the important fact is that its E_kin is zero - // afterwards. - // - const auto energy = vParticle.GetEnergy(); - auto energy_lim = std::max(0.9 * energy, 0.99 * emCut_); - - auto const maxGrammage = (energy - energy_lim) / dEdX; - - return vParticle.GetNode()->GetModelProperties().ArclengthFromGrammage(vTrack, - maxGrammage); -} - -void EnergyLoss::MomentumUpdate(corsika::setup::Stack::ParticleType& vP, - corsika::units::si::HEPEnergyType Enew) { - HEPMomentumType Pnew = elab2plab(Enew, vP.GetMass()); - auto pnew = vP.GetMomentum(); - vP.SetMomentum(pnew * Pnew / pnew.GetNorm()); -} - -void EnergyLoss::FillProfile(SetupTrack const& vTrack, const HEPEnergyType dE) { - - GrammageType const grammageStart = shower_axis_.projectedX(vTrack.GetPosition(0)); - GrammageType const grammageEnd = shower_axis_.projectedX(vTrack.GetPosition(1)); - const auto deltaX = grammageEnd - grammageStart; - - int binStart = grammageStart / dX_; - if (binStart < 0) return; - int binEnd = grammageEnd / dX_; - if (binEnd > int(profile_.size() - 1)) return; - if (deltaX < dX_threshold_) return; - - C8LOG_DEBUG("energy deposit of -dE={} between {} and {}", -dE, grammageStart, - grammageEnd); - - auto energyCount = HEPEnergyType::zero(); - - auto fill = [&](const int bin, const double weight) { - auto const increment = -dE * weight; - profile_[bin] += increment; - energyCount += increment; - - C8LOG_DEBUG("filling bin {} with weight {} : {} ", bin, weight, increment); - }; - - // fill longitudinal profile - if (binStart == binEnd) { - fill(binStart, 1); - } else { - fill(binStart, ((1 + binStart) * dX_ - grammageStart) / deltaX); - fill(binEnd, (grammageEnd - binEnd * dX_) / deltaX); - for (int bin = binStart + 1; bin < binEnd; ++bin) { fill(bin, 1); } - } - - C8LOG_DEBUG("total energy added to histogram: {} ", energyCount); -} - -void EnergyLoss::PrintProfile() const { - std::ofstream file("EnergyLossProfile.dat"); - file << "# EnergyLoss profile" << std::endl - << "# lower X bin edge [g/cm2] dE/dX [GeV/g/cm2]" << endl; - double const deltaX = dX_ / 1_g * square(1_cm); - for (size_t i = 0; i < profile_.size(); ++i) { - file << std::scientific << std::setw(15) << i * deltaX << std::setw(15) - << profile_.at(i) / (deltaX * 1_GeV) << endl; - } -} - -HEPEnergyType EnergyLoss::GetTotal() const { - return std::accumulate(profile_.cbegin(), profile_.cend(), HEPEnergyType::zero()); -} - -void EnergyLoss::showResults() const { - using namespace corsika::units::si; // required for operator::_MeV - std::cout << " ******************************" << std::endl - << " PROCESS::ContinuousProcess: " << std::endl; - std::cout << " energy lost dE (GeV) : " << energy_lost_ / 1_GeV << std::endl; -} - -void EnergyLoss::reset() { - using namespace corsika::units::si; // required for operator::_MeV - energy_lost_ = 0_GeV; -} diff --git a/Processes/EnergyLoss/Properties8.dat b/Processes/EnergyLoss/Properties8.dat deleted file mode 100644 index 377c3df77..000000000 --- a/Processes/EnergyLoss/Properties8.dat +++ /dev/null @@ -1,2907 +0,0 @@ -# RU Mo 18. Feb 14:07:40 CET 2019 -# Data table obtained from: http://pdg.lbl.gov/2018/AtomicNuclearProperties/properties8.dat -# see also: http://pdg.lbl.gov/2018/AtomicNuclearProperties/expert.html - 1 Hydro 3 1.0080000000 7 0.99212 8.3748E-05 8.3755E-05 D 1 1 4 E -H hydrogen_gas -hydrogen gas (H%2#) - 19.2 9.5835 1.8639 3.2718 0.14092 5.7273 0.00 - 1 1.000000 1.000000 -Boiling point -252.87 20.267 K -Melting point -259.34 13.82 K -Index of ref (n-1)*E6 132.0 http://www.kayelaby.npl.co.uk/ -Note: The mass of atomic <SUP>1</SUP>H is 1.007 276 522 6 (13) u (mass of the proton less binding energy of 13.61 eV = 1.461E-09 u). ----------------------------------------------------------------------------- - 2 Heliu 6 4.0026020000 2 0.49967 1.6632E-04 1.6632E-04 G 1 1 2 E -He helium_gas_He -helium gas (He) - 41.8 11.1393 2.2017 3.6122 0.13443 5.8347 0.00 - 2 1.000000 1.000000 -Boiling point -268.93 -Index of ref (n-1)*E6 35.0 http://www.kayelaby.npl.co.uk/ ----------------------------------------------------------------------------- - 3 Lithi 2 6.9400000000 2 0.43221 5.3400E-01 5.3400E-01 S 1 1 2 E -Li lithium_Li -lithium (Li) - 40.0 3.1221 0.1304 1.6397 0.95136 2.4993 0.14 - 3 1.000000 1.000000 -melting point 180.5 -boiling point 1342. ----------------------------------------------------------------------------- - 4 Beryl 7 9.0121831000 5 0.44384 1.8480E+00 1.8480E+00 S 1 1 2 E -Be beryllium_Be -beryllium (Be) - 63.7 2.7847 0.0592 1.6922 0.80392 2.4339 0.14 - 4 1.000000 1.000000 -melting point 1287. -boiling point 2471. ----------------------------------------------------------------------------- - 5 Boron 2 10.8100000000 7 0.46249 2.3700E+00 2.3700E+00 S 1 1 0 E -B boron_B -boron (B) - 76.0 2.8477 0.0305 1.9688 0.56224 2.4512 0.14 - 5 1.000000 1.000000 ----------------------------------------------------------------------------- - 6 Carbo 4 12.0107000000 8 0.49955 2.0000E+00 2.0000E+00 S 1 1 0 E -C carbon_amorphous_C -carbon (amorphous) (C) - 78.0 2.9925 -0.0351 2.4860 0.20240 3.0036 0.10 - 6 1.000000 1.000000 ----------------------------------------------------------------------------- - 7 Nitro 3 14.0070000000 2 0.49976 1.1653E-03 1.1653E-03 D 1 1 3 E -N nitrogen_gas -nitrogen gas (N%2#) - 82.0 10.5400 1.7378 4.1323 0.15349 3.2125 0.00 - 7 1.000000 1.000000 -Melting point (C) -210.00 -Boiling point (C) -195.86 -Index of ref (n-1)*E6 298.0 http://www.kayelaby.npl.co.uk/ ----------------------------------------------------------------------------- - 8 Oxyge 3 15.9990000000 3 0.50002 1.3315E-03 1.3315E-03 D 1 1 3 E -O oxygen_gas -oxygen gas (O%2#) - 95.0 10.7004 1.7541 4.3213 0.11778 3.2913 0.00 - 8 1.000000 1.000000 -Melting point (C) -218.79 -Boiling point (C) -182.95 -Index of ref (n-1)*E6 271.0 http://www.kayelaby.npl.co.uk/ ----------------------------------------------------------------------------- - 9 Fluor 9 18.9984031630 6 0.47372 1.5803E-03 1.5803E-03 D 1 1 3 E -F fluorine_gas -fluorine gas (F%2#) - 115.0 10.9653 1.8433 4.4096 0.11083 3.2962 0.00 - 9 1.000000 1.000000 -Melting point -219.62 -Boiling point -188.12 -Index ref (n-1) 195. ----------------------------------------------------------------------------- - 10 Neon 4 20.1797000000 6 0.49555 8.3851E-04 8.3851E-04 G 1 1 3 E -Ne neon_gas_Ne -neon gas (Ne) - 137.0 11.9041 2.0735 4.6421 0.08064 3.5771 0.00 - 10 1.000000 1.000000 -Boiling point -246.08 -Melting point -248.59 -Index ref 67.1 ----------------------------------------------------------------------------- - 11 Sodiu 8 22.9897692800 2 0.47847 9.7100E-01 9.7100E-01 S 1 1 0 E -Na sodium_Na -sodium (Na) - 149.0 5.0526 0.2880 3.1962 0.07772 3.6452 0.08 - 11 1.000000 1.000000 ----------------------------------------------------------------------------- - 12 Magne 3 24.3050000000 6 0.49373 1.7400E+00 1.7400E+00 S 1 1 0 E -Mg magnesium_Mg -magnesium (Mg) - 156.0 4.5297 0.1499 3.0668 0.08163 3.6166 0.08 - 12 1.000000 1.000000 ----------------------------------------------------------------------------- - 13 Alumi 7 26.9815385000 7 0.48181 2.6989E+00 2.6989E+00 S 1 1 2 E -Al aluminum_Al -aluminum (Al) - 166.0 4.2395 0.1708 3.0127 0.08024 3.6345 0.12 - 13 1.000000 1.000000 -melti 660.32 Aluminum -boili 2519. Aluminum ----------------------------------------------------------------------------- - 14 Silic 4 28.0855000000 3 0.49848 2.3300E+00 2.3290E+00 S 1 1 3 E -Si silicon_Si -silicon (Si) - 173.0 4.4351 0.2014 2.8715 0.14921 3.2546 0.14 - 14 1.000000 1.000000 -Index of ref 3.95 -Melting point 1414. -Boiling point 3265. ----------------------------------------------------------------------------- - 15 Phosp 9 30.9737619980 5 0.48428 2.2000E+00 2.2000E+00 S 1 1 0 E -P phosphorus_P -phosphorus (P) - 173.0 4.5214 0.1696 2.7815 0.23610 2.9158 0.14 - 15 1.000000 1.000000 ----------------------------------------------------------------------------- - 16 Sulfu 3 32.0650000000 5 0.49899 2.0000E+00 2.0000E+00 S 1 1 0 E -S sulfur_S -sulfur (S) - 180.0 4.6659 0.1580 2.7159 0.33992 2.6456 0.14 - 16 1.000000 1.000000 ----------------------------------------------------------------------------- - 17 Chlor 3 35.4530000000 2 0.47951 2.9947E-03 2.9800E-03 D 1 1 3 E -Cl chlorine_gas -chlorine gas (Cl%2#) - 174.0 11.1421 1.5555 4.2994 0.19849 2.9702 0.00 - 17 1.000000 1.000000 -Melting point -101.5 -Boiling point -34.04 -Index of ref (n-1)*E6 773.0 http://www.kayelaby.npl.co.uk/ ----------------------------------------------------------------------------- - 18 Argon 3 39.9480000000 1 0.45059 1.6620E-03 1.6620E-03 G 1 1 3 E -Ar argon_gas_Ar -argon gas (Ar) - 188.0 11.9480 1.7635 4.4855 0.19714 2.9618 0.00 - 18 1.000000 1.000000 -Boiling point -185.89 -Melting point -189.3442 -Index of ref (n-1)*E6 281.0 http://www.kayelaby.npl.co.uk/ ----------------------------------------------------------------------------- - 19 Potas 4 39.0983000000 1 0.48595 8.6200E-01 8.6200E-01 S 1 1 0 E -K potassium_K -potassium (K) - 190.0 5.6423 0.3851 3.1724 0.19827 2.9233 0.10 - 19 1.000000 1.000000 ----------------------------------------------------------------------------- - 20 Calci 3 40.0780000000 4 0.49903 1.5500E+00 1.5500E+00 S 1 1 0 E -Ca calcium_Ca -calcium (Ca) - 191.0 5.0396 0.3228 3.1191 0.15643 3.0745 0.14 - 20 1.000000 1.000000 ----------------------------------------------------------------------------- - 21 Scand 6 44.9559080000 5 0.46712 2.9890E+00 2.9890E+00 S 1 1 0 E -Sc scandium_Sc -scandium (Sc) - 216.0 4.6949 0.1640 3.0593 0.15754 3.0517 0.10 - 21 1.000000 1.000000 ----------------------------------------------------------------------------- - 22 Titan 3 47.8670000000 1 0.45961 4.5400E+00 4.5400E+00 S 1 1 2 E -Ti titanium_Ti -titanium (Ti) - 233.0 4.4450 0.0957 3.0386 0.15662 3.0302 0.12 - 22 1.000000 1.000000 -melti 1668. Titanium -boili 3287. Titanium ----------------------------------------------------------------------------- - 23 Vanad 4 50.9415000000 1 0.45150 6.1100E+00 6.1100E+00 S 1 1 0 E -V vanadium_V -vanadium (V) - 245.0 4.2659 0.0691 3.0322 0.15436 3.0163 0.14 - 23 1.000000 1.000000 ----------------------------------------------------------------------------- - 24 Chrom 4 51.9961000000 6 0.46157 7.1800E+00 7.1800E+00 S 1 1 0 E -Cr chromium_Cr -chromium (Cr) - 257.0 4.1781 0.0340 3.0451 0.15419 2.9896 0.14 - 24 1.000000 1.000000 ----------------------------------------------------------------------------- - 25 Manga 6 54.9380440000 3 0.45506 7.4400E+00 7.4400E+00 S 1 1 0 E -Mn manganese_Mn -manganese (Mn) - 272.0 4.2702 0.0447 3.1074 0.14973 2.9796 0.14 - 25 1.000000 1.000000 ----------------------------------------------------------------------------- - 26 Iron 3 55.8450000000 2 0.46557 7.8740E+00 7.8740E+00 S 1 1 2 E -Fe iron_Fe -iron (Fe) - 286.0 4.2911 -0.0012 3.1531 0.14680 2.9632 0.12 - 26 1.000000 1.000000 -Melting point C 1538. -Boiling point C 2861. ----------------------------------------------------------------------------- - 27 Cobal 6 58.9331940000 4 0.45815 8.9000E+00 8.9000E+00 S 1 1 0 E -Co cobalt_Co -cobalt (Co) - 297.0 4.2601 -0.0187 3.1790 0.14474 2.9502 0.12 - 27 1.000000 1.000000 ----------------------------------------------------------------------------- - 28 Nicke 4 58.6934000000 4 0.47706 8.9020E+00 8.9020E+00 S 1 1 0 E -Ni nickel_Ni -nickel (Ni) - 311.0 4.3115 -0.0566 3.1851 0.16496 2.8430 0.10 - 28 1.000000 1.000000 ----------------------------------------------------------------------------- - 29 Coppe 3 63.5460000000 3 0.45636 8.9600E+00 8.9600E+00 S 1 1 2 E -Cu copper_Cu -copper (Cu) - 322.0 4.4190 -0.0254 3.2792 0.14339 2.9044 0.08 - 29 1.000000 1.000000 -melti 1084.62 Copper -boili 2562. Copper ----------------------------------------------------------------------------- - 30 Zinc 2 65.3800000000 2 0.45886 7.1330E+00 7.1330E+00 S 1 1 0 E -Zn zinc_Zn -zinc (Zn) - 330.0 4.6906 0.0049 3.3668 0.14714 2.8652 0.08 - 30 1.000000 1.000000 ----------------------------------------------------------------------------- - 31 Galli 3 69.7230000000 1 0.44462 5.9040E+00 5.9040E+00 S 1 1 0 E -Ga gallium_Ga -gallium (Ga) - 334.0 4.9353 0.2267 3.5434 0.09440 3.1314 0.14 - 31 1.000000 1.000000 ----------------------------------------------------------------------------- - 32 Germa 3 72.6300000000 1 0.44053 5.3230E+00 5.3230E+00 S 1 1 2 E -Ge germanium_Ge -germanium (Ge) - 350.0 5.1411 0.3376 3.6096 0.07188 3.3306 0.14 - 32 1.000000 1.000000 -melti 938.25 Germanium -boili 2833. Germanium ----------------------------------------------------------------------------- - 33 Arsen 6 74.9215950000 6 0.44046 5.7300E+00 5.7300E+00 S 1 1 0 E -As arsenic_As -arsenic (As) - 347.0 5.0510 0.1767 3.5702 0.06633 3.4176 0.08 - 33 1.000000 1.000000 ----------------------------------------------------------------------------- - 34 Selen 3 78.9710000000 8 0.43060 4.5000E+00 4.5000E+00 S 1 1 0 E -Se selenium_Se -selenium (Se) - 348.0 5.3210 0.2258 3.6264 0.06568 3.4317 0.10 - 34 1.000000 1.000000 ----------------------------------------------------------------------------- - 35 Bromi 3 79.9040000000 1 0.43803 7.0722E-03 7.0722E-03 D 1 1 2 E -Br bromine_gas -bromine gas (Br%2#) - 343.0 11.7307 1.5262 4.9899 0.06335 3.4670 0.00 - 35 1.000000 1.000000 -melting point -7.2 -boiling point 58.78 ----------------------------------------------------------------------------- - 36 Krypt 3 83.7980000000 2 0.42960 3.4783E-03 3.4856E-03 G 1 1 2 E -Kr krypton_gas_Kr -krypton gas (Kr) - 352.0 12.5115 1.7158 5.0748 0.07446 3.4051 0.00 - 36 1.000000 1.000000 -melting point -157.36 -boiling point -153.22 ----------------------------------------------------------------------------- - 37 Rubid 4 85.4678000000 3 0.43291 1.5320E+00 1.5320E+00 S 1 1 0 E -Rb rubidium_Rb -rubidium (Rb) - 363.0 6.4776 0.5737 3.7995 0.07261 3.4177 0.14 - 37 1.000000 1.000000 ----------------------------------------------------------------------------- - 38 Stron 2 87.6200000000 1 0.43369 2.5400E+00 2.5400E+00 S 1 1 0 E -Sr strontium_Sr -strontium (Sr) - 366.0 5.9867 0.4585 3.6778 0.07165 3.4435 0.14 - 38 1.000000 1.000000 ----------------------------------------------------------------------------- - 39 Yttri 5 88.9058400000 2 0.43867 4.4690E+00 4.4690E+00 S 1 1 0 E -Y yttrium_Y -yttrium (Y) - 379.0 5.4801 0.3608 3.5542 0.07138 3.4585 0.14 - 39 1.000000 1.000000 ----------------------------------------------------------------------------- - 40 Zirco 3 91.2240000000 2 0.43848 6.5060E+00 6.5060E+00 S 1 1 0 E -Zr zirconium_Zr -zirconium (Zr) - 393.0 5.1774 0.2957 3.4890 0.07177 3.4533 0.14 - 40 1.000000 1.000000 ----------------------------------------------------------------------------- - 41 Niobi 5 92.9063700000 2 0.44130 8.5700E+00 8.5700E+00 S 1 1 0 E -Nb niobium_Nb -niobium (Nb) - 417.0 5.0141 0.1785 3.2201 0.13883 3.0930 0.14 - 41 1.000000 1.000000 ----------------------------------------------------------------------------- - 42 Molyb 2 95.9500000000 1 0.43768 1.0220E+01 1.0220E+01 S 1 1 0 E -Mo molybdenum_Mo -molybdenum (Mo) - 424.0 4.8793 0.2267 3.2784 0.10525 3.2549 0.14 - 42 1.000000 1.000000 ----------------------------------------------------------------------------- - 43 Techn 5 97.9072200000 3 0.43919 1.1500E+01 1.1500E+01 S 1 1 3 R -Tc technetium_Tc -technetium (Tc) - 428.0 4.7769 0.0949 3.1253 0.16572 2.9738 0.14 - 43 1.000000 1.000000 -melting 2157. -boiling 4265. -Note: Since there are no stable isotopes, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 44 Ruthe 2 101.0700000000 2 0.43534 1.2410E+01 1.2410E+01 S 1 1 0 E -Ru ruthenium_Ru -ruthenium (Ru) - 441.0 4.7694 0.0599 3.0834 0.19342 2.8707 0.14 - 44 1.000000 1.000000 ----------------------------------------------------------------------------- - 45 Rhodi 5 102.9055000000 2 0.43729 1.2410E+01 1.2410E+01 S 1 1 0 E -Rh rhodium_Rh -rhodium (Rh) - 449.0 4.8008 0.0576 3.1069 0.19205 2.8633 0.14 - 45 1.000000 1.000000 ----------------------------------------------------------------------------- - 46 Palla 2 106.4200000000 1 0.43225 1.2020E+01 1.2020E+01 S 1 1 0 E -Pd palladium_Pd -palladium (Pd) - 470.0 4.9358 0.0563 3.0555 0.24178 2.7239 0.14 - 46 1.000000 1.000000 ----------------------------------------------------------------------------- - 47 Silve 4 107.8682000000 2 0.43572 1.0500E+01 1.0500E+01 S 1 1 0 E -Ag silver_Ag -silver (Ag) - 470.0 5.0630 0.0657 3.1074 0.24585 2.6899 0.14 - 47 1.000000 1.000000 ----------------------------------------------------------------------------- - 48 Cadmi 3 112.4140000000 4 0.42700 8.6500E+00 8.6500E+00 S 1 1 0 E -Cd cadmium_Cd -cadmium (Cd) - 469.0 5.2727 0.1281 3.1667 0.24609 2.6772 0.14 - 48 1.000000 1.000000 ----------------------------------------------------------------------------- - 49 Indiu 3 114.8180000000 3 0.42676 7.3100E+00 7.3100E+00 S 1 1 0 E -In indium_In -indium (In) - 488.0 5.5211 0.2406 3.2032 0.23879 2.7144 0.14 - 49 1.000000 1.000000 ----------------------------------------------------------------------------- - 50 Tin 3 118.7100000000 7 0.42119 7.3100E+00 7.3100E+00 S 1 1 2 E -Sn tin_Sn -tin (Sn) - 488.0 5.5340 0.2879 3.2959 0.18689 2.8576 0.14 - 50 1.000000 1.000000 -melti 231.93 Tin -boili 2602. Tin ----------------------------------------------------------------------------- - 51 Antim 3 121.7600000000 1 0.41886 6.6910E+00 6.6910E+00 S 1 1 0 E -Sb antimony_Sb -antimony (Sb) - 487.0 5.6241 0.3189 3.3489 0.16652 2.9319 0.14 - 51 1.000000 1.000000 ----------------------------------------------------------------------------- - 52 Tellu 2 127.6000000000 3 0.40752 6.2400E+00 6.2400E+00 S 1 1 0 E -Te tellurium_Te -tellurium (Te) - 485.0 5.7131 0.3296 3.4418 0.13815 3.0354 0.14 - 52 1.000000 1.000000 ----------------------------------------------------------------------------- - 53 Iodin 5 126.9044700000 3 0.41764 4.9300E+00 4.9300E+00 S 1 1 2 E -I iodine_I -iodine (I) - 491.0 5.9488 0.0549 3.2596 0.23766 2.7276 0.00 - 53 1.000000 1.000000 -melting point 113.7 -boiling point 184.4 ----------------------------------------------------------------------------- - 54 Xenon 3 131.2930000000 6 0.41129 5.4854E-03 5.4830E-03 G 1 1 3 E -Xe xenon_gas_Xe -xenon gas (Xe) - 482.0 12.7281 1.5630 4.7371 0.23314 2.7414 0.00 - 54 1.000000 1.000000 -Index ref 701. -Melting point -111.75 -Boiling point -108.0 ----------------------------------------------------------------------------- - 55 Caesi 8 132.9054519600 6 0.41383 1.8730E+00 1.8730E+00 S 1 1 0 E -Cs caesium_Cs -caesium (Cs) - 488.0 6.9135 0.5473 3.5914 0.18233 2.8866 0.14 - 55 1.000000 1.000000 ----------------------------------------------------------------------------- - 56 Bariu 3 137.3270000000 7 0.40779 3.5000E+00 3.5000E+00 S 1 1 0 E -Ba barium_Ba -barium (Ba) - 491.0 6.3153 0.4190 3.4547 0.18268 2.8906 0.14 - 56 1.000000 1.000000 ----------------------------------------------------------------------------- - 57 Lanth 5 138.9054700000 7 0.41035 6.1540E+00 6.1450E+00 S 1 1 0 E -La lanthanum_La -lanthanum (La) - 501.0 5.7850 0.3161 3.3293 0.18591 2.8828 0.14 - 57 1.000000 1.000000 ----------------------------------------------------------------------------- - 58 Ceriu 3 140.1160000000 1 0.41394 6.6570E+00 6.7700E+00 S 1 1 0 E -Ce cerium_Ce -cerium (Ce) - 523.0 5.7837 0.2713 3.3432 0.18885 2.8592 0.14 - 58 1.000000 1.000000 ----------------------------------------------------------------------------- - 59 Prase 5 140.9076600000 2 0.41871 6.7100E+00 6.7730E+00 S 1 1 0 E -Pr praseodymium_Pr -praseodymium (Pr) - 535.0 5.8096 0.2333 3.2773 0.23265 2.7331 0.14 - 59 1.000000 1.000000 ----------------------------------------------------------------------------- - 60 Neody 3 144.2420000000 3 0.41597 6.9000E+00 7.0080E+00 S 1 1 0 E -Nd neodymium_Nd -neodymium (Nd) - 546.0 5.8290 0.1984 3.3063 0.23530 2.7050 0.14 - 60 1.000000 1.000000 ----------------------------------------------------------------------------- - 61 Prome 5 144.9127500000 3 0.42094 7.2200E+00 7.2640E+00 S 1 1 1 R -Pm promethium_Pm -promethium (Pm) - 560.0 5.8224 0.1627 3.3199 0.24280 2.6674 0.14 - 61 1.000000 1.000000 -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 62 Samar 2 150.3600000000 2 0.41234 7.4600E+00 7.5200E+00 S 1 1 0 E -Sm samarium_Sm -samarium (Sm) - 574.0 5.8597 0.1520 3.3460 0.24698 2.6403 0.14 - 62 1.000000 1.000000 ----------------------------------------------------------------------------- - 63 Europ 3 151.9640000000 1 0.41457 5.2430E+00 5.2440E+00 S 1 1 0 E -Eu europium_Eu -europium (Eu) - 580.0 6.2278 0.1888 3.4633 0.24448 2.6245 0.14 - 63 1.000000 1.000000 ----------------------------------------------------------------------------- - 64 Gadol 2 157.2500000000 3 0.40700 7.9004E+00 7.9010E+00 S 1 1 0 E -Gd gadolinium_Gd -gadolinium (Gd) - 591.0 5.8738 0.1058 3.3932 0.25109 2.5977 0.14 - 64 1.000000 1.000000 ----------------------------------------------------------------------------- - 65 Terbi 5 158.9253500000 2 0.40900 8.2290E+00 8.2300E+00 S 1 1 0 E -Tb terbium_Tb -terbium (Tb) - 614.0 5.9045 0.0947 3.4224 0.24453 2.6056 0.14 - 65 1.000000 1.000000 ----------------------------------------------------------------------------- - 66 Dyspr 3 162.5000000000 1 0.40615 8.5500E+00 8.5510E+00 S 1 1 0 E -Dy dysprosium_Dy -dysprosium (Dy) - 628.0 5.9183 0.0822 3.4474 0.24665 2.5849 0.14 - 66 1.000000 1.000000 ----------------------------------------------------------------------------- - 67 Holmi 5 164.9303300000 2 0.40623 8.7950E+00 8.7950E+00 S 1 1 0 E -Ho holmium_Ho -holmium (Ho) - 650.0 5.9587 0.0761 3.4782 0.24638 2.5726 0.14 - 67 1.000000 1.000000 ----------------------------------------------------------------------------- - 68 Erbiu 3 167.2590000000 3 0.40656 9.0660E+00 9.0260E+00 S 1 1 0 E -Er erbium_Er -erbium (Er) - 658.0 5.9521 0.0648 3.4922 0.24823 2.5573 0.14 - 68 1.000000 1.000000 ----------------------------------------------------------------------------- - 69 Thuli 5 168.9342200000 2 0.40844 9.3210E+00 9.3210E+00 S 1 1 0 E -Tm thulium_Tm -thulium (Tm) - 674.0 5.9677 0.0812 3.5085 0.24889 2.5469 0.14 - 69 1.000000 1.000000 ----------------------------------------------------------------------------- - 70 Ytter 3 173.0540000000 5 0.40450 6.7300E+00 6.9030E+00 S 1 1 0 E -Yb ytterbium_Yb -ytterbium (Yb) - 684.0 6.3325 0.1199 3.6246 0.25295 2.5141 0.14 - 70 1.000000 1.000000 ----------------------------------------------------------------------------- - 71 Lutet 4 174.9668000000 1 0.40579 9.8400E+00 9.8410E+00 S 1 1 0 E -Lu lutetium_Lu -lutetium (Lu) - 694.0 5.9785 0.1560 3.5218 0.24033 2.5643 0.14 - 71 1.000000 1.000000 ----------------------------------------------------------------------------- - 72 Hafni 2 178.4900000000 2 0.40338 1.3310E+01 1.3310E+01 S 1 1 0 E -Hf hafnium_Hf -hafnium (Hf) - 705.0 5.7139 0.1965 3.4337 0.22918 2.6155 0.14 - 72 1.000000 1.000000 ----------------------------------------------------------------------------- - 73 Tanta 5 180.9478800000 2 0.40343 1.6654E+01 1.6654E+01 S 1 1 0 E -Ta tantalum_Ta -tantalum (Ta) - 718.0 5.5262 0.2117 3.4805 0.17798 2.7623 0.14 - 73 1.000000 1.000000 ----------------------------------------------------------------------------- - 74 Tungs 2 183.8400000000 1 0.40252 1.9300E+01 1.9300E+01 S 1 1 2 E -W tungsten_W -tungsten (W) - 727.0 5.4059 0.2167 3.4960 0.15509 2.8447 0.14 - 74 1.000000 1.000000 -melti 3422. Tungsten -boili 5555. Tungsten ----------------------------------------------------------------------------- - 75 Rheni 3 186.2070000000 1 0.40278 2.1020E+01 2.1020E+01 S 1 1 0 E -Re rhenium_Re -rhenium (Re) - 736.0 5.3445 0.0559 3.4845 0.15184 2.8627 0.08 - 75 1.000000 1.000000 ----------------------------------------------------------------------------- - 76 Osmiu 2 190.2300000000 3 0.39952 2.2570E+01 2.2570E+01 S 1 1 0 E -Os osmium_Os -osmium (Os) - 746.0 5.3083 0.0891 3.5414 0.12751 2.9608 0.10 - 76 1.000000 1.000000 ----------------------------------------------------------------------------- - 77 Iridi 3 192.2170000000 3 0.40059 2.2420E+01 2.2420E+01 S 1 1 0 E -Ir iridium_Ir -iridium (Ir) - 757.0 5.3418 0.0819 3.5480 0.12690 2.9658 0.10 - 77 1.000000 1.000000 ----------------------------------------------------------------------------- - 78 Plati 3 195.0840000000 9 0.39983 2.1450E+01 2.1450E+01 S 1 1 2 E -Pt platinum_Pt -platinum (Pt) - 790.0 5.4732 0.1484 3.6212 0.11128 3.0417 0.12 - 78 1.000000 1.000000 -melti 1768.4 Platinum -boili 3825. Platinum ----------------------------------------------------------------------------- - 79 Gold 6 196.9665690000 5 0.40108 1.9320E+01 1.9320E+01 S 1 1 2 E -Au gold_Au -gold (Au) - 790.0 5.5747 0.2021 3.6979 0.09756 3.1101 0.14 - 79 1.000000 1.000000 -melti 1064.18 Gold -boili 2856. Gold ----------------------------------------------------------------------------- - 80 Mercu 3 200.5920000000 2 0.39882 1.3546E+01 1.3546E+01 L 1 1 0 E -Hg mercury_Hg -mercury (Hg) - 800.0 5.9605 0.2756 3.7275 0.11014 3.0519 0.14 - 80 1.000000 1.000000 ----------------------------------------------------------------------------- - 81 Thall 2 204.3800000000 2 0.39631 1.1720E+01 1.1720E+01 S 1 1 0 E -Tl thallium_Tl -thallium (Tl) - 810.0 6.1365 0.3491 3.8044 0.09455 3.1450 0.14 - 81 1.000000 1.000000 ----------------------------------------------------------------------------- - 82 Lead 1 207.2000000000 1 0.39575 1.1350E+01 1.1350E+01 S 1 1 2 E -Pb lead_Pb -lead (Pb) - 823.0 6.2018 0.3776 3.8073 0.09359 3.1608 0.14 - 82 1.000000 1.000000 -melti 327.46 Lead -boili 1749. Lead ----------------------------------------------------------------------------- - 83 Bismu 5 208.9804000000 1 0.39717 9.7470E+00 9.7470E+00 S 1 1 0 E -Bi bismuth_Bi -bismuth (Bi) - 823.0 6.3505 0.4152 3.8248 0.09410 3.1671 0.14 - 83 1.000000 1.000000 ----------------------------------------------------------------------------- - 84 Polon 5 208.9824300000 2 0.40195 9.3200E+00 9.3200E+00 S 1 1 1 R -Po polonium_Po -polonium (Po) - 830.0 6.4003 0.4267 3.8293 0.09282 3.1830 0.14 - 84 1.000000 1.000000 -Note: Since there are no stable isotopes, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 85 H-liq 3 1.0080000000 7 0.99212 6.0000E-02 7.0800E-02 L 1 1 3 E -H liquid_hydrogen -liquid hydrogen (H%2#) - 21.8 3.2632 0.4759 1.9215 0.13483 5.6249 0.00 - 1 1.000000 1.000000 -Melting point -259.34 Rubber Bible -Boiling point -252.87 Rubber Bible -Index of ref 1.112 ----------------------------------------------------------------------------- - 86 Radon 5 222.0175800000 2 0.38736 9.0662E-03 9.0662E-03 G 1 1 3 R -Rn radon_Rn -radon (Rn) - 794.0 13.2839 1.5368 4.9889 0.20798 2.7409 0.00 - 86 1.000000 1.000000 -Melting point -71. -Boiling point -61.7 -Note: Since there are no stable isotopes, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 87 C (gr 4 12.0107000000 8 0.49955 1.7000E+00 2.2100E+00 S 1 1 2 E -C carbon_graphite_C -carbon (graphite) (C) - 78.0 3.1550 0.0480 2.5387 0.20762 2.9532 0.14 - 6 1.000000 1.000000 -Sublimation point 3825.0 -Note: Density may vary 2.09 to 2.23 ----------------------------------------------------------------------------- - 88 Radiu 5 226.0254100000 2 0.38934 5.0000E+00 5.0000E+00 S 1 1 1 R -Ra radium_Ra -radium (Ra) - 826.0 7.0452 0.5991 3.9428 0.08804 3.2454 0.14 - 88 1.000000 1.000000 -Note: Since there are no stable isotopes, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 89 Actin 5 227.0277500000 2 0.39202 1.0070E+01 1.0070E+01 S 1 1 1 R -Ac actinium_Ac -actinium (Ac) - 841.0 6.3742 0.4559 3.7966 0.08567 3.2683 0.14 - 89 1.000000 1.000000 -Note: Since there are no stable isotopes, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 90 Thori 4 232.0377000000 4 0.38787 1.1720E+01 1.1720E+01 S 1 1 3 R -Th thorium_Th -thorium (Th) - 847.0 6.2473 0.4202 3.7681 0.08655 3.2610 0.14 - 90 1.000000 1.000000 -melting 1135. -boiling 4131. -Note: There is a well-defined terrestrial aboundance for thorium even though it is radioactive. ----------------------------------------------------------------------------- - 91 Prota 5 231.0358800000 2 0.39388 1.5370E+01 1.5370E+01 S 1 1 2 R -Pa protactinium_Pa -protactinium (Pa) - 878.0 6.0327 0.3144 3.5079 0.14770 2.9845 0.14 - 91 1.000000 1.000000 -melting 1572. -Note: There is a well-defined terrestrial aboundance for protactinium even though it is radioactive. ----------------------------------------------------------------------------- - 92 Urani 5 238.0289100000 3 0.38651 1.8950E+01 1.8950E+01 S 1 1 3 R -U uranium_U -uranium (U) - 890.0 5.8694 0.2260 3.3721 0.19677 2.8171 0.14 - 92 1.000000 1.000000 -melti 1135. Uranium -boili 4131. Uranium -Note: There is a well-defined terrestrial aboundance for uranium even though it is radioactive. ----------------------------------------------------------------------------- - 93 Neptu 5 237.0481700000 2 0.39233 2.0250E+01 2.0250E+01 S 1 1 1 R -Np neptunium_Np -neptunium (Np) - 902.0 5.8149 0.1869 3.3690 0.19741 2.8082 0.14 - 93 1.000000 1.000000 -Note: Since there are no stable isotopes, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 94 Pluto 5 244.0642000000 4 0.38514 1.9840E+01 1.9840E+01 S 1 1 1 R -Pu plutonium_Pu -plutonium (Pu) - 921.0 5.8748 0.1557 3.3981 0.20419 2.7679 0.14 - 94 1.000000 1.000000 -Note: Since there are no stable isotopes, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 95 Ameri 5 243.0613800000 2 0.39085 1.3670E+01 1.3670E+01 S 1 1 1 R -Am americium_Am -americium (Am) - 934.0 6.2813 0.2274 3.5021 0.20308 2.7615 0.14 - 95 1.000000 1.000000 -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 96 Curiu 5 247.0703500000 3 0.38855 1.3510E+01 1.3510E+01 S 1 1 2 R -Cm curium_Cm -curium (Cm) - 939.0 6.3097 0.2484 3.5160 0.20257 2.7579 0.14 - 96 1.000000 1.000000 -Melting 1345. -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 97 Berke 5 247.0703100000 4 0.39260 0.9860E+00 0.9860E+01 S 1 1 2 R -Bk berkelium_Bk -berkelium (Bk) - 952.0 6.2912 0.5509 3.0000 0.25556 3.0000 0.00 - 97 1.000000 1.000000 -Melting point 986. -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 98 Carbo 4 12.0107000000 8 0.49955 2.2650E+00 2.2650E+00 S 1 1 0 R -C carbon_compact_C -carbon (compact) (C) - 78.0 2.8680 -0.0178 2.3415 0.26142 2.8697 0.12 - 6 1.000000 1.000000 ----------------------------------------------------------------------------- - 99 A-150 5 -1.0000000000 0.54903 1.1270E+00 1.1270E+00 S 6 1 0 B - a-150_tissue-equivalent_plastic -A-150 tissue-equivalent plastic - 65.1 3.1100 0.1329 2.6234 0.10783 3.4442 0.00 - 1 1.000000 0.101327 - 6 0.642279 0.775501 - 7 0.024897 0.035057 - 8 0.032527 0.052316 - 9 0.009122 0.017422 - 20 0.004561 0.018378 ----------------------------------------------------------------------------- - 100 Aceto 5 -1.0000000000 0.55097 7.8990E-01 7.8990E-01 L 3 6 1 O - acetone -acetone (CH%3#COCH%3#) - 64.2 3.4341 0.2197 2.6928 0.11100 3.4047 0.00 - 1 6.000000 0.104122 - 6 3.000201 0.620405 - 8 1.000043 0.275473 -Index of ref 1.36 ----------------------------------------------------------------------------- - 101 Acety 5 -1.0000000000 0.53768 1.0967E-03 1.0967E-03 G 2 2 0 O - acetylene_CHCH -acetylene (CHCH) - 58.2 9.8419 1.6017 4.0074 0.12167 3.4277 0.00 - 1 2.000000 0.077418 - 6 2.000135 0.922582 ----------------------------------------------------------------------------- - 102 Adeni 5 -1.0000000000 0.51903 1.3500E+00 1.3500E+00 S 3 5 0 O - adenine -adenine (C%5#H%5#N%5#) - 71.4 3.1724 0.1295 2.4219 0.20908 3.0271 0.00 - 1 5.000000 0.037294 - 6 5.000354 0.444430 - 7 5.000218 0.518275 ----------------------------------------------------------------------------- - 103 Adip- 5 -1.0000000000 0.55947 9.2000E-01 9.2000E-01 S 13 1 0 B - adipose_tissue_ICRP -adipose tissue (ICRP) - 63.2 3.2367 0.1827 2.6530 0.10278 3.4817 0.00 - 1 1.000000 0.119477 - 6 0.447595 0.637240 - 7 0.004800 0.007970 - 8 0.122506 0.232333 - 11 0.000183 0.000500 - 12 0.000007 0.000020 - 15 0.000044 0.000160 - 16 0.000192 0.000730 - 17 0.000283 0.001190 - 19 0.000069 0.000320 - 20 0.000004 0.000020 - 26 0.000003 0.000020 - 30 0.000003 0.000020 ----------------------------------------------------------------------------- - 104 Air 5 -1.0000000000 0.49919 1.2048E-03 1.2048E-03 G 4 0 2 M - air_dry_1_atm -air (dry, 1 atm) - 85.7 10.5961 1.7418 4.2759 0.10914 3.3994 0.00 - 6 0.000124 0.000124 - 7 0.755267 0.755267 - 8 0.231871 0.231781 - 18 0.012827 0.012827 -Boiling point -194.35 -Index of ref 288.6 http://emtoolbox.nist.gov/ ----------------------------------------------------------------------------- - 105 Alani 5 -1.0000000000 0.53976 1.4200E+00 1.4200E+00 S 4 7 0 O - alanine -alanine (C%3#H%7#NO%2#) - 71.9 3.0965 0.1354 2.6336 0.11484 3.3526 0.00 - 1 7.000000 0.079190 - 6 3.000178 0.404439 - 7 1.000032 0.157213 - 8 2.000071 0.359159 ----------------------------------------------------------------------------- - 106 Al2O3 5 -1.0000000000 0.49038 3.9700E+00 3.9700E+00 S 2 3 3 I - aluminum_oxide_sapphire -aluminum oxide (sapphire, Al%2#O%3#) - 145.2 3.5682 0.0402 2.8665 0.08500 3.5458 0.00 - 8 3.000000 0.470749 - 13 2.000002 0.529251 -Index of refraction 1.77 -Melting point 2054. -Boiling point 3000. approximate ----------------------------------------------------------------------------- - 107 Amber 5 -1.0000000000 0.55179 1.1000E+00 1.1000E+00 S 3 16 0 O - amber -amber (C%10#H%16#O) - 63.2 3.0701 0.1335 2.5610 0.11934 3.4098 0.00 - 1 16.000000 0.105930 - 6 10.000679 0.788973 - 8 1.000042 0.105096 ----------------------------------------------------------------------------- - 108 Ammon 5 -1.0000000000 0.59719 8.2602E-04 8.2602E-04 G 2 3 1 I - ammonia -ammonia (NH%3#) - 53.7 9.8763 1.6822 4.1158 0.08315 3.6464 0.00 - 1 3.000000 0.177547 - 7 1.000038 0.822453 -Index of ref (n-1)*E6 376.0 http://www.kayelaby.npl.co.uk/ ----------------------------------------------------------------------------- - 109 Anili 5 -1.0000000000 0.53699 1.0235E+00 1.0235E+00 L 3 7 0 O - aniline -aniline (C%6#H%5#NH%2#) - 66.2 3.2622 0.1618 2.5805 0.13134 3.3434 0.00 - 1 7.000000 0.075759 - 6 6.000400 0.773838 - 7 1.000041 0.150403 ----------------------------------------------------------------------------- - 110 Anthr 5 -1.0000000000 0.52740 1.2830E+00 1.2830E+00 S 2 10 0 O - anthracene -anthracene (C%14#H%10#) - 69.5 3.1514 0.1146 2.5213 0.14677 3.2831 0.00 - 1 10.000000 0.056550 - 6 14.000793 0.943450 ----------------------------------------------------------------------------- - 111 B-100 5 -1.0000000000 0.52740 1.4500E+00 1.4500E+00 S 6 1 0 B - b-100_Bone-equivalent_plastic -b-100 Bone-equivalent plastic - 85.9 3.4528 0.1252 3.0420 0.05268 3.7365 0.00 - 1 1.000000 0.065471 - 6 0.688251 0.536945 - 7 0.023631 0.021500 - 8 0.030873 0.032085 - 9 0.135660 0.167411 - 20 0.067833 0.176589 ----------------------------------------------------------------------------- - 112 Bakel 5 -1.0000000000 0.52792 1.2500E+00 1.2500E+00 S 3 38 0 P - bakelite -bakelite [(C%43#H%38#O%7#)%n#] - 72.4 3.2582 0.1471 2.6055 0.12713 3.3470 0.00 - 1 38.000000 0.057441 - 6 43.003166 0.774591 - 8 7.000340 0.167968 ----------------------------------------------------------------------------- - 113 Ba-F2 5 -1.0000000000 0.42207 4.8900E+00 4.8930E+00 S 2 2 3 I - barium_fluoride -barium fluoride (BaF%2#) - 375.9 5.4122 -0.0098 3.3871 0.15991 2.8867 0.00 - 9 2.000000 0.216720 - 56 1.000021 0.783280 -Melting point (C) 1368. -Boiling point (C) 2260. -Index of ref 1.4744 CRC2006 10-246 ----------------------------------------------------------------------------- - 114 Ba-SO 5 -1.0000000000 0.44561 4.5000E+00 4.5000E+00 S 3 4 0 I - barium_sulfate -barium sulfate BaSO%4# - 285.7 4.8923 -0.0128 3.4069 0.11747 3.0427 0.00 - 8 4.000000 0.274212 - 16 0.999811 0.137368 - 56 1.000020 0.588420 ----------------------------------------------------------------------------- - 115 Benze 5 -1.0000000000 0.53769 8.7865E-01 8.7865E-01 L 2 6 0 O - benzene -benzene C%6#H%6# - 63.4 3.3269 0.1710 2.5091 0.16519 3.2174 0.00 - 1 6.000000 0.077418 - 6 6.000406 0.922582 ----------------------------------------------------------------------------- - 116 Be-O 5 -1.0000000000 0.47979 3.0100E+00 3.0100E+00 S 2 1 0 I - beryllium_oxide_BeO -beryllium oxide (BeO) - 93.2 2.9801 0.0241 2.5846 0.10755 3.4927 0.00 - 4 1.000000 0.360320 - 8 1.000002 0.639680 ----------------------------------------------------------------------------- - 117 BGO 5 -1.0000000000 0.42065 7.1300E+00 7.1300E+00 S 3 12 3 I - bismuth_germanate_BGO -bismuth germanate (BGO) [(Bi%2#O%3#)%2#(GeO%2#)%3#] - 534.1 5.7409 0.0456 3.7816 0.09569 3.0781 0.00 - 8 12.000000 0.154126 - 32 2.999188 0.174820 - 83 4.000009 0.671054 -Melting point 1044. CRC2006 -Index of refraction 2.15 -Note: Evalite structure; less common is Bi{12}GeO{20} ----------------------------------------------------------------------------- - 118 Blood 5 -1.0000000000 0.54995 1.0600E+00 1.0600E+00 L 14 1 0 B - blood_ICRP -blood (ICRP) - 75.2 3.4581 0.2239 2.8017 0.08492 3.5406 0.00 - 1 1.000000 0.101866 - 6 0.082399 0.100020 - 7 0.020939 0.029640 - 8 0.469656 0.759414 - 11 0.000796 0.001850 - 12 0.000016 0.000040 - 14 0.000011 0.000030 - 15 0.000112 0.000350 - 16 0.000571 0.001850 - 17 0.000776 0.002780 - 19 0.000413 0.001630 - 20 0.000015 0.000060 - 26 0.000082 0.000460 - 30 0.000002 0.000010 ----------------------------------------------------------------------------- - 119 Bonec 5 -1.0000000000 0.53010 1.8500E+00 1.8500E+00 S 8 1 0 B - compact_bone_ICRU -compact bone (ICRU) - 91.9 3.3390 0.0944 3.0201 0.05822 3.6419 0.00 - 1 1.000000 0.063984 - 6 0.364619 0.278000 - 7 0.030366 0.027000 - 8 0.403702 0.410016 - 12 0.001296 0.002000 - 15 0.035601 0.070000 - 16 0.000983 0.002000 - 20 0.057780 0.147000 ----------------------------------------------------------------------------- - 120 Bonec 5 -1.0000000000 0.52130 1.8500E+00 1.8500E+00 S 9 1 0 B - cortical_bone_ICRP -cortical bone (ICRP) - 106.4 3.6488 0.1161 3.0919 0.06198 3.5919 0.00 - 1 1.000000 0.047234 - 6 0.256430 0.144330 - 7 0.063972 0.041990 - 8 0.594983 0.446096 - 12 0.001932 0.002200 - 15 0.072319 0.104970 - 16 0.002096 0.003150 - 20 0.111776 0.209930 - 30 0.000033 0.000100 ----------------------------------------------------------------------------- - 121 B4-C 5 -1.0000000000 0.47059 2.5200E+00 2.5200E+00 S 2 4 0 I - boron_carbide -boron carbide (B%4#C) - 84.7 2.9859 0.0093 2.1006 0.37087 2.8076 0.00 - 5 4.000000 0.782610 - 6 1.000119 0.217390 ----------------------------------------------------------------------------- - 122 B2-O3 5 -1.0000000000 0.49839 1.8120E+00 1.8120E+00 S 2 2 0 I - boron_oxide -boron oxide (B%2#O%3#) - 99.6 3.6027 0.1843 2.7379 0.11548 3.3832 0.00 - 5 2.000000 0.310551 - 8 3.000277 0.689449 ----------------------------------------------------------------------------- - 123 Brain 5 -1.0000000000 0.55423 1.0300E+00 1.0300E+00 S 13 1 0 B - brain_ICRP -brain (ICRP) - 73.3 3.4279 0.2206 2.8021 0.08255 3.5585 0.00 - 1 1.000000 0.110667 - 6 0.095108 0.125420 - 7 0.008635 0.013280 - 8 0.419958 0.737723 - 11 0.000729 0.001840 - 12 0.000056 0.000150 - 15 0.001041 0.003540 - 16 0.000503 0.001770 - 17 0.000606 0.002360 - 19 0.000722 0.003100 - 20 0.000020 0.000090 - 26 0.000008 0.000050 - 30 0.000001 0.000010 ----------------------------------------------------------------------------- - 124 Butan 5 -1.0000000000 0.59497 2.4934E-03 2.4890E-03 G 2 10 2 O - butane -butane (C%4#H%10#) - 48.3 8.5633 1.3788 3.7524 0.10852 3.4884 0.00 - 1 10.000000 0.173408 - 6 4.000262 0.826592 -Boiling point -0.5 -Melting point -138.2 ----------------------------------------------------------------------------- - 125 Butyl 5 -1.0000000000 0.56663 8.0980E-01 8.0980E-01 L 3 10 0 O - n-butyl_alcohol -n-butyl alcohol (C%4#H%9#OH) - 59.9 3.2425 0.1937 2.6439 0.10081 3.5139 0.00 - 1 10.000000 0.135978 - 6 4.000252 0.648171 - 8 1.000038 0.215851 ----------------------------------------------------------------------------- - 126 C-552 5 -1.0000000000 0.49969 1.7600E+00 1.7600E+00 S 5 1 0 B - C-552_air-equivalent_plastic -C-552 air-equivalent plastic - 86.8 3.3338 0.1510 2.7083 0.10492 3.4344 0.00 - 1 1.000000 0.024680 - 6 1.705640 0.501610 - 8 0.011556 0.004527 - 9 1.000047 0.465209 - 14 0.005777 0.003973 ----------------------------------------------------------------------------- - 127 Cd-Te 5 -1.0000000000 0.41665 6.2000E+00 6.2000E+00 S 2 1 0 I - cadmium_telluride_CdTe -cadmium telluride (CdTe) - 539.3 5.9096 0.0438 3.2836 0.24840 2.6665 0.00 - 48 1.000000 0.468355 - 52 1.000011 0.531645 ----------------------------------------------------------------------------- - 128 Cd-W- 5 -1.0000000000 0.42747 7.9000E+00 7.9000E+00 S 3 4 0 I - cadmium_tungstate -cadmium tungstate (CdWO%4#) - 468.3 5.3594 0.0123 3.5941 0.12861 2.9150 0.00 - 8 4.000000 0.177644 - 48 0.999992 0.312027 - 74 1.000054 0.510329 ----------------------------------------------------------------------------- - 129 Ca-C- 5 -1.0000000000 0.49955 2.8000E+00 2.8000E+00 S 3 1 0 I - calcium_carbonate -calcium carbonate (CaCO%3#) - 136.4 3.7738 0.0492 3.0549 0.08301 3.4120 0.00 - 6 1.000000 0.120003 - 8 2.999923 0.479554 - 20 1.000025 0.400443 ----------------------------------------------------------------------------- - 130 Ca-F2 5 -1.0000000000 0.49670 3.1800E+00 3.1800E+00 S 2 2 1 I - calcium_fluoride -calcium fluoride (CaF%2#) - 166.0 4.0653 0.0676 3.1683 0.06942 3.5263 0.00 - 9 2.000000 0.486659 - 20 1.000051 0.513341 -Index of ref 1.434 ----------------------------------------------------------------------------- - 131 Ca-O 5 -1.0000000000 0.49929 3.3000E+00 3.3000E+00 S 2 1 0 I - calcium_oxide_CaO -calcium oxide (CaO) - 176.1 4.1209 -0.0172 3.0171 0.12128 3.1936 0.00 - 8 1.000000 0.285299 - 20 1.000050 0.714701 ----------------------------------------------------------------------------- - 132 Ca-S- 5 -1.0000000000 0.49950 2.9600E+00 2.9600E+00 S 3 4 0 I - calcium_sulfate -calcium sulfate (CaSO%4#) - 152.3 3.9388 0.0587 3.1229 0.07708 3.4495 0.00 - 8 4.000000 0.470095 - 16 0.999813 0.235497 - 20 1.000050 0.294408 ----------------------------------------------------------------------------- - 133 Ca-W- 5 -1.0000000000 0.43761 6.0620E+00 6.0620E+00 S 3 4 0 I - calcium_tungstate -calcium tungstate (CaWO%4#) - 395.0 5.2603 0.0323 3.8932 0.06210 3.2649 0.00 - 8 4.000000 0.222270 - 20 1.000051 0.139202 - 74 1.000054 0.638529 ----------------------------------------------------------------------------- - 134 C-O2 5 -1.0000000000 0.49989 1.8421E-03 1.8421E-03 G 2 2 2 I - carbon_dioxide_gas -carbon dioxide gas (CO%2#) - 85.0 10.1537 1.6294 4.1825 0.11768 3.3227 0.00 - 6 2.000000 0.272916 - 8 3.999910 0.727084 -Index of ref (n-1)*E6 449.0 http://www.kayelaby.npl.co.uk/ -Sublimation point -78.4 194.7 K ----------------------------------------------------------------------------- - 135 C-Cl4 5 -1.0000000000 0.49107 1.5940E+00 1.5940E+00 L 2 1 0 O - carbon_tetrachloride -carbon tetrachloride (CCl%4#) - 166.3 4.7712 0.1773 2.9165 0.19018 3.0116 0.00 - 6 1.000000 0.078083 - 17 3.999948 0.921917 ----------------------------------------------------------------------------- - 136 Cello 5 -1.0000000000 0.53040 1.4200E+00 1.4200E+00 S 3 10 0 P - cellulose -cellulose [(C%6#H%10#O%5#)%n#] - 77.6 3.2647 0.1580 2.6778 0.11151 3.3810 0.00 - 1 10.000000 0.062162 - 6 6.000342 0.444462 - 8 5.000161 0.493376 ----------------------------------------------------------------------------- - 137 Cella 5 -1.0000000000 0.53279 1.2000E+00 1.2000E+00 S 3 22 0 P - cellulose_acetate_butyrate -cellulose acetate butyrate [(C%15#H%22#O%8#)%n#] - 74.6 3.3497 0.1794 2.6809 0.11444 3.3738 0.00 - 1 22.000000 0.067125 - 6 15.001071 0.545403 - 8 8.000363 0.387472 ----------------------------------------------------------------------------- - 138 Celln 5 -1.0000000000 0.51424 1.4900E+00 1.4900E+00 S 4 7 0 P - cellulose_nitrate -cellulose nitrate [(C%12#H%14#O%4#(ONO%2#)%6#)%n#] - 87.0 3.4762 0.1897 2.7253 0.11813 3.3237 0.00 - 1 7.000000 0.029216 - 6 5.454903 0.271296 - 7 2.090979 0.121276 - 8 8.727611 0.578212 ----------------------------------------------------------------------------- - 139 Cersu 5 -1.0000000000 0.55279 1.0300E+00 1.0300E+00 L 5 1 0 B - ceric_sulfate_dosimeter_solution -ceric sulfate dosimeter solution - 76.7 3.5212 0.2363 2.8769 0.07666 3.5607 0.00 - 1 1.000000 0.107596 - 7 0.000535 0.000800 - 8 0.512308 0.874976 - 16 0.004273 0.014627 - 58 0.000134 0.002001 ----------------------------------------------------------------------------- - 140 Cs-F 5 -1.0000000000 0.42132 4.1150E+00 4.1150E+00 S 2 1 0 I - cesium_fluoride_CsF -cesium fluoride (CsF) - 440.7 5.9046 0.0084 3.3374 0.22052 2.7280 0.00 - 9 1.000000 0.125069 - 55 0.999996 0.874931 ----------------------------------------------------------------------------- - 141 Cs-I 5 -1.0000000000 0.41569 4.5100E+00 4.5100E+00 S 2 1 3 I - cesium_iodide_CsI -cesium iodide (CsI) - 553.1 6.2807 0.0395 3.3353 0.25381 2.6657 0.00 - 53 1.000000 0.488451 - 55 1.000001 0.511549 -melti 621. Caesium iodide -boili 1280. Caesium iodide -Index 1.7873 CRC2006 10-147 ----------------------------------------------------------------------------- - 142 Chlor 5 -1.0000000000 0.51529 1.1058E+00 1.1058E+00 L 3 5 0 O - chlorobenzene -chlorobenzene C%6#H%5#Cl - 89.1 3.8201 0.1714 2.9272 0.09856 3.3797 0.00 - 1 5.000000 0.044772 - 6 6.000428 0.640254 - 17 1.000054 0.314974 ----------------------------------------------------------------------------- - 143 Chlor 5 -1.0000000000 0.48585 1.4832E+00 1.4832E+00 L 3 1 0 O - chloroform -chloroform (CHCl%3#) - 156.0 4.7055 0.1786 2.9581 0.16959 3.0627 0.00 - 1 1.000000 0.008443 - 6 1.000054 0.100613 - 17 3.000123 0.890944 ----------------------------------------------------------------------------- - 144 Concr 5 -1.0000000000 0.50274 2.3000E+00 2.3000E+00 S 10 1 2 M - shielding_concrete -shielding concrete - 135.2 3.9464 0.1301 3.0466 0.07515 3.5467 0.00 - 1 1.000000 0.010000 - 6 0.008392 0.001000 - 8 3.333301 0.529107 - 11 0.070149 0.016000 - 12 0.008294 0.002000 - 13 0.126534 0.033872 - 14 1.209510 0.337021 - 19 0.033514 0.013000 - 20 0.110658 0.044000 - 26 0.025268 0.014000 -Note: Standard shielding blocks, typical composition O%2# 0.52, Si 0.325, Ca 0.06, Na 0.015, Fe 0.02, Al 0.04 - plus reinforcing iron bars, from CERN-LRL-RHEL Shielding exp., UCRA-17841. ----------------------------------------------------------------------------- - 145 Cyclo 5 -1.0000000000 0.57034 7.7900E-01 7.7900E-01 L 2 12 0 O - cyclohexane -cyclohexane (C%6#H%12#) - 56.4 3.1544 0.1728 2.5549 0.12035 3.4278 0.00 - 1 12.000000 0.143711 - 6 6.000369 0.856289 ----------------------------------------------------------------------------- - 146 Dichl 5 -1.0000000000 0.50339 1.3048E+00 1.3048E+00 L 3 4 0 O - 12-dichlorobenzene -1,2-dichlorobenzene (C%6#H%4#Cl%2#) - 106.5 4.0348 0.1587 2.8276 0.16010 3.0836 0.00 - 1 4.000000 0.027425 - 6 6.000428 0.490233 - 17 2.000110 0.482342 ----------------------------------------------------------------------------- - 147 Dichl 5 -1.0000000000 0.51744 1.2199E+00 1.2199E+00 L 4 8 0 O - dichlorodiethyl_ether -dichlorodiethyl ether C%4#Cl%2#H%8#O - 103.3 4.0135 0.1773 3.1586 0.06799 3.5250 0.00 - 1 8.000000 0.056381 - 6 4.000257 0.335942 - 8 1.000040 0.111874 - 17 2.000096 0.495802 ----------------------------------------------------------------------------- - 148 Dichl 5 -1.0000000000 0.50526 1.2351E+00 1.2351E+00 L 3 4 0 O - 12-dichloroethane -1,2-dichloroethane C%2#H%4#C%12# - 111.9 4.1849 0.1375 2.9529 0.13383 3.1675 0.00 - 1 4.000000 0.040740 - 6 2.000126 0.242746 - 17 2.000090 0.716515 ----------------------------------------------------------------------------- - 149 Dieth 5 -1.0000000000 0.56663 7.1378E-01 7.1378E-01 L 3 10 0 O - diethyl_ether -diethyl ether [(CH%3#CH%2#)%2#O] - 60.0 3.3721 0.2231 2.6745 0.10550 3.4586 0.00 - 1 10.000000 0.135978 - 6 4.000252 0.648171 - 8 1.000038 0.215851 ----------------------------------------------------------------------------- - 150 Dimet 5 -1.0000000000 0.54724 9.4870E-01 9.4870E-01 S 4 7 0 O - mn-dimethyl_formamide -mn-dimethyl formamide (C%3#H%6#NOH) - 66.6 3.3311 0.1977 2.6686 0.11470 3.3710 0.00 - 1 7.000000 0.096523 - 6 3.000196 0.492965 - 7 1.000039 0.191625 - 8 1.000042 0.218887 ----------------------------------------------------------------------------- - 151 Dimet 5 -1.0000000000 0.53757 1.1014E+00 1.1014E+00 S 4 6 0 O - dimethyl_sulfoxide -dimethyl sulfoxide (CH%3#)%2#SO - 98.6 3.9844 0.2021 3.1263 0.06619 3.5708 0.00 - 1 6.000000 0.077403 - 6 2.000130 0.307467 - 8 1.000037 0.204782 - 16 0.999852 0.410348 ----------------------------------------------------------------------------- - 152 Ethan 5 -1.0000000000 0.59861 1.2532E-03 1.2630E-03 G 2 6 4 O - ethane -ethane (C%2#H%6#) - 45.4 9.1043 1.5107 3.8743 0.09627 3.6095 0.00 - 1 6.000000 0.201115 - 6 2.000126 0.798885 -Boiling point -88.6 -Triple point -89.88 -Melting point -182.79 -Note: Density of liquid at - 88.6 C is 0.5645 ----------------------------------------------------------------------------- - 153 Ethan 5 -1.0000000000 0.56437 7.8930E-01 7.8930E-01 L 3 6 3 O - ethanol -ethanol (C%2#H%5#OH) - 62.9 3.3699 0.2218 2.7052 0.09878 3.4834 0.00 - 1 6.000000 0.131269 - 6 2.000130 0.521438 - 8 1.000040 0.347294 -Index of refraction 1.36 -Melting point -114.14 -Boiling point 78.29 ----------------------------------------------------------------------------- - 154 Ethyl 5 -1.0000000000 0.54405 1.1300E+00 1.1300E+00 S 3 22 0 P - ethyl_cellulose -ethyl cellulose ([C%12#H%22#O5)%n#] - 69.3 3.2415 0.1683 2.6527 0.11077 3.4098 0.00 - 1 22.000000 0.090027 - 6 12.000718 0.585182 - 8 5.000172 0.324791 ----------------------------------------------------------------------------- - 155 Ethyl 5 -1.0000000000 0.57034 1.1750E-03 1.1750E-03 G 2 4 0 O - ethylene -ethylene (C%2#H%4#) - 50.7 9.4380 1.5528 3.9327 0.10636 3.5387 0.00 - 1 4.000000 0.143711 - 6 2.000123 0.856289 ----------------------------------------------------------------------------- - 156 Eye-l 5 -1.0000000000 0.54977 1.1000E+00 1.1000E+00 S 4 1 0 B - eye_lens_ICRP -eye lens (ICRP) - 73.3 3.3720 0.2070 2.7446 0.09690 3.4550 0.00 - 1 1.000000 0.099269 - 6 0.163759 0.193710 - 7 0.038616 0.053270 - 8 0.414887 0.653751 ----------------------------------------------------------------------------- - 157 Fe2-O 5 -1.0000000000 0.47592 5.2000E+00 5.2000E+00 S 2 3 0 I - ferric_oxide -ferric oxide (Fe%2#O%3#) - 227.3 4.2245 -0.0074 3.2573 0.10478 3.1313 0.00 - 8 3.000000 0.300567 - 26 2.000071 0.699433 ----------------------------------------------------------------------------- - 158 Fe-B 5 -1.0000000000 0.46507 7.1500E+00 7.1500E+00 S 2 1 0 I - ferroboride_FeB -ferroboride (FeB) - 261.0 4.2057 -0.0988 3.1749 0.12911 3.0240 0.00 - 5 1.000000 0.162174 - 26 1.000125 0.837826 ----------------------------------------------------------------------------- - 159 Fe-O 5 -1.0000000000 0.47323 5.7000E+00 5.7000E+00 S 2 1 0 I - ferrous_oxide_FeO -ferrous oxide (FeO) - 248.6 4.3175 -0.0279 3.2002 0.12959 3.0168 0.00 - 8 1.000000 0.222689 - 26 1.000036 0.777311 ----------------------------------------------------------------------------- - 160 Fe-su 5 -1.0000000000 0.55329 1.0240E+00 1.0240E+00 L 7 1 0 B - ferrous_sulfate_dosimeter_solution -ferrous sulfate dosimeter solution - 76.4 3.5183 0.2378 2.8254 0.08759 3.4923 0.00 - 1 1.000000 0.108259 - 7 0.000018 0.000027 - 8 0.511300 0.878636 - 11 0.000009 0.000022 - 16 0.003765 0.012968 - 17 0.000009 0.000034 - 26 0.000009 0.000054 ----------------------------------------------------------------------------- - 161 Freon 5 -1.0000000000 0.47969 1.1200E+00 1.1200E+00 G 3 1 0 O - Freon-12 -Freon-12 (CF%2#Cl%2#) - 143.0 4.8251 0.3035 3.2659 0.07978 3.4626 0.00 - 6 1.000000 0.099335 - 9 1.999954 0.314247 - 17 1.999972 0.586418 ----------------------------------------------------------------------------- - 162 Freon 5 -1.0000000000 0.44901 1.8000E+00 1.8000E+00 G 3 1 0 O - Freon-12B2 -Freon-12B2 (CF%2#Br%2#) - 284.9 5.7976 0.3406 3.7956 0.05144 3.5565 0.00 - 6 1.000000 0.057245 - 9 1.999966 0.181096 - 35 1.999967 0.761659 ----------------------------------------------------------------------------- - 163 Freon 5 -1.0000000000 0.47966 9.5000E-01 9.5000E-01 G 3 1 0 O - Freon-13 -Freon-13 (CF%3#Cl) - 126.6 4.7483 0.3659 3.2337 0.07238 3.5551 0.00 - 6 1.000000 0.114983 - 9 2.999918 0.545622 - 17 0.999982 0.339396 ----------------------------------------------------------------------------- - 164 Freon 5 -1.0000000000 0.45665 1.5000E+00 1.5000E+00 G 3 1 0 O - Freon-13b1 -Freon-13b1 (CF%3#Br) - 210.5 5.3555 0.3522 3.7554 0.03925 3.7194 0.00 - 6 1.000000 0.080659 - 9 2.999939 0.382749 - 35 0.999980 0.536592 ----------------------------------------------------------------------------- - 165 Freon 5 -1.0000000000 0.43997 1.8000E+00 1.8000E+00 G 3 1 0 O - Freon-13i1 -Freon-13i1 (CF%3#I) - 293.5 5.8774 0.2847 3.7280 0.09112 3.1658 0.00 - 6 1.000000 0.061309 - 9 2.999898 0.290924 - 53 0.999968 0.647767 ----------------------------------------------------------------------------- - 166 Gd2-O 5 -1.0000000000 0.42266 7.4400E+00 7.4400E+00 S 3 2 0 I - gadolinium_oxysulfide -gadolinium oxysulfide (Gd%2#O%2#S) - 493.3 5.5347 -0.1774 3.4045 0.22161 2.6300 0.00 - 8 2.000000 0.084528 - 16 0.999817 0.084690 - 64 1.999998 0.830782 ----------------------------------------------------------------------------- - 167 Ga-As 5 -1.0000000000 0.44247 5.3100E+00 5.3100E+00 S 2 1 0 I - gallium_arsenide_GaAs -gallium arsenide (GaAs) - 384.9 5.3299 0.1764 3.6420 0.07152 3.3356 0.00 - 31 1.000000 0.482019 - 33 1.000043 0.517981 ----------------------------------------------------------------------------- - 168 Photo 5 -1.0000000000 0.53973 1.2914E+00 1.2914E+00 S 5 1 0 M - gel_in_photographic_emulsion -gel in photographic emulsion - 74.8 3.2687 0.1709 2.7058 0.10102 3.4418 0.00 - 1 1.000000 0.081180 - 6 0.430104 0.416060 - 7 0.098607 0.111240 - 8 0.295390 0.380640 - 16 0.004213 0.010880 ----------------------------------------------------------------------------- - 169 Pyrex 5 -1.0000000000 0.49707 2.2300E+00 2.2300E+00 S 6 1 0 M - borosilicate_glass_Pyrex_Corning_7740 -borosilicate glass (Pyrex Corning 7740) - 134.0 3.9708 0.1479 2.9933 0.08270 3.5224 0.00 - 5 1.000000 0.040061 - 8 9.100880 0.539564 - 11 0.330918 0.028191 - 13 0.116461 0.011644 - 14 3.624571 0.377220 - 19 0.022922 0.003321 ----------------------------------------------------------------------------- - 170 Lead 5 -1.0000000000 0.42101 6.2200E+00 6.2200E+00 S 5 1 0 M - lead_glass -lead glass - 526.4 5.8476 0.0614 3.8146 0.09544 3.0740 0.00 - 8 1.000000 0.156453 - 14 0.294445 0.080866 - 22 0.017288 0.008092 - 33 0.003618 0.002651 - 82 0.371118 0.751938 ----------------------------------------------------------------------------- - 171 Glass 5 -1.0000000000 0.49731 2.4000E+00 2.4000E+00 S 4 1 0 M - plate_glass -plate glass - 145.4 4.0602 0.1237 3.0649 0.07678 3.5381 0.00 - 8 1.000000 0.459800 - 11 0.145969 0.096441 - 14 0.416971 0.336553 - 20 0.093077 0.107205 ----------------------------------------------------------------------------- - 172 Gluco 5 -1.0000000000 0.53499 1.5400E+00 1.5400E+00 S 3 14 0 O - glucose_dextrose_monohydrate -glucose (dextrose monohydrate) (C%6#H%12#O%6#.H%2#O)) - 77.2 3.1649 0.1411 2.6700 0.10783 3.3946 0.00 - 1 14.000000 0.071204 - 6 6.000342 0.363652 - 8 7.000253 0.565144 ----------------------------------------------------------------------------- - 173 Gluta 5 -1.0000000000 0.53371 1.4600E+00 1.4600E+00 S 4 10 0 O - glutamine -glutamine (C%5#H%10#N%2#O%3#) - 73.3 3.1167 0.1347 2.6301 0.11931 3.3254 0.00 - 1 10.000000 0.068965 - 6 5.000360 0.410926 - 7 2.000082 0.191681 - 8 3.000137 0.328427 ----------------------------------------------------------------------------- - 174 Glyce 5 -1.0000000000 0.54292 1.2613E+00 1.2613E+00 L 3 8 0 O - glycerol -glycerol (C%3#H%5#(OH)%3#) - 72.6 3.2267 0.1653 2.6862 0.10168 3.4481 0.00 - 1 8.000000 0.087554 - 6 3.000185 0.391262 - 8 3.000108 0.521185 ----------------------------------------------------------------------------- - 175 Guani 5 -1.0000000000 0.51612 1.5800E+00 1.5800E+00 S 4 5 0 O - guanine -guanine (C%5#H%5#N%5#O) - 75.0 3.1171 0.1163 2.4296 0.20530 3.0186 0.00 - 1 5.000000 0.033346 - 6 5.000329 0.397380 - 7 5.000189 0.463407 - 8 1.000041 0.105867 ----------------------------------------------------------------------------- - 176 Gypsu 5 -1.0000000000 0.51113 2.3200E+00 2.3200E+00 S 4 4 0 I - gypsum_plaster_of_Paris -gypsum (plaster of Paris, CaSO%4#$\cdot$H%2#O) - 129.7 3.8382 0.0995 3.1206 0.06949 3.5134 0.00 - 1 4.000000 0.023416 - 8 6.000387 0.557572 - 16 0.999889 0.186215 - 20 1.000123 0.232797 ----------------------------------------------------------------------------- - 177 Hepta 5 -1.0000000000 0.57992 6.8376E-01 6.8376E-01 L 2 16 0 O - n-heptane -n-heptane (C%7#H%16#) - 54.4 3.1978 0.1928 2.5706 0.11255 3.4885 0.00 - 1 16.000000 0.160937 - 6 7.000435 0.839063 ----------------------------------------------------------------------------- - 178 Hexan 5 -1.0000000000 0.59020 6.6030E-01 6.6030E-01 L 2 14 0 O - n-hexane -n-hexane C%6#H%14# - 54.0 3.2156 0.1984 2.5757 0.11085 3.5027 0.00 - 1 14.000000 0.163741 - 6 6.000366 0.836259 ----------------------------------------------------------------------------- - 179 Kapto 5 -1.0000000000 0.51264 1.4200E+00 1.4200E+00 S 4 10 0 P - polyimide_film -polyimide film [(C%22#H%10#N%2#O%5#)%n#] - 79.6 3.3497 0.1509 2.5631 0.15972 3.1921 0.00 - 1 10.000000 0.026362 - 6 22.001366 0.691133 - 7 2.000071 0.073270 - 8 5.000195 0.209235 ----------------------------------------------------------------------------- - 180 La-O- 5 -1.0000000000 0.42599 6.2800E+00 6.2800E+00 S 3 1 0 I - lanthanum_oxybromide_LaOBr -lanthanum oxybromide (LaOBr) - 439.7 5.4666 -0.0350 3.3288 0.17830 2.8457 0.00 - 8 1.000000 0.068138 - 35 1.000000 0.340294 - 57 0.999999 0.591568 ----------------------------------------------------------------------------- - 181 La2-O 5 -1.0000000000 0.42706 5.8600E+00 5.8600E+00 S 3 2 0 I - lanthanum_oxysulfide -lanthanum oxysulfide La%2#O%2#S - 421.2 5.4470 -0.0906 3.2664 0.21501 2.7298 0.00 - 8 2.000000 0.093600 - 16 0.999802 0.093778 - 57 1.999986 0.812622 ----------------------------------------------------------------------------- - 182 Pb-O 5 -1.0000000000 0.40323 9.5300E+00 9.5300E+00 S 2 1 0 I - lead_oxide_PbO -lead oxide (PbO) - 766.7 6.2162 0.0356 3.5456 0.19645 2.7299 0.00 - 8 1.000000 0.071682 - 82 1.000001 0.928318 ----------------------------------------------------------------------------- - 183 Li-N- 5 -1.0000000000 0.52257 1.1780E+00 1.1780E+00 S 3 2 0 I - lithium_amide -lithium amide (LiNH%2#) - 55.5 2.7961 0.0198 2.5152 0.08740 3.7534 0.00 - 1 2.000000 0.087783 - 3 1.000036 0.302262 - 7 1.000035 0.609955 ----------------------------------------------------------------------------- - 184 LI2-C 5 -1.0000000000 0.49720 2.1100E+00 2.1100E+00 S 3 2 0 I - lithium_carbonate -lithium carbonate (Li%2#C-O%3#) - 87.9 3.2029 0.0551 2.6598 0.09936 3.5417 0.00 - 3 2.000000 0.187871 - 6 1.000025 0.162550 - 8 2.999995 0.649579 ----------------------------------------------------------------------------- - 185 Li-F 5 -1.0000000000 0.46262 2.6350E+00 2.6350E+00 S 2 1 3 I - lithium_fluoride_LiF -lithium fluoride (LiF) - 94.0 3.1667 0.0171 2.7049 0.07593 3.7478 0.00 - 3 1.000000 0.267585 - 9 1.000001 0.732415 -melti 848.2 Lithium flouride -boili 1673. Lithium flouride -Index of ref 1.392 old RPP value ----------------------------------------------------------------------------- - 186 Li-H 5 -1.0000000000 0.50321 8.2000E-01 8.2000E-01 S 2 1 1 I - lithium_hydride_LiH -lithium hydride (LiH) - 36.5 2.3580 -0.0988 1.4515 0.90567 2.5849 0.00 - 1 1.000000 0.126797 - 3 1.000043 0.873203 -Melting point 692 ----------------------------------------------------------------------------- - 187 Li-I 5 -1.0000000000 0.41939 3.4940E+00 3.4940E+00 S 2 1 0 I - lithium_iodide_LiI -lithium iodide (LiI) - 485.1 6.2671 0.0892 3.3702 0.23274 2.7146 0.00 - 3 1.000000 0.051858 - 53 1.000006 0.948142 ----------------------------------------------------------------------------- - 188 Li2-O 5 -1.0000000000 0.46952 2.0130E+00 2.0130E+00 S 2 2 0 I - lithium_oxide -lithium oxide Li%2#O - 73.6 2.9340 -0.0511 2.5874 0.08035 3.7878 0.00 - 3 2.000000 0.464570 - 8 1.000000 0.535430 ----------------------------------------------------------------------------- - 189 Li2-B 5 -1.0000000000 0.48487 2.4400E+00 2.4400E+00 S 3 2 0 I - lithium_tetraborate -lithium tetraborate Li%2#B%4#O%7# - 94.6 3.2093 0.0737 2.6502 0.11075 3.4389 0.00 - 3 2.000000 0.082085 - 5 3.999624 0.255680 - 8 6.999978 0.662235 ----------------------------------------------------------------------------- - 190 Lung 5 -1.0000000000 0.54965 1.0500E+00 1.0500E+00 S 13 1 0 B - lung_ICRP -lung (ICRP) - 75.3 3.4708 0.2261 2.8001 0.08588 3.5353 0.00 - 1 1.000000 0.101278 - 6 0.084775 0.102310 - 7 0.020357 0.028650 - 8 0.470926 0.757072 - 11 0.000797 0.001840 - 12 0.000299 0.000730 - 15 0.000257 0.000800 - 16 0.000698 0.002250 - 17 0.000747 0.002660 - 19 0.000494 0.001940 - 20 0.000022 0.000090 - 26 0.000066 0.000370 - 30 0.000002 0.000010 ----------------------------------------------------------------------------- - 191 M3-wa 5 -1.0000000000 0.55512 1.0500E+00 1.0500E+00 S 5 1 0 B - M3_WAX -M3 WAX - 67.9 3.2540 0.1523 2.7529 0.07864 3.6412 0.00 - 1 1.000000 0.114318 - 6 0.481436 0.655823 - 8 0.050800 0.092183 - 12 0.048898 0.134792 - 20 0.000634 0.002883 ----------------------------------------------------------------------------- - 192 Mg-C- 5 -1.0000000000 0.49814 2.9580E+00 2.9580E+00 S 3 1 0 I - magnesium_carbonate -magnesium carbonate MgCO%3# - 118.0 3.4319 0.0860 2.7997 0.09219 3.5003 0.00 - 6 1.000000 0.142455 - 8 2.999932 0.569278 - 12 0.999977 0.288267 ----------------------------------------------------------------------------- - 193 Mg-F2 5 -1.0000000000 0.48153 3.0000E+00 3.0000E+00 S 2 2 0 I - magnesium_fluoride -magnesium fluoride MgF%2# - 134.3 3.7105 0.1369 2.8630 0.07934 3.6485 0.00 - 9 2.000000 0.609883 - 12 1.000000 0.390117 ----------------------------------------------------------------------------- - 194 Mg-O 5 -1.0000000000 0.49622 3.5800E+00 3.5800E+00 S 2 1 0 I - magnesium_oxide_MgO -magnesium oxide MgO - 143.8 3.6404 0.0575 2.8580 0.08313 3.5968 0.00 - 8 1.000000 0.396964 - 12 1.000000 0.603036 ----------------------------------------------------------------------------- - 195 Mg-B4 5 -1.0000000000 0.49014 2.5300E+00 2.5300E+00 S 3 4 0 I - magnesium_tetraborate -magnesium tetraborate MgB%4#O%7# - 108.3 3.4328 0.1147 2.7635 0.09703 3.4893 0.00 - 5 4.000000 0.240837 - 8 7.000634 0.623790 - 12 1.000090 0.135373 ----------------------------------------------------------------------------- - 196 Hg-I2 5 -1.0000000000 0.40933 6.3600E+00 6.3600E+00 S 2 2 0 I - mercuric_iodide -mercuric iodide HgI%2# - 684.5 6.3787 0.1040 3.4728 0.21513 2.7264 0.00 - 53 2.000000 0.558560 - 80 0.999999 0.441440 ----------------------------------------------------------------------------- - 197 Metha 5 -1.0000000000 0.62334 6.6715E-04 6.6715E-04 G 2 4 3 O - methane -methane (CH%4#) - 41.7 9.5243 1.6263 3.9716 0.09253 3.6257 0.00 - 1 4.000000 0.251306 - 6 1.000064 0.748694 -Boiling point -161.48 -Melting point -182.47 -Index of ref (n-1)*E6 444.0 http://www.kayelaby.npl.co.uk/ ----------------------------------------------------------------------------- - 198 Metha 5 -1.0000000000 0.56176 7.9140E-01 7.9140E-01 L 3 4 0 O - methanol -methanol (CH%3#OH) - 67.6 3.5160 0.2529 2.7639 0.08970 3.5477 0.00 - 1 4.000000 0.125822 - 6 1.000068 0.374852 - 8 1.000043 0.499326 ----------------------------------------------------------------------------- - 199 mix-D 5 -1.0000000000 0.56479 9.9000E-01 9.9000E-01 S 5 1 0 B - mix_D_wax -mix D wax - 60.9 3.0780 0.1371 2.7145 0.07490 3.6823 0.00 - 1 1.000000 0.134040 - 6 0.487068 0.777960 - 8 0.016459 0.035020 - 12 0.011941 0.038594 - 22 0.002260 0.014386 ----------------------------------------------------------------------------- - 200 MS20 5 -1.0000000000 0.53886 1.0000E+00 1.0000E+00 S 6 1 0 B - ms20_tissue_substitute -ms20 tissue substitute - 75.1 3.5341 0.1997 2.8033 0.08294 3.6061 0.00 - 1 1.000000 0.081192 - 6 0.603046 0.583442 - 7 0.015774 0.017798 - 8 0.144617 0.186381 - 12 0.066547 0.130287 - 17 0.000315 0.000900 ----------------------------------------------------------------------------- - 201 Skelm 5 -1.0000000000 0.54938 1.0400E+00 1.0400E+00 S 13 1 0 B - skeletal_muscle_ICRP -skeletal muscle (ICRP) - 75.3 3.4809 0.2282 2.7999 0.08636 3.5330 0.00 - 1 1.000000 0.100637 - 6 0.089918 0.107830 - 7 0.019793 0.027680 - 8 0.472487 0.754773 - 11 0.000327 0.000750 - 12 0.000078 0.000190 - 15 0.000582 0.001800 - 16 0.000753 0.002410 - 17 0.000223 0.000790 - 19 0.000774 0.003020 - 20 0.000007 0.000030 - 26 0.000007 0.000040 - 30 0.000008 0.000050 ----------------------------------------------------------------------------- - 202 Strim 5 -1.0000000000 0.55005 1.0400E+00 1.0400E+00 S 9 1 0 B - striated_muscle_ICRU -striated muscle (ICRU) - 74.7 3.4636 0.2249 2.8032 0.08507 3.5383 0.00 - 1 1.000000 0.101997 - 6 0.101201 0.123000 - 7 0.024693 0.035000 - 8 0.450270 0.729003 - 11 0.000344 0.000800 - 12 0.000081 0.000200 - 15 0.000638 0.002000 - 16 0.001541 0.005000 - 19 0.001264 0.005000 ----------------------------------------------------------------------------- - 203 Eqvmu 5 -1.0000000000 0.54828 1.1100E+00 1.1100E+00 L 4 1 0 B - muscle-equivalent_liquid_with_sucrose -muscle-equivalent liquid with sucrose - 74.3 3.3910 0.2098 2.7550 0.09481 3.4699 0.00 - 1 1.000000 0.098234 - 6 0.133452 0.156214 - 7 0.025970 0.035451 - 8 0.455395 0.710100 ----------------------------------------------------------------------------- - 204 Eqvmu 5 -1.0000000000 0.55014 1.0700E+00 1.0700E+00 L 4 1 0 B - muscle-equivalent_liquid_without_sucrose -muscle-equivalent liquid without sucrose - 74.2 3.4216 0.2187 2.7680 0.09143 3.4982 0.00 - 1 1.000000 0.101969 - 6 0.098807 0.120058 - 7 0.025018 0.035451 - 8 0.458746 0.742522 ----------------------------------------------------------------------------- - 205 Napht 5 -1.0000000000 0.53053 1.1450E+00 1.1450E+00 S 2 8 0 O - naphtalene -naphtalene (C%10#H%8#) - 68.4 3.2274 0.1374 2.5429 0.14766 3.2654 0.00 - 1 8.000000 0.062909 - 6 10.000584 0.937091 ----------------------------------------------------------------------------- - 206 Nitro 5 -1.0000000000 0.51986 1.1987E+00 1.1987E+00 L 4 5 0 O - nitrobenzene -nitrobenzene (C%6#H%5#NO%2#) - 75.8 3.4073 0.1777 2.6630 0.12727 3.3091 0.00 - 1 5.000000 0.040935 - 6 6.000329 0.585374 - 7 1.000028 0.113773 - 8 2.000058 0.259918 ----------------------------------------------------------------------------- - 207 N2-O 5 -1.0000000000 0.49985 1.8309E-03 1.8309E-03 G 2 2 0 I - nitrous_oxide -nitrous oxide (N%2#O) - 84.9 10.1575 1.6477 4.1565 0.11992 3.3318 0.00 - 7 2.000000 0.636483 - 8 1.000003 0.363517 ----------------------------------------------------------------------------- - 208 Elvam 5 -1.0000000000 0.55063 1.0800E+00 1.0800E+00 S 4 1 0 P - Nylon_du_Pont_Elvamide_8062M -Nylon du Pont Elvamide 8062M - 64.3 3.1250 0.1503 2.6004 0.11513 3.4044 0.00 - 1 1.000000 0.103509 - 6 0.525704 0.648415 - 7 0.069199 0.099536 - 8 0.090405 0.148539 ----------------------------------------------------------------------------- - 209 Nylon 5 -1.0000000000 0.54790 1.1400E+00 1.1800E+00 S 4 11 0 P - Nylon_type_6_6-6 -Nylon (type 6, 6/6) [(CH(CH%2#)%5#NO)%n#] - 63.9 3.0634 0.1336 2.5834 0.11818 3.3826 0.00 - 1 11.000000 0.097976 - 6 6.000405 0.636856 - 7 1.000040 0.123779 - 8 1.000045 0.141389 ----------------------------------------------------------------------------- - 210 Nylon 5 -1.0000000000 0.55236 1.1400E+00 1.1400E+00 S 4 15 0 P - Nylon_type_6-10 -Nylon type 6/10 [(CH(CH%2#)%7#NO)%n#] - 63.2 3.0333 0.1304 2.5681 0.11852 3.3912 0.00 - 1 15.000000 0.107062 - 6 8.000514 0.680449 - 7 1.000039 0.099189 - 8 1.000039 0.113300 ----------------------------------------------------------------------------- - 211 Rilsa 5 -1.0000000000 0.55649 1.4250E+00 1.4250E+00 S 4 21 0 P - Nylon_type_11_Rilsan -Nylon type 11 Rilsan ([C%11#H%21#ON)%n#], [(CH(CH%2#)%10#NO)%n#]) - 61.6 2.7514 0.0678 2.4281 0.14868 3.2576 0.00 - 1 21.000000 0.115476 - 6 11.000696 0.720819 - 7 1.000035 0.076417 - 8 1.000042 0.087289 ----------------------------------------------------------------------------- - 212 Octan 5 -1.0000000000 0.57778 7.0260E-01 7.0260E-01 L 2 18 2 O - octane -octane (C%8#H%18#) - 54.7 3.1834 0.1882 2.5664 0.11387 3.4776 0.00 - 1 18.000000 0.158821 - 6 8.000541 0.841179 -Boiling point 125.6 -Melting point -58.7 ----------------------------------------------------------------------------- - 213 Paraf 5 -1.0000000000 0.57275 9.3000E-01 9.3000E-01 S 2 52 0 O - paraffin -paraffin (CH%3#(CH%2#)%n\approx23#CH%3#) - 55.9 2.9551 0.1289 2.5084 0.12087 3.4288 0.00 - 1 52.000000 0.148605 - 6 25.001575 0.851395 ----------------------------------------------------------------------------- - 214 Penta 5 -1.0000000000 0.58212 6.2620E-01 6.2620E-01 L 2 12 1 O - n-pentane -n-pentane (C%5#H%12#) - 53.6 3.2504 0.2086 2.5855 0.10809 3.5265 0.00 - 1 12.000000 0.167635 - 6 5.000308 0.832365 -Index of ref (n-1)*E6 1711.0 http://www.kayelaby.npl.co.uk/ ----------------------------------------------------------------------------- - 215 Photo 5 -1.0000000000 0.45453 3.8150E+00 3.8150E+00 S 8 1 0 M - photographic_emulsion -photographic emulsion - 331.0 5.3319 0.1009 3.4866 0.12399 3.0094 0.00 - 1 1.000000 0.014100 - 6 0.430082 0.072261 - 7 0.098602 0.019320 - 8 0.295338 0.066101 - 16 0.004213 0.001890 - 35 0.312321 0.349103 - 47 0.314193 0.474105 - 53 0.001757 0.003120 ----------------------------------------------------------------------------- - 216 Plast 5 -1.0000000000 0.54141 1.0320E+00 1.0320E+00 S 2 10 1 P - polyvinyltoluene -polyvinyltoluene [(2-CH%3#C%6#H%4#CHCH%2#)%n#] - 64.7 3.1997 0.1464 2.4855 0.16101 3.2393 0.00 - 1 10.000000 0.085000 - 6 9.033760 0.915000 -Index of refraction 1.58 ----------------------------------------------------------------------------- - 217 Pu-O2 5 -1.0000000000 0.40583 1.1460E+01 1.1460E+01 S 2 2 0 I - plutonium_dioxide -plutonium dioxide (PuO%2#) - 746.5 5.9719 -0.2311 3.5554 0.20594 2.6522 0.00 - 8 2.000000 0.118055 - 94 0.979460 0.881945 ----------------------------------------------------------------------------- - 218 Pacry 5 -1.0000000000 0.52767 1.1700E+00 1.1700E+00 S 3 3 0 P - polyacrylonitrile -polyacrylonitrile [(C%3#H%3#N)%n#] - 69.6 3.2459 0.1504 2.5159 0.16275 3.1975 0.00 - 1 3.000000 0.056983 - 6 3.000184 0.679056 - 7 1.000034 0.263962 ----------------------------------------------------------------------------- - 219 Lexan 5 -1.0000000000 0.52697 1.2000E+00 1.2000E+00 S 3 14 0 P - polycarbonate_Lexan -polycarbonate (Lexan, [OC%6#H%4#C(CH%3#)%2#C%6#H%4#OCO)%n#]) - 73.1 3.3201 0.1606 2.6225 0.12860 3.3288 0.00 - 1 14.000000 0.055491 - 6 16.001127 0.755751 - 8 3.000142 0.188758 ----------------------------------------------------------------------------- - 220 Pchlo 5 -1.0000000000 0.52518 1.3000E+00 1.3000E+00 S 3 18 0 P - polychlorostyrene -polychlorostyrene [(C%17#H%18#C%l2#)%n#] - 81.7 3.4659 0.1238 2.9241 0.07530 3.5441 0.00 - 1 18.000000 0.061869 - 6 17.001129 0.696325 - 17 2.000101 0.241806 ----------------------------------------------------------------------------- - 221 Polye 5 -1.0000000000 0.57034 9.4000E-01 8.9000E-01 S 2 2 0 P - polyethylene -polyethylene [(CH%2#CH%2#)%n#] - 57.4 3.0016 0.1370 2.5177 0.12108 3.4292 0.00 - 1 2.000000 0.143711 - 6 1.000062 0.856289 ----------------------------------------------------------------------------- - 222 Poly 5 -1.0000000000 0.52037 1.4000E+00 1.4000E+00 S 3 4 0 P - polyethylene_terephthalate_Mylar -polyethylene terephthalate (Mylar) [(C%10#H%8#O%4#)%n#] - 78.7 3.3262 0.1562 2.6507 0.12679 3.3076 0.00 - 1 4.000000 0.041959 - 6 5.000266 0.625017 - 8 2.000059 0.333025 ----------------------------------------------------------------------------- - 223 Acryl 5 -1.0000000000 0.53937 1.1900E+00 1.1900E+00 S 3 8 1 P - polymethylmethacrylate_acrylic -polymethylmethacrylate (acrylic, [(CH%2#C(CH%3#)(COOCH%3#))%n#] - 74.0 3.3297 0.1824 2.6681 0.11433 3.3836 0.00 - 1 8.000000 0.080538 - 6 5.000308 0.599848 - 8 2.000073 0.319614 -Index of refraction 1.49 ----------------------------------------------------------------------------- - 224 Polyo 5 -1.0000000000 0.53287 1.4250E+00 1.4250E+00 S 3 2 0 P - polyoxymethylene -polyoxymethylene [(CH%2#O)%n#] - 77.4 3.2514 0.1584 2.6838 0.10808 3.4002 0.00 - 1 2.000000 0.067135 - 6 1.000059 0.400017 - 8 1.000035 0.532848 ----------------------------------------------------------------------------- - 225 Polyp 5 -1.0000000000 0.55998 9.4000E-01 9.0500E-01 S 2 3 2 P - polypropylene -polypropylene [(CH(CH%3#)CH%2#)%n#] - 57.4 3.0016 0.1370 2.5177 0.12108 3.4292 0.00 - 1 2.000000 0.143711 - 6 1.000062 0.856289 -Note: Chem formula wrong in Sternheimer. <i>I</i> and density effect constants - for polyethylene, scaled with density, were used for these calculations. ----------------------------------------------------------------------------- - 226 Polys 5 -1.0000000000 0.53768 1.0600E+00 1.0600E+00 S 2 8 1 P - polystyrene -polystyrene [(C%6#H%5#CHCH%2#)%n#] - 68.7 3.2999 0.1647 2.5031 0.16454 3.2224 0.00 - 1 8.000000 0.077418 - 6 8.000541 0.922582 -Index of ref 1.59 ----------------------------------------------------------------------------- - 227 Teflo 5 -1.0000000000 0.47992 2.2000E+00 2.2000E+00 S 2 1 0 P - polytetrafluoroethylene_Teflon -polytetrafluoroethylene (Teflon, [(CF%2#CF%2#)%n#]) - 99.1 3.4161 0.1648 2.7404 0.10606 3.4046 0.00 - 6 1.000000 0.240183 - 9 1.999945 0.759817 ----------------------------------------------------------------------------- - 228 KEL-F 5 -1.0000000000 0.48081 2.1000E+00 2.1000E+00 S 3 2 0 P - polytrifluorochloroethylene -polytrifluorochloroethylene [(C%2#F%3#Cl)%n#] - 120.7 3.8551 0.1714 3.0265 0.07727 3.5085 0.00 - 6 2.000000 0.206250 - 9 2.999925 0.489354 - 17 0.999983 0.304395 ----------------------------------------------------------------------------- - 229 Pviny 5 -1.0000000000 0.53432 1.1900E+00 1.1900E+00 S 3 6 0 P - polyvinylacetate -polyvinylacetate [(CH%2#CHOCOCH%3#)%n#] - 73.7 3.3309 0.1769 2.6747 0.11442 3.3762 0.00 - 1 6.000000 0.070245 - 6 4.000256 0.558066 - 8 2.000076 0.371689 ----------------------------------------------------------------------------- - 230 Pviny 5 -1.0000000000 0.54480 1.3000E+00 1.3000E+00 S 3 4 0 P - polyvinyl_alcohol -polyvinyl alcohol [(C%2#H3-O-H)%n#] - 69.7 3.1115 0.1401 2.6315 0.11178 3.3893 0.00 - 1 4.000000 0.091517 - 6 2.000131 0.545298 - 8 1.000039 0.363185 ----------------------------------------------------------------------------- - 231 Pviny 5 -1.0000000000 0.54537 1.1200E+00 1.1200E+00 S 3 13 0 P - polyvinyl_butyral -polyvinyl butyral [(C%8#H%13#0%2#)%n#] - 67.2 3.1865 0.1555 2.6186 0.11544 3.3983 0.00 - 1 13.000000 0.092802 - 6 8.000543 0.680561 - 8 2.000082 0.226637 ----------------------------------------------------------------------------- - 232 PVC 5 -1.0000000000 0.51201 1.3000E+00 1.3000E+00 S 3 3 0 P - polyvinylchloride_PVC -polyvinylchloride (PVC) [(CH%2#CHCl)%n#] - 108.2 4.0532 0.1559 2.9415 0.12438 3.2104 0.00 - 1 3.000000 0.048380 - 6 2.000138 0.384360 - 17 1.000053 0.567260 ----------------------------------------------------------------------------- - 233 Saran 5 -1.0000000000 0.49513 1.7000E+00 1.7000E+00 S 3 2 0 P - polyvinylidene_chloride_Saran -polyvinylidene chloride (Saran) [(C%2#H%2#Cl%2#)%n#] - 134.3 4.2506 0.1314 2.9009 0.15466 3.1020 0.00 - 1 2.000000 0.020793 - 6 2.000176 0.247793 - 17 2.000142 0.731413 ----------------------------------------------------------------------------- - 234 Pvnyd 5 -1.0000000000 0.49973 1.7600E+00 1.7600E+00 S 3 2 0 P - polyvinylidene_fluoride -polyvinylidene fluoride [(CH%2#CHF%2#)%n#] - 88.8 3.3793 0.1717 2.7375 0.10316 3.4200 0.00 - 1 2.000000 0.031480 - 6 2.000121 0.375141 - 9 2.000069 0.593379 ----------------------------------------------------------------------------- - 235 Pvnyl 5 -1.0000000000 0.53984 1.2500E+00 1.2500E+00 S 4 9 0 P - polyvinyl_pyrrolidone -polyvinyl pyrrolidone [(C%6#H%9#NO)%n#] - 67.7 3.1017 0.1324 2.5867 0.12504 3.3326 0.00 - 1 9.000000 0.081616 - 6 6.000414 0.648407 - 7 1.000042 0.126024 - 8 1.000044 0.143953 ----------------------------------------------------------------------------- - 236 K-I 5 -1.0000000000 0.43373 3.1300E+00 3.1300E+00 S 2 1 0 I - potassium_iodide_KI -potassium iodide (KI) - 431.9 6.1088 0.1044 3.3442 0.22053 2.7558 0.00 - 19 1.000000 0.235528 - 53 1.000000 0.764472 ----------------------------------------------------------------------------- - 237 K2-O 5 -1.0000000000 0.48834 2.3200E+00 2.3200E+00 S 2 1 0 I - potassium_oxide -potassium oxide (K%2#O) - 189.9 4.6463 0.0480 3.0110 0.16789 3.0121 0.00 - 8 1.000000 0.169852 - 19 2.000003 0.830148 ----------------------------------------------------------------------------- - 238 Propa 5 -1.0000000000 0.58962 1.8794E-03 1.8680E-03 G 2 8 2 O - propane -propane (C%3#H%8#) - 47.1 8.7878 1.4326 3.7998 0.09916 3.5920 0.00 - 1 8.000000 0.182855 - 6 3.000189 0.817145 -Boiling point -42.1 -Melting point -187.63 ----------------------------------------------------------------------------- - 239 Propa 5 -1.0000000000 0.58962 4.3000E-01 4.9300E-01 L 2 8 2 O - liquid_propane -liquid propane (C%3#H%8#) - 52.0 3.5529 0.2861 2.6568 0.10329 3.5620 0.00 - 1 8.000000 0.182855 - 6 3.000189 0.817145 -Boiling point -42.1 -Melting point -187.63 ----------------------------------------------------------------------------- - 240 n-pro 5 -1.0000000000 0.56577 8.0350E-01 8.0350E-01 L 3 8 0 O - n-propyl_alcohol -n-propyl alcohol (C%3#H%7#OH) - 61.1 3.2915 0.2046 2.6681 0.09644 3.5415 0.00 - 1 8.000000 0.134173 - 6 3.000193 0.599595 - 8 1.000037 0.266232 ----------------------------------------------------------------------------- - 241 Pyrid 5 -1.0000000000 0.53096 9.8190E-01 9.8190E-01 L 3 5 0 O - pyridine -pyridine (C%5#H%5#N) - 66.2 3.3148 0.1670 2.5245 0.16399 3.1977 0.00 - 1 5.000000 0.063710 - 6 5.000285 0.759217 - 7 1.000028 0.177073 ----------------------------------------------------------------------------- - 242 Rubbe 5 -1.0000000000 0.57034 9.2000E-01 9.2000E-01 S 2 8 0 O - rubber_butyl -rubber butyl ([C%4#H8)%n#] - 56.5 2.9915 0.1347 2.5154 0.12108 3.4296 0.00 - 1 8.000000 0.143711 - 6 4.000246 0.856289 ----------------------------------------------------------------------------- - 243 Rubbe 5 -1.0000000000 0.55785 9.2000E-01 9.2000E-01 S 2 8 0 O - rubber_natural -rubber natural [(C%5#H8)%n#] - 59.8 3.1272 0.1512 2.4815 0.15058 3.2879 0.00 - 1 8.000000 0.118371 - 6 5.000309 0.881629 ----------------------------------------------------------------------------- - 244 Rubbe 5 -1.0000000000 0.51956 1.2300E+00 1.2300E+00 S 3 5 0 O - rubber_neoprene -rubber neoprene [(C%4#H%5#Cl)%n#] - 93.0 3.7911 0.1501 2.9461 0.09763 3.3632 0.00 - 1 5.000000 0.056920 - 6 4.000259 0.542646 - 17 1.000049 0.400434 ----------------------------------------------------------------------------- - 245 Si-O2 5 -1.0000000000 0.49930 2.3200E+00 2.2000E+00 S 2 2 3 I - silicon_dioxide_fused_quartz -silicon dioxide (fused quartz) (SiO%2#) - 139.2 4.0029 0.1385 3.0025 0.08408 3.5064 0.00 - 8 2.000000 0.532565 - 14 1.000000 0.467435 -Melting point 1713. -Boiling point 2950. -Index of refraction 1.458 ----------------------------------------------------------------------------- - 246 Ag-Br 5 -1.0000000000 0.43670 6.4730E+00 6.4730E+00 S 2 1 0 I - silver_bromide_AgBr -silver bromide (AgBr) - 486.6 5.6139 0.0352 3.2109 0.24582 2.6820 0.00 - 35 1.000000 0.425537 - 47 1.000000 0.574463 ----------------------------------------------------------------------------- - 247 Ag-Cl 5 -1.0000000000 0.44655 5.5600E+00 5.5600E+00 S 2 1 0 I - silver_chloride_AgCl -silver chloride (AgCl) - 398.4 5.3437 -0.0139 3.2022 0.22968 2.7041 0.00 - 17 1.000000 0.247368 - 47 0.999989 0.752632 ----------------------------------------------------------------------------- - 248 Ag-ha 5 -1.0000000000 0.43663 6.4700E+00 6.4700E+00 S 3 1 0 M - ag_halides_in_phot_emulsion -ag halides in phot emulsion - 487.1 5.6166 0.0353 3.2117 0.24593 2.6814 0.00 - 35 1.000000 0.422895 - 47 1.004995 0.573748 - 53 0.004998 0.003357 ----------------------------------------------------------------------------- - 249 Ag-I 5 -1.0000000000 0.42594 6.0100E+00 6.0100E+00 S 2 1 0 I - silver_iodide_AgI -silver iodide (AgI) - 543.5 5.9342 0.0148 3.2908 0.25059 2.6572 0.00 - 47 1.000000 0.459458 - 53 1.000000 0.540542 ----------------------------------------------------------------------------- - 250 Skin 5 -1.0000000000 0.54932 1.1000E+00 1.1000E+00 S 13 1 0 B - skin_ICRP -skin (ICRP) - 72.7 3.3546 0.2019 2.7526 0.09459 3.4643 0.00 - 1 1.000000 0.100588 - 6 0.190428 0.228250 - 7 0.033209 0.046420 - 8 0.387683 0.619002 - 11 0.000031 0.000070 - 12 0.000025 0.000060 - 15 0.000107 0.000330 - 16 0.000497 0.001590 - 17 0.000755 0.002670 - 19 0.000218 0.000850 - 20 0.000038 0.000150 - 26 0.000002 0.000010 - 30 0.000002 0.000010 ----------------------------------------------------------------------------- - 251 Na2-C 5 -1.0000000000 0.49062 2.5320E+00 2.5320E+00 S 3 1 0 I - sodium_carbonate -sodium carbonate (Na%2#CO%3#) - 125.0 3.7178 0.1287 2.8591 0.08715 3.5638 0.00 - 6 1.000000 0.113323 - 8 2.999933 0.452861 - 11 1.999955 0.433815 ----------------------------------------------------------------------------- - 252 Na-I 5 -1.0000000000 0.42697 3.6670E+00 3.6670E+00 S 2 1 3 I - sodium_iodide_NaI -sodium iodide (NaI) - 452.0 6.0572 0.1203 3.5920 0.12516 3.0398 0.00 - 11 1.000000 0.153373 - 53 1.000002 0.846627 -Melting point 660. -Boiling point 1304. -Index of ref 1.775 ----------------------------------------------------------------------------- - 253 Na2-O 5 -1.0000000000 0.48404 2.2700E+00 2.2700E+00 S 2 1 0 I - sodium_monoxide -sodium monoxide (Na%2#O) - 148.8 4.1892 0.1652 2.9793 0.07501 3.6943 0.00 - 8 1.000000 0.258143 - 11 1.999995 0.741857 ----------------------------------------------------------------------------- - 254 Na-N- 5 -1.0000000000 0.49415 2.2610E+00 2.2610E+00 S 3 1 0 I - sodium_nitrate -sodium nitrate (NaNO%3#) - 114.6 3.6502 0.1534 2.8221 0.09391 3.5097 0.00 - 7 1.000000 0.164795 - 8 3.000009 0.564720 - 11 1.000004 0.270485 ----------------------------------------------------------------------------- - 255 Stilb 5 -1.0000000000 0.53260 9.7070E-01 9.7070E-01 S 2 12 0 O - stilbene -stilbene (C%6#H%5#)CHCH(C%6#H%5#) - 67.7 3.3680 0.1734 2.5142 0.16659 3.2168 0.00 - 1 12.000000 0.067101 - 6 14.000813 0.932899 ----------------------------------------------------------------------------- - 256 Sucro 5 -1.0000000000 0.53170 1.5805E+00 1.5805E+00 S 3 22 0 O - sucrose -sucrose (C%12#H%22#O%11#) - 77.5 3.1526 0.1341 2.6558 0.11301 3.3630 0.00 - 1 22.000000 0.064779 - 6 12.000771 0.421070 - 8 11.000442 0.514151 ----------------------------------------------------------------------------- - 257 Terph 5 -1.0000000000 0.52148 1.2340E+00 1.2340E+00 S 2 10 0 O - terphenyl -terphenyl (C%18#H%10#) - 71.7 3.2639 0.1322 2.5429 0.14964 3.2685 0.00 - 1 10.000000 0.044543 - 6 18.001057 0.955457 ----------------------------------------------------------------------------- - 258 Teste 5 -1.0000000000 0.55108 1.0400E+00 1.0400E+00 S 13 1 0 B - testes_ICRP -testes (ICRP) - 75.0 3.4698 0.2274 2.7988 0.08533 3.5428 0.00 - 1 1.000000 0.104166 - 6 0.074336 0.092270 - 7 0.013775 0.019940 - 8 0.468038 0.773884 - 11 0.000951 0.002260 - 12 0.000044 0.000110 - 15 0.000391 0.001250 - 16 0.000441 0.001460 - 17 0.000666 0.002440 - 19 0.000515 0.002080 - 20 0.000024 0.000100 - 26 0.000003 0.000020 - 30 0.000003 0.000020 ----------------------------------------------------------------------------- - 259 C2-Cl 5 -1.0000000000 0.48241 1.6250E+00 1.6250E+00 L 2 2 0 O - tetrachloroethylene -tetrachloroethylene (C%2#C%l4#) - 159.2 4.6619 0.1713 2.9083 0.18595 3.0156 0.00 - 6 2.000000 0.144856 - 17 3.999924 0.855144 ----------------------------------------------------------------------------- - 260 Tl-Cl 5 -1.0000000000 0.40861 7.0040E+00 7.0040E+00 S 2 1 0 I - thallium_chloride_TlCl -thallium chloride (TlCl) - 690.3 6.3009 0.0705 3.5716 0.18599 2.7690 0.00 - 17 1.000000 0.147822 - 81 0.999999 0.852187 ----------------------------------------------------------------------------- - 261 Soft 5 -1.0000000000 0.55121 1.0000E+00 1.0000E+00 S 13 1 0 B - soft_tissue_ICRP -soft tissue (ICRP) - 72.3 3.4354 0.2211 2.7799 0.08926 3.5110 0.00 - 1 1.000000 0.104472 - 6 0.186513 0.232190 - 7 0.017138 0.024880 - 8 0.380046 0.630238 - 11 0.000474 0.001130 - 12 0.000052 0.000130 - 15 0.000414 0.001330 - 16 0.000599 0.001990 - 17 0.000365 0.001340 - 19 0.000491 0.001990 - 20 0.000055 0.000230 - 26 0.000009 0.000050 - 30 0.000004 0.000030 ----------------------------------------------------------------------------- - 262 Tissu 5 -1.0000000000 0.54975 1.0000E+00 1.0000E+00 S 4 1 0 B - soft_tissue_ICRU_four-component -soft tissue (ICRU four-component) - 74.9 3.5087 0.2377 2.7908 0.09629 3.4371 0.00 - 1 1.000000 0.101172 - 6 0.092072 0.111000 - 7 0.018493 0.026000 - 8 0.474381 0.761828 ----------------------------------------------------------------------------- - 263 TE-ga 5 -1.0000000000 0.54993 1.0641E-03 1.0641E-03 G 4 1 0 B - tissue-equivalent_gas_Methane_based -tissue-equivalent gas (Methane based) - 61.2 9.9500 1.6442 4.1399 0.09946 3.4708 0.00 - 1 1.000000 0.101869 - 6 0.375802 0.456179 - 7 0.024846 0.035172 - 8 0.251564 0.406780 ----------------------------------------------------------------------------- - 264 TE-ga 5 -1.0000000000 0.55027 1.8263E-03 1.8263E-03 G 4 1 0 B - tissue-equivalent_gas_Propane_based -tissue-equivalent gas (Propane based) - 59.5 9.3529 1.5139 3.9916 0.09802 3.5159 0.00 - 1 1.000000 0.102672 - 6 0.465030 0.568940 - 7 0.024546 0.035022 - 8 0.180007 0.293366 ----------------------------------------------------------------------------- - 265 Ti-O2 5 -1.0000000000 0.47572 4.2600E+00 4.2600E+00 S 2 2 0 I - titanium_dioxide -titanium dioxide (TiO%2#) - 179.5 3.9522 -0.0119 3.1647 0.08569 3.3267 0.00 - 8 2.000000 0.400592 - 22 1.000271 0.599408 ----------------------------------------------------------------------------- - 266 Tolue 5 -1.0000000000 0.54265 8.6690E-01 8.6690E-01 L 2 8 0 O - toluene -toluene (C%6#H%5#CH%3#) - 62.5 3.3026 0.1722 2.5728 0.13284 3.3558 0.00 - 1 8.000000 0.087510 - 6 7.000463 0.912490 ----------------------------------------------------------------------------- - 267 C2-H- 5 -1.0000000000 0.48710 1.4600E+00 1.4600E+00 L 3 1 0 O - trichloroethylene -trichloroethylene (C%2#HCl%3#) - 148.1 4.6148 0.1803 2.9140 0.18272 3.0137 0.00 - 1 1.000000 0.007671 - 6 2.000158 0.182831 - 17 3.000193 0.809498 ----------------------------------------------------------------------------- - 268 Triet 5 -1.0000000000 0.53800 1.0700E+00 1.0700E+00 S 4 15 0 O - triethyl_phosphate -triethyl phosphate C%6#H%15#PO%4# - 81.2 3.6242 0.2054 2.9428 0.06922 3.6302 0.00 - 1 15.000000 0.082998 - 6 6.000356 0.395628 - 8 4.000136 0.351334 - 15 1.000036 0.170040 ----------------------------------------------------------------------------- - 269 W-F6 5 -1.0000000000 0.42976 2.4000E+00 2.4000E+00 S 2 6 0 I - tungsten_hexafluoride -tungsten hexafluoride (WF%6#) - 354.4 5.9881 0.3020 4.2602 0.03658 3.5134 0.00 - 9 6.000000 0.382723 - 74 1.000055 0.617277 ----------------------------------------------------------------------------- - 270 U-C2 5 -1.0000000000 0.39687 1.1280E+01 1.1280E+01 S 2 2 0 I - uranium_dicarbide -uranium dicarbide (UC%2#) - 752.0 6.0247 -0.2191 3.5208 0.21120 2.6577 0.00 - 6 2.000000 0.091669 - 92 0.999978 0.908331 ----------------------------------------------------------------------------- - 271 U-C 5 -1.0000000000 0.39194 1.3630E+01 1.3630E+01 S 2 1 0 I - uranium_monocarbide_UC -uranium monocarbide (UC) - 862.0 6.1210 -0.2524 3.4941 0.22972 2.6169 0.00 - 6 1.000000 0.048036 - 92 0.999982 0.951964 ----------------------------------------------------------------------------- - 272 U-O2 5 -1.0000000000 0.39996 1.0960E+01 1.0960E+01 S 2 2 0 I - uranium_oxide -uranium oxide (UO%2#) - 720.6 5.9605 -0.1938 3.5292 0.20463 2.6711 0.00 - 8 2.000000 0.118502 - 92 0.999999 0.881498 ----------------------------------------------------------------------------- - 273 Urea 5 -1.0000000000 0.53284 1.3230E+00 1.3230E+00 S 4 4 0 O - urea -urea (CO(NH%2#)%2#) - 72.8 3.2032 0.1603 2.6525 0.11609 3.3461 0.00 - 1 4.000000 0.067131 - 6 1.000072 0.199999 - 7 2.000083 0.466459 - 8 1.000046 0.266411 ----------------------------------------------------------------------------- - 274 Valin 5 -1.0000000000 0.54632 1.2300E+00 1.2300E+00 S 4 11 0 O - valine -valine (C%5#H%11#NOi%2#) - 67.7 3.1059 0.1441 2.6227 0.11386 3.3774 0.00 - 1 11.000000 0.094641 - 6 5.000305 0.512645 - 7 1.000035 0.119565 - 8 2.000072 0.273150 ----------------------------------------------------------------------------- - 275 Viton 5 -1.0000000000 0.48585 1.8000E+00 1.8000E+00 S 3 2 0 P - viton_fluoroelastomer -viton fluoroelastomer [(C%5#H%2#F8)%n#] - 98.6 3.5943 0.2106 2.7874 0.09965 3.4556 0.00 - 1 2.000000 0.009417 - 6 5.000366 0.280555 - 9 8.000378 0.710028 ----------------------------------------------------------------------------- - 276 Water 5 -1.0000000000 0.55509 1.0000E+00 1.0000E+00 L 2 2 3 I - water_liquid -water (liquid) (H%2#O) - 79.7 3.5017 0.2400 2.8004 0.09116 3.4773 0.00 - 1 2.000000 0.111894 - 8 1.000044 0.888106 -Index of refraction 1.333 -Melting point 0.0 -Boiling point 99.964 CRC2006 4-98 ----------------------------------------------------------------------------- - 277 Water 5 -1.0000000000 0.55509 7.5618E-04 7.5618E-04 G 2 2 0 I - water_vapor -water (vapor) (H%2#O) - 71.6 10.5962 1.7952 4.3437 0.08101 3.5901 0.00 - 1 2.000000 0.111894 - 8 1.000044 0.888106 ----------------------------------------------------------------------------- - 278 Xylen 5 -1.0000000000 0.54631 8.7000E-01 8.7000E-01 L 2 10 0 O - xylene -xylene (C%8#H%10#) - 61.8 3.2698 0.1695 2.5675 0.13216 3.3564 0.00 - 1 10.000000 0.094935 - 6 8.000548 0.905065 ----------------------------------------------------------------------------- - 279 Heavy 5 -1.0000000000 0.40594 1.9300E+01 1.9300E+01 S 3 1 1 M - heavymet_in_ATLAS_calorimeter -heavymet in ATLAS calorimeter - 727.0 5.4059 0.2167 3.4960 0.15509 2.8447 0.14 - 28 1.000000 0.035000 - 29 0.395844 0.015000 - 74 8.665723 0.950000 -Note: Tungsten properties except for average Z/A used in calculations ----------------------------------------------------------------------------- - 280 Heavy 5 -1.0000000000 0.40915 1.9300E+01 1.9300E+01 S 3 1 1 M - heavymet_in_Rochester_gamma_stop -heavymet as Rochester gamma stop - 727.0 5.4059 0.2167 3.4960 0.15509 2.8447 0.14 - 28 1.000000 0.060000 - 29 0.615758 0.040000 - 74 4.788952 0.900000 -Note: Tungsten properties except for average Z/A used in calculations ----------------------------------------------------------------------------- - 281 Std-R 0 11.0000000000 9 0.50000 2.6500E+00 2.6500E+00 S 2 1 1 M - standard_rock -standard rock - 136.4 3.7738 0.0492 3.0549 0.08301 3.4120 0.00 - 11 1.000000 1.000000 - 12 0.000000 0.000000 -Note: <A HREF="../standardrock.html">Explanation of "Standard Rock." ----------------------------------------------------------------------------- - 282 Hydro 3 1.0080000000 7 0.99212 6.0000E-02 7.0800E-02 L 1 1 1 E -H nonsense - Liquid hydrogen (H%2#) - 21.8 2.8438 0.2000 2.0000 0.32969 3.0000 0.00 - 1 1.000000 1.000000 -Note: This looks like nonsense. ind = 85 is correct! ----------------------------------------------------------------------------- - 283 Heliu 6 4.0026020000 2 0.49967 1.2490E-01 1.2490E-01 L 1 1 2 E -He liquid_helium -liquid helium (He) - 41.8 4.5180 0.4729 2.0000 0.65713 3.0000 0.00 - 2 1.000000 1.000000 -Boiling point -268.93 -Index of ref 1.024 ----------------------------------------------------------------------------- - 284 Nitro 3 14.0070000000 2 0.49976 8.0700E-01 8.0700E-01 L 1 1 4 E -N liquid_nitrogen -liquid nitrogen (N%2#) - 82.0 3.9996 0.3039 2.0000 0.53289 3.0000 0.00 - 7 1.000000 1.000000 -Melting point -210.00 -Boiling point -195.86 -Index of ref 1.19876 CRC2006 4-148 -Note: Index of refraction at boiling point, 1 atm. ----------------------------------------------------------------------------- - 285 Oxyge 3 15.9990000000 3 0.50002 1.1410E+00 1.1410E+00 L 1 1 4 E -O liquid_oxygen -liquid oxygen (O%2#) - 95.0 3.9471 0.2868 2.0000 0.52231 3.0000 0.00 - 8 1.000000 1.000000 -Melting point (C) -218.79 -Boiling point (C) -182.95 -Index of ref 1.2243 -Note: Index of refraction at boiling point, 1 atm. ----------------------------------------------------------------------------- - 286 Fluor 9 18.9984031630 6 0.47372 1.5070E+00 1.5070E+00 L 1 1 2 E -F liquid_fluorine -liquid fluorine (F%2#) - 115.0 4.1050 0.2000 3.0000 0.14504 3.0000 0.00 - 9 1.000000 1.000000 -Melting point -219.62 -Boiling point -188.12 ----------------------------------------------------------------------------- - 287 Neon 4 20.1797000000 6 0.49555 1.2040E+00 1.2040E+00 L 1 1 3 E -Ne liquid_neon -liquid neon (Ne) - 137.0 4.6345 0.2000 3.0000 0.16916 3.0000 0.00 - 10 1.000000 1.000000 -Boiling point -246.08 -Melting point -248.59 -Index of ref 1.092 ----------------------------------------------------------------------------- - 288 Chlor 3 35.4530000000 2 0.47951 1.5740E+00 1.5740E+00 L 1 1 2 E -Cl liquid_chlorine -liquid chlorine (Cl%2#) - 174.0 4.8776 0.2000 3.0000 0.18024 3.0000 0.00 - 17 1.000000 1.000000 -Melting point -101.5 -Boiling point -34.04 ----------------------------------------------------------------------------- - 289 Argon 3 39.9480000000 1 0.45059 1.3960E+00 1.3960E+00 L 1 1 3 E -Ar liquid_argon -liquid argon (Ar) - 188.0 5.2146 0.2000 3.0000 0.19559 3.0000 0.00 - 18 1.000000 1.000000 -Boiling point -185.85 -Melting point -189.36 -Index of ref 1.233 ----------------------------------------------------------------------------- - 290 Bromi 3 79.9040000000 1 0.43803 3.1028E+00 3.1028E+00 L 1 1 2 E -Br liquid_bromine -bromine liquid (Br%2#) - 357.0 0.0000 0.0000 0.0000 0.0000 0.0000 0.00 - 35 1.000000 1.000000 -melting point -7.2 -boiling point 58.78 ----------------------------------------------------------------------------- - 291 Krypt 3 83.7980000000 2 0.42960 2.4180E+00 2.4180E+00 L 1 1 4 E -Kr liquid_krypton_Kr -liquid krypton (Kr) - 352.0 5.9674 0.4454 3.0000 0.23491 3.0000 0.00 - 36 1.000000 1.000000 -melting point -157.36 -boiling point -153.22 -Index refraction 1.3032 CRC2006 4-148 -Note: Index of refraction at boiling point, 1 atm. ----------------------------------------------------------------------------- - 292 Xenon 3 131.2930000000 6 0.41129 2.9530E+00 2.9530E+00 L 1 1 4 E -Xe liquid_xenon_Xe -liquid xenon (Xe) - 482.0 6.4396 0.5993 3.0000 0.26595 3.0000 0.00 - 54 1.000000 1.000000 -Melting point -111.75 -Boiling point -108.0 -Index refraction 1.3918 CRC2006 4-148 -Note: Index of refraction at boiling point, 1 atm. ----------------------------------------------------------------------------- - 293 C-O2 5 -1.0000000000 0.49989 1.5630E+00 1.5630E+00 S 2 2 1 I - solid_carbon_dioxide_dry_ice -solid carbon dioxide (dry ice, CO%2#) - 85.0 3.4513 0.2000 2.0000 0.43387 3.0000 0.00 - 6 2.000000 0.272916 - 8 4.000010 0.727084 -Note: Sublimation point 194.7 K = -78.4 C ----------------------------------------------------------------------------- - 294 Hydro 5 1.0079400000 7 0.99212 6.0000E-02 6.0000E-02 L 1 1 0 E -H bubble_chamber_H_liquid -Hydrogen BC liquid DEG calc to check code - 21.8 3.0093 0.2000 2.0000 0.35807 3.0000 0.00 - 1 1.000000 1.000000 ----------------------------------------------------------------------------- - 295 Water 5 -1.0000000000 0.55509 1.0000E+00 1.0000E+00 L 2 2 0 I - water_as_calc_from_steam_to_check_code -water as calc from steam to check code - 71.6 3.5017 0.2000 2.0000 0.44251 3.0000 0.00 - 1 2.000000 0.111894 - 8 1.000044 0.888106 ----------------------------------------------------------------------------- - 296 Aerog 5 -1.0000000000 0.50093 2.0000E-01 2.0000E-01 S 3 2 1 M - silica_aerogel -silica aerogel for rho = 0.2 (0.03 H%2#O, 0.97 SiO%2#) - 139.2 6.4507 0.6029 3.0000 0.26675 3.0000 0.00 - 8 2.000000 0.543192 - 14 1.000000 0.453451 - 1 2.000000 0.003357 -Note: See A. R. Buzykaev et al, NIM A433 396 (1999) ----------------------------------------------------------------------------- - 297 Carbo 4 12.0107000000 8 0.49955 2.2650E+00 3.5200E+00 S 1 1 2 E -C carbon_gem_diamond -carbon (gem diamond) - 78.0 2.8680 -0.0178 2.3415 0.26142 2.8697 0.12 - 6 1.000000 1.000000 -Note: variety of melting points found, e.g. 4400 C, 3675 C -Index of ref (n-1)*E6 2.419 ----------------------------------------------------------------------------- - 298 Deute 9 2.014101764 13 0.49650 1.8000E-04 1.6770E-04 D 1 1 3 E -D deuterium_gas -deuterium gas (D%2#) - 19.2 9.5835 1.8639 3.2718 0.14092 5.7273 0.00 - 1 1.000000 1.000000 -Boiling point (C) -249.5 (mass from Phys. Rev. A 47, 3433 - 3436 (1993)) -Triple point -254.461 CRC2006 -Index of ref (n-1)*E6 138.0 ----------------------------------------------------------------------------- - 299 D-liq 9 2.014101764 13 0.49650 1.4320E-01 1.6380E-01 L 1 1 3 E -D liquid_deuterium -liquid deuterium (D%2#) - 21.8 3.2632 0.4759 1.9215 0.13483 5.6249 0.00 - 1 1.000000 1.000000 -Boiling point -249.5 -Triple point -254.461 CRC2006 -Index of ref 1.112 ----------------------------------------------------------------------------- - 300 Salt 5 -1.0000000000 0.47910 2.1650E+00 2.1700E+00 S 2 2 3 I - sodium_chloride_NaCl -sodium chloride (NaCl) - 175.3 4.4250 0.2000 3.0000 0.15962 3.0000 0.00 - 11 1.000000 0.393375 - 17 1.000000 0.606626 -Melting point (C) 802.018 CRC2008 15-11 -Boiling point (C) 1465. -Index of refraction 1.544 ----------------------------------------------------------------------------- - 301 PbWO4 5 -1.0000000000 0.41315 8.3900E+00 8.3000E+00 S 3 1 2 I - lead_tungstate -lead tungstate (PbWO%4#) - 600.7 5.8420 0.4045 3.0000 0.22758 3.0000 0.00 - 82 1.000000 0.455347 - 74 1.000000 0.404011 - 8 4.000000 0.140462 -Melting point 1123. -Index of refraction 2.20 ----------------------------------------------------------------------------- - 302 Calif 5 251.0795900000 3 0.39031 1.5100E+00 1.5100E+01 S 1 1 3 R -Cf californium_Cf -californium (Cf) - 966.0 6.3262 0.5623 3.0000 0.25796 3.0000 0.00 - 98 1.000000 1.000000 -melting 900. -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: I<SUB><I>eff</I></SUB> = 966 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 303 Einst 4 252.0830000000 4 0.39273 0.0000E+00 1.4000E+01 S 1 1 3 R -Es einsteinium_Es -einsteinium (Es) - 980.0 6.3488 0.5697 3.0000 0.25952 3.0000 0.00 - 99 1.000000 1.000000 -melting 860. -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 980 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 304 Fermi 5 257.0951000000 5 0.38896 0.0000E+00 1.4000E+01 S 1 1 3 R -Fm fermium_Fm -fermium (Fm) - 994.0 6.3868 0.5821 3.0000 0.26219 3.0000 0.00 - 100 1.000000 1.000000 -Melting: 1527. -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 994 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 305 Mende 5 258.0984300000 3 0.39132 0.0000E+00 1.4000E+01 S 1 1 3 R -Md mendelevium_Md -mendelevium (Md) - 1007.0 6.4068 0.5886 3.0000 0.26360 3.0000 0.00 - 101 1.000000 1.000000 -Melting 827. -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1007 eV assumed in calculating critical energies and <I><I>dE/dx</I></I>. ----------------------------------------------------------------------------- - 306 Nobel 4 259.1010000000 7 0.39367 0.0000E+00 1.4000E+01 S 1 1 2 R -No nobelium_No -nobelium (No) - 1020.0 6.4264 0.5950 3.0000 0.26500 3.0000 0.00 - 102 1.000000 1.000000 -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1020 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 307 Lawre 5 262.1096100000 2 0.39296 0.0000E+00 1.4000E+01 S 1 1 2 R -Lr lawrencium_Lr -lawrencium (Lr) - 1034.0 6.4555 0.6045 3.0000 0.26710 3.0000 0.00 - 103 1.000000 1.000000 -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = Z*10.0 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 308 Ruthe 5 267.1217900000 4 0.38934 0.0000E+00 1.4000E+01 S 1 1 2 R -Rf rutherfordium_Rf -rutherfordium (Rf) - 1047.0 6.4898 0.6157 3.0000 0.26960 3.0000 0.00 - 104 1.000000 1.000000 -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1047 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 309 Dubni 5 268.1256700000 4 0.39161 0.0000E+00 1.4000E+01 S 1 1 2 R -Db dubnium_Db -dubnium (Db) - 1061.0 6.5105 0.6224 3.0000 0.27114 3.0000 0.00 - 105 1.000000 1.000000 -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1061 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 310 Seabo 5 269.1286300000 5 0.39095 0.0000E+00 1.4000E+01 S 1 1 2 R -Sg seaborgium_Sg -seaborgium (Sg) - 1074.0 6.5365 0.6309 3.0000 0.27308 3.0000 0.00 - 106 1.000000 1.000000 -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1074 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 311 Bohri 5 270.1333600000 4 0.39610 0.0000E+00 1.4000E+01 S 1 1 2 R -Bh bohrium_Bh -bohrium (Bh) - 1087.0 6.5549 0.6369 3.0000 0.27447 3.0000 0.00 - 107 1.000000 1.000000 -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1087 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 312 Hassi 5 269.1337500000 13 0.40129 0.0000E+00 1.4000E+01 S 1 1 2 R -Hs hassium_Hs -hassium (Hs) - 1102.0 6.5913 0.6488 3.0000 0.27724 3.0000 0.00 - 108 1.000000 1.000000 -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1102 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 313 Meitn 4 278.1563000000 7 0.39471 0.0000E+00 1.4000E+01 S 1 1 2 R -Mt meitnerium_Mt -meitnerium (Mt) - 1115.0 6.6019 0.6522 3.0000 0.27805 3.0000 0.00 - 109 1.000000 1.000000 -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1115 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 314 Darms 4 281.1645000000 6 0.39123 0.0000E+00 1.4000E+01 S 1 1 2 R -Ds darmstadtium_Ds -darmstadtium (Ds) - 1129.0 6.6357 0.6632 3.0000 0.28068 3.0000 0.00 - 110 1.000000 1.000000 -Note: Since there is no stable isotope, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1129 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 315 Roent 4 282.1691200000 7 0.39620 0.0000E+00 1.4000E+01 S 1 1 2 R -Rg roentgenium_Rg -roentgenium (Rg) - 1143.0 6.6477 0.6672 3.0000 0.28162 3.0000 0.00 - 111 1.000000 1.000000 -Note: Since there are no stable isotopes, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1143 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 316 Coper 5 285.17712 5 0.39274 0.0000E+00 1.4000E+01 S 1 1 2 R -Cn copernicium_Cn -copernicium (Cn) - 1156.0 6.6791 0.6774 3.0000 0.28410 3.0000 0.00 - 112 1.000000 1.000000 -Note: Since there are no stable isotopes, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = Z*10.0 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 317 nihon 5 286.1822100000 6 0.39764 0.0000E+00 1.4000E+01 S 1 1 1 R -Nh nihonium_Nh -nihonium (Nh) - 1171.0 6.6925 0.6818 3.0000 0.28517 3.0000 0.00 - 113 1.000000 1.000000 -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1171 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 318 flero 5 289.1904200000 5 0.39421 0.0000E+00 1.4000E+01 S 1 1 1 R -Fl flerovium_Fl -flerovium (Fl) - 1185.0 6.7249 0.6923 3.0000 0.28779 3.0000 0.00 - 114 1.000000 1.000000 -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1185 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 319 mosco 5 289.1936300000 6 0.39904 0.0000E+00 1.4000E+01 S 1 1 1 R -Mc moscovium_Mc -moscovium (Mc) - 1199.0 6.7363 0.6960 3.0000 0.28871 3.0000 0.00 - 115 1.000000 1.000000 -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1199 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 320 liver 4 293.2045000000 6 0.39563 0.0000E+00 1.4000E+01 S 1 1 1 R -Lv livermorium_Lv -livermorium (Lv) - 1213.0 6.7571 0.7028 3.0000 0.29041 3.0000 0.00 - 116 1.000000 1.000000 -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1213 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 321 tenne 4 294.2105100000 7 0.39796 0.0000E+00 1.4000E+01 S 1 1 1 R -Ts tennessine_Ts -tennessine (Ts) - 1227.0 6.7800 0.7103 3.0000 0.29231 3.0000 0.00 - 117 1.000000 1.000000 -Note: Density 14.0 g/cm<SUP>3</SUP> and I<SUB><I>eff</I></SUB> = 1227 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 322 ogane 5 294.2139220000 8 0.40107 1.2000E-02 1.2000E-02 G 1 1 2 R -Og oganesson_Og -oganesson (Og) - 1242.0 13.8662 2.0204 -1.9972 -0.07035 3.0000 0.00 - 118 1.000000 1.000000 -Note: Density is that of an ideal monatomic gas. -Note: I<SUB><I>eff</I></SUB> = 1242 eV assumed in calculating critical energies and <I>dE/dx</I>. ----------------------------------------------------------------------------- - 323 Astat 5 209.9871500000 6 0.40479 0.0000E+00 5.0000E+00 S 1 1 3 R -At astatine_At -astatine (At) - 825.0 7.0039 0.7833 3.0000 0.31184 3.0000 0.00 - 85 1.000000 1.000000 -Melting : 302. -Note: Since there are no stable isotopes, [atomic mass] is that of the longest-lived isotope (8.1 hr). -Note: Density 5.0 g/cm<SUP>3</SUP> assumed. ----------------------------------------------------------------------------- - 324 Franc 5 223.0197400000 2 0.39010 1.8700E+00 1.8700E+00 S 1 1 4 R -Fr francium_Fr -francium (Fr) - 827.0 8.0292 1.1175 3.0000 0.43214 3.0000 0.00 - 87 1.000000 1.000000 -Melting 27. -Boiling 677. -Note: Francium is less stable than any other element lighter than nobelium, element 102. -Note: Since there are no stable isotopes, [atomic mass] is that of the longest-lived isotope known as of Jun 2017. ----------------------------------------------------------------------------- - 325 Ice 5 -1.0000000000 0.55509 1.0000E+00 0.9180E+00 L 2 2 3 I - water_ice -water (ice) (H%2#O) - 79.7 3.5017 0.2400 2.8004 0.09116 3.4773 0.00 - 1 2.000000 0.111894 - 8 1.000044 0.888106 -Index of refraction 1.309 -Melting point 0.0 -Boiling point 99.964 CRC2006 4-98 ----------------------------------------------------------------------------- - 326 CF4 5 -1.0000000000 0.47721 3.78E-3 3.78E-3 G 2 1 4 O - carbon_tetrafluoride -carbon tetrafluoride (CF%4#) - 115.0 0.0 0. .0000 0. .0000 0.00 - 6 1.000000 0.136548 - 9 4.000000 0.86345 -Melting : -183.6 -boiling -127.8 -Note: Physical properties such as gas density are not well vetted -Note: Ieff supplied by Hans Bichsel ----------------------------------------------------------------------------- - 327 LaBr3 5 -1.0000000000 0.42787 5.2900e+00 5.2900e+00 S 2 1 1 I - lanthanum_bromide -lanthanum bromide (LaBr%3#) - 454.5 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 57 1.000000 0.366875 - 35 3.000000 0.633124 -Note: Ieff calculated using the ICRU37 algorithm given in Table 5.1 ----------------------------------------------------------------------------- - 328 YBr3 5 -1.0000000000 0.43820 5.2900e+00 5.2900e+00 S 2 1 1 I - yttrium_bromide -yttrium bromide (YBr%3#) - 410.0 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 39 1.000000 0.270545 - 35 3.000000 0.729455 -Note: Ieff calculated using the ICRU37 algorithm given in Table 5.1 ----------------------------------------------------------------------------- - 329 BSO 5 -1.0000000000 0.42260 9.2000e+00 7.1200e+00 S 3 12 3 I - bismuth_silicate_BSO -bismuth silicate (BSO) [(Bi%2#O%3#)%2#(SiO%2#)%3#] - 519.2 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 8 12.000000 0.172629 - 14 3.000000 0.075759 - 83 4.000000 0.751613 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids -Note: Evalite structure; less common is Bi{12}SiO{20} -Note: Check density. Probably wrong ----------------------------------------------------------------------------- - 330 PbF2 5 -1.0000000000 0.40784 7.7700e+00 7.7700e+00 S 2 1 1 I - lead_fluoride -lead fluoride (PbF%2#) - 635.4 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 82 1.000000 0.845035 - 9 2.000000 0.154965 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 331 LaF3 5 -1.0000000000 0.42879 5.9000e+00 5.9000e+00 S 2 1 1 I - lanthanum_fluoride -lanthanum fluoride (LaF%3#) - 336.3 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 57 1.000000 0.709061 - 9 3.000000 0.290939 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 332 CeF3 5 -1.0000000000 0.43123 6.1600e+00 6.1600e+00 S 2 1 1 I - cerium_fluoride -cerium fluoride (CeF%3#) - 348.4 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 58 1.000000 0.710847 - 9 3.000000 0.289153 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 333 LuF3 5 -1.0000000000 0.42248 8.3000e+00 8.3000e+00 S 2 1 1 I - lutetium_fluoride -lutetium fluoride (LuF%3#) - 458.7 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 71 1.000000 0.754291 - 9 3.000000 0.245709 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 334 LaCl3 5 -1.0000000000 0.44034 3.8600e+00 3.8600e+00 S 2 1 1 I - lanthanum_chloride -lanthanum chloride (LaCl%3#) - 329.5 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 57 1.000000 0.566350 - 17 3.000000 0.433650 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 335 LuAlO 5 -1.0000000000 0.43209 8.3000e+00 8.3000e+00 S 3 1 1 I - lutetium_aluminum_oxide_1 -lutetium aluminum oxide (1) (LuAlO%3#) - 423.2 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 71 1.000000 0.700017 - 13 1.000000 0.107949 - 8 3.000000 0.192034 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 336 LuAlO 5 -1.0000000000 0.43907 6.7300e+00 6.7300e+00 S 3 3 1 I - lutetium_aluminum_oxide_2 -lutetium aluminum oxide (2) (Lu%3#Al%5#O%12#) - 365.9 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 71 3.000000 0.616224 - 13 5.000000 0.158379 - 8 12.000000 0.225396 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 337 LuSiO 5 -1.0000000000 0.42793 7.4000e+00 7.4000e+00 S 3 2 1 I - lutetium_silicon_oxide -lutetium silicon oxide (Lu%2#SiO%5#) - 472.0 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 71 2.000000 0.764020 - 14 1.000000 0.061320 - 8 5.000000 0.174660 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 338 YAlO-1 5 -1.0000000000 0.46374 5.5000e+00 5.5000e+00 S 3 1 1 I - yttrium_aluminum_oxide_1 -yttrium aluminum oxide (1) (YAlO%3#) - 239.3 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 39 1.000000 0.542487 - 13 1.000000 0.164636 - 8 3.000000 0.292876 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 339 YAlO-2 5 -1.0000000000 0.46831 4.5600e+00 4.5600e+00 S 3 3 1 I - yttrium_aluminum_oxide_2 -yttrium aluminum oxide (2) (Y%3#Al%5#O%12#) - 218.0 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 39 3.000000 0.449308 - 13 5.000000 0.227263 - 8 12.000000 0.323428 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 340 YSiO 5 -1.0000000000 0.46171 4.5400e+00 4.5400e+00 S 3 2 1 I - yttrium_silicon_oxide -yttrium silicon oxide (Y%2#SiO%5#) - 258.1 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 39 2.000000 0.621949 - 14 1.000000 0.098237 - 8 5.000000 0.279813 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 341 GdSiO 5 -1.0000000000 0.43069 6.7100e+00 6.7100e+00 S 3 2 1 I - gadolinium_silicate -gadolinium silicate (Gd%2#SiO%5#) - 405.4 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 64 2.000000 0.744233 - 14 1.000000 0.066462 - 8 5.000000 0.189305 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ----------------------------------------------------------------------------- - 342 baksa 5 -1.0000000000 0.49228 2.7400e+00 2.7400e+00 S 2 0 1 I - baksan_rock -baksan rock - 175.6 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 11 0.100000 0.095103 - 12 0.900000 0.904897 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ---------------------------------------------------------------------------- - 343 bakst 5 -1.0000000000 0.49228 2.7400e+00 2.6500e+00 S 2 0 1 I - baksan_rock_st -baksan rock, std rock density - 175.6 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 11 0.100000 0.095103 - 12 0.900000 0.904897 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ---------------------------------------------------------------------------- - 344 MtBla 5 -1.0000000000 0.48003 2.6000e+00 2.6000e+00 S 2 0 1 I - MtBlanc_rock -Mt Blanc rock - 159.2 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 6 0.132000 0.073601 - 11 0.868000 0.926399 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ---------------------------------------------------------------------------- - 345 MtBst 5 -1.0000000000 0.48003 2.6000e+00 2.6500e+00 S 2 0 1 I - MtBlanc_rock_sd -Mt Blanc rock, std rock density - 159.2 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 6 0.132000 0.073601 - 11 0.868000 0.926399 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ---------------------------------------------------------------------------- - 346 KGFst 5 -1.0000000000 0.48605 3.0200e+00 2.6500e+00 S 2 0 1 I - KGF_rock_st -Kolar Gold Fields rock, std rock density - 183.4 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 12 0.380000 0.355713 - 13 0.620000 0.644287 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ---------------------------------------------------------------------------- - 347 KGF 5 -1.0000000000 0.48605 3.0200e+00 3.0200e+00 S 2 0 1 I - KGF_rock -Kolar Gold Fields rock - 183.4 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 12 0.380000 0.355713 - 13 0.620000 0.644287 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ---------------------------------------------------------------------------- - 348 UD 5 -1.0000000000 0.49602 2.7000e+00 2.7000e+00 S 11 0 1 I - UD_rock -UD rock for doug - 145.4 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 14 0.245239 0.334025 - 22 0.001368 0.003176 - 13 0.056485 0.073911 - 26 0.009477 0.025666 - 25 0.000148 0.000394 - 12 0.004120 0.004856 - 20 0.009895 0.019232 - 11 0.041643 0.046428 - 19 0.001606 0.003045 - 15 0.000592 0.000889 - 8 0.629426 0.488377 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ---------------------------------------------------------------------------- - 349 LMP 5 -1.0000000000 0.49641 2.7000e+00 2.7000e+00 S 11 0 1 I - LMP_rock -LMP rock for Doug - 145.9 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 14 0.248086 0.335584 - 22 0.001242 0.002863 - 13 0.066504 0.086423 - 26 0.008725 0.023467 - 25 0.000146 0.000386 - 12 0.010053 0.011768 - 20 0.007152 0.013805 - 11 0.002935 0.003250 - 19 0.015537 0.029258 - 15 0.000437 0.000652 - 8 0.639181 0.492543 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ---------------------------------------------------------------------------- - 350 UM 5 -1.0000000000 0.49407 2.7000e+00 2.7000e+00 S 11 0 1 I - UM_rock -UM rock for Doug - 152.7 0.0000 0.0000 0.0000 0.00000 0.0000 0.00 - 14 0.184026 0.238952 - 22 0.002244 0.004966 - 13 0.069046 0.086130 - 26 0.030831 0.079602 - 25 0.000822 0.002088 - 12 0.042435 0.047684 - 20 0.031499 0.058365 - 11 0.025503 0.027107 - 19 0.000642 0.001160 - 15 0.000791 0.001133 - 8 0.612161 0.452813 -Note: Ieff calculated using the ICRU37 Table 5.1 algorithm for liquids and solids ---------------------------------------------------------------------------- diff --git a/Processes/EnergyLoss/ReadData.py b/Processes/EnergyLoss/ReadData.py deleted file mode 100644 index 377f3992d..000000000 --- a/Processes/EnergyLoss/ReadData.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/python - -import os -import sys -import string - - -data = open("Properties8.dat", "r") - -nEl = 0 -nOpt = 0 -count = 0 # the data comes with flexible row-blocks, need to count -for line in data.readlines(): - line = line.rstrip() - if line == "" or line[0] == "#": - continue - -# print str(count) + " " + line - - if count == 0: - index = int(line[0:4].strip()) # sternheimers index - name = line[5:11].strip() # tag - sig = int(line[11:14].strip()) # significant figures of atomic mass if element - weight = float(line[16:27].strip()) # atomic weight, if element - weight_error = int((line[31:32].strip() or "0"))# error in last place - ZoverA = float(line[34:42].strip()) # Z/A - rho = float(line[42:52].strip()) # Sternheimers density - rho_corr = float(line[52:63].strip())# Corrected density - state = line[64].strip() # Solid Liquid Gas Diatomicgas - nEl = int(line[66:69].strip()) # number of elements - nAtom = int(line[70:72].strip()) # atoms of el. 1 - nOpt = int(line[73:74].strip()) # number of optional lines - type = line[75] # type: Element, Radiactive element, Inorganic compound, Organic compound, Polymer, Mixture, Biological - - elif count == 1: - short = line[0:4].strip() # if element - long = line[4:100].strip() - - elif count == 2: - desc = line # description and formula - - elif count == 3: - Ieff = float(line[0:10].strip()) # ieff - Cbar = float(line[11:19].strip()) # cbar - x0 = float(line[21:28].strip()) # x0 - x1 = float(line[30:37].strip()) # x1 - aa = float(line[39:46].strip()) # a / aa - sk = float(line[48:55].strip()) # k / sk - delta0 = float(line[59:].strip()) # delta0 / dlt0 - - elif count == 4 and count < 4+nEl: - elZ = int(line[0:11].strip()) # Z - # num frac. - # weigh frac. - pass - - elif count>=4+nEl and count<=4+nEl+nOpt: - # print "opt : " + str(count) + " " + str(4+nEl+nOpt) + " " + line - # property A25 - # value F20 - # if 1:5 is "Note:" following lines are extra comments - if (count == 4+nEl+nOpt): - count = -1 - - print str(elZ) + " " + long + " " + str(Ieff) + " " + str(ZoverA) + " " + state + " " + type + " " + str(rho_corr) + " " + str(delta0) + " " + str(x0) + " " + str(x1) + " " + str(aa) + " " + str(sk) + " " + str(Cbar) - - - count += 1 - - -if (count != 0): - print ("Error " + str(count)) - diff --git a/Processes/EnergyLoss/SummaryPropTable.dat b/Processes/EnergyLoss/SummaryPropTable.dat deleted file mode 100644 index 2ebc9d2e6..000000000 --- a/Processes/EnergyLoss/SummaryPropTable.dat +++ /dev/null @@ -1,138 +0,0 @@ -# RU Mo 18. Feb 14:07:40 CET 2019 -# Data table obtained from http://pdg.lbl.gov/2018/AtomicNuclearProperties/summary_prop_table.dat -# see also http://pdg.lbl.gov/2018/AtomicNuclearProperties/expert.html -# Z A density dEmin Xo lam_I lam_pi_I E_c (elec) E_c (pstrn) state - 1 1.00794 0.00 4.103 63.04 52.01 80.26 344.80 338.33 D - 1 1.00794 0.07 4.034 63.04 52.01 80.26 278.02 271.50 L - 1 2.01410 0.00 2.053 125.98 71.78 110.12 345.50 339.03 D - 1 2.01410 0.17 2.019 125.98 71.78 110.12 278.02 271.50 L - 2 4.00260 0.00 1.937 94.32 71.00 103.61 257.13 252.23 G - 2 4.00260 0.12 1.936 94.32 71.00 103.61 208.25 203.34 L - 3 6.94100 0.53 1.639 82.78 71.34 103.26 149.06 145.33 S - 4 9.01218 1.85 1.595 65.19 77.80 109.90 113.70 110.68 S - 5 10.81100 2.37 1.623 52.69 83.32 115.54 93.95 91.41 S - 6 12.01070 2.00 1.749 42.70 85.81 117.79 82.08 79.85 S - 6 12.01070 2.21 1.742 42.70 85.81 117.79 81.74 79.51 S - 6 12.01070 2.27 1.745 42.70 85.81 117.79 81.67 79.44 S - 6 12.01070 3.52 1.725 42.70 85.81 117.79 80.17 77.94 S - 7 14.00670 0.00 1.825 37.99 89.68 121.69 91.73 89.71 D - 7 14.00670 0.81 1.813 37.99 89.68 121.69 75.47 73.49 L - 8 15.99940 0.00 1.801 34.24 90.17 121.91 81.45 79.62 D - 8 15.99940 1.14 1.788 34.24 90.17 121.91 66.82 65.04 L - 9 18.99840 0.00 1.676 32.93 97.42 127.24 73.15 71.48 D - 9 18.99840 1.51 1.634 32.93 97.42 127.24 59.81 58.17 L - 10 20.17970 0.00 1.724 28.93 98.99 128.66 67.02 65.47 G - 10 20.17970 1.20 1.695 28.93 98.99 128.66 55.10 53.59 L - 11 22.98977 0.97 1.639 27.74 102.55 132.22 51.38 49.99 S - 12 24.30500 1.74 1.674 25.03 104.12 133.65 46.55 45.25 S - 13 26.98154 2.70 1.615 24.01 107.16 136.67 42.70 41.48 S - 14 28.08550 2.33 1.664 21.82 108.35 137.74 40.19 39.05 S - 15 30.97376 2.20 1.613 21.21 111.36 140.72 37.92 36.84 S - 16 32.06500 2.00 1.652 19.50 112.44 141.70 35.85 34.83 S - 17 35.45300 0.00 1.630 19.28 115.70 144.94 40.05 39.04 D - 17 35.45300 1.57 1.608 19.28 115.70 144.94 34.32 33.35 L - 18 39.94800 0.00 1.519 19.55 119.73 148.99 38.03 37.06 G - 18 39.94800 1.40 1.508 19.55 119.73 148.99 32.84 31.91 L - 19 39.09830 0.86 1.623 17.32 118.98 148.08 31.62 30.72 S - 20 40.07800 1.55 1.655 16.14 119.83 148.83 29.56 28.71 S - 21 44.95591 2.99 1.522 16.55 123.90 152.91 27.61 26.79 S - 22 47.86700 4.54 1.477 16.16 126.20 155.17 26.01 25.23 S - 23 50.94150 6.11 1.436 15.84 128.54 157.46 24.67 23.91 S - 24 51.99610 7.18 1.456 14.94 129.31 158.16 23.52 22.79 S - 25 54.93804 7.44 1.428 14.64 131.44 160.24 22.59 21.89 S - 26 55.84500 7.87 1.451 13.84 132.08 160.80 21.68 21.00 S - 27 58.93319 8.90 1.419 13.62 134.23 162.90 20.82 20.16 S - 28 58.69340 8.90 1.468 12.68 134.06 162.64 20.05 19.41 S - 29 63.54600 8.96 1.403 12.86 137.30 165.87 19.42 18.79 S - 30 65.38000 7.13 1.411 12.43 138.49 166.99 18.93 18.33 S - 31 69.72300 5.90 1.379 12.47 141.22 169.69 18.57 17.98 S - 32 72.64000 5.32 1.370 12.25 143.00 171.42 18.16 17.58 S - 33 74.92159 5.73 1.370 11.94 144.36 172.73 17.65 17.09 S - 34 78.97100 4.50 1.343 11.91 146.71 175.04 17.34 16.79 S - 35 79.90400 0.01 1.388 11.42 147.24 175.51 19.16 18.60 D - 35 79.90400 3.10 1.380 11.42 147.24 175.51 17.28 16.75 L - 36 83.79800 0.00 1.357 11.37 149.42 177.65 18.61 18.06 G - 36 83.79800 2.42 1.357 11.37 149.42 177.65 17.03 16.51 L - 37 85.46780 1.53 1.356 11.03 150.34 178.51 16.61 16.10 S - 38 87.62000 2.54 1.353 10.76 151.50 179.62 15.97 15.47 S - 39 88.90584 4.47 1.359 10.41 152.18 180.26 15.30 14.81 S - 40 91.22400 6.51 1.349 10.20 153.41 181.44 14.74 14.27 S - 41 92.90637 8.57 1.343 9.92 154.28 182.26 14.23 13.77 S - 42 95.95000 10.22 1.329 9.80 155.84 183.78 13.85 13.39 S - 43 97.90722 11.50 1.325 9.58 156.83 184.72 13.46 13.01 S - 44 101.07000 12.41 1.307 9.48 158.40 186.25 13.12 12.68 S - 45 102.90550 12.41 1.310 9.27 159.30 187.11 12.84 12.41 S - 46 106.42000 12.02 1.289 9.20 161.00 188.76 12.57 12.15 S - 47 107.86820 10.50 1.299 8.97 161.68 189.41 12.36 11.94 S - 48 112.41400 8.65 1.277 9.00 163.81 191.49 12.21 11.80 S - 49 114.81800 7.31 1.278 8.85 164.91 192.55 12.06 11.65 S - 50 118.71000 7.31 1.263 8.82 166.67 194.27 11.86 11.46 S - 51 121.76000 6.69 1.259 8.73 168.02 195.58 11.70 11.31 S - 52 127.60000 6.24 1.227 8.83 170.56 198.08 11.54 11.16 S - 53 126.90447 4.93 1.263 8.48 170.25 197.74 11.42 11.04 S - 54 131.29300 0.01 1.255 8.48 172.12 199.56 12.30 11.91 G - 54 131.29300 2.95 1.255 8.48 172.12 199.56 11.66 11.28 L - 55 132.90545 1.87 1.254 8.31 172.79 200.20 11.34 10.97 S - 56 137.32700 3.50 1.231 8.31 174.62 201.98 10.98 10.62 S - 57 138.90547 6.14 1.231 8.14 175.26 202.59 10.63 10.27 S - 58 140.11600 6.77 1.234 7.96 175.75 203.04 10.40 10.04 S - 59 140.90766 6.77 1.243 7.76 176.07 203.32 10.21 9.86 S - 60 144.24200 7.01 1.231 7.71 177.40 204.62 10.02 9.68 S - 61 144.91275 7.26 1.240 7.51 177.66 204.85 9.83 9.49 S - 62 150.36000 7.52 1.210 7.57 179.79 206.95 9.66 9.32 S - 63 151.96400 5.24 1.219 7.44 180.41 207.53 9.59 9.26 S - 64 157.25000 7.90 1.188 7.48 182.42 209.50 9.34 9.01 S - 65 158.92535 8.23 1.188 7.36 183.05 210.10 9.17 8.85 S - 66 162.50000 8.55 1.175 7.32 184.38 211.39 9.02 8.70 S - 67 164.93033 8.80 1.170 7.23 185.27 212.25 8.86 8.55 S - 68 167.25900 9.03 1.168 7.14 186.12 213.07 8.73 8.42 S - 69 168.93422 9.32 1.170 7.03 186.72 213.64 8.59 8.28 S - 70 173.05400 6.90 1.159 7.02 188.19 215.08 8.52 8.22 S - 71 174.96680 9.84 1.160 6.92 188.87 215.72 8.36 8.06 S - 72 178.49000 13.31 1.152 6.89 190.10 216.93 8.22 7.93 S - 73 180.94788 16.65 1.149 6.82 190.96 217.75 8.09 7.79 S - 74 183.84000 19.30 1.145 6.76 191.95 218.71 7.97 7.68 S - 75 186.20700 21.02 1.143 6.69 192.75 219.49 7.85 7.57 S - 76 190.23000 22.57 1.132 6.68 194.11 220.81 7.75 7.47 S - 77 192.21700 22.42 1.134 6.59 194.77 221.45 7.67 7.39 S - 78 195.08400 21.45 1.128 6.54 195.72 222.37 7.59 7.31 S - 79 196.96657 19.32 1.134 6.46 196.34 222.96 7.53 7.26 S - 80 200.59000 13.55 1.130 6.44 197.52 224.11 7.53 7.26 L - 81 204.38330 11.72 1.125 6.42 198.75 225.30 7.50 7.23 S - 82 207.20000 11.35 1.122 6.37 199.64 226.17 7.43 7.16 S - 83 208.98040 9.75 1.128 6.29 200.21 226.71 7.39 7.13 S - 84 208.98243 9.32 1.141 6.16 200.21 226.69 7.33 7.06 S - 85 209.98715 5.00 1.160 6.07 200.52 226.98 7.60 7.33 S - 86 222.01758 0.01 1.116 6.28 204.25 230.66 7.71 7.43 G - 87 223.01974 1.87 1.118 6.19 204.56 230.94 7.59 7.32 S - 88 226.02541 5.00 1.111 6.15 205.47 231.83 7.19 6.94 S - 89 227.02775 10.07 1.112 6.06 205.77 232.11 7.00 6.75 S - 90 232.03770 11.72 1.098 6.07 207.26 233.57 6.91 6.66 S - 91 231.03588 15.37 1.107 5.93 206.96 233.25 6.77 6.52 S - 92 238.02891 18.95 1.081 6.00 209.02 235.28 6.65 6.41 S - 93 237.04817 20.25 1.095 5.87 208.73 234.97 6.57 6.33 S - 94 244.06420 19.84 1.071 5.93 210.77 236.98 6.49 6.25 S - 95 243.06138 13.67 1.089 5.80 210.48 236.67 6.50 6.25 S - 96 247.07035 13.51 1.082 5.79 211.63 237.79 6.44 6.20 S - 97 247.07031 14.00 1.106 5.69 211.63 237.77 6.59 6.35 S - 98 251.07959 14.00 1.097 5.68 212.77 238.88 6.53 6.29 S - 99 252.08300 14.00 1.102 5.61 213.05 239.15 6.47 6.24 S - 100 257.09510 14.00 1.090 5.62 214.45 240.52 6.42 6.19 S - 101 258.09843 14.00 1.095 5.55 214.73 240.78 6.37 6.13 S - 102 259.10100 14.00 1.099 5.48 215.00 241.04 6.31 6.08 S - 103 262.11000 14.00 1.096 5.45 215.83 241.84 6.26 6.03 S - 104 267.12200 14.00 1.084 5.47 217.20 243.19 6.21 5.98 S - 105 268.12500 14.00 1.088 5.40 217.48 243.44 6.16 5.93 S - 106 271.13300 14.00 1.085 5.38 218.29 244.23 6.11 5.89 S - 107 270.13400 14.00 1.097 5.27 218.02 243.95 6.06 5.84 S - 108 269.13410 14.00 1.110 5.17 217.75 243.66 6.01 5.79 S - 109 276.15100 14.00 1.090 5.23 219.63 245.51 5.97 5.75 S - 110 281.16200 14.00 1.079 5.24 220.96 246.82 5.92 5.71 S - 111 280.16400 14.00 1.091 5.14 220.69 246.54 5.88 5.66 S - 112 285.00000 14.00 1.080 5.16 221.96 247.78 5.83 5.61 S - 113 284.17800 14.00 1.091 5.07 221.75 247.55 5.79 5.57 S - 114 289.18700 14.00 1.080 5.08 223.05 248.83 5.75 5.53 S - 115 288.19200 14.00 1.092 4.99 222.79 248.56 5.71 5.49 S - 116 293.20000 14.00 1.081 5.00 224.08 249.83 5.67 5.45 S - 117 294.00000 14.00 1.086 4.95 224.29 250.01 5.62 5.41 S - 118 294.21500 0.01 1.092 4.88 224.34 250.05 5.67 5.45 G diff --git a/Processes/HadronicElasticModel/CMakeLists.txt b/Processes/HadronicElasticModel/CMakeLists.txt deleted file mode 100644 index 55d774ec4..000000000 --- a/Processes/HadronicElasticModel/CMakeLists.txt +++ /dev/null @@ -1,61 +0,0 @@ -set ( - MODEL_SOURCES - HadronicElasticModel.cc - ) - -set ( - MODEL_HEADERS - HadronicElasticModel.h - ) - -set ( - MODEL_NAMESPACE - corsika/process/hadronic_elastic_model - ) - -add_library (ProcessHadronicElasticModel STATIC ${MODEL_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessHadronicElasticModel ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -set_target_properties ( - ProcessHadronicElasticModel - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 -# PUBLIC_HEADER "${MODEL_HEADERS}" - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - ProcessHadronicElasticModel - CORSIKAunits - CORSIKAgeometry - CORSIKAsetup - CORSIKAutilities - ) - -target_include_directories ( - ProcessHadronicElasticModel - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS ProcessHadronicElasticModel - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib -# PUBLIC_HEADER DESTINATION include/${MODEL_NAMESPACE} - ) - - -# -------------------- -# code unit testing -# CORSIKA_ADD_TEST (testProcessHadronicElasticModel) -# target_link_libraries ( - # testProcessHadronicElasticModel - # ProcessHadronicElasticModel - # CORSIKAsetup - # CORSIKAgeometry - # CORSIKAunits - # CORSIKAthirdparty # for catch2 - # ) diff --git a/Processes/HadronicElasticModel/HadronicElasticModel.cc b/Processes/HadronicElasticModel/HadronicElasticModel.cc deleted file mode 100644 index cdc01d9a9..000000000 --- a/Processes/HadronicElasticModel/HadronicElasticModel.cc +++ /dev/null @@ -1,194 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#include <corsika/environment/Environment.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/geometry/FourVector.h> -#include <corsika/process/hadronic_elastic_model/HadronicElasticModel.h> -#include <corsika/random/ExponentialDistribution.h> -#include <corsika/utl/COMBoost.h> - -#include <corsika/setup/SetupStack.h> - -#include <iomanip> -#include <iostream> - -using SetupParticle = corsika::setup::Stack::ParticleType; -using SetupView = corsika::setup::StackView; - -using namespace corsika::process::HadronicElasticModel; -using namespace corsika; - -HadronicElasticInteraction::HadronicElasticInteraction(units::si::CrossSectionType x, - units::si::CrossSectionType y) - : fX(x) - , fY(y) {} - -template <> -units::si::GrammageType HadronicElasticInteraction::GetInteractionLength( - SetupParticle const& p) { - using namespace units::si; - if (p.GetPID() == particles::Code::Proton) { - auto const* currentNode = p.GetNode(); - auto const& mediumComposition = - currentNode->GetModelProperties().GetNuclearComposition(); - - auto const& components = mediumComposition.GetComponents(); - auto const& fractions = mediumComposition.GetFractions(); - - auto const projectileMomentum = p.GetMomentum(); - auto const projectileMomentumSquaredNorm = projectileMomentum.squaredNorm(); - auto const projectileEnergy = p.GetEnergy(); - - auto const avgCrossSection = [&]() { - CrossSectionType avgCrossSection = 0_b; - - for (size_t i = 0; i < fractions.size(); ++i) { - auto const targetMass = particles::GetMass(components[i]); - auto const s = units::static_pow<2>(projectileEnergy + targetMass) - - projectileMomentumSquaredNorm; - avgCrossSection += CrossSection(s) * fractions[i]; - } - - std::cout << "avgCrossSection: " << avgCrossSection / 1_mb << " mb" << std::endl; - - return avgCrossSection; - }(); - - auto const avgTargetMassNumber = mediumComposition.GetAverageMassNumber(); - - GrammageType const interactionLength = - avgTargetMassNumber * units::constants::u / avgCrossSection; - - return interactionLength; - } else { - return std::numeric_limits<double>::infinity() * 1_g / (1_cm * 1_cm); - } -} - -template <> -process::EProcessReturn HadronicElasticInteraction::DoInteraction(SetupView& view) { - using namespace units::si; - using namespace units::constants; - - auto p = view.GetProjectile(); - if (p.GetPID() != particles::Code::Proton) { return process::EProcessReturn::eOk; } - - const auto* currentNode = p.GetNode(); - const auto& composition = currentNode->GetModelProperties().GetNuclearComposition(); - const auto& components = composition.GetComponents(); - - std::vector<units::si::CrossSectionType> cross_section_of_components( - composition.GetComponents().size()); - - auto const projectileMomentum = p.GetMomentum(); - auto const projectileMomentumSquaredNorm = projectileMomentum.squaredNorm(); - auto const projectileEnergy = p.GetEnergy(); - - for (size_t i = 0; i < components.size(); ++i) { - auto const targetMass = particles::GetMass(components[i]); - auto const s = units::static_pow<2>(projectileEnergy + targetMass) - - projectileMomentumSquaredNorm; - cross_section_of_components[i] = CrossSection(s); - } - - const auto targetCode = composition.SampleTarget(cross_section_of_components, fRNG); - - auto const targetMass = particles::GetMass(targetCode); - - std::uniform_real_distribution phiDist(0., 2 * M_PI); - - geometry::FourVector const projectileLab(projectileEnergy, projectileMomentum); - geometry::FourVector const targetLab( - targetMass, geometry::Vector<units::si::hepmomentum_d>( - projectileMomentum.GetCoordinateSystem(), {0_eV, 0_eV, 0_eV})); - utl::COMBoost const boost(projectileLab, targetMass); - - auto const projectileCoM = boost.toCoM(projectileLab); - auto const targetCoM = boost.toCoM(targetLab); - - auto const pProjectileCoMSqNorm = projectileCoM.GetSpaceLikeComponents().squaredNorm(); - auto const pProjectileCoMNorm = sqrt(pProjectileCoMSqNorm); - - auto const eProjectileCoM = projectileCoM.GetTimeLikeComponent(); - auto const eTargetCoM = targetCoM.GetTimeLikeComponent(); - - auto const sqrtS = eProjectileCoM + eTargetCoM; - auto const s = units::static_pow<2>(sqrtS); - - auto const B = this->B(s); - std::cout << B << std::endl; - - random::ExponentialDistribution tDist(1 / B); - auto const absT = [&]() { - decltype(tDist(fRNG)) absT; - auto const maxT = 4 * pProjectileCoMSqNorm; - - do { - // |t| cannot become arbitrarily large, max. given by GER eq. (4.16), so we just - // throw again until we have an acceptable value. - absT = tDist(fRNG); - } while (absT >= maxT); - - return absT; - }(); - - std::cout << "HadronicElasticInteraction: s = " << s * invGeVsq - << " GeV²; absT = " << absT * invGeVsq - << " GeV² (max./GeV² = " << 4 * invGeVsq * projectileMomentumSquaredNorm - << ')' << std::endl; - - auto const theta = 2 * asin(sqrt(absT / (4 * pProjectileCoMSqNorm))); - auto const phi = phiDist(fRNG); - - auto const projectileScatteredLab = - boost.fromCoM(geometry::FourVector<HEPEnergyType, geometry::Vector<hepmomentum_d>>( - eProjectileCoM, - geometry::Vector<hepmomentum_d>(projectileMomentum.GetCoordinateSystem(), - {pProjectileCoMNorm * sin(theta) * cos(phi), - pProjectileCoMNorm * sin(theta) * sin(phi), - pProjectileCoMNorm * cos(theta)}))); - - view.AddSecondary( - std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ - p.GetPID(), - sqrt(projectileScatteredLab.GetSpaceLikeComponents().squaredNorm() + - units::static_pow<2>(particles::GetMass(p.GetPID()))), - projectileScatteredLab.GetSpaceLikeComponents(), p.GetPosition(), p.GetTime()}); - - return process::EProcessReturn::eOk; -} - -HadronicElasticInteraction::inveV2 HadronicElasticInteraction::B(eV2 s) const { - using namespace units::constants; - auto constexpr b_p = 2.3; - auto const result = - (2 * b_p + 2 * b_p + 4 * pow(s * invGeVsq, gfEpsilon) - 4.2) * invGeVsq; - std::cout << "B(" << s << ") = " << result / invGeVsq << " GeV¯²" << std::endl; - return result; -} - -units::si::CrossSectionType HadronicElasticInteraction::CrossSection( - SquaredHEPEnergyType s) const { - using namespace units::si; - using namespace units::constants; - // assuming every target behaves like a proton, fX and fY are universal - CrossSectionType const sigmaTotal = - fX * pow(s * invGeVsq, gfEpsilon) + fY * pow(s * invGeVsq, -gfEta); - - // according to Schuler & Sjöstrand, PRD 49, 2257 (1994) - // (we ignore rho because rho^2 is just ~2 %) - auto const sigmaElastic = - units::static_pow<2>(sigmaTotal) / - (16 * M_PI * ConvertHEPToSI<CrossSectionType::dimension_type>(B(s))); - - std::cout << "HEM sigmaTot = " << sigmaTotal / 1_mb << " mb" << std::endl; - std::cout << "HEM sigmaElastic = " << sigmaElastic / 1_mb << " mb" << std::endl; - return sigmaElastic; -} diff --git a/Processes/NullModel/CMakeLists.txt b/Processes/NullModel/CMakeLists.txt deleted file mode 100644 index 07e653a7c..000000000 --- a/Processes/NullModel/CMakeLists.txt +++ /dev/null @@ -1,60 +0,0 @@ -set ( - MODEL_SOURCES - NullModel.cc - ) - -set ( - MODEL_HEADERS - NullModel.h - ) - -set ( - MODEL_NAMESPACE - corsika/process/null_model - ) - -add_library (ProcessNullModel STATIC ${MODEL_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessNullModel ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -set_target_properties ( - ProcessNullModel - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 -# PUBLIC_HEADER "${MODEL_HEADERS}" - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - ProcessNullModel - CORSIKAunits - CORSIKAgeometry - CORSIKAsetup - ) - -target_include_directories ( - ProcessNullModel - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS ProcessNullModel - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib -# PUBLIC_HEADER DESTINATION include/${MODEL_NAMESPACE} - ) - - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST (testNullModel) -target_link_libraries ( - testNullModel - ProcessNullModel - CORSIKAsetup - CORSIKAgeometry - CORSIKAunits - CORSIKAtesting - ) diff --git a/Processes/ObservationPlane/CMakeLists.txt b/Processes/ObservationPlane/CMakeLists.txt deleted file mode 100644 index 800c5dbd6..000000000 --- a/Processes/ObservationPlane/CMakeLists.txt +++ /dev/null @@ -1,44 +0,0 @@ -set ( - MODEL_HEADERS - ObservationPlane.h - ) - -set ( - MODEL_SOURCES - ObservationPlane.cc - ) - -set ( - MODEL_NAMESPACE - corsika/process/observation_plane - ) - -add_library (ProcessObservationPlane STATIC ${MODEL_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessObservationPlane ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -#target dependencies on other libraries(also the header onlys) -target_link_libraries ( - ProcessObservationPlane - CORSIKAgeometry - CORSIKAprocesssequence - CORSIKAlogging - ) - -target_include_directories ( - ProcessObservationPlane - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install (FILES ${MODEL_HEADERS} DESTINATION include/${MODEL_NAMESPACE}) - -#-- -- -- -- -- -- -- -- -- -- -#code unit testing -CORSIKA_ADD_TEST(testObservationPlane) -target_link_libraries ( - testObservationPlane - ProcessObservationPlane - CORSIKAstackinterface - CORSIKAthirdparty # for catch2 -) diff --git a/Processes/ParticleCut/CMakeLists.txt b/Processes/ParticleCut/CMakeLists.txt deleted file mode 100644 index db1ee34c6..000000000 --- a/Processes/ParticleCut/CMakeLists.txt +++ /dev/null @@ -1,66 +0,0 @@ -set ( - MODEL_SOURCES - ParticleCut.cc -) - -set ( - MODEL_HEADERS - ParticleCut.h - ) - -set ( - MODEL_NAMESPACE - corsika/process/particle_cut - ) - -add_library (ProcessParticleCut STATIC ${MODEL_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessParticleCut ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -set_target_properties ( - ProcessParticleCut - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - ProcessParticleCut - CORSIKAunits - CORSIKAparticles - CORSIKAprocesssequence - CORSIKAsetup - CORSIKAlogging - ) - -target_include_directories ( - ProcessParticleCut - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS ProcessParticleCut - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - ) - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST(testParticleCut SOURCES - testParticleCut.cc - ${MODEL_HEADERS} -) - -target_link_libraries ( - testParticleCut - ProcessParticleCut - CORSIKAunits - CORSIKAstackinterface - CORSIKAprocesssequence - CORSIKAsetup - CORSIKAgeometry - CORSIKAenvironment - CORSIKAtesting - ) diff --git a/Processes/QGSJetII/CMakeLists.txt b/Processes/QGSJetII/CMakeLists.txt deleted file mode 100644 index 77d43794c..000000000 --- a/Processes/QGSJetII/CMakeLists.txt +++ /dev/null @@ -1,107 +0,0 @@ -if (NOT DEFINED ENV{CORSIKA_DATA}) - message (WARNING "WARNING: QGSJetII will not work without corsika-data. Set CORSIKA_DATA path!") -endif () - -add_custom_command ( - OUTPUT ${PROJECT_BINARY_DIR}/Processes/QGSJetII/Generated.inc - COMMAND ${PROJECT_SOURCE_DIR}/Processes/QGSJetII/code_generator.py - ${PROJECT_BINARY_DIR}/Framework/Particles/particle_db.pkl - ${PROJECT_SOURCE_DIR}/Processes/QGSJetII/qgsjet-II-04-codes.dat - DEPENDS code_generator.py - qgsjet-II-04-codes.dat - CORSIKAparticles - WORKING_DIRECTORY - ${PROJECT_BINARY_DIR}/Processes/QGSJetII/ - COMMENT "Generate conversion tables for particle codes QGSJetII <-> CORSIKA" - VERBATIM - ) - -set ( - MODEL_SOURCES - ParticleConversion.cc - Interaction.cc - qgsjet-II-04.f - qgsjet-II-04.cc - ) - -set ( - MODEL_HEADERS - ParticleConversion.h - qgsjet-II-04.h - QGSJetIIStack.h - QGSJetIIFragmentsStack.h - Interaction.h - ${PROJECT_BINARY_DIR}/Processes/QGSJetII/Generated.inc - ) - -set ( - MODEL_NAMESPACE - corsika/process/qgsjetII - ) - -add_library (ProcessQGSJetII STATIC ${MODEL_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessQGSJetII ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -# .................................................... -# since Generated.inc is an automatically produced file in the build directory, -# create a symbolic link into the source tree, so that it can be found and edited more easily -# this is not needed for the build to succeed! ....... -add_custom_command ( - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/Generated.inc - COMMAND ${CMAKE_COMMAND} -E create_symlink ${PROJECT_BINARY_DIR}/include/corsika/process/qgsjetII/Generated.inc ${CMAKE_CURRENT_SOURCE_DIR}/Generated.inc - COMMENT "Generate link in source-dir: ${CMAKE_CURRENT_SOURCE_DIR}/Generated.inc" - ) -add_custom_target (SourceDirLinkQgsII DEPENDS ${PROJECT_BINARY_DIR}/Processes/QGSJetII/Generated.inc) -add_dependencies (ProcessQGSJetII SourceDirLinkQgsII) -# ..................................................... - - - -set_target_properties ( - ProcessQGSJetII - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - ProcessQGSJetII - CORSIKAprocesssequence - CORSIKAparticles - CORSIKAutilities - CORSIKAunits - CORSIKAthirdparty - CORSIKAgeometry - CORSIKAenvironment - CORSIKAsetup - CORSIKArandom - CorsikaData - ) - -target_include_directories ( - ProcessQGSJetII - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS ProcessQGSJetII - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - ) - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST(testQGSJetII - SOURCES - testQGSJetII.cc - ${MODEL_HEADERS} -) - -target_link_libraries ( - testQGSJetII - ProcessQGSJetII - CORSIKAtesting - stdc++fs) diff --git a/Processes/Sibyll/CMakeLists.txt b/Processes/Sibyll/CMakeLists.txt deleted file mode 100644 index 856135c78..000000000 --- a/Processes/Sibyll/CMakeLists.txt +++ /dev/null @@ -1,111 +0,0 @@ -add_custom_command ( - OUTPUT ${PROJECT_BINARY_DIR}/Processes/Sibyll/Generated.inc - COMMAND ${PROJECT_SOURCE_DIR}/Processes/Sibyll/code_generator.py - ${PROJECT_BINARY_DIR}/Framework/Particles/particle_db.pkl - ${PROJECT_SOURCE_DIR}/Processes/Sibyll/sibyll_codes.dat - DEPENDS code_generator.py - sibyll_codes.dat - CORSIKAparticles - WORKING_DIRECTORY - ${PROJECT_BINARY_DIR}/Processes/Sibyll/ - COMMENT "Generate conversion tables for particle codes SIBYLL <-> CORSIKA" - VERBATIM - ) - -set ( - MODEL_SOURCES - ParticleConversion.cc - Interaction.cc - Decay.cc - NuclearInteraction.cc - sibyll2.3d.f - nuclib.f - signuc.f - sibyll2.3d.cc - gasdev.f - ) - -set ( - MODEL_HEADERS - ParticleConversion.h - sibyll2.3d.h - nuclib.h - SibStack.h - Decay.h - Interaction.h - NuclearInteraction.h - ${PROJECT_BINARY_DIR}/Processes/Sibyll/Generated.inc - ) - -set ( - MODEL_NAMESPACE - corsika/process/sibyll - ) - -add_library (ProcessSibyll STATIC ${MODEL_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessSibyll ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -# .................................................... -# since Generated.inc is an automatically produced file in the build directory, -# create a symbolic link into the source tree, so that it can be found and edited more easily -# this is not needed for the build to succeed! ....... -add_custom_command ( - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/Generated.inc - COMMAND ${CMAKE_COMMAND} -E create_symlink ${PROJECT_BINARY_DIR}/include/corsika/process/sibyll/Generated.inc ${CMAKE_CURRENT_SOURCE_DIR}/Generated.inc - COMMENT "Generate link in source-dir: ${CMAKE_CURRENT_SOURCE_DIR}/Generated.inc" - ) -add_custom_target (SourceDirLinkSib DEPENDS ${PROJECT_BINARY_DIR}/Processes/Sibyll/Generated.inc) -add_dependencies (ProcessSibyll SourceDirLinkSib) -# ..................................................... - - - -set_target_properties ( - ProcessSibyll - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - ProcessSibyll - CORSIKAprocesssequence - CORSIKAparticles - CORSIKAutilities - CORSIKAunits - CORSIKAthirdparty - CORSIKAgeometry - CORSIKAenvironment - CORSIKAsetup - CORSIKArandom - CORSIKAlogging - ) - -target_include_directories ( - ProcessSibyll - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS ProcessSibyll - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - ) - - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST(testSibyll - SOURCES - testSibyll.cc - ${MODEL_HEADERS} -) - -target_link_libraries ( - testSibyll - ProcessSibyll - CORSIKAtesting - ) diff --git a/Processes/Sibyll/Interaction.h b/Processes/Sibyll/Interaction.h deleted file mode 100644 index 52a43309d..000000000 --- a/Processes/Sibyll/Interaction.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/particles/ParticleProperties.h> -#include <corsika/process/InteractionProcess.h> -#include <corsika/random/RNGManager.h> -#include <corsika/units/PhysicalUnits.h> -#include <tuple> - -namespace corsika::process::sibyll { - - class Interaction : public corsika::process::InteractionProcess<Interaction> { - - int count_ = 0; - int nucCount_ = 0; - static bool initialized_; ///! flag to assure init is done only once - bool sibyll_listing_; - - public: - Interaction(const bool sibyll_printout_on = false); - ~Interaction(); - - void SetAllStable(); - - static bool WasInitialized() { return initialized_; } - bool IsValidCoMEnergy(corsika::units::si::HEPEnergyType ecm) const { - return (minEnergyCoM_ <= ecm) && (ecm <= maxEnergyCoM_); - } - int GetMaxTargetMassNumber() const { return maxTargetMassNumber_; } - corsika::units::si::HEPEnergyType GetMinEnergyCoM() const { return minEnergyCoM_; } - corsika::units::si::HEPEnergyType GetMaxEnergyCoM() const { return maxEnergyCoM_; } - bool IsValidTarget(corsika::particles::Code TargetId) const { - return (corsika::particles::GetNucleusA(TargetId) < maxTargetMassNumber_) && - corsika::particles::IsNucleus(TargetId); - } - - std::tuple<corsika::units::si::CrossSectionType, corsika::units::si::CrossSectionType> - GetCrossSection(const corsika::particles::Code, const corsika::particles::Code, - const corsika::units::si::HEPEnergyType) const; - - template <typename TParticle> - corsika::units::si::GrammageType GetInteractionLength(const TParticle&) const; - - /** - In this function SIBYLL is called to produce one event. The - event is copied (and boosted) into the shower lab frame. - */ - - template <typename TSecondaryView> - corsika::process::EProcessReturn DoInteraction(TSecondaryView&); - - private: - corsika::random::RNG& RNG_ = - corsika::random::RNGManager::GetInstance().GetRandomStream("sibyll"); - - const corsika::units::si::HEPEnergyType minEnergyCoM_ = - 10. * 1e9 * corsika::units::si::electronvolt; - const corsika::units::si::HEPEnergyType maxEnergyCoM_ = - 1.e6 * 1e9 * corsika::units::si::electronvolt; - const int maxTargetMassNumber_ = 18; - }; - -} // namespace corsika::process::sibyll diff --git a/Processes/StackInspector/CMakeLists.txt b/Processes/StackInspector/CMakeLists.txt deleted file mode 100644 index 7ada9c0e5..000000000 --- a/Processes/StackInspector/CMakeLists.txt +++ /dev/null @@ -1,61 +0,0 @@ -set ( - MODEL_SOURCES - StackInspector.cc - ) - -set ( - MODEL_HEADERS - StackInspector.h - ) - -set ( - MODEL_NAMESPACE - corsika/process/stack_inspector - ) - -add_library (ProcessStackInspector STATIC ${MODEL_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessStackInspector ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -set_target_properties ( - ProcessStackInspector - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 -# PUBLIC_HEADER "${MODEL_HEADERS}" - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - ProcessStackInspector - CORSIKAcascade - CORSIKAunits - CORSIKAgeometry - CORSIKAsetup - CORSIKAlogging - ) - -target_include_directories ( - ProcessStackInspector - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS ProcessStackInspector - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib -# PUBLIC_HEADER DESTINATION include/${MODEL_NAMESPACE} - ) - - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST (testStackInspector) -target_link_libraries ( - testStackInspector - ProcessStackInspector - CORSIKAgeometry - CORSIKAunits - CORSIKAtesting - ) diff --git a/Processes/StackInspector/testStackInspector.cc b/Processes/StackInspector/testStackInspector.cc deleted file mode 100644 index 3d4cdec2c..000000000 --- a/Processes/StackInspector/testStackInspector.cc +++ /dev/null @@ -1,49 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#include <catch2/catch.hpp> - -#include <corsika/process/stack_inspector/StackInspector.h> - -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> - -#include <corsika/units/PhysicalUnits.h> - -#include <corsika/cascade/testCascade.h> - -using namespace corsika::units::si; -using namespace corsika::process::stack_inspector; -using namespace corsika; -using namespace corsika::geometry; - -TEST_CASE("StackInspector", "[processes]") { - - auto const& rootCS = - geometry::RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); - geometry::Point const origin(rootCS, {0_m, 0_m, 0_m}); - geometry::Vector<units::si::SpeedType::dimension_type> v(rootCS, 0_m / second, - 0_m / second, 1_m / second); - geometry::Line line(origin, v); - geometry::LineTrajectory track(line, 10_s); - - TestCascadeStack stack; - stack.Clear(); - HEPEnergyType E0 = 100_GeV; - stack.AddParticle( - std::make_tuple(particles::Code::Electron, E0, - corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, -1_GeV}), - Point(rootCS, {0_m, 0_m, 10_km}), 0_ns)); - - SECTION("interface") { - - StackInspector<TestCascadeStack> model(1, true, E0); - model.DoStack(stack); - } -} diff --git a/Processes/SwitchProcess/CMakeLists.txt b/Processes/SwitchProcess/CMakeLists.txt deleted file mode 100644 index 352eac7c8..000000000 --- a/Processes/SwitchProcess/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -set ( - MODEL_HEADERS - SwitchProcess.h - ) - -set ( - MODEL_NAMESPACE - corsika/process/switch_process - ) - -add_library (ProcessSwitch INTERFACE) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessSwitch ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - ProcessSwitch - INTERFACE - CORSIKAunits - CORSIKAprocesssequence - ) - -target_include_directories ( - ProcessSwitch - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install (FILES ${MODEL_HEADERS} DESTINATION include/${MODEL_NAMESPACE}) - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST(testSwitchProcess) -target_link_libraries ( - testSwitchProcess - ProcessSwitch - CORSIKAstackinterface - CORSIKAtesting -) - diff --git a/Processes/TrackWriter/CMakeLists.txt b/Processes/TrackWriter/CMakeLists.txt deleted file mode 100644 index 4c7a19556..000000000 --- a/Processes/TrackWriter/CMakeLists.txt +++ /dev/null @@ -1,61 +0,0 @@ -set ( - MODEL_SOURCES - TrackWriter.cc - ) - -set ( - MODEL_HEADERS - TrackWriter.h - ) - -set ( - MODEL_NAMESPACE - corsika/process/track_writer - ) - -add_library (ProcessTrackWriter STATIC ${MODEL_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessTrackWriter ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -set_target_properties ( - ProcessTrackWriter - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 -# PUBLIC_HEADER "${MODEL_HEADERS}" - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - ProcessTrackWriter - CORSIKAunits - CORSIKAparticles - CORSIKAgeometry - CORSIKAsetup - ) - -target_include_directories ( - ProcessTrackWriter - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS ProcessTrackWriter - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib -# PUBLIC_HEADER DESTINATION include/${MODEL_NAMESPACE} - ) - - -# -------------------- -# code unit testing -# CORSIKA_ADD_TEST(testNullModel) -#target_link_libraries ( -# testNullModel ProcessNullModel -# CORSIKAsetup -# CORSIKAgeometry -# CORSIKAunits -# CORSIKAthirdparty # for catch2 -# ) - diff --git a/Processes/TrackingLine/CMakeLists.txt b/Processes/TrackingLine/CMakeLists.txt deleted file mode 100644 index 75dcaec7e..000000000 --- a/Processes/TrackingLine/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -set ( - MODEL_HEADERS - Tracking.h - ) - -set ( - MODEL_NAMESPACE - corsika/process/tracking_line - ) - -add_library (ProcessTrackingLine INTERFACE) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessTrackingLine ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - ProcessTrackingLine - INTERFACE - ProcessTrackingIntersects - CORSIKAsetup - CORSIKAutilities - CORSIKAenvironment - CORSIKAunits - CORSIKAenvironment - CORSIKAgeometry - CORSIKAlogging - ) - -target_include_directories ( - ProcessTrackingLine - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install (FILES ${MODEL_HEADERS} DESTINATION include/${MODEL_NAMESPACE}) - -# Note: all Tracking Algorithms are tested in testTracking diff --git a/Processes/TrackingLine/testTrackingLineStack.h b/Processes/TrackingLine/testTrackingLineStack.h deleted file mode 100644 index 5c714048a..000000000 --- a/Processes/TrackingLine/testTrackingLineStack.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/environment/Environment.h> - -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Vector.h> - -#include <corsika/particles/ParticleProperties.h> - -#include <corsika/stack/CombinedStack.h> -#include <corsika/stack/node/GeometryNodeStackExtension.h> -#include <corsika/stack/nuclear_extension/NuclearStackExtension.h> - -#include <corsika/units/PhysicalUnits.h> - -using TestEnvironmentType = - corsika::environment::Environment<corsika::environment::Empty>; - -template <typename T> -using SetupGeometryDataInterface = - corsika::stack::node::GeometryDataInterface<T, TestEnvironmentType>; - -// combine particle data stack with geometry information for tracking -template <typename StackIter> -using StackWithGeometryInterface = corsika::stack::CombinedParticleInterface< - corsika::stack::nuclear_extension::ParticleDataStack::MPIType, - SetupGeometryDataInterface, StackIter>; - -using TestTrackingLineStack = corsika::stack::CombinedStack< - typename corsika::stack::nuclear_extension::ParticleDataStack::StackImpl, - corsika::stack::node::GeometryData<TestEnvironmentType>, StackWithGeometryInterface>; diff --git a/Processes/UrQMD/CMakeLists.txt b/Processes/UrQMD/CMakeLists.txt deleted file mode 100644 index 0fbdb064c..000000000 --- a/Processes/UrQMD/CMakeLists.txt +++ /dev/null @@ -1,96 +0,0 @@ -set ( - MODEL_SOURCES - UrQMD.cc - urqmdInterface.F - addpart.f - angdis.f - anndec.f - blockres.f - boxprg.f - cascinit.f - coload.f - dectim.f - delpart.f - detbal.f - dwidth.f - error.f - getmass.f - getspin.f - init.f - iso.f - ityp2pdg.f - jdecay2.f - make22.f - numrec.f - output.f - paulibl.f - proppot.f - saveinfo.f - scatter.f - siglookup.f - string.f - tabinit.f - urqmd.f - whichres.f -) - -set ( - MODEL_HEADERS - UrQMD.h - ) - -set ( - MODEL_NAMESPACE - corsika/process/urqmd - ) - -add_library (ProcessUrQMD STATIC ${MODEL_SOURCES}) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (ProcessUrQMD ${MODEL_NAMESPACE} ${MODEL_HEADERS}) - -set_target_properties ( - ProcessUrQMD - PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION 1 - ) - -# target dependencies on other libraries (also the header onlys) -target_link_libraries ( - ProcessUrQMD - CORSIKAprocesssequence - CORSIKAparticles - CORSIKAunits - CORSIKAgeometry - CORSIKArandom - CORSIKAsetup - CORSIKAthirdparty - ) - -target_include_directories ( - ProcessUrQMD - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - TARGETS ProcessUrQMD - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - ) - - -# -------------------- -# code unit testing -CORSIKA_ADD_TEST(testUrQMD SOURCES testUrQMD.cc ${MODEL_HEADERS}) -target_link_libraries ( - testUrQMD - ProcessUrQMD - CORSIKAtesting - ) - -add_executable(urqmd_xs urqmd_xs.cc) -target_link_libraries(urqmd_xs - ProcessUrQMD - CORSIKAparticles -) diff --git a/Setup/CMakeLists.txt b/Setup/CMakeLists.txt deleted file mode 100644 index 94b1fc731..000000000 --- a/Setup/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -set ( - SETUP_HEADERS - SetupStack.h - SetupEnvironment.h - SetupTrajectory.h - ) - -set ( - SETUP_NAMESPACE - corsika/setup - ) - -add_library (CORSIKAsetup INTERFACE) -CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAsetup ${SETUP_NAMESPACE} ${SETUP_HEADERS}) - -target_link_libraries ( - CORSIKAsetup - INTERFACE - CORSIKAgeometry - NuclearStackExtension - GeometryNodeStackExtension - CORSIKAhistory - ) - -if (WITH_HISTORY) - target_compile_definitions (CORSIKAsetup INTERFACE "WITH_HISTORY") -endif (WITH_HISTORY) - -target_include_directories ( - CORSIKAsetup - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include/include> - ) - -install ( - FILES ${SETUP_HEADERS} - DESTINATION include/${SETUP_NAMESPACE} - ) diff --git a/Setup/SetupEnvironment.h b/Setup/SetupEnvironment.h deleted file mode 100644 index 87f0c8e30..000000000 --- a/Setup/SetupEnvironment.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/environment/Environment.h> -#include <corsika/environment/IMagneticFieldModel.h> -#include <corsika/environment/IMediumModel.h> -#include <corsika/environment/IMediumPropertyModel.h> -#include <corsika/environment/IRefractiveIndexModel.h> -#include <corsika/environment/IMagneticFieldModel.h> - -namespace corsika::setup { - - /** - Definition of the default environemnt model interface. Each model - interface provides properties of the environment in a position - bdependent way. - */ - - using EnvironmentInterface = environment::IMediumPropertyModel< - environment::IMagneticFieldModel<environment::IMediumModel>>; - using Environment = environment::Environment<EnvironmentInterface>; - -} // end namespace corsika::setup - -#include <corsika/environment/HomogeneousMedium.h> -#include <corsika/environment/InhomogeneousMedium.h> -#include <corsika/environment/MediumPropertyModel.h> -#include <corsika/environment/UniformMagneticField.h> - -/** - * standard environment for unit testing. This can be moved to - * "test" directory, when available. - */ -namespace corsika::setup::testing { - - inline auto setupEnvironment(particles::Code vTargetCode, - const corsika::units::si::MagneticFluxType BfieldZ = - corsika::units::si::MagneticFluxType::zero()) { - - using namespace corsika::units::si; - using namespace corsika; - - auto env = std::make_unique<setup::Environment>(); - auto& universe = *(env->GetUniverse()); - const geometry::CoordinateSystem& cs = env->GetCoordinateSystem(); - - /** - * our world is a sphere at 0,0,0 with R=infty - */ - auto world = setup::Environment::CreateNode<geometry::Sphere>( - geometry::Point{cs, 0_m, 0_m, 0_m}, 100_km); - - /** - * construct suited environment medium model: - */ - using MyHomogeneousModel = - environment::MediumPropertyModel<environment::UniformMagneticField< - environment::HomogeneousMedium<setup::EnvironmentInterface>>>; - - world->SetModelProperties<MyHomogeneousModel>( - environment::Medium::AirDry1Atm, geometry::Vector(cs, 0_T, 0_T, BfieldZ), - 1_kg / (1_m * 1_m * 1_m), - environment::NuclearComposition(std::vector<particles::Code>{vTargetCode}, - std::vector<float>{1.})); - - auto* nodePtr = world.get(); - universe.AddChild(std::move(world)); - - return std::make_tuple(std::move(env), &cs, nodePtr); - } - -} // namespace corsika::setup::testing diff --git a/Setup/SetupStack.h b/Setup/SetupStack.h deleted file mode 100644 index f06aaf760..000000000 --- a/Setup/SetupStack.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#pragma once - -#include <corsika/stack/CombinedStack.h> -#include <corsika/stack/node/GeometryNodeStackExtension.h> -#include <corsika/stack/nuclear_extension/NuclearStackExtension.h> -#include <corsika/stack/history/HistorySecondaryProducer.hpp> -#include <corsika/stack/history/HistoryStackExtension.hpp> - -#include <corsika/setup/SetupEnvironment.h> - -namespace corsika::setup { - - namespace detail { - - // ------------------------------------------ - // add geometry node tracking data to stack: - - // the GeometryNode stack needs to know the type of geometry-nodes from the - // environment: - template <typename TStackIter> - using SetupGeometryDataInterface = typename stack::node::MakeGeometryDataInterface< - TStackIter, corsika::setup::Environment>::type; - - // combine particle data stack with geometry information for tracking - template <typename TStackIter> - using StackWithGeometryInterface = corsika::stack::CombinedParticleInterface< - stack::nuclear_extension::ParticleDataStack::MPIType, SetupGeometryDataInterface, - TStackIter>; - - using StackWithGeometry = corsika::stack::CombinedStack< - typename corsika::stack::nuclear_extension::ParticleDataStack::StackImpl, - corsika::stack::node::GeometryData<setup::Environment>, - StackWithGeometryInterface>; - - // ------------------------------------------ - // Add [optional] history data to stack, too: - - // combine dummy stack with geometry information for tracking - template <typename TStackIter> - using StackWithHistoryInterface = corsika::stack::CombinedParticleInterface< - StackWithGeometry::MPIType, history::HistoryEventDataInterface, TStackIter>; - - using StackWithHistory = - corsika::stack::CombinedStack<typename StackWithGeometry::StackImpl, - history::HistoryEventData, - StackWithHistoryInterface>; - - } // namespace detail - - // --------------------------------------- - // this is the FINAL stack we use in C8: - -#ifdef WITH_HISTORY - - /* - * the version with history - */ - using Stack = detail::StackWithHistory; - template <typename T1, template <typename> typename M2> - using StackViewProducer = corsika::history::HistorySecondaryProducer<T1, M2>; - - namespace detail { - /* - See Issue 161 - - unfortunately clang does not support this in the same way (yet) as - gcc, so we have to distinguish here. If clang cataches up, we - could remove the clang branch here and also in - corsika::Cascade. The gcc code is much more generic and - universal. If we could do the gcc version, we won't had to define - StackView globally, we could do it with MakeView whereever it is - actually needed. Keep an eye on this! - */ -#if defined(__clang__) - using TheStackView = corsika::stack::SecondaryView< - typename corsika::setup::Stack::StackImpl, - // CHECK with CLANG: corsika::setup::Stack::MPIType>; - corsika::setup::detail::StackWithHistoryInterface, StackViewProducer>; -#elif defined(__GNUC__) || defined(__GNUG__) - using TheStackView = - corsika::stack::MakeView<corsika::setup::Stack, StackViewProducer>::type; -#endif - } // namespace detail - -#else // WITH_HISTORY - - /* - * the version without history - */ - using Stack = detail::StackWithGeometry; - template <typename T1, template <typename> typename M2> - using StackViewProducer = corsika::stack::DefaultSecondaryProducer<T1, M2>; - - namespace detail { - /* - See Issue 161 - - unfortunately clang does not support this in the same way (yet) as - gcc, so we have to distinguish here. If clang cataches up, we - could remove the clang branch here and also in - corsika::Cascade. The gcc code is much more generic and - universal. If we could do the gcc version, we won't had to define - StackView globally, we could do it with MakeView whereever it is - actually needed. Keep an eye on this! - */ -#if defined(__clang__) - using TheStackView = - corsika::stack::SecondaryView<typename corsika::setup::Stack::StackImpl, - // CHECK with CLANG: - // corsika::setup::Stack::MPIType>; - corsika::setup::detail::StackWithGeometryInterface>; -#elif defined(__GNUC__) || defined(__GNUG__) - using TheStackView = corsika::stack::MakeView<corsika::setup::Stack>::type; -#endif - } // namespace detail - -#endif - - // --------------------------------------- - // this is the FINAL stackitertor (particle type) we use in C8: - - using StackView = detail::TheStackView; - -} // namespace corsika::setup - -/** - * standard stack setup for unit tests. This can be moved to "test" - * directory, when available. - */ - -namespace corsika::setup::testing { - - inline auto setupStack(particles::Code vProjectileType, int vA, int vZ, - units::si::HEPEnergyType vMomentum, - const setup::Environment::BaseNodeType* vNodePtr, - geometry::CoordinateSystem const& cs) { - - using namespace corsika; - using namespace corsika::units::si; - - auto stack = std::make_unique<setup::Stack>(); - - geometry::Point const origin(cs, {0_m, 0_m, 0_m}); - corsika::stack::MomentumVector const pLab(cs, {vMomentum, 0_GeV, 0_GeV}); - - if (vProjectileType == particles::Code::Nucleus) { - auto constexpr mN = corsika::units::constants::nucleonMass; - HEPEnergyType const E0 = sqrt(units::static_pow<2>(mN * vA) + pLab.squaredNorm()); - auto particle = stack->AddParticle( - std::make_tuple(particles::Code::Nucleus, E0, pLab, origin, 0_ns, vA, vZ)); - particle.SetNode(vNodePtr); - return std::make_tuple(std::move(stack), - std::make_unique<setup::StackView>(particle)); - } else { // not a nucleus - HEPEnergyType const E0 = sqrt( - units::static_pow<2>(particles::GetMass(vProjectileType)) + pLab.squaredNorm()); - auto particle = - stack->AddParticle(std::make_tuple(vProjectileType, E0, pLab, origin, 0_ns)); - particle.SetNode(vNodePtr); - return std::make_tuple(std::move(stack), - std::make_unique<setup::StackView>(particle)); - } - } - -} // namespace corsika::setup::testing diff --git a/Stack/CMakeLists.txt b/Stack/CMakeLists.txt deleted file mode 100644 index ae5ee2aca..000000000 --- a/Stack/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -add_subdirectory (DummyStack) -add_subdirectory (SuperStupidStack) -add_subdirectory (NuclearStackExtension) -add_subdirectory (GeometryNodeStackExtension) -add_subdirectory (History) diff --git a/Stack/DummyStack/CMakeLists.txt b/Stack/DummyStack/CMakeLists.txt deleted file mode 100644 index b7e09a9e4..000000000 --- a/Stack/DummyStack/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -set (DummyStack_HEADERS DummyStack.h) -set (DummyStack_NAMESPACE corsika/stack/dummy) - -add_library (DummyStack INTERFACE) - -CORSIKA_COPY_HEADERS_TO_NAMESPACE (DummyStack ${DummyStack_NAMESPACE} ${DummyStack_HEADERS}) - -target_link_libraries ( - DummyStack - INTERFACE - CORSIKAstackinterface - CORSIKAunits - CORSIKAparticles - ) - -target_include_directories ( - DummyStack - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include> - ) - -install ( - FILES - ${DummyStack_HEADERS} - DESTINATION - include/${DummyStack_NAMESPACE} - ) - -# ---------------- -# code unit testing - CORSIKA_ADD_TEST(testDummyStack) - target_link_libraries ( - testDummyStack - DummyStack - CORSIKAtesting - ) diff --git a/Stack/NuclearStackExtension/CMakeLists.txt b/Stack/NuclearStackExtension/CMakeLists.txt deleted file mode 100644 index 3e3c5e735..000000000 --- a/Stack/NuclearStackExtension/CMakeLists.txt +++ /dev/null @@ -1,42 +0,0 @@ -set (NuclearStackExtension_HEADERS NuclearStackExtension.h) -set (NuclearStackExtension_NAMESPACE corsika/stack/nuclear_extension) - -add_library (NuclearStackExtension INTERFACE) - -CORSIKA_COPY_HEADERS_TO_NAMESPACE (NuclearStackExtension ${NuclearStackExtension_NAMESPACE} ${NuclearStackExtension_HEADERS}) - -target_link_libraries ( - NuclearStackExtension - INTERFACE - CORSIKAstackinterface - CORSIKAunits - CORSIKAparticles - CORSIKAgeometry - SuperStupidStack - ) - -target_include_directories ( - NuclearStackExtension - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include> - ) - -install ( - FILES - ${NuclearStackExtension_HEADERS} - DESTINATION - include/${NuclearStackExtension_NAMESPACE} - ) - -# ---------------- -# code unit testing -CORSIKA_ADD_TEST(testNuclearStackExtension) -target_link_libraries ( - testNuclearStackExtension - NuclearStackExtension - CORSIKAparticles - CORSIKAgeometry - CORSIKAunits - CORSIKAtesting - ) diff --git a/Stack/NuclearStackExtension/testNuclearStackExtension.cc b/Stack/NuclearStackExtension/testNuclearStackExtension.cc deleted file mode 100644 index 72017c91a..000000000 --- a/Stack/NuclearStackExtension/testNuclearStackExtension.cc +++ /dev/null @@ -1,258 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/stack/nuclear_extension/NuclearStackExtension.h> -#include <corsika/units/PhysicalUnits.h> - -using namespace corsika; -using namespace corsika::stack::nuclear_extension; -using namespace corsika::geometry; -using namespace corsika::units::si; - -#include <catch2/catch.hpp> - -#include <iostream> -using namespace std; - -TEST_CASE("NuclearStackExtension", "[stack]") { - - geometry::CoordinateSystem& dummyCS = - geometry::RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); - - SECTION("write non nucleus") { - NuclearStackExtension<corsika::stack::super_stupid::SuperStupidStack, - ExtendedParticleInterfaceType> - s; - s.AddParticle( - std::make_tuple(particles::Code::Electron, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s)); - CHECK(s.getEntries() == 1); - } - - SECTION("write nucleus") { - NuclearStackExtension<corsika::stack::super_stupid::SuperStupidStack, - ExtendedParticleInterfaceType> - s; - s.AddParticle(std::make_tuple( - particles::Code::Nucleus, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 10, 10)); - CHECK(s.getEntries() == 1); - } - - SECTION("write invalid nucleus") { - ParticleDataStack s; - CHECK_THROWS(s.AddParticle( - std::make_tuple(particles::Code::Nucleus, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 0, 0))); - } - - SECTION("read non nucleus") { - ParticleDataStack s; - s.AddParticle( - std::make_tuple(particles::Code::Electron, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s)); - const auto pout = s.GetNextParticle(); - CHECK(pout.GetPID() == particles::Code::Electron); - CHECK(pout.GetEnergy() == 1.5_GeV); - CHECK(pout.GetTime() == 100_s); - } - - SECTION("read nucleus") { - ParticleDataStack s; - s.AddParticle( - std::make_tuple(particles::Code::Nucleus, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 10, 9)); - const auto pout = s.GetNextParticle(); - CHECK(pout.GetPID() == particles::Code::Nucleus); - CHECK(pout.GetEnergy() == 1.5_GeV); - CHECK(pout.GetTime() == 100_s); - CHECK(pout.GetNuclearA() == 10); - CHECK(pout.GetNuclearZ() == 9); - } - - SECTION("read invalid nucleus") { - ParticleDataStack s; - s.AddParticle( - std::make_tuple(particles::Code::Electron, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s)); - const auto pout = s.GetNextParticle(); - CHECK_THROWS(pout.GetNuclearA()); - CHECK_THROWS(pout.GetNuclearZ()); - } - - SECTION("stack fill and cleanup") { - - ParticleDataStack s; - // add 99 particles, each 10th particle is a nucleus with A=i and Z=A/2! - for (int i = 0; i < 99; ++i) { - if ((i + 1) % 10 == 0) { - s.AddParticle(std::make_tuple( - particles::Code::Nucleus, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, i, i / 2)); - } else { - s.AddParticle(std::make_tuple( - particles::Code::Electron, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s)); - } - } - - CHECK(s.getEntries() == 99); - for (int i = 0; i < 99; ++i) s.GetNextParticle().Delete(); - CHECK(s.getEntries() == 0); - } - - SECTION("stack operations") { - - ParticleDataStack s; - // add 99 particles, each 10th particle is a nucleus with A=i and Z=A/2! - // i=9, 19, 29, etc. are nuclei - for (int i = 0; i < 99; ++i) { - if ((i + 1) % 10 == 0) { - s.AddParticle(std::make_tuple( - particles::Code::Nucleus, i * 15_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, i, i / 2)); - } else { - s.AddParticle(std::make_tuple( - particles::Code::Electron, i * 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s)); - } - } - - // copy - { - s.Copy(s.begin() + 9, s.begin() + 10); // nuclei to non-nuclei - const auto& p9 = s.cbegin() + 9; - const auto& p10 = s.cbegin() + 10; - - CHECK(p9.GetPID() == particles::Code::Nucleus); - CHECK(p9.GetEnergy() == 9 * 15_GeV); - CHECK(p9.GetTime() == 100_s); - CHECK(p9.GetNuclearA() == 9); - CHECK(p9.GetNuclearZ() == 9 / 2); - - CHECK(p10.GetPID() == particles::Code::Nucleus); - CHECK(p10.GetEnergy() == 9 * 15_GeV); - CHECK(p10.GetTime() == 100_s); - CHECK(p10.GetNuclearA() == 9); - CHECK(p10.GetNuclearZ() == 9 / 2); - } - - // copy - { - s.Copy(s.begin() + 93, s.begin() + 9); // non-nuclei to nuclei - const auto& p93 = s.cbegin() + 93; - const auto& p9 = s.cbegin() + 9; - - CHECK(p9.GetPID() == particles::Code::Electron); - CHECK(p9.GetEnergy() == 93 * 1.5_GeV); - CHECK(p9.GetTime() == 100_s); - - CHECK(p93.GetPID() == particles::Code::Electron); - CHECK(p93.GetEnergy() == 93 * 1.5_GeV); - CHECK(p93.GetTime() == 100_s); - } - - // copy - { - s.Copy(s.begin() + 89, s.begin() + 79); // nuclei to nuclei - const auto& p89 = s.cbegin() + 89; - const auto& p79 = s.cbegin() + 79; - - CHECK(p89.GetPID() == particles::Code::Nucleus); - CHECK(p89.GetEnergy() == 89 * 15_GeV); - CHECK(p89.GetTime() == 100_s); - - CHECK(p79.GetPID() == particles::Code::Nucleus); - CHECK(p79.GetEnergy() == 89 * 15_GeV); - CHECK(p79.GetTime() == 100_s); - } - - // swap - { - s.Swap(s.begin() + 11, s.begin() + 10); - const auto& p11 = s.cbegin() + 11; // now: nucleus - const auto& p10 = s.cbegin() + 10; // now: electron - - CHECK(p11.GetPID() == particles::Code::Nucleus); - CHECK(p11.GetEnergy() == 9 * 15_GeV); - CHECK(p11.GetTime() == 100_s); - CHECK(p11.GetNuclearA() == 9); - CHECK(p11.GetNuclearZ() == 9 / 2); - - CHECK(p10.GetPID() == particles::Code::Electron); - CHECK(p10.GetEnergy() == 11 * 1.5_GeV); - CHECK(p10.GetTime() == 100_s); - } - - // swap two nuclei - { - s.Swap(s.begin() + 29, s.begin() + 59); - const auto& p29 = s.cbegin() + 29; - const auto& p59 = s.cbegin() + 59; - - CHECK(p29.GetPID() == particles::Code::Nucleus); - CHECK(p29.GetEnergy() == 59 * 15_GeV); - CHECK(p29.GetTime() == 100_s); - CHECK(p29.GetNuclearA() == 59); - CHECK(p29.GetNuclearZ() == 59 / 2); - - CHECK(p59.GetPID() == particles::Code::Nucleus); - CHECK(p59.GetEnergy() == 29 * 15_GeV); - CHECK(p59.GetTime() == 100_s); - CHECK(p59.GetNuclearA() == 29); - CHECK(p59.GetNuclearZ() == 29 / 2); - } - - for (int i = 0; i < 99; ++i) s.last().Delete(); - CHECK(s.getEntries() == 0); - } - - SECTION("not allowed") { - NuclearStackExtension<corsika::stack::super_stupid::SuperStupidStack, - ExtendedParticleInterfaceType> - s; - - // not valid: - CHECK_THROWS(s.AddParticle(std::make_tuple( - particles::Code::Oxygen, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 16, 8))); - - // valid - auto particle = s.AddParticle( - std::make_tuple(particles::Code::Nucleus, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 10, 9)); - - // not valid - CHECK_THROWS(particle.AddSecondary(std::make_tuple( - particles::Code::Oxygen, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 16, 8))); - - // add a another nucleus, so there are two now - s.AddParticle( - std::make_tuple(particles::Code::Nucleus, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 10, 9)); - - // not valid, since end() is not a valid entry - CHECK_THROWS(s.Swap(s.begin(), s.end())); - } -} diff --git a/Stack/SuperStupidStack/CMakeLists.txt b/Stack/SuperStupidStack/CMakeLists.txt deleted file mode 100644 index 55b88c69c..000000000 --- a/Stack/SuperStupidStack/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -set (SuperStupidStack_HEADERS SuperStupidStack.h) -set (SuperStupidStack_NAMESPACE corsika/stack/super_stupid) - -add_library (SuperStupidStack INTERFACE) - -CORSIKA_COPY_HEADERS_TO_NAMESPACE (SuperStupidStack ${SuperStupidStack_NAMESPACE} ${SuperStupidStack_HEADERS}) - -target_link_libraries ( - SuperStupidStack - INTERFACE - CORSIKAstackinterface - CORSIKAunits - CORSIKAparticles - CORSIKAgeometry - CORSIKAlogging - ) - -target_include_directories ( - SuperStupidStack - INTERFACE - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> - $<INSTALL_INTERFACE:include> - ) - -install ( - FILES - ${SuperStupidStack_HEADERS} - DESTINATION - include/${SuperStupidStack_NAMESPACE} - ) - -# ---------------- -# code unit testing -CORSIKA_ADD_TEST(testSuperStupidStack) -target_link_libraries ( - testSuperStupidStack - SuperStupidStack - CORSIKAtesting - ) diff --git a/Stack/SuperStupidStack/testSuperStupidStack.cc b/Stack/SuperStupidStack/testSuperStupidStack.cc deleted file mode 100644 index a9f4fadc9..000000000 --- a/Stack/SuperStupidStack/testSuperStupidStack.cc +++ /dev/null @@ -1,63 +0,0 @@ -/* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu - * - * This software is distributed under the terms of the GNU General Public - * Licence version 3 (GPL Version 3). See file LICENSE for a full version of - * the license. - */ - -#define protected public // to also test the internal state of objects - -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/stack/super_stupid/SuperStupidStack.h> -#include <corsika/units/PhysicalUnits.h> - -using namespace corsika::geometry; -using namespace corsika::units::si; - -#include <catch2/catch.hpp> - -using namespace corsika; -using namespace corsika::stack::super_stupid; - -using namespace std; - -TEST_CASE("SuperStupidStack", "[stack]") { - - geometry::CoordinateSystem& dummyCS = - geometry::RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); - - SECTION("read+write") { - - SuperStupidStack s; - s.AddParticle( - std::make_tuple(particles::Code::Electron, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s)); - - // read - CHECK(s.getEntries() == 1); - CHECK(s.getSize() == 1); - auto pout = s.GetNextParticle(); - CHECK(pout.GetPID() == particles::Code::Electron); - CHECK(pout.GetEnergy() == 1.5_GeV); - CHECK(pout.GetTime() == 100_s); - } - - SECTION("write+delete") { - - SuperStupidStack s; - for (int i = 0; i < 99; ++i) - s.AddParticle( - std::make_tuple(particles::Code::Electron, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s)); - - CHECK(s.getSize() == 99); - - for (int i = 0; i < 99; ++i) s.GetNextParticle().Delete(); - - CHECK(s.getEntries() == 0); - CHECK(s.getSize() == 1); - } -} diff --git a/ThirdParty/.gitignore b/ThirdParty/.gitignore deleted file mode 100644 index 0d7fe2795..000000000 --- a/ThirdParty/.gitignore +++ /dev/null @@ -1 +0,0 @@ -eigen-eigen-b3f3d4950030/ diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt deleted file mode 100644 index b1553b849..000000000 --- a/ThirdParty/CMakeLists.txt +++ /dev/null @@ -1,292 +0,0 @@ -add_subdirectory (spdlog) # this is a git submodule - -add_library (CORSIKAthirdparty INTERFACE) - -target_include_directories (CORSIKAthirdparty SYSTEM - INTERFACE - $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/ThirdParty> - $<INSTALL_INTERFACE:include/ThirdParty> - ) - -install (DIRECTORY phys DESTINATION include/ThirdParty/) -install (DIRECTORY catch2 DESTINATION include/ThirdParty/) - -include(ExternalProject) - -# eventually add AUTO here, too: -set (ThirdPartyChoiceValues "C8;SYSTEM" CACHE STRING - "List of possible values for the ThirdParty package choice") -mark_as_advanced (ThirdPartyChoiceValues) - - -############################################################################## -# check for boost: either use C8 or system-level installation - -message ("***** Configuring boost version") - -set (USE_BOOST_C8 "C8" CACHE STRING - "Selection of boost package. Can be \'C8\' or \'SYSTEM\'. Default: \'C8\'.") -set_property (CACHE USE_BOOST_C8 PROPERTY STRINGS ${ThirdPartyChoiceValues} ) -if (NOT (${USE_BOOST_C8} IN_LIST ThirdPartyChoiceValues)) - message (SEND_ERROR "Illegal USE_BOOST_C8=\"${USE_BOOST_C8}\" can only be one of: ${ThirdPartyChoiceValues}") -endif (NOT (${USE_BOOST_C8} IN_LIST ThirdPartyChoiceValues)) -message (STATUS "USE_BOOST_C8='${USE_BOOST_C8}'") - -add_library (C8::ext::boost INTERFACE IMPORTED GLOBAL) -if ("x_${USE_BOOST_C8}" STREQUAL "x_SYSTEM") - find_package (Boost REQUIRED COMPONENTS mp11 iterator core format interval optional type_index histogram multi_array) - - message (STATUS "Using system-level boost version ${Boost_VERSION} at ${Boost_INCLUDE_DIR}") - set_target_properties ( - C8::ext::boost PROPERTIES - INTERFACE_LINK_LIBRARIES Boost::headers - ) - set (Boost_FOUND 1 PARENT_SCOPE) - -else () - - set (_C8_Boost_VERSION "107400") - message (STATUS "Building ThirdParty/boost using boost-${_C8_Boost_VERSION}.tar.bz2") - ExternalProject_Add (boost - URL ${CMAKE_CURRENT_SOURCE_DIR}/boost-${_C8_Boost_VERSION}.tar.bz2 - URL_MD5 d55f45e662d101985353136b321ec624 - SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/boost/install/boost - INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/boost/install/boost - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - BUILD_IN_SOURCE ON - EXCLUDE_FROM_ALL FALSE - ) - set (HAVE_Boost 1 CACHE BOOL "presence of boost, via external-project-add in ThirdParty folder") - set (Boost_FOUND 1 PARENT_SCOPE) - ExternalProject_Get_Property (boost INSTALL_DIR) - set (Boost_VERSION ${_C8_Boost_VERSION} CACHE STRING "Version of Boost") - set (Boost_PREFIX ${INSTALL_DIR}/..) - set (Boost_INCLUDE_DIR ${Boost_PREFIX}) - set (Boost_LIBRARY_DIR ${Boost_PREFIX}) - add_dependencies (C8::ext::boost boost) - - # create include directory at config time - file (MAKE_DIRECTORY ${Boost_INCLUDE_DIR}) - - set (Boost_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/externals/boost) - install (DIRECTORY ${Boost_PREFIX}/ DESTINATION ${Boost_INSTALL_DIR}) - - message (STATUS "Use ThirdParty boost include dir ${Boost_INCLUDE_DIR}") - set_target_properties ( - C8::ext::boost PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES - $<BUILD_INTERFACE:${Boost_INCLUDE_DIR}> - ) - -endif () - - -############################################################################## -# check for Eigen3: either use ThirdParty/eigen3 or system-level installation - -message ("***** Configuring eigen3 version") - -set (USE_EIGEN3_C8 "C8" CACHE STRING - "Selection of eigen3 package. Can be \'C8\' or \'SYSTEM\'. Default: \'C8\'.") -set_property (CACHE USE_EIGEN3_C8 PROPERTY STRINGS ${ThirdPartyChoiceValues}) -if (NOT (${USE_EIGEN3_C8} IN_LIST ThirdPartyChoiceValues)) - message (SEND_ERROR "Illegal USE_EIGEN3_C8=\"${USE_EIGEN3_C8}\" can only be one of: ${ThirdPartyChoiceValues}") -endif (NOT (${USE_EIGEN3_C8} IN_LIST ThirdPartyChoiceValues)) -message (STATUS "USE_EIGEN3_C8='${USE_EIGEN3_C8}'") - -add_library (C8::ext::eigen3 INTERFACE IMPORTED GLOBAL) -if ("x_${USE_EIGEN3_C8}" STREQUAL "x_SYSTEM") - - if (WITH_EIGEN3) - list (APPEND CMAKE_MODULE_PATH "${WITH_EIGEN3}/cmake") - endif (WITH_EIGEN3) - find_package (Eigen3 REQUIRED NO_MODULE) - message (STATUS "Using system-level eigen3 version ${Eigen3_VERSION} at ${Eigen3_INCLUDE_DIR}") - set_target_properties ( - C8::ext::eigen3 PROPERTIES - INTERFACE_LINK_LIBRARIES Eigen3::Eigen - ) -set (Eigen3_FOUND 1 PARENT_SCOPE) - -else () - - set (_C8_Eigen3_VERSION "eigen-eigen-b3f3d4950030") - - message (STATUS "Building ThirdParty/eigen3 using ${_C8_Eigen3_VERSION}.tar.bz2") - ExternalProject_Add (eigen3 - URL ${CMAKE_CURRENT_SOURCE_DIR}/${_C8_Eigen3_VERSION}.tar.bz2 - URL_MD5 e83549a79d1b721da0f8899ab34edf95 - SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/eigen3/install/eigen - INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/eigen3/install/eigen - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - BUILD_IN_SOURCE ON - EXCLUDE_FROM_ALL FALSE - ) - set (Eigen3_FOUND 1 PARENT_SCOPE) - ExternalProject_Get_Property (eigen3 INSTALL_DIR) - set (Eigen3_PREFIX ${INSTALL_DIR}/..) - set (Eigen3_INCLUDE_DIR ${Eigen3_PREFIX}/eigen) - add_dependencies (C8::ext::eigen3 eigen3) - - # create include directory at config time - file (MAKE_DIRECTORY ${Eigen3_INCLUDE_DIR}) - - set (Eigen3_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/externals/eigen3) - install (DIRECTORY ${Eigen3_PREFIX}/ DESTINATION ${Eigen3_INSTALL_DIR}) - - message (STATUS "Use ThirdParty eigen3 include dir ${Eigen3_INCLUDE_DIR}") - set_target_properties ( - C8::ext::eigen3 PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES - $<BUILD_INTERFACE:${Eigen3_INCLUDE_DIR}> - ) - -endif () - - -############################################################################## -# check for Pythia8: either use C8 or system-level installation - -message ("***** Configuring Pythia8 version") - -set (USE_PYTHIA8_C8 "C8" CACHE STRING - "Selection of pythia8 package. Can be \'C8\' or \'SYSTEM\'. Default: \'C8\'.") -set_property (CACHE USE_PYTHIA8_C8 PROPERTY STRINGS ${ThirdPartyChoiceValues}) -if (NOT (${USE_PYTHIA8_C8} IN_LIST ThirdPartyChoiceValues)) - message (SEND_ERROR "Illegal USE_PYTHIA8_C8=\"${USE_PYTHIA8_C8}\" can only be one of: ${ThirdPartyChoiceValues}") -endif (NOT (${USE_PYTHIA8_C8} IN_LIST ThirdPartyChoiceValues)) -message (STATUS "USE_PYTHIA8_C8='${USE_PYTHIA8_C8}'") - -add_library (C8::ext::pythia8 STATIC IMPORTED GLOBAL) -if ("x_${USE_PYTHIA8_C8}" STREQUAL "x_SYSTEM") - - find_package (Pythia8 REQUIRED) - message (STATUS "Using system-level Pythia8 version ${Pythia8_VERSION} at ${Pythia8_INCLUDE_DIR}") - set_target_properties ( - C8::ext::pythia8 PROPERTIES - IMPORTED_LOCATION ${Pythia8_LIBRARY} - IMPORTED_LINK_INTERFACE_LIBRARIES dl - INTERFACE_INCLUDE_DIRECTORIES ${Pythia8_INCLUDE_DIR} - ) - set (Pythia8_FOUND 1 PARENT_SCOPE) - -else () - - set (_C8_Pythia8_VERSION "8235") - message (STATUS "Building ThirdParty/pythia8 using pythia${_C8_Pythia8_VERSION}-stripped.tar.bz2") - message (STATUS "This will take a bit.....") - ExternalProject_Add (pythia8 - URL ${CMAKE_CURRENT_SOURCE_DIR}/pythia${_C8_Pythia8_VERSION}-stripped.tar.bz2 - URL_MD5 83132880c0594b808bd7fd37fb642606 - SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/pythia8/source - INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/pythia8/install - CONFIGURE_COMMAND ./configure --cxx-common=-Wno-deprecated-copy --prefix=${CMAKE_CURRENT_BINARY_DIR}/pythia8/install - BUILD_IN_SOURCE ON - EXCLUDE_FROM_ALL TRUE - ) - set (Pythia8_FOUND 1 PARENT_SCOPE) - ExternalProject_Get_Property (pythia8 INSTALL_DIR) - set (Pythia8_VERSION ${_C8_Pythia8_VERSION} CACHE STRING "Version of Pythia8") - set (Pythia8_PREFIX ${INSTALL_DIR}) - set (Pythia8_INCLUDE_DIR ${Pythia8_PREFIX}/include) - set (Pythia8_LIBRARY ${Pythia8_PREFIX}/lib/libpythia8.a) - add_dependencies (C8::ext::pythia8 pythia8) - - # create include directory at config time - file (MAKE_DIRECTORY ${Pythia8_INCLUDE_DIR}) - - set (Pythia8_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/externals/pythia8) - install (DIRECTORY ${INSTALL_DIR}/ DESTINATION ${Pythia8_INSTALL_DIR}) - - set_target_properties ( - C8::ext::pythia8 PROPERTIES - IMPORTED_LOCATION ${Pythia8_LIBRARY} - IMPORTED_LINK_INTERFACE_LIBRARIES dl - INTERFACE_INCLUDE_DIRECTORIES - $<BUILD_INTERFACE:${Pythia8_INCLUDE_DIR}> - ) - -endif () - - - -############################################################################## -# check for CxRoot/CONEX: either use ThirdParty/cxroot or system-level installation - -message ("***** Configuring CxRoot/CONEX version") - -set (USE_CONEX_C8 "C8" CACHE STRING - "Selection of conex package. Can be \'C8\' or \'SYSTEM\'. Default: \'C8\'.") -set_property (CACHE USE_CONEX_C8 PROPERTY STRINGS ${ThirdPartyChoiceValues}) -if (NOT (${USE_CONEX_C8} IN_LIST ThirdPartyChoiceValues)) - message (SEND_ERROR "Illegal USE_CONEX_C8=\"${USE_CONEX_C8}\" can only be one of: ${ThirdPartyChoiceValues}") -endif (NOT (${USE_CONEX_C8} IN_LIST ThirdPartyChoiceValues)) -message (STATUS "USE_CONEX_C8='${USE_CONEX_C8}'") - -add_library (C8::ext::conex STATIC IMPORTED GLOBAL) -if ("x_${USE_CONEX_C8}" STREQUAL "x_SYSTEM") - - find_package (CONEX REQUIRED) - message (STATUS "Using system-level CONEX version at ${CONEX_INCLUDE_DIR}") - set (CONEX_FOUND 1 PARENT_SCOPE) - -else () - - message (STATUS "Building conex obtained via git and compiled") - message (STATUS "This will take a bit.....") - if (${CMAKE_VERSION} VERSION_LESS "3.16.0") - message (WARNING "You need cmake >= 3.16 to support proper external git submodules. Right now, it will be more inefficient than necessary.") - else (${CMAKE_VERSION} VERSION_LESS "3.16.0") - cmake_policy (SET CMP0097 NEW) # avoid cloning of git submodules - endif (${CMAKE_VERSION} VERSION_LESS "3.16.0") - ExternalProject_Add (cxroot - GIT_REPOSITORY https://gitlab.ikp.kit.edu/AirShowerPhysics/cxroot.git - GIT_SUBMODULES "" - GIT_TAG origin/master - GIT_SHALLOW 5 - GIT_PROGRESS 1 - SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/cxroot/source - INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/cxroot/source - CONFIGURE_COMMAND "" - BUILD_COMMAND make CX_NO_ROOT=1 CORSIKA_8=1 CORSIKA_DATA=${CORSIKA_DATA} all - INSTALL_COMMAND "" - BUILD_IN_SOURCE ON - EXCLUDE_FROM_ALL TRUE - ) - set (CONEX_FOUND 1 PARENT_SCOPE) - ExternalProject_Get_Property (cxroot INSTALL_DIR) - get_filename_component(INSTALL_DIR_ABS ${INSTALL_DIR} ABSOLUTE) - set (CONEX_PREFIX ${INSTALL_DIR_ABS}) - set (CONEX_INCLUDE_DIR ${CONEX_PREFIX}/src) - set (CONEX_INCLUDE_DIR ${CONEX_PREFIX}/src PARENT_SCOPE) - add_dependencies (C8::ext::conex cxroot) - - # create include directory at config time - file (MAKE_DIRECTORY ${CONEX_INCLUDE_DIR}) - -endif () - -set_target_properties ( - C8::ext::conex PROPERTIES - IMPORTED_LOCATION ${CONEX_PREFIX}/lib/${CMAKE_SYSTEM_NAME}/libCONEXsibyll.a - IMPORTED_NO_SONAME 1 - SKIP_BUILD_RPATH FALSE - IMPORTED_LINK_INTERFACE_LIBRARIES bz2 - INTERFACE_INCLUDE_DIRECTORIES - $<BUILD_INTERFACE:${CONEX_INCLUDE_DIR}> - ) - - -# libz needed for cnpy, used for SaveHistograms -find_package (ZLIB QUIET) - -if (ZLIB_FOUND) - message (STATUS "Found ZLIB. Build cnpy for SaveHistograms") - add_subdirectory (cnpy) -else (ZLIB_FOUND) - message (WARNING "Did not find ZLIB. Cannot build cnpy for SaveHistograms") -endif (ZLIB_FOUND) diff --git a/ThirdParty/ThirdParty.dox b/ThirdParty/ThirdParty.dox deleted file mode 100644 index a271a23fa..000000000 --- a/ThirdParty/ThirdParty.dox +++ /dev/null @@ -1,70 +0,0 @@ -/** -@page ThirdParty Third party software -@tableofcontents - -In the directory ThirdParty we provide simple dependencies. This -minimizes the need to install additional software for the user. Note -the individual copyrights and licences here! - - -@section PhysUnits - -The PhysUnits library is an external dependency included here just for -convenience: - -Original source code from: -https://github.com/martinmoene/PhysUnits-CT-Cpp11#references - -Licence: BSL-1.0 -(https://github.com/martinmoene/PhysUnits-CT-Cpp11/blob/master/LICENSE_1_0.txt) - -References: https://github.com/martinmoene/PhysUnits-CT-Cpp11#references - - -@section catch2 - -The catch2 unit testing library is from: -https://github.com/catchorg/Catch2 - -Licence: BSL-1.0 -(https://github.com/martinmoene/PhysUnits-CT-Cpp11/blob/master/LICENSE_1_0.txt) - -References: https://github.com/catchorg/Catch2 - -@section eigen3 - -eigen3 .... - -@section bitset2 - -see https://github.com/ClaasBontus/bitset2, this package was obtained -from a Boost Software License 1.0. - -@section Boost - -A subset of header-only Boost libraries. Boost is from: -https://www.boost.org - -License: BSL-1.0 -(https://www.boost.org/LICENSE_1_0.txt) - -The subset was generated with the bcp tool: -https://www.boost.org/doc/libs/1_73_0/tools/bcp/doc/html/index.html - -Instructions on how to update Boost with this tool: - -Download the latest tarball from www.boost.org. -Unpack source code somewhere, go to into the folder. -Run these commands: - - ./bootstrap && ./b2 tools/bcp - ./dist/bin/bcp histogram multiarray math ./dist - mv ./dist/boost <CORSIKA-path>/ThirdParty/boost - -@section Pythia8 - -There is a tar file provided with a default version of Pythia8. Some -files have been removed from this with respect to the original -distribution to save space. - -*/ diff --git a/ThirdParty/eigen-eigen-b3f3d4950030.tar.bz2 b/ThirdParty/eigen-eigen-b3f3d4950030.tar.bz2 deleted file mode 100644 index f7571b34f31468787f82a953029475b9896796a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1663467 zcmV)0K+eBHT4*^jL0KkKS@eX$c>~Bw|NsC0|NsC0|NsC0|NsC0|Np%}RRCq6B@!G2 z2(iEjC<tRR+Vh^-V4dFYI{SN`c-!vz?#}GzeblSHtTwRf=UX27zIdHAcefqf?|q%V zwa9n9=Y8wFv(6uT>c?-H8a1Kq+kM^P*VxyvNNMr7>%Q&pdGp=tedF&j>hSqJGv4l^ z=zVekdIN3WJ=MDpx4cih&$4ql)@-|@oi8?yw(<3}XSLu8dVH?H14DH7-156S+t4oh z^n1_;){Sn>2&e(<>hE!Y*GBg^7S6TgO6R+yT;F}iuTOpVz!%I1-rmVs&<}m?2hUAF zeH+>BxpW1s>+8LOZS>LKKAb*+g;#|7Hu-11`=SDXluDkN1q78qDuNKZ9dtxJ?&H?C zwz&g)??-P^r~nES0Ig_9A3y*y3IR$KIvNJG<m$d&=d<qs8lzf>0)UOR?8+dh0*17t zD(KIx00e}DP^lNNdgV$;1y+He>3lnZ5GWn7RC?vn&~!QpKq(~@08j)%1tmfOP@B8G z_33woBi5xgsbmcV37bBK8S~!ziT59PE%trD19!KubS=xf<8!-5ULS1N+MNV}Q1#r+ zwB6k=S{0|ZZ<)RKIsgYiC<oP3Kp#K`fJguU1qVQAy!-F3f%F8cZ4|q)(But$vQ!E> zKE3T;`)v470NdH8J7RfsW_|1(Km*X;$Jehw0BceQZ@BaWpp=CQ*k_YU<e(ma9VAdH zfFAp}NULB5*cv5$-)TW3DMjbsWI^qt>s{`9%zYcIkw7180muLa01X0w0o}f|9riiC z^j~J$=B=|y*R$K_-pu(P<ulgyx1*w=b<1vWJ?42Q-uT~JzW1krLnEJeo7LS*uc77V z&D{IW`!&q<)lz^|iuw&px7<4E1LC{3?WH*##(ev(zH+^9I0t*)>+U)C*6r24_r3SF z_j~3#zP;PqUYPseJ~{UL$7%0&``v2SaCg<=R_^xQ-1jNseYdMSJwSpNx8Hl+!*=bt zX*I{&s!`rMn$nlu-+J1Se8Bg8#^XAR?0WX~_jPu#``0?UYoq5G+jnodz4XS|lka;U zd|zkZbI*64Q?qSm+iPztJG+^_?pEDW_LkmPDCwp5J?E9}X1?z?zAAI)w>95<E%)2k z+Ru93d(ocvcJAG6Gr22y?t4=CzS!?iH@n_fx%YeI_jdHRJtwvI2XsEIz@-la0n+>3 z_L(!@<E?44eb1e@y!QJ&yP5LAFt;gmJr%LtU0-<W?Y{dBH+DCVA5TT^b$ht__X%$M zee8GJOW$}Fbo(0i@49=md%pR~9rf=Ad)H%Due1dv+TE)AUArf)*xBCqy<^nb*_fW~ z&wGbe?LhA9feTx)S>PT(4hKOyw>h=(Qs-TU(|yg_M%MeD+vm@bbta?g`@Z{E&#e31 z?T>abQ@ZP`o!75(dxLe2SZELc=D<68?_PsZy5f$s?YrLd-EW@fNTu$`fgA2Q?_;~z z?wZ!N!M^*w_k8!<dH_8iTBY@=RR{omC;$S02chWbt?YCK02Dd{ce?vBC^QWKbo39a z9v^+5HX3a0-J4tPM|E-AZdz$wmv<fafhqx5mA5GmeX`*i`*`)?_q%($XWiBJuJ?Ag zh0S`-^_s!J06ORv);qUOIyu&T<DSP#QJ{NIPIcc-dsRaSsz|nGfE%y@(cchO<+s>r z$Y?7!%coAq9ka`tHvm0*y&M3fip;<>D-S?3?|p80LECL_ruyy2UeoUPy?uAP-QHfk z$XH_8cIf#$Ly=n9_j@D&b;p6<ZPs16yE^W-*MNIq0d>x33TquWK9!Fy-Rs|PeI9@S z_r2!tJ*RWM>)w~P0NdPjR<3sqJI!`6)}GGo-Oi5hcUo7AYcLxbzU=#W>7MXCeBW{1 z+;yLM?8jZw74N?Hy5u09-$vbgvv=25%6)t9zW1Z;w(Rb8Zj_xiEe@HPTQa@9+8lNs ziU9Ed7qN=g+ZOj7DRK96rh00ZU;qp(qt|`yv*p_N-)>d*m8cEw9Ck5pyK%DG%1QJx zcUy?t)jfA@cQ)61%QkuJ;Zxat-%j=0yBbp)M%^{r1-=ib)#s$|o0vB4;h~{vk_Sp# zYD_fr4FEMj8a1}iGzQr~Gyo1NMLoH8)IC)?m2KD4(y7=0J7-a^k-#KfRkqZ&15E)C z`@!;1eH?%Q&>u(1=m04C0Q<eWxvt0154HiP&>s7J_qaP}*7zRhr+Urk``!<#4YFYM zr(N~+-z?qlu6gO-0lwP$?s~6guD7UFF3(NvuRC`g+Kqjiqu1LI2JG!#i{2Cf6a@eP z2DIqtIso*qUf$;AcVm>=y!&E#Y!AEdM$ZDyS$EFP*+qRi>n2$H(YP*Y2%36}8vq8@ zj>Edux83hw2Ys(y?#Dn-1G^o&Gj5SPECWW{M2FCI)&-^Yso4hl$0_RfC~)zjiEiL% z?QIIXX<hDTyx)AMp!xu0zQUY6x5t14^fzoaw%Z^9r`~&x+$A(XfFK9}fB--MfCLQ@ zqefFE1ZX`>rc9b-)W`q;003bk1VIQv0%Qcl(KI~@JcOGR@KQXdrqwj_N<Bu<njWC_ z00E!?00002MxscB0Tn%jn?&@JWO|t~O{wH%GG>~l3FA`;$RX-_6GPFVie$kCgFwwd z(@h&m=>#OCL=rRz(^G0`rl!%P)b%`5^-pSLJwwzoF#u>Z(9i*(15Fxe0000003k_D z0RVsmWY7UIG-_lTO{C2eN$H^!|3-$1v?iKU(=kxmdZSNB000Jopadxq1u%(%Xs3wv zG%5OOZ7H&zMB14eG}QFe@+sv%O;1ucsyC?{P-Fu^pay_600060)5y2+SNitCC4_%% z2!B<~KXd+jKeuw5|0nL}Y<vlSTz?tg{om(#+w*^Af8PJ$jaSUWGZi(Qqa1bruCrt$ z$qD^vshLAlRS{8o5mL&gi6&_QyuzvuLICs?Pu_*dlRdxG-}-;i{(`FS{ZTh&OQ%2T zn7MhV!&e!4c@Z{DI?RiB%ZHkY)6^GtdZ#masn)XNFZ{vBDhWkC@UIX^!3>YgW<&@B zae@H2or)@TDDahO0Kiny(Fr2RRXyQ7*K>4DM{!RbyXvbolQ`<M>rS!RHCmi{x}7|{ zjMZt}=3Yd^PKeACjOEA^ii&0!N@6KNb+BX*fdUN#2-2u45&%Sq6r~7_02GK63qrI6 zO*90Gl7LVO6d_4KpwObFAQX#2g2X6@(t=Pbg9<4qaKb1If=D1C0xCd2B&d=|BK$1O z21tkO2-XG)sfxl5>DO*9nLnjXt-}1#5o8Yze*u5JLS%?XLN#9sJyC0aWDHF=>VG`R z0-U`!{=1NJf6M=}f32rc&d>S%i>xvJO-n71+db32&&0j0>9?(OVz9UBu2uaRd|$u$ z5AX2abIc*<|9*3ax-uvmo(qs~yYKAPU>>J>?_NGe#t4%_Yr{ASQYtzf14mAVA@cV< z2Ss>P1s7ZW5lf+>8+E@Fr|sfQ^mRNapnv-CMH_BNKPv50=V@i=`QEMrP9*$xXbPf< zA}v%Qi8<8`bTYOYdmj4V6~!LVC^q)?GFeiLaunN(X<JR(mkx1ZX@w7G5%J|HnQLV< zuWKJ7k}(9y9&IE?sDHNwJf2vk(J`#n&a|I8#}M{RapxSA6t9!ECQ;!z?BZy;<gx$H zzXN>IagNTU|F(MK5A)xLamY?Njf0a-1vKVoA1@I<?1T->aYT^Mh9F}}3sX}KD@+<h z_mi5e1HQa<x{&o${qN|(4rMvy=u{L06kDjXw6Bi#Q-qT>t+I3&>=s=+vUE*rNQEU4 zO-nzutS#>Y`o7Fg0kZ$5PIcUNUg>gY5)vlUe=n8zYwB3a%^y#opZZ)WKAH?kB-9Nz zO9+};W2KG66Fip98sk3tk0jf@Mu$HhW|@~#wI9DfGuJH(TO)yR()Vdas1sli&^<yg z8DAdKW*ccQ%1;2c^rp6cx`MQ!_P%_?O)(UBA3d2UH?y%2QzezTx1Y$Ce^wRN%;H!! z^&5$649#*y6ru0br93w6sHpfXwnW592hJ;+eKCBfqS@TGa^`v7=+`jK4jV``(op4s z>4h$JIp=1|fXmZT6{)x1rp{nLyKx4eC)q}{mh-(HR_?`iuHfl^O^%@}`yhd|%`vs@ zF?9p~L@pXU`87P8RhzQ-|F62OM2+U9`fzM{tiGbcJ@emM&9qA{^Tr~@sueI!m`GpZ zjK*)`gZk4q@*$*-YyRYatN3AnyIW^nS?v52CQZ+#5m$fZcAx#oa#Ln7-ecP?kiQk! zl=a;u>GOu~o(iB%%H6o;<1n;V_=`tADq-qRx$NJ<?$gY-V{ca4jHi?e4pK}qP~Ycd zPIr>eF;No2j_>l_n3Bu=tU9osR7+*s?p@ybt7(4kj&rg$lo5zwjVKhp-Azfhz2B|U zv<;26J?dK$|CdlU2kqxm@^JS2YLb=1h=ryU1~fo=V_><EI=WEO^{a`Rk<6s9<!D!M zS=*20jWoC@j}KbrBrT?D8%vL}iCcm_nU-RdV-ix!^gQXCsN&lpX*poKk5^`X3YY=+ zFhMm`6!XdfdXuRs?baf0Af%|GC$@Y3o%iJrBl{j;qm$g=vdatJgT9|nvu`yr86RW1 ze;WQJBcOr!#8C-?&(kCLc=<B@lLZ&8xXY#gbARa1$Yb(9Mg9x5-a}qy__PTymTnrR zL@#IJ->3DeUA64Hal>9q+=ywWm+Fw*&>YhXiRJ%>_|e0>I}TnN|Em_FJWn^RaBc)L z9h8{}U%iF@dk$`jbC7tYClYCHJmUY<ri-#a4@M9Tf&tSF)02VPCN2zV2HGtdJ>wc8 zQj?TCO6$yB4_Xt~WBoBNb_`y=A?_b=!2ocwQ9#-NHd_t*$qg>MkU3g<yLua$k98!E zK5-r=q3|+iEt95I{tm;E($YGmH5PXjoOU&MGSIH+md??2@(m=Ue@@?8iBg%VOw^fv zRx6E~ol$a%+U}bd$NoOL9^P5*s%vNC-p67&AORj%&?5G$v&QYraE@-!2~9JhCi&3l zUXw;eo_ojaJm&D*ZMNg5FpuxF8@owCi;@?@`Ulae14`Bvlm~)kwsUEEY==yc36w+- z?qF5OZ|CBM+zsPNHZ)TP&3&K8j*N?pOvl^ebY5H6Seh<fR@FbZy@gL6RW|H($YzrZ z1!(Tx?>BGoE8`x{g?Jw_rp>vZ9m|$F%Vb5$H>z$$CdScNj1XR4NO>Qt)!~k%ym4fK z?_{KRLV%WF(v43SQkDSHPzyWK(YJzAbuAUW(<J4GPYZ5TwF0)vDPV4}yFB^5`pl;# zF+pZvhlhZNF7QN{Mv~ZCTES9U2jWFKlx~a9NmUUo=*oSY&H8ntdGaE1RHrC7!1PH{ zj*>et+Bm%9*Tc!fyKiB{9$uWNwQZ=YMrEkUKNcIljq9fSJBf3KAxV;kNfP}~bsFqE z{o9j*c48b}3Cg7!!ICJOp-wV^#3Uv`w5k{JHuP;PYrdI2<Cmb!gdokX5z=R&2H=74 zq!<@utD!7l7}EQv4Srm#NbjTPJHA@znc@SC2vek3>X}1IQyU~0(;2uSp80OKG4t#5 zZkS+x6D!LIPrsu*GpiQ2GE>uUs;eIiJ*C6hiWhC^nAmYYPgcvVr;<;6+@0fnzNwcj zs%h=4Ni*tFOldq*u335u<Oz;X=(qbzjCZz$R$r5x&7D29gOScySJ7yq)cB+)N}%=n z`O&#i{A)4`&>1wTIwB@hhcEli6K1&`|Cb3dmhzHK+H4+OHD?7B>^MrIWDye~5`cE; z5CvG0k96ZEDq?}O<&`866g}4zQT5CEeL5f4>cpL|cdgcFW~A>lpDvqEIh|59njDf) zKcNIdg~MIXLDtW+Ex+8pprH8Z`X($IY5n977GW8K<-?d-9zFigIlH;?Fqd9gg$GD7 zieZRDEJk_?1BER0gK_ZF&%y6VeVj~eDeR(tO+>>SMH&d20Fa|Zj^sU(n210)8JgL) zWas@WYXTd#T)98u{kzd-IGL-gWtRHnAV?)RcyK~Iqz*w@*?WSB>qB}Wm??z!c46Je zwCxFX@QoJsWcifOX|7jiYb_(WY}Z4W5gViLV?<AB%TJCDHqlf>)Mc7rHp2>h#SPY$ zhs0QWXcnCoEE2Q90Ao!|Ov@!U4~&Wa<V8kEfv(gOPv)fBNbSaVW$#O`qJ_%soU~C3 zjsaNYT~-}8$p#{Bgmm<Ix7N}yYMG8Y4**FsA2zgYHx$@IqvB_-?|ZJ7BRv~LZ$Z*d zijqs5X+38V2cL!xd@RI8{Xp^wVGxA@QXm&Vg5q0mH||SqM!xq+B(-d5)7#zIl(+a( zZ_u#hX`15<`nw%4G~Ep*LK9QO64p2Qq|>L6HTB7~%eW?Hp;i5er7P(krYGYbjt+yU zpL<nNF!AphV5o%s6($}#hLeW1pwL0Po^heM`R|VKsyEkzTpt)Kv4=-gQRl3M5=&5R zuf=S3Tqj(*{ky>ayV3V-_lf~iLm{Ri8}DOd5g`zt+>y}}0%i<qIzM|aLO1{JQk_zt zPj;f%fO6J683dYp!jhJ5@HHZas&O%q=-uV>5;{B0Ddbk7dAre@nqv?qg`%peBB+^Z z3Kab_p`wBWf`h6L-@2s_AOjE-1O+8ENYW5V#03VBs)m2*2GiCF{s?tcF)=|<0Z%17 z&?O}TzG)w_LXa{z5TV3-WFBEH;vAAG#X+VN`=LX|nrV$9#(?0{gYkU+@7w6^kKZ{p zU*g)zt&_(7wk|t!^YgzswKg{XjiL2V?)!b>hx`&=&Q3kNcwYnV|FhdKMy|{9r!UJ> zAD@T~F%8(5Nt^hHKgRA!Fm9JbaD??rhpHri+tU2z9dGTw1bbjR7DAK^JOmG@L_pGk zVf@<d2qDRzY~@xSX1(VRqkcQ%zu~H^2Z`?CgWUBP9y3dRy+crbizl?945nIEdH)dh zoHNefuToRTaly0eB_O;sDZlH%n=9&Bl9Yklcn@H-dP6MYXo@ulUrtN98H?l}1Nr?V zBxrk6(u^%U@DLKpP_R7$K9ixhCB{tRE5L#Q6|6wE_COfB>VJfQ{HpC#djt{e9EQGb zIZ^#2-frAo@!87>=D=v)(b#W`CIW!h#mktyCQhh+F8z(6+W)skbz#7uBr22lZ@v)J z52kP+iWs{1YldOV>ic|KS7-8FMSlt0ydlGg{nZImLm1z)7vF$i>SjL-g6H{64G!@+ zCCozkHSpwAkA4PGs<uhOf>SQwT{KWo;SHyS&U0B$34n=&L)_46<ZJE751dy;659!5 zXa<H=Mxe7;KF19ovug08>9o`6H@09tKAifv%qiZ6avwm+o%a&V$onzMiGe-_7>}yL zXy%^@)^#Y@X%5k{G7SV-()2O2>h{B~#o>vkKp{2LJ5Kg&&`d$9qeefDF!?w=1Ur|s zGe%8QG6$;^5gw;(?&G*)%R}aWhl&hzV!a#(MyCjM9C61p)v**`TAn*NoyPL>SDxVT z@Q5|tV<|G)rxVN|fMCjw9kZ)}xr;gWTx{YDE#|ty(mlNPFQQGd<+3AJdLI9Y+Q&xc z&Dr_aKCh3FQ|h7Mn{I3vnx_)=ZX=IGVb^_;-Dv#o&Qv;C`>?x}KO5_7p5sow{&)5o zwdyfXgQ$x-6*7uGbSh}F%Tm7xSuobTWiR%KA(qYvQl>>CLFc-tp%6>=f(9xYKWgfV zqQXTG?PDAwE@M>;W+sDy@1Wj<#_71l9Je74zd^mAgk6!HFE@C!pf<J1u<)rIAqhbQ zxsSZC9WllPZkZcI-rJ_c6A)EN3R4L->EBJ7A~mQ}JurL;e*OG>0gt5lj7?ufq>QRw zMu1RpjmZ3HX9vXl>e`Yp(0STK0x+x%BXA%k1DQB#3x?T^40^rp)+N{r4uw5+cG8v? z4u@&Ce^%V3b8KhAF5Gkv5Mcr-Y~f1VDAdy5+CuX9Pp%R+w-kY|cRaW#(*($IFl(EW z4oBotRZXNh(E7A9nI>Z8i0uKfHc9)u9{p@P7<!9Gz{lKAVi#oH514~&r3^Y?aX^5E zFB4wX9!>kV+Bk3Yl;pY_(A-;VT;0o%+0KSi&eEim-jNXhHKH5*RE>=xC{OBl<?`;4 zFN5&#^E2{@YprqY{CyoeE|tM|q?B^p+VnS*=9U{6H!ryyP<-6>z<ocCTQH{nIOXrW zmo?|VsMEu-kAO@d+IZ82_&4TXskz5(u!Z?_h>!DJhZYv{!w1utgj`Rmc=+d9h35M+ z9IM6$XJFih4w3uZGrnTtt<@+$b=%pf3tml|N3mf?VM9FFM$W4wpNd(@>OGiq(M$DF z#jEL#Wa+(H?Hh)J`!E{_^Yc4sb1_blF%h&^1cOA9Ow%vZ2F0S97@K2o(`Z!Gv_l6o z^Z2^lXUhD=)}9AyG=-tw<nXN2{4A8_WNgbf@QwAkezNk@2jy(5hLw-KUP&=tl+Xwj za99|rto@DaZ!l^4tCu~>6fQuLWSzwDbKe`F=IDaCDQu9D*l3_;H|^FMh|8)6NKChL zW3eEIVv#3F&ZvKN4N3+??nO{bgMh_GLImByEe?c`)Du+^EN`niTF^P>?DXrO3-@)x z2qH=Kc6<K;nTU>;HG^~;6edX-BT6n?XwZUdVA4tvGXpiUgZcKmACATQx#L-p7U-%C zFog4+7N)I&@y7m{-1%{OLK{HP`AZT`auE$38`f#gnNu;IHSY1*Mf>@UKuPQFdiV!_ z#n$xQ=IsrVR_k+={3;!@wrZ}*u8e@i4T;c`IldT3N3uJ4;6Vk%eL7PErXj$UHp~FT z#E;C;EeLGjq6A>Y0Q_i<z3?OnpI*67M|sumSSBQ<ARy6oDq3+maSD@WG+Ge1;&Bbn z+D+qV)RZ@azgwzoQlxQGC_Bq94xHz0g@_=$i{z9)1Y;CnQ|SCT(rgr_=0pDWFx^@5 z$3w<9Z?4Kp`|j#`ZKta*`c_)s1-wk9Al&z^Omn2EMzgdo-ueZKxN-_`mpp2@oJp5k zE*<!BpL*Di;RHm?$qF~N$NXo`{7U$LuDGreV+LtLhGPO4*r!lF!<OclHe-R}k|bE6 zwqf8zLaiLSPSTgz@^eLfhrq)fFr(w=60#P2zHnZxx=Dv##R4D_#G%=DBa)X=jfH28 z=@oIwCbW;!7oQroQoi1+rIW}&tHI)BT;)kZs+}F~q*4(O=C0`!Gx^=+e+c^3#7(T5 z#!b5^dOde@t~Z!pdwOuUnXU%Ue|S!|AKj9chKdic1BA3TNiGmN`n$Z6Zw0nb2n{Mf zs1pO=kjCUUOPa>NNHca2Wx61@eM1e*4C$D{JI5<>hABAOxZ||v4%CiXrOicj2SI^{ zj?+`KGXqAHh^4Lwau<Czrrq7Xi*F;x9kW)8yytwZl4B$@mt1ds_ZlELwI*MNkBEA= zYC12zFypbH(3Qkfw1Ld*ta0Ybt})Kaj_n|YaLb>$fwq#X{bYRpE?aou$m8;<J(zOy z=p<{hyluCT4a1yCN%^F*NJ3w)59O2_V7jB_vH}<AX@5b5Sd(qnAE8o1pjuwvdCl(g zCP|0r9NN*ijmTtye$`XB8i8=dUc2$*|5%Sn62Y;s{zh8buwiE!)SpojUd}`hcOG3X zOiC!TEL_(nHty$rrd{2)&3T6l2aUT-F)q1G)iCLuCU8PZ9up;MNY7S-KY?4*5;Aa% zK7Bpp-+|zptr(%bZzy*^;;uiYJcGPYc}jgGU~xE{lFx?o_WJ$XZM=<(8hWcFR+i<} zN=iafd<f@nA|nxOHpH|vHbZ|cK95ZF2l8%vJH+78ktu0u9?gYHV`OT!@r@;&|7}ak z22-^T6UWSU3om&e4*B5lftZN~j=U!YH#SNii7_!=Y^1UD$Il)eddCD(b2!Pqj*>QW z9Lc}0KNnvzJnC@3V89>`kj6i}=&?$)W<ddAU=Y+D#Z1Ezl4ng0R*k&yZVsHbd^~zJ z%aLWEH$&y`_`cC5BjPn|(D+6FM~f|uoG3bC6c?1>Q(aG+&%Vxqw9Zz!moNy6JkMM~ zl$x;(TkbDY{tlml#>ogm7!a8j`eTBkuCz4i9QlnkN7DvkCa%lhx#8XT=Zoew?n(<7 zh^C)c>n<cA3K}LE`L%87ifDQ*1jMxFvsP~W%sFMb3UJ0+8DYwTaxIuO58Q$iU~UKE zQ7mn5>-VmTv^4teN@Yv<ly|fRUYa=k;R0h1=a@-}pm75c5dGs7JNR}kJlKGWkvbBb zM@Z@?84Ls()c`~iQZK0T7xnf--1{OAdu^ll2e3tw8VSiV@Dqqd@s->NaUkOI13<n- zF;htTfY3Cj+6<H^SBVoRknZ!;FSqK?yLlg%J({kRSDzgu^umuWhiFk*?}-yTjJ@Qh zvbn1mR}|48e&KJFi?T6q29AV%t+e@B+wx7+&f{;dXOR%`okd7SosACc-<iJ_^EHb7 zP2$!3JR16(88z*zYLN$#k*1}K{a#7Pemh3|%vlIPt^$r`-_a%#i<QfH<Nf6g-&2e< z25_|LJYHJUq4n=^{_H>TlV~A=^k8A#7`|-5D0p<!W`F0uZu;%Kf$J#^VnG&n2&OR5 znEk%4yV&(t*LxvZ#{5wA-!>^MXfK8%_J7;-Q)$ypS&iGW&*gDXeC8(d*9zgW<lyCy zi*hym&{`VhE<Z<#4G*yhG9}ATKcDHYKc5@Oizh_?Q@5x=^ccD0Y1;X*=pDmJx#v_} zX#8t*27g7+IE%xWRt5>8zdM67Q3R83*x}x_bou<+6z-l-Fb2_tSDO*|HJ&8Q)MXls zfg(bRN&xbDanux^=>s^*=`UYQa5MxD%sQYyzi0^T+1_*(v7<GLISnNNB|Q_-<9uUv zaH2iV>205qBZIb)N?Eo{AVO~@<1gOinY|nSekarOZr20*nXlS@bMqtY2@~f&(Iy#x z-5=NgH}^m5Hb3S+weDugHeikfF&?fnl$W6;02wX5_isO6thsxayZQRQBLBzu|L1+Z z^mW!*<9%pI2hc*k=@I>CN`hnq&{6tCs`N_a6+}fXGZ9qG_kT&m`Q-mq%Z49W&z_S{ z(dFLg;IXAqsfF^&j!HuZ=~7MQz5d)r`hg({k`RKXnQ55{XeuJ6VW_^F{L4{<kG^gb zUtZT?sDzVbx2QGMM5S)&LQVUBTQI=&F`OQX{SeY*f30u)o=F(93<<#|b+cFf$eJ$m z-N(PDss59MuHWMK3K9N=y*4zzZ}%yjaO!3lH%PL-T)L#z?U&}09y&j<1w}>f)+9(1 z-5&g^%rHms%MPedx#a#ufO_fAo7QuTpQCcae^$6q%;z8dPyF<fj>Eh_$*|AW=%3a4 z^j>@d9sdB2v-$cmTv5l}Cj8xew7v{6`|IiO!`^ohvJ1)t4d&?iIBGvS#zrh;9!UxV zH}aTZHbbH9@^2*HzxeZ!t2#2@cc;+j^I*Yj&U75Tf&<K$!7_g|=E*Z53B6F~Yde&@ zeGD>g&(!0euwcAwPiTI<mF^dYIp$sE2=`3k*kH|M&DX9a%o~%FSpNNE_vOWWyl)$| z9udIYeH=SI9>bw-G}-*Ir}lVkZ;F|_4OJfryt=L2wm~%8BKym-t*>~(iwjX74Ua-) z*L)r6+yc?BZ<bWrscj<WvIb_`l<r&+oSw>ajIJ#zQscly#oFzU(R14FM;p1zO1f4I zFy+MG<TESn&i*=_X`dZ0H026=Fs&u-@-P(R{#$ADTkq>Pu(aC{fJhj#J0CXJwf#<A zS%w=Ue#+AGbJCltFmT5DZWj4n4gL(DmTz*+30ht;&Mj;9Uy9)&dA{g^=l3RoC5kgq z$}-n!l9QKCmt9*r9sc|A0wyRXL-zXM{hKhRC<@yh+4*IRP2goc(EeVD&$LqdyJE>T z+if){CbviaT|M5iTdu>xx6*y5kA8*yX=#ad_sZ*WnX?RWVCzi79cyA{NtlGp2NXB% z&!a8dI<?cMcM=K0rTe>PO6O#si$~SkOJf}fKXb-cWYC#4!ZDgBmekoOoaimRs!}LF z(&Kf?=r4yPfvSj4d#L1U9#{QwuM=9N86929sU*yjLM#qGle=d}4N2>ch2mHTrzR!0 zQvd6I^8GQd4qG@*oXhO4L+m%pgvU>3(ogK9aUUfY|5cDvQ8mA_j&Qhhy6V;0cjvA2 z^T%(8PXO^a0>8hXFUMm0AU6v_xh(}K%phSi49Ofa!#_sZZd$)J@lxTlKk7lNBZ7TI z--#O!cKpnGzEj~n@zZB><pdcgl#?KaQBzC$n8p&jBbPE<O+z3$hs>iNZ2vP4x#^V5 z)p**lR?0#|v9N|8y`OZz17{2u5QvCr4W+$&Pwng-&Cj&N;}vir?j43cNY6JWy5Bfs zr46=j9Me+)+-sfLYf;crG<l$0ARFM!+Q`_KCWOcg(*Vg2d$Szn?9cSqg-TUU9VFZO zZ43t5O`bMEW)Yo3Ys2A((XX58{Y<&3oQiU7Pb_jxYLniwr<U#%v_=PBUcTe-`M7%c z@cE*akp0TnKXmE2UxKG1^@b8v=$PgTRj*umufDlCd_v7l?RAL5EGgMjxr28>+j{u2 zP2}}^aPwDmKJP|*)VAu-R$VJ$v9>U5av<TK4tQ<jN^bP&#TqlNi}2$SB@qjROQ&em zLPIxONKLR%r8NIsi6GdAMTo5wln=otvH5_+CHUkX8*%!~+<Pa9W)o=+WAmN7EIPG} zN_pw|Cw^!+slbt;Y6__)2q1zQ2oci(x!jVWh?W8^ih+hq2+KZ_NulR;v9tE>Bw)dd zP><craOwV9AzMTu;gfVs(OPjJ==@gUB{bBDKhk<&5YZ1@lo)FUfb+<o96GX7<d-1^ zlSGNS10#lFyeRtM0MDZrXrVm%@W}+5v+Tn)m`&F*;xdA&qDq(Fo0O=QA|-+}Vubvb zqqp^W^~0rTN(!NA4U8~FB`MhsLG!_lP||s0D!IXxC6*LX5>BLf8<jtoiWneW-DI8G z@%3~=9)<7Y9uxW>@$~*Gmr?&WjOFg}%tAQ}zk@S3av0=+Bxw==(5d{yu?R$rLiDMF zMpt0KA>D_6osA-jivMf081g7?Rv+g0pPnc~H-YR=12~#uXq(&4%8b_rr@n_{G7IZJ zt=;j#uJX;_2Zeu?$P<WUrin`L$F8&9Vg1hUgs0TP6eB_2Lm?O=L_^S)B=8LNoN$3# zfp8_zK$gap=@C=)qND%<E8q$7C<npGh+>HXAcTb?R!^G*RaJbF2#$ds+J#Ow#GZLo zf1&=H0LWAB`tU&J5U4LE5q}>a!^7hrG(X$!{=bEbQk0)tJ@sq`VCX>GQ!_Iepax)j zU_f#hAOY}@T|k>i9w{F|DxC|Ypc6<anor&(1XB>GiRuBSl~fNIKtGmHL8ISTKFr)= z$N8JRn{$^p_}NH6u|uX1A@%FI4x#~5+uiHZ2%+cy(dXa4zuUl3Ucw!CVwoYS6$GRy zRHGyVvtZBBDjH``a_yUE{oVUA8hhL}A=Bm?RN0xl{<i_RqDe>D0C_+HcatIP!1{<g zbC&)6PPxD|2kJL->Qh7a{W(?XW@!=$1|*7wB;Ps{-}p1iUho{oj~sv4m*7G6-N`)! zbtLT%Vi#vPY~>T+hLHG3bLul%4-E=t%tsQLI}(3((QJb*Hz`ePGEG8l3LN1Mkmn3l zIFKPg^+37wVh4Pw<Cn~Yj<z<?WPe`wkN3m`Uzr3h0)JzKvvb4qyB_VXFW1@Z{nPgM zc_8CFJFzcbc!}>b3?X~{V{Y*q<70sqP&*%MU}LYa(0x(9N1Orn5rmz7YvJqQ8z^Q8 znUWG=CK=J=UJBo+<IkMsS<9}r^z`(Nh|TUlC$tFue{y5x`|j1uq5<d3o2@d3U#zgo zsL3aS5JB{@M7|dW_T);h7vP9Gs8qTW3c=uM!s*bl`F9L?^MM!0&N8e*gC_d_okyZf z%zX+=!n;Hjm&_*6#z6pp1_B=*Afn_V3R0?+C&3&5ln;lz+e!#S@W}KYXorMoEQ-X9 zuq9I@K56)f4e+3GA@`Co0B(|y=*ROIn1Sbkgb@)8M0U)}B86H&k7jzCN3wh`PP65| zJQ|qn{0-r{UM3`YZ1iyQUFw0eLp2(YG;~dbgpy9nXN;3f$vGCl(neZUjpxa0do*>u zXBpN75YnRlz4W_AWTP|_H^%-b>VopY5knOeK{tVoQ9S`qaATY3W+{xt9rf)k+N}LK zV9>b8d$~sp5(nevce**>1YHagkz-@A%!Cm$c@(Z9sHm!-@-@I|Hp5=K%ULi{5#?Y< z7s@tLAH(hsji(O__w=4TWIAFxxf!nH1Cj@j<9b!%5hxGE3b@Ft(iNaQv{)zCt>2p1 zo|!?%a+n$XVS+y-9VB<bm}BeG<V6sP^JXgTgybMlI^sn~5iq(e<N+ySS4tkF5aK{7 z6qp4XK?+0)7$hQCh`&rZC|>=I8i7#u$^vD|24KW|K2O8O!9Q8y)6UqUG3GE;3Rj>& zCgZ5v<9wdHF8#-$c5`1r+U@I*?1St>qF6C?!F(`ajD4dN_zbEh=^zo`F3KOwzeeXi z0$^lE<ka3)3Llz2E%5!hXk~UCI0q(TQkR`mWn*U3e#y7<{;40Y`OEc|Gn@=bwQG%y zXc?cQggMWBLdEWFtW(|nzi;b4yg#G+PKqDNbG_NH8f{sBnntW&Pj@~i1gOKiGY->N ziOG4mN7K<d4J321F`$*%J!CLN4o*RQ>fTUtaK&^=*Zjor%fmbT_zY!vv$OE?Z}xfV z`K6~XbofZRMCH8l?KNw+?AAVvU()yDy;)NpgvUCu`SxG7R!CeoZLi-uX7oAh0}RX; zhb_`O2-`i?G8zgndxXLEruimf>L0m}vABsQb4Ioh!^?oDrUm@qlK%H*50sy@JigDv z;QimbJw1@;&*RqyBBm#=%Q>?1nS84x-iuE!x1O@_Us>MGL(o4$|H#bilGyk6JEoXa z^bCo2pmdO#N97RAmnVpJpf*C&tZ<)ez`q7zJtyRtbRr)-EaxH5v$S?<8e;AZL<hho zO#$?yBm`B<njNsk$)T@Ml4_ulMcT<VSx4LXX7sQAs0S(1a_pzk&^8Rk2Z9D1o6UFY zKaCAFy^tEYM7H7q#A&HuNHL`OG;)p6W&C}WPu>`~7hIe!YF#UNPtJW*97jujfT6tG zCJl=@%!XgAXNJSwq#7i8*n{0I0Z)Tk5#UV<gNt!_4<z0Z;fnJ-V&>IVRaH=gl1V3L zF2vOz?OCLl&eivPnwb^xYB$o{Jh|uj?OPV2ue{Bn2KT|Ur0qLe8ORyf=k^8!rkf;( zSwP}|kM+alX-%97e!YHE=HA_x{q>t|A4s<|lrx`HLanrJHa4s_Z{K@R4k3dK4fCed z=$hI&WJ7hvSd(}We?cgd!<*lxO{uzY(#pI{I!prq&;1$T#c};zU#w|#vj!QK$~U7h z>7~A0Q6tV?Qs-^6y`p@9-U08x;Io+gH<g!2oX?{?w)SaVie=7FVa9T6A|YpyHt5F~ zpk^yMvuRDJXLoB_s}bKQZw`%av|LEarT-f2oy_cOe0e1TNl=l>xL?aEerq+abIa57 zdW0~2=Df#+#M3_-Asr#ZtC^^aGGmWq4Zy*=^mF-FAKm@XLd9ccjvdZvT)RG=>@aEc z(bSH-Mw5d5T^e`KuRxWHbBDin#xf<-Ez`Np>D}D#AdLtrMl?WlK@v#5URAI9UTt3% zsXxZlG+D*Rm)ndLAA{OQ!HqUapxHf{O~l@L6Yt%>0jlNx*sFeN*QB)fndPk|V=(N- zn~6_VQ!mX2J5`w<s52H_{%@!eLuQV3rrFzvho5#^HD<>iq0Bn+lF-S*WuK&tvUwx) zvCc<p+YaKcdWixb@_+f2JQF#+RVg3a4gHrmho3$0AR+g{tdl|wP_NmqmtLuR9gv6K z`$GW!T@Sa?eLMVvDQJmcdFT)hL{pHH0l@ux9UX2^c89M1Z4Nu+G7thP5f6@;5!yjV zRU#omgR&6Fdl`#gvLB6(IocY#$2<+E($tenXlQ#NkanK+$OZ9Y9149Q$T|tH&2K7~ z@QOg`2VU$q7}bv*Bj*K@6G};2bN}g<h=cTDF9|bpGj?FwnVV`jCcjr1seHC6eB#^~ zgXP+PwDcGR@b|D*F+e}uFDg(iF?nHSd;Q+McVlC~H&EBcaazofhUAU`qQ_RB4ek{z z)Lsw_dmR5)IE405PwGF)NrIG0ZvA&yFPt9XSd3xO+kJ`bdEGZwNL_nxx<<A8{A~E) zbi<~EA0dfbKr_i66wF{9QW<BSi9ojq7B}0Ujw*ROMvp^|u8~x!Eo2fyGD0q3_o%Dt zty!|<<E^8e;0Q<UA3!#<$(7~8MG1i$Pr(2tQ}jUflU=mY1NvMs(HO}DSaJGIl;TB3 z<1VN_Gb7|4pDW}&g6#YG=kBb11$cD&rzWDd*1eGv!==jt8<P%Lf{X~DF|<Pq5c#;_ znApLzS{kEA^OO8AzwTu=*nbcix9h{3&burnxilzSae^Bnp`m@yG4Y{suz9Xn9g^iY zxDX}+#fqNQAjjx!gfkt3Uf&JdYawSrhz!H}3xJf1^>!%M`9=!eS9z;2?4U|f@RWad z&%Bcyyq?XiZhKQ~;b|Ue^xatPxq!s*`-*a2Fq^rQb8D95XrVW6ulurmAJy(#KW^{o z=-c*g-?yGK5%6xeW^X3@wU?{kia(_OPK^#V>f-k~zO8=u^D7C7-|Li*70%-|0lvez zP=P`9T#R7E#>q)jN9baC#3)6a-eH#M{WUZl@(}^P0DTemV|E|WNC7|-*P;`Gg7IbD ze)%p-<AC6%kEf>Yhh=luv&F4mudnF-lvMQkzN6^)q(VWW1NlFXX7(JyItA7g9^Y54 z`aJl4Q+XOL?F-k-GN~mC%tA!{I@D?L#wAEdq*0(hngQp_Hs8#!VCul*Mq+?jQfy_r z)1$RFhkp!5P5SE}tVmwu6J{Fxa&64}TdQtfUNpU#uQGAJZr2Ew&*Y+uxnpdTkBLBA z2Ax?fM+u4jK3)mf<=H&xQVI)i1Je_k{MpQug*QDg<%e>YHbIU>IK57pQ9?XCoVm*# z=LchyIS69qgg(}*F+nrouG_CB+9_+$IV8?uL|2s>*Dd`SR6t7Gdmbdru_!t7`F(~l z@%XUJ8-DC={E#7O?2#1HtQf^Ga!k$MZgGH`0E9PWcdoQLZr<l>@{}C4extz~CUl!_ zj?LZ`Z14jZ9j_k7f3c!b>iK8kN5*|!-_4hGogDFU6MTPV_5HJ)VovUKzxp_soK2Va z?w@B<w_Z)sWKXWwvC>_tW)_9TCcO=ZfhFDiD={%_aFm69>3*r0S0ZXmuKt8La9k-! zVcoW^q&bq-IcZp#tCipPd7JnaPrkR>{yPKl!m|D+G%)2L-?o^0-Xe6yq||3&h&3DI zktqy`o)P2eryb#S&4H5ouYB%or9N+S?aY6V{S$r}7&+<m)wH={R(}s6UJ^LbwjEQM zH6Ug#68*nE6qs$LuoL#`-6!XfQ8B%p-8EI6&1B;8v$44sCM2XF%@Gb<A?-6W0o=?; ztr$sG%O8<as6_pGjKxqg(oY?C7{l+r?3q*5<g*4PI!Wq=L#a2hf?l51=5+QFF5F$D zj_^d-3F@8QA~q>ZW^@Woa%ER#w&j`cN+K0#guhcc;P|si3O{Uq3=f$AcDLh!^Zc8R zv<Ij&@wbwGR0ETX`KPUhNNMqRV@Da8wl>||ch5uhyfH(FE;5p{r0nVW+S0n4x~#{H zs3p~m(Oo7*EKHHU2q%pHvgYW<K;Mm1B=~amJ>4z$9xCk>8I$zXnToX&keWAu;RH|4 zq=fEoI^49S43i4_+QoQ&z{u#GZ?k6u?-k}O^P}q&F<>g)%*P;bFWmUwjNq0dkgzqi zO4Va?2{w|)0}o8<rA~<91Kl_m_(B@x!OMgK1R~V_`a1-+UmZRaB!hMA4vIg#k`08A zzQU@SRF6>kEYmil4QWT+5HWZ6{4cHe?v|3S2z|<p15`~gYzt=t@v~nZ5xy~pv89L` z3sBce*I)GdMYV%H&)XgL85gTe=8m=yYAh*LUFONbSEw3`VzO?Y%sGZ1Os=%&lk<Fa zNQQ_s)FFpy{P*l=!_|>n-m9>)?l(jr@~TFs3^PG1<7R__WsQ5I_f<A66VxK6mtt0; zi&^22!sLYP=_HYh<)Xa0QI*CzUU<BkEeMu!ix)y89BDdmrZ|mt2}$3A#dRyuRMZm) zO*h2aZYjE@#1&A_bAerg(14nmP9Y7rgB*D4rd|(oD`H?N7`c6I)48(nlU<%S!f2VZ zj|)(^P9pF?>f|^%OWs`0gVpSU2#o*sCJ~)Toy`GHwD^2}SXpEHEoj%H9+Yfd1Ly}; zNy{Q#OR%Wvrlq@oPh5$Of*UGyt9QL{@qDhiX_EBDfJ31=OoMTgmYLQ*r+bN56gDu} zjO<nfkbt!ebS?u4gx8$I(dN4Qrh|`3-ISX=tR5$0lh0n=>Nt(Y0Vya!AsfdAft4y{ zr>2N$CdH9SpQwmW@FQ81c*}dF7&LOyp!;J!=!+i`0ilhcHbD|Wug~Ch;kf%w2W}-I z_U<rJgegPK5695^ws&bLs1dRHzB{F@jtUvbluV(r8VQUf0w5m9JNSn$f~4wPO$QL} zzd`+P?*3e(Qpd28WpTc3=M8|OWLv@<lc$*oL82bfHkw5?22N<qrIXj{@1gQ-Z(h$V zOO17ddT($jeK;BA#slCOLVf(B=`_t&J+x8=T**v(D6_W%C>U2U({CJ;3bS)y;Y#ul zTjPSwWiPvC`5^Z8f{$tDbHtY9H}w0x-(Y!m|5g*^5}7%d$pMU;iHYB7=IKepzZgD` zTg3`P*eG5KVT{e7t*dvAKk|{r2ObA!aornF=rsGkS^cfVUDf-HzSe)(&HRjA^1q;| zn^3ENk1yVSX8h@;{a8@ioc+S1e~QMf<?;=~(+|bm*x5HoZ6goTN9)O0^xkxl9o;@v zlTFzq-@o}>{$l;GT#xF<(dWw;rhvV+zUB)bJp&f>Wkzr1$L=9~KI%=TnM+p0GED7{ z7>%>|u@n<viXVA#KJTX-ki>zl^f`Qon}azHaXEC(IRcQpyLqF?QXid&sR{`i|19Jh z{QV8f35jLNyrFQd!XQXWr<g^s1-2(djkN2|KXlMhG)~ZDlxEi4=3)rVv}~?0OC46W zz3+pOsJHQ_4mV-Eq+H6<PBEO^k_DzXl}&1B4*G(5jF{KD|08bD!W!--vpDB6IN$1T za7Yh>2E)QIYV`1j6euuE!q~w-04M{(cKM+EsK7FY0HDnI^8(MUr};jh;ZdPaZY}`o z7T9Ps2ghGQNW~F;5K)T6`LiLqUk|M99%k-*KX3W|ILr1KkwivD7@9NR@pkk+N$uvl zk4Sg_pW-%&=<5eda!FDP;U_)4S#{h4RhZ6gffzPNZVwE|!nk384RbMt)MXrt$`oXD zG<Fl|@0tf6XSG)JYuOCL2id-l(c<4@cX`|D>Y>13;CxuJ%r$ndnCDO1Q=RR^{(M3n z$EY?0zNXtIlNX-z>JtPBznIGX;m@KE4_~#hd2;PKt@J)Fc+IZnJjlZ1(;cRcG>D1G zi4qCBh|XW%*4l;tKYg~@jMh-)14n|MtCC8z`yITR4G>PSal-2y4i8QqO~R>hJg9Xq zm3Zp-P&&gJLsmwQM$tCJFnRqaITtit^g9tP#hYZAi7`TuJ%YCNG|lKMDmA3rb~o(L zLWaXuwk~llq{9z3ty*Lz>W^Pz`;`-7-lc2jv7u&q*B5c8qaRpg<n~#}9Zx@=Q0R~$ z(2&b<)$745Q*enqD3VgRl((keH?&WD_7BdU*QW;025S1gjcSNLciag;Ax}qdvtF+8 zhBF(gM?$h2f^l-!I1$2-M2bRFoS|EmM17O){nY&g(vdaPJpS{X{W7(|t&l+I*Xe~r z8y5{Fc)tK^_DX~_(>HkIuAP)s?$lGOwFg(hO1)FccM3%&=p*v{n7sViZ*!-*ZTU4= z+3O)UxY*J@^RuMg?r$f9J)q&`{XQIId47pbl<7ZzTJG1=@Sa<`-#u<2g8-jXI!@2( zVG?fTykhjzY0?H7Ka=y9_i$faCFD9~lz#?2Wi_wl^K?}!*-{q6tN!I2>}4SOfYSSy z?Ct>B{HzTmmJR98Jl`WB$4;UiC?O>d;E{1c69ma<%YX)w7!#z#cYiB4`b7ec!)+PZ z@Db5Pm*7U+eBj2OV2KZdjGl`I6jDU9u}%E5+6hbawfB+;Sv>`SX*e2w?^&=5&QwVt znJAN<bQnPI_B*(0bRgS?q!=~~92oXv)tva%+&z&ZEeRXMQKo#pRVlDBLWH2#_j4s^ z){{*13>YxCJ8DC`6-g-^+lzFFxy!-oINE(^?mN&wLLHZD9Xqf!+3)hVeuHVbfZ21f zIDjHT9t3ILosRBKWR8m87^}eoxxhd0Hx-#CXLfOq4!IvO6kpNg=wN%zlVpJRGKP+7 zJVS=hJShamLn4s97#vvQRMa%K?jXZSY&Uk+wG`p<&e8#nTe+C3s;lvRA5V~cU3g2| zxT>q;<fVgQOm$UO%Wbm8s;aA)RSjN&4(`6Ln?D~M;#>8a%)tMjIVp7@rU^+X0F)Sn zie(SYx?TbySQhF2a?t341?$IL%*?_jK0Nz2Y09f>TQTcA1Jl<vTUFq=FRO{2nA%xA zujE|q(09I{rhENEvFrCnK9gj_#;U7o+N!Op+i7jIDz@fkDzEV3h7jH81c@mMY2bHC zI=>jbH@3Bfpdua1fpalmFi$MU<o4#$^<KtidgZy9?#q>miAb4dvoj*>`a{|Az1i!R zhiTqu*DhvdV!u@RUVmkm(tQ7S#x(Ea;;Oc*Z7Gkihqs7xSpytZUz|XiNKl0@xdbC2 ze9n+L*3|8-u@aI%VnxI8xfl!>#3T1_du~5;N%{p*D*d|)p({sh@KAv8W{L`!GB*@g z7WxJcu=xrE>+^RVzaqi=MyGGE-nIKZ`|fV6Ul!PAWFB;za4_3<4qhQ6(|=hW)<?jc z_xmO!T|Mg2BJ}7OZw^Mhx~R-BU4`70#rWRUoU7IH?kk^1QGhk+lwUDs!sgrk^4x@k zu6K9V>R~<hC_A627oGX}vu7w!NETPh_cLXeFouDiPBS$ncfas|y?Kwn2w^v7hhWmb zyY=QtzZ87!KDgh@<-hB_@w-E$>fU2wN*ZLo;pi|opt^0Jtu^(m+Vjv@3?s@2HnJ!% zS$21J8$8`G$6uhihGN$#VBSy@zvuQf-;b}OhZ~!bpR-mb*4MZ0AD4fF7vtJ#o-8LF z?hxbv?&&zm$Drnjg^F`A-0xImN8TR%5q(FEiUY7;91rUx{vYVY{}$MD=k45C_4uq` z4ip9@jJI!gj{gIn!JmJ@d>j<?MFllU)o<Y8!f#J6@P6Jup*nx)K<YXq;qFr@KjZpm zQjR(u2%T*+n>W>#M&Emo$seT>P?9F@K@S3C`yx^({!VP&i^1j)qnw7g`VXQ$tUTVI zDXvoS!`{F*f$q~E*nO<d-#$3zjo2~K`6H4%d)tQX!GA^sy)GQ)I7!6v#Fmq=S;YTO z!`b;`sRcjN082o$zuD8<j=^lz-6$d0g^7X$ei+l+-<j_H<4L?%!H>)N8QVb7OY9^g zCMSoM7%xo`lX==kd`>BlT=cPZ%R!anMg3^`syO?<UPoqT=IHwncE|)ihZ5R8S<R{z zl(8$%#|I8xvPHC_BmJ7B*vTROqx6e?8?~e+(XN@NBVdUsybO^LLxN5_j<g8kXQgVZ zUeKcn#XZ^+7xvv~ytV+C80*pg4VwazqXmlq0|IQs$^qdBR$Tx}%q@+!#ZDazS3+zE z9F`JgFlq;xM1c}U4-X)_IY)SD9%OMMW9`GIPB<=skC7iU@x@I;xA>UsPM>4|c(K63 zz*7pqf<XC|z+HQW{nY}%LGoJD-=A+QpX~X0_V4BSbMDMyWQc{QMako>6w`UbA7#LM z*A>3I**A2j)Vg#Q=D_K`%aWMvx?V=s<UyGzFT(F@YXf(tFLyY5T7%6A=P<*R&L!9f z%PU)MW=w^CERIdal$80{nq7r!>NNIYU6mMi+Q1w6UH*-+Gsbv#{l8-0@!QMP(XHU! zAR&WtU^UcnxEvRpsp%J0IDamkHZIwQj0qOuEO%2cN0-taZL?Hw6_!wvN&(346!4<p z>`Go$(e#?M<|X;Qo{;^aup83a`~1`f-r6G;*1Ja?ZRfy|!n3VY_d^n6dn({1^Eb`< zn}d>|gngO6qr=1KJgD<_Yv~lY*AFASZpcSh%AFUnZv@QVyMyy~x0Vt^yBm(SXFvr( zhZ&i!Kuvy+OOiYe@;`R7B)b}LU^(KM<~Y~!dkY~<MZTF3b|1?k1~#S}(3otH2I&mC z|2BA>FS0#cH)sl)m?(+}Dxs#6)=><;qS%5+?8H##oMBWk8;~%Fl<9_s_j>)NcYklQ ztFU%@HeX+G3!3O;CXmwR?&Q%--`Am@8?rWx4N(jx1R;x(3`4M3o52LwGh$Juqln{q zQ~JZHwwn9BzVW&<p6-K$jQqKWn-7H;W)8}IriuDl_ur^(YGhH`n(2>2e&=j)rRUdm z1`YQdQXm>z9BVgp=<Yc0;e!?mwvD5K)u)<&tA}LF%@>XQD(xhuaKX8Tg5Y382=H+` ztG%2~YNsZe-k5?^C9C^~riv;3-o$Tr@3|R?Lfwb*dV(!{eaLJY7$dLdCL5WT1fS_s z6szg?)w_Ug+cOL`SLe((LT5hddPiV9p*fy!KvsN%kw=ePUj4!VuX(`<eQwmKmXGa_ z@E!uC;uy1tHwWeU$^mI4X{OQpw!ObRB7~XwRG<n1W~i8PGDOzI^l;2G4UOH^JEcvS zKF&ist6DY!@k&xWp`k*AKzashf~5Apav7%0ke#kF+sZy)x0Y;odhl!naN9oW7`Nj{ zS&t?}X2URAMzeGYxg2J)Spj1Ew(>roocx1f{C@AwGWOTpz3uM?fy0o-<D+k@uZ&aB z|D8{^<aM-zn7U4ntFz5|+^WIdA!`RpGtfh{&eUev=h{>Xn>{{aOk+<?bmNx-L%T9f z0v+2$FV&?ACCRFP_Ds9d;|9yvH+0Csx3tr&{?ZF`-Z&v46_dZM;SeyzhZ&9{A`?n4 zVKfXs!y*u9+*_Mfq-%Koe~07v>wc?)lQMn=LCIn9oW-!F;4z;rL8J@KS3Jf3n&I_1 z{z4DvWYfKg@e^WXIv@2+hNxDJ1byOdv~8iVaQ8zm=_oXBZ!fUy7qC8{m!@ZV=k<9H zH-=}6-(KdK;%HzB8vkG;5SayiR5Ncv2wK<ktbS}pC8X3P=g!ZU^#6$LyGYtLK$~yc zcQmLvl_1-IcwwtU->;&BHV=k=Lt`+_NPJi7r`*@a=bV2*=k)>VJcD`z%Lk<L5*ve2 zotb&P9)G6HV$^2cy?J+Z!~ezQU!#vCc%W^lNMmr<tTbN&DWH{$#bBC2510-<?}*L! z=j8A$nHE?lP{92V_7AN4PacvK4^su|HDQKK-gnaxxXqr2-%mHGv^^PrCEwJW+14CA zlEVWr5}5)azekeQs6&jgS!SK4@Pd;n9DZT=SLw?g!iL(!zWr@opFuuvuw#L{@>~ti zM(t3tb}|`tT<x1J?X~2#rsID~DSWe&({}c(+ci6*_wJvgk=RtxPNFBFj|)ky8Vqm= zNJ6m-d`#>dc1+1nYGd$B0`C1gx8&V5`HrLs3>;a81T(MDm?g0#`!zf+Ja%LK$FtM$ zxcl4T?kDc}<aYI){X9E3w9Uzr|3_UmGapqvDjkoK>zdz<OrJj`UDVQHo%@i}Y=i(z zOgEd==Pu2}%im}y;a(auV1RKX4WRBaF{K^Xv%mN^EEy)J!eg;*xnUwIBlT0=(|vEA z#O;dJkhyeE)O4E-<#sa#*T^MiZb!R1*^MJf6{#zAbjX%8X4rrT$uP`Fr3v9UNXStB zzqdydwB~E=pAI|CzTESB8neLx<;EM4KM_2ULy{oY2j-%M$Hl7rA6I^z#vJ|;vkv5$ zPyG;jPhULi<|j0{LE>qIiCHBvLOJZa!}t0d*mU%MqsrYUt-UQ}=WPbbz7BaH`DT2W zdd!hhDhkD6=I}oZJ^A)L{Z0qD0^_4r^GC}4oEv8&xa$$x7>Tn?VddzOlRNX2`z8YZ zE*ImS!Qn`F4^zGulX1&ky8^QnTm0S5coRH4{@Js6_t7KEW+pQ>0ArqRKm=MlVcHe* zg#+e+GE$JN%%;Lb1=1lel#mM?96(%<pZU+DZA<aa>+qWWNScRIc6s`>W=Xa_tplPb z>#jjMkMzc$k*o1{9mlpsgpP|bCQQ;`L4UfOENQcE9OC&!^W04pd34|G=3*qw*)R!* zJ4ZX3gPZ6zpx|4sQfy@9C5#znm3Nw;WWzPKrNWiEy(x7SjvQEK2Zc9?oEEzZvjW=n z4AG@LBlko>vLe9Yu-0ngblqO7?U?p;X!!YY&)*sn=vVhZ1tN%{#xp;cy<z%y#?qv$ zV<14(A#58Sy>@-oiD*a;+-(Oi(Zls7?`|t*H<U_(HZvd#6_Y!e5W_+Q1|<7;l{ycD zPdkCTQ&FiW4{#xecr-LLKHtFjZ^x6b>~{K}Cl2J9a52vm_w@AW+%?veX2%X&_lFKw zus4(qrq(4UXg(m|=S=rdLS&d;V5Cw2hm&yWsW4{WF_7_D%W2u%lPl(j-6^O9r4OL# z^z-(MIkU_2{Xb7nv7#E+pRl>1zBpipf*vMcjH<{dgGJCuzGk?aA-^iY@*KpN9#$Ce zUsH|=VAlRjrXzY?n+RSK7bCG9GGV9bsM#yqIl%7W@ObW<PLKKG7B<A#nGU~1QLBc0 z;5tl})$4r8Dyx&{VElz1b&Ut<r0rwNu^cnH`P+;lr0S>hh-y-xkCSyPwt3Snt= zzl(-o^r94a_qf0vur44z#^U1-S1g1N3M4mhaC%74&o^|<?%~9SlINWa=-HA|mcWRz zwDcHnPo<0@7D?K%Q}q1&=EW6mcD*%?qX*z1ZabEsBm5?V!Se&=V#x`eeO9<cCh06R zAn2TdTYMaE-F;>;b(!+Ia}lCq+U$><_l0#EAY$J^<2gNj|2+A(tjJCt!`R=`$ScWZ z^d@d?=S3zqD3~CBHt8In3kW0hVT8mm@8^2`1GL_6=R0Ar)KaT~;VNU)kC1$F7%yQ3 z_jTqLkhZFomr<NRaFp4hnfvvrLr3l`XS+NxX~SFd8{VG0`Ii{&z?DW{WAX0rZ<)R> z-V)W^QewX%(=!Q@`TVmFRiK%n_z`<W^fsRk?-n&e;^6^8r*si6$u(jKn2?m7d8kZx z2X;oz(Xk2z&N5;9$ZUK4Rc`czu)ywN?;e>40q;=1SJ|w*%r<IVH-a98VyT(fCdc?G z!jo)O@cp(IY4en%_(XACH}Z)kP-Y4JRdej)o)}J-jd{xl;U{F1B&0oJ6f~F7aI%QT zGDx;0u%*_@r{hB5mq9jnM+A?cksniA_w=LQphKof3&F^Q{$TkUTv~!iVHULiBIcNK zR|&g?*oW5!sL~mS4-bde{U4hC7srF;KM~S5Amk|xGq9Ni1c5-Amv3KPrV{}@BeORj zwY3kuA=Q#D!?{^L{{@+_>4%_{&db7WFruXK@4nZT>y;TMucnzx2f8aezc0NjG-&!Z zgKNtX?0fbfE!Bsmd>DMbcpc+SrnolEu<<B{h;PnZFK!?|SDZrwK#)s9{rDVr*MC(3 z0{B$XA?8p*Y%$2r7r9p2b)_(rTo4`we!b_jS!HkY`V2dToqyIj%yM4^5}2ha7bM74 zmFp5Ypzr4AJe<j2yAjB2=`L>@QO3ET{nTb=Hy{If$&K(E697#I)+YVOnCG`|bGv_# zl=sO>!w0-Na($PV)^qdo>Z}CmB$QaM`77hj*I!j8e4nI!WcZVh>+*f={2cuqzs=e| z3hL6MU)*TE?fb0Q{4W1DJ=l1hTd9OMhzLnA%#bn?24Rm<VCrNHdb5RYqj7-py0O2t z?>wkXY<B`j`4QxVAx-{!lrldvgw8NnRZG2%i*3fY1=8L=@PocFAS5B@QlMfQC8#*q zD2XJJU?7laN{ZG9CrE?Rt|S9W4FmC?Q1a4<cA&B+oa^fHCzI&xGAQxNzutYB*wDnZ zAovN5nY2Vj4NSpJN>V5VsJQ>7g4m1Byzazcqq7b+P_RY_Y8hZ=F8thKxbV@O^2rOp zhk$49a(9=skro>VvDlfIVKETGKZBrbg#<*)@Kz7jhyAY1A6f`8N!iw@9I=?!c7K=U zzPGa@pZ3GoUrR{P(>`>bk9MB2R(v?r#RCcnh&x<y&Gn{l>sigmUH*z=PZxpX2dwN? zky+SO+@8{TNWP{RId2&d8v%>398IxuCEkfjomvFNT55{6kw^>a3k<1D?<qBkHCF~U z#_2;;dBFs}#l&;i-FLq0^+$ugIFw^rEe|nAL|0wRG363zv8ZUr;AiLIUo>^a^I7AX z*?^Ev6{0Uu^4_H5j@;4Wai<O;xEw`f1;p|~X?te1hn&UMi!~7V(>YAKzE+?zo=p-J zGv*c1brihcRmIPk>Z6md4u2=-lJ(Udc+oFYH*NUwhG_BOAp{F-mO;#B$6OE;!^Cv@ z@^$f|)4r!QbGOL+PjnuvIq!+h{|Cf#ccvAWn>}EvYKY3ubqNr`u@M8A6qO*tvQJgx zGn?LV*PbPC$RwU9?Cz(BI^yS!wNsTkIq$hgGa7i(L~(K*)LoCGk8U)Lchp1Subbu7 z?yJ4VjmG1{H>(83`QmldocSG|H{hRtF$j0IWb!?D^EWe>Ca^llR`=lGzZySe^}d%q z9%}jR8r6aGXKLV{JWAn2M8aDe@Vb(k^s~8$@s-DQgZ$7j+vCcgmQwNef({P|l12I2 zN?A4ef)~)k_u(Xwl@QfcRSyfgrs!c<gJjxepYOW(GN^4=F0xU(ZwKh8!u1Z0TYGOb zFs~%IA2dm=w(7K&((QO57f~E?e9<eExm%=}lof#aL~uSdA6iG}%*|o#M|B9z!SrI0 zQ#p6Y-)WUPWsquL*D9Cgb|cM2-<nrMwmhsNa&ad9t?)x=G802^97f4%hfgUPTs5(M ze=hl6Y$>}b;_NCk`dNs^SUHB!m5E`8BZgI-ClQx+*p>Je6?0QQ@#c=cIN|M9ow_vN z!K%XN{eP?Oy4vT&(b><$*>U+GcjXBO9zLC9+-(}@H0wv-_Y=b3A<XK|3kV%2=rj7T zaS%I?JgWI)jvVo|tah2nvXjHz%l6>s+14D)C|eODRAkiKAACumolj}C&gb)Ejran~ z0V1YX7-W^8t}tiQs=Q9^mHosv61Ksx38kucf(1dGOd_u8jzx_o#~yXfG2{*ydXd~W zZRpiiRaV@Nr>_n%HLg9u#+ei2W5<*c<)G#jMREA!LXP?Wl9S7q*CLtkiOI6E5q#@+ zmEW&!eB#&1@Fyq>uq#_kl2<yY&SF;XYp9%ny<yeBIt%WQ*fw`lwOp_fZBq`MTI`Ij z>JlIAGsSSy*16}Mc<XKV&pln&HwF}TYpFP<PIdCTVRk<GK5^FjIo6B%@p3gBh=dp* zkGA;yzsT7)NhJSjBg)k}56&Jy<x?l(tNEWv;6%P+lb;$(Df9b}HG<tkceOw>_0l>Y zEPlhc%~tL1skV-K${qN8IC-nsAXBYedmx#ovNKuMfn+oJXTg(jVKF1}PYyo{o@o~X zC$UXT^lLr4Y+he{*GU)@77sdtTJiPs&sXxAan96P`+P$1D~PM}#T;h(i`c&jNwi@m zSpGk&8sCOC%kyoVv|&9TgC1=uvaYFu*^+)Cy1UC|Nn9PS_(<hP$#u?GS=ZP39u}u6 zM$TEl(uCoFRVe>6j$3Y9@9V#6oVF-4z0yEj<_a=Zw&=N1s1e!nluJ+9S(CsaKIwP} zV`wR5e<P{SA{n@2YQ2s`n=d0uA;aMKcS3nJr_iaT>Xog}E!CTL^{+lS?u}@vHQzJ0 zXFG@YIzHaDT`g#On0xYM<ZqaVy}9h{sh&CR@{Pljqlk;q%~V03l}X97(}adDYxic> z$7A8LS&+^rSk{8P<8fXx;$3P<$AHR9e5@D99I~ZW%X4_lqPBOD(x}q=D<X&1fc~$e ze9~hAv_R0`s$1CsYx^8bV(?V@WemIGQfxQviin$>2;m&z@)yb{2CHO%b0`kkBNxp& zVzwC2U%YeU>~Gn5p7)~}&^e%zy&(&i?r3ACWyfTp6})_8&H@>4+U(vkdesq}pFYl= zx*^7q_NMx{y0LN^2&t`T$49>0&`E^CsJZcXy=Fx5de%^zqlMIyeJFF7`idsX$*z~S z`=WKfcd;o`li!DQhl5Nv4UVCo%S=w(Dl}8t#wT59R<eU53Q|*9yQ;+Shm6WqG;w$n znMNh8AEKqMx{K2tIcbIn6A^cxEFBV_HcXpejAFIeTBwZi!c(+f_d$f{xJmRRy0e12 zD*ui6<8{7Ml>FW#i`ISjBbG$y+Q-55#nsII9mXb|vxv;&neI3B>Q#=L!gco;uITbL z39x3nK16Zd;^Uf=A1~<Q<DVt2obO$WRiv&vyr*`}meBqYpE8u!2^j8+NO%aN%ycP+ zB!k;!{EF1aKM_v2w#CWi=N}#TAJ?vCg$xPSj@Cv^RUB<ztmcdE@nzByv|_i)vFx11 zJt>TpP?4D1DM^!8fh0N;mK^c_7yi%R_x@Z@PvPQze%{ZnM^K3HV?nNOaBL9inXwzX zo*gng-{7yd-lFUeP>c2N?vw5Bj^FKZ#X#Q9+8%a=E5T4fxyc3zq^091<(>>z!Sg(k zz05^;KarEN5(5_sE8+`=K!(R|4B{?z=PVUN9;WLCO}S($F4#*+)0n6sR8+F<O(y)^ zP^wsV=X<iZ1?m*cmQ*&{lEzfahUHmM6Bi9iXsCi1Tig&jz{x>L4n;V~chblq4xA(@ zsP(*83zOc0vVHnL$iTlgYut8cZ^PGU{XZ9Mv%W8_^NlC6bNo0=`Ii;Gt}e~(1;~@T zyY!o?l1W-s&G1%U<sW@1VK6+--QjeB4IsT9XQ}0Pl~1vct)Y$Ts{~bXO|%!E`QA11 zFq=Xli3dAIy+6@mzjNLf*l7MMr9lA#N?Kp8Yp8FmurQ>y;mDt<w%WzE)ailI6YaGX zVyJ8nPK#iL`x(i{t{Sfm1b%&+D}Q8;{(C*;C*`=hm7^Y8N+{j+!1eSRc9&sM&aRHg zrcL-pi%qXb*BMV1eNhdj7I{leeWXM?fs$ql;?cQDl55Yc!r1(`lXfSP2b3J~F|Z5{ zbNVFOd*_ea_2I(Q-@j7i+Z|6Kw8WVSg@T%f(N}xhgY-$9!cQ)_^E_DL<V$u!3mF3l zX0w?wt{PG{!b7mnA=t9Q@RT|JAfSTpqu5uk0?6By@=fS5hNl5=Sz3%<%pn326Vyyh zNXKbilK60XnbJ)C9d5+v&U!)_q6f|+rs>DHcYf7Kz<iz1pWd5Hr!zzXK`EL<$s!-* z@~O;SOiU8>N7+=o{G`tpr!_LZzG4zJDw?ER_#A8So-a6c`=f%af+i=4KDS(%lb1i2 zaY^KJKP^YTjmjESGCGU*VCuez4At+{I;F=^8WhFo6=K36EfyHdj)aW_t9_ok9x=(L z`8<#4)-X*6s<dm3j6FooUl)?_ctKWvFnT=?CN6{yJ?)nFxP`fM%Y?X>l}(D^t=38D za}+PG-wt;}kREZ;ggP4v35g(^<D2axo0^S!!+UF^!Svg<-MCWxE2y)=BWad#E{?ko zG(Me+kYV}u2dDoVMODC|pl|EXw8mAysU&;cyrjasypvB<5y8#1#GJUZn2>iliai&+ z+f6#Q@`g6I=QnF+xE4v_4kRYz>}La_KU<9mO-~a-?X;Om!|nx0be$D}?Cj*Qh!uV= z*U_DA!kmGi3NXA5xUkxTe|xK+1QUk{O1@D9;eKb*;_4W}RRqB?WZ4p|u5w+{8VO|J zXVrN6_9?OapCiVUj1)<bKud3a4;mCN6<JX~&^Y9t)0WmeiZNd?)O$wo3NiZ5;l%O0 zw0q!FtdDVeQ0WWIE|8k3am}D<)ZXJ-(n;cJ93b-}4TpRl%eF?@n&#P4<*DRNFm34c zu$l@CHYeW1otzA&Yyr9i?UymIADYAn8SR6Pwha(c1sP2x*vA*%T>UEs6<ZRIwG}Q} zl@LR_NiZ5|Q*{U6z}ZNI^vC*)mA)=c+q(E@;>Y-IMz2${DUaM7>6iGXnwQOw{N$@h zkt^dr0DGtP=_%TswTYRrHyj^io&<>|Nvq%x-FLH@39Dh*X7^olaQimVu3Y<d!&at2 zw2QOnV5EnXXlu_o;PLJAJ5rM^<PG7QWYeQj!p8-6%0sRdZpPSoJB{W!CChup#+$gJ zdEiS#k`&IDV_mElaSZ}&UabyJAHxbxefK{pOtI2GcC!u~fw!?48c0r=w~`_omLuSD z-0!~nI=t9R3@KwClWPc%bPD)E`&#n9lRkmgcP7!XCdh6~G0BJJ(CDWd5_{IvwiZ~- z!_a6l7@7Da<RgiORrw<w7DT}bh)M^PWf+VxrXofLG>~TOZs-Rjlu%?&luwRb>P&n1 zG0OY(kq8W~0&et&95|ly=s$mNqWDY{o(3}X&%Z!&<LHhT&fFwDw-+uPW5Qs#f~nuz zileZ4w|w3w(0Mb|_J?uk<Ho(d&hVqz`zzP$X^ld|7g$$A+QF(dADS+Y(kA^xGp$F! zY^q{8dvE$$ar7kbYr1#tl;rP2_V!g$zURlTBVSzJUQb#n+4*M}%^$IlxZhu=y7l&G z#2~UGIFg1w%j3*Gs+zh`?Q^<}9VjxPW49}zdm-;v^+Rh~ko3jb<ZXhBRF%Xj608dn z;$L<A3&TP|`IxwCro3e|cAX{<QOcLr;(7;WJleR{t_<sq+f*bX{9H>^!8=`iNcyK* zmvx0r@#)%@r|sAER!usppNVG>2OmGLTe3QYe^rmYa=6E2jmH(dTZ!zoGp(#BOGN1q zB#=($fg~X_rygHZlQS{55j~l=X?sEI$7P96*M~;wgP;;LR7oD2+U3aKJ!<D%4(saV zZ$jSP32Wzrel*O#X0FXe+PYCitPdb!Xl6D@+S6d`5qH=am~}Q(&jqm=nr0BaCl+hT z@SSfvX7}Lg(Z?gPZbew9J@M$7{IRNQNzKqc^<tEnH*SeJ(N|<7QR^2^UIkR9)jADL zq=v~1B6mTG>&?PTp##)oe0$MyOqa80cl3|JJvx-SE#k*i7NvfGU8or?WqN)r_~Y)5 z6l2=)PBXhZqKLpTLdn=knIVLSz9K=LIeYlPiJL_IvWl3qLou9)zh9s!MB2{f*EbP- zv#h6-blY+Dc1t^nrf9+YHf6&`8$NS1qMK|rh?pecnD|AcT{5@i>9(!=DYE7+3?58| zz~&gZAH@Tp*qMeWM70}p@+H4oqgil3>a=rinlYbl9uNrjJ%b#m*=3ay6%(PBs3W#U zTzLXT=IcMKa^)Ly_r#rH)`@gGrmqr$1yghP;qfn+Oj@IYkE4F-27Nm;QS~r_r!5y; zs1)CDEc!fWlU&~_bQhTK>aX83cSY0Ko<#3ia8vn1v~6n{*Sth1G3$<mHyj7pZ5_*? zgX699k`lhs*$(}5X>60D-vokAzaL9mTy`X{3#W#S62AgX8!gAT_YG}}ZRM`R)ux;C z%)eRUU^xJ&NSnShcA+T<I=;w9RmOe1!ovL18=IfkB)7x`{huvY-nQSv#)322YV@*q zPMc)Vv)MOPP&p`12bRR`NFvg0vXc>rlu|lW?@Pc<iVV@uDn}Cx)QyFm3rocIptMkW zxRZh^J55M_I9(&mvMIdXOImk2Ya<75j+stC__slEO*M*PwQ(iAHvmnG2x_-Ow@Y$d zbkkw;CT5FSPcV72AnEhmP)yz=$Gd_wqSLP`j{YdcHx@lviBr<SWWxnYl!gd)l02fZ z#%&VlHjPoI7P&z&yELAOoe#IGzDF3}#+-BR=`fnc_=#Mw%b<jUlqf6+q*85+I9kl? zacgddCpQ|7^JFQr8+PjR<*ta*THa3*lfuH7EhU|9dn;cvZJnn|wXU@09KoCJGKoo; zADmyDe?&y~;f_>!QjXpD%rB3dlAELGxZe>F{56%9f|?1*&$RnV>J2Tg{6rxP=Tmkq zt$H>Sj_b^wJTvAzI~RCU-#)J>B5rWC_jiCDGn>XR&B%QWZ)?$yD-9)IEf{u}JQ7jN z#wK<Wa;J&#XU73>k`eiUOi|9{=lgfJ@%CvP5_wXX(hwm04JK?ima%EI!?o9jAVX4& zZd_F@EoCH%V`)zZ;H6^L*)E1!%rD96d>A-h-)d_h#^H_L>BxY`(~~icH*k9w=oER$ zp0Mg9o-RZ!^?3H80~eRH5W#VLfkzG=ac%q}9o?BR(1sltL_ohD>n>+scBHcA2QiLm zeyD4o=H~3#z12PWc_zH%CXdqb0M!RgD74B7`#yaAc_ZVK-;Z><4q24FWL!*@X1XuZ z*6qJrRg2L^!Lt(<P69yC&4)cLo>#qY$EGnkR)|VWw?=XuCPG+8uT6OyaizP}$6ghN zl_W$vzhr%JNF||JyJKy;)Z5L9x!JTJa!H6x5GG16ain15p{3%98?evEMv+B_gL6HD zvO8ciFRmJ8gXBiw&8Im$w%uZucSqAk3iq-Lue!V^A}@%-qqJZa#vz#|y$4P&))^qw z78obc^g25`9Vhcn=GRNdUH1y%5N}E5n7bIdfikcW5p-sxt7}4T+L;pWv2ZPWFnVE% z2^v(snNu=Mr6kQE8`jYVmU6U_EVxsxu_xP!T67@UAp1>&__a(gIxZlUE@g9xJ3RB< zi^cw$<rpL4pyoc}Ec?3*GSg*#qFj9!0>naLG6W_n@XTYi_r48jM;ndPXKCxFcDD&J zrT16yevaI=B+M{gD-J{hFm>#5SEOq0xX5~<bA}A{oK7_GJ-<XXSic_^*Dq}|O`8dX zo1?YKE2rc}#QhLo!!5<vsk$5#lHW5*G}(%~)X~}EX{OR(bjz^`&6N6d$z`p+wL6K% zs_Qo-%-jfqTP86>adGuA4EhUZ$Ghf3qQ*KbJR`nN-bbDL%+vfB@*t-E8}Ml~lqMZB z0uwfZ0)C7=C$?{HFx%|?Tcgk9X1C{+LYnx>jm9Y$6E2l@KDBFBR+L@z`)yAlwGLuh zWy!}YdLh#laQ4p6=6YjFE8LHi_)@;wMCvRJhGdC17cY!qU(ttt?~eb*VXs~on9c?J z4wy-S72YDLGQXtRKPiSAn83e*S29!S{PU@rr&Z)nqd9ex{NBUYJn_d|Zl}UwzZPMG z&(2L-`?$&^5W`i?m-L*PZJt>hsw;L|`)fG;7km`+=k2+xBK5`W(xu%S-&dN;`hJKX zh&62DcQFEcf;`Tbz7{3x>v)xmlIKh4T<<zO612RkTu@GGm3QgdN(n3ejBckk56o8& zDn<V<XQ_4$^-w<mO<u(2L96Bv@=k{^a~`F6jx%lrt`2^jB4%7`o>^hrYA888%lY>f zD|KWhilZCeRrA2(%CffBq((<mmnmvaU$Mj03Pw~UnocW?VLNeTy{y#dzj4CrlF{q> z?q=iE!|rq+VdR_4flfpHF>TT#mUOVzce?cIAq1J<Zo{GQ#5#q~nE6ew7%)O%kdUV% zJ@2d6>QXLR1JxX*I=e|QI%{P;%9L?XIK}dlYJ&oL-CNo3qB?S(JKi$-D*3))r7=-$ zDbUDcdkAY1`olfgcHs1$-YbN#o^PsRb(33<3(AwlDpnrt20t8&F^%-(^3mTd>PiY8 zSK!sD3!F;}q*C<>sWS;&|04X)LSRfRxDTPbx@<x9hu9t7jix-SY#d7-d0o2j^6wq5 z85J2!c6E3?l!ONC5_nS)H-75neGKDudZ}|)Ntok3Y9e${ym5+WJG@uYwQF3uX%O9g zr4C<vqYW#7{=zEr?TQ%4R<`n>?3>81M5giWbFM6G`SG0bsEwZ;w@!S_@fWFjMURcv z%FTRM4Tf>!zGb*_>cVl{$t1Til;(#W)Tl3my?B3{f3cf9khx?i(9Sl<ZWC2dO(f4I zwE*s#G@b_^9)F)axL3-qoR_OILuarv<304e+*@+NpSo~M-mcw+^_^+Z^6e=L6y`y@ zK8Y#v_YaR-2Mhz)4SW|BJ~`_Fv6xJ`Eg*vJw;hh%hL#{grmuI=(!l<M)6t+a1H&kj z82WUpOMkld`h&3l148!w$PNvh%10u9w-gQOssk!yfqvzqj>TK+-FH}+5QJR8h?=X9 zm&OhTVoVMc57fx$+tAcWkS1fi+<oC(3m*gNO4CaHM^{O--1`*(Oy3J&+DOTFdauu9 zvAY^^TAxiln(f187c3u1x{nn4?}()<gruh8N68VCK9n8kV_w?wRK9Q8x^n3sRl{#b zXJ=*8V}?hUI$n-4nILvbWlb&FCvV~EncdlT^ApeK!ZbQjbuWn^x*YVnEdpDFeLR0< z+7p3EF~#po-E#_e!^x<P0#R8++ECIXD2JMLKDeE5`{dVHUJg`5O8C6N*p&gzhh!a8 ze5;ll(-+c-*WC5Sjon$}EbBK!u60R;Hf8V4rnRK?JMm{TXJ2OeeQ#A!qkEXHi8=eX z!Ik9k-1HXP2y5>|uAxR-NZS<4bwe$hmwGP8?J4yAe^1-QgY^1c>GpI|^JY`R>=noC zd@)%{S8J2)*QO0OSErJRM8_FU=d>qjstk^|B{@u~(-%tKHnpa^D|yv_Ql>-aOPvXL z;^LUYh{x6n4~yk}1sG67eUsW#PgW=zFHOBy-!0gUG8QV$S)meA_rumNn3{HbCeA01 zmf{Qds&a-0;Y;r^UZ8{Hh<z-^fd{>tk*4jRR$n9Y?oU{Ca&kp<LFBC_cRkE#G^RXG zNw~UvI?MA9W0xmJqd0o<O$QsPp%jyI)3&6kP5&N}m3=t*zmJ2R^U?RGQhaW^tYoR) zy+W%_BiM?q&dh#rlTi}^_*5j&GaSHK^`5^wNOQ5Foi*M576`kTJRoe~#^;Vx7E#7T z(6GZX*vddl27LT7apOKX7eo*>9od>>hDdmb2w}-;Q%%G08?@Dpo2J-Y;U=30CIX_K z8geGo3LjYD<Kc*K*j)#aZd{ChN4@GiJ448K{W2aG4n>ckxRzUToo^=sA%@XZ)SV^N z|GUkmmh8m1{hK@uJpk<t5%%!xJ}<|!c6kpZATUU@s6!NpF#*Glu{I_)t`nDQbCVQ* zJa&1wC3FGV=&S8i5Z)BfM5QU)E(RE0JCxRA4(~8V&6FIC1BU*Nv-nzN>E5LWOJ&2o zElK9i&mj_tq=<3Qo!-uRti+6f&YAl|Zy7#I$H~H%YMVZHUx(-w>L`-Gl0NIu<wl(s zdd-%<wXWN1U{hiYfnLV#>wJCwJPytS92Decnn<_@pnKzZ@{#&pL&W56E2BXXBwt?2 zpHm@jE<R6<-pZ=0j`y&d{zxnB1~L?Nh@ME$11ZggAfckbZ8PUIRzxch2MUos*6(&E zG6b&k_Wl~;c{2~56A=i6=2@H=XxY?WuhV%xX~o5}inkW-Nd@$JRCXV~rs5GnVk*|p zeEvE993*ovu?TBk{>qW(^AnMs$`beKdXElNMn6eRlB1<%xk+8m;_U*-+0a!p@%CZS zUzG{#W2aIhJD+N&*~fTWBMeJ@5}c*LdQQJq%NG1?^sA-={d}Whk!&(~QKmjX`&iwF zpRX$ymO)1j5_pxXFrDUo1sIqUs+5uKo^->vtXN9R960f|waoVCjteKwSlhF=%Rifk zFY03Nn-?$CjIo|fvFFnm%6+HMUTi^DqqRRGQQGgE$DxFxCJQ{`Dolf@aENvhX(K+1 zsMYTG-R16Qnpo8ATZ5}vo6{ECSn&S8x)_o3b#A+V=jEh}GY~6-o4)t!6t<NLrWJo> zCF1>Se(}wj({23Q!GR`Y28I?oXMrjdVtPL6_Li~<h<5$3VY80{qMZ<0dHL=p(hzc^ z0;us{DutOdqk;-I4>pbMS&Y@-@xx?m`kOjQoWOhrL&1n!)95m`D_w8k5)E>&b02e$ zq-xI%Db@8t^N=r)Grl275<nlm9V8(n!pRO>0MZc9OQnq|LrjfiG_90H$-R;H#Q{wV zzF{eAIdw_BSik&Su7R4&<(nvlSfwQ;L(oaFmi5&koa+gV^!i*f$<;^XrfQSJL7Hyy z?4B+EYZ6{`8Tse01t5bY;34|eq^y!@Y<An_w4{DrnO5u+4@Zi-_fCDj^$}}Q&k^Ef zt|-rqC36VeO^rD`qH3>Ior+V`rpp!@PUa<a%)yfaMp>*@S(#!OPQ2ruJ@w;lS&&kE z+Ul{#f0Zp0op)E_eJM3$cm98_uZx(jJ+TkqgU<OnvzqpoLy509%bp*spL_44UElHR zt`j^p<B0Dsn#TLf=CUKUjr-_aZ?0AEjoO(?FWT@>%K<ukEOXw>bpvC2oYV~Xvvdkn zo&RhU6p5Wgk9@VyOgld9uz=Tf(rsrDUmuC97;4U22-^~91cX<Zt9HyTZO9RenHqD? z)A>d#5U)OtBq0+cXXwS}i<MW2sQTdb<G6y|OR(oU=Up%y%%OKjY*h-1PqOfI&nmM( zdJ~IU5TQKcsi7n_S3xXJyBRX)h0x4le%s|qSce-iGjM?6ORT9aBb}~py?F)MTPq1~ ztZkhuZHk+SOfy-S+qu~@yI!lqE%_2<wZ)buZxGJvZR&Pmf#n>eeIFm9ocd{U>DD0V zD(N)QNFBVgb4fWEyE<*;nZiCZ@xE~Tj^ejv!;Yge$v#8Yv-Q0xzpGT!>XfOi9p87` zj%C(XY|}(lY07Es37BBOt~}yt$LL#i8R=el?s#o!DajT=?j}wFm@$Y!b@v%H@|QHx zn^&3w{I1rR<CW%5eid^DG;6Su%6w#Jl$zNYAu>l-ZZ}Qtq_Ne`iF;z#%kPul%c@&` zTw?nshglybGE&@GDO50n#$8cT-1m@CpMQun@HQ%LdI|$G@BGqYz}RVAuP)b$>$>AB znT!JipIq|4Sl-^<%)@%yqe07uz4%LdCt10r8U&1%b8-`qoP^~2RcjFd1%ZS^Y?4<9 z@g*D7Cy4yt&Hn3h8ele;A82wP?wp<S4M1)-t7pBTDo+q%@W$W*SrC^<uQsd9X{8L; zwRL#B#}b`EdxQqz-baRxr>3F7IvE&0v?Rn_&drH2jIJcdfm5;>3Cy#M`A%5wF-BN5 zJ4eaWJUcM^&J{04LAb&>HfbXT@P;Y=;6V*_!cG}nXLH^XL?U<;)?vA<c$I7L9FuF7 zJiCJqQ%gigSw!`RnB*J|Cvg~PHNSo&>v(^3y|jB&0q}@AQWA+Jbc%lkG}0K_s$Nc@ zv!Vzrf@+HH%Zs#c>yj0eCTL=rA=>FB1O~=Q87437{->YTa@`}vnK5q(5X@X6evX(t zZR-+DM3UXxZ!^hBH^pA0vO<F(%BdSYt|0SW9OS-u$@958-UsN_SpO9|iYt4{m}FsG zpl#>MmPaoznlLiZyo&m#7bffN5stVsvqAvu>+WRQcDph5M?>@$<;2;^!(=aKZ1{1u z_vG(xY9^WO(5oqv<U7DROCbFnlRYS!*681GZcH)4_P+%!@fgnx90P*49=949&Jm>t zmUKZ!Fk7>mk2N;~R%GbcL(_sd$&`JpIHC+7f?8F$x3exq?7ePA%Qm4G9Z)i!9G-dc ztk81S#<ZE+UR!Dhfy#vc9y==`Kk-Da&Y^cv+(wvtbVUqiKu?oD$v9>J<J%XMn{e#} zUjY%vu`Z_=JZ>DOyR@9$$?{S3i|Pja<nQd9b&ukdf0f^Li(b*-eInyULDUo{Jfuwc z?WW(6)#7g@`-nMd?&uF#-T4g}UTEDN_t$9b{*RG;xuy;!Z)NIgDWXV(XCX%^;?U}V zI$^}lJxnAvknA2*K(6!PTI)j&j0_y}Mi*K;Q6eebqsuoZ_1qp$C2M`NLKxZJOlr>K z4V0iz(4BNId3c0DOp6<3WcYRr%%O~C`|{}!D%m8V5f5>OE#^$u2o;BZs-SsKt{T@o zkZk=C8*y;G+<7>@KP*haH5EAI-d6O~?V&VBAnz`TZ&F<vQ0HUF7j2)S=M~;BVoXXB zymfxb1eRtGHm#x1pFU3I&Y-j;@s!CAcj|wx=|a955h(N;{<@l-Y3}lkSdY^%9vT+` zaFjNFnfSkg!%}1*_NKRsn}X?Jahd3md`dkSZ{)NUTS;6-A=ZF$_RH=mV72y&$vZ5Z z(IW9T`3MZM!nk$Z<$AEv+f?um!T+wKUAy>PP_eeLTn3a$atbv&dQA>DJ9<#w9=ED0 zn8ChIUT7FhBuP4Q;PlJsq4M=lxOaVt$k_Dj?DalVsW?x?KL;=df~Xn@Op_$dRX;DT z*1re6_GGx|)=XEb!>xBcbbeeMvbXHci1}r6*%J}BAEg>4?x1w;hRL~<Q#W-+RC5(g zwDM4wcAIth(U`rdlp1uf;Z!uH_#|ZdY}uh|Y_;?!1<3(X=?xiMV`pn{U`Q@aNXhcK z=4YstG+xg=JhQ0hUl#vuWe=0rMa}x$BgCacZE&FBMxxxIUj5aq^2%6SPRriZgKQfm zxprfrO!;WruRVw1R!8Zjw`!c6tg2i?;qQ!-OKs!o<e_h|uZsD$WEJ+L)UuhR(%itM z>+h*wn<#4cH^-<TV|L+0dj3eRZb2ZEvIu?|#&~_wHfjP&f-LG#jGUYz1-CCw4aLb1 zs5qDn>zUNUXKd+)nPWdHjC3$#w<PLT(-0waY=)xEQjVUs2@*l*5m6cwo`i_=uS(;O z&SEF4ZGD`b5ig5Kl3;?!ZWqv*Q|864CmnPtee6a{uG}@j!UppB8yf`Kr@|T0-h=jn z6D`jWdB*`G>L;FYrQ|O^W@$TD#42uiCeGNvJ-5n6{&j;|i;8q1J&1-*CU!{84fS+L zASOHWUR*cehjV7fGeK~KxmG10bPHm3qG80|MG1$8mQUJjq%JkfC2NV8P)P*u2YLFW zqfv3(jx=xdN<15_A8f_(M8mqLRRXDUY=D=1UDl&pjhT?bW%Z)8+sAW~hWdHCZ)pe? zGb0!sF6LbH*76i!NBfSogO!0zlj;v_=W|%cq7M<xY~);56B~R4X;8cN-alpa#Yja* zVOWS9LV_yvj{`b2zvijujuvrmDX6%HrTA!(sbhbS&K49xddB98>7FiGc;YH$lLTZh zZ<SjQG4Yk+I{LvA$vPc8^$My2ABSz!cqEG6%?%o0wuyin79J!G>sc3&U~1`SotW%x zwhVPPYutjB?~NBUw~nKt0<7ZCZQndK1)oDRi#%x2G{?9GHZpLEWH^v~SVbyLv&UbW z%2QMAmBnr}rsgJ3E~gw!WYfn^%6=fb8*N~VCK2H^rWC<XhEK1`4Q~mVV;}WMcdNbd z6Nk2-nd{8f1Xk#on4+ek<jmd7ReZmH?#<p7`IT4paT5N_*0g^%Z*WXUbq(r1$d=SS z%^6v*&2|X|f<chuQ%cy1IdNh4O6GTALm3Zo^H1%Hkao=Ax}P~M2Y`+*W$37K;9F%g z0k?lFC@660wGR3SAdXxyXfY;ZQlw4<^-zxO)gqR6qm86Og><we)4lDN5v-_A=XZ0Q zFz84iMre(5-6}eScV&C{EJr*<pd=Xwu@p+rU2BbNR8xlFm|C}W*=nhSq9MQZ{XOu$ zS%U`n-IEx|RT2KI$s05M@{As{25(fMPfYBm9+ly)E~UM2O#Weo*32s%>ZQhR!Y}cR zd9OChP~CLlr*`_ZtZ;nse<9@j-pXgbn_$U@h}iMD^`7k3^u$Z51Fc2RvXW@ubh@NJ z2h&T`<rQ$cQLh8VEM5k*Hp%N{Myy3U(~RSAcyzr?|8k@CMKrw?92s43s^)V~)347z zInj-M=gf_~c_*!PyJ~s_g6HDz;(h-_S02ZnbE?eU_4YpVxmxeXxu|CspG3xApI)OO zo4tD~l~Drrf`Ue(VMC_TFCRv+D_Sy5rQq+%385@W-Eib6Qe?XsFcXZU`Q7xDnY%^= zHGdhAxaaM-$%TPI>CtEDmKzj2?j{)*dwu83Dm9U!@6(Q(2Ft8&*@#Ba*ab7TWA`-D z4#t0czSqM_h54ou6%7Hk*mjvFYx9n<D=h|ggv$;uY{{b@VED1xA{QGs)KWr6Aq}Nn z`G6*HgY-Ecqz%1Fg3b=7s+Johq~+U*#SamAP#&}URuqtt`;W)&kHs(X(?*rH9*w5b zlw<4k`#6)~OjnA-Bge(FuRyQ9=tH4V%Q1wV(jpBr_lkL=xmgoD_52QBzUw@0JLfkc z_Q}C?qtuP?_}*ayriJ5-7c{1<<fXonDKX6q;xLp4fULIv9bAj#`VL^H$q#&wmt&jr zCap&<AImFTN!IVrTpZtU6WZzsbNmIh-|}l7c->Iy9pzi4EHVSvaXvTQ##=(_smY~| z4VVJS1?IO!6bmEP;9J<Kx=oy&wylWh_s=C^=XK8eJ#p-u8*8zzdz0UlN^PwbdT+!f zvfw9=8*sIq1G#=T%C=6nPVPv1<>a;F+r-DK)ez&v&#;h|CY7d)^=q8jnIXsWAEWO6 z6N|VYi>guj!(OP-FoZH02uNw6&x?VX(JF7}(EGb-!hGN_cobjE^7$8kVM|=bQoM+M zC$tQ}l-r3(7YreZ8_tOm1MnH|A(@;cRG=df_>XjvRrPglo6dLe*#%Xi#mSc&?A6pH zp6**>1x9fs+wOR;Ppu8}w*K>O;W2DYr<Wj_ZB4&lovd)m^$i!hs1PCw!?&Q?p38h~ zB_al3_~zq6`sGA~jdgv%A&zjqSoqDJM6x8^Q^CET$hDSr8>UE(CjR&?{^k5259Db3 z8EqSAq`>3z!HrwT)W_%aaN+6Om!u>e)l4w_cB?N_BBo5ZXQ}&oY1DRPNNd&NGfld~ z=Fg?;X6J6gdFbg{)MDs}ikIWz18iz15nscl@}3VHk7a5*>d)~;S+_X4Hbmy@+M*U& zk{V2pW<%I7qE-kt8QrCyHr^un1+TrXC6X;muX)zi`Y$|Fa;2;0<Fk$`;>DXB_GoS1 zv)pk+H+S~kgI@3(UtgaQcOIq`s*3KEEv`9oY%`4IgtCdY4usYcFYoB~XGX_nhUvj^ zrFJBYng<S7+Ag(-&2CrhW9m#NVh!7|-nWVdDj>{|nSraJP~Y?Z-a}$O;fH=&*h3M? z=fZH&UC>^8mZjvBI(|IQ$Sdac`17u}A@0e`;_LDswUtEH932R}dsy?~v^Jtn`4uD? zCgO|ndNRzJ&AFTeZXt$k<1?^8RK;yUdk7B<+#<nCeA6tpp!g$)(mnfbhGm<ZQ*<lo z{8a|k*ut7&uKo=>BMze3VWyJs+|$)*uM;c=*k4ZD{EeLYK>IQB2%bD!g`>=G<ir{( zpx~!H=SIv79+dFq(ck6SlU(j!Hbb*rwje@zG@0U9T?G)R<-E68D!ogZBCq1eVWU^P z!t5;7ozX%nqKJE1LdJT*!Yvks#o)7!N|0GXbZ@a+byxD-!{Ncos!=Di=c~vkip@Rj z>u<R=<{kbu95sLEf-A9rZpDpH*N&D~AWe3XDyW$-C^ZDmn0M(1R@Kk5<MD+o3t7sU z!Llj2Il>0XlTq2jea(}XVmCtp1~eq8`u4eIQYh4xQtBA0U=Mr`LJ;)8;jjbSA`u-u zJcec1%KVPQ8|VVEv{KaOS3BY^-+}dcGc4VO@J?Q<jAzlF%rrJwS$SKdpGu!cTl&ql z1)c`Zl+5K<txPy{#SWeB-1_&1{x@3eFUmB)`eUw!V&fo{dC^MbJSeQucN_zmLP@7R z#~PN>nc{Ip*3KIT9i5#!aI}dJo^rtijCCK*<T*){y~j#L9Y%r;*En^olcACcBP3T2 z!Wz`_E6Sr9L6M7K!(GmXcPf{vhQy#?#@IEwp#8A@ob_2M&YZ44$$hB`K<)IdTQ-NA zN9nq^<`X`TZkvl~OQV~UxR)Oz4#u|@zoIYY%Us^_jclg?#iprDo`1v5phW#oQcM-{ zopCdcnOn+cnv#^wSu`}z$M7PQ4%yra6o+vM--($glgMlo5J}w)(wf`pd-YvT^F9ni zX>jJ#25GUi9f)g$-!dg!2L~uX8EOd{n_ypD^*ET}$C*K~xz8r$_niK{Av`kp7k-n9 zGAde4xSgW4oCL%s!8S<<aU9be6>X#!cWpgG4aFPz?J5?(t@w=A1ei$(83H{Cq71>y zlmnoZA|hg8=Nmw9NEAy1#3VyZoM1Gcn&@ACSLNMx6^*M9LP(LIE#Pu)gYDWPf@Pm0 z&a$H9nutn*rX8@lt+hF|UjKYQSD^RkamU=mDI^y^wk2Ys#5BC`xnq8-`JzYTc}!d8 zOS_`HRPoVv`HA6iT5jwqaXW}i&5{{2AP`j@42}<cR(nt$R2_+$QXgU;p~&`<l&bE5 z2~6!3Q#1vW2C18m;E8SD$z0XAk2fO;uLIUGxc7%PJVQpovV5@82`mE_u}lV-Lkt8R z1dM@o602<!1||%3X2PZyUIrvE9YP>JY3s`wNWC_tnGO)_JdyR|ao&R+U9UVKV`(Nx z{7ED6M~MA2kL^d&{{Dn6&a||ON|%?+i6!hL$SDmJCeOT~s?&IVuEp(?u=;#`Hy@0~ zAD<K|17ifgt)z%6<bLf7!xQgF!iGv1sDYgy69`<Sd8A8bX&Ve;^I~L!Zq`P^t--MJ z=FZ#_^bW&5_YAJmBx>CY09{kh7cWgappKNmYG1e|Sv7ofk-vKS9M-S0rF>9BE5DD| zt#t#}#cbDN9joPkKL<B$-Eo4*+N-f*2@M08HYjbvjod2g?jfIbXq5Ekdgd1zxi@DR zt|THRnF4N~o^dMkbrG{1iX_-~BzHzwPb?p~uZZ5kYHsP!$t*`)fv$De%)p^TGv1pj zrXM6xsJo(B2p&oZ9XU(ZGiI&5+j--e;fvR1>&a!Z3He#G!VOv9YQeWWmnoYgr1*|# z9|7|^-dzkCKQk${#F}jJ0ydB3hT2f>i%FTaw0k<=rXic8ZsPc7)NDDDDbBHdx^@|v zn$Hq!d?xhoUb;I$A@A+zqFr2awgT*~|4r4C+@j!qAMtX$-Hx70-jecOjlM)_D~uyq zT^$`Z&5ftO(0H>Xz))%i-jjCRT5ZJBxiC2BJhu(HKU()(w5Nf)4wL3^#L7bmz-~tV zGi3mIyxa>{TPfx<WE(!N8-8|c_H)>wp6pK@3$}KT&kfGL<U2&S082o$zoB*Y%H7mA z@h;PmIpJb5$CB&QAj;zl<#`2y<&?4*vQOWI#L{l%OQ%>THll18Q$fuZ7g}qORMH)) z*{z9L=#YsrzfWmA^>VXn59@vz!$r2qoyfRc_7cb^>wmKohHu0{3$sj`{4^&@?25?= zo_c#P#J;NoTbh8liuJFHAp4o1m<SrcX}=9F7gOr}Z?HI7TbX{Kf%16)eFuHe@kxYT zwrpRQwl8Kvp?mC+dJXwhhfhuMgk?uTBcl2j$+BBTa=P*HYCW;^C~Kv>mYYn;@U@_J zl?UCjJl%}s!+sv<+=2vK&l|xtgU0>2+xy-A@*KcO?Lq^`1*am<hS=3*jwN|n==-t= za*yjtUupKpMcL*MLJA1O1i<OM?ISx5PcF@~<m~<*N<X+tlB6WTGq=x*X%bCQ@5NN- zyAd~d{5?K|g|yozVFcSsN2aN4oybPqJe~9K$un@`z>A%Fh*8qD=_VREsYaUm$F>j0 z{Z3_k_87*|imW8D8^|8EWD^={ONU&WY{lN~!Xzz{<>{7(eORfqa~a{hlXlj=jHZTG z(1&%QAft(SkrY{!QARMnKVMwz7<jc<*vms119JwGR^c=7%@OCgI6e;h>rd375T7)e zR8%3blrm6~87U)>J^GgAk9|0I{)+PGn456YH_M_nu_<3I0hlESyGqx4d6Balr;Fo@ zyS3?)%DGKK7diPArVjsn5xjhEC9%v!!9v?JN=2xfI-6qHN;H$z>z~I?pV5EOU&_)8 zjIY_<<1wqa^?hEA(+h+<bFu28^VaE^Lvu#IbGALL&=|SZ*@Lwa;<^4Z#7dX9d$C%f zwhHskZlNhH7TaPP?FY@c_MFb&bVe=dY<9;RNSuLh>aKJn8qSg`)$~#+S?Sx1Ln`8* zgr2s!hoK}92bI(KMB+y0oaQK&9!d4lvZglkmH6Zv0`C5Y<03iq6TOBcUTosWLomTc zV)^loY1cx%xCj6}EPxyH2pWXIH}1fMB)H=6<$8~>jX}S&>&7*0ZG^-K#<ai%4OXgo zxTP*o(c<_chCVhr;puzi_F@|(CI%<wmE{H<H5Mtl(^`ESG4pNN&m3{X0_hI;>wJ^D zWq~sJ<7wY@^}cw#l0pm91@fe4aa-`7M~I2BqQYb7i=Zu|%STJTRGw+C!$e^xn}k6Q z-p!5^&nzpH?=TCX#cPD67#CcX-CbAO)a;fSV$+8mwVq67J7+UUIK~z65PYs?@`?<} zThP6??*4okt$XK^u3>HUrKx^4R(a6cHSetDR7kh=t~DO|$vgvp&vB$*SFAZFr748Z zZRO@WBKFqoYp&|G(Xrza*~lMTw-HmJvPha4y4G^#-l6T0%WUf_u57bcalLo0rX|l1 zaO=1r*IeYg;HckxeL2+Z(w_N`t$CLA$LFcuL=yP$7jrYsM!ZJpKz9aK&a0f!tcu33 zkDeXNR&gfJQhQA`!-|Cf*N-cnbz0?*@M~LLbB-sE5bVq6&aYQd!<UawDr%~|V5^7Q zhWK#u6g0DdyYbt=NIH*FgoDStW%!hB^3MD?o~G-2JeeLesKbR<ytH;QhH0(z9JNl! zI-O41Yloa;Ir4Q^kY=}x($770E@I|c`$vqfy5lCa!#Or|EmGEoEL~}5H|hfIHPrDn zcsr_OazPj9=K15_YK}X&*D^8TQq!#CEUt6ms<rk{e!Xz|DQu-P_V}DPw6P6D_Z!MX z1_HF>TG8{Csz!HRkv7I2N>YIJNs7pPin+flU7khQ%-5q^7}k~}GDKiWrbDp}q4PSH zc#WJ$S)g}5?v6J;HM!$lTtUKoajvQle)Jd@zBS(%e>S?rU~0N5H57??>zjR5isj2G zm(s6Cgex@G(F{<MZ5>0P%UpDkdA?>_TNiUPt&{F>p!(8KcU<wPGtWHrs2ub4zl)0K z(R{$~F$`I=iH~nniiuLqjx|G&mb;Fb)jZI*#r0(dhN=w(9Oze{ha1NFmyL%Q%L448 zqhO8szFTj)MJ}?jEQ&>BmZU*Z@<_^v?dusX9mFZCp8caA7rji@>M|>L)d#-^950s~ z=%ir;zIokcyJx?G15!cxazPatlOe6RO^m)s2_qy@HW*Z&C^(o^4^h=ew;VyLPfmAt ztrMj;0mOy{v=M{Mu(Ni3kw*kk#`wd*st$j{eQ^64`E>_}PoDbKSk$6*CtJzSvIQF- zP5$nP>b-Hgsa_s<+<OdLT6={FD4k9PMfCl($<=!LUps<aMe2DrXA#QbH|d+jU92Wf z;Y(tIBK%4C_v<ypauc(jG1}c_0pdh_{bkAcPe?uVa&3pBu2pV!R+CMKP(@xwt~})i zK^u(??5lnqRAt642TtVjnm+u^y&rTgD&)E6bkCDbucJG0#$DKJ6k_0!t;7+UFjG>| zVM4GWU5>UUBP_?J-*2vbomq_W)OBmY5y`<F<xF)Q^}c7V<6d}xW*UOxJj@dj#&tw< zzZ`eto9Dab^PSLL%*L=gyX^R>JmutEd7-n8DBKhncf!nx;Y+Bz@uM+fa+CoYIid;h zLKeXwxH;6sgVs&&TyaL)OM1ha&HVaX(otP9HN^!9wt=uQcjvAtUdGmlf)_!<=7_!x zYHs6Q_#SF8)We)CHqD-+t4982D_7j){;vDGaq4B@{!+bqgxWoww0XE%aXrhqnV%9& z=1d;<)?VSdu+LsR;?%)~6DLu9hlYMH;iD1qfqI8#9Wn0k`M)<mQT8JYGCFW?7@pmY ztqwegxmNQjJ;?J4y*N&FB4U>Krz;0f-&yB*I3n1maqfzkXO~Q*;v^}mb;(0hG}=|= zPUnWUIhn|Q=u_VsuEsEF%7*3-4ou=Ohw_`QVD7xKUf`}`t|J~vrV^h&D9XnY&NnEw zj+tf-=0?UCOv_<ei8aB>y^-xjS|Z{Mh$yTgsQqtVZ00BI=j`xyr+u~9jxkSIkb&D5 zTaAZd^79%gyePuumWFT0QC86xnLH-G;V?Ta#HDL#2MzjMdRk!xOYorMYD+Eez|tk0 zw3#9<jf*8$7RaBX_PR7;cf&?x){P=~Nz)NtF=cOOUt4DsY)}`3Qfb2buvqioK6pnt z?1`1K&h6LQ`=Pk4Rp{F((s;o(mG-q~(WZ?ldn(>ZI8!E13>3QEaUeD!wHC=Ou*TG@ zuXcNd7gdtvXnqk&0s++o@3V$GG?jBsXO|W1?4gymP?`D0a#%Ct`BU)>k|B5s%x7o0 z<#GHY7^9B_5Q@2zbW+K<lQJ*~za=8@Fov@aDJ~At3rBwyb)HnJx}MvsRXz~_k8ZlE zA2xoiSBikQeO|t-$Me<E9!Qw+s!^_V#;dovE?Mc3JUNfTNh=282@k{JQEX^1d?*fJ zPEsJocXukc8C0~n#q-*siebJ8-tB@uN5^vC1wk0X4vf`oxteo2nR7}ooz2PMQ44hB z*UAW=DH&E_7}2Um+G<aYt6l^e@4%&|-&Q#7!mCHHuAz1Iq+=%)#j1)BoPNbYk!g>z zll>d`Qn@|_x5fxay&+1KB8{8GuXRTy2-@?BCvtG<WoCcLUa+%0L<kl)-vvkE&_H0V zHn%jVYQTea6U1VPLb)lI&-<8ech?fR@qWLjz8?H_Jj_LIB>B`Z(>=`5y7cpWVO0%~ z=O5g#q-pbyO+9>%KGnO;cf-l5X#WeA6^xG#f=W~O$+=JzpxDf<RZ*TIwWwcmVS6>M zr%MhCB)HW|&1(YTmposmCSX1*WZR?T<t%V)*j@rb1V>m`M(?P9l<t>(x!Sl;o2FCX zZeoCJ*rTYDwOZGolp9=T<H2!Ia^>eFRYsF4J<;A^c5nPJLDhdl_B-vPQHpZr`6A@d z9#HeD%oO|L#83om@xWq1AaOEJq!&tDpQ*G$fSI_;@#jj~S};%z4Tq@&W`#lgxZ`#G zTkAR{ugvB1YAxu+XKeQbpomu+1W$ZvCT}Fhb`wb#l;O*M*rUQ=%`-c=ghH-k<b-4) zgm6PRBI%4`IcMYUV2u*Lk)`Z3=CouINh`Qhl<qj!Wh;1Hx$$dm_Te41n%@PN;5yb5 z9A*9uBl>KGoMfU{vKIqO6D^1?2&#tE#aB(Kg1M=@LHO$BpNH}DW$TJEwZCJ0^y%UD zi2h=#p_i5`lB7aM?gjzcbjX|#`q?}SM5r$Ko)_)w<B#4$5u1$e?C$Ll4jrxxUo@Y3 z0oW}tvSeq90uw5QDp3M<vL#R^jVb*N<Q_m2B|w|b1m~j|eFPLlF!mG@QWyo^*kEk3 z0ZJS71jmAbh$2Y|RG%_9gn~4IkdB@inVFt}rQd54n*)%H2$UrXSL^0DnWgMLM`-3d z-?OFQJsz7Od$PRxxX;Dn9tBM!xL1ZkNk{hyUMaY#p<U|(qDqqy0zEPJ9tHf0Ah<oG zp4tc-H3;^afu_U<O?@qeGZDK_M^uYqrlXK9<j%V`dGV+kqt2PBd&bkO%Ti&U%KeQg znd!HJd2gI@75N!MWrb~V7f7{l^1FG|<dWP&<#7~JyjeriO&LlMX0uU)-B)QRz9%P> z+*$dT%wr<CWYQ15&J#zR=yu?s`p>K5n(`@nsw<s-WT^sY^o$R~d>PKq!kJ%1EvT%4 zN&6w&8YdHSWV1e@+`{WM4JYXe1t`OX-NlU*Q8-YbL?`3PO!62TAd^}ywa{HVa2m<I zA|2r`E~a%KMtyy+NYrz|PhV#fWye#WDqJRIWPs4cVC3(kj;!Q%Y%=HbZ3LWS)n=Rz z@qreJfm}?FBTW@V1-9Fmg}BG?nFi%8t12;wqWd$G-n`hGyn($mO_`{^v)8t?YqI?R zF8%8O>#@!Aw?NdHY&&a78=#+@Bx!5yHe`f^p$mvv*FArQS5n_<JJjDf;x+XAk!LIG z<49*0{1;uMAa^P`<OeDH^S{lV*EbEh14)?+MjT>nh(O{Hlp08O(93K!-7=o|LI)NB zQ=^kfxtzCSfeix}Czb~-9X%hX-ED#5Eog(s9-@v6eAZq#(oIl7I5VWbQ~t%+q?qK6 zg7++7%*jI3aB<VV!MFmi5`Mq5=_@`p-Mk^Q1jhex_=ym5$vw;uXFCQw`){|)-NTYz z<x7>V2eSRbQPfCwkv8D|0+fO4<=ut%lxOTsrmjf|N#7$+b!z5UiqD-?WdAFGq?yq& z!?ZE{S(j42c?498lEnBGGs7bFg=Qj6xLUQS6=r0lJrJ#_n}<CR@{T4MO`3#2a1)dE z<iFp{V<&$blMB(^i%}Nb|8nIf82v9PZhmR8rhOmYg86aL>wixJBu|Fd9Jmkzp!hi8 zEao{4CMkwN3^X!KrLz)(x(CITDypp@8xX1#VYLJgKW*DOC6tQyE;Kbdx88fbN0yw+ z!^CBJPs#GYr^86)113kMbP8#Y$G@vi2=1xgvD?tyt#K<`nM#V}YOC$VzI=}lq#1)4 z->_^nx^OYgILH<=XEw;#Z3!Dn)5*Jv!Ed#Qgl#m_T4P}u2X21;`mME$>2pgNPLX}p zc&-|Q&t=Y=3?7=2v2}5-y17NIu!90HBk?fZjr*R5%R*+wgiPCew+s~}v5fD=5=*+{ zvRCa4vM$#ByZONr$D+4&y6nlw2~-~p%l#AQqB?!y9IL`l5I!ii`V=JJ%Fx$f?qE~B zH#N{+l`hKT2{Nu+NHkQ+uT9BPO(TA-W{JG0N$REN)_CKl!SRf#o0qf}?%trqr!_)Y z<nd{b4lMh&yf~o|V}_B1sMkR>8m845C)+7BjET1>yZKildopQdb)znJC{-ccq+=aP zl1-ehD&)|$;%DfY=ErnUuCtMK&_vm|52UPZ(nOK`*Q}`haSZtv6MH{B%@^(MSEZlG zHWwPi{_m)I-?m}-Zo2M@wQ=xO&sgJp?0R)kQJiNp-97Yja=G|>+0Q)|RjB6R@e6s} z^(M#B#MzOZ;*imcH4X)An~r;TMF&sBkF1h<YWeV0lgB+7^^52DN5Lmedg<x*Xnhlv z`CRur>CPFyFJaG#*P9b6H}9^DH@Aq>Skl*HFu`JE>kskEV!OFbx=cC@H*MT2GV_l( zyUK3Nrs~&Xm?^==bO}$>Qca5Oc%@L1CmiHLNpjq0z+T5uzVSn`j^UkCH4?3?^eAO( z3O)&nTZf-a4Jntg#d{fTQ@RbUx9;Onl9VmFXB0>9u)WsSeSVoYkl^^wR#wE@3^mr@ zw__D1DeaTN(rok@N@1$Fx@^o$ZBP&A6US#|+V5(9m5P<UYVU)$o8BJ_7$JR~-^phA zxiRL0weu&Z(27z#;SQ;^X6EXQ7H%K2*|-6&N~tOo1ST=H^gE~a>dfuLUyZSihu_<W zZ;8KdSA-#ke72{4lt!c2nIa}<uIfxOy}o2KeL^LIbi!^anVpEJT#Wd?!5u=PnU3R~ z?AYrvD7hY`6-&mXt0|`hi;-m0f1P`IT?`hYD&I8X_=>}#dS*lhKkw=^RPjzUOxZN@ zE|>CyB6G~~tlLDi$ENRzKRiMkETXvS%8g1HFM5&Q4!QmRxp{A09CG2qZ5_0#3+ut% z<Y$i>W!EBt4Qn|xOjgZNL0KLyyN)wzczX$&4;jStQRFrch2Zp0tDh^r>klv$5mJOL zP?3ALN6$1Rv4fyVLsDY0z))00j3?8v43iKYCxn9Ij4mLdK;V-SgiF$TB!W=NBPsH5 zX6$5``L*)AI9^;1v>rbiK+Q>Q!aZ{s;bzM>4!Gy8R&z#jr5Iw&F*S5;IX#>35d6|% z#Gay<GC-6lJN!8p&Z<feBWN=bS~Cb1lOaPA1XT?*NfKiwiULR=iy3hM#HA`!FrH%+ z!J}>`Z9R_E5#gGHI1uI7Wit`LYopV={RbQ96hLu^9V!WwN}Fl0bR0F?c_;go39~Eu zO&{1*H2NY!%HEkYJds5r2N05Tr|6SN{21Nk=e(jZa~xbE9gF$D(jXv^?AqylgwUiw z%B%Ri4Hy*Bt29E9bs@g~*d_eGVo=33?%gjvk2wZpT2jezzFtP?e}}{4`Z!2_s1b-< z3ZSK-5~_*~mBkGR5hEr0_(j!1LY2lM9W;drLrDVYMKrV&5E2j*BrsG_H54pSBvi0d zqd`<^nwW4?M6&@!1yW)Z)fSTqQJ7>@QczGq>E2>!Mu79#ZG19B0t-Vl*2!sOf*@}E zIu|Y%gI)Ktv5H)slFfX8o@DeR4?-qV9jWH2rJ-#pWeWM**x(<O`3&3a|1M_@9K1h^ zM?pU{KZ!4FBmK<x`CgOpVx|++GGIS##pEA$V@yg?%s^N3W8nd)3TUIRU(TtMk_5A* z`(2U<8KE%i(wj7W37E{EzP^~((JQ1*PhZ{9bh|JHJjsAFK-m8zFILasmD<pEn}kW} zW@Z?&W*L%ZV2DTW#GgvyG57i(vR{k`FV*XV?LB2qIe+Ky|ERb3|JD9@NIaqF2OEQT z?)=Bc`1(&Llk8kOzmRqU9mFH8>wZTwLsP|hOm^cPGs;I{Pd)#hm$%xDr7@2UK6+Ys zdyjSSQ%kV0t+D1`$3C(>+24*>QSgs%!VI+={(cPKr8bVw{^ZOzp!7H~$5gufo!(B@ z>G6o?N7+t%sdR5TzU=;}gY|alN&O#ty`TJhJtgmkUzul4PjdC6zfO<YcN)~(oiNWo z*=C7o|DW>?g}>Vkj<0T&{4kfkzPjN)x_0=iDx2_o2E)fLp5kqCGe!LTJU;BSGVC;y z8yftFHl}d?aRkuBAkuz;7#AsiTg)*j$zw9Vy-wivj3mr8-#oix=awz*|BAN^*CuCR z^d0?!oj$MX@UHuhA-TN&nEGqp?Mj0CB~U+9h&SNaiAWh18H+lUN(Z!{8)N{3U^Iu> z{?<$n(Gmr71uYbOTwQ-}dB%x9;Q!G7H=hWr;>1k{`=ro+U_l<U;rGYLWl`v>bW^Z@ z)%JcbtG7K**x&R9Ip5F97syB?7$7JpPu}ECnh?K9mLSmU6iUp2NFS@P@eE<){Rd;1 z2=RFSlxnGhAq$LI@#WC3TWF<ms}wM3R6Ca>XBVlHbQE}ykr4$bxP%QAqsUIWQ&dn* zxj<13#M?4f>2kJPA+oq#zzLlYLKFdP08@$ziHeG9hEdQzrfE^or2vqT5K73aLJ1E@ zQe!coE7h@Nu8!+8QAbC220z03VDzy8O&T9h?9aBa0B{}_lko~?m)!lEzc;SB+4eSz zgtNqCAD*n5rX<w<IpW-XC6v?~Lj1EFgAYj`fdoLutS@o7CHu{Z%fmtLh<0~>)Acy2 z>_rVA#I~mbkckE;{m|bVa6b0_vzYsF<pb!Z9ElM6b|vA+{s(3vM1(%Zl;wzqN#LF- z3Q`mGOcH&4aHRUZAJZrGd8e(P0~nQbP&LW^^BWAV5<J1NhR}aZNSg#UfMS#*4l$Tg zAT*6=Q7lL{)RuvgO|_>ERR&66(f%Y+@-#=gr-Dug<b0Rmcge_AL<c|BGh`XqJW+ZB z%gt?!E|w|MDCs%Q22R3P3@{{sn55=5M^Fxi-6=H^H2O^UD~2h6VB(%VoTXNkj-uwI z*i#nV17lX*!i=SL0%WuhK^ub%I|G7gDrgSX9c0MwIlG)F0HRl$JP&7ROKA{o2Em1r zfP{`qJO#82AWd=!*fI_#l@ttHD264Ww!ZQFoU#~|3sIs+JCm})+B#q=O2nL*!gNF6 zcTWUqhtNU=2lJR5`8H_Hal#F>*atQK#;9v%v}psC$)2!oSij8(e1t6_eR%)X^BOe8 z^$`EQ5BzWWXgKLkSH%bXYiyz`emg+_;Tw5F0Fp%g2Li!z6yih5RN)Sf`;2u099ox) zL_M&1!1a6ur8=ble@9^TH&}99n)AMl-ei+J8Po@pbr8YTB5e}}eyaRR9+azCFd(Tm z>jttM%99~e+q=L%AEQEjK0M@ae@8Ae^_@zc!54yO^gv>>3<jX)cKn!ve;*v+LOD}R z5~xXlWHLUl<bU0Be<InM_Xv-2Hht|#nhDOI<Nq!Vf6#Oel>RBgPM_w?{^a`oF?!GF zEk|z6U8VYWc(i0+%4cpPLEOkLWa{brK0afTNLdr-{J)R+d>T3=^O5YCBPHF7jmYsF zgW4h6?GPK$2tR8+9k&eTZJ(%X4p#V?_%rad(}LL2f%((#rpQE{2sxbmo#4$R24lq} z^5ZPLs>dQoC`&T(X~aY$W`6nqr8Pur{wL`~r0sLN9<S~(VoGGn$+uo;Q8oT)dL#1p z$yB}Ak=sCiN9+9ScoxH#lliFxNt*!w3g;f{<NEWsMdYf%xVfK23ZpBX(n3K#)h%5- z)CA!x4v~<Bnf>D;B6he>S{?p)mF-jLzE{jIjo_P1*Up>BlF@&vbqOM_i}24kDM`fr zKePMy-(dc`Y})fo%pv*2j3<<(4v>TA(f*42r%0PVHiB1^I`}!16k&vt67m9OBx5(X z2&OPhCVrC#>9s1euD=zAG@{`LR7P*!RePt=+$bT%FkB5JK*WvAmBHV7n_9~_cdZ}U zE9>Fkb$WMj(m%I-c+R!0C@^A;A7mP2vJ=qp-6|PwsT1u}Fe+hyRbj`AP~mZ33bnx$ zSH4h45t%nEJ=l|_2`4RT$dM!v>G47L{r|}TUIj})K;SrhO^jsNDK%l(G)&V&4pq@- zGdfCzDYb0bZ>YwU+Nmt;u2rLA<f!z&Dwo|lH_NimJ~&}MJ6f9KkXmzpI>sL}Xlybv zmG~OF5rv<4x;yXVJ-qYTaFy};X!Uqx^Jc=Tq#u5kYRbS%S0JkoX<jKk{Y`6VhHtj0 zu)tbqxH=$^_e3Zbp!xS3xYc1a;X@<t^BMY_;Y$)sJVZxuv8v3fhQ7%rakti^sEOky zu4K~&)FbnLZI$=$IjQbUyM4#YpdhFmY9eMLTX4E)Af3obE?oI_Lv4-BQU=$TcF$Ks z=q{X5cGX<*cM<3C_o4_WX7XBSZMHIhRxJ+2P5P)m2VDLVa0NS}sqQYaIdCxTZMU-J zCxBpkIl_64xd!CUxy~3+bzJ*gozfylly5ob8f7ZZYKsDEj+bKwIt+8$hh%KRie}5m zX*+Jvl3@sFV;9mS;g*O1jy7^%>dp=}ajKHXdUH{9>cr40v~$fU@@*4hzP*kHQv5Z$ zT#c}kj3?(FDTNY;nDP_Dv+1xlnb}qrjRE^UE-Zad7*H0930>!ooCdP0ag2~Sfzyoc zpUoJFtAJ{xk+WxZRm!lTG;~}eC-K!LsF?}bI%q6n82Qq#VBFQPm63DACb_|SJdG11 ztLfncBJM+uRFUANHIm!WKK}msPLvrkO^I);p_WmfD+#pH{NXh8t9^M9?ddxheLK7{ ztJwZGMSJsfLDzoojtW{n(-{kT_MNiZWdqWStxA&4hK^j1j-ebug@rm`R{NNy%DnEg z;^%Bzzk`QSK<jtdxZY(*ywzdsk1Y%1Y#`DI8U~sBeka<Ykl~jEF^{+M3Yk_(a&*+n zj_0Y>mBdqHbl_qvA<%@=MvUY^J@-oHQxKF_$4$gtR;Z3R?+&wY(W#)R>P5!}VflE! zXG529^?@=0$3{G&6JB(cqi|}|l+EAjoxsRy8{8cbLiQUNwtK}JHBCB9EB?9NA+&V= zv*^8a!)iz~ezC%*)HH)QV)|^Ge*_kwHcrE=$GHu2?VfC!cj>P#?3s*AcHT*(ai8(N z>#FTxCr=6<`9N=*ujAi(mu+^&l=R&%(7(uuw_#K3C{AMuCGPQ%f10%7=XQK4Ub4VL zIpiQhBqkUdh9$&01lnp@g(LpcurmKSsC|VYN$>uR^G8hXa1Ni-DaogMiV%{Mua0U{ zG7mt;_SLoZOu#;k`6Oy6n4>UxhnhP*1|J!N<nB6+h)K2C|DJ`@95|$y(7Bne-*B9( zCI;A!q-cwgL_n??yG{fgM)Qke+Eocw^LUF+a|d}eob>w7a}LEh)w1Awa(BmP4Yu2A zBWSIvtjr=Ns;a81Pn%&4pMW@~QPWP@zf}yRIgI%x;RPFmf3$g;HO%0Hy6<#@uvHbp zWA0oLaG3R`!ErQmal2s9nUR5YpX_+{p?TE`QkWI|Jexz54%*>OP^AlMB7!8Ew~;Bx zyu}q!9%paA;ArRN<pU1=$0f<ef~1HhE4kz}FhdnU;$b8^Mfcv5$USc<X#>QtJMIsn z=DWm6oa!!<#uC2=N$#65fvZ4ywDh5GA8q#$vsg0AZ0)$i%cApEJ#_q`C$|thhrq#b zN%LJoAvUfpLNBl8y!N6sBo(R_5OL}ZzO_O8c%%19+aHs;I-rJW`PSU|ureA3@JDYa zY^KvhJ<kfsJ2yJY-f5mrnKjhjW@}?P#)36XL?GCYhb&89uIG4s1wE3{Gl=~xLkm65 ztu66dwN{@n-<>b4EcCD+!~Wrw^Z_y7PnvIKyij7^sAE)qO+4v<Qh@B(t;bYW!R4WH z9j47IXf)6CRCB9Kd|AAcyEJwM2l8y*J$mNsEQ;0!>FaheFCCaodz3-5uMYIo_T999 zd0Vf?Heha|S#-;JsI*{4!a5MnBZMT9NhLqZyE;OMx*#csf&YGcCdJ|m#2i#%g<71? zMOc%0i`sSDxfm-oj<GmZGaGpW2xlb3`hz(ZH}o;=KlA@qbzUw%d7%EZ%VWB8aQjWI z{~~Y9A7{+b)R;f!LvKRq{lf>MM$t6p?vTx&cSlizlA|B>U-d^)WbW~g2JHkW3f^NZ zBjcKN=qF44?}yN0Aqgb+>|eapxT^X;ZSbdd_rDLcJN$m(6QMcFe%wL$HR+YEc}^qT zej&=F`k&|8?8Vsa)b(vPZ2C6eUDVo0?VRT<1Gmm}+9t!kham~Oc$RL$%zMHpZN&RI z9Lsg@b`293x2L8!og8P+U*%1{4K87tSO_BtYz=}Dye=wD*4qt>e*YhZHXAkOa@+Cf zOvCg@XM<?^R@^0r?x;Vp!}IxfT6-}Pn8CS9+F#CAH~DMo82I!t+F&6UF>||FB-^9Q z5<<ztd<fl0l9}kHx2MsK^(@py6)q|WkvUE%ClI8F^eiCl@N(!y;^`0C4nkX5&Ke;J zB$7!>4w#%u@9EH#{gvph>-HE6jeVA!uy?xO!}VuM&k@Www=G`K?xLNQyRWZ0ZTh7W z>4`n8VAys!V0Xz1?L#RY`e?O~vcoeR8Ay3MW-xZ~=C|6q`H5}Ydo~}QOq3xA6r?%g z<gL=JgSts1mp8S}TNfR-HAmo7SIbF4QtaYgV}6*m4=`v$e#&vKqF4rJOI*MkAki2; zwHNO>ZTsjoL`7U`HJ0AA9)=$lLR>dL92>Rnc^!BkeRg`kV*eldxsC7m`(51j<{cvp zuyY1M>QG2SADI{X^I)9=pz?=lE*vOQtm<y=hfI)#5Ce&U$8MjX$3D5+!Z#{?M$66x z`Ccu4TN+BJ)MsRP?dp`Eq+Ctv$VcoCHls=C!N70i-J&oV_}nve;tms={8u3sp29y9 z)a2G_a#Mx&J2!mq>@V~fkLo;bZrqQ=>j4_tocc@jJEySvcE6W#F|>ZBItKQa7jU-D z4#^>0A*dnJw-=%%M{m)vdU!jfREggx^F0j5JDwnP%xcOZCovm{rXdNVbUF9S{^M^y z-{L%E?>K(hnH-KQ9k6t73j#!ekdg!;1IEb#rpC-J?Ae1HNqkUqF)%xzGFbnX?R}qz zJzw6#BfR#KcWzH`boCC*9!f(8i*2Qv@sZ$ihLR*&naF4Be+%!4B$5mHl(EaE4(gvY zl^&aYX*y2T+#&1r>%7OL>bWI*)sYpJ1C8Qwxh~Om*u9Fk(B;eSu%Os?{RE~je-6vI zqYfL}e*w0#6BXsDwXbIEx(bYkKh0v{g0$00BSd``DwgB#cF>KwJCY5Rpr&m%8OYCy zH<5}#bb~)}hRRdH^BN1k&G~l8q=h~bfXL9#ElwE?y!ahLE~)mWOFJ%iWPEl!<R5{U zSiy%-#nK=?%XOOxn@^(7)^98rgVW=}VRN4)RUrD=c=@xYKU!h!E9{~B(c};x)SGhY zG9RUrRUWneBobs*tB0!@nsr*qPp;ylVulM4glzbx#hu*UGmx%&J6h8+pGv1~^$_SP zdebK4(9kVMGb32V1e8q-kR+2>6qwuHEgQLAuW8aBNi(d&TsGWmsz}biUd)DH@z3tD zzw4>-HUy!k9P2X>;CtJ%Z00tINt_|?Y~I*n*-V=q1BFtC0um;u=;N0E7PS=95K-53 zk+|+Fi3%D+f%EsNo<vkZLj6cLqwmXWFq?AGZNjwT<KyWvf1|RPGgYoEC0R09Cc?e{ zL_56N;H67;@snoRMlHdl&fLY-IYs<g%mmX${ESTOG8{KDA(&0H+qbDtT={f-<>=eD zK)CA)1+ooK<_Q~9esLSl2c3~0EXU*)&vyC$GV&~1#spxQ&D|S$yT4roCJsY4G5U_( zxP1S@jU;gDW9IUb-}%w*FxGb_ygjE^l=FCitT=EFrsD6qWkrEGCbIvpj<KU&Gl(-n zGD2tdsqTH5mw2iH+U_<EgSwCMF@9&ncr^O3!jvQP%2#b^hsDg_;);{b9vxaP=**z| zi<>6E`Ma%b_U9RE6CvWeX+lYc%8Gj-Gc}3MmaM9w<qFVDm4sNvW0-s9)G6$Vy*cVV zCtUodc%PC9BRrdip>V{-O-hyKU4MS~)?r!EA6X?@KOA$)>%j!gK4xj2j$xnfJinjI z?w6Ky@_yIq?c#BlXZn5^bQ~_`sr?*q|908$d3<!2V%@vd09g%}E>9V({;2yUFZVmf zf7x-gHg1-jPvAu`me<|o&wREgODKjm@SfHBDQ=lq<?~uRlTO?hOtMhkt>4x1?57&P zd-eGIcy*ajWPPaj2<h;9T^>tmYg(Iiq?&1+Z%^#Rv<a|ekS?cmvaKXx8(+G5b@qNW z^|!X2ALUGZ-_(QS<KSuMub&!`fS5f=oB57)=6Y@=@8P)g{2y4)Y^ChM-}`o5`)=Eh zlfS)p_(%O4ypU^eT8>$NgUv3gbm*h!G`PPWU)!vXg>i?&A)RNDk9^36?zBoAIN8nM zafinix&3@Y8I4di8Zsg<nIB!}Q@Klhy>rAnGhMmBYVMT;<FWy%I6hcH(SoI^XbGV9 zqt_zgEC0VrV776}xy@1kWa0_5r6+fHe5ByhY73wxNy+B}n#<w(=F<ORhm)@i6K+We zYPb&TR)+hpStxWB%`-x0u<=8m3M5Xq!B$oT_IGMgPJu|7Dq2>LtD>h(<DFk!>h>`& z`wy=3iRKQr#{uVNjIZiAaTkv?yq<F7VYfw}h-eQkj)PL7Buvv}^~c@S_C4IX^Nd&5 z*zKakr$=Vyn`^Do!F4q5-L=2WSBY`!%IvaX8j;FdEaH<F8MSA0_AQzh8*NnFrBe5L zyE{$@EiC68C{CoqK=S{h@>ySSL3NoAbpF!$2ax}gkX@az({}R8W=%;}l1}QDE^McD zp6jTQ3PA{oh^d{DwJZmvMxQ_X>(|_N`TqOA4=>Z-`MUS8=RfRj!a#cY#R16;E<SiW zRYbt-{jdzqm?UUn`E_=Gll1TE@85zmlm4xrBkA({IZjoI{e{%?qbP@+=QA_Zeg<u1 zk?8yUlk;1$L}lpwIj|WjuEZayFhU#H?iIP%yvAQKpXO$6`CYfyo*o4qnY@WF%EPgS z|HQ*K)7#6PpVVaYvj?PHe4g)D`Fc&+ZT{YTj+L{At^90tpu)}Ock}%oXgz|tw|(pK z4~B(l_0l>vVGGUd!{4em8Jc$KBP}XQH7E8vy_4vQR*5P@4wl`N8zM3wyL>k7rTc|E zLlPK57T}a5!c~hCQh_@r<9WjipwzerBJFnG+0E3{MRK;B1*W5z@!Pc;?sho*BVGuy zYbp;orDwM@?)?X^+3S?4Klpk)H*LtuzL>|}PqjWibKTSVyE*bD_WSeS+n?$By$Tbj zuoOce^m61Ik?`O8HcD)g4ruWI8`*r%Nb}d|Vf_*y>Fk6Rb}&PHK9_5;?CJLh10Q}q zysaN$KEcAb9`;#ZW5dxV3(s;3jDt(%<*&SQkip|^g~!0XsTq@TU?)?OZBRSAM0Ed_ zmlK4$iI3c&QG6@w)91Q26qZlW|1IIy<Nbfh4Kq!N&B5vN<XXlS1G8g&Ptm=|I3QT^ zsbfjG;6X27`ymJ&_L^ocbJk>yUHUe|4SY^lwXM*$`hk6z-Kw4%PiB8kV}!x}%$`o> zZED{tY^612BYh;q0vqLTa)2_Q{t#DWqlxH_>LV=`t(dS8E!>OAZdg0kpIxNTf}su< z%4A7#bev;FzRoa?ua8kW$P@bhOimXodDjW___L^#?1zjQzvU$$NC^4OmXYjCZB2FV z!FYn7HwX_K=K~~G|3@t4#mHWa;6F2ATg&`|Fvm+EX&h`hO4Z|60`NmqOFBTCuE*g` zx7G@_eYnd9bc#TO4PCl^o%)4mjnJhI4+FDgn_%P3NW(4Us*fgv+$+$tA~&^gquh9V ztJ02KdXagFIk(~{6i$eVNTBYQ>&4Y2LQw<ihv-}a832UIl5QxR8#t3Fo{Tk}h#wgP z1%yQiJ4z4zw5b_y4ul5{Gi&iCaqG_Lzu}x&6ky5o&)ir;$8nCC5+ok4LwPe)2lI5w z*Y)+puBnJN;a#`sX@}-A_){;_*YoE!_&&dbm!12GcOClt+;;4Y{Jx>@o)^39lti87 zzZIP+N>*I<4mY!;j+?rCY*{i#r4QEq>u-sL^1=0p$v=jDYvAWB{eEFz>y$~wOcUD| z)u>^Fn<NKkLiDmy>8hM4mA4`kEX!@u=F{V_G%tIdK`(Af4^rBE#XkibdTXy7kr5iz zRaHb$dgIx*?w0T1_uw4Q^0vujmwUl5SnPT#!-(o*imTIOY%t8ybu?2SaB&<WD~0lT zGk;zcx|fq#<YVK;`0Hcy&!RZIh{+}zAI$AI?M&1_SAx8)o;FbF%a)QOU8h?txnVuN zON)~?((LEccP`zX2%{BUM{Dn6weM7_#`d`5vaHnU;Jf;5cm8FyYs#;-d~*@`>7I>C z<189CeG?n3M@!VX2Wo6Q@~>VWag^9B9#sBq&#zB1(blDc+@nnoEv3=F<Zm>NQ<k$n z${RX;Rp?vvyJ`IPF?7x@sqT%pyi2&{AAIJ`#V~|lbj26Q$jah(0g18FOyi;lWE&a7 z&ai1vl5_(~7l0`GNl3-z$|MnH51A)Rq{PMx?L>^m>M_R;s@datq8Ay}zN{Z|a^-Vp z$ZhzJ73GHR+BMBlRf*i9Zd{XIgp(;Uu9&?4nntT$>xQ9ZTqx2bu@FD4c|QAXve~R& zN=<m|H>Y}EV=iBe|A;1Cp=08kahhOnxVW}Xn@DB^)s&Qj=|D?oReyJy)E(+0xiqBw z12G7paHx#I47E&(Lj*BSy)%^JuQs9Wh%G1<mq%=a8dn+zKe@(kYL&B>Nu-924=2hz z`+F<0{5Hz+>rzE@6aRT$D$c0;2A@S4m7gP`m&!WVuyiFa59!%3$wL+B==P(~|G8bW z16NzQ`W`s(W5~&5laQfElm(M$n@z992hJ<6yD{K&oew4*GNzG@9KSqdrT!P@V%izR zap#jf{9^f3Ee#`)nI#7VW}4(xH4_;izc(f*LpF3B{N<t``L76i)DbDf{JD=}@s9BG zbcb?nVvB$XbLH7Q-23rohLp60_-ugq2JSLJ;5Byyh+JtAAR!4g*EyXg@lElOBNW&! zEx8Fj$RMh2Qiz!;?&8=;#ArVv30DQNa?s(#pWK1O1lNgJJ%x`w$_qck3!s?oNKWJV z+ppy@zr0}cp63)){VVtNO8r{gKl%x=Xt)-lBvHqbgrUSd2;iD)i*??sC*J|DHfg2d zujY8NGq)PJ*VzrT2szc8qN)gGyP_7dIdsXELp&RfVQV6@3MIpB?W~GCOn)2f%!t|2 z;IMPBg7O&mB-uE1CNF@&h=K+`k1{zC+C#K%js$wmeWrxsbHBS^UF)8QV=#rL53kYf zt%!E~_|wVnh-{|qnNAQJkUA0>BVr_hGH%s0#Y`uruJ;-G(`16rAi-T(b#9q@KCZ24 zT4G(LdgV*X){Qx#C&+>Cr4rC27wKErOMRvre7%s(At4Jpa)BQqGp<f5zh>{q;3$Kr z6pT-NeV=l>6V1WX4yKqWReNAKE?-jU&rU??iHP{kIF>1;nBzAK+#b7}i#)ODnPBbe zfrsMtM}lLk2c;dYSC)9zO_~F5{c}GJEx4@yz0I7F(TkZ}Nbjd#wc`WE1In%XJbwEA zS>9W|y;7-v4xWzKh>j<l5wb+>bUoYj@!0%yd7INx^1c||BuNrbl!jg%G5BC8?VbHW z%UopckoA*$a6EiW9@0g89AI0A8_J0SDm$cSgPtv9Wh}xb4h2UTynT}-&$?0gw;zNw zuwk;Z?2kPxQRq!LPiyx)+7Mlgpo`S(yzav|B(R~cITe!X-6*|WrF0zmM!Ee4rV{MI zE6dS5WuLxymt~hHoXoJk^o2PdZZRyMjmp^3*QLqH6u*p)QgrW;KC4mDHc;v4%PKYq zA%~x`=|L|K)$?6L1jTAQqS<{KT7@61cGVVZf+3kl9D32yEx);ozwt*bR_|G(yX#hc zXrvBRi&YZvTkdN|b~p7C=-Am5>Zn~E5K#kfB)840ODr#sWTxj6PbM=vb~2fU2dN#z zT52Fqs5Ch$7qn5v{yDL|ZNgrLA4}!mQNnI_*tS%q0U^gobyVdZA&B@saXc0^kr%t; zqsc~jE(obh-sFpJYZpNJRB~%~W!XLYu5`>DOne?FtA0GyewZ!FqKXfL>g*@mQW9^> zRBz{=J&??uDGh#@^6RLog0-o^%*O{-rFDKTRY;U<f%v<EXmp*h6!6%h`cC9tV0hs} zXMufS;qXIUV016gK)gLW<~~&d(9;pPZTG(^B8)-7V>iK97v$UCZ*-*8ZZBY(;N)CM z?rKhUa(F4~H`Ou4;cp&8`W(o->9HaXJ0v_fx+YzBWZR#7@EFFFp?*1c{SU;oswTl% zXDKGbmwgEfeW6F2;m6JA{P`0(e6_`c1+!t$c^}C@4*ooRdbwXZgYvy0C%?7cxv@<= zw_HImxL8fbNwj{)9403h3<t6)or_<0hmr5P*Gd9dA=tga(_iP<?9)@RgC4w9Q!Dvo ziX3D@$1EFtYDuHt@~=yS6+1_q*|yVIB(ca&b5p`1j9huu@JU>FbiphplO@MYuP9!U zc7I$+w+{KLEU_BuS4kK|wNfW%C7usDNe+({Lr})z>Aq=(b5$hhN!{UftmB;H&)=87 zBd?jJn2!6Fa?$bLds0`D#JxGWWhvbUX8Ckebv4#RA+CDvcmKB$xFB409vXw^(T*f3 ziyxXSgEeu@^^??{yo&ctaR$bJWtwYpNvK>Q*)uVlxQQ&0{7j#DhR)5`_=jxc3tp2S zug|kB1pze=g`g=m_qp$Th#_^z(<fJP*zSg8f@hmv=~%D=UD1Ipu3V!*r5jW|8BiJw zEQ{5c9a)*dv{@L33|7HBV?R%(SA8sC4W&1|>ap8adyp8`w78#E#=I{uA9%2@Eggrq z+aZG8BG#C+cp5ln4GYO1+QR8~@A<e{)yTiIKy29qA;$+0j^`Szo3nu91v9(uk_SOu zTGb791LYEjar}TTq)8wE|0wAILrjG<p+Kz&3H%So+5KDT`}}eK+5T_(8U8!Rw&e4> z`*Wq8@KeR}7{J4Zo<;tD%l@Zs-}Ae_={r}=`QI^vk>DNT8b}bpppXywhET%{Q6i5i z$S-Dbtb$PEdK58*Hb@^>AMSR8dlKuMx^N!b(rRc3jlye7!8{a4)7Lx)vQCFW#JC_g zo;*GfK?{?;@OcJ@1X~9PLBt1?!=fa7lN{>@JYkleC5t4LK>nULvQH#5EK8CH;jwfW z;gx`Y-7(ljF7|bi(Y(N&=97vhEdiK(^AAyYLPQxLi3&;@5X^vi-v?@f@kz!Q%M&2^ zjQ+M1_dc%%8gUMTNN93Wnj#v)7QupO3bB$Xi!P*=fQTCRm3S^%3LvUtBX)bZ$_6Cq zbY+Gl0s+t{;7kV2ARr+~k%9_>L!Pc-dk_{B(MW_*DMBV7O(8&IpI#>n1kopqx*cgP z$0^OnX7I>)AyFbkrnEB5NjI5Hee(Eoprr#4p`fIgAc(y{errT~p$spUFo=h$Ox|V@ z+CpKhagOP&I?&w^;${)S-O>$7z!S67at#uV3m_*?OkBHWAE<y{Mj+VRsuB)_;hBd% zym-h4>t++e(K|q6RRtj-DGet14v1+EWQPbh0oqI;I426}21Q6jQBMpwa<c=5Z-wxW zkCGU1p6qeu5f3AgfwtoVyYqAo2bd*zJ-z5`2T-sqlz61jtVqcqG@^?G^%4-_Ajc3# z5fDW+P(VNs1OUJwBmoXkKmsFLs~b3oO^D^-Js2Q@C#|S;QURyGDeutaL=y~@ki`j7 z5=9Xd62(D9`3;#5BT+LESDOq>$`K3@QWGQ)L`=~EHBm1{$SAE?R$v{mwM7kiFvJAx zlt<*Cgy%g{F5XPzpMv2ZSC8=WpSEy5K|#sZ@ZE>>YQW*WnYx)~;OyElDGr2)hYy_n z-=&^b0-25-XaG9CrwUA%T?2`sj^Z;fx;;OB=b5c|9<9$1)bG~>9~`D3vPtkYf+!gW zndCCm!eae!j7OU$*M``vwF3Mkq8p+{Afg3gO)=!xXU(`jvQ)+o>X1y5lqms-AW(<? z9_-W0)Z+%fqxG}!5{PH1^nO0=lYY+yfA$HGl4J;AHDuhwsPfWFo~K<w-;vob)E3?| z)<O5qY?+w68ki1GgCf5#oAUAX!8_X%OhlGJ2p5(ijSKA>R!;U%4|`a%<4|~i54eRQ zi6n&JW4IzlLo4>hzp<BbpTpoaS%2e`n{@AT^wg>)dX390p+@A*npnF$#pZVM4^dQ7 zwN-gw{Y9ppO1B0wbNFAK6t7QEZZt83rVWtcOeqG+CD7(ZijG;s-J5#Z5wK$<adQ&f z5MgU7KQWsA=?MMc!-l!@#ZkuN%<{kSsL)dL2FcaaN?Y3?NuE>{jmNYTKjgT^-Lw2z zN?zCo@T#aZ$c%{`#QalX^%wilgs;SUjpaw&t?{93F^i7OE;3~{n@NrbD~K=6?z#JG zV&?89Tw|8%KOzn87Mvl8n19PL*5<86!jG~cN=)s>3#YV13r~xbymHFpi#gXKMBYS} zC}_MQlP~{L-Fw2|YPvAvzSZ1fw3d?AQ+y^~K{^TDFobY+;kLJ_;bR4Rk|LkkYvv$a z-Rg!nK;_5sYlnXskZyL?{;UBz7;d*^zvH*FbKzg}Z<5s+4?M2nE;?P~Gi(~-UQSMu zN%4={FTbZoZn;~purEMw!hFk(_eeqwqLS8iDz6?KyLC6<i%_34_bExz!7F8W^z+n= z>g`&6aS-$7cW~qT;M>4(sAK*T?@A*L)c0=TMJHE>w^r$C=~g6L0rZ+G&`@!19<(03 zAbefCzt@aRQv_EU>k$9Z%ldo&rkdVtOPry+FMH9CA0kPsEvS~Bm6;lBzLM2=`EsJ7 zNw;V9+Iu!_r6R@Zg4=tVR{K{MS{r|#XZUt`G$lmBMUY)3yU-1|8lt#i&4h;O?DCE; z@PUP7selaNG#H(R$s0e-@*L&8J(<n#>Qj-@r@8sPq047znY+9n4nkF`*mgWst_W@y zfthm-(qyt%o7%cKUsQ!c;^4=N5l<l!ixa?u5|oQNNm*Es=OmBujix-u+}xYfb|xA? zbYs)MaZF0K%YzZy6FkuE4Vi7?Jk5IjB*c1-I`W$zM^D56H*RKa^eTj%06PXTLqMqT z$D$BOe+4J8XCTbS2HP|<44a{^a|1j;u+XA<sq$SfWshPHoQP}-$Y~>}GZ8Bp4B3F@ zq#2jl!GgD9z}u|#8|d2C6|(f(qYsdCXTxRYOoRoDOb+qQMknCq%w2iF4O6%z<`D*t z$!#(TQ8C#);5iTI-=)}h<bDU$zZ23XGMwckKvda*`sJ{xn3FpigPZ$*#(5h38N<kX z4`H<4RkKj-i12AI%=^!bJpN<N*|Eq^Aaau6bBy>H9$B{?8Jt9pq)j!%+3b2tnUAR3 z<_cZ(xZVo2<nL^3LO(FjF@_k>+QAu<1d|K-Mxp(FMs5Rj2PRBn)WLAVA)mmupP!q` z*mMVsw?yq()m;{~*JG0#X^><=GGY)R$HqL#B1H!tqon?4>bSwLfRjp<VZ!nk6X8c> z$!-FAB;&>o{@)KWZ#exNh4p#&T-bXYc1$r2W;6mc2pr!akc*$+9?Hy+eJPpGz^_f3 z^IY4Ujv+C)^%EVF7#Y+Vg91hYzv!Il(be7U+rq)J!-%-QXT^QxdD+d|HlG%d#|A(G z1cZCq)|nHGh9c-;2pZzaE)So*&tJB(W*8^SNGJ4I^E2RM&p)c1`hAp~xLnL{@);eQ zU)M4W&IZemEsowhHn>Z(7xmufM8WzchRH^3o$}T5&ik?Foq6DNsx21XAL%U!P|ZDU zIWEb)&nQ{me_}gx9+*<AjWRE&)aSz}3-H=&Y?d%Q2#9-P_YC%f8tmguWqQ90z87Jh zxmxAkWfza8i>HrR&}C8bwtwO~da6`87hk_Y66vEcCT~2#(oDam5SyiGKlNK-)|ls4 z>cG09xS>(+@U0Qf`@*t9Am}V~@67HfLWGA%3P9yF9AfBCQ8d?F7#{{|`D_A!vk-Xc zJID^QV2Nfct^N`7_VcX}rLNpb08>D$zl03-eT|WGP(xIdiu4`Xf04=l(9p0<55(&d z?MPSL4!hJ4;kjfqkdU*>ex~LoOGf`Cr)8Tqf*FGFY%pOf<n8;fk@@PI|7T#1mt-ym z9HhPv1PD0dq9P(9BPM49vF0&;8ul-qql$1qh(A(`wQximV_C9j-y(e%=7rkzl%+$e zS^}o<i(K6+$Pn0wwXq)op6TX>fe9el`Xf(Ae_XGfuTwiIIEdp`A7xhu()1sMK-aT_ zuGLjdxAsG&CM`#8aU+ZHZWLE1mni8$r8nP(TNb-5lWbMnjj@ldJW|Nj^LcN{Qmvso zRG*Ja7wf{6t=t^qq=aFMN=<UDB|_JED}#Akepg>hE49hxg!9g3a9o+~*CB#ps7!!v z5Dv{Jg{t{(PCBFy8+Ih0JQ^8)Mk|rOlnN#ugAmx6!Tvse#||5Lqh_jzC=J(Pp$-T- zXz2EMJb8%T11t0yHD<?I;h$)1VJ3DJE3WrqRCUt$q@qmAOGcB)UnhI+Gu|~ADuR=0 zO63+j<=0CIzu*)9FH!rtZ}Ne57SXWE+YYN-s>Xs~+HAa=U!+eN0%mrE$=-Q!_L4u{ zA}3}5;njs1IRm(oFEcLLHVc6RTxvO7Z4e4bIy{b4p2xOqkhV?CM_y%V`3K!@HmbgZ zbZG^rebpm+SPnj2cS%JXK{TaLH@RUsu9Q`0A!~otA*82VdTW-fRo^NSf_O#TVf&n} z`fiijk@Me5T-RL}7V^#Zt0<u%CSY{QGDAHP(lRd7T4_4d!t$YDEXPj%ra4Wv;Mn<0 zH8AZ{(ONC2E>k+DVwo5xEQo8g&CIypjc4;Oo^)QGvk=S6*~5st=v~(Lo;!B#*&4N3 zu1EwSlN=c~qq}g28Pcpo$m{_H^5kD=`KDcUgz&u*Vi&tr>JFQ&S}4!HtJ}zX%v%&L zp1W-!7JYov>7XI@<&@^{)jgA&E}Uy@Ss|G+A=;qe<74%3-=WI4w!2bE-QRy!q#J3N zNu+BjC#0o5aMYA;D-ud}!?Io6?FzMmsiNt|#f-wd-W0dpwX>#LR`Tc8vWBcVl_v&h z!-tGmok(@ia?Wze@hy}Shv9i9ghp|kiJ*m4{TqmglXk&b$_vP1W~M%I7IE_mDDl`# zO7RnaE7Rz|eO6Rh`F-MM!}#m^f8C4M<S)Gy`Vl2uE^d9Kw$atuFcOFrx|o?B#KL4I z6BDVhF9;P5PkIi(vXt4tHKIqP3?N7+!BL@($pntt79GJORldw%rd*(;(e(MbME&UB z94@UFhzrCRGDX1RM2e1mYFFO|BD=V!ER@eDd=oo+t~l6sWVZ$N<##E?S{lxEO%Ryb zd3Y%VYk_0L5n{$XaGnatqQP>J^}ywMMxEvRB-z^q*N4OL`K`B}F41!=7I^Taw^tp` zR`;Q3i00vRy0456rg5$^%{F)rw9_^AMN)9l;~_DW3zTf(N&;*oE9!{N=bfR@mMZ0T z{MsQ^6;P`0VGg?n2^yV;kK-MCY3hJ*LE@VeA>S^{?-NAA58BlKwWZ~q2<Wmyh;67c zpy4AA*oa5XK9vRJ({%-pTd`~255}@eO%VlO;)rYnU&Ns?tglhC_?2b>?fFWSng$PO zw0`nFl}uxNymv^1D2Ij}Z6q=pXSi?8V|~psZD<f!P4WFUc$Hm=2#yCHn;UriHC0tx z!r0%P={gp+orLKAccQ*HmPjySXZ3Zo6zm8Fmqx^^n@jp7F697Iljf1(K_F=#5H3;? z;voyH7E+ETAf8G2_?ZVw_x!k4E?Ru)N``-t6l|2na*~AshJrb%h)q58*%pvJojM%s zG8MCtc=tsNps^shN82FGye0gYou}z1DYeNa`TGsBlqWTD+1%R=?<H+Oq8m<&i=g+o zb>7&ttgoQ^ApOSg{vVsGJ!fUtddjVs`_Gw7Lre0IY&t(z%u6%|6jx<f&x71Ma}1h7 z>Q0?C#^+@%qc!Ym1T_r1oh6APNu(unWZ__eo&!VM^;Y}7W*wW^bGnDo@K-_il-v|E zz5{%V_4(OxNKOe4xh4<MUH7JXr9tgg1B;+q8;6&3Lut(-XUDXD?k~Gc&E8F8W(5i1 zT<c6tyQ*UM)Rd*uFV2jnRh}DpcI8Op=@|bgS>DfjPz;D&*&hz1z0kg&Z;44wvK^fl z2<y1=Gz~E@gvf_C#9ef*`9zpc{c3XwM3EDWh-8fj{%(4IpK@TM5GyC}Kg{oAK!j+Y z=5W{_d~M(F>6^bWLkIC{A8U;5-PnGywcs26Z1|HAkD3Z$GIs{sDahs~a<^_!63dk@ zKX7PLx&EMU<q}`OOgNXe3X3P&UC?2>UT;S~H$I=(X93<Dh3^LS3gDPz%z*-CWP`or zai4XEWMBJ#FT1PpsnTZU=#F83d5^xV)l3NqFsOvyZ-KXq5*6Y(arrBXBwzj9@4bd* zGNgG+i`UGZGfF=pXY=^oe!N=a+(ol%z5C#ARt5*hzdQQ3nO{@2*k)pqcEnHR=*OnB zB*b-8WGyAV*cE+UnxxfN6=OtJeQrJ_@e9bBHRf01UF}M;GwH^kF`=pstysm7$U+v! zaz#u|a7hh;#CC1`zgG@)<&3w2M$+2ueD$G#+~`f62CYlf?hU>k43xum=5x1Zck$IG z0Rj?25+*5vfTC{<4jQ0{n4+%JR<y%9>5jzo=JxN#m#(of(tGnTU^)*RTf1)A_3@Vu z{yX|WyH{vo18D92{LA<aqG1SR!!|TJe(HKmobI9KIW^u6W%}Nk)<0_V?!OvNu32z` zRbDw))?v|&aCdJr%Y?fiqT8a=Td3Myhwr{}O+{q9(v_cX&sQvKOqCU#?ed7muZ%ln zx?$&>K2L<6NJ+5R?GtvA!EF5|gquF51_#Pc;;8Sxt}s@ST=KBxF6+7_DcvF#$Ggvd zRe7~xZL8hFgeY{hP=2pY%_Jp*ZNgG_y6A~xDRBFTzFz%HMEzM+O6r}SYhC{y>u+h1 z<?HBKP|UvI-Fd|WiHs%|`69%~o^*E{tJMg{>%hF3WWCo-xi!Yx^DfTXtk5I8$b|Qa z4p983V=gl|4cw#sTn5&`!Q0=h?@NcjcEiP^bgYPF{`tN13PQOt`emF;u$Ff=Q(ntp z*Hd)5`WlU6&5C=Mt>ua~)=wMA%J6iZl(2XprSi4UAEu|CRWy~n;g6o~_CsHt?Blg7 ze(@7gZ+kJ0Mu+00t|s>vDBGv@an)tieHxSS;&3?XI9ik9J}1UdGta%n^R?B4BuhF( z8%do4+LlD&$P!(a;892-E@OnW+cLR68S_zPvl;0;D`$^pH{y?s6>M6d>lJ_}Q&NhX zD)i*LAlsm?ncp_RfY<1kO-#`YgstPRrTH(feQt=R{ktM+0_yLdj%44MK8j#F=lgLb zWMhlT*~rE1cY{RGbi43#qX#dWk$c|wL#fW;@YwuO3wo?od^#ZLqx*8U4##9tZeV6( z^wZf*v%te?^ye%seN8vg@J;UiG?yK(kC7Aa$E_4y+uyyIU{v366?C*Op4nl-efsHj zus&ZuE9p83U!N|COh)Bib@FGAkzKnPd2hLS^}1JA=c<oR)5l?b;B;0fwCH-#O*T~{ zjHM1=<s6lsbrZTR<WOi=+NfDH*J92u`=w57md>g_arhPT)zLZ4-7=-ew}@W4DVI~@ zkBZNtd+B1BR&<mmRN)6i`nx=ye*fX8<N0;g*In1MirKU_9mD$Yig^p{H}@+nF+<4v ze_mI$ceVAhrlMkx=s(Pa!FMW{apjW{*{)ctpQ5rg_i(Q}R|6T}%A5j%=*E?;^XRQj z7L+)>{dYzzCpVA*yGg@y?27K3FGqQo#&ceV)Any|zP`n70L&K|MB{$zYaz75p4-|* zjJ}=*T^Kd@zf!@BhwIBZDb0DMK`kZGX8IYuecc>0eV%_8!&Hpe*|zyKY)X5zvlLR= z_gzkSPE*!b)bYdpnfD4bzS$YeyYTYqzv1oMzqd}9mD<L_tVXsCXjMXg8HY1(DxS1s z0=R-Z&$yLo?Y^eC^Q|w+{>Z+&G3?OgpL9(g)x+1x|DSPPl|tvgY(SYb-JxAetoHJ} z`8`K%=wQT`v&(QsE#>pb_hCPq=>DBQbw17|lqN!S;zAQL{g@x+Ow41WQTK8sXNQ;T zZzo0UOAqbj%wz%K=I}hHR6tA0Cv}BWVS=Id%Ax#a!EDYt9LEN6hKiSK6ft?shHT1Z zH`@R+dM4oU&bfq41?~Z`mMnRdBDjTd6_r(y`&m_xTY6DM5bi+xn};4wW*uDCgwEm{ zu{Y-oKYw?d7Q4(HU4&Y^kK*iXM{%%r#6Ik!=1qD$%)&kmQ8B(>QvgfiTo2MV-sc=& zIy%3X=l0Th-_suPOM$ecBn~wrGwlePLCFo&g18RXejA*dVT45j6RV~=4UEEg!&E@j zbA;uqx;9}2?T$$d)yWWfkaum4?O8e;jz}%)%95iB4#>$nxDuJ-d0wcp!3RNBvSBbn z88I;dK?uywVs?>4azPL-WnNtC45-^tLYY>qMA=?KG1Bu(>a5B329GJW)Cmchg8kT% zZskF?zBuF#qv&fIV}EOI7f-oNWw?(KAI51z!3-1PZN%B2?sjNPG_i2eHHu}|i9}@C zPnJ<!=y51<Rinr>C5tHgeIF?xHzdn!L%sLenozbARJ0z?aHFNexuyk_)Zv0kMtfzj zz`US-;h4tgza@?HP*3SPTXtg<o}j~FX52j6b2A*W-I)!`aKPB^#aqug7tK@gi?h0K zAw_En7vzbnzZ*lTQ(mKe_WpG<N3>wIP?<?!`M?K)XYO}dJA%$DBgto^`sCC^@l3=a z`N{^(E70gjPWU`R26#%WWx9MAy>wcnCjB06R^5bJv)kq68z~0#SC+GfliXR^Zgw6e za_*gunY=u(>7CCw$i{44fwmN((xqZBQc3wryp>~b2mbUBqq^x<(aA)X++}jYe0?tx zT>A4wV?1+rmnb)794Et#wq14Gtm~4(`wL^-{Y$8`yh{WrcVAid)3`KdEPP)+{N^n7 z+rf&7mLdEY?7N|V>03pro=sql&yO0W$vjY?z6oWhDbI`~r2WI?zv$i`HiPKY`DZiE z3MHlVVdatnq?6yJz|4{fAAi4)bSv3Y1kHIeutiK#ywtl*i-hVLk`?VFpmm>7aJ=L0 zMpv?{hB@A0yToQ-{0-wF(xHXq$8;m4O~Gy?6HFN+j%0}tK_g`18n>r_LNgYdxNXI# z>88t&N<tuSVeCiGmH4L528Os(B4YNfu_=u#ht?pq$!jvnQ#MPbl6Q2HL@{?#xjGy{ zA=k7=lVqSQ1+F(pc{sQfq@2i@7R1B7Mg;r!{mb07JyxIA(bU;wB!yRgnX!xuO&q%9 zO=nxF(HFt9W#-N1IJtvkAznjNy`Ig({U7siqHgStMf1I6WIV{jgU;576jz~?LUMCy zLr8lHJLXLkuKpc!fikl=UE2RHE=JJr19!@41_119=+AvrpN61_h-f7DN7*vP?7^N3 zQfyEz*aM>jV#DzI5E>Z9nX)+E>CobAZyD;eU)20FV+n?=Rf;A_7=(oa@Th76;i)MR z1q97^6G$!FZ(7np!*S9+Z)aAv2=RQPlArm%Mk@bdCQ2Wh_Blbe+-K-Abbfc<=l4Ii z{pP+syV(jISqMP;_#ePgiBuryh$#ge3P?&G_=1QQfe?s5S`|ovMTrv|2|$!B2+)G) zP;^kVG>bw~5hy__8WbFk-#6#}PhX>mhyGWQ{I`}b>M_k08qykA7^RD#G^UZQ5i~3@ zFie3kluZF6OA~E@2xVwS0vKGF%M>cX1XRPL6QE2ff<rWDb}>L^A`51Ml{Ur_36_B* zB$ZG00k3bnveNm&f(i;=V)rlj-w-HwL7`5FfOT8~P=~BA{>VSyZX_y`YiA(f#Zm8{ zZ*K|XXn+Qo?3JQ7U`L@2mc}mKcE*DoVa)bu-u&I>%=M1a5j1RF#lxA4f*2>K92yB} zMTu8wmeS&m8G%c22>~+ZOI@xmW=#I0g`6)Mdc<!>a&?P%SP?GU^C*WMP{6X(*;3`I z#+2>?;Js#G=P=A`{oEczMJoj>VQ7U@lN^N>z=?)^cX3+4iJ+WgUUj!^g~H&1(g|Au zra2QF8HViE?cK~U{oFaJr!thYH|u2OIl0NYVi`<qEi&#*rkd~d4A77@NO%$%l!gTY zbmNXq*7yH4S``lLB%izfs8m0viyz~w9gKawM9<#M_$IWW!Ndal9Cq$<(C6{^b+BB= zwNhRqBizo<lYXM|fd5bB`wM?|m1{N*`r_3X1+*`Tm_L$K;8H!i{71+Dl5L~4z677s zJ}l$osW?fDX81`y<oLd?)|7BfXuKS{>r4eT`(gNxVWGxTul#0Q#%2v1#BMxq;`;sj zs?C!Z8S=gO(`NS40_1KD@oR-;d_K)|d1<m{$>*Lq+<ea<bu=brX;B{tLkcdRx(5h; z-Ck^C7g9+t20acFgpzP4)SwsyqJEVUk<@Lr^=jqROig{95~Ldre0ncjaTUtozo1y? z+&CZMVBukdJ<iP6eXWuBS&L!N)9uJ-KJz;^GPsV87oT*R!(PtqZ_Jn&-Gq?eIOpwB zKe7L1#(6ZjbukC)=<Cy>j1;gl2KP7qm9?yO<-lN<0bh3?>1HOwAF{QM&-JUjZrscb z+E=P_<VQdTIXK4!fxx|n8<N)!CidsUAiQH{eSfyhGco)9YKye*Zu5Ta=-<)jTL6#` zrQs#S50(7^kg%seM=*z9I4@abez1)U*wfr4DKwgBh8<&t`ga8(hU~eChx)g{h6WaA z2S|2{nT=K`45k%F#bNMLMEf{Vk3}0gu)(IL+sujM{uTcfiBQbm&kX|x+hQR9lE374 zf7t$Qc^>a(&p9ev_{n-6f(QmUkWs1C1u(F<(3veaD9dad3F!{estPv|h!|$pxX+4I zS^G4|RR{Tw3?OD?Vqq_~Pt}M6X`qCxEmsL#nX2Q_2{8g;BTEff*qj~B$f61n+e2&{ zDS-onf=LhckU_Q0ls}$N5(DSdx5ixw0Z}T_(%bTQ88(U@NU46uw_C7OK>2=q-~FR! zJNdIpq6TC2|97E()2Hy4^+)(Wn(9w)qjlD~Z^o3qoj>yQN}Fk}mVf#A<CZzy=hLFc zDOBZuIZ*#~!szq!pZ>bmJpQQ9E?g<h=d#yn+pF|X_A)AZ(Na-U)7i-J`9)LX*Mca1 zc}LUneVQ@&FhVxh=U{k9i;_^kdxSKS#sl#;1N-98kJvP?h}Rn`>#k<+tkv>_klUxG zGcy&PyV|xjE0U|#`sw?o_ZZ)R_n0=-6~pe&IKpN#(;#A4nI^KqVT_EitQEPKwQe-V zv&$!~XZ2~H%MfNUx78|4y=NN3FwYa5YPRnxc^TL=UgS4HIJ6J!lq4i#DWB`$J$9lb z$;Wf8K*8@$<_+!{nw+=m40UyKrzkq5#&d`2=Y1v9OJj{MFS=OXa_FQ>UA%2_SY3@P z@8a1}T~}LWtff5UO+-V{$;;uNF1*P=oM&O&HXK+<=^N!6ewylfkN9~PNemlZujRA* zlqVly^2<*kA)^fP9LFTsAcT~Wg7<EGWE@RSe#3{>aLMpI^R3~EIH>Wwz=75v&Plm; zF_1Xj7)_TGqflh&n}R9UzOMG84s*lk<}|Ae9MqOsqoYjrc^>vaX1f!U>vN$<=vNRk zw1NZ=3^1He`kWhXiI;J>`)U+W5Xa{gj!rBNvI;dC*L;1Mj^i;w9Uh=36XEmCmr<$7 z@BOpssz6Z<iYg~TkFfO!z(OWWGV(r~ADaxT8r7s?Un#dTd9rCs$odjvGiCcZodqKO zSn0d*I`OvSR3qBXF*+DPot!`2Ed!>WhM{r1=go|^m!*ATe%Qq3A|`I3qb_V+4L1V| zt^J42f3PTuD_y<*YD#|`y-dU)Bs`6b!-JYh3L2#dGe&|zR+Kk`Xnzl9{U6}NUDSGe zRrJu<e#8%tvcAglT)%Hl@H(54IR>*+W|uf={&M{fm!j<KxpZ`Mx`emkZK1!ib}s2` zfiqyXxb4a`u0~x~b1B)oOjzi>_$z*{oE!N~u(l?q2Q3Y|H}^2i#Bb?&T>BpVB{u<M zk|mPHlT6}mh&*|9d-?Tc&hD$sk)hO@o~M(4I_OucEM(@y4vaW(ul$6=06Dw5$*}r0 z{AE9hM`u;a?8It=UQXL#_YUPZ${3}891r)gyQin+&X{v^7BpRpVj2;u=~i7xH+Akf zaLc0mc4MlEWm~rrw3zG1%jpSl6EZ*{H^^9a+`*_?dScm$^nR@Qq@|=M(}!=T`KN%t zdn6d!If23bX&o`avdt;}l{zGL!wQIb0W5N03WV5TP4_WW%-loU^#;+8w0V2Gz5T1N zx?XaRKPHXU9*hxo)7mB(34);85#P-D<R5nYe8}^8UJRkzPc%ewiB3u)AL+pQCZ|GA z=jiV02iViRuJGQq<o6t@{Q|taEd^U2Lj|~!qc6JImL1B}?-f)#D~39}eIJ$A_v4u- zYhWXW#%?Md(EOlc(QDT3Tcv?l|DWzJM5T4g?+c!vG%*d*?}o>SmqbX*(qj~wL6*la z?AkF6K7zXj#MU}&x7O$aOnVIG(>p@;&jYJ`8dbsl$=(<lkEmu~!N^S{!=(w1*fwbX z<6$Xq!0-=0mt_9q1VHXDUzGR|%+G3&g$wL4%A~3WB33^9!el;}z^X{1j;@=%UAP@+ zsU!6D{r=yhTrGsq*r2h3WqY48h;oW4c3g6%{2HqLmBz+)_NR<1eioHuEF~28|FYXB zjrm|pEWO#+Wpl2$Lio?oJGb9<t0`M8*{v3sT$pBJ{1u8^TKA;hwpw2FzaOI$ZTD^O ze;MVnxm{B?rv0&{Eu`M-w#w+JqhgZEMj2n|mwR`dh}$97OWW`qZ=<7iXDP?AosWYQ zX#woK$5fe;984;(&H24QNL-lyKS17ac0OLXxxPS#Oqsm7b$99AKJ7X!=iA2*@mt2e zYh|Cg@LAS$wk&$gv@x69ys2PB)ia}~avg6xL>RhQ!SR2a3S;P;66j<ly7}G;Bfc3w zzB*;ZnNmU2ra|FSdPx6fbJ>{eK6RY2n{WCyd0s^;sI7#9e&a?8PKgEgSoO4+bWH>M zp(lhekqBo)pmbt^p$!OkTkgrh-gTD)ub)il9V|03F0R%Iw(EOoUIvnsD&ZVCc=sLF z!gbSLbEY-6KIp@Y;>#Y7Hcj??(ey2N(AVgF!!t3najufwGcy*Z?>*iP?0Rp!t?M2A z6=9i-dE~iWYyPM0x$&iMc`lXf!+hmzZ<Swry-G@2;jq6n^}gBT^YVP;!!sAXUg<@X z-6>x$B`v3QjBwe8`Q82x4cpZ9rqA{_vhp$4OZj6M`J2uj-p){;geHi7o#N><DU7&# zM_(Kl&gX|`ruF)|_)CQPDed@k8JUbER-F<nZsx(6nT)C5ZrXg@49?P%qpTf<W-STg zG&=C=m1C>@+zBzA?mwV_6Wt-5f|L8R<NmBFS&{5_Yw*4UPccl%b4AT2*88UK)b5@K zM`6&NlMb2Kv5kHQt0mdh?53WMo_XV@+4V@dexFPiyUHUxYcpHab$Cnr`}Qlhw(K-? zOK#mRo^r<vqVZ(&v)~NOU2=GyaZGS&*KWtHa=&Dr?DxCbEmn(Ww__;W_c>iOz{4%F z#xZ#3y7}b!Q*|$R8JUUGWaVwPd-<5^>~R^Q`}SdWBx{tmQ%daI^qq_!-Q>m<a#3}u zaFx^FzbD!j9xrtJBIuIH(aKPXM*oiMi(R_d_ei-26Rf3hy6Ea|yCHleJl)9{XRWoi zkaqDInTg9;yWJC0HZByV3Xigy5tbfy8?`atTc(S%-<N8g_;c=-rWe)irO}HF%uHX^ zoNl%kX8tQH@vK@brPn!9x{XlBc2g><_h&_GTwcDB-u3V5{BU#C-(1<xF_smTZ1>Xq z<*pZY(}`Z1TPwC~zdW<cWmYu8*H<a(Mej-BOYY|yWlqbq+ezf(u*}8f$vzpp;&Y{T zuBFe7FvaWHxU&s<B#h5%feB>oiEHl$CHX4mnL9hK9kPUuA-XBYdBc|6wmp*3Zkm3I zJe4Z%2|g&k`(1w$>Kd$ay9q2yo}D}&4j#mt=Z*}2hI3kPnb*R~{!GI$!)&{^zehYj z3+IPL>iJKD@Si^IC6{e5#fD}uFE3Px<L-j8^?o?MVz;@SSF;W)qbr@y;pfEH$35B6 z$ndSHb=3l!YC;FXPP4j)W}7PfYu7r#hU_+76N{;~b+lUh$kOUo)7b8|>o}y|6$hHp z@~uva7OfkxUM}9NQtR&nrunHkhUS?jrcY|+zA3wo5w_?}Vpqj+x@&CdI;Twzi>~gv z>$v5<>+W|>ua#*iy0cP#jye{hol#s4oac(%Db>s_zE|VE{3USfJ44}l32i7snX1-r zbnlAnisyY}oUOu~I&sO|*BU*u$97ZBRlfJu>RVT&wr?`qtm5OIkTBU-7~Cw@`xX73 zFI7#FahkhmKWgJ$raErMdv|c($IZ&>a@n|xv)4zow`qP_Qs+t4_Z7pN$SF<+lZ~rO zQ1Z2{tP)aEyvqc-F)&2(lGgquXCrrVDs6nJ8*`@A+E%-%Ty&LZOt_fqihcMhOSPy3 zlMT6SB3%(Yppiy5(~_T6+v|r*G9DyuM*XyHs#`b7U6%Q2Lj9@Uc`J+fSB6+a>06{T zGYM&guDszGzABHcDSTg*dvl94vU<))PMay|ziMGuT`s#R-+IRvnD4N@+H#%tzEK-q zg`4Dt&15oP0h5WMqzh9%N%KD!cj<l~(EU#z5>At~^wHK^K&fpLrJBggGH@wn*gwDV zo6eE_z&P;XzU^i+f*7uqbU+jyKAS<kO!~99^5aR-p6m+}2_P&YYA|(}YHAp@tUK$% z4gPN3JWr-WqjaA#qlc%9lm6${@A!Xr{3-tf{vV(F4V=km{(S7;_Pl<E4muV4VITHL zdHp`#d!Hl^?S4`Wa}57(84yhapY0Ibzq6~&`A#P1`x6I$YlphtQULx+K4}QO2l~#Q zh$MN3JWxyi_cse?`Jd}mN1t6!*{5|U*Skg#z|cDbG`4@Q{0LBCfc^cK!+5H195Ycj z9KbS$u$W|qNpw+CMZ!JWQ20r%Oa}g^Z_@$)XRidFgP-zsb#`|j`F@zFcKuKPKA+~; z)eOosL5G8$LP2<rrn1U~5{L3D_-)vh7=tr1OFkwDT^Op{MI_*ZQ%2SzKXd&5JYfF6 z^*;ZeUOfFDDR*SyxfrHk;>nnF03^&E=abNXtRx@$#pgau9XkmH-<SQb_sRXiy{jYr zNE=yV6H)<UIn#H;s)m2PuOrQNOcx<0W?)ETXAiU4u?G-8QRF`7OV$vFc{oA%513tm zG!_1T`}dBAb36$NB-BtqlO1xz+<Up#<NQ0$BKY+OIL?yp$-x_ru0A(}bi+YILE2J4 zP?sn?a#AeO@^}<>#WwtWwjMW5DMnDjg(%unbDP9oN5Y^sw9Il1bVN6i1cIP&4kSdd zt?ZgY3Tz>aWYnrb-xyJ-4Ftns4rCdKIWUT9nt||;NZ6S$+=fhOh}#-aw#+whH5f3` zfvQJCNlDQDKi%@*O6eiq>p@PW!hAw8h_qvf*BHb}B``T4kR^^9DE~bI1H7<?)+&)g zHc?4%Mes3GMy|BqpED)5lIHf7m?aUgxvVg>z)eidmWIY@yoRWcK{!OS5!zFF$|2{J z(Lqt)jPr{Dq;ynDG>9RD?LsJcKLwe^2MNkS8jl<YT|)<C6QV-HwZ6YS-iPnLk`i7U zE;WW(X$|P*o;_2nYgC(YvYbPS29!M~fdvTViUu|&#eI?@sRu+5O2bJ?rx$#W$7MPE zy|=Gmo<WeSYQ0H{i;I?p5iti0q%gGrv|VPV5(^evVJa$7&>@FoVuvHXG?M~zn#SAT z4~6sGDf7G*D43Z$Z6bFPgkn^S)rFLr15<=x4u;AuI2dfZ+$b;@tpT89jDis~SVqjb z2we04(ZX@VQAr^L1u2OtVY0CQe<LipF7C^<cXVxrzXBT|WKj($hBqV;D|bX<-BkbK zOb=^Tf~0_zGB7YKJDG$!7886Mzz=Xqqe5oWf?(Keq9!IOswN@`gfs*j2pD)7Fd?MU z#f6+9y4#vk0DL(8WPPL^4o^4|h3Id6aYJt7=av73Ds3mx8$qjTN~Dbl95@<ft5bz3 zX-YZi#TC*+AXzqSC7#g3bF?@avvA5l%z=hLEd)BuMR(6lkgq_fVL=Q{0FeMV6CwE5 z?*gVs0oF>OkJl)Q@!J#ud=N7L2J*wR0|OZU$NxhxIs;Qfu)Xe=1uh!Fa(B81N_HQw zXDT(6$FxLLj7btnQB4y}8xwO{t#OKOBcbIf)&6I;*=&PHi3yk`g@v@CZ18gtw(~p; zb5}9HdOdJ*;T2mIaikYf%O<W!lTbQ#INgb^v!oF>|E~u;Q*DeO$!8D!3QA0g=W`XA zh{6!0?l6!suM;{@!sJo-ckfl=c;epXTx7oD52VGMS=6r`eu-4gbzviz(8Wwe^oSBX zG-F6zp>h=InH>hjIjQT$Cs+uVQfez(!==_;!n<Lh;!KeBz~sGULtw3>J|IOjDyTqb zmzQqnY$wFI34FH@-&%#gJTE-f(G2DCPTHPhbPd-sK{~mJ(kz7)CTP=x#c9h60fEoc zQgA=u`#33)L(t@Cr0SohHCsU9G!tN^40Em-O^wCo4iNnCDk)I3L}fjPRR1^edp35~ zOxtjF*s(EsB4}%_KtiriYq)|oVR3q7m51Lhr_B@&+D^FBMGbYqo=<La<=k%`Q#F&X z=hO|IJo{*E8ye%&F|Yql?6sMvQ06NYf;(&Pp~`hr&vY@x86y-{&$4%ACLMp25@L*L z1#FybX{N!#$%f5KX`f_ysQY@x<rh$6R8$x=OL3DdV9?E33T{~vmn<lnnw!r27$(Zo zt2<$?a|bLp73x_!u!dB68wepti%_{|q2gg#@%mS6HC*U4(*<X}gQxyNm}GM<-8LI( zH?m^o(47vODDZ~wT97}>&OS*q1yw1yd}FkBmE61o1&k%*M_rI(0Z7VXQpJrL@dAOJ zW#*yc;th~-F+O+T`b_1QiHZrC)K>f?WN^k0k`F3u83-!+F5w?CCS!L>lQHQad2hu{ z^WrZ3v3;?q4}P&75C?P<LtZA$mtOSj$A|5946%D7RM(FDQ+I6NLsdBm5Ly|WsWY_b z>7lbX6_D&T;u|y!-Y5y7o4q$A#F+^OX|=jHX?C?XoAiRn#H>JQnT&y!=`~Ui82Z#b zK!4R|;{Et!QwtuL(@msFa^uyp>L)Z%RWoc&ci`p({zm^q{F2fKPjEXJbd-qsuz*KM z?DlaBo=<r8zrvsrC%rpYh@f59Rmh@Y`ky92C4C17+T{?&voNLFe<VX4=__e{AvUY9 z^Qo#EPhXmdRL1OokC=qlwdo*jS2*m6CLWH)JQKC(3`kjy`C{VszRS>K3>n~P-9QUW zmXjJ6^0EwKkK!I6Pn{?UXDwyQzno1GadiqmFjV4bZk|sNT|~c=s{A>L)FYWwoIe=u zDvFYlZy{q+!r)_rGODU%Y5czFCgEEMax`|>98m6DO7Oai*=z6YsfF8AB-tQz!QzJN z5YtrBa!12Fy++@Jk1<Qu2agk41icJwLj)nPHosVuTu1vBpB2L`X3e5$DF_3qe;7&) zLWgBXNzBf!yick;AwN5QK`-)O<(*!dt5yVk*61rohhwW*=FQfP-fGX6bTl1X&qeYJ zt}kbI6R^z<#Wxf)IX7dO4l^8+oZ*v{k!Ez2cYEPq#r}*oPf1y*1K^h)CLy{*Amax@ z4TGk|eh)=|dUM2Pe)%e|na&zTsAm#q#iK-4O~2xCdrbTyJ;q}s+(X9P1L^T3Gd^xq z_S-==993nx1TR%ElbCPy5l|9ly)}0*<eLrer^<6gwhq%l54-3j6qAR>jwVunLWId4 zXU}d?T0xoFGsTrx__sVIXD>n14+Y0Ti%F*)Pv;5GL+TEl_kZWD7z?)!z^~;}MB*Xi zoB>2a0~c_L*ppiPC2Ilw|3nQVzNKSH_i(NH-CRe07vDs|MC4~N%fj19%At~Dif9m3 zxH}EnCJ5f+Pa7obRu!`0d*D9m9sgIy6H^+i43$jFDz5pxU>>8Tf*uTgv%gL&;&?`M zlO;ONORsos+HHKv!U{#YoEkU!9QY!MhTf`}0^u+u7A_&rm8UG(@K7dL+9fH(mTie3 z%^hyeGlLGBVL}#YJ>lg3+)loLojU@%sDracf2(rBhbd?`1rbFVe)tuCS*($Qwvfao z8UZ9Gz-a_24x2>IS=Q(o%9B}rUU+S~bbcYx{jI0Y(2h}Lt^qo7KtFG=bf_9LV9aV* z@=5PtOk`3*1?)dJ)br85sm`Uq(ZPi&T10y-2QQm()g*cO3AHh<1Q-^RMmpr<9dLhD zY0r-{k3J5nJX%z+%^V6`TGJr8WBV&?DMP$I3C_eRYD{C6G5^mzC1U-Y3W?Z=-r!^Y z4U-Z!$Z+BmL=C6dZ)mX6$xKpVQD5HTNg05xL2)2WyMQI*auA%yFqDlN)E^b_U|sPz z>rOr6q9FGo{JbZlu;ZPE=XMN?0T|R2U{FBH%nTsQ1fUVma;7GocZV{iwJ{+oB#8-4 zRMG!u^SDTmx9zSu5roS<WQGyLuy}><f>c3T)WZWW&Gvox*d_#+&-oA6RxqG(6cq+Q z_mhAzL?PhzFOxFFOB)TY)I7D6hAadQ%3#Sj3>(?uOqkXundhCewG)1lc5gE?7{{Gz zv{P_T?R;~fdtTD?9Q|rx+mW0CFfHIkT8&2}J1QXK-=t_316F<BV3BSUOJoqbU<qk6 z>-`D=24C+;`~Qgv8%PTVG*LbZNb7hqT_+Ewp|<^x`W}@0yg!r7k(e$K?#68s&oR?J zZdq&~8zCxRFPG{iA}Clf=M^;RaFdcq8i7nWCKFSc1(y*B-lqg<77&8%jg3_SR8&4# zNY;>5B{2fplU#<>Jn_KOEhk`6(OgC)1IJ+c;A=8qg~mOhfgB<BP3<lbp}8bR0KYRw zY!e6c{vr(`f`n&een%1JJ0>GziHL$gb@W1MGVBm)*N9E31J;CM<TO|}5ywro+aPvO zXWTLHLZnHEe&v{MoARag8?R)XIS7#>2HeMJg9kyok^|r9Uiy$8eYm17fcS;cFpE9X zENK2jegz78F`JZsTiNQoqG3d>zfCu@9Y87eu(BF8H{xVC5!*XQBf+F=T;R197%)*l zCI58W3)a#ExjzlgT$+6FeE~Z#)FTFx1`7$YBS-@tOeR_EklukZ)RPp%$R3g^+O%Ms zCo&vFHXDE(c3yo1=>X`8S&Cf~>kba>APMG_JuI(Fm+EAKM}&hwd`fczN`|2Kl8#SG zC4I#BNSwf>07M9NBOn0lCgy}ksj$Hzk${olJ<?(>pb{b=E+v8vDgh!K2>Uk)NDKyX z9Gp?L?qZabhm7INTgm+#FxbwgH4=yZ3;S3PiVx#}O+bw&6A42}f2MfV-7qIbgn<bO zs3c>W0~s*{92>F0`l5)4gs7u<n8wK-k|+732a9$iLWE!1hotGBbWyf|-v&sL`Hg?1 z*&+_{wspoUFaZ+xlL-n#s9=*LNN+$Lo-B6*5+w>9tYumRIFQUOKR3@A1J#;=plJ#~ zhzOF9ILMeYv?UaMrRf3*Sb%DjOt2bnHkZ1>mP;>P#KO{mZ3zVIguT~{*c?a2d4tb3 zgW~%|I?|m1<uDNe{ZozD#Gdj73YeEjyh@%&eB;pt^9Be0WWQ+Xq4y2~UGIS9-It&< zYCV`!>r$!rAwSPaS2+S(erdq>*J#y@h!OS&viYE9x9B`Ecj><uE+&9Zs%Bu8A;h=d zrfdT;sHkb}l!1UH_k1ZBjR)M0?Y4hc?X77DEf9MzkX1MBLzCzZyN#TPWRWTqzu^84 z*64N+6Hvrt;9ddH=*HFs;=v+xk=CR?(Bqy6+r-{K1BmT%=w=3HUo&$V0rQ~aw3Ke> zh=F?+v~+`@x!T=sFkB(_2oHdaQEyprGZJm6(S9Gv;^l>)F`_jIOD31>Ebj>Yju>M) zy%dqMAnH*jr>OzGh98I2hk$V*@JS*-i6EwM#Q9G?yaDqD@xoqbwj3H)Aeiw%>z_1i zh4l0X+VJz8PWCmo@a{6<+a%Oq0Wl(yAS{Q@tlD_&DNk3~<F}+&KevqCbxZJot|Yc2 z>^#696u^^pvPlZA(Fb}8Ao6$mHx)9rNMj9*6(O|QCX-&A#RLWh2xbT-2@RP~Fyp5J zc^!33ZQG(GjO-vT##1K{?9<6Mol`rXx-z|{;kNu$s59@<J>-?A@~6$z7Pk+XIF4G5 zl0zg!<~d{{lrgA;qT4Nf2@rQDxgtRphVj?yu(oDHN!&nIp%t9no7X8ETK;~{sOi#? z`FrN~WwP2_W$!c;b=4F^6$D3g8C6hE1GLf^ItF5@BEN%)*zELA7<mj_BWWBn{B$X3 zRx>62P-pe+0q`^<Dg#SOWm`(yKFC%N=r(E)RQHaV@*{w#7|JN5lD0;3n0>XqcGk@v z7;;ZSL$umo_RJuAP6fPQHtU(;n$X!EZ@p^Q@7JI>GoFUq!LTLn?0lFjGr~VcgUfD@ z73hm1QgJ^DIH?{&ZS->HAU&!ZZL{7M&Ht(_G}K}>sm3f6=J-)aYm!(YjrY3N)<)#; zizXo?I@zfEUYJwZk963?hNPK)LxFGF*h^Wums!W}<@*1A%JhkwhdRV?7~~2FL#EPM z<g;fT6;R0x0vLM#r|>xznm!1`4<S=VnMA-75KIIOrB)S3Qv+-E;w_TcdpOxL+1?K# z;zgFJSv6t)ANnE=V8U~5FR(9f8DV}cRGS#Pc4>V7394;W^2Njc(SlKmx9peqg<lq_ z4D4lZ@%HfPTNuwQJK_q_2Oo%4Q3GkKhY+l0PKIHSZL7{Ix*5g&LF*%jgL!0*qnj%# zJ2`rX^P_KVl$ohpa=$z0AzQ|wko4=5kWQc!QWxAWsOoZH)l?bjyY2_}>bm>!@n;7M zJ=8vUm{H_<jl0}lFVAu?;x#^J1QJ2gVail{fDDvZX<<SG8o_F4&~cqscf|O6A0I3x zN9WrKbOply80*KQGKRRjQsHSTV|-PWGtkhB@Y!^esk^<d#E|=($1L#^k$mwxH@`#{ z4H*X1A8*0IRt%m$i6>LN+#4In$aiEU+EB!nsEL>uR()&ag6i0FrQ!wI%u=LFA56@3 z_?DJ^+^=b-X(p?9bi5n|_7ieLS@aaC``XSF3J7fP!eu!t<-dD4e?4_kw8pM@K0)W~ zm^IB%*%rRmPuAfUc{!Yx8yGk(&M~qMT`Zr`cevX`%le<Y%yFhD7JC@LHK<J~J@Cyu zk@rR-R|^G~!UG*y*r~|+lhHHT6a(c#T^oXdj9?Vgh!9%>>si3!q7Rh2;~hjFfUueB z!~6*88#o#l18uMy9g&|YClR#dLk=}ZM)hfdav3O+gfNW}_C$Z#Xe+p(mB|x9zk)(u zuncLxEfC%^TDEeVAqBKHNMbChT^mLTi=+^bB@mXDd-z=&F)M8h4q9x6pmC}cXChD@ zJ6%+~x^uqMw@nsr)c4=A_rt!Whj-i4js4@D*<Cqa#h{e9>b&`q{=5)rQ69I?fcTwv zn>}qKfxFR>5`-X=+(>q7n;(gxTVaRO_aCpv*t*kc2r8I+&%Epm0Mla$54mWObMk@C zgmF{pn#IJKyh+lrqi};8XW1QFD3nVeV_+Y#11+tL+C?xBQ4}5;?W0Fd*10AREOWT{ zf?+0ZE4na;6ME5_Xd&}f#<}O2*PTM!R6ylUC8cn#LpH%6dCBl6yjXL$Y!1_Ck4*v_ zOuEaobEq(kN)ZV_k2O@v6Gx8~Lgf5O_4F(j@x_eej!B`QiM2_LY#Iz1X#OYE(dgJ= zW($H?;VU?vM{U|oP!>t$ijQ5BAc-8rWq&(I4-U-DVF``etS`u6vb1^zRQtyF%MtG5 z+tB7akxLX%*)mZSrE7PAKTr5%F-m8aVn&?$Vexf5_madx+qif(K5R091<ve{&Lsm4 zl)c)kXY2FyEd7~4acbDwRWi&8kk+oh?0M!=$<f2FU21BtPFmc;YVDXaZ%LR8m_P8f zp)(`lM}=gSl$mU^TmCd<cG96?uR+<}5E2YkjfR~i8o@RsR5~pRj3G^sf&rfq>~G|r z=&LoUU9G^pVls06G7@9keB$~cogg;Ao_#LzYBUK3(;zL(){xSnU894wp3@90FRh0g zCHEOO_WlV-72~xY;g~)`1BO9)`UKv|I-b?1viW;Z5~C8<(cy5?O}9-;_C^o=LBBWS zDfvNvKij8ByFwC4(mQ{LugTcqd?zipa)AG&BmHOiuvPz5ug@RZCO{wSggfQmAa}w3 zLIFS3A-JFCzoK->6A~x&|DPGW$$;PfZaEn=!f*Aik57@Q_QZiTx6Qnk_J_SNVu9;` z`9F7a?Ld9|-`_uf_>b<Ln!n@zOxcCP7Zm*jnKlqSguzT`k^X1{h&vzbnXAGQUxGif zxZ7F}yu6zTxdI>fI7|Nc`|iXxv`4-jH}gTt<3}U(=>JBN{xb}re?UrUUvCeWq!M7w znm|9t{a(iYl2q;{ARo*?7_vzJ#kn&{kF)&&>|;PCSdAD=Xc-0v{+hf4ql#+;Vj-Ud zIUE6B4i9i?Fyi2kW2$LgkcgB1Fzlb#qd0s#Py3}%wL5Gxv9BiLjPa}B@B_d%Jb=iW zkcB!N0ek(v=Wb$3U05BVB4`J(5Wo)O3E&{W0f49afwy?+=wcx+XuTf_ZI#{QLjcC; zW4JN_j}l|q!RRM9*}Qtgl1ZGP;P$S=+8m6~ANK|Vb|u>odR-n)PzPe@FiOV!aHVmJ z>##l27o&g%9f;cSktP5Iv?X0fpFtLK2d#J}zf^Mpga>1qAbA->ml5$7Sa=|vPOufM zf{I)?IuosydWWnuuZcn9Z_xBQz+Li-p_Ds+?f*-mHfB^R&TV6Xxw8Qaiy%6XahneM zj8(3NVBvm1y`}E(@wOJuQ=r5WtUwGzyA>Qh2G9Eb@HoVthTh`*%~RH}U<b>;tq%Q^ z9q1r^K5N`I8}cxIUt(i_VKB%dO=!XG4zNSW_K5%l0-8PCf79hhi9|?o?LFvk!vOt> zudIJ4{xM6LuHkqyMiyEO%u`Uo1p!nQ6imfQkp8;kprO70EY!k-Wvfs_sXlkk82*xc zl+UD_V~b2L6?mTf`uPmO@<$z=e;#Z46uAo#VCoI^WctT^`tp`f)r<t5$P=_M{jvU^ z<OEFbL)acLQ-`~j1o%b~RyfgAa4k4V;_o-J2G#N9ypxvT#QWXs%(7(~k8`4CJA(-{ zs-U(-SkV&1>}0-46(;0@F-Z?|qvcXq+u6D(=lrqs(oL_Ov9>Zv3VV4u5}kyeMgCBC z^Ba0pJufdL13e~>_6_XZr3vUyGIh)wKB6OIi3})VW!j?H%LqeF2yLq_)fSmx(LBAw zNtzMFA~+z4+#ix_W)ou35sga_uf|No6hMD@ld2v`%9<#%BJm*kr<MW=&tatSOf=gt zV3CM(LL<;bBz$4o6o7I)5yd8-TPDHi7oQC#?>E3?2P|(cn8QKO3{a#xl%VB-w}M1+ zEQ(w)!pH95I7&^l_Av=80TO61K$Q|{Gz^d}Awxq*P{bKY!4SgCl(bBg5KIzl1rmft z9^FLKLlE@oX{I2EVjSlbu?+(f;xv&JR62B$OR{JPl9~x(A)wM{1`H5LKtw`Ng)Brt z5hPSe5=#X{ktGC9V&fA~8}y$K^vyf{AIxaO>wJPt59v@kDJWG!@FYGM2kU)bt>N}R zqUG6&vLV&m{SD>Qh=&tX$@PDeLjH6e2b9>oP!cd;0q}Y={8U}wM-_nhGl-|{5U~=b z)WS}}AJxIW9s}e-VESXL2K9J>h9LlWGK+wB5xrrSdp;Mm=kV;5N0gkRN!~<xX+VO9 z0hJmZ6}gypbj4$ZEE`OVoBdh*GdZJs9mvTzHGCYfcgE=hf#9l@RyxQn6-~h`5aY1o zql*r281+&5nas@HUsL+?D_MHfe|ugj9yl0^Y~~jv?cBt0(TGr<&n)wk2{tRi=KZMc zKQZZfX)W6{avJV!2!!143=?x0r|-z+>5N_%86$b)+!2CJLdFG*63{7hP8c2gF`;!k zS=c@n$-FR~#~$Ad#}|x*Sg{9;8wnNgxsdei>~y0J2;?w|D2XMv=S@nm){&QHL2?!t z5HUgq1Op6(ArlZw3>35wM8!hVHma%(vjr?mMo(B_ypZl*&vZHYXWwPf@32V+cUMPf zePbP{+0Id!b7>iaqGDr}vh{$?(UCDYAz|zU%*V_nd;54+DgaDip{3&cMK$ER##6L> zSRi*>am?lSPMUv?#Of2<{rzlw@fSFMwfr9)a2^9BC#e3D2hNe%W;SCoJNHh@S8aMb zyVnjYvw|v=f{2S{$|j>Wuqi^=j1q|ehYoBvULu&xZBW!eb4{S1pG9b|l(TAtNP3Xt zr%G~%q^qCJ7{vs0oRi?PB}<<J-cpl@K<$9%WeYN(sY?PXCi;+IAkmTZ7ve|pLmHUw zNK3RxcfpDwtO=F(NiDJB58nH~z4)+ILt3x|ar0-eAs27+>^tTQaw-SR^1)9i-aIHl z1qhdJ^kf14&#ZciLKVayQoojEe1v~2oN~=+&oOf!dJrxQyW|jvF%6xBQA_@f7`YF~ z{pJU;?2>69f)|(B!Gkt>|F^$>H`$5*Ee0J~ZUt%D_T7+C42co_r+R(>JBJYP0P7_% zHc){C1O8(={KJ?9heg0UL!cT3je*-$OYS%X+Mb8>ol)pMfSryw1Vkqw2PeQM0+BJy zBk^Avbvuz#9>8@2(u9a;<?;WhmzEJm7`uwX)CrX#6`$7pZ=;fFcnI|6av2Pv`<J-2 zUT-LQFb1~Zc!*EUvo=8HL{(}gRndd@gJAkd-$zA2@*G@DM7Q8z9GAm7-znos3ySXy zFnEEp<a9!@xC~i9djdl0*+@(ydC7!`|F;CB#0x-u%e5epuxS66a0vB!jw!-H9sz-) zSoMp5m@qgY1GqFDl<|}+?@z?^2gdeBS?WK7d*1V3Tc2M5$Lqg@p-cJ>K3zNW1q`E; zefHs-ah1d&+$TtQ6hFb{LRO))9ITb8D_|UASa$>;zbEJBAFWP7gi%E;emRs^OIpKI zRON-g_x*UFp4d*N;eFxzUKrw0NwaS1XeKYxTOW6q>3pO*e42uh{i}MD){GAe0zxMK z%tX`a-j`)nQKd025nH*86hjCx`Z|*XG}nS+%zlzXV3eHL>IW3u{8rra^lj8>sU0Vi zZCe7y;S%LEKQyMC8R`hgQT>~cepJHcGG!09<jd!~1g3^X?#O-<?EBAjZPR{zvzo+f zL>6HwZq4(UeqZF|tD6-lG-Xc*qs-08Wg%U{^9(H{rL-!QX5eX|p+dtFu+pK4cMP?Z z%0A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ȶ(IL`@gtss}C~ZoLP%x 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%0AnphEm^+Zl&$5=`BxebDz3KXVC5_q!+Fl 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�B-X%JGECb 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ƄMTmg<&VmGgyuQ`{y$?sS6?9=7m-IEj4m_5yi| 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�&4=h~Dq5avRvV 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%0D<9)D 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
Ut2B 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�cOtTXo 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%0Aa0rsNT?F3v(C(!Y{rnV>Bha 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≷nb{dKcH4M?b%Q=5e{5KmEYZdTB_5Y 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≷xGrSA)yZu>=N8f4h|3{`!pep$kZ7@FgEKQS8B&YTK0fbH$#DS7 z5f%O?A)pZQ`LsF1Hw<C|GD#w_k9=Y8J2vay+3t4cFJO^y#~Ws5XPg|~#6!FRiwp)B z=CSQnjgE%Jvlw8pg^i3pUD`3@R*AzY*S{X~k?ZI>>EvtRc`mEYyWdq@+FhfQMlvj5 zzJM{wC-O>RV@UJ|77-dr4HdDx8r8c?dYLxNF^d>)S|;W<rRK`ll)Tw`l=Lo%&Yjie zd0fh6EnO~27n?lWw(i+pLJ(+hgc>0tO*ERL{h%8I3@aNT$i_B(a*mCm<RXn~gc+h5 z8M7EOjWug7HZ|TajM{la#8rb7uwt+<s|FCk^v5OTeJ=)&d+Ba&`Z1qN@cr)UFKv%p z84R+)udueZv0`N|*R_VEX{UR8b;)(RD=qkTR<6A3c3PQcw228!8fRD?BL^bRdD>z& zt4k|@C&DzU^yOw$A3(u_vR_;}?*H!7YrU3+EVR|lX|uh30&MBUQT@v)cfVO?B5(}C z18Xz|U@E$+^zPhl%rPAYaoe&UO2wjSq+sFMW0NJlxcb}&193(eV$t`<qVSd!1AqsJ zDc#4}%+~i@Vcec`|6e~h6dordk*2|2vFU<jbN#(ohJ)Kqgn<DQEHnVvalp(mr1@<B zQI7m(2<cu^{I+#>ybG~UxeghRt<)(G5cqow3Tz^c*sg};B^zlPO@MVL!PVD*sjLvo zj;Sa*AoUj52spet15rFNom0$mCyj9j4kn?pi*omf+MjC6GbR=o##H9|{Eo)AgZ-qy zki>DI>Byej&zy27f?E>|NrmPKW)#K;e9oe3nPF4udVhlXYONa3@Iez~T?jAH0WmS4 zDQc4#B4Za8E0$5uqTKpRL_Q(nMvQz6T4CHKEisHN8)*GDOn)^y&mr=7ym#jF>T&bc z<uaC7n^Kt*Y8hiOk&*polh)a2@fKA+-(uXEe|ze8ub_^l$;Dnq9n8B~dRKMbME!P0 zu9(Z-zV%#|^RXEdn6f!4aUUPjOhoXx5vW4&qO@`t;sHnoD13v5r_yh&tUMvX2l7|s zU$|#Ch%KxFj@Jy#E(j8&v`QRGA&Hs@Zv^1=@_F1x-KXh1ZKcI5OJdUe0^G&0`W#Wt zug+rAx%0kr3r|Cg%<;Ue=S6>s?eo4D=5{%(Cu<8GnVHtEyB4p8#j?z!Mo0X%KjX8$ z4{dzC4M@Hf!UjfPNtBN}1bppfx9rVW%ctV3d50i9J(^@@;5}Ev$GK~#3=A-O1EgUH z0YlNwG2uDBe%50#+j^Xb$}_Q64=l=lwi$+Fx|TOpgL#zQhGCfALjG=9Ai=Qs6dD*n z4UmHv%?%It;=246v9|M0Dr;7;w)5tH7*zWJ`vHRk1`7rZ7)I8Hj2K|Tuwg73T$b;R zJhgSyY_iK{m6=N|jcH|@E3MmZ)VXfe`&GK?+APwUnuJCySz_Bw3}d#{puL}!H6L8+ ztw1`@j&eaW$5N^!LJWkUl|(!u!{|fi1d*Bxh;s((U^x-RBDpj*a04NYQ-RCx=JgyI z`J6g_4e7zg{oSr9!1<s=Tsz24Y!5WNC(vwD`3O%>SXMLh3(!IMfnS)z<{w(ikWhw( zTPjE(P^$zP%GQTHp5*znO$hojW5$Zb>OPhqwNJ(mZESPd?oSz}gnN@7G*&MW>koEy zuEQ(hO221A@*Nt|ctK?Q-;#bo{lX$_KJaNkdc$5*p1L|KEU}VFB$7!ak+nbu+5jzP zUy_$;wEAP_k2&~5<#4fL!`&~uj*xE_F^p4eDzHBzTst*Su5E&?Ra^%aD@(gw-*vou z?HABkeJ15ytbHfE#v42AX7XPXV}}bGV|m{Scy+c0g;z1^>N0$gcNc^qiwZR}LonVr zplmjQ13}L|tw{+CRl(XoeNdeRruAjJ3w&nc)v=e{F*MB#l{pt%yPW6Kdc8?}H`}+> zRWhR&Cw+Xkx6&^JaI$Mws?x~NW@@h8YGt}+Yr56C(-72&5R4ccP)~EwgeA&j1_Wr{ z51twS1J|!+=N*^AuzO;06UuT&D{j2)iJJ=Fv%i=b+WPD<yw4*m;hvkZ2OHvczWL7R zUjuR{yQgKlufdCaTr6D_dNM9eO6j?R)s(i7C}aVVT_*^oM38Jo2ZtiXF_6cmRtz;b z?-)Tg0&OM7wviee6&hjA6s9s5^v}><2gn)_CXaD^=qK8OZ&5aG*QQmsTZjq5*WzWB zub2Yw2#1x7c|KGuB19LXqE2)K)l0R?!DZ@pIxhS2>3pTuv=^p#{Av0c8!Q`iXwwCX z!x*r^aMi=D=g2S_q0J4<D_C)M2En*W7!Y9rA$tb(IB?{<Ig73G<1l>Av2nn+afE<i zU<0&IsYGsuSk*~YQ13%oY4H-JM)176xhhoL0S3X$dEUORjU0%td}uC~YHG&TYpJf< zWh|RDF73*!u!y!+TlGGk|5y8Wwex;=DrbT25UN6$Nksv$>%r#`)s5~ufJ{uIk>c~w ze9U*}VI&L>jRc^e91d}%2!Y-U<GQvnBM4fAhES@3Pm2sLmx?}*ptu9X^(ts-jIcvE z$rwe=YY}*+Sr)hw=eU}R3`}?BmSyW%wGerTDY%AD4J7cnxDNr|P>50sLvgc5le1#+ zCn~vEvcz&-{|R$f!QR1)SYsH$!qsTP!v+>#L!W0ZOT^nU7Lpl;=K!OLymbR$o;HPI zLA%m370r0pGCCg?S(iyRBSzU~TS<(99Q8*@3MHzG5Tb7{y6W8{7@AN$WW!Z8&0TFW zsEDd2ngF0-0QS6)OnLiqgvh2aVG5Fw^)ICPGMIr5?7;yK#qy%2)!4%Rz4T?^)Nvi% zj1<hWhOojUAk;L4qN5{d5(sue@C(GkR7geBX=27k*Jk|O5HN-@AqJtOEfpCXK#)UN zUIBQRN|1}LrHdIFy6dzK@IV44;`p7s-FtRK<88Zn#XC<~g_Mla`O6lJw+5@Q9wA{z zilKwDz+Ae4b_{XdlhnND++xSzKAN7h+PfD+WBDU>UF)v+dp;LoaDx>XvXbjGE5&SC z+dF$s#fP5ZySDINDA>8lu=rg9s6_&l1^U2!2dMjd`m?!}W6a7Qfc$h?SuC?HjaV#_ z%*~T%wq<CDwra}!+q&M<cjo*@Yovii5Fm7%-NqhWb2IO_Ff%2aHViY}Y<7T;(eS|3 z6X3kUh(w2xb_-1y0Mpt-T=D|>xW>yO6H&uYtsq$-5vah!<rdmUTgaaXgg~$g*D?ar zjBK(YH5@VVqzfbhH5eFjEwqj|kv<U!fnXMc7d_*9?(o^32odPf=5>z8FFnLo$TfK! zJI3iZv0~=A_#Qaf<}qQ1G0^UII90&BC8KMu$E|bmHjL52rn`9s&|I7i)o!}2^<7uV zZ>4>mtKc>bfHW$}scI_4nOgyAfXKiga2@Jc@^Yh~85R(&H`h7GVQiMlIMZy@r`f%H zBt1UsVbkOq>GEfG9JX_p3&GC#QAuIdAg+Kr+AXq!CLIu|9Pd)aMS&4ca&F&6#Uu*E zve6JK50gF>J@N)7ddS-DM@Z6O(2?mi){BZr6^Uh{AXrUiqUQii*r>-<R}(be4cnlx z&o?Qw1DMDd9OJBVY#S>M)2iKZH%6s6MpLd!4TLPEq_Fj>8imbBg(MiH5oMXJjbBaM zw!1dwnYE3yAdz-+w8SA8YC{3RgS8u!Fe5BvA1c7LSXjgxtq(?qq{1m7$CpJ}0Md#q zNM4f&VS$CZIjwmyz=p{^`)bCR*O6$cEwqNooRt7-5Tj;9X`0ci=a(Dah-{P3D#n=C zk!Yp&-rrvIlh%>VVDV%xLAxiO{x=iKX^d%i+HAuOaN%cq(%ib%_1<Q|)fCWj9*8qG z!(p@;XS>4*Im4X9b}Ir&BnB}^#gPqPuFWA}5}b_9tzLFmSjUWA%aLh<cr280ku8{_ z&XF;yj|Nm?X>~S5W$d{I?dnreg@I%lDW;VvZc@Ta6h-lm7{I__1OTNCPHbMfv2BDq zb=zYaw1mp&ks1>fBGn+54aK=j!JFqPxmzDMl-5fY&0K8Kx-HYzV;F`Q#tZso!B5nm z+Mn`E^W~PyaeJ57{}4Rq6daD!)mwQhwI0!oOWE$F`3iq2eRuD@>-VoQf0bO)UES{Y zd%eB>f6eLBwSGuHU#(&K|7BP9{=aoUV>FCLrjX~8VK&ekzxd{1nV6(#Z(tqhFY+n~ z^L+g^RsGhfRDK4FmTmuo{N!N+`M@zTjNoh_5w@AVw*p4+3JdG4d+Xkaz1zC&@Ry!M zMAV4}z~lY`C=qZeRa7Yk$FXopn>Y{`>xc8o7+}8v7|J$P92p!M+i(JbYkfLr$Qo2s zpdTRk3b+rTL0m3FpawDAG&dUqtKe+i*7-Z?S#WNyCyG=IfZJ>3=~j=SkASt{F@u5! zvqr9tDF~*9%^Jn?0{}D#)|+j<^l6#4#x!#qfkA@`z5q-E;7r6G;nd%^7K$bb;75WO zjqoHW4?PkW^nVe~V0iuheXb7%yN(++lTt#v*Zz%Vb3o?s`3q`cR3_2;AH^$wh^CJj z6GK>oTc{<;OA0K;_Hfs|c(v+nZ%t)1ZM!^Vx2HDr*Mg1qMfQC9@rCaA{O=-ceL=dv zX7kKr`26yHhu!^XGC!pJHfvjEZVZ}_cj{j6=utISoEE3RpWac7&(6M5%s%U^3=d;L zL4+j8%p!$JB#nn_M@VdN9e`$J8l4+RM9}6!RJ3|E*M!Kx(Csc3I9#yz|6UdYEqZu# zM?6f<Cn6A<@-m`=u5H5Md;;+79};$r@4JMBK<~wA;56?eZh@k{GD1R-FNC0TaB*q+ zpKIf3v*UXn=P{>1C?6KUJ58no{oi{VW79e7vdg5N%1t6Gg|aLwXr)XDyACfa3BayO zayg6vhM2D~V4I19XG^8S4OQR3L7jv$dU0@sX%RC+0)~qLM9W$T2ZY?*@xe>-o+;E3 z9Zfg8Gv8}lb>y|G_O%u;;U`-68}>QHUJo97kS@s$3bZolrpGEO2V9}@hjBoAiW}H_ zo^x$<RF&jBf#f?&mkFU}V<eSw#b#kcV`~B*r&fVWhw8{f;=hK@E()yKxX53F<k%a~ zbt0Y<n&qZ4nFz=vk*Od#6OfEQO`nw?m5gY>I#f}RC=g&$b$Bg#AV7dO8Ze9?*dF&r z7DP2hl9^12DVu8d*7)CNnSGV{^6A!f{?ZO{GGa?AV2aB4{C-g6Zk)Sp*+~*HHiQV# zM^HG;5J#RQhT-Q=fS%vr|D9V!I*PrCeN&mcEMc(eUtcqGD){b1y9Yfnfh8#=5?6iC zf2-QQ)HJ_SF4l~*GpqT^ItD8T_1LOdvKYdKv^1;r+F4>U$ZE}2CR=G1<@*>~nF?iP zN?Sh`w3eBF$rxBzF^goDG-A~yVPd8#)u^R3(Tyr;rlL)gMG{nD2to|BfB``?kda{P zHc<{3Q8l|k2jP|jDTPJ$*rrxMhxwQZ{z|UZU2AEma@H10Mp~u@^CrU<%&W~;Z|Cvl zs_VMiaAcSt39vE8SgmQIHB44pQtQM<>msX;S(=G*F-Fa_TZ{_<hzb}k1TieAZ$6Rk z`8zu~v9*4u_{U-)+R7NO`X<-(ME1UZME<wyf3R9%U`(EMe!yHrQ=vc(e>WiXjI{Nm z28yD4r;`)QEfk9iAQd7-&_y&+SRwJMo~+7dBP7&}SWEqn6H{NSEkk;?>za_NT5Y9$ z=C#k}JYN+fL+8*|>kIGeQIg7)yDEmPUN5x6ZHs(a_#YAP*+=1Ja8wR-dkNAF_d~^@ zM2Ms+LQn%DMw-=)Y1kIkdOo6-(dRFie<$u=OH6#V9>n?=#<;_E$`A3q>o4NAx!AU% zt3W|wNs5XTN`VEmnvpixJG*8#R#n9~JUE<8b2O}E+jCZ~BZxP*xU$I9X>V?~Tbt%) z7}NS!MZMOVja+dtj4;KM3^8KT>+V~x@HkkE60pllqTWuS)y!k%G;LvsMp!bk8IV@U z7a+x$7W<i6zNOhe4|Ka16&xeJ?~IPZ?P%R<?Nzg~S86iLLxgt6gmt9qgDsX>ZE8&x zmX|rry=8V`Fv@(_i5wlgM#a>*TNH1XMTNrB<hWXcWxD=LJ`7hS$#jqOGy4sH5^S>I z2q1<1D&8p?YNG@UNz7q#)BUu>|DhaHTv;ZkZFT<zI1+T}(_jKcQKpEAvh~a1Pn$ow z8fonC9u`j|8k)Rv^}A`rZg(wSgF{SU5XrdUH(NI-joK)?3$SV0xHzka4L4jiJm!X| zl-<)R62)aXVOv+!tcHojF&(N_=AAKxg_&70=#@KII?}XzQayt7*ty)+Rf`iDnUZiX zV%WOGZm}6;vg@@PMk50wGFwu(D<i35_E@oY8DlEQ=T&p$%Zp4+H03)Ga#{;~xfYgK zm@KO!By?QkEiEigWh_lC%62&{V;LM<RCyLQU=Cp9SsV(cCWDxOaSaYfF<BBj3gmV` z#=pGU65{E-M%FLYVJ3_JZIF6uF&P<^miAh`Ei}oR*0rK@FfWq|nx;SVx@opbyI8be z_gcT%WthFzN2sywnKKpGU-qhLp`!>7AdW0oa}}`wd+ZO$kV8NqLLZ@~kX{bgb9U%| zDA3X;7XhRTq)+sy@E&r);AR=od--oFf<Ng*@ZeUH;FVf1NBo8IFa08(_Tev>=K5DK z8Y$zxvr?bAyG80Rp?mFBq#1WGGGf}n8qpf73+5fWBf>+Sdwgz*45;g@Un$s@CKRw? zTdfo@q{`TuG_<JyQM*Al3vs(~8Fwu<K9$2#!IKtTmaM5wG}6pj3;vUZ#aPP&ELmV! zj=2x{qZY+js|dktS}o+9I;^PSfKc+m!mWpc;%Q>Rrcx0IF^a;XiRC@;dxyf)9_!wW zTuIcjjbT1^Pz?qGV=w$HTIFr!ezxz_I_?9m;5zN?y1MezQMM59fW8z>L{g9i;%NnK z8;457Qbw&2YHy*ZdtU2&>Dr$?$;m9iG3%me@+lrKLBvb(4SuioKPTK-ZMI2AZvik& zKn*ZVL5mbt3ks%HWkwN+Fj)&Ss4|g=#YQZv3ks|ilO=eXLh7iyR)CF5=rAy1aZOCD znx!<qe#tMyJfdFb`pRC|ImsiH{_`v{uC;{Gk%lM9^X{dur0%e^!$B-4yiQ1Ha4OLA zT}@qg$m-Zysi`iRJF2xj!Q|@ZvSg2C>|V(BFS}~h<wrRAOBN$4ulwwSx(?-~U53dv zw!U|`z6FIxCrTh0cssDQs?u7}qQ#6APJlz4B8V-^Xq==Egpqnyk4pBtYUjlk$<o0a zF!)_dd!XH2OR;bqA_%x!Ewa|NrLAhKTn!aIVfeU#`niP%`dB_8APSF=0g8kF2l^j7 z{w#mR@4ScmSipHa>iR}EXlV=>HX3?&h~zZ<CP{WyF{-W=r}H~X(zN`K15WPJwk+c6 z=;jPUA!f{8BbjtNknlasXNP60TD<C=-gNdWCYx<vwAyY~jYy!dL5hO@-2KD-93e<v zubK*)Ym2I=?$as<45eW9w6EWAr!dNVC41fFaSoVO$nZW4r!>>UQ_5Jm#;iuJNaU_J zmW(V7?c*$t&Q9lZb=h=5_+#+LF?_^tSL3nz2HHi6$NP+a{%7jHUAOI~ONZLjI_GY9 zGh{qVZY;Bql3sFgw#afxR`;32`9tQSvL=yx88tGQ6^qocv{?_hWADZ+vdXcnk&q9G z4~TfM>%fG;4<Nutsy31+K#efOn8dJTRt&1J$ymu*Sw>hqm}<vs3#LqEH)6VJrkGkV zrI^NJ8ag&?m_xQpdwiB#=38v?`P}Xfb90+=08KIqs;a7~@}QwP)3wan?H%ovd`kJe z-hH;Js&-o>gKE~n#ayMWw;Of1MOCCiD1y<kuwyEap;e_+q#;PPYST{@=w5aZ`rBHS z>rJ;R^q!MYJtOI6Xq`6Il&oaZwMR`Bly%iQwpSG|;W2-@4Kxw6oEXcTbCme{8`9#j zc_USp39-st+7G3YSWisqbX;6VJEUP{maL7f<1CNZTP@bmXtpj-hFqLM$hcUh7b50Z zTfxk5x@Q&+cOv;OhKA5$Q<-#OtD@oFoYNn?+fTXeY0NSF?58!&Sks<dNtJB8rTL#r z>S>KMcO2n)rBBv8WvSFU%Oir-mR6gsT9S^;sc|x{ZJUdW3lWznJcWc|<y!^L$Z=L% zjtJh9Dmlt<T{bGc%SP@C%H3%mfzfli2FXnWz~E{h#Gv_szzo6pJMwI^)JN;JU&O!a zY})Y|R2Y~RM15;$KX2$#KCwNJ755<2PgF?<(d7n(Fo|d%y3wX2V-PlyLPEx|hI2i% zhW7aNts_|Lvk7~{(lU4y-%PIu^?1`Lk*94Iqi;=~SE`k~*NqjdSOg}-=fXo&4X{gW zQKQV?zET|1_<Gins!X`-o#6fkGI$;7bnt&2^uc9;QPKu?p-PE(7l~*oAcTu(vL<BA zBQa(Xn6r_=)dqG`E(eSf^@=oko%r^U=AXmXw2e|_$7JsZ=*CY2y)K>)<Gz?Iup?eD z?m;3nV=qm3wu@1>jf(eIy7yL*N>)q6kPwh$1SA<&EM2J$5M9ZG3O$d~&`$~X%U-9! z&F9V5F?PKU;^T}`dqEAYkvFmQ0X+?xLWTo_7rynON;JT1gb(sR+%)=_3EpFi19=op zA>$8p=kapEz<L0FSF|<qW*O(z3^ky<-wwDuhA*7JnlWm_29au`6v#2_SgEx7+<d(> zoosEkm0J+Cs2Zw5($=9r7(U?gR#cKlU^LSk6w`D9l%Qgk5TOc1k};BI8JU3VSJK+v zwM|;5zu(rop$Fv^7vmU{7=^vT3vSqvBm%oqPVYxe(^)S!IF`<KrSiN_LI6ZWL;wUt zL_h#UL_`1tL_|O_ghWI^i~u$Yh=`qwCAQ1hlUaH5(ra28&17~^xSx7dbz&^3K0Yq; zz`C+#Jb@W2&c$YBg8!4k{jVv+6~!IMy|uTawoHvIR_v_Bxth~T#umcEjaCY^Wu_Tp z6_X^NvGZLYnYx@E=9k-+e=cc^9N9<XgCb0q-wZ4x#ARZC+<)U_ddoup<Sit~KloMH zTo+eYh@he6SSnxLRMIfQl=Ne1?IH&i7ozoWRRvo*gAii8L5MI|<-)j}ICobQhZAbs zb5&|&x<rgXAUz#k4x3umt6J4nY&;ytoGej6)DLS%KUsAb<BzuTU27NUO$EtvErte% z-SS}b`pVx397s__C}_sm#E~sj4XoA+uPwIHoeRPYFVfjBg2m*%*X4|d$qJ@fx+ftZ zsAdcXfb<*;&LN|QhBWVKrkLHh=3H^#scTxNhk!Z&BVk^pTOuDNvdWaIp*-`?!iuVD z7-2#!RSB$ZY7uIweKT=5Cr$1a4ca{G!Doo8@29}IIT-y1l_+R^))@RI)hg^*j3W#f zR_B94CdSR%DjO_fF-?uyq-sz6@4CNne(3%?g+~_)g5o&7`rh4d8^`i4YX1NES=&=@ z@r^BIh9e9nXj5d;)LT#iX{~K{$Z>LMUd9+cwg5ROdL$ts?~sHAwq{~~W<<PX`wS|* zi(N$dt?y#erD$qo<%Kz1O17%nnpO%XRWg+L7A;X=#e~3_ev;Cy*juiPOZisHFXMk1 zjzM)ybuMwub*+W5aXy-V*v0Q057<xya~(~G{w7PD{?z_!|F+;=a3T<<7PWyiCtNYA ze*vgwe^>n3gUt^o`<2{Z)_vp{`+cCi@E9=L)&Q)%zz-TrlfD>^xW&_O?uZ=TQFU=~ zZ1Y0X6JlwHG9h&K0hsf?KQ>MHZ*GQ`?!4OG=AKGChyt-BY7EpGhOi7_gItjYhJZB9 zx7p5i_e_Jl*E30D-ym~SUF|x~zhp-m7L=V<>k?Yqg4S+}1`Bh_hQ&8%ruRkTM@~dG zpxHe0p1skS{C=>G$E_C+TzhM!oadNf#)a<4UBMb*8c5R>+{}xfM5&WmOn7V>M%a6e z18E>#8RKn^wcSlM;P!QIp6|?ho#(o5*W{x!A>rX}6Ubfm!0;F_V8Md{gbe|}z`*ta zu4hjlcd?pn^dl9}ZTd|?uUVGl%^KRAIPlTIbU4cf1UzKa*<Zdjz8%MJv$DAPN^y6) z*#dSNJlurvkH&e)uP&E;CGQOqGm*aUYPU`8-R8T~TO6B)6rkPnn0Gz)Gu>#}sSQJk zY%4Xr8Zlj*!NMNHbj(OSWAucBoM~4WBJM3T8RSNoD%i%(y2E}!Rtrr6?Qfpqx``WM z7?sxPk;Jsnc*VE9!QIHlN*!XjIF#fKZY?lNRv`zTch1wM+OEA!IP^E6^-$2mdAp&Q zS)}}7$E;^1ry@1Ev8kG_!5etS`q1Xrn3UfuV=`;AGcd9o)G2k%7qs(!k5H4mU2EGw zDAM<q5Zehx%j^)^UUz-NZE=HonRjx5o^dL@$Q#ePbKN6d90MAS8feo6pm^q+^I@Ah z&w$~@?#$W6u-j?j#fBxM7}(O&a3a0yZ6?e%KZe>9ZM}xJl)K1-ub$3$Z(DMDL5D_x zEi{24ur>#rZx$Y!S=}^ggpqAtW6w~KlBZJFHj~oQNeJUcKRJ|ddK}U2rvrwfYxe%u z+>(n1<bCjf`n593LQ#s~b&pu~pn{gp5QE-Mvf!ifUu^OFL{+6e5QmU8GN$@~1p@|u zB<T>g!R~AjV4=X_h=SO#Sh5xjh@yL8oNfq1Uma9*W19`Luamg3+hL6?ts>P;T2mC# z^Vp`$TuZ!@<0k5xqks5bXVY$6X-)98s8-Rns2Y_P(B5TIG*w7FEF4BZL-aJ_tk7Tx zLBwf}57gNX$B%q_<OUEVBv?j5OM$_O(7cjGs=q_cMWj52FvjY!OUs@t=EVIo$h=YF zU#|79-x(QxsQl%otaRMP`)Z38Ac`oWP*p)x5j5fDFjYZB#6;6fO==LT7{wMs)r&1v z76y+Hc$(%0mj$Kb;@Ag8#S!~pnObcWTV4sKx+uD^T0C1(P||_mYArboLjlRS<PJsL z$L(puCY+e&HX3mUGd4N2X@j-YrZ~492S()#4GD{g=C~#%wz#ysTQ|{%G`eV2admBA zn$Z@VyD^Qn<)+xi**b3CT-L8&Dt&cty<dHgEc_N;GF`9T07w8N1MOP2_NJOvYkX$k zgr>ZGR8$&)A#=<g64D=b6b_YCk`UP?s*le7((#<!1!Mv;F@B>r=XHqOfRvFUcUtc2 zT;*-u+iQ|pE83-dP(2w23>iSAD8$Ax5Q7zl7+j(RAVNu=G%ck-aWNW%=ONT|1;X+1 zq(>MZ47LbFkVP465Q!qb4DpO&<YK;dD{0FZ!x&@Gw4Q;1V|6?TKW1ToS-A#-rnco> zFtw}ikxJniR@O0u?i2VZ!p$N63Ru5Q`fVayLGVAMz6d{ZFMCgcyf=l#42o*9GB8G# z$hA{8sZ}i{n%gqe*=ANl88KN(%yQJxF{UP!mP~HVuC;dV3re#zA{w;D%M0IuKJvh; z_}tSOj7(-RF`IOBbZ>GoexpmtIW1MfIjZHv-trUt%c|x*op(jDI?l5BLhoB7XJL&l zP;R?*!FE5X)!^)KS#m8p(-&L0&8C`h2NJeyV%Z$m3s82KTMMlI;n5wIF4fsXp+hal zHHbBgsg7$Cw!>qPT*U8?PzuuRYB;oHp{Ozg0m0bZ*rMAkRms-Ga&IjdT#Ze3Ei1g} zLg9$*Oh(2IDS=^zuJed7sCEYkWlXTMF^-F|+BQ*dhGVg4{_!1B%Vg@ZX)Ti8&sSO^ z1VjJ;hQI&-NNJ|Xh$NIiA5Ou1Bp?HO+>;U&wh)ApKmY)UfB+ENuFmCoTJ3b(L2Owm zD#~oJlOq`{n;Ny24eB?#B=AYjO%&UwYBw^vi-@~T#l+cYjUd%GgPWH1Zn?`#o=L^M zs=TSAQkXJtu5!VJ{vYBjvU*O$w}UK3MkY*HvW1B3brfs{?g?gr2*epAk&Jj*En$N( z;#;lY>{(Mw80~{(cSY2&9Mu~x7bT^uQL~cR#BQ|2xsT9oUDM}(1^%0hbF`iHS6j^& z?x|713KU4u;+6oxtx(zm#fv96fl$1-ODRPYC>nycxCBdzTe0A@#hv2r6fMx3_j}j< z6Yi{>oLRHZFK5l<<m^4qem=K9(pJZRZ2y&WSh$-O{%$X5r)@1F@ywy_yXRS))$ZxX z<5r7~_mJDTGa^}nJMB44dYMk6qv4smui_XU|80;&T_dW1u_tU~`2YJ~-DeLQd6rUk z?6zXZ1oQOfJE=8*Yqmd*&P55Wlpu=t7GYbD=d&KyWo96buVG$(G5v;4$!Er@%v)E( z=Xs{_dgC#3q3>S$$pz0qkB^V>rz5(+N?C#oLCB)j^3DqvA))6V98yQR=XPw;10Uc$ z7=jYtI*h~XMU-j^$z?@dOv#1YLMWb!i5u?6ypM35+1V+V)5$R1JAIKE{#k-mmi;ix z&7nX4w~BwqYvjuN#_6&Ve{bLNKjYn8i(xzx0c%V@1CeJ&;`XoJE)lHb-YX#u-wC-y zRL+S|Q9!O)pRLpDcRgrCXb}5S7Cfo}e=D#29jE_s<VB<LdR=*r(xeinXM?pXNR%1u zwD02W22O~8l#_Ex-7!X}Q;kI`tY;oqZPs8abjhESZ3OCx3e7uj*wEU^16;SC_S*Ht zI6K<gU@Dd7!7Wu%)oYv*eUk%eI|Bp22(d?|?uxszzjH@9_UVjHe?1ayUi~EAu8sS9 zS3D*2x66!)#e9M3?ALc0suga;$LAwioAetCfKl5KrBbnit4W(5-xefY{lAI3I*L#G zxLQWp5sQmf%|58`n^E~j_Ia`9)69FzvV4J~XWQ%FvKYo^v*Ij=zN%?Fd*etJvd(~y zC_s5@(0i8IjRe;Hkc}ss`{D2LPT-{})-?;rFivi{*I;&cR3jka>P1%~HG}h`UjH*x zg&s<UGD%mb(bv|79|+u|(D}pDY`tTrC*QSv`mWp<&zOYugP7GxqsSEY1F!dMmqz>0 zI2>*e_f13xN}tHC*c()`(bv9qs<0RO$pd=-u@eLbV()9nEvhrW-PWsr5RLWl$N^?L zQ#=&Rw+TMjXrklnyn68cIYpn^k-q%hAZU<}{0sRI!vi|w<X*RWlXB@yMI-<}9-{IR zP!}3GzaUj#SBF7pNOW2(MJXwb*wq=LzpiWk^HWk%c}T1HV6!a0payZPwxs&{r%&fS zr73mGG=1Z7RGD>2mx>juF4v0=HRTer0zp^%vT<UdRD|9AhLmLM!nx-uKhA!9@*nG< ziE_d4cK+(_VS3=fO2g)XRW7nMAb*9foO!5W0A0-O1*R3o9i_w_874M6J3AE$7`coz z>reI7WaJN&Cy(x%ZW288eX^2H1yhrsM+c&4O0;}1mk}qi7W)7h%V(iiq_2w~0$%r% z_J*quP+k!S{CVAfXqK3|B^YOEd4*W~>K&yO`V=|PFWP(*1}jB=kO($?9c9a^OXN&R zFjfprZty75a4r_{dJo1JRjpLjBaL~EKog2R0%ePt;GMc&E%A<c%sCu3q7x*DRR zghwjT6cKTc{(tR>c9oEJ<TF40Cl-76<J4)2^9?lA(}KoVgWjzL&^x<xp5O*j;Rq5T z!*%P~1mQq8!M6$IO2FQN9>L7x&~-z@CwGV_1Aeof=a}o^_x#N+F7v(wto~RRu{ZYt z8;&;)s`l1@kurX5l8-n2@I@RPC0QIqH|+jAkxO;By}c8zdlwGDsNEh-&d>X}Qs0J4 znlve5Ch?rD`6QZe_m`tqa66cCRo~pZ?O&%a<A`^^w!Okl%@f(=!>8KweRIyW1|{|m z8Y1@gj*pNKMNv3c{}~W!5_M%es~hhIz|bOW`W;9}25MN3G9S^q^@Y;D;!?D;|LCc1 z@ao=E(o`XZ;cC7#6d^5gJ$+KrQXij`2&aWyb?`mcp-{*^Bi0KRTpkM4(^M>yOGX@2 z<h8^H@?07|`YZ_2{L>dq28OB|s9W8?D4-rC05J^?yvp=fDTJGr|06aS4kz+^D*ZX7 zV7IcbD9i<8=|{lm0ec!2(c%Pod<eS(Suy4H+aOg(7K`2;^bK_84wydwdM8ll3;o!o zV4J0FiI+f6?;wc(WcHQj{q4G%vfjieotfJKMv1&BKOL_G-d*V|UQDdbTCw*Au&>+5 zxjT3)qI~um`nfuYS$<h`hj?XHdCO|5Rv_-x%?P~gl`^0jtQS{lFQ+v^%0qLmoyOOb zsoPTe51S5lE}lz!5Z%HN-TlOo^=vXh?a!x_^=D-JZkooH90|8S{vxaxBH9oCeN#TZ z^~3!Gk@$<duMbxbR<}}yW}N<DjLr64&SeH0Kip!+XnyYRBBV7lLjLG$57%qraVJce zs?kxr-30^2={v&-IPpYYSF7GcR1)1g?d9b(?Xk3Gkcr-z;a0bDDn)Z!CJvX8k9Miz zZI-70soG2L(W0>kUc_(vdI2zc_r7$qVM)6>lvp`0dnrT3XO{d$FgH4AA0ia|lBM-( zcSbzu6MKjUyVoxH*_o-%KS9oH!Dz%{XjNLM_Mi7K5G_A#s#XdO*)NNkeKL-!nP96e zwg-`HY_|v8zuP`><J(9~rW(u5efQG_CUMV6GQXN-w#U7Uj!!4}t+xL-g(s`JpdYOw z^TW@FIQ#;+MY?E}dOWefuZG=B-~h54SWum}_%JN^aV4(L&?M?i3)XEk<uhOaxRC@O zm9wma(Z1UCLmqLz#!wLD1vp7tWHA<23W>UO6+~TVXw734<-%g|1I=o-<#^oR(=M=) z;Fu{b*ka2vmkey%L3;m`6e17G7KOA$J4J;daprq#Rmai`g9zHM#~gnF9d|rPTe9=5 za(3(%yaf>Padw`j79QRv<#e2wu2eXtpFhxeXU_hc2$hCYermXoQuYP#>5b#S&78w| z%4zwV*w<EForU^;RAb%*@&7bXQUX>9MhA1|&IcUPE7w)ZI;@($kFnV@)z|a)IB(8W zVnReEN8#n6(8eIBDMx~8UOB1(3JUN`zP@v<rqjIq+%ZEP&^3)JMwI{_=RA(C0+Rt& zz;7Q}^-?)#?q0bSqVwzh4HUig977eX(MY~c^KQb<;%8|vz2Gap*MH3H+7jPsN37b| zSYi`xfN=B=dQe)8?WD>6SWxmM;zW6yz+>%CNw1o&m63FnEPS-s5iabiNz+kmDk~<d zI$HLVwZ5v+w4reZG%M}tRc+&?@3EEHop`=3bnM%x*%7yy_l(M_<Y`RTLbn9Ck#YLv z)=_zc&Dt2YrqD*+RZQ4=$>S)^Rfb;|*NB}fq!FFr8k_Vn^j)VQ2tov@n@zjj8!%1# z;?uiQcU*gH(&+MrNaK6mUx+f@Ldwb(&kc-q&2vZS>h@WsS(p7VRcV*rs~$5fdsVOh zTMaLFwX1V&c_v#D^ZE+0B|uk_o&smL?Gb{rwMDBJ=;~X{?;n=5Bo?L9qEvEV^pMqf zv@ze5Vv!g^5&EXJ5^7)$Khrjk!5+h~kPFo|b0z+8eqs{7)}<a0+V8WTd$V`>tgB%g zjOE3-0o_c54e?PUt#U(8`CkqboxYx3+X`xC_gyc)X7e<U+ym0rE8ytW*Pmi_RESs{ zXiQ%ztQ<L)KipIshTCgdJv5!0u0y79rYKH$&aj`ORA!qi)Bb*J;Y|Khs`96)f4rWZ zR<Hy?m+4%+I?(y;$pDuEtr0Lx&9hiNY0<I8b1J~lK@D5;^JDqMPu5?RUQrqli&WMh z+JgI>$5ca_Bx_fLvP+W5Vaf1hBou6k<g!fC{L*wWt2Tf`0o5PK@%RRq-S0YkJ`g|< z0$KEAZGTYjHFO@Uba8RN&65_ztNhW$ie=*&8Hle@MxzlN-L?CJo75^?Lvlvb$SOov z^yN#cCq~5g^z@9>M=kF&GP?5QG(c4)o<Pch?J>zl+I2i>_K)BUn8y}2WWB_zY*8h} zP}@cQx5z3NeojW9z9Kc7r&x1-!8r6?YiRbrSJJ;tv=30jOc;_Gw!pV=-{QAZa$V0? zjX}zTUejhaKM6Hoo_Cg;-(lrWJe1AYS-h%{VaduZ7lJv{{d8V(6v~|;YmgS}FF)N_ zaM#|uAi<ens<CGCWmhMrdq3n)O9d~G-{Uhc^-HPel5Zr9dV}Zchf*(%U~O7IZZcK; zcW|A74`xRWj+OZQY)0kf*X^5;7y^;>+!RHL(g9n-Bd44g)1ag^+QRL#SkBSz=IL52 z{P~(~eTJOyuIykgPRJeVjsfBl-?Vo<=(_vK3b0BVzVItQ&9{ww;_e><&@is>KtALz z3l<sFmGM&{Swga)FfCQTR)8zbKA7R7iKKo0xA~D3-2>ZE6k3;MDf#;!fM=N!s*D~9 zHhY@L&Q5y}^qU_vlgi&z>dK(XeKLqH(|uWKxLYQ(C_(XP#?DRN@x<_fBx`DXVhQcY zh7e0&C!^V#fC5Kc0-@5cKyQRl!Y~l`fLB!~RabqWL%0u&JQ36dSXhQeZsYv9%$@qy z27nKnKZ@CLB!oy}Xm?(p1HxpInC`1(XIUqxG84B)-(M%b_2980Kc5Px3RG2f%zw8w z8mF$rcl}Wu$S-6A4Tsx2MGz>|F<a_Ib1tT<c6JE_i+vE{2bLutCXPFqG>H&H{F-t! zR)4BQ@8N}U_u2s;C|BDyjq8us(Z|mGgy-4s5!h4oxINr+j3DDn+;D&W?q6*TUCJtf zoplKQrh7qgRPS=xE7*Wx%RNA=HEGd>yA;)x_3iA;{v)|qPao{$*O1Nk*y)mK0@qA- zwJ!nItW#4Hih*w}y5np$gcYp0L`3fMD?@H<FP^PPn0%djTXk^{qjQtHZPCU4>JE2O z&o<VxUy!7IjzQq>UHC^?fnU`s7~2U|zXH@5sp+e*OWag)B2={(mz=1Av+k`?Pfk!H z$e?WuR0m3v)vJYZ#=(Y8Re9ez{;sK`+b$Sbl0z?Y-hJu1uvgY$AFZP<**5o@mfoRj zb;jn5Feg&le=!vWA-TsPg5{mQtEnZtIyeH)zVG)W=*DJ$%{U{e&FtIK;d7b|NvrSz z2{BED$N%)+edFhVeWoR~I0S$r{d0*Apm($rRGux{Q}}*hp(c9e@O75)*TTXb3?;J; zht)0Qt9@CcSD|}Z?;ZcRDXw)ka}`8aa9RN({5I-KjTOBn8!=BjVo_neu{LaDvZKFh zgtGECI{{cr_EDTyiFnijVuy~e$zfj?H^ayh<M_SU)yOp5KoF&+I@z-M_e|G4BnD_i zK2{>Iy6_q67CrwYYmNGh#;oCb*TFdQB+h&r%$a-obJbV^-s|_?^bllJRTJuY{K*=C zU=~YIh2Wx$6h97MEbAL=PSLF9TPT+c7s-AGy$ym1H5Au<?$CwzXZu@~5`sGty5Gir z5Ddvq)haQ&6#zCpD5RcfkRc`aNY5_G6HqLQu=n5WBtypx^0s}NJYt`YyP(}x%Ndr) zZjWEnXBO`F@R_=wBFA%4k#JG2dSco0jZfZ#(ZmGxFC}H((af-`iEG$!ll^YMWb(0t z&2KrH(vpId1D5&Dsp>?XD5cb*0xqMPzq~EG;OJ6)i#8<x1|hFy-Cp~<7W3!*%<ule zt+{jiES@f&E-n!vm$}6t38-Twls6KeJ({QqxbBaxY5`1Hx|yX8L51p)1!G&p-^Ypg zzBf$vc~nXN->V>@jeq#xiHPX-*o*)5ZgExp-;rA-6;w#k?k9B>{NCzq39H4qh!`=C zV(W$IQC;1q@7ZHyet@K`z!~ep^Y~e#s(M;PQ7Ut>|L|s@;!4e_b(U7uE+IrAB4T(( zMC4S{dJFfEh!&4^e61xVy^>M_1;whrkhuGJKlTpe<Ryc&=!nJ_f+F;@qz%*ATedC< z?K`($3P`DNf+G1F?*LO1hTzH8bWw385VAzDkTnBne1eVy0Uto;|C%0NsW%y)5E~Co z9WMEkCK;Fc8vd~JsapAJDp~@QIp&k@u^4HZ$<LbuDH)@i6Al<P+|ypyvPC@%7SQGg ze5~L!VdesWMeN9}?waTOE%($i>qn>;Id<64mR9>Y;zk27^Ua1nM9*#|Dz!yt={41+ zt~r@zHq;O-aAU?Xjesr@V^d=pK$nEU++-Kn6E!HV&-Pj)!R~8F&77OsqK_F55m_7o zz(#a8ii-11+^vNfP$ma%DsQW~l)YcoF*cW$3jzi7StdRO^pnO{UN7sjcWx(Y3MXtC zRv!i5y}2KECKRw#v0p+Hsq%<@<pbbz<pm3J`Pyw2yqK!)WBF*)4Sg_BAj@FeMM+jO z^Dt2a=v1e=+y7ZaK=v0eU~)d)>4s7)KN^^z0tQZf1GHLnfg5eo><ZHC9^}~bhx0x9 z<)KNYx2O-v`7od@%Z7QPEkZ0zJ{;##@G_APXT2%S&0Z)-tu*69>+PRwL2%>45h4wa zH$*p5V=~`*0^T=>O4!=E)L2;2?vR0zE~lbX*bYq%#x&cxc9&nn79;c;qM~R~D@M@~ z+HIu)W5MrcW!K#&oy9uS8fjA+Hff2DgZC`icxFH#kT?<y7J~iwJzYO?g-gl74;<-@ z8D?8FE%nniTiR9vt8C+o+VSDQRLcZA`(dFfD7#{G8qO{hNH=0>2O9v6j*SyGDF;o{ z#l*Y{ti*(Cc4unlP^q=h0w<I%AvTWdQqtu^_aZS2CVJ?YT%dkVZ|l0HWf3FmNlFU@ zmaF#2cx)jCWXztd6y5GVJAT6N*D_YcL}~{1&1Ht?tqRb+?ocddL|euUZwTQ_Qc(xa z)k<o5V``SCUCKLxAHJhu__z`eNbzy0bl9l*!+b<}=GMFomnN=@SBs11I$+eK{yhUb zm9-=2$q3b!UA_x0>~c~Js&qA;96;HGmwK3791>G!@{>Q^qavMkbUxx#(q8wM%Xi@Q zxH??am9#AZd&8w#@q}5QUvMLx$4`w!pgIqB=m3yR=?SGp3A*~zg0{H&S;25(V7vuo zlB9l+1Q1<n#b>3{+zOCOo0v$O*!cF|0A$V&`U44Vvt$4ocPXs$^+<nRIxG)6>7MXs z;;V233gieO8>d7OoPNLT13fAgd*F9PDd%7mRL4~{Fl$_%x~?x7NLMj5ZL+c|+v(#x ziOy3?06xU$lSLC||2Jo2>bB5hFMVepbNKUjXx$&yrKxf?!q&NtNlwvS;-^o(q<Tcp zOPFWjQMsA%COb%+*Jl}(KUVV>*w4iczEiT3JH4wiE&A0>)2lQuDf7NLmd*f2r>km4 zN3oDW)n@0iQuwDa+@vF}&FZha8cVGjf(BHX*TvRFH{M0iQ3NKnb?gu-M1(OrSb-hp zP~I_F(XeqQAi075Y<t83mLjsT$A}km5}vXSlXZBti2;4`oXksXIGP6ZbSVktW-F-% zsBtpov^w6p)Oy?0{cY(?USHp6ygIMCq-5T(kG^;gE>4&I;h=?PPw=B0N&J|50|*E) z$~X7Pj&>pzoUJv|Gvg)G&(l@x-8YGxbkUgnB3%}xk&_r=9t)$kGn7oC%#%TXvMAN= zo%MYg5rzLMyEF4nTHLy?J1s1MWsT&)DX$mRE&#<FWyyu7n1&x}6&DFwofKcvP0G#i zRbibijHd{X4K5&(#NSHooC_pF^3^RSgN_8H?GDjE{Xr&&SOb(edcaEBk*$4bOIVLk zD?ZsW8qcL4l{7;?YGe$xt0~sik1S>96#~-&la`X}VH!QIwkAw#beu!>Ba)RZhY2kg zuSBzrk7M6jhhNj?a;dIo+hUp2^a_%CfLt8IqkSOJdhRx@gifiM@~sFjMG-b8>rH)S zvCc%7e7}Vg_8%=_jm2=fErGv_ruMo07ODsNGOg~R#I$TZV9m>Sx55}Dym7kCrSImt zM%IMwl93VdpUd%QJA%z&nD7=ZH@ao#Mz&girhZ!$zl7QrMl3-1v+7C4n7M?Z*5lF| zxOG}VxO$q^v(mKr*XOsZ2ZdMJ?DQkhu}@WZ_na%|(x9bQuZz8@hn2Qf;LaU@_k8+D zBiqSzbabt8a>!TPgbSmDAe5fUd#YX9A33##OO0memC!|n<iHS^Yk)zyd6ZnfR{6P8 zwNYsqWii3Dl*Lm_3V!0hTU|1ko3W<$*mg}6pI`cA-KY$zq$GF`0;`-bRW9fUV#Xon z;VmZwR8a^|B+_rX<fOzMU^wmTK$<E%)Vv$RKMUvnp?kv9@bwzO{PNtQ`K$J9eZmdm z6=$;c;eg*Q(!`X)u?h4#NnN3C@zjLDUbI^EoY!W9inlq5*@S<!!Qc6L%7n<s0!0oL z$|p&Ef*6CbE1DpG&zAKSB6+dK4@bXAg5h>Zfzi%_L>`EeuEHF3$Lq}F_*bs}>Dm%z z1Rxt674zgJl?q2B;HHO94$PL_BhJHS0c+BpI+_7uVbA#~bJfU*)iK<|eMipr?kAJ^ zd1ot+o4j1q+j6-Y8NA-9!83t10{bb_AboK?cQC$Twi2oYbb2)i&gn#3Y9|<8X=o?` z8UW-_%T>Dvk0?K6-&ZKqWqbEPvPX)T;KlKYaiPBTS=-yY0>@I-WTwy>C~VMCEj>ns zoj+DgLV68OHoP{_S*DE9ec7k}xayh3*Wr7)HuyNl_?kC8IlNDz6*>A7;3IEF97>}| zfL&mueLT7g9EMH}w*k8wg?g1lx27=O$Yy2zMC@De>L?vDK75~$@jKG;F6^sxG09@! zNJ7>ke5t>AGbbH4mx5L4oj3Kw;X`a->9r<p_HvG8!aWwfyx~CImA^raHsXN@ykQp4 zBJ*SK=S~q_KEz!LmAzWGqD{jEZ~s;M6v&S!E;7R$8jbeKC2?E5bcOV&1G(zO&10;? zx1XIVB%r1Bhnt0h^xM1v2e$~mQ3%Q~L|fx*`(&+&*4yujO%Zv1H_>`hpuLz2VD09_ zwAH;`ZyPi|VTu}ngN(j3ZkSjv3z9Jy|7)PPmr&Ji4kLeYwWUy;qqE1m>?P}5@U?@~ za@O)&^ZS}=|NWJ#uN0o%M3c8}9lfnFZZA40{!JWNUa+mA>_c~RurOWr3A4wKu3T9M z7J7jZSEAJvue>?34r&c9&_&lnhP*R$8?el5);nj<xNP%Y3|_OJr3XIkEIfrWpeC-9 z+il_D{G_^|uOA=CE1uc^4h_os9c<JX`1kZV0n)m}AVKgLe;oU2+s$q;`x`OY7lJ-1 z1*BVCND?i>hl?$wm^FLsZZa;XpP!H0_K<Oo4#>5fgm?-}n|eXo-g%UN16n&a(rE`4 z?FkMV^4A=MmNt?sVM@p~C;avW5cx}Vw+~583MoxcWpm{BsuQ_1!UpD)mN|vyYSwa- zzFW^A3aX*fX}OM{w||T4rgq{r^T76Gbap=ROQ4~1x<{CJjUPH|1{u11)*JR2gOjPg z<oH2%Ba`tRE5JgXi2x<eP39Gj;(_#XhOdA(YJR6t$rOvP9$zFLz>pLJK&vQrS`YzY z5Z^X$X)AEj>*h&k2V3>303m8L#}GN~cuW<<@Y4{pQFG;CeIb@Q#cM9j(^PlNqi-QA z>8Ur3kMl0$gjnCcvEcJsu}Ve|=*c)W_mE2yXmnS*7de1sI`d!}_9>a)ZPf9h^Yzl7 zy3cLZ>?4pu^20bwF(!qeUY&2W4ZKtDUBS}%!xg2xU~a57`FBu2J#jsFaHyJ&^=Mpr zH#BvLg>>C;;yy;L=I{1?$^=W$)r0vtXXEaJ**+%eK6brWEX8xT--mmQLZD8&P(XzW zLxhZK*g(ITe$e36_OgF<^Hwn3UL*nQ>j;<A$jXY?zmapTHz}I}CD-g$dG><hKLjPR z(Pl$j*&LjFW+f<JU%4FT3HPOhipX;BL*zK3bYA&9)q%bBWX=CAE9{{)ttMa&*Aq%C z1(V321RsZtQc+1+HTE_(#`v>x#|6F_9a>TX@o5yW4FL*x`f?#vQH?8x<+*fAW+@z| z98yA|vIJYR`n-x}%%+a6;R&U~iJP}l^(vhDZr5FkJpX0Oi%^%F#GYe-^G3e(qQl!V z`^iUdlHZMTJiCa<x1z`iW9JhxN5<BZZ~FtAG1;Pxr4-q)OD7|Nq@OB>Pa4Kw_jF7& z?ixj;1=DZSA5B#ca-ob=lkyPYh82bLjsctkj@b$TR~xzii9RV!A&gluzgQzB9yVEH zTm}-H#wn{Gt%s4!2L3%MxjJi^-};-N_gzgth~y+_;{(xc<xS7-W0?;`w|?B>NO+vM zLK-p8kP#r?MDccs;!WF!R$B(b=Bi)Bq{J;f_s@-kiuxQ8#F8!A07#RYSDL{&!6CWE zMP&7d;|2?vY6z={9&3o~{h|_X{2dGb{Ck>>&S^3m2}iHdPSd-f3=Ts5rIA<$XO;2Y zO0}nXRch}{YHPWDcy2vnefE;A_}g}Wt96L3DUY!}NqV-Wce;%7Ivwh8uV`ghcF*qY zgXpcpLn@9BfsX%A9}!(*E<5XzE$qqb%ls^l`-z=}hApd7j7%Sknm6!o3^Qswt($n; zOI*T=+RyV>KTjooI<cDDzf?;P<z=1Hl>&7<f^W^gAbMa!l-QD@zxuyTt9V1TlC6@w z$FH*rf1c03SXn1<(=x9U@rm`avwP>q?TX!l2Vt^rN&8q+v$O2cc6YY`a*#ym%<gIH zAI5chi~k#<65`8SHO$^bL~%^BL_{-=;sn$h;j@TiTt*VEV7U9=Wm7~%>r$-*e>&WM zL(gPtrZ(K7Z~mTJo$sgpH8^aQ$3l~B^t!mLa{)-01?f3@%rf#SdNZ49V$0d-mfm)Q zlh*{O)JS#ucQZWkZI9_})wEMOWJ)7?NbOHPTkS4s!ckeHj{RX#RYCc9UpeN#DOMXS zHn1z0SJa~5k}ck-P!^Qf`Z8x&>0|HXDkg0rhb<}RZ8s%1mBO4B$TVV9$=6URf%C!D z*JXpTV|gij0;v3BU&MYz3-(;?n6SWxU{lUUO8u%W-)3BTuXuZ1>O2KyuMn5_E|MD7 zn_`r8cFpPW2*v!5i(UehKguR}WKuY11yqe0#|-&mZ@U56Kt&~MST~cH#UT_zk)mD5 zn1qSNX5Ah?09lDWickfSE#T`X7h(`~+o8cTsi`P)snb_j_>lG2&DaF(pXpDFQrhij z(SOqN6X~s{C;}xjcq?nQrl;uX=RAQ7V3RpI5Pp>Oah>`jku{FEl~+k*(XtRBCeKEL zdE@uV)6+F4m~{(<J4U-u+f=v`yP+}c=w<#;9}RG$iok|yt28A^=uxeU@&uZ}I~fXJ zsemV|5<k>RQ}D*F$JH`DqW`>vp;h?U`z_mkObG>|1=8XZtWyC5m@HRhu=AKv@@`>E zX0n{vC8sKs&!~E>X4@l*b2V2T05Hw>?8{(<QuA1p$e8)XMA3;@FDPr{nvTwH974aJ zm@FL1Fs{u>{U9u)yOerlBeDOjklXYgNgJ^4x3JLyP?k_5wLiT28En^-#C6)~K4+Up z4oI{CZBaQNf;&Q$hyfZNN>@MwT6cAOXY|Ly-6%XY47y0I@kj_39F8ZAonhx^4Ud#i zc9}L)N!D0ywx*u$1*a@WK_F^>pt?W>BN!e*1wR`qSR-Xbl}HGFCysMA6I-O(^I4@j zRBd|Qy)q`I=d(uk_HcCjD@%$10<`J5x~KMIU!h4(l8Aw|QtyR?<N}f72cqD+31`<- zfi=l;^Lcg!K#Mu=yr=hLEVP8%KmR%()ZF>T@w02G<7meD6T83^hL}r32uV>CbZp^B zP9`Fl+;1Z7wiz>EkSgyv0@$}(Tm=tObhaVsEKk~>yrFQ}N@|_dd!WQ?#htOYGb@EI zA7Cm@o`!3V;`3j2JoeJCFS+-^6jDBMC@N#}w%a@1-F~{k%hQY-?u1PaYk>RZ51Zfa z=QvJjJq*yEUza2z@ZyPpgoBoF{MUEFeQ?kC?=~J`a6~REw_6FnR|~>;B_T0I=-;sx ze?jh^LCB*JsVvWloqL;WNv~{DH1)@W!_w@KOd5nbfgs=50%dYQ*9;T8Si-)xcxA3P zxihb-*@TLUK)wKG&N(T+B5sO!`_;>-0N5}-dLNI6;oB10{?e6s3DU0+{01E|?^GKz z3Qi;+^A3iE0|D)L@c&L;=C|J8si3u@h16|d)ut^CB>w7N(j|=;#@e7xp=roSLJVBl z@Z~tH=zHOf_Xdl7kn$1GKG0pG;t@_m%ph0uFmSTM?TG%NjKH#V`Ji=wLsf6mxFiFk z)}~oe?l8~Vxj}$v;WStu!&fwh$&WD@?i=pw2Z3?$RJdxDb*k;JO8Y%x2`ER|J(ooE zk!kzdm5V3TT6h458yFqvH$qKSn{BgXS+vk#?cyP@X)-PZ0Gq7cy04Mol^LB|?0NT! zPquf7d++C;;%m_xfp<Q=LGvrtlBk~{1UOa8oA!RbE7!32u=9zf;3r)gnD$Dneky?b zQ0Pl%A2u1%V~w}&Qm1&-=aUMyX7Otua<4c4R9}8?yi)L~otx=Qh3YwT@}^*T+<6Ko z3RUd??2NHjPK^3Mq2!Yh<%b5Ng0E6vjB+pa8uHEEIj{In1rMy7j*w|ds-lC6V2O(S zmT`3+utGHHTUh851|9o1r4~rakEO3~p^1nL2=o8H_U0DrvwIG=&=lo=`OJJCebcE# z*Ki<UZ-%HVrYnL<u8qcTOk0?Z5QeMC!F+vCT~)`4Ki@<GQ`2etX@RkAEJoYDknapw zdzpLxBm-XDKX4CvC?0FI#PcVye@!kv3}8+o%ACNxkG7ncNUf^zzoT!MfMog#fj%rc zbmB#V_~$F6XlD1ceqBNmt3^m2s@(lBYik!8sv!h>(pv(T_dN)p8(lPZ{+?N@T`S@| z;Hq$2DU<h;)#Go3TAvp@#NmT{weqhTJMrF`llz*ZyJDgUUHi42o#{sLIaj-a3~~nV zFR>UlGl@(mV&K=yQp}t4FB(O7LUrJ$5iY4Rjq#n_^=>$vrqAAfQ6;!ENZ-qfOWjbX z(p7Y!&FERDrQZ9Wdg<f3X&teUt?Jw~iBP4U<1&&o&+=zeKSt@54UIg->HEoRN)vf& zl<ymR{#C4m#L%WB+(=F#r~7+h!@~zn-U&-zZXx?iG;uq!T7N$8`<u_t6(r>)s0gn7 z9%+~#ZdM7LS@bpW*bq({%89djrtqOXWSHR=dc|>Ss2k~SSZwKu;yO3;JQM$un?dut zPgMEiT2&ejk8q$(iS80b?HGg@ygn2k#zvc{B-p`)d)kHSpK9ZJHGZ|*7m9ERn~Y}a z9?DY_=&AZXn#<$%c5G8pS)76HBuC>KiP2bFdH$!7H&&M8o!&@6N~F*cm>xx&Wzb|3 zzML>$HiV8SBe{bm+TKpYys>ymX-}|<iDm&c{J}CuhIxM73iV;^s2rXYS8h112s|<; z8`BDtLgi8>eTjxu@q?C{K6Gp9FHS8EWEMvUCquM1m@7oT=eWuljGYb?1Hd0910<;) zhlS)8EW?AqN4KI%OxHB^^R0VFM;y6c_BiSPbcoxoGGV0C85TEnK)hpCW*;yO`%Y5p z?zZbB4mB}t%9@F{gCi>gL_!Kw7dzXn&S(w3gzByeo9mmfr!M(*x1W=xsS6Q;SVEHY z7#%ILqL9JkBKi1N7Z|NzYs{J*s{t6Xk*bp7T!FZ6H>3-aqz&Vn5%=gtO$IPZyw&;Z z7!o^4qoz~EfgUHAR8u#4o%j$@Le3y&W<n-_xP!|`6YWZmrXsNv;3Are&0~~hx6G4t zP3*`YB(-`fR#yYkiH!#83v5<CU)=N0iknrs%PK@1_o2=FOn%==y+)mG@+bBj@GEmN z$U%4jD%a4`Xc}u!+Hx;v3@0hhz6CLN!;{>9{)}E&SfnNXShj=dM_23Y<3ny3-0HZk zsCO%3$d9DIwW&(|#fzv*7QXNA&Aplp4r``C2?=bx+<SIIp1lpYmcj9vD?veRDsA85 ze9KgzHTWX;N)5KLF+y;yr8hEpP!5jw1hCW+D@VWo{VwLMrQA8i&Q%*L(I=q%th{|2 zTY%zYJNl0mLxu-i<uiug{Woco@C>x(&Gn9^UK6^`KXUE*(u+MkJthbNgzC0NLPJCO zXafX?DA}boG}S8~n-gzH4mNAb2j(Z?8k)v9Mz{b4)Nor{p$-}$aelaCI@hNgfyK$} z%gW4+_TbWgdBNk`RxH;M+XjT$0cTH-06K`f|D=oC4uyl{j~EyTS&3MAhnrgC5upxJ zS&CbkJI+eIFT>BjPs@+LraTD!A>cf@C$yYhW|uYs=tA$=RP_u!YA1~tcpakm03iG; zDwegaKv?WHSJ#M!v63z+Z^(<zm*04A7wM3z&Q<A1+-B1*h`#$NjGh;w5ZCs2z$zp% z<bkm&CEK$QCmwLZ@XG`W27JtTk7SqdON)RH3oqm>U#*b}2~iMP2wAF<0z}BTvZ;;N z1Dqsg1?YINA7G*i^D;DF<^RaHj52L<=HsEqG<{fTHLPx3R4u{qZ;*Wd#Fv?&*M0Cu za9BvNHcQ8u(aneNB&YvG$h#?)FNcG<m4cre+L~WbT=OakC(^$8UU}1TM+aaerZ?SZ zK|Esxu!141_<@io?FbTn9$^|7n5}QXLT>pUny}qY9jx%R`Mt%(mCAH@Xk5`#nn3lf z>dRonYW1I~swosbdf*+)I_nY*GiUGzv}2-I!<f-X<T=igWq+#r+eUyu^kT`bAWwD9 zAtG8#$<Yx+tR?X|O_rNIXLW?s5+&T~v^-!XT`FrbHMU}YK|bF$ZfbRJ6e7sz+vLBh z#kU++D|mOq2-LVaFIsD$#s}*KTfo`}=pNf1<Olq$r?#Dh{rh1#X1O{=Tl{&g41~C_ zHC^~_yFkf66K3UsR0l`0?@I_g`Rn6Gz&qAkpK~mCR?{Fp&g**E+S#R;V4WBqkG*>I z`nEpR<48xj4`H1^iC<m?Le-WBNjaTtPH%}t$>YMZQ!QSTJ?pWMZ6kjur$8oZ`y|wY zrz<YNIn+t`Tl%e!>J+cTwCBQGJ)C$FpD_!uQ9r>ezOcW|C={1~XhS_(R1$c=`hxfl z033QNlvKb<O|8<KyjCEf{wX*=!c1JqvA_t30Z;Xs4!i<T47YZX5Z`}GNETChtV}tU z7l{0G{yulo{myOUPT6z%bQL^Zbf(r-(vqY6l;A@k?Bl}qVB3ax?&IzIEgIq#hdLLD z)-yEbL(MLysD)Ey{SzCZetCB_Os+<wb%91;y)8E4D6_wTl;+Q@oWAv>*`JHN$;O8_ zZO5O1CpfKYz-PW`gUW#@q^JDrN)u4eQZTS(`WUWmj^{06j!?dO!rs|%60P~{yzIt5 zIW2g#VVEgqA<Z#+7MW1vL7Hc;x(M49wy!bWsny6;y=@2fcu=BXNTkOOVCuu?%srW( zzt^%c6ukii;`l8-{a!WG&cE@ME^+jnOBkLfbr&d&Ds5O;HyGQsfK~j?ZSR5<j@6AB zwhr1kPop87Jym@-;Usp=XiIx2{fv_(JpeS2-bMM<GDkLE`WEHVSNR1}04a0rhg@Py zSuyRQLl279fsjzY&__=H6b$>)%fklk|7<mN2UP1S)}=*!p>e6HkeWF7mx|}UR(c#< zY|T6s_|UczmvZfWEgp}B31_h+%V#S$q#IJSj=1tqvkjSXtB%p3F?Zeu&sLhHjrk+- z2g?lDh#N!<%>|Ntw4?AxQ<=H_oVy^0=DSEdOvu^-i$uYpI>NftlQ@N0^shd$@R+*= zU>$pT@)LC+@O76GyS90(`F;I!)RQBwHyiaAjnpmyZayZTDGi~9Br|XnUq6)d+fR*6 zal+g7y#&nxRBym&W)2{ixmXiB-c$i8_-#_~Bj4A6cR4B)Cq`WMI!ovb?O)YWJ)e=h zMJJZ*t|xj$f!R0}>==^8(5bc8PLBcsxLi(zm)a|J_l{N*vg~VX7)yb*cd8(AtMug{ zZIJYsF?u?XYb2IIHJy$GFBs+2P-t{a-4io>!%Pp!1dbH1)?G&dg7{O5qpwAHrQc*C z_zFE3`KzQ;ZrWr=FH1zyFe4Lhvu0mj7Mf12cBmB|Sk1r!WNVi++AUz~m1*}CsI@lz z?i=T#e67{@4XhbK_Ivdxfy$^jN&uJ5(_0xTR7quZTnXx))OxZO;dOp-8Y#*qC#7YQ zuzT%G?^Q4QNw$ICwUWLNIq7{lt57fO1&C`&S+0vHhOMB6zB-k_gH9z_js=|b6FCRt zvs3!nmlPK&_nPCk?)cof3A<?tNP5FQ>MPx_J;*nn?7-OBD(M2VU~=o{*wv75ZvXfR z5=AtB=POoEywUCO^wLpVCoh>N>_rmH_G_mH(LM=QjUrMlN|Vw}em0fr@bGiW=)n=P zD6p!hVzdJ0aXtJ;ZPiZj&Dx5kpF1SeBZ8{W`2F>EMaEX=Me}t0w}nDwm``NdT==tJ zaW$>b_4e@D%q2vuQc`9>AzQ`eHHk^h?$XJEpe!l$5gtxI{4*y3je}rq_-K_LJryEh ztt(qiJ^&i_2untXoJS9sMmkRF2AM(0Yl;f>Tqy2`7|~4_h~<sre5=r;1`+iQ-y6A8 zpARM`oI@HHHi~+g4&$RfS>Ua0fDx2XhQgf0U$rLbZ=Bl_O4)6DHK_d9#5AvRS5mlx zJJ@<tP?f=z{O`}q@2H{A%ATC}Kf3Xor7z#~v>ryX-)VmA<J}$`mjeZ&AooYOFD=!m zQwaJ)!|4EnnLz#0vLPKc(gYhrCH96soKP87hNLIdzkV@_f#*ne)VHd>-vDI`=lyC~ zRLu}C%I<!3Sfb|?T^sLW%yC#)?6G=lYnxnKKL9ELR{}QIBp1QFdPDM&5s+4i=w1fc zd6z+oJwDDZud>q6zH_*J-8u~t|EU*doNG8;!)dP)hL+)~Hk1-8hKg#~+B22sEr+<O zmyHzXR+ZB@gtM-566)&a8hssXN^8z;Uc4cazwh#ph-vP6ugu@ye)Lj*cPy}PVy$pb z%owA9QChC6&bHrq{Kv#ekkhthAX&81_sgS}r9kle`)|uD5a8qK5rfVzl7E_M#7bm~ z{hF1q_PNgn`1zpYvaWe^p*?~p8IKn04x5we>%JTc%Sw$>(B;FMORYO-pQZ}KdaDdS zN+1h5uM{@`Y5k;ixoy+M&RUOa1#DKPKtE07p3DibyO+sS2==;G{BghL;?ZTf%Y26_ zuNnm9VJD*udy$eG{<r4Sr%x%xIv<vqmRkYh-x^7v@m&D-I+KQ@7fc@*?mJq#ElfH> z#@5+-3cKVe|8|eR);vJ-9Lw{sd$)89u>XS1l}GUTf$F`K#V%-bGwSh$?(gjPtA;!1 zLPkx0#PCia;G-LvD?_2cZ)!%fZo88jif-=WH8O?_AEvwolz6eurfO=Lv@?T=aXZH9 z1}1&&<y>dw^cpK$)<Xzx61{pT=wakuC>_ZIFSQIc-F>yF`E*07-REI4{%m#}i}fzm zD%}>t<v+5gYeL^yDKho7`~DdDVSNgf-I_hl<ei4dXtL)`n#_RG1^)EM!`eH`ajwD= z>S+*Hm|1Vqkwq!ui8E5*N#idMr91G^1_6>#&yFN}f>=u#hDYj;e6d>!jahAWkC0Nf zx#UV^6zVeeEWcsWah{+9W-+h_RUI@5*bOv{hiAAk^k-~0sKH0;lRT^wfg*tR(W~z> z^UR!+RSmQV4(S9>fr9h}>)Lv#vvZHHO`u9=^Skz}A4AKT44yA}(He=5ajE?Gk6S6% z?+S@;N$*j6--~lA+AFCSd{$>dMyJR{()7K_jEjT>jZ0K#e+J3Lw3&8E77dFs_5JfG ztPVy7dE1Bp)>S>FyTerSCqam7VINdKyj(Gl`BBL%0oIl?*#aSDOl}*#_OJ1E64Xsz zcPcSzQH&8lP&|*}Lglw_)JV}aEHdfM)l1cyMGBjG*=cW?$kZAuEB1PgSpPOK+A-@7 zDw0%&?U^E^=$?DUw))^FzZ8%b2$c9BvV_*hQ*|dbN-n4-uX}nryYa6so=JS(x+^Tj z7k)@V@tfH9m)1q_#m)P(^&`uF^2&dL`)|yT|5aSe%U_-U8#xQU3I2k=`u*+Z%lh?~ zlYfm@SO04NnIHcR{z-nyawSh!MFC^Rz6IVq3B3&Exnc<fZQf8OE6?y=TF+}D%5|@s zz7NRP9)WQ+=1rC*30($H!}Xc^ch#1S4r(;}#Mt?|@__NzvTMOJ!{2{O(a<mF6bO8o zFc39;QZts{`(7ew=}4hZQrlulcx=R$01nWWf=|_o2hEhCC(hTp`!)?D9DYk&zsFor z{o!sSdDOl`@snFjkp1g*j(K17X1qJ5$xZO|+2+e7MKi_7IlqRe6>g<xH!qsLl`wBg zfX3&YZ>l=aRBYb7Bx7S1IA}n!oYXSh(R^v3c_;GuV(*<>2ya)&?P2<-L>8k%Nc~3N zNYdUK8yjuGz@~`?0Rt#W^eus;E=ksx0PuT~b`Gw)BTC_L|B6kgGBYR4s?qg9Lj%W7 z$-k1YnOA7puazd|4Je&sZNbCOH#9=@VdmBqAzVdfw6aJ5j+sY`RAt%goAB#Coz!QK zIc|vv!-ZJUT(9<izc)H}vRfxdWAi^-+IfN~3H)AxZuS&ivwD$d-8zI+k-Jf?71uVZ zVLZWh*FY3I;Y%if{7festK)BHs@I!Pz@-u&runo;n4bgyReN2bJu5%J&x;~>WyPi) zz9U(#R{FvfmjB8R&@_x_J>zG3)^|`O+N4^aQ6qR;+(c(4o3*|EpL(dD1h?;ID9BVf zjZEOldTO}3del4O5`xLe&vUVT*mWFSX9a)ra6_hRVl=kIXPoQLmEQiBaomo$Z3xx~ zl~y$H_ySmM4fU&{R#T}sBTZ3^8HyY*R!Fud({`T15l~1%7%CACOWYW7fkuAbT4l5+ z|C^?fsxLgThr;Ho)CoaNu~tbL%h&e7+XJm_j;#7OU#Ce7iK?ekMMP*A1V1zu1=Kv{ z4JA0lJs%Ff|5HZnpxNF)rz|Y^{l7q_UU<#LjnbP3k<w#xOz(GFOuvIlDWdgKxz}+0 zf+srrs|cMAQXwQQ?Qqe!+)QP7&c!>mHhYxH-bw6(Bi7ZF*XghN@57S_aEM}ObmIiQ zZs^l+INgQHifP8)(sxa2qogra7?|!-b$HZvEZ~dH*3?s-K2kHPxh`>^E-t+`e4>>> z?v3R%IjI%X-(-J-{_a6%9ED#MWy`-~C4U8b)ai(#=PZAO?{XT3dAhgKJ7Lzk(TsB5 zU~LD%;i)iAlE?go7bQBBT@WKWqHY(C##-Rf!d4}D!GqiXuDnu=E=^L<?_W0B=`Yab z`u%+I7n1TDnbrff0pu5@VP5toMoEs>t}R5uKfWP`uq8Yq`uZvI?hvsJG)<oB;}J*? z>s2w_@Hic`eMFGoRSekiT#;}BA&DeBslu;&KSG7{t@~1itsb;u-Rj#AoX;5qGNv=> z{way#;gHVsx<Q0q2MA7ZrY9JO4+?n{ShOKnYi>`yvRxqiL{D>}kl%0dGI@9X?}`3l zl0j<fw}A*FpOO0w=A-GKbDFuYclh-AMGN{8fTLx4`gT$Of^0F(ALMT?zk}eabJ}q$ z7i$C&MWR!A*|}U&L5Y)5fdf~|G|a8w(La~>)*>QecDqU6^ct#WL9aY_jhuFE3Li=g zSfG0rZN;l$_yV9Xt~XqO9VS8I^`uMbXc($DTA-quki2#}qv0^DYemde#xtT<Mfa;B zS}VXX!`DD1pQSZFp+fa}PG?!CR6a`##3<&TeQBBm5Qk!C-=j&DHolGDG}zAed*j!= zspV+UzxsJ4MQl9aD090d(ME(4?QqJ~F(9Yr$>eBU7+0f!(K=OF`r>|J){yDIKHX{G z!LH^tHoooI2u(}39V29yc|Wy}g&~&%armxXx@*imP2q|)Y?rpp9rZ_J@nuFOW0AkQ z02l!JyX|OoWK%3t<a391jbH+InG3oE0Q(_A@{Y^f_Pwg)`9B8TJ-xJ#F`)Rx`$y3F za|7djemZm(Ty5L*r%0Jgqhmca_c`yx4=$A;&W~Adu<B?OlI4`M{H}fh|0|-S?=OB$ zJ$#H*cW%Gr^A+AUSMXgt)LF?Hdvksa72yH)K225|$>Yus#2pad>{RpFfqhUtLsht_ z8r@A}vVAIi_ak+f#ze#Op>fQ){AKX^rHEwpD_?72>D_a!o>|SvH-Q^ZSv}<!g2Oq3 zQDxg|mpfB!FsYYZmeIL?NlE!Ge`W(k7rHFIZ3tmj0=YUam9Lk%0aMjw*Jz76$7QZP z)kb?+?79}ZndCgB%~`ljoWK^{F+srd5d_&<4NAZv)!jty%1vnuHf5Vpu|=Cy%az=8 zv+}o$MK#4$PIw~`3Sj2z>HGdq|6I4u@G-73f)onF2~F%y10kUA^mF!W#lBZ_t2LXx zRJ~=Z`9Aq?a-u4BPb=1yNPu95UVP`kl1*u9adwdCL;ZQD+MvttpZ&@vN_1-q^<RA3 zNbo-@eUJ(JYTMLZ#`t>sek3{jN^e}Br8Qi=ExM<#SXN%NSrrOGrIfLxGDnoL5K0)r zrjfXc2fuz9yyC-030VV?=0u(q<1MU+Mbna_Ao#_8KSu4ij1CU3dP=OM#3#&;U2d$_ zd2V192Q_(pLOp6E@bS1_AA~-D43U3ln+neUYY@?H&cG!M7q%Wn910bB^l>*sU-3p) zERmLEG2#cXE}9R!9oiz>`#l>fi;q@HyA7xzr0w#W7@u0FM&r}fVEMQY!YaB^bs79% znh2dQud7P_-dTDuJmhV<8Xp$+1Cwe@i?6Jq@br<VmgA2y7aoiHxE;d}|JE^vbe&Tc z?FB**d1KGH@@DI@`nt>n`Qb9^SsJ35YFHzFE8m>8YWq6;q(-d4<|yx{hP+YwqU$X) z{Rz!*Q~YoH^v6@|#9<$48LFh%I3$)voh3<00IAV)+&VKJ1L<V_of`Vt&xcrswdA7f z*6LHjXFv#j>J=C{u^t^S#7~#RfJ=><<ROA%J*-H`5{7OKa)r4;=6}o34o~Z%|Kf+l zl#X;!^(6&;)T3+6UmFukj98wl>7P@lnNwQpz;MU{u)&)|TD9BOcnaYTMY^+Y*=*~G zk3A+MLjr2`u;XD9Ts%4|m7btNxpt_?9=+oMgZ(B3p+ITSDr|FJt+Cpr&6?hCMtUFO z691Jg|Kbb{r{A~yohB<5wW7pyuwf-VYuo23MrGk_2GFncq{L1470&ZMB`&F!zBb9* zHp{E#zNxNkH47@QC8^WhWFG{r&H&Y@dVO}7StpwVS4C530!SVneyNueQ8bFenlTup zxUK7s<tnL!<n+bRiY@Y1I_6&=)-=1o>9TU`dCoLTWOWSVMuX(zMm?$1yld|7VvRzv z3f`qCQVk<FCoTC$&Enc&3pwctX41NuNzbX8K#L;xJm0u9>Q#lZFbp?-JyF0G?Lcbc z+sBlJy`Hmmi~RmJ_1t-F#+z|>P-tzM;%Pm+S*7ugn~>Y>habi{$wEFpDOw1=y!`k5 zDtP(&-{OIdjAuN+Nt2tJT)VqqX+iPn-IbUp-88XT!YJKhH(#BZhr&`C<G42u742To zmhryDV^~w9S-2wxEA8oIgD=Owf85RuN*7U0)wyBFpE-FiQeKHiy8D)I`a(kcGBO4} z3$InZTE+6NlVXU4-aYlI8aZ`nM%P-oD<Q3vE)@T5!*+|AzcjML48anfA7#2aqfc;A zfDg2ic{;-FuJn~1_X1b!#0(%Os62aio=RjW?Q1wtSeLD{RME`@80l;0D5lB&OkC!c zIPF)uw<;ev$s;cLg`9N8v&9ST88WEt)Km-|dU-v?XimsD$3l>NU3%O+GHNQLX_Fva zanM&IueZG}pX*X|&Sszv4x5*PKeU3|R#yR$oiq=A1~`6|VrTleUNja7DH!aY9FO{V z>TVRPMp?x;exgj-iRG-Cj-l!_MkAu-^aqOxrFK@)_9W_xGh8`N5@3)M5@EWgp*ufh zGJ({%=bWjo7Gk@aYDk+U$yIThZ)k6^MuS_CjMZ-RkrEKEb;b$L*;=~cS@c@x^?Tf( zY?Uo}Y8aBu4Apg^o-7F?!KT=v=~)+hPjKx2A?zE2G-<jhpSEq=wr$(CZQHhc+O|E@ zn6_<W+P1de{bGObjf#wnsH%*rimaQNH}5$I+YR=s)1b{DjJHQqD^oruxqF$p>`X#= zt(7SY`o@e-ft?-`oH4VQZYcwctgpXR@0_uZ57*cPE8JAYRbFi~B`pRWot94d{CwV7 zw<)M<d4t9yP^))fepy@7S*Vf*nVG!S(wHjQo1+^>vrl))E+ZcyF%KW!pj-ZY%Cb7r z4eWbPDLu$Zi+YzT8iGj!9kz+AMm4}qtfhsa!mwHc2Dd7{NZqkmb+gF_r|iy-smknW z1H>&mdT5EcXw*oDF1=!POng-vR>Q<`(boq3?`+zqT%`t;-~RhT)qZGCPj*GQ_7G#W zn0O;5mKrVZysy({oAMX}a(dDfQ|h=6Jq2jpKZD_P1?Ye3XbDM5`Kg-{@e&|s&-l0p zG`7Awpm%(mGDrR~LTt=;_fdN%5(v!s>faels(tnrzFE7vu+|mh_7!i{u6C%Kst)vh z&7SO>P0^-?nr236TIxjMv;%({Wi_F4m5eQ!Ytw`2#pfCLl%j)vFhZd>)20C@Y3>cT z7F665Nvv-4E&c~)TYgF>`Ylf~k^-zwPWa1Uu@%qS*2S1rts|4NX{=fxmCh}jFLR}y z2Jdub6ItO>+xXIVZPm(j)yPfQ5%MZx?VNY5Wy{ujH1C?u34UHy0d#5{h%Xr4o-oPv zkFe5jd9wx$?Hnp~$_Ci|2(kWBDf<lCPs<X?XkXb3I{^!@d}oh58QxVsNT(s9>xHwI zYHr0pQlv?X%FEAGE^3$|ShS{$n2lzJ`quf@#U!KXN=b=hvJ9K)Y|c%s;*a926~meo zL8;5=xB6&hqx&t9kFuJyS~O`r3hR?*u_Ml3#&y$+#_488M)4S|c)&SQ;;$fGANFAk zysoe28s(#%wf2*0v4y?p6Fwz*B5w9gg(rl6wbWHW8-0(eiApxv)8XW3)biC>#|mwA zTGi2yi?&s(y*K9tLXC8psQ%u`@rTN*VP`g~2r^MPF>7Rb_5S7MRedar?#iq>qp-3U zVC<wwMc<i>w^=Csg_Wa1f<6gSClcwo&<Rdk<>XZDP48aOLzZ;t&6o2;oo9oBzG90b zRoaIf7!hZ@I!BWOt$~C(a3JssbSX|!sev>mQ=yxlxJLFd@9+~4Z;AGjxuf-4H)`Fg zn8$wblx!Yl#+V@;^10FoZECBg&Ulk(z;Z3#d*p8h;D8Wl{(<hI)(%gHbwNR1KGrl> zXB=(#o4!B;MB4i)36KJi+Cu@6I0B3Bf~lrLr-2uEq8V;Q%1Q!8rZ5&%sA@24`p0$3 zQw@~g5C$|9Ib8IFhnP(6DI9dnTPA;gPo~VDf_bt7f)?s5!-4ix);cS^m@M_L!yd+8 zvP0g;^HTo1za3pMI33i7u_4~^W-rcINw%e9`e|TAS9C`QT18&V!kgvFO6$K4KJE;3 z!p?4eGbhcN;)l-I++K!Uj1_F#VdZ6(oACU{mS7OZn;Iyhyq1qRH2-d`WF5Fsl*TWK zJfuvurYSfwE{Q$RY8o>cdts!kx$)B3dSv7)6fh5)GmZ{;Q)h7FR=C_3lOXM1>uBWY zx0Nm5Ej^w43j+Mv->hp-j(>v~Uq|(r(3}Y@&WrU8*j8GVS*E61&X?-9wr3k_a#%La zv(ZqQlS`)$Xs`C<r`qdz$_`9Yo&+&*{nb!gXKh7Fo=`y?3&E0cty$7jQQpdtk#^s3 zi_=!8MGw~&r&VVvMyt{s6ss0*tYjWH(q7cW&eD=x2A9ob9K#Byp&^}jU0r359%CIt z_cB25enDcM@8MGGw&V_7G_o@ikHcc2RF{@(Q`gtiuB)_>lT&XIkJU7@GX2@+1V=%U z9S&a7&(X+BZlj4op@4hoQB5HftnWSAvK}oK5@vKE^aW_gnMyCob?c-R&1Xl?sj`@W zg`0o}^{*PAw4}de!cxzGooSYaSgvDy_;<lq>3qJ4kkf`S**dw=wp#PGJex4ZMb{tJ z6Q2)Y9B1M!fZ3K8MOlk@v3H{~>Q`&i#vKj}C$rI^i*7dj_&qyqdGQ0VQL_PGH(4W) zei2zZXkf(Ls^IKoDaxwiid<kqoHsy$Z}A^NLY_#0K1VDOqxQjB%Qrlr0er}0L`cwq z$!0Pwb=ugBKM}zpIfgpvcs8|Gn?{F5_ci+Hm&ok_USeT_Ck*BVerb|ICIA5jML5mx zClxvv876fybAiTOTh{NO=<jWT#**(dtv++3m`(W&nP~(v^^8*fH&|IAqa<TK+;+d) zp8Qz}K~4OJ^|ukS<^14)=gmFFe{}u66JKiRdJ;Rj^JydWJ?2vV>I3J7JhCay#)q>@ zbiVhN<CVsZN`dP03&MTxKxdD#r2T0kMem^=bf~?L6r6szJFP)R>HH|!Xq2H8SqOUo z0>RA6<rp$q&Dg|oL)jm6qD?QWf%M<y=DX9b&qf9|1xAVrwJTNQqESrzEVxoR5$bV9 zM$;y<AGan$Ic8*yC8tK9qgFI(n+0`lFK*k;L_+p6e`olTgFUWAUy9d9&Q0}T=+lap z*z+}?k%3RnBZ1JXU;~@gv!TLHT`Xg#@}=qgJG0nkkp8rN^o9YpcskkARU0-iYm7() z`IO;q+#kIkPiPW!h>%AbqMw0Xu#QqeI1mp~S%763ifFiwQcx(2L=*y@g{)X?UTdpu zI~-4Fj1AjJPTj9cNZ0^|2#RW^Y6^qx)}fN-TCBB_)|1+nt!H+uk;8;tBVJRQtBa#T zH-Xly-hdK11rv4Pv#Egb3mB9R2L3ZRceJv#lnt13mKHBnNklqsAuDjxbD4w_Jw3P5 zab{{+8#eBlR#&YwvbIbfC9sZsGShxfEk!M@Fxk3pvRy6KoypnwtPN*ShK??ueA;Q& zaPw~tJ&%VIrcS!_Gx?I9js?nDc3w4vd5n_D9(OxVhqb*o&D7~$N|+0iPIl>|9F2(4 z>MGCpR>%rc5q+O=jIapy8R`C$S;sv*IN1=>y|#&nh67D92aV$`1oD~_O;$?F`dJ;( zzhiGG(=84Xv&Ba1eeO#Mwu`RfUN<~XtR<=W$YX1AkWL+2`OT>-W<geVMu?W}KpgRm z41bZHCDaw4CSjBj`<kFvV*=Y=RE)Ld6$Z4!%GJ|tjMH2FPQz8{V~a%7Vz)C{X6DIO zBq!D!9F@%u<e_^8TH|9Y`MYOYePbJlVV<eOL!a>cuqexB3?_H<&3eA<%ZK*%{*$IO z*2Riax$GRzbOs|M4+%A;DX+L6a$8ONT@wF_YogX;aVFUyVj$uB5SL2Nz0z^r>>d#+ zE*X?@wUpo*&t2JnhlXLeaAiNN`hua5Vyb_f_7<f`n+w3Ecb#iWrRQDm$|U%ml3=u& z?2<i3#t&k`0`d<n_1%tIP0bcud&3x;(sX0cw6iH#gvVMsb7rffS;6J0Djn<CaPL)L z<))1^7~+gQ<x?94{!K#Pl1oKTZ}y^&@wG5+Ei<Ii+5Y%Xx77je33Nw;*&*A%JKMDe zd0`#m+y29krD@N!MIY!SH{u3%p{{5qoe9h>Pu0rnb?M@o22Yq&6>q+I*Ff1u^MOu0 zska~Y!%R)<Q<;B$z_wC^414?hQ|N686o7`ju;7SoIO_TJM|#V0cJ=4gowzHdW^juF zi%Iq_E<Fgv!*XFgFe~Ae1$sJqH(X|g@YPe7lq+=Ba<U4JnDgrN2^lKakfIx1y5*x; z<4c_^d-8IXY}Z^ld6<}_%2UpH(vU=qp;oSTY_z5Va{|X>4*aFfmJ_9T=MlE5P7Gtc z>UJ3y<gN~P`Gr~M+NmzlAssdMoYK4#pKkaSst~mKR?c$1vU1Dy_4PUocoP$nGNp02 z%bx&jB(}#%Bjd4$F)kXXXMZeK0h0;5<rz(g+tT>(WlcBIOz=E=oQT`x(w2h`t*yq7 zs3r<*tUI3kEf3}WCG<ge)a0BO*j4rKwySH7boU!|%BH3iYIn|K3VffK?gINY#Y5%@ z&|~<i^vG@2GM#nICas!mI%sCihHB05bh0>WY<EFtcJlL8W>`&qNiKRy{*!8tUtdu} zzq1+j*HY9>WwDIOsjY8m@sk?8$ppFT*S;uzxCQPn2p&M8j6w0xY2}OlhJ{3xR;6Hx zuX+}YH;i>PUgs$={pFM=KQ1dHSH~%~E*_M!Bl1MB^l&H+f#vwoQ((d-5sKDiv}DCb z3lR~KMSnlGuKkL$)7Y!huU2VvPk+&N<W$2;q#zr@D9tpk%TJ-9s$37*=h3in+-wT) zPWR1dR$}nazq!wX@j`Q#frrwVZbZDNjWVb;1!;8FMzHRIDNTRXP{$Qu!N6E;QLid5 zDZ|Dry~dL1q2I{PGUBM-a!yhpHq;9%opPX;oL|i@ob4$s8K#j+KGPyI3b9*NZsE>i z<1RH-JLOR!*`qK$aL1hVITD}4C1duYHKArm_E4`r&ugj4k@hl7k@7_fK~HMMK-2e# zkH{Gg8Fk-bKBDE3ejV)YT8&o<Gc}<#_{GtxcDMBVC&?D9rTQnA(&w`8c=<)m?P0_E z?UJ(dl9axd0Alw?SS^_-vS1q!d5Diu>YdaQemJaV+ivZZPMa&oL{Fo}l~X>$TJgB~ z24R|h^^a8-Os^X9=uD0#bCbXMmmutryf1I4=!^NBug;frrGOo%XC%fW<zNvx=bs?b zw0oL;QCuWxdXQwb50LdX<{yp=63CIKM;CK5)qzU{-MThWf3R*9z8I*gOM?nWHuZrX zp#bGGeKd_znC}|D-y3cuBNk@R$MoOP`brGL4f#3~;5k%IRlloQWzgpPKnK)1=!PG> zOnGl9dgBM`FVwX}%_y8+sbaAtwp+}~%Aakj7Jv8#U;h1FPUxsOtS0s6n;bUwhn++T zQ@}o@NbNx<Lx?U9?sfkXmvYsU<~>#5G`Nhq$?#CyGAM}EOtFNeYHDaRGk%V`mXj>& zH$%Yi?bt85=+11$8$4CBBG4yE_E!JIppIx6*GN24+OVWq=MW=8r$T%oO(r##5P}Xu zCl@p30mHNTHB?%-s&@``t#Br9`~tQFp=t-=B2~KBF8U}y-~W?hj_NrT0!<`_D(Z$W zhl<hTo?YL*HgZ)tgiG1AQsKRjTI@%)MpaR}J4SxQFy6?k@AIS9d!|d$z|{`%?g;*@ z%_m`|D^J`j_7VKL9kBUexjAm*^nQPBl4v-~B)}Gfn6#V|mrWX%w4VeU*3YL0|8^W7 z76X%oyKg6XZe#}=$DCf8UdF)N%7zZF_N9vl4^t%$JP_cuXz)@D{Tk+L-!AQ)Vcyax zbL7k3TfHLAH{rS_t2wpaqAN$=_ilV_%wEEMyB-0`th>dINoZ+i*pz7t_G&m<7#JyB zCJxN=qk4CY;JN<O+w`lsD})mqdnmzRJ*0?G9Oqh$kSG-?l@wKF6@`F-BR|o0BB{d; ziV2U^5?u#wH+WR`N3X}1Wk)+(r>vEmboA)l(rAvla=>Hh;^5;#OpFSyolNNWCI`EI z((lmA;_D{zxGRHSHr3=NZnHE&*ltJA2-dvA_`$|gy)yCe@;?h!3(qcnMv6n<&uuz- z`5pasZ8E(TPkj~3&=Iq|#ty*Yh5Y95deAP7@?a_&?d7d|D&c4E6`SPLVnzlUEfU4& zJ$L^WlkIj=;p$s>fVOPcFtcO3fOYhA#IwhgI7@iV-x5G=>%R@-rb1aKQEA3@7z<71 zLq&n_?K%q58*`y!L~(Yh@W4pe-r}x!WVz>tKlD}J=6RGCT-2KyxJ6~uI>sylA<0P? zJ}{cBO_3(W-@B3mgK|WG6PZ#KWh375q7LWi*>|uO;J}reDfsy;vnhp_r7qRb_b}U9 zGTM4#vKo0fWe)2}Z8AmJ0JEZ^=7^4Y(P9{0-T$MxEx;rhqj;)OfkkntFqwgRoDlQY z5TMz)tyfp<(dF~x1EHGi4}ol9CC4<JC0I36{~L~JWXQN`WE57!xY|;DFv(<syoVHo zb~Z5wTc<?YMFb{%n{<ZINY^H$?;ArFrMq0QY>ryi@bzu?-L~azH-9LKgj7WQpDokX zE;#>CcFoxsMn(n;3kwSYhkc<uARbdTkd3zS8pp+;He`q}ZR;VWsQ@q7&f2ca)fNpm zF-2Lb&)LE0Fxnc0gKM_+iMW|BiSLhASMgT_040(u4i`iQd@~7Yk*jExDBe{A^(F*- z|NrcuZt~{v-D9M}&jwA%(!ST%@A91fy_YZ|aiF~StiC>CO`-W}BJ}O$5jzmRCxU@J z>~d=@X{o&%`1F^H{4c$_*Xwp2GoA^CuCSbQ?>~U{?d+4bw+HuiKRyPY9r+yl$;<G! z;*_|lsm8XeUkEt>0C+<8c3R8SPt2h3ie;rb8hA!Qe`B-vg#PKgxvj>J&A`F$p%-Q^ zYJ+}Tp#`&>>LN{>-+`i@udf#Y!6E5s#z6RLQ_3z%yl=~AyvxuFWP3E|c_U@T@9KTW z>&O+NZ#!hSGGoSW*t^i9d&WfOJWmVUdkAPf@0ZVr{Ke}IE`e^}vwL;lv)={JM!tyr z*irW5hDJBupDp-Hz8u4$w|`eF+YVkkHaVvfgSA(+fU+EOLI9p30B8UJUaATPg$VQS zfyb^DVk<&Ol@dhH6mTvqG7BKkuQx0JfS@U|BGdv&6ae@D+{gfI@IdfDOQ44b0D^va z6uKcuT^EmWnD=OCNhLJ^?;H<As5e6Jqyd1Vy|q+u>OCT)jAIR$#Si2HDfk(u6afGz z0LTVu0RRkuZZuH<9|!;s1R&%;4{k-2>5O~rot0#7_j+0A_$~RxcY!9*U0wDZZ>(i1 z{D@S@Y%OifQ@5<No1ahNZQ$wIS=r+FIA4Xi-TtF&gAcuGyRv@vD5t3RL1T{OzEZkw zNa(w^?X!D=+4foYUOvIK)@b)*(_wvHy5{Q}sn<F2vG-blMaY0m5D~2CedN1tyNczb z+iKhQWzk^J`M1@%=FNZn7;{woZ?^88Kj!k;NIsdNv9I*!Er7ar><)H4>iaH7pB9JO zx10bxeb>UdfdByJ<96@E9{x2SfA@~xm6PAr*r6M}gL~@LtAjp)g3I<~-!uF>_IpK+ zk+g$$U)TF}pC@PfHGjjC+_izXhmC``690N@)?;;Vwa|6#AHQA)Exx|KYj?OUbDd5I z`_=0Lm%OFtM!sGMHxCFL?x$^g$E$3=tz8wr>pp%tzjIaYUrw8k#oK;b7C#AmJlB2% zUPcd3&S-sJo3BeN8(x0Jj(sDYDd+20xp`ZcahLQ)H!>aD+fOl(Irb;6IqcS;ayjCy zZCei9cAk7@UA2x})qHq-7t@y`8ul{XF>S{nN*9lF684ugy;liX&8_af+Znx+TOIE% zeXr^6c+Gt4)%KM$KDiJ3ZnHdf3uUHgD=y-+IE|ePm)i~$?$s4bt;gUA4lZq1_W9fK zd@U#L#oN!BPjHUx#m$u5C%TTh6J<{{b^Ba$o$WphzVDmw*6HJtg-?c>TR!dG(+Arp zZuz+zT`XP0a%)>VF5b`i&pQa+KJDNe>e$j#+D5Pu=DjA(qtp>RY^&qT_deTh3t(It z?gdv*jZ69WJ+2!$((F1?1>+lbGRW=S*QuWI+De5Rs%}qs(_J*OYc5>X95URvE&QEZ zJMLaq>;~*)D$@Vl&*N8D?dysPmUfIz(o)x(T~B1{F*+}|Efjq8v*0c^@>k+XeAbxM zJ(la%cYt#?U2Sjs-W@UD_@1zmQ%6?Go-uhgPr#rrc6U55%$nzl&oM;)@e7hz%*`rA zY%QU+<QWa?x0ttX+B=@3I<pbT@y_VFd+=1?b-UM1hqzyHZ*)R;^VoApxLPfAcU;+D z?ZUMKv<(3)KyK>X{FfdM`q6xwbX#0n*VYW~+Yxd0TN{O1tw{Fb@Rw>t>x0UdIbHj< zcmT>1?`s=i;R-TQ#8P6^?SXSO$G|$C4yy&&t5fC`9Sry9ki)J~X%Gc%png3#`Rrxk z6{kqmz~Z*(z@jJ(^B^&~z{^1iBml7ewEMDzDN{nJi;m+I-ZpAgv`k|u228aNDTn(j z+k$@GyZsD}O96Si^X7_~O`LX0X}u?dW+}M-pJ(lEuY-|pL68FJu%7G(y=l~|4d)5x z_zQ&I5~;O7jW#E>N%m@8&E<`(?n;dg`~=S}S1LiaCB3X;0B^<Vk4pjo3U%XF;n*r> zd^|`7+Z?c|E$nsL;+xx{pv%ggE7k%hmvxH$LdsJ_wt;39De_KR2ivs_e-LSQ004D& zcd6S%PFH7v>->(rhfl9Y-+jpP_W70LxpXPYioM-hE}W}f0dy4)`_(4hoKP8${gx|G zf$N%w=?dF(Apa_a#g>ahvzywm-KhQaE?s3*Q){~m-cpI~FQdhZDj;dfDlp14Wj%{F z@~w8U=DMx|>>nz0RtRlq`*rB9mM(ZfH~@ruFVlf|V);g&_tlns<Afbkbz6mMkg8-V zZrkQzsTyjy=9O#k1@zUrOG9`1<sZiP_H7An{>ip*J~y=Wx)Za`wt-<3yZgN2QQ`vS zR4VsbR&NUq#KW`hrcPBw?aMknd7JL)TI<53A|V-Ry>$S%GEd{INB7C>!l9{PsU%3V zn%XLeAXoz?a@iJ_un=WUf4f56@v%J|6t!E_x`l^3fW>VN2g2RnTBok-+)eQez@y@! zVQ*BY-uJvY>=#}nB_^$^Rzn49X<05WA*$DE(_K5%t)}A8Z9G^fPNYaeevf~g-gCiW zVz(l1P5~a623^3@Di2=)TN~yGWLoRAqjt@w98-!NoKB}<Zws#tUf#n&ccreI=eF1? z(G4aab#*nkb)uq)kKHv^J;Mhw`-8Kd?R?NL+2PpWvr5p3-|%VctJlr&fbr=1ak&4_ zfRzvl0f?*sKxW_%I~4$k+1S$3(g+R!zy=Yt1YiR!0px)4AI!EP008<&(W*dD2nZmE zI13P*1qC)G7bldc<Xu#dBU$8QgOv@B!v@S+m4zrMm1P6quzm(8kj0;te~c8F2of<6 zaTb(yR_an*TwG0H@d1r@NkH|Ri1krrsw&@-WN{r!>Mc`cUO;v1%<7VeUFwV(j*k!y zJP_#Yr;P<c0Epni;wS)=3JDUbkaaeTmE5Y3Pi67W+B-i^d`aa~LG?pU0hLc>+@fS* zG3k&z;Zem7WpNSi%ycwgWf9@$5kFNF<mC7W=ZY7xv6&GRt=<Yi1R*L|*98GUk&wzt zjDaC?z@~GF*=&5Q^H!CuysGyqV|<Ka3J>E<d??oWtYa!uDi8T6RF!*tRK4UXw<2?L zymI(uaSAGrOyc2l;0vNwXLjTy)}}^@;UPk0gb*dOqKToPKi>)%0K|$72Ot4rwwwiI zTVew-R(_>UDNr2_S&l+m?OSHG;+JLTmxt!3cnk9(KC(W{W|C(WWMRXG%)_y|-U=kC zs-bBFt=3(1t!QE|Ij*r7FY{M*tr*xsSKS?}EfFvdPpfi>i)no=uxoZCv9En`A>7+K zWI!*Pe-!?`F8=M~`SCzXjo$|Aa5p6J_D^!x2vkf}3{A`}x|2H7OhrsiOpT8#WG3Od zta6LzL?9$M;ynl93+d8e$8PBJBamU=k5*9dUYKO>sZria4DrFOVt(G}VoUj#5K8mW z$9LAfzgrGnQo^ayr;21$aV0Grm2gvoI+RD0ntPBCs$~`n0yS~C715U7QS7{#Oe^#} zY%diI*_v&e=<8bmNg*zgXkjvH1`9AYV3OO19X=W%J+y-~6#WC>Zsj{(a3zKb+!Ftw z^hX(&)5*GyD$lw<&9N12-3&YW-|RdgPm3~{S)~*?ER!1OP%l|~t`q0fd9>6Z8NLlv z&0rK;cTVWPf0CxSMR8{&;+R;ckS~9%QL$9bf4if}29{E%MJkghm%pJ@Du+@b2U0yA zBV`h-2I<4u$01V=pjO$35<D2eNdhxbLbMPeGD{<>Ljq4~1{xzNjw+T){4;j}4N0U` zSlj;vjBqMk{E5Z)`AGEgn*{OGliO5aF5(N%kmfPqh|hj+{rm6!XJrW*N_$XL<u^SN z;AQ|XP03#!5b*gf@EFj$8uhAN@HN0G`PEa9>##ZM)VJT9Yl)c3-zx%j#2kXi$nq@X zlfWHceYyA5dyqXC>I8@W`Rhy%;Wgm-N>HVv1Xw^B)PEV2ff*<fRR}SV(&tD}!WsIP zvz%bycPTZ{eh})Xm!d%!fd??qizCI85pP{RS?FE;dwuEeQ#;+S_DTQwOhi$Xz@KG_ z{ni2yuyu4WngTH~>}?t-^BFPJ64m(aq^Rt8upf3hh1u#6HrcPnv&s1@=MFgY?l0f< zdX(tOWM|+K?49<F6$idBS4g1!Z6;7!FeOw)C3PXdS5MGEsGmbZaMTl_>Q}BnEimrP z$My{YL*dFsJ)9bW$j;&`&oRQnS(%Gg*LV&W2EDsSmM;ax>@X7YM-haZ`4Gw{rwZxE zC>YNy$g6YAmno${F){vAT!eiQbU^?#>Qd8(-`DrjOM1Y2%4hZOt~wi|gM+N^1tlPX zXTu>x5f3GVQbmwyMd>imoz7!oaP@0~E^kkPfb#Kw{08HJ{<<T1I9FLq{Ia0*YKX|e zMPx+<!TgVei$WStA0GrOu}STx?pPk&4mzWkcQ_2i^?&qjU+X2n&Q=b25nSM&E?<8c zw`Ztc`fnFe&@t`87b+qaRYV4oLWkW&hT84-mpItvv({5?ocUf3n&zGr5MZ$QmpOud zRs~9d3JQ7OkqgQysUnf8Afk$<C<=;>E2d7|DjWvneB*BwREbhJ4x$>yI<bHzgRK49 z8;7`hB8tqB<&O>eB8`t?=QI}0`m*?>BOfM=OlTWK%v8+QV&4m7H3D#1J6a(oNm?dU z54`p<Or<4!d~LVFx0T<_I`HsWw60Fos9nuvj4wB8PXCQwKE$<tp5~2*{SbIdWyjok zr=n|I6>8fsb_ewtt^BTqtXFTXeZ+jvw*~k!<FeAK?eHxOV{+zl*Rd}>;|&Nwa#?8J z-UqZ0WzF@dn%CLxQ<6mqDQzsL021Dbxx+zWNzM&5vV~K9T?=9m9lVEQiMfucIe92e zswk`O;(0Ff>0U;|By9^gf3NmlF}zts$B&LOHp(2r5xk3<nxO*^$MUhH+S{-b)Yxv# zS~E{6AHrK!W9BE?2_A(SgLSjm9WUa9oSQoYoSmu(C3?K_NgC%tjruB-U;-37f8i$y zJv6TnKeNWgK@iSs)|0)or*&Vl1^UEy$3q%`0{7CmdwgdYq}k?{zaS~R6Y!^;hz*Aa zmGsbn9O0sTBhse)t3=s={=Tn{0ONO5C1CDQCnN~FKh1;{;V$P+vm#$Wgud9Y2h(^< zG;lum#0Dn#I_MHLFsaO9>K{fQojK<w{h91ChL8}heB-e7YHq}pjj`g-5{pajy}Nk? ztQ7Lx+e&;?<PruMo@_MuDjiO!!VPOS+Tv-$ci_~T#@+1RlT>H^38O;G4rU()L(sR; zgvel)yJIE8-0j01`PKFrvdTz<ut4~mU`U>8XDV`Ho#5z`#fKfzU@akF=HKfDS1--i zci*Cy(&6|Jw3>*~O0O>BxKLtvf3K+5&ipo*iERokRws_Rz{GaIVQc-1{=vD|dH`3V ziSetc#8YPd`($g|PTIlJvImwrk_i1T()Y<Zfq8-VmYXP&=7w4piLQht7@E}!UWWbg z?erZ+>_ffo7S%Fe%R?sVr44!c4UQ1XDHoadlS<O$fLZoR9!kB74NAU3<48omQhGro zeYEN{blezbFCW3iu400@kpohM4E_~&$RolVVkqjt(Ms?pZz;H`4rIOM-+6A7SkfhK z7EUjS%c`$WzyUB1GEY<=;qm>26vUGD66N0r8|mgAjeE;=zGzPw<ulk2h8qM#Zw7H* z#j(-MOoeT5OpW=cxC(nn2%`tnQ#J)PLJlbL<i7&q{mJ{V^YwTB@#*q3H{0%8R}u?= zDM7&UMO-~M%e>J5as>kPF11!GvMx(*#W*4=bw)2D(t&iUi%fWQd}T!b8OPUBGDqtZ zu^t}o1^L{hAo<l13g9&F5VH?YFUi2!yr}`b<=&q6c_b6G-pli8^IQ0qcW!%!mpqSp zy2!mLzf;XH$k$+VnVGLuqFOa@ope*a`IwQHdPN48kTste^XnJ+q*UIJ3VE)yfoEon z{yiN*rIeC&=S2ZWqzhEM2YqBV^dqHToE$*bQe_a^5F1~ssL_rVcYEM-GG`@q)1xoJ zaaGAQ7Th+kqea-E{=*#xDudT6JB9cs4aWBKVjp2i1MiRtUWrcaV&6CT!QYg8Z7#wi zxRDHq1Wl>Xpky#(EALA&uJH;8$IRmJ60E+6BI!aKOFxy&)+eDlK^KB>_zV*yE)BhA zj3Sk?W6NL#o|SSys#o?vdr>L7fzVn=%VF)6vDmIyPMqT1JuH^pQ<~{+CSkaF9ea}; zwrG#i|KUTzU4J^O*1D(~uqrzaKgxTDdIraH!{><*(u^|IPU$K+7okV{8O=Zn;tD4* zB=lHDXdnI}8_G6k$Bxz-k2Ho;+{(~Nkh4FKupEDl_ck4QV&!%3>4TOJnh1QWKL0?# z?NYIwFb?`gaH+n0@sns?FODf;kOJb!194~r+rCDUQk{14>S%JL{GqSS<JB8bxUd(_ z=s+}fPqWmK-0L#v3WJ49WnEA)NgbB<n%snrMa2Q@L&O)nTPU8`uc`TXPAR1c)77pt z&+YmXQzB<><+<@|S<mvW!ncGcF3tvx8*%ndK3EOFnnfIJ?$|Ntu=F3keldvlK%Kn+ zxOU>%@hAfwqA7l3w8Wc~1{CGmLO8)C>gGExDmH%=Xd?1s00r?UQY2o@u;cRlgFuF0 zmG_V-+$=_=iAU+zvdH-CKNEirB|jdbQi%B~*5hF<{bukE`jbi!b!-27B?%5H;idF< z+4<hT_esd%naJllV=-Q@&f+_5Zw6tuf!x1rimo20nYn8??%MAKrs5LRgxQy}f1!Dd zDKir6=$zE^)^Ey90Xz^+5jlzu3k*^T2L)6WRAI7GHk`{0+g%U}Yfmm6U!fxBLW@!r zl}+js+XE|PV2pwNz@FIJq0BT*OU8J<e#ckbG1I-}e@@aZVwJYGu0Q!X;n6N3m0@zP zDQ_C<I<R#uo8&l62DEeRB|tKs-NPO}YbqpuSb~o`=js(4nvC*^`2RBW)+-=6s4_Cm zn`AmZG@_nHgh}EdgM2!S4P8mC2abA`QbSMywTK>W<_z3+eXrMD@qOvxtEf^2u?T<+ z<K@sG!$;HvFXLg|*YNAzmhdL*94Q%0Rg16A9JPphzj{o{eS$2I;4D2XCWcE1G4SVZ zmYZ;j&7TryAFR#Xx*k0}tNZ`+_#^QN<qK{l1qqo<jv5&Z2qxLj4RB`!Cn~@!2*bD^ z3l$?H6=*>RMV5lX#LQ$)WNhQbw1%c4Hb+_#jw3X#kW3W`s}ttu%i28L&lqKXHJ}U} z0KKX39#Wpg>6djDEG|l57!=&MvO%8K{gaffEkdHT-J8&#&az)b<OfM-5~!t`Jdma- zT{>3ZO;1v%`les%v!y-gUA@c8t1m%6tB^>95Xp<7q<S>_@-1<2TlYPntglZt*xeoB z;Sqv(v$wVNQ}2)TbiBIysUNFt+-LlH_`TEJ-Q7#MNdHudxAi~UZLPVgo18+B=9&08 z_n$>ZuAu+NHdV{-*`7uIDVDXOeZcZR!zU&t`o9f#clU^jWn~p^ZDnN>6StI1Klfhy zY~TM}#j%3*bMLUZ1y)x2|2V6D%5?{y%U+w9VI8}++pMf%bF=@rtp0c8Y`^S0CA0{v zz3-g+hbkk^L?TQ=Wjsy6Qcas+5j;zfkdV~3h-mu#Kz@XX;tA{_CNseiPL%4j-k+4R zjN?RJ`L5Fppq?QUQV&RD`SXl)kwoC1@X9|g<`z92)_z|rV1y3uzZ~j)glvE#iF{5{ z*>QsJa->?bxM9+IJbQXNZjB6-%Du}CpM*#|c`=;&aC%Oc@*agv{89E{T%(8Zl7y0< z=lj-tXW7nYm%MfS!I202!`X?j>47&s)1snvq}3`8I^^Nwjm5%e$y&A%M4gcA-90A_ zBmH)`Lm{>FlciRWkAfll7lp*;qc?vX(b>pziXzX<pO@iKf0jq8e4=;HK7h!OG%ify zq7}w8u2gsq!8Ol2!oWUU<IOIVNIY-zbY8zywy=;Lr~SZ%fPYiRpUg935*td)7&WPw z-O+QfXn(nDQGf|oE}+YSBa+HLry!kky|>jVH*AJ#L$752I`1?I`3mK93ALZ4)?8i` z8O8-q228j=nm7yx6n3A4eR@dGVT6xZ6^UvX4*x1)?W_T_?d@|@ZtYZy>6>u=ZxdtK z(dyGus6en8Md^(Qp8YA`L-!QkmElIH2-`DSsGxA%qT?-n^fy%6tb((r^9C(t3gTE3 zP#w$&=!^IHZ;&&=MCN#xG#wqK!E@6fukBoOF=Qv<o)$NmEnl~tuDO{>U%__@e0As< z-FNrHT~nN3V2D*w6i0)NgN5jL5zPL-%qNqR6a>2OJZ$pc3IpB{lI3gsB*)LiWiD5o z^r8)w^XkK`ydB#X{pY4kd^kgP+4D@dIg5Wh@TN{@H(x(&@?{Q}dH_$KJa11CMffWv z+H*w5VZBu{4Krs1io1Nf(SNwW`|CgvZQ;IlWR%4N5r$NefR|y;9eVs8aNdA}A^n{B zga_6QDf2<s9&uz+oD$u6DP0{rLBM8D8n2*Ttyv~zFO*@$LlL8ek+i1D-fvwZw1Dx0 z!<JUvm5hKRYu=H`XWGtddto2n+wmQNW)|_Xc5fei#q>*`*~cI>M^~kQqw<ep{(Kc5 z^2cRO+XG2ftQauydkW!$e-kOtr}x>*e~IHVfENt29I&e-u|TRIMgEo5#-5Xho%Vwb z0RsNygP=XG&I5`jiMWaz{2P-FsFuMt9uODPMmB;;tqPa^GmF|qt)`}4d(5V^pG8d_ zCT*RkrcJT&Z}98_D@7vdH@N&^xu2uxedm~paK)~w8q6UlaZWFdtT0#sfqzqM4cHlE zLKMg9+I}%P<4svNj!fcOw)ROxVkayq<-U=P@?Qfl8MJC3F%Y<w))N4+!~i$aA#)fL z)ry+-S~E|kZ1QsuB$SMzbdaL7Mu82TwqY<Nr8RxE&U)0dZ)&U1l`+nt_sXAEHno0N z!-Aj+rPu44w_Mi0GwHJ)!J6GUM|K-W-d(*`aaT8mZwtmwq+CD5br<lMT*7!3T-mN8 z#Ws1UWA!DJ|LvVMuz^TN^F;3J1jf+``_w=|b6f=p8MdMtu3>XdLK-^wrLx$X4Qq5T zLtzyKb0?@5HO58E=cYmp;0d0#Kvac+I(EvVOY)Jih7w5<j&%PbzHJ@e<dhc)eD2!8 z?EKSv+u|X@6ZA*28ScS^=tpS*-69>y{Cv3qPFn`Zy6i1Vje_LaOYeoJN+el@xPtP8 z!7n8Lcj6nrJv*j|gc=7t^M^!}y@EwQkV+H!@yU%N$6d~ANW-Gw`Jc#SPA8e=1|Gx$ z?D%uAnsB!Qsd|rLf*|?Q;u@tPUR-!wld<YHQ4McIj|87#Oa$>Pp0s=<m!PDxG%nxQ zaFj!mhx3y$ke>U_@aFm0$&1Npf*2M`#kk?MIeHdV*ld92Zp^SWymDc;qWhN*g_$dC zdh1QtAKYjcKSY*zkmASFS?el1P!Q+~$WcWZL*g=UE#P70N=G)*4k$-S;-c8es-85i z$Br?|b9N684|nTkV1?w%K9=MPG0<RX9W7XJZlFs->HzgI)0{L-LCjlWO~H<!np&0) zqh24%f{0SQ%w(q6!zaFGUytTv35)9|kj~bI5gPaRD=mslkiA<)2n#AM@5$M)I_Dg? zaIea&ISrTU^hK(-8ap}_9W2<{_1J{_x{mO<yIiJRsp*VMJM&m0I4&KcG#Wi~7S-97 z{>1&lV?q){BF-;`4vj17Fo=nNivHwA334_jZ{JS39u_SK?WazupkE@y8@f~tfX}po zzilfHW2LSi!HOmircb{z`s-4<Ji7I+!yN--T7Sc-u%e)<!IGUt>7AXOQ@v~9&R+E5 zyi>P)@V*)*rjx<HQJTNWzMcMt5?YJ)eJ(yY>b(&hQqc1|ypV?e9ZbRq^BP3@3wsNB zREoqPqu;~eLIso{A>-2jV&)`ob>z3u$r_E*$$NfaeL4IG!Y}$fh|Tn5ZKsv^%^%X6 ziRRP0x9dg%RK9=sr4`9H@ZC#=0X{T93HGr?jtes;T=Oh2nOI?yTD{nlWj1Wd{=<59 z^P>hvS5Upg{Gcnw?W)O@c#mr~-a7~(w8w&t6V$`{c-d#6s|b3oqN=BX)fYOE8$A;_ zmtoq$D_Qbj_L*x-%#4g@mq=PvXwJ4~5NKpfse`y;>Aa&^cSnzYzq2j!;XpK|p54hY zTOtTL_IF76RmmR9n3|P*nyCvvNN$Tx4V)8RgCn=NX-^O(o^+Jgm;6X(vOz)MsS{Vn zL#b0mxQ79M1vQe<;ucHmdo>}qs;!Ac`{Kk|3a<q+&dZ<u@z2ccr$#AHUfJYBdXRZ5 zSwVfR+bMA=qG7lMzj?XB-}Vy0vj(gt@pfYwE8mX|gurzb9Z}0#1a#+7ZPSoLwFRkA z3)BiqfOjIWS5y*U_?TYJMRV1JRwy%K3}B%RpG8?h(oR=h&RZI%MlzRV?GL4u?}p)J z-dT#dJ3FrNZVpXbP_r(X*k0a<{thodQc(;mY%c3dU_9xwuI30Gyl2|z{~i%gxx2(; z!F7r#&zFqSw2^3-YaaH;QIe86PZ{cY>I4-+L-c~5a#}UwOWemXVm8{>LVc7sg&dwe z1lx7Pmpz(e{bD&CD@cf97-`A7qY6JffNvB^G|M2zLaF&Pc6H<iCC9GK@z^1_Mg|8f zMv?Dw&WnABH(TMnByw?bYFK#RoM(c`x<H;4d@_5GK!13D)6bb$&^)N5Y>lu2`=^wW z3Nk%!EafbP!3a~-kb?AnWa6HjHpNbrIZPtF!)djX6v4!w0#4<L^NqgZP)#4t0|6pF z)ks(*nz=CI_eK>s09i_e)W<%=$P615Rv4L7QAN$xgYZc{<X^9XK3+Oa4ytXCENQ{Y zB0<*QvGiJa;M@#&Ny#*Q?P+-5c<N%_1_Ubj^?&y;FD7e5x90EPK;<OUGy`S983VG> zcZs*lbS@Y9dR=ka0ES7?T@MfGeq<C5v+{!`2iof`=f_)JB}gz-tvX)4J~m-P(W=Ze zG}ts0=d^^h^~c28V>xEUw4g5y*M=1!q?B`#q*c-n{h5_DlFHSB%L>!2M**Ny-%67@ z0sp}AP;pvJP?*e`EOM6$<YT(f6)}=BcGJeO5bWIvc;<t@DqZ}XGC+J18_#AaRYc$c zy_q*kr)@lVeeLW1uek8Jjn9|Uxd^umUA-X?`sW7z-x;F6-Lp{1<Q$7^uYHKp&G%$@ zqE*6hA)lYrvy`6o{+Ky^lJ{9Al1ua5phNt&f|3kcLjZz_P#lxO3-!%H6B^pm{8{X1 zYjD=_5wkof(VVkPqoAW&As=gYfm%2{q8FOc5+_Vpm-`klLt=uIHQxKMZyw|<hn?lp zr4iZIsg)|C-Oj~-<@#;8kGi<2oQKJ8B1~cvaIU&PxLddVMXUsxp?D=Oh@@<W<v75* z{$f-46gs+kFo4o~x}0@5sFNFRFiL;|C!+<h7lWsSQyh4=+~sWfN(xQ>%fh_)klP!8 z66If~5*#fE#EoaK+&;Rx#+A=y=?M6{s72vzfzaqujoNMsNXjX%y2m>NC<5(}#DPbx zp0i;+oN_O7-|Bx{Hj1Y)uOT&}p9+C~)ke1r$jHaf&?7+x2Nn>vvwpGPSm*T4I8b;h zIaIi2v~#5l|6X|`Pip`rJyO#g8f=!YBCUY<HD#nIibX(MZ*g?^yHdsAc>Tk}9a|Ap z*I{?6*2k~oU_-UXN$=A#M5#0xNK<=L!f{V?7jh@=cH64gGssTCr30}ePUyjtUWU8e zci}f_1fxuXRhbG&8p}<3lcPS|5PmopXFel{d6)Hvb2~><;(fUP(c$xUMK<<qzZ&uW zD@y6fh8Xbm?r3{&9zd5XXzg#MTM&^AS}!lvyV+kmdxSF!{*ybu7v9h9iyJ?#1nbt? zaCqM3Aqk#Wfzpf~V@yv19M7c>H4P=OU@uy@t@wlfK{<+ZkE)-HEk2Eix)0}1z1Yyx z+y>uzkQ`$d4CIdYId0hX)N<;nseocuoa<lR$w9!q7Hc5fv+isYKJNPUe^Vc4C|vC@ z9pR=y)r{EEnqp0+&XZycIKmiDgEZA9Vm#9xcV>T0Em`rB&ko$Q<B+G3($~@bq0FA| zYQa><)8@k;zuTo;79*|!tSrH;3%)dKPq=vfw)#aSdhqQhY1wGpf?rp6?cSF$$*aT7 z`NUucz6;+Pc}nt^G*3-mV16n7I_<t!rvraB7ey7#Vr5Pw9Njz$WDR>`e6<>3p-=#M zlyy)q*jxUEAW$IJ=pFE_vG>4{e;qP|{jZ)Zf2O>)7iekWDN4@x5fLaEVk`EuYy{(B z4P<-eRN)APCI$1`nV)b!LyvhFMKky(#551zQp0|Lr4*+WX|dXdjls-_gA0Krn;Y?4 ziq&lyt%S`mm@N*C$>(>m4yEO=a%bvgddA0wx<}G@we;{`gdsg$YXR|*Z1Ti_-a}fu zy{_T8P~wKL7>j>=O|dw!RHFQS1^r)peqOfJE#KG>XBPSYBrf?IL}c-&&!&X%295+9 zs?cFw5qaD)9IU}QTQTA(fQA;T-vpX3NJ~CK1vD2RlVN#5p)sT2P3~i|5SO%@?SAK8 zM5c$wXEIfUTZa_EV}Y99J%sKfX(8PKNj65Bf<!B7g0OH0oAg&<%QZZI;5&C<bn={F zb&cTq%XHj}v_Rx?3)qVIlMgDV2tN5KG%`j{UMIedxO;s+&aUP=ot6L(q#%b$LPRzm zG3x2k98(q=8*U3ng+#vf^<N{79k9YPw(aZ8!PLRe|1&jw?NdRYg(Z)YR!`pv#Ih2_ zHVlB|IRgAK{-RG$TL6)~jo>Zky*zo{N%-Z}kIVq}9)tw(N0Jmd9-;IO-sF#;2_Gxh z)5+Zz|IciGxLN>BO|)R;xvJBs%;Gfht1;T=P~?^L&Gf<BU%tw>Jmg+Pj6Y@W?3_*u zqdjqS*#jH9%M6jch+5M-1QZqvpQNIg!<Re`k1^ScK=z@Q;cZ8u*PqVUJm~f&3{~Mz z(fa{RIkcRVYR%7%rm6rnXkhrGvj);KnhTi)MS_05y^ZE5e_E^lofRz(H(Jp!RHH%V z&+e><aoZEe(%1`sX-_g2UaR7Uo^E7(C)oo5jbUkBrm##DBag1-%^Y4MbyU4Dtp^a& z0qND<+q{SKrUW9X7AbtUwkv_AL}4Kwp(&9ks~xu~w1DYK$r6yVQWt@~pQUkZ`r!|o zSGwSpSDe#0BU3%ooh33cQ*enJj0RFLa*)_2xE#1du4O{+Phi^dLk|=`HaeTMu%rYz z8!(1Jgd9$pEg1|I1)PTa2LAPQ88zxJQG4#<fAZ@c7xTM-W$IVXBSP`kvNi{Osa3_= z$1ze2cnU8SLGedXgB5O7P~>9Kz%5Z?Xs4X{j2svoVyZfBESKfSlQ@fuR0(R#dzUA{ zscyL}CTnuSWzY=PIC)sJG%$@mrrrRoE!aV1KEMXaQg_vKTn$1}1+y~=u6V4n0@Ttr zS-kIjfo50=c_D;`gBZ<{|JJ9A?5n-;_Pa5M{q`cj1-^S^aLgTMq0*ncye%rd<5m^g zB{vw$%c#U}fea+0-?SIfGy*mjZtTVru*>rTfqHcEdQ$zE&P;=m^W_768x;HQS57dN zRQ2hYm*|2rmz9i=)Ky$cF6oKlv}v`~3^IWI2TnwS5j8tb@(>FSS1dDB+FRP54K9=P z*a$6j)A*1(Fc~f`GywNn`LP$I#us6FW^`oPV3j=M8NndNqvu%}s0=AG<x*8c>zwHG zegZe}4GamQTJLof<o&x2vy=TE;fp=?@8|_<n41!$6mjtY{Cke8OHSW&z7vELBmXeM z<<{I@k6&ZN-tB{{{Al=sLu9e7F1`Itj7};342zvaI8z)5KP5yl*xmh#0T+Myj^T#6 z!fwR=a`Ye;ims_#I%fde&<2D7>KlJK+owXS#*w*zy4ZZUxAy9Ah83~<PQY`vIO9Qu zIw~Q{gk}W3$+7m6#qQ^h^;iQb$~2EQAtlv!<w(KvC;#*KJ)h#b?reEMk}{Ar7xj(~ z`rZU-vMLt=PQSn=M^DJ=iP)j6$udFF&EqXl<}PunAP6BPkdop>I_NYR!Ljw>q8%&q zN9_oR-n0}Uq7bE6?*=>`)28|PfrP#1pvouft$<NQQ7UjrB4$x4+I%u+Yyh4obM|CB zUkGppu_W0K`fN2!<b1Alfg4P6%?w%cTO|yS{TJUtP00tTpp%#Z{^-m5hl0DYtEOV{ z_2y#P?gpzW8kxLE%=}Qcv?!%wgr=D+VsxP-5hP(E$oAmCTvq<HQ3KY<;9%cOfpbX5 zIs`Bh7U1ifM_SVbnw>^p(8jNOss8h3;BniLKY#(l;^@q`PS{?X2U;<NsWwjIGvWjP z_g;X*r5?dXz@qEpMZFh}Gl<P|kL(wu$icJHwq=e|1NK+Ouo)v8Fs2D!Xk_`M<m21j z=Lm{x#7oOenSb2%$$8jArh(~%_Mi%wmf;Z;-Tm=KhUSE0gty~&|35#Bd*41%1+uAr zA}k21fy&40t-*>2kTHbG#u7Q*2t6GiQqt&=wbAu_Uxk;~m@8wYWy;wRDk$9;cVVG& zxgo~Kk8c`D(Ah9bG~i@320ntULpG3;f0tW7{nT&0UY^(A#>;BRW(?N9_rs%{(JX4i zfGqKKq_oA5x0B$CouRJd1-EUaeL;u6)EMz72bR`&Fg^Py4rNk}fE2w3b1295xdC5! zRb2-O-|5)$_AUEQzH~`E4|JGMFw>r3#k2=hX*CNa%H&J?6)frkG$twtrZ`?H(t>dD zAnNJf<zWw8*!$@`O}?jVyGGT~x^65i+y&Lp!836X7{{-B!9Y$4cU5nD(l!o>^G|sJ zvFU%-z#TgI=!ZlqW|Arg6cqefH2eEtat$E=3`O3#q|42V{HAyAS+Bl1y4F0N&cFgY zgHbERxXvCPKdB{Cp+s{y%gY2`#7$O2`O*k*v0#|-&3;kZ{1TWyDRDuN@1Ux#*}y=; zpZ<-2e*l>+$flnM#dB2S|Mf`vt&qq2{G0JUd6GD?sEGzU)}Wjb#I)8li#3(J97;Hm zM;`ILl*u`e^N*9#iMDAG_kK}PJd;{HW3yAd%TC0>iz&^Q?-$AQp+KBr#(@hnhSf?1 zIg=<y+>GTS;E9KuP6$z?Mzx@b&`}+!r}sXrlFTo;(iPvGI->q)oJU|mdJ%CtV^SEo zAbhvNRt*%cC}`rPZ=uhke*Ocg521PH>RHyj87h2C7f^#DU&Dk`3|de@e+AUR0kIj> z`b9)XP$i=#3^5Pa4-yy@6et8S1-ENxNdy-Ri!l2d)-Wq*UQsQG4Sb#bI}~9Zqypjw zTo*zS9h2~{8a6iWxolTdDh0LGZW7u{Fp{t&Q=m>?c>C!2rlX7i$c!cSBncwydJ%<P zyRjANu}AK5jLeoZ*2fmfhAhYid~wq2b9OE36*fIXt)nPcsVMyt65uoq6bVg<1v)Y! zF2LN*$6uq-&Umwa;?1{<TVY`2cgF>l6?@Or``9b=d-fcc!Lxy&$e(dWxJQS#Wx`;K zMR_#gS3!{ZF-a?*1M}9ra0-m}rSF`&dZZCI?FFUU)(i6RoXmH#j$hI5(NP7PnZ`>f zE(JpZX@dKy@+*7B6v=&Z;U4M3-jBTk&%Zt2#kF5PpRFSQ4**d>uD?HRY{P$3V4!6# zSO|g|B|$iAZ)*YV{@CodiT@ie(;oz6Vwn{LHhd<(gV1>VHp?RiMf~)Ck5$%kKHmBK z?wP;y!94CGHkDa#_hb3|{YR}@9&btBG!t}DH^oEeP%I^}4c_;V^}l^z)&I9Xe&bhj z#(VWVj}hkLKhD3j;Ph5>-YTK7Uk(Ra0oSS^B7O=2A~>QV7&Re$UA8^MPJ{Tk+-mN$ zJ)hy2@c6B79k;R6{h#c@p)qE;o)(9i#kxL%B6k#bP2R!ON!4rwKJABbQQtZzh_9{z zLoEeGwlkpMBKwDz%~F5Mu7X#iWi373A8m@$Iv^gVzw3gz-11*B1o(cQtAzJI=IMm- zdp;|G`mugDOPHqUJc*!z+A0Vg+JYcbC?F>Eq9C8Df(O^x{1^UKUrSfX;V!Fp8XcaC z1^Ml!W(_vF`zGpGs3u*0&Uu3>y<EF*-d1bB{Ix$zjNLu`!esfeG+pQQq?{sd1#GsV z;cjdaUin?8{*2|9XQ}yNh$11xU>Fat?x={I2JXXOe)7J{{4VR&rOWMlOh2`#(0n&G z#edJa=B_@<QGYfidWNeTVdA)%AK`(=bKc&k%-y`sA1nLkuJF{KRpn1J#PPn|;Ftbw znjLb$yRzN)wt25Qo(>o3|DSA4j?;_TxOiN~>!aCVw+$xV=Usx|JnrArvqbN8M;%qp z&je1HK@mKkS)DSW_Fo>BKMBNd61+-ANBuvXe%oq&pPuO_w%~EUwGT~GD!bN=h?*{C zfn1@R&DH<BM;X}t+m9Dtss6Pr$+ELw!E9zxE*MlnoTItse9yl}I<5O$=GT3@^?c7W zjM4h{?cS%<zyIFw=lfrS<U{~Iynw!GMGzPJGN>czz#xd5%7`Kvk$EM_@%i=5A0nl? zhr#q~o_-V1t2%34!|pyT$9wKVScbc)Y`Czp4}_%>b5)9|6j2;;#C67?s7iINuh8f` z^vRODp~X^cIQ&e=h?Jw|;!7NrB!+zhi2}=46hLcm>##Z*i1uP9x&kyazx<5#=VM22 z_5L32{nmT2J;CJ$ClZ1O`fwof%4!5qU;juez9KI&D8xlo1Ag!AZ@md36`;j?vZJV` z2t`w?0l-xi6Xs{Cz@R8);mA<?AF&M^Ef7(lA|{XyK+5(CpZ_2BZ=NyyS-fT-CKK$F znC>rVry-(q2yh~RJ4CBODd*|^q<oEfJ#IfD|L*0MKlNhP`<r&0aD6f-=nBNVSr^lY z4MZkK@1X$vkdH79<RFngK#&53(Ff>xh%5kKT0{;~6^1|-As!_XkZ_`i07@KXqZA<l zJ?Fm@aDzaJxkx1h41j}p09Q{AqT#v#D4r?hc-lYjW;Q?o+8xtu0;bT+&oJBFN5Osg z*as|Hf`|3t#zYAInBljS!BZs;_(75zPWO15qUZJEa-4_$Ld6#U630&D>`18bkQcE6 zLLj~v>WB5fMm_;5nch7<@uO!?OywsC?y*YZK!}0i?A~~GdAt4m^0d#(<l{Du)4wVt zBm`H;FenB{45YuL5@8`pNRa_iAi)9z5QwaVf;(jPlBoI;Dr!VDGAjJUDC$635lR!@ zFoW*p!35n(jmQEO1%ILMpCacVdmA<Di48m1dYtvs(^j34>4oL0XXaDS1q$SpSSj(H zMRF5>AM--3Z5PvSA+iAbGhcX*FRd3|q!#jiNr(W|5kbqt$IECEi&ui&zOBO(EZ39# zfatKi$Ap0hQG=)rq?S%-2PD<fgIR%KGzghoSGocnF+)Zo2R}st#YKyZ2@8im9yvKI zT6(ji$=zdbSM_{d2%Ewy82|&eBpA|6g3LiI5D9??{a6fp3Bf?Q3Q&S`LzL#BkWPcr z{=v+uZQ`N-e^-}L@}-Flkf2Aw)y{akZ1e8zLr*9LFBPQ+FSUK?r%8*VU4ovu&QNOE z+R$=w=~Mq5SBI07&p1s*{`{if<y)V{eL7BSR-SvleXS`u>dLkKqQDm8ln#Q?oD+yl z3Nh>9SwcxvCrXzTVJala)1aYaL`jrEVX*{6fRY46V+#S`2x5sL5{8tFB11`I27xe@ z#}I<hP7b5teKZ<4BM93oq8HvkVsj8nK;u2efWA})rpA28o$fBVJRJLa9||V`*|6N7 z&fIx}lXn9>0!<)BakOpW#Bp5K2K9U`5l@_;#=CXp;-)k`9d~`(_2;i9fMaA(34)O2 z5-NqFyIy}v&IqO0oPcy-k<d+1&~)<jcTqdOFyINkCK7<byp}b|IZ*Wg@du<9NEZzt zLCbmPZW@BR&8J#YLQJAcQ3}BYAxS_HNI?{gG^7&*%caJ_fWs7g#UN7{R{UHapwq5S zjBCG=2NoC(P4wl<9f=YEQ9=w#5D=6}E@;DeCmuU??+4C8oiv?9!6{H?C{-vDfR<Sx zDUg9fszL`%p91m=EIT^z@M!2TiqK3_sX~lR2@n#J#1$a{3nuPO7@ZtCL?Nhga8xJ( zssSj9f+&JzCPUlPTw7jZgOU3Yw^J=CNDM&*K|>WO&L?R!5hTPgOG0Rb%9D%^4C+v% zcONi4_$Y3GT0Gtg3wtyue9w<BnZF2|HvoH<Djv~?<N31)7*lcw8Ba+eQAuzBc;P^g zKBlp$U0X)sZLMA~5=Y6bp(G@L(NzYDOn76?r3Hj!I;g_;z`C{v88l~?a2@@5lOrf} zX^lnVhDEh^!eZpD9Nf#T^GOiA5~2)0ZdB_VWBIwAtUp(9O0#8&e#al~r|X(q+UyOQ z`+eMZWORqbmpX1`gP1+C8HNv^xuUfw?3k7z4{0hHB0E8)AWW7Wx~TlYrTPq@z|7D# zR**J!KU1Kf9mF50w?2!>@p*a7Trmm2uojo33LqNcOzE(RvJ5IpBtv2C2X0l@Cerrw zzWQI9;ovQ32#ooyO$6x5oX0bqGSnPsz|k@fOaM59Lr5~YXws*<DlU;n{kTlriN8qd z6$cg<D5DnV0>+Y@Vs~mdrJ~xaQE8C5YgI*DTHiWh2FR8N;22iJ)iQjC#X^h*gqcJi zmv?FYIRUd!5W)}B?wp$Z{e*bd7k_KK0F@dT$z)w(y|gAUA2GhWO{=V^j_0svH0^VO zAKNfav>n~K-4{|^U@ysu)*A;~Ok-yFm8QF~Psj1ayg}e8zl$!tH1FfaT}cbVz$q=n z49ub9InNG{Zz0MNVHU&;8!OvC);p*D`TClCSG}^e?iD0*k?(rUySafIeFw_Y4^f?u z9y>(p1~H9**#U@$mSyd;<b_RIDu3fZCP~8xzXw;gD9%)jM-zg9I~*V4VitYJ1LJAH zkO~jCJ{7Gl`3THXCHJy4iODL4q#%JS2m(SBkcAT<Q9i_?WgYlg8AzE8m=4JUYy=NJ z0+nv8M1%!v&DmiAF9A1B(g=Y1m)mn5@Y}HGY~GlK5g-sqnEgl38UZyZ`37Yn-wN_d z^e1IOLqj1V`qo=>5DSTi%C+ajdXgHHz=48LVnG8TxiADH5|a58+M;iQo!6x#RGYUR z&8-a!*Iq!Bk=Mm*3jI^IqpIt|;stQ@CSDI~RjVh#?r%6m>gJO!-l859_s>+Yw<zU3 zxn=nWlj&-8;qm;FgdquTr2zMcAD`(4pQw)+A%8*~em_m797`}?#Hmr%z|t6<dAIzW z1DpQHywE-Ab|P8@p;bX=jfiw?4kMVN5YS|boqKe$YFrUL!`Ox?s@ff+)^rRz`R0<K z2_#O2pGpCy@xEvIBu%FjsRQj}b(g4uUO0pFhy)Pobs-1p=ylcKp5HWI4pU|QtoOYk zxaKzloY+%=>o{`5Wsdc|KYw3Vxz_hY;SF9Hqg{L`g=2t4OKND3h*d0-I}notnKu%! zQjDtBq7evr?UNEuahvDk^W)gr>ogJa)j^prP!~ck1Arc(Wq08+qBnSBe!zn)4+a<v zNfpB(;%^X+PVpWN-I4r^Fzk69V2o(u>WH`bWoh{*Qb6lbXB<UW+W<$GI2(gPg5+%@ ze%a7gH{_2+1HU>)$f=zeNj;ySgIYxys3?fWG7M9`v&at{RU`vw={eblN^w7TN{Xg~ zCc%;04vYhoR3kvbF5;3Gi4P4%0}<*i5NauC#|4E|KFU^BL^OpIkq}vCNMUsifkF3> zqQwCN*YhHd$OG^1Uq7$Y>-0#sl>8ku<J)<P_!3T$pI2+)>x2OHk1r8#emNaStc36N zCPG(_Yx=c8$AI}hyQlMLij)+iQi>%KP;>8ALWj53!sOn&a_q;i668kuV0uJnefSGU ztA~9l6TlIKttUk!W>g~adW77r62a-fFWVjSyfQlTOdUSiWiDPl#x1MGyMU1wB) zU=#*@DpY!Dqz1%!ARD^q3b8^OMKBRPLSw2tk@P}C;>N2`x!Sq*Rd`1)J<FD^dsLGN z4}diV$bY;LAVJUQhh+~B1}i@t*p-Sss+2+<XEzrSf_AWd>-L_p&F=V4oyMSQpHF<R zP@;L<A_jh((0s%zpXhf40)z=~jQg<qe$&i)7T#P3gYZB~f(Hf%b^91CGQUAoBZ&L? zwEgQ}4;*SW=b`cW!m(>tPng&N<^|+%D5P6o<5fzE{}*7es1g%zw;H|78Im16c23@k z_x9!mxQ7QvF6_lCA;%>%qEV|o{abMRkk$0gB(fKc(!tDMe)9>Dc-BFdIL!ud5tq6u zQ_GNLTs@usqgau?=i#W~^h%)k_w56W_Y<p7_=dmeAa|YNefpKLK>>66?p@=<jH8IT z$!$F?FdNwT<JF34XP3kjXh?CL0m(AC3>^&tOZC9|;i0Fq>Y2djiAKt_A1ADK=KQ6x z>fm?aZnepD`2Ol8o`3uNaF(qk`re_24Gyd!Rf$rE!kI=Ypw&QPGAyY{hQY`QhEYQc zh74m^FdzGrSoZEX=QaJWj-C@_8S=93IK(oel-X6+F>E_+>-%6EP)G(;h?GbsP#~2e zMgvob_3n)!pi&7G_kFA18a>~4;qCbq=_*F2zrXC>rCcgtLh1I6Y41MqV+w!kM&|;^ z@&aas&LGU-jSYt-Ob7)GdHUQWf(Rjyh#`?Qm<9nrOcV?<q1Sr4Kqn6LYRn7(lt=;) zfF)7{;4=W07KDgWAz>u~hLj2^ih&|gp#p_!Ab>*FlR#(+0$`wFfKJwKFoFP)h+u{Y zh=?J9APGn%f{BPE5;qSyoy0zGv0k5HP7Q&~0e8a5W8gmL+1ztP1I!*T8SF(R$<Ly5 zDI*a$6c`S}Ab~|cNQVDkj^9G(w`A{#!zO>2ZzxjV4@vr>pBQ?>&(p8xoo`>0evnfV zK5&K<6bg({fT|6K$u)G);;XdljFVCoA(~K2{tE$Pf`Rd|Vpf(Yqfgt`Sj3svCzDrM z&UB}b%~QMJECb-wflnMjb{=im0Jx-*J&=>;xp_C=R&7-;lEBz`fmIf9Ic7q%sVOOn z$bmr>Bnp8V^m5j{$^WbMwn&w<5{9GbW<6$fKM9s;ZWG~10C<QGj37rU6~PelTkCkc z|1-as9DFHH2B+$ET((Cag>LxB*n!8~6@YO;+2+16@cIt=`UG(d0*t43cDXQnlxW&7 zGbsYXBSm%BMWkVGaWHnQfs&zN+li%?`XVIsTFXh*xfkguNsT-wPO>Bzc}~q-t0q%a zwky;t;aJQpNO?ppF>vBjFsxK#^T>mlNT=WR*O%w{goLqi(Z6X9J5$_AA&KM%btDi7 zaqd3d|DMhyRMB6g4n#=nVTY&DHfPu4MW^cfs`sv<o>BC4dOKr|mP?PA_#`Y65(B^m zT8CgIRgf3vk0M5tK>|MffE8Ek`Ca0{nq8cH!|?E)-9A5~Yi&Qu-j2Q(#g*iZ{$l(# zW(l?}hl(sIXb|R3A<nLnPbI)kv}2N0Qx@aJ{HTzTCQn&jD9S#?&$~gd^85K<c-SxP z1J8&jSS+Lt5`K@9iU=EV&sH6MI5nJJDqOn$L?D--sTm#=luDQR7e4h~x33Y~9eaEr zeY~&OZb#E_c_?>I1he|X->nzjHw=D$BklY`{-O`<Z`b>tDGB-(Vxmk1XLzdBn6Q$? zU8@lxp{UYh9~upRC?AK{mGq%cXeb5Bmi<3Vuk27h{{GzLc{0p5A<IhD_&;R+PdYyr z)E(D{0<?b=$b;uSjg>JpzvCCTSa@fHj+bq8X&N-N6&Znax?M{)Qd`M#*A0&haJ|6P zq<vU``AbT;KnoI!gw<7KVO3QPRUuJT6%|oYRTWVrkdUm%Xm`7~97ogr53@Uqrr5fT z#8<^%SnK$}e11J#y#v^4Ge8vDj(Oao8J4-M?ZNAgqa!Y4*4Q#M(p@P|AtcP)xkbw8 zWi@45Wn&DUJ5D%LkHkig+wpzFrhnUzocVT`Gu&HU9p?UKaXiJ|;J28VlvYfCLFO%* zKp_~8%X7HeF@b<fd7Pja1w6BylYvp_%v~I3EFNPLno&U^;Xxjznk2M)G)#clq^L@8 z42naJ9}8z@%^MlO{P(T5qMjdVY=nYQ5U6d9QD)Y+H>GOD5<ZdQIv)>DjO*J`Zav>` zFInt|S!b_RhAu{=deR&u2wsunBDNvxd7m-g@J`CF4}_LEZQW|CQAa(|iZpnxk82Q) zh!Uk(k%<-3WJ#-~9dcWVT4qRO(!`piJr%Cn&k32*Z8;AK%%@S-oMzL<I!ksGH&@g< zS2KxE7gvr|N#)|JJL7N(<_|CsPXyed-YoTC>1M05$C6s<fuEKhGpE6wR-iLBfgz+L z&kXH_?7n>FGK`K2rVwO=aCa0OTB?xYQ3fou?@*X;0rDri$%n`qfMc)FZ}eH!r2<IY zqNizbj4}bDXqUb;Eum1igL9Bb!dN+^lr~#C1$4EJMRF-XQlQzc95V{u;NFQ^QmoQc zRvl<cvpg_r$(Ni5z_l6GF94~QaAwuhfJ4vE!Ow^^#L7lCl#Sw{*phqH8k$kE6>L`! z99noyx=>CPzG~Pe%6E0U<b{_PjQDxAnWt(za!f`(eDwFOaQY20ozi!JNIhP@XH@Ru zqT8kR^)@LNYp$^{CFx|VSlJS^q1^Q;fDL60`k4bGNgzPEp~O4HtL!ue)}gFW)J{Xh zZ4Dln8WEt00<GUQQf(L>iY#*k3Sj%w-><FyziJ1I(mnuj4wToc)*24p>>~>zXu}$^ z$}G%dLGzFjomA+j7hT5(W0ElV#ME^ak?8TBvm}I`gVH-j>2T>I-UC^Y?kVOqo>0s) z+Yel$L(7#VPa&C6JNk@`qqxCx$Bipf>Ku4foZEXQv>B~PIyD6ri9k6DxFm{#qHd(n zG~c6;X6QzO5zx@psn}_jaFES0sA&M8LKQ}m2PhNC<&ZGIngl7JE~Zr3Rl0?72uPoB zlm!7qjR5Okne%cz1^oXJUxk?bx+p$|{vRvKWp9(3)RL#p`FB2tO?JyC9%SYDwlG3S z?`2R(N%pFP>S<jcZw}(}O&b(Sx2%(Qc+k&HT24)2V=eWzY{mZtW_+BsPJBt|Q)qop zNIp>oUs-)cFvx>MxguemrzDi*kXq`D)lp2j7UXI%7#LX>;D|)ZMQiRvtou37^m=*u z_<H-gdUW#7!3HJr*V1BWh$$^qQ6&<;A@^{iPzd*XDNNV$c}P7GsdK0UK*&e@A-Dr@ zuS~eh#}E*^NsJoDlo|t625>4oNxsCC^ANYfn56b&dC>x=KQT6cXxjVU33}-_Zaqpq zr?ywUC%Z&vAxc<;esM(&UyMF*bXq~#NNYTIHe2VO`v`IN7~9p?&?NyC)$*tzTaDu% zf(IWpY&k+`DGDK9Z9I->)X$|%*4h#nG#n|e)m$(tMpeW?Os!F>6sYbRJ;o`>2&)NU zxnB^J4OAi{BM40`aKnjUw4|EoxlZ{xYmGhZTJXgb6N=BbjDB3l(>nVsdu?O5&GgSs zi)IDiDFOsUk9U*MWN8@^(7}<f=up!3p21R_QIaW(XIylNX#?mZg?b{{Pmu5zxB<(z z(j?M2{F`~e?vMvWpz)=-gCzo}{JU-Dn{M3^2aWObFE4VZ&Qps*-#Cx5CsVGD{rwjN zX^;Ty>(7^@`NrX6U)xt<CDo@OlX|Go2)0xslHP0C21$%XdfxL0(TXhU7sXK#<Ryzl zfk~2?IoOtoiDhkLi8h>or=1zVdDwuKg7=7Jio&KjkBIp7?ur2rprRtyQ`6DIz%iu7 zsd8ML1F)o`BJJ;is5deDMt@Ik;;+Kq#P<)9okru;FWxYS9{B_lB8lTAjNbpl$qw<J z%HJbv9!`G0v{Vjro$JTY2GhP%ltv?<g)tie8WPcp55-y;SdO)VfeL2fOyrLTM-Xv* z1@_xcKLw1q&3tAwqp#IABB6+kAr**^Ap!EIBJT5BOZu>EOMIZ5KAFkRc^v*$T_+iS zJtxTfmPEd@sQ5$DMQ{S$aRxxasr5X&y0rFxGyI3s=wBn~CC>j5&SpGy1TSy|663=A zOY-#3Kw}uS_7%(7DDcbkQUzkKGe@Y22;)UA!=is7#CckO3nD1=G>E~PiVeTQ)M37D z9P(&_ut0(WlUN#Z6*$-BA2z*ydwTo-n0*7)K*K-Mfe=TKLhVqjQ$K4eM6uQ^QfLJi zs-RivCk$w-G_JDvn?y}LSMp&+=G!y=3&bGX_zy5sp<mbuz|aSx4ynaKoF8}$6c4yS zBLo16sD5}blXzB;3?NZKB<-Cz_RM~7xKRjq%=Ha~<<FzTaMuL<Ff{6bUI!e^Atg~j zkv_=%-wJ+Z;Z}k#M8+dCF~Vrbh=QR64;{}>^yxZxhyrq%q_3Y<tP6x}(I`z3XiW?Q z7(p;v^I`9R*3Ys<Su7JfcI|0?kvd(J@`a5?0f>P{u(Gzm6%`hil?|gJrieN#F_VR! z^B<cq*aUsH#DxH4<A)6r8O8!gNCu{q4Y+}T2~EU<QUVqR04B+MmN__d+n1Z?YC}z? zJPBi9k-=+_Y7#o2m)+Id`Z8Qo>XYf~zy`#6=`s+6AvvwKbnhI=o<JEKn*-vBtz3nP zBFJ+5o^2g-m!vgT%0<59I`cjqs%};xBW>2vLow&Zd5e;;WNc-xzD_<Pb-UDd{X+KR zHCJr|!5yaHcZ(SUxI%`=K$%<n|IV6AKsNZI_WKs~{I}=kavdbcurCXA)`Z9&{p$cU z8ie_81|tH&pQ8BmUzf7?eP+zZW&%(h_-F$UV0+%zPV9VI<Lqn&xJVDx^@e~;ZKw<= z;`t`i*ZRD-AHkou%=E+$t-rEcmt5`i9unoDe-D=S_UClshe8LcND>g?ogLoI9es^R z?bqJ6KtMsk1~373f0x1G$yKWvOV`Q(w^sKnWo~E|<fBQ5d(#J*>lA{<4n#^}yVq{> z(!Qh{KD{B}o-Yr4Gy%A=eA_m$Vt4sB`P~pgHtZN3s5&$BWyg9Vd@0dB3qZgNfrl4O zwhE{t6Kc|`<}e}<kXV+|=7h8oG9Z+-cpO6lK{b651J&z#xuqQbpDp>HF<d$B;sJ5y zIt(^7_Eo&!Yp9p<T8qmQ5xhK<_`YttJ~wcL0E8pGwR9z2k`?7y5?w?hE1;F~Qo%r> zAt4Z%U`@IlctHy~(m8S@aT2P&(d#QA%NP>EK&Y{XQV}JN7Fe>y$0-;fLa{}JL#LWo zD<L#uw6m{ri-mo7Aff_`7-?N?5Nvdg+TUHkY}IMg$KtiYPNEs0bD``V|3Y^hT9ZP# z_|Jor*Y&TTNz{P>gh*x4<(^%~p9YVNBb%{#{5KWi-WL$$_HniDJb9-lAh|}7gfe;G zQ%)qIFV1vo6*r)IC_H<%fw=-92s2S^sLSy{4)}TXsC5=D-;m7SajUU1+&hJ+Qjm;1 zIh>hf2>L+{>iS;iS1%tv!;I8%n|K@*f<&IF<M-Yk=Pw`GRaFo~L`4wBj4+6RfRG^} zNf{DGMn)8X5fUgwNQq$eJzuNsdwegeycP|IIc^q7lq}<fI+&Cq5lLAW#*ynX<7~{V ztC1i{kd<kM!Bt@?m&K+)qlkq%Eg}h3T%yS=WYN38LcPw+j}JLTaOzUKPK7%by{`Tk z<(62uL*5=vVLYHg50mS1(T|78$K%bye0@{WvU}!!j*Evk&4&vRH=UNS0j?ZO6{}vv zfhaDH%fZBC6|x{D<Z%iY*G-!+qgCT{0>q*=66BHB2dB~9^ghvodLzb`&!fG2LT}(8 z6|d*<A6xc+oPMoz*W&eeJNw)I=gY{<bz9cUbs1GOQ&`C4at=Zjk+opd%54bu|I4HI zzoEpxs>?g*a*0@ye0un(C3RJzvR*t=nx*#P>u@YY65);zl(<mJTUW9}>A6<iY~sJl zeOHJNSBn`#iJ>X>r?K$!Vb);vSAG)@YEwOb*+;P+N%K!2c9mWvp(#ZYi4dPDNn|4B zc<;yb{$7F6N)x9l4&VmYe(Fl|KaEzM)2h5*%ARnsS6n;PU8v{>%oKPqv}WNSe$AOd z<c2NPAi^rvU$LX6G#E5;<Y4nv8YnnAfM&#CgX6%a1{7&lk=~Vlp**Q(0|x^e5WT37 z9O5QzjxAH<oTWQCen9Fu9-R#IC5z!pmMmb%yF>^PfJg-&N7<Y!mx7&8HXMCD?s9e@ zPNs{Uc$(C!!{`hNX2wQDBVuZVWZ7VeNKz4Gvm6Sic<DT!ggH*0Qhie+!fz|*C!nir zn?CyQL(58z@FEr>NaRdcfrq{Qa5@udJz?u9B^EbRs37KWvBS!ooct6yTX?J^W&lIM zLQ!y@608f;$7jQj7l!$QljcmUB5@uVeU0}~I*XZ~Zf)^oi^Bd62hK1cVAOS(8;f&3 zeKIgAU?j+-5j=Yjg1H3o__Ho}s-%?(D+ti|gJp@58xXQ5-Rh*c+-VO|BVdnl28J!j zoAwD~QQ`L|gSS5yxu|u6=p1Vgq4lUb4=Kesbn+f!4e*`5ljwY^Y);|s4MWJJ68l=m zf^(;+Bw>b_=N_Qy;^{Kt<YDH1E;`fAbS!-L{SL;GHY99H1r!J!z=Ax11t9=A&VxM6 ziVI1aafNv$-alyGp%8X)5^*i0r;u99x^kZ4dugXfmM~;w8Y2{(l3Kv19Y<#lz?li5 zp{Y#XZj{?O{PZU2nXyjOY1(bMmt2WO6crlrPeEe-Ghsv_-y%E|)^OaV@;Hh)URQuX zm2)Ey(Q7c|N+{!Mx!Q9tj`sTDYjK@Az`*JQmggy#A%qM(QKT~=#z2fhFl3N3`()H_ z<j1^Y+dI3)hn@#ck?$W-LOv#*2I2>w^X!N^`ZwVtM-n!*PV0+>7LoQ4B%ll2BX73y z93Pdv#VyP4{F;Nt_x;>O-&GB_WjnqHI-;k*3Zn;|n_UP^$87d(W~Ci<`)g0bw@@f| z`jIvW6&Xn<)AAPd3&Rnp@JoKKZ%(QCZknP6KA)R|{Qp<8zaMqr;FH}~pAR1X1HR3} z@$`4v_u;h0El*FWJHhCi54|)M8w&FDlxe}-><BZ9o_E6UImVg2+Hk*5cKp8<s{_+{ zfHstI&`~Zv{Cr;DA-LiXXykGbKI04@kgtSl!pUQvlbexq$AhBd)R~(z%-S1$DP8Us z3pkCdPN4S)pCE~U{5Bu4Jxw&`oAzb-Voa|oarVkKK+{5~Ab??BMTk8zMZi#nGCL%| z=<*S<q9G5Pkp?vq*Cly?M9Jav2)GME?<$g1X$@*C-f`wUUP-=ckeR1{9u0DATn#kx zVkgvo{9{zqD6>de;eOeKQBS`G@$z`}-BVDx*ULzMP9Mm5gTH5Qe~wfUeHIWAz+F`^ zlmpN(`?{{;Ia7tnff9i~7#tjZKXc@c-cO9>d?2W(p#nNkP;cAzjy$s(+5WA~R`l$q zFMfXi4~k3XuhI@s;zC&$QOC*La)+27Z0edRdY~wEggOw0RDv*627+Z;*rc-N^_K{a z7*W(=R`YRpQZ1pt6GtavM9;cpTOSJI0W%E*FjRib7=mD<3jvf=YJpEA480;0w$`IA zELdf8Q5|xnOKUe?eOSj}r?yJm1Urb)Z6m~q4T|e1+4Jx_!+7mE#K;07ZsMff2jpz} z8EePF_%iqSa{D1@9n2RK*DHUzd%N<{B<UT!MF1ZU!FjVw?D+l8P&7{*q5+}%iIB_@ z_0rYzY34(p%x6!`8<7*HnG03LH6{tL=b;Yph6q7jI2*IKF3?UHvtv>eb$Q~yriuxQ zYD@k`0xT3+8$YA#L_sA0<LMR4VOx7pI4QqL(aG1-!Rp#$Z6X>QTRmQ-eX_=_m8Xyz zL_o|o^ILueJ|5J#4%wGSyn09FA87Q=fvj~Rcgi1V4}`#cMoNhC!y}86#Ybn%`kmdL zyN;glYBhK^A!{|`b!U%IrTCtK(?2f`1eaaJOtgsj`A;2(6mDbc*To)+It#CrAMJn3 z!EY;jsIjeT)*|k+k$y_6^CyYsejlrZUCDaxb3EU-+2?cVAWjvBh4Y3WSCxpH5IhO? zsb7^a=|EDQf#6zpN#)zOA<!U}TPL~tif%V_=f&B3+T0eZ6;`lj@vEIxQoJ9RXATPl zM39Jzt8)PUT@nxw<=aW1>J28aCfC`J6v<OyK#KMOX_2c`N}pRalqmwh<I$=5Q3C2v zV?D=5ri+&OUA5!1h#HmKpa5N7y(B>zwHmzk+p95EDkyTrtoC(=tg@dD+_i2wJf4M1 z&QbCy^_18hYFrGDKf!x<2M;6w?*tIfhZcQX6x&CtqN(nhta6!}I&sOczSeV1rMK*$ z%}{xkuDfpFPDD^f3k4WDb)))U>fDh1ODkH$rk`Nq4n18f^88%O)Mr!L9`GaV^a6OW zUC%*orHh;L3kr9M+{YX3W4PPi6!uUPuZK3eOauqpy&Whxz(kHJCw~>e8epmA)x4Gk z7xGG!XgsA0YJ7es<`c+(q&<;Jm_w0Is2zR3S73B)jpkw#897DbX@nB)E74Zh4~mgw zh>Bm|g{KI^f`O-aielidmqyLu*SF=*JGAry`#(V-0sYCVYlVJ9K#SmiCx8l@Afpx* zX7kp;0Kh;nxbXQO-5KmT(0WLyx`!Tg%6$k1(1<|LPL{Xhqh{k^eLVQQ^G|&FJ9O;^ zqYzE_r;*2pWwY!S{|EpDa8lP%w*lj`!z`zS43a}U)80HKKB)uNA7CLGe#Hw!JV6qG z={`}w_`ZGkAqoo<Q<K5tp1<JCW;KseSx}=$jh#GD5mZ>TgAt?@#X8d9McxXWAnIHS zs#ldPMy;cynPqH(Dw>>HF;*0taDF`aS@vvG8+%hNr{-$HbbLP3c_4(@ChI(Ku{pMC zPj5_6iCr5KtJe;ro0n0)pfrx!J`35fUi3+7y`dr9OHc_OesfCbJU>e3AL?wgz|i}< z%PzgW?l+-az09-KrgW5cc?=jOd<=vkl(T!aT)_-m6=k-5|4wIwR%Wc@_zAz_hN`iF zIl6lj=|mSwdcFWJLHhnczbqB`NF<o=aL?D|C0LXsy$dlu+uw7^z2Bei)}!%C!2;DO zf~?^4`6xCZ5-AkW>3=b$nUvG+u=>2K@xAYd9gHgp^w2wCcUndH3W5mDXvhfVY44FB zXnrz=FampRisH0oUe+sEYO;2gK9LsRC%%)<)7oI}H5w68BLzB6H?`TA{2JynP}i)X zA+1VAMiACT3n>_;&uB+5-gwmeB@m<Y*MD7k3mp*GR9k=@?0n^?y%Z!7@&V^U!2DuV z{<eUuj^2QPhUoN_bL(}nM7yll)(5#?;TUMd>H8n+)|*`_^t|kJ+OHU>(Ukq3=CR0; zhD6~%8@VGiRQq_YG+iUTjvO~2<86z8ch4%$+*(CIL<?7FefO)vRP9`~r~nj_?QSlm z;hN_ZSJ6jZ?8e%BpOD3f7pK;I02^G*&J|Ist!fN=YTyfX614;it)K{j=mJopi&NTI z1I=m*2g|SamMQ%;R29W?$bzM+JZ1pxs&PjiCz~QCIOiCvNCANZ`sET4JN{mMH}Lgy z;58=wJlDJF+TUN8Mf9G1xohxJJD6w;cA|_gfc0|zIRm<O6#RQ63^?c@K8_RJh}uyh zUP5?r*gyoi0S>efNmw#`(&UJ(W7kLHPiXnU>IFSs?}N~7Q|q5-M|cioTr(yPfukNs z%A(UN=`3aFFcKIjUy1hUl{FSo%k`B>Y(sN(@BAR;<n7>~j{arT5MX>Dj|2_B?EPQR z{0Tn)wSQN|^lQVKpQNwaQ!<O`GLWd<OpFlK<F4Jcqh|+gcHpN|wa#;)*yD}46o*Av zvI?{in37Q(CfXE$v8m9ly@i+&#~~PMoE6g>b~rw&s-UHH{{GTyI+*cCVGm>oaZG{_ zD@Wm&At$t&KFMMC<MeAEy}jOFpGmD}sp?GyBks%^AML8iP70uP$N(_Hd@}kUp+{Oh zhcpt2J12(#ohom(YZt4T9b_S*Bva+r&D?VwT--K^!0JQ9Mv<~1$UvUgA0eah;}<JY zNkj%fw0ZNRv*^7(|H{X}Y&fJLAW0Y+y33uWlzz`y${)1_D9hp&Emlx&6C&|^kIgJm z1x8~rRr6`#)<uL=Qmbc!23;}1tuDm*PuAOzb!oVggVOQ+OY=Ct)bYi)t&cA?8F%zw zBay#huXKkNc_3-Ua0Avyx85}#pup4AoFMAzyq+&f=^Y;!;`C0&UXD0Nm3QE4*MX^} zH1s%NxJa6^Ndd>tFq2#Ww#IpJ@(BB?1&LPnvq8O8Uzb(3XSrHH@2fWSS0vCq{O)zX zdIKbYYi*{h9o@O-?ds65olxzIvTOa0g?*+VHU=QjI7pabfVfafCx|0Z^^kmJK-v<J zL=;gXe$SU&*NpOvc3churcZpG-8h3ru|U*1)+%5yD+vTa5KvJfgAcGC$9gKyj5KU0 z91AVKotc^6^t5QvqktgBFljV2{;#I&*$tE^P@z##QBdR-&=g4Z*MBGJpvfS35Jm7n z+HDrZ+C^F(oyl~~Dy!%hyL7rxS}A2SKCC@MB{VV(f>;y9s;82K+@^&&5)fenLq$)b z81vT*g~~{&41>9{=%gN)6dKZl0vi79?g4i?a#(%Pxkn(6rAVrlI1kHMHivuc2UoN? zCIE{Al-Nv}K&Oga8Fvaap&1Y+k%k2<64FP&%LnO~hN0Fr8Uf|7S@L|IgVMjF)a_va zf)Hmd>?VYuBBGk2sMHxjQV~e05qTO6O%Wteut(zixN>n~oaIQEg8T<IQ`@gJz<Yc| z%ZrDM_jsl~ZMF2rYWzpiVW-ji=r<a0JoJrIC`&?y4II9ngN`JiK_K%Z@F>hgof3rx z1Y~0E;U5kWn0+GoT1)c_T~K`ARx6o`*x{1o0l~PJLl|HzA#=bhkp4JfFsYaj7z92u z^-XE717g|bLWNN#&@?#%&Wfw^CEI?SX!&Jd=I*tx)x)0JZAOoHJxUPbxjCX}hFtc@ zQV19(ji@8_|3(O};R9ArrlnXhc7x4P@=Ov=p7pr-K5j>X$D2aqoJ2Q=v6JsT)c2vk zU3ZbI@E)!jeJIS~Rv0=v_;?3Nku&|23>l5Z%2?gUIaChdL=^T`EMlEXN@!jwDjkaj zAvA$B&e_9K?m)qU!34ny2&EJl2o}5+AqIn=<a<9$gh$G^2yG=e$w3tc03anI1P_nX zz8JToz!`dJV^IVC8*t;cYOpvB!0f={2p+&kKt?PUXcZWqi|_JK37{{)Ku*%almTMJ zPGda|{d`xKO4)k2fsA)&S9tnn`}W$23Gr&;_Bg72&kLi(tPS)nWIjrr%R+Ijm93Ds z4@Nm*k5e3Vtek_cd^quyW2ft7r0CUvzbGj%4}+G`IJmlnej}P3y;?~miJ}RD36eg4 zuznwL#|Q@mqi3>VfuK9bF~aw69Nwspu!p@5DG>pN530JFdUgiY2nWtm{wd)xgL3^X zJ7LY+-sb4hvA3(k;lI!W9>Nw$D5i?+=mzLWAY~83<K{tO1qaenTqRG$M!DNS28v1Q z6<3!rK@FX+p@9=|jTDZr06Pf@C^Wz}9OZJ&%2bTwLa>EeW#Fq!yNp*zlwl!hKAG8e z6JtGVRLF?rEP&C476S}G$LSm=&>&W|V0?lIBrq$)Tr&_!`C{69-pA$Z=KiA??EOJI z0ty~FaqZ#m<@I}esmIq|g!(uAHLpL7d9sv3m0r=OPGmIqb=s+Emg8lpj=X3*r@Z$K zI8S!@ohNENo5UU;MXV|oqq!UeFXC(1?Pr;MJE`N<ho497?WQiaxqz(vjSiL~ncshO z<}XH2N|2Lv0d1c=gLv#d>C0p{Ot<}h=Yd`wS5^iGNO07r?(o??K<t=R@D3S)1QI;& zIU2AUH;uq&5$vZ}9(?oYpK0bPua^#=)R_X_0T$o^z|Y%yU7gd@;jlCv>xnKT1hB{z zM3lcgHbD2w53V?98fai=(UG5NFd3>CA~Fh&vchN(gXP)NMaJY9WUg^tr*y$~i73QG z{KMMhL#92}BO_{t@>6jG3?UMn6p=ec<u4KGa-VE-n^ik0C=nA7p(6~TQ4eCH7)qxk z##j;p7FGfV1qnt;=Y*sjM1?x`DkrX;*iLRRMvn_>Qb9Y=<__$=&v1oqp%1K2ep&_T zqU56GCT~v6`MAK~YAHr2p#@ZR`3tw<*qo^kBO|mN1;I@i0fJGQKIj{b>U~~6c;^5+ zL_Glc{CDN;pbtm^*)Pdr+C|R9BGg2&h+yuVxyVS9B!V0EB%#M;uo9>RLD?Q?mw{eb zQ7yg2lNOjAM<<h}XzL-Y*emJ$4>{&Mh9Lc{6a*e%f(Q+UjL?T6Ug9pBbz)(x8+nhY zkN|*|VxSaa$i^xmj|StB2qhcM{5S98cv~4|rx2bWY=<SJQ->gTxX+SDr;@~r?@K5G zAg!`7=<!Tracwft%dHsln1cm&vk@@3QgulXQA~QNK0CgXv!@!neV=H3uW0q=zIAHE z#2`W>9bYs&+;F1uI@Jf%M>zXF^1BYtupq|efaI6Y=uz+*WDQN5uXb`nRvf&yZ!j%) z4`d1WP?<EQl8)$ys-a-j%zV?CPpEs|z2u$`d3Ac{AFz)neNOY)W22{!lbmpqA0xr- zJw9Y<F;k8lbxrR@OUX!A+4ccC4uVEW66@}Ky0@E?qs`5in+ek|iYp1Qv}0zeWTlOi zIrr3sAg`^C73z}4l@Smspdl6rz?fmurHY6Uf$E^;-lMLay(o-#-hExYIDq7CR)xJv zOB7)071Wa6WZ~dH53vzIK%6xNIr*PIA%^)quEEJo)uKHf^guhr-FqU#_g<0-<je$j z(sAiX+&^Lp+doP}vTCPf12|5><@A2Ns2q+a@6y+y^{5|xG#hq-9_~Y>J^rwogoo7; zJSaJfjtc|#&EeVp9ju*4l4P&QsKd~G<Z5R%uXj-b|H7!`dc8pO!0zv|Cr_*!Yqr1M z{3Frp_K^9N@fLj<^!hk$j{YjM)|}oh?wUCl;3wUMPVB3GzbU3(k)-C_9y`ax+%$!0 zd`GH{8nEh)Y!SV3k+IT&3h+P%<xyj-`G%~{(Aa4U&s&Frd*$-^Vm{Ba<2;*9-cIjx z>gR0XT&Sl&^aAw2Y#gI!pe$hr06izt3hx&R4#NsqutP(n=Dmm)Cr?xl1nVK=*qIt5 zu^JshNJ!X&6hf@O!bpiZQ80Is7X&|BHPj%52xapoEVytD3$TLrDrW=b;rEb<Z_~d} zK<J^-I(=ErR-q=GN96BPe!elV4Ya}79O0~ko(vY+dm78|FSg0yEC|rHQ>AbD-+=rR zp8D~Br6tz*$J^uT`G9gb6`}ablyK^==@$|C$;})-<Au<FU!Qnkb>wZj@$6j?TEpki zXvi}}9fL=-qQW9yP5m0<_08#e>>i51S{D?8v{IBpkD47J1Cu_;_FA<|__Mj-Gcx!7 zcY8TEogV4HED;q_9ld(PpNqfg-cyz*E_q+3M^wn+%bd@T1Xc6~Tet*xjv8IUp-&P% zfE!JKri1WASLTh8<gnBdzsq!MK@o*hW*hnbX|HaAb1gh)hP|`B<2+zwWO}%GnZv11 znX{Kw9a6Y@o?C}kgzfQ;gfD`v>6@hhLmnCcEM$52w0HJe#0$_n8S1F$A?zBs_GWr@ zx6Qv(Aa|irgpw^&%?`ZwZ`F$)eL-nGst~3|5#rU;#f&VE=;g<+7#7f|FCVeLd5Q64 zTdSf=7y$N9e{XxEzrRjj-hLs+PcVDgS#=V=0Z3YKT2QL^uFm8DEq-H@+;vUg$0SjF zh&#X<q5ulnfdqn?SaGi6A%ztMNDqT!V8{TyE$u_zDh;`epmE1O97ZO7g|}+w@1GwO zipZ%V8iBR>jo*yheN;Nh?J4Fxko3pvsX&d-SoXy>d5F<q_011e)`zlDPsSu@*r0Bn zXXEgEK!exw+>wNl$?6C}xY%#ZAChV3*z|ffskjyh#32F@o1vBm>SDTLfP&H*(V!|D zK^5sEK@;eZLW`8Zg&bIS$GjEew!bptQL9wwx1+)lFxezY5*}_C^?fcn=T3fe(-8Fh z#hpqXbu%_zpar~iAXFAWw0;|G=wFF&w?RYkpQ_48_|B$U5s>Sn3K<~?ASFJUw>g#o zdblyO-3Wn?9x_ovLIBv@ksXKa?WExwLB!!V#}exf$YnN>uX2*4h~fv31dWNc+7Z6& zhva$yeXzb}Q5@<kB~Ti`=#44Yisx&WG+FZT4J<<e6SJRP=62!id{qooQAOZ+_i^Dp zq}9ja>-Kxo1U@oL12PIKs=(eZilC*LVUUqLYKhk1V`HOZxa@7zLb9<69gsVQWdXbT z>Dlzn3Jtq^Jd<G_2cTLv<6T>@b>Eyro<VV;$vL$)wKQx1v0TJ4B1RP^BnrBR=H<)s zZ<U^H++L~d`ci28<?|t!bpa4?f?<Xt38@ScSRud)3@RZ7$pTU-0JH2MZ2Cdg%%^K+ z*1&-vrxakNfbhDF-iq#=ySs4qdAyFJk3K>iQP(UI4N19ra^05!uiewN*jEUJHQHQ{ zg}8wTiKvMLNU|%CBPs&bQp|bhpKpIJJo8U&m&6Xxs$b&q3_Pl`0N8<rp&|EVxd1wg z%=Ey%Gv$g3elw&XtzFe0<b#$$ovJw<Avjz#&gYwolbZ(e9uH^_ls@6(N7N00mxoUn zSx6iJ=<-9OxScUtXD!})vtA3b<QQR}T0YAJI&JXJOMPFutFmh6uy4U~9}ZpvkHKx~ zz9Uzu7#KDlG8hilG=jY)jx1aqqv0|>K+$3cq;noVny`A!ZSL%Ar<D$cB|26YoF$+f z80+Hl7&%BA*lO1rRSp4r0-dNPz=VP+u$e2G__$cK&44=SDGl;L8=XPISOSU}0`bdU z6J*VbdPbv=_<lsGQo0YuLJ;7kDN0h5r722VY$<86Ac9<=7#~*9d+W6cFO$l;mC>1k z%*rUWWl5In5=OO@S2HFfGcyI5nTaDaGZGBUsMQ^zDD6a}i6zlcbTOZ|-tvG+2_SZQ zVS-kbdLXF+YglXc$|43BFH%IV)Pfe!C`SNff`K5VZuwmi-GcU8UhVFP)*)*xdf!B> zr_YCs4qE8>qeeV9m}Z#;Zd$p9gsvSH6HuXf6##KW6V`>fTiDW9(ecMW#aQZ}FCPW` zzj~Ea`(*p8OniTW=c=b4K>Rcu<a>VZ?tfGKOd4jhc>FnFW*Xf48;XG@m(%0cI@_gX zs})BjSGwFoAV<-V;9?QO2QOIsJ^|&$hjP)xSyM$Qi+5L-pS0@!X^YLDOGzrK*77Jj z{uD#s19z>(^$uN-RN||@N?1ApyK}elxN})p^?XhKERIvur|}u9#qFgN*Z%LJMPJZ9 zE~A#4ox8W}R-PLA9tRe!IM)iTX@AZemzFVG+S#%jdI=>+3P~GOy=_6E1%?T3*P{I6 z2G?2g>w5^LUG`%DZKi<^ioCWB0lgvJGB@W~;lhK+@aEF))f^mR>#i4}(YY|vucNKi zZw&#gPJwzPhn~7*SaLfVrgdj+DS@R|Y+OZ!BGhqqDD$z|ClZoIN(xvWCJ3UOu};c* zWG#+YT)5K^+ccA?&j~~ul)$4PuoleJ9s>J|3!vvC_b)IgJ3<8jQ;v)(cJO`>E_lTG z{Ig87Z~?cMmy3@hT$QD&avPVg@)1(J|HY&KVEwb{Wn;|-atj6|yb{3!DgZtJr+0*n z`Sbjaj?d@F>pq??!Ag8A--E9lD-se4kBq5D&KzS<tabKNXR>)WsSL&X-tInBoRSoh zJ5^rTq(GH?4VDu^ZC{^n?HYrb5Sxcp{w(kpY2XO@$IUzN)jA3bk5xV}l03a7K{0-f z^8FLqv}p7<#(@B2dn_`6YFUtdB1h9=y^5^*Et}5rb^UqHZ}TS2ZG0O&y*+h9y&qtN zigG<685C(s*dj$V*rM9ni$d5SqL8U)3doV%kjg88cBa|oek4=GAWvY+CO(x4LV7_D zjXi#)erHodqR_KdgLd*-V(m3G&2ru2)`${8`~m>bI1NQZ{GY4&&?lJj`dBdwT8`cG zkIO>R5Wj$(d2+pfD}jLd&^>5pHSBclmbrhpYB>Tx(9}@*0R!kSfU>qhvSG7e9%^xN z!<C40dRx37dr*0d%{=nxyN{A><I|?FzSFrlL8<0juBB`}t73u$m)6v!94n8nDrp!l zl&XsX#9r9BG<w&%i7|Rsn2`9rUTI3(_~J>Aikb$1FfgfmsK9D1Ui8Ug^d2(^g()h{ zKo^`=&cd7(l7l#uaevlzaCt+!s<zh(E_A_BA(s=QRHLm;zyZ?>4N+GX4pLtm&BxnY z-9nn(NEtK-OJS!Kt3HY`XKS>uo;Rg24Kxf{^MQ5_FsnutWO1p!=pms{g|t3SS%z`z zsImsat1atWbE3|O(@1F6$#4LF&#bkXiK@O`7f1RP?i?*~Q0}TA3>-3x?6EL4d)kiy zyHsseyc1?|ZVcuXT&{z5$%3dvs>SuVd^(2Q*I?n9LfB(%={i=LHCz!I-eGAC7jdOP z(t+uAMzV*;9NuQNwZW1j<ssSF6Rt;A;73D2T(GAAiouvbePwY0b!DPP`%UKcu>$>^ zX7~pbaG}V^eIapv*B8uL?9Rc;BSm4SS(ytYb~YFa2rkW<!-vxN*g_7MTCI5*zd8v5 zj*M7<q!?5TQ*Je!(P}i~8uG}?@U{b8la3X*+n`Z;#<UkHjHrT9G*R7$oa)als`~xy zd{ijD+5q|vc%RSb^Xa3!A6CDe);@UhoDaD<{Rn*a8u3!)PbW^^f_kv+pqj{D@wFg* zLxvk*kEgVanT~Yv<Ug1mvv2r>CrtDCEX!fD41VR|_PRDDf^PLA*^GCe0TroGsxH6_ zsJN|=dkB&!rdq<RU{^_84n8SR;-Li6_RxwHBZ7^hHXb+MqYW9tK?ET1TxqT=cAIVy zBiXv{i%l-UHpdZ0H6GH;C0eNCW3%hFAPYj&Q{vsg^^K7is&ETUcHrPf+O@ruqrZJZ zw(C(={okS~G+@;9B9YLDz%O;?=mLU(0)UV{OX%N0pxo)n=@;nevhBp(=>l2W)^PJ# znw+T8RUV?M><h22-k$Vk3XH{9&s%z4qRL9Djr8xN??&-{mJV?}?>^ipq$=_q)#{{D zREsSo`ZKhohziqy-Cn*zb)(yGtTni%xrXmiu72Pqb=h$5g&aMNcU8RLQ;f))(`wAJ zY|I!z4E!)DtrlV(#+KxSUjqDSuIpGpNFN{?V3*LddT5(N3)~@Kyuyqyu^g=GB9r#5 zDl0+xhbfU_E&czGc@w!A&6mBy6D2|bEkM%0^5*IBkqAl~al6#G3Q$00EH&)swI+cS zUgedYKTCz);}Z}!Eb0{lf<!pOFo^x$az3~IaY{ql-p<Z!H8W#wWO?7&%J}fedYjd* z&Dx^TZ79O@q6WPx@m(F=QBnaFffo}9DnOEnKy24n=Zw%$LbcRV1X_`K6AvxvSa_7H z2+Ts>FI6W*GQmncEXuKYX;+oTj}tdrS0BArWw`XH`Cg2H6}+&*hDAFOcw%8H0#$SL zQEiC07+5Bdt*)SB85M{_gh_O|g)W2>f>{pz3e5^fTYP9P;H96HejMz4nKcVFAGM0i z+7RsTX=!F=vhU8XdTUm5#P_6F5Q0i*NEs1I5#x}d1Slb0(!CEcP>CfPs<8o@SlK4E za4S&eFl(*9!=6U4e4&d<X%;mQ$J8M#ygQW6UD>$N`tgNRhv*xgA-&=`H7IA_Dh~ox z*9}t+H7bc>De@H`Z?Mk~@$X92nQXz4zH+GA2FU<uCTWu6HIH+}dJxC%bXc7MDWZjP zuH0RB{9jC4L4ku{sumZI54zgX#Ql9aNqIk6*@l8@7Twh4O46<z_S;XA8o_A4uZzQl z7hc9haCrfhr&ZKcD)EL-kbxB9uyfx%rUf+g7cQ?+R6ACTK#8RwcQEzCYhd4hS{A6` zG_EEs-9e&RRBM;257Tf31s%4h5uHO)ml6d<J0^$Lx{vGT>B5=S*Bu4qK7}k(r_&Ie zKUV<YSdo%#y;-y?Big=>=iXz1`R?9tPR}*0_^iIRZqw-_&`?`N_1G^w=iXpu)L<%n zEP`gjsFfm`uPQ*3;!;)Udt%8zytd-QBTQX8*?QSLbFZ0&S^_roM?2p@&JL>YSU5x+ zR9Lji{)?kuE=2|FL~phn3&7mG#xH8XlUlB8!?j9OeukDLZKK<?-X9=C5u>OU-nw=h zbEYZ?wq&EIH6I>~A4+G8w2-7>fI9(LPACyXACpKsKjOakkJre3bGMNNjk9?pzTYja zV?SMlb?L!I`;{ZJv)=Q^`FmYDocUi5rpn%{Gh;k}K2V#K6Og`}{1is%>B1%rjh=73 znV(HjJ>WQ-DEnvAN+woo?tGjdp7eZE@7QqzeN1CMaz=M#(uAH$<vI5#3GQ`3Q-E9h ze`VZ}&!;vT6*nM<y6`;s<#dBlCbl`RyP1!MR21~}mm$rHx2xI804AMOiGYo`^$U72 z#_m2rP|fC8Mq^lU0G}7y`L~`rp-vBKL${k&?e4!?OUom>`sG(8SB>H%i*VIFfjDyS z{i&s@FWGK7IRj7>b}JpfEC&}PDIS`P!jMHh9yLAStSt7Zf}52yEUHzIuYD%oUz8qJ zzmr!RmD@!Gwo9mDIalN7jGI=Ke#h|>Imk|C@gy@bv2j;1ql)<DS{82Y(Z!mDnv+I@ zT2Jj}s#L>BVWF&LOVW(A0*WS}*F!-`MF*`~mY1P%6t5VHiK`a~q=Gl|tlssou0u}< z5ru&`P~g2{LhES7EkOYJ<X_I+#12KZ8NJtVXJNK`in*>GhgYclQyZq)?tOG}i_2Y` zg6abFRYg^?iUoDW5Vv9DBAF^O*=N6gEOAzeuL1N9Q^vN&E*e-7-0Z?x7$bHzpaB7t zWD-D{q4%g(Ae9sa-?oB8(61hl98;7v;V78s!{x@8{siBa`shJb1425LEbNWCj6hUp zPZBqHb(~MN*^Ri=O?|jubMmv3o_F(Uj|t^#^Mo`?UtP?6M0y=@0_k_vyOYlLJ_3Gl z^RxKGQI}}(9LeF#Cn|mS0%Dv$$)(4-slmNikbC;@p~7#&x3vOsO7ykOig}PEcOrvT z4BgEo5>7!bq(CqjFH5y7sXVUr?3gvj^5ko5aB>`?DF%)mf`<&j{;oqZ>to9@lCw;T z%{+duTHc(L!ywC^!^1FxmsM8g4i_dqCSc85t8+!Cn^4wk4mh?)nkH9SW0=O%Yhy4m z_j=5dg>j6AnV3cm%Gvg<7PVH{zmHSTdKurc+UKp6yKeGZ%_OBu4@)l}sTFw}7|tvk z4j|kysS`DqO(qZJo5wps9B!xvh+bev8IGpfPC+Dg8yH3{&N$s~Y}3cQ;$$Qq?BWx1 zCE)I4<H)<N-wHGWBl?1|%^><+Sx4lC*FwC#>A|se6@ZD+jbWJ>RRih^!B2OmA0Hd^ z->~rR?F;^96w~5VR2&1(1sU?C5#Qx@9(**~fO?3{)PwjIyMUtVwDX(?j)f}{+PB&3 z?Bj@P1rKCW8?>`)4m6}Rhjvn3MHNkIbqfDrW!T5b?F=`;<2_YJRkULy61RQg^F8SC zL?jMbsF{>}J4=@9wKL<w^y}*Z-4F-sn}gV?2jV>lFggt}{4tl9%jcq>V@Ky!qJ3M} zVsJwWU6`e0aFL&hF-1rEm`{)+uLnS>-Ga?JDGds#F1mVz_g__;Rb>9ZLXYOsj2V>k z7u0({IOS}g5SrVR+dfAluSjJZg;?`nSx;d~UuGTzT<Uu;{kOM}IG}D!XJzN&uQj8A zFwa(3ZB#w5+FbG2dSli^b68FEl8Sc6Pd)M7uF_Bv^vb^yfH&Zxg$KuGr{h4=Yw(9+ zozS5a5P42DnbulO@Qh!ng{`*t&wR{kN2J2OeyAF~a-KBRw9@IXT@6ItY7YFwLeSlE zydfVGU{cjnc4X{TCgyt^s<*?E|73ed4$Jvtn=195XrLbeP<!MyvDg~V0bsCj!Qkk5 zyuN!BRQ3kdERXsH75tF|@@s;MzAFDjH$Z*NJnlU$2PMHn=O(P6zEo0*A48i6<wapu z($Fe`K?tzGmTA$y0nfkkz5GI=Fx++!8=`Sq0!N7F!NN}RrN?Aj=F(rKEaLoInH^!9 zj|UlWqTg#M$aZStBV$p<h^4*qDDFL^MeYv~e*|A|JurkW?7zsN&a?@#^Zc#?0i?eA z<8(o@v{iB9d2a!;Fo<x>H)}S>Fzd;GE@g+p_UAwy{C3_1ew=u$Xd7)TWNiE}s){Zu z>_7yPbrPb6r-y5O*3-V2uw0$qc*qsO#X}Lb)A9%Yic!q~s)Ys0O6;zmgQy^D<BJyr z!qJvoRC-?TQ41v)IVVWeNoj&dq%8<;&Aoo@4#OVI;4QP#yUwxGVds%xSW#D<YKRKA z6hZVqJU%#Hacj)ewz$WTgwNMGsML_+VV@~+z2lpn>!iWboj_s)lx@hlOjH8^1Md%( zPj_&dZS2#2$hqAHQ<nwo`4s^Kcb~K$e~`yB?EH;BKCAd`yp5j>E(nf^iaa2Z-~W;1 zRsjT9u$6;JS?uoe!+x!H)os9pINzSJAkl`6rz59IZz<7&=`<3qFbgp7S_?(SdXX=9 zDh8Nbo5Ij7?9eP3bI8>=nFfVOwv}4zb}pi80Skbfga9K>ko7>l++i>sHuOKVWnE%! zp=%6wD_062WKyrfv}NL~DcEY&TS>0j@=Y?QxcM}0o{G|2n0rn^<5KT1{#L=|e@Y<N z0W5<bwu?c<NL_x9fAM0weDxnZ^<XK2x&6umgSg>Fer(a-4~$-DFuVHS2sra(Tvod~ zT_tF}hJ+8SC|*Sccq&`Ld{3y!r!{G{U2LjCpFd{?h2qI_6-x7-5B(Cp6pTP&wyoXX zdZ*+bst&z_?*r%!+vq8`9q=7LY`xsOcJ}w(SSz92Bw{scfcheFiB7J5?1{1h%Rpz$ z56{ALNwW}5MUNAuY~I<p_xDnR!L$zBx8tBgk*;W=R1Z-SZ5zuFDZ*N+yc~8|Cdu3z zD&vh~)inDJ6M+;VxhNi!s9fT(J=_K5z`moyXn0v6kE`VQa^p|TY(1s;f)ov~xR0%` zFJk>CW=eZ0@2>(!#xLQoa+z+QxOw(C^XbrF*nzT*dJZ;JBqK}c;E@N+gdHQISc_07 zlko3kMj(xdo{L&2d0G@kC@_`pVWA?AWpn1r312=j#|L&E3qbE)2VtLzE2o}~HWC!n zeaynXzuQ>-3FCZ^tX`bDZOXia>?*z5u;*n;5!J%@4Bc2CVvSv$#4psaThSO63X;Az zeMgfGd3s$>%huB54lVYO`&K_vq+a<B!gN%cK0CgDNA~(zx~`&>_&n-mSR68y1C~|j zfd||w8{nWbe-lZw#~8Gfl)48ovj-7F_^JvHu#F(NKr9LbUrk?*ZEjGju<BS$Ky+g( zFL}J@cn$nbdcJoYdh6Sd2D)@4r1`iy;(Wn*y{sgG^-G+4rSFSV>d05Pjs35ns^pyx zrl*2#M<y7~S5W^#m-k`?Z$QEnFCsE7S&HI;|EI)$0fz!e>FeXXTki-RLs3T@@jwTs zc<E^t`fdXH60xKuPaq=fnIVqoS{Jo_3<Ht4(wO5%6<F3`OjkmIv`}@A%q+Yq^)Rla zI5f852Yh$z9FJE%0_Qu~`sH|q9M&gsAAKPPC(oQCdhpxSdA8l(zvctk0);9-@#=Ut zWUj?`9D7#!x#-Ga9g&K|{Zy|BK!9kDhr97U`5V-cvsmLnrt}jig5*)ghBhbA!ot8J z!KkMZ)G|JZgF)VxyepfGlizI7^;PH`Fz;NkDhl5^Ry}_xQY+%l>c7wYuHNwjjf6W& z;IX6dpv2|<Y6d-KNa9h!9SA|x{q<NOB!M@%d)$rrsZhd>CpD4R<PF>JmYb)R`lU@* zJT(pQDVbHx5jqS`m(`I{Tm~Ql<T?$=K(bcaw;s+zvoDD<MX}{^U(72P2P{Sl!#brd z;5c^_@WnV*br$vbrXs^ZRUX?5dhp7tw!)(wxw8x+8a)|!j=^fAn4>blfV4BLDXT7u z1=^mZ_i{#C?~J$w%~w@pxvRM<4lqZ=H2s7aai<Mpk_TM!r`d2keZyaWEGGgxyT>Yy zoUclPg!dr_x2lCJ<aio<G5CV6`g3Uh51o|O9km$7HY47bn@1iZhQ24IT!**@M2FwR z;4_)UW=N*Ifdl27K%mg4y*xfJN8}PH0*=~zy%!x2NMuT$E8*408m}THTtl}mZHo3P zFa=amqOtbB3OwbvJ+x4=!%jMNpc@@b<t2czhFv$UeH|_Q!imUY`e#S%F{$tEsAT3r zDL4!hvsguP3*{UKAtdu=V5Kz~caOI*$)=iY<D5&3dA9`}*pFUL5q6*#QR_D-j8!v7 z05Yz>E4Zcy7574oF-h}rv(TpGGWXOhg^jy(PTmjBh>(bx0B8wY(wC6lH?O=pNbSO4 z*&bBy=x@neHJXR>HLu*to}jg4VxJrFYn$Q^vwvB~qmRe&eQm^c(w{h2M#`fD^z>2S zEW_d57Ur?ys6C|&C=~@JSJ1a>Ld-$g$Go8A2#8f9iz*UWqq3h{@Cr1uz*ibjco-F) z?zxVe1M$xy92YiuZ^eDE<NKBGHdRqikwlKd7oxAd`^$DmJ>T1opnxZKp?_b8xkDVR zdny>RqLf0L-L=s}f*@19eYAi*!ohAj4`;OMatEd214NpOd;Ru;Ho952`vzu506w|X z$Cyv-cTcTe%S&n-mpI9<POU&F{x$h)Qrm!P7-+KYZlbQC$~v2Z+(xzZ$|dPj+yfx& zC^i=ad;5O{8u$Ki*ypDFo~U%+MI2Rqeq4XFEBQ{BBhPgq@-yJH)52ncZ9IKftk+m* zv;M^06Ht{Q1-h8fZL_k@10du>^iMTl^p_ZDb7C1jfys}6kzf=m@v5r(L*O?4=lxxB z8wf^Q8oIXOpRjCv`vBa~daB9!h!{Si4o}2}0VdZ@ocS!4SKtYl7nN0IlWVBMpG#jl z6475rk91$WdVuf`DNP&6gD}_8KgCZO&&>Sa_mR%PsD)tLcwdkX*e4MbQb8Q8GQ{G~ z+qO0M3bt3Q!?d91qJ=I8u%&8LkMc6#lL`_av(dxF#+3@XXN|}0r@F;*##Z}IPjInd z;JEGJfT5o3Ol7;YIt*hP)C`=voKK@-&}`xJeugoI&bMSD_jB&P`Y$u1Fw#5bgk^UL z`UmOKno3%~r4|BVX@wdhfuT_8TMfS%<Xq7X>p;ByVkBy$>Km59$3zRRj*OWB6l^Y9 zdxPsc5s;v4F{+{pluVJpIT6U@oyZVwQ*5SVxwfn_Dx!j-EZPO!q)MukAfYHhAQTYH z5;3a9Q9jpisCT05EQmSh349M#HVswJN_o9+I>Vw7@@&VNmkutB)%M`u3~1UdLLOd@ z<V%GTI;b5=0O8drQfpY3t3h}n+ROwBIJu>%4{l?H_N*V*2^J$Z8L?4vAP~5HWK7O9 z`GufrZlO(;ExGPi)WiW$mm{-V3W+qX0^yeaVTPisn%WFFt$0QJ*0v($1eBHv?As9f zt_|`R>uU-dMuo>2R$A{+uD71C04aOjo>hoHGJ|Th9fFi47=5b5Gp-Bx*!OtFbf-er ztXzXgpp&FfMES#5){}456mq_g3+Y=@hsV#uP^D61Y6?eRn)v5xjo@O;*NVb|`K3-~ z`qAE74LUooe}spGM83hDNK>NsH$o}FOG_8E1`;K8W?%{L0HN_a!1L+f_l&^$3}_L^ z9*wwT_5HSBLpORT94*9BiwZ&R9$jsVe?6=Cy@$#wQM>on04bu1aMGede8*n?^@G$3 z5K16^ab@5ffs=?8Y}G3MG1x$`alQAlcy-G1q4xVATQ)YyU&U29uSVNadGfd9><U!r z*54S#Ri0Pd2#nU~dh%F^9XB0W`xdN19Zi5KZoc8!S%rZuhb?X)L{gp7paB4Ow1z;W zc3*=n5et?KwJrMypdqIAcWu92p(d(5=zz7bh@A%-3-;uGZnbX8F64OY+t>%Uc@d5P zub_OHZ2Euzg&{img!t#D4psdkqi!T%Mk>rjyreVIF&t)m%os4Lp18-HLBgyRH29US zLJ{vRS0ZT8+*Q9}Ux4)M)7_W3bSk?J+n$bEPMoM9Iz;fnxdYd|J%0XO>(=T(dE)Dy zU|!UQ=z(Yf&x^&!E2k|Oo{6h5ym{)6bb*7Oj!m`67t1kJVh^c4aU99mLvTR9Z$8`p z_P6as;nM1b`EVIdnk1GJ8R9*Hk?&O>U*z|GhQlF-yk^;)CtfH$vh5uwl8%EKJpE=9 zS3n+(dM_{5J`_)g!+0;ZBj^7XP;0jz#XLdnoKSnc0ygU4sp>s0pLCBDP&4sSA_1P3 zsT3{O0{)eJqF-+NaAB`e^ZfEUj#~PWfVKm%QT!BdJy1)Zi--ZI)>#;s!NY(b1HIai z6oDlZv#I*<ff3W+P66`GnHAqwL`6b0P!$G*R4#Au#?zqC)wDS*4((s%E7|cxvfpiV zn=bhdnB^hQ?N}cxukQfxWxCsH$3+<&xKg_jC9COP*14JBqm2<fOzFcFu}#9A7TDh6 z;-k}=&AO;~8z{;m8{v>ySbfLrmB`BQLPBby_8JTk7E|SM{2wUi*V!e9WO3~e1?02w z{J&(*+5_sNk9W!XIk2Y0bSgIO>%ckAW5)|%Whd_ZsZYt{6viwZa`Eqtye6+<z%%k3 z1(M$DFsPY8i9P{^xJ7yqi3&Ej#4D*p#a)?PLG&14gi5!$K;KVSWWox5jOGTn7l_Ks z@E)0$1{ZOTBd<kl&$!k!ype%koPb5H);S}<K+O>VDhHd^L_#G;$CexwQAmxR??=)m z_1A&EeLlfk05rHDkTMhLRTnAbVJi&Eqw=D;Xv_8vu#a<(2o3Ll1`w1fFiGTh@L&S` zNoFMRAV)roe-`4_>D@}q9MyJ49=xeF&`xsHS&LlmSsQ2C*-w|td+GH*4+kl#$lFJ1 z5u>?gR-kPe(0NgX1br*V&&@RnkOyF|LHV~IqJHLHJ5d=?S6fAVz7yU#b8gG1>yWw` z4j9uw#yw~2q#B-idimB2|7IP8#w<QU!YGqWhDmRdmWnWx93V5lIllXa9&c(`!yl#^ zIAVzazZ@t?-xkbXpeXdwY%vTqs&kOrJ!Izvtxh0FwP(cMBPHw_g1f&PQS{qu`c+RA zpj;>(W-_U%7zcqK!O!wqBhD0cU@egm!tu6-0X-I=Zb1$=oahRYfk;q53LImHi){Q- zR$fB)#m`J^e`I7lF{VzrC)!;oVlc=Dz@!);yrs%eyda{ZY0W_(YibS{+DP{i1*hJ^ z<p3m}fFOS<@~*rG#5(I3s6r-zt`ZmyK|-+{LlO`Ug)$0wYOhOH>$~m|3ROUo+)y+b zN<tXmIAB0UCd7??$jXjOjT!ZgAc>s7>(zTrxjQ!^1CM)#OYGf>P;5q>I&tqr8+T@i zHV1w$_T&MmBBjudOgRPNUXe*<tkW<25UuuQjTl9ZVQ0VX`TH5`q8j;z7s1Md&3`$m zLCPD|NTG4c!FUjb17^=9T%#lg7hj3%OPV;55RZY{vp~lZr2ag9-`p1oZ?A2~&+Zz8 z_0vj*-ux5W%7e$11?}@N%a5zBjopRTzjl4~(inNIcRfv0&-A};vtMI17toBeYAPsT zeaPJ;II%p{J6`6(rUK=|Gl(_Y=B;L|%SuCXkXMz%wIw_LUJtRY@+$3?4(~X{r9!mX zf;=IOdNYr(gpf&J7GnH8Ps{7Po^+4~z8=QHKEs*6flZJZ(www?ao&1u@s9ta=~irn z`UNY|)j=pncyYF|%U&rREH&u`n>S|;k;WK%55|8QRhBU^gE%<Zcf5u&`R7<3zi_kB zb?l>e-*=9Bj-l{Clo$=Z>W{&CJ&<?fV?)+6-Z)?}Q<3-&AFg$_g%~gH(RhxUPKh3e zms0S?p2(}LkV83dt}r?vKoLhws2w)!V8{q803ImJPjab7uW9%E$lSRk)0(?HbNM@L zldZllLl3iWOVy`PIV;pqKG0cCzD$gV!wcITaMWrF2^F5%_wVhcZ$C$3J;n{S8DSQc z2j&1GBank#ZUB)U#j^2l?^%Kkxo{Q&<sor4aA!dkZ+PthP;x{ZvpXZQ3!lAt?0GO? z(O0L%!|tw#5Ok$O*e?eX5bzKX1!1o-`83pIbl6({mebp}9%@G#w*)xTzqeMcDrvHT zLTRhsXMqcT#UH1vFyeijcH;I8>fdv)S+M@JaI{~Q&~}6f5M+{pN59hI4-2iEt7_6i zaF3a|o+W6bdg=Kd0s6ER2l&c1TFD{^p$+cWVckU>Xl3{6y>Ky7!Bqd`luBBC3X@`f zW}tJ}YqBkqu8GWRR80N2l)cvKFk$#y-kTf>6`(aYvY>y31`E9vlo8wBlK=-kx=T5O z=|RE50rU{$o=aGCoig1kdUE`Y_HX3LjzT?6H}OG6X}I#aei%cX_>8)eq!j$yUFvwR z5W=-l({7rN;6l?N)0xCDeshWz)G%4>vw`w05IUlcMiZ0Shtz3BPl~i<Z4NcSFqNev zRes3O><nb`YKz!0H(8()7!1Thz;1`!Y3sczzZ`LEgI5Hu6}uf!4~W|HvFxIwO<Llz zeqBsV=EH}c-dy>3&F6?`CVYeINy0$vGB@WG4$zNNUp1lW*E`{8?G6uImtUgTFxzM_ zyXILU6^O2?4th-hwu20A)}#te13^R521^dYBK3-Q+A~V%q8nXYTsTw=H0Y7;n#+$1 z#d_VSMGo!%w;s3fJ^m`B0t9wr1J|x=Z)UvCN%juG`T6hm-`)BH(_SG?+*`>=Naw$g zJAO{}&(45vdocVLL<E4BC=}C>Rvt=9b}nznyW~rXx*FLKb3_(JJMzcgDm;w1#JzTZ zS|{ovfiX;x{8s^fV<D7J#N+F-QG-)KoNdpD&WRUC>GAL$ynI32+p2d-xzBAoYfcfq z?P&mU451pM&W})NKo}NPvTzWr;9sJFeN=m9n0<wvwWK=yl<>bk9DgmsY6gh>mw|AO z{(-R5HA;d3XMu$HC{b8@`|BP5Hd?#q-4RZ<tSX<t)iR(}2;dz;zOUIBr64(WL>ULZ zM}5Y+T@sND<Z__T#^NmsgoH$+jqiZEtm8k@{q`du`1AdO^YZ<89lDR;o?l;QIalVa zPC;zIIf%2sN+uct`V~=cMSGLVp8w<bqBx&ob`?&A4^{E@j~Lh=aPd*-<=QSy-?k=0 zQAg4KC+#z+BHtegS>ZCaVs|U%MWIWMl-am<gMK|&QkSwqcHWOVR}zlH8LFepP4FwD z(3w{?OK1;dEM+?>fUz&u2-SunXV(fx?mr!cA)TJAAys|~8y%{@9@I@KKGpt?gX-yP z6WP68dMu8~)3?+kySRP!86%90j&OSrK%KW!qn}62_A%aT7;jbMl=4dbb^2>EzaRu? z`w*U7nQ`%`Q_nJ7k(mq5H*cn#uNeX-Rr7jTT!|mezh9Tr)|CshF}jP8@A~zlP)Oz& zDMHm|+oKBc75*yygk18mz#8DP*U>>DPq~z9{PjWRQ@a%Gu8k~6hWTaV@~-*t<?0j{ zAe2w4zC67UKDgJS@G0u;&zGHU2tB0vHHNAbMN`(uJip8jAA~VO-P*%|JDeUqx-kZ~ zR3CMpZD3P}K*P#`0*^0Ve{bCY`?WKyTD`oL0H?;W^d1Bg@;!y^fNAL6v<}MA{DP^l zORs;#)YL3}MTHNh9cR|vu=B;YVLT*2P5Wr_DLou$!Uw;@`5O=nt&hnbhV-z<safgR zz69TDL1-T=n!xwrQ&NIhFXs6DOfCo|JPr*yMx(*n03Zr>C;`6yTC%@yDElrX8Y47V zy6rY+UwVb#Mgp`|BAB?_<ywo<*<XqKDGfKGLC!=l_b+vI#hcA%x$Q3*3jhJtJ~fIT z<_b2`OE~dr`W$yndnwO9e-GA?Szf2P#z&QU@;%Y;o^#Z7WYGl*i|Dm4sfrGmwH5m@ zG2ZY|r!KxTuRwLteJUNDfn9XVLH$O|7X#)ibR{%VIRFJ73-UFfhu7zZ_F+qUFtqhG zskF<8U!2+kjQa6&_t0HGGq(p*e@Ib}TemSfNLw=2hq;qqiYf7AXX8A-Q~swI7akaX z(!KQ@Vm<9`xizNuD<vb>EA;)I+s9~?Kzj<?=JNJBeFB{uy0QSL@gL#TrhNMlEpEre zxhk$ZfG`;&1CN`ek?f5aKZspfS0TMWFS)jIr(bu^pn&R}4qwo&bs<X09A%;|I?`>- z&ufWgrCmcYeQ0PsjyDyj9N~)uy9x`@oTec|GwAALRup@+3(<t(e+buin~jkVOgWSL zidSK-(-~fRaAT)+7-}H=sw!MB6>Cc5%qdl6x;&kj4W(&C*`4f9j?CWbwAvlFr!5?Y znqr}jmuJ%KE5c@t{D(^ygsBx7ZWq%<x8|Lg)(BM4Bw6aiV0h>RQ}g3qMeB0D{aKIU z0YL_M`*@Gq*8M-n@0S_du3O2q<Q8eqLD=@KZe*=}juf{=_}ONYf(RgVR3Dfy3Of&b zQpI)LPmBTYFyTS$ujeT0ixjg!)T2j1|3RaYP^N%6sNrZ<@(0H4M+AXF0xc9#YEE8! zm!MQNkZ3`yje&5XoruK#Ex4+k56IcvDq4~}P`6_Cne}`R-M4;}xDGaQQ-hW0aLPGX zcT_<K<OMz^_suFjJjO<DrrK*z2eR@YsX8u6^a~PM7|9FcPh}#2^4da)_&d#<91e=- z?Hw*<B!K=83ay4BIH&+vQ%?F|40`B^UxfWVTw-iHhsY1Fx)G*~8@TpW|3MNvcV6DA zofl*sPeMFTr@J*DlnPmYMZTB<0IMUcMw9HJpzM?{ic9fKHQ>P^AqcT4$YnKr1F9(4 zqqFqWM_(G^+y@av73Jy?5v~GqH^dx%_4ESa3Qh&nvb#P&4mbp(%h>~18t%4-ohl=7 zV>bS@jN}OZjk|X^r4Rw(?b^C!tNfy&GcJ+lko3o}BXEK1LC>IqAIBWG{6Ad?Bon<z zp5Bf5&)L)~7GU9=yN$W;x5EsFd-;kAA4G}|5w^P>cW<fJknW;!VXyam!L2<YeZYQ{ z8?*WV1J8elP`j;NNkIj?<*Po1U_nApbW*gAD@c`TS#_|-%J1rMvv@{G!vSbinowvA z79*IJCF7z18ls|~Ggf7IZnZZuelXdmjC@};WPm{ADsT=5(P@(eFd=~9rzt@xsR?B2 z7ut-eBe>l!?~pa>MwZuZtQyq<ogo~cz#)MFN6s069JQy>WYfI@02ZgXX5sSsb#$RY z(LmMF(_hiY6!{cOSBUZy*ZQ+Y*3@JVOZs~#Bt4dv>m!S(;VM)on)da{_K(gkKPw*X z{!O(U>w&(yaDl`r_Gjhuix%36pac=-K4oBx5l}rSSoT@n8TSju5nd?%#vVj**fgAT z%MUi><?6=i^mNHw*8Qg;-ETG%Zw%k7%Hvs=Vp?lQ=U(0Wo3MUS+3#K{`7p#%4`riy z07xSdO~nupOsO8(8cGHlh4<q5-X<oOxto7?y!;#Vy}WL|=^{x{VWNhdvW`62$bu>Q znYACvp|yP}k!)!CUc_Jd-vTRITJ*SvNF63cMQGFukV#WiYQXS;-OVGrvI~olOac7h zV*FJHdZ(Am>E(FKf`X622jF=Kz5i9SRUf>ITaB3zKbLZ)JqkaQMxt=pTPg<+n@xXL zu*vO^f!oloke0WoX*Hh3g2Re=Etjz$SGRw$eNv_xc&T-}`d*90k<3p{mf^_)U8NI{ z2e5hLPIIXbuy?K39h%~JSyUZPnNX1*J~dFF$H_>iCRinI7R{Y7VEQdPitOX+zYxPV z2omZvy8QL)ua8e1kx-PstnMKQI5B;Y#k~wjM$gU~5(SDVXsHN71P>&wbk)3_9Dc4? zcV}SUQb#@g)N|{i>%(s73oG2;<JD0}*RVkx`uvxtiK2zv%s~|!cyCG%1zM;do6Sq2 zgdA#Wz)%=EVE<DJM7C!}@+wjo>vx0WO9mPkV4=>1ff=kY)PaKm;kq&IV%~~QSd{}2 zc|uKDSoCeD=uci`X_+i;gWHOl*Tt36LSvdt+deMY*T(d@r#1B)azRgKPlOzpGrc{x z_jL`Ea=HV1;`hQfVu9H9I{LPT?MPJSwd{I*3#6rp3_)Js=Z(90GDUv-Tl1@qoY-Q+ zwLWKV^&Ewi_f?z*RUyrY%Iz9$>6xHno%t$c2dsO2XbKTW3~CrR%K9MgKmmc><&r1n zCqevrm#QZC-|}}aWd_6s6kkQV+w%T#`ie$u7u>l|D+LlOcWj^GckC)WvFv0YZHFfG zN_<w|@f{#Ks2;app%O8032{^Fqq!BJ@^1KEEUD*bzC`3Qgza0|!zo==Jw$unK2u)J z8I}9%4_z1r46j84f>>}21uqOeL~u3Hvg=|~mESUVU94k*APF~dsEul2f@JJ!Nv|RC zW!aVkIA(d>+!0r+1;U_~U9&31aW4GmvF^P+d#_Fp71H|ak*U6Pf5kMQ{=dxy)%W-< z5`NyodwrdG3=V=9u!+Wd*W~ySey0hK6s{Z~8D|0BMHianDsplZ!5yds;U~|Az#K8< z!HHuStWlztBcVp1Q^;&MIP`?~wE_yD=ioB}#9?7fFmZN{e#~E^I_1o4M2oJMs}*3m zLP-l1IsN}%=z4i@(@@ix=+Dc+TAUd?3tsKB0Oz1AN*lu@KvV!TM{Flg=(B<mz9)xQ z?g$^lz61KNk<UVrE+2E_Uq#-RijXRykS~AUGf4f9@%a1u2YBkA1M=f>!sKoT4WW<9 z{DjI0?-U`PV+j}R{1(Hd7DY-Zy^bm+eWV{>qA~D!7f&(;^xx>KeuS#vYQFtO8Sp8H zP+Y+D5gl?Hw({e|2}NE96hUB73KFG|11SYrRk5YhtHZ7Wv+aEvzHmq1XAKq;EPTf% zGEb(?jrSDiU3m%cUOX1%E(qpfVcbt`5iIz>t*S{Fn(IOu_tnQECe%D`z){2kF3H}U z2;f*d!<bO8lFZt$UV-UFgoSo{tyx3~%QOMqi!h`!J5~bP2L8TRM##N0ALoG>B5IMg zGv0FH?D3nL4>M2BmucYZd+lS5^tjSULR1~%W_F_Lz-(*?EU4(yJ)#59tV)QOVU|`o zDN9QRDBVv_39Y+4#@HB*_#Ng(mv@$>0Dg=dO;?mJ?c@e({vXhy+jZhsv0tYtpxAP= zP>C8-vx5#X>0&?&(#>I8Fccx%ZEK<$MxPvydc@lI9*{xHJMTgZkFFxx+SEuv<IkUG z)QZS}LZtmCpWYIhgr>Xb!Ag){zpLnuBb(Cp?;SVMWz3%F$nt`-t<lrkHwqNyioGN; z7_R0+p-CxmKOjb#wbsWNbxz7u{H|%P9g~ZnoXEYGxLyn*`O;m;8=Gf8gDz@;zn{Gv z^Q)$`&YvFB4h`O0YqMRHK>qY<?n2$^A0n-I`#n|bPR-c~wj1eLKKcG7Veyly*c3~0 zUaq1~!x74%S#LS3vtr?o6%avh4h)oY0Ynhs{X^KI9Do9$BSCah9?D>)-;#_85NTSS zZl8uX4YMh%nY#Z{{a#yNKhMn_h}|QD8%Lr}k@p|Y8e!wchsNY*61yC{06f|BA7^)t zZ!3`GqQG-8A?|Ga8#X31V#M19m_uWz>|#vUuSSKqkZrftV&A)~pI+WbtUXqUu^_#; z8G!1Mcc~EzW?;ltly)JgvXk0SGe<HoL{eCb`UO^kks(TjPSTA%kjB3Kqe+?1k!4(+ zvQlyprcr3#&KkT?0wn`VdSB4NL#k}oDAlV1qG7aG#vIZsAXF_>2$oqzfto}OO3t;b zy1`=aW~>6`WB|xY8`c^a)6i>l(s(+guXPR8d(v%gkcO^tE)drn@z($pTH(F;<jn@$ zLf283mUwA{R+pA_4jB#7T;21EORs9F7J9OFwAY;be*IrRJ{9ypFbEp$>Qq-uk~rfZ zq!P|7>Kh8opo^##WeWFJ%jtb95i|vLqdBVi33{uNn;kTe8bp@X_m@naroyjVGbt5j zE#2l#YIICta_ZrZHzaL7(9LL;&i7u~9~eF%eW#TtCr^vv<I`|~8I<*=@aUw<p#&Y{ z;l-TCpwYn?0heIbM{>x^zXxZbWwp8N<O)Z#6{ox6;+oMq=ay@EcG<QTJjm`K)`Eto z77BR*^C0b3avSe%byeioL_{t{BjR@ig6h1x6^ZCG@o{kg*8r<Fyft*_Mnf$yP<DsG zVfAz3_pm`OqvJPSm|oJyVc^2VPp5Z%iY?16oh}G^o9OMjj`4dD;nOVsRAb9QfbMja zVvanPTU#^D+FAMkVQD^dT9MRnI;Pi)FK<SisUSqR9GL(I3=Icvf-3XU(GjV{M_eoj zXq_5v-1AA*Km#d?#qQ|hlOiu^bYix_7we?JHzU{ReF(hRD=t1)v@C)(3g6EHJBs&u z)wZ|BF7PgG#hAZnkfFxwb{Xb6Lxmezoh{B?_yPslN{os(>43iyp?dFD0(DjJeoe(x za4Cv<+ggea$B`qk?*NenYdy8^pVN_eq!6kNR)QN#C}E_vlziw2SIbm}&~D0WrBN6n zmURve?O|aahj}A!nWRH6q@#<BQ$nUXTMP2k%V3tan5d2=D+o=*(n@2XSJ7nGU}Y>P zTWC(NufTDP?@HS(E0R8!FRX2RL94db-}7_6Z`cph^JFe2NrW_Gmx)qirJ*w=i61N9 z$D&j)LZC=csLEL{xJp;uV)N~C-uPSiF!dk5f|vn3jSqmT^b1du(l`r@UitFV&FxY0 zvW^hiGR4+h^YH%@=6um|sy%O?iWiBNULWJD0oZ;f01d_IX^oXQ0pr)-_~Q}ea9h4D z;m232_yEzVxn@W1?;-Bz<If%v#R!PnZ3;%_I4^q)=qicz0htOu@2`xfd8rHD*&~!+ zK(QPndQ0lNS=j*lSyINO8M4^Ghs1DtFcX3;un9s357^2Oe*!eML}%Ig#BtD6)dTAL zcTCMGhUMeS4_sTWCkiW90#XrK5X}E+`b9r4+X7fA1f~=!RBAakzX*|D@Ti$6n}U@U zFO~6tq1|i<!3NVM6Ykq#3cPobO)$$4;izD}F5F0Hn5X8j4nZD2un;`Fe2E?Wxen;z zc7tWMOlCY)W8t_@l#VneHz2|CNI*qnWZ{w!P^3IayN-SP-S*?epm7SGj(1?15x{*I zY4ZU@f(EHl*DvMqS>)P-Z<lM1g58jotCdha$fKopX_Q6;DZHpoWr!KCSafl!_4v7A zoF`Cp`k}n&6*>cx!z-r5kSr7g3Ikv=v#R|hB91QKCfKbx5nR>R6{uDmsY>j`m8&U= zNc~OOtKO-gEVgJKu$S7<a|c;0mGOtjuC#pp<ZZU^y`JU=u>8A%g=Z6m#J;<iBYG3n z?u;Njhde%?W{ka+41=Icqb{Ly70=eY5;%8MS})V$^@TC2jqA>6*hA?!mHPTV4cnri z(~^!4WU0uYHF$vVXd=)ks-yuYp8lPAO?X#~fqR!E6Nh~ClB=y~el35K7oaQrw)>lr z_KRkDdZcvXj(L;SN4Mp4q^}0W7pr6y^XzapJ(Pzm0g&WdG=U0>%ff9`TBr!qQe?)+ zqbEOBISF8F<xC`z;pKg8iZK_SgGd?$?L5DW&*JGzf&zixU2u0BCyKOz%!cu2B#uVJ zOM%KLQkL=0&K`7KwVfnF9alR0AvPfVbYWr#c2@tTf#Jv4IZkUQ{XtJ?tf*w20;%*> ze!@JVW3N~BS!7_R2Uy3g!$hW_ZUCrGF^TO;1)#tcw$6zilDFTtR^JrSt1AF&WldCe zv^tLF<*S=4nzmYsH(`=34Gpvojq)Xv1XjZ}+q_5A98J%YFl=q1z9jR6;FELVw~C(| zgL)ahCmyVW8Fwn(ZOFuyFrPauCN<S_ma8N$J~)*LJeMo0O2Sn-H^o@r<?!D6PEsB2 zJT@Hx$es+)6=TH!&YUHUvb617wQ9AgcC7~VtvZNMUDQ#T@>o>CCf($Ez}R+r#X-qs zX2y=^=>u9<h(VxHBj7_FM*M8r0X!i^IG}Olvd_qbumq9A;r#y`p36%HUct<FqA3uJ zN!y6&O?K?+CzloRxL;(YURo^fIFc0d>-{}AYmZ;ej{ZL0qII2<DRS5g?swtELwML| zJl(l;RGbb^a?qyh+IC<UVMbWSg`FUvr{qy2Y;IVB2(JcPclc&3`ior<WavG?`V<U7 z+$=KcR^{$|NhJSI?EbIZ`;GwHCw+8g2s=Y^0xM-sQ1tYX@JI5^x%@>EKOAl^ywz8B zQR!cDyQqbQ4>!=#oPS6IHmrIMJUdu%G@u&j_ZC=`M0oUwN`$A>)vBV`kGJIhic>t) zDZuqFjQa})-FRzVi~P}rty~|PqJY$`tz>a$uZ`R|LlmfTl;(7AccdZ(M78ugQZt%{ zVH|<214KO+L>Kbnu++P!aA3!Rsxi6`$c&bU-9pNQQci!eJ%64OJ|jGL0y%y#I?@Ua zi1|EeLG6SHE7@-DBe9P%J6;+__Nx5Uk4ls5KCQ27!59;r&zBLy==kCGA52HM?dYhu zW$g#FhZc!CN;)$p4K9*rUo_(9<+h6>A2F(p*QpI$yLH~9%hG9&;%8#PHa3=^yWd{$ zJr5`yXn<8cLi+I{z$*PE_AOv4%NF`5D{priZ_A|Dg2>|o%<{L36MKIB!|GwC3^sT| zD)*UsGq`3kV8nqWl)bRmofA~s?oD{CuyO8soQxtQp_am$Hw9utts$yX5?qBz3dRC7 z$#3870+6keI?70`#rlkO^pP`+t2X!biylZnI5qCz#FLVwa7EhON`7HTL(@Qk$0@)v zAWD#<<ul@rN4BPtkttZD5T9(PLoxYU0WD9Y)3k$MT8`T9MY9QU{ftt^qvj0vx5fE9 z>VF4UvFJWOwVid9rmG1ulwKy^M?S6e9QZ(}3(i6&>WI7?FC*IhMOFDNFFJihCms1& zz!&-buZ>SB17ZmbC+F0YP<|Wu;PjF0>Al_;_phUEkEewjxQ(tC-ErE*m8oxHY$?u> z{aCZ=kyeZKVW{c9jTun~2`X&V!lRpz5~O+ps2^GV^rd!a(&gkr1|#r4Usn|aOpWr0 zLET|^y51rx@4<v+M`0G%a-2p}%W=d<D~fla<b3GhV`-5>G)OWf+tQqK_(pUD=%Rq3 zWg|kGH=kmGcq*6!!3WgAB5vPM<I_mvtu~FwQ%6ol)szhnW~CNt_HmH?a3}!jP^AXW zp3AP?Y=LE=MA!^*s6n2M2sga7w@C#MldKVlU5xAHd${S~gQg$|!~&do^S?g)Hqo3) z#^0n@^f4mNl<V%b1&o{o$qH%Kl<Qm8m488`Ifijs5$WxE%{kc-$5c1<6o|uiH#J+0 zr%##xoXxs?-^HWx$MKO~#jOH|TeLoS!x-5}@`u46XpK6)bnaj0{oQuaLgU+hJ3A!r z@SH?1tC5{htyEMb4CPESD(TZ1-T}fdZ72i+J$8F0^#Rp--)bcL0~Vo$&S^nm5?|$= zy`JImd%3_UG|KWL*R!pDZVBwVr4HtE(ZcQ*Z>3k`EA%^Z<HC6rPCF^-B7~MS8`W7! zMn47jyNHsahVY1}<pK|p-5;+p*`z2iD^9Mn8fU@k)&g)5`eFSusFw%A<CRCTV^O-w zRcdeH)dyi6<E)eL9AXfET?&#RQIa=?a>JJ5V75E0-D~$j-POy$u0s@@i*FigL;}9c zk1{$IqVT4kyFvm#K%%0w5<NRv{<$+|xOUB^+FxT8imi*RvlulwC8rs9c1{-b`7duF zhd3LlIm}bfGrb+6cBQS2b(FO=AZ<T~1rIAKyXv~gUuPO*s3~owg(I6Tb)})WzeHQ3 z3aZ|OHHi%toW!N?q8Uc~t{(Bez-?t1IJJ#j(ukVoul!b=0z5%YzP>d_2W9Q9PIwL& z-USQqCWv`Tf*Lr@@i(InZEp^JS*arQo<+z60tQr^!WT5B)xF;|{Tfwy!}!m2k(z-Q zsMPTn8MZcutES`D;X>LPh5~P@LsS5eZwz{O+Juf-)}zA|9o5O+or3%y{45JsRPN5N z#e$0t$}lI=$nkO35<ul2S2G-}2_EPYKS2wIeOt9#ED%A5)NyF?Uced(DQv0MZq7O1 zjuqgoleg>H$FzL{&O8N7`7`Tv7^xHzpe*qL8AicQ%ZsSLn@>2Q<xy4@rW*b14+IA{ zpH!lEH{#VtL3Bj)qA1j+zb~<;TDID%{<rte!zFkx9do-nRh)zM1s*jM^LK1oN}=*p z`U426_j>CT5K``_#JF}H2h}qL5n)FDMMMJ!v24h;NXP`ifGmIsC*_|rCF)wOiv4u@ zG2E5C`@5WPZAF04cA!LGbW?D+M|j?~&><j#5RgWnLIUHHAjznD?XIh#Ssdu8)Tk4F zQ38cRsN2O@&^uMfPy$$Y@*Nqzk(&q;Z|e}<vut*sfyA>cB#+PGlD_AzJIM7A8}3wt z<QR`Wh?9!MVU@n273r+0-Hodv>>CQmq-v^2BqKVphpu&`|9gk<zt(if&Mls!unPh- zk*OXi!>>P~ehH^Ukf+g3$_G8e0{i4#X_fAy865dOV0yvP`}M2}dZ-7&KQ<&1Ks=_b ztFvQTMxR}4rIe=vsz1hL9w+EFC~-d@e0BrgJlEqtF#~rC>pi2tue4EjlxE$5Zs47* zYe?<~*HcS4bK1*Sg2UhQBD93qps9Pn5Xy2wug67Xr@mj<pz=@DC-rPfZP^06#rU&t z;|^db{RUSWV+XQU_Mo{{W9)n(DEd4j*A<Sw5GbRVrj9_dAa%4>mv#$Pc~z!Ip!pG{ zpk%WQewG%gz@MAv+A%+`_i}(g!Xk}ot*s3r;_GuwKXn|QoYYv<ge-2(f4Iu%2`*E5 zP-%H&AK`J&9(+zkaH&Jch~=keJz#?+R0^_KJ==I4%YCy@r2~y<Do<~_<Zn(vf2+<b z5UhwkAnxqUh18Ng1Vz@3^V*5|q`e0!3j5YH3-+M|{7Lit&G~*69C=3LtPWaJ%AH3J z3mE10YCl;!UTob%IKe_k!VhyZD3k)A0rUfxf-OPb_c5}m1PA&@*Bq@|EfjP{`iLit zW2)-GM*;$jgT+OT=;UD6?d{fSC<AZUH*g121}Ug05IfV2?;^pFFY7_)TTx;ja%Zl& zzDZkrhj`u1;du{NL^s=(g4wikn+bM~uY^OQlEusxmC*pTrksbsIgc$4-J<qUqJV+R zDNfd89ST87bu#UTMb|1c^+4)e$Se!9BhwN)-lmj~2Sp@f3?=jzek5u@f`Kz^m(W>O zQE_6nx`(J-js~D;;q-PzQP&_ZNm;*tsjqd=r8KsJmysclsIkz*J-A*&z~-&O!9<*_ zLj7MI(zjlRODJ4n$ovj<iU|$Xp0Trs<D;`eo$F?Es*P5$6*k3P>^V3jOX3wDvsu+& zLm`~{M0s58knz>blJ3XY*PEmBdl^~N>DG%X%B-ukSXjMYIl99{X^LxCE=8#=;A?g3 zw-$6IF;L$=6gI1%B%=;LgYmSAlQh32ij|}VDX#_%ny7i(d(!q4C>spzHIN6Y`o$@w zT4k%qU3IpIE-15TxUBqe@0H!$A3A0xK@xXh8$zj)I1yHC4Fz9X(rV5ONP$62`R6O_ zzJ>uPFMMm8l;KEWITzMVpBqfb$Xf_i0(#wms40WmMgiP7zXf(}F<~0ra5SZCvUM~~ z$|I2%%`pt{!usf0Nk*ldIRxp0qv9}70a7tXWDTIA*0&Qa7b}7)8cE8j1%-;S2DM=a zz2&j1Vh}*SDM~g2;w3_=(trjSWUz?9){+1djWeq#d$Tpk&9iU-dRPcVp6H`YQ9ToC zZ%*22FxKD|*LGncP+rp7oi<S_u1XY4H-kPG5bJ8C%Oc&_tIz^&REZ^4qLzw^CA+Tg zU)ox_u(&fzVjn4Kfr)x#UgvxWdkSHJu*l>r(^;*hp^{`;v|LoHTLLr<VkZXVS;S@3 z*%E7Ir&et;S*?>9lo3^PF!<+@BG-{3yII{{ow>8?StA1rup+9%lur5<TW_vh8fO6& z)=OrGCa}=eQCK1Y6G_o)!R$FjMU`Mw+7MhVMCehINX;0vOU{ArAywA2WT3{976Qo~ zrUOzqLb22^v9{(Otu~{bsEQE!j=Ti6cxMmCg&>><XVzww8eY3SCiK9QVP!!=samb1 zDmmI~lKd{ZS!f#k!nQYF&1}o02Vr7xAhbU{9`9WR!AGraS6;eULJ3}0#wNh*z;)4U zdsI^P+RYTj^5>H-Gm1tJGm`On0;w}@56!sM8%|-QAi}LTYvLj1&u~!$LZgwA??Z=M znC%(XDWvHTbP(5pk|bb-3X&s$aWh8H)zu;eD}<niin_alSE}z5I$oLyz0KCPmYOAO z;?$7aYQqYvP{J&AeQ5@Ul$KJpXk|e932D5HiYX~|vMmMPjUol|612rDq}g7|nm&#a zfUpWiHN%ZJfv##8M7pDzB;8;w8cc#PfQK5pFD=7T$ea84SHgmXQsB!Cgd{MCb|8gZ z<Zs-1C{*^^X&W`hVV9e?j&Zf%Ti2}<<2T`Av92mCL<qrbMnkR5xy-=Tu<9l>wiAVM zrK6;6qwcx{(Jzp?GSHps=RKS0nyeLb#dvhugzR&%#~$tjPt#jzw;Q$vNPtZ8hea<$ z4i!RHh7p25Hx;x{Xc#_%=}SAy2-HcbTyEl)wk?q<$*-Z9Q-e!0xMc_ezFLaoL0d9f zm}WOw3_+xY8`fr!r3qZKA*gV3onltG>Gnj8ZgekVa5z#9f}5;XEupQSg>?caU{d&A z=Fv2m7t~r(a;IH15Z9&`RtWm9cC&l7ahlQvG+Wa>swi-4VN#2t;n~$_$|N|ZDM43> z$pVxK6G}eOQP)b>0>QtU_8^-K$4AxckpN{tn!hUCYfZHqFr`-Q!Arg8F54Jkz&J<A z5y9P-^wKD;kn5JVX-lM*p&@i!Jz?6}Rv8=1*;ekzu9XWa^bLHlb4@Flw%d)Xie~d| zX72H=n2`{Iucu|yPP7QljxZR5VSsdH!l@W$Cxwo(CnF5>+8*m5Fo9*|zFJjm7L*}f zoj`?K#|9JywSYwvLvJHWK(j2_nr9OXZ%yGur3f^dPgAw&YPDdsc!yzEv7mQLeGNhw zK0%{nVx-7Wu&Y2DI!p-kNNWm(u&F@Hd6cedp}0KCN4DG<aiY&Xh#-JafOHykSCq3V zQD<dCRk+s-ixAcnQ*1V^bO;x}Um#NS8WI~K;_fj;&{lz}A<guGb8;##-NnmeY_YOg z+SOMpoK`$HZyUt#cGp_8lTJ0fx0SZm_5)<4XA74DC>q)$o4u}JO1s%+mQ`SaqZ&Fr ztkbwwmY0lP__|2VR<ABA4+BjW5(R3ySyibXIi_(Iz=4@}a$G495e_o2?9Yj1@Ys%E zs;D6MmO{(gKa$1Am*-~);Bk$N^n_64IewU92Zg`04HtBTVZ(`>Kh5VXWMQrGetpC@ z@p(^wxa_yf2=Jy(IV^OANkUb@X2Cdnw3(3BvG6^;FJ8r74sAtT-Z7X{XQLcVeKxHI zE=-k*i>n${$8|P(FvF-f4PP@PjgDx!KcGku3l({8H`!X2%n#)C)X<fo5wnerMo}Y% zxw=l2cf$_2Q%m6istZmw(-zIHiJ~GEHm@sLW^F<^uvXaU(rWO+S{Fyrsa-1_^h!kP zFKH#Pw-rFr2A8h+rtd)WZ2F;L2?PT6^uS@eg;Q+MWg{h9TR88$TtxF~aa5TO$!Af$ zTo)TNR;!%Sw-a4(mDAK92h)>pr~<6oVcoe41or6&2q={G(Y3;wsZu;pQ*ryNf}uZ> z;`AR%|7O0D-L%H;1-fWCyml&)V`dyDxO~6Ex4M?susz-|-!i^{huEkLRH0>J9EOQu zB!YPO*~5{!Bq?UI8+{hhFfq`-HlXQv_lz<2_>b2vC`SAj&yBO~H6!l_zz~?ai}W9q z6#YR$gjmn#BE9+g*mCS$2bAlAHZ%vVe{yMYrQlGbpdO-uaHzyx2)>+6>cgDDpbZeT zGQt#&S(w402j%@q&fMx++dk~CCohphW;vdJa(?B@&1gh19#83Ne8B|t^7U4UsJh#x zi<iY<dTj9=CIkO<MhKUMQVT`k2ZEtT+fU7_(9W`<D(jtfU?8TUp_2Wh-!f`l4&_uV z&d%%GvhV73zCTw!gpT>R`khhle6v~~W^=|VY%K>Suf=2WxcVRplzOVly1(;v!@uP~ z-m7VvQs#iWdR_yjfu(&h09GI~`jsE@EH&Af%VPV6SK74=&1`0nl>wN}d~2j@Um}yg zOp%*S4niTcbs*BJK`aqLK&TNw4>-Fgthuc$@ts<c+^n$e#@$82#@d>9LWzNg4YgUw z#TH$72VQj3g|($SUAX2C1GG8U-~=lLHHAYZ%M5DeH=^n6txPCe)!o&VD@7LsUJ^wY zj-IN`O$t$Veju=%==GTU`7$txX?}H)_x~mnhP(LCVtZOyNL~eSuG+G>RdJ(;VFT!* zbm0`S)t@CeGQ$wU<q$(px8@9vM_Tk`OA&jj@7Vk{poLj9k|k9DMkyd4Q3FB+5eQ5a zOI19)(RonH1_W_YOwORZ->1Ewm1*<BM+xMu)pZr;3tN&5n+H&|T(X*~s;?EcqRJbA z7#GF7;(-Xkb341dD+)BI#i$J(gi%i`(a(9@Y9TYpgbVr^20#MhlfVsGio~mGTnL~H zj1I)~bq);+KoXA~Rlz0Rxu#y$ds+p7m9h*|riuj5X}y383$9_B6gR*XlBYhe$Li)k zF`8Gev(hx}>)UGv>>x`Nbp*F+^a3({bmT{wdJfp9tI?X(2dLZb<{N&)QLnUVDdyWZ zFOaDp0ouVY_`_~{7rC`G?Fx6(qoVtJF#L%bQQb{L0pE=awO}xc5XaFKm>#y&_jho_ zXrXu~=f7SbaLG*7Ian(mV3B0}@{PQPmEA5l-E#~B1B9o+K-{MeD#q7Z9u$Fa!JY{Q z3VY(Oh>V(t4199#Ka%G^C&yo1VW-znsxh#CGe)nej|H`Y&vPpx;fOjohN+WMf)3?$ zS{s|;bWYSv+BkEuM0+pbQ9xtb$QWRrR=fBwHo@O+&_Mx84i4c!u{a#ZRrlFq^4qFY zMHK5+V?u;WGj=YF2Fkpb(H<IOS<i1Cq4O@3>F6o-%~Jh<3xW`UM!yKaXpA%R<vxHf zu<6Gx;f^|$D4v^d#{G_-9+d6TM<Ja?9`2SZ{KV?3-AxTdgrf9YHZB;76{9i6dSjFn zPZQ^^Bh}lmVb5*3Y9{C6P6`FGBgv!LkEi%?3{O!+AJ_CK^Uxrli^F?SyQ|=4D@fi- zBVByE6eb!OZ!Iv2mn6v*;zai|=8BLhSV4t}A=c*v22#0*Q5~-{YNFMi8%2^s3o8sl zialt#iFH#^GgnHVZjYyaEpmbNP>M+dRq)wfY8jIxDMS0MPY{9V?-;1$M3OYw8iQTf zAd=EU2BqmIhW#yZh7?Uf6j^(t&NW-gt!T<LUmce+8@@>91J&J!&CHrNgtsHvl^>DU zj{to17-Z@pLly_tUgdSO^xvQfvJ@ncmBwj9tbEME*-qaVi^B~p)Lye6VD7KhFF#v~ zIG>}#5i1)h0jc*WxY#{fkMFf86T}SFzhDwOlK&D9kH5)&APAK5;mv!FuDbA%vUxS8 zsEIo3`foo=kBt@=iL{OOZjEcF(XsTo1AT*<8S8~S7;$>0XAVTj)s_Q}IuJb}40oXe zpG-%i&zFF}_onzKpz~>RF{?QCK;(nDXN^M>K;O3UgB+YM4tD14oVqWAH1Nak(_Y_X zy$m0hj!X<_8f?wK6}{vrNC)MX*r;#@in@_@Q=tg7Mss?W6EHGJ7^sM`8xh2%H(B)h z0HQxXFu;%)5J4b>41SQIM{W9TMqo;yPNZxDZK|+z?ln!kZ%8S`sAy+!9fYn`oLuug zHd*U>KzQcZV1s^zX~*^-n6Hz@HK^$DglpYK6j~4<y);n#m0ut&B}NF5;E1FN9~jr7 zNWGSze&+IS&N-twGyWWiCx<`5(;o|pCsIzPav^ZwyB(ZuUp9_=4B(K8>LEq?hV&G@ zaE{`&X0y8LP%m~o@lif8UD7-Oa?SI3v%H#!;<EK^0}1pwr*w#l-zUm(BOIAba2LYl z#eK*Fy?*WO);U>Wd%|F`-Wt|Z(>=dA+KM3Cu|AGG(cV#jT@4B%j-j}GiZZ0B9p&(% z5Rm~^S&@kyG8UYu!*VKYh*o)yul$!+JE9C!a&W&$02h@+7WH|x&h|R&(Wb=i@>Eez zV6rxi*Jf3k{k0x(rQC2gweCZqGX5pqn?U1Ig65^>ma@m2UC#*E+Eqx#sxCxDo9Bjy zC2oo714h@uBJQ=REJ<)vH&MbgtHS*Zpq8sct}Rv)K~SLe!f#i#V((SmSd=F5^E$J& zpCwQZXGK&D6sjb{G^!vfXksaMX-S^BTEM8S+;Nc9yDy`Q>5V8gjd*QI{361e$|%q- ztyMD8u#!!x(C`>^G_YGWmrFX;r+%yjl~B6+<&&g+p`;iqK#i{{nu%IzT?l~cK3NFm z8U3uM#DT$Qh~)wMJ6L$@T)3b(Rm7^lAIR+J>KU1%i*u0$2tKQ@{|}srx<RXUc=yk6 zqAT^TY^De(Nc9vS*xgAHYwGRIR`_Zj9G61%>u(%RI;$L;^^(lhZF0yjXv*Hap(s?~ zI;YhE$E-a_(%#k(_6ef9DYb$!c(1h}dwn$^dkrI(@PACvZV|;WeICUF!)P1*5F7+@ zn)r{OFnahf+>LuyZi}v8`A|C6ffw?+f%})tkJLo-pRsiB(_!Uc)!ypP423{iq%+xH z(x{6LA-_C91RDPIO#8aZTY;{&TpeMF@CS=KFVv{Af}I>aOoQU+1xgSJ%Ao}x-mKST z3TMY?tO?njzcX0RNtS}8z9k&Z2-E%?KYHco+oN9jx@>a9*%tEmX%ks%pU1X@RICkJ z-DmENnngQF`83AANTtGL9X~5!qvkEA#TbR!)E7cOLas;>E>Nw1YH0645*Uu=Z6}Yv zW%H5nzs1hciurd{$i*12nk2TsGE$U3sW^2_?TaHCTg?U?JULd~`P6&ftm|XB8U^Dn zDn_QpMOmBdRTtjZr`tHrc#KlfNZx6R(sgFGj25BJ!B8tc6>(9Sd{%1$1pNqzwH&6x zmLF!AurAG8&}-FlOzY>QT0dn5kUugbb-jcy8!q=>b9r4yv+Dc1l%^Aay-Nd?LE0QU zYj-n`hV~qV?R9#3-Jb=|kDtK6qylMM0@0(xn2$e47JilBe67k{@*Zoh$$gtggHi`z z1VPp=HHIAoYKm;*by87I+BszyFy4<JAFKI2PA|vFb>aDm)Myu>95|TmME!rOx9(6b z+1~+R50`2W%fL-OR1m?7x6X$SmHmz-KQagM7wO`nmpKGrh>zF6XC0#aO@RuWVSus- z!ov!t$U4+er|Tn!yJmn*s7l*!OUN9SN2q&qz<#84r=e}{QAwi+x(!*6?8`ECMDDV% z>cFWD>%&r1L9J9*-7TpU4MpGIYf=G3k$+3j*n;ad`B@qkqV)CRoQQc)^(w1WcQ;dm z2<*?XK~wom*+3l#6u7+bqP+t2ovLXTEY&cDS&u0S#F!0A4ZZkbT0_zAX><ioh$0Or zqDFl(De6TNRnU9}MacDYjr93#dBO*9&~8NhSJV7Yl5N}F;iv%$@qyI^2wZ{a=C5dt zVa5+6ZQkR!_n5mpc&8I?6DF-@W(G-3R#Am^IW!5ep`tP-%X2nw_cE{pooO?PzIDz$ z^0>J?IQz#Rv-A%YOeF|NMBj4Cni8cI6+u?J4JQ48ba<bX#z?oC_REoHeNl(R&6DEk z@mr1)pS-F6Jk5_MhSlIVdXqnB#KMe>yYEN;IS8(aQ-y3iE*^EX2BS8DW0>EYCJ1Yc zB!oi*7>@$-zY_9P;sB0BU)4j4?Cv*<osXeQiR!!lV+oe4Om;Oiqib7S(H)>tstjV+ zE>;Eu!kU;(SdZ&$oLp**VR<_=<FBpATqypWfyaqRTpzo?`>7V&)7-^dVEX+3;|jEn zm|@^U*M;H#GgP{F9Oq+)w7NKn#|~V*PUN_TS`*!2(m_$?At4r1BWWDZ?oU-L6SPVp z5eN~M=?FB>7!W1Mf=sRH@v(G@NK<&6zzVvvchyPJAnB<jkQ0>!3CNY?kQ^$&M4Kus z3$l@>ZR^t$M99q1%2(lP_3^~DM^fO4U2M%XRa=Xev})H%mW_g+3aJ>K#K=gG*5|Np zBdfi}t)C9>89s!iWxO{cl&aQqME*Z(!_GTA=jQhCJ3CuW^YyyA{;x^N6j4PBU7TS> z$(E=qE5rvP(~ct?v9pzD2S-HSqAge@1W7kg*&=MSH3ghowlfrHiS;7|j;g{<{-I$q z&5upDb)vZHyS%=eqQb=M*X8I3<v{6=Vaz_fk#AM=zGUH*ihHB<FkUtfP|Lt=jGGi= zREyD;&lOWP?YC#_f$5xw$`67W1w=7xSoOmvI_$}`104IbkH0KUWA0b1UIG?J9~M+L zU@YSpv67RkqlV1P`sn`$=zyG<$aRpEDgV|Fk0Yo9Q-wfsq<@8qm?O|3NAg4ZgaM?L zG-7aR*Z7^bYib=ySGv<Wj0r$8KRS}Ej48qk1mP~}-)?2p2TLVzlbKT{A=dFU5F|(j zt-xw^C~86Ekotf4us@&fJ%^x19|Tat-a-%5N&E+*M2}ri2@VA+)%?x+f4sGCPqwV% zF%tKu_`z}e<0S<#l~r#+-a>(6ghD_m_Z0s>g7qWVM<fqlH!DB(H58CpA=FNTi{Ihw zYBGfQBd2G`*WKnac)jjzmuvV`eR4ed=>8J96#DzAct!J1gpN8C{!}bio6Gb9;$PyW z#C6UfiMLhZf06vmjmMM0>7aC&3XfjyJC|OFi;?#_9*-@|eK|zV29Qn{H2bLH0iIlR zt(HQd&2W#`LWI#SiX}jSE>okf$!U(fYmPNhAk|eo6t9{#$>-Z{KX$rR!_nZu<1v?l z1MC|3_LmMIP*|i$*)i0+uT`5Yb47l|KKtqx%(a-b+#9hG3O6{$pl(iI%=|n!R|d0A zPO1aDz3=w({d|+UA0xp-xW?NRvQiDL$P_SxqpC-*Yh~5cmewS@230pJV9dNnluL+D zBSnZY%a#^Y?2NStyCG6|q{~$z*+wC@@$h*<uC0-5YZ{LkL6kpFZ>Q`p;_K`z=eJO6 z8`RQYo8;(1?%d5$>XJzy8oVzT#%jT~Z{+$H^stTQ_}qrNd}V=@TGiL*`NhIjH8E@) zB1}iwrHc|N5C+{%sh56!91&bN2~I@1b+M~pEGIdncrcV%8tM5XfGD72gkVIcR!Mac zfnQm7VP$0X4nHQKp{tTUH4)?9+oT9K-;4Yz+tvex0-z6Yzw`nCp`is0#9*S4oQUiX zw+oJ{f;Bs^K;lgdzF-waBO>mLB7r{be%{Z|=lHqtHk-=(9aL)ixaiMl{xt|A(bRn- zODSsu7*Ljwhy~oFBIW+|9^W3d-LSDjueG6oFLi<Y(xL<fgvDR4^z{QDu+v3PO(*Gy zY&IKuW9$Bgci69$Lv+k$`1nlr;F`UsXeSg8ZwEHb_I}sb!$lgt8MILNEU;M0VbPs> zAmz$5w&%}nxx`R!{+u0X@ZY~w6I+i^2`fd7^kBP*5&W(CY58{RroJC0YHgrZ+naXK zG1JC;j|jhrfTxs-52X)ISDuk*f_svE**GK(k_M#z$<T%g{7E0w);!c5KnOH{FAb6! z+Bl=uUF^VV7YG=T3KR`M<eGr{_|~wY`9JF5hlKD)5M--_WQTo!{O`MbN!mIG;|v@M z{XPEF&-YFlh;kb^(o<2CQECHdZ3_whF5FnEo^VFwj;&^34hBXy)OxTZWLT0(n`kOx zjSC$7S}9FJ8pM!QU>#_T8I8u^>7D)N>yCo1beNFSLZczL0|p~33=qM9401rg=thaN zD9AX$i2cmu<q56)P;)E8I%w5^+f5jG%JINy7{OkkZ;&AK7>dMJ1H)L<6h{=`y9|#9 zHZS+ma{3>yyZ`SC``opqDokS$jB*x58b$(7WCywiNl1VX_~eRdkX^8i3Z{Y!gL+KN zT;q))t(XM{W(6i@1VI<R5y^@g)qz1U<Yr=qe;Re6!*)3VkfD$n3zaR!7;4cLu@0KR zIEBe1K^P81laUBZQUO>Gh+6^4m>4uDP!T3^y&ECs6NVi#&SSmex`l{L<4%GkwTdaS z1maCbM&^|aqgphEq{$n2fPW-9AWjL$Ss>;`*03mAM<<xoK&1_9jC8;)qXp@r#0-d* zfGAqjIRaYDBx0dML>QqF4T~iWHBx9a4FLuO20XN^5-8GDqBJt7rHD+WZb&wYCJ-7R z)Fz`)9e21i0MeCZU?F_GW`lBC!N>|gGDG`tI-=ljEVzm^L8a`rfSiL<qBD>__(9(1 z=*R@iO<&r!ybJ!dl%ga(>L0B?oeTT4yXw|o@wR`A9RPC&x%5tlPzQ=@2#|}n1&>@M z;d>OIX>R>zt7B1>iDhO{neW!Mh7Xc}qdhwjAzTL=B1|mi|2xLj8Hs@v^h6lp>){%$ zW2`LgHa&LvzW5yPLE_$49>>e{WYQP?q9P!I7En1Lzg{E!;XZ>vegXqy^|gNY{#+-4 zAa@^JKNbmso6opGnkcgo7+>{2Mi2HFzFZ+$Z(FDv*cU^@a8R=&j)S9v0ARt<5Kwf% zfWdX&kwhT_`+Xp42LH7OFNgmYfEVkJ_y6Vowv(n$wUFWwya+HzC@6*@B3m007!R%U zzWDfN8Td!p<;Q#b=hNb7l0p3N4iOT6sqts@uhiDHyMUs7P`PB72`t?#LLp=!h=yh_ zO^#@d{+$Kj!YxO`gDX)!tdRZB<NCz>-_oNqVrS{H*38ya8qu0#1BNNt-m}(_`+eb& zKJ>&N-$1%9#u<hV6g4qO6q1mh{9Jv*{kfcd4`Z&l|FGg!tQol*8-J+;KbGjKs=Il& z^YyK2Oqh=17%ACzO~!nfFs6g3#LErNXfTW<x}6vrB&vd1SYU{mPa3Ueu9&VQED;kV z!QlopZvv1Y9^)62TMuAj^8W;L1A9~$SYRJ%QEMYiV8$5RQJ}3X64V!sDo~iLidux4 zjD0jlK$1y4E@!1G8)=G&`obSqp1v`d#lJ$QS9uR|cxX%!5{n5U{>m{ZQW!)x$6D5? z33?;1BYRzo1TOb$aBN*~lWVXzFyM%#Si)K(3>ZZxiorpu62%6rw-~KKSzK0je$Qo$ z+Vb1J)9>$kX<X;A?`^7jUpwgEa1??j{+%ZVtti%Da3Tn=j-|2+f(mVzA)8Sa283xJ z;NQES?(ZZ!l0*Gy54rwMeN*Cm+OOR14xEN%UTfK}L$HU2-8sB_f69Lk<L4dbIt|^q z?6+j7Tic}&b<|1#Ay3_Z)2H^~3;oe<+QX0Zbp2VGa|}3d{n<mFJ8Cc3&J$dm&`|yS zo<Aq``%L3QU6^W<&rs;;&^k|kV{z82#M&Q=U*~CfxaH}yY+c`mANH{@JP*RGfE$d3 zmJY%YlF?A=6+e2~TV!w?Q6|!9<FQ!A8JJjDUswRYi^J14?hWr)I^Dvks;H`ps;aam z&7t;biGx3@`+w&Dh4BynAFciG`#0nNTk4_Y_nhXlr|K7^-^Hk6uxj3h;?-WcTzO`9 z8qyp#DCjA90z@5A&{L_3sM|6UoX+>fJZuh}-w5S!j7=e6(GG+Z1v|m}f98H>Ib{7W z7_|Nb;+g^4cND|IeFF^*>U+jVz=_q_-VXe$b$yfJAr52?l^_fP6Tn$B3>42SQwbMG zTtw3#Mzdi~MM%@{LX^RnT`78R%Y(%>Il}Lxu)Giz0>YtC7zw3V7vZ4&o;?1p51Ip+ zOeJzDJTA2wB6OU#?dJ0KMVV%ZL#i+6h6NCA1Y2?fS=W~%5eP>hd(*S`|G=zY8@Cz% z0zY@W2MK~<qKKEV<Ok8|>cH6rx~i(Gs;a7~<;#ucW@CAo`0UY=-3_^L%x{JH?ccE5 zsU)hYA&7<;hzNEiRZ`VeJxGYkoFX$Ss;TSKtelO>B$7ttk~1;3+rY<-IUABmB#p@= zW@Bx)b2Tj-3NT`2PPZg&g%~ngG~;qc^``A_2^)rHW42~i8{Jh^R@1I(Dk>@nh;6pp zy4A+>Gcml(+nO?4p|>s<2gm5wDyb!^tDy!3Ra6jFRYD32u!HwM7u)FX-ZvwH7k*gX zr6k7WD`l#K2io@!bx#SP@EnHy`B|0-@8K1#6q6f}ZyjxxM&xkxc2-hW;EFLb2@5gD zjo~quD;YsjXm~JTgTV}NQ9%(NLLP^?J;nVFovzkpnVA?Ub|Kip2~v%>g-Kf62^)gJ zjX4H-zWWjM)Pf=Bjoc9u3TA$)mNaZKRuF~&BLyJX!a)g7)eJrlrH_ZT$fvgh%qI&L zWDa6n8A^-XXRkY-=5nU9zolpYTbw!J#kSlwh%{dXVqfpSz5eIPE(!Dg>HkLm-~PvE zQa(}(UPi{Uf<h4@ib1shjTmZ45U6CBwn2c3eWC;eBou0&sxZ<24`|RJDij#P4v1AD zu*{i+ghbeo?`9e==Bgs9s;VNDh;_EuvvOkEgI!3lZ(`cD2b+u1`mJ-dT6GxG5(mvO z!O%43Mg;{$GqQ(V<eg#}_Au44f}v)@F~9a7>PntZ;ng2RBS*p>ZE(?=h@PLshnVqI zR8d`43Mw*7QNeQA+V{Z(<mgaT+ATvnZ>O%~KB$yj^R#$7Jw10N@7!@My|}p+dR4KZ z(28X(SY?Mq2ih=4TpzCywWfLi4kQ8)Fa-mMixJBsLd$mzMpQ(&6#)?T>*m0t=7-_^ zL7!M6Qeg2GQ2QvINYG@2AWAZW{7gLo#l=M9L$x3o1Vu;3#sI)z#xpQ?Mv|2#X_eG5 z<mRehPt8xcJOb$bql+xH{m-9I7%OnS<dW*2u4MzINNCyDLq!E~iNi57Mi3Se)&rqR zL;Klm*)`iBU%o^Y)xi5>EKt+1xx_dN{h*?ZiK+n=L7^i-g+B816%D)?M>zaJq;e^M z#Sa+xLoqfNE{s#vy(6npNI4wK>j}VO;3?qnk?e!Ie#g4U+;o{G#;3@6ofPM<VUU2@ zneH`c3`0mo?oA0}Jb{PS93BS<&y?i8XifSc^g9P82AQy7X$w+RkR6|=r5*C&;X}<l z*b{)mpnn14Y(8Z9LzB$*wBSl}vskGFAuoVXW<+`ejC!C;oZ$%|K(20lSmqvPC|b_Z zq#j~gA%Ml0<zrWYZhV0zfkC5rzrJVOCj&<UnnBk9kvv9r<-NDj16gB;%8kL0G~AgD zh2R7^RD?fEG92OuLesuVx7S?<y?hX%hk$~JaO7vQFo+??FGF3>ce+y(RK*%3H1^tT zvXD1-;|Op%5K!7`HkdGA2Z%!ZsY5{VO9v2L7b7H0as;v(+yUY3?*ArF<9G3jtXmZ^ zjAF7mNO{p!Ao3i0tO|G!K^KHu4=)+USQ8_0HV}OvxV`hAYrl=bu}X`w89eA701YAR zRdODO(RS~pU$UQ5**JZe{amU|j<p~8-_o>ZmWr6z!Jqfk{-_fCA>Nxl2xwg+G2N`V z>qX*!CM<q$UX9hN&BW`3KY4<bgXxFm0iZcTB6!?J__ic+Z8rJC(wh*>*-6_dBL<lf zpr=1F7=CWVX^tH;KLv?6@+vIA)2Le=VPc%aqgTDQ;rFs=`@xs$s(!GLWJpjBAZ`d5 zef?Lt`Q}+)Cl8C7Qo#AFaf9UF18)jw`(;EJ$E3{>t!7b(xke-tPD`19IXN_?V=O^3 zWTAzGm_k3is}F|F-F2UPjx;H>jtS=66q}5FCj?Hi7z8$8;6g;p*vxJ*$lj+!W(}-i za51on3djR}-@mtxEDHN<nl%|zL`Gv+iIJI#R!n9ApIg6%pbiNI0}_QOL~~(=XfdSJ zrgsJ=719@Bq{avd)SMVmEmwhSG<Eb2-<jz6y__bWGE|2CI{IGb4ctKi<AWh0Mf8K+ zKR-NZ2&i7hyUyO7-L<YaYB5rkL~JnlxeDkwj>T@<G4c^h4a<!K42o(MP-+b}(PVsF zHPYXo`<q)gsN0y(&bwMGso8EC`_*!5f&JbKAMOT{Vq)BI1WhC&<ram*ZW*vnSSXs& zPd^=P)8I}sA9RMpB$Au$aM+2rk?Nj;2K}Aimsc_@5Ha0`Gw8_BZb&0{nqWu-EQ03; zZt7?lm#AzzD`=(N<I`vG|FkiOT`I~qO5$OFxz|Oou;?9itvjl~HR$V4+_w%?D)um= zE6H`uL|ap+dm_@OMsUG|cfO}ug#r(ETsIir9|O!&i|RpIZaUus$;E24maPS$@)MUM zTlcO7UI6O%486>zhpm?x<xW~{(VX5qk0XQTH3%MjlukSIWXP03cBwc#Gl{o^tyi7G zDBVJ+gJ7zPsG}u8H`WjzOEx&}_quDkjkM8rKP!hBc4gAegKI`pfYY4?#M-LX-**+I zMFDYOQrR$4VMQJG{slBJ@d6LpEu5PTBM545vn13LI4q5%9U;|kT~CHuE0PL>hhfMh z3Lt?%2C59Yx3Ii>I~%h`x1J)@&eI+>o8_u5HC!w(q;?7IHkKBlqd19C84at$D`=@a zByD)}0=7l~Ji|YV?EE2KQ-^a@Xen*uR$D@&oT>{pyeYhxgJKQpwPv>wIg)!~Mdy&v z_f9sEw>`80gVG_Qcco-Q1}!TP&OF_0_N|@4v@%j0j^ya8p`<f2gflwhENA+)yTQ9O zA<Am0j@P7?4r(?zuBx7~Kp~U+f1og`4s>nE`)EJl4x=10we#?n%;=SXz-{ERuE^62 z<<AZ~kCYHYj}N6$z&}tN+x!d4H+|K$)m?xkK|g1VJ-|<-+;I>1kl>N(|3qYJ5x}U^ zRZ8FAO~E63d{qA<E5a2tU?0NQGy?<J2=O#DJ8O%(b>^e=f&X@`<JMOTjiCFWa3Kff zmOL0bbz8Re8RE(BZ7*YQZTx-w9)@Lv5o)6X5R3oQ%fc7P*I*i497ae$gW>f@0twcP zgCkB6m;ne;hD8C40hu6qY8}><wNTbUeY&(h99Sg?F^n1JnM^@Dc1b`Lk-pM*eGU5e zVBKXi*bE^rQYeiCk82VlflUSxqc&RT9$h*g0<K`ZM4BCW`h{m*Sgx6mw0_|nH1v7e z+xsRX*DEamFz}AGo6FnmIr=`T59H&IiNggOGRKlU7}&-*j-S7XVIZOxnQoo1D8?|R z$i&D%h^nIJGNP(*EGnBDZLzlCn9fLR<j_M!p?HcB!zcLgo)8?}JNg|kh_)gAf<3zJ zPE@_FuNX9EI)?MZG3y-Gh$thYytp?uJtv^Ron#VEyd>!SRB_fVGa_^!tA`lkfque& zji3-j1zr3Nc<gtB+Jh`2kYs~Qz7$gVDy=;mnJDwa4<TM2NzLP#ZaRR?qQS*Qrp>dD z&Su!$J>5`T^dD6w`%W2|v)T?qk_?b~neS0d_o}U2Zv%SZ;{~wd3^d1}hhusgz}g-H z_d32Oh}Qh#JMTr43oy_nM4==BKpp~2Vt}S4BqBnAjBPQDVr{D+*Y+@*M~6GxZ-dOm z>u24u{9ancg}c2iE?<H{zR4C5#>hdj#W56=(M4L!%q?fFoo^Za{+(#r(%HAls#v)! z9W8?h*&x_AY&LsGurQv!-cAuHK@|k3RKL{Kb=kk@ytVVPwDJbt5lrhpOQN$emRHrN zp5|+z>JSn@kqIEg-lDMyD1bX2r(@IVJ~+OPzGiZ|T<$K52W=qKV<c>FC7UnIn$0L{ zQ&?)7*%83>6rd!1rT`|vcs8`P*AaD*^}Qu`A~B`{%pq~mYs;+jz|0G;kETrxgx!O6 zlW&s8=1n(#-^JsXJ5wKZpx-GzqCBcZxE@qln@o+Tz4TDo^!}!#I6-x~tNbVyEqbUO z0T!STBw)vUIYV92&~r{jUv3=SE$Q9CuT1>B`_I)M4_B^!OLF1NH!!5DXPtgm8m9qJ z!`{fbMF4Ju5zQB=arK+|1Ltw3c^)T^1#W$uINM%zxU@d09{wO3Bm=J2w%EVKup14W z_TDhe&m#9C>lyJj$^-xsDD&JLNl&CW3MnVDws&`a|MLmo=-@kq-*r(c#J5&q<!XSQ z#m@m}dY(hGy`uFU+DA-lnsm6@MDIbQ67jwLJNWPXHRJqhKftOK*kyZx9fNdH*X0{2 z6(q75=yBNW@pHGld|_S!cjJ8?FA?a#WzjW<3-2%HvTZG21GuF&=_&2;2xn<0L1A;_ z<0}$mJ>%RS94?OB=?VxXjkIwXLu^|nH}EQ-T&>Q`k@l#gMtq2;>GI}TG0EL>b@NWV zh;r@nU$Dk!NhiM#e_nb`+jKV?xoGeBJ@VXzCf%i#fW<J7`qSf~=3`H+4(vQof&-Aj z*Qc3KLKq)Zjx6&$blG1PzhcGrdO@}Y$Nea8*i7{2(`VKsz}Uscj{-4~4IW>bY{LQ? zI&f<Iphx_>qXHg*f6YG-fb5uH7e3A*@x=Br&qQIkU_liT$^zM`mkPKZ@;#NGenyiJ zpoJC%7)DPu0uMfp^z`!JihJ{g``?2XJoeuRGaz_kOm+HoaX}tdU5~i@z5U-$a#U~P zgNN=*j?uRM7FZl)ElM<j#^4SXx>EUPpdAuI4_2RR04xXH*wJuNP+c&C0B(DOcNbTL zDOdo+w6imKq)^k{?04oc2iffGJ9X*s%f1_we**VN+IbFhM#AZhHb;S;<=!!btchk# zB#p3a@*OQJ7{(Pe!6s5LtE*C47S!~Ql`84fTJHuxfxd~LwL$yG`T1`W8C6QvK`G<_ zDUdLp(O2{s1Zt_}1)0JGMJNgJ8sm?n-6Q8n<lMt~Dz-?l1aTqU0HHxd3+O*ynr)aH zWGS$^TmXs(0^g9^b%538$++L|kxD=FMFZ7nOHh4RRAG_mRz*?DR|o|rM|zP=6>BEe zz|pnS>vRk$q`^#u;{gDuhY)HcviXDRs-POI*6oD(cc0qpEpzhf4_9lta_`ug%iLah zXl!x3_ZRk6!+l~dMyCf@>#D1Qan~F!mc6WdGZGY{<Q^|>S0etQ)M~Q{h|%5w>>~*u zFQC!0YlKWp58^Dt3>iI-e#N69CUkT175B8}F$+_y!Jt~l!*bzuPyy{x45W~>3vs0; z4-kfQR7EIC!27X*BYx+LrmI<%voNZvs;aGZ8NCYmxLua~U0R+l8A-=>s*O^9`s4dV zIrevEUP3%u?D1doIUs-QKEJ=LI)9F<{mnIVsEiTPJw=ZJ`+DNtk`qz@sYG`l;0hdn z2jUyEdY1m<0JGU|Gu;#JA-`=}QiL8AM});!M|h)8pjXqZ7BiDDuai_pTZ1}@`1y)3 zWU!u3<a)ZP@~7|n5NE3<J}&45&-u7k@vo7-B`}0x;9&+d+G7Ft$<ie9`m>*-=-OMA z{mwT2b?&CW-BHMDX3PeZy*v+qsQzu0$b-(f45v$U*xE|cn-QoIAHRoGd;aEDeXkEM zn&*T*y{)TjM3`eFBZJPk#T$RKx^jD1SSal-qQ;e7dJF_sGL1BDD!us^d1<YUzq#~U z*PWZsf{wr2ejTyw6z}|t*7gFi<>bQy#>T%AG!#U{D1uBB97MYj>Q=~43knnvKB?PL z>y0R>$GsUhfgf@@3-oB|#yBoEf0y|()FV1-&BsPzL-#Ks&%fR6JPk+Cbvhg2_SA9_ z_4^egWtmcRhwYvmb@BTBtBVZ$|6{>_9%|?G<$52Ty>rs2;zigGQfUxrDdGb-tTzDi z=pzUP75UM339J$*q~{orISQKuXJ8*G3@bB&!z3~>=PicIxnwm$d@q-eRDFqd-B9Ja z${n0yV;yD;`m&Z<+k`+y3+(<Th#dHc`uKr*y*wYwoMt{#jT<6In+n-tgl<5Q%lH&o zgt?!o)qydb_;yj@l6*EO47>0T9}CRZ#3YhQCqY5#4!<*3geaf{rahLhV^mluLncJb zXXy+y@y2|fKEZ#V*Hq)iaAY|^L)MSQ(xnW?PqLh;KqNT8F2~Fej)+_RTeBS$7El5( z45X-+RUF)cPqEY;1Y3&?X|8SUrBMR|4cOHXuN`<o944yXRvSVsva7ds#FCXBMIDt2 z6`jQ_$8*?AtA(ZbXTa=Nm{37T9Y6{MeCy#yEUa0SudTW~20x3@^|9+YpF5_Bj@a8Z z!8^>*#$=<d{EDK01um@X21CPa+?$kvBg*KsJwTuw$H*6lu}6!DWFab*`cwuYBM@&4 zMhg47xN%@*rK?AG2=G4!3CVhZP~wtquV&S^qw8|re21TAe4fTf7Qs;+Q7y|z0yX6N zHae!*2Y|?<v-7A9(ib~;TOy8v(tY2TW*axh_nV0$k&T)fW=&&bQz`g!0W`&p$Oy&+ zQkPj?Ht-LaiY3fUe(F!HpMRWI3;N1+ggv3yK|eRj_~(3HucJHM2uIdLg<lH>`07dt zRU{Hsdf~3)vR~WsY$eq>FU)+8GojfkNMDga3P9+g$0C3}`$f;lY*?`#?5b=K4%=b; zNXYhu)S9UTY7VAZNj43~@KN%79s^kqP>JT|><yt+Rjsc)@SHzdukltgPLCH=^^*`V zr;m7U?bmGW+WZf|j2Gj}f~)`sBm^pEm;P7?6W8v<tod$XMq=kFmRRGh+}pK^YU0Q@ z{Zjy~gI;z3WD(VwYXD*b*N%Z~yZUt3yDL0!)YPE|m6z}DK73v2@do{m^uv&g^J;)L z3VyA#Wq-J!${6H6Mz2uVmGU!5pPIpFJkZn;=!G17=M*hQlVaL#qfc&pHqGuN7fxe) z6`AGW8tRw2a(moGyZ#?9IQWN@)3Rj+u%IgPAyet>R}LY9asiT%bY)<BseahvMn!w& zF!(<{O(u26JJ&cNWrdC<70e$tocOQH0mxg3Dh3S)Us=pBn0_X6g#6#LaG0xXV?njh z;~j0rN65$a503v0`+WoVN^aBJ4(D=1>mapuM9qmORaOC0Qp}x)s(V&Q;3?h*=RwmI zmZL9TSbA_ens3W<oG-}L`1vSZ2f422Jr%fkQA)0-Xh9YPDRCW(^iW9rznCZ)O9dc| zToN~hr1}oiVfT3<oj@smRDQSK<j+%p`LRR984(c?MHE-Bh2H4r3Mkj^IrN%6VE?KV zgKF8FkWhV&sK{t`B?l#|%ui;jP-LK_jutI!)CXm_){pD>lnDXAP!&*=)Om$ZNAt+> z==AR;JjS7!GRh_l86+&nM#<^vjbYHJf`Z>mFhZW-p(+nAr?lt&=e@nz9d!rq`LP<! zXW0M%iSAtqB$7#A-jwKyv+*zV=AC}74f#i%dk5(5zqgJ=_xo?BPG?nnI`8+pHU^)r zXXfe=Ibfhxzb%#9-=P9(poSSy3YA1ML&P#Wp@YKP)p2F(pzuDEZf(}a9^;FniPXuo zhuCK{D76(-Reu9dV^1WD&D`EtB_VTHiHC=Je3+Lk+^bzC4>Cg-g}X*YuwiMdqe!=m zM;(ZWs<L;@9GlOt^>yGrZ^qv?&f=Sd4AkLdU?zU+KN0pfcxG+z%Gcc1w#^%18ffXb zA`Z?s#myX2Cag#&@eX09_BAt@n!mDL-*CZ#92d9lkckj#y*YnrKCdDDQkJmT@MS<X z*)|M2BgfM^_i_*rN%~)-zuCRidu)oO?y0^^!pI^%6<%C>3XOaFm&NDlUYEB$F5?vV z)KL&gTG*0`89pjAe+3@X@u4SfzFt=#^i}*lKZ_czRD6*dJ)aCJN3ewTv|g0w`{(>C zLGT0O7Th==lydwWRB0+P^sm9^qw+dG62#B10C66%JOkJYkC#08@v!co{L|+{aFr$U zv<=uYKx9B32LP2@o5E!6DX{q$@dT=hQUmg`e2^$wl0V>q0AdQr_0bd~g^yGG2zn@a z^}unQ9sffDYGcPAQ!4xo1sI0s>kvj{Pni<FGVVbI7(_@DGK-?4fKY4?AFQ5gSMT7! z@pavWv#ychwra);Sl3pyO|A)}5*_8CC~`nB0$9ezDb0$Z;jMO2IBKLVoiTeY#bBw; z4TMi5dZF==d{F9}i0zC(GtjUYf?_Xwy0bk$heH6hK`JwEbIhr>nn$WT?uL86xxbux zCJfZVP_TEt4<4^ecV@Zu-128t_UsR~bY}_k0n6${IQL>5wboa)s>mUm75gkuL*u_6 zg6JD#X#ih%7u<I^upfrVZHnA9d_kZkgVRQZdW&fgppTc2IDvatXywgeDpmx-z*EVt zhg&U-6joTY5SnA5r1GA!x$|^bN|mZZQeFXoHEb4DOO1^cqAo|I$_X#BC>$%<$-^l5 zKPTFte&U{~Pc|QzQBYWbQ{BT2Q3->Cf*(oc^Emt+9zu^laOwFMp8#YG`jp3AW32hp z-1RZ5yj8JDBA0<iqQ2EvSIx1)`%mN6_&d*MRrJ5q{_z9YQ3ruU+rt8fVH`#ulQ@C= zK7btWA2Ci)Vkucc{JxO&{+Rg%)jpmoHYx5X-+Zw8FW<kO1FXjwEn<P6$S@_6Y?}(U zn22MRqPc~J7AiuuAB_du^daO+O7_~;-A0>LE%%8=JQ`uDnRR<$(zJ>M5?oi97x$yO z<>mdB3k_m9Oxj6KPkLj}DL@OVO>Lb;R5CFJVhY3vm^@URbqlg2r)wN_*b51>rN*Fw zQHMsF(d=0ec@SWzh9m@@=CZVXMMl+>M~|PLyKZ7f<fW+Z+Jo%;X;YSym!DB$&~|bZ z`LJ5X(mg(Y{kvY{$6)7-iFO}OY@WPcC>GL+V(=!fQ&#M-aH4`_O8QX)Su&XPOpeQx zX<H+^*eJx_M=WJLX>+KZL<6EHg<ZkVvy3bjwSwSh8xU2<IAn5sR=PW{!_qPCddKtl zYIhx8%$!OIbFOquV4Qi*T)6yy(G5wa#q_Muk^z>G#db(!06`DU0dP1keii_Bkk`F> zc$*Gn@P+<_2RgcFNPzBPV1O0Z458rCp~AF@@}N{a)kE(Ye7o^`JsJNOk`xm@&qoI5 z#pHWP7lj%wpPl}Vp@oqvfXGm#wiiN61dp@%7+bwUUcaB9Y@}cA^=)D!=>0AIBW3j9 zVy~ysx`z%%SCD_$Ps_u9vcIHT%Tb=4ji&(P+e$~Hx7<E2!Y8xm%=t5Y29!RpYkgc~ z9iMZ}-<0-1`7E{cjXUf9N90-86ds?mdCGe{yHy={L#`f(d3)?BylI^fFldDbf9ud= zIy{j)kyuXu$m8PrGWWo{AoK655EJP@4jbuS1Vd_Ci@-XKM*YfMi611lvq#N8o&SIT zZ;;sscq7aZe|@-U&@}!n{YT=U&Bu>YLd?a3kUd@gY|n%FeVx^M3M!G00qH4U8DT%$ z{R}AU&*amW&q`hSZti_MuV63ze~a`ManKN_hoSPP&w3?231nLWpI-bt1SW%qbo0lP z1|Ac|_FeA%hIij`g)Bc0(M~Eq9X>x}_++rv5)X3*`f{Ji&A_8PgX<x5MP9{0>u!9V z0~KVrVj4-ae*yC=SH86No<6w)-#w?3$8wh{8^?tvI%Xfw+27J(390nM_N>4jB$2xH zvwp>M{D0Pt=O=at>d+3%`48a8;4_p&B$7fp$6qdf=J|Vq`<u4b#=(Z<A(5QYyyqto z(}$*acer`JS?ZK{w@<6ZR`QTdTPgHYM4sT;btHg6<QLoCJAQd{?jlI&s?`($kbYtF zQ@gsKA^KPbW@_M%Z?qOP4u|g?iVj?W8-<i#T7l;ueC;5QPxn7BDctn;1{hyUXx~8D z&ibvne2uZC>+;uLl=1Di8SL7GxIKT7gZA+DdaiBd$3WgCE-~Xgp}>Gu3Y7{}s)3-u zv{Tc?em|$wBs<f|{aT0wG#Y%Y!I0RL<kx>W=D3b65iET$sT5OEq_9%G3!Bdah`BO3 zw${G|FF$2H>4`+$>XrGOl(ho{Ix?W!wo-QN)?@lth+m4D?d8q=P>Kj5NFAlRDxn?* zE5nlO2%cpW@IW~n@|cm3DhZ*Fbg&&pUpJdx^BvWyEQcN}bY(l)COkIU4rqBKU{A_@ zez}fg#hIXZ4^SzB8hjqdw0Sf4`d_3Z-&hNrkR&`6PW<uaJ%3vNW>?t%)BL}e&$r_E zzAo!t3^(>(S_jPPA?Ygyj?A$0@tT-=BDmx2b(VC4u3FGw*DS3mU5|u;>p0D<t#R5I zHz$I6S0Vx1$}iA`5k5z$?^<btzYj_0`>!{u>^ba%!l;Fgi7VVOMI419j3F2r9^WwO z*<X(vHKn`6=JYmQ2WRMg8aiuE?>>9mzvh1*|M#Xp<VvIPza!t8{0PzWLHYj^3@Z<= zf`hUF1myZ#)9HW7#12A%5cEojC)si*`>=?A(6qY)6M_GYm>X&HH4oA+L@tKEFKv`( z{Ai!>bkpsA|1?n8#9YSoQtJE+eh{$KG{Hz}pwNEXi>Z8}9FG`R!2K9s#%BZ^hT-bO zyq=h9z{9cpsNDXUNa5u?ez(*jNGI)p7&R%c%Kg$X%hL$F=kK|`H-tVuZKnd<rD(&X zQGA4iPy+QB{jnl0*bl<~1b-7_!jgbe0nop#M07cD#fb?$z=7}mOhLmiQX>q@7>t7m zh=_=YA_$Ii*dCAb_diBlf{`ft#ehTVoVEcO0(|&%;KRaHH4w0A;R^jP7wBky0S~$2 z{WK7;H2uOEm^_$O|Bb=h;G@+*^zMP-<wWgRA~ZoMgNSoJpjt`LU>`^Dbsq#LD3T-y zO;mgX&?DQCar0pRrDRH<kMSPSZ_?Q(Z*K7YdGd)2?FPwJusBEnu-{~ia7v<Ojah`l zBk2^APP#h6lG5NMS%aZ0NP#Vr)ajy-FAvl)4}>g$eBuFqdP*gxeWiLt)O-!-&Rh<7 zpX*s2Q?pC~zxK_nqKW*!Cx`Lp?MI)ul9G#;SiBr*Zhbh*X!C!~>#Ee-@O}q>NBY(n zPj8I-bi5zsg}>QhilC0d=}+Nx{J-D-M-A!+As?4w%BoXAUqc*bVh1rR7$Kykh{6LH zkTS%K7T@~6*uK+j-(V~deP3hhd}Jh;Lu!9e%u`BVKk_|O^LQWhGxIN%`I}9J$i%Y_ z-D0K|0fZlqj&b<#*ZR9EC^|fHbd3&8Ni%;B#3uLczZ|h+_%S)7@dQ2{!KnUu3ghmh zAP%r-baGS<wY!Y!h*A|$1cqWM#9O>3%X@Vrem?bR*K5awuEjb}3AqVq#ZXZtCl3jQ zP%(iA7X%2dp)miZB5|X{?jIfgKRuIK_Vt9qrD<=&IJGmTb<=Qyl+~eFTA~o292kRI zG)6j5tNsR}mngo5)AM7s$6f>759Szb_fOyRa+l4~OoR3R2lEWWAhx6X^)IZ@j@H}< zcp<RJ-Mx3w)HjVk*|^p#OAA~e)PJ&2h&z3nkja6Rqggc=ha%uihDafX<p9-xwQeS~ z17xVCUWSBFSyMc_tXx_{ry9Wz{#Z~y>C28og5OZ6t5g@^Q9I-_3Jw|pUII88ozr7r zDg!mZsMJ=o)Oq!u|HyyKWr}W9qm?O!M1y&UT{szC9iy?uzmJU?G-)F0$|?@wv-NoC z4pn2?Vxvwb$RK^P<#5{Or5)1tWz)FWaip<W<vbCj6pt~iWWo^cpHFUcJi4+D-i_a{ z;R6AtvJy!oke%Uf3=F`f0f>Jt#N?*dypYJ%k|U$E9-SSJIe(!Jo*6RknqgdyN2_r3 z9@gBrOcma(y<2nF>=~aAH>f6}3ZCfohkU_8522$Kl#K#Ha>7Ts*)&CMEtm<f^}J^e z;|CaVfy5{Rcp=k58Y*^N5`hqQ$*7?bG>#4{o|mvw-qyR^{QJAyCy1FS5EDXB#7K=W zgn<uZPXB)gxy|ndlTpZ_$*}|cE-G!+M)cl4rgHZMz?moz6GBi#C!~ft!3xo#sHjE} zI-sj<vD&F@Pw0cP2V~5V5f42n%~KH(9FQCXq0my4gy6*pWi%9&1|~3A)&S-dVXY-< za>BHZFolAMLKIl6CZ)NIGEiVJ8$For<MyX7A<rDB1Qy?}hoJWP54874h`o#|uN&zT z<OugjP!XUU7bGdPSz(4xh;6rO1~3!~+qD2dt-DZR8B76G!A1$w41^Iv!7>!Bm8xJh z&HNqYD2G6A@bLIKJ|4~ehm%>9HWkAu0!Bta$6nuBqCUD(Bnm`=M1oc%VpEVEos;r} zr-wYm&_M(d5FrSl<cX_k8uD!H#5tf@sQibjxazuojd!rDojro6l*$GHi~{Juo5^%Q z5XbXW!jPQ+j)*;A^!Ia~6H;|7c_iBnW}Vve>d_qt4&;&mhqdzjrOknYkz^U*L^Y6t z@VR@JJKWjic^@<G^zj-@(_`UmYauIHRAn%CxP!1<%wBkrLl1Dbn-7qSj}W5Ow*et5 zjfhkBe8@NOgy+N#QMYnmhu%lsG4ePUigc)~5JKQ|BTBE=M&_`LA~U8<T$DT*^bZ6t z-;cC}L3AJ{D+kSrQ|g^~4_txZV-4j9zzw#cMxq=Y4m{~K7*LR0hxRml3F@bV{t~xC z=mKwd6WI3c(DcNRK<Nn-lI0}^1yHG!&{9xkRZ?OGHf4el4JH+q0!~>#<1{e?&dhhG zO(}DkQ&F@x98Na~a6{hP(Cr(!5fkD~LT}~n-kur&PC&80^%dIcHVx2mqN*yQswo61 zqN=C_C`h1+Qka#B2xGqMpO-uuvGAARlU3uBnN>k_yT^t21h`yg2DWS>H7!)2lu{5% z;n#`5%xH=%JfQ?71&?#vC^e@21mg9)1!E#UmaEO~qraF6o$IAu8@x8>9-Xg2H&1hj zrUtF)v^KH@+mpR>!n60ZH-?}qhn|hFc4#nR2PzaIxez5%graRpiluA_rK6242lCU2 z<f2fq#Z_XpYnP4dA!TU6Q=B`!?f((sPE$bjoVK1ERPoCm@3&spx4XbT#{jDw<={q? z=u?3P>QIk($w;O<czJ$5R`b7A%38i}Uz1i)>hzUe$DK$ogzX2=07*bnCM=|p1dIfr zpMCZ{-Wv4DRMs9ZU)A}QR`Hgr6<z1B<R0Ya-F^On=B~ao%}=T8eGV`_5<!gEf#UAz z6gi>=$cf&9K0!<g-yD;!&$6DY=rS%9MSmdi$F`@0v){gQ7{E*W!k)kw^!iygPKh$S zl+(<%2T{rLU>#4IVlXCRm@siK3k`mVJt5LUKCoy&g_gNtq2f6aRXm*9&urE@wVX1{ z_OD>ryoVfp8;(%xVDZ@jG3k^PL_$%NswhnG<|+9a9eV)n6+vbT)EPsb8~zVaKuivM z<;a1k#cheia1PPNXkurbn%SUWr=A_V4V+#R-3=7h0jqJgijsO*4j{>(<qJ09yGZ+t zEoKKNXdw0>66rJ*o~;P%4TK081ympq94W#CZFb0WdObtS$Hlb+wG~q{BbY5UhTbk+ zMzb@Z)b8{9S&urKT~b&%*5TZE#WkK0>pOk@vsfo*ufNc9lcu;_nH%tI`@=S&k~e^T zNUAN3oPAyX28F)E_(cXl<r-n|eF!STa}rf-cB)2fg(>gWEGkEyN?NQ%8oIKuS>`x; zybk@84ddEZGQ%D7o*oHyjzEqiPWVni!H{EB5s*aIp5nqiu1^I>QK%6$Sw6r^2Z-*+ z^pN^Zhe6yp2qhVTt5u)SR|4$~057PK$o%RuQu>I=%9?G+(D;o6^N4U$D5L{FA%#xx zr#r7knGI&U<c=K(<Qz+$A5&ROxW@c7Y{}@H2>K0XNSy`5-W!8xQOe4D<h7>@TFi}P zSU6==i5=&tRR23$6AE|ZpuwJrA|k3xVGlT^zz<Buz9^f=3I)O(RSyZ{e8TpNC!hfb zQK1p$4*2fcaskoi@0bfzB8C!RRy3UwdrND1mXt6N=gOsxDvu#Tw4kU=MPnEZ@b#78 zF5@b!86_8zNg}Oy<R)HvZFjSDks(X3qN-Lhl5w(EVx1<XI=IhZ@0^Br45*?2aJQ<h zq$=&B6*3T&JyB&15;0a`khUe05Lgs2$s#f~xe|aP7G)PBiZrCFr;1z-3?b7?DX0Kb z(PX75@$g;fPd`vP&BzC<&AZ3mQ@p0KDUU3C8m><ow;&Z0*DBKB5GQc77l(0;zc1?i z{_JrarrQO^6J;S$Ayh8IX}NfdmOZ1Np!XNNc6WM`h=ejCtvabP;Rse}Oc^-4u?k!8 zQjdV*R}E27LQgS<5JV9H5J?3k0YTN_o(NrBp5Ej;!L5Pp(q`nQEYYpej8f`Z4TKC0 z%~3K41G0|{LO0aoQkjOv9(6Sob-}=EBMdbQS<dOmQ?x9(DKG)lA9|61{CMuN8BAN4 za|lrpAt3Oyaj6Bs%XoCmC4Ra%buJt$Ob!SW#vy!<<*Tbud}r_|CD#LrrOgS(8r3eb zr4rSwOVvbz^90(9W+U*~eq0E#lKl1g$jy1j7^(V4<-2m|5joMou%iBcU;*~M<y~Lq zekQi+G0Zh!T7d%D4f=BSww;v}v4e&fsc|MS_u8YvRVlbDsI9>|$KWv$Er!Xun?SFi z?#{+MsI?Jk9NJV*Zn;>oUx!;&Qv3JIR6w?WCP+gj2=*)%_AY1j!n?P$=d+W3>i)U5 zeyRsP;Q?qz)_8J`V|U^CzRY<1ci&KU)N?eC(%-+Q&Bu%!6{t`@aSA+uRCv>pjt|ek zuU1h}el=OsjV%Yg*fW*$YEZ>`T3n!Nj;-eJ4m|bDlp**(o}dQ<flr^<*mNJ;Apqsg z_D+1^{xHCTG6sRcM)EztFm64_B6(5Wc!pLv0LF>SakTh0XWq(0tNPXXfV%z~sy1`d zsL9|nB2qTu{9aqz`(!}+)ap6Y=A9`q*Ivqf<Zanzur_959g3@x<QD_93rqSUc)CjQ ze^_x0W~ZQTh-YEw_PF}Odhu*#bs_?g%bw07)`Gj)H#i2Emm{(R7sLgvSz6?Sn(z`H zEJZ72V^~ztWuhGyBKDASMjC%AfGUYWue1dpSOZ|hn~oj4EyF~nxIWqEIE;%XJ=^lF z2Aul4)kJ+6Xf~I?t6Gyu6b$1!uf<4}+u_QX0)1UZ0;2dH{!^}#bc+k>QN>4ry|@BC zuGr2b<<xVofzVDsT#|(hQ?zPu7v1hs2Y~t5V;$J^jL94yKxqF@N0G<7Bb{lE+~okg zg*f=Kp~oD^>gl69(LrlGxBI1O`xrn6^eXAWxB2`v*1oCHIljDc@A6ps47M`<IUZJa zTKu+4H5#8%>tqwl<BAB)=ppm;_lsMIOAtZ=oQ1dzbognfT`}izwER5%Vg}gTf1)_k zk2f9=ygQoWK;!)M=v!@OplrWb3>)XH>9pLzzZmbV3GUHYR4oHPlZFISfJlABX4H<i z%{+`EN~I4x{-%5xY6txJc6sD|k-x%qPa02G75SG_CboqRMM`N+E@DsdEev0~SkXeo zRR}+b#kp3QBI{eay?ZMV<c>LKs@Uj`u1@9Ju(~6fd~*~lXq*0_`iB8ME$(ZzkEzpa z&*hdn#bj}>HsS|1Yup)c8#_Yw^josq8dr1WoW$**I>p_Mqw4yfNfO=4-mKnlrK?v; zEBxAPYKfTaw;?gvq9fVu#I@Vtkq|#(jlO{ZWCFv8A26uk2;6=WE<hqR5&_-Y60Q%~ z#{KV5O5euAln<*3s3Y^ZoAGR`FCGn~<-Con+w?1nby;hY-YcaYbJmx%gGZy`{yO`- z-fP)rp%jml79X`&@~t;bSd^;B)#sl^pH8#dw#6WIt{!)=;_Xr6E-%(ydn5Xdd}_ps z0oi3_&bS_?Pz4@lx0iS*^1e{Car_r;&t<#qq|E89*0_6$A>RY9=W++nfxI?x^SFEJ zzLDwDFSr_DfZ6W~Hqk<5w89LL_&&d<`5*!I*XjMw)}}Rv7*iTgGcdq^#2Kw>g|}Oz zkbky?Io27`{XjoJd%rh58YbzP4x@-~k9XVIwKfsRMG!?FXJ@n+q0OqW`;?!@hqts0 zTaHM{hg!h4$ti8@XxrI9NAFM(zF}3U{Jfc|U1F2#85Q>y_@@(1o|sUMRG=V|Mxa+8 zp@DD?`j(}V!dS3!NfZG_ejF<SLuSIHUh8m~TmR4O5h_U|AY?`W$VV5EA@LF{cU7?# z8;uq!k3j0n9#_vjVCCQ;LcgTDFX|Fu@;C{{#Vjx2(sC_3f{Rm+cMV{LBzt(+5h#<& z7gJ9wfxy?tzl0(bTSl?+!j_kdypc^s2t%+C$;ph9Y?zz$bSS$zJVqmmgcta3h!tf5 z5ln&vI)_mSIm>W@Le~;V;eYz<@F4{*7@0H#mZU-V#!Vzu&T(8QV_XQiI<_+}4m=_G zMR^Kp@|hVO_Cirt7I{`4Y~MBP=MQU;<-fev)zyA^ruSHB*9M9pndLw(ceWx9one?! zLG|PW!l3@;%ks49B46f`e=5*WOh#Z}4FNE`5-0E+mU9l+h#$`R|42;$Y$zcJi}>6% zpIFKbX!H`u;FkX!!8FunN`(_OT+~c}h>ZN_C?5qvi6PMO<!}brd66SC6-j5F_qSW# zwi0ozX(CEklBfbneAoJA8b6#kA2Gumzt+H6{L*y)lYj56?^%CL$lzF1qr3FO^wEP; ziGdIyfhhzZ-VwDCB1u2Dgo%<7AOqzlXaw7zIuNj-1Et?X$yFg@^nWP12qxq|LHN-R z(=tdykcVL#5coYNWxH905U2_iiBP?*Dg}e`urK6_kJ|a?m;>air|<a#*CS_kavMhJ z<{*hR5-7x?5mEt51g^2bJFj>$4{D6t+DJ^@jQW=id^fa0zJOD$^TI%oo|(=*H9qp; zrxyL+w0(=^^{u3_0_8F=zD7-}$)ncQ)@pS|)*G*<oCjvpj2B1;*vkFSs6Q{X`%sZh zBrt;_rbq4|cfVa;fCCGYNmMW=)H%OE{jef12n1Lmhru(4>sx-`*}=yRq3aY1s;R&9 zeQ92axRsS<JVjczBP=VRy0gHdT7&iqX(PldP(%{kjy#osT?@Jj8Yo5%vj7ji5hVqN zUW%_PFp5OfBtqy!N_ltGP<?|HYGcVrg(gzY6s){meWU~-#YKuW_SY=hmFB5dnH|=6 z3BA?hvMBhNVoX5j)ZcoZO>aI$9_O{ZGuC#MU3@)2*jo45n_b$FbsRL&xCIEJ-~xpU z0<Ig85RfP<!<wQfU-l8o4ZDa^;i_XH4b~C+W*(6nd3q|Ls;Mffd;TONe*X!Eyf*`_ zK|EU&>Ok)52Ot}JapH<SzIqJ*#6}1saTBK@e7Mf+|A_Z#tbRY2Pfj`XF3|^h2uMZ{ zk`X{bHx4c7{1LSs+7h%u^^5a<-t8!v2bcMAp8MPm@K8}C3`JD|RRZxUTH79m#iNo@ zY35e8onzVE-Mr}@RZ5N(lc^E)6~+KXS8E-P3Gh@OgNG@68%FRNk9J4%)%~(@rHv&~ zI@-?tSz@%%jS9_#%nd_Ic1BAJo2ZbMBHc1XNLF&~p~k`Ipp6MZlHoa&O=FRvu@r27 zJhUY^e<ugPy7fJUzq_KgN&j8)F!~~Prv-B?Umdgccyp`MxBAU<gCpPA{j%rOAECqg zt9!>E3ROSVGR}<^*=+I_lMLj7kMEh3Cj?Q-nLZ3TC>ChbwTmOvhh-{NK?46$_M8ap z^ea*^ZW9uryH~HLpBwh`ryS*^xz$RC)xA<b*j2h)zVUUhKW~=0^!=B!Zo`iKJfEE_ zH?r}L0;l<D#jEceT9_*|ce}p`XzmnCkkOTQtbX0(%uST;PPVT8RkPTGJ9Jm7`Y7b* zxo>Xa<7kdb)A$jmw=wuFtp2O;@p0o(p8MB~3M0XH8lO#H{fCcSJ}(-_<HNW0J$_E` zqAt7LRk{3+Lh@$Lq1R_^wZA%8QTBWP#J^+8h;ItCRyrRy*zD>3j`l|Z&Bklv+;zW` zxgN>u{`BY4p!@2TJ^F+LaDr2sSfl{Vik9pxfaEce6EYO#xjRk%r+=LLphJ*|AT)O; ziX!9~KgQrj9IP-3Q5XV<P%4EXHV-&k?f!d*)a|B?-h4vq4^vpxWya`Ro^iEO;0Vw$ z84Q?7Ym^*gr8>A(&6MF4tO%B629D_^N)iSS9{-d3d(d0ws#^at@AFiBeLW3}&i($6 z^dsFt{<(k}qG}h91WeLhM!!0T`zL>0;37|-`Lf*f{LfKi?T@R~>!K&yPqmk&Mc6Ac zzU&9XQBJeyEmO^5rB<jH(PT^VbA0WKN5@Qd-VL4<c(dueia#aKNT}^_2l@3Q3%0`; zT$4>1SXS3riZHY-^XmXiDjXWbLSY)rm@o&JkB2~ekwEgK_DA9-DL}GC3W`cMwIl@) z2#^#7l9ZZJBt?j-GAOZh@|KyFpGlzbM<p2N3M3&3!+CXEPvIYXv##HxlRigZuky`! zwX!XiR>-#LDC6gz+0HMZqftWSE`stLhq|uOdWjs@sPkWM3Q>s!9kgvRIiUW~Ap%># z`#$Wjz&?~j`!T=GGB7aShojwJS&8^d`jz7mO~xU{4M^$!w)ba7rmMEr6D2vW+iTWz zl?%?*zc}RLoK;2u2u0Y1oTdN74ULs+dT(H-=_sK6nX95%uj4^s3r&i%@}le`UXDm- zr$y2!$NOzzVVb+leLtDghdW!)08filf<LJZf5!vJ05pA|j5}biVcPB=_mKUT=*s-j zJt&xt+%Jc2+T<8-zH|WvZZlKouK?d>Ub<_iBuq}!``K+n8m_?rH6*AB>sNn@oVb0N zroyV*>X@s`FYQ&BU7z&2i|&X33cTs)?d|pNrMEP3R@PTcccXg9u8U!1lU{^SHVR>s zTQi<R!gR5{G_=Keel8d|Z6IcmH2Aa-J=3Y7(?er=_kaaOC`||FO>BPhlGrjdw^*1I zyCrl}A>~a%ui)LU*7v(Q;ntR8cP6E`2D0)S{ymkIYS7aPN9gbHm)@4LxnFYnHFk-l za#z|Rr_BNdQ^1YodjvTZ^{8m(Ll1B7ht%B9BmDq=ZT|84($=>S5eH{B9C+w@evYd6 z;<xvkvE@$;zpYo3_f9v9;B(~ndWU>c!UE7JS)!MqB9S`y#L%H%9*BT1<aAGyK})zV z*-x?c_+$hLzil-E0yoLp{Ga1(tG5c*fz`$uEauK}LVL?VwHE!|_`D?%R)F*QF>HP& zTDqTG?VaO7+<;$WP%yUYnezAWt|y(}_V?p7jL<6&E{%xIMe22}1MGf!yAxo0uC>!T z)759zu#V(u)6*UY;hJ^Q_!Qe0h>xxv%_Gg~!jr4;%^}4%FCte)YtF1~?OW?x;po1m zSzp>`?N$5pZ&&2;#`d!fl<juw)<4OOCF;Btz@v#C-!*B|?P_YXYG8`HL-#v>DOitV zEAVKlxQlgXb@O47@m@P|wjZvUQ{xGd>uxRa#J3d!`5;quXK#&0pO%^Odk@Td*?+)q zk7r}LAozPir)g;T@B)tE5CJMek1xssaS_&nLjp|{6$*uEJ$TH91bs-|-g7CH>5vaK z)Wj+{k0Z{^az2^DG68?xxm`8?bJK5n?CUiz>%ZjKP-J=NvMCjDCU8VRXpU~PlAKVa zu~1N4LkrP@i*Dh$nz<&8%Mrlcpxu#-hQ{LwJN2xK7!ZW0I7(cYF^KZ9T{EE`p%q|0 zEEv17NB2ko5WPg#dMOd}aEGl1h+I{$XsDv1CBnMw4ZM3}Y*}~l74oh$ps@NO_UBpD zbNyh8aD<ZoBsspP;PBmk=z0rhbLlW>i^oQ`b=KcgGbivfkOuRHL>zDs1`sq%09psD zu-HYg2G7JD8k9q9QPugh1qe+_B0We@bca|lj%3LMrm<6ZU{FA$U?~MGPy~gjGkZF2 z@jP50JHU$Ftmf@?Tfk8OM1^vZXfTKoCkDdc23l6sCEl04>aSWoC<v{HU(kvDiaF3o zwS-(V3&wFfT}qL=#-7FQJZ*2425+dk%(^t`&Ih{oFf!MdMl4%zgN2~VdR%^u9NsLm zxyH-iuiCSgOz(>u>OCg-g&VPFG@<SoMitF90WBl8Q!ka?mh0_<pcybBoi2MtCFYU@ zFd&kzF%E57EYN1uZ~ix_tz{C7_cst)(pn<7f*F-UHArTGN=u0lMQEZyt|>ws&WtID z0$gkkWl{(EzXa&=U{L#0`Two&AIyKJ*Ze%*Fmyo_&6$%pUN{wKgC<y*LE-VB@Q@IY zD~NYsn)(Z=)&1=JRM=>HhKZB-h{R`%xHvYL1M!)DK+ICmL$8XFPDmQqaTT)2YYTA? zoJW9I{ARa#>pwi^c;a)zAEa<FYT>eo$wY#iJ~Vn9d}0rb#EOw>8?1lvXsds<+KD$C zV;FvvN~+{~X2YC0xwt&04QAd>Qi#z-4QQqf>GrvU#92y^xI!BTsNyItJj6DYN{3gV zgjkFe+utL)dK-A+`oKn`sX2lUqskwnz{rPjtSNwZfIq#W1`G$;*C#_1;Ep2<bwLn% z3cvE<{<McC#MB3*_&^GVG)#_OyFvhHP`jtUY3h)TDI(k(fN2L5eYYN>0V6A~e_z(& zl_il=`Pqnr_j;5u<^E14kd^{>ey2^j6FnA;CHS7V^jdagX^o7M7Ouwg2m@atFY#s` zFQuaFH*Yn2oLTF1wK%G&QstV~F@mbX)2hZV_y-s`_Odu+o++s>_=yzyik;QlNL!{W z4+RQ}isn=@?-N_BRlTcvbm<c)tFe`q7<yK=B{uR@1xu(|(2FHTwy_&wVTMHaj-CdC zw2y!uIm$bM142PIUSLWC!6R=Z9Rs-l0qg*L0)e2@e(hVD>o-LJG!w7##&KH(58w}^ zF!nOvU4NVTBAWO5d^lsWz1@qgTZTMFJL|;T-C@;Pfnh;GlrG=J#F)TrK^&0MXaP-M zf?-07@IsvH)DaL_9-v+g8+#&{vNFl_BAr~PFGn|%uUzTdc~1fO+CphkNKQ-JAP&16 zkaCBT95@Pa;h{9so_c7L*9v_2G7>|MZQ@<dj6B#}hBBm&T<+jCV5fcpE@d)kAmw~J zrGAiFbtl6b=E9Pk2O+4+Mofy7Xf_A2gJO@uY$|8lStS$_-T|lyEi^h(6*x|)L@3xc zR5xQN9YOBD%UmQ(%#yF?esk%bb_Y>($nngYT6s__Vm9HxE_=tPJRH(inVTc$lRfm{ zEM<i2m7}gN7E?vjZ|L^)`#c@I`-C(O>GjY>$nLW#N@B%}7AcvTE@o3O!wkbSGcz+1 zUYAGDZ0+lQ+!n5bP3|ntz)D(qNOFg*s4fP3@`3<AY-#YQ=Jp#o?g+x%mI(7CPZSC& zctQs5JVhH(J*&s$1Yh{Sh!hvkz>jHL=m{g+kjZtx$tYMKA+m7@_!N}m?BdK%ztAEl zd_aK!I`C+CPOZIL&FD)Kc=`tl*8OThHBt`s4TD}S>24o4!>^!i=$*=XtOuuq)#}js z0zY1Lv#*~rSh3n#(Bgw$9-YS<rgNXJdFxK#3)9&H7J2jP4AHaGzPwb?l*O~zY_TxW z#CZGl_Bl7qeO7_mwXd9U_GOosKdJiqw{NI$1SXsB*hdBJ-07)>ut?KkQr6*F5HeKr z0Y?R49tJ$hD$<J?BBhl>inV+@N@$Y6OT<%mlC}5cC_+LjCB&fVOvW))=d4w1U~x-F z`TNy-R=5+@&%;&KD}8J7A?fSbn3o8inr3mx!{v1NynX*;hb?yw%sQ<{zwd@6OnLV` zX1&b^Ty(}5AxeP@U|i?bufN0cR>e3Kx1<jK)j^$e@yB4s5iJ&^WdQ-z(s#P9Zzf(c zRk*6AcREPf<zd=F3+=wW&_4vO1@zHXQInT2IsOGX;1VlA>Or@Npb_fIab;yH6saWh z=sRF#1C$%HSO%<hcUS4w8)XR()WFf#3W3I);8!;^NzJSb$!T|u@r{Z_?Z}U-<bX3Y z19~WUBESyqkS3giIoX!$*k>q7B`MT;D3>0t@8O_LELMx12+YE0jDfToXf)CHVm}e_ z!Quzf5~@C|Vn(^A?&|uj$A0{9$QkaQlt!uuxHbwNj=xa-gjHKM{_l6g2VjYUx2GU} zU!(o)aVL<-@F5nIXi)e_L5#o@plXE(j~EjP3PO~nGF(;=iAoApA`$z)KSzS`o~U|W z5Hz0Qhp!P3Gh*Qsj4Dq+6C`B}sHB8qDUBR9Qe~9%lj)|rx$=HWIN?hHU)g{UARkYe zJ<tvP@BH^eU+^nXsSt63qAH4lm#p0z%=X94Ce_q^tX5oluP*U9=f}V?aRVS^Ku`Qp zUATW{A_x1Gvne(IMWXIO<;sIvD886gXB7WKLH>5!v|b<ZKk9$h#~lXyX1g}Rlt*wz zA<+|kt`vpHr%JARt&cp%PBO;1sA7~*fOaAwMj^|E<)wLApvL2?)Vqbf`d7Dgm(vBe zT3AxLW4SEEWQ%QJ!x@n!Iw2#LYvk2OmZ9<I6N`-3x1SyT@=uqIYJ$_)ppne-g%JU7 zyRt16CR8rFB}2yxJuq#^Ent7ws4AIsa>sT&a3dukq9Gmq!0`{HCD_M#4QbW|k@<oF z!T@x?xj%4w!0ChVKJraUqfthxHCkIV17B=7kXf4>Lf<Q=|7RhX6B39DfwjWR2^gFa zil!W&zlc4GmNmLG;a^0Xj$^Q2)Z8Kikro?Rh%gP^m#c;zb3-=w{T%p!Onr>Z;oc>f zm%rh9Ga@Fn2aAL*c9JvH?J49xUx7LT|4Ve}ZVdpIfHZW92=R@AD^Pb4q|na*(UQlc zqG;IN`B9Nd#%uveOH{(uLP$gy>QzIU1FtPD0H7P7I+5QJjbs8kSVQJQ+hQ9dWO3Y3 zogZHM-`e`#P0OqDAH>+AKX~~kLH6XF+ukw<9fZ&mX_v5WIOH{u$hq3ZFbF91bphz| zQvU(~Jq^iKGGH|z1Ul842Y7k$h@HnnpG|c32GZpkKqUL+MI}`wc6VQB+y`klfzP(= z<=eojDB~H+z;z;=Th82;yT;1i&P{>ooDH1Bfz`)FoQ?Q2C1pnA0~i)LKg8n$zL}aC zn>czk-5k0~PL2Uu(~-sV{WfjQF7{`<+GBR(VPSj1d!+~T$kBRmQ9;GLH=E2R<`CyD zod-aVW_kYuhO?^rg3y2?Iu!7TcF}L4#E4QN2^ky&aU@PG%3vu`%9+z)MI4&}J-^%6 zg|dOWZ*Z5>x!>A>g*07p{!0JDd$WYb!@Od-*jodD;5uULHRhSlUJiWPjEEpVx2v{T z08!;L?mGSsFv$T-z;mQk4uT>wOrUqr<lovIu!M^lmgMd{op9c`Hf}&WzDG$4WD+=# z#6lB7n_()G0q*Zu*_OZOZ40&C_8Q+i<)!g8no7hG1i<B&<@>MlK3%a*tHoJmd}7w` zT@in?0R#`ptuH0M<(b%%0UdW3)IUUeLd;fEw)E;|ulB3LTL`0;rjVg@gv0=$a4yV4 zl>}Tdi4GWA?nw>tnbeu7ciI)V#GS?lxa@t=itx_uOJfG`<l6MJoKT@dbCFda@4x#0 zwf*n<-|y+R0_TAW4p0=zD2WQ%fv}+9EI13^*B4t^z_75jT7rN&3nhcdW;U!sq@)Rf zXrwhFwzZU57*)f-psC3&anTo7ty!va-zP1RygB9^((zfF-vgO2mggGW_DA{e!((Zr ze<bhZL5!$tp{odtM|A*PD^^r$tpv2ue<3E@YXHbtXYTvXpbAqpuEF;hEEsGY(Q;(T zcdR^6R*$V}@Le@^tzlh!*}}yQ;S0BxLyu0J=baax1<NtTr&FU*j4tpgm!3A{&M<vv zJxn#OFIpQ!d>5ErET*`e8s5VRtvS={B4;S;71=txvz*k)tz^*_ms1K#_#U+Yyeh4z zY%LX0X|-!wJd05!;-VVLlvNcH31;|nsBc`s$Hs3hvU(|tvD*OSR;3*7=WX`ieeP!= znZe8*A3MQTe)m($1N9l%mZBvd0s}ToyQB?OKa4Zp$`gnBz9EnZtkJ-7+ix=r0PP=K zIBnq0+w!}bZ-63QiK8B)Db83<{#>8q&6>@UhiicYqut~`e7?*U`uK_p7BmW}f6=8V zh^d4F8!VUDRC#o+KIcu%6Vp`m#nW)kBBuj^z~FE=91Y5<@DJZp2noPFK5DRX1+Tka zF<dM(a&ky8j2h4*{R&po|0?l$)h*Srqxpx+`F6PkztkWH*y%Q=%bSh&0N`B43`lWD zE#Ma7F2WQgKXeiTf&#Fd|I1IAtj7>Q<fTJr$j$rs{;_f%cXhgms))0_EIf|BU$?M2 zRL74;aN>*{-z72PTn4WL><j5W$e;%kr4(v9dNBnA-XV#t8g(=n9RU8Tj2l91(=nHD zd{d;eouXoHL)DuGfCwPOL~F0U`f@dn@^N9kGAm5fXKP&Manw0YRBB03*%6xIS)2K7 zi)%D<ZQnx=3w7rI?=cv%_nGf*;W5WLHu%ur4qigspS`n#jlETUTYCBVvNnh9s)ON0 z7y^&VvN0p_Ae-r2=0V$R6*C(5VaCiCjB|fk6myN4ROFabFMeTKY?9p+wXYoMB}UB+ z!2~s6<ULgSM@GTEiM}TV`OSy+iV@@^jNjP92jf|<8c0WeAPT+r-4JQ!`{ievnif*M zwHgyJf)UO0>zdu)ZD;nscg*8G3U^59hb?KpClzWlyCd>-wyTl~G7YG8ClG^vPC805 ztSb`LRzs{>YpJD{ADGZ`IjRIel_qM$pnII$(j=+`K%5!FlJ8igSX#MJc8k%=SR0U+ zAT23s3R1j9D>xR`vkzu$CJ10bY{+mQEba@tF^K${<D(}l!N#*I4x8<)!#S4ns}Am! zbl-OizAWpptl{q=w)|Om)Zk#bXkaLVa!snDgqhK;dSFoyV4@pQl-8>CQGPJDW18ot z+i~re>E0)dlp)>fa;6hxH_-ocQYwGw|3m(+I3F!EJ${*62XW=N93r-uA_AfyKu>Wa z!0(o**>n&cLOM9=ii<Mepu_bY@2BK@JOwrv`S(1%pF7>R<(oLMWtF8HN1S6^Rdv^z z<BvM?Tzk>YQ38(cKaFt=nm~bw8`Cht`)p4^Dw=(r`I<-b#Sk)fG9HHNYS(y9Ck^9D z*MFGt0vZ&%;SW(1!wM1PAWm<~?_1pWj?Wd#ZzyyS1hiT)NScU35h4XZR={@st{gvs z56EF8{mJ}`-b+e926)z=%z*39Ig|+-_^*5Q75racGTBOVgT)V?H+6poj}Kor)$KUu zkop{!3wQ+J(!#bcc<k!hcKu#e!#bhQHy77Ko1_0G+z72Hs)_$c{k_outzE9n%|$^5 zl@UZA=N12pnCLifN{GU-?97tKXQx%1J$Qm9)D$L0vYOfow2Y87$W_vx8$y|a&5$`- z>=ayXm6_LJh=XD4ZXJplrd+~yNIft=Fj2sVBmxyBEQH_?<-gj-4Iw!IH5A~vSZ7d* zp3v$k*%haq=|E3s`rnBBmvX~ev9AHC$L+w$_`k7MjM9ME9zJhU|HU%|%u&}@4eDB{ zQIQC)y3c2x!$_VG_rRS3B^HuZ6!nw59@do-gWy1@e=6h{0q@8ml6})N%V*E+52AK) zuLD~6o~%Vd3=ss_+V?wTx7{N{Ovu_G+4Mm78#hDum=F5(Yk;X=c6u*uz^qGp0e%O8 z3CL%;sYLn61CkTj`+DJ=Psb=1@U%ZN3}{@8XQ{*wj5n{rxcd_udO8XFZ|!J}zqts0 z+=mPHX$wCbob%;yzTR?o9GINocwdNkUxleM0_<HH(L_*Y1~p-y2KBAOMHN(kEQB|| zWrny#(IRz@A8nLl1>u`e4Redz17@&hS;>Eq7MC4{@-WR+1z$;jyVgk)dA+^Zb;vsL zDbu9NHJK1dePEIGl7#ijXoO(IqazbzNscmE4USu1=SQEK;SNn@og>_Q;(;yS%E@Y_ zNBj?=MxsyA0{?>Q1EgI5^8&!s564r$T12*-RF*5^;k|2L`08htHNvEI@A7lLcgCn= zH`wNSe7m;s{H;j7yX<9eNC<{7;4_6@?@YT^+qC)}*MpUMu~70us%<(vovbA}apXF8 zs`a*JNM-TB{AT$T8;-;hdl9?Bfc-`^c#c&H6RdcwzV{z`*#Hx#{Ij^_x(U;_n@)mS zzF!xIw=DAXjcGn)XkT_c+^2%u`(1te9eLJ3?hX`<2uMzA(1GZcbB?*@&pIgf_qgwu zKSrzTu0u`xc+gNDDFiS;H}sLynt&5X*2D8EjFo-abWvV3=TubVU42}JAF(-Sk_6G2 zcK>t-Q0M}1v?;M|$l=M3y(wCeC&rROB0{tQ0!Toh1g+eN>Y*ho0~(_f`kx|?sC0K0 zK(rp6T=GsXo-1nML(2mbOIqExr!od?yzaRjooG8W|9>|=BzwT1xMUt=0H6*<6C`hq zi6CA*uqro=xe5*0R?BzwZVh{2k3kCZ;IfC29zxhN{*5;68f5}kc~W>SF`QHjq9SF+ zud@pXh(L%?uaGoJfD}Nmf!Ob09WSs!c<4ETQtT*0OQ>L~p<CGMd^jNG(R{~mXz%V4 z%Dxo_l<@Aq=;iH)g{7iL)eH8m`1(DFKl83@Zh!6gZUf=!Mvn)K@sY64r^QRh41I}C z?C7E{;G?b+z7K@vvGS@aDayE1SU&YJ9Tj>@2#Ap!Bq%P}C?HCX;xRy+jl&<udARR9 z|55G#em;Z3i8A7$jHhKhrz#7UkG!rcRn|E3JEh4E6zCcWf*5F!jQhc)4eROt6Og|* zf8{#<|K0h__j&exFCaw{IgkXg9P7hEl93|5CXVV!mJ~4Xh{8JhGP%2Zaf7o^3GPDg z%^$#h)Xc%KVmbklk=uH45`4j~QHcm#ybq(ni5l`D1yYTrFt%#oR;mVZXotLbK9*fv zoIV}<V0}JTzd~z_l4kR3IFUB%onUux$CIy6$m!f1HgJNCe^%Q(fIo?3q4K){=j^~2 z&Lj(A8F%)SHho0kHzwTgze;2J`+uk0i1`>cf_r_NeV@3Ddj=$i%bO7BLJ9eyM+Cvc zn?1fGE^V7Wxi|&f^>E@JJrVOCC94zr`Af&k{pL@o@8m$?w!UmH^;l0x)o(TONpg-@ zQM!I+U8wV9ePdR7U&kGSQ-6zA>GG&nkUqdg`FfZ^5fARw5tHdlgxnGX_&=>&+3c~D z(yK!XdiwJVecXV;fxeYT%0c?@Jke0`uC|pOVbiF&&R`4q&ko1sP1{cN-ME_hN0fuY zkf_2%{P};Gz&xIR&gwY;3>mK_aeAD`HeGXs@Wf4K@Cpn<9<NQl53_>BNesx9B^9PC zesuL7PH0pa$5lBX)TmZ;d2>65d-#3FkDii8lA4$)Vk{)bFvVz!YKWsFFnf+@(bHm_ zolJZ&db*D9BH4&Mz;y1zi-JWcI1r4%3o$G6H&uQbPDD}Srtq(xQSJOSuTkRv6}ipB zO*=m?Smx{a)D2C@O&1Pb0@=TFps7p^#b!SrqeKFS(x5GQ?6}Vb7(1G3x|%=Y!SJHB z>83~4A54k?ZX_Zpy|c;L`}JDUY^)2H78qBqw+L_|)uvq)jlTD87U2FBUN&KRhI+<= z<ttjg+F1f1OPHrCBI%V(XLoHGcz?B{Q_;58jW|-fLg#fnp@$I#6^!h==SZe61#JP; zN{JM_0VM(rjn30tyjrlvlPp}3f;1AfrJ7ww8o56(&^Q4<A8;Pixc4XIYq?#39|4sK zheB*nCr6t)WY-$5KH)TDuChJcJ4DYi$Q%)yf(uxwD)g^4Ct2}J54-IGx(Dz-H@d;{ zUuSIm1PTfAVw~}bG;|TUL+`{qvc8swwvyreh4p=43U(Jeyj}kWdDICiEZy`DSXu8L zd_BY<e%|1HAB2d(7!9>x^OZ_FvG8{E-scC6xVVK+cGj)=N-s6qc0R7W;PW5nTjw-$ z{nzr-?0j5RRaI3~AVit`_j)FzTDXoDpYNX#F@c&M6jADk?mfC$M42*txye0WmYFdk zA{-J)7STo{elI!j*Cf*6R)HCtvyr6r^TPefn8)A9Q!{Yx4bW&C?8MV&+rB$JDjRVV zd}vK|Wjy`rI}~xpn$|w)`)x7<>yVz&m<1Lg5)fjtp@4$ybW%vB=H^-KaepAmHL6~@ zO%apH5Sl=aDlw4}29!8xbL%hsi|%lUf}^gxB>Io)A&C_2Zox}2<g7y-5bhfXm?;fp zj3EQ+Y^KpJWNskos@3gnHe_Szm+yT<q5EUTNAG`wyginp4=HNv?#w=hL{!x@p61>i zrv#jbqIpZu7w^AL{;#dZ2JzlXs!AsYl<#XpPOQKT2$-hnEIWN-p%>}?luxVq{vDJq zzg!mj^lvU1v`(yblVrT+x$llNZF5UO5;P5s4Uy>%ivUm(dJ;@<NK!HhokErp)Mgn7 zG0OEzSVGXtQZJ?b9frX3p67peawzrn_s+`gyhR?~j{j3r$Nk5b$Bj4uo<X$q<+S5p zOQ1vvFw;m~)NYkC0)Mb*q6EAP-DzXX6#HpvI^L>c$C`7Qj@t3pewSQnrrJQ47+~7H zPNV0`S6i_XETItsX8SAaLwKc1+K;Jv+*Y`i(fDC>vs&~D(OOYV={gKr<ZbY``NI!t znzWp|iI~`a01yE0LC(M2)9d$y^?M)mIstR^juEUNQcjmWN)(GaTdivg!W5xcj7h;Q zz*{v$=UDfG_679_f$FLDLtvyJ5<UNgb#>(Y<WalaE?ka^JRI*ox0bE5Z)s{vdFTp+ z<f8E;ArSP;!At0w+l&h+<oD>KtRPtjkJ|l@TlqZv$5$OaT+vdNIKLa)&Q@n|S&IF& zj{WC!o}W``Y+6-awTd;ystAHwt*fJrylekGZAu`8v(LSp!d_MLoV+x7R`ucpM+?D1 zLPtrG9*-;D_nkt;4`V-(KF7D0xv-_-#OvGnR$k1>gx>&{4L4Hiv(?RuY7n_YuB-`r znae}v%0cG*u|vpe4?1Q+pu|!ru$n7NN%<^<cOQZ?8$N*J70^q&M{x(;b#T|^^J}xV zdHmwr{&t6wUQmIBzZx%;{m$Y7R^d~#zQX?p=0D3s2%c3M4(V&3Tm^UT0jWUkEmaBQ ztznid98vF_VfkGf_#TZ08dDZTB@&4U%9Q{iBrEBhw+p_TxZSHvkIJ3gJxgHU>CK<x zW{|#)>4;Hoy&n?X%hF|t(#tzV@j#~+sNRs-Tk6hYlcK&QYmCL_NNn2{K!_6Ud|hH) zX<9>!+Ab|Wv{|P+&^-o6^`#eQ*MMfMRgB!TGZ5B0QiWla-kP&I=qWQsS7W{?(>S;~ zUT!o4ptAEXu6XAfGi<q|Ymn}*MSP4{I=}bOA_QHnhL~|;M-emEG0QeFAA$&x<v9{c zy(&y6^3|du#0}$o<G7xCf}e6EMhApF8yD(@iu4eFGpzXxdV2ZmtFNn9S=r{<vPk6& zN(mmTCM1nnN7L?{1%1OXJ)-hD_$}K0xZj^0=ICzy%>UEQ?mYF!3GmUYsG5~^&aukN zL0UNQ`mxnlg>_$hDzE4E{?t(>PG!HB{a<g>zF#A67VUL^QyH2NMkrjlX1--79}Qa+ z&<!CV<mgam49xHJFZ4nW#dk>0YL8wns0S7vEkzes>HRtChaauLtqjg%`dZBRiZGIn z?(ScZF}PjeG72F5Vv4mOaTxLA4Jb0Kz{aILnW@keG&Hi$)X9)IpWoPl5G8s3>o0b4 z{2`YzuUsb{FBm`UQLZq&j=DK75U$3WPw<_NEvD9-UPdUt|5I05n6b(PK$8``$i;=F zRdIW@A!kOcnZ#oP_jM6Apf(qrZlSH^AY)5mn)+!nu_EwW5yM)#gR5BL*}!#L%i_%9 zvsk27$en2OY~yR>Of)SbDV2(`Qq5V!i?6%*e)?9$P-sy~DFYil-d;3mjYx9^1RVl@ z*MIZ>{{Qy=Uh0lD2%@A=OJO3hC`@^>B{;_=xa_}*8L*m(9e(Z?eD}BidvoIHy!|I> z{QdQt&MC@T@{*mEO0^E6A_+uoOI=r*>yPo&)`B8JTF4u(J}=eUKhHse0jT|ehZTcK zHgR6QU}PcYM%jWCr9xBVjp4%_3*O=PeqrnT7{|j$&FGi5+6OyFk=@?^k{T3*VnjI% z1iL%fVbAN>4R;O&>J%sHQ6GAiv@pSj{3y-S$)pDBU+<%N8l51D3KA*`3K|a9As$}c z9q~44AE4UNOf`GqZu?OTt}@k{mnIrT23%0ImF=8xW7l^AaR-~6YpLXxzse6Z2l;=d z2>y;JQkxlLjAM*fN4Ofs3>B!sfw2}P*dmnS9~WVZolA~E5J~Xw@B_kL7M%d*3JzVn zuoWO8bOa9Jr+<Xu-%AaKq(yjn4humd&yH5T&>{pbw7`d9aw;sZDMlEwsm&rKL5Ewi z)5WYaP_1Wgny=}VCV;&tUD2+MSW%pLUTYmgD&`>(QZ$Gd{D!#420F@2#F-W;>GL`} z&$I3Rye_(yRMkmTt!S#zi%8_>oox_6a8P;6&xE9v`9#OWWLmA+_xC7w3RPRW;@%S{ z!&dAvx1);Qkb8Rj>9<NwL;UaY;WoU1_$H*ddjJ6g-%i@RcSQ3&ZO*l1S0|tt5YQA* zloS;NcWaZ>aB^{gkS=&}RDq8Bkw%R^Ar~$?PUSDX*;dWDOA(WEQnKz1?`mjjL42E1 z@=85vVz4(4ENKg){mVl`A}JOVrG+tExMC`1xplj|t=_eyLuKsdlX?SsP+pQS$|&Rg zd`0Xk=I*T5Em?cUko8rFp%#o9tJY@kS|9%(`#uTdv-O{X5(Yo=^R|j7XL<U+57+d? z<1~!w_f8A(#P43$?bldwem|G8npM~;0Z&U@oF5lN#u=OO2p_eshFY_0yD&`rsGE4M zUq3FgZN7>U;%WBDp&V+|S~ZazcOjNb6m#@_9!Z3m4H`u+;@wAl2`Z@hDWh6oES6Hc zQPr1z^iSv)#VM~Ysg`{8Vrc@&2&9Bk6!V$azYW`|3R?2s8c!wl9XRRdnCxn44M|E1 zvb0Lv8(Sl^EmE?~wY1XHD+01&0Su!KRhexUvxmC>!ju`K(uS>UvZ_5~pox2&y1f~q zL=ZoruJ^jRy{~sV90C6$lBfW^7L~p;l`~2#6qwByG%WOsQm7Q50kj4NE~__oR&z?1 zzAd15f+i;<+E~%&{IBqI|K<O-`@qg_w-*_B*~ZD8^l<i7U(H96%FV14|DWG=x7~it z_nfKsJ)bLu&Tikw1zAJkwE$06<UmUL`yPeFFPwE@-Cv#nfdx$RvFm6AXrSa#VP25J z#pgz%gh8zuVA8o>M^PXa-Wd@QE@4D(WHSM63Q-BmqFip9yU*?orW6#@PfzIUHyamI ze<vCE_IK&AqF8J?U~nSbZk!9OI-^j41&!P20?#!thMd9By`qSLE~@zDc!v=+aEKtF zNs7?vMWt;2qUb02>_>%8FY(+Cv{Bc;eYNh}mRR3yqx?9V8*1JlMYh&1`{>As2Gu{_ z&~3Gr`GCz^01$tr{$uLm<ax38z3`F-G<48+0DS5sRF^uwd_V=Thg<_I&<4#ZM@>|! zme)d|#DTT|xkM7+0Ez-20D64MCYlQ1?kGR)?M&;P-0yc+A~_}J76e`9DVwGd6A(u? zxR4}?4vkpSE+5EF)qZ|I!~XGI&mrGojPI%S)^yOfT(@Ii)7yr@26nwGXt>8O1_wrA z9cZpG!A_@fRferksr?J5_#fway^HOUsa5R%4?JURf5){+*~PZy*={~7X)y-5|EQ|H z$+AJ7d}Ut3>C&}$+3=s_`RDjg_@AlyKX2me{Aj&TZ&CX%4*b|d<$i7Ui;`<t-lB@? z8Epw9l6s(SYyVW$XcP_<f&}(g`7zl)=by(JVS)|Tq<!c3y%cHyT8qr>5$In*imw|# z{I-$EarDhxElIMzgu4)HrTXHtq%|FSCK<`87iR^x`1BpG{(K-EyLpqD9LB(l1q08# zp-))#f4(8vm43G*jz1be>)3ocZBCUl!Wa{Q*RmoOF1b|K9Iz;m8~Y$F0S5qxAk;IU z>Kh?MolP77^K%2#v59l&@`1Si22VnX6x$>@i9{-_Yi24vF{s6bY!!Djr7?0HIufWv ziba$qSVsz{s6LD*wG?TxR}@qtC{iUMW(48PptS`oEpGv#7R(oiiux!7Z$9lg@sZ3X zx|bhU!Jl8NzyuZyprf@>DO`~!)Ax9YWD5^C!5FE4hC@<$91xh(K>W1{mlyY(M0B%^ z<WeT$DPd`4#A2aBUq&QY&ew-0Mh|UpX{7-YV_@{Xv%aS=pO^;16UEH=&JqJfMFmue zAP=GK*~vc~&%x)ms|BKmzGsYy^GjD9;VqIKSLyoDeN#OsqQF=~3X-A%2K=xeC#F#= zY6en({PrY{-XY!hJ2wy2VkQ~MC3Aq%n42~CJD+%L`8m9C%@>&#bXwUEveYD|Vm#XJ z$HT*RNhJ45dV~`uUeywqBuiJFxcO@6?WKhlIE;451RPSdZHjX}lhh5RbtI7~ImelS ze%9_9WoZ$xv9|ipEi**a<k``!YDlDl>c$+SjyHgHCog90<%9y`3WC@Mj&BHok^nMN zvc!hFIZ6zizYR;UWL+T}TIKaMhFGC?NjT-H_fOUJaNy%z##--eRlJf*a6??3h&7=g zn~dn&Zk<kX7=gq;%kKiBV-PvWYnMR|(i<35>jGdh5AjHE*|S6Sq#Q5iz=r}u<ZLk& z`q8{b0no|`*C-%m)FY`&7m57(pNl(j<Mld>W)4+5J+V<KY1oZfidMFYjas>2#7RDt zKeT$;K2n}VDRmVD4NLrR-&w!TRA?b`>WKdZOPiV;6YW$EfRqYdM<*Y}549L^Gm9{i zDF=!uZ{Db%q@Z(h2-#Qqa2PQp_A2pRa^a>$`7JNxwR&Kw$E>LjPgMhD8)!WSh|Fbb zWHEr)|N1led7slF0G_cdYp#6$nqVnT3KemI#yEC3ulD{m=$7-&KdM7Dm;tE>Ka}o6 zAmPEkq#jeHoj)<gst|J^4;4~%Aa;?d0>Ia0NCV)?cUW{8r>d62w|c_Clx!$I;0sK_ z=CLNI;)_<ZS`&Eys4WUV(;E;ZA8++L0qj4U)6Jf$s=daB69$aL9$2Su`jU@J`a1dO zZ=^X=1GXR<9r{4<P9F_+&k1_%<j-Zx>-!sh^z%lejBySb!a5`aWF3(GS$(u+l`mWk z{oZ~|cwv%sMd{f^LtzhJu7E)#0nCc}&;|I2xpO1g(8BzLM3f2PjTo2WqbT!4yyu3$ z6<1vWzJJgl6vNeEe100v5BEEY3B!dqhC%R!9;r}4QWSzl@8bPDBvA44Q6vsXcSo-E z3HAEuJac@+k*QHPaZvc<+rL+v@cH{p{-k$vR#3F@9I)z^1F#?+J2>xtohs*lpOWQ8 zFAy&;2a-M*UN*)Kxql4qAcx)X;IvAGCoJQMq*)N#0N@v-?Y(kj(Y-SDvNiC;?aMQe zY&`k&^?Qss0!cw)wuK`BqA2B)7z!3jB*iOL98@(?_e&3YH3Pu__xrBdGYr}>3L&mM zMEsDiP`tIw!yGAKtFmwiqN1w0#0u4DyTFKiHq~TI9XPMjD2y`$3g;PM_lglfaKKiu zSU_Ata-~Ska!}wjs=Y;pIgd#IftY{t4#$_Fzz^upz9Eiba-kv|a4TQG=aiI{6k{Jd zc-T;GQMfn9f3NTRG{yiQ-TTx(0X&|Y1R*DGyjSi$*Iw~=_I|Wa(V-f1qqe=Hu74T; zG}5)4XZB=RBUegvSpKm<K2sw_0DDvM;CCP_P~b#&pTo&450x-i-kx9m6aZV7|3CbW zULZ>;%)mkzFAsDwdgiiB0|(-13z%Z4EvUpmnL_+3m6=D1rq^KOx!Y9O=~XTNC+(i8 zc#$M}T3DEQ9oND3{MTCf{a!;qlKu0#np;m}i2MJK|4)b2^!wk!{SZ%Nm<!%{O&WlL z2!@tHQ591tsEDo>urRT_5f7VtG@%IvYfdaJ10?)EVbM2w;gWi)x{>?gz=QTc`((07 zs6$urc+uC7K~*G@9J@k<=P&VI9x`(;7cp@SH>|5S5;REeNscyiuIe9pRESTZ3DM$S znYYtxEHATgo`%Ls6BSc65gjX}rLi3=k|hLjMm9v2J|<`sez8D;GyxJU%$7}3Ak>B@ zy<(ATYuJc}_VOkYOc7K;RYbK=(t4u-8vn|OKjIh!ouOD${C|p!2dk=!M9*Huz}J0p z{yz3#LbivQP;e8!nn2_iP^?JUGO*&ughV9;3H6F&I?%oih6XdHo7SF2oN(0Y=zgc# zIo^6uQs9RUQLh1mf-@{ZC22b+Z7jsy2}MpyNlj858eD%|ZR(2|{t9h});Gnr5hGs- zhN_}Bhw(!B^VIR!j~h1^$-F9ghdgk}I%w^4<;PzTii#<zqBqx*TNphzs|_PRz4|tG z=|qLT2##4sz}It%v_b$^K&ZcXC6pyVp+Qm-NecH~CH(TSCW<mBpqB?`S)*$7#ZhcH zQ6HJm;Vh#Thp_(_{xSoLghgJKz}Vheia9o4uW5~FIixtNRr6{cW`}PGevS_b9nibz zf(bnFlR<fIO&dr#U58}`JW$lYynfd)?eA~TMOQa9k2zH4-op)rWML}dQ8F+JCq84D z6df;7Tzt*by?ZGX*SD`B=6TmlYUPF^^yzCG4_Ef1CAEa&Ay_t9zj^A_g27}UjG8&) ziVqd13!I-<!7p){7Wr?u29h<!x;ZoQuXF`9dx(mblJ5f?W^)G|lL)IZ!l+9inZycZ zDH>7|K+LeiFvSOO4iXQau=_ZAil6Rv`AYmqVgaDzYP=qoV@no;>LMDbndkl&p%d>m zp)QT}eWR4a6Z*gV)ZmFBQB?wB?37OssocHCI}f3_nUaLVMsi9|EFt?}K||(epq0tx zH2CuEAq}I40MQ5J2N59%4jrV~2|%$NF@0r*16bfKk~NTOJx##>HwRq6Ygw#il;o3X z{cr7We<T-roN}QgA^$Uw4_MojE2T~TmChjZz@tGcV`x<zZ0DSO;u&t)w@KB&1Mqt_ zUjNN57e0Q!+5TJo#|vC=2?Lk?81UieB;xIxw|Q9Wfz;ZuMTIi-qCf4Hr55U;?pe$w zF0FUCgsoa#nqET4ir$oGd0O6z%qEswM66W2RwlA)R%RoJaf%z^<vVcjcY`i(n=qYm z*Ad6d(_J!VX#DsGyaYxd?f|F($x3>Yjb4tK)+ac1ri1>k`dxZ}zxx0BbT_X3?-HaG zU=jaZg*UBpzy96R1=uv!!^K6$@i{-US2EO;1_RPLckcsVi61N&O;I$2a-p`MGuV~# znf9~N#);^6WliCCy(giQwB2u_hl6+7Wl7{XG9jvsPLVYct0|bD{9ey)bJw=#<>pB0 zHD{EX8{HE#U><FB1lE@fbv~82W>7q5a8A1`%)!7!J1CnKT_&I+FqlfrN&+dwu%#FV zX|h<>IF_s$qGiw%nVR}R2mvrtW;<g*VltH(E5r<7%w%F?Rsj;p8bH9ZSs04tk|v{a zM+Y8Q(CccVOE8SyCLysb+nHkK78wNX)@s#ZgrOU$bQ0uY1W=GT%3@&|7H<tpC8{I{ zBnT9x(^;7qLG@M~FmQxzrHIV5M57~`m`IagR)ni5kqwz<G+cNKgtf8_4lDv}Oa~A| z$wLVd;k&BZF3A|81mHw;e4Gsgtp!0CC{Bbv;vBCDlkxoy*XHPQ-1pC9-M&i;(EA*o z-pgYBrFT7Mh-$KVJ2mc?DOAf$vevrdH;ZG#iwDyS5a6#tnD$+eDk@ES8<q=zl?p>7 zc=Rnauk07mcYo*N;h)^s%gd+}kYFf$&D1hU??BbElvxo&Uha!03suOW@BYedN-acG z@UlTkfJO6#HXAdftKSHC$eZC@hr4-XRN`N>o;L|ppcL)M8%R(RkPb4V+vvc0d5lp+ z`j9TfAOS%@fd^!CYS%pDmm1jE)(w`>hFeRmB4$F~Z_T0wBMgN>4QD9z2I}J-Z1#&T zSTV^&I1mSx5aGx2?gE_<061~dX(Uhgpu2O?n^DcUE!vlU6H3~y{F(oj+`0+|(-<~m zoT?xR{~-=oas2v_4iR*nnCR^2>d6D-KpYU?wv-J5Ut9)PLk&yP;DgoSj^%a{O)K36 z)w+RpVs+Ru+eRW(0W^<n*U!t>b2ubxkukH=Q@a52W`^kxBivUqp6^b^d%1~p<kGPx zksxmC3US|N*{V^uh-4MhqLAZ>x&eMV0#At_q#$KTEqt&85zH0%z>Et321<q)iev#A z5&$(cFi30gwWj(%rhX^8{389u>6}bBY9qA{FHiMs@a@7M3<lHQ{$4g7BvIx3r}Xy* zr(g9#0&+M6ojTBVMHVdARJXzzeJ+kD1cU_b)B=`h7w_EtkJL7Sv!l0Y4j>#4ivd7< zQFJM`7Jj&<7BO}p>K2;o9m+yN#QU%akW;XADcH3m62w^;=Y$_8vB;`uOC+lr>?qN2 zWJjwW7-y^E0boPuX}6M0s+mL~GN}vxyM6g{Io0WY?7w%^TWzscwzCT59#I7ZE1Wh? zP1HOMRTTs=Pm&(I0`X5~3-zJ(ARA)p)t=wg!{(F2i(p<!`+!5RmVl(Cp*4_KhK*bv zSrCJ$H<kfP8JUm~Mqp$#WQ`(lYAAJ~%7pK>h)OgD=CUGV{@)c$iAfaU#5QP=4}pZG zwD)gJ6w_8MbgcfPMb1O!*#8qF&&qJ<(_Jug$Q>@QDE0vfcxP{^y{Hgzlt~2%1WbRG zUL1&$fs#<rP|*_6LPXK!$HDi_gY3FUwPBQIV@^XzS(%s_D=E^bfD=+wvq;P>A{9YM zI7nb4tHX)8D+3n@Ufpy04wlmbnZP(C0qvgjOtg;BD%OFo_<rTOd^8`_?W0j0kt}$+ zFmdkP&B<@^;+=+L3#UNGG{j_j2?%f=0m&2+erFgTfI5hJ@~XaYIvwJ4M`C=vq5jYN zul#O&pyI>A!PRqg2MGkHsD%geZ6&)c$8VA+eA)2#*I{$3$zLns4m(2=fF3mJJUo9( zQ<2>dJI?nfR@^(nWTWg5YLrS8Ac$I2s%iriXm82^3@;~BT<pY>rAmx}bn|F(>+>9( zS9h;Pw*y8KxZ17S7-%+-n;kU)K@y;m2Z+Lsd_#-}?lyA03cPslb>cJQWM|3kcFpt` zV1eM2G}<>jEA0|>UY_31Za^08)UpxC@L+Viw<YXn(_ZW0D|&_L{;^<*&_M(+AJ@?! zONc3jUtze`L^<%_l3yiB7tqwegcU$s>T0<p6eo15HvpouRHb7bc>H1jv<hbF-=&(0 z4P*3;l0X{z04XGbg$)V9ko#Vx7~-HgZKybhh$pk(@Rl!ow=TSd!-(^qGPwLr1A<MJ zQ7ab8va6MW%!#4YY(7KNnr`#YEZs?|34FuXuYE5@*WM6(q(|gFWR&th7OL;hlBjPA zmF&j?d2$IF-k~SQLtYWqH?yv_R<D<yIuG~1XndrgDF~WrN@!YEnkga`?}{q3DS$Qu z7#zYNqd(_a^NRq3S$RIrEYt=0z)@}B7$rTaOk&ETk_3o}pYfsxD8je!?0?zI4Kj>` zFmB}Ovw&XwTzUGt5du$tA?D5jSX9vm%%0#DasknXS1LxD2En7?+-;o&B@`)CBScV5 zG&IODLlIO2Q3OD}zQy(s3@Tg>=RiH7+>+^sTa#qnXvqi?uo@A_Cd5R~>S!|5VNl=( z7C~lVK^Q}n6HrkwLsYCmOGGvql|bdJBMQvGG<YyYOtQ-Y!4p9QD@j*izX9UlH4Y?0 zV`3{l$Y!eU!)fQWR7{ifz?`>%fKtZ{fum2ZbAUDrp&H04G!8*NAs7{kCbC*Yz#?dq zPPOP`B@IId=9(r%HZ{yhU*qNvCScpdrKAclok^ljpjh_?7_|vWD@QA^(*c+g@R<~n z74@k@#=Q)>Z39Y205SrSDl@OQmyX`Yvt3>*YEbRihq$UFA7`J>JkgN>>GJhvQp7MM zUiTUkzZ{1F`HrJT3QzTI=0i#L_mD#Y%7DY=$e$v4La(dFj7b0d)n>2?z&8{P>QEL! zs>VhG3+FHOVK8t?A<xYN{0Y|W3T*HB(0JSJ4TkyWe3SnU$HV>cI%&rd?|-)y*O&TH zt6J++VS%ZvSQVo_=iYQqN@w%p+`EW|3`oo&+%aNl)<z}gkzZ0&5g&MUW2z9Mf_a{{ zMB?r-IUkoB!|8DWxWm?9eomgFoL|eU@aJwH_twny|DPrEZ+p+N$?!)prZgLtI<iKK z6sH8ERjM^iej*+|*h6fhY|b;%<M1LOj!nT4aLvL9H7}ap^Rtuc{88`U-=BYp(Omvi z#V}Tt2qySdjtv|UJN^KFdhM275X3T+Ax*gxZG*I~jKIWw%rJT)Y_yY0Ng0}LMGV6X zF@G>)2ADz+<S~fHT~S38QbP!*%gOT`bK}I71nkw3j^I4cSBZa@m`!*c+ItY1U6cX6 zlb_i=Pufc(VeUEh*QqMbz_ty$M9X3uMi7j2G99lIv|Wlz5?YpmiZipG&Bix2xxVJr zzqi0_IzYaI0>7UO7NDX#i*C;DV;qT0d{B8uiEJUF5011!r!gRoIp!|fI&+QR)r|od zA^G3Q`n9ct3{rAq{>n-Gao7ec8{}bl99)tg&=-K_aHk4YUh$V~8Wq-2QW;#qZY-oR zn8{XQnKNZRf}#lmM$Q^Sp_VXn2Be=h6Bl72)CWd$VM$3CWFihTPQf1FJJ8QEBp^UK z0rHv-;2n@sUD)8m4AN;6fM>BDF&*SH(G#a6@Zkm+bFT4DO#pFn7*Ie-GQCb)3?S$T zLA4BS;`Xw_JPDKyVWDKfRW=&MI>5}487L-_8+qzkk}gOg{sz~i?dLw%%j6H<;BMRg zhZJ{5_z*4!|7lN27-pMf<JMsk8%aaMAQ%_>e3__C(SiL8|0<)?pGfS4eWbL3;|;}C z8CWqgiMk`#usdG6TndED9}1ETd+m49lS3f?;NqnYUOr3R@RU;XV6RmO0Y*WJI&b8> zstLqu|71I^c@h6pf}&uq-BMTsiT&Vt#ZAVQ4UiwElZ=BfA%bzl5#Wck6klaN!DzfF z7-C{L7?`QpdjbbS0w-sB2b_S0O}Oa`A=@8d*~#{e8h^`;CPDpJ8i=NpI6gzSg@Bz) zq$vZu44eO#>E>9oC%(x5_moX=pvEIbQFM{Q<+T`r!VG|Ml@EFbjspdH0j=PoVlaTG zgWsY6_rMYYYYy}jHjJbMZUNLQa2x%SNO=nhw>1FFv2liq0Eekl>@lE7NEi(U2c7Cu znL^A!*ROdKM*0S|1R97aup);U4S1}~PQ^Hj@R@M{6kV+Bn}orvk2x4v%u+^3`+?>? zOtv0RTW-1y$mAZuAd7$y07d%<421SjwSlb>2X|XEKz5fYIE)D;Vj1tRW{)tJ-=VnP z9-a(jH3f%osiD>g-(2fDLz#6iI)&OSusRA()T*#;M`J;&yU1Y5#mmfV9LzE@^-Ihf z#VA=wgc3oOSy>nuSP24@QdNc#i6D?-l!$Il90UWRs|j>~v}`vY*;_YMLGn?;2ZbV+ zq`ij=b`t6YJ%@g{RLLL_jKR-{5Y!JKEtm!lM1d@+M-$*v#9*>G4m)i{12BMrxndq8 zauCdH0dMWf;9kM3L~DMdBpd>s<T?~t1w_iINi-1M$QssaAXB*&vLJ3vgaCceb%Bf{ zmlsGJKv+r*s%Q2Bk#e}ZR5q%L<;%c5F#lOYM`$BRWLX_I0`Uw3TA|t%rGlU!lfn@U zg$$GeL|~;F1c+Rb4IuD~<f+7mDq)OvP{BL!#a`l24V5R4#(3Wu?A3P;kERfVqe!1_ zA*~^~OW3fK*jrKyZoalX_rBp0m9g3t1f0ovBzpx6QxHY;VwyIF0R|WVI1(T<h!H3c zf7$qeuL%$i=ldbcgglGc1rFztNk{>n^AX46_~DMw?lqif8TpfK)L@QIha^-j49JZl zaRoP|lq^EBLkS2n$|;bcTO1%`Llp>73HjELM#am@Ik?BZU0q5V&^gmkC_7$CPDB#x z&F+K_feoTuhxZ!X9sIaE)lE=USpY#H3=*DT==schpTXuFF3T~G69Xdf!)bezUH~DN z<srDE_`ZYX*caLNsLY4)mVC_X?XNI9ztGrwZSg(4)$nKjyyZjvANce0L+Kbv(SV2f z1am8r3V!`L@zF8!e}`+@nGRq-pH8P^M#?Cnh+p)Ua`^xo!;D|*s7P%7K6DgOa$)hR zyF&hY^(M|UxQ-H05dFUM`Jvl?o^3yi{%vWzJa$Bg5E1`|M|Vf!w{L=dN!*u2Ie+QN zg$Id=&;v$MSH&OFxiyCjY9gO^n|K&8gKeY-;1>XBLn-|(BI&`If7S3iK*!TLB8W0F zqM|ORk8dxp+Mv<XHr-Pk__LF!!shGByT+ps0zg?9OB*NlfE6Ms6$B(iY9a(cI^BOy z_^o@$WFKXC5>Y(N7O&vfoVUI4`cGl+ba(5P<^;;)&B0U~kH(>y71j(#lxWY*+DFkA z1NpS+ben;Se^a0$pUwQ);Sa7w*=BR!zhG&rRV<($&jcZg;=KB59m~tY_4VnTq*bLL z5F*M6=%X6ci>p@<91)1Xa2*lGgtBcnXs9H#<oqZ)KFN-(NUda8O`#ES1R{1*_%4P* zZ=i$SsBR`v93#;mKMDrI^$x(!RAQU~u-0+iM12Pke@M)2qa%*_?)87l;jgBD;rP#} zuaE%T#{!>){l}aRMEcM99>?J8&*8&u$;Lg`@4?c28}QRutluK~)qQ}2I(*+3U|0%% z9E~8F1MtHEhzKAf4WZO0pb#MqE6o@|2uH3#fiFl$p^B0+0)y(mjD9x54;Fj_kOQuD zQjkjo2@nJXg8?c*BM=Zk#GTWG97P5b*9;gSLV4UU-bNAZ2eI2T{IA~srNAGvj~aEj zw5a;qXixM*%sa(1^*(3ugP225KG+a}1J#d_f_0Hs-o0I_N=Pr5iIW2GX(1nbfF>F- zaF#WN6j_6obr@z;Veq)^-Bl4)Y}BI-F)0xeHziVy_HUfSOw`$t_YH6$+<XvG0Tm!f z5O9g_@=i`TpCdCl<7VShz~(KKFd9mX83-sq+QNvyZ5GBr#R?+3j4%$)@pT#vU_!-e zJw!7Gn1!S&h?<CCQU!?(nTHPmLGS=~qJ+4tK?c~TkZuKx&i8om*$ja7(ja?%-mO(i zs+Cb_X)08eRYg%&Ls8a-)38m;fdNO}|3!P+5(Fc;W8kB?&<5$Ev<ISu3Lap!wudRo zP>HEMD#GV=Y?Q#xf|Lsb(^|Pz%}}J+dn%BNGwPuZDP=MtLcjXF-@AcRVISN2zn|=e zztRuKKG)%^dsGzyH?_aO)YjZm>E<oFGc)>4CefE#*H>Gas%G`8mc@-mVC!ttjI3<c zv}0m!C_$_&ax*s>L6ekgCdQgf3`3^0V+hBQK#~$B^%ZrYuu4S_lWViWJ$JC0??UX< zFYE82r$_u8>Y#si9#-Oi;_3{L3v3DqY}S>ZQH6Hy3gd7<{m?S>@xL!x(FmN!@1O3+ z-WsOXm2cWyCh`&)ayvUg|I_|$_+NIi<13!ueqRnh@z!(wj2eC4lkq%nI}d-oFOdZn zb@C!H0jgxth)87kNPP<lW9NUj@qT`OK}dU=i&$Y>4OVr#7&26~*vIvPtX#U37Yx&0 zbJF$ycKXv&n!`~7(4f{B2woUdf&6Q)yQbsKMbGvwYs-s<T#WQ)$H3$`tD>l6hV$J0 z1C1PeCNrN5?fn1@l!7V1IL+yOL13SyYWx4ASQ2(X!GczE3lhiH4fWOK<#{?Mb*x&( zPNU_3M3sKZ|H0HBsrmalC2~~VBck9F)EQWAti)71Qjf(hfZPz=DdrF`e8z-0mxQnl zk%;vx*?_PqsL0Ae;6yze_8I6Gstj%Cq9mjbwiNf>17XL;;OGC3wah<#h(!vg>A-OV zV1WNX(wh`jB_sE$e-OYvtP1<ca!<XIhv`C_B*;I9CdgA5fw0E0hHpQ>w1)Qo1J<;S zW3J34=YzP&&cUOeruA&0O+u6*OOn!3P$NS?jSaO!vgqhFuc_S*`t2fM-?;l4Hj@sO zWb+qM%wT%Hz`veAkA@eTFReXdde)|l7)u6o$<)#n0?ZHjWO*R;%xR-7%5uZI`kpg0 zy`bq25{tZw86pp&2(Vz}QO5x=N+UnScOF@OK&uf_fW;EzY7k-WA9GX0mOtkwuBWCx zsi`$x2INXGI|D6n0}E)nNUDQd6ciD#XDX`ABqs~@kzEf#L+2B(*vGug(FDi~kf-$l z9Mx4n+KFV+iPcXK7@wzL!>LLb#jr54&SV3W+=4$mkW2|ygjfWS34k9!f9mP{c2y0# zH3A$+fLu<JsDcrSiRJzVPvfn%N&W{pqyuJTlpm7eT_JP4_mMy(6d{G<+UEOC@&VYg z0}{sg#D&aT@5HOKydXN2m7&!Lp%^C8c@m|vFqVgTfNeIr(rj8vB{rKtq67<3L=8X= z1CRiG%Ae8ALykIejST*aR1$kXfW_ULP^H?XgP6tsOq57vQ)Tl~R8e*FQkw{WgA%$m z)NE)2YNFzq@;>D7aI7o8baEs@iD3(poRCTZk(mEUz{MaQ4?N^x%vd-zO$@54DiEXV zmF~-h@F0H>p-ltj2TBhH)6GZ$zX(AC{<tUk1N-Uxp@4tH0tqya{=|PE+0Q*t>Ob_X zJ1FsS4##bkUR76oELdi-VVTmyFsjlJVYHKJd|;o_9#g)jV}U_V2ps(s{^qMLpzVUV zA|z7!i`Je&)t9g8q=M}Zprk%~^ZFfv85sspD5NzP`Fl{szDt<@0WJM!aB?N{3Q`2D zNgyAW1H<(GIrPa1Yp!Gw&>(3+WamY0b#e6}g@!0vgo2MrDgYjA{M#t1rly4F+8W0| zi3EwYwI*M%9=U)`+P#=idvT1;94~52mt&5=J#xi>STI<*xd+#{`v3sj+{22U-X3AH zqU8(XaYG;p{5>mPmbJAYCETe(_TC%dqyqq-a)5luK3R1u*MtlcX(NYT*hAFXyb%#W zv!(;LLVtW|=yw!LN*`)+Kgx_q2!S;@8r$A`1F@<k@4JA|`bZ==LU*@^ARK~h@O#`F z*$HpWR)tR_y^_4FRx4dOC7|dHQP9y+OIlZS5b}@H!WID6AL0>tc}`H}d2pK&9}$*D zPEYmBpUmT4vH|<EeT-PMw#t1e?Rw!EQ6G|h9Ca5641(Q$SLNOK{at6b8Je2*U9c<p z0X7&l_>T|eI0GB<P^MpPim3@CRn~IHZx??>^U<$bp1{{KeDZgnix<z#&kay}2yHeF z=uD_;#~-`~Wl70kuxy8iam#HDL2}51j{}z5P+raXhhC0f$ta_uxNf67x0beGcf0sc zMq44mLJ*H!Y=3yKMC>m@hw#w<N!_F13J*_DRkP)*<cKdE=@n=)PHOpf%8ap|H8dAF zhA6*qdTAmCvIurt65xb3Y?3^oGs#nZWT1Xc8sC1v4aM+x1|cj*!Vmmji;KQEXUdW$ zr{Ad_aPlAXo{RpF7%snaor(H;AFf}A)bcwlcNrrafDurXq5+Iz>oWY-<@EmCTkvF= z3{^u@{8`}Xh5#Z}$b2G?GeQm}3D5dwY$JSuwSEo`QbMF@OabEvt7T%*_*UU%Lh%P# z8d3t~_Ut8*NFpFQL&yZ^MiamI143tbZ4qnxnqt)<677oEo-;dVpOg4pEN>*^0Ml&% z!JA6r;<UESKW2TKh&*vOx(6Y~QFwjg;s@;Z;yi3QWT2{oLaKtIL7<FaNdb~o9Gq>X zx7(Nf?o1iqM`_Su4fwz`g%#=Z!S{gzIX)p2<<LY=Ku|$JK|i?!5(vXRJ>MxDa!Dkf zeta_Kw7lAD${yfI8vq9R-Sg?nB*FnQkU%L)Fmi+PM!<)6<^#r7N?kxbH17$3Pu7LN z2OL(ahw4rBj4*)M58n<PNc@sKpn8Jyh8*=_WaeXs=t6tbsO?2ZX&eKAX%~6o)X_Tt zWN;)*s6H4~K{_8|2QPY@0RHzv!96^hC_9wq5b+=bB7wsr6Nd~_4xieUVm+1Q;Z#mZ zh)98P#=ybu!G1Hj2`p$y_$TRpm)$G_3zfC3e!bnt6c_bRRDmF0@M;bUfLS&}j4#@e zBu_;~HANJmRau#tnVFfHm{kFUp`W9eRHX}Au)@U4D#<e=GODbqt1>WfvZAV~9AsCB zPxV=VrlV{n6C{!hak&UUX)y?F5|RlJAVE;fs}O<%0s??eKV{?W?{2vj+@s6K9C4T| z#BA&|E_iML;SfmMZMN#H$T9;10|Cs8Km(5!>QAzIYOd2E4zvtL3C#7U<I4rVTeR$Z z57_b_3mNf-Z|zdzl1Nxp8|MtdGB(Gnm`i3`ZRK+Jc4s{3I60BFp{_>wCm3_B(^+$4 zSS7@O-{=;FgCT;{3s$y{X7J*|#5_Q(f(%SnA*3u!I3&G^W_4m%h+iNs3JyO(Z)$(T zhq!^%69jrrf{GwOl%b(uJMGY*ML5DCIl`!-vCL?ys`a9V&hbBkjD&g**6!MM$-7dP zj53e3SkT?xqc+587b3yxF;7u$7s1~h77GCTT()F4T%(O(QqYb<!6HP3Aj1g55G1sR zoH1|%ta1pAsRmWGLZS?!!UzsTz=qO_1M@T+48%LjC5dY^2)^daiL70SV%CWYQV<Z3 z7*g+WM1FVTIm>=;=8}Et{8kU_7=#Xz=imLLY(4<~E(xLj)alb1lrukR3Li?;6zqge zPEV-;#$Y3&{0WGro&LVH8Xxp)8iNZ<Oa5cPqXs6L{V-;+#@vmD8!*T!NGC92W<m{y zurv{cR{8u+OnMyQhju*S(fB{<Xy2hHwq67BP6zGHSp87d#J1D-jMy267;+1*KGIa! z%T9zO2~pRWngS3<MSJE1{^t(=F%71#<>?L&b@iL4PwvvV`}AkgUAm}&5aogoGHE~| z+&g-U3{e$CYAUF!Vu*#M$gB`yn&@=SbRB(-4zKM0T)-u|q4x@Wzz^S=TvwSG2PS1c z6b6r;A&E-B!6;D7P(o2KHTiJFESDIG$uM&;AStR=bU?o#f}#0lVnSHZtHQ+^h?$Lq z{co}KY~p4WDnCwPqx<iw#6imj4XZHL%ppaDN!FlTpb*3)-Dxgzwfj3NSQw_b7=-h{ zP^MaKBWCy6cV?ONv5+}5A(#~+qqzmq6woRL=$i*@K6#;-BQ7I>t2t5jkMpv2=9&O% z6)(i;V}Y^IU=TLyGz5wvz|J1<O)(wD9fiqG*~&pW^*ssSJL;dnAf61u6$Av~t)x0Y zsbmxhcY?yT3%0B&ei}_>;qiQoQw{$pEJna61d)-zWx@a)gTN3!Y*V-q^k4xz0Pz5b zC@3&fVc7tYNRYuCi}yUr+aC+g-4w#$+vw2+tv0&d_IOdpJ>2+X(dXq35zVJMaz+sl zV`JirGVfdlMbU)Nz`QCK4A)~BlXp=Is3q6}ZBz!;d{coTnMf&FsiuX}<+QP`E-^uX zri3CxHv5t3-Q33uxHSQ#C}s$d2wXH4uuY(CyPKvS3`pQ;A*6~fkh&NU!$c%n0+eDl z7e@@<Aq}LC5B|NG%z3ssn(uJqK*)jz5)f1GFu-Pr(NRNd|0er|WG6#|0Tn|<aqS+a z+z!=8^iz6}VTL?IVw_R{Wsqgjq7!Z#AL=Qr=ghA2;Ap6V2$Bkz5uhVMak-dtscs5D zE;*4*DRLk%*G$F_S?)RmsY*C|2Scg8;#hJ%#fFmknmyT>CJ2Zd4OD^#ge;6U>^yZ_ zavb*iLkIoehk8`S1ZkBCNC3eI8X-YtEJw5ixNJpC0yr-z-ac1(m**5#8ARiehGt|@ zMMVVI)na8uG)&}VSQR4(A9>Qn`#;=g`4bAa1!R(&&(?ua=wgS}{}k6iklD;p1WZKO z>L;8H+aQh%?!Xu@q5lN^aHu=;A25wB%muNXF4iwDClGT|b}i2XBywW^HVSK>_aTQD z5tdFAMg|UMBt%KbV}WSdE|jf+#M%Z_YSveL=RQY}?&%YI)_3~O;BXPt9<YbzDfmD? zF$42o%}>oh_d)#OKg9!}nG-V|m%vGoBs+jBS(Fm0@(7el*V1_j*VmYOJ7=Np3GJY3 z+N!EbP?VG*B?=0veZak5huU|=R8m1zO{L_G03P^3T1}r>8Ti9)5g?BaC`i~%ifaxv z1GF>JlQJtp4$}&UGup;4YQX3zCu7!~Y*KbbJ4zB99EXtN>MqGL2V`~*$n3j95@t-C z0^S=Y5WwW*Xc?w?>Nct=zmJGH@voMNCv8+GU?QCcuz+am5qe9m!g{@DX}v?R>mu>; zxCe-|jXMNjn1Kx)JxAY?=si&L0TfoF5@^iENTQYkWQr-0D5glF|6ByrAf2%e=)q7Q zWOfPuw;G2T&BWLuqCyANKjNE1uz;Ul0-ZU5s87;C27eP;nLNlwkrI$dDEOeq_23W= zKo5`)$aCF&JYuQNLi80>D4q7_!f7PP%^R4kB}oAJbPIL7VxhxA*o4uXpA}t0R~u#$ zj0Ut-Nm}zG42uf7@Ixvk;huD6WNR};EP;(mL?|^-_zF&;M>JvJaO)I;Zbr-XmD%zE z?iDH4>L^!O17t+F2$0$wphRe;Aw(<Uu=?Jgby&cm>%xE#VcIY+mQ`d=U)K*^HDsm` zd%%$ZkptAXUvDi@4xj;H+$9GwND!e5;6_8XcU`YxxpsRYO+i%zNkq*=$5-Egl!hMj zuIrP)>TFHU;s=8h{nw<BDRe;+r<F(y0f*EtundNSNf27%Kez2w;X&oop6zC|ZM)}; z^6Ag0-vl5~5=vx{Ez}P6F{uEH21Gz&l>yulK;wchGqdKdQ$gS!@bF#I3<iK{GIvyJ zc0rxmFk(0|<1vE;d_n|wnTc?=$}nY~K;-Ka1}WfnxdNTmFesSmGro^3hLRv{pf29% ziBCTIJhofsDucT12hb(9gS7H@8K5ph$sQ3T;Nj*$q-jEc3IdQIh2&tZ_;k^*;2|~P zg5CiEiICyYiFLqJxNwNMgiet72z45r0t5#oI4oT1;%^L+q>%`Q<o3cNqD4M>kPy?* z2ha|WkR*Ev^`0K1fXQf6EfTo`5I}}8W@I^25<bJg&vAr0KU&$`7-qu)8C@x}dUQ_2 zAPopuGD2`b7^q>2pq!pZWj3nla9ka*pcw$A25=+|s3o*DVvn41JZD*biQB;*!|V;u zeUX%B`MNZwo0U|tLqsExavj#W!5lH7G=d)gn5z6N=+Tu{FUk=97PSwe1_q8YoDcRy zcXE0M7$vqGfE|mQKSY&-8yjP0z>@O0KwkDkY$FB`Cnt9&ejMoJ-W-H1hPJyB7KM)i zcfuG{*jNf!otnVvE(3x9^?@H_+-(3g1EN%jRqG@qL0hH`YK0ay4pTC<#sQjRNhB)@ z7zZdo++oWIU?H;R!&$J#8LYUOrUG0ee9XgHLSh)qGT8uzqMGg<h7A$H;ca2$v5xX+ zTno2u{#9DwklQh~qvduxpdgn<1i?OOwe@R(2wBiEF;W^_8t2UPN}>-5t(+aGZ7z%& zV-W=s)Gj&hnHUL?em9a2>JbSQJTSC=U=Ux$KxW|n-<*HB=UNVypn?g53CXOCDrYko zC~AT#3Mm|%%Cd)6RMRyn6hT6#Assl@_ExhhBAO~^?q^p@8EOMAZevvy6*c<_KvDT1 z4anmotWTK0<_<5|k^KFHPjGDeG7>^3{1ps{;eo&3459vmH@9Z|DB+l9VS{jj0Q~%4 zr_i`;0GHN97wy@VR#kI{0Tc&Yo#E?;kN55dG?A$0Lr`c4Od+bFJ73I^I5rpo*?>G_ z+S*7p!(UC2>wns(zm^hb$@~Am!>+#B*7!thp8!P@LMVLs(>$PEv;CcE{s3F`NI&Ow zQTj<xCx+ew=&It9S@QGO`dfNTo)~sQfVkJ#B7YJLJ7{|1W%{K<Z4_u6q@P%ds;nXW z8*k$GF?)K{S<A|!wDIuStBC~)`8lrHy&lASxpZ`eO(Ja}CcBkd#o5O%rqt^jC>#xX z%YV}M{d7Hs9;xye4SYBD>?$aYP&3>0U!%0g^Bo_T-B`lcSL;7Kq9RKaGUEmSBBG*H zvoeH8AYY^Qe+TA&2j)Ig&_v<mtLG0Y4&mS!hFTO<<57Hu(2N8oBvFELN}L}zT<0|( z^RR5HO6c%(Q4_FCB#ID`5~!Lb3JG2h{cVbAgbP6!8$;UonMxlNn4py=R?Dfczx9Li z%wO_EeNxC25eZQP@q$P;$SkMhA^K<M2j>C#!?eIIK?C&yFe3>`^GObN!!u%>OgyR` zSVD!*-86*9VE96rl3)m=_yDQ9lHKrb!{(WoW?4sn>E`f;4AaFTOdI4>{&;}EP(N~~ z0)&i$fyi)b8yAKC=jJc!avpn<jGP3rXsln(Ih`61z{?dx^Z<0R>jEh>VhgQcghWAr z=^s3?C?9<&VJJiq3ovRLFPxMS<UG&~uZ$+<5l;IFf<ywOuqQ;n1_nHQp~za+3mCuy zsZc?L6QZLEg+O9InNa;vHVi2359dTbNI3x=$eWTK!~=vi3`6Zv_&&vcO-{i6#omZ` zuBUwFqpqaC>IK>?;H2J~eabu3e_3t$W4G<teHT6jbid!%_6tMq!iX~TNJ5RkU$)tY zg(Z1oeq=>Ml4a*WsX5aZ;$vE>p%1z1SzF$&hICpl?fd~o#C9XG`Y^wF3(L{!@2LK} z{9mQ94u&3C{w$iQ3XT|MOhXk?wNw-|1r;)fYHp#*AE^M<w{W&J<TzL!=XnCCs8Pap zQ!n{@$^My|G@Qj1R9impZhl`bhLhM{n2a10T^fl@61jIoKvk+xV-e;=VvZ!mINz7! z=dl0h@AU6he`_zd{`<_u-+(bJK)@JuV1s}T4jSfU_$DE+P=kDCg_Zd*dj!6;`!_qi zi=l!6FBRTVHPK*&v!h}5c2+NhlC5CM|A(88dBGfy3H@84^*;H}555+<WA}fU%OlPk z17pEXSOkRSFKVCW<_Yv*8RZ$E6tplyA`5gVmnL^;K5tjA(hifX-DK8SaDFbbe*gnw zd$aizl;mIz-XYLLf_)S=sjbn7uO7N>Bp2d8GlAG(r9t#Q&Z>x>xs^kil~mE0l~q9} z0K$v$kQGi+A_<x*Y!Tu|kTt>y32;Wp1%!#25d7fh(H)<Ak1+v)U<Z)<{6ploz=zTJ zq=-}ZO`!_L!C+_RGx>c(;4!9~O#SGHIUx@Uu|k${o<{+}Q8dv-6ceP6-8eU<YNzC3 zhOs1&G))eS%D|GMi9X`0gr>h@q@pY;);4`Dfn@oUFuzOu*bBx+{Af-fECJdW@tz~r zD2;n|0@n7wB!}eumG3vC!Lx&oF9!4{!{W0|+QyJ=4DyKN8yU0)r-s4E_i@^C_RYi; z$Bdsl+7R=f-x;gtZZD~wArX<i9?=5#qa5-H1H%MNjFSU11R=?xOi~S=`lo|Fq6&F~ zKB&-roVZzl=^Su`H)%^nb0U%rnVL&lPej0t5rmEYYC7p4KNzX8UFx5F@8mDr$Fd*z zKSM5WO>!F^>J+rJlHnKMF^s(o9Z3J3?Ec94+Yb5fPum}@<Oux-^}km3x9>8}FM2Qj zZnQN|83W*lrM{E)<$!?N3%BF0MkegFf#|uhi>KuM168hpK48)E|KQTE1+t8$6$Hd0 zJSwvdQX{G;iPg-k@GPk}exE6)i7)7h$oBm%`(xtT3Gik4s^a`LG`cYy|BGYswiZ!M zRTvWzBq1Crh6Io?6PT_81nDrwU}%9Th>8!-{onJxj>Ju&3Pi~fFfj-0rOo1&1e?tN zQqVu@NA)#?D1R#sL;wTMCyZdwZ59L#UxZ#Yaq2-ojzHA^#^7xHV)=jWeDiqznt3?I zY$*l_6H+uhNxC$z82zq7FVSvq1vM%lQBIHBrKmzEpWkx6$XG{UW`by}2l{K|>kdyd zG7>g6*x`ud`MUl|<sk#|lQP3mg=)yAZ5f5i{%AmN1b@$fK!3uqLjzb)pngrE{>{(9 zYDXj@95~?)`<ZtX3<qkeYD6w4-N$^$!Z0u&+lj=E;AEbp0%l`?c4dZHl~mD1RTaJ! z+JDvT|5+pz2kg)Kt_<E}<A-d0X3BQDB8Z5vtjy7xKT^oLZNo-5>GWZP8=A$KHl3!c z%F1d1rH~3}``Zk|`BbR#bTkJm1WJP<AtY�)mH3fdqi)F~AvAj97|nK>8>U0Qyx% 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�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≪~7-FJnCFqa-#~(o54&n{k;92Rlx(L670( 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
l+t*_U>`lG;+ISe|q>Ih%+?L;_0;7faZ(FEL(O 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¨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π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⁡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 O@pmLsg$V+-tD->M)|fT` diff --git a/ThirdParty/lcov/.version b/ThirdParty/lcov/.version deleted file mode 100644 index ad1509c1e..000000000 --- a/ThirdParty/lcov/.version +++ /dev/null @@ -1,3 +0,0 @@ -VERSION=1.14 -RELEASE=1 -FULL=1.14 diff --git a/ThirdParty/lcov/CHANGES b/ThirdParty/lcov/CHANGES deleted file mode 100644 index 2e7086b99..000000000 --- a/ThirdParty/lcov/CHANGES +++ /dev/null @@ -1,3454 +0,0 @@ -commit 6c7ad581ab9ed66f80050970c0d559c6684613b7 (HEAD, tag: v1.14, origin/master, origin/HEAD, master) -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Thu Feb 28 18:01:39 2019 +0100 - - lcov: Finalize release 1.14 - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - -commit 29814f18ec207ebaefa7b41f6e5acc4eca6d7a7a -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Thu Feb 28 17:31:17 2019 +0100 - - geninfo: Fix missing FN: entries in result files - - geninfo sometimes fails to correctly collect function starting lines for - some source files, resulting in output files with missing FN: lines. - Also such functions are missing from the function list in HTML output. - - The problem occurs when - a) multiple source files contribute to a function implementation (e.g. - via including code), and - b) the source file that contains the initial function definition - is not the source file that contains the most function - definitions - - The problem occurs due to a heuristic in function graph_find_base() that - incorrectly determines the source file for a function in this situation. - - Fix this by using the first file that contributes to a function as the - base source file for that function. Only apply this change to data - collected using GCC versions 4 and above since earlier versions did not - produce stable file orders in graph files. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - Reported-by: Joshua Cranmer - -commit 74bae96e8ef724eb9dbdf126adad17505375e149 -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Thu Feb 28 16:15:22 2019 +0100 - - Makefile: Make Perl path install-time configurable - - Add support for specifying the Perl interpreter path used in installed - Perl scripts. If no path is specified, the default '/usr/bin/perl' is - used. - - Set variable LCOV_PERL_PATH to specify a different path, for example: - - make install LCOV_PERL_PATH=/usr/local/bin/perl - - Unset this variable to keep the current path: - - make install LCOV_PERL_PATH= - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - -commit 0b378cba2c0f93d728627aa8750849d3c33de0e1 -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Thu Feb 28 14:21:18 2019 +0100 - - bin,test: Use /usr/bin/env to locate script interpreters - - Make use of the /usr/bin/env tool to locate script interpreters. This is - needed to locate the correct interpreter in non-standard environments. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - Suggested-by: Bjørn Forsman <bjorn.forsman@gmail.com> - Suggested-by: Mario Costa - -commit 2ff99aefbd0c80fe0cfddf1e09a596d7344533e1 -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Thu Feb 28 14:09:42 2019 +0100 - - bin/*: Remove '-w' from interpreter specifications - - Replace '-w' flag from Perl interpreter specifications with 'use strict' - directive. This is done in preparation of using a more flexible - interpreter specification. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - -commit 3b378b0e76be95971680056d864d0e13f4a08557 -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Wed Feb 27 16:33:42 2019 +0100 - - geninfo: Fix errors while resolving /././ path components - - Trying to collect code coverage data for source code that contains - repeat ./ references in a path components fails with the following - error message: - - geninfo: WARNING: cannot find an entry for <name>.gcov in .gcno file, - skipping file! - - This is caused by a bug in path normalization function - solve_relative_path() that does not correctly process adjacent ./ - references. - - Fix this by repeating the resolution of ./ references in path - components. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - Reported-by: Joshua Cranmer - -commit 42b55f5a497d2286566d0dd411e3e52fd4d50469 -Author: iignatyev <igor.v.ignatiev@gmail.com> -Date: Wed Feb 6 11:35:02 2019 -0800 - - geninfo: preserve-paths makes gcov to fail for long pathnames - - geninfo uses '--preserve-paths' gcov option whenever gcov supports it, this - forces gcov to use a whole pathname as a filename for .gcov files. So in cases - of quite large pathnames, gcov isn't able to create .gcov files and hence - geninfo can't get any data. The fix replaces usage '--preserve-paths' with - '--hash-filenames' when it is available. - - Signed-off-by: Igor Ignatev <igor.v.ignatiev@gmail.com> - -commit 04335632c371b5066e722298c9f8c6f11b210201 -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Fri Jan 11 13:53:33 2019 +0100 - - geninfo: Fix "Can't use an undefined value" error - - When run on data for source code that causes gcc 8 to generate - artificial functions, geninfo emits warnings and eventually aborts - processing: - - geninfo: Use of uninitialized value in hash element at - /usr/local/bin/geninfo line 3001. - geninfo: Can't use an undefined value as an ARRAY reference at - /usr/local/bin/geninfo line 2889. - - This problem was introduced by commit 9aa0d14a ("geninfo: Ignore - artificial functions during --initial"). It is the result of an - incomplete removal of artificial functions from internal data. - - Fix this by explicitcly removing known artificial functions after - parsing of graph files completes. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - Reported-by: Steven Peters <scpeters@osrfoundation.org> - -commit 9aa0d14af4446ef46d80356849a97bc961a91f97 -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Thu Jan 10 13:20:15 2019 +0100 - - geninfo: Ignore artificial functions during --initial - - Graph files generated by gcc 8 may contain "artifical" functions that do - not exist in a source file. geninfo incorrectly generates coverage data - for these functions when run with option --initial. - - Fix this by filtering out artifical functions when generating initial - coverage data. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - Reported-by: Marcin Konarski <marcin.konarski@codestation.org> - -commit 1e0df571198229b4701100ce5f596cf1658ede4b -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Thu Jan 10 11:39:07 2019 +0100 - - geninfo: Fix data collection for files containing templates - - When using gcc 8, lcov/geninfo produces corrupt coverage output for - source code that contains templates or other constructs that cause gcov - to produce multiple versions of output for some lines and branches. - - This is caused by an incorrect check for duplicate output in function - read_gcov_file() that is triggered when a template consists of multiple - lines, or contains branches. - - Fix this by ensuring that duplicate lines in per-instance gcov output are - correctly ignored. Only the initial occurrence of each line containing - the combined coverage of all instances will be processed by geninfo. - - Note that for branch coverage, gcov doesn't provide a combined view and - geninfo processes all branches provided. This should not be a problem - though as genhtml will combine the branch data when generating HTML - output. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - -commit abd8bed2b013334d4ef978abadbfff6cc6f3d55d -Author: MarcoFalke <falke.marco@gmail.com> -Date: Tue Jan 8 12:49:00 2019 +0100 - - genhtml: Unconditionally include anchor for each named line - - This helps with referencing the line in the html when sharing links. - - Signed-off-by: MarcoFalke <falke.marco@gmail.com> - -commit 28675dc7564aaa1ad231a7ac23106512a3956d68 -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Tue Dec 18 13:07:58 2018 +0100 - - genhtml: Use gmtime for SOURCE_DATE_EPOCH conversion - - By changing that localtime to gmtime the "Known bug" section of the - commit message can be removed. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - Suggested-by: Bjørn Forsman <bjorn.forsman@gmail.com> - -commit 180286bec651928c41de4d6ce3a8760678b38f60 -Author: Bjørn Forsman <bjorn.forsman@gmail.com> -Date: Tue Dec 4 14:30:28 2018 +0100 - - genhtml: honor the SOURCE_DATE_EPOCH variable - - Implement the SOURCE_DATE_EPOCH specification[1] for reproducible - builds. If SOURCE_DATE_EPOCH is set, use it as timestamp instead of the - current time. - - In this context, reproducible builds means reproducible HTML coverage - reports. - - Known bug: the specification[1] says to defer converting the timestamp - to local timezone at presentation time. This is currently not happening; - it's converted at build time. - - [1] https://reproducible-builds.org/specs/source-date-epoch/ - - Signed-off-by: Bjørn Forsman <bjorn.forsman@gmail.com> - -commit 41e07cadeeae3054ac22202d5b0b0f0ef6e26467 -Author: Bjørn Forsman <bjorn.forsman@gmail.com> -Date: Tue Dec 4 14:30:27 2018 +0100 - - Tolerate CDPATH being set - - If CDPATH is set, cd will print the path it enters, resulting in TOOLDIR - containing the path twice, separated by a newline. - - Signed-off-by: Bjørn Forsman <bjorn.forsman@gmail.com> - -commit a3bbe8f0398a3c36b4228cc173e4739d27a863e1 -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Mon Dec 10 13:58:10 2018 +0100 - - CONTRIBUTING: Clarify patch format requirements - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - -commit e6750800fe4cb89eda1ff80b7a5fe70fe87ede36 -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Tue Nov 13 17:28:17 2018 +0100 - - geninfo: Fix accounting of basic blocks in exceptional paths - - Basic blocks that are not executed and are only reachable via - exceptional paths are marked with a '%%%%%' marker in the GCOV output of - current GCC versions. Fix geninfo to also recognize this marker. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - Reported-by: trotux (github user) - -commit 94eac0ee870e58630d8052dca1181b0cf802525f -Author: Peter Oberparleiter <oberpar@linux.ibm.com> -Date: Mon Jul 16 13:24:58 2018 +0200 - - lcov: Fix branch coverage summary - - When combining two data files A (without branch coverage data) and B - (with branch coverage data), lcov will incorrectly report no branch - coverage data for the resulting file in program output, even though the - resulting file contains branch coverage data. This only happens when A - is specified first during the add operation. - - This is due to a bug in lcov that loses the correctly combined branch - coverage data internally in function brcount_db_combine() when its first - parameter is undefined. Fix this by ensuring that the first parameter is - an empty hash reference instead. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.ibm.com> - -commit a5dd9529f9232b8d901a4d6eb9ae54cae179e5b3 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Wed Mar 7 14:18:55 2018 +0100 - - geninfo: Add gcc 8 support - - Fix errors and incorrect data when trying to collect coverage data - for programs compiled with gcc 8. - - Covers the following gcov-related changes in gcc: - - .gcov-file format: - - Line coverage data can appear multiple times for the same line - - Line coverage count can be suffixed by '*' to indicated unexecuted - basic blocks in that line - - .gcno-file format: - - new header field 'support unexecuted blocks flag' - - new function record fields 'column number', 'ending line number', - and 'compiler-generated entity flag' - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit c30d88a3a8096dbb3f968de999480c3dc2dedb5f -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Tue Jan 30 15:12:09 2018 +0100 - - genhtml: Implement option to show miss counts - - Add new command line option --missed that can be used to show the - number of missed lines, functions, or branches. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 999abf2447b4df373b135dc3f8ee317350bd95f8 -Author: Benoit Belley <Benoit.Belley@autodesk.com> -Date: Fri Oct 6 10:01:28 2017 -0400 - - Adding the --include and --exclude options to lcov and geninfo - - * The --include command-line option allows the user to specify a regular - expression for the source files to be included. The command-line - option can be repeated to specify multiple patterns. The coverage - information is only included for the source files matching at least - one of the patterns. - - The "lcov --capture --include" (or "geninfo --include") option is - similar in functionality to the "lcov --extract" command-line - option. But, by directly using applying the pattern while capturing - coverage data one can often avoid having to run "lcov --extract" as a - second pass. - - * The --exclude command-line option allows the user to specify a regular - expression for the source files to be excluded. The command-line - option can be repeated to specify multiple patterns. The coverage - information is excluded for source files matching at least one of the - patterns. - - The "lcov --capture --exclude" (or "geninfo --exclude") option is - similar in functionality to the "lcov --extract" command-line - option. But, by directly using applying the pattern while capturing - coverage data one can often avoid having to run "lcov --remove" as a - second pass. - - * On one of our code base at Autodesk, this speeds-up the generation of - HTML code coverage reports by a factor of 3X. - - Signed-off-by: Benoit Belley <benoit.belley@autodesk.com> - -commit b6a11368c3cdc86c4e147ccd8e539918dfe37900 -Author: Ziqian SUN (Zamir) <zsun@redhat.com> -Date: Wed Jul 19 10:58:24 2017 +0800 - - Resolve some rpmlint issue in SPEC. - - Following messages reported by rpmlint on RHEL is fixed by this patch: - lcov.src: W: invalid-license GPL - lcov.src:9: W: hardcoded-path-in-buildroot-tag - /var/tmp/%{name}-%{version}-root - lcov.src: E: specfile-error warning: bogus date in %changelog: Fri Oct 8 - 2002 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) - lcov.noarch: W: non-conffile-in-etc /etc/lcovrc - - Signed-off-by: Ziqian SUN (Zamir) <zsun@redhat.com> - [oberpar@linux.vnet.ibm.com: Corrected license to GPLv2+] - -commit a77a7628ef5377c525a0d4904cc0b73eeede4d7c -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Fri Apr 7 15:43:28 2017 +0200 - - genhtml: Reduce path resolution overhead - - Reduce overhead when reading coverage data files by consolidating - calls to Cwd:cwd(). - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 526c5148ac0add40ef1224d2cdabdec73ce3f899 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Fri Apr 7 15:37:52 2017 +0200 - - genhtml: Reduce load times for complex coverage data files - - genhtml uses a significant amount of time loading coverage data files - containing complex branch coverage data (i.e. data with a large number - of branches per basic block). Most of this time is spent storing - branch coverage data in a vector-based data representation, with an - unnecessary amount of cross-checking being done for existing branch - data. - - Fix this by replacing the vector based data representation by two - separate representations, scalar for storage and hash for processing, - and by moving cross-checking out of the hot path. This results in a - significant speedup at the cost of a minor increase in memory usage. - - Test results for "make -C genhtml_output/ SIZE=large": - - Original: - 6 tests executed, 6 passed, 0 failed, 0 skipped (time 768.4s, mem - 893.8MB) - - Patched: - 6 tests executed, 6 passed, 0 failed, 0 skipped (time 202.3s, mem - 908.10MB) - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 0f07133f184af6670bdf1edf39fca9d2e90e9ad2 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Fri Apr 7 14:38:22 2017 +0200 - - test: Add self-tests for genhtml - - Add some tests for checking basic functionality of genhtml. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 544a6951db25679792bb0648006a897ea564d883 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Fri Apr 7 14:32:47 2017 +0200 - - genhtml: Ensure stable block order in branch output - - Sort order of basic blocks in output of branch coverage data. This - allows for a better comparison of output between test cases. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 477957fa4c6c104d5842911682ec17d6ad2d2980 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Thu Apr 6 12:28:11 2017 +0200 - - lcov: Reduce load times for complex coverage data files - - lcov uses a significant amount of time loading coverage data files - containing complex branch coverage data (i.e. data with a large number - of branches per basic block). Most of this time is spent storing - branch coverage data in a vector-based data representation, with an - unnecessary amount of cross-checking being done for existing branch - data. - - Fix this by replacing the vector based data representation by two - separate representations, scalar for storage and hash for processing, - and by moving cross-checking out of the hot path. This results in a - significant speedup at the cost of a minor increase in memory usage. - - Test results for "make test SIZE=large": - - Original: - 17 tests executed, 17 passed, 0 failed, 0 skipped (time 1883.9s, mem - 2459.0MB) - - Patched: - 17 tests executed, 17 passed, 0 failed, 0 skipped (time 283.6s, mem - 2544.2MB) - - Note that this fix only applies to the lcov tool. The same work is - necessary for genhtml. - - This approach was inspired by a patch by creich.3141592@gmail.com. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 3b397a3f3acdb62080e8366130758cb34703cfbf -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Thu Apr 6 09:01:36 2017 +0200 - - test: Improve test framework - - Various improvements to lcov's self-test framework: - - Add test case for lcov --diff - - Add new verbosity level - - Enable normalization of coverage data files from stdin - - Fix lcov_add_concatenated4 test name - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 53a6ce8ef604173b6de874a534a30121392d7cd0 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Thu Mar 30 15:42:56 2017 +0200 - - lcov: Add self-tests - - Add some tests for checking basic functionality of lcov. To run these - tests, type: - - make test - - in either the top-level directory, or the test/ sub-directory. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 9753d5c0da107919537e91e504551e4ab3bccc2f -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Thu Mar 30 15:31:34 2017 +0200 - - lcov: Fix output on stderr for --summary - - Some functions of lcov erroneously print informational output to stderr - instead of stdout as expected. Fix this by inverting the "to_file" logic - in lcov to a "data_stdout" logic. Affected functions are --summary, - --reset and --list. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 25f5d38abad20eeaa407f62f53c3c00dfbbd0bf3 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Mon Mar 6 09:51:00 2017 +0100 - - lcovrc.5: Add genhtml_demangle_cpp default and CLI reference - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 66db744a1d63c5d3b1dee2d8a2ce76e6e06c7255 -Author: Katsuhiko Nishimra <ktns.87@gmail.com> -Date: Fri Mar 3 17:47:48 2017 +0900 - - Support passing demangle-cpp option via lcovrc - - This patch allows users to passing the demangle-cpp option to genhtml - via lcovrc, alongside with CUI. - - Signed-off-by: Katsuhiko Nishimra <ktns.87@gmail.com> - -commit b6fb452addaa6a33dcb37c101879b8b5e1e0c34c (tag: v1.13) -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Mon Dec 19 15:20:40 2016 +0100 - - lcov: Finalize release 1.13 - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit daca8d9febe52ccf1976240a3b48ffc350dec902 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Mon Dec 19 14:36:00 2016 +0100 - - geninfo: Fix 'unexpected end of file' error - - Use the compiler version as stored in the .gcno file to determine if - the file contains function records with split checksums. This fixes - the following problem that can occur when lcov is run using a gcov - tool of GCC version 4.7 and above on .gcno files compiled with a - version below 4.7: - - # lcov -c -d . -o test.info --initial - [...] - geninfo: ERROR: test.gcno: reached unexpected end of file - - Also add missing lcov version to --debug output. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit a90d50e97cb49ea712c94d91cdef1cc21a3c7986 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Wed Dec 14 11:00:08 2016 +0100 - - lcov: Remove use of install -D option - - Some versions of the install tool don't support the -D option, causing - a 'make install' call to fail. Fix this by replacing the -D option with - two calls to install, first to create all target directory components, - then to install the actual files. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - Reported-by: <deanyang@tencent.com> - -commit 6ec3f2398d22e605c1a8019541fb32d26d18044b -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Fri Oct 7 09:47:35 2016 +0200 - - genhtml: Fix warning with small genhtml_line_field_width - - On systems with Perl versions 5.21 and above, genhtml prints a warning - similar to the following during processing: - - genhtml: Negative repeat count does nothing at bin/genhtml line 3854, - <SOURCE_HANDLE> line 4. - - This is due to size calculations resulting in a negative number of - padding characters when genhtml_line_field_width is lower than the size - of the strings to pad (9). Fix this by disabling padding in these cases. - - Reported-by: xaizek@openmailbox.org - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit d7cc7591b3a7cc1ec95371d04e4fc46f10b3fd54 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Tue Oct 4 09:50:52 2016 +0200 - - geninfo: Fix gcov version detection for XCode 8.0 - - The LLVM gcov version included in XCode 8.0 reports its version in a - format that is not understood by geninfo, resulting in the wrong format - of coverage data files being expected. Fix this by reworking gcov - version detection in geninfo to be more robust. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 68320d932c5ee5537ae1c287fe52603ae2fecf8c -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Mon Aug 22 15:54:56 2016 +0200 - - lcov: Update installation mechanism - - Change default installation location to /usr/local to prevent - conflicts with files installed by package managers (reported by - Gregory Fong). To achieve this, rename PREFIX to DESTDIR and - introduce actual PREFIX Makefile variable and update spec file - to install packaged files to previous locations. - - Also fix spec file to not announce ownership of system directories - (reported by and based on patch by Jiri Kastner <jkastner@redhat.com>). - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 04a3c0ed1b4b9750b2ac5060aac0e6d5a3b9da7f -Author: Benoit Belley <benoit.belley@autodesk.com> -Date: Mon Apr 4 18:16:54 2016 -0400 - - Pass --no-strip-underscore to c++filt on OS X - - * The --no-strip-underscope flag is necessary on OS X so that symbols - listed by gcov get demangled properly. - - From the c++filt man page: "On some systems, both the C and C++ - compilers put an underscore in front of every name. For example, the - C name "foo" gets the low-level name "_foo". This option tells c++filt - not to remove the initial underscore. Whether c++filt removes the - underscore by default is target dependent." - - Signed-off-by: Benoit Belley <benoit.belley@autodesk.com> - -commit 632c25a0d1f5e4d2f4fd5b28ce7c8b86d388c91f -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Tue Mar 8 10:51:51 2016 +0100 - - lcov: Fix output files being created in / directory - - When a warning is emitted by lcov before creating an output file, - e.g. when a negative coverage count was found while combining - tracefiles, lcov tries to create the output file in the root - directory (/) instead of the current working directory. - - This is a result of lcov's warn handler calling a temp file cleanup - routine that changes directories to / before trying to remove its - temporary directory. - - Fix this by removing the temp cleanup call from the warn handler. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit e32aab1b4c85503a6592a91326c4b362613e1d66 -Author: Gabriel Laskar <gabriel@lse.epita.fr> -Date: Wed Feb 10 09:56:18 2016 +0100 - - lcov: Fix --remove pattern matching - - The --remove option of lcov now consider the pattern passed as parameter - as a full path, and not only a part of the filename. - - This behavior was discovered by using AX_CODE_COVERAGE[1] m4 macro from - a directory in $HOME/tmp. The macro itself calls lcov with - `--remove "/tmp/*"`. - - [1]: https://www.gnu.org/software/autoconf-archive/ax_code_coverage.html - - Signed-off-by: Gabriel Laskar <gabriel@lse.epita.fr> - -commit 79e9f281ea893b2f6498b4bad79173b1414aa055 -Author: Reiner Herrmann <reiner@reiner-h.de> -Date: Fri Oct 30 20:26:59 2015 +0100 - - lcov: use UTC to get timezone-independent date - - The date is used for updating the time inside manpages. - If localtime is used, the date could vary depending on the user's - timezone. To enable reproducible builds, UTC is used instead. - - Signed-off-by: Reiner Herrmann <reiner@reiner-h.de> - -commit de33f51b49dc6d01a285aa73990f03e7d982beb2 (tag: v1.12) -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Mon Oct 5 17:37:40 2015 +0200 - - lcov: Finalize release 1.12 - - - Use full git describe output as tool version - - Update version numbers and last-changed-dates in man pages, - spec and README file - - Replace static CHANGES file with git log - - Switch Makefile logic to use mktemp for generating a temporary - directory - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 1ad4f7779b7721e311e552209e110e08bbf18fa1 -Author: Denis Abramov <abramov.denis@gmail.com> -Date: Mon Sep 21 09:29:20 2015 +0200 - - geninfo: Added support for Xcode 7.0 gcov version handling - - With Xcode 7.0 LLVM gcov keeps version information on the first line. - E.g. gcov --version yields: Apple LLVM 7.0.0 (clang-700.0.65) - - Signed-off-by: Denis Abramov <abramov.denis@gmail.com> - -commit c3602ea8e598deda4afff603bb123caa98eef159 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Mon Aug 3 11:05:51 2015 +0200 - - genhtml: Allow prefix paths with spaces - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit a3572971367198ef0febe476052640bd09bec931 -Author: Gilles Gouaillardet <gilles@rist.or.jp> -Date: Thu Jul 30 14:11:57 2015 +0900 - - genhtml: support a comma separated list of prefixes - - the --prefix option of genhtml now takes a comma separated list of prefixes - instead of a single prefix. - this can be required when running lcov vs projects configure'd with VPATH - and in which source files are both in the source and build directories. - - Signed-off-by: Gilles Gouaillardet <gilles@rist.or.jp> - -commit 997f32ae85717cd47d2305d7cd7ccce3ffa1abe6 -Author: Gilles Gouaillardet <gilles@rist.or.jp> -Date: Tue Jun 23 14:28:22 2015 +0900 - - Fix find command line - - find xxx -name \*.gcda -type f -o type l - does return : - - all files with the .gcda suffix - - all symbolic links - - the updated command line now returns - - all files with the .gcda suffix - - all symbolic links with the .gcda suffix - - Signed-off-by: Gilles Gouaillardet <gilles@rist.or.jp> - -commit 533db4e78b54ae01e023d00c1fec5dddaaaf37e6 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Wed Jun 17 17:54:20 2015 +0200 - - lcov: Fix capture for package files containing graph files - - Depending on whether package files contain graph files, data should be - collected from the unpacked package file directly, or from the build - directory after linking data files. This approach fixes problems when - capturing coverage data via a package from a directory containing graph - files. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit a2a8b376ec5e9e5082a0cbb935137d6a8f526870 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Wed Jun 17 17:34:33 2015 +0200 - - lcov: Fix .build_directory file not being deleted - - Using option --to-package while capturing coverage data creates a - temporary file named ".build_directory". Currently this file is not - properly removed at the end of processing due to a changed CWD. This - patch fixes this problem by reverting to the original CWD before trying - to remove the temporary file. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit b9de825f1fe018f381c8859ee0f3f4af15122c7a -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Tue Jun 16 13:53:00 2015 +0200 - - lcov: Enable userspace package capture with only data files - - Previously lcov's --from-package capture mechanism required - that .gcno files and source were present on the test machine. - - This patch modifies --from-package capturing to work when - only .gcda files are present in the package captured on the - test machine. It works by linking the .gcda files collected - on the test machine into their natural location on the build - machine. This requires existing .gcda files to be removed. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 0e4f0908aed3e1a071d5435c36c18cd493f0c309 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Tue Jun 16 13:33:54 2015 +0200 - - lcov: Make package handling more robust - - Apply some changes to --from-package and --to-package handling - to better handle failures: - - - Abort if tar tool is not available - - Abort if no data file is found in package file - - Ensure that temporary directories can be deleted - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit f87d980929a5a06d49d0a6856f6c3314418c27ef -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Tue May 12 17:28:44 2015 +0200 - - genhtml: Rework c++filt name demangling - - When running genhtml with command line option --demangle-cpp, do not - merge function call data based on demangled function names. Instead mark - duplicate function entries in the function view with a version suffix - (.<number>). This resolves problems with entries for functions that - demangle to the same name, but begin on different lines according to GCC - (e.g. virtual destructors). - - Reported-by: Lukasz Czajczyk <lukasz.czajczyk@gmail.com> - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 2e872175cbba2c09c9025da2660edf0b4abb55cb -Author: Daniel Fahlgren <daniel@fahlgren.se> -Date: Wed Apr 22 15:17:10 2015 +0200 - - geninfo: make line exclusion markers configurable - - This patch exposes the variable $excl_line and $excl_br_line so they can - be set in the configuration file. It is not always possible to add the - exclusion markers to the code with reasons like third party code, - company policy, legacy code, no commit access etc. - - One obvious use case is to exclude assert() from the branch coverage and - abort() from line coverage. They are never meant to be triggered unless - something is wrong. Other use cases can be custom error handling macros - or macros that depend on endianness, like htons(). - - Signed-off-by: Daniel Fahlgren <daniel@fahlgren.se> - -commit 10b11eaa178976d1433007adb2188d05b8605be6 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Mon Nov 10 17:17:23 2014 +0100 - - geninfo: Ignore empty .gcno files with --initial - - Some versions of GCC create empty .gcno files which cause geninfo - to abort processing with an error message: - - geninfo: ERROR: dummy.gcno: reached unexpected end of file - - Fix this problem by skipping empty .gcno files. - - Reported-by: Maarten Hoes <hoes.maarten@gmail.com> - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit f9d8079646aa906518c4ab7d326504e6837532a7 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Mon Nov 10 16:54:08 2014 +0100 - - lcov: Fix warning when specifying --rc - - Current Perl versions report the following warning when using the --rc - option of lcov: - - lcov: Use of each() on hash after insertion without resetting hash - iterator results in undefined behavior - - Fix this warning by not modifying the hash variable that is being - iterated on. Also add the missing whitespace fix-up of --rc parameters - to genhtml. - - Reported-by: Maarten Hoes <hoes.maarten@gmail.com> - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 2a634f6caa98f979606189ec3ee98f4cac270b97 -Author: Philip Withnall <philip.withnall@collabora.com> -Date: Mon Nov 10 14:58:34 2014 +0000 - - genhtml: Support relative source filenames in SF keys - - Some tools which generate .info files generate relative filenames for - the ‘SF’ keys. For example, nodeunit’s lcov output does. When genhtml is - run with --output-directory, it calls chdir() which breaks relative - lookup of the source files. Fix that by resolving all source filenames - to absolute paths when loading an info file, resolving any relative ones - using the info file’s path as a base. - - Signed-off-by: Philip Withnall <philip.withnall@collabora.co.uk> - -commit b4344c6a5d3c434ca0d801c197a09cfdeecb3f32 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Fri Sep 26 13:11:18 2014 +0200 - - man: Add description for --precision and genhtml_precision - - Add man page sections for genhtml's command-line option --precision - and lcovrc configuration setting genhtml_precision. Also add an - example configuration setting in lcovrc. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit aa1217412f1e8b540010fea5ca9844b9e4699e54 -Author: Euccas Chen <euchen@qti.qualcomm.com> -Date: Fri Sep 26 12:53:29 2014 +0200 - - genhtml: Implement option to specify coverage rate precision - - Add command line support and config file support for specifying the - coverage rate precision, valid precision range: [1,4]. - - Signed-off-by: Euccas Chen <euchen@qti.qualcomm.com> - -commit 4d4eba1a8b5e7d2a6c5e93c0a50264da1a5c5540 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Wed Jun 25 09:41:59 2014 +0200 - - get_version.sh: Remove - characters from release string - - Replace - with . in release strings to fix the following build - error in the dist Makefile target: - - error: line 4: Illegal char '-' in: Release: 4-g1d44b2a - make: *** [rpms] Error 1 - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit ffbd3e08cc0871842b2205b0b73c2ae8f3ad02e8 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Wed Jun 25 09:25:50 2014 +0200 - - genhtml: Improve demangle error message - - Improve error message that is shown when there are mangled function name - entries on different lines that demangle to the same clear text function - name. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 1d44b2a090aa933b15e4cafc1a440ccb390df92e -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Tue Jun 24 17:45:34 2014 +0200 - - geninfo: Fix error when using --demangle-cpp - - Using genhtml's --demangle-cpp option on data produced with recent GCC - versions (at least 4.8 and 4.9) can result in an error message similar - to the following: - - genhtml: ERROR: Demangled function name _ZN3subD2Ev maps to different - lines (5 vs 4) - - The reason for this error is an unexpected sequence of lines records - in a .gcno file. These records mention line numbers as belonging to a - function which occur before the initial line number of that function - as reported by the corresponding function record. - - Fix this problem by retaining the order of lines belonging to a function - as found in the .gcno file. This way geninfo will consistently use the - initial line number as reported by the function record when merging - function data during the demangling process. - - Reported-by: Alexandre Duret-Lutz <adl@lrde.epita.fr> - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 566e5ec7e69a03612e1ed4961779d939af180d66 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Wed Jun 18 16:05:29 2014 +0200 - - lcov: Remove unused files - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit c76172bfe630520e217ecc0bca8f18481c4c33b0 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Wed Jun 18 16:01:05 2014 +0200 - - README: Fix typo - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit a6b10a41056cd10c7b735e259fee81f1865c2109 -Author: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> -Date: Wed Jun 18 15:50:04 2014 +0200 - - lcov: Remove CVS artifacts - - Replace CVS specifics in the build environment and tools source with - Git mechanisms: - * CONTRIBUTING and README file now refer to github for the primary - source location - * When run from a Git repository, the tools dynamically determine the - Git version using 'git describe' - * When installed into the file system, the version information is - fixed with the current Git version - * When preparing distribution files, the version at the time of - preparing the files is written to file ".version" - - Also add a .gitignore file to filter out the most frequent temporary - file types. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit fa2a991cf6fad37fec7650b95be705df143e058a (tag: v1.11) -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri May 23 08:56:17 2014 +0000 - - lcov: finalizing release 1.11 - -commit e2729beea0d7769ef0e992c27a294b0742a6ac77 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri May 23 08:47:10 2014 +0000 - - CHANGES: update - -commit 866d187602bfc2e3a8199f4e9e9430ef38f106a8 -Author: Jeffrey Hutzelman <jhutz@cmu.edu> -Date: Tue May 20 14:12:55 2014 +0000 - - lcov: Sort branches in unnamed blocks first - - When processing branch coverage data, consider branches in "unnamed" - blocks to come before other blocks on the same line, so that they - appear in the correct order in HTML output. - - This is accomplished by using block number -1 for unnamed blocks, - instead of 9999 as was previously done. In branch data vectors, this - is reprsented by the value $BR_VEC_MAX, which is defined to be the - largest value representable in the field width used. This same value - is also used in .info files, for backward-compatibility with regular - expressions used to parse these files. As a result, .info files - generated by versions of lcov with this change can be read by older - versions, though branch results will still appear out of order. - - Signed-off-by: Jeffrey Hutzelman <jhutz@cmu.edu> - -commit 17c0edec32193b9e8058908447d3eb403d76c8de -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu May 15 10:23:45 2014 +0000 - - lcov: Update man page - - Add missing description for command line parameter value. - - Reported-by: sylvestre@mozilla.com - -commit c0958139e015805cce15b60b740c735690ad4002 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Apr 14 12:14:55 2014 +0000 - - genhtml: Implement option to allow HTML in test description - - Add lcovrc directive genhtml_desc_html to allow using HTML markup in - test case description text. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 4f2c3aefcfcf816806da83a8609bd743eb227d37 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Apr 14 11:24:05 2014 +0000 - - genhtml: Check for proper description file format - - Ensure that description files contain test name lines before test - description lines. This fixes a "use of uninitialized value" warning - in genhtml. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 3a68239905c28a7c3bfac52172a254872d6a7aa7 -Author: Jonah Petri <jonah@petri.us> -Date: Mon Apr 14 11:06:21 2014 +0000 - - lcov: make geninfo compatible with LLVM's gcov - - These changes are needed to make geninfo compatible with LLVM's gcov: - * Use --version rather than -v to probe version info - * Convert LLVM gcov version numbers to the GCC gcov version they emulate - * Translate short options into their equivalent long option capabilities - - Signed-off-by: Jonah Petri <jonah@petri.us> - -commit a74bdeeae0383b197b1dafa44d01a54129fb3d7c -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 8 13:26:04 2014 +0000 - - genhtml: Reduce hash copying while adding up files - - Reduce copying effort and memory usage. Based on similar patch for - lcov by olly@survex.com. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit c6b4d91fdf667cfca17213742e2e04f6281ebed4 -Author: Olly Betts <olly@survex.com> -Date: Wed Jan 8 13:14:05 2014 +0000 - - lcov: Avoiding copying hashes passed to add_counts function - - This patch reduces memory usage - without it lcov was failing every time - for me with out of memory errors in a VM with 1GB of RAM and 1GB of - swap, but with it lcov completes every time. - - It's presumably also faster to avoid these copies. - - Signed-off-by: Olly Betts <olly@survex.com> - -commit cf6f2e685510da62bd2eb1f386f71d57c41f4594 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Dec 13 16:09:05 2013 +0000 - - geninfo: Tolerate garbage at end of gcno file - - Some versions of gcc produce garbage at the end of a gcno file - when recompiling a source code file after removing some lines. - - This patch makes geninfo's gcno file parser more robust by assuming - end-of-file when it finds a record that extends beyond the end-of-file. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 14286b29d076208452da6021c792ebf43552ac2c -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Dec 13 15:23:27 2013 +0000 - - geninfo: make gcov tool version detection more robust - - Don't consider gcov tool version information in parenthesis when - determining the gcov tool version. This fixes problems where the - version string contains a different version number in parenthesis - before the actual gcov version. - - Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> - -commit 0bde87338cd155af46804d77701c93ef263c3d53 -Author: Sebastian Stigler <s_stigler@gmx.de> -Date: Fri Dec 13 15:09:58 2013 +0000 - - geninfo: add exclude marker for branch coverage - - Sometimes it can be helpful to generally use branch coverage but to - disable it for some lines of code without excluding the line or function - coverage too. - - For example if you make heavily use of assertions in your code (which is - generally a good idea) you will see that for each 'assert(...)' exist - one branch which is taken and one that is not. Similarly you can see the - same phenomenon for 'delete' in C++ code. - - If you use the 'LCOV_EXCL_LINE' marker in such a situation both of these - branches will be omitted from the output. But in doing so, you loose the - ability to determine if this peace of code is genuine 'dead code' or not - because the line coverage is omitted too. - - The newly introduces 'LCOV_EXCL_BR_LINE', 'LCOV_EXCL_BR_START' and - 'LCOV_EXCL_BR_STOP' marker address this problem. The usage is similar to - the 'LCOV_EXCL_LINE' etc. markers. - - Signed-off-by: Sebastian Stigler <s_stigler@gmx.de> - -commit 119be727596f567e83b03de384b4150b926911a3 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Dec 12 14:58:44 2013 +0000 - - geninfo: Fix handling of non-english locales - - geninfo expects gcov output in the default C locale. This isn't always - given, for example when running in an environment where variable - LANGUAGE is set to a non-english locale. In such cases gcov output - cannot be correctly parsed, resulting for example in the absence of - branch coverage data. - - gcov uses gettext() for writing internationalized messages. The info - page for gettext mentions the order in which locale-defining - environment variables are evaluated: - - LANGUAGE - LC_ALL - LC_MESSAGES - LANG - - In addition, gettext implements special handling where LC_ALL=C takes - precedence over LANGUAGE. - - geninfo currently only specifies LANG=C. Fix the issue by specifying - LC_ALL=C instead. - - Based on fix suggestion by Sebastian Stigler. - - Reported-by: Sebastian Stigler <s_stigler@gmx.de> - -commit 0f7bb3ebc8487b83ce9b7047c81a3655135876ea -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Dec 9 15:49:35 2013 +0000 - - lcov: Added contribution guidelines - -commit f83688fe27f133ef02e9ab47a435d6a5d2074932 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 2 07:29:20 2013 +0000 - - geninfo: fix --no-external not working with --initial - - When running lcov --capture --initial together with --no-external. - the --no-external has no effect. Fix this by applying the external - filtering also for graph files. - - Reported-by: malcolm.parsons@gmail.com - -commit 6a8a678046bd75aa81d30484b1817425022d71e5 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jul 1 11:49:46 2013 +0000 - - lcov: fix --config-file not being passed to geninfo - - Calling lcov to capture coverage data while specifying --config-file - will result in the configuration directives of that file not being - used during data collection. - - Fix this by ensuring that --config-file is passed on to geninfo. - - Reported-by: liuyhlinux@gmail.com - -commit c3be5b6859ef280b469b6b75cf4709fc35f91ced -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu May 2 11:02:24 2013 +0000 - - lcov: fix whitespace handling in --rc command line option - - Specifying blanks around --rc options results in the options not - being correctly recognized, for example: - - This doesn't work: - geninfo . -o - --rc="geninfo_adjust_src_path = /tmp => /usr" - - This works: - geninfo . -o - --rc="geninfo_adjust_src_path=/tmp => /usr" - - Fix this by automatically removing whitespaces at the start and end - of --rc options and values. - -commit 4699f8d391325335777ed234e388be2e2f87478c -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Apr 12 07:51:34 2013 +0000 - - README: improve usage hint - -commit 36e0539737198ad1bee51103f47842f13c575239 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Mar 13 10:28:07 2013 +0000 - - genhtml: add time to date string - - Add the current time to the date information in the HTML output - generated by genhtml. This way users can differentiate results when - creating HTML output multiple times a day. - - Based on patch by sylvestre@debian.org. - -commit 38fbe93c8cd8402be8e4821825fdeeaa23e8367c -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Feb 22 14:09:08 2013 +0000 - - geninfo: don't warn about missing .gcov files - - Newer versions of gcc remove .gcov files for source files that do - not contribute instrumented lines. Remove the - - WARNING: no data found for file.c - - warning that geninfo issues in this case. - -commit 29346542c30af221a2ffdfe097fbd858044b712a -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Feb 1 11:44:03 2013 +0000 - - genhtml: fix handling of user-specified prefixes with trailing / - - A trailing / in a user-specified prefix is not correctly recognized. - Fix this by removing any number of trailing / in a user-specified - prefix. Reported by ahmed_osman@mentor.com. - -commit 5241e2afadca5f172bd0b8cafe61e20d2153f0bf -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 30 11:46:42 2013 +0000 - - lcov: fix bug when converting function data in --diff operation - - When a patch is applied to a tracefile using command line option --diff - and the patch changes the list of functions, the operation aborts with - the following error: - - lcov: Use of freed value in iteration at lcov line 3718. - - Fix by applying missing calls to keys() when iterating function data - hashes. Reported by Nasir.Amanullah@us.fujitsu.com. - -commit 9ce8d8cb4f978eb80fb88ecafd52e869fab75d8f -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 25 16:30:25 2013 +0000 - - lcov/genhtml: fix outdated comment regarding data structure - -commit c85e73a36e3f8c4e7fab888ac1536bee94a6fe56 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 25 16:29:30 2013 +0000 - - genhtml: merge function data during demangling - - Merge function execution counts when multiple function names demangle - to the same name. - -commit 2dfafc99c1eccbb81066436845e06a868eb3c434 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 25 11:46:28 2013 +0000 - - genhtml: improve function table sorting - - In the function table view, the initial view should show the functions - sorted by execution count because - unlike with file names - the function - name is not a natural order for functions (the line number would be, - but that is not available). Also sort functions with the same execution - count alphabetically for a stable order. - - Base on a suggestion by paul.bignier@hotmail.fr. - -commit 331a29011709a27d2ec11c6cbd6ac51dfdaf70c6 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 23 16:52:06 2013 +0000 - - genhtml: consolidate calls to c++filt - - When using --demanglecpp, call c++filt only once instead of per - function. This approach can reduce the run-time for source files - with a lot of overloaded functions significantly. Based on idea - by olly@survex.com. - -commit 49b877160b1d28cd6c3d8332d5d47c9c74420070 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Jan 10 09:02:32 2013 +0000 - - geninfo: make empty data directories non-fatal - - Emit a warning when no data file is found in a data directory - to allow processing of additional directories. - - Based on suggestion by rich_drake@yahoo.com. - -commit 3836c162c2864ed180df7d80fa03c70d17102edc -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Nov 13 09:58:53 2012 +0000 - - geninfo: fix parsing of gcc 4.7 gcov format - - GCC 4.7 changes the gcov format for lines which can only be reached - by exceptions to "=====" instead of "#####". This results in the - following warning: - - geninfo: Argument "=====" isn't numeric in numeric gt (>) at geninfo - line 1281. - - Fix this by handling "=====" correctly. - -commit b932f94cc83c3df169c76689533336bba4de4dba -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Oct 10 09:14:17 2012 +0000 - - lcov.spec: back to CVS version - -commit 6af00fa26e1a91a39c873ff9fa6df7fb8830ec42 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Oct 10 09:12:42 2012 +0000 - - lcov.spec: fix Perl dependency - -commit 4eac16e93db328e86e44da40e3d5e96a0301d361 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Oct 10 08:36:16 2012 +0000 - - lcov: update CVS version to 1.11-pre1 - -commit b5c1bdddd1380be3ad12952ed2747df3744e227e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Oct 10 08:20:21 2012 +0000 - - lcov: finalizing release 1.10 - -commit 089861768a94d0f6e827539c828f19141092f529 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Oct 10 08:07:54 2012 +0000 - - CHANGES: update - -commit 9037de17458c5d9767d201bd0599d40347a9bc41 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Oct 10 08:07:01 2012 +0000 - - genhtml: handle source files in root directory gracefully - -commit 68dd0f19da0d8d6e82375e09b97f7ffc22847db4 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Oct 9 13:58:22 2012 +0000 - - geninfo: add automatic detection of base directory - - Add a heuristic to automatically determine the base directory - when collecting coverage data. This heuristic should cover many, - if not most cases of build systems moving files around during - compilation (e.g. libtool, automake, etc.). The heuristic can be - enabled or disabled using the configuration file directory - 'geninfo_auto_base'. - -commit 631d2b11bfde56ffca4568382abf5d90653c4141 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Oct 8 15:03:23 2012 +0000 - - geninfo: fix missing line data after last commit - -commit b1e14c4a1a0f3ccaad0c665f439624cf4588a68d -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Oct 8 13:02:45 2012 +0000 - - lcov: add missing help text for option --rc - -commit a432efff6ee8485ec0724aca4eae79a4c390a328 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Oct 5 15:53:09 2012 +0000 - - lcov: updated CHANGES file and copyright years - -commit 897322ecdb858f18e4a12f4716bbb08c067b6c9c -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Oct 5 15:20:41 2012 +0000 - - geninfo: fix warning about unhandled .gcov files - - gcov will sometimes create .gcov files that contain no instrumented - line. When geninfo reads .gcno files it filters out such files, - resulting in the following warning: - - geninfo: WARNING: cannot find an entry for #path#to#file.gcov in - .gcno file, skipping file! - - Avoid this warning by not filtering out non-instrumented lines. - -commit 37d381ae99a66f59ea55d966f1da13a726d2efe8 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Oct 5 15:09:58 2012 +0000 - - genhtml: fix source path prefix calculation - - Fix the following problems of the algorithm used to identify an - optimal source path prefix: - - the last two path components (filename and first parent - directory) are ignored when trying to identify the optimal - prefix - - if a path prefix matches a longer path prefix, the weight - of the filenames associated with the latter is incorrectly - attributed to the former - -commit 263de2b40e21193ef8d11e899eb55aa52b17225d -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Oct 5 12:00:57 2012 +0000 - - lcov: set default for branch coverage data to disabled - - Collecting branch coverage data can significantly slow down - coverage data collection and processing of data files. Assuming - that most users are more interested in line/function coverage, - change defaults to not collect/process branch coverage data. - - Users can still override this default using lcov_branch_coverage=1 - in the lcovrc file or command line option --rc lcov_branch_coverage=1 - -commit 7e04a152683ff66e24b87f2125474c6765d4524b -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Oct 5 11:49:30 2012 +0000 - - geninfo: fix problems with adjust_src_path option - - Fix the following problems with adjust_src_path: - - * specifying --compat libtool=on and geninfo_adjust_src_path - unexpectedly sets --compat libtool=off - * path components that are assembled from sub-directory names are - not correctly adjusted - -commit 74e4296b6e2a0b0f164c6828c28cc82449344f08 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Oct 5 08:23:06 2012 +0000 - - lcov: add setting to disable function and branch coverage - - Add two new configuration file settings: - - * lcov_function_coverage and - * lcov_branch_coverage - - When set to zero, lcov will skip the corresponding coverage data - type from being collected or processed, resulting in reduced - memory and CPU time consumption and smaller data files. - -commit 37bc1a1a5f721c6b88fff4c63121c1cbb794c14f -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Oct 2 14:29:57 2012 +0000 - - lcovrc: clarify meaning of geninfo_external in man page - -commit fc4b9e21efe8f3409d9b0b90cfe7a3e8bc59a74c -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Oct 2 09:12:38 2012 +0000 - - geninfo: fix processing of pre-3.3 gcov files - - When trying to collect coverage data for programs compiled with - GCC versions prior to 3.3, geninfo skips each data file with the - following warning: - - geninfo: WARNING: cannot find an entry for test.c.gcov in .bb file, - skipping file! - - Fix this by deriving the source code filename from the gcov filename - in case the gcov files do not follow the GCC 3.3 format. - - Reported-by: georgysebastian@gmail.com - -commit d1014dfcabfee2f305278a14ec8e5343e3889139 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 24 11:43:18 2012 +0000 - - lcov: fix problems with --rc option - - Fix error "Invalid option linkage for \"rc=s%\"" when running lcov - with an older version of the Getopt::Long module. Also pass --rc - options through lcov to geninfo. - -commit a9f08b79e2e7ec2b4a5c9ad27a077df8dfb46890 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Jul 24 15:41:38 2012 +0000 - - geninfo: implement rc option geninfo_adjust_src_path - - Provide a new lcovrc file option geninfo_adjust_src_path that users - can use to change incorrect source paths. - - Inspired by patch by ammon.riley@gmail.com. - -commit 108f805788590defda99fdf252bfb71cb749f31e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Jul 19 13:12:35 2012 +0000 - - lcov: implement command line option --rc - - Users can now use command line option --rc to override configuration - file directives. - -commit eeeeeca74706e88a9b8ecfef2bb3451957512e20 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 18 12:56:21 2012 +0000 - - lcovrc: add description for geninfo_compat setting - -commit f842e46149b48ff316e80f68f630bf94085e4d19 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 18 12:40:56 2012 +0000 - - lcov: improve --compat description - -commit 392a690ba31092857f7d21d0008783d87954ebce -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 18 12:13:00 2012 +0000 - - lcov: add missing documentation for --compat option - - Add missing sections in the geninfo and lcov man-pages for the - newly introduced command line option --compat. Also set the - default value for the hammer compatibility mode to 'auto' to - keep the behavior of previous releases. - -commit 691cab3e3aaebc295c2cfe91c43c6a7c48f1ec2b -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 18 10:40:12 2012 +0000 - - lcov: fix extra closing parenthesis in comment - -commit cef6f0ff8baa9b2b3dfb437463e7a88d3380b555 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Jul 17 11:37:13 2012 +0000 - - lcov: make 0%/100% exclusive to no/full coverage rate - - Ensure that coverage rates 0% and 100% are only used when no or all - lines/functions/branches are hit respectively. This approach is - implemented to allow better identification of boundary cases, and - to be in accordance with the behavior of the gcov tool. - - Based on suggestions by: Paul.Zimmermann@loria.fr and - vincent@vinc17.net - -commit 9cec8f7e332258c9128f1c53d61acb9f0bc17085 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 11 14:09:27 2012 +0000 - - geninfo: more improvements to the .gcno format auto-detection - - Suggestions by garnold@google.com: - - rename command line setting - - simplify logic - -commit 0bbca3bd0c1ad3e3d3fd0b6eebfc3afbbc212a85 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jul 6 14:29:27 2012 +0000 - - geninfo: rename compatibility setting to compatibility mode - -commit f30fb978662996e29517c733218292a91f5fd12b -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jul 6 09:03:27 2012 +0000 - - geninfo: improve detection of gcc 4.7 function records - - Suggestions by garnold@google.com: - - perform detection only once - - add warning in case detection is off but overlong strings are found - - Misc: - - add help text for --compat - - isolate detection heuristic into separate function - - rename corresponding compatibility setting to "gcc_4_7" - - allow "android_4_4_0" as alias for "gcc_4_7" - -commit 01321c3f170e5d24ffb3bb998441c99f5b775836 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 4 16:06:10 2012 +0000 - - geninfo: enable auto-detection of gcc-4.7 function record format - - gcc-4.7 introduced a modified function record format. This format - is in use by android toolchains and has also been ported to some - pre-4.7 versions of gcc. Introduce a heuristic-based auto-detection - to correctly handle .gcno files in these cases. - -commit d929600a0e2133168085e5ddea7ee832afd902b7 -Author: Martin Hopfeld <martin.hopfeld@sse-erfurt.de> -Date: Fri Jun 8 14:19:49 2012 +0000 - - geninfo: Make geninfo work more reliably on MSYS - - Using the lcov tools on Win7 with MSYS and MinGW 4.5.1/4.5.2 - raised some issues for us: - - geninfo created in the for one source file in the 'SF:' line - paths starting with a lowercase drive letter and sometimes - starting with uppercase drive letters. - - This lead to inaccurate coverage results on the MSYS platform. - - This patch fixes this issue. - -commit 5b2751854aa19e6443fdc5fecc139595988d1e99 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon May 7 16:04:49 2012 +0000 - - lcov: add perl version dependency to RPM spec file - - lcov CVS (1.10 pre) seems to be broken on MSYS with perl 5.6.1. - The issue is the following: - - genhtml: Unknown open() mode '>>&' at /usr/bin/genhtml line 5512. - - $> perl genhtml --version - genhtml: LCOV version 1.10 pre (CVS 1.58) - - $> perl --version - This is perl, v5.6.1 built for msys - - Fortunately perl v5.8.8 is available for MSYS and genhtml works like a - charm with that 'new' version. - - Reported-by: Martin Hopfeld <martin.hopfeld@sse-erfurt.de> - -commit 83957a145d243cad0f8060e4a9ccc6cb8ed8fc09 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Apr 10 11:48:52 2012 +0000 - - geninfo: add support for gcc 4.7 .gcno file format - - Based on patch by berrange@redhat.com. - -commit 91c91dbc63d1e880d106919300c2fb37737697b0 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 20 11:53:57 2012 +0000 - - lcov: add new command line option --compat - - Add new option to lcov and geninfo to specify compatibility settings. - - Supported settings: - libtool: same as --compat-libtool - hammer: gcc3.3 hammer patch compatibility - android_4_4_0: android toolchain 4_4_0 compatibility - -commit 9588355790a302da680eff2f664058f78439a03e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Aug 11 08:29:21 2011 +0000 - - lcov: fix problem with Objective-C functions - - Fix geninfo not recognizing function entries for Objective-C functions. - - Based on patch by abrahamh@web.de: - current version of lcov unfortunately not support Objective-C files. - In details the count of tested function is zero always and the annotated - lines have an offset by one if the Objective-C method have one ore more - arguments. - -commit e1acd78d1e88fe51aad96badf32555c470ee029b -Author: Martin Hopfeld <martin.hopfeld@sse-erfurt.de> -Date: Mon May 23 08:03:13 2011 +0000 - - geninfo: Make geninfo handle MinGW output on MSYS. - - This patch converts path mixtures from MinGW when running on MSYS to - correct MSYS paths. - - In solve_relative_path() an additional conversion step will be inserted - when running on MSYS. This will extract the drive letter and convert the - remaining path from Windows pathnames to Unix Paths, which are used by - MSYS. - - Additionally, if no drive letter is found, the (relative) path is - converted to Unix style. There may be the case where Windows and Unix - path separators are intermixed within one path string. - -commit ed161e3db5cd5a7c6c8b2113930c729f001cdd4e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Dec 16 08:11:22 2010 +0000 - - genpng: handle empty source files - - Generating an overview PNG image for an empty source code file fails. - Handle this case by assuming a single empty line when run for an empty - source code file. - - Reported by: sylvestre@debian.org - -commit 95e2c5c337d281b4e88144d95d29bbec183c8728 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Dec 7 08:40:09 2010 +0000 - - genhtml: add note to further explain branch coverage output - -commit b1c66916151dd4b20998c79f81edf174659ebb14 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Dec 7 08:29:45 2010 +0000 - - genhtml: fixed incorrect description of default coverage rates - -commit 1994be7d8ed472772b884063af74235f2f25ab39 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Nov 19 16:33:25 2010 +0000 - - geninfo: add missing man page sections - - Add sections describing options --derive-func-data and --no-markers to - the geninfo man page. - -commit 01a393ef76092e43ebd2d8bf7892ebf375481a84 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Nov 19 16:15:27 2010 +0000 - - geninfo: remove help text for unimplemented parameter - - Parameter --function-coverage was removed but the help text still - mentions it. Fix this by removing the option from the help text as - well. - -commit b92f99d9db0af131080c462300dc9baf292a8ff6 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Nov 19 16:00:22 2010 +0000 - - genhtml: handle special characters in file and directory names - - HTML special characters (e.g. '<') found in file or directory names are - not correctly shown in HTML output. Fix this by correctly escaping such - characters. - -commit 17e158d4569d25218e79901e2d8cd03bfc7752fc -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Nov 19 15:45:01 2010 +0000 - - gendesc/genhtml/geninfo/genpng/lcov: handle '<' in filenames - - Use 3-arg open mode to prevent that a special character (e.g. '<') - found in a user-specified filename interfers with the required open - mode for that file. - -commit b87e40e475c560bdc88206df4de6dc8cf094d91f -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Nov 19 15:11:53 2010 +0000 - - geninfo: ignore <built-in>.gcov files - - The gcov tool will sometimes create a file <built-in>.gcov for code - which was added by gcc itself during compilation. Since there isn't - any source available for such code, geninfo will fail. Fix this - by skipping these files while capturing code coverage data. - -commit 398d8f385423927b5675c1429f58c67b6a89a1a8 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Oct 28 14:17:57 2010 +0000 - - geninfo: add function comment - - Add comment explaining data structures used by function derive_data. - -commit f5c2072e0e7195d35455db50705884e7f6c5fbe5 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Oct 28 14:16:34 2010 +0000 - - geninfo: apply exclusion marker to derived function data - - When option --derive-func-data is used together with exclusion markers, - function data for excluded lines is still included. Fix this by - only deriving function data for lines which are instrumented and not - excluded. - - Reported by: bettse@gmail.com - -commit 82280b8a5a78e8a147c333c8850a556729d9d96d -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Aug 31 08:19:03 2010 +0000 - - geninfo: improve --debug output - -commit 6375a03010cb1bb22490b9d19a176188940e2f8b -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Aug 31 08:17:23 2010 +0000 - - gcov: add configuration file option to not use gcov's -a option - - lcov calls gcov while specifying its --all-blocks option to get more - detailed branch coverage data per line. It turns out that this option - is broken on many versions of gcov, resulting in an endless loop while - processing some gcov data files. There's also a slight performance - penalty when specifying -a. - - lcov users can opt to not use the -a option by setting configuration - option geninfo_gcov_all_blocks to 0 in the lcovrc file. - -commit 7706fb73ebef8060fbbd92c0e08b5d68a2cd284e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Aug 24 16:15:53 2010 +0000 - - lcov: add option to specify a configuration file - - Provide an option for users to specify a configuration file to lcov. - This option may be useful when there is a need to run several instances - of a tool with different configuration file options in parallel. - -commit a404dafc2da12608a936afeb095d68410fa49b0a -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Aug 23 16:14:37 2010 +0000 - - lcov: add option to display summary coverage information - - Provide an option for users to determine the summary coverage - information of one or more tracefiles. Example output: - - Summary coverage rate: - lines......: 26.0% (78132 of 300355 lines) - functions..: 34.9% (8413 of 24081 functions) - branches...: 16.9% (32610 of 193495 branches) - -commit 526b5b6a43f2b29f11eb02c1dd8f645293d8c295 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Aug 23 14:47:43 2010 +0000 - - lcov: add option to exclude external files - - Implement an option for users to specify that external source files - should be excluded when capturing coverage data. External source files - are files which are not located in the directories specified by the - --directory and --base-directory options of lcov/geninfo. - -commit c2255a0344648dc6eaef0189c53f345fdc70ed4e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 20 14:58:48 2010 +0000 - - lcov: pass --no-recursion to geninfo - - When specifying --no-recursion, make sure that the option is also passed - to the helper tool geninfo. - -commit 83543f3d21b5a5496b57c8d73e8e9c1819f82f34 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 20 14:31:59 2010 +0000 - - genhtml: fix HTML page title for directory pages - -commit b77df8ef1a69de3809e0b0bfa5cbbe5a84f313ae -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 20 14:27:19 2010 +0000 - - genhtml: make HTML charset specification customizable - - Provide a configuration file setting to adjust the charset specification - used by all generated HTML pages. Also change the default charset to - UTF-8. - -commit 1ff260462a67c440dc709d34c1fadf7d64760120 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 20 13:14:50 2010 +0000 - - lcov: follow Perl naming guidelines - -commit f637eb8c6ecb793b64eeb6bea57c6be8501d1484 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 20 13:08:25 2010 +0000 - - genhtml: add --ignore-errors option - - Provide a means for users to specify that genhtml should not abort if - it cannot read a source code file. Also make handling of --ignore-errors - parameter consistent accross lcov, geninfo and genhtml. - -commit 617bced393d5bb97e3409ec140768d9c8a2e2bfb -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 6 11:25:12 2010 +0000 - - lcov: update CVS version to 1.10 - -commit 4dcb4f0ed014ca0f49859ef84fc9ced650f6deb8 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 6 11:14:38 2010 +0000 - - lcov: finalizing release 1.9 - -commit 594779e047eed2f534905ac40912969955d3797f -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Aug 5 16:17:44 2010 +0000 - - lcov: update CHANGES file in preparation of new release - -commit fbbd9034e7a4ea4bc59342b22bfbe9612dd4bdb8 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Aug 5 15:11:56 2010 +0000 - - lcov: introduce configuration file parameters for list output - - Make some aspects of list output customizable via configuration - file parameters. Also introduce special handling, if the root - directory is chosen as prefix. - -commit c6e783c1a1d3fb6db7419af95f9e2dcb89836fe9 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Aug 5 14:07:35 2010 +0000 - - lcov: switch coverage rate and number columns in list view - - To be more consistent with the order of output in the "Overall - coverage rate" case, rates are now shown first in the list output. - -commit 3c87b66c68c2e06811c9be479c6813cb409e5461 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Aug 5 11:22:12 2010 +0000 - - lcov: fix display of total line coverage rate in list view - -commit 3cb6bc4ae0ef34aa63931d63f659f1ef43804c77 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Aug 4 16:15:19 2010 +0000 - - lcov: more lcov --list improvement - - Further improve list output to increase readability. - -commit dd98ff68ad143b985a728fc585c86d69e6027bd8 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 28 14:49:47 2010 +0000 - - lcov: minor list improvement - -commit d4778c75ce8cf3c9d44607b6fd0e385db71126dd -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 28 14:48:25 2010 +0000 - - geninfo: remove unneeded functions - -commit 65a15afef3430c49c9c7c0d151cc2afec5fc83cc -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 28 14:19:09 2010 +0000 - - geninfo: print note on branch coverage data only once - -commit bd8ab633298ec27acf5f7db4b2cc4766baf1f153 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 28 14:17:59 2010 +0000 - - geninfo: remove incorrect overall coverage rate calculation - - geninfo output showing the overall coverage rate of its current - operation is incorrect since it may count lines, functions and - branches for included files multiple times. Remove the output - and associated code until a fixed version is available. - -commit 8c54de96a1326b7ee0632773816c52eda43393e8 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 28 13:56:26 2010 +0000 - - lcov: more list output fixes - -commit 7e5fa9900d991320677c381db747c764495b2cc2 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 28 13:52:01 2010 +0000 - - lcov: fix list output - - Fix list output for directories with short filenames. - -commit badd4790c70bd8ef8b991a9d56d0e062b28006a8 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jul 26 13:33:18 2010 +0000 - - lcov: fix problem when using --initial and --kernel-directory - - Fix a problem in lcov that resulted in --kernel-directory options - being ignored when specifying --initial at the same time. - - Reported by hjia@redhat.com. - -commit a06c2038babb2f6d3e0a634cd298b0434041f834 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jul 19 16:06:15 2010 +0000 - - genhtml: change wording for branches which were not executed - - Since gcov sometimes reports both branches which were never executed - as well as branches which were executed in a single block, the wording - of the HTML alt text needs to be adjusted accordingly. - -commit e6b2491823ffd84c85406145031646af675170ee -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jul 19 15:50:02 2010 +0000 - - geninfo: handle branches in unnamed blocks - - gcov will sometimes report branches outside of a block. In that case, - account these branches to a special block so that they are not - accidentally merged with subsequently reported blocks. - -commit d6c82edf2117ce8b6232c998baf06c7a87269081 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jul 19 15:23:10 2010 +0000 - - genhtml: fix branch formatting code - - Fix the vertical alignment of the HTML representation of branches in - the source code view. - -commit 44ac74a47e25064ad1b421f65a28d057fdb9925d -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jul 19 14:27:08 2010 +0000 - - lcov: improve list output - - Improve list output by separating directory and file names. Also provide - an option to show full path names. - -commit 0ab6f7507f3c4f074bec41e571ff1afbeb943185 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jul 19 12:12:43 2010 +0000 - - genhtml: fix large numbers being shown as negative in html output - - genhtml uses a "%d" format string for printing execution counts. For - counts exceeding integer range, the output becomes negative. Fix this - by using the "%.0f" format string instead. - - Reported by kkyriako@yahoo.com. - -commit bbf0ef40a51dd716c544f91576cffde7986bb6ec -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jun 7 12:22:18 2010 +0000 - - geninfo: ensure that exclusion markers apply to --initial - - Fix a problem where exclusion markers are ignored when gathering - initial coverage data. - - Problem was reported by ahmed_osman@mentor.com. - -commit b371fc59fa52f7176f62f382457fba498f39f4b2 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Jun 1 13:48:29 2010 +0000 - - lcov: fix problem with relative path names - - Fix a problem where coverage data is missing because gcov produces - output files starting with a dot. - - Problem reported by weston_schmidt@open-roadster.com. - -commit 93c70ddd0edbc2b0addf9d135dfd76871cc7a160 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Sun Feb 28 20:57:37 2010 +0000 - - lcov: fix problem with relative paths in build paths - - When binaries are built using relative paths, lcov cannot find any - coverage data. Instead, warnings similar to the following are printed: - - geninfo: WARNING: cannot find an entry for ^#src#test.c.gcov in .gcno - file, skipping file! - - The reason for this is that File::Spec::rel2abs does not remove ../ from - paths which results in lcov not being able to match the relative and - absolute versions of the corresponding filenames. Fix this by using the - internal function solve_relative_path instead. - -commit fad24a75cc69364d002d40e4fb75736b0efbdb37 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Sun Feb 21 14:57:52 2010 +0000 - - geninfo: write all debugging output to STDERR - -commit c0943385fa0acb927f63f9f78c9aeaebe3a8ece1 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Sun Feb 21 14:56:46 2010 +0000 - - geninfo: fix problem with some .gcno files - - Some .gcno files contain more data in a line record than - expected. Skip unhandled bytes of a .gcno file record. - This prevents the following unexpected error message: - - geninfo: ERROR: file.gcno: reached unexpected end of file - -commit 4b9ee7598e991b503425148eb43a35de2702aded -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Sun Feb 7 13:07:09 2010 +0000 - - lcov: add COPYING file - -commit de0e43a098ade45d6624ea43a53e6fad9a176469 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 29 11:07:25 2010 +0000 - - lcov: update CVS version to 1.9 - -commit 4a33269fa3a73ea2577f7616d90bd3f1d14ae460 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 29 10:09:53 2010 +0000 - - lcov: finalizing release 1.8 - -commit 310ffb28d8847f96e02b5a5db3d16bdcb406a876 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 29 10:01:35 2010 +0000 - - lcov: updated CHANGES file - -commit 9e12808e6108e05dca42b5e682bd8be121f3608d -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 29 09:21:22 2010 +0000 - - genhtml: use sans-serif font for function table - -commit 71baabb6a1c15228213f8b25359346ee202300ce -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 29 09:12:55 2010 +0000 - - lcov: improve list output - -commit cc61a28dbc3c46ac84340141fafbfa559e1bf318 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 29 08:56:19 2010 +0000 - - lcov: fix overall rate display for tracefiles with more than one testcase - -commit b89028529db5110b3b76d117df788768a593d7dd -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 29 08:44:47 2010 +0000 - - lcov/genhtml: fix warning while merging branch data - -commit b7c69f31d9b1bfbd4bfc0fcb880cb8e514bcdb3f -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Jan 28 15:59:23 2010 +0000 - - lcov: fix branch coverage related issues - - - warnings when combining certain combinations of branch data - - branches are not merged correctly when multiple input files are specified - to genhtml or when lcov -a is used - -commit 817875459df122fa3536a5e57c05ddfae19a089e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 27 16:37:50 2010 +0000 - - gendesc: fix problem with single word descriptions - -commit 33f60f48747b5ba12a6fdfb505bb662c922496bd -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 27 12:10:04 2010 +0000 - - lcov: remove temporary files when creating a package - -commit 6775457cbd3fa86acba4655d77b4ba2054b13253 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 27 12:00:05 2010 +0000 - - lcov: correctly retain information about converted test data - -commit f4d13eccc54f31a53ad109c3c4b86e4b52d6dfcb -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 27 10:17:43 2010 +0000 - - lcov. fixed overview output for function data - -commit aa00c65b7514c93320c1c787b848c8277593dcb0 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Jan 26 09:36:19 2010 +0000 - - genhtml: don't use too much gcc-specific terms (basic block -> block) - -commit 3562f60b9500d8ad167c4629e9d95485308aa665 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 22 16:17:37 2010 +0000 - - lcov: consolidate coverage rate classification limits - - Classifying coverage rates per coverage type (line, function or branch - coverage) is not useful in most cases. Also the respective - color legend takes up too much space in the HTML output. Remove - function and branch coverage rates from the documentation and from - the color legend. Instead the original limits will be applied to those - coverage types as well. The per type rates can still be used if required - but it is recommended to only use one rate set. - -commit d77dc6a0adf259e322ac9f35c93241d446269a5b -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 22 16:16:47 2010 +0000 - - lcov: minor code cleanup - - - remove unused function definitions and declarations - - remove unused CSS declarations - - add missing function declarations - - fix function prototypes - -commit b3243d1fdc17571ca9b1ed6a1ea975a9b3f1b86b -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 22 16:16:15 2010 +0000 - - geninfo: consolidate similar functions - -commit 739e2bca054c69975594c2570049e8aa9ae1b5ce -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 22 16:15:35 2010 +0000 - - lcov: add coverage result output to more operations - -commit 0a31d3c0696015c5e4878e821529eba45451c3dd -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 22 16:14:57 2010 +0000 - - lcov: minor cosmetic HTML changes - - - top level view is now named "top-level" - - use sans-serif font for coverage values in file list - - use smaller font for show/hide details link - - use smaller font for function/source view link - - use smaller font for show descriptions link - -commit b631fa0cb9aabdf18f9365423f0b0bf85d6b8e16 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 22 16:14:27 2010 +0000 - - lcov: improve color legend - - Move color legend closer to the table containing coverage rates. - -commit 2aeeeafb31c36ccd1a51051f040e29a9fcf59df2 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 22 16:13:58 2010 +0000 - - lcov: implement branch coverage - -commit 49dfe22f41b6c3edcb774dfb89b1a807ce7aee6c -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 22 16:13:34 2010 +0000 - - genhtml: implement branch coverage - -commit 6aa2422401bb854c9710f5ed2936f06e487848c5 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 22 16:13:07 2010 +0000 - - geninfo: implement branch coverage - -commit ca2c9781b0a512bd6789eac2b6840405e2d87330 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 22 16:12:27 2010 +0000 - - geninfo: consolidate handling of extra gcov parameters - -commit 9d9c964eb6ece00b15ef068f176c68cb0eedfda0 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Jan 21 11:26:34 2010 +0000 - - lcov: minor fix for lcov --diff - -commit 4306f81d1e8446a89fe83d20cd71abe075a3cd61 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Jan 21 10:23:35 2010 +0000 - - lcov: improve lcov --list output - -commit 3242ce1bae94cfd859c3bc964fab11f85bd7d1ed -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 20 17:13:28 2010 +0000 - - lcov: unify data order in tracefiles - -commit 8f53b2e8dbbe5580050fbe0c604bd9a9322735a7 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 20 16:05:56 2010 +0000 - - lcov: fix bug when applying baseline files without function coverage data - - Fix the following error that occurs when genthml's --baseline-file option - is used on files which do not contain any function data: - - genhtml: Can't use an undefined value as a HASH reference at ./lcov/bin/genhtml line 4441. - -commit 96fcd676d5ac9c1eb9f83f3dc4c3089ba478baad -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 20 15:28:21 2010 +0000 - - lcov: resolve short-name option ambiguities - -commit f1d34d49b394a13c33c7a5b51f04e5dfbded5d26 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 20 14:47:50 2010 +0000 - - lcov: fix error messages - -commit 89ff61aa7cd2ca23b8cacd649288ecf7f67746de -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 20 08:35:20 2010 +0000 - - lcov: fix bug when using genhtml's --baseline-file option - - Fix the following error message when trying to use genhtml's - --baseline-file option: - - genhtml: Undefined subroutine &main::add_fnccounts called at - /home/oberpar/bin/genhtml line 4560. - - Reported by Brian DeGeeter <sixarm@gmail.com> - -commit c3df3a8504b06ca32b9863fdb2abb8cf0ce62251 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jan 18 09:17:17 2010 +0000 - - lcov: ensure LANG=C before calling gcov - - Fix problem calling lcov when LANG is not set to an english locale. - Reported by benoit_belbezet@yahoo.fr. - -commit d945f23345e02ca535d740782e7ae10cb3396b8c -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Nov 18 09:39:21 2009 +0000 - - lcov: more version fixup - -commit 413249e6336cff432083954e6ed47236dd35f647 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Nov 18 09:38:03 2009 +0000 - - lcov: fix version fixup - -commit d0b7148e2d76164e5ea091fe56035c24f7dce22a -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Nov 18 09:34:45 2009 +0000 - - lcov: add more CVS versioning - -commit 4e0219f918a15cbc9ff40d0e0e4dab91ac073f72 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Nov 18 09:14:56 2009 +0000 - - lcov: add CVS revision number to version output - -commit 34154c2d48497d9aad41ec1452ba94dd4cbce881 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Oct 30 14:18:45 2009 +0000 - - lcov: further clarification in the README - -commit 7a4ab1340dd7f88ba0fb56a7b0eb368bf2d0112e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Oct 30 13:58:56 2009 +0000 - - lcov: update README to mention required -lgcov switch during linking - -commit 3fa5b311b123af84debbd774baa4a1cd30e7085b -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Oct 27 16:54:41 2009 +0000 - - lcov: remove further unneeded warning - - ... + use correct source for list of filenames - -commit cd4051719e72129f4abf1ad177269bf14031f83a -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Oct 27 16:19:05 2009 +0000 - - lcov: fix problem with matching filename - - - used correct source for filenames - - converted match_filenames to portable version - -commit 0d0ff8a9945260eebed6d316aa08c0021faf3549 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Oct 27 15:29:41 2009 +0000 - - lcov: remove unnecessary warning - -commit 6c711d664c38d18f788ee8a5239586cd4a5b77d9 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Oct 26 14:21:40 2009 +0000 - - lcov: improve derive-func-data option - - - rewrite graph file handling - - make derive data look at all lines belonging to a function to find - out whether it has been hit or not - - introduce --debug option to better debug problems with graph files - -commit 214cda20c4b591a823045f35b73f2a16221c9aa1 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Oct 1 15:26:58 2009 +0000 - - lcov: introduce new options --derive-func-data - - When using a gcov version that does not provide function data, - this option will attempt to guess the function coverage data - for a function by looking at the number of times that the first - line of that function was called. - -commit 9a75125895fd07a775a2a25f2cbe66b9fbf332d6 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Oct 1 11:49:53 2009 +0000 - - lcov: ignore incomplete function names in .bb files - - - don't abort processing when an incomplete function name is - encountered in a .bb file (gcc 2.95.3 adds those) - - fix filename prefix detection - -commit d5ab6076a0bfc5ad80652ba592583f7fc7946dc6 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Sep 28 12:27:09 2009 +0000 - - lcov: improve detection of gcov-kernel support - -commit 3cca782fcac9c4ea54adcebe75e1f047a8dca636 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Sep 22 13:44:04 2009 +0000 - - lcov: fix problem with CONFIG_MODVERSIONS - - Make geninfo work with Linux 2.6.31 and CONFIG_MODVERSIONS. - -commit 8af873f44c104cd214b796e13b916718fc8f6f99 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Sep 16 15:24:51 2009 +0000 - - lcov: remove default for gcov_dir so that auto-sensing works - - Fix problem with lcov not finding kernel coverage data at - /sys/kernel/debug/gcov because the default system-wide - lcovrc file contained a specification for the gcov directory - which prevented auto-detection from working. - -commit 50f90681af4d105a52b5b0dbf4f0bfd04369ffd2 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Aug 27 10:14:23 2009 +0000 - - lcov: apply excluded lines also to function coverage data - -commit 4aeb840d25c85a419171970e1a445aeb81079e53 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Aug 27 09:23:13 2009 +0000 - - lcov: fix help text typo - -commit c17a783f87aa8e42949131d2fbc1c540bb3751a3 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Aug 27 09:22:43 2009 +0000 - - lcov: add exclusion markers - - Users can exclude lines of code from coverage reports by adding keywords - to the source code. - -commit 445715c88337c13ce496bd05423ee5e58d84705c -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 14 08:19:26 2009 +0000 - - lcov: ignore gcov errors for unnamed source files - - When specifying "--ignore-errors gcov", lcov/geninfo should not abort when - they cannot read a .gcov file. Fix this by introducing warnings in the - respective places. - -commit 0e23f03a9ce130e8ebec679fb5a9a6f854efbee5 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Aug 6 12:34:04 2009 +0000 - - lcov: improvements - - - added --from-package and --to-package options - - improved gcov-kernel handling - -commit 17a05bdf646870cd61794274c7165211c93c82f9 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Jul 23 12:45:15 2009 +0000 - - lcov: fix kernel capture for new gcov-kernel version - - - fix problems when compiling without O= - -commit 64e302b9134b6098852cad2e6180e0722f2dea41 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Jul 21 15:42:44 2009 +0000 - - lcov: improve lcov -l output - -commit cea6941ef36d0860330b6e94f8c6096dca78ca58 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Jul 21 09:10:49 2009 +0000 - - lcov: add support for the linux-2.6.31 upstream gcov kernel support - -commit 04470d2b25808f195d338112155b9f7db405d902 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Apr 22 09:13:12 2009 +0000 - - genhtml: fix warning about undefined value used - - nikita@zhuk.fi: - genhtml.patch checks that $funcdata->{$func} is defined before using - it - I got few "undefined value used" warnings without this check. - -commit a12d4f9a5d36232b928be12b7cbfaa9a00b3a923 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Apr 22 09:08:19 2009 +0000 - - genpng: fix runtime-warning - - - when called from within genhtml, genpng would warn about warn_handler - being redefined - -commit d0b5641c62bbdac89757b9ff185a7aa3f38fc0bb -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Mar 13 09:58:00 2009 +0000 - - lcov: improve function name filtering - - Only remove those characters from function names which would conflict - with internal delimiters. - -commit fbafa4a5628a639544e83f88083082c685677c36 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Feb 13 15:04:40 2009 +0000 - - genhtml: minor man page update - -commit 085a2150e38a3c1bdadb5af23c0a8a8a79dc4b0d -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Feb 13 14:56:45 2009 +0000 - - genhtml: added --demangle-cpp option - - - used to convert C++ internal function names to human readable format - - based on a patch by slava.semushin@gmail.com - -commit 53f3ed4afb45a2a4248314b677d36377598cc73c -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Feb 13 14:07:46 2009 +0000 - - genhtml: update comment - -commit 3c2b2e8541387506fd514d183f9a4a63c07c0aa4 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Feb 12 17:01:19 2009 +0000 - - genhtml: fix error when combining tracefiles without function data - - - genhtml: Can't use an undefined value as a HASH reference at genhtml - line 1506. - - bug reported by richard.corden@gmail.com - -commit 22397370ada6893b6e9a1c3f6ad0aba7f4864f81 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Feb 11 09:31:24 2009 +0000 - - lcov: fix error when combining tracefiles without function data - - - lcov: Can't use an undefined value as a HASH reference at lcov line - 1341. - - bug reported by richard.corden@gmail.com - -commit 24ec53ae83acdd35682ba757adae23750bd4c623 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Feb 9 16:15:49 2009 +0000 - - lcov: fix warning when $HOME is not set - - - based on patch by acalando@free.fr - -commit 5da3521d5a438db0a21e93b0d14ea5a3cdab14d9 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Feb 9 12:41:44 2009 +0000 - - lcov: use install -pD -m <mode> for file installation - -commit bdce1bda2ac1a86aa6dfefae8e18353ba57afe4b -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Feb 9 09:46:00 2009 +0000 - - lcov: fix double-counting of function data - -commit ea62c4e701abb05dd560ef22b52a4a72c17660e8 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 21 16:33:29 2009 +0000 - - geninfo: need to add CR removal to geninfo as well - - ... or checksumming will fail - -commit 70be5df7d58a393e27cee178df669c12ec670c5a -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 21 16:24:01 2009 +0000 - - lcov: modify end-of-line CR removal - - - s///g is 10% slower than s/// - \r may be 0x10 or 0x13 (see man - perlport) - -commit d8df4b0f83ff175f1a06afb693903ee1a93ec377 -Author: Michael Knigge <michael.knigge@set-software.de> -Date: Tue Jan 20 11:41:39 2009 +0000 - - lcov: remove CRLF line breaks in source code when generating html output - - - added patch by michael.knigge@set-software.de - -commit 442cca7e69356e7f8ba03bd95f7813576bd197cc -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Nov 17 14:11:20 2008 +0000 - - lcov: updated CVS version to 1.8 - -commit 5c5c85a1c090360facd50cb089b8af98f0b37c47 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Nov 17 13:55:52 2008 +0000 - - lcov: version + date updates - -commit 9f6a735809c23559b861e97a20af55a66b6b96bb -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Nov 17 13:49:43 2008 +0000 - - lcov: fix spec file bug - -commit 11483dc0b56d326718edcd31d06458143add858f -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Nov 17 13:44:38 2008 +0000 - - lcov: update error and warning messages - -commit 4dd11b80d14e34fee2e75b3fe8c7aa163f61ad1d -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Nov 17 12:48:03 2008 +0000 - - lcov: preparations for release 1.7 - -commit b847ed6f3103a4c9f0a48417b9c3f160b9e00557 -Author: Jeff Connelly <jeffconnelly@users.sourceforge.net> -Date: Fri Oct 10 07:54:47 2008 +0000 - - lcov: geninfo chokes on spaces in the directory name - - In lcov 1.6, geninfo fails to find gcno/gcda files if the source directory - has spaces in the name, because it uses backticks to shell out to "find", - passing $directory on the command-line. - - Attached is a patch that double-quotes the variable, allowing geninfo to - operate on directories with spaces in their name. The fix isn't perfect; it - won't work on directories with a " character, but it works fine for my - purposes (I don't have any directories with quotes). A better fix would be - to use IPC::System::Simple's capturex from - http://search.cpan.org/~pjf/IPC-System-Simple-0.15/lib/IPC/System/Simple.pm - #runx(),_systemx()_and_capturex(). capturex() is a multiple-argument form - of the backticks, so it avoids any interpolation errors. - -commit ee3cdd554ee4e6d3ef5bdc9c5dcfee50de6375a7 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Aug 18 07:12:33 2008 +0000 - - lcov: change sorting order to low-to-high coverage - -commit fe665ca5ccf9d73d9ebdae17de88e181c1b9b0eb -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 15 08:38:21 2008 +0000 - - lcov: several changes - - - update download link - - unify webpage links - - provide --sort and --function-coverage switch + documentation - -commit 14137c5456f307982fed418e1e8fac65d7f086c3 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Aug 13 15:57:23 2008 +0000 - - lcov: fix function view page creation when --no-func is specified - -commit e59f7d15ffc7f1b3794a4212c53d0fb97ac7fb2a -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Aug 13 15:35:48 2008 +0000 - - lcov: updated versioning mechanism - - ... + fixed some man page bugs - -commit e933698b31bc2fb4a750d89a5755bb8155313da2 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Aug 13 14:08:23 2008 +0000 - - lcov: updated rpm description - - ... + summary and version strings - -commit 5a9660585ce39a77fa38607d0c2d2440955e7242 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Aug 13 13:53:50 2008 +0000 - - lcov: integrated function coverage patch - - ... by Tom Zoernen + sorting function - -commit d10ede8179747cfd675a3989578350c710e9bdd5 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed May 7 15:08:12 2008 +0000 - - lcov: --norecursion becomes --no-recursion - - + added docs - -commit 4096130608b9faf74c5b5feac554a10b5d9f83ce -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Feb 21 10:20:33 2008 +0000 - - lcov: fix error when trying to use genhtml -b - - genhtml fails when the data file contains an entry which is not - found in the base file. - -commit 9578099e13388344a6179c7cce54bfa094fd9b08 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Feb 20 17:21:51 2008 +0000 - - lcov: fixed problem with pre gcc-3.3 versions - - read_gcov_headers does not return valid results for pre gcc-3.3 versions. - Due to an unnecessary check, parsing of gcov files was aborted. Fix - by removing check. - -commit 16ec76b48fbc50c32890919e5bd0c30653719af9 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Feb 5 09:18:50 2008 +0000 - - lcov: adding support for gzipped html - - ... based on patch by dnozay@vmware.com - - dnozay@vmware.com: genhtml is a great tool to generate html, but the more - files, the more space it takes (here I have over 113MB of html generated), - add to that I need to have different sets, and space usage increases - dramatically (2.7GB). we are using browsers with htmlz support, so it would - be nice to have support for that in genhtml, relying on 'gzip -S z' to do - the job. - -commit f2c98a8c8581180533508eb4af41720d8566049e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jan 7 16:33:57 2008 +0000 - - Filter non-word characters in function name - - ... as they would break our file format which uses comma and '=' as - field separator. - -commit 37725fc78fcacaf06e6240971edc3bdd7fe3d142 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Nov 1 16:29:39 2007 +0000 - - lcov: fix for problem resulting in lcov aborting with "ERROR: reading string" - -commit 48f13fcec1b521d2daba6202ccd7ec0ec8c5ece9 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Oct 4 08:18:07 2007 +0000 - - lcov: workaround for gcc 4.1.0 .gcno file oddness - - scott.heavner@philips.com: - I'm trying to use lcov 1.6 with gcov/gcc 4.1.0. The geninfo parser was - aborting on a small number of .gcno files. I've patched my local copy so - that geninfo prints out the offset of the error and skips the remainder of - the problem file - -commit 1a805ea068db29b63a83c801f3bb1840fda8dd35 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 24 08:50:26 2007 +0000 - - lcov: add experimental option "--norecursion" - -commit 194de5071db1d9903d22164432448b73c1ec6cd0 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Aug 23 11:08:39 2007 +0000 - - lcov: Makefile for post-release - -commit 0750f8a3e5235833711d616a3763c04103cf55a5 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Aug 23 11:04:30 2007 +0000 - - lcov: Makefile for release 1.6 - -commit cb911f7a79593c89a730dc93fa54179fbf1df363 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Aug 20 10:29:35 2007 +0000 - - lcov: fixed spec file - -commit 62cefebdda87784140eb5f997ae4e575d2338298 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jul 6 07:38:47 2007 +0000 - - lcov: add new option --initial to get zero coverage data from graph files - -commit f0b6927f1ab1052b00081c662ced614a6e5f9ed7 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 4 14:38:59 2007 +0000 - - lcov: fixed bug that would not delete .gcda files when using -z - -commit 13941c3a159caf7dc6ba18a5b13e43c20fc18f2b -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 4 14:18:26 2007 +0000 - - lcov: another update in preparation for a new release - -commit d25e630a77ef2d0f69139058322269387866e414 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jul 4 13:13:22 2007 +0000 - - lcov: man page update - -commit 7844b915af5402441df9ab0423e4c20ef9a2632f -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Jul 3 16:43:05 2007 +0000 - - lcov: update manpage - -commit 5adaa72bfb32737d18c328492777c1c6116d4a9e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jul 2 15:29:02 2007 +0000 - - lcov: preparations for new release - - - updated CHANGES file - - added compat-libtool + no-compat-libtool option - - changed libtool default to on (due to popular request) - - added checksum option - - changed checksum default to off (to reduce cpu time + file size) - - added geninfo_checksum option to lcovrc, deprecated - geninfo_no_checksum - - added geninfo_compat_libtool option to lcovrc - - minor update of README file - -commit 6cbfd5022703a6198e1a1e2a2ddddcc0b90f5334 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue May 22 08:11:44 2007 +0000 - - lcov: minor help text update - -commit 2416ed02ba299c4d0bceb1e47c214b7dec066d7a -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Mar 7 14:59:25 2007 +0000 - - lcov - - - add --ignore-errors option to lcov/geninfo - - add --gcov-tool option to lcov/geninfo - - remove s390 test case modification in geninfo - - restructured help text for lcov/geninfo - -commit a13375811717d3ada718e6f52364e4344a7e3187 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jan 8 17:07:21 2007 +0000 - - lcov - - - re-added libtool compatibility workaround patch by - thomas@apestaart.org - - added new lcov/geninfo-option --compat_libtool to activate libtool - compatibility patch - -commit 14871d7b097282819db60266d8b8a38506d7b14a -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Nov 14 11:45:17 2006 +0000 - - lcov - - Fix for problem found by Joerg Hohwieler: lcov -k doesn't work if -k is - specified more than once. - -commit 43b52b37006822c0fca12548bc72fecc957342ca -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Jun 26 15:48:52 2006 +0000 - - lcov: new version for prerelease rpms - -commit 89e9d59709c9d9d8722170c86251090adc3b96c9 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jun 7 09:31:57 2006 +0000 - - lcov: removed autoupdate of copyright date (second thoughts) - -commit bb0cf1c9d0ed58b37c1551fea765fb1622bcacde -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jun 7 09:20:37 2006 +0000 - - lcov: minor cleanup (release preparations) - -commit 527693d753d11ac2b59fe26b923662c99e6e3715 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Apr 5 10:10:05 2006 +0000 - - lcov - - - added base-directory documentation - - updated CHANGES file - -commit 11ef9338cc4124801c8b61e3edd51a02e50b4c68 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Mar 20 17:09:50 2006 +0000 - - genhtml: added html-extension option - -commit 93d22308ffb410327248059b7dcdb592f85e249e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Mar 20 16:39:25 2006 +0000 - - genhtml - - - adding html-prolog and html-epilog options (based on patch by Marcus - Boerger) - - specified behavior when both --no-prefix and --prefix options where - provided - - small whitespace diff - -commit dcac095cdc00cc65930285bb6fc01d0f257ee4ed -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Feb 15 16:02:07 2006 +0000 - - lcov: added check for invalid characters in test names - -commit d89e561dfd9c5fde43350af1b145b1892d0710d0 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Dec 2 06:38:16 2005 +0000 - - lcov - - - updated Makefile so that people building RPMs from the CVS version get - a correct build version. Note: this needs to be adjusted after each - release! - -commit 1960123050f9098690768d10cd2490dd49b995f7 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Thu Nov 10 13:10:09 2005 +0000 - - lcov - - - fixed bug: .info file generation with new gcc 4.x compilers may fail - for programming languages that allow ':' in function names (c++, - objective c) - - removed special handling for libtool .libs files - - libtool should work with currently undocumented option --base-directory - -commit 479d446d3bf20a84c2933100ead279c79eeaf5c4 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Sep 7 16:24:39 2005 +0000 - - lcov - - - implementation of new option --base-directory (untested, undocumented) - - minor fix for link-traversal when looking for object directory - - TODO: document option (man page, online help), add to config file, check - whether libtool fix still works - -commit 770b94a3172f206de7f194c7497ebae14348b521 -Author: Robert Williamson <robbiew@users.sourceforge.net> -Date: Mon Jul 11 17:54:25 2005 +0000 - - Applied patch from Stefan Kost - - when running lcov over an uninstalled user-space apps tests, it finds - the .da file in the .libs directories, but does not look for the sources - one hierarchy up. Libtool places the object in the .libs dirs. when - running gcov manually one can specify -o.libs/ to produce a source.c.gov - file. I now have attached a patch that fixes the problem for me. please - do not just ignore this report. the lcov tool is so nice and it would be - a shame if it can not be used for normal apps. - -commit 79f2ff2c168150e7532046c2cdbc1e42c8b4708f -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Jun 14 11:34:59 2005 +0000 - - lcov - - - renamed support for modified compilers (gcc 3.3 hammer patch) - - fixed bugs in the support for modified compilers - -commit fb7dab3494fdd8b093e6a84f088f6ea07fcefe6e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Mar 15 18:02:54 2005 +0000 - - lcov - - Emil.Jansson@oss.teleca.se: - lcov 1.4 does not work with the gcc version in Mandrake Linux 10.0 - - >> gcc --version - - gcc (GCC) 3.3.2 (Mandrake Linux 10.0 3.3.2-6mdk) - - This patch for geninfo fixes the problem: - -commit ae3fe899d824e8af8a16736a0c8104c903565a56 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Mar 8 14:23:06 2005 +0000 - - lcov - - - added optional legend to HTML output - - changed background color for "good coverage" entries to green for - consistency reasons - -commit 18b73d39fd9d6bc8829395baa612a6ed98b89efe -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Mar 2 14:49:47 2005 +0000 - - lcov - - - fixed rpm build process to exclude unnecessary directories in RPM - -commit ef6ee74df5bf1d1d104322f8fff36b5c6fda34b4 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Mar 2 12:48:29 2005 +0000 - - lcov - - - added man page for configuration file lcovrc - -commit be3afe2626d6bc72256e1873d409c737ac4391c9 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Feb 28 16:31:51 2005 +0000 - - lcov - - - Updated CHANGES file in preparation for a new release - -commit dc68ce9c804ef21bc8e149d9b468e18c1619bb54 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Nov 2 15:48:45 2004 +0000 - - lcov - - - temporary fix for a problem which occurs when trying to parse C++ - coverage data generated with vanilla gcc 3.3.3 - -commit efedc5b930ab6743ea9f47ce4ea4a1a75bd739ff -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Sep 27 13:13:51 2004 +0000 - - lcov - - - fix for minor bug in geninfo (access to uninitialized variable) - related to SLES9 compatibility test and test for existing source code - files - -commit 47943eedfbec7a12c52e7a8ccbcfaf8d0706f142 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Sep 20 14:11:16 2004 +0000 - - lcov - - - minor fix for regular expression used to parse .gcov files - caused - problems when parsing branch coverage data and when using custom - gcov versions - -commit ce6335ebd92ce017b75ee3e194e9e3ca7bc7e1f3 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Sep 14 15:52:38 2004 +0000 - - lcov - - - fixed bug in geninfo which would not report any FN: data for data - generated with gcc versions 3.4.0 and above - -commit 58df8af3a62fa4e60569ef300e0ddd0073bf109e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Aug 31 15:57:41 2004 +0000 - - lcov - - - added support for modified GCC version provided by SUSE SLES9 - -commit 69f3bc3a0c59b35eb6882205286a68b04a8a8d22 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Aug 31 15:48:32 2004 +0000 - - lcov - - - fixed bug in lcov RPM spec file which would not include the global - config file in the package list - -commit 5d10ca22144ad2be885405c3683b20c0976f7562 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Aug 9 14:32:23 2004 +0000 - - lcov - - - fixed a bug which would cause generation of incorrect line checksums - when source code is not available while capturing coverage data - - changed default directory for temporary files from . to /tmp - -commit 8ee3061f23f17a5074deda0777c66c3e82b5d852 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Aug 9 11:15:02 2004 +0000 - - lcov - - - added configuration file support - - fixed Makefile error for target "uninstall" - -commit 58af07f0b0ca1af8c9f2b90ad1683447bb560165 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Aug 6 11:36:33 2004 +0000 - - lcov - - - fixed bug which would cause an error when lcov was used on a source - directory which contained perl regular expression special characters - - simplified regular expression character escaping - - removed unnecessary function escape_shell from lcov - -commit 69a6918d4cd386aff2fbff093a6e0b5ddcc46602 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Mar 30 13:27:55 2004 +0000 - - lcov: - added --path option to fix --diff functionality - -commit cbc6cb11b532e525ae8b0c0742a4fd41189ca7c2 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Mar 29 12:56:08 2004 +0000 - - lcov - - - Added compatibility for gcc-3.4 - - Modified --diff function to better cope with ambiguous entries in - patch files - - Modified --capture option to use modprobe before insmod (needed for - 2.6) - -commit 1cf9a02c3ea0e98cc1d8b626eaa0a2a1cbd96cf1 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Jan 30 09:42:13 2004 +0000 - - lcov - - - updated CHANGES file - - changed Makefile install path (/usr/local/bin -> /usr/bin) - -commit c60f0668059032cf4dc5f6c556fd6117925f535f -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Jan 14 10:14:10 2004 +0000 - - lcov-patch by Laurent Deniel - - avoids aborting the geninfo processing when an empty .bb file is - encountered (e.g. source code with no profiled statement) - -commit 7f2966f8f874a6c905b4d31e5aaf0f4654929044 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Dec 19 16:22:52 2003 +0000 - - lcov: updated references to lcov webpage to reflect recent site changes - -commit a3893f4eb2b4fadc4d7350324d74fa453a5ba0f3 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Dec 19 12:50:28 2003 +0000 - - Added changes by Laurent Deniel - - - a small patch to lcov 1.1 that introduces the --follow option (in - lcov & geninfo) to control whether or not links should be followed - while searching for .da files. - - a workaround for a gcov (3.2) bug which aborts with empty .da files - (gcov 3.3 is fixed but many distributions include gcc 3.2) - -commit d44f2f8e8672e31cc104c0598b0556a5949dc067 -Author: Paul Larson <plars@users.sourceforge.net> -Date: Fri Nov 21 19:34:59 2003 +0000 - - Fixed two buglets that caused geninfo to break with some versions of gcov. - - 1. Return value for gcov --help might not be 0, expect -1 when it - doesn't exist - 2. use -b instead of expanded (--branch-coverage or whatever it was) - -commit 5a1a33a840a665c77409f799be91cc2dce5cd3b2 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Tue Nov 18 14:06:47 2003 +0000 - - lcov - - - fixed function which interprets branch possibility data in geninfo - (branch x taken = y% would not be interpreted correctly) - - deactivated function which would add 'uname -a' output to testname - in geninfo (output in genhtml/showdetails looked unreadable, there - needs to be some better solution) - -commit e0ea03fedf43a3232c35708f882d7058998b2b3d -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Oct 10 14:18:32 2003 +0000 - - New function and bug fix update. - - Makefile: - - Added rule to build source rpm - - lcov.spec: - - Modified to support building source rpms - - genhtml: - - Fixed bug which would not correctly associate data sets with an empty - test name (only necessary when using --show-details in genhtml) - - Added checksumming mechanism: each tracefile now contains a checksum for - each instrumented line to detect incompatible data - - Implemented new command line option '--nochecksum' to suppress generation - of checksums - - Implemented new command line option '--highlight' which highlights lines of - code which were only covered in converted tracefiles (see '--diff' option of - lcov) - - geninfo: - - Added checksumming mechanism: each tracefile now contains a checksum for - each instrumented line to detect incompatible data - - Implemented new command line option '--nochecksum' to suppress generation - of checksums - - Added function to collect branch coverage data - - lcov: - - Fixed bug which would not correctly associate data sets with an empty - test name (only necessary when using --show-details in genhtml) - - Cleaned up internal command line option check - - Added info() output when reading tracefiles - - Added checksumming mechanism: each tracefile now contains a checksum for - each instrumented line to detect incompatible data - - Implemented new command line option '--nochecksum' to suppress generation - of checksums - - Implemented new command line option '--diff' which allows converting - coverage data from an older source code version by using a diff file - to map line numbers - - genpng: - - Added support for the highlighting option of genhtml - - Corrected tab to spaces conversion - -commit c17af02b4a856d8733a763e6c0685c31f3c7fb74 -Author: Nigel Hinds <nhinds@users.sourceforge.net> -Date: Fri Sep 19 21:51:06 2003 +0000 - - capture branch coverage data from GCOV. - -commit e2fc88f85254017bcf1fb04a3c935395a9b7a4a1 -Author: James M Kenefick Jr <parseexception@users.sourceforge.net> -Date: Thu Sep 4 16:56:10 2003 +0000 - - Initial checking of the galaxy map - -commit dfec606f3b30e1ac0f4114cfb98b29f91e9edb21 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Sat Jul 5 13:48:45 2003 +0000 - - LCOV: Fixed negative count handling - - - Negative counts are treated as zero - - Warning is issued when encountering negative counts - -commit a2ee105a07b19c52efe7a3e6e5b11a27b4b60ef8 -Author: Paul Larson <plars@users.sourceforge.net> -Date: Wed Jul 2 19:37:50 2003 +0000 - - Small fixes before the release - -commit 72860625dd904f84909253b20a7fc024b4e3377e -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon May 5 08:32:04 2003 +0000 - - Adjusted example program and README file - - ... to reflect renaming of lcov option '--reset' to '--zerocounters'. - -commit cbd9e315832960604d2949439326b30f4061e512 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Apr 30 15:47:51 2003 +0000 - - Renamed lcov option '--reset' to '--zerocounters' - - - Included '--remove' in help text of lcov - - Adjusted man pages to include option changes - - Extended info() change to geninfo and genhtml (infos are now printed - to STDERR) - -commit 8155960cb5db0359470d2a5f652bdc744e9ecfcd -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Wed Apr 16 15:43:31 2003 +0000 - - Modified read_gcov so that it can also parse the new gcov format which is to be introduced in gcc 3.3. - -commit 382440f781b12ade8f1f7962a0eb1cfc0525f2a5 -Author: Paul Larson <plars@users.sourceforge.net> -Date: Tue Apr 15 16:06:59 2003 +0000 - - Added --remove option info() now prints to stderr - -commit 62760fa1840326e849c7e58892ce671f510bb0af -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Mon Apr 14 09:31:51 2003 +0000 - - Check-in of updated LCOV version (to be released as 1.1). - - Includes fixes and modifications by Mike Kobler, Paul Larson and - myself. - - A quote from the CHANGS file: - - Added CHANGES file - - Added Makefile implementing the following targets: - * install : install LCOV scripts and man pages - * uninstall : revert previous installation - * dist : create lcov.tar.gz file and lcov.rpm file - * clean : clean up example directory, remove .tar and .rpm files - - Added man pages for all scripts - - Added example program to demonstrate the use of LCOV with a userspace - application - - Implemented RPM build process - - New directory structure: - * bin : contains all executables - * example : contains a userspace example for LCOV - * man : contains man pages - * rpm : contains files required for the RPM build process - - LCOV-scripts are now in bin/ - - Removed .pl-extension from LCOV-script files - - Renamed readme.txt to README - - README: - - Adjusted mailing list address to ltp-coverage@lists.sourceforge.net - - Fixed incorrect parameter '--output-filename' in example LCOV call - - Removed tool descriptions and turned them into man pages - - Installation instructions now refer to RPM and tarball - - descriptions.tests: - - Fixed some spelling errors - - genhtml: - - Fixed bug which resulted in an error when trying to combine .info files - containing data without a test name - - Fixed bug which would not correctly handle data files in directories - with names containing some special characters ('+', etc.) - - Added check for empty tracefiles to prevent division-by-zeros - - Implemented new command line option --num-spaces / the number of spaces - which replace a tab in source code view is now user defined - - Fixed tab expansion so that in source code view, a tab doesn't produce a - fixed number of spaces, but as many spaces as are needed to advance to the - next tab position - - Output directory is now created if it doesn't exist - - Renamed "overview page" to "directory view page" - - HTML output pages are now titled "LCOV" instead of "GCOV" - - geninfo: - - Fixed bug which would not allow .info files to be generated in directories - with names containing some special characters - - lcov: - - Fixed bug which would cause lcov to fail when the tool is installed in - a path with a name containing some special characters - - Implemented new command line option '--add-tracefile' which allows the - combination of data from several tracefiles - - Implemented new command line option '--list' which lists the contents - of a tracefile - - Implemented new command line option '--extract' which allows extracting - data for a particular set of files from a tracefile - - Fixed name of gcov kernel module (new package contains gcov-prof.c) - - Changed name of gcov kernel directory from /proc/gcov to a global constant - so that it may be changed easily when required in future versions - -commit ec94ed71838a9780e82ea8bd67742bde2f4eeb47 -Author: Paul Larson <plars@users.sourceforge.net> -Date: Fri Mar 7 20:28:15 2003 +0000 - - Fix lcov.pl to work with the new gcov-kernel module - - ... ,documentation fixes in readme.txt - -commit e70d9abdb60b83de7174815371259c63fa75bf76 -Author: Robert Williamson <robbiew@users.sourceforge.net> -Date: Tue Feb 18 20:05:09 2003 +0000 - - Applied patch from Mike Kobler: - - One of my source file paths includes a "+" in the directory name. I found - that genhtml.pl died when it encountered it. I was able to fix the problem - by modifying the string with the escape character before parsing it. - -commit 69ef6f1b607670589aae1ae1e6c78ef1b5d204e3 -Author: Peter Oberparleiter <oberpapr@users.sourceforge.net> -Date: Fri Sep 6 09:04:34 2002 +0000 - - Replaced reference to "cat" cvs directory - - ... and to .zip package. - -commit c641f6e694e2bebf9ef0a507091460026463d169 -Author: Manoj Iyer <iyermanoj@users.sourceforge.net> -Date: Thu Sep 5 19:14:51 2002 +0000 - - Coverage analysis files. - - Peter worked on this version. diff --git a/ThirdParty/lcov/CONTRIBUTING b/ThirdParty/lcov/CONTRIBUTING deleted file mode 100644 index 6890789bd..000000000 --- a/ThirdParty/lcov/CONTRIBUTING +++ /dev/null @@ -1,93 +0,0 @@ -Contributing to LCOV -==================== - -Please read this document if you would like to help improving the LTP GCOV -extension (LCOV). In general, all types of contributions are welcome, for -example: - - * Fixes for code or documentation - * Performance and compatibility improvements - * Functional enhancements - -There are some rules that these contributions must follow to be acceptable for -inclusion: - - 1. The contribution must align with the project goals of LCOV. - 2. The contribution must follow a particular format. - 3. The contribution must be signed. - -Once you have made sure that your contribution follows these rules, send it via -e-mail to the LTP coverage mailing list [1]. - - -Signing your work -================= - -All contributions to LCOV must be signed by putting the following line at the -end of the explanation of a patch: - - Signed-off-by: Your Name <your.email@example.org> - -By signing a patch, you certify the following: - - By making a contribution to the LTP GCOV extension (LCOV) on - http://ltp.sourceforge.net, I certify that: - - a) The contribution was created by me and I have the right to submit it - under the terms and conditions of the open source license - "GNU General Public License, version 2 or later". - (http://www.gnu.org/licenses/old-licenses/gpl-2.0.html). - - b) The contribution is made free of any other party's intellectual property - claims or rights. - - c) I understand and agree that this project and the contribution are public - and that a record of the contribution (including all personal information - I submit with it, including my sign-off) is maintained indefinitely and - may be redistributed consistent with this project or the open source - license(s) involved. - - -Project goals -============= - -The goal of LCOV is to provide a set of command line tools that can be used to -collect, process and visualize code coverage data as produced by the gcov tool -that is part of the GNU Compiler Collection (GCC) [2]. - -If you have an idea for a contribution but are unsure if it aligns with the -project goals, feel free to discuss the idea on the LTP coverage mailing -list [1]. - - -Contribution format -=================== - -To contribute a change, please create a patch using 'git format-patch'. -Alternatively you can use the diff utility with the following command line -options: - - diff -Naurp - -Please base your changes on the most current version of LCOV. You can use the -following command line to obtain this version from the lcov Git repository: - - git clone https://github.com/linux-test-project/lcov.git - -Add a meaningful description of the contribution to the top of the patch. The -description should follow this format: - - component: short description - - detailed description - - Signed-off-by: Your Name <your.email@example.org> - -With your Signed-off-by, you certify the rules stated in section -"Signing your work". - - --- - -[1] ltp-coverage@lists.sourceforge.net -[2] http://gcc.gnu.org diff --git a/ThirdParty/lcov/COPYING b/ThirdParty/lcov/COPYING deleted file mode 100644 index d511905c1..000000000 --- a/ThirdParty/lcov/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/ThirdParty/lcov/Makefile b/ThirdParty/lcov/Makefile deleted file mode 100644 index 1207cb19a..000000000 --- a/ThirdParty/lcov/Makefile +++ /dev/null @@ -1,122 +0,0 @@ -# -# Makefile for LCOV -# -# Make targets: -# - install: install LCOV tools and man pages on the system -# - uninstall: remove tools and man pages from the system -# - dist: create files required for distribution, i.e. the lcov.tar.gz -# and the lcov.rpm file. Just make sure to adjust the VERSION -# and RELEASE variables below - both version and date strings -# will be updated in all necessary files. -# - clean: remove all generated files -# - -VERSION := $(shell bin/get_version.sh --version) -RELEASE := $(shell bin/get_version.sh --release) -FULL := $(shell bin/get_version.sh --full) - -# Set this variable during 'make install' to specify the Perl interpreter used in -# installed scripts, or leave empty to keep the current interpreter. -export LCOV_PERL_PATH := /usr/bin/perl - -PREFIX := /usr/local - -CFG_DIR := $(PREFIX)/etc -BIN_DIR := $(PREFIX)/bin -MAN_DIR := $(PREFIX)/share/man -TMP_DIR := $(shell mktemp -d) -FILES := $(wildcard bin/*) $(wildcard man/*) README Makefile \ - $(wildcard rpm/*) lcovrc - -.PHONY: all info clean install uninstall rpms test - -all: info - -info: - @echo "Available make targets:" - @echo " install : install binaries and man pages in DESTDIR (default /)" - @echo " uninstall : delete binaries and man pages from DESTDIR (default /)" - @echo " dist : create packages (RPM, tarball) ready for distribution" - @echo " test : perform self-tests" - -clean: - rm -f lcov-*.tar.gz - rm -f lcov-*.rpm - make -C example clean - make -C test -s clean - -install: - bin/install.sh bin/lcov $(DESTDIR)$(BIN_DIR)/lcov -m 755 - bin/install.sh bin/genhtml $(DESTDIR)$(BIN_DIR)/genhtml -m 755 - bin/install.sh bin/geninfo $(DESTDIR)$(BIN_DIR)/geninfo -m 755 - bin/install.sh bin/genpng $(DESTDIR)$(BIN_DIR)/genpng -m 755 - bin/install.sh bin/gendesc $(DESTDIR)$(BIN_DIR)/gendesc -m 755 - bin/install.sh man/lcov.1 $(DESTDIR)$(MAN_DIR)/man1/lcov.1 -m 644 - bin/install.sh man/genhtml.1 $(DESTDIR)$(MAN_DIR)/man1/genhtml.1 -m 644 - bin/install.sh man/geninfo.1 $(DESTDIR)$(MAN_DIR)/man1/geninfo.1 -m 644 - bin/install.sh man/genpng.1 $(DESTDIR)$(MAN_DIR)/man1/genpng.1 -m 644 - bin/install.sh man/gendesc.1 $(DESTDIR)$(MAN_DIR)/man1/gendesc.1 -m 644 - bin/install.sh man/lcovrc.5 $(DESTDIR)$(MAN_DIR)/man5/lcovrc.5 -m 644 - bin/install.sh lcovrc $(DESTDIR)$(CFG_DIR)/lcovrc -m 644 - bin/updateversion.pl $(DESTDIR)$(BIN_DIR)/lcov $(VERSION) $(RELEASE) $(FULL) - bin/updateversion.pl $(DESTDIR)$(BIN_DIR)/genhtml $(VERSION) $(RELEASE) $(FULL) - bin/updateversion.pl $(DESTDIR)$(BIN_DIR)/geninfo $(VERSION) $(RELEASE) $(FULL) - bin/updateversion.pl $(DESTDIR)$(BIN_DIR)/genpng $(VERSION) $(RELEASE) $(FULL) - bin/updateversion.pl $(DESTDIR)$(BIN_DIR)/gendesc $(VERSION) $(RELEASE) $(FULL) - bin/updateversion.pl $(DESTDIR)$(MAN_DIR)/man1/lcov.1 $(VERSION) $(RELEASE) $(FULL) - bin/updateversion.pl $(DESTDIR)$(MAN_DIR)/man1/genhtml.1 $(VERSION) $(RELEASE) $(FULL) - bin/updateversion.pl $(DESTDIR)$(MAN_DIR)/man1/geninfo.1 $(VERSION) $(RELEASE) $(FULL) - bin/updateversion.pl $(DESTDIR)$(MAN_DIR)/man1/genpng.1 $(VERSION) $(RELEASE) $(FULL) - bin/updateversion.pl $(DESTDIR)$(MAN_DIR)/man1/gendesc.1 $(VERSION) $(RELEASE) $(FULL) - bin/updateversion.pl $(DESTDIR)$(MAN_DIR)/man5/lcovrc.5 $(VERSION) $(RELEASE) $(FULL) - -uninstall: - bin/install.sh --uninstall bin/lcov $(DESTDIR)$(BIN_DIR)/lcov - bin/install.sh --uninstall bin/genhtml $(DESTDIR)$(BIN_DIR)/genhtml - bin/install.sh --uninstall bin/geninfo $(DESTDIR)$(BIN_DIR)/geninfo - bin/install.sh --uninstall bin/genpng $(DESTDIR)$(BIN_DIR)/genpng - bin/install.sh --uninstall bin/gendesc $(DESTDIR)$(BIN_DIR)/gendesc - bin/install.sh --uninstall man/lcov.1 $(DESTDIR)$(MAN_DIR)/man1/lcov.1 - bin/install.sh --uninstall man/genhtml.1 $(DESTDIR)$(MAN_DIR)/man1/genhtml.1 - bin/install.sh --uninstall man/geninfo.1 $(DESTDIR)$(MAN_DIR)/man1/geninfo.1 - bin/install.sh --uninstall man/genpng.1 $(DESTDIR)$(MAN_DIR)/man1/genpng.1 - bin/install.sh --uninstall man/gendesc.1 $(DESTDIR)$(MAN_DIR)/man1/gendesc.1 - bin/install.sh --uninstall man/lcovrc.5 $(DESTDIR)$(MAN_DIR)/man5/lcovrc.5 - bin/install.sh --uninstall lcovrc $(DESTDIR)$(CFG_DIR)/lcovrc - -dist: lcov-$(VERSION).tar.gz lcov-$(VERSION)-$(RELEASE).noarch.rpm \ - lcov-$(VERSION)-$(RELEASE).src.rpm - -lcov-$(VERSION).tar.gz: $(FILES) - mkdir $(TMP_DIR)/lcov-$(VERSION) - cp -r * $(TMP_DIR)/lcov-$(VERSION) - bin/copy_dates.sh . $(TMP_DIR)/lcov-$(VERSION) - make -C $(TMP_DIR)/lcov-$(VERSION) clean - bin/updateversion.pl $(TMP_DIR)/lcov-$(VERSION) $(VERSION) $(RELEASE) $(FULL) - bin/get_changes.sh > $(TMP_DIR)/lcov-$(VERSION)/CHANGES - cd $(TMP_DIR) ; \ - tar cfz $(TMP_DIR)/lcov-$(VERSION).tar.gz lcov-$(VERSION) - mv $(TMP_DIR)/lcov-$(VERSION).tar.gz . - rm -rf $(TMP_DIR) - -lcov-$(VERSION)-$(RELEASE).noarch.rpm: rpms -lcov-$(VERSION)-$(RELEASE).src.rpm: rpms - -rpms: lcov-$(VERSION).tar.gz - mkdir $(TMP_DIR) - mkdir $(TMP_DIR)/BUILD - mkdir $(TMP_DIR)/RPMS - mkdir $(TMP_DIR)/SOURCES - mkdir $(TMP_DIR)/SRPMS - cp lcov-$(VERSION).tar.gz $(TMP_DIR)/SOURCES - cd $(TMP_DIR)/BUILD ; \ - tar xfz $(TMP_DIR)/SOURCES/lcov-$(VERSION).tar.gz \ - lcov-$(VERSION)/rpm/lcov.spec - rpmbuild --define '_topdir $(TMP_DIR)' \ - -ba $(TMP_DIR)/BUILD/lcov-$(VERSION)/rpm/lcov.spec - mv $(TMP_DIR)/RPMS/noarch/lcov-$(VERSION)-$(RELEASE).noarch.rpm . - mv $(TMP_DIR)/SRPMS/lcov-$(VERSION)-$(RELEASE).src.rpm . - rm -rf $(TMP_DIR) - -test: - @make -C test -s all diff --git a/ThirdParty/lcov/README b/ThirdParty/lcov/README deleted file mode 100644 index ad53c3cbc..000000000 --- a/ThirdParty/lcov/README +++ /dev/null @@ -1,135 +0,0 @@ -------------------------------------------------- -- README file for the LTP GCOV extension (LCOV) - -- Last changes: 2019-02-28 - -------------------------------------------------- - -Description ------------ - LCOV is an extension of GCOV, a GNU tool which provides information about - what parts of a program are actually executed (i.e. "covered") while running - a particular test case. The extension consists of a set of Perl scripts - which build on the textual GCOV output to implement the following enhanced - functionality: - - * HTML based output: coverage rates are additionally indicated using bar - graphs and specific colors. - - * Support for large projects: overview pages allow quick browsing of - coverage data by providing three levels of detail: directory view, - file view and source code view. - - LCOV was initially designed to support Linux kernel coverage measurements, - but works as well for coverage measurements on standard user space - applications. - - -Further README contents ------------------------ - 1. Included files - 2. Installing LCOV - 3. An example of how to access kernel coverage data - 4. An example of how to access coverage data for a user space program - 5. Questions and Comments - - - -1. Important files ------------------- - README - This README file - CHANGES - List of changes between releases - bin/lcov - Tool for capturing LCOV coverage data - bin/genhtml - Tool for creating HTML output from LCOV data - bin/gendesc - Tool for creating description files as used by genhtml - bin/geninfo - Internal tool (creates LCOV data files) - bin/genpng - Internal tool (creates png overviews of source files) - bin/install.sh - Internal tool (takes care of un-/installing) - man - Directory containing man pages for included tools - example - Directory containing an example to demonstrate LCOV - lcovrc - LCOV configuration file - Makefile - Makefile providing 'install' and 'uninstall' targets - - -2. Installing LCOV ------------------- -The LCOV package is available as either RPM or tarball from: - - http://ltp.sourceforge.net/coverage/lcov.php - -To install the tarball, unpack it to a directory and run: - - make install - -Use Git for the most recent (but possibly unstable) version: - - git clone https://github.com/linux-test-project/lcov.git - -Change to the resulting lcov directory and type: - - make install - - -3. An example of how to access kernel coverage data ---------------------------------------------------- -Requirements: get and install the gcov-kernel package from - - http://sourceforge.net/projects/ltp - -Copy the resulting gcov kernel module file to either the system wide modules -directory or the same directory as the Perl scripts. As root, do the following: - - a) Resetting counters - - lcov --zerocounters - - b) Capturing the current coverage state to a file - - lcov --capture --output-file kernel.info - - c) Getting HTML output - - genhtml kernel.info - -Point the web browser of your choice to the resulting index.html file. - - -4. An example of how to access coverage data for a user space program ---------------------------------------------------------------------- -Requirements: compile the program in question using GCC with the options --fprofile-arcs and -ftest-coverage. During linking, make sure to specify --lgcov or -coverage. - -Assuming the compile directory is called "appdir", do the following: - - a) Resetting counters - - lcov --directory appdir --zerocounters - - b) Capturing the current coverage state to a file - - lcov --directory appdir --capture --output-file app.info - - Note that this step only works after the application has - been started and stopped at least once. Otherwise lcov will - abort with an error mentioning that there are no data/.gcda files. - - c) Getting HTML output - - genhtml app.info - -Point the web browser of your choice to the resulting index.html file. - -Please note that independently of where the application is installed or -from which directory it is run, the --directory statement needs to -point to the directory in which the application was compiled. - -For further information on the gcc profiling mechanism, please also -consult the gcov man page. - - -5. Questions and comments -------------------------- -See the included man pages for more information on how to use the LCOV tools. - -Please email further questions or comments regarding this tool to the -LTP Mailing list at ltp-coverage@lists.sourceforge.net - diff --git a/ThirdParty/lcov/bin/copy_dates.sh b/ThirdParty/lcov/bin/copy_dates.sh deleted file mode 100755 index aef5f5ed3..000000000 --- a/ThirdParty/lcov/bin/copy_dates.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash -# -# Usage: copy_dates.sh SOURCE TARGET -# -# For each file found in SOURCE, set the modification time of the copy of that -# file in TARGET to either the time of the latest Git commit (if SOURCE contains -# a Git repository and the file was not modified after the last commit), or the -# modification time of the original file. - -SOURCE="$1" -TARGET="$2" - -if [ -z "$SOURCE" -o -z "$TARGET" ] ; then - echo "Usage: $0 SOURCE TARGET" >&2 - exit 1 -fi - -[ -d "$SOURCE/.git" ] ; NOGIT=$? - -echo "Copying modification/commit times from $SOURCE to $TARGET" - -cd "$SOURCE" || exit 1 -find * -type f | while read FILENAME ; do - [ ! -e "$TARGET/$FILENAME" ] && continue - - # Copy modification time - touch -m "$TARGET/$FILENAME" -r "$FILENAME" - - [ $NOGIT -eq 1 ] && continue # No Git - git diff --quiet -- "$FILENAME" || continue # Modified - git diff --quiet --cached -- "$FILENAME" || continue # Modified - - # Apply modification time from Git commit time - TIME=$(git log --pretty=format:%cd -n 1 --date=iso -- "$FILENAME") - [ -n "$TIME" ] && touch -m "$TARGET/$FILENAME" --date "$TIME" -done diff --git a/ThirdParty/lcov/bin/gendesc b/ThirdParty/lcov/bin/gendesc deleted file mode 100755 index 334ee7892..000000000 --- a/ThirdParty/lcov/bin/gendesc +++ /dev/null @@ -1,226 +0,0 @@ -#!/usr/bin/env perl -# -# Copyright (c) International Business Machines Corp., 2002 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# gendesc -# -# This script creates a description file as understood by genhtml. -# Input file format: -# -# For each test case: -# <test name><optional whitespace> -# <at least one whitespace character (blank/tab)><test description> -# -# Actual description may consist of several lines. By default, output is -# written to stdout. Test names consist of alphanumeric characters -# including _ and -. -# -# -# History: -# 2002-09-02: created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> -# - -use strict; -use warnings; -use File::Basename; -use Getopt::Long; -use Cwd qw/abs_path/; - - -# Constants -our $tool_dir = abs_path(dirname($0)); -our $lcov_version = "LCOV version 1.14"; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $tool_name = basename($0); - - -# Prototypes -sub print_usage(*); -sub gen_desc(); -sub warn_handler($); -sub die_handler($); - - -# Global variables -our $help; -our $version; -our $output_filename; -our $input_filename; - - -# -# Code entry point -# - -$SIG{__WARN__} = \&warn_handler; -$SIG{__DIE__} = \&die_handler; - -# Parse command line options -if (!GetOptions("output-filename=s" => \$output_filename, - "version" =>\$version, - "help|?" => \$help - )) -{ - print(STDERR "Use $tool_name --help to get usage information\n"); - exit(1); -} - -$input_filename = $ARGV[0]; - -# Check for help option -if ($help) -{ - print_usage(*STDOUT); - exit(0); -} - -# Check for version option -if ($version) -{ - print("$tool_name: $lcov_version\n"); - exit(0); -} - - -# Check for input filename -if (!$input_filename) -{ - die("No input filename specified\n". - "Use $tool_name --help to get usage information\n"); -} - -# Do something -gen_desc(); - - -# -# print_usage(handle) -# -# Write out command line usage information to given filehandle. -# - -sub print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE <<END_OF_USAGE) -Usage: $tool_name [OPTIONS] INPUTFILE - -Convert a test case description file into a format as understood by genhtml. - - -h, --help Print this help, then exit - -v, --version Print version number, then exit - -o, --output-filename FILENAME Write description to FILENAME - -For more information see: $lcov_url -END_OF_USAGE - ; -} - - -# -# gen_desc() -# -# Read text file INPUT_FILENAME and convert the contained description to a -# format as understood by genhtml, i.e. -# -# TN:<test name> -# TD:<test description> -# -# If defined, write output to OUTPUT_FILENAME, otherwise to stdout. -# -# Die on error. -# - -sub gen_desc() -{ - local *INPUT_HANDLE; - local *OUTPUT_HANDLE; - my $empty_line = "ignore"; - - open(INPUT_HANDLE, "<", $input_filename) - or die("ERROR: cannot open $input_filename!\n"); - - # Open output file for writing - if ($output_filename) - { - open(OUTPUT_HANDLE, ">", $output_filename) - or die("ERROR: cannot create $output_filename!\n"); - } - else - { - *OUTPUT_HANDLE = *STDOUT; - } - - # Process all lines in input file - while (<INPUT_HANDLE>) - { - chomp($_); - - if (/^(\w[\w-]*)(\s*)$/) - { - # Matched test name - # Name starts with alphanum or _, continues with - # alphanum, _ or - - print(OUTPUT_HANDLE "TN: $1\n"); - $empty_line = "ignore"; - } - elsif (/^(\s+)(\S.*?)\s*$/) - { - # Matched test description - if ($empty_line eq "insert") - { - # Write preserved empty line - print(OUTPUT_HANDLE "TD: \n"); - } - print(OUTPUT_HANDLE "TD: $2\n"); - $empty_line = "observe"; - } - elsif (/^\s*$/) - { - # Matched empty line to preserve paragraph separation - # inside description text - if ($empty_line eq "observe") - { - $empty_line = "insert"; - } - } - } - - # Close output file if defined - if ($output_filename) - { - close(OUTPUT_HANDLE); - } - - close(INPUT_HANDLE); -} - -sub warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} diff --git a/ThirdParty/lcov/bin/genhtml b/ThirdParty/lcov/bin/genhtml deleted file mode 100755 index 2352300c1..000000000 --- a/ThirdParty/lcov/bin/genhtml +++ /dev/null @@ -1,5974 +0,0 @@ -#!/usr/bin/env perl -# -# Copyright (c) International Business Machines Corp., 2002,2012 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# genhtml -# -# This script generates HTML output from .info files as created by the -# geninfo script. Call it with --help and refer to the genhtml man page -# to get information on usage and available options. -# -# -# History: -# 2002-08-23 created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> -# IBM Lab Boeblingen -# based on code by Manoj Iyer <manjo@mail.utexas.edu> and -# Megan Bock <mbock@us.ibm.com> -# IBM Austin -# 2002-08-27 / Peter Oberparleiter: implemented frame view -# 2002-08-29 / Peter Oberparleiter: implemented test description filtering -# so that by default only descriptions for test cases which -# actually hit some source lines are kept -# 2002-09-05 / Peter Oberparleiter: implemented --no-sourceview -# 2002-09-05 / Mike Kobler: One of my source file paths includes a "+" in -# the directory name. I found that genhtml.pl died when it -# encountered it. I was able to fix the problem by modifying -# the string with the escape character before parsing it. -# 2002-10-26 / Peter Oberparleiter: implemented --num-spaces -# 2003-04-07 / Peter Oberparleiter: fixed bug which resulted in an error -# when trying to combine .info files containing data without -# a test name -# 2003-04-10 / Peter Oberparleiter: extended fix by Mike to also cover -# other special characters -# 2003-04-30 / Peter Oberparleiter: made info write to STDERR, not STDOUT -# 2003-07-10 / Peter Oberparleiter: added line checksum support -# 2004-08-09 / Peter Oberparleiter: added configuration file support -# 2005-03-04 / Cal Pierog: added legend to HTML output, fixed coloring of -# "good coverage" background -# 2006-03-18 / Marcus Boerger: added --custom-intro, --custom-outro and -# overwrite --no-prefix if --prefix is present -# 2006-03-20 / Peter Oberparleiter: changes to custom_* function (rename -# to html_prolog/_epilog, minor modifications to implementation), -# changed prefix/noprefix handling to be consistent with current -# logic -# 2006-03-20 / Peter Oberparleiter: added --html-extension option -# 2008-07-14 / Tom Zoerner: added --function-coverage command line option; -# added function table to source file page -# 2008-08-13 / Peter Oberparleiter: modified function coverage -# implementation (now enabled per default), -# introduced sorting option (enabled per default) -# - -use strict; -use warnings; -use File::Basename; -use File::Temp qw(tempfile); -use Getopt::Long; -use Digest::MD5 qw(md5_base64); -use Cwd qw/abs_path cwd/; - - -# Global constants -our $title = "LCOV - code coverage report"; -our $tool_dir = abs_path(dirname($0)); -our $lcov_version = "LCOV version 1.14"; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $tool_name = basename($0); - -# Specify coverage rate default precision -our $default_precision = 1; - -# Specify coverage rate limits (in %) for classifying file entries -# HI: $hi_limit <= rate <= 100 graph color: green -# MED: $med_limit <= rate < $hi_limit graph color: orange -# LO: 0 <= rate < $med_limit graph color: red - -# For line coverage/all coverage types if not specified -our $hi_limit = 90; -our $med_limit = 75; - -# For function coverage -our $fn_hi_limit; -our $fn_med_limit; - -# For branch coverage -our $br_hi_limit; -our $br_med_limit; - -# Width of overview image -our $overview_width = 80; - -# Resolution of overview navigation: this number specifies the maximum -# difference in lines between the position a user selected from the overview -# and the position the source code window is scrolled to. -our $nav_resolution = 4; - -# Clicking a line in the overview image should show the source code view at -# a position a bit further up so that the requested line is not the first -# line in the window. This number specifies that offset in lines. -our $nav_offset = 10; - -# Clicking on a function name should show the source code at a position a -# few lines before the first line of code of that function. This number -# specifies that offset in lines. -our $func_offset = 2; - -our $overview_title = "top level"; - -# Width for line coverage information in the source code view -our $line_field_width = 12; - -# Width for branch coverage information in the source code view -our $br_field_width = 16; - -# Internal Constants - -# Header types -our $HDR_DIR = 0; -our $HDR_FILE = 1; -our $HDR_SOURCE = 2; -our $HDR_TESTDESC = 3; -our $HDR_FUNC = 4; - -# Sort types -our $SORT_FILE = 0; -our $SORT_LINE = 1; -our $SORT_FUNC = 2; -our $SORT_BRANCH = 3; - -# Fileview heading types -our $HEAD_NO_DETAIL = 1; -our $HEAD_DETAIL_HIDDEN = 2; -our $HEAD_DETAIL_SHOWN = 3; - -# Additional offsets used when converting branch coverage data to HTML -our $BR_LEN = 3; -our $BR_OPEN = 4; -our $BR_CLOSE = 5; - -# Branch data combination types -our $BR_SUB = 0; -our $BR_ADD = 1; - -# Error classes which users may specify to ignore during processing -our $ERROR_SOURCE = 0; -our %ERROR_ID = ( - "source" => $ERROR_SOURCE, -); - -# Data related prototypes -sub print_usage(*); -sub gen_html(); -sub html_create($$); -sub process_dir($); -sub process_file($$$); -sub info(@); -sub read_info_file($); -sub get_info_entry($); -sub set_info_entry($$$$$$$$$;$$$$$$); -sub get_prefix($@); -sub shorten_prefix($); -sub get_dir_list(@); -sub get_relative_base_path($); -sub read_testfile($); -sub get_date_string(); -sub create_sub_dir($); -sub subtract_counts($$); -sub add_counts($$); -sub apply_baseline($$); -sub remove_unused_descriptions(); -sub get_found_and_hit($); -sub get_affecting_tests($$$); -sub combine_info_files($$); -sub merge_checksums($$$); -sub combine_info_entries($$$); -sub apply_prefix($@); -sub system_no_output($@); -sub read_config($); -sub apply_config($); -sub get_html_prolog($); -sub get_html_epilog($); -sub write_dir_page($$$$$$$$$$$$$$$$$); -sub classify_rate($$$$); -sub combine_brcount($$$;$); -sub get_br_found_and_hit($); -sub warn_handler($); -sub die_handler($); -sub parse_ignore_errors(@); -sub parse_dir_prefix(@); -sub rate($$;$$$); - - -# HTML related prototypes -sub escape_html($); -sub get_bar_graph_code($$$); - -sub write_png_files(); -sub write_htaccess_file(); -sub write_css_file(); -sub write_description_file($$$$$$$); -sub write_function_table(*$$$$$$$$$$); - -sub write_html(*$); -sub write_html_prolog(*$$); -sub write_html_epilog(*$;$); - -sub write_header(*$$$$$$$$$$); -sub write_header_prolog(*$); -sub write_header_line(*@); -sub write_header_epilog(*$); - -sub write_file_table(*$$$$$$$); -sub write_file_table_prolog(*$@); -sub write_file_table_entry(*$$$@); -sub write_file_table_detail_entry(*$@); -sub write_file_table_epilog(*); - -sub write_test_table_prolog(*$); -sub write_test_table_entry(*$$); -sub write_test_table_epilog(*); - -sub write_source($$$$$$$); -sub write_source_prolog(*); -sub write_source_line(*$$$$$); -sub write_source_epilog(*); - -sub write_frameset(*$$$); -sub write_overview_line(*$$$); -sub write_overview(*$$$$); - -# External prototype (defined in genpng) -sub gen_png($$$@); - - -# Global variables & initialization -our %info_data; # Hash containing all data from .info file -our @opt_dir_prefix; # Array of prefixes to remove from all sub directories -our @dir_prefix; -our %test_description; # Hash containing test descriptions if available -our $date = get_date_string(); - -our @info_filenames; # List of .info files to use as data source -our $test_title; # Title for output as written to each page header -our $output_directory; # Name of directory in which to store output -our $base_filename; # Optional name of file containing baseline data -our $desc_filename; # Name of file containing test descriptions -our $css_filename; # Optional name of external stylesheet file to use -our $quiet; # If set, suppress information messages -our $help; # Help option flag -our $version; # Version option flag -our $show_details; # If set, generate detailed directory view -our $no_prefix; # If set, do not remove filename prefix -our $func_coverage; # If set, generate function coverage statistics -our $no_func_coverage; # Disable func_coverage -our $br_coverage; # If set, generate branch coverage statistics -our $no_br_coverage; # Disable br_coverage -our $sort = 1; # If set, provide directory listings with sorted entries -our $no_sort; # Disable sort -our $frames; # If set, use frames for source code view -our $keep_descriptions; # If set, do not remove unused test case descriptions -our $no_sourceview; # If set, do not create a source code view for each file -our $highlight; # If set, highlight lines covered by converted data only -our $legend; # If set, include legend in output -our $tab_size = 8; # Number of spaces to use in place of tab -our $config; # Configuration file contents -our $html_prolog_file; # Custom HTML prolog file (up to and including <body>) -our $html_epilog_file; # Custom HTML epilog file (from </body> onwards) -our $html_prolog; # Actual HTML prolog -our $html_epilog; # Actual HTML epilog -our $html_ext = "html"; # Extension for generated HTML files -our $html_gzip = 0; # Compress with gzip -our $demangle_cpp = 0; # Demangle C++ function names -our @opt_ignore_errors; # Ignore certain error classes during processing -our @ignore; -our $opt_config_file; # User-specified configuration file location -our %opt_rc; -our $opt_missed; # List/sort lines by missed counts -our $charset = "UTF-8"; # Default charset for HTML pages -our @fileview_sortlist; -our @fileview_sortname = ("", "-sort-l", "-sort-f", "-sort-b"); -our @funcview_sortlist; -our @rate_name = ("Lo", "Med", "Hi"); -our @rate_png = ("ruby.png", "amber.png", "emerald.png"); -our $lcov_func_coverage = 1; -our $lcov_branch_coverage = 0; -our $rc_desc_html = 0; # lcovrc: genhtml_desc_html - -our $cwd = cwd(); # Current working directory - - -# -# Code entry point -# - -$SIG{__WARN__} = \&warn_handler; -$SIG{__DIE__} = \&die_handler; - -# Check command line for a configuration file name -Getopt::Long::Configure("pass_through", "no_auto_abbrev"); -GetOptions("config-file=s" => \$opt_config_file, - "rc=s%" => \%opt_rc); -Getopt::Long::Configure("default"); - -{ - # Remove spaces around rc options - my %new_opt_rc; - - while (my ($key, $value) = each(%opt_rc)) { - $key =~ s/^\s+|\s+$//g; - $value =~ s/^\s+|\s+$//g; - - $new_opt_rc{$key} = $value; - } - %opt_rc = %new_opt_rc; -} - -# Read configuration file if available -if (defined($opt_config_file)) { - $config = read_config($opt_config_file); -} elsif (defined($ENV{"HOME"}) && (-r $ENV{"HOME"}."/.lcovrc")) -{ - $config = read_config($ENV{"HOME"}."/.lcovrc"); -} -elsif (-r "/etc/lcovrc") -{ - $config = read_config("/etc/lcovrc"); -} elsif (-r "/usr/local/etc/lcovrc") -{ - $config = read_config("/usr/local/etc/lcovrc"); -} - -if ($config || %opt_rc) -{ - # Copy configuration file and --rc values to variables - apply_config({ - "genhtml_css_file" => \$css_filename, - "genhtml_hi_limit" => \$hi_limit, - "genhtml_med_limit" => \$med_limit, - "genhtml_line_field_width" => \$line_field_width, - "genhtml_overview_width" => \$overview_width, - "genhtml_nav_resolution" => \$nav_resolution, - "genhtml_nav_offset" => \$nav_offset, - "genhtml_keep_descriptions" => \$keep_descriptions, - "genhtml_no_prefix" => \$no_prefix, - "genhtml_no_source" => \$no_sourceview, - "genhtml_num_spaces" => \$tab_size, - "genhtml_highlight" => \$highlight, - "genhtml_legend" => \$legend, - "genhtml_html_prolog" => \$html_prolog_file, - "genhtml_html_epilog" => \$html_epilog_file, - "genhtml_html_extension" => \$html_ext, - "genhtml_html_gzip" => \$html_gzip, - "genhtml_precision" => \$default_precision, - "genhtml_function_hi_limit" => \$fn_hi_limit, - "genhtml_function_med_limit" => \$fn_med_limit, - "genhtml_function_coverage" => \$func_coverage, - "genhtml_branch_hi_limit" => \$br_hi_limit, - "genhtml_branch_med_limit" => \$br_med_limit, - "genhtml_branch_coverage" => \$br_coverage, - "genhtml_branch_field_width" => \$br_field_width, - "genhtml_sort" => \$sort, - "genhtml_charset" => \$charset, - "genhtml_desc_html" => \$rc_desc_html, - "genhtml_demangle_cpp" => \$demangle_cpp, - "genhtml_missed" => \$opt_missed, - "lcov_function_coverage" => \$lcov_func_coverage, - "lcov_branch_coverage" => \$lcov_branch_coverage, - }); -} - -# Copy related values if not specified -$fn_hi_limit = $hi_limit if (!defined($fn_hi_limit)); -$fn_med_limit = $med_limit if (!defined($fn_med_limit)); -$br_hi_limit = $hi_limit if (!defined($br_hi_limit)); -$br_med_limit = $med_limit if (!defined($br_med_limit)); -$func_coverage = $lcov_func_coverage if (!defined($func_coverage)); -$br_coverage = $lcov_branch_coverage if (!defined($br_coverage)); - -# Parse command line options -if (!GetOptions("output-directory|o=s" => \$output_directory, - "title|t=s" => \$test_title, - "description-file|d=s" => \$desc_filename, - "keep-descriptions|k" => \$keep_descriptions, - "css-file|c=s" => \$css_filename, - "baseline-file|b=s" => \$base_filename, - "prefix|p=s" => \@opt_dir_prefix, - "num-spaces=i" => \$tab_size, - "no-prefix" => \$no_prefix, - "no-sourceview" => \$no_sourceview, - "show-details|s" => \$show_details, - "frames|f" => \$frames, - "highlight" => \$highlight, - "legend" => \$legend, - "quiet|q" => \$quiet, - "help|h|?" => \$help, - "version|v" => \$version, - "html-prolog=s" => \$html_prolog_file, - "html-epilog=s" => \$html_epilog_file, - "html-extension=s" => \$html_ext, - "html-gzip" => \$html_gzip, - "function-coverage" => \$func_coverage, - "no-function-coverage" => \$no_func_coverage, - "branch-coverage" => \$br_coverage, - "no-branch-coverage" => \$no_br_coverage, - "sort" => \$sort, - "no-sort" => \$no_sort, - "demangle-cpp" => \$demangle_cpp, - "ignore-errors=s" => \@opt_ignore_errors, - "config-file=s" => \$opt_config_file, - "rc=s%" => \%opt_rc, - "precision=i" => \$default_precision, - "missed" => \$opt_missed, - )) -{ - print(STDERR "Use $tool_name --help to get usage information\n"); - exit(1); -} else { - # Merge options - if ($no_func_coverage) { - $func_coverage = 0; - } - if ($no_br_coverage) { - $br_coverage = 0; - } - - # Merge sort options - if ($no_sort) { - $sort = 0; - } -} - -@info_filenames = @ARGV; - -# Check for help option -if ($help) -{ - print_usage(*STDOUT); - exit(0); -} - -# Check for version option -if ($version) -{ - print("$tool_name: $lcov_version\n"); - exit(0); -} - -# Determine which errors the user wants us to ignore -parse_ignore_errors(@opt_ignore_errors); - -# Split the list of prefixes if needed -parse_dir_prefix(@opt_dir_prefix); - -# Check for info filename -if (!@info_filenames) -{ - die("No filename specified\n". - "Use $tool_name --help to get usage information\n"); -} - -# Generate a title if none is specified -if (!$test_title) -{ - if (scalar(@info_filenames) == 1) - { - # Only one filename specified, use it as title - $test_title = basename($info_filenames[0]); - } - else - { - # More than one filename specified, used default title - $test_title = "unnamed"; - } -} - -# Make sure css_filename is an absolute path (in case we're changing -# directories) -if ($css_filename) -{ - if (!($css_filename =~ /^\/(.*)$/)) - { - $css_filename = $cwd."/".$css_filename; - } -} - -# Make sure tab_size is within valid range -if ($tab_size < 1) -{ - print(STDERR "ERROR: invalid number of spaces specified: ". - "$tab_size!\n"); - exit(1); -} - -# Get HTML prolog and epilog -$html_prolog = get_html_prolog($html_prolog_file); -$html_epilog = get_html_epilog($html_epilog_file); - -# Issue a warning if --no-sourceview is enabled together with --frames -if ($no_sourceview && defined($frames)) -{ - warn("WARNING: option --frames disabled because --no-sourceview ". - "was specified!\n"); - $frames = undef; -} - -# Issue a warning if --no-prefix is enabled together with --prefix -if ($no_prefix && @dir_prefix) -{ - warn("WARNING: option --prefix disabled because --no-prefix was ". - "specified!\n"); - @dir_prefix = undef; -} - -@fileview_sortlist = ($SORT_FILE); -@funcview_sortlist = ($SORT_FILE); - -if ($sort) { - push(@fileview_sortlist, $SORT_LINE); - push(@fileview_sortlist, $SORT_FUNC) if ($func_coverage); - push(@fileview_sortlist, $SORT_BRANCH) if ($br_coverage); - push(@funcview_sortlist, $SORT_LINE); -} - -if ($frames) -{ - # Include genpng code needed for overview image generation - do("$tool_dir/genpng"); -} - -# Ensure that the c++filt tool is available when using --demangle-cpp -if ($demangle_cpp) -{ - if (system_no_output(3, "c++filt", "--version")) { - die("ERROR: could not find c++filt tool needed for ". - "--demangle-cpp\n"); - } -} - -# Make sure precision is within valid range -if ($default_precision < 1 || $default_precision > 4) -{ - die("ERROR: specified precision is out of range (1 to 4)\n"); -} - - -# Make sure output_directory exists, create it if necessary -if ($output_directory) -{ - stat($output_directory); - - if (! -e _) - { - create_sub_dir($output_directory); - } -} - -# Do something -gen_html(); - -exit(0); - - - -# -# print_usage(handle) -# -# Print usage information. -# - -sub print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE <<END_OF_USAGE); -Usage: $tool_name [OPTIONS] INFOFILE(S) - -Create HTML output for coverage data found in INFOFILE. Note that INFOFILE -may also be a list of filenames. - -Misc: - -h, --help Print this help, then exit - -v, --version Print version number, then exit - -q, --quiet Do not print progress messages - --config-file FILENAME Specify configuration file location - --rc SETTING=VALUE Override configuration file setting - --ignore-errors ERRORS Continue after ERRORS (source) - -Operation: - -o, --output-directory OUTDIR Write HTML output to OUTDIR - -s, --show-details Generate detailed directory view - -d, --description-file DESCFILE Read test case descriptions from DESCFILE - -k, --keep-descriptions Do not remove unused test descriptions - -b, --baseline-file BASEFILE Use BASEFILE as baseline file - -p, --prefix PREFIX Remove PREFIX from all directory names - --no-prefix Do not remove prefix from directory names - --(no-)function-coverage Enable (disable) function coverage display - --(no-)branch-coverage Enable (disable) branch coverage display - -HTML output: - -f, --frames Use HTML frames for source code view - -t, --title TITLE Display TITLE in header of all pages - -c, --css-file CSSFILE Use external style sheet file CSSFILE - --no-source Do not create source code view - --num-spaces NUM Replace tabs with NUM spaces in source view - --highlight Highlight lines with converted-only data - --legend Include color legend in HTML output - --html-prolog FILE Use FILE as HTML prolog for generated pages - --html-epilog FILE Use FILE as HTML epilog for generated pages - --html-extension EXT Use EXT as filename extension for pages - --html-gzip Use gzip to compress HTML - --(no-)sort Enable (disable) sorted coverage views - --demangle-cpp Demangle C++ function names - --precision NUM Set precision of coverage rate - --missed Show miss counts as negative numbers - -For more information see: $lcov_url -END_OF_USAGE - ; -} - - -# -# get_rate(found, hit) -# -# Return a relative value for the specified found&hit values -# which is used for sorting the corresponding entries in a -# file list. -# - -sub get_rate($$) -{ - my ($found, $hit) = @_; - - if ($found == 0) { - return 10000; - } - return int($hit * 1000 / $found) * 10 + 2 - (1 / $found); -} - - -# -# get_overall_line(found, hit, name_singular, name_plural) -# -# Return a string containing overall information for the specified -# found/hit data. -# - -sub get_overall_line($$$$) -{ - my ($found, $hit, $name_sn, $name_pl) = @_; - my $name; - - return "no data found" if (!defined($found) || $found == 0); - $name = ($found == 1) ? $name_sn : $name_pl; - return rate($hit, $found, "% ($hit of $found $name)"); -} - - -# -# print_overall_rate(ln_do, ln_found, ln_hit, fn_do, fn_found, fn_hit, br_do -# br_found, br_hit) -# -# Print overall coverage rates for the specified coverage types. -# - -sub print_overall_rate($$$$$$$$$) -{ - my ($ln_do, $ln_found, $ln_hit, $fn_do, $fn_found, $fn_hit, - $br_do, $br_found, $br_hit) = @_; - - info("Overall coverage rate:\n"); - info(" lines......: %s\n", - get_overall_line($ln_found, $ln_hit, "line", "lines")) - if ($ln_do); - info(" functions..: %s\n", - get_overall_line($fn_found, $fn_hit, "function", "functions")) - if ($fn_do); - info(" branches...: %s\n", - get_overall_line($br_found, $br_hit, "branch", "branches")) - if ($br_do); -} - -sub get_fn_list($) -{ - my ($info) = @_; - my %fns; - my @result; - - foreach my $filename (keys(%{$info})) { - my $data = $info->{$filename}; - my $funcdata = $data->{"func"}; - my $sumfnccount = $data->{"sumfnc"}; - - if (defined($funcdata)) { - foreach my $func_name (keys(%{$funcdata})) { - $fns{$func_name} = 1; - } - } - - if (defined($sumfnccount)) { - foreach my $func_name (keys(%{$sumfnccount})) { - $fns{$func_name} = 1; - } - } - } - - @result = keys(%fns); - - return \@result; -} - -# -# rename_functions(info, conv) -# -# Rename all function names in INFO according to CONV: OLD_NAME -> NEW_NAME. -# In case two functions demangle to the same name, assume that they are -# different object code implementations for the same source function. -# - -sub rename_functions($$) -{ - my ($info, $conv) = @_; - - foreach my $filename (keys(%{$info})) { - my $data = $info->{$filename}; - my $funcdata; - my $testfncdata; - my $sumfnccount; - my %newfuncdata; - my %newsumfnccount; - my $f_found; - my $f_hit; - - # funcdata: function name -> line number - $funcdata = $data->{"func"}; - foreach my $fn (keys(%{$funcdata})) { - my $cn = $conv->{$fn}; - - # Abort if two functions on different lines map to the - # same demangled name. - if (defined($newfuncdata{$cn}) && - $newfuncdata{$cn} != $funcdata->{$fn}) { - die("ERROR: Demangled function name $cn ". - "maps to different lines (". - $newfuncdata{$cn}." vs ". - $funcdata->{$fn}.") in $filename\n"); - } - $newfuncdata{$cn} = $funcdata->{$fn}; - } - $data->{"func"} = \%newfuncdata; - - # testfncdata: test name -> testfnccount - # testfnccount: function name -> execution count - $testfncdata = $data->{"testfnc"}; - foreach my $tn (keys(%{$testfncdata})) { - my $testfnccount = $testfncdata->{$tn}; - my %newtestfnccount; - - foreach my $fn (keys(%{$testfnccount})) { - my $cn = $conv->{$fn}; - - # Add counts for different functions that map - # to the same name. - $newtestfnccount{$cn} += - $testfnccount->{$fn}; - } - $testfncdata->{$tn} = \%newtestfnccount; - } - - # sumfnccount: function name -> execution count - $sumfnccount = $data->{"sumfnc"}; - foreach my $fn (keys(%{$sumfnccount})) { - my $cn = $conv->{$fn}; - - # Add counts for different functions that map - # to the same name. - $newsumfnccount{$cn} += $sumfnccount->{$fn}; - } - $data->{"sumfnc"} = \%newsumfnccount; - - # Update function found and hit counts since they may have - # changed - $f_found = 0; - $f_hit = 0; - foreach my $fn (keys(%newsumfnccount)) { - $f_found++; - $f_hit++ if ($newsumfnccount{$fn} > 0); - } - $data->{"f_found"} = $f_found; - $data->{"f_hit"} = $f_hit; - } -} - -# -# gen_html() -# -# Generate a set of HTML pages from contents of .info file INFO_FILENAME. -# Files will be written to the current directory. If provided, test case -# descriptions will be read from .tests file TEST_FILENAME and included -# in ouput. -# -# Die on error. -# - -sub gen_html() -{ - local *HTML_HANDLE; - my %overview; - my %base_data; - my $lines_found; - my $lines_hit; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - my $overall_found = 0; - my $overall_hit = 0; - my $total_fn_found = 0; - my $total_fn_hit = 0; - my $total_br_found = 0; - my $total_br_hit = 0; - my $dir_name; - my $link_name; - my @dir_list; - my %new_info; - - # Read in all specified .info files - foreach (@info_filenames) - { - %new_info = %{read_info_file($_)}; - - # Combine %new_info with %info_data - %info_data = %{combine_info_files(\%info_data, \%new_info)}; - } - - info("Found %d entries.\n", scalar(keys(%info_data))); - - # Read and apply baseline data if specified - if ($base_filename) - { - # Read baseline file - info("Reading baseline file $base_filename\n"); - %base_data = %{read_info_file($base_filename)}; - info("Found %d entries.\n", scalar(keys(%base_data))); - - # Apply baseline - info("Subtracting baseline data.\n"); - %info_data = %{apply_baseline(\%info_data, \%base_data)}; - } - - @dir_list = get_dir_list(keys(%info_data)); - - if ($no_prefix) - { - # User requested that we leave filenames alone - info("User asked not to remove filename prefix\n"); - } - elsif (! @dir_prefix) - { - # Get prefix common to most directories in list - my $prefix = get_prefix(1, keys(%info_data)); - - if ($prefix) - { - info("Found common filename prefix \"$prefix\"\n"); - $dir_prefix[0] = $prefix; - - } - else - { - info("No common filename prefix found!\n"); - $no_prefix=1; - } - } - else - { - my $msg = "Using user-specified filename prefix "; - for my $i (0 .. $#dir_prefix) - { - $dir_prefix[$i] =~ s/\/+$//; - $msg .= ", " unless 0 == $i; - $msg .= "\"" . $dir_prefix[$i] . "\""; - } - info($msg . "\n"); - } - - - # Read in test description file if specified - if ($desc_filename) - { - info("Reading test description file $desc_filename\n"); - %test_description = %{read_testfile($desc_filename)}; - - # Remove test descriptions which are not referenced - # from %info_data if user didn't tell us otherwise - if (!$keep_descriptions) - { - remove_unused_descriptions(); - } - } - - # Change to output directory if specified - if ($output_directory) - { - chdir($output_directory) - or die("ERROR: cannot change to directory ". - "$output_directory!\n"); - } - - info("Writing .css and .png files.\n"); - write_css_file(); - write_png_files(); - - if ($html_gzip) - { - info("Writing .htaccess file.\n"); - write_htaccess_file(); - } - - info("Generating output.\n"); - - # Process each subdirectory and collect overview information - foreach $dir_name (@dir_list) - { - ($lines_found, $lines_hit, $fn_found, $fn_hit, - $br_found, $br_hit) - = process_dir($dir_name); - - # Handle files in root directory gracefully - $dir_name = "root" if ($dir_name eq ""); - - # Remove prefix if applicable - if (!$no_prefix && @dir_prefix) - { - # Match directory names beginning with one of @dir_prefix - $dir_name = apply_prefix($dir_name,@dir_prefix); - } - - # Generate name for directory overview HTML page - if ($dir_name =~ /^\/(.*)$/) - { - $link_name = substr($dir_name, 1)."/index.$html_ext"; - } - else - { - $link_name = $dir_name."/index.$html_ext"; - } - - $overview{$dir_name} = [$lines_found, $lines_hit, $fn_found, - $fn_hit, $br_found, $br_hit, $link_name, - get_rate($lines_found, $lines_hit), - get_rate($fn_found, $fn_hit), - get_rate($br_found, $br_hit)]; - $overall_found += $lines_found; - $overall_hit += $lines_hit; - $total_fn_found += $fn_found; - $total_fn_hit += $fn_hit; - $total_br_found += $br_found; - $total_br_hit += $br_hit; - } - - # Generate overview page - info("Writing directory view page.\n"); - - # Create sorted pages - foreach (@fileview_sortlist) { - write_dir_page($fileview_sortname[$_], ".", "", $test_title, - undef, $overall_found, $overall_hit, - $total_fn_found, $total_fn_hit, $total_br_found, - $total_br_hit, \%overview, {}, {}, {}, 0, $_); - } - - # Check if there are any test case descriptions to write out - if (%test_description) - { - info("Writing test case description file.\n"); - write_description_file( \%test_description, - $overall_found, $overall_hit, - $total_fn_found, $total_fn_hit, - $total_br_found, $total_br_hit); - } - - print_overall_rate(1, $overall_found, $overall_hit, - $func_coverage, $total_fn_found, $total_fn_hit, - $br_coverage, $total_br_found, $total_br_hit); - - chdir($cwd); -} - -# -# html_create(handle, filename) -# - -sub html_create($$) -{ - my $handle = $_[0]; - my $filename = $_[1]; - - if ($html_gzip) - { - open($handle, "|-", "gzip -c >'$filename'") - or die("ERROR: cannot open $filename for writing ". - "(gzip)!\n"); - } - else - { - open($handle, ">", $filename) - or die("ERROR: cannot open $filename for writing!\n"); - } -} - -sub write_dir_page($$$$$$$$$$$$$$$$$) -{ - my ($name, $rel_dir, $base_dir, $title, $trunc_dir, $overall_found, - $overall_hit, $total_fn_found, $total_fn_hit, $total_br_found, - $total_br_hit, $overview, $testhash, $testfnchash, $testbrhash, - $view_type, $sort_type) = @_; - - # Generate directory overview page including details - html_create(*HTML_HANDLE, "$rel_dir/index$name.$html_ext"); - if (!defined($trunc_dir)) { - $trunc_dir = ""; - } - $title .= " - " if ($trunc_dir ne ""); - write_html_prolog(*HTML_HANDLE, $base_dir, "LCOV - $title$trunc_dir"); - write_header(*HTML_HANDLE, $view_type, $trunc_dir, $rel_dir, - $overall_found, $overall_hit, $total_fn_found, - $total_fn_hit, $total_br_found, $total_br_hit, $sort_type); - write_file_table(*HTML_HANDLE, $base_dir, $overview, $testhash, - $testfnchash, $testbrhash, $view_type, $sort_type); - write_html_epilog(*HTML_HANDLE, $base_dir); - close(*HTML_HANDLE); -} - - -# -# process_dir(dir_name) -# - -sub process_dir($) -{ - my $abs_dir = $_[0]; - my $trunc_dir; - my $rel_dir = $abs_dir; - my $base_dir; - my $filename; - my %overview; - my $lines_found; - my $lines_hit; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - my $overall_found=0; - my $overall_hit=0; - my $total_fn_found=0; - my $total_fn_hit=0; - my $total_br_found = 0; - my $total_br_hit = 0; - my $base_name; - my $extension; - my $testdata; - my %testhash; - my $testfncdata; - my %testfnchash; - my $testbrdata; - my %testbrhash; - my @sort_list; - local *HTML_HANDLE; - - # Remove prefix if applicable - if (!$no_prefix) - { - # Match directory name beginning with one of @dir_prefix - $rel_dir = apply_prefix($rel_dir,@dir_prefix); - } - - $trunc_dir = $rel_dir; - - # Remove leading / - if ($rel_dir =~ /^\/(.*)$/) - { - $rel_dir = substr($rel_dir, 1); - } - - # Handle files in root directory gracefully - $rel_dir = "root" if ($rel_dir eq ""); - $trunc_dir = "root" if ($trunc_dir eq ""); - - $base_dir = get_relative_base_path($rel_dir); - - create_sub_dir($rel_dir); - - # Match filenames which specify files in this directory, not including - # sub-directories - foreach $filename (grep(/^\Q$abs_dir\E\/[^\/]*$/,keys(%info_data))) - { - my $page_link; - my $func_link; - - ($lines_found, $lines_hit, $fn_found, $fn_hit, $br_found, - $br_hit, $testdata, $testfncdata, $testbrdata) = - process_file($trunc_dir, $rel_dir, $filename); - - $base_name = basename($filename); - - if ($no_sourceview) { - $page_link = ""; - } elsif ($frames) { - # Link to frameset page - $page_link = "$base_name.gcov.frameset.$html_ext"; - } else { - # Link directory to source code view page - $page_link = "$base_name.gcov.$html_ext"; - } - $overview{$base_name} = [$lines_found, $lines_hit, $fn_found, - $fn_hit, $br_found, $br_hit, - $page_link, - get_rate($lines_found, $lines_hit), - get_rate($fn_found, $fn_hit), - get_rate($br_found, $br_hit)]; - - $testhash{$base_name} = $testdata; - $testfnchash{$base_name} = $testfncdata; - $testbrhash{$base_name} = $testbrdata; - - $overall_found += $lines_found; - $overall_hit += $lines_hit; - - $total_fn_found += $fn_found; - $total_fn_hit += $fn_hit; - - $total_br_found += $br_found; - $total_br_hit += $br_hit; - } - - # Create sorted pages - foreach (@fileview_sortlist) { - # Generate directory overview page (without details) - write_dir_page($fileview_sortname[$_], $rel_dir, $base_dir, - $test_title, $trunc_dir, $overall_found, - $overall_hit, $total_fn_found, $total_fn_hit, - $total_br_found, $total_br_hit, \%overview, {}, - {}, {}, 1, $_); - if (!$show_details) { - next; - } - # Generate directory overview page including details - write_dir_page("-detail".$fileview_sortname[$_], $rel_dir, - $base_dir, $test_title, $trunc_dir, - $overall_found, $overall_hit, $total_fn_found, - $total_fn_hit, $total_br_found, $total_br_hit, - \%overview, \%testhash, \%testfnchash, - \%testbrhash, 1, $_); - } - - # Calculate resulting line counts - return ($overall_found, $overall_hit, $total_fn_found, $total_fn_hit, - $total_br_found, $total_br_hit); -} - - -# -# get_converted_lines(testdata) -# -# Return hash of line numbers of those lines which were only covered in -# converted data sets. -# - -sub get_converted_lines($) -{ - my $testdata = $_[0]; - my $testcount; - my %converted; - my %nonconverted; - my $hash; - my $testcase; - my $line; - my %result; - - - # Get a hash containing line numbers with positive counts both for - # converted and original data sets - foreach $testcase (keys(%{$testdata})) - { - # Check to see if this is a converted data set - if ($testcase =~ /,diff$/) - { - $hash = \%converted; - } - else - { - $hash = \%nonconverted; - } - - $testcount = $testdata->{$testcase}; - # Add lines with a positive count to hash - foreach $line (keys%{$testcount}) - { - if ($testcount->{$line} > 0) - { - $hash->{$line} = 1; - } - } - } - - # Combine both hashes to resulting list - foreach $line (keys(%converted)) - { - if (!defined($nonconverted{$line})) - { - $result{$line} = 1; - } - } - - return \%result; -} - - -sub write_function_page($$$$$$$$$$$$$$$$$$) -{ - my ($base_dir, $rel_dir, $trunc_dir, $base_name, $title, - $lines_found, $lines_hit, $fn_found, $fn_hit, $br_found, $br_hit, - $sumcount, $funcdata, $sumfnccount, $testfncdata, $sumbrcount, - $testbrdata, $sort_type) = @_; - my $pagetitle; - my $filename; - - # Generate function table for this file - if ($sort_type == 0) { - $filename = "$rel_dir/$base_name.func.$html_ext"; - } else { - $filename = "$rel_dir/$base_name.func-sort-c.$html_ext"; - } - html_create(*HTML_HANDLE, $filename); - $pagetitle = "LCOV - $title - $trunc_dir/$base_name - functions"; - write_html_prolog(*HTML_HANDLE, $base_dir, $pagetitle); - write_header(*HTML_HANDLE, 4, "$trunc_dir/$base_name", - "$rel_dir/$base_name", $lines_found, $lines_hit, - $fn_found, $fn_hit, $br_found, $br_hit, $sort_type); - write_function_table(*HTML_HANDLE, "$base_name.gcov.$html_ext", - $sumcount, $funcdata, - $sumfnccount, $testfncdata, $sumbrcount, - $testbrdata, $base_name, - $base_dir, $sort_type); - write_html_epilog(*HTML_HANDLE, $base_dir, 1); - close(*HTML_HANDLE); -} - - -# -# process_file(trunc_dir, rel_dir, filename) -# - -sub process_file($$$) -{ - info("Processing file ".apply_prefix($_[2], @dir_prefix)."\n"); - - my $trunc_dir = $_[0]; - my $rel_dir = $_[1]; - my $filename = $_[2]; - my $base_name = basename($filename); - my $base_dir = get_relative_base_path($rel_dir); - my $testdata; - my $testcount; - my $sumcount; - my $funcdata; - my $checkdata; - my $testfncdata; - my $sumfnccount; - my $testbrdata; - my $sumbrcount; - my $lines_found; - my $lines_hit; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - my $converted; - my @source; - my $pagetitle; - local *HTML_HANDLE; - - ($testdata, $sumcount, $funcdata, $checkdata, $testfncdata, - $sumfnccount, $testbrdata, $sumbrcount, $lines_found, $lines_hit, - $fn_found, $fn_hit, $br_found, $br_hit) - = get_info_entry($info_data{$filename}); - - # Return after this point in case user asked us not to generate - # source code view - if ($no_sourceview) - { - return ($lines_found, $lines_hit, $fn_found, $fn_hit, - $br_found, $br_hit, $testdata, $testfncdata, - $testbrdata); - } - - $converted = get_converted_lines($testdata); - # Generate source code view for this file - html_create(*HTML_HANDLE, "$rel_dir/$base_name.gcov.$html_ext"); - $pagetitle = "LCOV - $test_title - $trunc_dir/$base_name"; - write_html_prolog(*HTML_HANDLE, $base_dir, $pagetitle); - write_header(*HTML_HANDLE, 2, "$trunc_dir/$base_name", - "$rel_dir/$base_name", $lines_found, $lines_hit, - $fn_found, $fn_hit, $br_found, $br_hit, 0); - @source = write_source(*HTML_HANDLE, $filename, $sumcount, $checkdata, - $converted, $funcdata, $sumbrcount); - - write_html_epilog(*HTML_HANDLE, $base_dir, 1); - close(*HTML_HANDLE); - - if ($func_coverage) { - # Create function tables - foreach (@funcview_sortlist) { - write_function_page($base_dir, $rel_dir, $trunc_dir, - $base_name, $test_title, - $lines_found, $lines_hit, - $fn_found, $fn_hit, $br_found, - $br_hit, $sumcount, - $funcdata, $sumfnccount, - $testfncdata, $sumbrcount, - $testbrdata, $_); - } - } - - # Additional files are needed in case of frame output - if (!$frames) - { - return ($lines_found, $lines_hit, $fn_found, $fn_hit, - $br_found, $br_hit, $testdata, $testfncdata, - $testbrdata); - } - - # Create overview png file - gen_png("$rel_dir/$base_name.gcov.png", $overview_width, $tab_size, - @source); - - # Create frameset page - html_create(*HTML_HANDLE, - "$rel_dir/$base_name.gcov.frameset.$html_ext"); - write_frameset(*HTML_HANDLE, $base_dir, $base_name, $pagetitle); - close(*HTML_HANDLE); - - # Write overview frame - html_create(*HTML_HANDLE, - "$rel_dir/$base_name.gcov.overview.$html_ext"); - write_overview(*HTML_HANDLE, $base_dir, $base_name, $pagetitle, - scalar(@source)); - close(*HTML_HANDLE); - - return ($lines_found, $lines_hit, $fn_found, $fn_hit, $br_found, - $br_hit, $testdata, $testfncdata, $testbrdata); -} - - -sub compress_brcount($) -{ - my ($brcount) = @_; - my $db; - - $db = brcount_to_db($brcount); - return db_to_brcount($db, $brcount); -} - - -# -# read_info_file(info_filename) -# -# Read in the contents of the .info file specified by INFO_FILENAME. Data will -# be returned as a reference to a hash containing the following mappings: -# -# %result: for each filename found in file -> \%data -# -# %data: "test" -> \%testdata -# "sum" -> \%sumcount -# "func" -> \%funcdata -# "found" -> $lines_found (number of instrumented lines found in file) -# "hit" -> $lines_hit (number of executed lines in file) -# "f_found" -> $fn_found (number of instrumented functions found in file) -# "f_hit" -> $fn_hit (number of executed functions in file) -# "b_found" -> $br_found (number of instrumented branches found in file) -# "b_hit" -> $br_hit (number of executed branches in file) -# "check" -> \%checkdata -# "testfnc" -> \%testfncdata -# "sumfnc" -> \%sumfnccount -# "testbr" -> \%testbrdata -# "sumbr" -> \%sumbrcount -# -# %testdata : name of test affecting this file -> \%testcount -# %testfncdata: name of test affecting this file -> \%testfnccount -# %testbrdata: name of test affecting this file -> \%testbrcount -# -# %testcount : line number -> execution count for a single test -# %testfnccount: function name -> execution count for a single test -# %testbrcount : line number -> branch coverage data for a single test -# %sumcount : line number -> execution count for all tests -# %sumfnccount : function name -> execution count for all tests -# %sumbrcount : line number -> branch coverage data for all tests -# %funcdata : function name -> line number -# %checkdata : line number -> checksum of source code line -# $brdata : vector of items: block, branch, taken -# -# Note that .info file sections referring to the same file and test name -# will automatically be combined by adding all execution counts. -# -# Note that if INFO_FILENAME ends with ".gz", it is assumed that the file -# is compressed using GZIP. If available, GUNZIP will be used to decompress -# this file. -# -# Die on error. -# - -sub read_info_file($) -{ - my $tracefile = $_[0]; # Name of tracefile - my %result; # Resulting hash: file -> data - my $data; # Data handle for current entry - my $testdata; # " " - my $testcount; # " " - my $sumcount; # " " - my $funcdata; # " " - my $checkdata; # " " - my $testfncdata; - my $testfnccount; - my $sumfnccount; - my $testbrdata; - my $testbrcount; - my $sumbrcount; - my $line; # Current line read from .info file - my $testname; # Current test name - my $filename; # Current filename - my $hitcount; # Count for lines hit - my $count; # Execution count of current line - my $negative; # If set, warn about negative counts - my $changed_testname; # If set, warn about changed testname - my $line_checksum; # Checksum of current line - my $notified_about_relative_paths; - local *INFO_HANDLE; # Filehandle for .info file - - info("Reading data file $tracefile\n"); - - # Check if file exists and is readable - stat($_[0]); - if (!(-r _)) - { - die("ERROR: cannot read file $_[0]!\n"); - } - - # Check if this is really a plain file - if (!(-f _)) - { - die("ERROR: not a plain file: $_[0]!\n"); - } - - # Check for .gz extension - if ($_[0] =~ /\.gz$/) - { - # Check for availability of GZIP tool - system_no_output(1, "gunzip" ,"-h") - and die("ERROR: gunzip command not available!\n"); - - # Check integrity of compressed file - system_no_output(1, "gunzip", "-t", $_[0]) - and die("ERROR: integrity check failed for ". - "compressed file $_[0]!\n"); - - # Open compressed file - open(INFO_HANDLE, "-|", "gunzip -c '$_[0]'") - or die("ERROR: cannot start gunzip to decompress ". - "file $_[0]!\n"); - } - else - { - # Open decompressed file - open(INFO_HANDLE, "<", $_[0]) - or die("ERROR: cannot read file $_[0]!\n"); - } - - $testname = ""; - while (<INFO_HANDLE>) - { - chomp($_); - $line = $_; - - # Switch statement - foreach ($line) - { - /^TN:([^,]*)(,diff)?/ && do - { - # Test name information found - $testname = defined($1) ? $1 : ""; - if ($testname =~ s/\W/_/g) - { - $changed_testname = 1; - } - $testname .= $2 if (defined($2)); - last; - }; - - /^[SK]F:(.*)/ && do - { - # Filename information found - # Retrieve data for new entry - $filename = File::Spec->rel2abs($1, $cwd); - - if (!File::Spec->file_name_is_absolute($1) && - !$notified_about_relative_paths) - { - info("Resolved relative source file ". - "path \"$1\" with CWD to ". - "\"$filename\".\n"); - $notified_about_relative_paths = 1; - } - - $data = $result{$filename}; - ($testdata, $sumcount, $funcdata, $checkdata, - $testfncdata, $sumfnccount, $testbrdata, - $sumbrcount) = - get_info_entry($data); - - if (defined($testname)) - { - $testcount = $testdata->{$testname}; - $testfnccount = $testfncdata->{$testname}; - $testbrcount = $testbrdata->{$testname}; - } - else - { - $testcount = {}; - $testfnccount = {}; - $testbrcount = {}; - } - last; - }; - - /^DA:(\d+),(-?\d+)(,[^,\s]+)?/ && do - { - # Fix negative counts - $count = $2 < 0 ? 0 : $2; - if ($2 < 0) - { - $negative = 1; - } - # Execution count found, add to structure - # Add summary counts - $sumcount->{$1} += $count; - - # Add test-specific counts - if (defined($testname)) - { - $testcount->{$1} += $count; - } - - # Store line checksum if available - if (defined($3)) - { - $line_checksum = substr($3, 1); - - # Does it match a previous definition - if (defined($checkdata->{$1}) && - ($checkdata->{$1} ne - $line_checksum)) - { - die("ERROR: checksum mismatch ". - "at $filename:$1\n"); - } - - $checkdata->{$1} = $line_checksum; - } - last; - }; - - /^FN:(\d+),([^,]+)/ && do - { - last if (!$func_coverage); - - # Function data found, add to structure - $funcdata->{$2} = $1; - - # Also initialize function call data - if (!defined($sumfnccount->{$2})) { - $sumfnccount->{$2} = 0; - } - if (defined($testname)) - { - if (!defined($testfnccount->{$2})) { - $testfnccount->{$2} = 0; - } - } - last; - }; - - /^FNDA:(\d+),([^,]+)/ && do - { - last if (!$func_coverage); - # Function call count found, add to structure - # Add summary counts - $sumfnccount->{$2} += $1; - - # Add test-specific counts - if (defined($testname)) - { - $testfnccount->{$2} += $1; - } - last; - }; - - /^BRDA:(\d+),(\d+),(\d+),(\d+|-)/ && do { - # Branch coverage data found - my ($line, $block, $branch, $taken) = - ($1, $2, $3, $4); - - last if (!$br_coverage); - $sumbrcount->{$line} .= - "$block,$branch,$taken:"; - - # Add test-specific counts - if (defined($testname)) { - $testbrcount->{$line} .= - "$block,$branch,$taken:"; - } - last; - }; - - /^end_of_record/ && do - { - # Found end of section marker - if ($filename) - { - # Store current section data - if (defined($testname)) - { - $testdata->{$testname} = - $testcount; - $testfncdata->{$testname} = - $testfnccount; - $testbrdata->{$testname} = - $testbrcount; - } - - set_info_entry($data, $testdata, - $sumcount, $funcdata, - $checkdata, $testfncdata, - $sumfnccount, - $testbrdata, - $sumbrcount); - $result{$filename} = $data; - last; - } - }; - - # default - last; - } - } - close(INFO_HANDLE); - - # Calculate lines_found and lines_hit for each file - foreach $filename (keys(%result)) - { - $data = $result{$filename}; - - ($testdata, $sumcount, undef, undef, $testfncdata, - $sumfnccount, $testbrdata, $sumbrcount) = - get_info_entry($data); - - # Filter out empty files - if (scalar(keys(%{$sumcount})) == 0) - { - delete($result{$filename}); - next; - } - # Filter out empty test cases - foreach $testname (keys(%{$testdata})) - { - if (!defined($testdata->{$testname}) || - scalar(keys(%{$testdata->{$testname}})) == 0) - { - delete($testdata->{$testname}); - delete($testfncdata->{$testname}); - } - } - - $data->{"found"} = scalar(keys(%{$sumcount})); - $hitcount = 0; - - foreach (keys(%{$sumcount})) - { - if ($sumcount->{$_} > 0) { $hitcount++; } - } - - $data->{"hit"} = $hitcount; - - # Get found/hit values for function call data - $data->{"f_found"} = scalar(keys(%{$sumfnccount})); - $hitcount = 0; - - foreach (keys(%{$sumfnccount})) { - if ($sumfnccount->{$_} > 0) { - $hitcount++; - } - } - $data->{"f_hit"} = $hitcount; - - # Combine branch data for the same branches - (undef, $data->{"b_found"}, $data->{"b_hit"}) = - compress_brcount($sumbrcount); - foreach $testname (keys(%{$testbrdata})) { - compress_brcount($testbrdata->{$testname}); - } - } - - if (scalar(keys(%result)) == 0) - { - die("ERROR: no valid records found in tracefile $tracefile\n"); - } - if ($negative) - { - warn("WARNING: negative counts found in tracefile ". - "$tracefile\n"); - } - if ($changed_testname) - { - warn("WARNING: invalid characters removed from testname in ". - "tracefile $tracefile\n"); - } - - return(\%result); -} - - -# -# get_info_entry(hash_ref) -# -# Retrieve data from an entry of the structure generated by read_info_file(). -# Return a list of references to hashes: -# (test data hash ref, sum count hash ref, funcdata hash ref, checkdata hash -# ref, testfncdata hash ref, sumfnccount hash ref, lines found, lines hit, -# functions found, functions hit) -# - -sub get_info_entry($) -{ - my $testdata_ref = $_[0]->{"test"}; - my $sumcount_ref = $_[0]->{"sum"}; - my $funcdata_ref = $_[0]->{"func"}; - my $checkdata_ref = $_[0]->{"check"}; - my $testfncdata = $_[0]->{"testfnc"}; - my $sumfnccount = $_[0]->{"sumfnc"}; - my $testbrdata = $_[0]->{"testbr"}; - my $sumbrcount = $_[0]->{"sumbr"}; - my $lines_found = $_[0]->{"found"}; - my $lines_hit = $_[0]->{"hit"}; - my $fn_found = $_[0]->{"f_found"}; - my $fn_hit = $_[0]->{"f_hit"}; - my $br_found = $_[0]->{"b_found"}; - my $br_hit = $_[0]->{"b_hit"}; - - return ($testdata_ref, $sumcount_ref, $funcdata_ref, $checkdata_ref, - $testfncdata, $sumfnccount, $testbrdata, $sumbrcount, - $lines_found, $lines_hit, $fn_found, $fn_hit, - $br_found, $br_hit); -} - - -# -# set_info_entry(hash_ref, testdata_ref, sumcount_ref, funcdata_ref, -# checkdata_ref, testfncdata_ref, sumfcncount_ref, -# testbrdata_ref, sumbrcount_ref[,lines_found, -# lines_hit, f_found, f_hit, $b_found, $b_hit]) -# -# Update the hash referenced by HASH_REF with the provided data references. -# - -sub set_info_entry($$$$$$$$$;$$$$$$) -{ - my $data_ref = $_[0]; - - $data_ref->{"test"} = $_[1]; - $data_ref->{"sum"} = $_[2]; - $data_ref->{"func"} = $_[3]; - $data_ref->{"check"} = $_[4]; - $data_ref->{"testfnc"} = $_[5]; - $data_ref->{"sumfnc"} = $_[6]; - $data_ref->{"testbr"} = $_[7]; - $data_ref->{"sumbr"} = $_[8]; - - if (defined($_[9])) { $data_ref->{"found"} = $_[9]; } - if (defined($_[10])) { $data_ref->{"hit"} = $_[10]; } - if (defined($_[11])) { $data_ref->{"f_found"} = $_[11]; } - if (defined($_[12])) { $data_ref->{"f_hit"} = $_[12]; } - if (defined($_[13])) { $data_ref->{"b_found"} = $_[13]; } - if (defined($_[14])) { $data_ref->{"b_hit"} = $_[14]; } -} - - -# -# add_counts(data1_ref, data2_ref) -# -# DATA1_REF and DATA2_REF are references to hashes containing a mapping -# -# line number -> execution count -# -# Return a list (RESULT_REF, LINES_FOUND, LINES_HIT) where RESULT_REF -# is a reference to a hash containing the combined mapping in which -# execution counts are added. -# - -sub add_counts($$) -{ - my $data1_ref = $_[0]; # Hash 1 - my $data2_ref = $_[1]; # Hash 2 - my %result; # Resulting hash - my $line; # Current line iteration scalar - my $data1_count; # Count of line in hash1 - my $data2_count; # Count of line in hash2 - my $found = 0; # Total number of lines found - my $hit = 0; # Number of lines with a count > 0 - - foreach $line (keys(%$data1_ref)) - { - $data1_count = $data1_ref->{$line}; - $data2_count = $data2_ref->{$line}; - - # Add counts if present in both hashes - if (defined($data2_count)) { $data1_count += $data2_count; } - - # Store sum in %result - $result{$line} = $data1_count; - - $found++; - if ($data1_count > 0) { $hit++; } - } - - # Add lines unique to data2_ref - foreach $line (keys(%$data2_ref)) - { - # Skip lines already in data1_ref - if (defined($data1_ref->{$line})) { next; } - - # Copy count from data2_ref - $result{$line} = $data2_ref->{$line}; - - $found++; - if ($result{$line} > 0) { $hit++; } - } - - return (\%result, $found, $hit); -} - - -# -# merge_checksums(ref1, ref2, filename) -# -# REF1 and REF2 are references to hashes containing a mapping -# -# line number -> checksum -# -# Merge checksum lists defined in REF1 and REF2 and return reference to -# resulting hash. Die if a checksum for a line is defined in both hashes -# but does not match. -# - -sub merge_checksums($$$) -{ - my $ref1 = $_[0]; - my $ref2 = $_[1]; - my $filename = $_[2]; - my %result; - my $line; - - foreach $line (keys(%{$ref1})) - { - if (defined($ref2->{$line}) && - ($ref1->{$line} ne $ref2->{$line})) - { - die("ERROR: checksum mismatch at $filename:$line\n"); - } - $result{$line} = $ref1->{$line}; - } - - foreach $line (keys(%{$ref2})) - { - $result{$line} = $ref2->{$line}; - } - - return \%result; -} - - -# -# merge_func_data(funcdata1, funcdata2, filename) -# - -sub merge_func_data($$$) -{ - my ($funcdata1, $funcdata2, $filename) = @_; - my %result; - my $func; - - if (defined($funcdata1)) { - %result = %{$funcdata1}; - } - - foreach $func (keys(%{$funcdata2})) { - my $line1 = $result{$func}; - my $line2 = $funcdata2->{$func}; - - if (defined($line1) && ($line1 != $line2)) { - warn("WARNING: function data mismatch at ". - "$filename:$line2\n"); - next; - } - $result{$func} = $line2; - } - - return \%result; -} - - -# -# add_fnccount(fnccount1, fnccount2) -# -# Add function call count data. Return list (fnccount_added, f_found, f_hit) -# - -sub add_fnccount($$) -{ - my ($fnccount1, $fnccount2) = @_; - my %result; - my $fn_found; - my $fn_hit; - my $function; - - if (defined($fnccount1)) { - %result = %{$fnccount1}; - } - foreach $function (keys(%{$fnccount2})) { - $result{$function} += $fnccount2->{$function}; - } - $fn_found = scalar(keys(%result)); - $fn_hit = 0; - foreach $function (keys(%result)) { - if ($result{$function} > 0) { - $fn_hit++; - } - } - - return (\%result, $fn_found, $fn_hit); -} - -# -# add_testfncdata(testfncdata1, testfncdata2) -# -# Add function call count data for several tests. Return reference to -# added_testfncdata. -# - -sub add_testfncdata($$) -{ - my ($testfncdata1, $testfncdata2) = @_; - my %result; - my $testname; - - foreach $testname (keys(%{$testfncdata1})) { - if (defined($testfncdata2->{$testname})) { - my $fnccount; - - # Function call count data for this testname exists - # in both data sets: add - ($fnccount) = add_fnccount( - $testfncdata1->{$testname}, - $testfncdata2->{$testname}); - $result{$testname} = $fnccount; - next; - } - # Function call count data for this testname is unique to - # data set 1: copy - $result{$testname} = $testfncdata1->{$testname}; - } - - # Add count data for testnames unique to data set 2 - foreach $testname (keys(%{$testfncdata2})) { - if (!defined($result{$testname})) { - $result{$testname} = $testfncdata2->{$testname}; - } - } - return \%result; -} - - -# -# brcount_to_db(brcount) -# -# Convert brcount data to the following format: -# -# db: line number -> block hash -# block hash: block number -> branch hash -# branch hash: branch number -> taken value -# - -sub brcount_to_db($) -{ - my ($brcount) = @_; - my $line; - my $db; - - # Add branches to database - foreach $line (keys(%{$brcount})) { - my $brdata = $brcount->{$line}; - - foreach my $entry (split(/:/, $brdata)) { - my ($block, $branch, $taken) = split(/,/, $entry); - my $old = $db->{$line}->{$block}->{$branch}; - - if (!defined($old) || $old eq "-") { - $old = $taken; - } elsif ($taken ne "-") { - $old += $taken; - } - - $db->{$line}->{$block}->{$branch} = $old; - } - } - - return $db; -} - - -# -# db_to_brcount(db[, brcount]) -# -# Convert branch coverage data back to brcount format. If brcount is specified, -# the converted data is directly inserted in brcount. -# - -sub db_to_brcount($;$) -{ - my ($db, $brcount) = @_; - my $line; - my $br_found = 0; - my $br_hit = 0; - - # Convert database back to brcount format - foreach $line (sort({$a <=> $b} keys(%{$db}))) { - my $ldata = $db->{$line}; - my $brdata; - my $block; - - foreach $block (sort({$a <=> $b} keys(%{$ldata}))) { - my $bdata = $ldata->{$block}; - my $branch; - - foreach $branch (sort({$a <=> $b} keys(%{$bdata}))) { - my $taken = $bdata->{$branch}; - - $br_found++; - $br_hit++ if ($taken ne "-" && $taken > 0); - $brdata .= "$block,$branch,$taken:"; - } - } - $brcount->{$line} = $brdata; - } - - return ($brcount, $br_found, $br_hit); -} - - -# -# brcount_db_combine(db1, db2, op) -# -# db1 := db1 op db2, where -# db1, db2: brcount data as returned by brcount_to_db -# op: one of $BR_ADD and BR_SUB -# -sub brcount_db_combine($$$) -{ - my ($db1, $db2, $op) = @_; - - foreach my $line (keys(%{$db2})) { - my $ldata = $db2->{$line}; - - foreach my $block (keys(%{$ldata})) { - my $bdata = $ldata->{$block}; - - foreach my $branch (keys(%{$bdata})) { - my $taken = $bdata->{$branch}; - my $new = $db1->{$line}->{$block}->{$branch}; - - if (!defined($new) || $new eq "-") { - $new = $taken; - } elsif ($taken ne "-") { - if ($op == $BR_ADD) { - $new += $taken; - } elsif ($op == $BR_SUB) { - $new -= $taken; - $new = 0 if ($new < 0); - } - } - - $db1->{$line}->{$block}->{$branch} = $new; - } - } - } -} - - -# -# brcount_db_get_found_and_hit(db) -# -# Return (br_found, br_hit) for db. -# - -sub brcount_db_get_found_and_hit($) -{ - my ($db) = @_; - my ($br_found , $br_hit) = (0, 0); - - foreach my $line (keys(%{$db})) { - my $ldata = $db->{$line}; - - foreach my $block (keys(%{$ldata})) { - my $bdata = $ldata->{$block}; - - foreach my $branch (keys(%{$bdata})) { - my $taken = $bdata->{$branch}; - - $br_found++; - $br_hit++ if ($taken ne "-" && $taken > 0); - } - } - } - - return ($br_found, $br_hit); -} - - -# combine_brcount(brcount1, brcount2, type, inplace) -# -# If add is BR_ADD, add branch coverage data and return list brcount_added. -# If add is BR_SUB, subtract the taken values of brcount2 from brcount1 and -# return brcount_sub. If inplace is set, the result is inserted into brcount1. -# - -sub combine_brcount($$$;$) -{ - my ($brcount1, $brcount2, $type, $inplace) = @_; - my ($db1, $db2); - - $db1 = brcount_to_db($brcount1); - $db2 = brcount_to_db($brcount2); - brcount_db_combine($db1, $db2, $type); - - return db_to_brcount($db1, $inplace ? $brcount1 : undef); -} - - -# -# add_testbrdata(testbrdata1, testbrdata2) -# -# Add branch coverage data for several tests. Return reference to -# added_testbrdata. -# - -sub add_testbrdata($$) -{ - my ($testbrdata1, $testbrdata2) = @_; - my %result; - my $testname; - - foreach $testname (keys(%{$testbrdata1})) { - if (defined($testbrdata2->{$testname})) { - my $brcount; - - # Branch coverage data for this testname exists - # in both data sets: add - ($brcount) = combine_brcount($testbrdata1->{$testname}, - $testbrdata2->{$testname}, $BR_ADD); - $result{$testname} = $brcount; - next; - } - # Branch coverage data for this testname is unique to - # data set 1: copy - $result{$testname} = $testbrdata1->{$testname}; - } - - # Add count data for testnames unique to data set 2 - foreach $testname (keys(%{$testbrdata2})) { - if (!defined($result{$testname})) { - $result{$testname} = $testbrdata2->{$testname}; - } - } - return \%result; -} - - -# -# combine_info_entries(entry_ref1, entry_ref2, filename) -# -# Combine .info data entry hashes referenced by ENTRY_REF1 and ENTRY_REF2. -# Return reference to resulting hash. -# - -sub combine_info_entries($$$) -{ - my $entry1 = $_[0]; # Reference to hash containing first entry - my $testdata1; - my $sumcount1; - my $funcdata1; - my $checkdata1; - my $testfncdata1; - my $sumfnccount1; - my $testbrdata1; - my $sumbrcount1; - - my $entry2 = $_[1]; # Reference to hash containing second entry - my $testdata2; - my $sumcount2; - my $funcdata2; - my $checkdata2; - my $testfncdata2; - my $sumfnccount2; - my $testbrdata2; - my $sumbrcount2; - - my %result; # Hash containing combined entry - my %result_testdata; - my $result_sumcount = {}; - my $result_funcdata; - my $result_testfncdata; - my $result_sumfnccount; - my $result_testbrdata; - my $result_sumbrcount; - my $lines_found; - my $lines_hit; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - - my $testname; - my $filename = $_[2]; - - # Retrieve data - ($testdata1, $sumcount1, $funcdata1, $checkdata1, $testfncdata1, - $sumfnccount1, $testbrdata1, $sumbrcount1) = get_info_entry($entry1); - ($testdata2, $sumcount2, $funcdata2, $checkdata2, $testfncdata2, - $sumfnccount2, $testbrdata2, $sumbrcount2) = get_info_entry($entry2); - - # Merge checksums - $checkdata1 = merge_checksums($checkdata1, $checkdata2, $filename); - - # Combine funcdata - $result_funcdata = merge_func_data($funcdata1, $funcdata2, $filename); - - # Combine function call count data - $result_testfncdata = add_testfncdata($testfncdata1, $testfncdata2); - ($result_sumfnccount, $fn_found, $fn_hit) = - add_fnccount($sumfnccount1, $sumfnccount2); - - # Combine branch coverage data - $result_testbrdata = add_testbrdata($testbrdata1, $testbrdata2); - ($result_sumbrcount, $br_found, $br_hit) = - combine_brcount($sumbrcount1, $sumbrcount2, $BR_ADD); - - # Combine testdata - foreach $testname (keys(%{$testdata1})) - { - if (defined($testdata2->{$testname})) - { - # testname is present in both entries, requires - # combination - ($result_testdata{$testname}) = - add_counts($testdata1->{$testname}, - $testdata2->{$testname}); - } - else - { - # testname only present in entry1, add to result - $result_testdata{$testname} = $testdata1->{$testname}; - } - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - foreach $testname (keys(%{$testdata2})) - { - # Skip testnames already covered by previous iteration - if (defined($testdata1->{$testname})) { next; } - - # testname only present in entry2, add to result hash - $result_testdata{$testname} = $testdata2->{$testname}; - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - # Calculate resulting sumcount - - # Store result - set_info_entry(\%result, \%result_testdata, $result_sumcount, - $result_funcdata, $checkdata1, $result_testfncdata, - $result_sumfnccount, $result_testbrdata, - $result_sumbrcount, $lines_found, $lines_hit, - $fn_found, $fn_hit, $br_found, $br_hit); - - return(\%result); -} - - -# -# combine_info_files(info_ref1, info_ref2) -# -# Combine .info data in hashes referenced by INFO_REF1 and INFO_REF2. Return -# reference to resulting hash. -# - -sub combine_info_files($$) -{ - my %hash1 = %{$_[0]}; - my %hash2 = %{$_[1]}; - my $filename; - - foreach $filename (keys(%hash2)) - { - if ($hash1{$filename}) - { - # Entry already exists in hash1, combine them - $hash1{$filename} = - combine_info_entries($hash1{$filename}, - $hash2{$filename}, - $filename); - } - else - { - # Entry is unique in both hashes, simply add to - # resulting hash - $hash1{$filename} = $hash2{$filename}; - } - } - - return(\%hash1); -} - - -# -# get_prefix(min_dir, filename_list) -# -# Search FILENAME_LIST for a directory prefix which is common to as many -# list entries as possible, so that removing this prefix will minimize the -# sum of the lengths of all resulting shortened filenames while observing -# that no filename has less than MIN_DIR parent directories. -# - -sub get_prefix($@) -{ - my ($min_dir, @filename_list) = @_; - my %prefix; # mapping: prefix -> sum of lengths - my $current; # Temporary iteration variable - - # Find list of prefixes - foreach (@filename_list) - { - # Need explicit assignment to get a copy of $_ so that - # shortening the contained prefix does not affect the list - $current = $_; - while ($current = shorten_prefix($current)) - { - $current .= "/"; - - # Skip rest if the remaining prefix has already been - # added to hash - if (exists($prefix{$current})) { last; } - - # Initialize with 0 - $prefix{$current}="0"; - } - - } - - # Remove all prefixes that would cause filenames to have less than - # the minimum number of parent directories - foreach my $filename (@filename_list) { - my $dir = dirname($filename); - - for (my $i = 0; $i < $min_dir; $i++) { - delete($prefix{$dir."/"}); - $dir = shorten_prefix($dir); - } - } - - # Check if any prefix remains - return undef if (!%prefix); - - # Calculate sum of lengths for all prefixes - foreach $current (keys(%prefix)) - { - foreach (@filename_list) - { - # Add original length - $prefix{$current} += length($_); - - # Check whether prefix matches - if (substr($_, 0, length($current)) eq $current) - { - # Subtract prefix length for this filename - $prefix{$current} -= length($current); - } - } - } - - # Find and return prefix with minimal sum - $current = (keys(%prefix))[0]; - - foreach (keys(%prefix)) - { - if ($prefix{$_} < $prefix{$current}) - { - $current = $_; - } - } - - $current =~ s/\/$//; - - return($current); -} - - -# -# shorten_prefix(prefix) -# -# Return PREFIX shortened by last directory component. -# - -sub shorten_prefix($) -{ - my @list = split("/", $_[0]); - - pop(@list); - return join("/", @list); -} - - - -# -# get_dir_list(filename_list) -# -# Return sorted list of directories for each entry in given FILENAME_LIST. -# - -sub get_dir_list(@) -{ - my %result; - - foreach (@_) - { - $result{shorten_prefix($_)} = ""; - } - - return(sort(keys(%result))); -} - - -# -# get_relative_base_path(subdirectory) -# -# Return a relative path string which references the base path when applied -# in SUBDIRECTORY. -# -# Example: get_relative_base_path("fs/mm") -> "../../" -# - -sub get_relative_base_path($) -{ - my $result = ""; - my $index; - - # Make an empty directory path a special case - if (!$_[0]) { return(""); } - - # Count number of /s in path - $index = ($_[0] =~ s/\//\//g); - - # Add a ../ to $result for each / in the directory path + 1 - for (; $index>=0; $index--) - { - $result .= "../"; - } - - return $result; -} - - -# -# read_testfile(test_filename) -# -# Read in file TEST_FILENAME which contains test descriptions in the format: -# -# TN:<whitespace><test name> -# TD:<whitespace><test description> -# -# for each test case. Return a reference to a hash containing a mapping -# -# test name -> test description. -# -# Die on error. -# - -sub read_testfile($) -{ - my %result; - my $test_name; - my $changed_testname; - local *TEST_HANDLE; - - open(TEST_HANDLE, "<", $_[0]) - or die("ERROR: cannot open $_[0]!\n"); - - while (<TEST_HANDLE>) - { - chomp($_); - - # Match lines beginning with TN:<whitespace(s)> - if (/^TN:\s+(.*?)\s*$/) - { - # Store name for later use - $test_name = $1; - if ($test_name =~ s/\W/_/g) - { - $changed_testname = 1; - } - } - - # Match lines beginning with TD:<whitespace(s)> - if (/^TD:\s+(.*?)\s*$/) - { - if (!defined($test_name)) { - die("ERROR: Found test description without prior test name in $_[0]:$.\n"); - } - # Check for empty line - if ($1) - { - # Add description to hash - $result{$test_name} .= " $1"; - } - else - { - # Add empty line - $result{$test_name} .= "\n\n"; - } - } - } - - close(TEST_HANDLE); - - if ($changed_testname) - { - warn("WARNING: invalid characters removed from testname in ". - "descriptions file $_[0]\n"); - } - - return \%result; -} - - -# -# escape_html(STRING) -# -# Return a copy of STRING in which all occurrences of HTML special characters -# are escaped. -# - -sub escape_html($) -{ - my $string = $_[0]; - - if (!$string) { return ""; } - - $string =~ s/&/&/g; # & -> & - $string =~ s/</</g; # < -> < - $string =~ s/>/>/g; # > -> > - $string =~ s/\"/"/g; # " -> " - - while ($string =~ /^([^\t]*)(\t)/) - { - my $replacement = " "x($tab_size - (length($1) % $tab_size)); - $string =~ s/^([^\t]*)(\t)/$1$replacement/; - } - - $string =~ s/\n/<br>/g; # \n -> <br> - - return $string; -} - - -# -# get_date_string() -# -# Return the current date in the form: yyyy-mm-dd -# - -sub get_date_string() -{ - my $year; - my $month; - my $day; - my $hour; - my $min; - my $sec; - my @timeresult; - - if (defined $ENV{'SOURCE_DATE_EPOCH'}) - { - @timeresult = gmtime($ENV{'SOURCE_DATE_EPOCH'}); - } - else - { - @timeresult = localtime(); - } - ($year, $month, $day, $hour, $min, $sec) = - @timeresult[5, 4, 3, 2, 1, 0]; - - return sprintf("%d-%02d-%02d %02d:%02d:%02d", $year+1900, $month+1, - $day, $hour, $min, $sec); -} - - -# -# create_sub_dir(dir_name) -# -# Create subdirectory DIR_NAME if it does not already exist, including all its -# parent directories. -# -# Die on error. -# - -sub create_sub_dir($) -{ - my ($dir) = @_; - - system("mkdir", "-p" ,$dir) - and die("ERROR: cannot create directory $dir!\n"); -} - - -# -# write_description_file(descriptions, overall_found, overall_hit, -# total_fn_found, total_fn_hit, total_br_found, -# total_br_hit) -# -# Write HTML file containing all test case descriptions. DESCRIPTIONS is a -# reference to a hash containing a mapping -# -# test case name -> test case description -# -# Die on error. -# - -sub write_description_file($$$$$$$) -{ - my %description = %{$_[0]}; - my $found = $_[1]; - my $hit = $_[2]; - my $fn_found = $_[3]; - my $fn_hit = $_[4]; - my $br_found = $_[5]; - my $br_hit = $_[6]; - my $test_name; - local *HTML_HANDLE; - - html_create(*HTML_HANDLE,"descriptions.$html_ext"); - write_html_prolog(*HTML_HANDLE, "", "LCOV - test case descriptions"); - write_header(*HTML_HANDLE, 3, "", "", $found, $hit, $fn_found, - $fn_hit, $br_found, $br_hit, 0); - - write_test_table_prolog(*HTML_HANDLE, - "Test case descriptions - alphabetical list"); - - foreach $test_name (sort(keys(%description))) - { - my $desc = $description{$test_name}; - - $desc = escape_html($desc) if (!$rc_desc_html); - write_test_table_entry(*HTML_HANDLE, $test_name, $desc); - } - - write_test_table_epilog(*HTML_HANDLE); - write_html_epilog(*HTML_HANDLE, ""); - - close(*HTML_HANDLE); -} - - - -# -# write_png_files() -# -# Create all necessary .png files for the HTML-output in the current -# directory. .png-files are used as bar graphs. -# -# Die on error. -# - -sub write_png_files() -{ - my %data; - local *PNG_HANDLE; - - $data{"ruby.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, - 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, - 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x18, 0x10, 0x5d, 0x57, - 0x34, 0x6e, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, - 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, - 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, - 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0x35, 0x2f, - 0x00, 0x00, 0x00, 0xd0, 0x33, 0x9a, 0x9d, 0x00, 0x00, 0x00, - 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, - 0x82]; - $data{"amber.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, - 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, - 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x28, 0x04, 0x98, 0xcb, - 0xd6, 0xe0, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, - 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, - 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, - 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xe0, 0x50, - 0x00, 0x00, 0x00, 0xa2, 0x7a, 0xda, 0x7e, 0x00, 0x00, 0x00, - 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, - 0x82]; - $data{"emerald.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, - 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, - 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x22, 0x2b, 0xc9, 0xf5, - 0x03, 0x33, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, - 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, - 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, - 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0x1b, 0xea, 0x59, - 0x0a, 0x0a, 0x0a, 0x0f, 0xba, 0x50, 0x83, 0x00, 0x00, 0x00, - 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, - 0x82]; - $data{"snow.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, - 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, - 0x45, 0x07, 0xd2, 0x07, 0x11, 0x0f, 0x1e, 0x1d, 0x75, 0xbc, - 0xef, 0x55, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, - 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, - 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, - 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x55, 0xc2, 0xd3, 0x7e, 0x00, 0x00, 0x00, - 0x0a, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x01, 0xe5, 0x27, 0xde, 0xfc, 0x00, - 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, - 0x82]; - $data{"glass.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x25, - 0xdb, 0x56, 0xca, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, - 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, - 0x00, 0x00, 0x06, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x55, 0xc2, 0xd3, 0x7e, 0x00, 0x00, 0x00, - 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, - 0x00, 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x00, 0x88, - 0x05, 0x1d, 0x48, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, - 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, - 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, - 0x4d, 0x45, 0x07, 0xd2, 0x07, 0x13, 0x0f, 0x08, 0x19, 0xc4, - 0x40, 0x56, 0x10, 0x00, 0x00, 0x00, 0x0a, 0x49, 0x44, 0x41, - 0x54, 0x78, 0x9c, 0x63, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x01, 0x48, 0xaf, 0xa4, 0x71, 0x00, 0x00, 0x00, 0x00, 0x49, - 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82]; - $data{"updown.png"} = - [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, - 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0a, - 0x00, 0x00, 0x00, 0x0e, 0x08, 0x06, 0x00, 0x00, 0x00, 0x16, - 0xa3, 0x8d, 0xab, 0x00, 0x00, 0x00, 0x3c, 0x49, 0x44, 0x41, - 0x54, 0x28, 0xcf, 0x63, 0x60, 0x40, 0x03, 0xff, 0xa1, 0x00, - 0x5d, 0x9c, 0x11, 0x5d, 0x11, 0x8a, 0x24, 0x23, 0x23, 0x23, - 0x86, 0x42, 0x6c, 0xa6, 0x20, 0x2b, 0x66, 0xc4, 0xa7, 0x08, - 0x59, 0x31, 0x23, 0x21, 0x45, 0x30, 0xc0, 0xc4, 0x30, 0x60, - 0x80, 0xfa, 0x6e, 0x24, 0x3e, 0x78, 0x48, 0x0a, 0x70, 0x62, - 0xa2, 0x90, 0x81, 0xd8, 0x44, 0x01, 0x00, 0xe9, 0x5c, 0x2f, - 0xf5, 0xe2, 0x9d, 0x0f, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x49, - 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82] if ($sort); - foreach (keys(%data)) - { - open(PNG_HANDLE, ">", $_) - or die("ERROR: cannot create $_!\n"); - binmode(PNG_HANDLE); - print(PNG_HANDLE map(chr,@{$data{$_}})); - close(PNG_HANDLE); - } -} - - -# -# write_htaccess_file() -# - -sub write_htaccess_file() -{ - local *HTACCESS_HANDLE; - my $htaccess_data; - - open(*HTACCESS_HANDLE, ">", ".htaccess") - or die("ERROR: cannot open .htaccess for writing!\n"); - - $htaccess_data = (<<"END_OF_HTACCESS") -AddEncoding x-gzip .html -END_OF_HTACCESS - ; - - print(HTACCESS_HANDLE $htaccess_data); - close(*HTACCESS_HANDLE); -} - - -# -# write_css_file() -# -# Write the cascading style sheet file gcov.css to the current directory. -# This file defines basic layout attributes of all generated HTML pages. -# - -sub write_css_file() -{ - local *CSS_HANDLE; - - # Check for a specified external style sheet file - if ($css_filename) - { - # Simply copy that file - system("cp", $css_filename, "gcov.css") - and die("ERROR: cannot copy file $css_filename!\n"); - return; - } - - open(CSS_HANDLE, ">", "gcov.css") - or die ("ERROR: cannot open gcov.css for writing!\n"); - - - # ************************************************************* - - my $css_data = ($_=<<"END_OF_CSS") - /* All views: initial background and text color */ - body - { - color: #000000; - background-color: #FFFFFF; - } - - /* All views: standard link format*/ - a:link - { - color: #284FA8; - text-decoration: underline; - } - - /* All views: standard link - visited format */ - a:visited - { - color: #00CB40; - text-decoration: underline; - } - - /* All views: standard link - activated format */ - a:active - { - color: #FF0040; - text-decoration: underline; - } - - /* All views: main title format */ - td.title - { - text-align: center; - padding-bottom: 10px; - font-family: sans-serif; - font-size: 20pt; - font-style: italic; - font-weight: bold; - } - - /* All views: header item format */ - td.headerItem - { - text-align: right; - padding-right: 6px; - font-family: sans-serif; - font-weight: bold; - vertical-align: top; - white-space: nowrap; - } - - /* All views: header item value format */ - td.headerValue - { - text-align: left; - color: #284FA8; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - } - - /* All views: header item coverage table heading */ - td.headerCovTableHead - { - text-align: center; - padding-right: 6px; - padding-left: 6px; - padding-bottom: 0px; - font-family: sans-serif; - font-size: 80%; - white-space: nowrap; - } - - /* All views: header item coverage table entry */ - td.headerCovTableEntry - { - text-align: right; - color: #284FA8; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #DAE7FE; - } - - /* All views: header item coverage table entry for high coverage rate */ - td.headerCovTableEntryHi - { - text-align: right; - color: #000000; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #A7FC9D; - } - - /* All views: header item coverage table entry for medium coverage rate */ - td.headerCovTableEntryMed - { - text-align: right; - color: #000000; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #FFEA20; - } - - /* All views: header item coverage table entry for ow coverage rate */ - td.headerCovTableEntryLo - { - text-align: right; - color: #000000; - font-family: sans-serif; - font-weight: bold; - white-space: nowrap; - padding-left: 12px; - padding-right: 4px; - background-color: #FF0000; - } - - /* All views: header legend value for legend entry */ - td.headerValueLeg - { - text-align: left; - color: #000000; - font-family: sans-serif; - font-size: 80%; - white-space: nowrap; - padding-top: 4px; - } - - /* All views: color of horizontal ruler */ - td.ruler - { - background-color: #6688D4; - } - - /* All views: version string format */ - td.versionInfo - { - text-align: center; - padding-top: 2px; - font-family: sans-serif; - font-style: italic; - } - - /* Directory view/File view (all)/Test case descriptions: - table headline format */ - td.tableHead - { - text-align: center; - color: #FFFFFF; - background-color: #6688D4; - font-family: sans-serif; - font-size: 120%; - font-weight: bold; - white-space: nowrap; - padding-left: 4px; - padding-right: 4px; - } - - span.tableHeadSort - { - padding-right: 4px; - } - - /* Directory view/File view (all): filename entry format */ - td.coverFile - { - text-align: left; - padding-left: 10px; - padding-right: 20px; - color: #284FA8; - background-color: #DAE7FE; - font-family: monospace; - } - - /* Directory view/File view (all): bar-graph entry format*/ - td.coverBar - { - padding-left: 10px; - padding-right: 10px; - background-color: #DAE7FE; - } - - /* Directory view/File view (all): bar-graph outline color */ - td.coverBarOutline - { - background-color: #000000; - } - - /* Directory view/File view (all): percentage entry for files with - high coverage rate */ - td.coverPerHi - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #A7FC9D; - font-weight: bold; - font-family: sans-serif; - } - - /* Directory view/File view (all): line count entry for files with - high coverage rate */ - td.coverNumHi - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #A7FC9D; - white-space: nowrap; - font-family: sans-serif; - } - - /* Directory view/File view (all): percentage entry for files with - medium coverage rate */ - td.coverPerMed - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #FFEA20; - font-weight: bold; - font-family: sans-serif; - } - - /* Directory view/File view (all): line count entry for files with - medium coverage rate */ - td.coverNumMed - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #FFEA20; - white-space: nowrap; - font-family: sans-serif; - } - - /* Directory view/File view (all): percentage entry for files with - low coverage rate */ - td.coverPerLo - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #FF0000; - font-weight: bold; - font-family: sans-serif; - } - - /* Directory view/File view (all): line count entry for files with - low coverage rate */ - td.coverNumLo - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #FF0000; - white-space: nowrap; - font-family: sans-serif; - } - - /* File view (all): "show/hide details" link format */ - a.detail:link - { - color: #B8D0FF; - font-size:80%; - } - - /* File view (all): "show/hide details" link - visited format */ - a.detail:visited - { - color: #B8D0FF; - font-size:80%; - } - - /* File view (all): "show/hide details" link - activated format */ - a.detail:active - { - color: #FFFFFF; - font-size:80%; - } - - /* File view (detail): test name entry */ - td.testName - { - text-align: right; - padding-right: 10px; - background-color: #DAE7FE; - font-family: sans-serif; - } - - /* File view (detail): test percentage entry */ - td.testPer - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #DAE7FE; - font-family: sans-serif; - } - - /* File view (detail): test lines count entry */ - td.testNum - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #DAE7FE; - font-family: sans-serif; - } - - /* Test case descriptions: test name format*/ - dt - { - font-family: sans-serif; - font-weight: bold; - } - - /* Test case descriptions: description table body */ - td.testDescription - { - padding-top: 10px; - padding-left: 30px; - padding-bottom: 10px; - padding-right: 30px; - background-color: #DAE7FE; - } - - /* Source code view: function entry */ - td.coverFn - { - text-align: left; - padding-left: 10px; - padding-right: 20px; - color: #284FA8; - background-color: #DAE7FE; - font-family: monospace; - } - - /* Source code view: function entry zero count*/ - td.coverFnLo - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #FF0000; - font-weight: bold; - font-family: sans-serif; - } - - /* Source code view: function entry nonzero count*/ - td.coverFnHi - { - text-align: right; - padding-left: 10px; - padding-right: 10px; - background-color: #DAE7FE; - font-weight: bold; - font-family: sans-serif; - } - - /* Source code view: source code format */ - pre.source - { - font-family: monospace; - white-space: pre; - margin-top: 2px; - } - - /* Source code view: line number format */ - span.lineNum - { - background-color: #EFE383; - } - - /* Source code view: format for lines which were executed */ - td.lineCov, - span.lineCov - { - background-color: #CAD7FE; - } - - /* Source code view: format for Cov legend */ - span.coverLegendCov - { - padding-left: 10px; - padding-right: 10px; - padding-bottom: 2px; - background-color: #CAD7FE; - } - - /* Source code view: format for lines which were not executed */ - td.lineNoCov, - span.lineNoCov - { - background-color: #FF6230; - } - - /* Source code view: format for NoCov legend */ - span.coverLegendNoCov - { - padding-left: 10px; - padding-right: 10px; - padding-bottom: 2px; - background-color: #FF6230; - } - - /* Source code view (function table): standard link - visited format */ - td.lineNoCov > a:visited, - td.lineCov > a:visited - { - color: black; - text-decoration: underline; - } - - /* Source code view: format for lines which were executed only in a - previous version */ - span.lineDiffCov - { - background-color: #B5F7AF; - } - - /* Source code view: format for branches which were executed - * and taken */ - span.branchCov - { - background-color: #CAD7FE; - } - - /* Source code view: format for branches which were executed - * but not taken */ - span.branchNoCov - { - background-color: #FF6230; - } - - /* Source code view: format for branches which were not executed */ - span.branchNoExec - { - background-color: #FF6230; - } - - /* Source code view: format for the source code heading line */ - pre.sourceHeading - { - white-space: pre; - font-family: monospace; - font-weight: bold; - margin: 0px; - } - - /* All views: header legend value for low rate */ - td.headerValueLegL - { - font-family: sans-serif; - text-align: center; - white-space: nowrap; - padding-left: 4px; - padding-right: 2px; - background-color: #FF0000; - font-size: 80%; - } - - /* All views: header legend value for med rate */ - td.headerValueLegM - { - font-family: sans-serif; - text-align: center; - white-space: nowrap; - padding-left: 2px; - padding-right: 2px; - background-color: #FFEA20; - font-size: 80%; - } - - /* All views: header legend value for hi rate */ - td.headerValueLegH - { - font-family: sans-serif; - text-align: center; - white-space: nowrap; - padding-left: 2px; - padding-right: 4px; - background-color: #A7FC9D; - font-size: 80%; - } - - /* All views except source code view: legend format for low coverage */ - span.coverLegendCovLo - { - padding-left: 10px; - padding-right: 10px; - padding-top: 2px; - background-color: #FF0000; - } - - /* All views except source code view: legend format for med coverage */ - span.coverLegendCovMed - { - padding-left: 10px; - padding-right: 10px; - padding-top: 2px; - background-color: #FFEA20; - } - - /* All views except source code view: legend format for hi coverage */ - span.coverLegendCovHi - { - padding-left: 10px; - padding-right: 10px; - padding-top: 2px; - background-color: #A7FC9D; - } -END_OF_CSS - ; - - # ************************************************************* - - - # Remove leading tab from all lines - $css_data =~ s/^\t//gm; - - print(CSS_HANDLE $css_data); - - close(CSS_HANDLE); -} - - -# -# get_bar_graph_code(base_dir, cover_found, cover_hit) -# -# Return a string containing HTML code which implements a bar graph display -# for a coverage rate of cover_hit * 100 / cover_found. -# - -sub get_bar_graph_code($$$) -{ - my ($base_dir, $found, $hit) = @_; - my $rate; - my $alt; - my $width; - my $remainder; - my $png_name; - my $graph_code; - - # Check number of instrumented lines - if ($_[1] == 0) { return ""; } - - $alt = rate($hit, $found, "%"); - $width = rate($hit, $found, undef, 0); - $remainder = 100 - $width; - - # Decide which .png file to use - $png_name = $rate_png[classify_rate($found, $hit, $med_limit, - $hi_limit)]; - - if ($width == 0) - { - # Zero coverage - $graph_code = (<<END_OF_HTML) - <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="$_[0]snow.png" width=100 height=10 alt="$alt"></td></tr></table> -END_OF_HTML - ; - } - elsif ($width == 100) - { - # Full coverage - $graph_code = (<<END_OF_HTML) - <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="$_[0]$png_name" width=100 height=10 alt="$alt"></td></tr></table> -END_OF_HTML - ; - } - else - { - # Positive coverage - $graph_code = (<<END_OF_HTML) - <table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="$_[0]$png_name" width=$width height=10 alt="$alt"><img src="$_[0]snow.png" width=$remainder height=10 alt="$alt"></td></tr></table> -END_OF_HTML - ; - } - - # Remove leading tabs from all lines - $graph_code =~ s/^\t+//gm; - chomp($graph_code); - - return($graph_code); -} - -# -# sub classify_rate(found, hit, med_limit, high_limit) -# -# Return 0 for low rate, 1 for medium rate and 2 for hi rate. -# - -sub classify_rate($$$$) -{ - my ($found, $hit, $med, $hi) = @_; - my $rate; - - if ($found == 0) { - return 2; - } - $rate = rate($hit, $found); - if ($rate < $med) { - return 0; - } elsif ($rate < $hi) { - return 1; - } - return 2; -} - - -# -# write_html(filehandle, html_code) -# -# Write out HTML_CODE to FILEHANDLE while removing a leading tabulator mark -# in each line of HTML_CODE. -# - -sub write_html(*$) -{ - local *HTML_HANDLE = $_[0]; - my $html_code = $_[1]; - - # Remove leading tab from all lines - $html_code =~ s/^\t//gm; - - print(HTML_HANDLE $html_code) - or die("ERROR: cannot write HTML data ($!)\n"); -} - - -# -# write_html_prolog(filehandle, base_dir, pagetitle) -# -# Write an HTML prolog common to all HTML files to FILEHANDLE. PAGETITLE will -# be used as HTML page title. BASE_DIR contains a relative path which points -# to the base directory. -# - -sub write_html_prolog(*$$) -{ - my $basedir = $_[1]; - my $pagetitle = $_[2]; - my $prolog; - - $prolog = $html_prolog; - $prolog =~ s/\@pagetitle\@/$pagetitle/g; - $prolog =~ s/\@basedir\@/$basedir/g; - - write_html($_[0], $prolog); -} - - -# -# write_header_prolog(filehandle, base_dir) -# -# Write beginning of page header HTML code. -# - -sub write_header_prolog(*$) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <table width="100%" border=0 cellspacing=0 cellpadding=0> - <tr><td class="title">$title</td></tr> - <tr><td class="ruler"><img src="$_[1]glass.png" width=3 height=3 alt=""></td></tr> - - <tr> - <td width="100%"> - <table cellpadding=1 border=0 width="100%"> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_header_line(handle, content) -# -# Write a header line with the specified table contents. -# - -sub write_header_line(*@) -{ - my ($handle, @content) = @_; - my $entry; - - write_html($handle, " <tr>\n"); - foreach $entry (@content) { - my ($width, $class, $text, $colspan) = @{$entry}; - - if (defined($width)) { - $width = " width=\"$width\""; - } else { - $width = ""; - } - if (defined($class)) { - $class = " class=\"$class\""; - } else { - $class = ""; - } - if (defined($colspan)) { - $colspan = " colspan=\"$colspan\""; - } else { - $colspan = ""; - } - $text = "" if (!defined($text)); - write_html($handle, - " <td$width$class$colspan>$text</td>\n"); - } - write_html($handle, " </tr>\n"); -} - - -# -# write_header_epilog(filehandle, base_dir) -# -# Write end of page header HTML code. -# - -sub write_header_epilog(*$) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <tr><td><img src="$_[1]glass.png" width=3 height=3 alt=""></td></tr> - </table> - </td> - </tr> - - <tr><td class="ruler"><img src="$_[1]glass.png" width=3 height=3 alt=""></td></tr> - </table> - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_file_table_prolog(handle, file_heading, ([heading, num_cols], ...)) -# -# Write heading for file table. -# - -sub write_file_table_prolog(*$@) -{ - my ($handle, $file_heading, @columns) = @_; - my $num_columns = 0; - my $file_width; - my $col; - my $width; - - $width = 20 if (scalar(@columns) == 1); - $width = 10 if (scalar(@columns) == 2); - $width = 8 if (scalar(@columns) > 2); - - foreach $col (@columns) { - my ($heading, $cols) = @{$col}; - - $num_columns += $cols; - } - $file_width = 100 - $num_columns * $width; - - # Table definition - write_html($handle, <<END_OF_HTML); - <center> - <table width="80%" cellpadding=1 cellspacing=1 border=0> - - <tr> - <td width="$file_width%"><br></td> -END_OF_HTML - # Empty first row - foreach $col (@columns) { - my ($heading, $cols) = @{$col}; - - while ($cols-- > 0) { - write_html($handle, <<END_OF_HTML); - <td width="$width%"></td> -END_OF_HTML - } - } - # Next row - write_html($handle, <<END_OF_HTML); - </tr> - - <tr> - <td class="tableHead">$file_heading</td> -END_OF_HTML - # Heading row - foreach $col (@columns) { - my ($heading, $cols) = @{$col}; - my $colspan = ""; - - $colspan = " colspan=$cols" if ($cols > 1); - write_html($handle, <<END_OF_HTML); - <td class="tableHead"$colspan>$heading</td> -END_OF_HTML - } - write_html($handle, <<END_OF_HTML); - </tr> -END_OF_HTML -} - - -# write_file_table_entry(handle, base_dir, filename, page_link, -# ([ found, hit, med_limit, hi_limit, graph ], ..) -# -# Write an entry of the file table. -# - -sub write_file_table_entry(*$$$@) -{ - my ($handle, $base_dir, $filename, $page_link, @entries) = @_; - my $file_code; - my $entry; - my $esc_filename = escape_html($filename); - - # Add link to source if provided - if (defined($page_link) && $page_link ne "") { - $file_code = "<a href=\"$page_link\">$esc_filename</a>"; - } else { - $file_code = $esc_filename; - } - - # First column: filename - write_html($handle, <<END_OF_HTML); - <tr> - <td class="coverFile">$file_code</td> -END_OF_HTML - # Columns as defined - foreach $entry (@entries) { - my ($found, $hit, $med, $hi, $graph) = @{$entry}; - my $bar_graph; - my $class; - my $rate; - - # Generate bar graph if requested - if ($graph) { - $bar_graph = get_bar_graph_code($base_dir, $found, - $hit); - write_html($handle, <<END_OF_HTML); - <td class="coverBar" align="center"> - $bar_graph - </td> -END_OF_HTML - } - # Get rate color and text - if ($found == 0) { - $rate = "-"; - $class = "Hi"; - } else { - $rate = rate($hit, $found, " %"); - $class = $rate_name[classify_rate($found, $hit, - $med, $hi)]; - } - if ($opt_missed) { - # Show negative number of items without coverage - $hit = -($found - $hit); - } - write_html($handle, <<END_OF_HTML); - <td class="coverPer$class">$rate</td> - <td class="coverNum$class">$hit / $found</td> -END_OF_HTML - } - # End of row - write_html($handle, <<END_OF_HTML); - </tr> -END_OF_HTML -} - - -# -# write_file_table_detail_entry(filehandle, test_name, ([found, hit], ...)) -# -# Write entry for detail section in file table. -# - -sub write_file_table_detail_entry(*$@) -{ - my ($handle, $test, @entries) = @_; - my $entry; - - if ($test eq "") { - $test = "<span style=\"font-style:italic\"><unnamed></span>"; - } elsif ($test =~ /^(.*),diff$/) { - $test = $1." (converted)"; - } - # Testname - write_html($handle, <<END_OF_HTML); - <tr> - <td class="testName" colspan=2>$test</td> -END_OF_HTML - # Test data - foreach $entry (@entries) { - my ($found, $hit) = @{$entry}; - my $rate = rate($hit, $found, " %"); - - write_html($handle, <<END_OF_HTML); - <td class="testPer">$rate</td> - <td class="testNum">$hit / $found</td> -END_OF_HTML - } - - write_html($handle, <<END_OF_HTML); - </tr> - -END_OF_HTML - - # ************************************************************* -} - - -# -# write_file_table_epilog(filehandle) -# -# Write end of file table HTML code. -# - -sub write_file_table_epilog(*) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - </table> - </center> - <br> - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_test_table_prolog(filehandle, table_heading) -# -# Write heading for test case description table. -# - -sub write_test_table_prolog(*$) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <center> - <table width="80%" cellpadding=2 cellspacing=1 border=0> - - <tr> - <td><br></td> - </tr> - - <tr> - <td class="tableHead">$_[1]</td> - </tr> - - <tr> - <td class="testDescription"> - <dl> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_test_table_entry(filehandle, test_name, test_description) -# -# Write entry for the test table. -# - -sub write_test_table_entry(*$$) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <dt>$_[1]<a name="$_[1]"> </a></dt> - <dd>$_[2]<br><br></dd> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_test_table_epilog(filehandle) -# -# Write end of test description table HTML code. -# - -sub write_test_table_epilog(*) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - </dl> - </td> - </tr> - </table> - </center> - <br> - -END_OF_HTML - ; - - # ************************************************************* -} - - -sub fmt_centered($$) -{ - my ($width, $text) = @_; - my $w0 = length($text); - my $w1 = $width > $w0 ? int(($width - $w0) / 2) : 0; - my $w2 = $width > $w0 ? $width - $w0 - $w1 : 0; - - return (" "x$w1).$text.(" "x$w2); -} - - -# -# write_source_prolog(filehandle) -# -# Write start of source code table. -# - -sub write_source_prolog(*) -{ - my $lineno_heading = " "; - my $branch_heading = ""; - my $line_heading = fmt_centered($line_field_width, "Line data"); - my $source_heading = " Source code"; - - if ($br_coverage) { - $branch_heading = fmt_centered($br_field_width, "Branch data"). - " "; - } - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <table cellpadding=0 cellspacing=0 border=0> - <tr> - <td><br></td> - </tr> - <tr> - <td> -<pre class="sourceHeading">${lineno_heading}${branch_heading}${line_heading} ${source_heading}</pre> -<pre class="source"> -END_OF_HTML - ; - - # ************************************************************* -} - -sub cmp_blocks($$) -{ - my ($a, $b) = @_; - my ($fa, $fb) = ($a->[0], $b->[0]); - - return $fa->[0] <=> $fb->[0] if ($fa->[0] != $fb->[0]); - return $fa->[1] <=> $fb->[1]; -} - -# -# get_branch_blocks(brdata) -# -# Group branches that belong to the same basic block. -# -# Returns: [block1, block2, ...] -# block: [branch1, branch2, ...] -# branch: [block_num, branch_num, taken_count, text_length, open, close] -# - -sub get_branch_blocks($) -{ - my ($brdata) = @_; - my $last_block_num; - my $block = []; - my @blocks; - - return () if (!defined($brdata)); - - # Group branches - foreach my $entry (split(/:/, $brdata)) { - my ($block_num, $branch, $taken) = split(/,/, $entry); - my $br; - - if (defined($last_block_num) && $block_num != $last_block_num) { - push(@blocks, $block); - $block = []; - } - $br = [$block_num, $branch, $taken, 3, 0, 0]; - push(@{$block}, $br); - $last_block_num = $block_num; - } - push(@blocks, $block) if (scalar(@{$block}) > 0); - - # Add braces to first and last branch in group - foreach $block (@blocks) { - $block->[0]->[$BR_OPEN] = 1; - $block->[0]->[$BR_LEN]++; - $block->[scalar(@{$block}) - 1]->[$BR_CLOSE] = 1; - $block->[scalar(@{$block}) - 1]->[$BR_LEN]++; - } - - return sort(cmp_blocks @blocks); -} - -# -# get_block_len(block) -# -# Calculate total text length of all branches in a block of branches. -# - -sub get_block_len($) -{ - my ($block) = @_; - my $len = 0; - my $branch; - - foreach $branch (@{$block}) { - $len += $branch->[$BR_LEN]; - } - - return $len; -} - - -# -# get_branch_html(brdata) -# -# Return a list of HTML lines which represent the specified branch coverage -# data in source code view. -# - -sub get_branch_html($) -{ - my ($brdata) = @_; - my @blocks = get_branch_blocks($brdata); - my $block; - my $branch; - my $line_len = 0; - my $line = []; # [branch2|" ", branch|" ", ...] - my @lines; # [line1, line2, ...] - my @result; - - # Distribute blocks to lines - foreach $block (@blocks) { - my $block_len = get_block_len($block); - - # Does this block fit into the current line? - if ($line_len + $block_len <= $br_field_width) { - # Add it - $line_len += $block_len; - push(@{$line}, @{$block}); - next; - } elsif ($block_len <= $br_field_width) { - # It would fit if the line was empty - add it to new - # line - push(@lines, $line); - $line_len = $block_len; - $line = [ @{$block} ]; - next; - } - # Split the block into several lines - foreach $branch (@{$block}) { - if ($line_len + $branch->[$BR_LEN] >= $br_field_width) { - # Start a new line - if (($line_len + 1 <= $br_field_width) && - scalar(@{$line}) > 0 && - !$line->[scalar(@$line) - 1]->[$BR_CLOSE]) { - # Try to align branch symbols to be in - # one # row - push(@{$line}, " "); - } - push(@lines, $line); - $line_len = 0; - $line = []; - } - push(@{$line}, $branch); - $line_len += $branch->[$BR_LEN]; - } - } - push(@lines, $line); - - # Convert to HTML - foreach $line (@lines) { - my $current = ""; - my $current_len = 0; - - foreach $branch (@$line) { - # Skip alignment space - if ($branch eq " ") { - $current .= " "; - $current_len++; - next; - } - - my ($block_num, $br_num, $taken, $len, $open, $close) = - @{$branch}; - my $class; - my $title; - my $text; - - if ($taken eq '-') { - $class = "branchNoExec"; - $text = " # "; - $title = "Branch $br_num was not executed"; - } elsif ($taken == 0) { - $class = "branchNoCov"; - $text = " - "; - $title = "Branch $br_num was not taken"; - } else { - $class = "branchCov"; - $text = " + "; - $title = "Branch $br_num was taken $taken ". - "time"; - $title .= "s" if ($taken > 1); - } - $current .= "[" if ($open); - $current .= "<span class=\"$class\" title=\"$title\">"; - $current .= $text."</span>"; - $current .= "]" if ($close); - $current_len += $len; - } - - # Right-align result text - if ($current_len < $br_field_width) { - $current = (" "x($br_field_width - $current_len)). - $current; - } - push(@result, $current); - } - - return @result; -} - - -# -# format_count(count, width) -# -# Return a right-aligned representation of count that fits in width characters. -# - -sub format_count($$) -{ - my ($count, $width) = @_; - my $result; - my $exp; - - $result = sprintf("%*.0f", $width, $count); - while (length($result) > $width) { - last if ($count < 10); - $exp++; - $count = int($count/10); - $result = sprintf("%*s", $width, ">$count*10^$exp"); - } - return $result; -} - -# -# write_source_line(filehandle, line_num, source, hit_count, converted, -# brdata) -# -# Write formatted source code line. Return a line in a format as needed -# by gen_png() -# - -sub write_source_line(*$$$$$) -{ - my ($handle, $line, $source, $count, $converted, $brdata) = @_; - my $source_format; - my $count_format; - my $result; - my $anchor_start = ""; - my $anchor_end = ""; - my $count_field_width = $line_field_width - 1; - my @br_html; - my $html; - - # Get branch HTML data for this line - @br_html = get_branch_html($brdata) if ($br_coverage); - - if (!defined($count)) { - $result = ""; - $source_format = ""; - $count_format = " "x$count_field_width; - } - elsif ($count == 0) { - $result = $count; - $source_format = '<span class="lineNoCov">'; - $count_format = format_count($count, $count_field_width); - } - elsif ($converted && defined($highlight)) { - $result = "*".$count; - $source_format = '<span class="lineDiffCov">'; - $count_format = format_count($count, $count_field_width); - } - else { - $result = $count; - $source_format = '<span class="lineCov">'; - $count_format = format_count($count, $count_field_width); - } - $result .= ":".$source; - - # Write out a line number navigation anchor every $nav_resolution - # lines if necessary - $anchor_start = "<a name=\"$_[1]\">"; - $anchor_end = "</a>"; - - - # ************************************************************* - - $html = $anchor_start; - $html .= "<span class=\"lineNum\">".sprintf("%8d", $line)." </span>"; - $html .= shift(@br_html).":" if ($br_coverage); - $html .= "$source_format$count_format : "; - $html .= escape_html($source); - $html .= "</span>" if ($source_format); - $html .= $anchor_end."\n"; - - write_html($handle, $html); - - if ($br_coverage) { - # Add lines for overlong branch information - foreach (@br_html) { - write_html($handle, "<span class=\"lineNum\">". - " </span>$_\n"); - } - } - # ************************************************************* - - return($result); -} - - -# -# write_source_epilog(filehandle) -# -# Write end of source code table. -# - -sub write_source_epilog(*) -{ - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - </pre> - </td> - </tr> - </table> - <br> - -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_html_epilog(filehandle, base_dir[, break_frames]) -# -# Write HTML page footer to FILEHANDLE. BREAK_FRAMES should be set when -# this page is embedded in a frameset, clicking the URL link will then -# break this frameset. -# - -sub write_html_epilog(*$;$) -{ - my $basedir = $_[1]; - my $break_code = ""; - my $epilog; - - if (defined($_[2])) - { - $break_code = " target=\"_parent\""; - } - - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <table width="100%" border=0 cellspacing=0 cellpadding=0> - <tr><td class="ruler"><img src="$_[1]glass.png" width=3 height=3 alt=""></td></tr> - <tr><td class="versionInfo">Generated by: <a href="$lcov_url"$break_code>$lcov_version</a></td></tr> - </table> - <br> -END_OF_HTML - ; - - $epilog = $html_epilog; - $epilog =~ s/\@basedir\@/$basedir/g; - - write_html($_[0], $epilog); -} - - -# -# write_frameset(filehandle, basedir, basename, pagetitle) -# -# - -sub write_frameset(*$$$) -{ - my $frame_width = $overview_width + 40; - - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"> - - <html lang="en"> - - <head> - <meta http-equiv="Content-Type" content="text/html; charset=$charset"> - <title>$_[3]</title> - <link rel="stylesheet" type="text/css" href="$_[1]gcov.css"> - </head> - - <frameset cols="$frame_width,*"> - <frame src="$_[2].gcov.overview.$html_ext" name="overview"> - <frame src="$_[2].gcov.$html_ext" name="source"> - <noframes> - <center>Frames not supported by your browser!<br></center> - </noframes> - </frameset> - - </html> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# sub write_overview_line(filehandle, basename, line, link) -# -# - -sub write_overview_line(*$$$) -{ - my $y1 = $_[2] - 1; - my $y2 = $y1 + $nav_resolution - 1; - my $x2 = $overview_width - 1; - - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <area shape="rect" coords="0,$y1,$x2,$y2" href="$_[1].gcov.$html_ext#$_[3]" target="source" alt="overview"> -END_OF_HTML - ; - - # ************************************************************* -} - - -# -# write_overview(filehandle, basedir, basename, pagetitle, lines) -# -# - -sub write_overview(*$$$$) -{ - my $index; - my $max_line = $_[4] - 1; - my $offset; - - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> - - <html lang="en"> - - <head> - <title>$_[3]</title> - <meta http-equiv="Content-Type" content="text/html; charset=$charset"> - <link rel="stylesheet" type="text/css" href="$_[1]gcov.css"> - </head> - - <body> - <map name="overview"> -END_OF_HTML - ; - - # ************************************************************* - - # Make $offset the next higher multiple of $nav_resolution - $offset = ($nav_offset + $nav_resolution - 1) / $nav_resolution; - $offset = sprintf("%d", $offset ) * $nav_resolution; - - # Create image map for overview image - for ($index = 1; $index <= $_[4]; $index += $nav_resolution) - { - # Enforce nav_offset - if ($index < $offset + 1) - { - write_overview_line($_[0], $_[2], $index, 1); - } - else - { - write_overview_line($_[0], $_[2], $index, $index - $offset); - } - } - - # ************************************************************* - - write_html($_[0], <<END_OF_HTML) - </map> - - <center> - <a href="$_[2].gcov.$html_ext#top" target="source">Top</a><br><br> - <img src="$_[2].gcov.png" width=$overview_width height=$max_line alt="Overview" border=0 usemap="#overview"> - </center> - </body> - </html> -END_OF_HTML - ; - - # ************************************************************* -} - - -sub max($$) -{ - my ($a, $b) = @_; - - return $a if ($a > $b); - return $b; -} - - -# -# write_header(filehandle, type, trunc_file_name, rel_file_name, lines_found, -# lines_hit, funcs_found, funcs_hit, sort_type) -# -# Write a complete standard page header. TYPE may be (0, 1, 2, 3, 4) -# corresponding to (directory view header, file view header, source view -# header, test case description header, function view header) -# - -sub write_header(*$$$$$$$$$$) -{ - local *HTML_HANDLE = $_[0]; - my $type = $_[1]; - my $trunc_name = $_[2]; - my $rel_filename = $_[3]; - my $lines_found = $_[4]; - my $lines_hit = $_[5]; - my $fn_found = $_[6]; - my $fn_hit = $_[7]; - my $br_found = $_[8]; - my $br_hit = $_[9]; - my $sort_type = $_[10]; - my $base_dir; - my $view; - my $test; - my $base_name; - my $style; - my $rate; - my @row_left; - my @row_right; - my $num_rows; - my $i; - my $esc_trunc_name = escape_html($trunc_name); - - $base_name = basename($rel_filename); - - # Prepare text for "current view" field - if ($type == $HDR_DIR) - { - # Main overview - $base_dir = ""; - $view = $overview_title; - } - elsif ($type == $HDR_FILE) - { - # Directory overview - $base_dir = get_relative_base_path($rel_filename); - $view = "<a href=\"$base_dir"."index.$html_ext\">". - "$overview_title</a> - $esc_trunc_name"; - } - elsif ($type == $HDR_SOURCE || $type == $HDR_FUNC) - { - # File view - my $dir_name = dirname($rel_filename); - my $esc_base_name = escape_html($base_name); - my $esc_dir_name = escape_html($dir_name); - - $base_dir = get_relative_base_path($dir_name); - if ($frames) - { - # Need to break frameset when clicking any of these - # links - $view = "<a href=\"$base_dir"."index.$html_ext\" ". - "target=\"_parent\">$overview_title</a> - ". - "<a href=\"index.$html_ext\" target=\"_parent\">". - "$esc_dir_name</a> - $esc_base_name"; - } - else - { - $view = "<a href=\"$base_dir"."index.$html_ext\">". - "$overview_title</a> - ". - "<a href=\"index.$html_ext\">". - "$esc_dir_name</a> - $esc_base_name"; - } - - # Add function suffix - if ($func_coverage) { - $view .= "<span style=\"font-size: 80%;\">"; - if ($type == $HDR_SOURCE) { - if ($sort) { - $view .= " (source / <a href=\"$base_name.func-sort-c.$html_ext\">functions</a>)"; - } else { - $view .= " (source / <a href=\"$base_name.func.$html_ext\">functions</a>)"; - } - } elsif ($type == $HDR_FUNC) { - $view .= " (<a href=\"$base_name.gcov.$html_ext\">source</a> / functions)"; - } - $view .= "</span>"; - } - } - elsif ($type == $HDR_TESTDESC) - { - # Test description header - $base_dir = ""; - $view = "<a href=\"$base_dir"."index.$html_ext\">". - "$overview_title</a> - test case descriptions"; - } - - # Prepare text for "test" field - $test = escape_html($test_title); - - # Append link to test description page if available - if (%test_description && ($type != $HDR_TESTDESC)) - { - if ($frames && ($type == $HDR_SOURCE || $type == $HDR_FUNC)) - { - # Need to break frameset when clicking this link - $test .= " ( <span style=\"font-size:80%;\">". - "<a href=\"$base_dir". - "descriptions.$html_ext\" target=\"_parent\">". - "view descriptions</a></span> )"; - } - else - { - $test .= " ( <span style=\"font-size:80%;\">". - "<a href=\"$base_dir". - "descriptions.$html_ext\">". - "view descriptions</a></span> )"; - } - } - - # Write header - write_header_prolog(*HTML_HANDLE, $base_dir); - - # Left row - push(@row_left, [[ "10%", "headerItem", "Current view:" ], - [ "35%", "headerValue", $view ]]); - push(@row_left, [[undef, "headerItem", "Test:"], - [undef, "headerValue", $test]]); - push(@row_left, [[undef, "headerItem", "Date:"], - [undef, "headerValue", $date]]); - - # Right row - if ($legend && ($type == $HDR_SOURCE || $type == $HDR_FUNC)) { - my $text = <<END_OF_HTML; - Lines: - <span class="coverLegendCov">hit</span> - <span class="coverLegendNoCov">not hit</span> -END_OF_HTML - if ($br_coverage) { - $text .= <<END_OF_HTML; - | Branches: - <span class="coverLegendCov">+</span> taken - <span class="coverLegendNoCov">-</span> not taken - <span class="coverLegendNoCov">#</span> not executed -END_OF_HTML - } - push(@row_left, [[undef, "headerItem", "Legend:"], - [undef, "headerValueLeg", $text]]); - } elsif ($legend && ($type != $HDR_TESTDESC)) { - my $text = <<END_OF_HTML; - Rating: - <span class="coverLegendCovLo" title="Coverage rates below $med_limit % are classified as low">low: < $med_limit %</span> - <span class="coverLegendCovMed" title="Coverage rates between $med_limit % and $hi_limit % are classified as medium">medium: >= $med_limit %</span> - <span class="coverLegendCovHi" title="Coverage rates of $hi_limit % and more are classified as high">high: >= $hi_limit %</span> -END_OF_HTML - push(@row_left, [[undef, "headerItem", "Legend:"], - [undef, "headerValueLeg", $text]]); - } - if ($type == $HDR_TESTDESC) { - push(@row_right, [[ "55%" ]]); - } else { - push(@row_right, [["15%", undef, undef ], - ["10%", "headerCovTableHead", "Hit" ], - ["10%", "headerCovTableHead", "Total" ], - ["15%", "headerCovTableHead", "Coverage"]]); - } - # Line coverage - $style = $rate_name[classify_rate($lines_found, $lines_hit, - $med_limit, $hi_limit)]; - $rate = rate($lines_hit, $lines_found, " %"); - push(@row_right, [[undef, "headerItem", "Lines:"], - [undef, "headerCovTableEntry", $lines_hit], - [undef, "headerCovTableEntry", $lines_found], - [undef, "headerCovTableEntry$style", $rate]]) - if ($type != $HDR_TESTDESC); - # Function coverage - if ($func_coverage) { - $style = $rate_name[classify_rate($fn_found, $fn_hit, - $fn_med_limit, $fn_hi_limit)]; - $rate = rate($fn_hit, $fn_found, " %"); - push(@row_right, [[undef, "headerItem", "Functions:"], - [undef, "headerCovTableEntry", $fn_hit], - [undef, "headerCovTableEntry", $fn_found], - [undef, "headerCovTableEntry$style", $rate]]) - if ($type != $HDR_TESTDESC); - } - # Branch coverage - if ($br_coverage) { - $style = $rate_name[classify_rate($br_found, $br_hit, - $br_med_limit, $br_hi_limit)]; - $rate = rate($br_hit, $br_found, " %"); - push(@row_right, [[undef, "headerItem", "Branches:"], - [undef, "headerCovTableEntry", $br_hit], - [undef, "headerCovTableEntry", $br_found], - [undef, "headerCovTableEntry$style", $rate]]) - if ($type != $HDR_TESTDESC); - } - - # Print rows - $num_rows = max(scalar(@row_left), scalar(@row_right)); - for ($i = 0; $i < $num_rows; $i++) { - my $left = $row_left[$i]; - my $right = $row_right[$i]; - - if (!defined($left)) { - $left = [[undef, undef, undef], [undef, undef, undef]]; - } - if (!defined($right)) { - $right = []; - } - write_header_line(*HTML_HANDLE, @{$left}, - [ $i == 0 ? "5%" : undef, undef, undef], - @{$right}); - } - - # Fourth line - write_header_epilog(*HTML_HANDLE, $base_dir); -} - -sub get_sorted_by_rate($$) -{ - my ($hash, $type) = @_; - - if ($type == $SORT_LINE) { - # Sort by line coverage - return sort({$hash->{$a}[7] <=> $hash->{$b}[7]} keys(%{$hash})); - } elsif ($type == $SORT_FUNC) { - # Sort by function coverage; - return sort({$hash->{$a}[8] <=> $hash->{$b}[8]} keys(%{$hash})); - } elsif ($type == $SORT_BRANCH) { - # Sort by br coverage; - return sort({$hash->{$a}[9] <=> $hash->{$b}[9]} keys(%{$hash})); - } -} - -sub get_sorted_by_missed($$) -{ - my ($hash, $type) = @_; - - if ($type == $SORT_LINE) { - # Sort by number of instrumented lines without coverage - return sort( - { - ($hash->{$b}[0] - $hash->{$b}[1]) <=> - ($hash->{$a}[0] - $hash->{$a}[1]) - } keys(%{$hash})); - } elsif ($type == $SORT_FUNC) { - # Sort by number of instrumented functions without coverage - return sort( - { - ($hash->{$b}[2] - $hash->{$b}[3]) <=> - ($hash->{$a}[2] - $hash->{$a}[3]) - } keys(%{$hash})); - } elsif ($type == $SORT_BRANCH) { - # Sort by number of instrumented branches without coverage - return sort( - { - ($hash->{$b}[4] - $hash->{$b}[5]) <=> - ($hash->{$a}[4] - $hash->{$a}[5]) - } keys(%{$hash})); - } -} - -# -# get_sorted_keys(hash_ref, sort_type) -# -# hash_ref: filename -> stats -# stats: [ lines_found, lines_hit, fn_found, fn_hit, br_found, br_hit, -# link_name, line_rate, fn_rate, br_rate ] -# - -sub get_sorted_keys($$) -{ - my ($hash, $type) = @_; - - if ($type == $SORT_FILE) { - # Sort by name - return sort(keys(%{$hash})); - } elsif ($opt_missed) { - return get_sorted_by_missed($hash, $type); - } else { - return get_sorted_by_rate($hash, $type); - } -} - -sub get_sort_code($$$) -{ - my ($link, $alt, $base) = @_; - my $png; - my $link_start; - my $link_end; - - if (!defined($link)) { - $png = "glass.png"; - $link_start = ""; - $link_end = ""; - } else { - $png = "updown.png"; - $link_start = '<a href="'.$link.'">'; - $link_end = "</a>"; - } - - return ' <span class="tableHeadSort">'.$link_start. - '<img src="'.$base.$png.'" width=10 height=14 '. - 'alt="'.$alt.'" title="'.$alt.'" border=0>'.$link_end.'</span>'; -} - -sub get_file_code($$$$) -{ - my ($type, $text, $sort_button, $base) = @_; - my $result = $text; - my $link; - - if ($sort_button) { - if ($type == $HEAD_NO_DETAIL) { - $link = "index.$html_ext"; - } else { - $link = "index-detail.$html_ext"; - } - } - $result .= get_sort_code($link, "Sort by name", $base); - - return $result; -} - -sub get_line_code($$$$$) -{ - my ($type, $sort_type, $text, $sort_button, $base) = @_; - my $result = $text; - my $sort_link; - - if ($type == $HEAD_NO_DETAIL) { - # Just text - if ($sort_button) { - $sort_link = "index-sort-l.$html_ext"; - } - } elsif ($type == $HEAD_DETAIL_HIDDEN) { - # Text + link to detail view - $result .= ' ( <a class="detail" href="index-detail'. - $fileview_sortname[$sort_type].'.'.$html_ext. - '">show details</a> )'; - if ($sort_button) { - $sort_link = "index-sort-l.$html_ext"; - } - } else { - # Text + link to standard view - $result .= ' ( <a class="detail" href="index'. - $fileview_sortname[$sort_type].'.'.$html_ext. - '">hide details</a> )'; - if ($sort_button) { - $sort_link = "index-detail-sort-l.$html_ext"; - } - } - # Add sort button - $result .= get_sort_code($sort_link, "Sort by line coverage", $base); - - return $result; -} - -sub get_func_code($$$$) -{ - my ($type, $text, $sort_button, $base) = @_; - my $result = $text; - my $link; - - if ($sort_button) { - if ($type == $HEAD_NO_DETAIL) { - $link = "index-sort-f.$html_ext"; - } else { - $link = "index-detail-sort-f.$html_ext"; - } - } - $result .= get_sort_code($link, "Sort by function coverage", $base); - return $result; -} - -sub get_br_code($$$$) -{ - my ($type, $text, $sort_button, $base) = @_; - my $result = $text; - my $link; - - if ($sort_button) { - if ($type == $HEAD_NO_DETAIL) { - $link = "index-sort-b.$html_ext"; - } else { - $link = "index-detail-sort-b.$html_ext"; - } - } - $result .= get_sort_code($link, "Sort by branch coverage", $base); - return $result; -} - -# -# write_file_table(filehandle, base_dir, overview, testhash, testfnchash, -# testbrhash, fileview, sort_type) -# -# Write a complete file table. OVERVIEW is a reference to a hash containing -# the following mapping: -# -# filename -> "lines_found,lines_hit,funcs_found,funcs_hit,page_link, -# func_link" -# -# TESTHASH is a reference to the following hash: -# -# filename -> \%testdata -# %testdata: name of test affecting this file -> \%testcount -# %testcount: line number -> execution count for a single test -# -# Heading of first column is "Filename" if FILEVIEW is true, "Directory name" -# otherwise. -# - -sub write_file_table(*$$$$$$$) -{ - local *HTML_HANDLE = $_[0]; - my $base_dir = $_[1]; - my $overview = $_[2]; - my $testhash = $_[3]; - my $testfnchash = $_[4]; - my $testbrhash = $_[5]; - my $fileview = $_[6]; - my $sort_type = $_[7]; - my $filename; - my $bar_graph; - my $hit; - my $found; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - my $page_link; - my $testname; - my $testdata; - my $testfncdata; - my $testbrdata; - my %affecting_tests; - my $line_code = ""; - my $func_code; - my $br_code; - my $file_code; - my @head_columns; - - # Determine HTML code for column headings - if (($base_dir ne "") && $show_details) - { - my $detailed = keys(%{$testhash}); - - $file_code = get_file_code($detailed ? $HEAD_DETAIL_HIDDEN : - $HEAD_NO_DETAIL, - $fileview ? "Filename" : "Directory", - $sort && $sort_type != $SORT_FILE, - $base_dir); - $line_code = get_line_code($detailed ? $HEAD_DETAIL_SHOWN : - $HEAD_DETAIL_HIDDEN, - $sort_type, - "Line Coverage", - $sort && $sort_type != $SORT_LINE, - $base_dir); - $func_code = get_func_code($detailed ? $HEAD_DETAIL_HIDDEN : - $HEAD_NO_DETAIL, - "Functions", - $sort && $sort_type != $SORT_FUNC, - $base_dir); - $br_code = get_br_code($detailed ? $HEAD_DETAIL_HIDDEN : - $HEAD_NO_DETAIL, - "Branches", - $sort && $sort_type != $SORT_BRANCH, - $base_dir); - } else { - $file_code = get_file_code($HEAD_NO_DETAIL, - $fileview ? "Filename" : "Directory", - $sort && $sort_type != $SORT_FILE, - $base_dir); - $line_code = get_line_code($HEAD_NO_DETAIL, $sort_type, "Line Coverage", - $sort && $sort_type != $SORT_LINE, - $base_dir); - $func_code = get_func_code($HEAD_NO_DETAIL, "Functions", - $sort && $sort_type != $SORT_FUNC, - $base_dir); - $br_code = get_br_code($HEAD_NO_DETAIL, "Branches", - $sort && $sort_type != $SORT_BRANCH, - $base_dir); - } - push(@head_columns, [ $line_code, 3 ]); - push(@head_columns, [ $func_code, 2]) if ($func_coverage); - push(@head_columns, [ $br_code, 2]) if ($br_coverage); - - write_file_table_prolog(*HTML_HANDLE, $file_code, @head_columns); - - foreach $filename (get_sorted_keys($overview, $sort_type)) - { - my @columns; - ($found, $hit, $fn_found, $fn_hit, $br_found, $br_hit, - $page_link) = @{$overview->{$filename}}; - - # Line coverage - push(@columns, [$found, $hit, $med_limit, $hi_limit, 1]); - # Function coverage - if ($func_coverage) { - push(@columns, [$fn_found, $fn_hit, $fn_med_limit, - $fn_hi_limit, 0]); - } - # Branch coverage - if ($br_coverage) { - push(@columns, [$br_found, $br_hit, $br_med_limit, - $br_hi_limit, 0]); - } - write_file_table_entry(*HTML_HANDLE, $base_dir, $filename, - $page_link, @columns); - - $testdata = $testhash->{$filename}; - $testfncdata = $testfnchash->{$filename}; - $testbrdata = $testbrhash->{$filename}; - - # Check whether we should write test specific coverage - # as well - if (!($show_details && $testdata)) { next; } - - # Filter out those tests that actually affect this file - %affecting_tests = %{ get_affecting_tests($testdata, - $testfncdata, $testbrdata) }; - - # Does any of the tests affect this file at all? - if (!%affecting_tests) { next; } - - foreach $testname (keys(%affecting_tests)) - { - my @results; - ($found, $hit, $fn_found, $fn_hit, $br_found, $br_hit) = - split(",", $affecting_tests{$testname}); - - # Insert link to description of available - if ($test_description{$testname}) - { - $testname = "<a href=\"$base_dir". - "descriptions.$html_ext#$testname\">". - "$testname</a>"; - } - - push(@results, [$found, $hit]); - push(@results, [$fn_found, $fn_hit]) if ($func_coverage); - push(@results, [$br_found, $br_hit]) if ($br_coverage); - write_file_table_detail_entry(*HTML_HANDLE, $testname, - @results); - } - } - - write_file_table_epilog(*HTML_HANDLE); -} - - -# -# get_found_and_hit(hash) -# -# Return the count for entries (found) and entries with an execution count -# greater than zero (hit) in a hash (linenumber -> execution count) as -# a list (found, hit) -# - -sub get_found_and_hit($) -{ - my %hash = %{$_[0]}; - my $found = 0; - my $hit = 0; - - # Calculate sum - $found = 0; - $hit = 0; - - foreach (keys(%hash)) - { - $found++; - if ($hash{$_}>0) { $hit++; } - } - - return ($found, $hit); -} - - -# -# get_func_found_and_hit(sumfnccount) -# -# Return (f_found, f_hit) for sumfnccount -# - -sub get_func_found_and_hit($) -{ - my ($sumfnccount) = @_; - my $function; - my $fn_found; - my $fn_hit; - - $fn_found = scalar(keys(%{$sumfnccount})); - $fn_hit = 0; - foreach $function (keys(%{$sumfnccount})) { - if ($sumfnccount->{$function} > 0) { - $fn_hit++; - } - } - return ($fn_found, $fn_hit); -} - - -sub get_br_found_and_hit($) -{ - my ($brcount) = @_; - my $db; - - $db = brcount_to_db($brcount); - - return brcount_db_get_found_and_hit($db); -} - - -# -# get_affecting_tests(testdata, testfncdata, testbrdata) -# -# HASHREF contains a mapping filename -> (linenumber -> exec count). Return -# a hash containing mapping filename -> "lines found, lines hit" for each -# filename which has a nonzero hit count. -# - -sub get_affecting_tests($$$) -{ - my ($testdata, $testfncdata, $testbrdata) = @_; - my $testname; - my $testcount; - my $testfnccount; - my $testbrcount; - my %result; - my $found; - my $hit; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - - foreach $testname (keys(%{$testdata})) - { - # Get (line number -> count) hash for this test case - $testcount = $testdata->{$testname}; - $testfnccount = $testfncdata->{$testname}; - $testbrcount = $testbrdata->{$testname}; - - # Calculate sum - ($found, $hit) = get_found_and_hit($testcount); - ($fn_found, $fn_hit) = get_func_found_and_hit($testfnccount); - ($br_found, $br_hit) = get_br_found_and_hit($testbrcount); - - if ($hit>0) - { - $result{$testname} = "$found,$hit,$fn_found,$fn_hit,". - "$br_found,$br_hit"; - } - } - - return(\%result); -} - - -sub get_hash_reverse($) -{ - my ($hash) = @_; - my %result; - - foreach (keys(%{$hash})) { - $result{$hash->{$_}} = $_; - } - - return \%result; -} - -# -# write_source(filehandle, source_filename, count_data, checksum_data, -# converted_data, func_data, sumbrcount) -# -# Write an HTML view of a source code file. Returns a list containing -# data as needed by gen_png(). -# -# Die on error. -# - -sub write_source($$$$$$$) -{ - local *HTML_HANDLE = $_[0]; - local *SOURCE_HANDLE; - my $source_filename = $_[1]; - my %count_data; - my $line_number; - my @result; - my $checkdata = $_[3]; - my $converted = $_[4]; - my $funcdata = $_[5]; - my $sumbrcount = $_[6]; - my $datafunc = get_hash_reverse($funcdata); - my @file; - - if ($_[2]) - { - %count_data = %{$_[2]}; - } - - if (!open(SOURCE_HANDLE, "<", $source_filename)) { - my @lines; - my $last_line = 0; - - if (!$ignore[$ERROR_SOURCE]) { - die("ERROR: cannot read $source_filename\n"); - } - - # Continue without source file - warn("WARNING: cannot read $source_filename!\n"); - - @lines = sort( { $a <=> $b } keys(%count_data)); - if (@lines) { - $last_line = $lines[scalar(@lines) - 1]; - } - return ( ":" ) if ($last_line < 1); - - # Simulate gcov behavior - for ($line_number = 1; $line_number <= $last_line; - $line_number++) { - push(@file, "/* EOF */"); - } - } else { - @file = <SOURCE_HANDLE>; - } - - write_source_prolog(*HTML_HANDLE); - $line_number = 0; - foreach (@file) { - $line_number++; - chomp($_); - - # Also remove CR from line-end - s/\015$//; - - # Source code matches coverage data? - if (defined($checkdata->{$line_number}) && - ($checkdata->{$line_number} ne md5_base64($_))) - { - die("ERROR: checksum mismatch at $source_filename:". - "$line_number\n"); - } - - push (@result, - write_source_line(HTML_HANDLE, $line_number, - $_, $count_data{$line_number}, - $converted->{$line_number}, - $sumbrcount->{$line_number})); - } - - close(SOURCE_HANDLE); - write_source_epilog(*HTML_HANDLE); - return(@result); -} - - -sub funcview_get_func_code($$$) -{ - my ($name, $base, $type) = @_; - my $result; - my $link; - - if ($sort && $type == 1) { - $link = "$name.func.$html_ext"; - } - $result = "Function Name"; - $result .= get_sort_code($link, "Sort by function name", $base); - - return $result; -} - -sub funcview_get_count_code($$$) -{ - my ($name, $base, $type) = @_; - my $result; - my $link; - - if ($sort && $type == 0) { - $link = "$name.func-sort-c.$html_ext"; - } - $result = "Hit count"; - $result .= get_sort_code($link, "Sort by hit count", $base); - - return $result; -} - -# -# funcview_get_sorted(funcdata, sumfncdata, sort_type) -# -# Depending on the value of sort_type, return a list of functions sorted -# by name (type 0) or by the associated call count (type 1). -# - -sub funcview_get_sorted($$$) -{ - my ($funcdata, $sumfncdata, $type) = @_; - - if ($type == 0) { - return sort(keys(%{$funcdata})); - } - return sort({ - $sumfncdata->{$b} == $sumfncdata->{$a} ? - $a cmp $b : $sumfncdata->{$a} <=> $sumfncdata->{$b} - } keys(%{$sumfncdata})); -} - -sub demangle_list($) -{ - my ($list) = @_; - my $tmpfile; - my $handle; - my %demangle; - my $demangle_arg = ""; - my %versions; - - # Write function names to file - ($handle, $tmpfile) = tempfile(); - die("ERROR: could not create temporary file") if (!defined($tmpfile)); - print($handle join("\n", @$list)); - close($handle); - - # Extra flag necessary on OS X so that symbols listed by gcov get demangled - # properly. - if ($^O eq "darwin") { - $demangle_arg = "--no-strip-underscores"; - } - - # Build translation hash from c++filt output - open($handle, "-|", "c++filt $demangle_arg < $tmpfile") or - die("ERROR: could not run c++filt: $!\n"); - foreach my $func (@$list) { - my $translated = <$handle>; - my $version; - - last if (!defined($translated)); - chomp($translated); - - $version = ++$versions{$translated}; - $translated .= ".$version" if ($version > 1); - $demangle{$func} = $translated; - } - close($handle); - - if (scalar(keys(%demangle)) != scalar(@$list)) { - die("ERROR: c++filt output not as expected (". - scalar(keys(%demangle))." vs ".scalar(@$list).") lines\n"); - } - - unlink($tmpfile) or - warn("WARNING: could not remove temporary file $tmpfile: $!\n"); - - return \%demangle; -} - -# -# write_function_table(filehandle, source_file, sumcount, funcdata, -# sumfnccount, testfncdata, sumbrcount, testbrdata, -# base_name, base_dir, sort_type) -# -# Write an HTML table listing all functions in a source file, including -# also function call counts and line coverages inside of each function. -# -# Die on error. -# - -sub write_function_table(*$$$$$$$$$$) -{ - local *HTML_HANDLE = $_[0]; - my $source = $_[1]; - my $sumcount = $_[2]; - my $funcdata = $_[3]; - my $sumfncdata = $_[4]; - my $testfncdata = $_[5]; - my $sumbrcount = $_[6]; - my $testbrdata = $_[7]; - my $name = $_[8]; - my $base = $_[9]; - my $type = $_[10]; - my $func; - my $func_code; - my $count_code; - my $demangle; - - # Get HTML code for headings - $func_code = funcview_get_func_code($name, $base, $type); - $count_code = funcview_get_count_code($name, $base, $type); - write_html(*HTML_HANDLE, <<END_OF_HTML) - <center> - <table width="60%" cellpadding=1 cellspacing=1 border=0> - <tr><td><br></td></tr> - <tr> - <td width="80%" class="tableHead">$func_code</td> - <td width="20%" class="tableHead">$count_code</td> - </tr> -END_OF_HTML - ; - - # Get demangle translation hash - if ($demangle_cpp) { - $demangle = demangle_list([ sort(keys(%{$funcdata})) ]); - } - - # Get a sorted table - foreach $func (funcview_get_sorted($funcdata, $sumfncdata, $type)) { - if (!defined($funcdata->{$func})) - { - next; - } - - my $startline = $funcdata->{$func} - $func_offset; - my $name = $func; - my $count = $sumfncdata->{$name}; - my $countstyle; - - # Replace function name with demangled version if available - $name = $demangle->{$name} if (exists($demangle->{$name})); - - # Escape special characters - $name = escape_html($name); - if ($startline < 1) { - $startline = 1; - } - if ($count == 0) { - $countstyle = "coverFnLo"; - } else { - $countstyle = "coverFnHi"; - } - - write_html(*HTML_HANDLE, <<END_OF_HTML) - <tr> - <td class="coverFn"><a href="$source#$startline">$name</a></td> - <td class="$countstyle">$count</td> - </tr> -END_OF_HTML - ; - } - write_html(*HTML_HANDLE, <<END_OF_HTML) - </table> - <br> - </center> -END_OF_HTML - ; -} - - -# -# info(printf_parameter) -# -# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag -# is not set. -# - -sub info(@) -{ - if (!$quiet) - { - # Print info string - printf(@_); - } -} - - -# -# subtract_counts(data_ref, base_ref) -# - -sub subtract_counts($$) -{ - my %data = %{$_[0]}; - my %base = %{$_[1]}; - my $line; - my $data_count; - my $base_count; - my $hit = 0; - my $found = 0; - - foreach $line (keys(%data)) - { - $found++; - $data_count = $data{$line}; - $base_count = $base{$line}; - - if (defined($base_count)) - { - $data_count -= $base_count; - - # Make sure we don't get negative numbers - if ($data_count<0) { $data_count = 0; } - } - - $data{$line} = $data_count; - if ($data_count > 0) { $hit++; } - } - - return (\%data, $found, $hit); -} - - -# -# subtract_fnccounts(data, base) -# -# Subtract function call counts found in base from those in data. -# Return (data, f_found, f_hit). -# - -sub subtract_fnccounts($$) -{ - my %data; - my %base; - my $func; - my $data_count; - my $base_count; - my $fn_hit = 0; - my $fn_found = 0; - - %data = %{$_[0]} if (defined($_[0])); - %base = %{$_[1]} if (defined($_[1])); - foreach $func (keys(%data)) { - $fn_found++; - $data_count = $data{$func}; - $base_count = $base{$func}; - - if (defined($base_count)) { - $data_count -= $base_count; - - # Make sure we don't get negative numbers - if ($data_count < 0) { - $data_count = 0; - } - } - - $data{$func} = $data_count; - if ($data_count > 0) { - $fn_hit++; - } - } - - return (\%data, $fn_found, $fn_hit); -} - - -# -# apply_baseline(data_ref, baseline_ref) -# -# Subtract the execution counts found in the baseline hash referenced by -# BASELINE_REF from actual data in DATA_REF. -# - -sub apply_baseline($$) -{ - my %data_hash = %{$_[0]}; - my %base_hash = %{$_[1]}; - my $filename; - my $testname; - my $data; - my $data_testdata; - my $data_funcdata; - my $data_checkdata; - my $data_testfncdata; - my $data_testbrdata; - my $data_count; - my $data_testfnccount; - my $data_testbrcount; - my $base; - my $base_checkdata; - my $base_sumfnccount; - my $base_sumbrcount; - my $base_count; - my $sumcount; - my $sumfnccount; - my $sumbrcount; - my $found; - my $hit; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - - foreach $filename (keys(%data_hash)) - { - # Get data set for data and baseline - $data = $data_hash{$filename}; - $base = $base_hash{$filename}; - - # Skip data entries for which no base entry exists - if (!defined($base)) - { - next; - } - - # Get set entries for data and baseline - ($data_testdata, undef, $data_funcdata, $data_checkdata, - $data_testfncdata, undef, $data_testbrdata) = - get_info_entry($data); - (undef, $base_count, undef, $base_checkdata, undef, - $base_sumfnccount, undef, $base_sumbrcount) = - get_info_entry($base); - - # Check for compatible checksums - merge_checksums($data_checkdata, $base_checkdata, $filename); - - # sumcount has to be calculated anew - $sumcount = {}; - $sumfnccount = {}; - $sumbrcount = {}; - - # For each test case, subtract test specific counts - foreach $testname (keys(%{$data_testdata})) - { - # Get counts of both data and baseline - $data_count = $data_testdata->{$testname}; - $data_testfnccount = $data_testfncdata->{$testname}; - $data_testbrcount = $data_testbrdata->{$testname}; - - ($data_count, undef, $hit) = - subtract_counts($data_count, $base_count); - ($data_testfnccount) = - subtract_fnccounts($data_testfnccount, - $base_sumfnccount); - ($data_testbrcount) = - combine_brcount($data_testbrcount, - $base_sumbrcount, $BR_SUB); - - - # Check whether this test case did hit any line at all - if ($hit > 0) - { - # Write back resulting hash - $data_testdata->{$testname} = $data_count; - $data_testfncdata->{$testname} = - $data_testfnccount; - $data_testbrdata->{$testname} = - $data_testbrcount; - } - else - { - # Delete test case which did not impact this - # file - delete($data_testdata->{$testname}); - delete($data_testfncdata->{$testname}); - delete($data_testbrdata->{$testname}); - } - - # Add counts to sum of counts - ($sumcount, $found, $hit) = - add_counts($sumcount, $data_count); - ($sumfnccount, $fn_found, $fn_hit) = - add_fnccount($sumfnccount, $data_testfnccount); - ($sumbrcount, $br_found, $br_hit) = - combine_brcount($sumbrcount, $data_testbrcount, - $BR_ADD); - } - - # Write back resulting entry - set_info_entry($data, $data_testdata, $sumcount, $data_funcdata, - $data_checkdata, $data_testfncdata, $sumfnccount, - $data_testbrdata, $sumbrcount, $found, $hit, - $fn_found, $fn_hit, $br_found, $br_hit); - - $data_hash{$filename} = $data; - } - - return (\%data_hash); -} - - -# -# remove_unused_descriptions() -# -# Removes all test descriptions from the global hash %test_description which -# are not present in %info_data. -# - -sub remove_unused_descriptions() -{ - my $filename; # The current filename - my %test_list; # Hash containing found test names - my $test_data; # Reference to hash test_name -> count_data - my $before; # Initial number of descriptions - my $after; # Remaining number of descriptions - - $before = scalar(keys(%test_description)); - - foreach $filename (keys(%info_data)) - { - ($test_data) = get_info_entry($info_data{$filename}); - foreach (keys(%{$test_data})) - { - $test_list{$_} = ""; - } - } - - # Remove descriptions for tests which are not in our list - foreach (keys(%test_description)) - { - if (!defined($test_list{$_})) - { - delete($test_description{$_}); - } - } - - $after = scalar(keys(%test_description)); - if ($after < $before) - { - info("Removed ".($before - $after). - " unused descriptions, $after remaining.\n"); - } -} - - -# -# apply_prefix(filename, PREFIXES) -# -# If FILENAME begins with PREFIX from PREFIXES, remove PREFIX from FILENAME -# and return resulting string, otherwise return FILENAME. -# - -sub apply_prefix($@) -{ - my $filename = shift; - my @dir_prefix = @_; - - if (@dir_prefix) - { - foreach my $prefix (@dir_prefix) - { - if ($prefix ne "" && $filename =~ /^\Q$prefix\E\/(.*)$/) - { - return substr($filename, length($prefix) + 1); - } - } - } - - return $filename; -} - - -# -# system_no_output(mode, parameters) -# -# Call an external program using PARAMETERS while suppressing depending on -# the value of MODE: -# -# MODE & 1: suppress STDOUT -# MODE & 2: suppress STDERR -# -# Return 0 on success, non-zero otherwise. -# - -sub system_no_output($@) -{ - my $mode = shift; - my $result; - local *OLD_STDERR; - local *OLD_STDOUT; - - # Save old stdout and stderr handles - ($mode & 1) && open(OLD_STDOUT, ">>&", "STDOUT"); - ($mode & 2) && open(OLD_STDERR, ">>&", "STDERR"); - - # Redirect to /dev/null - ($mode & 1) && open(STDOUT, ">", "/dev/null"); - ($mode & 2) && open(STDERR, ">", "/dev/null"); - - system(@_); - $result = $?; - - # Close redirected handles - ($mode & 1) && close(STDOUT); - ($mode & 2) && close(STDERR); - - # Restore old handles - ($mode & 1) && open(STDOUT, ">>&", "OLD_STDOUT"); - ($mode & 2) && open(STDERR, ">>&", "OLD_STDERR"); - - return $result; -} - - -# -# read_config(filename) -# -# Read configuration file FILENAME and return a reference to a hash containing -# all valid key=value pairs found. -# - -sub read_config($) -{ - my $filename = $_[0]; - my %result; - my $key; - my $value; - local *HANDLE; - - if (!open(HANDLE, "<", $filename)) - { - warn("WARNING: cannot read configuration file $filename\n"); - return undef; - } - while (<HANDLE>) - { - chomp; - # Skip comments - s/#.*//; - # Remove leading blanks - s/^\s+//; - # Remove trailing blanks - s/\s+$//; - next unless length; - ($key, $value) = split(/\s*=\s*/, $_, 2); - if (defined($key) && defined($value)) - { - $result{$key} = $value; - } - else - { - warn("WARNING: malformed statement in line $. ". - "of configuration file $filename\n"); - } - } - close(HANDLE); - return \%result; -} - - -# -# apply_config(REF) -# -# REF is a reference to a hash containing the following mapping: -# -# key_string => var_ref -# -# where KEY_STRING is a keyword and VAR_REF is a reference to an associated -# variable. If the global configuration hashes CONFIG or OPT_RC contain a value -# for keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. -# - -sub apply_config($) -{ - my $ref = $_[0]; - - foreach (keys(%{$ref})) - { - if (defined($opt_rc{$_})) { - ${$ref->{$_}} = $opt_rc{$_}; - } elsif (defined($config->{$_})) { - ${$ref->{$_}} = $config->{$_}; - } - } -} - - -# -# get_html_prolog(FILENAME) -# -# If FILENAME is defined, return contents of file. Otherwise return default -# HTML prolog. Die on error. -# - -sub get_html_prolog($) -{ - my $filename = $_[0]; - my $result = ""; - - if (defined($filename)) - { - local *HANDLE; - - open(HANDLE, "<", $filename) - or die("ERROR: cannot open html prolog $filename!\n"); - while (<HANDLE>) - { - $result .= $_; - } - close(HANDLE); - } - else - { - $result = <<END_OF_HTML -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> - -<html lang="en"> - -<head> - <meta http-equiv="Content-Type" content="text/html; charset=$charset"> - <title>\@pagetitle\@</title> - <link rel="stylesheet" type="text/css" href="\@basedir\@gcov.css"> -</head> - -<body> - -END_OF_HTML - ; - } - - return $result; -} - - -# -# get_html_epilog(FILENAME) -# -# If FILENAME is defined, return contents of file. Otherwise return default -# HTML epilog. Die on error. -# -sub get_html_epilog($) -{ - my $filename = $_[0]; - my $result = ""; - - if (defined($filename)) - { - local *HANDLE; - - open(HANDLE, "<", $filename) - or die("ERROR: cannot open html epilog $filename!\n"); - while (<HANDLE>) - { - $result .= $_; - } - close(HANDLE); - } - else - { - $result = <<END_OF_HTML - -</body> -</html> -END_OF_HTML - ; - } - - return $result; - -} - -sub warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} - -# -# parse_ignore_errors(@ignore_errors) -# -# Parse user input about which errors to ignore. -# - -sub parse_ignore_errors(@) -{ - my (@ignore_errors) = @_; - my @items; - my $item; - - return if (!@ignore_errors); - - foreach $item (@ignore_errors) { - $item =~ s/\s//g; - if ($item =~ /,/) { - # Split and add comma-separated parameters - push(@items, split(/,/, $item)); - } else { - # Add single parameter - push(@items, $item); - } - } - foreach $item (@items) { - my $item_id = $ERROR_ID{lc($item)}; - - if (!defined($item_id)) { - die("ERROR: unknown argument for --ignore-errors: ". - "$item\n"); - } - $ignore[$item_id] = 1; - } -} - -# -# parse_dir_prefix(@dir_prefix) -# -# Parse user input about the prefix list -# - -sub parse_dir_prefix(@) -{ - my (@opt_dir_prefix) = @_; - my $item; - - return if (!@opt_dir_prefix); - - foreach $item (@opt_dir_prefix) { - if ($item =~ /,/) { - # Split and add comma-separated parameters - push(@dir_prefix, split(/,/, $item)); - } else { - # Add single parameter - push(@dir_prefix, $item); - } - } -} - -# -# rate(hit, found[, suffix, precision, width]) -# -# Return the coverage rate [0..100] for HIT and FOUND values. 0 is only -# returned when HIT is 0. 100 is only returned when HIT equals FOUND. -# PRECISION specifies the precision of the result. SUFFIX defines a -# string that is appended to the result if FOUND is non-zero. Spaces -# are added to the start of the resulting string until it is at least WIDTH -# characters wide. -# - -sub rate($$;$$$) -{ - my ($hit, $found, $suffix, $precision, $width) = @_; - my $rate; - - # Assign defaults if necessary - $precision = $default_precision if (!defined($precision)); - $suffix = "" if (!defined($suffix)); - $width = 0 if (!defined($width)); - - return sprintf("%*s", $width, "-") if (!defined($found) || $found == 0); - $rate = sprintf("%.*f", $precision, $hit * 100 / $found); - - # Adjust rates if necessary - if ($rate == 0 && $hit > 0) { - $rate = sprintf("%.*f", $precision, 1 / 10 ** $precision); - } elsif ($rate == 100 && $hit != $found) { - $rate = sprintf("%.*f", $precision, 100 - 1 / 10 ** $precision); - } - - return sprintf("%*s", $width, $rate.$suffix); -} diff --git a/ThirdParty/lcov/bin/geninfo b/ThirdParty/lcov/bin/geninfo deleted file mode 100755 index f41eaec1c..000000000 --- a/ThirdParty/lcov/bin/geninfo +++ /dev/null @@ -1,4014 +0,0 @@ -#!/usr/bin/env perl -# -# Copyright (c) International Business Machines Corp., 2002,2012 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# geninfo -# -# This script generates .info files from data files as created by code -# instrumented with gcc's built-in profiling mechanism. Call it with -# --help and refer to the geninfo man page to get information on usage -# and available options. -# -# -# Authors: -# 2002-08-23 created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> -# IBM Lab Boeblingen -# based on code by Manoj Iyer <manjo@mail.utexas.edu> and -# Megan Bock <mbock@us.ibm.com> -# IBM Austin -# 2002-09-05 / Peter Oberparleiter: implemented option that allows file list -# 2003-04-16 / Peter Oberparleiter: modified read_gcov so that it can also -# parse the new gcov format which is to be introduced in gcc 3.3 -# 2003-04-30 / Peter Oberparleiter: made info write to STDERR, not STDOUT -# 2003-07-03 / Peter Oberparleiter: added line checksum support, added -# --no-checksum -# 2003-09-18 / Nigel Hinds: capture branch coverage data from GCOV -# 2003-12-11 / Laurent Deniel: added --follow option -# workaround gcov (<= 3.2.x) bug with empty .da files -# 2004-01-03 / Laurent Deniel: Ignore empty .bb files -# 2004-02-16 / Andreas Krebbel: Added support for .gcno/.gcda files and -# gcov versioning -# 2004-08-09 / Peter Oberparleiter: added configuration file support -# 2008-07-14 / Tom Zoerner: added --function-coverage command line option -# 2008-08-13 / Peter Oberparleiter: modified function coverage -# implementation (now enabled per default) -# - -use strict; -use warnings; -use File::Basename; -use File::Spec::Functions qw /abs2rel catdir file_name_is_absolute splitdir - splitpath catpath/; -use Getopt::Long; -use Digest::MD5 qw(md5_base64); -use Cwd qw/abs_path/; -if( $^O eq "msys" ) -{ - require File::Spec::Win32; -} - -# Constants -our $tool_dir = abs_path(dirname($0)); -our $lcov_version = "LCOV version 1.14"; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $gcov_tool = "gcov"; -our $tool_name = basename($0); - -our $GCOV_VERSION_8_0_0 = 0x80000; -our $GCOV_VERSION_4_7_0 = 0x40700; -our $GCOV_VERSION_3_4_0 = 0x30400; -our $GCOV_VERSION_3_3_0 = 0x30300; -our $GCNO_FUNCTION_TAG = 0x01000000; -our $GCNO_LINES_TAG = 0x01450000; -our $GCNO_FILE_MAGIC = 0x67636e6f; -our $BBG_FILE_MAGIC = 0x67626267; - -# Error classes which users may specify to ignore during processing -our $ERROR_GCOV = 0; -our $ERROR_SOURCE = 1; -our $ERROR_GRAPH = 2; -our %ERROR_ID = ( - "gcov" => $ERROR_GCOV, - "source" => $ERROR_SOURCE, - "graph" => $ERROR_GRAPH, -); - -our $EXCL_START = "LCOV_EXCL_START"; -our $EXCL_STOP = "LCOV_EXCL_STOP"; - -# Marker to exclude branch coverage but keep function and line coveage -our $EXCL_BR_START = "LCOV_EXCL_BR_START"; -our $EXCL_BR_STOP = "LCOV_EXCL_BR_STOP"; - -# Compatibility mode values -our $COMPAT_VALUE_OFF = 0; -our $COMPAT_VALUE_ON = 1; -our $COMPAT_VALUE_AUTO = 2; - -# Compatibility mode value names -our %COMPAT_NAME_TO_VALUE = ( - "off" => $COMPAT_VALUE_OFF, - "on" => $COMPAT_VALUE_ON, - "auto" => $COMPAT_VALUE_AUTO, -); - -# Compatiblity modes -our $COMPAT_MODE_LIBTOOL = 1 << 0; -our $COMPAT_MODE_HAMMER = 1 << 1; -our $COMPAT_MODE_SPLIT_CRC = 1 << 2; - -# Compatibility mode names -our %COMPAT_NAME_TO_MODE = ( - "libtool" => $COMPAT_MODE_LIBTOOL, - "hammer" => $COMPAT_MODE_HAMMER, - "split_crc" => $COMPAT_MODE_SPLIT_CRC, - "android_4_4_0" => $COMPAT_MODE_SPLIT_CRC, -); - -# Map modes to names -our %COMPAT_MODE_TO_NAME = ( - $COMPAT_MODE_LIBTOOL => "libtool", - $COMPAT_MODE_HAMMER => "hammer", - $COMPAT_MODE_SPLIT_CRC => "split_crc", -); - -# Compatibility mode default values -our %COMPAT_MODE_DEFAULTS = ( - $COMPAT_MODE_LIBTOOL => $COMPAT_VALUE_ON, - $COMPAT_MODE_HAMMER => $COMPAT_VALUE_AUTO, - $COMPAT_MODE_SPLIT_CRC => $COMPAT_VALUE_AUTO, -); - -# Compatibility mode auto-detection routines -sub compat_hammer_autodetect(); -our %COMPAT_MODE_AUTO = ( - $COMPAT_MODE_HAMMER => \&compat_hammer_autodetect, - $COMPAT_MODE_SPLIT_CRC => 1, # will be done later -); - -our $BR_LINE = 0; -our $BR_BLOCK = 1; -our $BR_BRANCH = 2; -our $BR_TAKEN = 3; -our $BR_VEC_ENTRIES = 4; -our $BR_VEC_WIDTH = 32; -our $BR_VEC_MAX = vec(pack('b*', 1 x $BR_VEC_WIDTH), 0, $BR_VEC_WIDTH); - -our $UNNAMED_BLOCK = -1; - -# Prototypes -sub print_usage(*); -sub transform_pattern($); -sub gen_info($); -sub process_dafile($$); -sub match_filename($@); -sub solve_ambiguous_match($$$); -sub split_filename($); -sub solve_relative_path($$); -sub read_gcov_header($); -sub read_gcov_file($); -sub info(@); -sub map_llvm_version($); -sub version_to_str($); -sub get_gcov_version(); -sub system_no_output($@); -sub read_config($); -sub apply_config($); -sub get_exclusion_data($); -sub apply_exclusion_data($$); -sub process_graphfile($$); -sub filter_fn_name($); -sub warn_handler($); -sub die_handler($); -sub graph_error($$); -sub graph_expect($); -sub graph_read(*$;$$); -sub graph_skip(*$;$); -sub uniq(@); -sub sort_uniq(@); -sub sort_uniq_lex(@); -sub graph_cleanup($); -sub graph_find_base($); -sub graph_from_bb($$$$); -sub graph_add_order($$$); -sub read_bb_word(*;$); -sub read_bb_value(*;$); -sub read_bb_string(*$); -sub read_bb($); -sub read_bbg_word(*;$); -sub read_bbg_value(*;$); -sub read_bbg_string(*); -sub read_bbg_lines_record(*$$$$$); -sub read_bbg($); -sub read_gcno_word(*;$$); -sub read_gcno_value(*$;$$); -sub read_gcno_string(*$); -sub read_gcno_lines_record(*$$$$$$); -sub determine_gcno_split_crc($$$$); -sub read_gcno_function_record(*$$$$$); -sub read_gcno($); -sub get_gcov_capabilities(); -sub get_overall_line($$$$); -sub print_overall_rate($$$$$$$$$); -sub br_gvec_len($); -sub br_gvec_get($$); -sub debug($); -sub int_handler(); -sub parse_ignore_errors(@); -sub is_external($); -sub compat_name($); -sub parse_compat_modes($); -sub is_compat($); -sub is_compat_auto($); - - -# Global variables -our $gcov_version; -our $gcov_version_string; -our $graph_file_extension; -our $data_file_extension; -our @data_directory; -our $test_name = ""; -our $quiet; -our $help; -our $output_filename; -our $base_directory; -our $version; -our $follow; -our $checksum; -our $no_checksum; -our $opt_compat_libtool; -our $opt_no_compat_libtool; -our $rc_adjust_src_path;# Regexp specifying parts to remove from source path -our $adjust_src_pattern; -our $adjust_src_replace; -our $adjust_testname; -our $config; # Configuration file contents -our @ignore_errors; # List of errors to ignore (parameter) -our @ignore; # List of errors to ignore (array) -our $initial; -our @include_patterns; # List of source file patterns to include -our @exclude_patterns; # List of source file patterns to exclude -our %excluded_files; # Files excluded due to include/exclude options -our $no_recursion = 0; -our $maxdepth; -our $no_markers = 0; -our $opt_derive_func_data = 0; -our $opt_external = 1; -our $opt_no_external; -our $debug = 0; -our $gcov_caps; -our @gcov_options; -our @internal_dirs; -our $opt_config_file; -our $opt_gcov_all_blocks = 1; -our $opt_compat; -our %opt_rc; -our %compat_value; -our $gcno_split_crc; -our $func_coverage = 1; -our $br_coverage = 0; -our $rc_auto_base = 1; -our $excl_line = "LCOV_EXCL_LINE"; -our $excl_br_line = "LCOV_EXCL_BR_LINE"; - -our $cwd = `pwd`; -chomp($cwd); - - -# -# Code entry point -# - -# Register handler routine to be called when interrupted -$SIG{"INT"} = \&int_handler; -$SIG{__WARN__} = \&warn_handler; -$SIG{__DIE__} = \&die_handler; - -# Set LC_ALL so that gcov output will be in a unified format -$ENV{"LC_ALL"} = "C"; - -# Check command line for a configuration file name -Getopt::Long::Configure("pass_through", "no_auto_abbrev"); -GetOptions("config-file=s" => \$opt_config_file, - "rc=s%" => \%opt_rc); -Getopt::Long::Configure("default"); - -{ - # Remove spaces around rc options - my %new_opt_rc; - - while (my ($key, $value) = each(%opt_rc)) { - $key =~ s/^\s+|\s+$//g; - $value =~ s/^\s+|\s+$//g; - - $new_opt_rc{$key} = $value; - } - %opt_rc = %new_opt_rc; -} - -# Read configuration file if available -if (defined($opt_config_file)) { - $config = read_config($opt_config_file); -} elsif (defined($ENV{"HOME"}) && (-r $ENV{"HOME"}."/.lcovrc")) -{ - $config = read_config($ENV{"HOME"}."/.lcovrc"); -} -elsif (-r "/etc/lcovrc") -{ - $config = read_config("/etc/lcovrc"); -} elsif (-r "/usr/local/etc/lcovrc") -{ - $config = read_config("/usr/local/etc/lcovrc"); -} - -if ($config || %opt_rc) -{ - # Copy configuration file and --rc values to variables - apply_config({ - "geninfo_gcov_tool" => \$gcov_tool, - "geninfo_adjust_testname" => \$adjust_testname, - "geninfo_checksum" => \$checksum, - "geninfo_no_checksum" => \$no_checksum, # deprecated - "geninfo_compat_libtool" => \$opt_compat_libtool, - "geninfo_external" => \$opt_external, - "geninfo_gcov_all_blocks" => \$opt_gcov_all_blocks, - "geninfo_compat" => \$opt_compat, - "geninfo_adjust_src_path" => \$rc_adjust_src_path, - "geninfo_auto_base" => \$rc_auto_base, - "lcov_function_coverage" => \$func_coverage, - "lcov_branch_coverage" => \$br_coverage, - "lcov_excl_line" => \$excl_line, - "lcov_excl_br_line" => \$excl_br_line, - }); - - # Merge options - if (defined($no_checksum)) - { - $checksum = ($no_checksum ? 0 : 1); - $no_checksum = undef; - } - - # Check regexp - if (defined($rc_adjust_src_path)) { - my ($pattern, $replace) = split(/\s*=>\s*/, - $rc_adjust_src_path); - local $SIG{__DIE__}; - eval '$adjust_src_pattern = qr>'.$pattern.'>;'; - if (!defined($adjust_src_pattern)) { - my $msg = $@; - - chomp($msg); - $msg =~ s/at \(eval.*$//; - warn("WARNING: invalid pattern in ". - "geninfo_adjust_src_path: $msg\n"); - } elsif (!defined($replace)) { - # If no replacement is specified, simply remove pattern - $adjust_src_replace = ""; - } else { - $adjust_src_replace = $replace; - } - } - for my $regexp (($excl_line, $excl_br_line)) { - eval 'qr/'.$regexp.'/'; - my $error = $@; - chomp($error); - $error =~ s/at \(eval.*$//; - die("ERROR: invalid exclude pattern: $error") if $error; - } -} - -# Parse command line options -if (!GetOptions("test-name|t=s" => \$test_name, - "output-filename|o=s" => \$output_filename, - "checksum" => \$checksum, - "no-checksum" => \$no_checksum, - "base-directory|b=s" => \$base_directory, - "version|v" =>\$version, - "quiet|q" => \$quiet, - "help|h|?" => \$help, - "follow|f" => \$follow, - "compat-libtool" => \$opt_compat_libtool, - "no-compat-libtool" => \$opt_no_compat_libtool, - "gcov-tool=s" => \$gcov_tool, - "ignore-errors=s" => \@ignore_errors, - "initial|i" => \$initial, - "include=s" => \@include_patterns, - "exclude=s" => \@exclude_patterns, - "no-recursion" => \$no_recursion, - "no-markers" => \$no_markers, - "derive-func-data" => \$opt_derive_func_data, - "debug" => \$debug, - "external|e" => \$opt_external, - "no-external" => \$opt_no_external, - "compat=s" => \$opt_compat, - "config-file=s" => \$opt_config_file, - "rc=s%" => \%opt_rc, - )) -{ - print(STDERR "Use $tool_name --help to get usage information\n"); - exit(1); -} -else -{ - # Merge options - if (defined($no_checksum)) - { - $checksum = ($no_checksum ? 0 : 1); - $no_checksum = undef; - } - - if (defined($opt_no_compat_libtool)) - { - $opt_compat_libtool = ($opt_no_compat_libtool ? 0 : 1); - $opt_no_compat_libtool = undef; - } - - if (defined($opt_no_external)) { - $opt_external = 0; - $opt_no_external = undef; - } - - if(@include_patterns) { - # Need perlreg expressions instead of shell pattern - @include_patterns = map({ transform_pattern($_); } @include_patterns); - } - - if(@exclude_patterns) { - # Need perlreg expressions instead of shell pattern - @exclude_patterns = map({ transform_pattern($_); } @exclude_patterns); - } -} - -@data_directory = @ARGV; - -debug("$lcov_version\n"); - -# Check for help option -if ($help) -{ - print_usage(*STDOUT); - exit(0); -} - -# Check for version option -if ($version) -{ - print("$tool_name: $lcov_version\n"); - exit(0); -} - -# Check gcov tool -if (system_no_output(3, $gcov_tool, "--help") == -1) -{ - die("ERROR: need tool $gcov_tool!\n"); -} - -($gcov_version, $gcov_version_string) = get_gcov_version(); - -# Determine gcov options -$gcov_caps = get_gcov_capabilities(); -push(@gcov_options, "-b") if ($gcov_caps->{'branch-probabilities'} && - ($br_coverage || $func_coverage)); -push(@gcov_options, "-c") if ($gcov_caps->{'branch-counts'} && - $br_coverage); -push(@gcov_options, "-a") if ($gcov_caps->{'all-blocks'} && - $opt_gcov_all_blocks && $br_coverage); -if ($gcov_caps->{'hash-filenames'}) -{ - push(@gcov_options, "-x"); -} else { - push(@gcov_options, "-p") if ($gcov_caps->{'preserve-paths'}); -} - -# Determine compatibility modes -parse_compat_modes($opt_compat); - -# Determine which errors the user wants us to ignore -parse_ignore_errors(@ignore_errors); - -# Make sure test names only contain valid characters -if ($test_name =~ s/\W/_/g) -{ - warn("WARNING: invalid characters removed from testname!\n"); -} - -# Adjust test name to include uname output if requested -if ($adjust_testname) -{ - $test_name .= "__".`uname -a`; - $test_name =~ s/\W/_/g; -} - -# Make sure base_directory contains an absolute path specification -if ($base_directory) -{ - $base_directory = solve_relative_path($cwd, $base_directory); -} - -# Check for follow option -if ($follow) -{ - $follow = "-follow" -} -else -{ - $follow = ""; -} - -# Determine checksum mode -if (defined($checksum)) -{ - # Normalize to boolean - $checksum = ($checksum ? 1 : 0); -} -else -{ - # Default is off - $checksum = 0; -} - -# Determine max depth for recursion -if ($no_recursion) -{ - $maxdepth = "-maxdepth 1"; -} -else -{ - $maxdepth = ""; -} - -# Check for directory name -if (!@data_directory) -{ - die("No directory specified\n". - "Use $tool_name --help to get usage information\n"); -} -else -{ - foreach (@data_directory) - { - stat($_); - if (!-r _) - { - die("ERROR: cannot read $_!\n"); - } - } -} - -if ($gcov_version < $GCOV_VERSION_3_4_0) -{ - if (is_compat($COMPAT_MODE_HAMMER)) - { - $data_file_extension = ".da"; - $graph_file_extension = ".bbg"; - } - else - { - $data_file_extension = ".da"; - $graph_file_extension = ".bb"; - } -} -else -{ - $data_file_extension = ".gcda"; - $graph_file_extension = ".gcno"; -} - -# Check output filename -if (defined($output_filename) && ($output_filename ne "-")) -{ - # Initially create output filename, data is appended - # for each data file processed - local *DUMMY_HANDLE; - open(DUMMY_HANDLE, ">", $output_filename) - or die("ERROR: cannot create $output_filename!\n"); - close(DUMMY_HANDLE); - - # Make $output_filename an absolute path because we're going - # to change directories while processing files - if (!($output_filename =~ /^\/(.*)$/)) - { - $output_filename = $cwd."/".$output_filename; - } -} - -# Build list of directories to identify external files -foreach my $entry(@data_directory, $base_directory) { - next if (!defined($entry)); - push(@internal_dirs, solve_relative_path($cwd, $entry)); -} - -# Do something -foreach my $entry (@data_directory) { - gen_info($entry); -} - -if ($initial && $br_coverage) { - warn("Note: --initial does not generate branch coverage ". - "data\n"); -} -info("Finished .info-file creation\n"); - -exit(0); - - - -# -# print_usage(handle) -# -# Print usage information. -# - -sub print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE <<END_OF_USAGE); -Usage: $tool_name [OPTIONS] DIRECTORY - -Traverse DIRECTORY and create a .info file for each data file found. Note -that you may specify more than one directory, all of which are then processed -sequentially. - - -h, --help Print this help, then exit - -v, --version Print version number, then exit - -q, --quiet Do not print progress messages - -i, --initial Capture initial zero coverage data - -t, --test-name NAME Use test case name NAME for resulting data - -o, --output-filename OUTFILE Write data only to OUTFILE - -f, --follow Follow links when searching .da/.gcda files - -b, --base-directory DIR Use DIR as base directory for relative paths - --(no-)checksum Enable (disable) line checksumming - --(no-)compat-libtool Enable (disable) libtool compatibility mode - --gcov-tool TOOL Specify gcov tool location - --ignore-errors ERROR Continue after ERROR (gcov, source, graph) - --no-recursion Exclude subdirectories from processing - --no-markers Ignore exclusion markers in source code - --derive-func-data Generate function data from line data - --(no-)external Include (ignore) data for external files - --config-file FILENAME Specify configuration file location - --rc SETTING=VALUE Override configuration file setting - --compat MODE=on|off|auto Set compat MODE (libtool, hammer, split_crc) - --include PATTERN Include files matching PATTERN - --exclude PATTERN Exclude files matching PATTERN - -For more information see: $lcov_url -END_OF_USAGE - ; -} - - -# -# transform_pattern(pattern) -# -# Transform shell wildcard expression to equivalent Perl regular expression. -# Return transformed pattern. -# - -sub transform_pattern($) -{ - my $pattern = $_[0]; - - # Escape special chars - - $pattern =~ s/\\/\\\\/g; - $pattern =~ s/\//\\\//g; - $pattern =~ s/\^/\\\^/g; - $pattern =~ s/\$/\\\$/g; - $pattern =~ s/\(/\\\(/g; - $pattern =~ s/\)/\\\)/g; - $pattern =~ s/\[/\\\[/g; - $pattern =~ s/\]/\\\]/g; - $pattern =~ s/\{/\\\{/g; - $pattern =~ s/\}/\\\}/g; - $pattern =~ s/\./\\\./g; - $pattern =~ s/\,/\\\,/g; - $pattern =~ s/\|/\\\|/g; - $pattern =~ s/\+/\\\+/g; - $pattern =~ s/\!/\\\!/g; - - # Transform ? => (.) and * => (.*) - - $pattern =~ s/\*/\(\.\*\)/g; - $pattern =~ s/\?/\(\.\)/g; - - return $pattern; -} - - -# -# get_common_prefix(min_dir, filenames) -# -# Return the longest path prefix shared by all filenames. MIN_DIR specifies -# the minimum number of directories that a filename may have after removing -# the prefix. -# - -sub get_common_prefix($@) -{ - my ($min_dir, @files) = @_; - my $file; - my @prefix; - my $i; - - foreach $file (@files) { - my ($v, $d, $f) = splitpath($file); - my @comp = splitdir($d); - - if (!@prefix) { - @prefix = @comp; - next; - } - for ($i = 0; $i < scalar(@comp) && $i < scalar(@prefix); $i++) { - if ($comp[$i] ne $prefix[$i] || - ((scalar(@comp) - ($i + 1)) <= $min_dir)) { - delete(@prefix[$i..scalar(@prefix)]); - last; - } - } - } - - return catdir(@prefix); -} - -# -# gen_info(directory) -# -# Traverse DIRECTORY and create a .info file for each data file found. -# The .info file contains TEST_NAME in the following format: -# -# TN:<test name> -# -# For each source file name referenced in the data file, there is a section -# containing source code and coverage data: -# -# SF:<absolute path to the source file> -# FN:<line number of function start>,<function name> for each function -# DA:<line number>,<execution count> for each instrumented line -# LH:<number of lines with an execution count> greater than 0 -# LF:<number of instrumented lines> -# -# Sections are separated by: -# -# end_of_record -# -# In addition to the main source code file there are sections for each -# #included file containing executable code. Note that the absolute path -# of a source file is generated by interpreting the contents of the respective -# graph file. Relative filenames are prefixed with the directory in which the -# graph file is found. Note also that symbolic links to the graph file will be -# resolved so that the actual file path is used instead of the path to a link. -# This approach is necessary for the mechanism to work with the /proc/gcov -# files. -# -# Die on error. -# - -sub gen_info($) -{ - my $directory = $_[0]; - my @file_list; - my $file; - my $prefix; - my $type; - my $ext; - - if ($initial) { - $type = "graph"; - $ext = $graph_file_extension; - } else { - $type = "data"; - $ext = $data_file_extension; - } - - if (-d $directory) - { - info("Scanning $directory for $ext files ...\n"); - - @file_list = `find "$directory" $maxdepth $follow -name \\*$ext -type f -o -name \\*$ext -type l 2>/dev/null`; - chomp(@file_list); - if (!@file_list) { - warn("WARNING: no $ext files found in $directory - ". - "skipping!\n"); - return; - } - $prefix = get_common_prefix(1, @file_list); - info("Found %d %s files in %s\n", $#file_list+1, $type, - $directory); - } - else - { - @file_list = ($directory); - $prefix = ""; - } - - # Process all files in list - foreach $file (@file_list) { - # Process file - if ($initial) { - process_graphfile($file, $prefix); - } else { - process_dafile($file, $prefix); - } - } - - # Report whether files were excluded. - if (%excluded_files) { - info("Excluded data for %d files due to include/exclude options\n", - scalar keys %excluded_files); - } -} - - -# -# derive_data(contentdata, funcdata, bbdata) -# -# Calculate function coverage data by combining line coverage data and the -# list of lines belonging to a function. -# -# contentdata: [ instr1, count1, source1, instr2, count2, source2, ... ] -# instr<n>: Instrumentation flag for line n -# count<n>: Execution count for line n -# source<n>: Source code for line n -# -# funcdata: [ count1, func1, count2, func2, ... ] -# count<n>: Execution count for function number n -# func<n>: Function name for function number n -# -# bbdata: function_name -> [ line1, line2, ... ] -# line<n>: Line number belonging to the corresponding function -# - -sub derive_data($$$) -{ - my ($contentdata, $funcdata, $bbdata) = @_; - my @gcov_content = @{$contentdata}; - my @gcov_functions = @{$funcdata}; - my %fn_count; - my %ln_fn; - my $line; - my $maxline; - my %fn_name; - my $fn; - my $count; - - if (!defined($bbdata)) { - return @gcov_functions; - } - - # First add existing function data - while (@gcov_functions) { - $count = shift(@gcov_functions); - $fn = shift(@gcov_functions); - - $fn_count{$fn} = $count; - } - - # Convert line coverage data to function data - foreach $fn (keys(%{$bbdata})) { - my $line_data = $bbdata->{$fn}; - my $line; - my $fninstr = 0; - - if ($fn eq "") { - next; - } - # Find the lowest line count for this function - $count = 0; - foreach $line (@$line_data) { - my $linstr = $gcov_content[ ( $line - 1 ) * 3 + 0 ]; - my $lcount = $gcov_content[ ( $line - 1 ) * 3 + 1 ]; - - next if (!$linstr); - $fninstr = 1; - if (($lcount > 0) && - (($count == 0) || ($lcount < $count))) { - $count = $lcount; - } - } - next if (!$fninstr); - $fn_count{$fn} = $count; - } - - - # Check if we got data for all functions - foreach $fn (keys(%fn_name)) { - if ($fn eq "") { - next; - } - if (defined($fn_count{$fn})) { - next; - } - warn("WARNING: no derived data found for function $fn\n"); - } - - # Convert hash to list in @gcov_functions format - foreach $fn (sort(keys(%fn_count))) { - push(@gcov_functions, $fn_count{$fn}, $fn); - } - - return @gcov_functions; -} - -# -# get_filenames(directory, pattern) -# -# Return a list of filenames found in directory which match the specified -# pattern. -# -# Die on error. -# - -sub get_filenames($$) -{ - my ($dirname, $pattern) = @_; - my @result; - my $directory; - local *DIR; - - opendir(DIR, $dirname) or - die("ERROR: cannot read directory $dirname\n"); - while ($directory = readdir(DIR)) { - push(@result, $directory) if ($directory =~ /$pattern/); - } - closedir(DIR); - - return @result; -} - -# -# process_dafile(da_filename, dir) -# -# Create a .info file for a single data file. -# -# Die on error. -# - -sub process_dafile($$) -{ - my ($file, $dir) = @_; - my $da_filename; # Name of data file to process - my $da_dir; # Directory of data file - my $source_dir; # Directory of source file - my $da_basename; # data filename without ".da/.gcda" extension - my $bb_filename; # Name of respective graph file - my $bb_basename; # Basename of the original graph file - my $graph; # Contents of graph file - my $instr; # Contents of graph file part 2 - my $gcov_error; # Error code of gcov tool - my $object_dir; # Directory containing all object files - my $source_filename; # Name of a source code file - my $gcov_file; # Name of a .gcov file - my @gcov_content; # Content of a .gcov file - my $gcov_branches; # Branch content of a .gcov file - my @gcov_functions; # Function calls of a .gcov file - my @gcov_list; # List of generated .gcov files - my $line_number; # Line number count - my $lines_hit; # Number of instrumented lines hit - my $lines_found; # Number of instrumented lines found - my $funcs_hit; # Number of instrumented functions hit - my $funcs_found; # Number of instrumented functions found - my $br_hit; - my $br_found; - my $source; # gcov source header information - my $object; # gcov object header information - my @matches; # List of absolute paths matching filename - my $base_dir; # Base directory for current file - my @tmp_links; # Temporary links to be cleaned up - my @result; - my $index; - my $da_renamed; # If data file is to be renamed - local *INFO_HANDLE; - - info("Processing %s\n", abs2rel($file, $dir)); - # Get path to data file in absolute and normalized form (begins with /, - # contains no more ../ or ./) - $da_filename = solve_relative_path($cwd, $file); - - # Get directory and basename of data file - ($da_dir, $da_basename) = split_filename($da_filename); - - $source_dir = $da_dir; - if (is_compat($COMPAT_MODE_LIBTOOL)) { - # Avoid files from .libs dirs - $source_dir =~ s/\.libs$//; - } - - if (-z $da_filename) - { - $da_renamed = 1; - } - else - { - $da_renamed = 0; - } - - # Construct base_dir for current file - if ($base_directory) - { - $base_dir = $base_directory; - } - else - { - $base_dir = $source_dir; - } - - # Check for writable $base_dir (gcov will try to write files there) - stat($base_dir); - if (!-w _) - { - die("ERROR: cannot write to directory $base_dir!\n"); - } - - # Construct name of graph file - $bb_basename = $da_basename.$graph_file_extension; - $bb_filename = "$da_dir/$bb_basename"; - - # Find out the real location of graph file in case we're just looking at - # a link - while (readlink($bb_filename)) - { - my $last_dir = dirname($bb_filename); - - $bb_filename = readlink($bb_filename); - $bb_filename = solve_relative_path($last_dir, $bb_filename); - } - - # Ignore empty graph file (e.g. source file with no statement) - if (-z $bb_filename) - { - warn("WARNING: empty $bb_filename (skipped)\n"); - return; - } - - # Read contents of graph file into hash. We need it later to find out - # the absolute path to each .gcov file created as well as for - # information about functions and their source code positions. - if ($gcov_version < $GCOV_VERSION_3_4_0) - { - if (is_compat($COMPAT_MODE_HAMMER)) - { - ($instr, $graph) = read_bbg($bb_filename); - } - else - { - ($instr, $graph) = read_bb($bb_filename); - } - } - else - { - ($instr, $graph) = read_gcno($bb_filename); - } - - # Try to find base directory automatically if requested by user - if ($rc_auto_base) { - $base_dir = find_base_from_graph($base_dir, $instr, $graph); - } - - ($instr, $graph) = adjust_graph_filenames($base_dir, $instr, $graph); - - # Set $object_dir to real location of object files. This may differ - # from $da_dir if the graph file is just a link to the "real" object - # file location. - $object_dir = dirname($bb_filename); - - # Is the data file in a different directory? (this happens e.g. with - # the gcov-kernel patch) - if ($object_dir ne $da_dir) - { - # Need to create link to data file in $object_dir - system("ln", "-s", $da_filename, - "$object_dir/$da_basename$data_file_extension") - and die ("ERROR: cannot create link $object_dir/". - "$da_basename$data_file_extension!\n"); - push(@tmp_links, - "$object_dir/$da_basename$data_file_extension"); - # Need to create link to graph file if basename of link - # and file are different (CONFIG_MODVERSION compat) - if ((basename($bb_filename) ne $bb_basename) && - (! -e "$object_dir/$bb_basename")) { - symlink($bb_filename, "$object_dir/$bb_basename") or - warn("WARNING: cannot create link ". - "$object_dir/$bb_basename\n"); - push(@tmp_links, "$object_dir/$bb_basename"); - } - } - - # Change to directory containing data files and apply GCOV - debug("chdir($base_dir)\n"); - chdir($base_dir); - - if ($da_renamed) - { - # Need to rename empty data file to workaround - # gcov <= 3.2.x bug (Abort) - system_no_output(3, "mv", "$da_filename", "$da_filename.ori") - and die ("ERROR: cannot rename $da_filename\n"); - } - - # Execute gcov command and suppress standard output - $gcov_error = system_no_output(1, $gcov_tool, $da_filename, - "-o", $object_dir, @gcov_options); - - if ($da_renamed) - { - system_no_output(3, "mv", "$da_filename.ori", "$da_filename") - and die ("ERROR: cannot rename $da_filename.ori"); - } - - # Clean up temporary links - foreach (@tmp_links) { - unlink($_); - } - - if ($gcov_error) - { - if ($ignore[$ERROR_GCOV]) - { - warn("WARNING: GCOV failed for $da_filename!\n"); - return; - } - die("ERROR: GCOV failed for $da_filename!\n"); - } - - # Collect data from resulting .gcov files and create .info file - @gcov_list = get_filenames('.', '\.gcov$'); - - # Check for files - if (!@gcov_list) - { - warn("WARNING: gcov did not create any files for ". - "$da_filename!\n"); - } - - # Check whether we're writing to a single file - if ($output_filename) - { - if ($output_filename eq "-") - { - *INFO_HANDLE = *STDOUT; - } - else - { - # Append to output file - open(INFO_HANDLE, ">>", $output_filename) - or die("ERROR: cannot write to ". - "$output_filename!\n"); - } - } - else - { - # Open .info file for output - open(INFO_HANDLE, ">", "$da_filename.info") - or die("ERROR: cannot create $da_filename.info!\n"); - } - - # Write test name - printf(INFO_HANDLE "TN:%s\n", $test_name); - - # Traverse the list of generated .gcov files and combine them into a - # single .info file - foreach $gcov_file (sort(@gcov_list)) - { - my $i; - my $num; - - # Skip gcov file for gcc built-in code - next if ($gcov_file eq "<built-in>.gcov"); - - ($source, $object) = read_gcov_header($gcov_file); - - if (!defined($source)) { - # Derive source file name from gcov file name if - # header format could not be parsed - $source = $gcov_file; - $source =~ s/\.gcov$//; - } - - $source = solve_relative_path($base_dir, $source); - - if (defined($adjust_src_pattern)) { - # Apply transformation as specified by user - $source =~ s/$adjust_src_pattern/$adjust_src_replace/g; - } - - # gcov will happily create output even if there's no source code - # available - this interferes with checksum creation so we need - # to pull the emergency brake here. - if (! -r $source && $checksum) - { - if ($ignore[$ERROR_SOURCE]) - { - warn("WARNING: could not read source file ". - "$source\n"); - next; - } - die("ERROR: could not read source file $source\n"); - } - - @matches = match_filename($source, keys(%{$instr})); - - # Skip files that are not mentioned in the graph file - if (!@matches) - { - warn("WARNING: cannot find an entry for ".$gcov_file. - " in $graph_file_extension file, skipping ". - "file!\n"); - unlink($gcov_file); - next; - } - - # Read in contents of gcov file - @result = read_gcov_file($gcov_file); - if (!defined($result[0])) { - warn("WARNING: skipping unreadable file ". - $gcov_file."\n"); - unlink($gcov_file); - next; - } - @gcov_content = @{$result[0]}; - $gcov_branches = $result[1]; - @gcov_functions = @{$result[2]}; - - # Skip empty files - if (!@gcov_content) - { - warn("WARNING: skipping empty file ".$gcov_file."\n"); - unlink($gcov_file); - next; - } - - if (scalar(@matches) == 1) - { - # Just one match - $source_filename = $matches[0]; - } - else - { - # Try to solve the ambiguity - $source_filename = solve_ambiguous_match($gcov_file, - \@matches, \@gcov_content); - } - - if (@include_patterns) - { - my $keep = 0; - - foreach my $pattern (@include_patterns) - { - $keep ||= ($source_filename =~ (/^$pattern$/)); - } - - if (!$keep) - { - $excluded_files{$source_filename} = (); - unlink($gcov_file); - next; - } - } - - if (@exclude_patterns) - { - my $exclude = 0; - - foreach my $pattern (@exclude_patterns) - { - $exclude ||= ($source_filename =~ (/^$pattern$/)); - } - - if ($exclude) - { - $excluded_files{$source_filename} = (); - unlink($gcov_file); - next; - } - } - - # Skip external files if requested - if (!$opt_external) { - if (is_external($source_filename)) { - info(" ignoring data for external file ". - "$source_filename\n"); - unlink($gcov_file); - next; - } - } - - # Write absolute path of source file - printf(INFO_HANDLE "SF:%s\n", $source_filename); - - # If requested, derive function coverage data from - # line coverage data of the first line of a function - if ($opt_derive_func_data) { - @gcov_functions = - derive_data(\@gcov_content, \@gcov_functions, - $graph->{$source_filename}); - } - - # Write function-related information - if (defined($graph->{$source_filename})) - { - my $fn_data = $graph->{$source_filename}; - my $fn; - - foreach $fn (sort - {$fn_data->{$a}->[0] <=> $fn_data->{$b}->[0]} - keys(%{$fn_data})) { - my $ln_data = $fn_data->{$fn}; - my $line = $ln_data->[0]; - - # Skip empty function - if ($fn eq "") { - next; - } - # Remove excluded functions - if (!$no_markers) { - my $gfn; - my $found = 0; - - foreach $gfn (@gcov_functions) { - if ($gfn eq $fn) { - $found = 1; - last; - } - } - if (!$found) { - next; - } - } - - # Normalize function name - $fn = filter_fn_name($fn); - - print(INFO_HANDLE "FN:$line,$fn\n"); - } - } - - #-- - #-- FNDA: <call-count>, <function-name> - #-- FNF: overall count of functions - #-- FNH: overall count of functions with non-zero call count - #-- - $funcs_found = 0; - $funcs_hit = 0; - while (@gcov_functions) - { - my $count = shift(@gcov_functions); - my $fn = shift(@gcov_functions); - - $fn = filter_fn_name($fn); - printf(INFO_HANDLE "FNDA:$count,$fn\n"); - $funcs_found++; - $funcs_hit++ if ($count > 0); - } - if ($funcs_found > 0) { - printf(INFO_HANDLE "FNF:%s\n", $funcs_found); - printf(INFO_HANDLE "FNH:%s\n", $funcs_hit); - } - - # Write coverage information for each instrumented branch: - # - # BRDA:<line number>,<block number>,<branch number>,<taken> - # - # where 'taken' is the number of times the branch was taken - # or '-' if the block to which the branch belongs was never - # executed - $br_found = 0; - $br_hit = 0; - $num = br_gvec_len($gcov_branches); - for ($i = 0; $i < $num; $i++) { - my ($line, $block, $branch, $taken) = - br_gvec_get($gcov_branches, $i); - - $block = $BR_VEC_MAX if ($block < 0); - print(INFO_HANDLE "BRDA:$line,$block,$branch,$taken\n"); - $br_found++; - $br_hit++ if ($taken ne '-' && $taken > 0); - } - if ($br_found > 0) { - printf(INFO_HANDLE "BRF:%s\n", $br_found); - printf(INFO_HANDLE "BRH:%s\n", $br_hit); - } - - # Reset line counters - $line_number = 0; - $lines_found = 0; - $lines_hit = 0; - - # Write coverage information for each instrumented line - # Note: @gcov_content contains a list of (flag, count, source) - # tuple for each source code line - while (@gcov_content) - { - $line_number++; - - # Check for instrumented line - if ($gcov_content[0]) - { - $lines_found++; - printf(INFO_HANDLE "DA:".$line_number.",". - $gcov_content[1].($checksum ? - ",". md5_base64($gcov_content[2]) : ""). - "\n"); - - # Increase $lines_hit in case of an execution - # count>0 - if ($gcov_content[1] > 0) { $lines_hit++; } - } - - # Remove already processed data from array - splice(@gcov_content,0,3); - } - - # Write line statistics and section separator - printf(INFO_HANDLE "LF:%s\n", $lines_found); - printf(INFO_HANDLE "LH:%s\n", $lines_hit); - print(INFO_HANDLE "end_of_record\n"); - - # Remove .gcov file after processing - unlink($gcov_file); - } - - if (!($output_filename && ($output_filename eq "-"))) - { - close(INFO_HANDLE); - } - - # Change back to initial directory - chdir($cwd); -} - - -# -# solve_relative_path(path, dir) -# -# Solve relative path components of DIR which, if not absolute, resides in PATH. -# - -sub solve_relative_path($$) -{ - my $path = $_[0]; - my $dir = $_[1]; - my $volume; - my $directories; - my $filename; - my @dirs; # holds path elements - my $result; - - # Convert from Windows path to msys path - if( $^O eq "msys" ) - { - # search for a windows drive letter at the beginning - ($volume, $directories, $filename) = File::Spec::Win32->splitpath( $dir ); - if( $volume ne '' ) - { - my $uppercase_volume; - # transform c/d\../e/f\g to Windows style c\d\..\e\f\g - $dir = File::Spec::Win32->canonpath( $dir ); - # use Win32 module to retrieve path components - # $uppercase_volume is not used any further - ( $uppercase_volume, $directories, $filename ) = File::Spec::Win32->splitpath( $dir ); - @dirs = File::Spec::Win32->splitdir( $directories ); - - # prepend volume, since in msys C: is always mounted to /c - $volume =~ s|^([a-zA-Z]+):|/\L$1\E|; - unshift( @dirs, $volume ); - - # transform to Unix style '/' path - $directories = File::Spec->catdir( @dirs ); - $dir = File::Spec->catpath( '', $directories, $filename ); - } else { - # eliminate '\' path separators - $dir = File::Spec->canonpath( $dir ); - } - } - - $result = $dir; - # Prepend path if not absolute - if ($dir =~ /^[^\/]/) - { - $result = "$path/$result"; - } - - # Remove // - $result =~ s/\/\//\//g; - - # Remove . - while ($result =~ s/\/\.\//\//g) - { - } - $result =~ s/\/\.$/\//g; - - # Remove trailing / - $result =~ s/\/$//g; - - # Solve .. - while ($result =~ s/\/[^\/]+\/\.\.\//\//) - { - } - - # Remove preceding .. - $result =~ s/^\/\.\.\//\//g; - - return $result; -} - - -# -# match_filename(gcov_filename, list) -# -# Return a list of those entries of LIST which match the relative filename -# GCOV_FILENAME. -# - -sub match_filename($@) -{ - my ($filename, @list) = @_; - my ($vol, $dir, $file) = splitpath($filename); - my @comp = splitdir($dir); - my $comps = scalar(@comp); - my $entry; - my @result; - -entry: - foreach $entry (@list) { - my ($evol, $edir, $efile) = splitpath($entry); - my @ecomp; - my $ecomps; - my $i; - - # Filename component must match - if ($efile ne $file) { - next; - } - # Check directory components last to first for match - @ecomp = splitdir($edir); - $ecomps = scalar(@ecomp); - if ($ecomps < $comps) { - next; - } - for ($i = 0; $i < $comps; $i++) { - if ($comp[$comps - $i - 1] ne - $ecomp[$ecomps - $i - 1]) { - next entry; - } - } - push(@result, $entry), - } - - return @result; -} - -# -# solve_ambiguous_match(rel_filename, matches_ref, gcov_content_ref) -# -# Try to solve ambiguous matches of mapping (gcov file) -> (source code) file -# by comparing source code provided in the GCOV file with that of the files -# in MATCHES. REL_FILENAME identifies the relative filename of the gcov -# file. -# -# Return the one real match or die if there is none. -# - -sub solve_ambiguous_match($$$) -{ - my $rel_name = $_[0]; - my $matches = $_[1]; - my $content = $_[2]; - my $filename; - my $index; - my $no_match; - local *SOURCE; - - # Check the list of matches - foreach $filename (@$matches) - { - - # Compare file contents - open(SOURCE, "<", $filename) - or die("ERROR: cannot read $filename!\n"); - - $no_match = 0; - for ($index = 2; <SOURCE>; $index += 3) - { - chomp; - - # Also remove CR from line-end - s/\015$//; - - if ($_ ne @$content[$index]) - { - $no_match = 1; - last; - } - } - - close(SOURCE); - - if (!$no_match) - { - info("Solved source file ambiguity for $rel_name\n"); - return $filename; - } - } - - die("ERROR: could not match gcov data for $rel_name!\n"); -} - - -# -# split_filename(filename) -# -# Return (path, filename, extension) for a given FILENAME. -# - -sub split_filename($) -{ - my @path_components = split('/', $_[0]); - my @file_components = split('\.', pop(@path_components)); - my $extension = pop(@file_components); - - return (join("/",@path_components), join(".",@file_components), - $extension); -} - - -# -# read_gcov_header(gcov_filename) -# -# Parse file GCOV_FILENAME and return a list containing the following -# information: -# -# (source, object) -# -# where: -# -# source: complete relative path of the source code file (gcc >= 3.3 only) -# object: name of associated graph file -# -# Die on error. -# - -sub read_gcov_header($) -{ - my $source; - my $object; - local *INPUT; - - if (!open(INPUT, "<", $_[0])) - { - if ($ignore_errors[$ERROR_GCOV]) - { - warn("WARNING: cannot read $_[0]!\n"); - return (undef,undef); - } - die("ERROR: cannot read $_[0]!\n"); - } - - while (<INPUT>) - { - chomp($_); - - # Also remove CR from line-end - s/\015$//; - - if (/^\s+-:\s+0:Source:(.*)$/) - { - # Source: header entry - $source = $1; - } - elsif (/^\s+-:\s+0:Object:(.*)$/) - { - # Object: header entry - $object = $1; - } - else - { - last; - } - } - - close(INPUT); - - return ($source, $object); -} - - -# -# br_gvec_len(vector) -# -# Return the number of entries in the branch coverage vector. -# - -sub br_gvec_len($) -{ - my ($vec) = @_; - - return 0 if (!defined($vec)); - return (length($vec) * 8 / $BR_VEC_WIDTH) / $BR_VEC_ENTRIES; -} - - -# -# br_gvec_get(vector, number) -# -# Return an entry from the branch coverage vector. -# - -sub br_gvec_get($$) -{ - my ($vec, $num) = @_; - my $line; - my $block; - my $branch; - my $taken; - my $offset = $num * $BR_VEC_ENTRIES; - - # Retrieve data from vector - $line = vec($vec, $offset + $BR_LINE, $BR_VEC_WIDTH); - $block = vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH); - $block = -1 if ($block == $BR_VEC_MAX); - $branch = vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH); - $taken = vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH); - - # Decode taken value from an integer - if ($taken == 0) { - $taken = "-"; - } else { - $taken--; - } - - return ($line, $block, $branch, $taken); -} - - -# -# br_gvec_push(vector, line, block, branch, taken) -# -# Add an entry to the branch coverage vector. -# - -sub br_gvec_push($$$$$) -{ - my ($vec, $line, $block, $branch, $taken) = @_; - my $offset; - - $vec = "" if (!defined($vec)); - $offset = br_gvec_len($vec) * $BR_VEC_ENTRIES; - $block = $BR_VEC_MAX if $block < 0; - - # Encode taken value into an integer - if ($taken eq "-") { - $taken = 0; - } else { - $taken++; - } - - # Add to vector - vec($vec, $offset + $BR_LINE, $BR_VEC_WIDTH) = $line; - vec($vec, $offset + $BR_BLOCK, $BR_VEC_WIDTH) = $block; - vec($vec, $offset + $BR_BRANCH, $BR_VEC_WIDTH) = $branch; - vec($vec, $offset + $BR_TAKEN, $BR_VEC_WIDTH) = $taken; - - return $vec; -} - - -# -# read_gcov_file(gcov_filename) -# -# Parse file GCOV_FILENAME (.gcov file format) and return the list: -# (reference to gcov_content, reference to gcov_branch, reference to gcov_func) -# -# gcov_content is a list of 3 elements -# (flag, count, source) for each source code line: -# -# $result[($line_number-1)*3+0] = instrumentation flag for line $line_number -# $result[($line_number-1)*3+1] = execution count for line $line_number -# $result[($line_number-1)*3+2] = source code text for line $line_number -# -# gcov_branch is a vector of 4 4-byte long elements for each branch: -# line number, block number, branch number, count + 1 or 0 -# -# gcov_func is a list of 2 elements -# (number of calls, function name) for each function -# -# Die on error. -# - -sub read_gcov_file($) -{ - my $filename = $_[0]; - my @result = (); - my $branches = ""; - my @functions = (); - my $number; - my $exclude_flag = 0; - my $exclude_line = 0; - my $exclude_br_flag = 0; - my $exclude_branch = 0; - my $last_block = $UNNAMED_BLOCK; - my $last_line = 0; - local *INPUT; - - if (!open(INPUT, "<", $filename)) { - if ($ignore_errors[$ERROR_GCOV]) - { - warn("WARNING: cannot read $filename!\n"); - return (undef, undef, undef); - } - die("ERROR: cannot read $filename!\n"); - } - - if ($gcov_version < $GCOV_VERSION_3_3_0) - { - # Expect gcov format as used in gcc < 3.3 - while (<INPUT>) - { - chomp($_); - - # Also remove CR from line-end - s/\015$//; - - if (/^branch\s+(\d+)\s+taken\s+=\s+(\d+)/) { - next if (!$br_coverage); - next if ($exclude_line); - next if ($exclude_branch); - $branches = br_gvec_push($branches, $last_line, - $last_block, $1, $2); - } elsif (/^branch\s+(\d+)\s+never\s+executed/) { - next if (!$br_coverage); - next if ($exclude_line); - next if ($exclude_branch); - $branches = br_gvec_push($branches, $last_line, - $last_block, $1, '-'); - } - elsif (/^call/ || /^function/) - { - # Function call return data - } - else - { - $last_line++; - # Check for exclusion markers - if (!$no_markers) { - if (/$EXCL_STOP/) { - $exclude_flag = 0; - } elsif (/$EXCL_START/) { - $exclude_flag = 1; - } - if (/$excl_line/ || $exclude_flag) { - $exclude_line = 1; - } else { - $exclude_line = 0; - } - } - # Check for exclusion markers (branch exclude) - if (!$no_markers) { - if (/$EXCL_BR_STOP/) { - $exclude_br_flag = 0; - } elsif (/$EXCL_BR_START/) { - $exclude_br_flag = 1; - } - if (/$excl_br_line/ || $exclude_br_flag) { - $exclude_branch = 1; - } else { - $exclude_branch = 0; - } - } - # Source code execution data - if (/^\t\t(.*)$/) - { - # Uninstrumented line - push(@result, 0); - push(@result, 0); - push(@result, $1); - next; - } - $number = (split(" ",substr($_, 0, 16)))[0]; - - # Check for zero count which is indicated - # by ###### - if ($number eq "######") { $number = 0; } - - if ($exclude_line) { - # Register uninstrumented line instead - push(@result, 0); - push(@result, 0); - } else { - push(@result, 1); - push(@result, $number); - } - push(@result, substr($_, 16)); - } - } - } - else - { - # Expect gcov format as used in gcc >= 3.3 - while (<INPUT>) - { - chomp($_); - - # Also remove CR from line-end - s/\015$//; - - if (/^\s*(\d+|\$+|\%+):\s*(\d+)-block\s+(\d+)\s*$/) { - # Block information - used to group related - # branches - $last_line = $2; - $last_block = $3; - } elsif (/^branch\s+(\d+)\s+taken\s+(\d+)/) { - next if (!$br_coverage); - next if ($exclude_line); - next if ($exclude_branch); - $branches = br_gvec_push($branches, $last_line, - $last_block, $1, $2); - } elsif (/^branch\s+(\d+)\s+never\s+executed/) { - next if (!$br_coverage); - next if ($exclude_line); - next if ($exclude_branch); - $branches = br_gvec_push($branches, $last_line, - $last_block, $1, '-'); - } - elsif (/^function\s+(.+)\s+called\s+(\d+)\s+/) - { - next if (!$func_coverage); - if ($exclude_line) { - next; - } - push(@functions, $2, $1); - } - elsif (/^call/) - { - # Function call return data - } - elsif (/^\s*([^:]+):\s*([^:]+):(.*)$/) - { - my ($count, $line, $code) = ($1, $2, $3); - - # Skip instance-specific counts - next if ($line <= (scalar(@result) / 3)); - - $last_line = $line; - $last_block = $UNNAMED_BLOCK; - # Check for exclusion markers - if (!$no_markers) { - if (/$EXCL_STOP/) { - $exclude_flag = 0; - } elsif (/$EXCL_START/) { - $exclude_flag = 1; - } - if (/$excl_line/ || $exclude_flag) { - $exclude_line = 1; - } else { - $exclude_line = 0; - } - } - # Check for exclusion markers (branch exclude) - if (!$no_markers) { - if (/$EXCL_BR_STOP/) { - $exclude_br_flag = 0; - } elsif (/$EXCL_BR_START/) { - $exclude_br_flag = 1; - } - if (/$excl_br_line/ || $exclude_br_flag) { - $exclude_branch = 1; - } else { - $exclude_branch = 0; - } - } - - # Strip unexecuted basic block marker - $count =~ s/\*$//; - - # <exec count>:<line number>:<source code> - if ($line eq "0") - { - # Extra data - } - elsif ($count eq "-") - { - # Uninstrumented line - push(@result, 0); - push(@result, 0); - push(@result, $code); - } - else - { - if ($exclude_line) { - push(@result, 0); - push(@result, 0); - } else { - # Check for zero count - if ($count =~ /^[#=]/) { - $count = 0; - } - push(@result, 1); - push(@result, $count); - } - push(@result, $code); - } - } - } - } - - close(INPUT); - if ($exclude_flag || $exclude_br_flag) { - warn("WARNING: unterminated exclusion section in $filename\n"); - } - return(\@result, $branches, \@functions); -} - - -# Map LLVM versions to the version of GCC gcov which they emulate. - -sub map_llvm_version($) -{ - my ($ver) = @_; - - return 0x040200 if ($ver >= 0x030400); - - warn("WARNING: This version of LLVM's gcov is unknown. ". - "Assuming it emulates GCC gcov version 4.2.\n"); - - return 0x040200; -} - - -# Return a readable version of encoded gcov version. - -sub version_to_str($) -{ - my ($ver) = @_; - my ($a, $b, $c); - - $a = $ver >> 16 & 0xff; - $b = $ver >> 8 & 0xff; - $c = $ver & 0xff; - - return "$a.$b.$c"; -} - - -# -# Get the GCOV tool version. Return an integer number which represents the -# GCOV version. Version numbers can be compared using standard integer -# operations. -# - -sub get_gcov_version() -{ - local *HANDLE; - my $version_string; - my $result; - my ($a, $b, $c) = (4, 2, 0); # Fallback version - - # Examples for gcov version output: - # - # gcov (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3) - # - # gcov (crosstool-NG 1.18.0) 4.7.2 - # - # LLVM (http://llvm.org/): - # LLVM version 3.4svn - # - # Apple LLVM version 8.0.0 (clang-800.0.38) - # Optimized build. - # Default target: x86_64-apple-darwin16.0.0 - # Host CPU: haswell - - open(GCOV_PIPE, "-|", "$gcov_tool --version") - or die("ERROR: cannot retrieve gcov version!\n"); - local $/; - $version_string = <GCOV_PIPE>; - close(GCOV_PIPE); - - # Remove all bracketed information - $version_string =~ s/\([^\)]*\)//g; - - if ($version_string =~ /(\d+)\.(\d+)(\.(\d+))?/) { - ($a, $b, $c) = ($1, $2, $4); - $c = 0 if (!defined($c)); - } else { - warn("WARNING: cannot determine gcov version - ". - "assuming $a.$b.$c\n"); - } - $result = $a << 16 | $b << 8 | $c; - - if ($version_string =~ /LLVM/) { - $result = map_llvm_version($result); - info("Found LLVM gcov version $a.$b.$c, which emulates gcov ". - "version ".version_to_str($result)."\n"); - } else { - info("Found gcov version: ".version_to_str($result)."\n"); - } - - return ($result, $version_string); -} - - -# -# info(printf_parameter) -# -# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag -# is not set. -# - -sub info(@) -{ - if (!$quiet) - { - # Print info string - if (defined($output_filename) && ($output_filename eq "-")) - { - # Don't interfere with the .info output to STDOUT - printf(STDERR @_); - } - else - { - printf(@_); - } - } -} - - -# -# int_handler() -# -# Called when the script was interrupted by an INT signal (e.g. CTRl-C) -# - -sub int_handler() -{ - if ($cwd) { chdir($cwd); } - info("Aborted.\n"); - exit(1); -} - - -# -# system_no_output(mode, parameters) -# -# Call an external program using PARAMETERS while suppressing depending on -# the value of MODE: -# -# MODE & 1: suppress STDOUT -# MODE & 2: suppress STDERR -# -# Return 0 on success, non-zero otherwise. -# - -sub system_no_output($@) -{ - my $mode = shift; - my $result; - local *OLD_STDERR; - local *OLD_STDOUT; - - # Save old stdout and stderr handles - ($mode & 1) && open(OLD_STDOUT, ">>&", "STDOUT"); - ($mode & 2) && open(OLD_STDERR, ">>&", "STDERR"); - - # Redirect to /dev/null - ($mode & 1) && open(STDOUT, ">", "/dev/null"); - ($mode & 2) && open(STDERR, ">", "/dev/null"); - - debug("system(".join(' ', @_).")\n"); - system(@_); - $result = $?; - - # Close redirected handles - ($mode & 1) && close(STDOUT); - ($mode & 2) && close(STDERR); - - # Restore old handles - ($mode & 1) && open(STDOUT, ">>&", "OLD_STDOUT"); - ($mode & 2) && open(STDERR, ">>&", "OLD_STDERR"); - - return $result; -} - - -# -# read_config(filename) -# -# Read configuration file FILENAME and return a reference to a hash containing -# all valid key=value pairs found. -# - -sub read_config($) -{ - my $filename = $_[0]; - my %result; - my $key; - my $value; - local *HANDLE; - - if (!open(HANDLE, "<", $filename)) - { - warn("WARNING: cannot read configuration file $filename\n"); - return undef; - } - while (<HANDLE>) - { - chomp; - # Skip comments - s/#.*//; - # Remove leading blanks - s/^\s+//; - # Remove trailing blanks - s/\s+$//; - next unless length; - ($key, $value) = split(/\s*=\s*/, $_, 2); - if (defined($key) && defined($value)) - { - $result{$key} = $value; - } - else - { - warn("WARNING: malformed statement in line $. ". - "of configuration file $filename\n"); - } - } - close(HANDLE); - return \%result; -} - - -# -# apply_config(REF) -# -# REF is a reference to a hash containing the following mapping: -# -# key_string => var_ref -# -# where KEY_STRING is a keyword and VAR_REF is a reference to an associated -# variable. If the global configuration hashes CONFIG or OPT_RC contain a value -# for keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. -# - -sub apply_config($) -{ - my $ref = $_[0]; - - foreach (keys(%{$ref})) - { - if (defined($opt_rc{$_})) { - ${$ref->{$_}} = $opt_rc{$_}; - } elsif (defined($config->{$_})) { - ${$ref->{$_}} = $config->{$_}; - } - } -} - - -# -# get_exclusion_data(filename) -# -# Scan specified source code file for exclusion markers and return -# linenumber -> 1 -# for all lines which should be excluded. -# - -sub get_exclusion_data($) -{ - my ($filename) = @_; - my %list; - my $flag = 0; - local *HANDLE; - - if (!open(HANDLE, "<", $filename)) { - warn("WARNING: could not open $filename\n"); - return undef; - } - while (<HANDLE>) { - if (/$EXCL_STOP/) { - $flag = 0; - } elsif (/$EXCL_START/) { - $flag = 1; - } - if (/$excl_line/ || $flag) { - $list{$.} = 1; - } - } - close(HANDLE); - - if ($flag) { - warn("WARNING: unterminated exclusion section in $filename\n"); - } - - return \%list; -} - - -# -# apply_exclusion_data(instr, graph) -# -# Remove lines from instr and graph data structures which are marked -# for exclusion in the source code file. -# -# Return adjusted (instr, graph). -# -# graph : file name -> function data -# function data : function name -> line data -# line data : [ line1, line2, ... ] -# -# instr : filename -> line data -# line data : [ line1, line2, ... ] -# - -sub apply_exclusion_data($$) -{ - my ($instr, $graph) = @_; - my $filename; - my %excl_data; - my $excl_read_failed = 0; - - # Collect exclusion marker data - foreach $filename (sort_uniq_lex(keys(%{$graph}), keys(%{$instr}))) { - my $excl = get_exclusion_data($filename); - - # Skip and note if file could not be read - if (!defined($excl)) { - $excl_read_failed = 1; - next; - } - - # Add to collection if there are markers - $excl_data{$filename} = $excl if (keys(%{$excl}) > 0); - } - - # Warn if not all source files could be read - if ($excl_read_failed) { - warn("WARNING: some exclusion markers may be ignored\n"); - } - - # Skip if no markers were found - return ($instr, $graph) if (keys(%excl_data) == 0); - - # Apply exclusion marker data to graph - foreach $filename (keys(%excl_data)) { - my $function_data = $graph->{$filename}; - my $excl = $excl_data{$filename}; - my $function; - - next if (!defined($function_data)); - - foreach $function (keys(%{$function_data})) { - my $line_data = $function_data->{$function}; - my $line; - my @new_data; - - # To be consistent with exclusion parser in non-initial - # case we need to remove a function if the first line - # was excluded - if ($excl->{$line_data->[0]}) { - delete($function_data->{$function}); - next; - } - # Copy only lines which are not excluded - foreach $line (@{$line_data}) { - push(@new_data, $line) if (!$excl->{$line}); - } - - # Store modified list - if (scalar(@new_data) > 0) { - $function_data->{$function} = \@new_data; - } else { - # All of this function was excluded - delete($function_data->{$function}); - } - } - - # Check if all functions of this file were excluded - if (keys(%{$function_data}) == 0) { - delete($graph->{$filename}); - } - } - - # Apply exclusion marker data to instr - foreach $filename (keys(%excl_data)) { - my $line_data = $instr->{$filename}; - my $excl = $excl_data{$filename}; - my $line; - my @new_data; - - next if (!defined($line_data)); - - # Copy only lines which are not excluded - foreach $line (@{$line_data}) { - push(@new_data, $line) if (!$excl->{$line}); - } - - # Store modified list - $instr->{$filename} = \@new_data; - } - - return ($instr, $graph); -} - - -sub process_graphfile($$) -{ - my ($file, $dir) = @_; - my $graph_filename = $file; - my $graph_dir; - my $graph_basename; - my $source_dir; - my $base_dir; - my $graph; - my $instr; - my $filename; - local *INFO_HANDLE; - - info("Processing %s\n", abs2rel($file, $dir)); - - # Get path to data file in absolute and normalized form (begins with /, - # contains no more ../ or ./) - $graph_filename = solve_relative_path($cwd, $graph_filename); - - # Get directory and basename of data file - ($graph_dir, $graph_basename) = split_filename($graph_filename); - - $source_dir = $graph_dir; - if (is_compat($COMPAT_MODE_LIBTOOL)) { - # Avoid files from .libs dirs - $source_dir =~ s/\.libs$//; - } - - # Construct base_dir for current file - if ($base_directory) - { - $base_dir = $base_directory; - } - else - { - $base_dir = $source_dir; - } - - # Ignore empty graph file (e.g. source file with no statement) - if (-z $graph_filename) - { - warn("WARNING: empty $graph_filename (skipped)\n"); - return; - } - - if ($gcov_version < $GCOV_VERSION_3_4_0) - { - if (is_compat($COMPAT_MODE_HAMMER)) - { - ($instr, $graph) = read_bbg($graph_filename); - } - else - { - ($instr, $graph) = read_bb($graph_filename); - } - } - else - { - ($instr, $graph) = read_gcno($graph_filename); - } - - # Try to find base directory automatically if requested by user - if ($rc_auto_base) { - $base_dir = find_base_from_graph($base_dir, $instr, $graph); - } - - ($instr, $graph) = adjust_graph_filenames($base_dir, $instr, $graph); - - if (!$no_markers) { - # Apply exclusion marker data to graph file data - ($instr, $graph) = apply_exclusion_data($instr, $graph); - } - - # Check whether we're writing to a single file - if ($output_filename) - { - if ($output_filename eq "-") - { - *INFO_HANDLE = *STDOUT; - } - else - { - # Append to output file - open(INFO_HANDLE, ">>", $output_filename) - or die("ERROR: cannot write to ". - "$output_filename!\n"); - } - } - else - { - # Open .info file for output - open(INFO_HANDLE, ">", "$graph_filename.info") - or die("ERROR: cannot create $graph_filename.info!\n"); - } - - # Write test name - printf(INFO_HANDLE "TN:%s\n", $test_name); - foreach $filename (sort(keys(%{$instr}))) - { - my $funcdata = $graph->{$filename}; - my $line; - my $linedata; - - # Skip external files if requested - if (!$opt_external) { - if (is_external($filename)) { - info(" ignoring data for external file ". - "$filename\n"); - next; - } - } - - print(INFO_HANDLE "SF:$filename\n"); - - if (defined($funcdata) && $func_coverage) { - my @functions = sort {$funcdata->{$a}->[0] <=> - $funcdata->{$b}->[0]} - keys(%{$funcdata}); - my $func; - - # Gather list of instrumented lines and functions - foreach $func (@functions) { - $linedata = $funcdata->{$func}; - - # Print function name and starting line - print(INFO_HANDLE "FN:".$linedata->[0]. - ",".filter_fn_name($func)."\n"); - } - # Print zero function coverage data - foreach $func (@functions) { - print(INFO_HANDLE "FNDA:0,". - filter_fn_name($func)."\n"); - } - # Print function summary - print(INFO_HANDLE "FNF:".scalar(@functions)."\n"); - print(INFO_HANDLE "FNH:0\n"); - } - # Print zero line coverage data - foreach $line (@{$instr->{$filename}}) { - print(INFO_HANDLE "DA:$line,0\n"); - } - # Print line summary - print(INFO_HANDLE "LF:".scalar(@{$instr->{$filename}})."\n"); - print(INFO_HANDLE "LH:0\n"); - - print(INFO_HANDLE "end_of_record\n"); - } - if (!($output_filename && ($output_filename eq "-"))) - { - close(INFO_HANDLE); - } -} - -sub filter_fn_name($) -{ - my ($fn) = @_; - - # Remove characters used internally as function name delimiters - $fn =~ s/[,=]/_/g; - - return $fn; -} - -sub warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} - - -# -# graph_error(filename, message) -# -# Print message about error in graph file. If ignore_graph_error is set, return. -# Otherwise abort. -# - -sub graph_error($$) -{ - my ($filename, $msg) = @_; - - if ($ignore[$ERROR_GRAPH]) { - warn("WARNING: $filename: $msg - skipping\n"); - return; - } - die("ERROR: $filename: $msg\n"); -} - -# -# graph_expect(description) -# -# If debug is set to a non-zero value, print the specified description of what -# is expected to be read next from the graph file. -# - -sub graph_expect($) -{ - my ($msg) = @_; - - if (!$debug || !defined($msg)) { - return; - } - - print(STDERR "DEBUG: expecting $msg\n"); -} - -# -# graph_read(handle, bytes[, description, peek]) -# -# Read and return the specified number of bytes from handle. Return undef -# if the number of bytes could not be read. If PEEK is non-zero, reset -# file position after read. -# - -sub graph_read(*$;$$) -{ - my ($handle, $length, $desc, $peek) = @_; - my $data; - my $result; - my $pos; - - graph_expect($desc); - if ($peek) { - $pos = tell($handle); - if ($pos == -1) { - warn("Could not get current file position: $!\n"); - return undef; - } - } - $result = read($handle, $data, $length); - if ($debug) { - my $op = $peek ? "peek" : "read"; - my $ascii = ""; - my $hex = ""; - my $i; - - print(STDERR "DEBUG: $op($length)=$result: "); - for ($i = 0; $i < length($data); $i++) { - my $c = substr($data, $i, 1);; - my $n = ord($c); - - $hex .= sprintf("%02x ", $n); - if ($n >= 32 && $n <= 127) { - $ascii .= $c; - } else { - $ascii .= "."; - } - } - print(STDERR "$hex |$ascii|"); - print(STDERR "\n"); - } - if ($peek) { - if (!seek($handle, $pos, 0)) { - warn("Could not set file position: $!\n"); - return undef; - } - } - if ($result != $length) { - return undef; - } - return $data; -} - -# -# graph_skip(handle, bytes[, description]) -# -# Read and discard the specified number of bytes from handle. Return non-zero -# if bytes could be read, zero otherwise. -# - -sub graph_skip(*$;$) -{ - my ($handle, $length, $desc) = @_; - - if (defined(graph_read($handle, $length, $desc))) { - return 1; - } - return 0; -} - -# -# uniq(list) -# -# Return list without duplicate entries. -# - -sub uniq(@) -{ - my (@list) = @_; - my @new_list; - my %known; - - foreach my $item (@list) { - next if ($known{$item}); - $known{$item} = 1; - push(@new_list, $item); - } - - return @new_list; -} - -# -# sort_uniq(list) -# -# Return list in numerically ascending order and without duplicate entries. -# - -sub sort_uniq(@) -{ - my (@list) = @_; - my %hash; - - foreach (@list) { - $hash{$_} = 1; - } - return sort { $a <=> $b } keys(%hash); -} - -# -# sort_uniq_lex(list) -# -# Return list in lexically ascending order and without duplicate entries. -# - -sub sort_uniq_lex(@) -{ - my (@list) = @_; - my %hash; - - foreach (@list) { - $hash{$_} = 1; - } - return sort keys(%hash); -} - -# -# parent_dir(dir) -# -# Return parent directory for DIR. DIR must not contain relative path -# components. -# - -sub parent_dir($) -{ - my ($dir) = @_; - my ($v, $d, $f) = splitpath($dir, 1); - my @dirs = splitdir($d); - - pop(@dirs); - - return catpath($v, catdir(@dirs), $f); -} - -# -# find_base_from_graph(base_dir, instr, graph) -# -# Try to determine the base directory of the graph file specified by INSTR -# and GRAPH. The base directory is the base for all relative filenames in -# the graph file. It is defined by the current working directory at time -# of compiling the source file. -# -# This function implements a heuristic which relies on the following -# assumptions: -# - all files used for compilation are still present at their location -# - the base directory is either BASE_DIR or one of its parent directories -# - files by the same name are not present in multiple parent directories -# - -sub find_base_from_graph($$$) -{ - my ($base_dir, $instr, $graph) = @_; - my $old_base; - my $best_miss; - my $best_base; - my %rel_files; - - # Determine list of relative paths - foreach my $filename (keys(%{$instr}), keys(%{$graph})) { - next if (file_name_is_absolute($filename)); - - $rel_files{$filename} = 1; - } - - # Early exit if there are no relative paths - return $base_dir if (!%rel_files); - - do { - my $miss = 0; - - foreach my $filename (keys(%rel_files)) { - if (!-e solve_relative_path($base_dir, $filename)) { - $miss++; - } - } - - debug("base_dir=$base_dir miss=$miss\n"); - - # Exit if we find an exact match with no misses - return $base_dir if ($miss == 0); - - # No exact match, aim for the one with the least source file - # misses - if (!defined($best_base) || $miss < $best_miss) { - $best_base = $base_dir; - $best_miss = $miss; - } - - # Repeat until there's no more parent directory - $old_base = $base_dir; - $base_dir = parent_dir($base_dir); - } while ($old_base ne $base_dir); - - return $best_base; -} - -# -# adjust_graph_filenames(base_dir, instr, graph) -# -# Make relative paths in INSTR and GRAPH absolute and apply -# geninfo_adjust_src_path setting to graph file data. -# - -sub adjust_graph_filenames($$$) -{ - my ($base_dir, $instr, $graph) = @_; - - foreach my $filename (keys(%{$instr})) { - my $old_filename = $filename; - - # Convert to absolute canonical form - $filename = solve_relative_path($base_dir, $filename); - - # Apply adjustment - if (defined($adjust_src_pattern)) { - $filename =~ s/$adjust_src_pattern/$adjust_src_replace/g; - } - - if ($filename ne $old_filename) { - $instr->{$filename} = delete($instr->{$old_filename}); - } - } - - foreach my $filename (keys(%{$graph})) { - my $old_filename = $filename; - - # Make absolute - # Convert to absolute canonical form - $filename = solve_relative_path($base_dir, $filename); - - # Apply adjustment - if (defined($adjust_src_pattern)) { - $filename =~ s/$adjust_src_pattern/$adjust_src_replace/g; - } - - if ($filename ne $old_filename) { - $graph->{$filename} = delete($graph->{$old_filename}); - } - } - - return ($instr, $graph); -} - -# -# graph_cleanup(graph) -# -# Remove entries for functions with no lines. Remove duplicate line numbers. -# Sort list of line numbers numerically ascending. -# - -sub graph_cleanup($) -{ - my ($graph) = @_; - my $filename; - - foreach $filename (keys(%{$graph})) { - my $per_file = $graph->{$filename}; - my $function; - - foreach $function (keys(%{$per_file})) { - my $lines = $per_file->{$function}; - - if (scalar(@$lines) == 0) { - # Remove empty function - delete($per_file->{$function}); - next; - } - # Normalize list - $per_file->{$function} = [ uniq(@$lines) ]; - } - if (scalar(keys(%{$per_file})) == 0) { - # Remove empty file - delete($graph->{$filename}); - } - } -} - -# -# graph_find_base(bb) -# -# Try to identify the filename which is the base source file for the -# specified bb data. -# - -sub graph_find_base($) -{ - my ($bb) = @_; - my %file_count; - my $basefile; - my $file; - my $func; - my $filedata; - my $count; - my $num; - - # Identify base name for this bb data. - foreach $func (keys(%{$bb})) { - $filedata = $bb->{$func}; - - foreach $file (keys(%{$filedata})) { - $count = $file_count{$file}; - - # Count file occurrence - $file_count{$file} = defined($count) ? $count + 1 : 1; - } - } - $count = 0; - $num = 0; - foreach $file (keys(%file_count)) { - if ($file_count{$file} > $count) { - # The file that contains code for the most functions - # is likely the base file - $count = $file_count{$file}; - $num = 1; - $basefile = $file; - } elsif ($file_count{$file} == $count) { - # If more than one file could be the basefile, we - # don't have a basefile - $basefile = undef; - } - } - - return $basefile; -} - -# -# graph_from_bb(bb, fileorder, bb_filename, fileorder_first) -# -# Convert data from bb to the graph format and list of instrumented lines. -# -# If FILEORDER_FIRST is set, use fileorder data to determine a functions -# base source file. -# -# Returns (instr, graph). -# -# bb : function name -> file data -# : undef -> file order -# file data : filename -> line data -# line data : [ line1, line2, ... ] -# -# file order : function name -> [ filename1, filename2, ... ] -# -# graph : file name -> function data -# function data : function name -> line data -# line data : [ line1, line2, ... ] -# -# instr : filename -> line data -# line data : [ line1, line2, ... ] -# - -sub graph_from_bb($$$$) -{ - my ($bb, $fileorder, $bb_filename, $fileorder_first) = @_; - my $graph = {}; - my $instr = {}; - my $basefile; - my $file; - my $func; - my $filedata; - my $linedata; - my $order; - - $basefile = graph_find_base($bb); - # Create graph structure - foreach $func (keys(%{$bb})) { - $filedata = $bb->{$func}; - $order = $fileorder->{$func}; - - # Account for lines in functions - if (defined($basefile) && defined($filedata->{$basefile}) && - !$fileorder_first) { - # If the basefile contributes to this function, - # account this function to the basefile. - $graph->{$basefile}->{$func} = $filedata->{$basefile}; - } else { - # If the basefile does not contribute to this function, - # account this function to the first file contributing - # lines. - $graph->{$order->[0]}->{$func} = - $filedata->{$order->[0]}; - } - - foreach $file (keys(%{$filedata})) { - # Account for instrumented lines - $linedata = $filedata->{$file}; - push(@{$instr->{$file}}, @$linedata); - } - } - # Clean up array of instrumented lines - foreach $file (keys(%{$instr})) { - $instr->{$file} = [ sort_uniq(@{$instr->{$file}}) ]; - } - - return ($instr, $graph); -} - -# -# graph_add_order(fileorder, function, filename) -# -# Add an entry for filename to the fileorder data set for function. -# - -sub graph_add_order($$$) -{ - my ($fileorder, $function, $filename) = @_; - my $item; - my $list; - - $list = $fileorder->{$function}; - foreach $item (@$list) { - if ($item eq $filename) { - return; - } - } - push(@$list, $filename); - $fileorder->{$function} = $list; -} - -# -# read_bb_word(handle[, description]) -# -# Read and return a word in .bb format from handle. -# - -sub read_bb_word(*;$) -{ - my ($handle, $desc) = @_; - - return graph_read($handle, 4, $desc); -} - -# -# read_bb_value(handle[, description]) -# -# Read a word in .bb format from handle and return the word and its integer -# value. -# - -sub read_bb_value(*;$) -{ - my ($handle, $desc) = @_; - my $word; - - $word = read_bb_word($handle, $desc); - return undef if (!defined($word)); - - return ($word, unpack("V", $word)); -} - -# -# read_bb_string(handle, delimiter) -# -# Read and return a string in .bb format from handle up to the specified -# delimiter value. -# - -sub read_bb_string(*$) -{ - my ($handle, $delimiter) = @_; - my $word; - my $value; - my $string = ""; - - graph_expect("string"); - do { - ($word, $value) = read_bb_value($handle, "string or delimiter"); - return undef if (!defined($value)); - if ($value != $delimiter) { - $string .= $word; - } - } while ($value != $delimiter); - $string =~ s/\0//g; - - return $string; -} - -# -# read_bb(filename) -# -# Read the contents of the specified .bb file and return (instr, graph), where: -# -# instr : filename -> line data -# line data : [ line1, line2, ... ] -# -# graph : filename -> file_data -# file_data : function name -> line_data -# line_data : [ line1, line2, ... ] -# -# See the gcov info pages of gcc 2.95 for a description of the .bb file format. -# - -sub read_bb($) -{ - my ($bb_filename) = @_; - my $minus_one = 0x80000001; - my $minus_two = 0x80000002; - my $value; - my $filename; - my $function; - my $bb = {}; - my $fileorder = {}; - my $instr; - my $graph; - local *HANDLE; - - open(HANDLE, "<", $bb_filename) or goto open_error; - binmode(HANDLE); - while (!eof(HANDLE)) { - $value = read_bb_value(*HANDLE, "data word"); - goto incomplete if (!defined($value)); - if ($value == $minus_one) { - # Source file name - graph_expect("filename"); - $filename = read_bb_string(*HANDLE, $minus_one); - goto incomplete if (!defined($filename)); - } elsif ($value == $minus_two) { - # Function name - graph_expect("function name"); - $function = read_bb_string(*HANDLE, $minus_two); - goto incomplete if (!defined($function)); - } elsif ($value > 0) { - # Line number - if (!defined($filename) || !defined($function)) { - warn("WARNING: unassigned line number ". - "$value\n"); - next; - } - push(@{$bb->{$function}->{$filename}}, $value); - graph_add_order($fileorder, $function, $filename); - } - } - close(HANDLE); - - ($instr, $graph) = graph_from_bb($bb, $fileorder, $bb_filename, 0); - graph_cleanup($graph); - - return ($instr, $graph); - -open_error: - graph_error($bb_filename, "could not open file"); - return undef; -incomplete: - graph_error($bb_filename, "reached unexpected end of file"); - return undef; -} - -# -# read_bbg_word(handle[, description]) -# -# Read and return a word in .bbg format. -# - -sub read_bbg_word(*;$) -{ - my ($handle, $desc) = @_; - - return graph_read($handle, 4, $desc); -} - -# -# read_bbg_value(handle[, description]) -# -# Read a word in .bbg format from handle and return its integer value. -# - -sub read_bbg_value(*;$) -{ - my ($handle, $desc) = @_; - my $word; - - $word = read_bbg_word($handle, $desc); - return undef if (!defined($word)); - - return unpack("N", $word); -} - -# -# read_bbg_string(handle) -# -# Read and return a string in .bbg format. -# - -sub read_bbg_string(*) -{ - my ($handle, $desc) = @_; - my $length; - my $string; - - graph_expect("string"); - # Read string length - $length = read_bbg_value($handle, "string length"); - return undef if (!defined($length)); - if ($length == 0) { - return ""; - } - # Read string - $string = graph_read($handle, $length, "string"); - return undef if (!defined($string)); - # Skip padding - graph_skip($handle, 4 - $length % 4, "string padding") or return undef; - - return $string; -} - -# -# read_bbg_lines_record(handle, bbg_filename, bb, fileorder, filename, -# function) -# -# Read a bbg format lines record from handle and add the relevant data to -# bb and fileorder. Return filename on success, undef on error. -# - -sub read_bbg_lines_record(*$$$$$) -{ - my ($handle, $bbg_filename, $bb, $fileorder, $filename, $function) = @_; - my $string; - my $lineno; - - graph_expect("lines record"); - # Skip basic block index - graph_skip($handle, 4, "basic block index") or return undef; - while (1) { - # Read line number - $lineno = read_bbg_value($handle, "line number"); - return undef if (!defined($lineno)); - if ($lineno == 0) { - # Got a marker for a new filename - graph_expect("filename"); - $string = read_bbg_string($handle); - return undef if (!defined($string)); - # Check for end of record - if ($string eq "") { - return $filename; - } - $filename = $string; - if (!exists($bb->{$function}->{$filename})) { - $bb->{$function}->{$filename} = []; - } - next; - } - # Got an actual line number - if (!defined($filename)) { - warn("WARNING: unassigned line number in ". - "$bbg_filename\n"); - next; - } - push(@{$bb->{$function}->{$filename}}, $lineno); - graph_add_order($fileorder, $function, $filename); - } -} - -# -# read_bbg(filename) -# -# Read the contents of the specified .bbg file and return the following mapping: -# graph: filename -> file_data -# file_data: function name -> line_data -# line_data: [ line1, line2, ... ] -# -# See the gcov-io.h file in the SLES 9 gcc 3.3.3 source code for a description -# of the .bbg format. -# - -sub read_bbg($) -{ - my ($bbg_filename) = @_; - my $file_magic = 0x67626267; - my $tag_function = 0x01000000; - my $tag_lines = 0x01450000; - my $word; - my $tag; - my $length; - my $function; - my $filename; - my $bb = {}; - my $fileorder = {}; - my $instr; - my $graph; - local *HANDLE; - - open(HANDLE, "<", $bbg_filename) or goto open_error; - binmode(HANDLE); - # Read magic - $word = read_bbg_value(*HANDLE, "file magic"); - goto incomplete if (!defined($word)); - # Check magic - if ($word != $file_magic) { - goto magic_error; - } - # Skip version - graph_skip(*HANDLE, 4, "version") or goto incomplete; - while (!eof(HANDLE)) { - # Read record tag - $tag = read_bbg_value(*HANDLE, "record tag"); - goto incomplete if (!defined($tag)); - # Read record length - $length = read_bbg_value(*HANDLE, "record length"); - goto incomplete if (!defined($tag)); - if ($tag == $tag_function) { - graph_expect("function record"); - # Read function name - graph_expect("function name"); - $function = read_bbg_string(*HANDLE); - goto incomplete if (!defined($function)); - $filename = undef; - # Skip function checksum - graph_skip(*HANDLE, 4, "function checksum") - or goto incomplete; - } elsif ($tag == $tag_lines) { - # Read lines record - $filename = read_bbg_lines_record(HANDLE, $bbg_filename, - $bb, $fileorder, $filename, - $function); - goto incomplete if (!defined($filename)); - } else { - # Skip record contents - graph_skip(*HANDLE, $length, "unhandled record") - or goto incomplete; - } - } - close(HANDLE); - ($instr, $graph) = graph_from_bb($bb, $fileorder, $bbg_filename, 0); - - graph_cleanup($graph); - - return ($instr, $graph); - -open_error: - graph_error($bbg_filename, "could not open file"); - return undef; -incomplete: - graph_error($bbg_filename, "reached unexpected end of file"); - return undef; -magic_error: - graph_error($bbg_filename, "found unrecognized bbg file magic"); - return undef; -} - -# -# read_gcno_word(handle[, description, peek]) -# -# Read and return a word in .gcno format. -# - -sub read_gcno_word(*;$$) -{ - my ($handle, $desc, $peek) = @_; - - return graph_read($handle, 4, $desc, $peek); -} - -# -# read_gcno_value(handle, big_endian[, description, peek]) -# -# Read a word in .gcno format from handle and return its integer value -# according to the specified endianness. If PEEK is non-zero, reset file -# position after read. -# - -sub read_gcno_value(*$;$$) -{ - my ($handle, $big_endian, $desc, $peek) = @_; - my $word; - my $pos; - - $word = read_gcno_word($handle, $desc, $peek); - return undef if (!defined($word)); - if ($big_endian) { - return unpack("N", $word); - } else { - return unpack("V", $word); - } -} - -# -# read_gcno_string(handle, big_endian) -# -# Read and return a string in .gcno format. -# - -sub read_gcno_string(*$) -{ - my ($handle, $big_endian) = @_; - my $length; - my $string; - - graph_expect("string"); - # Read string length - $length = read_gcno_value($handle, $big_endian, "string length"); - return undef if (!defined($length)); - if ($length == 0) { - return ""; - } - $length *= 4; - # Read string - $string = graph_read($handle, $length, "string and padding"); - return undef if (!defined($string)); - $string =~ s/\0//g; - - return $string; -} - -# -# read_gcno_lines_record(handle, gcno_filename, bb, fileorder, filename, -# function, big_endian) -# -# Read a gcno format lines record from handle and add the relevant data to -# bb and fileorder. Return filename on success, undef on error. -# - -sub read_gcno_lines_record(*$$$$$$) -{ - my ($handle, $gcno_filename, $bb, $fileorder, $filename, $function, - $big_endian) = @_; - my $string; - my $lineno; - - graph_expect("lines record"); - # Skip basic block index - graph_skip($handle, 4, "basic block index") or return undef; - while (1) { - # Read line number - $lineno = read_gcno_value($handle, $big_endian, "line number"); - return undef if (!defined($lineno)); - if ($lineno == 0) { - # Got a marker for a new filename - graph_expect("filename"); - $string = read_gcno_string($handle, $big_endian); - return undef if (!defined($string)); - # Check for end of record - if ($string eq "") { - return $filename; - } - $filename = $string; - if (!exists($bb->{$function}->{$filename})) { - $bb->{$function}->{$filename} = []; - } - next; - } - # Got an actual line number - if (!defined($filename)) { - warn("WARNING: unassigned line number in ". - "$gcno_filename\n"); - next; - } - # Add to list - push(@{$bb->{$function}->{$filename}}, $lineno); - graph_add_order($fileorder, $function, $filename); - } -} - -# -# determine_gcno_split_crc(handle, big_endian, rec_length, version) -# -# Determine if HANDLE refers to a .gcno file with a split checksum function -# record format. Return non-zero in case of split checksum format, zero -# otherwise, undef in case of read error. -# - -sub determine_gcno_split_crc($$$$) -{ - my ($handle, $big_endian, $rec_length, $version) = @_; - my $strlen; - my $overlong_string; - - return 1 if ($version >= $GCOV_VERSION_4_7_0); - return 1 if (is_compat($COMPAT_MODE_SPLIT_CRC)); - - # Heuristic: - # Decide format based on contents of next word in record: - # - pre-gcc 4.7 - # This is the function name length / 4 which should be - # less than the remaining record length - # - gcc 4.7 - # This is a checksum, likely with high-order bits set, - # resulting in a large number - $strlen = read_gcno_value($handle, $big_endian, undef, 1); - return undef if (!defined($strlen)); - $overlong_string = 1 if ($strlen * 4 >= $rec_length - 12); - - if ($overlong_string) { - if (is_compat_auto($COMPAT_MODE_SPLIT_CRC)) { - info("Auto-detected compatibility mode for split ". - "checksum .gcno file format\n"); - - return 1; - } else { - # Sanity check - warn("Found overlong string in function record: ". - "try '--compat split_crc'\n"); - } - } - - return 0; -} - -# -# read_gcno_function_record(handle, graph, big_endian, rec_length, version) -# -# Read a gcno format function record from handle and add the relevant data -# to graph. Return (filename, function, artificial) on success, undef on error. -# - -sub read_gcno_function_record(*$$$$$) -{ - my ($handle, $bb, $fileorder, $big_endian, $rec_length, $version) = @_; - my $filename; - my $function; - my $lineno; - my $lines; - my $artificial; - - graph_expect("function record"); - # Skip ident and checksum - graph_skip($handle, 8, "function ident and checksum") or return undef; - # Determine if this is a function record with split checksums - if (!defined($gcno_split_crc)) { - $gcno_split_crc = determine_gcno_split_crc($handle, $big_endian, - $rec_length, - $version); - return undef if (!defined($gcno_split_crc)); - } - # Skip cfg checksum word in case of split checksums - graph_skip($handle, 4, "function cfg checksum") if ($gcno_split_crc); - # Read function name - graph_expect("function name"); - $function = read_gcno_string($handle, $big_endian); - return undef if (!defined($function)); - if ($version >= $GCOV_VERSION_8_0_0) { - $artificial = read_gcno_value($handle, $big_endian, - "compiler-generated entity flag"); - return undef if (!defined($artificial)); - } - # Read filename - graph_expect("filename"); - $filename = read_gcno_string($handle, $big_endian); - return undef if (!defined($filename)); - # Read first line number - $lineno = read_gcno_value($handle, $big_endian, "initial line number"); - return undef if (!defined($lineno)); - # Skip column and ending line number - if ($version >= $GCOV_VERSION_8_0_0) { - graph_skip($handle, 4, "column number") or return undef; - graph_skip($handle, 4, "ending line number") or return undef; - } - # Add to list - push(@{$bb->{$function}->{$filename}}, $lineno); - graph_add_order($fileorder, $function, $filename); - - return ($filename, $function, $artificial); -} - -# -# map_gcno_version -# -# Map version number as found in .gcno files to the format used in geninfo. -# - -sub map_gcno_version($) -{ - my ($version) = @_; - my ($a, $b, $c); - my ($major, $minor); - - $a = $version >> 24; - $b = $version >> 16 & 0xff; - $c = $version >> 8 & 0xff; - - if ($a < ord('A')) { - $major = $a - ord('0'); - $minor = ($b - ord('0')) * 10 + $c - ord('0'); - } else { - $major = ($a - ord('A')) * 10 + $b - ord('0'); - $minor = $c - ord('0'); - } - - return $major << 16 | $minor << 8; -} - -sub remove_fn_from_hash($$) -{ - my ($hash, $fns) = @_; - - foreach my $fn (@$fns) { - delete($hash->{$fn}); - } -} - -# -# read_gcno(filename) -# -# Read the contents of the specified .gcno file and return the following -# mapping: -# graph: filename -> file_data -# file_data: function name -> line_data -# line_data: [ line1, line2, ... ] -# -# See the gcov-io.h file in the gcc 3.3 source code for a description of -# the .gcno format. -# - -sub read_gcno($) -{ - my ($gcno_filename) = @_; - my $file_magic = 0x67636e6f; - my $tag_function = 0x01000000; - my $tag_lines = 0x01450000; - my $big_endian; - my $word; - my $tag; - my $length; - my $filename; - my $function; - my $bb = {}; - my $fileorder = {}; - my $instr; - my $graph; - my $filelength; - my $version; - my $artificial; - my @artificial_fns; - local *HANDLE; - - open(HANDLE, "<", $gcno_filename) or goto open_error; - $filelength = (stat(HANDLE))[7]; - binmode(HANDLE); - # Read magic - $word = read_gcno_word(*HANDLE, "file magic"); - goto incomplete if (!defined($word)); - # Determine file endianness - if (unpack("N", $word) == $file_magic) { - $big_endian = 1; - } elsif (unpack("V", $word) == $file_magic) { - $big_endian = 0; - } else { - goto magic_error; - } - # Read version - $version = read_gcno_value(*HANDLE, $big_endian, "compiler version"); - $version = map_gcno_version($version); - debug(sprintf("found version 0x%08x\n", $version)); - # Skip stamp - graph_skip(*HANDLE, 4, "file timestamp") or goto incomplete; - if ($version >= $GCOV_VERSION_8_0_0) { - graph_skip(*HANDLE, 4, "support unexecuted blocks flag") - or goto incomplete; - } - while (!eof(HANDLE)) { - my $next_pos; - my $curr_pos; - - # Read record tag - $tag = read_gcno_value(*HANDLE, $big_endian, "record tag"); - goto incomplete if (!defined($tag)); - # Read record length - $length = read_gcno_value(*HANDLE, $big_endian, - "record length"); - goto incomplete if (!defined($length)); - # Convert length to bytes - $length *= 4; - # Calculate start of next record - $next_pos = tell(HANDLE); - goto tell_error if ($next_pos == -1); - $next_pos += $length; - # Catch garbage at the end of a gcno file - if ($next_pos > $filelength) { - debug("Overlong record: file_length=$filelength ". - "rec_length=$length\n"); - warn("WARNING: $gcno_filename: Overlong record at end ". - "of file!\n"); - last; - } - # Process record - if ($tag == $tag_function) { - ($filename, $function, $artificial) = - read_gcno_function_record( - *HANDLE, $bb, $fileorder, $big_endian, - $length, $version); - goto incomplete if (!defined($function)); - push(@artificial_fns, $function) if ($artificial); - } elsif ($tag == $tag_lines) { - # Read lines record - $filename = read_gcno_lines_record(*HANDLE, - $gcno_filename, $bb, $fileorder, - $filename, $function, $big_endian); - goto incomplete if (!defined($filename)); - } else { - # Skip record contents - graph_skip(*HANDLE, $length, "unhandled record") - or goto incomplete; - } - # Ensure that we are at the start of the next record - $curr_pos = tell(HANDLE); - goto tell_error if ($curr_pos == -1); - next if ($curr_pos == $next_pos); - goto record_error if ($curr_pos > $next_pos); - graph_skip(*HANDLE, $next_pos - $curr_pos, - "unhandled record content") - or goto incomplete; - } - close(HANDLE); - - # Remove artificial functions from result data - remove_fn_from_hash($bb, \@artificial_fns); - remove_fn_from_hash($fileorder, \@artificial_fns); - - ($instr, $graph) = graph_from_bb($bb, $fileorder, $gcno_filename, 1); - graph_cleanup($graph); - - return ($instr, $graph); - -open_error: - graph_error($gcno_filename, "could not open file"); - return undef; -incomplete: - graph_error($gcno_filename, "reached unexpected end of file"); - return undef; -magic_error: - graph_error($gcno_filename, "found unrecognized gcno file magic"); - return undef; -tell_error: - graph_error($gcno_filename, "could not determine file position"); - return undef; -record_error: - graph_error($gcno_filename, "found unrecognized record format"); - return undef; -} - -sub debug($) -{ - my ($msg) = @_; - - return if (!$debug); - print(STDERR "DEBUG: $msg"); -} - -# -# get_gcov_capabilities -# -# Determine the list of available gcov options. -# - -sub get_gcov_capabilities() -{ - my $help = `$gcov_tool --help`; - my %capabilities; - my %short_option_translations = ( - 'a' => 'all-blocks', - 'b' => 'branch-probabilities', - 'c' => 'branch-counts', - 'f' => 'function-summaries', - 'h' => 'help', - 'l' => 'long-file-names', - 'n' => 'no-output', - 'o' => 'object-directory', - 'p' => 'preserve-paths', - 'u' => 'unconditional-branches', - 'v' => 'version', - 'x' => 'hash-filenames', - ); - - foreach (split(/\n/, $help)) { - my $capability; - if (/--(\S+)/) { - $capability = $1; - } else { - # If the line provides a short option, translate it. - next if (!/^\s*-(\S)\s/); - $capability = $short_option_translations{$1}; - next if not defined($capability); - } - next if ($capability eq 'help'); - next if ($capability eq 'version'); - next if ($capability eq 'object-directory'); - - $capabilities{$capability} = 1; - debug("gcov has capability '$capability'\n"); - } - - return \%capabilities; -} - -# -# parse_ignore_errors(@ignore_errors) -# -# Parse user input about which errors to ignore. -# - -sub parse_ignore_errors(@) -{ - my (@ignore_errors) = @_; - my @items; - my $item; - - return if (!@ignore_errors); - - foreach $item (@ignore_errors) { - $item =~ s/\s//g; - if ($item =~ /,/) { - # Split and add comma-separated parameters - push(@items, split(/,/, $item)); - } else { - # Add single parameter - push(@items, $item); - } - } - foreach $item (@items) { - my $item_id = $ERROR_ID{lc($item)}; - - if (!defined($item_id)) { - die("ERROR: unknown argument for --ignore-errors: ". - "$item\n"); - } - $ignore[$item_id] = 1; - } -} - -# -# is_external(filename) -# -# Determine if a file is located outside of the specified data directories. -# - -sub is_external($) -{ - my ($filename) = @_; - my $dir; - - foreach $dir (@internal_dirs) { - return 0 if ($filename =~ /^\Q$dir\/\E/); - } - return 1; -} - -# -# compat_name(mode) -# -# Return the name of compatibility mode MODE. -# - -sub compat_name($) -{ - my ($mode) = @_; - my $name = $COMPAT_MODE_TO_NAME{$mode}; - - return $name if (defined($name)); - - return "<unknown>"; -} - -# -# parse_compat_modes(opt) -# -# Determine compatibility mode settings. -# - -sub parse_compat_modes($) -{ - my ($opt) = @_; - my @opt_list; - my %specified; - - # Initialize with defaults - %compat_value = %COMPAT_MODE_DEFAULTS; - - # Add old style specifications - if (defined($opt_compat_libtool)) { - $compat_value{$COMPAT_MODE_LIBTOOL} = - $opt_compat_libtool ? $COMPAT_VALUE_ON - : $COMPAT_VALUE_OFF; - } - - # Parse settings - if (defined($opt)) { - @opt_list = split(/\s*,\s*/, $opt); - } - foreach my $directive (@opt_list) { - my ($mode, $value); - - # Either - # mode=off|on|auto or - # mode (implies on) - if ($directive !~ /^(\w+)=(\w+)$/ && - $directive !~ /^(\w+)$/) { - die("ERROR: Unknown compatibility mode specification: ". - "$directive!\n"); - } - # Determine mode - $mode = $COMPAT_NAME_TO_MODE{lc($1)}; - if (!defined($mode)) { - die("ERROR: Unknown compatibility mode '$1'!\n"); - } - $specified{$mode} = 1; - # Determine value - if (defined($2)) { - $value = $COMPAT_NAME_TO_VALUE{lc($2)}; - if (!defined($value)) { - die("ERROR: Unknown compatibility mode ". - "value '$2'!\n"); - } - } else { - $value = $COMPAT_VALUE_ON; - } - $compat_value{$mode} = $value; - } - # Perform auto-detection - foreach my $mode (sort(keys(%compat_value))) { - my $value = $compat_value{$mode}; - my $is_autodetect = ""; - my $name = compat_name($mode); - - if ($value == $COMPAT_VALUE_AUTO) { - my $autodetect = $COMPAT_MODE_AUTO{$mode}; - - if (!defined($autodetect)) { - die("ERROR: No auto-detection for ". - "mode '$name' available!\n"); - } - - if (ref($autodetect) eq "CODE") { - $value = &$autodetect(); - $compat_value{$mode} = $value; - $is_autodetect = " (auto-detected)"; - } - } - - if ($specified{$mode}) { - if ($value == $COMPAT_VALUE_ON) { - info("Enabling compatibility mode ". - "'$name'$is_autodetect\n"); - } elsif ($value == $COMPAT_VALUE_OFF) { - info("Disabling compatibility mode ". - "'$name'$is_autodetect\n"); - } else { - info("Using delayed auto-detection for ". - "compatibility mode ". - "'$name'\n"); - } - } - } -} - -sub compat_hammer_autodetect() -{ - if ($gcov_version_string =~ /suse/i && $gcov_version == 0x30303 || - $gcov_version_string =~ /mandrake/i && $gcov_version == 0x30302) - { - info("Auto-detected compatibility mode for GCC 3.3 (hammer)\n"); - return $COMPAT_VALUE_ON; - } - return $COMPAT_VALUE_OFF; -} - -# -# is_compat(mode) -# -# Return non-zero if compatibility mode MODE is enabled. -# - -sub is_compat($) -{ - my ($mode) = @_; - - return 1 if ($compat_value{$mode} == $COMPAT_VALUE_ON); - return 0; -} - -# -# is_compat_auto(mode) -# -# Return non-zero if compatibility mode MODE is set to auto-detect. -# - -sub is_compat_auto($) -{ - my ($mode) = @_; - - return 1 if ($compat_value{$mode} == $COMPAT_VALUE_AUTO); - return 0; -} diff --git a/ThirdParty/lcov/bin/genpng b/ThirdParty/lcov/bin/genpng deleted file mode 100755 index 943a49d5f..000000000 --- a/ThirdParty/lcov/bin/genpng +++ /dev/null @@ -1,389 +0,0 @@ -#!/usr/bin/env perl -# -# Copyright (c) International Business Machines Corp., 2002 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# genpng -# -# This script creates an overview PNG image of a source code file by -# representing each source code character by a single pixel. -# -# Note that the Perl module GD.pm is required for this script to work. -# It may be obtained from http://www.cpan.org -# -# History: -# 2002-08-26: created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> -# - -use strict; -use warnings; -use File::Basename; -use Getopt::Long; -use Cwd qw/abs_path/; - - -# Constants -our $tool_dir = abs_path(dirname($0)); -our $lcov_version = "LCOV version 1.14"; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $tool_name = basename($0); - - -# Prototypes -sub gen_png($$$@); -sub check_and_load_module($); -sub genpng_print_usage(*); -sub genpng_process_file($$$$); -sub genpng_warn_handler($); -sub genpng_die_handler($); - - -# -# Code entry point -# - -# Check whether required module GD.pm is installed -if (check_and_load_module("GD")) -{ - # Note: cannot use die() to print this message because inserting this - # code into another script via do() would not fail as required! - print(STDERR <<END_OF_TEXT) -ERROR: required module GD.pm not found on this system (see www.cpan.org). -END_OF_TEXT - ; - exit(2); -} - -# Check whether we're called from the command line or from another script -if (!caller) -{ - my $filename; - my $tab_size = 4; - my $width = 80; - my $out_filename; - my $help; - my $version; - - $SIG{__WARN__} = \&genpng_warn_handler; - $SIG{__DIE__} = \&genpng_die_handler; - - # Parse command line options - if (!GetOptions("tab-size=i" => \$tab_size, - "width=i" => \$width, - "output-filename=s" => \$out_filename, - "help" => \$help, - "version" => \$version)) - { - print(STDERR "Use $tool_name --help to get usage ". - "information\n"); - exit(1); - } - - $filename = $ARGV[0]; - - # Check for help flag - if ($help) - { - genpng_print_usage(*STDOUT); - exit(0); - } - - # Check for version flag - if ($version) - { - print("$tool_name: $lcov_version\n"); - exit(0); - } - - # Check options - if (!$filename) - { - die("No filename specified\n"); - } - - # Check for output filename - if (!$out_filename) - { - $out_filename = "$filename.png"; - } - - genpng_process_file($filename, $out_filename, $width, $tab_size); - exit(0); -} - - -# -# genpng_print_usage(handle) -# -# Write out command line usage information to given filehandle. -# - -sub genpng_print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE <<END_OF_USAGE) -Usage: $tool_name [OPTIONS] SOURCEFILE - -Create an overview image for a given source code file of either plain text -or .gcov file format. - - -h, --help Print this help, then exit - -v, --version Print version number, then exit - -t, --tab-size TABSIZE Use TABSIZE spaces in place of tab - -w, --width WIDTH Set width of output image to WIDTH pixel - -o, --output-filename FILENAME Write image to FILENAME - -For more information see: $lcov_url -END_OF_USAGE - ; -} - - -# -# check_and_load_module(module_name) -# -# Check whether a module by the given name is installed on this system -# and make it known to the interpreter if available. Return undefined if it -# is installed, an error message otherwise. -# - -sub check_and_load_module($) -{ - eval("use $_[0];"); - return $@; -} - - -# -# genpng_process_file(filename, out_filename, width, tab_size) -# - -sub genpng_process_file($$$$) -{ - my $filename = $_[0]; - my $out_filename = $_[1]; - my $width = $_[2]; - my $tab_size = $_[3]; - local *HANDLE; - my @source; - - open(HANDLE, "<", $filename) - or die("ERROR: cannot open $filename!\n"); - - # Check for .gcov filename extension - if ($filename =~ /^(.*).gcov$/) - { - # Assume gcov text format - while (<HANDLE>) - { - if (/^\t\t(.*)$/) - { - # Uninstrumented line - push(@source, ":$1"); - } - elsif (/^ ###### (.*)$/) - { - # Line with zero execution count - push(@source, "0:$1"); - } - elsif (/^( *)(\d*) (.*)$/) - { - # Line with positive execution count - push(@source, "$2:$3"); - } - } - } - else - { - # Plain text file - while (<HANDLE>) { push(@source, ":$_"); } - } - close(HANDLE); - - gen_png($out_filename, $width, $tab_size, @source); -} - - -# -# gen_png(filename, width, tab_size, source) -# -# Write an overview PNG file to FILENAME. Source code is defined by SOURCE -# which is a list of lines <count>:<source code> per source code line. -# The output image will be made up of one pixel per character of source, -# coloring will be done according to execution counts. WIDTH defines the -# image width. TAB_SIZE specifies the number of spaces to use as replacement -# string for tabulator signs in source code text. -# -# Die on error. -# - -sub gen_png($$$@) -{ - my $filename = shift(@_); # Filename for PNG file - my $overview_width = shift(@_); # Imagewidth for image - my $tab_size = shift(@_); # Replacement string for tab signs - my @source = @_; # Source code as passed via argument 2 - my $height; # Height as define by source size - my $overview; # Source code overview image data - my $col_plain_back; # Color for overview background - my $col_plain_text; # Color for uninstrumented text - my $col_cov_back; # Color for background of covered lines - my $col_cov_text; # Color for text of covered lines - my $col_nocov_back; # Color for background of lines which - # were not covered (count == 0) - my $col_nocov_text; # Color for test of lines which were not - # covered (count == 0) - my $col_hi_back; # Color for background of highlighted lines - my $col_hi_text; # Color for text of highlighted lines - my $line; # Current line during iteration - my $row = 0; # Current row number during iteration - my $column; # Current column number during iteration - my $color_text; # Current text color during iteration - my $color_back; # Current background color during iteration - my $last_count; # Count of last processed line - my $count; # Count of current line - my $source; # Source code of current line - my $replacement; # Replacement string for tabulator chars - local *PNG_HANDLE; # Handle for output PNG file - - # Handle empty source files - if (!@source) { - @source = ( "" ); - } - $height = scalar(@source); - # Create image - $overview = new GD::Image($overview_width, $height) - or die("ERROR: cannot allocate overview image!\n"); - - # Define colors - $col_plain_back = $overview->colorAllocate(0xff, 0xff, 0xff); - $col_plain_text = $overview->colorAllocate(0xaa, 0xaa, 0xaa); - $col_cov_back = $overview->colorAllocate(0xaa, 0xa7, 0xef); - $col_cov_text = $overview->colorAllocate(0x5d, 0x5d, 0xea); - $col_nocov_back = $overview->colorAllocate(0xff, 0x00, 0x00); - $col_nocov_text = $overview->colorAllocate(0xaa, 0x00, 0x00); - $col_hi_back = $overview->colorAllocate(0x00, 0xff, 0x00); - $col_hi_text = $overview->colorAllocate(0x00, 0xaa, 0x00); - - # Visualize each line - foreach $line (@source) - { - # Replace tabs with spaces to keep consistent with source - # code view - while ($line =~ /^([^\t]*)(\t)/) - { - $replacement = " "x($tab_size - ((length($1) - 1) % - $tab_size)); - $line =~ s/^([^\t]*)(\t)/$1$replacement/; - } - - # Skip lines which do not follow the <count>:<line> - # specification, otherwise $1 = count, $2 = source code - if (!($line =~ /(\*?)(\d*):(.*)$/)) { next; } - $count = $2; - $source = $3; - - # Decide which color pair to use - - # If this line was not instrumented but the one before was, - # take the color of that line to widen color areas in - # resulting image - if (($count eq "") && defined($last_count) && - ($last_count ne "")) - { - $count = $last_count; - } - - if ($count eq "") - { - # Line was not instrumented - $color_text = $col_plain_text; - $color_back = $col_plain_back; - } - elsif ($count == 0) - { - # Line was instrumented but not executed - $color_text = $col_nocov_text; - $color_back = $col_nocov_back; - } - elsif ($1 eq "*") - { - # Line was highlighted - $color_text = $col_hi_text; - $color_back = $col_hi_back; - } - else - { - # Line was instrumented and executed - $color_text = $col_cov_text; - $color_back = $col_cov_back; - } - - # Write one pixel for each source character - $column = 0; - foreach (split("", $source)) - { - # Check for width - if ($column >= $overview_width) { last; } - - if ($_ eq " ") - { - # Space - $overview->setPixel($column++, $row, - $color_back); - } - else - { - # Text - $overview->setPixel($column++, $row, - $color_text); - } - } - - # Fill rest of line - while ($column < $overview_width) - { - $overview->setPixel($column++, $row, $color_back); - } - - $last_count = $2; - - $row++; - } - - # Write PNG file - open (PNG_HANDLE, ">", $filename) - or die("ERROR: cannot write png file $filename!\n"); - binmode(*PNG_HANDLE); - print(PNG_HANDLE $overview->png()); - close(PNG_HANDLE); -} - -sub genpng_warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub genpng_die_handler($) -{ - my ($msg) = @_; - - die("$tool_name: $msg"); -} diff --git a/ThirdParty/lcov/bin/get_changes.sh b/ThirdParty/lcov/bin/get_changes.sh deleted file mode 100755 index ec373b4f4..000000000 --- a/ThirdParty/lcov/bin/get_changes.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash -# -# Usage: get_changes.sh -# -# Print lcov change log information as provided by Git - -TOOLDIR=$(cd $(dirname $0) >/dev/null ; pwd) - -cd $TOOLDIR - -if ! git --no-pager log --no-merges --decorate=short --color=never 2>/dev/null ; then - cat "$TOOLDIR/../CHANGES" 2>/dev/null -fi diff --git a/ThirdParty/lcov/bin/get_version.sh b/ThirdParty/lcov/bin/get_version.sh deleted file mode 100755 index ac5a36314..000000000 --- a/ThirdParty/lcov/bin/get_version.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash -# -# Usage: get_version.sh --version|--release|--full -# -# Print lcov version or release information as provided by Git, .version -# or a fallback. - -TOOLDIR=$(cd $(dirname $0) >/dev/null ; pwd) -GITVER=$(cd $TOOLDIR ; git describe --tags 2>/dev/null) - -if [ -z "$GITVER" ] ; then - # Get version information from file - if [ -e "$TOOLDIR/../.version" ] ; then - source "$TOOLDIR/../.version" - fi -else - # Get version information from git - FULL=${GITVER:1} - VERSION=${GITVER%%-*} - VERSION=${VERSION:1} - if [ "${GITVER#*-}" != "$GITVER" ] ; then - RELEASE=${GITVER#*-} - RELEASE=${RELEASE/-/.} - fi -fi - -# Fallback -[ -z "$VERSION" ] && VERSION="1.0" -[ -z "$RELEASE" ] && RELEASE="1" -[ -z "$FULL" ] && FULL="$VERSION" - -[ "$1" == "--version" ] && echo -n "$VERSION" -[ "$1" == "--release" ] && echo -n "$RELEASE" -[ "$1" == "--full" ] && echo -n "$FULL" diff --git a/ThirdParty/lcov/bin/install.sh b/ThirdParty/lcov/bin/install.sh deleted file mode 100755 index 2cdef45b6..000000000 --- a/ThirdParty/lcov/bin/install.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env bash -# -# install.sh [--uninstall] sourcefile targetfile [install options] -# - - -# Check for uninstall option -if test "x$1" == "x--uninstall" ; then - UNINSTALL=true - SOURCE=$2 - TARGET=$3 - shift 3 -else - UNINSTALL=false - SOURCE=$1 - TARGET=$2 - shift 2 -fi - -# Check usage -if test -z "$SOURCE" || test -z "$TARGET" ; then - echo Usage: install.sh [--uninstall] source target [install options] >&2 - exit 1 -fi - - -# -# do_install(SOURCE_FILE, TARGET_FILE) -# - -do_install() -{ - local SOURCE=$1 - local TARGET=$2 - local PARAMS=$3 - - install -d $(dirname $TARGET) - install -p $PARAMS $SOURCE $TARGET - if [ -n "$LCOV_PERL_PATH" ] ; then - # Replace Perl interpreter specification - sed -e "1 s%^#\!.*perl.*$%#\!$LCOV_PERL_PATH%" -i $TARGET - fi -} - - -# -# do_uninstall(SOURCE_FILE, TARGET_FILE) -# - -do_uninstall() -{ - local SOURCE=$1 - local TARGET=$2 - - # Does target exist? - if test -r $TARGET ; then - # Is target of the same version as this package? - if diff -I '^our \$lcov_version' -I '^\.TH ' -I '^#!' $SOURCE $TARGET >/dev/null; then - rm -f $TARGET - else - echo WARNING: Skipping uninstall for $TARGET - versions differ! >&2 - fi - else - echo WARNING: Skipping uninstall for $TARGET - not installed! >&2 - fi -} - - -# Call sub routine -if $UNINSTALL ; then - do_uninstall $SOURCE $TARGET -else - do_install $SOURCE $TARGET "$*" -fi - -exit 0 diff --git a/ThirdParty/lcov/bin/lcov b/ThirdParty/lcov/bin/lcov deleted file mode 100755 index 33c9f4d16..000000000 --- a/ThirdParty/lcov/bin/lcov +++ /dev/null @@ -1,4329 +0,0 @@ -#!/usr/bin/env perl -# -# Copyright (c) International Business Machines Corp., 2002,2012 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# -# lcov -# -# This is a wrapper script which provides a single interface for accessing -# LCOV coverage data. -# -# -# History: -# 2002-08-29 created by Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> -# IBM Lab Boeblingen -# 2002-09-05 / Peter Oberparleiter: implemented --kernel-directory + -# multiple directories -# 2002-10-16 / Peter Oberparleiter: implemented --add-tracefile option -# 2002-10-17 / Peter Oberparleiter: implemented --extract option -# 2002-11-04 / Peter Oberparleiter: implemented --list option -# 2003-03-07 / Paul Larson: Changed to make it work with the latest gcov -# kernel patch. This will break it with older gcov-kernel -# patches unless you change the value of $gcovmod in this script -# 2003-04-07 / Peter Oberparleiter: fixed bug which resulted in an error -# when trying to combine .info files containing data without -# a test name -# 2003-04-10 / Peter Oberparleiter: extended Paul's change so that LCOV -# works both with the new and the old gcov-kernel patch -# 2003-04-10 / Peter Oberparleiter: added $gcov_dir constant in anticipation -# of a possible move of the gcov kernel directory to another -# file system in a future version of the gcov-kernel patch -# 2003-04-15 / Paul Larson: make info write to STDERR, not STDOUT -# 2003-04-15 / Paul Larson: added --remove option -# 2003-04-30 / Peter Oberparleiter: renamed --reset to --zerocounters -# to remove naming ambiguity with --remove -# 2003-04-30 / Peter Oberparleiter: adjusted help text to include --remove -# 2003-06-27 / Peter Oberparleiter: implemented --diff -# 2003-07-03 / Peter Oberparleiter: added line checksum support, added -# --no-checksum -# 2003-12-11 / Laurent Deniel: added --follow option -# 2004-03-29 / Peter Oberparleiter: modified --diff option to better cope with -# ambiguous patch file entries, modified --capture option to use -# modprobe before insmod (needed for 2.6) -# 2004-03-30 / Peter Oberparleiter: added --path option -# 2004-08-09 / Peter Oberparleiter: added configuration file support -# 2008-08-13 / Peter Oberparleiter: added function coverage support -# - -use strict; -use warnings; -use File::Basename; -use File::Path; -use File::Find; -use File::Temp qw /tempdir/; -use File::Spec::Functions qw /abs2rel canonpath catdir catfile catpath - file_name_is_absolute rootdir splitdir splitpath/; -use Getopt::Long; -use Cwd qw /abs_path getcwd/; - - -# Global constants -our $tool_dir = abs_path(dirname($0)); -our $lcov_version = "LCOV version 1.14"; -our $lcov_url = "http://ltp.sourceforge.net/coverage/lcov.php"; -our $tool_name = basename($0); - -# Directory containing gcov kernel files -our $gcov_dir; - -# Where to create temporary directories -our $tmp_dir; - -# Internal constants -our $GKV_PROC = 0; # gcov-kernel data in /proc via external patch -our $GKV_SYS = 1; # gcov-kernel data in /sys via vanilla 2.6.31+ -our @GKV_NAME = ( "external", "upstream" ); -our $pkg_gkv_file = ".gcov_kernel_version"; -our $pkg_build_file = ".build_directory"; - -# Branch data combination types -our $BR_SUB = 0; -our $BR_ADD = 1; - -# Prototypes -sub print_usage(*); -sub check_options(); -sub userspace_reset(); -sub userspace_capture(); -sub kernel_reset(); -sub kernel_capture(); -sub kernel_capture_initial(); -sub package_capture(); -sub add_traces(); -sub read_info_file($); -sub get_info_entry($); -sub set_info_entry($$$$$$$$$;$$$$$$); -sub add_counts($$); -sub merge_checksums($$$); -sub combine_info_entries($$$); -sub combine_info_files($$); -sub write_info_file(*$); -sub extract(); -sub remove(); -sub list(); -sub get_common_filename($$); -sub read_diff($); -sub diff(); -sub system_no_output($@); -sub read_config($); -sub apply_config($); -sub info(@); -sub create_temp_dir(); -sub transform_pattern($); -sub warn_handler($); -sub die_handler($); -sub abort_handler($); -sub temp_cleanup(); -sub setup_gkv(); -sub get_overall_line($$$$); -sub print_overall_rate($$$$$$$$$); -sub lcov_geninfo(@); -sub create_package($$$;$); -sub get_func_found_and_hit($); -sub summary(); -sub rate($$;$$$); - -# Global variables & initialization -our @directory; # Specifies where to get coverage data from -our @kernel_directory; # If set, captures only from specified kernel subdirs -our @add_tracefile; # If set, reads in and combines all files in list -our $list; # If set, list contents of tracefile -our $extract; # If set, extracts parts of tracefile -our $remove; # If set, removes parts of tracefile -our $diff; # If set, modifies tracefile according to diff -our $reset; # If set, reset all coverage data to zero -our $capture; # If set, capture data -our $output_filename; # Name for file to write coverage data to -our $test_name = ""; # Test case name -our $quiet = ""; # If set, suppress information messages -our $help; # Help option flag -our $version; # Version option flag -our $convert_filenames; # If set, convert filenames when applying diff -our $strip; # If set, strip leading directories when applying diff -our $temp_dir_name; # Name of temporary directory -our $cwd = `pwd`; # Current working directory -our $data_stdout; # If set, indicates that data is written to stdout -our $follow; # If set, indicates that find shall follow links -our $diff_path = ""; # Path removed from tracefile when applying diff -our $base_directory; # Base directory (cwd of gcc during compilation) -our $checksum; # If set, calculate a checksum for each line -our $no_checksum; # If set, don't calculate a checksum for each line -our $compat_libtool; # If set, indicates that libtool mode is to be enabled -our $no_compat_libtool; # If set, indicates that libtool mode is to be disabled -our $gcov_tool; -our @opt_ignore_errors; -our $initial; -our @include_patterns; # List of source file patterns to include -our @exclude_patterns; # List of source file patterns to exclude -our $no_recursion = 0; -our $to_package; -our $from_package; -our $maxdepth; -our $no_markers; -our $config; # Configuration file contents -chomp($cwd); -our @temp_dirs; -our $gcov_gkv; # gcov kernel support version found on machine -our $opt_derive_func_data; -our $opt_debug; -our $opt_list_full_path; -our $opt_no_list_full_path; -our $opt_list_width = 80; -our $opt_list_truncate_max = 20; -our $opt_external; -our $opt_no_external; -our $opt_config_file; -our %opt_rc; -our @opt_summary; -our $opt_compat; -our $ln_overall_found; -our $ln_overall_hit; -our $fn_overall_found; -our $fn_overall_hit; -our $br_overall_found; -our $br_overall_hit; -our $func_coverage = 1; -our $br_coverage = 0; - - -# -# Code entry point -# - -$SIG{__WARN__} = \&warn_handler; -$SIG{__DIE__} = \&die_handler; -$SIG{'INT'} = \&abort_handler; -$SIG{'QUIT'} = \&abort_handler; - -# Check command line for a configuration file name -Getopt::Long::Configure("pass_through", "no_auto_abbrev"); -GetOptions("config-file=s" => \$opt_config_file, - "rc=s%" => \%opt_rc); -Getopt::Long::Configure("default"); - -{ - # Remove spaces around rc options - my %new_opt_rc; - - while (my ($key, $value) = each(%opt_rc)) { - $key =~ s/^\s+|\s+$//g; - $value =~ s/^\s+|\s+$//g; - - $new_opt_rc{$key} = $value; - } - %opt_rc = %new_opt_rc; -} - -# Read configuration file if available -if (defined($opt_config_file)) { - $config = read_config($opt_config_file); -} elsif (defined($ENV{"HOME"}) && (-r $ENV{"HOME"}."/.lcovrc")) -{ - $config = read_config($ENV{"HOME"}."/.lcovrc"); -} -elsif (-r "/etc/lcovrc") -{ - $config = read_config("/etc/lcovrc"); -} elsif (-r "/usr/local/etc/lcovrc") -{ - $config = read_config("/usr/local/etc/lcovrc"); -} - -if ($config || %opt_rc) -{ - # Copy configuration file and --rc values to variables - apply_config({ - "lcov_gcov_dir" => \$gcov_dir, - "lcov_tmp_dir" => \$tmp_dir, - "lcov_list_full_path" => \$opt_list_full_path, - "lcov_list_width" => \$opt_list_width, - "lcov_list_truncate_max"=> \$opt_list_truncate_max, - "lcov_branch_coverage" => \$br_coverage, - "lcov_function_coverage"=> \$func_coverage, - }); -} - -# Parse command line options -if (!GetOptions("directory|d|di=s" => \@directory, - "add-tracefile|a=s" => \@add_tracefile, - "list|l=s" => \$list, - "kernel-directory|k=s" => \@kernel_directory, - "extract|e=s" => \$extract, - "remove|r=s" => \$remove, - "diff=s" => \$diff, - "convert-filenames" => \$convert_filenames, - "strip=i" => \$strip, - "capture|c" => \$capture, - "output-file|o=s" => \$output_filename, - "test-name|t=s" => \$test_name, - "zerocounters|z" => \$reset, - "quiet|q" => \$quiet, - "help|h|?" => \$help, - "version|v" => \$version, - "follow|f" => \$follow, - "path=s" => \$diff_path, - "base-directory|b=s" => \$base_directory, - "checksum" => \$checksum, - "no-checksum" => \$no_checksum, - "compat-libtool" => \$compat_libtool, - "no-compat-libtool" => \$no_compat_libtool, - "gcov-tool=s" => \$gcov_tool, - "ignore-errors=s" => \@opt_ignore_errors, - "initial|i" => \$initial, - "include=s" => \@include_patterns, - "exclude=s" => \@exclude_patterns, - "no-recursion" => \$no_recursion, - "to-package=s" => \$to_package, - "from-package=s" => \$from_package, - "no-markers" => \$no_markers, - "derive-func-data" => \$opt_derive_func_data, - "debug" => \$opt_debug, - "list-full-path" => \$opt_list_full_path, - "no-list-full-path" => \$opt_no_list_full_path, - "external" => \$opt_external, - "no-external" => \$opt_no_external, - "summary=s" => \@opt_summary, - "compat=s" => \$opt_compat, - "config-file=s" => \$opt_config_file, - "rc=s%" => \%opt_rc, - )) -{ - print(STDERR "Use $tool_name --help to get usage information\n"); - exit(1); -} -else -{ - # Merge options - if (defined($no_checksum)) - { - $checksum = ($no_checksum ? 0 : 1); - $no_checksum = undef; - } - - if (defined($no_compat_libtool)) - { - $compat_libtool = ($no_compat_libtool ? 0 : 1); - $no_compat_libtool = undef; - } - - if (defined($opt_no_list_full_path)) - { - $opt_list_full_path = ($opt_no_list_full_path ? 0 : 1); - $opt_no_list_full_path = undef; - } - - if (defined($opt_no_external)) { - $opt_external = 0; - $opt_no_external = undef; - } -} - -# Check for help option -if ($help) -{ - print_usage(*STDOUT); - exit(0); -} - -# Check for version option -if ($version) -{ - print("$tool_name: $lcov_version\n"); - exit(0); -} - -# Check list width option -if ($opt_list_width <= 40) { - die("ERROR: lcov_list_width parameter out of range (needs to be ". - "larger than 40)\n"); -} - -# Normalize --path text -$diff_path =~ s/\/$//; - -if ($follow) -{ - $follow = "-follow"; -} -else -{ - $follow = ""; -} - -if ($no_recursion) -{ - $maxdepth = "-maxdepth 1"; -} -else -{ - $maxdepth = ""; -} - -# Check for valid options -check_options(); - -# Only --extract, --remove and --diff allow unnamed parameters -if (@ARGV && !($extract || $remove || $diff || @opt_summary)) -{ - die("Extra parameter found: '".join(" ", @ARGV)."'\n". - "Use $tool_name --help to get usage information\n"); -} - -# Check for output filename -$data_stdout = !($output_filename && ($output_filename ne "-")); - -if ($capture) -{ - if ($data_stdout) - { - # Option that tells geninfo to write to stdout - $output_filename = "-"; - } -} - -# Determine kernel directory for gcov data -if (!$from_package && !@directory && ($capture || $reset)) { - ($gcov_gkv, $gcov_dir) = setup_gkv(); -} - -# Check for requested functionality -if ($reset) -{ - $data_stdout = 0; - # Differentiate between user space and kernel reset - if (@directory) - { - userspace_reset(); - } - else - { - kernel_reset(); - } -} -elsif ($capture) -{ - # Capture source can be user space, kernel or package - if ($from_package) { - package_capture(); - } elsif (@directory) { - userspace_capture(); - } else { - if ($initial) { - if (defined($to_package)) { - die("ERROR: --initial cannot be used together ". - "with --to-package\n"); - } - kernel_capture_initial(); - } else { - kernel_capture(); - } - } -} -elsif (@add_tracefile) -{ - ($ln_overall_found, $ln_overall_hit, - $fn_overall_found, $fn_overall_hit, - $br_overall_found, $br_overall_hit) = add_traces(); -} -elsif ($remove) -{ - ($ln_overall_found, $ln_overall_hit, - $fn_overall_found, $fn_overall_hit, - $br_overall_found, $br_overall_hit) = remove(); -} -elsif ($extract) -{ - ($ln_overall_found, $ln_overall_hit, - $fn_overall_found, $fn_overall_hit, - $br_overall_found, $br_overall_hit) = extract(); -} -elsif ($list) -{ - $data_stdout = 0; - list(); -} -elsif ($diff) -{ - if (scalar(@ARGV) != 1) - { - die("ERROR: option --diff requires one additional argument!\n". - "Use $tool_name --help to get usage information\n"); - } - ($ln_overall_found, $ln_overall_hit, - $fn_overall_found, $fn_overall_hit, - $br_overall_found, $br_overall_hit) = diff(); -} -elsif (@opt_summary) -{ - $data_stdout = 0; - ($ln_overall_found, $ln_overall_hit, - $fn_overall_found, $fn_overall_hit, - $br_overall_found, $br_overall_hit) = summary(); -} - -temp_cleanup(); - -if (defined($ln_overall_found)) { - print_overall_rate(1, $ln_overall_found, $ln_overall_hit, - 1, $fn_overall_found, $fn_overall_hit, - 1, $br_overall_found, $br_overall_hit); -} else { - info("Done.\n") if (!$list && !$capture); -} -exit(0); - -# -# print_usage(handle) -# -# Print usage information. -# - -sub print_usage(*) -{ - local *HANDLE = $_[0]; - - print(HANDLE <<END_OF_USAGE); -Usage: $tool_name [OPTIONS] - -Use lcov to collect coverage data from either the currently running Linux -kernel or from a user space application. Specify the --directory option to -get coverage data for a user space program. - -Misc: - -h, --help Print this help, then exit - -v, --version Print version number, then exit - -q, --quiet Do not print progress messages - -Operation: - -z, --zerocounters Reset all execution counts to zero - -c, --capture Capture coverage data - -a, --add-tracefile FILE Add contents of tracefiles - -e, --extract FILE PATTERN Extract files matching PATTERN from FILE - -r, --remove FILE PATTERN Remove files matching PATTERN from FILE - -l, --list FILE List contents of tracefile FILE - --diff FILE DIFF Transform tracefile FILE according to DIFF - --summary FILE Show summary coverage data for tracefiles - -Options: - -i, --initial Capture initial zero coverage data - -t, --test-name NAME Specify test name to be stored with data - -o, --output-file FILENAME Write data to FILENAME instead of stdout - -d, --directory DIR Use .da files in DIR instead of kernel - -f, --follow Follow links when searching .da files - -k, --kernel-directory KDIR Capture kernel coverage data only from KDIR - -b, --base-directory DIR Use DIR as base directory for relative paths - --convert-filenames Convert filenames when applying diff - --strip DEPTH Strip initial DEPTH directory levels in diff - --path PATH Strip PATH from tracefile when applying diff - --(no-)checksum Enable (disable) line checksumming - --(no-)compat-libtool Enable (disable) libtool compatibility mode - --gcov-tool TOOL Specify gcov tool location - --ignore-errors ERRORS Continue after ERRORS (gcov, source, graph) - --no-recursion Exclude subdirectories from processing - --to-package FILENAME Store unprocessed coverage data in FILENAME - --from-package FILENAME Capture from unprocessed data in FILENAME - --no-markers Ignore exclusion markers in source code - --derive-func-data Generate function data from line data - --list-full-path Print full path during a list operation - --(no-)external Include (ignore) data for external files - --config-file FILENAME Specify configuration file location - --rc SETTING=VALUE Override configuration file setting - --compat MODE=on|off|auto Set compat MODE (libtool, hammer, split_crc) - --include PATTERN Include files matching PATTERN - --exclude PATTERN Exclude files matching PATTERN - -For more information see: $lcov_url -END_OF_USAGE - ; -} - - -# -# check_options() -# -# Check for valid combination of command line options. Die on error. -# - -sub check_options() -{ - my $i = 0; - - # Count occurrence of mutually exclusive options - $reset && $i++; - $capture && $i++; - @add_tracefile && $i++; - $extract && $i++; - $remove && $i++; - $list && $i++; - $diff && $i++; - @opt_summary && $i++; - - if ($i == 0) - { - die("Need one of options -z, -c, -a, -e, -r, -l, ". - "--diff or --summary\n". - "Use $tool_name --help to get usage information\n"); - } - elsif ($i > 1) - { - die("ERROR: only one of -z, -c, -a, -e, -r, -l, ". - "--diff or --summary allowed!\n". - "Use $tool_name --help to get usage information\n"); - } -} - - -# -# userspace_reset() -# -# Reset coverage data found in DIRECTORY by deleting all contained .da files. -# -# Die on error. -# - -sub userspace_reset() -{ - my $current_dir; - my @file_list; - - foreach $current_dir (@directory) - { - info("Deleting all .da files in $current_dir". - ($no_recursion?"\n":" and subdirectories\n")); - @file_list = `find "$current_dir" $maxdepth $follow -name \\*\\.da -type f -o -name \\*\\.gcda -type f 2>/dev/null`; - chomp(@file_list); - foreach (@file_list) - { - unlink($_) or die("ERROR: cannot remove file $_!\n"); - } - } -} - - -# -# userspace_capture() -# -# Capture coverage data found in DIRECTORY and write it to a package (if -# TO_PACKAGE specified) or to OUTPUT_FILENAME or STDOUT. -# -# Die on error. -# - -sub userspace_capture() -{ - my $dir; - my $build; - - if (!defined($to_package)) { - lcov_geninfo(@directory); - return; - } - if (scalar(@directory) != 1) { - die("ERROR: -d may be specified only once with --to-package\n"); - } - $dir = $directory[0]; - if (defined($base_directory)) { - $build = $base_directory; - } else { - $build = $dir; - } - create_package($to_package, $dir, $build); -} - - -# -# kernel_reset() -# -# Reset kernel coverage. -# -# Die on error. -# - -sub kernel_reset() -{ - local *HANDLE; - my $reset_file; - - info("Resetting kernel execution counters\n"); - if (-e "$gcov_dir/vmlinux") { - $reset_file = "$gcov_dir/vmlinux"; - } elsif (-e "$gcov_dir/reset") { - $reset_file = "$gcov_dir/reset"; - } else { - die("ERROR: no reset control found in $gcov_dir\n"); - } - open(HANDLE, ">", $reset_file) or - die("ERROR: cannot write to $reset_file!\n"); - print(HANDLE "0"); - close(HANDLE); -} - - -# -# lcov_copy_single(from, to) -# -# Copy single regular file FROM to TO without checking its size. This is -# required to work with special files generated by the kernel -# seq_file-interface. -# -# -sub lcov_copy_single($$) -{ - my ($from, $to) = @_; - my $content; - local $/; - local *HANDLE; - - open(HANDLE, "<", $from) or die("ERROR: cannot read $from: $!\n"); - $content = <HANDLE>; - close(HANDLE); - open(HANDLE, ">", $to) or die("ERROR: cannot write $from: $!\n"); - if (defined($content)) { - print(HANDLE $content); - } - close(HANDLE); -} - -# -# lcov_find(dir, function, data[, extension, ...)]) -# -# Search DIR for files and directories whose name matches PATTERN and run -# FUNCTION for each match. If not pattern is specified, match all names. -# -# FUNCTION has the following prototype: -# function(dir, relative_name, data) -# -# Where: -# dir: the base directory for this search -# relative_name: the name relative to the base directory of this entry -# data: the DATA variable passed to lcov_find -# -sub lcov_find($$$;@) -{ - my ($dir, $fn, $data, @pattern) = @_; - my $result; - my $_fn = sub { - my $filename = $File::Find::name; - - if (defined($result)) { - return; - } - $filename = abs2rel($filename, $dir); - foreach (@pattern) { - if ($filename =~ /$_/) { - goto ok; - } - } - return; - ok: - $result = &$fn($dir, $filename, $data); - }; - if (scalar(@pattern) == 0) { - @pattern = ".*"; - } - find( { wanted => $_fn, no_chdir => 1 }, $dir); - - return $result; -} - -# -# lcov_copy_fn(from, rel, to) -# -# Copy directories, files and links from/rel to to/rel. -# - -sub lcov_copy_fn($$$) -{ - my ($from, $rel, $to) = @_; - my $absfrom = canonpath(catfile($from, $rel)); - my $absto = canonpath(catfile($to, $rel)); - - if (-d) { - if (! -d $absto) { - mkpath($absto) or - die("ERROR: cannot create directory $absto\n"); - chmod(0700, $absto); - } - } elsif (-l) { - # Copy symbolic link - my $link = readlink($absfrom); - - if (!defined($link)) { - die("ERROR: cannot read link $absfrom: $!\n"); - } - symlink($link, $absto) or - die("ERROR: cannot create link $absto: $!\n"); - } else { - lcov_copy_single($absfrom, $absto); - chmod(0600, $absto); - } - return undef; -} - -# -# lcov_copy(from, to, subdirs) -# -# Copy all specified SUBDIRS and files from directory FROM to directory TO. For -# regular files, copy file contents without checking its size. This is required -# to work with seq_file-generated files. -# - -sub lcov_copy($$;@) -{ - my ($from, $to, @subdirs) = @_; - my @pattern; - - foreach (@subdirs) { - push(@pattern, "^$_"); - } - lcov_find($from, \&lcov_copy_fn, $to, @pattern); -} - -# -# lcov_geninfo(directory) -# -# Call geninfo for the specified directory and with the parameters specified -# at the command line. -# - -sub lcov_geninfo(@) -{ - my (@dir) = @_; - my @param; - - # Capture data - info("Capturing coverage data from ".join(" ", @dir)."\n"); - @param = ("$tool_dir/geninfo", @dir); - if ($output_filename) - { - @param = (@param, "--output-filename", $output_filename); - } - if ($test_name) - { - @param = (@param, "--test-name", $test_name); - } - if ($follow) - { - @param = (@param, "--follow"); - } - if ($quiet) - { - @param = (@param, "--quiet"); - } - if (defined($checksum)) - { - if ($checksum) - { - @param = (@param, "--checksum"); - } - else - { - @param = (@param, "--no-checksum"); - } - } - if ($base_directory) - { - @param = (@param, "--base-directory", $base_directory); - } - if ($no_compat_libtool) - { - @param = (@param, "--no-compat-libtool"); - } - elsif ($compat_libtool) - { - @param = (@param, "--compat-libtool"); - } - if ($gcov_tool) - { - @param = (@param, "--gcov-tool", $gcov_tool); - } - foreach (@opt_ignore_errors) { - @param = (@param, "--ignore-errors", $_); - } - if ($no_recursion) { - @param = (@param, "--no-recursion"); - } - if ($initial) - { - @param = (@param, "--initial"); - } - if ($no_markers) - { - @param = (@param, "--no-markers"); - } - if ($opt_derive_func_data) - { - @param = (@param, "--derive-func-data"); - } - if ($opt_debug) - { - @param = (@param, "--debug"); - } - if (defined($opt_external) && $opt_external) - { - @param = (@param, "--external"); - } - if (defined($opt_external) && !$opt_external) - { - @param = (@param, "--no-external"); - } - if (defined($opt_compat)) { - @param = (@param, "--compat", $opt_compat); - } - if (%opt_rc) { - foreach my $key (keys(%opt_rc)) { - @param = (@param, "--rc", "$key=".$opt_rc{$key}); - } - } - if (defined($opt_config_file)) { - @param = (@param, "--config-file", $opt_config_file); - } - foreach (@include_patterns) { - @param = (@param, "--include", $_); - } - foreach (@exclude_patterns) { - @param = (@param, "--exclude", $_); - } - - system(@param) and exit($? >> 8); -} - -# -# read_file(filename) -# -# Return the contents of the file defined by filename. -# - -sub read_file($) -{ - my ($filename) = @_; - my $content; - local $\; - local *HANDLE; - - open(HANDLE, "<", $filename) || return undef; - $content = <HANDLE>; - close(HANDLE); - - return $content; -} - -# -# get_package(package_file) -# -# Unpack unprocessed coverage data files from package_file to a temporary -# directory and return directory name, build directory and gcov kernel version -# as found in package. -# - -sub get_package($) -{ - my ($file) = @_; - my $dir = create_temp_dir(); - my $gkv; - my $build; - my $cwd = getcwd(); - my $count; - local *HANDLE; - - info("Reading package $file:\n"); - $file = abs_path($file); - chdir($dir); - open(HANDLE, "-|", "tar xvfz '$file' 2>/dev/null") - or die("ERROR: could not process package $file\n"); - $count = 0; - while (<HANDLE>) { - if (/\.da$/ || /\.gcda$/) { - $count++; - } - } - close(HANDLE); - if ($count == 0) { - die("ERROR: no data file found in package $file\n"); - } - info(" data directory .......: $dir\n"); - $build = read_file("$dir/$pkg_build_file"); - if (defined($build)) { - info(" build directory ......: $build\n"); - } - $gkv = read_file("$dir/$pkg_gkv_file"); - if (defined($gkv)) { - $gkv = int($gkv); - if ($gkv != $GKV_PROC && $gkv != $GKV_SYS) { - die("ERROR: unsupported gcov kernel version found ". - "($gkv)\n"); - } - info(" content type .........: kernel data\n"); - info(" gcov kernel version ..: %s\n", $GKV_NAME[$gkv]); - } else { - info(" content type .........: application data\n"); - } - info(" data files ...........: $count\n"); - chdir($cwd); - - return ($dir, $build, $gkv); -} - -# -# write_file(filename, $content) -# -# Create a file named filename and write the specified content to it. -# - -sub write_file($$) -{ - my ($filename, $content) = @_; - local *HANDLE; - - open(HANDLE, ">", $filename) || return 0; - print(HANDLE $content); - close(HANDLE) || return 0; - - return 1; -} - -# count_package_data(filename) -# -# Count the number of coverage data files in the specified package file. -# - -sub count_package_data($) -{ - my ($filename) = @_; - local *HANDLE; - my $count = 0; - - open(HANDLE, "-|", "tar tfz '$filename'") or return undef; - while (<HANDLE>) { - if (/\.da$/ || /\.gcda$/) { - $count++; - } - } - close(HANDLE); - return $count; -} - -# -# create_package(package_file, source_directory, build_directory[, -# kernel_gcov_version]) -# -# Store unprocessed coverage data files from source_directory to package_file. -# - -sub create_package($$$;$) -{ - my ($file, $dir, $build, $gkv) = @_; - my $cwd = getcwd(); - - # Check for availability of tar tool first - system("tar --help > /dev/null") - and die("ERROR: tar command not available\n"); - - # Print information about the package - info("Creating package $file:\n"); - info(" data directory .......: $dir\n"); - - # Handle build directory - if (defined($build)) { - info(" build directory ......: $build\n"); - write_file("$dir/$pkg_build_file", $build) - or die("ERROR: could not write to ". - "$dir/$pkg_build_file\n"); - } - - # Handle gcov kernel version data - if (defined($gkv)) { - info(" content type .........: kernel data\n"); - info(" gcov kernel version ..: %s\n", $GKV_NAME[$gkv]); - write_file("$dir/$pkg_gkv_file", $gkv) - or die("ERROR: could not write to ". - "$dir/$pkg_gkv_file\n"); - } else { - info(" content type .........: application data\n"); - } - - # Create package - $file = abs_path($file); - chdir($dir); - system("tar cfz $file .") - and die("ERROR: could not create package $file\n"); - chdir($cwd); - - # Remove temporary files - unlink("$dir/$pkg_build_file"); - unlink("$dir/$pkg_gkv_file"); - - # Show number of data files - if (!$quiet) { - my $count = count_package_data($file); - - if (defined($count)) { - info(" data files ...........: $count\n"); - } - } -} - -sub find_link_fn($$$) -{ - my ($from, $rel, $filename) = @_; - my $absfile = catfile($from, $rel, $filename); - - if (-l $absfile) { - return $absfile; - } - return undef; -} - -# -# get_base(dir) -# -# Return (BASE, OBJ), where -# - BASE: is the path to the kernel base directory relative to dir -# - OBJ: is the absolute path to the kernel build directory -# - -sub get_base($) -{ - my ($dir) = @_; - my $marker = "kernel/gcov/base.gcno"; - my $markerfile; - my $sys; - my $obj; - my $link; - - $markerfile = lcov_find($dir, \&find_link_fn, $marker); - if (!defined($markerfile)) { - return (undef, undef); - } - - # sys base is parent of parent of markerfile. - $sys = abs2rel(dirname(dirname(dirname($markerfile))), $dir); - - # obj base is parent of parent of markerfile link target. - $link = readlink($markerfile); - if (!defined($link)) { - die("ERROR: could not read $markerfile\n"); - } - $obj = dirname(dirname(dirname($link))); - - return ($sys, $obj); -} - -# -# apply_base_dir(data_dir, base_dir, build_dir, @directories) -# -# Make entries in @directories relative to data_dir. -# - -sub apply_base_dir($$$@) -{ - my ($data, $base, $build, @dirs) = @_; - my $dir; - my @result; - - foreach $dir (@dirs) { - # Is directory path relative to data directory? - if (-d catdir($data, $dir)) { - push(@result, $dir); - next; - } - # Relative to the auto-detected base-directory? - if (defined($base)) { - if (-d catdir($data, $base, $dir)) { - push(@result, catdir($base, $dir)); - next; - } - } - # Relative to the specified base-directory? - if (defined($base_directory)) { - if (file_name_is_absolute($base_directory)) { - $base = abs2rel($base_directory, rootdir()); - } else { - $base = $base_directory; - } - if (-d catdir($data, $base, $dir)) { - push(@result, catdir($base, $dir)); - next; - } - } - # Relative to the build directory? - if (defined($build)) { - if (file_name_is_absolute($build)) { - $base = abs2rel($build, rootdir()); - } else { - $base = $build; - } - if (-d catdir($data, $base, $dir)) { - push(@result, catdir($base, $dir)); - next; - } - } - die("ERROR: subdirectory $dir not found\n". - "Please use -b to specify the correct directory\n"); - } - return @result; -} - -# -# copy_gcov_dir(dir, [@subdirectories]) -# -# Create a temporary directory and copy all or, if specified, only some -# subdirectories from dir to that directory. Return the name of the temporary -# directory. -# - -sub copy_gcov_dir($;@) -{ - my ($data, @dirs) = @_; - my $tempdir = create_temp_dir(); - - info("Copying data to temporary directory $tempdir\n"); - lcov_copy($data, $tempdir, @dirs); - - return $tempdir; -} - -# -# kernel_capture_initial -# -# Capture initial kernel coverage data, i.e. create a coverage data file from -# static graph files which contains zero coverage data for all instrumented -# lines. -# - -sub kernel_capture_initial() -{ - my $build; - my $source; - my @params; - - if (defined($base_directory)) { - $build = $base_directory; - $source = "specified"; - } else { - (undef, $build) = get_base($gcov_dir); - if (!defined($build)) { - die("ERROR: could not auto-detect build directory.\n". - "Please use -b to specify the build directory\n"); - } - $source = "auto-detected"; - } - info("Using $build as kernel build directory ($source)\n"); - # Build directory needs to be passed to geninfo - $base_directory = $build; - if (@kernel_directory) { - foreach my $dir (@kernel_directory) { - push(@params, "$build/$dir"); - } - } else { - push(@params, $build); - } - lcov_geninfo(@params); -} - -# -# kernel_capture_from_dir(directory, gcov_kernel_version, build) -# -# Perform the actual kernel coverage capturing from the specified directory -# assuming that the data was copied from the specified gcov kernel version. -# - -sub kernel_capture_from_dir($$$) -{ - my ($dir, $gkv, $build) = @_; - - # Create package or coverage file - if (defined($to_package)) { - create_package($to_package, $dir, $build, $gkv); - } else { - # Build directory needs to be passed to geninfo - $base_directory = $build; - lcov_geninfo($dir); - } -} - -# -# adjust_kernel_dir(dir, build) -# -# Adjust directories specified with -k so that they point to the directory -# relative to DIR. Return the build directory if specified or the auto- -# detected build-directory. -# - -sub adjust_kernel_dir($$) -{ - my ($dir, $build) = @_; - my ($sys_base, $build_auto) = get_base($dir); - - if (!defined($build)) { - $build = $build_auto; - } - if (!defined($build)) { - die("ERROR: could not auto-detect build directory.\n". - "Please use -b to specify the build directory\n"); - } - # Make @kernel_directory relative to sysfs base - if (@kernel_directory) { - @kernel_directory = apply_base_dir($dir, $sys_base, $build, - @kernel_directory); - } - return $build; -} - -sub kernel_capture() -{ - my $data_dir; - my $build = $base_directory; - - if ($gcov_gkv == $GKV_SYS) { - $build = adjust_kernel_dir($gcov_dir, $build); - } - $data_dir = copy_gcov_dir($gcov_dir, @kernel_directory); - kernel_capture_from_dir($data_dir, $gcov_gkv, $build); -} - -# -# link_data_cb(datadir, rel, graphdir) -# -# Create symbolic link in GRAPDIR/REL pointing to DATADIR/REL. -# - -sub link_data_cb($$$) -{ - my ($datadir, $rel, $graphdir) = @_; - my $absfrom = catfile($datadir, $rel); - my $absto = catfile($graphdir, $rel); - my $base; - my $dir; - - if (-e $absto) { - die("ERROR: could not create symlink at $absto: ". - "File already exists!\n"); - } - if (-l $absto) { - # Broken link - possibly from an interrupted earlier run - unlink($absto); - } - - # Check for graph file - $base = $absto; - $base =~ s/\.(gcda|da)$//; - if (! -e $base.".gcno" && ! -e $base.".bbg" && ! -e $base.".bb") { - die("ERROR: No graph file found for $absfrom in ". - dirname($base)."!\n"); - } - - symlink($absfrom, $absto) or - die("ERROR: could not create symlink at $absto: $!\n"); -} - -# -# unlink_data_cb(datadir, rel, graphdir) -# -# Remove symbolic link from GRAPHDIR/REL to DATADIR/REL. -# - -sub unlink_data_cb($$$) -{ - my ($datadir, $rel, $graphdir) = @_; - my $absfrom = catfile($datadir, $rel); - my $absto = catfile($graphdir, $rel); - my $target; - - return if (!-l $absto); - $target = readlink($absto); - return if (!defined($target) || $target ne $absfrom); - - unlink($absto) or - warn("WARNING: could not remove symlink $absto: $!\n"); -} - -# -# link_data(datadir, graphdir, create) -# -# If CREATE is non-zero, create symbolic links in GRAPHDIR for data files -# found in DATADIR. Otherwise remove link in GRAPHDIR. -# - -sub link_data($$$) -{ - my ($datadir, $graphdir, $create) = @_; - - $datadir = abs_path($datadir); - $graphdir = abs_path($graphdir); - if ($create) { - lcov_find($datadir, \&link_data_cb, $graphdir, '\.gcda$', - '\.da$'); - } else { - lcov_find($datadir, \&unlink_data_cb, $graphdir, '\.gcda$', - '\.da$'); - } -} - -# -# find_graph_cb(datadir, rel, count_ref) -# -# Count number of files found. -# - -sub find_graph_cb($$$) -{ - my ($dir, $rel, $count_ref) = @_; - - ($$count_ref)++; -} - -# -# find_graph(dir) -# -# Search DIR for a graph file. Return non-zero if one was found, zero otherwise. -# - -sub find_graph($) -{ - my ($dir) = @_; - my $count = 0; - - lcov_find($dir, \&find_graph_cb, \$count, '\.gcno$', '\.bb$', '\.bbg$'); - - return $count > 0 ? 1 : 0; -} - -# -# package_capture() -# -# Capture coverage data from a package of unprocessed coverage data files -# as generated by lcov --to-package. -# - -sub package_capture() -{ - my $dir; - my $build; - my $gkv; - - ($dir, $build, $gkv) = get_package($from_package); - - # Check for build directory - if (defined($base_directory)) { - if (defined($build)) { - info("Using build directory specified by -b.\n"); - } - $build = $base_directory; - } - - # Do the actual capture - if (defined($gkv)) { - if ($gkv == $GKV_SYS) { - $build = adjust_kernel_dir($dir, $build); - } - if (@kernel_directory) { - $dir = copy_gcov_dir($dir, @kernel_directory); - } - kernel_capture_from_dir($dir, $gkv, $build); - } else { - # Build directory needs to be passed to geninfo - $base_directory = $build; - if (find_graph($dir)) { - # Package contains graph files - collect from there - lcov_geninfo($dir); - } else { - # No graph files found, link data files next to - # graph files - link_data($dir, $base_directory, 1); - lcov_geninfo($base_directory); - link_data($dir, $base_directory, 0); - } - } -} - - -# -# info(printf_parameter) -# -# Use printf to write PRINTF_PARAMETER to stdout only when the $quiet flag -# is not set. -# - -sub info(@) -{ - if (!$quiet) - { - # Print info string - if (!$data_stdout) - { - printf(@_) - } - else - { - # Don't interfere with the .info output to STDOUT - printf(STDERR @_); - } - } -} - - -# -# create_temp_dir() -# -# Create a temporary directory and return its path. -# -# Die on error. -# - -sub create_temp_dir() -{ - my $dir; - - if (defined($tmp_dir)) { - $dir = tempdir(DIR => $tmp_dir, CLEANUP => 1); - } else { - $dir = tempdir(CLEANUP => 1); - } - if (!defined($dir)) { - die("ERROR: cannot create temporary directory\n"); - } - push(@temp_dirs, $dir); - - return $dir; -} - -sub compress_brcount($) -{ - my ($brcount) = @_; - my $db; - - $db = brcount_to_db($brcount); - return db_to_brcount($db, $brcount); -} - -sub get_br_found_and_hit($) -{ - my ($brcount) = @_; - my $db; - - $db = brcount_to_db($brcount); - - return brcount_db_get_found_and_hit($db); -} - - -# -# read_info_file(info_filename) -# -# Read in the contents of the .info file specified by INFO_FILENAME. Data will -# be returned as a reference to a hash containing the following mappings: -# -# %result: for each filename found in file -> \%data -# -# %data: "test" -> \%testdata -# "sum" -> \%sumcount -# "func" -> \%funcdata -# "found" -> $lines_found (number of instrumented lines found in file) -# "hit" -> $lines_hit (number of executed lines in file) -# "f_found" -> $fn_found (number of instrumented functions found in file) -# "f_hit" -> $fn_hit (number of executed functions in file) -# "b_found" -> $br_found (number of instrumented branches found in file) -# "b_hit" -> $br_hit (number of executed branches in file) -# "check" -> \%checkdata -# "testfnc" -> \%testfncdata -# "sumfnc" -> \%sumfnccount -# "testbr" -> \%testbrdata -# "sumbr" -> \%sumbrcount -# -# %testdata : name of test affecting this file -> \%testcount -# %testfncdata: name of test affecting this file -> \%testfnccount -# %testbrdata: name of test affecting this file -> \%testbrcount -# -# %testcount : line number -> execution count for a single test -# %testfnccount: function name -> execution count for a single test -# %testbrcount : line number -> branch coverage data for a single test -# %sumcount : line number -> execution count for all tests -# %sumfnccount : function name -> execution count for all tests -# %sumbrcount : line number -> branch coverage data for all tests -# %funcdata : function name -> line number -# %checkdata : line number -> checksum of source code line -# $brdata : text "block,branch,taken:..." -# -# Note that .info file sections referring to the same file and test name -# will automatically be combined by adding all execution counts. -# -# Note that if INFO_FILENAME ends with ".gz", it is assumed that the file -# is compressed using GZIP. If available, GUNZIP will be used to decompress -# this file. -# -# Die on error. -# - -sub read_info_file($) -{ - my $tracefile = $_[0]; # Name of tracefile - my %result; # Resulting hash: file -> data - my $data; # Data handle for current entry - my $testdata; # " " - my $testcount; # " " - my $sumcount; # " " - my $funcdata; # " " - my $checkdata; # " " - my $testfncdata; - my $testfnccount; - my $sumfnccount; - my $testbrdata; - my $testbrcount; - my $sumbrcount; - my $line; # Current line read from .info file - my $testname; # Current test name - my $filename; # Current filename - my $hitcount; # Count for lines hit - my $count; # Execution count of current line - my $negative; # If set, warn about negative counts - my $changed_testname; # If set, warn about changed testname - my $line_checksum; # Checksum of current line - local *INFO_HANDLE; # Filehandle for .info file - - info("Reading tracefile $tracefile\n"); - - # Check if file exists and is readable - stat($_[0]); - if (!(-r _)) - { - die("ERROR: cannot read file $_[0]!\n"); - } - - # Check if this is really a plain file - if (!(-f _)) - { - die("ERROR: not a plain file: $_[0]!\n"); - } - - # Check for .gz extension - if ($_[0] =~ /\.gz$/) - { - # Check for availability of GZIP tool - system_no_output(1, "gunzip" ,"-h") - and die("ERROR: gunzip command not available!\n"); - - # Check integrity of compressed file - system_no_output(1, "gunzip", "-t", $_[0]) - and die("ERROR: integrity check failed for ". - "compressed file $_[0]!\n"); - - # Open compressed file - open(INFO_HANDLE, "-|", "gunzip -c '$_[0]'") - or die("ERROR: cannot start gunzip to decompress ". - "file $_[0]!\n"); - } - else - { - # Open decompressed file - open(INFO_HANDLE, "<", $_[0]) - or die("ERROR: cannot read file $_[0]!\n"); - } - - $testname = ""; - while (<INFO_HANDLE>) - { - chomp($_); - $line = $_; - - # Switch statement - foreach ($line) - { - /^TN:([^,]*)(,diff)?/ && do - { - # Test name information found - $testname = defined($1) ? $1 : ""; - if ($testname =~ s/\W/_/g) - { - $changed_testname = 1; - } - $testname .= $2 if (defined($2)); - last; - }; - - /^[SK]F:(.*)/ && do - { - # Filename information found - # Retrieve data for new entry - $filename = $1; - - $data = $result{$filename}; - ($testdata, $sumcount, $funcdata, $checkdata, - $testfncdata, $sumfnccount, $testbrdata, - $sumbrcount) = - get_info_entry($data); - - if (defined($testname)) - { - $testcount = $testdata->{$testname}; - $testfnccount = $testfncdata->{$testname}; - $testbrcount = $testbrdata->{$testname}; - } - else - { - $testcount = {}; - $testfnccount = {}; - $testbrcount = {}; - } - last; - }; - - /^DA:(\d+),(-?\d+)(,[^,\s]+)?/ && do - { - # Fix negative counts - $count = $2 < 0 ? 0 : $2; - if ($2 < 0) - { - $negative = 1; - } - # Execution count found, add to structure - # Add summary counts - $sumcount->{$1} += $count; - - # Add test-specific counts - if (defined($testname)) - { - $testcount->{$1} += $count; - } - - # Store line checksum if available - if (defined($3)) - { - $line_checksum = substr($3, 1); - - # Does it match a previous definition - if (defined($checkdata->{$1}) && - ($checkdata->{$1} ne - $line_checksum)) - { - die("ERROR: checksum mismatch ". - "at $filename:$1\n"); - } - - $checkdata->{$1} = $line_checksum; - } - last; - }; - - /^FN:(\d+),([^,]+)/ && do - { - last if (!$func_coverage); - - # Function data found, add to structure - $funcdata->{$2} = $1; - - # Also initialize function call data - if (!defined($sumfnccount->{$2})) { - $sumfnccount->{$2} = 0; - } - if (defined($testname)) - { - if (!defined($testfnccount->{$2})) { - $testfnccount->{$2} = 0; - } - } - last; - }; - - /^FNDA:(\d+),([^,]+)/ && do - { - last if (!$func_coverage); - - # Function call count found, add to structure - # Add summary counts - $sumfnccount->{$2} += $1; - - # Add test-specific counts - if (defined($testname)) - { - $testfnccount->{$2} += $1; - } - last; - }; - - /^BRDA:(\d+),(\d+),(\d+),(\d+|-)/ && do { - # Branch coverage data found - my ($line, $block, $branch, $taken) = - ($1, $2, $3, $4); - - last if (!$br_coverage); - $sumbrcount->{$line} .= - "$block,$branch,$taken:"; - - # Add test-specific counts - if (defined($testname)) { - $testbrcount->{$line} .= - "$block,$branch,$taken:"; - } - last; - }; - - /^end_of_record/ && do - { - # Found end of section marker - if ($filename) - { - # Store current section data - if (defined($testname)) - { - $testdata->{$testname} = - $testcount; - $testfncdata->{$testname} = - $testfnccount; - $testbrdata->{$testname} = - $testbrcount; - } - - set_info_entry($data, $testdata, - $sumcount, $funcdata, - $checkdata, $testfncdata, - $sumfnccount, - $testbrdata, - $sumbrcount); - $result{$filename} = $data; - last; - } - }; - - # default - last; - } - } - close(INFO_HANDLE); - - # Calculate hit and found values for lines and functions of each file - foreach $filename (keys(%result)) - { - $data = $result{$filename}; - - ($testdata, $sumcount, undef, undef, $testfncdata, - $sumfnccount, $testbrdata, $sumbrcount) = - get_info_entry($data); - - # Filter out empty files - if (scalar(keys(%{$sumcount})) == 0) - { - delete($result{$filename}); - next; - } - # Filter out empty test cases - foreach $testname (keys(%{$testdata})) - { - if (!defined($testdata->{$testname}) || - scalar(keys(%{$testdata->{$testname}})) == 0) - { - delete($testdata->{$testname}); - delete($testfncdata->{$testname}); - } - } - - $data->{"found"} = scalar(keys(%{$sumcount})); - $hitcount = 0; - - foreach (keys(%{$sumcount})) - { - if ($sumcount->{$_} > 0) { $hitcount++; } - } - - $data->{"hit"} = $hitcount; - - # Get found/hit values for function call data - $data->{"f_found"} = scalar(keys(%{$sumfnccount})); - $hitcount = 0; - - foreach (keys(%{$sumfnccount})) { - if ($sumfnccount->{$_} > 0) { - $hitcount++; - } - } - $data->{"f_hit"} = $hitcount; - - # Combine branch data for the same branches - (undef, $data->{"b_found"}, $data->{"b_hit"}) = - compress_brcount($sumbrcount); - foreach $testname (keys(%{$testbrdata})) { - compress_brcount($testbrdata->{$testname}); - } - } - - if (scalar(keys(%result)) == 0) - { - die("ERROR: no valid records found in tracefile $tracefile\n"); - } - if ($negative) - { - warn("WARNING: negative counts found in tracefile ". - "$tracefile\n"); - } - if ($changed_testname) - { - warn("WARNING: invalid characters removed from testname in ". - "tracefile $tracefile\n"); - } - - return(\%result); -} - - -# -# get_info_entry(hash_ref) -# -# Retrieve data from an entry of the structure generated by read_info_file(). -# Return a list of references to hashes: -# (test data hash ref, sum count hash ref, funcdata hash ref, checkdata hash -# ref, testfncdata hash ref, sumfnccount hash ref, testbrdata hash ref, -# sumbrcount hash ref, lines found, lines hit, functions found, -# functions hit, branches found, branches hit) -# - -sub get_info_entry($) -{ - my $testdata_ref = $_[0]->{"test"}; - my $sumcount_ref = $_[0]->{"sum"}; - my $funcdata_ref = $_[0]->{"func"}; - my $checkdata_ref = $_[0]->{"check"}; - my $testfncdata = $_[0]->{"testfnc"}; - my $sumfnccount = $_[0]->{"sumfnc"}; - my $testbrdata = $_[0]->{"testbr"}; - my $sumbrcount = $_[0]->{"sumbr"}; - my $lines_found = $_[0]->{"found"}; - my $lines_hit = $_[0]->{"hit"}; - my $f_found = $_[0]->{"f_found"}; - my $f_hit = $_[0]->{"f_hit"}; - my $br_found = $_[0]->{"b_found"}; - my $br_hit = $_[0]->{"b_hit"}; - - return ($testdata_ref, $sumcount_ref, $funcdata_ref, $checkdata_ref, - $testfncdata, $sumfnccount, $testbrdata, $sumbrcount, - $lines_found, $lines_hit, $f_found, $f_hit, - $br_found, $br_hit); -} - - -# -# set_info_entry(hash_ref, testdata_ref, sumcount_ref, funcdata_ref, -# checkdata_ref, testfncdata_ref, sumfcncount_ref, -# testbrdata_ref, sumbrcount_ref[,lines_found, -# lines_hit, f_found, f_hit, $b_found, $b_hit]) -# -# Update the hash referenced by HASH_REF with the provided data references. -# - -sub set_info_entry($$$$$$$$$;$$$$$$) -{ - my $data_ref = $_[0]; - - $data_ref->{"test"} = $_[1]; - $data_ref->{"sum"} = $_[2]; - $data_ref->{"func"} = $_[3]; - $data_ref->{"check"} = $_[4]; - $data_ref->{"testfnc"} = $_[5]; - $data_ref->{"sumfnc"} = $_[6]; - $data_ref->{"testbr"} = $_[7]; - $data_ref->{"sumbr"} = $_[8]; - - if (defined($_[9])) { $data_ref->{"found"} = $_[9]; } - if (defined($_[10])) { $data_ref->{"hit"} = $_[10]; } - if (defined($_[11])) { $data_ref->{"f_found"} = $_[11]; } - if (defined($_[12])) { $data_ref->{"f_hit"} = $_[12]; } - if (defined($_[13])) { $data_ref->{"b_found"} = $_[13]; } - if (defined($_[14])) { $data_ref->{"b_hit"} = $_[14]; } -} - - -# -# add_counts(data1_ref, data2_ref) -# -# DATA1_REF and DATA2_REF are references to hashes containing a mapping -# -# line number -> execution count -# -# Return a list (RESULT_REF, LINES_FOUND, LINES_HIT) where RESULT_REF -# is a reference to a hash containing the combined mapping in which -# execution counts are added. -# - -sub add_counts($$) -{ - my $data1_ref = $_[0]; # Hash 1 - my $data2_ref = $_[1]; # Hash 2 - my %result; # Resulting hash - my $line; # Current line iteration scalar - my $data1_count; # Count of line in hash1 - my $data2_count; # Count of line in hash2 - my $found = 0; # Total number of lines found - my $hit = 0; # Number of lines with a count > 0 - - foreach $line (keys(%$data1_ref)) - { - $data1_count = $data1_ref->{$line}; - $data2_count = $data2_ref->{$line}; - - # Add counts if present in both hashes - if (defined($data2_count)) { $data1_count += $data2_count; } - - # Store sum in %result - $result{$line} = $data1_count; - - $found++; - if ($data1_count > 0) { $hit++; } - } - - # Add lines unique to data2_ref - foreach $line (keys(%$data2_ref)) - { - # Skip lines already in data1_ref - if (defined($data1_ref->{$line})) { next; } - - # Copy count from data2_ref - $result{$line} = $data2_ref->{$line}; - - $found++; - if ($result{$line} > 0) { $hit++; } - } - - return (\%result, $found, $hit); -} - - -# -# merge_checksums(ref1, ref2, filename) -# -# REF1 and REF2 are references to hashes containing a mapping -# -# line number -> checksum -# -# Merge checksum lists defined in REF1 and REF2 and return reference to -# resulting hash. Die if a checksum for a line is defined in both hashes -# but does not match. -# - -sub merge_checksums($$$) -{ - my $ref1 = $_[0]; - my $ref2 = $_[1]; - my $filename = $_[2]; - my %result; - my $line; - - foreach $line (keys(%{$ref1})) - { - if (defined($ref2->{$line}) && - ($ref1->{$line} ne $ref2->{$line})) - { - die("ERROR: checksum mismatch at $filename:$line\n"); - } - $result{$line} = $ref1->{$line}; - } - - foreach $line (keys(%{$ref2})) - { - $result{$line} = $ref2->{$line}; - } - - return \%result; -} - - -# -# merge_func_data(funcdata1, funcdata2, filename) -# - -sub merge_func_data($$$) -{ - my ($funcdata1, $funcdata2, $filename) = @_; - my %result; - my $func; - - if (defined($funcdata1)) { - %result = %{$funcdata1}; - } - - foreach $func (keys(%{$funcdata2})) { - my $line1 = $result{$func}; - my $line2 = $funcdata2->{$func}; - - if (defined($line1) && ($line1 != $line2)) { - warn("WARNING: function data mismatch at ". - "$filename:$line2\n"); - next; - } - $result{$func} = $line2; - } - - return \%result; -} - - -# -# add_fnccount(fnccount1, fnccount2) -# -# Add function call count data. Return list (fnccount_added, f_found, f_hit) -# - -sub add_fnccount($$) -{ - my ($fnccount1, $fnccount2) = @_; - my %result; - my $f_found; - my $f_hit; - my $function; - - if (defined($fnccount1)) { - %result = %{$fnccount1}; - } - foreach $function (keys(%{$fnccount2})) { - $result{$function} += $fnccount2->{$function}; - } - $f_found = scalar(keys(%result)); - $f_hit = 0; - foreach $function (keys(%result)) { - if ($result{$function} > 0) { - $f_hit++; - } - } - - return (\%result, $f_found, $f_hit); -} - -# -# add_testfncdata(testfncdata1, testfncdata2) -# -# Add function call count data for several tests. Return reference to -# added_testfncdata. -# - -sub add_testfncdata($$) -{ - my ($testfncdata1, $testfncdata2) = @_; - my %result; - my $testname; - - foreach $testname (keys(%{$testfncdata1})) { - if (defined($testfncdata2->{$testname})) { - my $fnccount; - - # Function call count data for this testname exists - # in both data sets: merge - ($fnccount) = add_fnccount( - $testfncdata1->{$testname}, - $testfncdata2->{$testname}); - $result{$testname} = $fnccount; - next; - } - # Function call count data for this testname is unique to - # data set 1: copy - $result{$testname} = $testfncdata1->{$testname}; - } - - # Add count data for testnames unique to data set 2 - foreach $testname (keys(%{$testfncdata2})) { - if (!defined($result{$testname})) { - $result{$testname} = $testfncdata2->{$testname}; - } - } - return \%result; -} - - -# -# brcount_to_db(brcount) -# -# Convert brcount data to the following format: -# -# db: line number -> block hash -# block hash: block number -> branch hash -# branch hash: branch number -> taken value -# - -sub brcount_to_db($) -{ - my ($brcount) = @_; - my $line; - my $db = {}; - - # Add branches to database - foreach $line (keys(%{$brcount})) { - my $brdata = $brcount->{$line}; - - foreach my $entry (split(/:/, $brdata)) { - my ($block, $branch, $taken) = split(/,/, $entry); - my $old = $db->{$line}->{$block}->{$branch}; - - if (!defined($old) || $old eq "-") { - $old = $taken; - } elsif ($taken ne "-") { - $old += $taken; - } - - $db->{$line}->{$block}->{$branch} = $old; - } - } - - return $db; -} - - -# -# db_to_brcount(db[, brcount]) -# -# Convert branch coverage data back to brcount format. If brcount is specified, -# the converted data is directly inserted in brcount. -# - -sub db_to_brcount($;$) -{ - my ($db, $brcount) = @_; - my $line; - my $br_found = 0; - my $br_hit = 0; - - # Convert database back to brcount format - foreach $line (sort({$a <=> $b} keys(%{$db}))) { - my $ldata = $db->{$line}; - my $brdata; - my $block; - - foreach $block (sort({$a <=> $b} keys(%{$ldata}))) { - my $bdata = $ldata->{$block}; - my $branch; - - foreach $branch (sort({$a <=> $b} keys(%{$bdata}))) { - my $taken = $bdata->{$branch}; - - $br_found++; - $br_hit++ if ($taken ne "-" && $taken > 0); - $brdata .= "$block,$branch,$taken:"; - } - } - $brcount->{$line} = $brdata; - } - - return ($brcount, $br_found, $br_hit); -} - - -# -# brcount_db_combine(db1, db2, op) -# -# db1 := db1 op db2, where -# db1, db2: brcount data as returned by brcount_to_db -# op: one of $BR_ADD and BR_SUB -# -sub brcount_db_combine($$$) -{ - my ($db1, $db2, $op) = @_; - - foreach my $line (keys(%{$db2})) { - my $ldata = $db2->{$line}; - - foreach my $block (keys(%{$ldata})) { - my $bdata = $ldata->{$block}; - - foreach my $branch (keys(%{$bdata})) { - my $taken = $bdata->{$branch}; - my $new = $db1->{$line}->{$block}->{$branch}; - - if (!defined($new) || $new eq "-") { - $new = $taken; - } elsif ($taken ne "-") { - if ($op == $BR_ADD) { - $new += $taken; - } elsif ($op == $BR_SUB) { - $new -= $taken; - $new = 0 if ($new < 0); - } - } - - $db1->{$line}->{$block}->{$branch} = $new; - } - } - } -} - - -# -# brcount_db_get_found_and_hit(db) -# -# Return (br_found, br_hit) for db. -# - -sub brcount_db_get_found_and_hit($) -{ - my ($db) = @_; - my ($br_found , $br_hit) = (0, 0); - - foreach my $line (keys(%{$db})) { - my $ldata = $db->{$line}; - - foreach my $block (keys(%{$ldata})) { - my $bdata = $ldata->{$block}; - - foreach my $branch (keys(%{$bdata})) { - my $taken = $bdata->{$branch}; - - $br_found++; - $br_hit++ if ($taken ne "-" && $taken > 0); - } - } - } - - return ($br_found, $br_hit); -} - - -# combine_brcount(brcount1, brcount2, type, inplace) -# -# If add is BR_ADD, add branch coverage data and return list brcount_added. -# If add is BR_SUB, subtract the taken values of brcount2 from brcount1 and -# return brcount_sub. If inplace is set, the result is inserted into brcount1. -# - -sub combine_brcount($$$;$) -{ - my ($brcount1, $brcount2, $type, $inplace) = @_; - my ($db1, $db2); - - $db1 = brcount_to_db($brcount1); - $db2 = brcount_to_db($brcount2); - brcount_db_combine($db1, $db2, $type); - - return db_to_brcount($db1, $inplace ? $brcount1 : undef); -} - - -# -# add_testbrdata(testbrdata1, testbrdata2) -# -# Add branch coverage data for several tests. Return reference to -# added_testbrdata. -# - -sub add_testbrdata($$) -{ - my ($testbrdata1, $testbrdata2) = @_; - my %result; - my $testname; - - foreach $testname (keys(%{$testbrdata1})) { - if (defined($testbrdata2->{$testname})) { - my $brcount; - - # Branch coverage data for this testname exists - # in both data sets: add - ($brcount) = combine_brcount( - $testbrdata1->{$testname}, - $testbrdata2->{$testname}, $BR_ADD); - $result{$testname} = $brcount; - next; - } - # Branch coverage data for this testname is unique to - # data set 1: copy - $result{$testname} = $testbrdata1->{$testname}; - } - - # Add count data for testnames unique to data set 2 - foreach $testname (keys(%{$testbrdata2})) { - if (!defined($result{$testname})) { - $result{$testname} = $testbrdata2->{$testname}; - } - } - return \%result; -} - - -# -# combine_info_entries(entry_ref1, entry_ref2, filename) -# -# Combine .info data entry hashes referenced by ENTRY_REF1 and ENTRY_REF2. -# Return reference to resulting hash. -# - -sub combine_info_entries($$$) -{ - my $entry1 = $_[0]; # Reference to hash containing first entry - my $testdata1; - my $sumcount1; - my $funcdata1; - my $checkdata1; - my $testfncdata1; - my $sumfnccount1; - my $testbrdata1; - my $sumbrcount1; - - my $entry2 = $_[1]; # Reference to hash containing second entry - my $testdata2; - my $sumcount2; - my $funcdata2; - my $checkdata2; - my $testfncdata2; - my $sumfnccount2; - my $testbrdata2; - my $sumbrcount2; - - my %result; # Hash containing combined entry - my %result_testdata; - my $result_sumcount = {}; - my $result_funcdata; - my $result_testfncdata; - my $result_sumfnccount; - my $result_testbrdata; - my $result_sumbrcount; - my $lines_found; - my $lines_hit; - my $f_found; - my $f_hit; - my $br_found; - my $br_hit; - - my $testname; - my $filename = $_[2]; - - # Retrieve data - ($testdata1, $sumcount1, $funcdata1, $checkdata1, $testfncdata1, - $sumfnccount1, $testbrdata1, $sumbrcount1) = get_info_entry($entry1); - ($testdata2, $sumcount2, $funcdata2, $checkdata2, $testfncdata2, - $sumfnccount2, $testbrdata2, $sumbrcount2) = get_info_entry($entry2); - - # Merge checksums - $checkdata1 = merge_checksums($checkdata1, $checkdata2, $filename); - - # Combine funcdata - $result_funcdata = merge_func_data($funcdata1, $funcdata2, $filename); - - # Combine function call count data - $result_testfncdata = add_testfncdata($testfncdata1, $testfncdata2); - ($result_sumfnccount, $f_found, $f_hit) = - add_fnccount($sumfnccount1, $sumfnccount2); - - # Combine branch coverage data - $result_testbrdata = add_testbrdata($testbrdata1, $testbrdata2); - ($result_sumbrcount, $br_found, $br_hit) = - combine_brcount($sumbrcount1, $sumbrcount2, $BR_ADD); - - # Combine testdata - foreach $testname (keys(%{$testdata1})) - { - if (defined($testdata2->{$testname})) - { - # testname is present in both entries, requires - # combination - ($result_testdata{$testname}) = - add_counts($testdata1->{$testname}, - $testdata2->{$testname}); - } - else - { - # testname only present in entry1, add to result - $result_testdata{$testname} = $testdata1->{$testname}; - } - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - foreach $testname (keys(%{$testdata2})) - { - # Skip testnames already covered by previous iteration - if (defined($testdata1->{$testname})) { next; } - - # testname only present in entry2, add to result hash - $result_testdata{$testname} = $testdata2->{$testname}; - - # update sum count hash - ($result_sumcount, $lines_found, $lines_hit) = - add_counts($result_sumcount, - $result_testdata{$testname}); - } - - # Calculate resulting sumcount - - # Store result - set_info_entry(\%result, \%result_testdata, $result_sumcount, - $result_funcdata, $checkdata1, $result_testfncdata, - $result_sumfnccount, $result_testbrdata, - $result_sumbrcount, $lines_found, $lines_hit, - $f_found, $f_hit, $br_found, $br_hit); - - return(\%result); -} - - -# -# combine_info_files(info_ref1, info_ref2) -# -# Combine .info data in hashes referenced by INFO_REF1 and INFO_REF2. Return -# reference to resulting hash. -# - -sub combine_info_files($$) -{ - my %hash1 = %{$_[0]}; - my %hash2 = %{$_[1]}; - my $filename; - - foreach $filename (keys(%hash2)) - { - if ($hash1{$filename}) - { - # Entry already exists in hash1, combine them - $hash1{$filename} = - combine_info_entries($hash1{$filename}, - $hash2{$filename}, - $filename); - } - else - { - # Entry is unique in both hashes, simply add to - # resulting hash - $hash1{$filename} = $hash2{$filename}; - } - } - - return(\%hash1); -} - - -# -# add_traces() -# - -sub add_traces() -{ - my $total_trace; - my $current_trace; - my $tracefile; - my @result; - local *INFO_HANDLE; - - info("Combining tracefiles.\n"); - - foreach $tracefile (@add_tracefile) - { - $current_trace = read_info_file($tracefile); - if ($total_trace) - { - $total_trace = combine_info_files($total_trace, - $current_trace); - } - else - { - $total_trace = $current_trace; - } - } - - # Write combined data - if (!$data_stdout) - { - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">", $output_filename) - or die("ERROR: cannot write to $output_filename!\n"); - @result = write_info_file(*INFO_HANDLE, $total_trace); - close(*INFO_HANDLE); - } - else - { - @result = write_info_file(*STDOUT, $total_trace); - } - - return @result; -} - - -# -# write_info_file(filehandle, data) -# - -sub write_info_file(*$) -{ - local *INFO_HANDLE = $_[0]; - my %data = %{$_[1]}; - my $source_file; - my $entry; - my $testdata; - my $sumcount; - my $funcdata; - my $checkdata; - my $testfncdata; - my $sumfnccount; - my $testbrdata; - my $sumbrcount; - my $testname; - my $line; - my $func; - my $testcount; - my $testfnccount; - my $testbrcount; - my $found; - my $hit; - my $f_found; - my $f_hit; - my $br_found; - my $br_hit; - my $ln_total_found = 0; - my $ln_total_hit = 0; - my $fn_total_found = 0; - my $fn_total_hit = 0; - my $br_total_found = 0; - my $br_total_hit = 0; - - foreach $source_file (sort(keys(%data))) - { - $entry = $data{$source_file}; - ($testdata, $sumcount, $funcdata, $checkdata, $testfncdata, - $sumfnccount, $testbrdata, $sumbrcount, $found, $hit, - $f_found, $f_hit, $br_found, $br_hit) = - get_info_entry($entry); - - # Add to totals - $ln_total_found += $found; - $ln_total_hit += $hit; - $fn_total_found += $f_found; - $fn_total_hit += $f_hit; - $br_total_found += $br_found; - $br_total_hit += $br_hit; - - foreach $testname (sort(keys(%{$testdata}))) - { - $testcount = $testdata->{$testname}; - $testfnccount = $testfncdata->{$testname}; - $testbrcount = $testbrdata->{$testname}; - $found = 0; - $hit = 0; - - print(INFO_HANDLE "TN:$testname\n"); - print(INFO_HANDLE "SF:$source_file\n"); - - # Write function related data - foreach $func ( - sort({$funcdata->{$a} <=> $funcdata->{$b}} - keys(%{$funcdata}))) - { - print(INFO_HANDLE "FN:".$funcdata->{$func}. - ",$func\n"); - } - foreach $func (keys(%{$testfnccount})) { - print(INFO_HANDLE "FNDA:". - $testfnccount->{$func}. - ",$func\n"); - } - ($f_found, $f_hit) = - get_func_found_and_hit($testfnccount); - print(INFO_HANDLE "FNF:$f_found\n"); - print(INFO_HANDLE "FNH:$f_hit\n"); - - # Write branch related data - $br_found = 0; - $br_hit = 0; - foreach $line (sort({$a <=> $b} - keys(%{$testbrcount}))) { - my $brdata = $testbrcount->{$line}; - - foreach my $brentry (split(/:/, $brdata)) { - my ($block, $branch, $taken) = - split(/,/, $brentry); - - print(INFO_HANDLE "BRDA:$line,$block,". - "$branch,$taken\n"); - $br_found++; - $br_hit++ if ($taken ne '-' && - $taken > 0); - } - } - if ($br_found > 0) { - print(INFO_HANDLE "BRF:$br_found\n"); - print(INFO_HANDLE "BRH:$br_hit\n"); - } - - # Write line related data - foreach $line (sort({$a <=> $b} keys(%{$testcount}))) - { - print(INFO_HANDLE "DA:$line,". - $testcount->{$line}. - (defined($checkdata->{$line}) && - $checksum ? - ",".$checkdata->{$line} : "")."\n"); - $found++; - if ($testcount->{$line} > 0) - { - $hit++; - } - - } - print(INFO_HANDLE "LF:$found\n"); - print(INFO_HANDLE "LH:$hit\n"); - print(INFO_HANDLE "end_of_record\n"); - } - } - - return ($ln_total_found, $ln_total_hit, $fn_total_found, $fn_total_hit, - $br_total_found, $br_total_hit); -} - - -# -# transform_pattern(pattern) -# -# Transform shell wildcard expression to equivalent Perl regular expression. -# Return transformed pattern. -# - -sub transform_pattern($) -{ - my $pattern = $_[0]; - - # Escape special chars - - $pattern =~ s/\\/\\\\/g; - $pattern =~ s/\//\\\//g; - $pattern =~ s/\^/\\\^/g; - $pattern =~ s/\$/\\\$/g; - $pattern =~ s/\(/\\\(/g; - $pattern =~ s/\)/\\\)/g; - $pattern =~ s/\[/\\\[/g; - $pattern =~ s/\]/\\\]/g; - $pattern =~ s/\{/\\\{/g; - $pattern =~ s/\}/\\\}/g; - $pattern =~ s/\./\\\./g; - $pattern =~ s/\,/\\\,/g; - $pattern =~ s/\|/\\\|/g; - $pattern =~ s/\+/\\\+/g; - $pattern =~ s/\!/\\\!/g; - - # Transform ? => (.) and * => (.*) - - $pattern =~ s/\*/\(\.\*\)/g; - $pattern =~ s/\?/\(\.\)/g; - - return $pattern; -} - - -# -# extract() -# - -sub extract() -{ - my $data = read_info_file($extract); - my $filename; - my $keep; - my $pattern; - my @pattern_list; - my $extracted = 0; - my @result; - local *INFO_HANDLE; - - # Need perlreg expressions instead of shell pattern - @pattern_list = map({ transform_pattern($_); } @ARGV); - - # Filter out files which do not match any pattern - foreach $filename (sort(keys(%{$data}))) - { - $keep = 0; - - foreach $pattern (@pattern_list) - { - $keep ||= ($filename =~ (/^$pattern$/)); - } - - - if (!$keep) - { - delete($data->{$filename}); - } - else - { - info("Extracting $filename\n"), - $extracted++; - } - } - - # Write extracted data - if (!$data_stdout) - { - info("Extracted $extracted files\n"); - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">", $output_filename) - or die("ERROR: cannot write to $output_filename!\n"); - @result = write_info_file(*INFO_HANDLE, $data); - close(*INFO_HANDLE); - } - else - { - @result = write_info_file(*STDOUT, $data); - } - - return @result; -} - - -# -# remove() -# - -sub remove() -{ - my $data = read_info_file($remove); - my $filename; - my $match_found; - my $pattern; - my @pattern_list; - my $removed = 0; - my @result; - local *INFO_HANDLE; - - # Need perlreg expressions instead of shell pattern - @pattern_list = map({ transform_pattern($_); } @ARGV); - - # Filter out files that match the pattern - foreach $filename (sort(keys(%{$data}))) - { - $match_found = 0; - - foreach $pattern (@pattern_list) - { - $match_found ||= ($filename =~ (/^$pattern$/)); - } - - - if ($match_found) - { - delete($data->{$filename}); - info("Removing $filename\n"), - $removed++; - } - } - - # Write data - if (!$data_stdout) - { - info("Deleted $removed files\n"); - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">", $output_filename) - or die("ERROR: cannot write to $output_filename!\n"); - @result = write_info_file(*INFO_HANDLE, $data); - close(*INFO_HANDLE); - } - else - { - @result = write_info_file(*STDOUT, $data); - } - - return @result; -} - - -# get_prefix(max_width, max_percentage_too_long, path_list) -# -# Return a path prefix that satisfies the following requirements: -# - is shared by more paths in path_list than any other prefix -# - the percentage of paths which would exceed the given max_width length -# after applying the prefix does not exceed max_percentage_too_long -# -# If multiple prefixes satisfy all requirements, the longest prefix is -# returned. Return an empty string if no prefix could be found. - -sub get_prefix($$@) -{ - my ($max_width, $max_long, @path_list) = @_; - my $path; - my $ENTRY_NUM = 0; - my $ENTRY_LONG = 1; - my %prefix; - - # Build prefix hash - foreach $path (@path_list) { - my ($v, $d, $f) = splitpath($path); - my @dirs = splitdir($d); - my $p_len = length($path); - my $i; - - # Remove trailing '/' - pop(@dirs) if ($dirs[scalar(@dirs) - 1] eq ''); - for ($i = 0; $i < scalar(@dirs); $i++) { - my $subpath = catpath($v, catdir(@dirs[0..$i]), ''); - my $entry = $prefix{$subpath}; - - $entry = [ 0, 0 ] if (!defined($entry)); - $entry->[$ENTRY_NUM]++; - if (($p_len - length($subpath) - 1) > $max_width) { - $entry->[$ENTRY_LONG]++; - } - $prefix{$subpath} = $entry; - } - } - # Find suitable prefix (sort descending by two keys: 1. number of - # entries covered by a prefix, 2. length of prefix) - foreach $path (sort {($prefix{$a}->[$ENTRY_NUM] == - $prefix{$b}->[$ENTRY_NUM]) ? - length($b) <=> length($a) : - $prefix{$b}->[$ENTRY_NUM] <=> - $prefix{$a}->[$ENTRY_NUM]} - keys(%prefix)) { - my ($num, $long) = @{$prefix{$path}}; - - # Check for additional requirement: number of filenames - # that would be too long may not exceed a certain percentage - if ($long <= $num * $max_long / 100) { - return $path; - } - } - - return ""; -} - - -# -# shorten_filename(filename, width) -# -# Truncate filename if it is longer than width characters. -# - -sub shorten_filename($$) -{ - my ($filename, $width) = @_; - my $l = length($filename); - my $s; - my $e; - - return $filename if ($l <= $width); - $e = int(($width - 3) / 2); - $s = $width - 3 - $e; - - return substr($filename, 0, $s).'...'.substr($filename, $l - $e); -} - - -sub shorten_number($$) -{ - my ($number, $width) = @_; - my $result = sprintf("%*d", $width, $number); - - return $result if (length($result) <= $width); - $number = $number / 1000; - return $result if (length($result) <= $width); - $result = sprintf("%*dk", $width - 1, $number); - return $result if (length($result) <= $width); - $number = $number / 1000; - $result = sprintf("%*dM", $width - 1, $number); - return $result if (length($result) <= $width); - return '#'; -} - -sub shorten_rate($$$) -{ - my ($hit, $found, $width) = @_; - my $result = rate($hit, $found, "%", 1, $width); - - return $result if (length($result) <= $width); - $result = rate($hit, $found, "%", 0, $width); - return $result if (length($result) <= $width); - return "#"; -} - -# -# list() -# - -sub list() -{ - my $data = read_info_file($list); - my $filename; - my $found; - my $hit; - my $entry; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - my $total_found = 0; - my $total_hit = 0; - my $fn_total_found = 0; - my $fn_total_hit = 0; - my $br_total_found = 0; - my $br_total_hit = 0; - my $prefix; - my $strlen = length("Filename"); - my $format; - my $heading1; - my $heading2; - my @footer; - my $barlen; - my $rate; - my $fnrate; - my $brrate; - my $lastpath; - my $F_LN_NUM = 0; - my $F_LN_RATE = 1; - my $F_FN_NUM = 2; - my $F_FN_RATE = 3; - my $F_BR_NUM = 4; - my $F_BR_RATE = 5; - my @fwidth_narrow = (5, 5, 3, 5, 4, 5); - my @fwidth_wide = (6, 5, 5, 5, 6, 5); - my @fwidth = @fwidth_wide; - my $w; - my $max_width = $opt_list_width; - my $max_long = $opt_list_truncate_max; - my $fwidth_narrow_length; - my $fwidth_wide_length; - my $got_prefix = 0; - my $root_prefix = 0; - - # Calculate total width of narrow fields - $fwidth_narrow_length = 0; - foreach $w (@fwidth_narrow) { - $fwidth_narrow_length += $w + 1; - } - # Calculate total width of wide fields - $fwidth_wide_length = 0; - foreach $w (@fwidth_wide) { - $fwidth_wide_length += $w + 1; - } - # Get common file path prefix - $prefix = get_prefix($max_width - $fwidth_narrow_length, $max_long, - keys(%{$data})); - $root_prefix = 1 if ($prefix eq rootdir()); - $got_prefix = 1 if (length($prefix) > 0); - $prefix =~ s/\/$//; - # Get longest filename length - foreach $filename (keys(%{$data})) { - if (!$opt_list_full_path) { - if (!$got_prefix || !$root_prefix && - !($filename =~ s/^\Q$prefix\/\E//)) { - my ($v, $d, $f) = splitpath($filename); - - $filename = $f; - } - } - # Determine maximum length of entries - if (length($filename) > $strlen) { - $strlen = length($filename) - } - } - if (!$opt_list_full_path) { - my $blanks; - - $w = $fwidth_wide_length; - # Check if all columns fit into max_width characters - if ($strlen + $fwidth_wide_length > $max_width) { - # Use narrow fields - @fwidth = @fwidth_narrow; - $w = $fwidth_narrow_length; - if (($strlen + $fwidth_narrow_length) > $max_width) { - # Truncate filenames at max width - $strlen = $max_width - $fwidth_narrow_length; - } - } - # Add some blanks between filename and fields if possible - $blanks = int($strlen * 0.5); - $blanks = 4 if ($blanks < 4); - $blanks = 8 if ($blanks > 8); - if (($strlen + $w + $blanks) < $max_width) { - $strlen += $blanks; - } else { - $strlen = $max_width - $w; - } - } - # Filename - $w = $strlen; - $format = "%-${w}s|"; - $heading1 = sprintf("%*s|", $w, ""); - $heading2 = sprintf("%-*s|", $w, "Filename"); - $barlen = $w + 1; - # Line coverage rate - $w = $fwidth[$F_LN_RATE]; - $format .= "%${w}s "; - $heading1 .= sprintf("%-*s |", $w + $fwidth[$F_LN_NUM], - "Lines"); - $heading2 .= sprintf("%-*s ", $w, "Rate"); - $barlen += $w + 1; - # Number of lines - $w = $fwidth[$F_LN_NUM]; - $format .= "%${w}s|"; - $heading2 .= sprintf("%*s|", $w, "Num"); - $barlen += $w + 1; - # Function coverage rate - $w = $fwidth[$F_FN_RATE]; - $format .= "%${w}s "; - $heading1 .= sprintf("%-*s|", $w + $fwidth[$F_FN_NUM] + 1, - "Functions"); - $heading2 .= sprintf("%-*s ", $w, "Rate"); - $barlen += $w + 1; - # Number of functions - $w = $fwidth[$F_FN_NUM]; - $format .= "%${w}s|"; - $heading2 .= sprintf("%*s|", $w, "Num"); - $barlen += $w + 1; - # Branch coverage rate - $w = $fwidth[$F_BR_RATE]; - $format .= "%${w}s "; - $heading1 .= sprintf("%-*s", $w + $fwidth[$F_BR_NUM] + 1, - "Branches"); - $heading2 .= sprintf("%-*s ", $w, "Rate"); - $barlen += $w + 1; - # Number of branches - $w = $fwidth[$F_BR_NUM]; - $format .= "%${w}s"; - $heading2 .= sprintf("%*s", $w, "Num"); - $barlen += $w; - # Line end - $format .= "\n"; - $heading1 .= "\n"; - $heading2 .= "\n"; - - # Print heading - print($heading1); - print($heading2); - print(("="x$barlen)."\n"); - - # Print per file information - foreach $filename (sort(keys(%{$data}))) - { - my @file_data; - my $print_filename = $filename; - - $entry = $data->{$filename}; - if (!$opt_list_full_path) { - my $p; - - $print_filename = $filename; - if (!$got_prefix || !$root_prefix && - !($print_filename =~ s/^\Q$prefix\/\E//)) { - my ($v, $d, $f) = splitpath($filename); - - $p = catpath($v, $d, ""); - $p =~ s/\/$//; - $print_filename = $f; - } else { - $p = $prefix; - } - - if (!defined($lastpath) || $lastpath ne $p) { - print("\n") if (defined($lastpath)); - $lastpath = $p; - print("[$lastpath/]\n") if (!$root_prefix); - } - $print_filename = shorten_filename($print_filename, - $strlen); - } - - (undef, undef, undef, undef, undef, undef, undef, undef, - $found, $hit, $fn_found, $fn_hit, $br_found, $br_hit) = - get_info_entry($entry); - - # Assume zero count if there is no function data for this file - if (!defined($fn_found) || !defined($fn_hit)) { - $fn_found = 0; - $fn_hit = 0; - } - # Assume zero count if there is no branch data for this file - if (!defined($br_found) || !defined($br_hit)) { - $br_found = 0; - $br_hit = 0; - } - - # Add line coverage totals - $total_found += $found; - $total_hit += $hit; - # Add function coverage totals - $fn_total_found += $fn_found; - $fn_total_hit += $fn_hit; - # Add branch coverage totals - $br_total_found += $br_found; - $br_total_hit += $br_hit; - - # Determine line coverage rate for this file - $rate = shorten_rate($hit, $found, $fwidth[$F_LN_RATE]); - # Determine function coverage rate for this file - $fnrate = shorten_rate($fn_hit, $fn_found, $fwidth[$F_FN_RATE]); - # Determine branch coverage rate for this file - $brrate = shorten_rate($br_hit, $br_found, $fwidth[$F_BR_RATE]); - - # Assemble line parameters - push(@file_data, $print_filename); - push(@file_data, $rate); - push(@file_data, shorten_number($found, $fwidth[$F_LN_NUM])); - push(@file_data, $fnrate); - push(@file_data, shorten_number($fn_found, $fwidth[$F_FN_NUM])); - push(@file_data, $brrate); - push(@file_data, shorten_number($br_found, $fwidth[$F_BR_NUM])); - - # Print assembled line - printf($format, @file_data); - } - - # Determine total line coverage rate - $rate = shorten_rate($total_hit, $total_found, $fwidth[$F_LN_RATE]); - # Determine total function coverage rate - $fnrate = shorten_rate($fn_total_hit, $fn_total_found, - $fwidth[$F_FN_RATE]); - # Determine total branch coverage rate - $brrate = shorten_rate($br_total_hit, $br_total_found, - $fwidth[$F_BR_RATE]); - - # Print separator - print(("="x$barlen)."\n"); - - # Assemble line parameters - push(@footer, sprintf("%*s", $strlen, "Total:")); - push(@footer, $rate); - push(@footer, shorten_number($total_found, $fwidth[$F_LN_NUM])); - push(@footer, $fnrate); - push(@footer, shorten_number($fn_total_found, $fwidth[$F_FN_NUM])); - push(@footer, $brrate); - push(@footer, shorten_number($br_total_found, $fwidth[$F_BR_NUM])); - - # Print assembled line - printf($format, @footer); -} - - -# -# get_common_filename(filename1, filename2) -# -# Check for filename components which are common to FILENAME1 and FILENAME2. -# Upon success, return -# -# (common, path1, path2) -# -# or 'undef' in case there are no such parts. -# - -sub get_common_filename($$) -{ - my @list1 = split("/", $_[0]); - my @list2 = split("/", $_[1]); - my @result; - - # Work in reverse order, i.e. beginning with the filename itself - while (@list1 && @list2 && ($list1[$#list1] eq $list2[$#list2])) - { - unshift(@result, pop(@list1)); - pop(@list2); - } - - # Did we find any similarities? - if (scalar(@result) > 0) - { - return (join("/", @result), join("/", @list1), - join("/", @list2)); - } - else - { - return undef; - } -} - - -# -# strip_directories($path, $depth) -# -# Remove DEPTH leading directory levels from PATH. -# - -sub strip_directories($$) -{ - my $filename = $_[0]; - my $depth = $_[1]; - my $i; - - if (!defined($depth) || ($depth < 1)) - { - return $filename; - } - for ($i = 0; $i < $depth; $i++) - { - $filename =~ s/^[^\/]*\/+(.*)$/$1/; - } - return $filename; -} - - -# -# read_diff(filename) -# -# Read diff output from FILENAME to memory. The diff file has to follow the -# format generated by 'diff -u'. Returns a list of hash references: -# -# (mapping, path mapping) -# -# mapping: filename -> reference to line hash -# line hash: line number in new file -> corresponding line number in old file -# -# path mapping: filename -> old filename -# -# Die in case of error. -# - -sub read_diff($) -{ - my $diff_file = $_[0]; # Name of diff file - my %diff; # Resulting mapping filename -> line hash - my %paths; # Resulting mapping old path -> new path - my $mapping; # Reference to current line hash - my $line; # Contents of current line - my $num_old; # Current line number in old file - my $num_new; # Current line number in new file - my $file_old; # Name of old file in diff section - my $file_new; # Name of new file in diff section - my $filename; # Name of common filename of diff section - my $in_block = 0; # Non-zero while we are inside a diff block - local *HANDLE; # File handle for reading the diff file - - info("Reading diff $diff_file\n"); - - # Check if file exists and is readable - stat($diff_file); - if (!(-r _)) - { - die("ERROR: cannot read file $diff_file!\n"); - } - - # Check if this is really a plain file - if (!(-f _)) - { - die("ERROR: not a plain file: $diff_file!\n"); - } - - # Check for .gz extension - if ($diff_file =~ /\.gz$/) - { - # Check for availability of GZIP tool - system_no_output(1, "gunzip", "-h") - and die("ERROR: gunzip command not available!\n"); - - # Check integrity of compressed file - system_no_output(1, "gunzip", "-t", $diff_file) - and die("ERROR: integrity check failed for ". - "compressed file $diff_file!\n"); - - # Open compressed file - open(HANDLE, "-|", "gunzip -c '$diff_file'") - or die("ERROR: cannot start gunzip to decompress ". - "file $_[0]!\n"); - } - else - { - # Open decompressed file - open(HANDLE, "<", $diff_file) - or die("ERROR: cannot read file $_[0]!\n"); - } - - # Parse diff file line by line - while (<HANDLE>) - { - chomp($_); - $line = $_; - - foreach ($line) - { - # Filename of old file: - # --- <filename> <date> - /^--- (\S+)/ && do - { - $file_old = strip_directories($1, $strip); - last; - }; - # Filename of new file: - # +++ <filename> <date> - /^\+\+\+ (\S+)/ && do - { - # Add last file to resulting hash - if ($filename) - { - my %new_hash; - $diff{$filename} = $mapping; - $mapping = \%new_hash; - } - $file_new = strip_directories($1, $strip); - $filename = $file_old; - $paths{$filename} = $file_new; - $num_old = 1; - $num_new = 1; - last; - }; - # Start of diff block: - # @@ -old_start,old_num, +new_start,new_num @@ - /^\@\@\s+-(\d+),(\d+)\s+\+(\d+),(\d+)\s+\@\@$/ && do - { - $in_block = 1; - while ($num_old < $1) - { - $mapping->{$num_new} = $num_old; - $num_old++; - $num_new++; - } - last; - }; - # Unchanged line - # <line starts with blank> - /^ / && do - { - if ($in_block == 0) - { - last; - } - $mapping->{$num_new} = $num_old; - $num_old++; - $num_new++; - last; - }; - # Line as seen in old file - # <line starts with '-'> - /^-/ && do - { - if ($in_block == 0) - { - last; - } - $num_old++; - last; - }; - # Line as seen in new file - # <line starts with '+'> - /^\+/ && do - { - if ($in_block == 0) - { - last; - } - $num_new++; - last; - }; - # Empty line - /^$/ && do - { - if ($in_block == 0) - { - last; - } - $mapping->{$num_new} = $num_old; - $num_old++; - $num_new++; - last; - }; - } - } - - close(HANDLE); - - # Add final diff file section to resulting hash - if ($filename) - { - $diff{$filename} = $mapping; - } - - if (!%diff) - { - die("ERROR: no valid diff data found in $diff_file!\n". - "Make sure to use 'diff -u' when generating the diff ". - "file.\n"); - } - return (\%diff, \%paths); -} - - -# -# apply_diff($count_data, $line_hash) -# -# Transform count data using a mapping of lines: -# -# $count_data: reference to hash: line number -> data -# $line_hash: reference to hash: line number new -> line number old -# -# Return a reference to transformed count data. -# - -sub apply_diff($$) -{ - my $count_data = $_[0]; # Reference to data hash: line -> hash - my $line_hash = $_[1]; # Reference to line hash: new line -> old line - my %result; # Resulting hash - my $last_new = 0; # Last new line number found in line hash - my $last_old = 0; # Last old line number found in line hash - - # Iterate all new line numbers found in the diff - foreach (sort({$a <=> $b} keys(%{$line_hash}))) - { - $last_new = $_; - $last_old = $line_hash->{$last_new}; - - # Is there data associated with the corresponding old line? - if (defined($count_data->{$line_hash->{$_}})) - { - # Copy data to new hash with a new line number - $result{$_} = $count_data->{$line_hash->{$_}}; - } - } - # Transform all other lines which come after the last diff entry - foreach (sort({$a <=> $b} keys(%{$count_data}))) - { - if ($_ <= $last_old) - { - # Skip lines which were covered by line hash - next; - } - # Copy data to new hash with an offset - $result{$_ + ($last_new - $last_old)} = $count_data->{$_}; - } - - return \%result; -} - - -# -# apply_diff_to_brcount(brcount, linedata) -# -# Adjust line numbers of branch coverage data according to linedata. -# - -sub apply_diff_to_brcount($$) -{ - my ($brcount, $linedata) = @_; - my $db; - - # Convert brcount to db format - $db = brcount_to_db($brcount); - # Apply diff to db format - $db = apply_diff($db, $linedata); - # Convert db format back to brcount format - ($brcount) = db_to_brcount($db); - - return $brcount; -} - - -# -# get_hash_max(hash_ref) -# -# Return the highest integer key from hash. -# - -sub get_hash_max($) -{ - my ($hash) = @_; - my $max; - - foreach (keys(%{$hash})) { - if (!defined($max)) { - $max = $_; - } elsif ($hash->{$_} > $max) { - $max = $_; - } - } - return $max; -} - -sub get_hash_reverse($) -{ - my ($hash) = @_; - my %result; - - foreach (keys(%{$hash})) { - $result{$hash->{$_}} = $_; - } - - return \%result; -} - -# -# apply_diff_to_funcdata(funcdata, line_hash) -# - -sub apply_diff_to_funcdata($$) -{ - my ($funcdata, $linedata) = @_; - my $last_new = get_hash_max($linedata); - my $last_old = $linedata->{$last_new}; - my $func; - my %result; - my $line_diff = get_hash_reverse($linedata); - - foreach $func (keys(%{$funcdata})) { - my $line = $funcdata->{$func}; - - if (defined($line_diff->{$line})) { - $result{$func} = $line_diff->{$line}; - } elsif ($line > $last_old) { - $result{$func} = $line + $last_new - $last_old; - } - } - - return \%result; -} - - -# -# get_line_hash($filename, $diff_data, $path_data) -# -# Find line hash in DIFF_DATA which matches FILENAME. On success, return list -# line hash. or undef in case of no match. Die if more than one line hashes in -# DIFF_DATA match. -# - -sub get_line_hash($$$) -{ - my $filename = $_[0]; - my $diff_data = $_[1]; - my $path_data = $_[2]; - my $conversion; - my $old_path; - my $new_path; - my $diff_name; - my $common; - my $old_depth; - my $new_depth; - - # Remove trailing slash from diff path - $diff_path =~ s/\/$//; - foreach (keys(%{$diff_data})) - { - my $sep = ""; - - $sep = '/' if (!/^\//); - - # Try to match diff filename with filename - if ($filename =~ /^\Q$diff_path$sep$_\E$/) - { - if ($diff_name) - { - # Two files match, choose the more specific one - # (the one with more path components) - $old_depth = ($diff_name =~ tr/\///); - $new_depth = (tr/\///); - if ($old_depth == $new_depth) - { - die("ERROR: diff file contains ". - "ambiguous entries for ". - "$filename\n"); - } - elsif ($new_depth > $old_depth) - { - $diff_name = $_; - } - } - else - { - $diff_name = $_; - } - }; - } - if ($diff_name) - { - # Get converted path - if ($filename =~ /^(.*)$diff_name$/) - { - ($common, $old_path, $new_path) = - get_common_filename($filename, - $1.$path_data->{$diff_name}); - } - return ($diff_data->{$diff_name}, $old_path, $new_path); - } - else - { - return undef; - } -} - - -# -# convert_paths(trace_data, path_conversion_data) -# -# Rename all paths in TRACE_DATA which show up in PATH_CONVERSION_DATA. -# - -sub convert_paths($$) -{ - my $trace_data = $_[0]; - my $path_conversion_data = $_[1]; - my $filename; - my $new_path; - - if (scalar(keys(%{$path_conversion_data})) == 0) - { - info("No path conversion data available.\n"); - return; - } - - # Expand path conversion list - foreach $filename (keys(%{$path_conversion_data})) - { - $new_path = $path_conversion_data->{$filename}; - while (($filename =~ s/^(.*)\/[^\/]+$/$1/) && - ($new_path =~ s/^(.*)\/[^\/]+$/$1/) && - ($filename ne $new_path)) - { - $path_conversion_data->{$filename} = $new_path; - } - } - - # Adjust paths - FILENAME: foreach $filename (keys(%{$trace_data})) - { - # Find a path in our conversion table that matches, starting - # with the longest path - foreach (sort({length($b) <=> length($a)} - keys(%{$path_conversion_data}))) - { - # Is this path a prefix of our filename? - if (!($filename =~ /^$_(.*)$/)) - { - next; - } - $new_path = $path_conversion_data->{$_}.$1; - - # Make sure not to overwrite an existing entry under - # that path name - if ($trace_data->{$new_path}) - { - # Need to combine entries - $trace_data->{$new_path} = - combine_info_entries( - $trace_data->{$filename}, - $trace_data->{$new_path}, - $filename); - } - else - { - # Simply rename entry - $trace_data->{$new_path} = - $trace_data->{$filename}; - } - delete($trace_data->{$filename}); - next FILENAME; - } - info("No conversion available for filename $filename\n"); - } -} - -# -# sub adjust_fncdata(funcdata, testfncdata, sumfnccount) -# -# Remove function call count data from testfncdata and sumfnccount which -# is no longer present in funcdata. -# - -sub adjust_fncdata($$$) -{ - my ($funcdata, $testfncdata, $sumfnccount) = @_; - my $testname; - my $func; - my $f_found; - my $f_hit; - - # Remove count data in testfncdata for functions which are no longer - # in funcdata - foreach $testname (keys(%{$testfncdata})) { - my $fnccount = $testfncdata->{$testname}; - - foreach $func (keys(%{$fnccount})) { - if (!defined($funcdata->{$func})) { - delete($fnccount->{$func}); - } - } - } - # Remove count data in sumfnccount for functions which are no longer - # in funcdata - foreach $func (keys(%{$sumfnccount})) { - if (!defined($funcdata->{$func})) { - delete($sumfnccount->{$func}); - } - } -} - -# -# get_func_found_and_hit(sumfnccount) -# -# Return (f_found, f_hit) for sumfnccount -# - -sub get_func_found_and_hit($) -{ - my ($sumfnccount) = @_; - my $function; - my $f_found; - my $f_hit; - - $f_found = scalar(keys(%{$sumfnccount})); - $f_hit = 0; - foreach $function (keys(%{$sumfnccount})) { - if ($sumfnccount->{$function} > 0) { - $f_hit++; - } - } - return ($f_found, $f_hit); -} - -# -# diff() -# - -sub diff() -{ - my $trace_data = read_info_file($diff); - my $diff_data; - my $path_data; - my $old_path; - my $new_path; - my %path_conversion_data; - my $filename; - my $line_hash; - my $new_name; - my $entry; - my $testdata; - my $testname; - my $sumcount; - my $funcdata; - my $checkdata; - my $testfncdata; - my $sumfnccount; - my $testbrdata; - my $sumbrcount; - my $found; - my $hit; - my $f_found; - my $f_hit; - my $br_found; - my $br_hit; - my $converted = 0; - my $unchanged = 0; - my @result; - local *INFO_HANDLE; - - ($diff_data, $path_data) = read_diff($ARGV[0]); - - foreach $filename (sort(keys(%{$trace_data}))) - { - # Find a diff section corresponding to this file - ($line_hash, $old_path, $new_path) = - get_line_hash($filename, $diff_data, $path_data); - if (!$line_hash) - { - # There's no diff section for this file - $unchanged++; - next; - } - $converted++; - if ($old_path && $new_path && ($old_path ne $new_path)) - { - $path_conversion_data{$old_path} = $new_path; - } - # Check for deleted files - if (scalar(keys(%{$line_hash})) == 0) - { - info("Removing $filename\n"); - delete($trace_data->{$filename}); - next; - } - info("Converting $filename\n"); - $entry = $trace_data->{$filename}; - ($testdata, $sumcount, $funcdata, $checkdata, $testfncdata, - $sumfnccount, $testbrdata, $sumbrcount) = - get_info_entry($entry); - # Convert test data - foreach $testname (keys(%{$testdata})) - { - # Adjust line numbers of line coverage data - $testdata->{$testname} = - apply_diff($testdata->{$testname}, $line_hash); - # Adjust line numbers of branch coverage data - $testbrdata->{$testname} = - apply_diff_to_brcount($testbrdata->{$testname}, - $line_hash); - # Remove empty sets of test data - if (scalar(keys(%{$testdata->{$testname}})) == 0) - { - delete($testdata->{$testname}); - delete($testfncdata->{$testname}); - delete($testbrdata->{$testname}); - } - } - # Rename test data to indicate conversion - foreach $testname (keys(%{$testdata})) - { - # Skip testnames which already contain an extension - if ($testname =~ /,[^,]+$/) - { - next; - } - # Check for name conflict - if (defined($testdata->{$testname.",diff"})) - { - # Add counts - ($testdata->{$testname}) = add_counts( - $testdata->{$testname}, - $testdata->{$testname.",diff"}); - delete($testdata->{$testname.",diff"}); - # Add function call counts - ($testfncdata->{$testname}) = add_fnccount( - $testfncdata->{$testname}, - $testfncdata->{$testname.",diff"}); - delete($testfncdata->{$testname.",diff"}); - # Add branch counts - combine_brcount( - $testbrdata->{$testname}, - $testbrdata->{$testname.",diff"}, - $BR_ADD, 1); - delete($testbrdata->{$testname.",diff"}); - } - # Move test data to new testname - $testdata->{$testname.",diff"} = $testdata->{$testname}; - delete($testdata->{$testname}); - # Move function call count data to new testname - $testfncdata->{$testname.",diff"} = - $testfncdata->{$testname}; - delete($testfncdata->{$testname}); - # Move branch count data to new testname - $testbrdata->{$testname.",diff"} = - $testbrdata->{$testname}; - delete($testbrdata->{$testname}); - } - # Convert summary of test data - $sumcount = apply_diff($sumcount, $line_hash); - # Convert function data - $funcdata = apply_diff_to_funcdata($funcdata, $line_hash); - # Convert branch coverage data - $sumbrcount = apply_diff_to_brcount($sumbrcount, $line_hash); - # Update found/hit numbers - # Convert checksum data - $checkdata = apply_diff($checkdata, $line_hash); - # Convert function call count data - adjust_fncdata($funcdata, $testfncdata, $sumfnccount); - ($f_found, $f_hit) = get_func_found_and_hit($sumfnccount); - ($br_found, $br_hit) = get_br_found_and_hit($sumbrcount); - # Update found/hit numbers - $found = 0; - $hit = 0; - foreach (keys(%{$sumcount})) - { - $found++; - if ($sumcount->{$_} > 0) - { - $hit++; - } - } - if ($found > 0) - { - # Store converted entry - set_info_entry($entry, $testdata, $sumcount, $funcdata, - $checkdata, $testfncdata, $sumfnccount, - $testbrdata, $sumbrcount, $found, $hit, - $f_found, $f_hit, $br_found, $br_hit); - } - else - { - # Remove empty data set - delete($trace_data->{$filename}); - } - } - - # Convert filenames as well if requested - if ($convert_filenames) - { - convert_paths($trace_data, \%path_conversion_data); - } - - info("$converted entr".($converted != 1 ? "ies" : "y")." converted, ". - "$unchanged entr".($unchanged != 1 ? "ies" : "y")." left ". - "unchanged.\n"); - - # Write data - if (!$data_stdout) - { - info("Writing data to $output_filename\n"); - open(INFO_HANDLE, ">", $output_filename) - or die("ERROR: cannot write to $output_filename!\n"); - @result = write_info_file(*INFO_HANDLE, $trace_data); - close(*INFO_HANDLE); - } - else - { - @result = write_info_file(*STDOUT, $trace_data); - } - - return @result; -} - -# -# summary() -# - -sub summary() -{ - my $filename; - my $current; - my $total; - my $ln_total_found; - my $ln_total_hit; - my $fn_total_found; - my $fn_total_hit; - my $br_total_found; - my $br_total_hit; - - # Read and combine trace files - foreach $filename (@opt_summary) { - $current = read_info_file($filename); - if (!defined($total)) { - $total = $current; - } else { - $total = combine_info_files($total, $current); - } - } - # Calculate coverage data - foreach $filename (keys(%{$total})) - { - my $entry = $total->{$filename}; - my $ln_found; - my $ln_hit; - my $fn_found; - my $fn_hit; - my $br_found; - my $br_hit; - - (undef, undef, undef, undef, undef, undef, undef, undef, - $ln_found, $ln_hit, $fn_found, $fn_hit, $br_found, - $br_hit) = get_info_entry($entry); - - # Add to totals - $ln_total_found += $ln_found; - $ln_total_hit += $ln_hit; - $fn_total_found += $fn_found; - $fn_total_hit += $fn_hit; - $br_total_found += $br_found; - $br_total_hit += $br_hit; - } - - - return ($ln_total_found, $ln_total_hit, $fn_total_found, $fn_total_hit, - $br_total_found, $br_total_hit); -} - -# -# system_no_output(mode, parameters) -# -# Call an external program using PARAMETERS while suppressing depending on -# the value of MODE: -# -# MODE & 1: suppress STDOUT -# MODE & 2: suppress STDERR -# -# Return 0 on success, non-zero otherwise. -# - -sub system_no_output($@) -{ - my $mode = shift; - my $result; - local *OLD_STDERR; - local *OLD_STDOUT; - - # Save old stdout and stderr handles - ($mode & 1) && open(OLD_STDOUT, ">>&", "STDOUT"); - ($mode & 2) && open(OLD_STDERR, ">>&", "STDERR"); - - # Redirect to /dev/null - ($mode & 1) && open(STDOUT, ">", "/dev/null"); - ($mode & 2) && open(STDERR, ">", "/dev/null"); - - system(@_); - $result = $?; - - # Close redirected handles - ($mode & 1) && close(STDOUT); - ($mode & 2) && close(STDERR); - - # Restore old handles - ($mode & 1) && open(STDOUT, ">>&", "OLD_STDOUT"); - ($mode & 2) && open(STDERR, ">>&", "OLD_STDERR"); - - return $result; -} - - -# -# read_config(filename) -# -# Read configuration file FILENAME and return a reference to a hash containing -# all valid key=value pairs found. -# - -sub read_config($) -{ - my $filename = $_[0]; - my %result; - my $key; - my $value; - local *HANDLE; - - if (!open(HANDLE, "<", $filename)) - { - warn("WARNING: cannot read configuration file $filename\n"); - return undef; - } - while (<HANDLE>) - { - chomp; - # Skip comments - s/#.*//; - # Remove leading blanks - s/^\s+//; - # Remove trailing blanks - s/\s+$//; - next unless length; - ($key, $value) = split(/\s*=\s*/, $_, 2); - if (defined($key) && defined($value)) - { - $result{$key} = $value; - } - else - { - warn("WARNING: malformed statement in line $. ". - "of configuration file $filename\n"); - } - } - close(HANDLE); - return \%result; -} - - -# -# apply_config(REF) -# -# REF is a reference to a hash containing the following mapping: -# -# key_string => var_ref -# -# where KEY_STRING is a keyword and VAR_REF is a reference to an associated -# variable. If the global configuration hashes CONFIG or OPT_RC contain a value -# for keyword KEY_STRING, VAR_REF will be assigned the value for that keyword. -# - -sub apply_config($) -{ - my $ref = $_[0]; - - foreach (keys(%{$ref})) - { - if (defined($opt_rc{$_})) { - ${$ref->{$_}} = $opt_rc{$_}; - } elsif (defined($config->{$_})) { - ${$ref->{$_}} = $config->{$_}; - } - } -} - -sub warn_handler($) -{ - my ($msg) = @_; - - warn("$tool_name: $msg"); -} - -sub die_handler($) -{ - my ($msg) = @_; - - temp_cleanup(); - die("$tool_name: $msg"); -} - -sub abort_handler($) -{ - temp_cleanup(); - exit(1); -} - -sub temp_cleanup() -{ - # Ensure temp directory is not in use by current process - chdir("/"); - - if (@temp_dirs) { - info("Removing temporary directories.\n"); - foreach (@temp_dirs) { - rmtree($_); - } - @temp_dirs = (); - } -} - -sub setup_gkv_sys() -{ - system_no_output(3, "mount", "-t", "debugfs", "nodev", - "/sys/kernel/debug"); -} - -sub setup_gkv_proc() -{ - if (system_no_output(3, "modprobe", "gcov_proc")) { - system_no_output(3, "modprobe", "gcov_prof"); - } -} - -sub check_gkv_sys($) -{ - my ($dir) = @_; - - if (-e "$dir/reset") { - return 1; - } - return 0; -} - -sub check_gkv_proc($) -{ - my ($dir) = @_; - - if (-e "$dir/vmlinux") { - return 1; - } - return 0; -} - -sub setup_gkv() -{ - my $dir; - my $sys_dir = "/sys/kernel/debug/gcov"; - my $proc_dir = "/proc/gcov"; - my @todo; - - if (!defined($gcov_dir)) { - info("Auto-detecting gcov kernel support.\n"); - @todo = ( "cs", "cp", "ss", "cs", "sp", "cp" ); - } elsif ($gcov_dir =~ /proc/) { - info("Checking gcov kernel support at $gcov_dir ". - "(user-specified).\n"); - @todo = ( "cp", "sp", "cp", "cs", "ss", "cs"); - } else { - info("Checking gcov kernel support at $gcov_dir ". - "(user-specified).\n"); - @todo = ( "cs", "ss", "cs", "cp", "sp", "cp", ); - } - foreach (@todo) { - if ($_ eq "cs") { - # Check /sys - $dir = defined($gcov_dir) ? $gcov_dir : $sys_dir; - if (check_gkv_sys($dir)) { - info("Found ".$GKV_NAME[$GKV_SYS]." gcov ". - "kernel support at $dir\n"); - return ($GKV_SYS, $dir); - } - } elsif ($_ eq "cp") { - # Check /proc - $dir = defined($gcov_dir) ? $gcov_dir : $proc_dir; - if (check_gkv_proc($dir)) { - info("Found ".$GKV_NAME[$GKV_PROC]." gcov ". - "kernel support at $dir\n"); - return ($GKV_PROC, $dir); - } - } elsif ($_ eq "ss") { - # Setup /sys - setup_gkv_sys(); - } elsif ($_ eq "sp") { - # Setup /proc - setup_gkv_proc(); - } - } - if (defined($gcov_dir)) { - die("ERROR: could not find gcov kernel data at $gcov_dir\n"); - } else { - die("ERROR: no gcov kernel data found\n"); - } -} - - -# -# get_overall_line(found, hit, name_singular, name_plural) -# -# Return a string containing overall information for the specified -# found/hit data. -# - -sub get_overall_line($$$$) -{ - my ($found, $hit, $name_sn, $name_pl) = @_; - my $name; - - return "no data found" if (!defined($found) || $found == 0); - $name = ($found == 1) ? $name_sn : $name_pl; - - return rate($hit, $found, "% ($hit of $found $name)"); -} - - -# -# print_overall_rate(ln_do, ln_found, ln_hit, fn_do, fn_found, fn_hit, br_do -# br_found, br_hit) -# -# Print overall coverage rates for the specified coverage types. -# - -sub print_overall_rate($$$$$$$$$) -{ - my ($ln_do, $ln_found, $ln_hit, $fn_do, $fn_found, $fn_hit, - $br_do, $br_found, $br_hit) = @_; - - info("Summary coverage rate:\n"); - info(" lines......: %s\n", - get_overall_line($ln_found, $ln_hit, "line", "lines")) - if ($ln_do); - info(" functions..: %s\n", - get_overall_line($fn_found, $fn_hit, "function", "functions")) - if ($fn_do); - info(" branches...: %s\n", - get_overall_line($br_found, $br_hit, "branch", "branches")) - if ($br_do); -} - - -# -# rate(hit, found[, suffix, precision, width]) -# -# Return the coverage rate [0..100] for HIT and FOUND values. 0 is only -# returned when HIT is 0. 100 is only returned when HIT equals FOUND. -# PRECISION specifies the precision of the result. SUFFIX defines a -# string that is appended to the result if FOUND is non-zero. Spaces -# are added to the start of the resulting string until it is at least WIDTH -# characters wide. -# - -sub rate($$;$$$) -{ - my ($hit, $found, $suffix, $precision, $width) = @_; - my $rate; - - # Assign defaults if necessary - $precision = 1 if (!defined($precision)); - $suffix = "" if (!defined($suffix)); - $width = 0 if (!defined($width)); - - return sprintf("%*s", $width, "-") if (!defined($found) || $found == 0); - $rate = sprintf("%.*f", $precision, $hit * 100 / $found); - - # Adjust rates if necessary - if ($rate == 0 && $hit > 0) { - $rate = sprintf("%.*f", $precision, 1 / 10 ** $precision); - } elsif ($rate == 100 && $hit != $found) { - $rate = sprintf("%.*f", $precision, 100 - 1 / 10 ** $precision); - } - - return sprintf("%*s", $width, $rate.$suffix); -} diff --git a/ThirdParty/lcov/bin/updateversion.pl b/ThirdParty/lcov/bin/updateversion.pl deleted file mode 100755 index 19db81ecd..000000000 --- a/ThirdParty/lcov/bin/updateversion.pl +++ /dev/null @@ -1,194 +0,0 @@ -#!/usr/bin/env perl - -use strict; -use warnings; - -use File::Basename; - -sub update_man_page($); -sub update_bin_tool($); -sub update_txt_file($); -sub update_spec_file($); -sub write_version_file($); -sub get_file_info($); - -our $directory = $ARGV[0]; -our $version = $ARGV[1]; -our $release = $ARGV[2]; -our $full = $ARGV[3]; - -our @man_pages = ("man/gendesc.1", "man/genhtml.1", "man/geninfo.1", - "man/genpng.1", "man/lcov.1", "man/lcovrc.5"); -our @bin_tools = ("bin/gendesc", "bin/genhtml", "bin/geninfo", - "bin/genpng", "bin/lcov"); -our @txt_files = ("README"); -our @spec_files = ("rpm/lcov.spec"); - -if (!defined($directory) || !defined($version) || !defined($release)) { - die("Usage: $0 DIRECTORY|FILE VERSION RELEASE FULL_VERSION\n"); -} - -# Determine mode of operation -if (-f $directory) { - my $file = $directory; - my $base = basename($file); - - if (grep(/^$base$/, map({ basename($_) } @man_pages))) { - print("Updating man page $file\n"); - update_man_page($file); - } elsif (grep(/^$base$/, map({ basename($_) } @bin_tools))) { - print("Updating bin tool $file\n"); - update_bin_tool($file); - } elsif (grep(/^$base$/, map({ basename($_) } @txt_files))) { - print("Updating text file $file\n"); - update_txt_file($file); - } elsif (grep(/^$base$/, map({ basename($_) } @spec_files))) { - print("Updating spec file $file\n"); - update_spec_file($file); - } elsif ($base eq ".version") { - print("Updating version file $file\n"); - write_version_file($file); - } else { - print("WARNING: Skipping unknown file $file\n"); - } - print("Done.\n"); - exit(0); -} - -foreach (@man_pages) { - print("Updating man page $_\n"); - update_man_page($directory."/".$_); -} -foreach (@bin_tools) { - print("Updating bin tool $_\n"); - update_bin_tool($directory."/".$_); -} -foreach (@txt_files) { - print("Updating text file $_\n"); - update_txt_file($directory."/".$_); -} -foreach (@spec_files) { - print("Updating spec file $_\n"); - update_spec_file($directory."/".$_); -} -print("Updating version file $directory/.version\n"); -write_version_file("$directory/.version"); -print("Done.\n"); - -sub get_file_info($) -{ - my ($filename) = @_; - my ($sec, $min, $hour, $year, $month, $day); - my @stat; - my $gittime; - - return (0, 0, 0) if (!-e $filename); - @stat = stat($filename); - ($sec, $min, $hour, $day, $month, $year) = gmtime($stat[9]); - $year += 1900; - $month += 1; - - return (sprintf("%04d-%02d-%02d", $year, $month, $day), - sprintf("%04d%02d%02d%02d%02d.%02d", $year, $month, $day, - $hour, $min, $sec), - sprintf("%o", $stat[2] & 07777)); -} - -sub update_man_page($) -{ - my ($filename) = @_; - my @date = get_file_info($filename); - my $date_string = $date[0]; - local *IN; - local *OUT; - - $date_string =~ s/-/\\-/g; - open(IN, "<$filename") || die ("Error: cannot open $filename\n"); - open(OUT, ">$filename.new") || - die("Error: cannot create $filename.new\n"); - while (<IN>) { - s/\"LCOV\s+\d+\.\d+\"/\"LCOV $version\"/g; - s/\d\d\d\d\\\-\d\d\\\-\d\d/$date_string/g; - print(OUT $_); - } - close(OUT); - close(IN); - chmod(oct($date[2]), "$filename.new"); - system("mv", "-f", "$filename.new", "$filename"); - system("touch", "$filename", "-t", $date[1]); -} - -sub update_bin_tool($) -{ - my ($filename) = @_; - my @date = get_file_info($filename); - local *IN; - local *OUT; - - open(IN, "<$filename") || die ("Error: cannot open $filename\n"); - open(OUT, ">$filename.new") || - die("Error: cannot create $filename.new\n"); - while (<IN>) { - s/^(our\s+\$lcov_version\s*=).*$/$1 "LCOV version $full";/g; - print(OUT $_); - } - close(OUT); - close(IN); - chmod(oct($date[2]), "$filename.new"); - system("mv", "-f", "$filename.new", "$filename"); - system("touch", "$filename", "-t", $date[1]); -} - -sub update_txt_file($) -{ - my ($filename) = @_; - my @date = get_file_info($filename); - local *IN; - local *OUT; - - open(IN, "<$filename") || die ("Error: cannot open $filename\n"); - open(OUT, ">$filename.new") || - die("Error: cannot create $filename.new\n"); - while (<IN>) { - s/(Last\s+changes:\s+)\d\d\d\d-\d\d-\d\d/$1$date[0]/g; - print(OUT $_); - } - close(OUT); - close(IN); - chmod(oct($date[2]), "$filename.new"); - system("mv", "-f", "$filename.new", "$filename"); - system("touch", "$filename", "-t", $date[1]); -} - -sub update_spec_file($) -{ - my ($filename) = @_; - my @date = get_file_info($filename); - local *IN; - local *OUT; - - open(IN, "<$filename") || die ("Error: cannot open $filename\n"); - open(OUT, ">$filename.new") || - die("Error: cannot create $filename.new\n"); - while (<IN>) { - s/^(Version:\s*)\d+\.\d+.*$/$1$version/; - s/^(Release:\s*).*$/$1$release/; - print(OUT $_); - } - close(OUT); - close(IN); - system("mv", "-f", "$filename.new", "$filename"); - system("touch", "$filename", "-t", $date[1]); -} - -sub write_version_file($) -{ - my ($filename) = @_; - my $fd; - - open($fd, ">", $filename) or die("Error: cannot write $filename: $!\n"); - print($fd "VERSION=$version\n"); - print($fd "RELEASE=$release\n"); - print($fd "FULL=$full\n"); - close($fd); -} diff --git a/ThirdParty/lcov/example/Makefile b/ThirdParty/lcov/example/Makefile deleted file mode 100644 index 2f698a1b3..000000000 --- a/ThirdParty/lcov/example/Makefile +++ /dev/null @@ -1,98 +0,0 @@ -# -# Makefile for the LCOV example program. -# -# Make targets: -# - example: compile the example program -# - output: run test cases on example program and create HTML output -# - clean: clean up directory -# - -CC := gcc -CFLAGS := -Wall -I. -fprofile-arcs -ftest-coverage - -LCOV := ../bin/lcov -GENHTML := ../bin/genhtml -GENDESC := ../bin/gendesc -GENPNG := ../bin/genpng - -# Depending on the presence of the GD.pm perl module, we can use the -# special option '--frames' for genhtml -USE_GENPNG := $(shell $(GENPNG) --help >/dev/null 2>/dev/null; echo $$?) - -ifeq ($(USE_GENPNG),0) - FRAMES := --frames -else - FRAMES := -endif - -.PHONY: clean output test_noargs test_2_to_2000 test_overflow - -all: output - -example: example.o iterate.o gauss.o - $(CC) example.o iterate.o gauss.o -o example -lgcov - -example.o: example.c iterate.h gauss.h - $(CC) $(CFLAGS) -c example.c -o example.o - -iterate.o: methods/iterate.c iterate.h - $(CC) $(CFLAGS) -c methods/iterate.c -o iterate.o - -gauss.o: methods/gauss.c gauss.h - $(CC) $(CFLAGS) -c methods/gauss.c -o gauss.o - -output: example descriptions test_noargs test_2_to_2000 test_overflow - @echo - @echo '*' - @echo '* Generating HTML output' - @echo '*' - @echo - $(GENHTML) trace_noargs.info trace_args.info trace_overflow.info \ - --output-directory output --title "Basic example" \ - --show-details --description-file descriptions $(FRAMES) \ - --legend - @echo - @echo '*' - @echo '* See '`pwd`/output/index.html - @echo '*' - @echo - -descriptions: descriptions.txt - $(GENDESC) descriptions.txt -o descriptions - -all_tests: example test_noargs test_2_to_2000 test_overflow - -test_noargs: - @echo - @echo '*' - @echo '* Test case 1: running ./example without parameters' - @echo '*' - @echo - $(LCOV) --zerocounters --directory . - ./example - $(LCOV) --capture --directory . --output-file trace_noargs.info --test-name test_noargs --no-external - -test_2_to_2000: - @echo - @echo '*' - @echo '* Test case 2: running ./example 2 2000' - @echo '*' - @echo - $(LCOV) --zerocounters --directory . - ./example 2 2000 - $(LCOV) --capture --directory . --output-file trace_args.info --test-name test_2_to_2000 --no-external - -test_overflow: - @echo - @echo '*' - @echo '* Test case 3: running ./example 0 100000 (causes an overflow)' - @echo '*' - @echo - $(LCOV) --zerocounters --directory . - ./example 0 100000 || true - $(LCOV) --capture --directory . --output-file trace_overflow.info --test-name "test_overflow" --no-external - -clean: - rm -rf *.o *.bb *.bbg *.da *.gcno *.gcda *.info output example \ - descriptions - diff --git a/ThirdParty/lcov/example/README b/ThirdParty/lcov/example/README deleted file mode 100644 index cf6cf2e4c..000000000 --- a/ThirdParty/lcov/example/README +++ /dev/null @@ -1,6 +0,0 @@ - -To get an example of how the LCOV generated HTML output looks like, -type 'make output' and point a web browser to the resulting file - - output/index.html - diff --git a/ThirdParty/lcov/example/descriptions.txt b/ThirdParty/lcov/example/descriptions.txt deleted file mode 100644 index 47e602131..000000000 --- a/ThirdParty/lcov/example/descriptions.txt +++ /dev/null @@ -1,10 +0,0 @@ -test_noargs - Example program is called without arguments so that default range - [0..9] is used. - -test_2_to_2000 - Example program is called with "2" and "2000" as arguments. - -test_overflow - Example program is called with "0" and "100000" as arguments. The - resulting sum is too large to be stored as an int variable. diff --git a/ThirdParty/lcov/example/example.c b/ThirdParty/lcov/example/example.c deleted file mode 100644 index f9049aa64..000000000 --- a/ThirdParty/lcov/example/example.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * example.c - * - * Calculate the sum of a given range of integer numbers. The range is - * specified by providing two integer numbers as command line argument. - * If no arguments are specified, assume the predefined range [0..9]. - * Abort with an error message if the resulting number is too big to be - * stored as int variable. - * - * This program example is similar to the one found in the GCOV documentation. - * It is used to demonstrate the HTML output generated by LCOV. - * - * The program is split into 3 modules to better demonstrate the 'directory - * overview' function. There are also a lot of bloated comments inserted to - * artificially increase the source code size so that the 'source code - * overview' function makes at least a minimum of sense. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include "iterate.h" -#include "gauss.h" - -static int start = 0; -static int end = 9; - - -int main (int argc, char* argv[]) -{ - int total1, total2; - - /* Accept a pair of numbers as command line arguments. */ - - if (argc == 3) - { - start = atoi(argv[1]); - end = atoi(argv[2]); - } - - - /* Use both methods to calculate the result. */ - - total1 = iterate_get_sum (start, end); - total2 = gauss_get_sum (start, end); - - - /* Make sure both results are the same. */ - - if (total1 != total2) - { - printf ("Failure (%d != %d)!\n", total1, total2); - } - else - { - printf ("Success, sum[%d..%d] = %d\n", start, end, total1); - } - - return 0; -} diff --git a/ThirdParty/lcov/example/gauss.h b/ThirdParty/lcov/example/gauss.h deleted file mode 100644 index 302a4a980..000000000 --- a/ThirdParty/lcov/example/gauss.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef GAUSS_H -#define GAUSS_H GAUSS_h - -extern int gauss_get_sum (int min, int max); - -#endif /* GAUSS_H */ diff --git a/ThirdParty/lcov/example/iterate.h b/ThirdParty/lcov/example/iterate.h deleted file mode 100644 index 471327951..000000000 --- a/ThirdParty/lcov/example/iterate.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef ITERATE_H -#define ITERATE_H ITERATE_H - -extern int iterate_get_sum (int min, int max); - -#endif /* ITERATE_H */ diff --git a/ThirdParty/lcov/example/methods/gauss.c b/ThirdParty/lcov/example/methods/gauss.c deleted file mode 100644 index 9da3ce508..000000000 --- a/ThirdParty/lcov/example/methods/gauss.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * methods/gauss.c - * - * Calculate the sum of a given range of integer numbers. - * - * Somewhat of a more subtle way of calculation - and it even has a story - * behind it: - * - * Supposedly during math classes in elementary school, the teacher of - * young mathematician Gauss gave the class an assignment to calculate the - * sum of all natural numbers between 1 and 100, hoping that this task would - * keep the kids occupied for some time. The story goes that Gauss had the - * result ready after only a few minutes. What he had written on his black - * board was something like this: - * - * 1 + 100 = 101 - * 2 + 99 = 101 - * 3 + 98 = 101 - * . - * . - * 100 + 1 = 101 - * - * s = (1/2) * 100 * 101 = 5050 - * - * A more general form of this formula would be - * - * s = (1/2) * (max + min) * (max - min + 1) - * - * which is used in the piece of code below to implement the requested - * function in constant time, i.e. without dependencies on the size of the - * input parameters. - * - */ - -#include "gauss.h" - - -int gauss_get_sum (int min, int max) -{ - /* This algorithm doesn't work well with invalid range specifications - so we're intercepting them here. */ - if (max < min) - { - return 0; - } - - return (int) ((max + min) * (double) (max - min + 1) / 2); -} diff --git a/ThirdParty/lcov/example/methods/iterate.c b/ThirdParty/lcov/example/methods/iterate.c deleted file mode 100644 index 023d1801c..000000000 --- a/ThirdParty/lcov/example/methods/iterate.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * methods/iterate.c - * - * Calculate the sum of a given range of integer numbers. - * - * This particular method of implementation works by way of brute force, - * i.e. it iterates over the entire range while adding the numbers to finally - * get the total sum. As a positive side effect, we're able to easily detect - * overflows, i.e. situations in which the sum would exceed the capacity - * of an integer variable. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include "iterate.h" - - -int iterate_get_sum (int min, int max) -{ - int i, total; - - total = 0; - - /* This is where we loop over each number in the range, including - both the minimum and the maximum number. */ - - for (i = min; i <= max; i++) - { - /* We can detect an overflow by checking whether the new - sum would become negative. */ - - if (total + i < total) - { - printf ("Error: sum too large!\n"); - exit (1); - } - - /* Everything seems to fit into an int, so continue adding. */ - - total += i; - } - - return total; -} diff --git a/ThirdParty/lcov/lcovrc b/ThirdParty/lcov/lcovrc deleted file mode 100644 index 40f364f17..000000000 --- a/ThirdParty/lcov/lcovrc +++ /dev/null @@ -1,169 +0,0 @@ -# -# /etc/lcovrc - system-wide defaults for LCOV -# -# To change settings for a single user, place a customized copy of this file -# at location ~/.lcovrc -# - -# Specify an external style sheet file (same as --css-file option of genhtml) -#genhtml_css_file = gcov.css - -# Specify coverage rate limits (in %) for classifying file entries -# HI: hi_limit <= rate <= 100 graph color: green -# MED: med_limit <= rate < hi_limit graph color: orange -# LO: 0 <= rate < med_limit graph color: red -genhtml_hi_limit = 90 -genhtml_med_limit = 75 - -# Width of line coverage field in source code view -genhtml_line_field_width = 12 - -# Width of branch coverage field in source code view -genhtml_branch_field_width = 16 - -# Width of overview image (used by --frames option of genhtml) -genhtml_overview_width = 80 - -# Resolution of overview navigation: this number specifies the maximum -# difference in lines between the position a user selected from the overview -# and the position the source code window is scrolled to (used by --frames -# option of genhtml) -genhtml_nav_resolution = 4 - -# Clicking a line in the overview image should show the source code view at -# a position a bit further up so that the requested line is not the first -# line in the window. This number specifies that offset in lines (used by -# --frames option of genhtml) -genhtml_nav_offset = 10 - -# Do not remove unused test descriptions if non-zero (same as -# --keep-descriptions option of genhtml) -genhtml_keep_descriptions = 0 - -# Do not remove prefix from directory names if non-zero (same as --no-prefix -# option of genhtml) -genhtml_no_prefix = 0 - -# Do not create source code view if non-zero (same as --no-source option of -# genhtml) -genhtml_no_source = 0 - -# Replace tabs with number of spaces in source view (same as --num-spaces -# option of genhtml) -genhtml_num_spaces = 8 - -# Highlight lines with converted-only data if non-zero (same as --highlight -# option of genhtml) -genhtml_highlight = 0 - -# Include color legend in HTML output if non-zero (same as --legend option of -# genhtml) -genhtml_legend = 0 - -# Use FILE as HTML prolog for generated pages (same as --html-prolog option of -# genhtml) -#genhtml_html_prolog = FILE - -# Use FILE as HTML epilog for generated pages (same as --html-epilog option of -# genhtml) -#genhtml_html_epilog = FILE - -# Use custom filename extension for pages (same as --html-extension option of -# genhtml) -#genhtml_html_extension = html - -# Compress all generated html files with gzip. -#genhtml_html_gzip = 1 - -# Include sorted overview pages (can be disabled by the --no-sort option of -# genhtml) -genhtml_sort = 1 - -# Include function coverage data display (can be disabled by the -# --no-func-coverage option of genhtml) -#genhtml_function_coverage = 1 - -# Include branch coverage data display (can be disabled by the -# --no-branch-coverage option of genhtml) -#genhtml_branch_coverage = 1 - -# Specify the character set of all generated HTML pages -genhtml_charset=UTF-8 - -# Allow HTML markup in test case description text if non-zero -genhtml_desc_html=0 - -# Specify the precision for coverage rates -#genhtml_precision=1 - -# Show missed counts instead of hit counts -#genhtml_missed=1 - -# Demangle C++ symbols -#genhtml_demangle_cpp=1 - -# Location of the gcov tool (same as --gcov-info option of geninfo) -#geninfo_gcov_tool = gcov - -# Adjust test names to include operating system information if non-zero -#geninfo_adjust_testname = 0 - -# Calculate checksum for each source code line if non-zero (same as --checksum -# option of geninfo if non-zero, same as --no-checksum if zero) -#geninfo_checksum = 1 - -# Specify whether to capture coverage data for external source files (can -# be overridden by the --external and --no-external options of geninfo/lcov) -#geninfo_external = 1 - -# Enable libtool compatibility mode if non-zero (same as --compat-libtool option -# of geninfo if non-zero, same as --no-compat-libtool if zero) -#geninfo_compat_libtool = 0 - -# Use gcov's --all-blocks option if non-zero -#geninfo_gcov_all_blocks = 1 - -# Specify compatiblity modes (same as --compat option of geninfo). -#geninfo_compat = libtool=on, hammer=auto, split_crc=auto - -# Adjust path to source files by removing or changing path components that -# match the specified pattern (Perl regular expression format) -#geninfo_adjust_src_path = /tmp/build => /usr/src - -# Specify if geninfo should try to automatically determine the base-directory -# when collecting coverage data. -geninfo_auto_base = 1 - -# Directory containing gcov kernel files -# lcov_gcov_dir = /proc/gcov - -# Location of the insmod tool -lcov_insmod_tool = /sbin/insmod - -# Location of the modprobe tool -lcov_modprobe_tool = /sbin/modprobe - -# Location of the rmmod tool -lcov_rmmod_tool = /sbin/rmmod - -# Location for temporary directories -lcov_tmp_dir = /tmp - -# Show full paths during list operation if non-zero (same as --list-full-path -# option of lcov) -lcov_list_full_path = 0 - -# Specify the maximum width for list output. This value is ignored when -# lcov_list_full_path is non-zero. -lcov_list_width = 80 - -# Specify the maximum percentage of file names which may be truncated when -# choosing a directory prefix in list output. This value is ignored when -# lcov_list_full_path is non-zero. -lcov_list_truncate_max = 20 - -# Specify if function coverage data should be collected and processed. -lcov_function_coverage = 1 - -# Specify if branch coverage data should be collected and processed. -lcov_branch_coverage = 0 diff --git a/ThirdParty/lcov/man/gendesc.1 b/ThirdParty/lcov/man/gendesc.1 deleted file mode 100644 index 9c9a7084d..000000000 --- a/ThirdParty/lcov/man/gendesc.1 +++ /dev/null @@ -1,78 +0,0 @@ -.TH gendesc 1 "LCOV 1.14" 2019\-02\-28 "User Manuals" -.SH NAME -gendesc \- Generate a test case description file -.SH SYNOPSIS -.B gendesc -.RB [ \-h | \-\-help ] -.RB [ \-v | \-\-version ] -.RS 8 -.br -.RB [ \-o | \-\-output\-filename -.IR filename ] -.br -.I inputfile -.SH DESCRIPTION -Convert plain text test case descriptions into a format as understood by -.BR genhtml . -.I inputfile -needs to observe the following format: - -For each test case: -.IP " \-" -one line containing the test case name beginning at the start of the line -.RE -.IP " \-" -one or more lines containing the test case description indented with at -least one whitespace character (tab or space) -.RE - -.B Example input file: - -test01 -.RS -An example test case description. -.br -Description continued -.RE - -test42 -.RS -Supposedly the answer to most of your questions -.RE - -Note: valid test names can consist of letters, decimal digits and the -underscore character ('_'). -.SH OPTIONS -.B \-h -.br -.B \-\-help -.RS -Print a short help text, then exit. -.RE - -.B \-v -.br -.B \-\-version -.RS -Print version number, then exit. -.RE - - -.BI "\-o " filename -.br -.BI "\-\-output\-filename " filename -.RS -Write description data to -.IR filename . - -By default, output is written to STDOUT. -.RE -.SH AUTHOR -Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> - -.SH SEE ALSO -.BR lcov (1), -.BR genhtml (1), -.BR geninfo (1), -.BR genpng (1), -.BR gcov (1) diff --git a/ThirdParty/lcov/man/genhtml.1 b/ThirdParty/lcov/man/genhtml.1 deleted file mode 100644 index 949bd4c57..000000000 --- a/ThirdParty/lcov/man/genhtml.1 +++ /dev/null @@ -1,600 +0,0 @@ -.TH genhtml 1 "LCOV 1.14" 2019\-02\-28 "User Manuals" -.SH NAME -genhtml \- Generate HTML view from LCOV coverage data files -.SH SYNOPSIS -.B genhtml -.RB [ \-h | \-\-help ] -.RB [ \-v | \-\-version ] -.RS 8 -.br -.RB [ \-q | \-\-quiet ] -.RB [ \-s | \-\-show\-details ] -.RB [ \-f | \-\-frames ] -.br -.RB [ \-b | \-\-baseline\-file ] -.IR baseline\-file -.br -.RB [ \-o | \-\-output\-directory -.IR output\-directory ] -.br -.RB [ \-t | \-\-title -.IR title ] -.br -.RB [ \-d | \-\-description\-file -.IR description\-file ] -.br -.RB [ \-k | \-\-keep\-descriptions ] -.RB [ \-c | \-\-css\-file -.IR css\-file ] -.br -.RB [ \-p | \-\-prefix -.IR prefix ] -.RB [ \-\-no\-prefix ] -.br -.RB [ \-\-no\-source ] -.RB [ \-\-num\-spaces -.IR num ] -.RB [ \-\-highlight ] -.br -.RB [ \-\-legend ] -.RB [ \-\-html\-prolog -.IR prolog\-file ] -.br -.RB [ \-\-html\-epilog -.IR epilog\-file ] -.RB [ \-\-html\-extension -.IR extension ] -.br -.RB [ \-\-html\-gzip ] -.RB [ \-\-sort ] -.RB [ \-\-no\-sort ] -.br -.RB [ \-\-function\-coverage ] -.RB [ \-\-no\-function\-coverage ] -.br -.RB [ \-\-branch\-coverage ] -.RB [ \-\-no\-branch\-coverage ] -.br -.RB [ \-\-demangle\-cpp ] -.RB [ \-\-ignore\-errors -.IR errors ] -.br -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RB [ \-\-precision -.RB [ \-\-missed ] -.br -.IR tracefile(s) -.RE -.SH DESCRIPTION -Create an HTML view of coverage data found in -.IR tracefile . -Note that -.I tracefile -may also be a list of filenames. - -HTML output files are created in the current working directory unless the -\-\-output\-directory option is used. If -.I tracefile -ends with ".gz", it is assumed to be GZIP\-compressed and the gunzip tool -will be used to decompress it transparently. - -Note that all source code files have to be present and readable at the -exact file system location they were compiled. - -Use option -.I \--css\-file -to modify layout and colors of the generated HTML output. Files are -marked in different colors depending on the associated coverage rate. By -default, the coverage limits for low, medium and high coverage are set to -0\-75%, 75\-90% and 90\-100% percent respectively. To change these -values, use configuration file options -.IR genhtml_hi_limit " and " genhtml_med_limit . - -Also note that when displaying percentages, 0% and 100% are only printed when -the values are exactly 0% and 100% respectively. Other values which would -conventionally be rounded to 0% or 100% are instead printed as nearest -non-boundary value. This behavior is in accordance with that of the -.BR gcov (1) -tool. - -.SH OPTIONS -.B \-h -.br -.B \-\-help -.RS -Print a short help text, then exit. - -.RE -.B \-v -.br -.B \-\-version -.RS -Print version number, then exit. - -.RE -.B \-q -.br -.B \-\-quiet -.RS -Do not print progress messages. - -Suppresses all informational progress output. When this switch is enabled, -only error or warning messages are printed. - -.RE -.B \-f -.br -.B \-\-frames -.RS -Use HTML frames for source code view. - -If enabled, a frameset is created for each source code file, providing -an overview of the source code as a "clickable" image. Note that this -option will slow down output creation noticeably because each source -code character has to be inspected once. Note also that the GD.pm Perl -module has to be installed for this option to work (it may be obtained -from http://www.cpan.org). - -.RE -.B \-s -.br -.B \-\-show\-details -.RS -Generate detailed directory view. - -When this option is enabled, -.B genhtml -generates two versions of each -file view. One containing the standard information plus a link to a -"detailed" version. The latter additionally contains information about -which test case covered how many lines of each source file. - -.RE -.BI "\-b " baseline\-file -.br -.BI "\-\-baseline\-file " baseline\-file -.RS -Use data in -.I baseline\-file -as coverage baseline. - -The tracefile specified by -.I baseline\-file -is read and all counts found in the original -.I tracefile -are decremented by the corresponding counts in -.I baseline\-file -before creating any output. - -Note that when a count for a particular line in -.I baseline\-file -is greater than the count in the -.IR tracefile , -the result is zero. - -.RE -.BI "\-o " output\-directory -.br -.BI "\-\-output\-directory " output\-directory -.RS -Create files in -.I output\-directory. - -Use this option to tell -.B genhtml -to write the resulting files to a directory other than -the current one. If -.I output\-directory -does not exist, it will be created. - -It is advisable to use this option since depending on the -project size, a lot of files and subdirectories may be created. - -.RE -.BI "\-t " title -.br -.BI "\-\-title " title -.RS -Display -.I title -in header of all pages. - -.I title -is written to the header portion of each generated HTML page to -identify the context in which a particular output -was created. By default this is the name of the tracefile. - -.RE -.BI "\-d " description\-file -.br -.BI "\-\-description\-file " description\-file -.RS -Read test case descriptions from -.IR description\-file . - -All test case descriptions found in -.I description\-file -and referenced in the input data file are read and written to an extra page -which is then incorporated into the HTML output. - -The file format of -.IR "description\-file " is: - -for each test case: -.RS -TN:<testname> -.br -TD:<test description> - -.RE - -Valid test case names can consist of letters, numbers and the underscore -character ('_'). -.RE -.B \-k -.br -.B \-\-keep\-descriptions -.RS -Do not remove unused test descriptions. - -Keep descriptions found in the description file even if the coverage data -indicates that the associated test case did not cover any lines of code. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_keep_descriptions . - -.RE -.BI "\-c " css\-file -.br -.BI "\-\-css\-file " css\-file -.RS -Use external style sheet file -.IR css\-file . - -Using this option, an extra .css file may be specified which will replace -the default one. This may be helpful if the default colors make your eyes want -to jump out of their sockets :) - -This option can also be configured permanently using the configuration file -option -.IR genhtml_css_file . - -.RE -.BI "\-p " prefix -.br -.BI "\-\-prefix " prefix -.RS -Remove -.I prefix -from all directory names. - -Because lists containing long filenames are difficult to read, there is a -mechanism implemented that will automatically try to shorten all directory -names on the overview page beginning with a common prefix. By default, -this is done using an algorithm that tries to find the prefix which, when -applied, will minimize the resulting sum of characters of all directory -names. - -Use this option to specify the prefix to be removed by yourself. - -.RE -.B \-\-no\-prefix -.RS -Do not remove prefix from directory names. - -This switch will completely disable the prefix mechanism described in the -previous section. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_no_prefix . - -.RE -.B \-\-no\-source -.RS -Do not create source code view. - -Use this switch if you don't want to get a source code view for each file. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_no_source . - -.RE -.BI "\-\-num\-spaces " spaces -.RS -Replace tabs in source view with -.I num -spaces. - -Default value is 8. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_num_spaces . - -.RE -.B \-\-highlight -.RS -Highlight lines with converted\-only coverage data. - -Use this option in conjunction with the \-\-diff option of -.B lcov -to highlight those lines which were only covered in data sets which were -converted from previous source code versions. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_highlight . - -.RE -.B \-\-legend -.RS -Include color legend in HTML output. - -Use this option to include a legend explaining the meaning of color coding -in the resulting HTML output. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_legend . - -.RE -.BI "\-\-html\-prolog " prolog\-file -.RS -Read customized HTML prolog from -.IR prolog\-file . - -Use this option to replace the default HTML prolog (the initial part of the -HTML source code leading up to and including the <body> tag) with the contents -of -.IR prolog\-file . -Within the prolog text, the following words will be replaced when a page is generated: - -.B "@pagetitle@" -.br -The title of the page. - -.B "@basedir@" -.br -A relative path leading to the base directory (e.g. for locating css\-files). - -This option can also be configured permanently using the configuration file -option -.IR genhtml_html_prolog . - -.RE -.BI "\-\-html\-epilog " epilog\-file -.RS -Read customized HTML epilog from -.IR epilog\-file . - -Use this option to replace the default HTML epilog (the final part of the HTML -source including </body>) with the contents of -.IR epilog\-file . - -Within the epilog text, the following words will be replaced when a page is generated: - -.B "@basedir@" -.br -A relative path leading to the base directory (e.g. for locating css\-files). - -This option can also be configured permanently using the configuration file -option -.IR genhtml_html_epilog . - -.RE -.BI "\-\-html\-extension " extension -.RS -Use customized filename extension for generated HTML pages. - -This option is useful in situations where different filename extensions -are required to render the resulting pages correctly (e.g. php). Note that -a '.' will be inserted between the filename and the extension specified by -this option. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_html_extension . -.RE - -.B \-\-html\-gzip -.RS -Compress all generated html files with gzip and add a .htaccess file specifying -gzip\-encoding in the root output directory. - -Use this option if you want to save space on your webserver. Requires a -webserver with .htaccess support and a browser with support for gzip -compressed html. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_html_gzip . - -.RE -.B \-\-sort -.br -.B \-\-no\-sort -.RS -Specify whether to include sorted views of file and directory overviews. - -Use \-\-sort to include sorted views or \-\-no\-sort to not include them. -Sorted views are -.B enabled -by default. - -When sorted views are enabled, each overview page will contain links to -views of that page sorted by coverage rate. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_sort . - -.RE -.B \-\-function\-coverage -.br -.B \-\-no\-function\-coverage -.RS -Specify whether to display function coverage summaries in HTML output. - -Use \-\-function\-coverage to enable function coverage summaries or -\-\-no\-function\-coverage to disable it. Function coverage summaries are -.B enabled -by default - -When function coverage summaries are enabled, each overview page will contain -the number of functions found and hit per file or directory, together with -the resulting coverage rate. In addition, each source code view will contain -a link to a page which lists all functions found in that file plus the -respective call count for those functions. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_function_coverage . - -.RE -.B \-\-branch\-coverage -.br -.B \-\-no\-branch\-coverage -.RS -Specify whether to display branch coverage data in HTML output. - -Use \-\-branch\-coverage to enable branch coverage display or -\-\-no\-branch\-coverage to disable it. Branch coverage data display is -.B enabled -by default - -When branch coverage display is enabled, each overview page will contain -the number of branches found and hit per file or directory, together with -the resulting coverage rate. In addition, each source code view will contain -an extra column which lists all branches of a line with indications of -whether the branch was taken or not. Branches are shown in the following format: - - ' + ': Branch was taken at least once -.br - ' - ': Branch was not taken -.br - ' # ': The basic block containing the branch was never executed -.br - -Note that it might not always be possible to relate branches to the -corresponding source code statements: during compilation, GCC might shuffle -branches around or eliminate some of them to generate better code. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_branch_coverage . - -.RE -.B \-\-demangle\-cpp -.RS -Specify whether to demangle C++ function names. - -Use this option if you want to convert C++ internal function names to -human readable format for display on the HTML function overview page. -This option requires that the c++filt tool is installed (see -.BR c++filt (1)). - -.RE -.B \-\-ignore\-errors -.I errors -.br -.RS -Specify a list of errors after which to continue processing. - -Use this option to specify a list of one or more classes of errors after which -geninfo should continue processing instead of aborting. - -.I errors -can be a comma\-separated list of the following keywords: - -.B source: -the source code file for a data set could not be found. -.RE - -.B \-\-config\-file -.I config\-file -.br -.RS -Specify a configuration file to use. - -When this option is specified, neither the system\-wide configuration file -/etc/lcovrc, nor the per\-user configuration file ~/.lcovrc is read. - -This option may be useful when there is a need to run several -instances of -.B genhtml -with different configuration file options in parallel. -.RE - -.B \-\-rc -.IR keyword = value -.br -.RS -Override a configuration directive. - -Use this option to specify a -.IR keyword = value -statement which overrides the corresponding configuration statement in -the lcovrc configuration file. You can specify this option more than once -to override multiple configuration statements. -See -.BR lcovrc (5) -for a list of available keywords and their meaning. -.RE - -.BI "\-\-precision " num -.RS -Show coverage rates with -.I num -number of digits after the decimal-point. - -Default value is 1. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_precision . -.RE - -.B \-\-missed -.RS -Show counts of missed lines, functions, or branches - -Use this option to change overview pages to show the count of lines, functions, -or branches that were not hit. These counts are represented by negative numbers. - -When specified together with \-\-sort, file and directory views will be sorted -by missed counts. - -This option can also be configured permanently using the configuration file -option -.IR genhtml_missed . -.RE - -.SH FILES - -.I /etc/lcovrc -.RS -The system\-wide configuration file. -.RE - -.I ~/.lcovrc -.RS -The per\-user configuration file. -.RE - -.SH AUTHOR -Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> - -.SH SEE ALSO -.BR lcov (1), -.BR lcovrc (5), -.BR geninfo (1), -.BR genpng (1), -.BR gendesc (1), -.BR gcov (1) diff --git a/ThirdParty/lcov/man/geninfo.1 b/ThirdParty/lcov/man/geninfo.1 deleted file mode 100644 index 2ce917126..000000000 --- a/ThirdParty/lcov/man/geninfo.1 +++ /dev/null @@ -1,578 +0,0 @@ -.TH geninfo 1 "LCOV 1.14" 2019\-02\-28 "User Manuals" -.SH NAME -geninfo \- Generate tracefiles from .da files -.SH SYNOPSIS -.B geninfo -.RB [ \-h | \-\-help ] -.RB [ \-v | \-\-version ] -.RB [ \-q | \-\-quiet ] -.br -.RS 8 -.RB [ \-i | \-\-initial ] -.RB [ \-t | \-\-test\-name -.IR test\-name ] -.br -.RB [ \-o | \-\-output\-filename -.IR filename ] -.RB [ \-f | \-\-follow ] -.br -.RB [ \-b | \-\-base\-directory -.IR directory ] -.br -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.br -.RB [ \-\-compat\-libtool ] -.RB [ \-\-no\-compat\-libtool ] -.br -.RB [ \-\-gcov\-tool -.IR tool ] -.RB [ \-\-ignore\-errors -.IR errors ] -.br -.RB [ \-\-no\-recursion ] -.I directory -.RB [ \-\-external ] -.RB [ \-\-no\-external ] -.br -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-no\-markers ] -.br -.RB [ \-\-derive\-func\-data ] -.RB [ \-\-compat -.IR mode =on|off|auto] -.br -.RB [ \-\-rc -.IR keyword = value ] -.br -.RB [ \-\-include -.IR pattern ] -.RB [ \-\-exclude -.IR pattern ] -.RE -.SH DESCRIPTION -.B geninfo -converts all GCOV coverage data files found in -.I directory -into tracefiles, which the -.B genhtml -tool can convert to HTML output. - -Unless the \-\-output\-filename option is specified, -.B geninfo -writes its -output to one file per .da file, the name of which is generated by simply -appending ".info" to the respective .da file name. - -Note that the current user needs write access to both -.I directory -as well as to the original source code location. This is necessary because -some temporary files have to be created there during the conversion process. - -Note also that -.B geninfo -is called from within -.BR lcov , -so that there is usually no need to call it directly. - -.B Exclusion markers - -To exclude specific lines of code from a tracefile, you can add exclusion -markers to the source code. Additionally you can exclude specific branches from -branch coverage without excluding the involved lines from line and function -coverage. Exclusion markers are keywords which can for example be added in the -form of a comment. -See -.BR lcovrc (5) -how to override some of them. - -The following markers are recognized by geninfo: - -LCOV_EXCL_LINE -.RS -Lines containing this marker will be excluded. -.br -.RE -LCOV_EXCL_START -.RS -Marks the beginning of an excluded section. The current line is part of this -section. -.br -.RE -LCOV_EXCL_STOP -.RS -Marks the end of an excluded section. The current line not part of this -section. -.RE -.br -LCOV_EXCL_BR_LINE -.RS -Lines containing this marker will be excluded from branch coverage. -.br -.RE -LCOV_EXCL_BR_START -.RS -Marks the beginning of a section which is excluded from branch coverage. The -current line is part of this section. -.br -.RE -LCOV_EXCL_BR_STOP -.RS -Marks the end of a section which is excluded from branch coverage. The current -line not part of this section. -.RE -.br - -.SH OPTIONS - -.B \-b -.I directory -.br -.B \-\-base\-directory -.I directory -.br -.RS -.RI "Use " directory -as base directory for relative paths. - -Use this option to specify the base directory of a build\-environment -when geninfo produces error messages like: - -.RS -ERROR: could not read source file /home/user/project/subdir1/subdir2/subdir1/subdir2/file.c -.RE - -In this example, use /home/user/project as base directory. - -This option is required when using geninfo on projects built with libtool or -similar build environments that work with a base directory, i.e. environments, -where the current working directory when invoking the compiler is not the same -directory in which the source code file is located. - -Note that this option will not work in environments where multiple base -directories are used. In that case use configuration file setting -.B geninfo_auto_base=1 -(see -.BR lcovrc (5)). -.RE - -.B \-\-checksum -.br -.B \-\-no\-checksum -.br -.RS -Specify whether to generate checksum data when writing tracefiles. - -Use \-\-checksum to enable checksum generation or \-\-no\-checksum to -disable it. Checksum generation is -.B disabled -by default. - -When checksum generation is enabled, a checksum will be generated for each -source code line and stored along with the coverage data. This checksum will -be used to prevent attempts to combine coverage data from different source -code versions. - -If you don't work with different source code versions, disable this option -to speed up coverage data processing and to reduce the size of tracefiles. -.RE - -.B \-\-compat -.IR mode = value [, mode = value ,...] -.br -.RS -Set compatibility mode. - -Use \-\-compat to specify that geninfo should enable one or more compatibility -modes when capturing coverage data. You can provide a comma-separated list -of mode=value pairs to specify the values for multiple modes. - -Valid -.I values -are: - -.B on -.RS -Enable compatibility mode. -.RE -.B off -.RS -Disable compatibility mode. -.RE -.B auto -.RS -Apply auto-detection to determine if compatibility mode is required. Note that -auto-detection is not available for all compatibility modes. -.RE - -If no value is specified, 'on' is assumed as default value. - -Valid -.I modes -are: - -.B libtool -.RS -Enable this mode if you are capturing coverage data for a project that -was built using the libtool mechanism. See also -\-\-compat\-libtool. - -The default value for this setting is 'on'. - -.RE -.B hammer -.RS -Enable this mode if you are capturing coverage data for a project that -was built using a version of GCC 3.3 that contains a modification -(hammer patch) of later GCC versions. You can identify a modified GCC 3.3 -by checking the build directory of your project for files ending in the -extension '.bbg'. Unmodified versions of GCC 3.3 name these files '.bb'. - -The default value for this setting is 'auto'. - -.RE -.B split_crc -.RS -Enable this mode if you are capturing coverage data for a project that -was built using a version of GCC 4.6 that contains a modification -(split function checksums) of later GCC versions. Typical error messages -when running geninfo on coverage data produced by such GCC versions are -\'out of memory' and 'reached unexpected end of file'. - -The default value for this setting is 'auto' -.RE - -.RE - -.B \-\-compat\-libtool -.br -.B \-\-no\-compat\-libtool -.br -.RS -Specify whether to enable libtool compatibility mode. - -Use \-\-compat\-libtool to enable libtool compatibility mode or \-\-no\-compat\-libtool -to disable it. The libtool compatibility mode is -.B enabled -by default. - -When libtool compatibility mode is enabled, geninfo will assume that the source -code relating to a .da file located in a directory named ".libs" can be -found in its parent directory. - -If you have directories named ".libs" in your build environment but don't use -libtool, disable this option to prevent problems when capturing coverage data. -.RE - -.B \-\-config\-file -.I config\-file -.br -.RS -Specify a configuration file to use. - -When this option is specified, neither the system\-wide configuration file -/etc/lcovrc, nor the per\-user configuration file ~/.lcovrc is read. - -This option may be useful when there is a need to run several -instances of -.B geninfo -with different configuration file options in parallel. -.RE - -.B \-\-derive\-func\-data -.br -.RS -Calculate function coverage data from line coverage data. - -Use this option to collect function coverage data, even if the version of the -gcov tool installed on the test system does not provide this data. lcov will -instead derive function coverage data from line coverage data and -information about which lines belong to a function. -.RE - -.B \-\-exclude -.I pattern -.br -.RS -Exclude source files matching -.IR pattern . - -Use this switch if you want to exclude coverage data for a particular set -of source files matching any of the given patterns. Multiple patterns can be -specified by using multiple -.B --exclude -command line switches. The -.I patterns -will be interpreted as shell wildcard patterns (note that they may need to be -escaped accordingly to prevent the shell from expanding them first). - -Can be combined with the -.B --include -command line switch. If a given file matches both the include pattern and the -exclude pattern, the exclude pattern will take precedence. -.RE - -.B \-\-external -.br -.B \-\-no\-external -.br -.RS -Specify whether to capture coverage data for external source files. - -External source files are files which are not located in one of the directories -specified by \-\-directory or \-\-base\-directory. Use \-\-external to include -external source files while capturing coverage data or \-\-no\-external to -ignore this data. - -Data for external source files is -.B included -by default. -.RE - -.B \-f -.br -.B \-\-follow -.RS -Follow links when searching .da files. -.RE - -.B \-\-gcov\-tool -.I tool -.br -.RS -Specify the location of the gcov tool. -.RE - -.B \-h -.br -.B \-\-help -.RS -Print a short help text, then exit. -.RE - -.B \-\-include -.I pattern -.br -.RS -Include source files matching -.IR pattern . - -Use this switch if you want to include coverage data for only a particular set -of source files matching any of the given patterns. Multiple patterns can be -specified by using multiple -.B --include -command line switches. The -.I patterns -will be interpreted as shell wildcard patterns (note that they may need to be -escaped accordingly to prevent the shell from expanding them first). -.RE - -.B \-\-ignore\-errors -.I errors -.br -.RS -Specify a list of errors after which to continue processing. - -Use this option to specify a list of one or more classes of errors after which -geninfo should continue processing instead of aborting. - -.I errors -can be a comma\-separated list of the following keywords: - -.B gcov: -the gcov tool returned with a non\-zero return code. - -.B source: -the source code file for a data set could not be found. -.RE - -.B \-i -.br -.B \-\-initial -.RS -Capture initial zero coverage data. - -Run geninfo with this option on the directories containing .bb, .bbg or .gcno -files before running any test case. The result is a "baseline" coverage data -file that contains zero coverage for every instrumented line and function. -Combine this data file (using lcov \-a) with coverage data files captured -after a test run to ensure that the percentage of total lines covered is -correct even when not all object code files were loaded during the test. - -Note: currently, the \-\-initial option does not generate branch coverage -information. -.RE - -.B \-\-no\-markers -.br -.RS -Use this option if you want to get coverage data without regard to exclusion -markers in the source code file. -.RE - -.B \-\-no\-recursion -.br -.RS -Use this option if you want to get coverage data for the specified directory -only without processing subdirectories. -.RE - -.BI "\-o " output\-filename -.br -.BI "\-\-output\-filename " output\-filename -.RS -Write all data to -.IR output\-filename . - -If you want to have all data written to a single file (for easier -handling), use this option to specify the respective filename. By default, -one tracefile will be created for each processed .da file. -.RE - -.B \-q -.br -.B \-\-quiet -.RS -Do not print progress messages. - -Suppresses all informational progress output. When this switch is enabled, -only error or warning messages are printed. -.RE - -.B \-\-rc -.IR keyword = value -.br -.RS -Override a configuration directive. - -Use this option to specify a -.IR keyword = value -statement which overrides the corresponding configuration statement in -the lcovrc configuration file. You can specify this option more than once -to override multiple configuration statements. -See -.BR lcovrc (5) -for a list of available keywords and their meaning. -.RE - -.BI "\-t " testname -.br -.BI "\-\-test\-name " testname -.RS -Use test case name -.I testname -for resulting data. Valid test case names can consist of letters, decimal -digits and the underscore character ('_'). - -This proves useful when data from several test cases is merged (i.e. by -simply concatenating the respective tracefiles) in which case a test -name can be used to differentiate between data from each test case. -.RE - -.B \-v -.br -.B \-\-version -.RS -Print version number, then exit. -.RE - - -.SH FILES - -.I /etc/lcovrc -.RS -The system\-wide configuration file. -.RE - -.I ~/.lcovrc -.RS -The per\-user configuration file. -.RE - -Following is a quick description of the tracefile format as used by -.BR genhtml ", " geninfo " and " lcov . - -A tracefile is made up of several human\-readable lines of text, -divided into sections. If available, a tracefile begins with the -.I testname -which is stored in the following format: - - TN:<test name> - -For each source file referenced in the .da file, there is a section containing -filename and coverage data: - - SF:<absolute path to the source file> - -Following is a list of line numbers for each function name found in the -source file: - - FN:<line number of function start>,<function name> - -Next, there is a list of execution counts for each instrumented function: - - FNDA:<execution count>,<function name> - -This list is followed by two lines containing the number of functions found -and hit: - - FNF:<number of functions found> - FNH:<number of function hit> - -Branch coverage information is stored which one line per branch: - - BRDA:<line number>,<block number>,<branch number>,<taken> - -Block number and branch number are gcc internal IDs for the branch. Taken is -either '-' if the basic block containing the branch was never executed or -a number indicating how often that branch was taken. - -Branch coverage summaries are stored in two lines: - - BRF:<number of branches found> - BRH:<number of branches hit> - -Then there is a list of execution counts for each instrumented line -(i.e. a line which resulted in executable code): - - DA:<line number>,<execution count>[,<checksum>] - -Note that there may be an optional checksum present for each instrumented -line. The current -.B geninfo -implementation uses an MD5 hash as checksumming algorithm. - -At the end of a section, there is a summary about how many lines -were found and how many were actually instrumented: - - LH:<number of lines with a non\-zero execution count> - LF:<number of instrumented lines> - -Each sections ends with: - - end_of_record - -In addition to the main source code file there are sections for all -#included files which also contain executable code. - -Note that the absolute path of a source file is generated by interpreting -the contents of the respective .bb file (see -.BR "gcov " (1) -for more information on this file type). Relative filenames are prefixed -with the directory in which the .bb file is found. - -Note also that symbolic links to the .bb file will be resolved so that the -actual file path is used instead of the path to a link. This approach is -necessary for the mechanism to work with the /proc/gcov files. - -.SH AUTHOR -Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> - -.SH SEE ALSO -.BR lcov (1), -.BR lcovrc (5), -.BR genhtml (1), -.BR genpng (1), -.BR gendesc (1), -.BR gcov (1) diff --git a/ThirdParty/lcov/man/genpng.1 b/ThirdParty/lcov/man/genpng.1 deleted file mode 100644 index f6a49b8a5..000000000 --- a/ThirdParty/lcov/man/genpng.1 +++ /dev/null @@ -1,101 +0,0 @@ -.TH genpng 1 "LCOV 1.14" 2019\-02\-28 "User Manuals" -.SH NAME -genpng \- Generate an overview image from a source file -.SH SYNOPSIS -.B genpng -.RB [ \-h | \-\-help ] -.RB [ \-v | \-\-version ] -.RS 7 -.br -.RB [ \-t | \-\-tab\-size -.IR tabsize ] -.RB [ \-w | \-\-width -.IR width ] -.br -.RB [ \-o | \-\-output\-filename -.IR output\-filename ] -.br -.IR source\-file -.SH DESCRIPTION -.B genpng -creates an overview image for a given source code file of either -plain text or .gcov file format. - -Note that the -.I GD.pm -Perl module has to be installed for this script to work -(it may be obtained from -.IR http://www.cpan.org ). - -Note also that -.B genpng -is called from within -.B genhtml -so that there is usually no need to call it directly. - -.SH OPTIONS -.B \-h -.br -.B \-\-help -.RS -Print a short help text, then exit. -.RE - -.B \-v -.br -.B \-\-version -.RS -Print version number, then exit. -.RE - -.BI "\-t " tab\-size -.br -.BI "\-\-tab\-size " tab\-size -.RS -Use -.I tab\-size -spaces in place of tab. - -All occurrences of tabulator signs in the source code file will be replaced -by the number of spaces defined by -.I tab\-size -(default is 4). -.RE - -.BI "\-w " width -.br -.BI "\-\-width " width -.RS -Set width of output image to -.I width -pixel. - -The resulting image will be exactly -.I width -pixel wide (default is 80). - -Note that source code lines which are longer than -.I width -will be truncated. -.RE - - -.BI "\-o " filename -.br -.BI "\-\-output\-filename " filename -.RS -Write image to -.IR filename . - -Specify a name for the resulting image file (default is -.IR source\-file .png). -.RE -.SH AUTHOR -Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> - -.SH SEE ALSO -.BR lcov (1), -.BR genhtml (1), -.BR geninfo (1), -.BR gendesc (1), -.BR gcov (1) diff --git a/ThirdParty/lcov/man/lcov.1 b/ThirdParty/lcov/man/lcov.1 deleted file mode 100644 index e86eb3aa7..000000000 --- a/ThirdParty/lcov/man/lcov.1 +++ /dev/null @@ -1,930 +0,0 @@ -.TH lcov 1 "LCOV 1.14" 2019\-02\-28 "User Manuals" -.SH NAME -lcov \- a graphical GCOV front\-end -.SH SYNOPSIS -.B lcov -.BR \-c | \-\-capture -.RS 5 -.br -.RB [ \-d | \-\-directory -.IR directory ] -.RB [ \-k | \-\-kernel\-directory -.IR directory ] -.br -.RB [ \-o | \-\-output\-file -.IR tracefile ] -.RB [ \-t | \-\-test\-name -.IR testname ] -.br -.RB [ \-b | \-\-base\-directory -.IR directory ] -.RB [ \-i | \-\-initial ] -.RB [ \-\-gcov\-tool -.IR tool ] -.br -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.RB [ \-\-no\-recursion ] -.RB [ \-f | \-\-follow ] -.br -.RB [ \-\-compat\-libtool ] -.RB [ \-\-no\-compat\-libtool ] -.RB [ \-\-ignore\-errors -.IR errors ] -.br -.RB [ \-\-to\-package -.IR package ] -.RB [ \-\-from\-package -.IR package ] -.RB [ \-q | \-\-quiet ] -.br -.RB [ \-\-no\-markers ] -.RB [ \-\-external ] -.RB [ \-\-no\-external ] -.br -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RB [ \-\-compat -.IR mode =on|off|auto] -.br -.RB [ \-\-include -.IR pattern ] -.RB [ \-\-exclude -.IR pattern ] -.br -.RE - -.B lcov -.BR \-z | \-\-zerocounters -.RS 5 -.br -.RB [ \-d | \-\-directory -.IR directory ] -.RB [ \-\-no\-recursion ] -.RB [ \-f | \-\-follow ] -.br -.RB [ \-q | \-\-quiet ] -.br -.RE - -.B lcov -.BR \-l | \-\-list -.I tracefile -.RS 5 -.br -.RB [ \-q | \-\-quiet ] -.RB [ \-\-list\-full\-path ] -.RB [ \-\-no\-list\-full\-path ] -.br -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RE - -.B lcov -.BR \-a | \-\-add\-tracefile -.I tracefile -.RS 5 -.br -.RB [ \-o | \-\-output\-file -.IR tracefile ] -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.br -.RB [ \-q | \-\-quiet ] -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RE - -.B lcov -.BR \-e | \-\-extract -.I tracefile pattern -.RS 5 -.br -.RB [ \-o | \-\-output\-file -.IR tracefile ] -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.br -.RB [ \-q | \-\-quiet ] -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RE - -.B lcov -.BR \-r | \-\-remove -.I tracefile pattern -.RS 5 -.br -.RB [ \-o | \-\-output\-file -.IR tracefile ] -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.br -.RB [ \-q | \-\-quiet ] -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RE - -.B lcov -.BR \-\-diff -.IR "tracefile diff" -.RS 5 -.br -.RB [ \-o | \-\-output\-file -.IR tracefile ] -.RB [ \-\-checksum ] -.RB [ \-\-no\-checksum ] -.br -.RB [ \-\-convert\-filenames ] -.RB [ \-\-strip -.IR depth ] -.RB [ \-\-path -.IR path ] -.RB [ \-q | \-\-quiet ] -.br -.RB [ \-\-config\-file -.IR config\-file ] -.RB [ \-\-rc -.IR keyword = value ] -.br -.RE - -.B lcov -.BR \-\-summary -.I tracefile -.RS 5 -.br -.RB [ \-q | \-\-quiet ] -.br -.RE - -.B lcov -.RB [ \-h | \-\-help ] -.RB [ \-v | \-\-version ] -.RS 5 -.br -.RE - -.SH DESCRIPTION -.B lcov -is a graphical front\-end for GCC's coverage testing tool gcov. It collects -line, function and branch coverage data for multiple source files and creates -HTML pages containing the source code annotated with coverage information. -It also adds overview pages for easy navigation within the file structure. - -Use -.B lcov -to collect coverage data and -.B genhtml -to create HTML pages. Coverage data can either be collected from the -currently running Linux kernel or from a user space application. To do this, -you have to complete the following preparation steps: - -For Linux kernel coverage: -.RS -Follow the setup instructions for the gcov\-kernel infrastructure: -.I http://ltp.sourceforge.net/coverage/gcov.php -.br - - -.RE -For user space application coverage: -.RS -Compile the application with GCC using the options -"\-fprofile\-arcs" and "\-ftest\-coverage". -.RE - -Please note that this man page refers to the output format of -.B lcov -as ".info file" or "tracefile" and that the output of GCOV -is called ".da file". - -Also note that when printing percentages, 0% and 100% are only printed when -the values are exactly 0% and 100% respectively. Other values which would -conventionally be rounded to 0% or 100% are instead printed as nearest -non-boundary value. This behavior is in accordance with that of the -.BR gcov (1) -tool. - -.SH OPTIONS - - -.B \-a -.I tracefile -.br -.B \-\-add\-tracefile -.I tracefile -.br -.RS -Add contents of -.IR tracefile . - -Specify several tracefiles using the \-a switch to combine the coverage data -contained in these files by adding up execution counts for matching test and -filename combinations. - -The result of the add operation will be written to stdout or the tracefile -specified with \-o. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. - -.RE - -.B \-b -.I directory -.br -.B \-\-base\-directory -.I directory -.br -.RS -.RI "Use " directory -as base directory for relative paths. - -Use this option to specify the base directory of a build\-environment -when lcov produces error messages like: - -.RS -ERROR: could not read source file /home/user/project/subdir1/subdir2/subdir1/subdir2/file.c -.RE - -In this example, use /home/user/project as base directory. - -This option is required when using lcov on projects built with libtool or -similar build environments that work with a base directory, i.e. environments, -where the current working directory when invoking the compiler is not the same -directory in which the source code file is located. - -Note that this option will not work in environments where multiple base -directories are used. In that case use configuration file setting -.B geninfo_auto_base=1 -(see -.BR lcovrc (5)). -.RE - -.B \-c -.br -.B \-\-capture -.br -.RS -Capture coverage data. - -By default captures the current kernel execution counts and writes the -resulting coverage data to the standard output. Use the \-\-directory -option to capture counts for a user space program. - -The result of the capture operation will be written to stdout or the tracefile -specified with \-o. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-\-checksum -.br -.B \-\-no\-checksum -.br -.RS -Specify whether to generate checksum data when writing tracefiles. - -Use \-\-checksum to enable checksum generation or \-\-no\-checksum to -disable it. Checksum generation is -.B disabled -by default. - -When checksum generation is enabled, a checksum will be generated for each -source code line and stored along with the coverage data. This checksum will -be used to prevent attempts to combine coverage data from different source -code versions. - -If you don't work with different source code versions, disable this option -to speed up coverage data processing and to reduce the size of tracefiles. -.RE - -.B \-\-compat -.IR mode = value [, mode = value ,...] -.br -.RS -Set compatibility mode. - -Use \-\-compat to specify that lcov should enable one or more compatibility -modes when capturing coverage data. You can provide a comma-separated list -of mode=value pairs to specify the values for multiple modes. - -Valid -.I values -are: - -.B on -.RS -Enable compatibility mode. -.RE -.B off -.RS -Disable compatibility mode. -.RE -.B auto -.RS -Apply auto-detection to determine if compatibility mode is required. Note that -auto-detection is not available for all compatibility modes. -.RE - -If no value is specified, 'on' is assumed as default value. - -Valid -.I modes -are: - -.B libtool -.RS -Enable this mode if you are capturing coverage data for a project that -was built using the libtool mechanism. See also -\-\-compat\-libtool. - -The default value for this setting is 'on'. - -.RE -.B hammer -.RS -Enable this mode if you are capturing coverage data for a project that -was built using a version of GCC 3.3 that contains a modification -(hammer patch) of later GCC versions. You can identify a modified GCC 3.3 -by checking the build directory of your project for files ending in the -extension '.bbg'. Unmodified versions of GCC 3.3 name these files '.bb'. - -The default value for this setting is 'auto'. - -.RE -.B split_crc -.RS -Enable this mode if you are capturing coverage data for a project that -was built using a version of GCC 4.6 that contains a modification -(split function checksums) of later GCC versions. Typical error messages -when running lcov on coverage data produced by such GCC versions are -\'out of memory' and 'reached unexpected end of file'. - -The default value for this setting is 'auto' -.RE - -.RE - -.B \-\-compat\-libtool -.br -.B \-\-no\-compat\-libtool -.br -.RS -Specify whether to enable libtool compatibility mode. - -Use \-\-compat\-libtool to enable libtool compatibility mode or \-\-no\-compat\-libtool -to disable it. The libtool compatibility mode is -.B enabled -by default. - -When libtool compatibility mode is enabled, lcov will assume that the source -code relating to a .da file located in a directory named ".libs" can be -found in its parent directory. - -If you have directories named ".libs" in your build environment but don't use -libtool, disable this option to prevent problems when capturing coverage data. -.RE - -.B \-\-config\-file -.I config\-file -.br -.RS -Specify a configuration file to use. - -When this option is specified, neither the system\-wide configuration file -/etc/lcovrc, nor the per\-user configuration file ~/.lcovrc is read. - -This option may be useful when there is a need to run several -instances of -.B lcov -with different configuration file options in parallel. -.RE - -.B \-\-convert\-filenames -.br -.RS -Convert filenames when applying diff. - -Use this option together with \-\-diff to rename the file names of processed -data sets according to the data provided by the diff. -.RE - -.B \-\-diff -.I tracefile -.I difffile -.br -.RS -Convert coverage data in -.I tracefile -using source code diff file -.IR difffile . - -Use this option if you want to merge coverage data from different source code -levels of a program, e.g. when you have data taken from an older version -and want to combine it with data from a more current version. -.B lcov -will try to map source code lines between those versions and adjust the coverage -data respectively. -.I difffile -needs to be in unified format, i.e. it has to be created using the "\-u" option -of the -.B diff -tool. - -Note that lines which are not present in the old version will not be counted -as instrumented, therefore tracefiles resulting from this operation should -not be interpreted individually but together with other tracefiles taken -from the newer version. Also keep in mind that converted coverage data should -only be used for overview purposes as the process itself introduces a loss -of accuracy. - -The result of the diff operation will be written to stdout or the tracefile -specified with \-o. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-d -.I directory -.br -.B \-\-directory -.I directory -.br -.RS -Use .da files in -.I directory -instead of kernel. - -If you want to work on coverage data for a user space program, use this -option to specify the location where the program was compiled (that's -where the counter files ending with .da will be stored). - -Note that you may specify this option more than once. -.RE - -.B \-\-exclude -.I pattern -.br -.RS -Exclude source files matching -.IR pattern . - -Use this switch if you want to exclude coverage data for a particular set -of source files matching any of the given patterns. Multiple patterns can be -specified by using multiple -.B --exclude -command line switches. The -.I patterns -will be interpreted as shell wildcard patterns (note that they may need to be -escaped accordingly to prevent the shell from expanding them first). - -Can be combined with the -.B --include -command line switch. If a given file matches both the include pattern and the -exclude pattern, the exclude pattern will take precedence. -.RE - -.B \-\-external -.br -.B \-\-no\-external -.br -.RS -Specify whether to capture coverage data for external source files. - -External source files are files which are not located in one of the directories -specified by \-\-directory or \-\-base\-directory. Use \-\-external to include -external source files while capturing coverage data or \-\-no\-external to -ignore this data. - -Data for external source files is -.B included -by default. -.RE - -.B \-e -.I tracefile -.I pattern -.br -.B \-\-extract -.I tracefile -.I pattern -.br -.RS -Extract data from -.IR tracefile . - -Use this switch if you want to extract coverage data for only a particular -set of files from a tracefile. Additional command line parameters will be -interpreted as shell wildcard patterns (note that they may need to be -escaped accordingly to prevent the shell from expanding them first). -Every file entry in -.I tracefile -which matches at least one of those patterns will be extracted. - -The result of the extract operation will be written to stdout or the tracefile -specified with \-o. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-f -.br -.B \-\-follow -.br -.RS -Follow links when searching for .da files. -.RE - -.B \-\-from\-package -.I package -.br -.RS -Use .da files in -.I package -instead of kernel or directory. - -Use this option if you have separate machines for build and test and -want to perform the .info file creation on the build machine. See -\-\-to\-package for more information. -.RE - -.B \-\-gcov\-tool -.I tool -.br -.RS -Specify the location of the gcov tool. -.RE - -.B \-h -.br -.B \-\-help -.br -.RS -Print a short help text, then exit. -.RE - -.B \-\-include -.I pattern -.br -.RS -Include source files matching -.IR pattern . - -Use this switch if you want to include coverage data for only a particular set -of source files matching any of the given patterns. Multiple patterns can be -specified by using multiple -.B --include -command line switches. The -.I patterns -will be interpreted as shell wildcard patterns (note that they may need to be -escaped accordingly to prevent the shell from expanding them first). -.RE - -.B \-\-ignore\-errors -.I errors -.br -.RS -Specify a list of errors after which to continue processing. - -Use this option to specify a list of one or more classes of errors after which -lcov should continue processing instead of aborting. - -.I errors -can be a comma\-separated list of the following keywords: - -.B gcov: -the gcov tool returned with a non\-zero return code. - -.B source: -the source code file for a data set could not be found. - -.B graph: -the graph file could not be found or is corrupted. -.RE - -.B \-i -.br -.B \-\-initial -.RS -Capture initial zero coverage data. - -Run lcov with \-c and this option on the directories containing .bb, .bbg -or .gcno files before running any test case. The result is a "baseline" -coverage data file that contains zero coverage for every instrumented line. -Combine this data file (using lcov \-a) with coverage data files captured -after a test run to ensure that the percentage of total lines covered is -correct even when not all source code files were loaded during the test. - -Recommended procedure when capturing data for a test case: - -1. create baseline coverage data file -.RS -# lcov \-c \-i \-d appdir \-o app_base.info -.br - -.RE -2. perform test -.RS -# appdir/test -.br - -.RE -3. create test coverage data file -.RS -# lcov \-c \-d appdir \-o app_test.info -.br - -.RE -4. combine baseline and test coverage data -.RS -# lcov \-a app_base.info \-a app_test.info \-o app_total.info -.br - -.RE -.RE - -.B \-k -.I subdirectory -.br -.B \-\-kernel\-directory -.I subdirectory -.br -.RS -Capture kernel coverage data only from -.IR subdirectory . - -Use this option if you don't want to get coverage data for all of the -kernel, but only for specific subdirectories. This option may be specified -more than once. - -Note that you may need to specify the full path to the kernel subdirectory -depending on the version of the kernel gcov support. -.RE - -.B \-l -.I tracefile -.br -.B \-\-list -.I tracefile -.br -.RS -List the contents of the -.IR tracefile . - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-\-list\-full\-path -.br -.B \-\-no\-list\-full\-path -.br -.RS -Specify whether to show full paths during list operation. - -Use \-\-list\-full\-path to show full paths during list operation -or \-\-no\-list\-full\-path to show shortened paths. Paths are -.B shortened -by default. -.RE - -.B \-\-no\-markers -.br -.RS -Use this option if you want to get coverage data without regard to exclusion -markers in the source code file. See -.BR "geninfo " (1) -for details on exclusion markers. -.RE - -.B \-\-no\-recursion -.br -.RS -Use this option if you want to get coverage data for the specified directory -only without processing subdirectories. -.RE - -.B \-o -.I tracefile -.br -.B \-\-output\-file -.I tracefile -.br -.RS -Write data to -.I tracefile -instead of stdout. - -Specify "\-" as a filename to use the standard output. - -By convention, lcov\-generated coverage data files are called "tracefiles" and -should have the filename extension ".info". -.RE - -.B \-\-path -.I path -.br -.RS -Strip path from filenames when applying diff. - -Use this option together with \-\-diff to tell lcov to disregard the specified -initial path component when matching between tracefile and diff filenames. -.RE - -.B \-q -.br -.B \-\-quiet -.br -.RS -Do not print progress messages. - -This option is implied when no output filename is specified to prevent -progress messages to mess with coverage data which is also printed to -the standard output. -.RE - -.B \-\-rc -.IR keyword = value -.br -.RS -Override a configuration directive. - -Use this option to specify a -.IR keyword = value -statement which overrides the corresponding configuration statement in -the lcovrc configuration file. You can specify this option more than once -to override multiple configuration statements. -See -.BR lcovrc (5) -for a list of available keywords and their meaning. -.RE - -.B \-r -.I tracefile -.I pattern -.br -.B \-\-remove -.I tracefile -.I pattern -.br -.RS -Remove data from -.IR tracefile . - -Use this switch if you want to remove coverage data for a particular -set of files from a tracefile. Additional command line parameters will be -interpreted as shell wildcard patterns (note that they may need to be -escaped accordingly to prevent the shell from expanding them first). -Every file entry in -.I tracefile -which matches at least one of those patterns will be removed. - -The result of the remove operation will be written to stdout or the tracefile -specified with \-o. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-\-strip -.I depth -.br -.RS -Strip path components when applying diff. - -Use this option together with \-\-diff to tell lcov to disregard the specified -number of initial directories when matching tracefile and diff filenames. -.RE - -.B \-\-summary -.I tracefile -.br -.RS -Show summary coverage information for the specified tracefile. - -Note that you may specify this option more than once. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.B \-t -.I testname -.br -.B \-\-test\-name -.I testname -.br -.RS -Specify test name to be stored in the tracefile. - -This name identifies a coverage data set when more than one data set is merged -into a combined tracefile (see option \-a). - -Valid test names can consist of letters, decimal digits and the underscore -character ("_"). -.RE - -.B \-\-to\-package -.I package -.br -.RS -Store .da files for later processing. - -Use this option if you have separate machines for build and test and -want to perform the .info file creation on the build machine. To do this, -follow these steps: - -On the test machine: -.RS -.br -\- run the test -.br -\- run lcov \-c [\-d directory] \-\-to-package -.I file -.br -\- copy -.I file -to the build machine -.RE -.br - -On the build machine: -.RS -.br -\- run lcov \-c \-\-from-package -.I file -[\-o and other options] -.RE -.br - -This works for both kernel and user space coverage data. Note that you might -have to specify the path to the build directory using \-b with -either \-\-to\-package or \-\-from-package. Note also that the package data -must be converted to a .info file before recompiling the program or it will -become invalid. -.RE - -.B \-v -.br -.B \-\-version -.br -.RS -Print version number, then exit. -.RE - -.B \-z -.br -.B \-\-zerocounters -.br -.RS -Reset all execution counts to zero. - -By default tries to reset kernel execution counts. Use the \-\-directory -option to reset all counters of a user space program. - -Only one of \-z, \-c, \-a, \-e, \-r, \-l, \-\-diff or \-\-summary may be -specified at a time. -.RE - -.SH FILES - -.I /etc/lcovrc -.RS -The system\-wide configuration file. -.RE - -.I ~/.lcovrc -.RS -The per\-user configuration file. -.RE - -.SH AUTHOR -Peter Oberparleiter <Peter.Oberparleiter@de.ibm.com> - -.SH SEE ALSO -.BR lcovrc (5), -.BR genhtml (1), -.BR geninfo (1), -.BR genpng (1), -.BR gendesc (1), -.BR gcov (1) diff --git a/ThirdParty/lcov/man/lcovrc.5 b/ThirdParty/lcov/man/lcovrc.5 deleted file mode 100644 index f20d273a9..000000000 --- a/ThirdParty/lcov/man/lcovrc.5 +++ /dev/null @@ -1,913 +0,0 @@ -.TH lcovrc 5 "LCOV 1.14" 2019\-02\-28 "User Manuals" - -.SH NAME -lcovrc \- lcov configuration file - -.SH DESCRIPTION -The -.I lcovrc -file contains configuration information for the -.B lcov -code coverage tool (see -.BR lcov (1)). -.br - -The system\-wide configuration file is located at -.IR /etc/lcovrc . -To change settings for a single user, place a customized copy of this file at -location -.IR ~/.lcovrc . -Where available, command\-line options override configuration file settings. - -Lines in a configuration file can either be: -.IP " *" -empty lines or lines consisting only of white space characters. These lines are -ignored. -.IP " *" -comment lines which start with a hash sign ('#'). These are treated like empty -lines and will be ignored. -.IP " *" -statements in the form -.RI ' key " = " value '. -A list of valid statements and their description can be found in -section 'OPTIONS' below. -.PP - -.B Example configuration: -.IP -# -.br -# Example LCOV configuration file -.br -# -.br - -# External style sheet file -.br -#genhtml_css_file = gcov.css -.br - -# Coverage rate limits -.br -genhtml_hi_limit = 90 -.br -genhtml_med_limit = 75 -.br - -# Width of line coverage field in source code view -.br -genhtml_line_field_width = 12 -.br - -# Width of branch coverage field in source code view -.br -genhtml_branch_field_width = 16 -.br - -# Width of overview image -.br -genhtml_overview_width = 80 -.br - -# Resolution of overview navigation -.br -genhtml_nav_resolution = 4 -.br - -# Offset for source code navigation -.br -genhtml_nav_offset = 10 -.br - -# Do not remove unused test descriptions if non\-zero -.br -genhtml_keep_descriptions = 0 -.br - -# Do not remove prefix from directory names if non\-zero -.br -genhtml_no_prefix = 0 -.br - -# Do not create source code view if non\-zero -.br -genhtml_no_source = 0 -.br - -# Specify size of tabs -.br -genhtml_num_spaces = 8 -.br - -# Highlight lines with converted\-only data if non\-zero -.br -genhtml_highlight = 0 -.br - -# Include color legend in HTML output if non\-zero -.br -genhtml_legend = 0 -.br - -# Include HTML file at start of HTML output -.br -#genhtml_html_prolog = prolog.html -.br - -# Include HTML file at end of HTML output -.br -#genhtml_html_epilog = epilog.html -.br - -# Use custom HTML file extension -.br -#genhtml_html_extension = html -.br - -# Compress all generated html files with gzip. -.br -#genhtml_html_gzip = 1 -.br - -# Include sorted overview pages -.br -genhtml_sort = 1 -.br - -# Include function coverage data display -.br -#genhtml_function_coverage = 1 -.br - -# Include branch coverage data display -.br -#genhtml_branch_coverage = 1 -.br - -# Specify the character set of all generated HTML pages -.br -genhtml_charset=UTF\-8 -.br - -# Allow HTML markup in test case description text if non\-zero -.br -genhtml_desc_html=0 -.br - -# Specify the precision for coverage rates -.br -#genhtml_precision=1 -.br - -# Show missed counts instead of hit counts -.br -#genhtml_missed=1 -.br - -# Demangle C++ symbols -.br -#genhtml_demangle_cpp=1 -.br - -# Location of the gcov tool -.br -#geninfo_gcov_tool = gcov -.br - -# Adjust test names if non\-zero -.br -#geninfo_adjust_testname = 0 -.br - -# Calculate a checksum for each line if non\-zero -.br -geninfo_checksum = 0 -.br - -# Enable libtool compatibility mode if non\-zero -.br -geninfo_compat_libtool = 0 -.br - -# Specify whether to capture coverage data for external source -.br -# files -.br -#geninfo_external = 1 -.br - -# Use gcov's --all-blocks option if non-zero -.br -#geninfo_gcov_all_blocks = 1 -.br - -# Specify compatiblity modes (same as \-\-compat option -.br -# of geninfo) -.br -#geninfo_compat = libtool=on, hammer=auto, split_crc=auto -.br - -# Adjust path to source files by removing or changing path -.br -# components that match the specified pattern (Perl regular -.br -# expression format) -.br -#geninfo_adjust_src_path = /tmp/build => /usr/src - -# Specify if geninfo should try to automatically determine -.br -# the base-directory when collecting coverage data. -.br -geninfo_auto_base = 1 -.br - -# Directory containing gcov kernel files -.br -lcov_gcov_dir = /proc/gcov -.br - -# Location for temporary directories -.br -lcov_tmp_dir = /tmp -.br - -# Show full paths during list operation if non\-zero -.br -lcov_list_full_path = 0 -.br - -# Specify the maximum width for list output. This value is -.br -# ignored when lcov_list_full_path is non\-zero. -.br -lcov_list_width = 80 -.br - -# Specify the maximum percentage of file names which may be -.br -# truncated when choosing a directory prefix in list output. -.br -# This value is ignored when lcov_list_full_path is non\-zero. -.br -lcov_list_truncate_max = 20 - -# Specify if function coverage data should be collected and -.br -# processed. -.br -lcov_function_coverage = 1 -.br - -# Specify if branch coverage data should be collected and -.br -# processed. -.br -lcov_branch_coverage = 0 -.br -.PP - -.SH OPTIONS - -.BR genhtml_css_file " =" -.I filename -.IP -Specify an external style sheet file. Use this option to modify the appearance of the HTML output as generated by -.BR genhtml . -During output generation, a copy of this file will be placed in the output -directory. -.br - -This option corresponds to the \-\-css\-file command line option of -.BR genhtml . -.br - -By default, a standard CSS file is generated. -.PP - -.BR genhtml_hi_limit " =" -.I hi_limit -.br -.BR genhtml_med_limit " =" -.I med_limit -.br -.IP -Specify coverage rate limits for classifying file entries. Use this option to -modify the coverage rates (in percent) for line, function and branch coverage at -which a result is classified as high, medium or low coverage. This -classification affects the color of the corresponding entries on the overview -pages of the HTML output: -.br - -High: hi_limit <= rate <= 100 default color: green -.br -Medium: med_limit <= rate < hi_limit default color: orange -.br -Low: 0 <= rate < med_limit default color: red -.br - -Defaults are 90 and 75 percent. -.PP - -.BR genhtml_line_field_width " =" -.I number_of_characters -.IP -Specify the width (in characters) of the source code view column containing -line coverage information. -.br - -Default is 12. -.PP - -.BR genhtml_branch_field_width " =" -.I number_of_characters -.IP -Specify the width (in characters) of the source code view column containing -branch coverage information. -.br - -Default is 16. -.PP - -.BR genhtml_overview_width " =" -.I pixel_size -.IP -Specify the width (in pixel) of the overview image created when generating HTML -output using the \-\-frames option of -.BR genhtml . -.br - -Default is 80. -.PP - -.BR genhtml_nav_resolution " =" -.I lines -.IP -Specify the resolution of overview navigation when generating HTML output using -the \-\-frames option of -.BR genhtml . -This number specifies the maximum difference in lines between the position a -user selected from the overview and the position the source code window is -scrolled to. -.br - -Default is 4. -.PP - - -.BR genhtml_nav_offset " =" -.I lines -.IP -Specify the overview navigation line offset as applied when generating HTML -output using the \-\-frames option of -.BR genhtml. -.br - -Clicking a line in the overview image should show the source code view at -a position a bit further up, so that the requested line is not the first -line in the window. This number specifies that offset. -.br - -Default is 10. -.PP - - -.BR genhtml_keep_descriptions " =" -.IR 0 | 1 -.IP -If non\-zero, keep unused test descriptions when generating HTML output using -.BR genhtml . -.br - -This option corresponds to the \-\-keep\-descriptions option of -.BR genhtml . -.br - -Default is 0. -.PP - -.BR genhtml_no_prefix " =" -.IR 0 | 1 -.IP -If non\-zero, do not try to find and remove a common prefix from directory names. -.br - -This option corresponds to the \-\-no\-prefix option of -.BR genhtml . -.br - -Default is 0. -.PP - -.BR genhtml_no_source " =" -.IR 0 | 1 -.IP -If non\-zero, do not create a source code view when generating HTML output using -.BR genhtml . -.br - -This option corresponds to the \-\-no\-source option of -.BR genhtml . -.br - -Default is 0. -.PP - -.BR genhtml_num_spaces " =" -.I num -.IP -Specify the number of spaces to use as replacement for tab characters in the -HTML source code view as generated by -.BR genhtml . -.br - -This option corresponds to the \-\-num\-spaces option of -.BR genthml . -.br - -Default is 8. - -.PP - -.BR genhtml_highlight " =" -.IR 0 | 1 -.IP -If non\-zero, highlight lines with converted\-only data in -HTML output as generated by -.BR genhtml . -.br - -This option corresponds to the \-\-highlight option of -.BR genhtml . -.br - -Default is 0. -.PP - -.BR genhtml_legend " =" -.IR 0 | 1 -.IP -If non\-zero, include a legend explaining the meaning of color coding in the HTML -output as generated by -.BR genhtml . -.br - -This option corresponds to the \-\-legend option of -.BR genhtml . -.br - -Default is 0. -.PP - -.BR genhtml_html_prolog " =" -.I filename -.IP -If set, include the contents of the specified file at the beginning of HTML -output. - -This option corresponds to the \-\-html\-prolog option of -.BR genhtml . -.br - -Default is to use no extra prolog. -.PP - -.BR genhtml_html_epilog " =" -.I filename -.IP -If set, include the contents of the specified file at the end of HTML output. - -This option corresponds to the \-\-html\-epilog option of -.BR genhtml . -.br - -Default is to use no extra epilog. -.PP - -.BR genhtml_html_extension " =" -.I extension -.IP -If set, use the specified string as filename extension for generated HTML files. - -This option corresponds to the \-\-html\-extension option of -.BR genhtml . -.br - -Default extension is "html". -.PP - -.BR genhtml_html_gzip " =" -.IR 0 | 1 -.IP -If set, compress all html files using gzip. - -This option corresponds to the \-\-html\-gzip option of -.BR genhtml . -.br - -Default extension is 0. -.PP - -.BR genhtml_sort " =" -.IR 0 | 1 -.IP -If non\-zero, create overview pages sorted by coverage rates when generating -HTML output using -.BR genhtml . -.br - -This option can be set to 0 by using the \-\-no\-sort option of -.BR genhtml . -.br - -Default is 1. -.PP - -.BR genhtml_function_coverage " =" -.IR 0 | 1 -.IP -If non\-zero, include function coverage data when generating HTML output using -.BR genhtml . -.br - -This option can be set to 0 by using the \-\-no\-function\-coverage option of -.BR genhtml . -.br - -Default is 1. -.PP - -.BR genhtml_branch_coverage " =" -.IR 0 | 1 -.IP -If non\-zero, include branch coverage data when generating HTML output using -.BR genhtml . -.br - -This option can be set to 0 by using the \-\-no\-branch\-coverage option of -.BR genhtml . -.br - -Default is 1. -.PP - -.BR genhtml_charset " =" -.I charset -.IP -Specify the character set of all generated HTML pages. -.br - -Use this option if the source code contains characters which are not -part of the default character set. Note that this option is ignored -when a custom HTML prolog is specified (see also -.BR genhtml_html_prolog ). -.br - -Default is UTF-8. -.PP - -.BR genhtml_demangle_cpp " =" -.IR 0 | 1 -.IP -If non-zero, demangle C++ function names in function overviews. - -Set this option to one if you want to convert C++ internal function -names to human readable format for display on the HTML function overview -page. This option requires that the c++filt tool is installed (see -.BR c++filt(1) -). -.br - -This option corresponds to the \-\-demangle\-cpp command line option of -.BR genhtml . -.br - -Default is 0. -.PP - -.BR genhtml_desc_html " =" -.IR 0 | 1 -.IP -If non-zero, test case descriptions may contain HTML markup. - -Set this option to one if you want to embed HTML markup (for example to -include links) in test case descriptions. When set to zero, HTML markup -characters will be escaped to show up as plain text on the test case -description page. -.br - -Default is 0. -.PP - -.BR genhtml_precision " =" -.IR 1 | 2 | 3 | 4 -.IP -Specify how many digits after the decimal-point should be used for -displaying coverage rates. -.br - -Default is 1. -.PP -.BR genhtml_missed " =" -.IR 0 | 1 -.IP -If non-zero, the count of missed lines, functions, or branches is shown -as negative numbers in overview pages. -.br - -Default is 0. -.PP - -. -.BR geninfo_gcov_tool " =" -.I path_to_gcov -.IP -Specify the location of the gcov tool (see -.BR gcov (1)) -which is used to generate coverage information from data files. -.br - -Default is 'gcov'. -.PP - -.BR geninfo_adjust_testname " =" -.IR 0 | 1 -.IP -If non\-zero, adjust test names to include operating system information -when capturing coverage data. -.br - -Default is 0. -.PP - -.BR geninfo_checksum " =" -.IR 0 | 1 -.IP -If non\-zero, generate source code checksums when capturing coverage data. -Checksums are useful to prevent merging coverage data from incompatible -source code versions but checksum generation increases the size of coverage -files and the time used to generate those files. -.br - -This option corresponds to the \-\-checksum and \-\-no\-checksum command line -option of -.BR geninfo . -.br - -Default is 0. -.PP - -.BR geninfo_compat_libtool " =" -.IR 0 | 1 -.IP -If non\-zero, enable libtool compatibility mode. When libtool compatibility -mode is enabled, lcov will assume that the source code relating to a .da file -located in a directory named ".libs" can be found in its parent directory. -.br - -This option corresponds to the \-\-compat\-libtool and \-\-no\-compat\-libtool -command line option of -.BR geninfo . -.br - -Default is 1. -.PP - -.BR geninfo_external " =" -.IR 0 | 1 -.IP -If non\-zero, capture coverage data for external source files. - -External source files are files which are not located in one of the directories -(including sub-directories) -specified by the \-\-directory or \-\-base\-directory options of -.BR lcov / geninfo . - -Default is 1. -.PP - -.BR geninfo_gcov_all_blocks " =" -.IR 0 | 1 -.IP -If non\-zero, call the gcov tool with option --all-blocks. - -Using --all-blocks will produce more detailed branch coverage information for -each line. Set this option to zero if you do not need detailed branch coverage -information to speed up the process of capturing code coverage or to work -around a bug in some versions of gcov which will cause it to endlessly loop -when analysing some files. - -Default is 1. -.PP - -.BR geninfo_compat " =" -.IR mode = value [, mode = value ,...] -.IP -Specify that geninfo should enable one or more compatibility modes -when capturing coverage data. - -This option corresponds to the \-\-compat command line option of -.BR geninfo . - -Default is 'libtool=on, hammer=auto, split_crc=auto'. -.PP - -.BR geninfo_adjust_src_path " =" -.IR pattern " => " replacement -.br -.BR geninfo_adjust_src_path " =" -.I pattern -.IP -Adjust source paths when capturing coverage data. - -Use this option in situations where geninfo cannot find the correct -path to source code files of a project. By providing a -.I pattern -in Perl regular expression format (see -.BR perlre (1)) -and an optional replacement string, you can instruct geninfo to -remove or change parts of the incorrect source path. - -.B Example: -.br - -1. When geninfo reports that it cannot find source file -.br - - /path/to/src/.libs/file.c -.br - -while the file is actually located in -.br - - /path/to/src/file.c -.br - -use the following parameter: -.br - - geninfo_adjust_src_path = /.libs - -This will remove all "/.libs" strings from the path. - -2. When geninfo reports that it cannot find source file -.br - - /tmp/build/file.c -.br - -while the file is actually located in -.br - - /usr/src/file.c -.br - -use the following parameter: -.br - - geninfo_adjust_src_path = /tmp/build => /usr/src -.br - -This will change all "/tmp/build" strings in the path to "/usr/src". -.PP - -.BR geninfo_auto_base " =" -.IR 0 | 1 -.IP -If non\-zero, apply a heuristic to determine the base directory when -collecting coverage data. -.br - -Use this option when using geninfo on projects built with libtool or -similar build environments that work with multiple base directories, -i.e. environments, where the current working directory when invoking the -compiler ist not the same directory in which the source code file is -located, and in addition, is different between files of the same project. -.br - -Default is 1. -.PP - -.BR lcov_gcov_dir " =" -.I path_to_kernel_coverage_data -.IP -Specify the path to the directory where kernel coverage data can be found -or leave undefined for auto-detection. -.br - -Default is auto-detection. -.PP - -.BR lcov_tmp_dir " =" -.I temp -.IP -Specify the location of a directory used for temporary files. -.br - -Default is '/tmp'. -.PP - -.BR lcov_list_full_path " =" -.IR 0 | 1 -.IP -If non-zero, print the full path to source code files during a list operation. -.br - -This option corresponds to the \-\-list\-full\-path option of -.BR lcov . -.br - -Default is 0. -.PP - -.BR lcov_list_max_width " =" -.IR width -.IP -Specify the maximum width for list output. This value is ignored when -lcov_list_full_path is non\-zero. -.br - -Default is 80. -.PP - -.BR lcov_list_truncate_max -.B " =" -.IR percentage -.IP -Specify the maximum percentage of file names which may be truncated when -choosing a directory prefix in list output. This value is ignored when -lcov_list_full_path is non\-zero. -.br - -Default is 20. -.PP - -.BR lcov_function_coverage " =" -.IR 0 | 1 -.IP -Specify whether lcov should handle function coverage data. -.br - -Setting this option to 0 can reduce memory and CPU time consumption -when lcov is collecting and processing coverage data, as well as -reduce the size of the resulting data files. Note that setting -.B genhtml_function_coverage -will override this option for HTML generation. -.br - -Default is 1. -.PP - -.BR lcov_branch_coverage " =" -.IR 0 | 1 -.IP -Specify whether lcov should handle branch coverage data. -.br - -Setting this option to 0 can reduce memory and CPU time consumption -when lcov is collecting and processing coverage data, as well as -reduce the size of the resulting data files. Note that setting -.B genhtml_branch_coverage -will override this option for HTML generation. -.br - -Default is 0. -.PP - -.BR lcov_excl_line " =" -.I expression -.IP -Specify the regular expression of lines to exclude. -.br - -Default is 'LCOV_EXCL_LINE'. -.PP - -.BR lcov_excl_br_line " =" -.I expression -.IP -Specify the regular expression of lines to exclude from branch coverage. -.br - -Default is 'LCOV_EXCL_BR_LINE'. -.PP - -.SH FILES - -.TP -.I /etc/lcovrc -The system\-wide -.B lcov -configuration file. - -.TP -.I ~/.lcovrc -The individual per\-user configuration file. -.PP - -.SH SEE ALSO -.BR lcov (1), -.BR genhtml (1), -.BR geninfo (1), -.BR gcov (1) diff --git a/ThirdParty/lcov/rpm/lcov.spec b/ThirdParty/lcov/rpm/lcov.spec deleted file mode 100644 index e96c8d47b..000000000 --- a/ThirdParty/lcov/rpm/lcov.spec +++ /dev/null @@ -1,59 +0,0 @@ -Summary: A graphical GCOV front-end -Name: lcov -Version: 1.14 -Release: 1 -License: GPLv2+ -Group: Development/Tools -URL: http://ltp.sourceforge.net/coverage/lcov.php -Source0: http://downloads.sourceforge.net/ltp/%{name}-%{version}.tar.gz -BuildRoot: %{_tmppath}/%{name}-%{version}-root -BuildArch: noarch -Requires: perl >= 5.8.8 - -%description -LCOV is a graphical front-end for GCC's coverage testing tool gcov. It collects -gcov data for multiple source files and creates HTML pages containing the -source code annotated with coverage information. It also adds overview pages -for easy navigation within the file structure. - -%prep -%setup -q -n %{name}-%{version} - -%build -exit 0 - -%install -rm -rf $RPM_BUILD_ROOT -make install DESTDIR=$RPM_BUILD_ROOT PREFIX=/usr CFG_DIR=/etc - -%clean -rm -rf $RPM_BUILD_ROOT - -%files -%defattr(-,root,root) -/usr/bin/* -/usr/share/man/man*/* -%config /etc/* - -%changelog -* Mon Aug 22 2016 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- updated "make install" call to work with PREFIX Makefile changes - -* Mon May 07 2012 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- added dependency on perl 5.8.8 for >>& open mode support - -* Wed Aug 13 2008 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- changed description + summary text - -* Mon Aug 20 2007 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- fixed "Copyright" tag - -* Mon Jul 14 2003 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- removed variables for version/release to support source rpm building -- added initial rm command in install section - -* Mon Apr 7 2003 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- implemented variables for version/release - -* Fri Oct 18 2002 Peter Oberparleiter (Peter.Oberparleiter@de.ibm.com) -- created initial spec file diff --git a/ThirdParty/lcov/test/Makefile b/ThirdParty/lcov/test/Makefile deleted file mode 100644 index ecb96042a..000000000 --- a/ThirdParty/lcov/test/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -include common.mak - -TESTDIRS := $(sort $(patsubst %/,%,$(dir $(wildcard */Makefile)))) - -help: info - -info: - echo "Available make targets:" - echo " test : perform self-tests" - echo " clean : remove all temporary files" - echo "" - echo "Available make variables:" - echo " SIZE : specify size of test data (small, medium, large)" - echo " V : specify level of verbosity (0, 1, 2)" - -test: - for TEST in $(TESTDIRS) ; do \ - make -C $$TEST test ; \ - done - -clean: - rm -rf *.info *.counts test.log src/ - for TEST in $(TESTDIRS) ; do \ - make -C $$TEST clean ; \ - done - -.PHONY: help info test clean diff --git a/ThirdParty/lcov/test/bin/common b/ThirdParty/lcov/test/bin/common deleted file mode 100644 index a8b527ded..000000000 --- a/ThirdParty/lcov/test/bin/common +++ /dev/null @@ -1,103 +0,0 @@ -function elapsed_to_ms() -{ - local ELAPSED=$1 - local IFS=:. - local MS - - set -- $ELAPSED - if [ $# -eq 3 ] ; then - let MS=${3#0}*10+${2#0}*1000+$1*60000 - else - let MS=${4#0}*10+${3#0}*1000+${2#0}*60000+$1*3600000 - fi - - echo $MS -} - -function t_timestamp() -{ - date +"%Y-%m-%d %H:%M:%S %z" -} - -function t_marker() -{ - echo - echo "======================================================================" -} - -function t_detail() -{ - local KEY=$1 - local VALUE=$2 - local DOTS=" ............" - - printf "%-.12s: %s\n" "$KEY$DOTS" "$VALUE" -} - -function t_announce() -{ - local TESTNAME="$1" - - printf "$BOLD%-.30s$RESET " "$TESTNAME .............................." - t_marker >> "$LOGFILE" - t_detail "DATE" "$(t_timestamp)" >> "$LOGFILE" - t_detail "TESTNAME" "$TESTNAME" >> "$LOGFILE" -} - -function t_result() -{ - local COLOR="$1" - local TEXT="$2" - - printf "[$COLOR$TEXT$RESET]" -} - -function t_pass() -{ - local TESTNAME="$1" - - t_result "$GREEN" "pass" - echo "pass $TESTNAME" >> "$COUNTFILE" -} - -function t_fail() -{ - local TESTNAME="$1" - - t_result "$RED" "fail" - echo "fail $TESTNAME" >> "$COUNTFILE" -} - -function t_kill() -{ - local TESTNAME="$1" - - t_result "$RED" "kill" - echo "fail $TESTNAME" >> "$COUNTFILE" -} - -function t_skip() -{ - local TESTNAME="$1" - - t_result "$BLUE" "skip" - echo "skip $TESTNAME" >> "$COUNTFILE" -} - -function t_indent() -{ - sed -e 's/^/ /' -} - -LOGFILE="$TOPDIR/test.log" -COUNTFILE="$TOPDIR/test.counts" -TIMEFILE="$TOPDIR/test.time" - -if [ -t 1 ] ; then - RED="\e[31m" - GREEN="\e[32m" - BLUE="\e[34m" - BOLD="\e[1m" - DEFAULT="\e[39m" - RESET="\e[0m" -fi diff --git a/ThirdParty/lcov/test/bin/mkinfo b/ThirdParty/lcov/test/bin/mkinfo deleted file mode 100755 index 5231aeac5..000000000 --- a/ThirdParty/lcov/test/bin/mkinfo +++ /dev/null @@ -1,952 +0,0 @@ -#!/usr/bin/env perl -# -# Copyright IBM Corp. 2017 -# -# Usage: mkinfo <config_file> [-o <output_dir>] [--seed <seed>] -# [<key>=<value>...] -# -# Create a fake lcov code coverage data file and optionally the corresponding -# source tree. DATA_FILE contains all specifications for creating the data -# file. Directives can be overridden using KEY=VALUE specifications with KEY -# being in the form SECTION.KEY. SEED specifies the number used to initialize -# the pseudo random number generator. -# -# Example: -# mkinfo profiles/small -o src files.numfiles=12 -# - -use strict; -use warnings; - -use Getopt::Long; -use Cwd qw(abs_path getcwd); -use File::Path qw(make_path); -use File::Basename; -use Data::Dumper; - -my $MAX_TAKEN = 1000; -my $use_colors = -t STDIN; -my $BOLD = $use_colors ? "\033[1m" : ""; -my $RESET = $use_colors ? "\033[0m" : ""; - -sub usage() -{ - print(<<EOF) -Usage: $0 <config_file> [-o <output_dir>] [--seed <seed>] [<key>=<value>...] - -Create a fake lcov code coverage data file and optionally the corresponding -source tree. DATA_FILE contains all specifications for creating the data -file. Directives can be overridden using KEY=VALUE specifications with KEY -being in the form SECTION.KEY. SEED specifies the number used to initialize -the pseudo random number generator. - -Example: -$0 profiles/small -o src files.numfiles=12 -EOF -} - -sub read_config($) -{ - my ($filename) = @_; - my $fd; - my %config; - my $section; - - open($fd, "<", $filename) or die("Could not open $filename: $!\n"); - while (my $line = <$fd>) { - my ($key, $value); - - $line =~ s/(^\s*|\s*$)//g; - next if ($line eq "" || $line =~ /^#/); - if ($line =~ /^\[\s*(\S+)\s*]$/) { - $section = $1; - next; - } - if ($line !~ /^(\S+)\s*=\s*(.*)$/) { - die("$filename:$.: Unknown line format: $line\n"); - } - ($key, $value) = ($1, $2); - if (!defined($section)) { - die("$filename:$.: Directive outside of section\n"); - } - $config{$section}->{$1} = $2; - } - close($fd); - - return \%config; -} - -sub apply_config($$) -{ - my ($config, $directive) = @_; - - for my $dir (@$directive) { - if ($dir !~ /^([^\.]+)\.([^=]+)=(.*)$/) { - die("Unknown directive format: $dir\n"); - } - $config->{$1}->{$2} = $3; - } -} - -sub get_value($$;$) -{ - my ($config, $dir, $default) = @_; - my ($section, $key, $value); - - if ($dir !~ /^([^\.]+)\.([^=]+)$/) { - die("$0: Internal error: Unknown key format: $key\n"); - } - ($section, $key) = ($1, $2); - - $value = $config->{$section}->{$key}; - - if (!defined($value)) { - if (!defined($default)) { - die("$0: Missing config value for $dir\n"); - } - $value = $default; - } - - return $value; -} - -sub get_int($$;$$$) -{ - my ($config, $dir, $default, $min, $max) = @_; - my $value = get_value($config, $dir, $default); - - if ($value !~ /^\d+$/) { - die("$0: Config value $dir must be an integer: $value\n"); - } - $value = int($value); - if (defined($min) && $value < $min) { - die("$0: Config value $dir is too low (min $min): $value\n"); - } - if (defined($max) && $value > $max) { - die("$0: Config value $dir is too high (max $max): $value\n"); - } - - return int($value); -} - -sub get_list($$;$) -{ - my ($config, $dir, $default) = @_; - my $value = get_value($config, $dir, $default); - my @list = split(/\s+/, $value); - - return \@list; -} - -sub randlist($) -{ - my ($list) = @_; - - return "" if (!@$list); - return $list->[int(rand(scalar(@$list)))]; -} - -sub randbool() -{ - return int(rand(2)); -} - -# Reduce LIST to PERCENTAGE of its former size. -sub reduce_list_per($$) -{ - my ($list, $percentage) = @_; - my $remove; - - $remove = int((100 - $percentage) * scalar(@$list) / 100); - - for (my $i = 0; $i < $remove; $i++) { - splice(@$list, int(rand(scalar(@$list))), 1); - } -} - -# Reduce LIST to NUM items. -sub reduce_list_num($$) -{ - my ($list, $num) = @_; - my $remove; - - $remove = scalar(@$list) - $num; - - for (my $i = 0; $i < $remove; $i++) { - splice(@$list, int(rand(scalar(@$list))), 1); - } -} - -sub _gen_filename($$) -{ - my ($c, $root) = @_; - my $ltop = get_list($c, "files.top", ""); - my $lsub = get_list($c, "files.sub", ""); - my $lsubsub = get_list($c, "files.subsub", ""); - my $lprefix = get_list($c, "files.prefix"); - my $lsuffix = get_list($c, "files.suffix", ""); - my $lext = get_list($c, "files.ext"); - my ($top, $sub, $subsub, $prefix, $suffix, $ext) = - ("", "", "", "", "", ""); - my $filename = ""; - - $top = randlist($ltop) if (randbool()); - $sub = randlist($lsub) if (randbool()); - $subsub = randlist($lsubsub) if (randbool()); - $prefix = randlist($lprefix); - $suffix = randlist($lsuffix) if (randbool()); - $ext = randlist($lext); - - $filename = $root; - $filename .= "/".$top if ($top ne ""); - $filename .= "/".$sub if ($sub ne ""); - $filename .= "/".$subsub if ($subsub ne ""); - $filename .= "/".$prefix; - $filename .= "_".$suffix if ($suffix ne ""); - $filename .= $ext; - $filename =~ s#^//#/#; - - return $filename; -} - -sub gen_filename($$$) -{ - my ($c, $root, $filenames) = @_; - my $filename; - - do { - $filename = _gen_filename($c, $root); - } while ($filenames->{$filename}); - $filenames->{$filename} = 1; - - return $filename; -} - -sub gen_lines($$) -{ - my ($c, $length) = @_; - my @lines = 1 .. $length; - my $percent = get_int($c, "lines.instrumented", undef, 0, 100); - - reduce_list_per(\@lines, $percent); - - return \@lines; -} - -sub gen_fnname($$) -{ - my ($c, $hash) = @_; - my $lverb = get_list($c, "functions.verb"); - my $ladj = get_list($c, "functions.adj", ""); - my $lnoun = get_list($c, "functions.noun", ""); - my ($verb, $adj, $noun) = ("", "", ""); - my $fnname; - - $verb = randlist($lverb); - $adj = randlist($ladj) if (randbool()); - $noun = randlist($lnoun) if (randbool()); - - $fnname = $verb; - $fnname .= "_".$adj if ($adj ne ""); - $fnname .= "_".$noun if ($noun ne ""); - - if (exists($hash->{$fnname})) { - my $i = 2; - - while (exists($hash->{$fnname.$i})) { - $i++; - } - $fnname .= $i; - } - $hash->{$fnname} = 1; - - return $fnname; -} - -sub gen_functions($$) -{ - my ($c, $lines) = @_; - my @fnlines; - my @functions; - my %names; - my $percent = get_int($c, "functions.perinstrumented", undef, 0, 100); - - @fnlines = @$lines; - reduce_list_per(\@fnlines, $percent); - - foreach my $fnline (@fnlines) { - push(@functions, [ $fnline, gen_fnname($c, \%names) ]); - } - - return \@functions; -} - - -# Returns a value distribution object. This object can be used to randomly -# choose one element from a list of elements with a given relative distribution. -# -# dist: [ sumprob, probs] -# sumprob: Sum of all probabilities -# probs: [ prob1, prob2, ... ] -# prob: [ num, x ] -# num: Value -sub get_dist($$;$) -{ - my ($c, $dir, $default) = @_; - my $list = get_list($c, $dir, $default); - my $sumprob = 0; - my @probs; - - foreach my $spec (@$list) { - my ($n, $p); - - if ($spec =~ /^(\d+):(\d+)$/) { - ($n, $p) = ($1, $2); - } elsif ($spec =~ /^(\d+)$/) { - $n = $1; - $p = 1; - } else { - die("$0: Config value $dir must be a distribution ". - "list (a:p1 b:p2 ...)\n"); - } - $sumprob += $p; - push(@probs, [ $n, $sumprob ]); - } - - return [ $sumprob, \@probs ]; -} - -sub rand_dist($) -{ - my ($dist) = @_; - my ($sumprob, $probs) = @$dist; - my $r = int(rand($sumprob)); - - foreach my $prob (@$probs) { - my ($num, $x) = @$prob; - return $num if ($r < $x); - } - - die("Internal error: Incomplete distribution list\n"); -} - -sub gen_branches($$) -{ - my ($c, $lines) = @_; - my $percent = get_int($c, "branches.perinstrumented", undef, 0, 100); - my @allblocks = @{get_list($c, "branches.blocks", "0")}; - my $branchdist = get_dist($c, "branches.branchdist", "2"); - my @brlines; - my @branches; - - @brlines = @$lines; - reduce_list_per(\@brlines, $percent); - - foreach my $brline (@brlines) { - my @blocks = @allblocks; - my $numblocks = int(rand(scalar(@blocks))) + 1; - - reduce_list_num(\@blocks, $numblocks); - - foreach my $block (@blocks) { - my $numbranch = rand_dist($branchdist); - - for (my $branch = 0; $branch < $numbranch; $branch++) { - push(@branches, [ $brline, $block, $branch]); - } - } - } - - return \@branches; -} - -sub gen_filesrc($) -{ - my ($c) = @_; - my ($length, $lines, $functions, $branches); - my $do_ln = get_int($c, "lines.enabled"); - my $do_fn = get_int($c, "functions.enabled"); - my $do_br = get_int($c, "branches.enabled"); - - $length = 1 + int(rand(get_int($c, "lines.maxlines"))); - $lines = gen_lines($c, $length); - $functions = gen_functions($c, $lines) if ($do_fn); - $branches = gen_branches($c, $lines) if ($do_br); - - return [ $length, $lines, $functions, $branches ]; -} - -# Generate fake source tree. -# -# returns: [ files, numlns, numfns, numbrs ] -# files: filename -> filesrc -# filesrc: [ length, lines, functions, branches ] -# length: Total number of lines in file -# -# lines: [ line1, line2, ... ] -# -# functions: [ fn1, fn2, ... ] -# fn: [ fnline, fnname ] -# fnline: Starting line of function -# fnname: Function name -# -# branches: [ brdata1, brdata2, ...] -# brdata: [ brline, block, branch ] -# brline: Line number containing branches -# block: Block ID -# branch: Branch ID -# -sub gen_src($$) -{ - my ($c, $root) = @_; - my %files; - my $numfiles = get_int($c, "files.numfiles"); - my %filenames; - my ($numlns, $numfns, $numbrs) = (0, 0, 0); - - for (my $i = 0; $i < $numfiles; $i++) { - my $filename = gen_filename($c, $root, \%filenames); - my $filesrc = gen_filesrc($c); - - $files{$filename} = $filesrc; - $numlns += scalar(@{$filesrc->[1]}) if (defined($filesrc->[1])); - $numfns += scalar(@{$filesrc->[2]}) if (defined($filesrc->[2])); - $numbrs += scalar(@{$filesrc->[3]}) if (defined($filesrc->[3])); - } - - return [ \%files, $numlns, $numfns, $numbrs ]; -} - -sub write_src($) -{ - my ($src) = @_; - my ($files, $numlns, $numfns, $numbrs) = @$src; - - foreach my $filename (sort(keys(%{$files}))) { - my $filesrc = $files->{$filename}; - my $length = $filesrc->[0]; - my $dir = dirname($filename); - my $fd; - - if (!-d $dir) { - make_path($dir) or - die("Could not create directory $dir\n"); - } - - open($fd, ">", $filename) or - die("Could not create file $filename: $!\n"); - for (my $i = 0; $i < $length; $i++) { - print($fd "\n"); - } - close($fd); - } -} - -sub write_branches($$$$) -{ - my ($fd, $branches, $brhits, $iref) = @_; - my ($found, $hit) = (0, 0); - - # Line coverage data - foreach my $brdata (@$branches) { - my $brhit = $brhits->[$$iref++]; - my ($brline, $block, $branch) = @$brdata; - - $found++; - $hit++ if ($brhit ne "-" && $brhit > 0); - print($fd "BRDA:$brline,$block,$branch,$brhit\n"); - } - if ($found > 0) { - print($fd "BRF:$found\n"); - print($fd "BRH:$hit\n"); - } -} - -sub write_lines($$$$) -{ - my ($fd, $lines, $lnhist, $iref) = @_; - my ($found, $hit) = (0, 0); - - # Line coverage data - foreach my $line (@$lines) { - my $lnhit = $lnhist->[$$iref++]; - - $found++; - $hit++ if ($lnhit > 0); - print($fd "DA:$line,$lnhit\n"); - } - print($fd "LF:$found\n"); - print($fd "LH:$hit\n"); -} - -sub write_functions($$$$) -{ - my ($fd, $functions, $fnhits, $iref) = @_; - my ($found, $hit) = (0, 0); - - # Function coverage data - foreach my $fn (@$functions) { - my ($fnline, $fnname) = @$fn; - - print($fd "FN:$fnline,$fnname\n"); - } - foreach my $fn (@$functions) { - my ($fnline, $fnname) = @$fn; - my $fnhit = $fnhits->[$$iref++]; - - $found++; - $hit++ if ($fnhit > 0); - print($fd "FNDA:$fnhit,$fnname\n"); - } - print($fd "FNF:$found\n"); - print($fd "FNH:$hit\n"); -} - -sub write_filesrc($$$$$) -{ - my ($c, $fd, $filesrc, $hits, $iter) = @_; - my ($length, $lines, $functions, $branches) = @$filesrc; - my $do_ln = get_int($c, "lines.enabled"); - my $do_fn = get_int($c, "functions.enabled"); - my $do_br = get_int($c, "branches.enabled"); - - write_functions($fd, $functions, $hits->[1], \$iter->[1]) if ($do_fn); - write_branches($fd, $branches, $hits->[2], \$iter->[2]) if ($do_br); - write_lines($fd, $lines, $hits->[0], \$iter->[0]) if ($do_ln); -} - -sub write_info($$$$) -{ - my ($c, $filename, $src, $hits) = @_; - my $files = $src->[0]; - my $fd; - my %iters; - - foreach my $testname (keys(%{$hits})) { - $iters{$testname} = [ 0, 0, 0 ]; - } - - open($fd, ">", $filename) or die("Could not create $filename: $!\n"); - - foreach my $filename (sort(keys(%{$files}))) { - my $filesrc = $files->{$filename}; - - foreach my $testname (sort(keys(%{$hits}))) { - my $testhits = $hits->{$testname}; - my $iter = $iters{$testname}; - - print($fd "TN:$testname\n"); - print($fd "SF:$filename\n"); - - write_filesrc($c, $fd, $filesrc, $testhits, $iter); - - print($fd "end_of_record\n"); - } - } - - close($fd); -} - -sub get_hit_found($) -{ - my ($list) = @_; - my ($hit, $found) = (0, 0); - - foreach my $e (@$list) { - $hit++ if ($e ne "-" && $e > 0); - $found++; - } - return ($hit, $found); -} - -sub write_counts($$) -{ - my ($filename, $hits) = @_; - my $fd; - my (@tlnhits, @tfnhits, @tbrhits); - - foreach my $testname (keys(%{$hits})) { - my $testhits = $hits->{$testname}; - my ($lnhits, $fnhits, $brhits) = @$testhits; - - for (my $i = 0; $i < scalar(@$lnhits); $i++) { - $tlnhits[$i] += $lnhits->[$i]; - } - for (my $i = 0; $i < scalar(@$fnhits); $i++) { - $tfnhits[$i] += $fnhits->[$i]; - } - for (my $i = 0; $i < scalar(@$brhits); $i++) { - my $h = $brhits->[$i]; - - $h = 0 if ($h eq "-"); - $tbrhits[$i] += $h; - } - } - - open($fd, ">", $filename) or die("Could not create $filename: $!\n"); - print($fd join(" ", get_hit_found(\@tlnhits), get_hit_found(\@tfnhits), - get_hit_found(\@tbrhits))."\n"); - close($fd); -} - -# A branch hit value for a block that was not hit must be "-". A branch hit -# value for a block that was hit cannot be "-", but must be "0" if not hit. -sub sanitize_brhits($) -{ - my ($brhits) = @_; - my $block_hit = 0; - - foreach my $brhit_ref (@$brhits) { - if ($$brhit_ref ne "-" && $$brhit_ref > 0) { - $block_hit = 1; - last; - } - } - foreach my $brhit_ref (@$brhits) { - if (!$block_hit) { - $$brhit_ref = "-"; - } elsif ($$brhit_ref eq "-") { - $$brhit_ref = 0; - } - } -} - -# Ensure coverage rate interdependencies are met -sub sanitize_hits($$) -{ - my ($src, $hits) = @_; - my $files = $src->[0]; - - foreach my $hits (values(%{$hits})) { - my $brhits = $hits->[2]; - my $i = 0; - - foreach my $filename (sort(keys(%{$files}))) { - my $filesrc = $files->{$filename}; - my $branches = $filesrc->[3]; - my $lastblock; - my $lastline; - my @blist; - - foreach my $brdata (@$branches) { - my ($brline, $block, $branch) = @$brdata; - - if (!defined($lastblock) || - $block != $lastblock || - $brline != $lastline) { - sanitize_brhits(\@blist); - @blist = (); - $lastblock = $block; - $lastline = $brline; - } - push(@blist, \$brhits->[$i++]); - } - sanitize_brhits(\@blist); - } - } -} - -# Generate random coverage data -# -# returns: testname -> testhits -# testhits: [ lnhits, fnhits, brhits ] -# lnhits: [ ln1hit, ln2hit, ... ] -# lnhit: Number of times a line was hit by a specific test -# fnhits: [ fn1hit, fn2hit, ... ] -# fnhit: Number of times a function was hit by a specific test -# brhits: [ br1hit, br2hit, ... ] -# brhit: Number of times a branch was hit by a specific test -sub gen_hits($$) -{ - my ($c, $src) = @_; - my (@lnhits, @fnhits, @brhits); - my ($files, $numlns, $numfns, $numbrs) = @$src; - my $testnames = get_list($c, "tests.names", ""); - my %hits; - - $testnames = [ "" ] if (!@$testnames); - - foreach my $testname (@$testnames) { - my (@lnhits, @fnhits, @brhits); - - for (my $i = 0; $i < $numlns; $i++) { - push(@lnhits, 1 + int(rand($MAX_TAKEN))); - } - - for (my $i = 0; $i < $numfns; $i++) { - push(@fnhits, 1 + int(rand($MAX_TAKEN))); - } - - for (my $i = 0; $i < $numbrs; $i++) { - push(@brhits, 1 + int(rand($MAX_TAKEN))); - } - - $hits{$testname} = [ \@lnhits, \@fnhits, \@brhits ]; - } - - sanitize_hits($src, \%hits); - - return \%hits; -} - -# Return a hash containing RATE percent of indices [0..NUM-1]. -sub gen_filter($$) -{ - my ($num, $rate) = @_; - my @list = (0 .. ($num - 1)); - my %hash; - - reduce_list_per(\@list, $rate); - foreach my $i (@list) { - $hash{$i} = 1; - } - - return \%hash; -} - -# Zero all entries in LIST identified by the indices in FILTER. -sub zero_by_filter($$) -{ - my ($list, $filter) = @_; - - foreach my $i (keys(%{$filter})) { - $list->[$i] = 0; - } -} - -# Add a random number of indices between [0..NUM-1] to FILTER. -sub widen_filter($$) -{ - my ($filter, $num) = @_; - my @list; - - for (my $i = 0; $i < $num; $i++) { - push(@list, $i) if (!exists($filter->{$i})); - } - reduce_list_per(\@list, int(rand(101))); - - foreach my $i (@list) { - $filter->{$i} = 1; - } -} - -# Zero coverage data in HITS until the combined coverage rates reach the -# specified RATEs. -sub reduce_hits($$$$$) -{ - my ($src, $hits, $lnrate, $fnrate, $brrate) = @_; - my ($files, $numlns, $numfns, $numbrs) = @$src; - my ($lnfilter, $fnfilter, $brfilter); - - $lnfilter = gen_filter($numlns, 100 - $lnrate); - $fnfilter = gen_filter($numfns, 100 - $fnrate); - $brfilter = gen_filter($numbrs, 100 - $brrate); - - foreach my $testhits (values(%{$hits})) { - my ($lnhits, $fnhits, $brhits) = @$testhits; - - zero_by_filter($lnhits, $lnfilter); - zero_by_filter($fnhits, $fnfilter); - zero_by_filter($brhits, $brfilter); - - # Provide some variation between tests - widen_filter($lnfilter, $numlns); - widen_filter($fnfilter, $numfns); - widen_filter($brfilter, $numbrs); - } - - sanitize_hits($src, $hits); -} - -sub zero_list($) -{ - my ($list) = @_; - - foreach my $i (@$list) { - $i = 0; - } -} - -# Zero all coverage in HITS. -sub zero_hits($$) -{ - my ($src, $hits) = @_; - - foreach my $testhits (values(%{$hits})) { - my ($lnhits, $fnhits, $brhits) = @$testhits; - - zero_list($lnhits); - zero_list($fnhits); - zero_list($brhits); - } - - sanitize_hits($src, $hits); -} - -# Distribute items from LIST to A and B depending on whether the index for -# an item is found in FILTER. -sub split_by_filter($$$$) -{ - my ($list, $filter, $a, $b) = @_; - - for (my $i = 0; $i < scalar(@$list); $i++) { - if (exists($filter->{$i})) { - push(@$a, $list->[$i]); - push(@$b, 0); - } else { - push(@$a, 0); - push(@$b, $list->[$i]); - } - } -} - -sub split_hits($$$) -{ - my ($c, $src, $hits) = @_; - my ($files, $numlns, $numfns, $numbrs) = @$src; - my ($lnsplit, $fnsplit, $brsplit); - my (%a, %b); - - $lnsplit = gen_filter($numlns, int(rand(101))); - $fnsplit = gen_filter($numfns, int(rand(101))); - $brsplit = gen_filter($numbrs, int(rand(101))); - - foreach my $testname (keys(%{$hits})) { - my $testhits = $hits->{$testname}; - my ($lnhits, $fnhits, $brhits) = @$testhits; - my (@lnhitsa, @fnhitsa, @brhitsa); - my (@lnhitsb, @fnhitsb, @brhitsb); - - split_by_filter($lnhits, $lnsplit, \@lnhitsa, \@lnhitsb); - split_by_filter($fnhits, $fnsplit, \@fnhitsa, \@fnhitsb); - split_by_filter($brhits, $brsplit, \@brhitsa, \@brhitsb); - - $a{$testname} = [ \@lnhitsa, \@fnhitsa, \@brhitsa ]; - $b{$testname} = [ \@lnhitsb, \@fnhitsb, \@brhitsb ]; - } - - sanitize_hits($src, \%a); - sanitize_hits($src, \%b); - - return (\%a, \%b); -} - -sub plural($$$) -{ - my ($num, $sing, $plur) = @_; - - return $num <= 1 ? $sing : $plur; -} - -sub print_intro($) -{ - my ($c) = @_; - my $numtests = scalar(@{get_list($c, "tests.names")}); - my $numfiles = get_int($c, "files.numfiles"); - - $numtests = 1 if ($numtests < 1); - - print($BOLD."Creating coverage files ($numtests ". - plural($numtests, "test", "tests").", $numfiles ". - plural($numfiles, "source file", "source files").")\n".$RESET); -} - -sub main() -{ - my $opt_help; - my $opt_output; - my $opt_configfile; - my $opt_seed = 0; - my $c; - my $src; - my $hits; - my $root; - my $enum; - my ($a, $b); - - # Parse options - if (!GetOptions("output|o=s" => \$opt_output, - "seed=s" => \$opt_seed, - "help|h" => \$opt_help, - )) { - print(STDERR "Use $0 --help to get usage information\n"); - exit(2); - } - - if ($opt_help) { - usage(); - exit(0); - } - - $opt_configfile = shift(@ARGV); - if (!defined($opt_configfile)) { - print(STDERR "Please specify a config file\n"); - exit(2); - } - - if (defined($opt_output)) { - if (! -d $opt_output) { - mkdir($opt_output) or - die("$0: Could not create directory ". - "$opt_output: $!\n"); - } - $root = abs_path($opt_output) - } else { - $root = "/"; - } - - srand($opt_seed); - - # Get config - $c = read_config($opt_configfile); - apply_config($c, \@ARGV) if (@ARGV); - - print_intro($c); - # Show lines on STDOUT without newline - $| = 1; - - # Create source tree - print(" Source tree ......... "); - $src = gen_src($c, $root); - # Write out source code if requested - write_src($src) if (defined($opt_output)); - print("done ("); - print($src->[1]." lines, "); - print($src->[2]." functions, "); - print($src->[3]." branches)\n"); - - # Write out full-coverage data files - print(" Full coverage ....... "); - $hits = gen_hits($c, $src); - write_info($c, "full.info", $src, $hits); - write_counts("full.counts", $hits); - print("done\n"); - - # Write out data files with target coverage rates - print(" Target coverage ..... "); - reduce_hits($src, $hits, get_int($c, "lines.covered"), - get_int($c, "functions.covered"), - get_int($c, "branches.covered")); - write_info($c, "target.info", $src, $hits); - write_counts("target.counts", $hits); - print("done\n"); - - # Write out partial data files - print(" Partial coverage .... "); - ($a, $b) = split_hits($c, $src, $hits); - write_info($c, "part1.info", $src, $a); - write_counts("part1.counts", $a); - write_info($c, "part2.info", $src, $b); - write_counts("part2.counts", $b); - print("done\n"); - - # Write out zero-coverage data files - print(" Zero coverage ....... "); - zero_hits($src, $hits); - write_info($c, "zero.info", $src, $hits); - write_counts("zero.counts", $hits); - print("done\n"); -} - -main(); -exit(0); diff --git a/ThirdParty/lcov/test/bin/norminfo b/ThirdParty/lcov/test/bin/norminfo deleted file mode 100755 index 9fe0ef2f0..000000000 --- a/ThirdParty/lcov/test/bin/norminfo +++ /dev/null @@ -1,243 +0,0 @@ -#!/usr/bin/env perl -# -# Copyright IBM Corp. 2017 -# -# Usage: norminfo <coverage-data-file> [<multiplier>] -# -# Normalize coverage data file (ensure stable order), perform some sanity -# checks, and apply optional multiplier to execution counts. -# - -use strict; -use warnings; - -sub ferr($$$) -{ - my ($pos, $filename, $msg) = @_; - - if (defined($pos)) { - $pos .= ":"; - } else { - $pos = ""; - } - - die("$0:$filename:$pos $msg"); -} - -sub print_sorted($$$) -{ - my ($fd, $info, $multi) = @_; - my (%fn, %fns, %fnda, %brda, %da); - my ($fnf, $fnh, $brf, $brh, $lf, $lh); - - while (my $line = <$fd>) { - $line =~ s/(^\s*|\s*$)//g; - - if ($line =~ /^end_of_record$/) { - last; - } elsif ($line =~ /^FN:(\d+),(.*)$/) { - my ($lineno, $fnname) = ($1, $2); - - if (exists($fn{$lineno})) { - ferr($., $info, "Duplicate FN: entry\n"); - } - $fn{$lineno} = $fnname; - if (exists($fns{$fnname})) { - ferr($., $info, "Duplicate function name\n"); - } - $fns{$fnname} = $lineno; - } elsif ($line =~ /^FNDA:(\d+),(.*)$/) { - my ($count, $fnname) = ($1, $2); - - if (exists($fnda{$fnname})) { - ferr($., $info, "Duplicate FNDA: entry\n"); - } - $fnda{$fnname} = int($count * $multi); - } elsif ($line =~ /^FNF:(\d+)$/) { - if (defined($fnf)) { - ferr($., $info, "Duplicate FNF: entry\n"); - } - $fnf = $1; - } elsif ($line =~ /^FNH:(\d+)$/) { - if (defined($fnh)) { - ferr($., $info, "Duplicate FNH: entry\n"); - } - $fnh = $1; - } elsif ($line =~ /^BRDA:(\d+),(\d+),(\d+),(\d+|-)$/) { - my ($lineno, $block, $branch, $count) = ($1, $2, $3, $4); - - if (exists($brda{$lineno}->{$block}->{$branch})) { - ferr($., $info, "Duplicate BRDA: entry\n"); - } - $count = int($count * $multi) if ($count ne "-"); - $brda{$lineno}->{$block}->{$branch} = $count; - - } elsif ($line =~ /^BRF:(\d+)$/) { - if (defined($brf)) { - ferr($., $info, "Duplicate BRF: entry\n"); - } - $brf = $1; - } elsif ($line =~ /^BRH:(\d+)$/) { - if (defined($brh)) { - ferr($., $info, "Duplicate BRH: entry\n"); - } - $brh = $1; - } elsif ($line =~ /^DA:(\d+),(\d+)$/) { - my ($lineno, $count) = ($1, $2); - - if (exists($da{$lineno})) { - ferr($., $info, "Duplicate FNDA: entry\n"); - } - $da{$lineno} = int($count * $multi); - } elsif ($line =~ /^LF:(\d+)$/) { - if (defined($lf)) { - ferr($., $info, "Duplicate LF: entry\n"); - } - $lf = $1; - } elsif ($line =~ /^LH:(\d+)$/) { - if (defined($lh)) { - ferr($., $info, "Duplicate LH: entry\n"); - } - $lh = $1; - } else { - ferr($., $info, "Unknown line: $line\n"); - } - } - - # FN:<line>,<fnname> - foreach my $lineno (sort({ $a <=> $b } keys(%fn))) { - my $fnname = $fn{$lineno}; - print("FN:$lineno,$fnname\n"); - } - - # FNDA:<counts>,<fnname> - foreach my $fnname (keys(%fnda)) { - if (!exists($fns{$fnname})) { - ferr(undef, $info, "FNDA entry without FN: $fnname\n"); - } - } - foreach my $fnname (sort({ $fns{$a} <=> $fns{$b} } keys(%fnda))) { - my $count = $fnda{$fnname}; - print("FNDA:$count,$fnname\n"); - } - # FNF:<counts> - print("FNF:$fnf\n") if (defined($fnf)); - # FNH:<counts> - if (defined($fnh)) { - $fnh = 0 if ($multi == 0); - print("FNH:$fnh\n"); - } - # BRDA:<line>,<block>,<branch>,<count> - foreach my $lineno (sort({ $a <=> $b } keys(%brda))) { - my $blocks = $brda{$lineno}; - - foreach my $block (sort({ $a <=> $b } keys(%{$blocks}))) { - my $branches = $blocks->{$block}; - - foreach my $branch (sort({ $a <=> $b } - keys(%{$branches}))) { - my $count = $branches->{$branch}; - - $count = "-" if ($multi == 0); - print("BRDA:$lineno,$block,$branch,$count\n"); - } - } - - } - # BRF:<counts> - print("BRF:$brf\n") if (defined($brf)); - # BRH:<counts> - if (defined($brh)) { - $brh = 0 if ($multi == 0); - print("BRH:$brh\n"); - } - # DA:<line>,<counts> - foreach my $lineno (sort({ $a <=> $b } keys(%da))) { - my $count = $da{$lineno}; - - print("DA:$lineno,$count\n"); - } - # LF:<counts> - print("LF:$lf\n") if (defined($lf)); - # LH:<count> - if (defined($lh)) { - $lh = 0 if ($multi == 0); - print("LH:$lh\n"); - } -} - -sub main() -{ - my $infofile = $ARGV[0]; - my $multi = $ARGV[1]; - # info: testname -> files - # files: infofile -> data - # data: [ starting offset, starting line ] - my %info; - my $fd; - my $tn = ""; - my %allfiles; - - $multi = 1 if (!defined($multi)); - if (!defined($infofile)) { - $infofile = "standard input"; - warn("$0: Reading data from standard input\n"); - open($fd, "<&STDIN") or - die("$0: Could not duplicated stdin: $!\n"); - } else { - open($fd, "<", $infofile) or - die("$0: Could not open $infofile: $!\n"); - } - - # Register starting positions of data sets - while (my $line = <$fd>) { - if ($line =~ /^TN:(.*)$/) { - $tn = $1; - } elsif ($line =~ /^SF:(.*)$/) { - my $sf = $1; - my $pos = tell($fd); - - die("$0: Could not get file position: $!\n") - if ($pos == -1); - if (exists($info{$tn}->{$sf})) { - ferr($., $infofile, - "Duplicate entry for $tn:$sf\n"); - } - $info{$tn}->{$sf} = [ $pos, $. ]; - $allfiles{$sf} = 1; - } - } - - # Print data sets in normalized order - foreach my $filename (sort(keys(%allfiles))) { - foreach my $testname (sort(keys(%info))) { - my $pos = $info{$testname}->{$filename}; - my ($cpos, $lpos) = @$pos; - - next if (!defined($pos)); - - if (seek($fd, $cpos, 0) != 1) { - die("$0: Could not seek in $infofile: $!\n"); - } - printf("TN:$testname\n"); - printf("SF:$filename\n"); - - $. = $lpos; - print_sorted($fd, $infofile, $multi); - - printf("end_of_record\n"); - - } - } - foreach my $testname (sort(keys(%info))) { - my $files = $info{$testname}; - - foreach my $filename (sort(keys(%{$files}))) { - } - } - - close($fd); -} - -main(); -exit(0); diff --git a/ThirdParty/lcov/test/bin/test_run b/ThirdParty/lcov/test/bin/test_run deleted file mode 100755 index 23e69d0f4..000000000 --- a/ThirdParty/lcov/test/bin/test_run +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright IBM Corp. 2017 -# -# Usage: test_run <testname> <cmdline> -# -# Announce a test case, run it, and record the resulting output in the -# test log file. Must be run after testsuite_init. -# - -TOPDIR=$(realpath $(dirname $0)/..) && source "$TOPDIR/bin/common" -EXCERPTLEN=10 -TESTNAME="$1" -shift - -TIME=$(which time 2>/dev/null) -if [ ! -z "$TIME" ] ; then - TIME="$TIME -v -o $TIMEFILE" - if ! $TIME true 2>/dev/null ; then - TIME="" - fi -fi - -t_announce "$TESTNAME" - -let POS=$(stat -c %s "$LOGFILE")+1 - -t_detail "COMMAND" "\"$*\"" >>"$LOGFILE" -t_detail "OUTPUT" "" >>"$LOGFILE" - -# Run command -$TIME bash -c "$*" 2>&1 | t_indent >>"$LOGFILE" -RC=$? - -# Evaluate output of time command -ELAPSED= -RESIDENT= -SIGNAL= -if [ ! -z "$TIME" ] ; then - while read LINE ; do - case "$LINE" in - "Command terminated by signal"*) SIGNAL=${LINE##* } ;; - "Elapsed"*) ELAPSED=$(elapsed_to_ms ${LINE##* }) ;; - "Maximum resident"*) RESIDENT=${LINE##* } ;; - "Exit status"*) RC=${LINE##* } ;; - esac - done < "$TIMEFILE" - rm -f "$TIMEFILE" -fi - -t_detail "EXITCODE" "$RC" >>"$LOGFILE" - -# Show result -if [ $RC -eq 0 -a -z "$SIGNAL" ] ; then - RESULT="pass" - t_pass "$TESTNAME" -else - if [ -z "$SIGNAL" ] ; then - RESULT="fail" - t_fail "$TESTNAME" - else - RESULT="kill" - t_kill "$TESTNAME" - fi -fi - -if [ ! -z "$SIGNAL" ] ; then - t_detail "SIGNAL" "$SIGNAL" >>"$LOGFILE" -fi - -if [ ! -z "$ELAPSED" ] ; then - echo -n " (time $(($ELAPSED/1000)).$(($ELAPSED%1000/100))s, " - echo "elapsed $TESTNAME $ELAPSED" >> "$COUNTFILE" -fi - -if [ ! -z "$RESIDENT" ] ; then - echo -n "mem $(($RESIDENT/1024)).$((($RESIDENT%1024)/100))MB)" - echo "resident $TESTNAME $RESIDENT" >> "$COUNTFILE" -fi - -echo - -# Show log excerpt on failure or if requested -if [ $RC -ne 0 -o "$V" == "1" ] ; then - LEN=$(tail -c "+$POS" "$LOGFILE" | wc -l) - if [ "$LEN" -gt "$EXCERPTLEN" -a "$V" != "1" ] ; then - tail -c "+$POS" "$LOGFILE" | head -n $EXCERPTLEN | t_indent - let LEN=$LEN-$EXCERPTLEN - echo " ..." - echo " Skipping $LEN more lines (see $LOGFILE)" - else - tail -c "+$POS" "$LOGFILE" | t_indent - fi -fi - -# Log more details -[ ! -z "$ELAPSED" ] && t_detail "TIME" "${ELAPSED}ms" >>"$LOGFILE" -[ ! -z "$RESIDENT" ] && t_detail "MEM" "${RESIDENT}kB" >>"$LOGFILE" -t_detail "RESULT" "$RESULT" >> "$LOGFILE" diff --git a/ThirdParty/lcov/test/bin/test_skip b/ThirdParty/lcov/test/bin/test_skip deleted file mode 100755 index 202606f4f..000000000 --- a/ThirdParty/lcov/test/bin/test_skip +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright IBM Corp. 2017 -# -# Usage: test_skip <testname> <reason> -# -# Announce and record that a single test case was skipped, including an -# optional reason text. Must be run after testsuite_init. -# - -TOPDIR=$(realpath $(dirname $0)/..) && source "$TOPDIR/bin/common" -TESTNAME="$1" -REASON="${*:2}" ; [ -z "$REASON" ] && REASON="<no reason given>" - -t_announce "$TESTNAME" -t_skip "$TESTNAME" -echo -t_detail "REASON" "$REASON" >>"$LOGFILE" -t_detail "REASON" "$REASON" | t_indent diff --git a/ThirdParty/lcov/test/bin/testsuite_exit b/ThirdParty/lcov/test/bin/testsuite_exit deleted file mode 100755 index 6720df99f..000000000 --- a/ThirdParty/lcov/test/bin/testsuite_exit +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright IBM Corp. 2017 -# -# Usage: testsuite_exit -# -# Announce end of test suite and show aggregate results. -# - -TOPDIR=$(realpath $(dirname $0)/..) && source "$TOPDIR/bin/common" - -echo "end_time $(date +%s.%N)" >>"$COUNTFILE" - -SUCCESS=0 -FAILED=0 -SKIPPED=0 -TOTAL_TIME=0 -TOTAL_MEM=0 -HAVE_EXT=0 - -# Get results -while read LINE ; do - set -- $LINE - case "$1" in - start_time) START_TIME=$2 ;; - end_time) END_TIME=$2 ;; - pass) let SUCCESS=$SUCCESS+1 ;; - fail) let FAILED=$FAILED+1 ;; - skip) let SKIPPED=$SKIPPED+1 ;; - elapsed) let TOTAL_TIME=$TOTAL_TIME+$3 ; HAVE_EXT=1 ;; - resident) let TOTAL_MEM=$TOTAL_MEM+$3 ; HAVE_EXT=1 ;; - esac -done < "$COUNTFILE" - -exec 3>&1 -exec >>"$LOGFILE" 2>&1 - -t_marker -t_detail "DATE" "$(t_timestamp)" - -let TOTAL=$SUCCESS+$SKIPPED+$FAILED -t_detail "EXECUTED" "$TOTAL" -t_detail "PASSED" "$SUCCESS" -t_detail "FAILED" "$FAILED" -t_detail "SKIPPED" "$SKIPPED" -[ $HAVE_EXT -eq 1 ] && t_detail "TIME" "${TOTAL_TIME}ms" -[ $HAVE_EXT -eq 1 ] && t_detail "MEM" "${TOTAL_MEM}kB" - -TOTAL_TIME=$(($TOTAL_TIME/1000)).$(($TOTAL_TIME%1000/100)) -TOTAL_MEM=$(($TOTAL_MEM/1024)).$((($TOTAL_MEM%1024)/100)) -TOTAL="$BOLD$TOTAL tests executed$RESET" -PASS="$SUCCESS passed" -FAIL="$FAILED failed" -SKIP="$SKIPPED skipped" -TIME="time ${TOTAL_TIME}s" -MEM="mem ${TOTAL_MEM}MB" - -[ "$SUCCESS" -gt 0 ] && PASS="$GREEN$PASS$DEFAULT" -[ "$FAILED" -gt 0 ] && FAIL="$RED$FAIL$DEFAULT" -[ "$SKIPPED" -gt 0 ] && SKIP="$BLUE$SKIP$DEFAULT" - -echo -en "$TOTAL, $PASS, $FAIL, $SKIP$RESET" >&3 -[ $HAVE_EXT -eq 1 ] && echo -n " ($TIME, $MEM)" >&3 -echo >&3 -echo "Result log stored in $LOGFILE" >&3 - -if [ "$FAILED" -gt 0 ] ; then - exit 1 -fi - -exit 0 diff --git a/ThirdParty/lcov/test/bin/testsuite_init b/ThirdParty/lcov/test/bin/testsuite_init deleted file mode 100755 index f901e35f1..000000000 --- a/ThirdParty/lcov/test/bin/testsuite_init +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright IBM Corp. 2017 -# -# Usage: testsuite_init -# -# Announce start of test suite and prepare log files. -# - -TOPDIR=$(realpath $(dirname $0)/..) && source "$TOPDIR/bin/common" - -echo -e $BOLD"Starting tests"$RESET -echo "start_time $(date +%s.%N)" >"$COUNTFILE" -exec >"$LOGFILE" 2>&1 - -t_detail "DATE" "$(t_timestamp)" - -t_detail "LCOV" "" -lcov --version 2>&1 | t_indent - -t_detail "GCOV" "" -gcov --version 2>&1 | t_indent - -t_detail "CPUINFO" "" -t_indent < /proc/cpuinfo - -t_detail "MEMINFO" "" -t_indent < /proc/meminfo diff --git a/ThirdParty/lcov/test/common.mak b/ThirdParty/lcov/test/common.mak deleted file mode 100644 index 55f31eb99..000000000 --- a/ThirdParty/lcov/test/common.mak +++ /dev/null @@ -1,50 +0,0 @@ -TOPDIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) -TESTDIR := $(dir $(realpath $(firstword $(MAKEFILE_LIST)))) -PARENTDIR := $(dir $(patsubst %/,%,$(TOPDIR))) -RELDIR := $(TESTDIR:$(PARENTDIR)%=%) -ZEROINFO := $(TOPDIR)zero.info -ZEROCOUNTS := $(TOPDIR)zero.counts -FULLINFO := $(TOPDIR)full.info -FULLCOUNTS := $(TOPDIR)full.counts -TARGETINFO := $(TOPDIR)target.info -TARGETCOUNTS := $(TOPDIR)target.counts -PART1INFO := $(TOPDIR)part1.info -PART1COUNTS := $(TOPDIR)part1.counts -PART2INFO := $(TOPDIR)part2.info -PART2COUNTS := $(TOPDIR)part2.counts -INFOFILES := $(ZEROINFO) $(FULLINFO) $(TARGETINFO) $(PART1INFO) $(PART2INFO) -COUNTFILES := $(ZEROCOUNTS) $(FULLCOUNTS) $(TARGETCOUNTS) $(PART1COUNTS) \ - $(PART2COUNTS) -LCOVRC := $(TOPDIR)lcovrc -LCOVFLAGS := --config-file $(LCOVRC) -SIZE := small -CC := gcc - -export LCOV := lcov $(LCOVFLAGS) -export GENHTML := genhtml $(LCOVFLAGS) -export PATH := $(TOPDIR)/../bin:$(TOPDIR)/bin:$(PATH) -export LANG := C - -all: prepare init test exit - -init: - testsuite_init - -exit: - testsuite_exit - -prepare: $(INFOFILES) $(COUNTFILES) - -clean: clean_common - -clean_common: - echo " CLEAN $(patsubst %/,%,$(RELDIR))" - -$(INFOFILES) $(COUNTFILES): - cd $(TOPDIR) && mkinfo profiles/$(SIZE) -o src/ - -ifneq ($(V),2) -.SILENT: -endif - -.PHONY: all init exit prepare clean clean_common diff --git a/ThirdParty/lcov/test/genhtml_output/Makefile b/ThirdParty/lcov/test/genhtml_output/Makefile deleted file mode 100644 index 0fbd88267..000000000 --- a/ThirdParty/lcov/test/genhtml_output/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -include ../common.mak - -GENHTML_TEST := ./genhtml_test - -TESTS := genhtml_output_zero genhtml_output_full genhtml_output_target \ - genhtml_output_part1 genhtml_output_part2 genhtml_output_combined - -test: $(TESTS) - -genhtml_output_zero: - @test_run genhtml_output_zero $(GENHTML) $(ZEROINFO) -o out_zero/ - -genhtml_output_full: - @test_run genhtml_output_full $(GENHTML) $(FULLINFO) -o out_full/ - -genhtml_output_target: - @test_run genhtml_output_target $(GENHTML) $(TARGETINFO) -o out_target/ - -genhtml_output_part1: - @test_run genhtml_output_part1 $(GENHTML) $(PART1INFO) -o out_part1/ - -genhtml_output_part2: - @test_run genhtml_output_part2 $(GENHTML) $(PART2INFO) -o out_part2/ - -genhtml_output_combined: genhtml_output_target - @test_run genhtml_output_combined $(GENHTML_TEST) $(TARGETINFO) $(PART1INFO) $(PART2INFO) - -clean: - rm -rf out_*/ - -.PHONY: test $(TESTS) clean diff --git a/ThirdParty/lcov/test/genhtml_output/genhtml_test b/ThirdParty/lcov/test/genhtml_output/genhtml_test deleted file mode 100755 index 0b0f83491..000000000 --- a/ThirdParty/lcov/test/genhtml_output/genhtml_test +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright IBM Corp. 2017 -# -# Usage: genhtml_test <ref-file> <file1> [<file2>...] -# -# Compare genhtml output of a reference coverage data file with that of -# a combination of multiple files. -# - -function die() -{ - echo "Error: $@" >&2 - exit 1 -} - -GENHTMLFLAGS="-t title" -REFFILE=$1 -shift - -if [ -z "$REFFILE" -o -z "$*" ] ; then - echo "Usage: $0 <ref-file> <file1> [<file2>...]" >&2 - exit 2 -fi - -OUTREF="out_$(basename $REFFILE .info)" -OUTCOMBINED="out_combined" - -$GENHTML $GENHTMLFLAGS "$REFFILE" -o "$OUTREF" || \ - die "Could not generate HTML for reference file" - -$GENHTML $GENHTMLFLAGS "$@" -o "$OUTCOMBINED" || \ - die "Could not generate HTML for combined files" - -diff -ur "$OUTREF" "$OUTCOMBINED" -I "headerValue" || \ - die "Mismatch in generated output" diff --git a/ThirdParty/lcov/test/lcov_add_files/Makefile b/ThirdParty/lcov/test/lcov_add_files/Makefile deleted file mode 100644 index 87937a155..000000000 --- a/ThirdParty/lcov/test/lcov_add_files/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -include ../common.mak - -ADDTEST := ./add_test - -TESTS := lcov_add_zero lcov_add_zero2 lcov_add_full lcov_add_full2 \ - lcov_add_part lcov_add_part2 lcov_add_concatenated4 - - -test: $(TESTS) - -lcov_add_zero: - # Add single zero coverage file - output should be same as input - test_run lcov_add_zero $(ADDTEST) 1 "$(ZEROINFO)" "$(ZEROINFO)" - -lcov_add_zero2: - # Add two zero coverage files - output should be same as input - test_run lcov_add_zero2 $(ADDTEST) 1 "$(ZEROINFO)" "$(ZEROINFO)" "$(ZEROINFO)" - -lcov_add_full: - # Add single 100% coverage file - output should be same as input - test_run lcov_add_full $(ADDTEST) 1 "$(FULLINFO)" "$(FULLINFO)" - -lcov_add_full2: - # Add two 100% coverage file and reduce counts to 1/2 - output should - # be same as input - test_run lcov_add_full2 $(ADDTEST) 0.5 "$(FULLINFO)" "$(FULLINFO)" "$(FULLINFO)" - -lcov_add_part: - # Add single coverage file with random coverage rate - output should - # be same as input - test_run lcov_add_part $(ADDTEST) 1 "$(PART1INFO)" "$(PART1INFO)" - -lcov_add_part2: - # Add two coverage files that were split from target file - output - # should be same as target file - test_run lcov_add_part2 $(ADDTEST) 1 "$(TARGETINFO)" "$(PART1INFO)" "$(PART2INFO)" - -lcov_add_concatenated4: - # Add coverage file that consists of 4 concatenation of target files - # and reduce counts to 1/4 - output should be the same as input - cat $(TARGETINFO) $(TARGETINFO) $(TARGETINFO) $(TARGETINFO) >concatenated.info - test_run lcov_add_concatenated4 $(ADDTEST) 0.25 $(TARGETINFO) concatenated.info - -clean: - rm -f *.info - -.PHONY: test $(TESTS) clean diff --git a/ThirdParty/lcov/test/lcov_add_files/add_test b/ThirdParty/lcov/test/lcov_add_files/add_test deleted file mode 100755 index 4ff5ffeb6..000000000 --- a/ThirdParty/lcov/test/lcov_add_files/add_test +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright IBM Corp. 2017 -# -# Usage: add_test <multiplier> <reference_file> <add_file> [<add_file>...] -# -# Add multiple coverage data files, normalize the output and multiply counts -# with multiplier. Compare against reference file. Report deviations. -# - -MULTI=$1 -REFFILE=$2 -shift 2 - -ADD= -for INFO in $* ; do - ADD="$ADD -a $INFO" -done - -if [ -z "$MULTI" -o -z "$REFFILE" -o -z "$ADD" ] ; then - echo "Usage: $0 <multiplier> <reference_file> <add_file> [<add_file>...]" >&2 - exit 1 -fi - -OUTFILE="add_"$(basename "$REFFILE") -SORTFILE="norm_$OUTFILE" - -set -x - -echo "Adding files..." -if ! $LCOV $ADD -o "$OUTFILE" ; then - echo "Error: lcov returned with non-zero exit code $?" >&2 - exit 1 -fi - -echo "Normalizing result..." -if ! norminfo "$OUTFILE" "$MULTI" > "$SORTFILE" ; then - echo "Error: Normalization of lcov result file failed" >&2 - exit 1 -fi - -echo "Comparing with reference..." -if ! diff -u "$REFFILE" "$SORTFILE" ; then - echo "Error: Result of combination differs from reference file" >&2 - exit 1 -fi diff --git a/ThirdParty/lcov/test/lcov_diff/Makefile b/ThirdParty/lcov/test/lcov_diff/Makefile deleted file mode 100644 index d2d4dd662..000000000 --- a/ThirdParty/lcov/test/lcov_diff/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -include ../common.mak - -test: - test_run lcov_diff_apply ./diff_test - -clean: - make -C old clean - make -C new clean - rm -f *.info diff diff --git a/ThirdParty/lcov/test/lcov_diff/diff_test b/ThirdParty/lcov/test/lcov_diff/diff_test deleted file mode 100755 index e0f8c0b30..000000000 --- a/ThirdParty/lcov/test/lcov_diff/diff_test +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright IBM Corp. 2017 -# -# Usage: diff_test -# -# Check lcov's diff function: -# - Compile two slightly different test programs -# - Run the programs and collect coverage data -# - Generate a patch containing the difference between the source code -# - Apply the patch to the coverage data -# - Compare the resulting patched coverage data file with the data from the -# patched source file -# - -function die() -{ - echo "Error: $@" >&2 - exit 1 -} - -make -C old || die "Failed to compile old source" -make -C new || die "Failed to compile new source" -diff -u $PWD/old/prog.c $PWD/new/prog.c > diff - -$LCOV --diff old/prog.info diff --convert-filenames -o patched.info -t bla || \ - die "Failed to apply patch to coverage data file" -norminfo new/prog.info > new_normalized.info -norminfo patched.info > patched_normalized.info -sed -i -e 's/^TN:.*$/TN:/' patched_normalized.info - -diff -u patched_normalized.info new_normalized.info || \ - die "Mismatch in patched coverage data file" - -echo "Patched coverage data file matches expected file" diff --git a/ThirdParty/lcov/test/lcov_diff/new/Makefile b/ThirdParty/lcov/test/lcov_diff/new/Makefile deleted file mode 100644 index 51005c71d..000000000 --- a/ThirdParty/lcov/test/lcov_diff/new/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -prog.info: - -include ../../common.mak - -prog.info: prog.gcda - $(LCOV) -c -d . -o prog.info - -prog.gcda: prog - ./prog || true - -prog: prog.c - $(CC) prog.c -o prog --coverage - -clean: - rm -f prog prog.gcda prog.gcno prog.info - -.PHONY: all clean diff --git a/ThirdParty/lcov/test/lcov_diff/new/prog.c b/ThirdParty/lcov/test/lcov_diff/new/prog.c deleted file mode 100644 index 6f4607cc4..000000000 --- a/ThirdParty/lcov/test/lcov_diff/new/prog.c +++ /dev/null @@ -1,41 +0,0 @@ - - - -int fn(int x) -{ - switch (x) { - case -1: return 0; - - - case 0: return 2; - case 2: return 3; - - - case 12: return 7; - default: return 255; - } - - - -} - -int fn2() -{ - - - return 7; -} - - - -int main(int argc, char *argv[]) -{ - - - if (argc > 1) - return fn(argc); - - return fn2(); - - -} diff --git a/ThirdParty/lcov/test/lcov_diff/old/Makefile b/ThirdParty/lcov/test/lcov_diff/old/Makefile deleted file mode 100644 index 51005c71d..000000000 --- a/ThirdParty/lcov/test/lcov_diff/old/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -prog.info: - -include ../../common.mak - -prog.info: prog.gcda - $(LCOV) -c -d . -o prog.info - -prog.gcda: prog - ./prog || true - -prog: prog.c - $(CC) prog.c -o prog --coverage - -clean: - rm -f prog prog.gcda prog.gcno prog.info - -.PHONY: all clean diff --git a/ThirdParty/lcov/test/lcov_diff/old/prog.c b/ThirdParty/lcov/test/lcov_diff/old/prog.c deleted file mode 100644 index a4eda2555..000000000 --- a/ThirdParty/lcov/test/lcov_diff/old/prog.c +++ /dev/null @@ -1,22 +0,0 @@ -int fn(int x) -{ - switch (x) { - case -1: return 0; - case 0: return 2; - case 2: return 3; - case 12: return 7; - default: return 255; - } -} - -int fn2() -{ - return 7; -} - -int main(int argc, char *argv[]) -{ - if (argc > 1) - return fn(argc); - return fn2(); -} diff --git a/ThirdParty/lcov/test/lcov_misc/Makefile b/ThirdParty/lcov/test/lcov_misc/Makefile deleted file mode 100644 index d3bcc4ab2..000000000 --- a/ThirdParty/lcov/test/lcov_misc/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -include ../common.mak - -test: - @test_run lcov_version lcov --version - @test_run lcov_help lcov --help diff --git a/ThirdParty/lcov/test/lcov_summary/Makefile b/ThirdParty/lcov/test/lcov_summary/Makefile deleted file mode 100644 index f48d0bc76..000000000 --- a/ThirdParty/lcov/test/lcov_summary/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -include ../common.mak - -CHECK := ./check_counts -TESTS := lcov_summary_zero lcov_summary_full lcov_summary_target \ - lcov_summary_part1 lcov_summary_part2 lcov_summary_concatenated \ - lcov_summary_concatenated2 - -test: $(TESTS) - -lcov_summary_zero: - # Compare output of lcov --summary with generated counts - test_run lcov_summary_zero $(CHECK) $(ZEROCOUNTS) $(ZEROINFO) -lcov_summary_full: - # Compare output of lcov --summary with generated counts - test_run lcov_summary_full $(CHECK) $(FULLCOUNTS) $(FULLINFO) -lcov_summary_target: - # Compare output of lcov --summary with generated counts - test_run lcov_summary_target $(CHECK) $(TARGETCOUNTS) $(TARGETINFO) -lcov_summary_part1: - # Compare output of lcov --summary with generated counts - test_run lcov_summary_part1 $(CHECK) $(PART1COUNTS) $(PART1INFO) -lcov_summary_part2: - # Compare output of lcov --summary with generated counts - test_run lcov_summary_part2 $(CHECK) $(PART2COUNTS) $(PART2INFO) -lcov_summary_concatenated: - # Compare output of lcov --summary with generated counts for a - # concatenated coverage data file - cat $(TARGETINFO) $(TARGETINFO) > concatenated.info - test_run lcov_summary_concatenated $(CHECK) $(TARGETCOUNTS) concatenated.info -lcov_summary_concatenated2: - # Compare output of lcov --summary with generated counts for a - # concatenated coverage data file (part1+part2=target) - cat $(PART1INFO) $(PART2INFO) > concatenated2.info - test_run lcov_summary_concatenated2 $(CHECK) $(TARGETCOUNTS) concatenated2.info - - - -clean: - rm -f *.info - -.PHONY: test $(TESTS) clean diff --git a/ThirdParty/lcov/test/lcov_summary/check_counts b/ThirdParty/lcov/test/lcov_summary/check_counts deleted file mode 100755 index 32d454230..000000000 --- a/ThirdParty/lcov/test/lcov_summary/check_counts +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env perl -# -# Copyright IBM Corp. 2017 -# -# Usage: check_counts <counts_file> <coverage_data_file> -# -# Compare the output of "lcov --summary" for <coverage_data_file> with the -# coverage data counts specified in <counts_file>. This file has the following -# format (all in a single line): -# -# lnhit lnfound fnhit fnfound brhit brfound2 -# - -use strict; -use warnings; - -sub do_cmp($$$) -{ - my ($title, $a, $b) = @_; - - if ($a == $b) { - print("$title: $a == $b\n"); - return 0; - } else { - print("$title: $a != $b => mismatch!\n"); - return 1; - } -} - -my $lcov = $ENV{"LCOV"}; -my ($counts, $info) = @ARGV; -my $fd; -my $cmdline; -my ($lnhit, $lnfound, $fnhit, $fnfound, $brhit, $brfound) = (0, 0, 0, 0, 0, 0); -my ($lnhit2, $lnfound2, $fnhit2, $fnfound2, $brhit2, $brfound2); -my $rc = 0; - -die("$0: LCOV environment variable not defined\n") if (!defined($lcov)); -if (!defined($counts) || !defined($info)) { - die("Usage: $0 <counts_file> <coverage_data_file>\n"); -} - -$cmdline = "$lcov --summary $info"; -open($fd, "-|", $cmdline) or die("$0: Could not run $cmdline: $!\n"); -while (<$fd>) { - ($lnhit, $lnfound) = ($1, $2) if (/(\d+) of (\d+) lines/); - ($fnhit, $fnfound) = ($1, $2) if (/(\d+) of (\d+) functions/); - ($brhit, $brfound) = ($1, $2) if (/(\d+) of (\d+) branches/); -} -close($fd); - -die("$0: Non-zero result code ($?) of command: $cmdline\n") if ($? != 0); - -open($fd, "<", $counts) or die("$0: Could not open $counts: $!\n"); -if (<$fd> !~ /^(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/) { - die("$0: Invalid count file: $counts\n"); -} -($lnhit2, $lnfound2, $fnhit2, $fnfound2, $brhit2, $brfound2) = - ($1, $2, $3, $4, $5, $6); -close($fd); - -print("Comparing --summary output for $info and $counts:\n"); -$rc |= do_cmp("line hit", $lnhit, $lnhit2); -$rc |= do_cmp("line found", $lnfound, $lnfound2); -$rc |= do_cmp("functions hit", $fnhit, $fnhit2); -$rc |= do_cmp("functions found", $fnfound, $fnfound2); -$rc |= do_cmp("branches hit", $brhit, $brhit2); -$rc |= do_cmp("branches found", $brfound, $brfound2); - -exit($rc); diff --git a/ThirdParty/lcov/test/lcovrc b/ThirdParty/lcov/test/lcovrc deleted file mode 100644 index 5005f637d..000000000 --- a/ThirdParty/lcov/test/lcovrc +++ /dev/null @@ -1,4 +0,0 @@ -# lcovrc file used during tests - -lcov_function_coverage = 1 -lcov_branch_coverage = 1 diff --git a/ThirdParty/lcov/test/profiles/large b/ThirdParty/lcov/test/profiles/large deleted file mode 100644 index 31788b040..000000000 --- a/ThirdParty/lcov/test/profiles/large +++ /dev/null @@ -1,51 +0,0 @@ -# Profile of a large source code project. Use with mkinfo to generate fake test -# source code and coverage data. - -[tests] -# List of test names -names = test1 test2 - -[files] -# Create this many files -numfiles = 500 -# Generate paths from these components (top/sub/subsub/prefix_suffix.ext) -top = lib tools test bin img scripts -sub = build debug release include target sys config -subsub = work www utils gui info log basic -prefix = main misc report tune mem list -suffix = a b c top work proto final fast -ext = .c .h - -[lines] -# Generate line coverage data -enabled = 1 -# Line coverage rate -covered = 80 -# Percentage of lines covered -instrumented = 80 -# Maximum number of lines per file -maxlines = 2000 - -[functions] -# Generate function coverage data -enabled = 1 -# Function coverage rate -covered = 60 -# Percent of instrumented lines containing function definitions -perinstrumented = 10 -# Generate function names from these components (verb_adj_noun) -verb = get set find read write stat add sub combine -adj = first last best min max avg -noun = bit byte file str num obj data - -[branches] -# Generate branch coverage data -enabled = 1 -# Branch coverage rate -covered = 20 -# Percent of instrumented lines containing branches -perinstrumented = 5 -# List of blocks to use -blocks = 0 4294967295 -# Distribution of number of branches per block (num:probability) -branchdist = 2:50 3:25 5:20 100:5 diff --git a/ThirdParty/lcov/test/profiles/medium b/ThirdParty/lcov/test/profiles/medium deleted file mode 100644 index 56598e868..000000000 --- a/ThirdParty/lcov/test/profiles/medium +++ /dev/null @@ -1,51 +0,0 @@ -# Profile of a medium-sized source code project. Use with mkinfo to generate -# fake test source code and coverage data. - -[tests] -# List of test names -names = test1 test2 test3 - -[files] -# Create this many files -numfiles = 50 -# Generate paths from these components (top/sub/subsub/prefix_suffix.ext) -top = lib tools test bin img scripts -sub = build debug release include target sys config -subsub = work www utils gui info log basic -prefix = main misc report tune mem list -suffix = a b c top work proto final fast -ext = .c .h - -[lines] -# Generate line coverage data -enabled = 1 -# Line coverage rate -covered = 80 -# Percentage of lines covered -instrumented = 50 -# Maximum number of lines per file -maxlines = 1000 - -[functions] -# Generate function coverage data -enabled = 1 -# Function coverage rate -covered = 60 -# Percent of instrumented lines containing function definitions -perinstrumented = 5 -# Generate function names from these components (verb_adj_noun) -verb = get set find read write stat add sub combine -adj = first last best min max avg -noun = bit byte file str num obj data - -[branches] -# Generate branch coverage data -enabled = 1 -# Branch coverage rate -covered = 20 -# Percent of instrumented lines containing branches -perinstrumented = 50 -# List of blocks to use -blocks = 0 4294967295 -# Distribution of number of branches per block (num:probability) -branchdist = 2:50 3:50 diff --git a/ThirdParty/lcov/test/profiles/small b/ThirdParty/lcov/test/profiles/small deleted file mode 100644 index 388d2a3bb..000000000 --- a/ThirdParty/lcov/test/profiles/small +++ /dev/null @@ -1,51 +0,0 @@ -# Profile of a small source code project. Use with mkinfo to generate fake test -# source code and coverage data. - -[tests] -# List of test names -names = test1 test2 - -[files] -# Create this many files -numfiles = 5 -# Generate paths from these components (top/sub/subsub/prefix_suffix.ext) -top = lib tools test bin img scripts -sub = build debug release include target sys config -subsub = work www utils gui info log basic -prefix = main misc report tune mem list -suffix = a b c top work proto final fast -ext = .c .h - -[lines] -# Generate line coverage data -enabled = 1 -# Line coverage rate -covered = 80 -# Percentage of lines covered -instrumented = 50 -# Maximum number of lines per file -maxlines = 500 - -[functions] -# Generate function coverage data -enabled = 1 -# Function coverage rate -covered = 60 -# Percent of instrumented lines containing function definitions -perinstrumented = 5 -# Generate function names from these components (verb_adj_noun) -verb = get set find read write stat add sub combine -adj = first last best min max avg -noun = bit byte file str num obj data - -[branches] -# Generate branch coverage data -enabled = 1 -# Branch coverage rate -covered = 20 -# Percent of instrumented lines containing branches -perinstrumented = 50 -# List of blocks to use -blocks = 0 4294967295 -# Distribution of number of branches per block (num:probability) -branchdist = 2:50 3:45 50:5 diff --git a/Tools/CMakeLists.txt b/Tools/CMakeLists.txt deleted file mode 100644 index 109b6d44a..000000000 --- a/Tools/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -set (TOOLS_FILES plot_tracks.sh plot_crossings.sh read_hist.py) - -install ( - FILES ${TOOLS_FILES} - DESTINATION share/tools - ) diff --git a/CMakeModules/CodeCoverage b/cmake/CodeCoverage similarity index 100% rename from CMakeModules/CodeCoverage rename to cmake/CodeCoverage diff --git a/CMakeModules/CodeCoverage.cmake b/cmake/CodeCoverage.cmake similarity index 100% rename from CMakeModules/CodeCoverage.cmake rename to cmake/CodeCoverage.cmake diff --git a/CMakeModules/CorsikaUtilities.cmake b/cmake/CorsikaUtilities.cmake similarity index 100% rename from CMakeModules/CorsikaUtilities.cmake rename to cmake/CorsikaUtilities.cmake diff --git a/cmake/FindCORSIKA.cmake b/cmake/FindCORSIKA.cmake new file mode 100644 index 000000000..5a18d9772 --- /dev/null +++ b/cmake/FindCORSIKA.cmake @@ -0,0 +1,6 @@ + +add_library(CORSIKA INTERFACE) + +target_compile_coptions(CORSIKA + INTERFACE + ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/cmake/FindCORSIKA8.cmake b/cmake/FindCORSIKA8.cmake new file mode 100644 index 000000000..39f936323 --- /dev/null +++ b/cmake/FindCORSIKA8.cmake @@ -0,0 +1,9 @@ +add_library (CORSIKA8 INTERFACE) + +target_include_directories (CORSIKA8 + INTERFACE + ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) + +target_link_libraries (CORSIKA8 INTERFACE PhysUnits) + +set (CORSIKA8_FOUND TRUE) diff --git a/cmake/FindCatch2.cmake b/cmake/FindCatch2.cmake new file mode 100644 index 000000000..19bd43876 --- /dev/null +++ b/cmake/FindCatch2.cmake @@ -0,0 +1,8 @@ +add_library (Catch2 INTERFACE) + +target_compile_options (Catch2 + INTERFACE + -I${CMAKE_SOURCE_DIR}/externals/catch2 + ) + +set (Catch2_FOUND True) diff --git a/cmake/FindCorsika8.cmake b/cmake/FindCorsika8.cmake new file mode 100644 index 000000000..1a8549ce0 --- /dev/null +++ b/cmake/FindCorsika8.cmake @@ -0,0 +1,63 @@ +# +# FindCorsika8 +# +# This module tries to find the Corsika8 header files and extrats their version. It +# sets the following variables. +# +# CORSIKA8_FOUND - Set ON if Corsika8 headers are found, otherwise OFF. +# +# CORSIKA8_INCLUDE_DIR - Include directory for hydra header files. (All header +# files will actually be in the Corsika8 subdirectory.) +# CORSIKA8_VERSION - Version of hydra in the form "major.minor.patch". +# + +find_path( CORSIKA8_INCLUDE_DIR + PATHS + ${CMAKE_SOURCE_DIR} + /usr/include + /usr/local/include + ${CORSIKA8_DIR} + NAMES corsika/corsika.h + DOC "Corsika8 headers" + ) + + +if( CORSIKA8_INCLUDE_DIR ) + list( REMOVE_DUPLICATES CORSIKA8_INCLUDE_DIR ) +endif( CORSIKA8_INCLUDE_DIR ) + +# Find hydra version +if (CORSIKA8_INCLUDE_DIR) + file( STRINGS ${CORSIKA_INCLUDE_DIR}/corsika/corsika.h + version + REGEX "#define CORSIKA_VERSION[ \t]+([0-9x]+)" + ) + string( REGEX REPLACE + "#define CORSIKA_VERSION[ \t]+" + "" + version + "${version}" + ) + + string( REGEX MATCH "^[0-9]" major ${version} ) + string( REGEX REPLACE "^${major}00" "" version "${version}" ) + string( REGEX MATCH "^[0-9]" minor ${version} ) + string( REGEX REPLACE "^${minor}0" "" version "${version}" ) + set( CORSIKA_VERSION "${major}.${minor}.${version}") + set( CORSIKA_MAJOR_VERSION "${major}") + set( CORSIKA_MINOR_VERSION "${minor}") +endif() + +# Check for required components +include( FindPackageHandleStandardArgs ) +find_package_handle_standard_args( Corsika8 + FOUND_VAR CORSIKA8_FOUND + REQUIRED_VARS CORSIKA8_INCLUDE_DIR + VERSION_VAR CORSIKA8_VERSION + ) + +if(CORSIKA8_FOUND) + set(CORSIKA8_INCLUDE_DIRS ${CORSIKA8_INCLUDE_DIR}) +endif() + +mark_as_advanced(CORSIKA8_INCLUDE_DIR) diff --git a/cmake/FindEigen3.cmake b/cmake/FindEigen3.cmake new file mode 100644 index 000000000..0b36805e7 --- /dev/null +++ b/cmake/FindEigen3.cmake @@ -0,0 +1,107 @@ +# - Try to find Eigen3 lib +# +# This module supports requiring a minimum version, e.g. you can do +# find_package(Eigen3 3.1.2) +# to require version 3.1.2 or newer of Eigen3. +# +# Once done this will define +# +# EIGEN3_FOUND - system has eigen lib with correct version +# EIGEN3_INCLUDE_DIR - the eigen include directory +# EIGEN3_VERSION - eigen version +# +# and the following imported target: +# +# Eigen3::Eigen - The header-only Eigen library +# +# This module reads hints about search locations from +# the following environment variables: +# +# EIGEN3_ROOT +# EIGEN3_ROOT_DIR + +# Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org> +# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael@free.fr> +# Copyright (c) 2009 Benoit Jacob <jacob.benoit.1@gmail.com> +# Redistribution and use is allowed according to the terms of the 2-clause BSD license. + +if(NOT Eigen3_FIND_VERSION) + if(NOT Eigen3_FIND_VERSION_MAJOR) + set(Eigen3_FIND_VERSION_MAJOR 2) + endif() + if(NOT Eigen3_FIND_VERSION_MINOR) + set(Eigen3_FIND_VERSION_MINOR 91) + endif() + if(NOT Eigen3_FIND_VERSION_PATCH) + set(Eigen3_FIND_VERSION_PATCH 0) + endif() + + set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}") +endif() + +macro(_eigen3_check_version) + file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header) + + string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}") + set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}") + set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}") + string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}") + set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}") + + set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION}) + if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) + set(EIGEN3_VERSION_OK FALSE) + else() + set(EIGEN3_VERSION_OK TRUE) + endif() + + if(NOT EIGEN3_VERSION_OK) + + message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, " + "but at least version ${Eigen3_FIND_VERSION} is required") + endif() +endmacro() + +if (EIGEN3_INCLUDE_DIR) + + # in cache already + _eigen3_check_version() + set(EIGEN3_FOUND ${EIGEN3_VERSION_OK}) + set(Eigen3_FOUND ${EIGEN3_VERSION_OK}) + +else () + + # search first if an Eigen3Config.cmake is available in the system, + # if successful this would set EIGEN3_INCLUDE_DIR and the rest of + # the script will work as usual + find_package(Eigen3 ${Eigen3_FIND_VERSION} NO_MODULE QUIET) + + if(NOT EIGEN3_INCLUDE_DIR) + find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library + HINTS + ENV EIGEN3_ROOT + ENV EIGEN3_ROOT_DIR + PATHS + ${CMAKE_INSTALL_PREFIX}/include + ${KDE4_INCLUDE_DIR} + PATH_SUFFIXES eigen3 eigen + ) + endif() + + if(EIGEN3_INCLUDE_DIR) + _eigen3_check_version() + endif() + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK) + + mark_as_advanced(EIGEN3_INCLUDE_DIR) + +endif() + +if(EIGEN3_FOUND AND NOT TARGET Eigen3::Eigen) + add_library(Eigen3::Eigen INTERFACE IMPORTED) + set_target_properties(Eigen3::Eigen PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${EIGEN3_INCLUDE_DIR}") +endif() diff --git a/cmake/FindPhysUnits.cmake b/cmake/FindPhysUnits.cmake new file mode 100644 index 000000000..321ec043e --- /dev/null +++ b/cmake/FindPhysUnits.cmake @@ -0,0 +1,8 @@ +add_library (PhysUnits INTERFACE) + +target_compile_options (PhysUnits + INTERFACE + -I${CMAKE_SOURCE_DIR}/externals/phys_units + ) + +set (PhysUnits_FOUND True) diff --git a/CMakeModules/FindPythia8.cmake b/cmake/FindPythia8.cmake similarity index 100% rename from CMakeModules/FindPythia8.cmake rename to cmake/FindPythia8.cmake diff --git a/corsika/corsika.hpp b/corsika/corsika.hpp new file mode 100644 index 000000000..e69de29bb diff --git a/corsika/detail/framework/core/Cascade.inl b/corsika/detail/framework/core/Cascade.inl new file mode 100644 index 000000000..1f784caa6 --- /dev/null +++ b/corsika/detail/framework/core/Cascade.inl @@ -0,0 +1,262 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/random/ExponentialDistribution.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/random/UniformRealDistribution.hpp> +#include <corsika/framework/stack/SecondaryView.hpp> +#include <cassert> +#include <cmath> +#include <iostream> +#include <limits> +#include <type_traits> + +#include <boost/type_index.hpp> + +#include <corsika/media/Environment.hpp> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> +#include <corsika/framework/sequence/ProcessReturn.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +using boost::typeindex::type_id_with_cvr; + +/** + * The cascade namespace assembles all objects needed to simulate full particles cascades. + */ + +namespace corsika { + + + template <typename TTracking, typename TProcessList, typename TStack, typename TStackView> + void Cascade<TTracking, TProcessList, TStack, TStackView >::Init() + { + fProcessSequence.Init(); + fStack.Init(); + } + + + template <typename TTracking, typename TProcessList, typename TStack, typename TStackView> + void Cascade<TTracking, TProcessList, TStack, TStackView >::SetNodes() { + std::for_each(fStack.begin(), fStack.end(), [&](auto& p) { + auto const* numericalNode = + fEnvironment.GetUniverse()->GetContainingNode(p.GetPosition()); + p.SetNode(numericalNode); + }); + } + + template <typename TTracking, typename TProcessList, typename TStack, typename TStackView> + void Cascade<TTracking, TProcessList, TStack, TStackView >::Run() + { + SetNodes(); + + while (!fStack.IsEmpty()) { + while (!fStack.IsEmpty()) { + auto pNext = fStack.GetNextParticle(); + std::cout << "========= next: " << pNext.GetPID() << std::endl; + Step(pNext); + std::cout << "========= stack ============" << std::endl; + fProcessSequence.DoStack(fStack); + } + // do cascade equations, which can put new particles on Stack, + // thus, the double loop + // DoCascadeEquations(); + } + } + + template <typename TTracking, typename TProcessList, typename TStack, typename TStackView> + void Cascade<TTracking, TProcessList, TStack, TStackView >::forceInteraction() + { + std::cout << "forced interaction!" << std::endl; + auto vParticle = fStack.GetNextParticle(); + TStackView secondaries(vParticle); + auto projectile = secondaries.GetProjectile(); + interaction(vParticle, projectile); + fProcessSequence.DoSecondaries(secondaries); + vParticle.Delete(); // todo: this should be reviewed, see below + } + + template <typename TTracking, typename TProcessList, typename TStack, typename TStackView> + void Cascade<TTracking, TProcessList, TStack, TStackView >::Step(Particle& vParticle) + { + using namespace corsika; + using namespace corsika::units::si; + + // determine geometric tracking + auto [step, geomMaxLength, nextVol] = fTracking.GetTrack(vParticle); + [[maybe_unused]] auto const& dummy_nextVol = nextVol; + + // determine combined total interaction length (inverse) + InverseGrammageType const total_inv_lambda = + fProcessSequence.GetTotalInverseInteractionLength(vParticle); + + // sample random exponential step length in grammage + corsika::ExponentialDistribution expDist(1 / total_inv_lambda); + GrammageType const next_interact = expDist(fRNG); + + std::cout << "total_inv_lambda=" << total_inv_lambda + << ", next_interact=" << next_interact << std::endl; + + auto const* currentLogicalNode = vParticle.GetNode(); + + // assert that particle stays outside void Universe if it has no + // model properties set + assert(currentLogicalNode != &*fEnvironment.GetUniverse() || + fEnvironment.GetUniverse()->HasModelProperties()); + + // convert next_step from grammage to length + LengthType const distance_interact = + currentLogicalNode->GetModelProperties().ArclengthFromGrammage(step, + next_interact); + + // determine the maximum geometric step length + LengthType const distance_max = fProcessSequence.MaxStepLength(vParticle, step); + std::cout << "distance_max=" << distance_max << std::endl; + + // determine combined total inverse decay time + InverseTimeType const total_inv_lifetime = + fProcessSequence.GetTotalInverseLifetime(vParticle); + + // sample random exponential decay time + corsika::ExponentialDistribution expDistDecay(1 / total_inv_lifetime); + TimeType const next_decay = expDistDecay(fRNG); + std::cout << "total_inv_lifetime=" << total_inv_lifetime + << ", next_decay=" << next_decay << std::endl; + + // convert next_decay from time to length [m] + LengthType const distance_decay = next_decay * vParticle.GetMomentum().norm() / + vParticle.GetEnergy() * units::constants::c; + + // take minimum of geometry, interaction, decay for next step + auto const min_distance = + std::min({distance_interact, distance_decay, distance_max, geomMaxLength}); + + std::cout << " move particle by : " << min_distance << std::endl; + + // here the particle is actually moved along the trajectory to new position: + // std::visit(setup::ParticleUpdate<particle_type>{vParticle}, step); + vParticle.SetPosition(step.PositionFromArclength(min_distance)); + // .... also update time, momentum, direction, ... + vParticle.SetTime(vParticle.GetTime() + min_distance / units::constants::c); + + step.LimitEndTo(min_distance); + + // apply all continuous processes on particle + track + process::EProcessReturn status = fProcessSequence.DoContinuous(vParticle, step); + + if (status == process::EProcessReturn::eParticleAbsorbed) { + std::cout << "Cascade: delete absorbed particle " << vParticle.GetPID() << " " + << vParticle.GetEnergy() / 1_GeV << "GeV" << std::endl; + vParticle.Delete(); + return; + } + + std::cout << "sth. happening before geometric limit ? " + << ((min_distance < geomMaxLength) ? "yes" : "no") << std::endl; + + if (min_distance < geomMaxLength) { // interaction to happen within geometric limit + + // check whether decay or interaction limits this step the + // outcome of decay or interaction MAY be a) new particles in + // secondaries, b) the projectile particle deleted (or + // changed) + + TStackView secondaries(vParticle); + + if (min_distance != distance_max) { + /* + Create SecondaryView object on Stack. The data container + remains untouched and identical, and 'projectil' is identical + to 'vParticle' above this line. However, + projectil.AddSecondaries populate the SecondaryView, which can + then be used afterwards for further processing. Thus: it is + important to use projectle (and not vParticle) for Interaction, + and Decay! + */ + + [[maybe_unused]] auto projectile = secondaries.GetProjectile(); + + if (min_distance == distance_interact) { + interaction(vParticle, projectile); + } else { + assert(min_distance == distance_decay); + decay(vParticle, projectile); + // make sure particle actually did decay if it should have done so + if (secondaries.GetSize() == 1 && + projectile.GetPID() == secondaries.GetNextParticle().GetPID()) + throw std::runtime_error("Cascade::Step: particle_type decays into itself!"); + } + + fProcessSequence.DoSecondaries(secondaries); + vParticle.Delete(); // todo: this should be reviewed. Where + // exactly are particles best deleted, and + // where they should NOT be + // deleted... maybe Delete function should + // be "protected" and not accessible to physics + + } else { // step-length limitation within volume + + std::cout << "step-length limitation" << std::endl; + fProcessSequence.DoSecondaries(secondaries); + } + + [[maybe_unused]] auto const assertion = [&] { + auto const* numericalNodeAfterStep = + fEnvironment.GetUniverse()->GetContainingNode(vParticle.GetPosition()); + return numericalNodeAfterStep == currentLogicalNode; + }; + + assert(assertion()); // numerical and logical nodes don't match + } else { // boundary crossing, step is limited by volume boundary + std::cout << "boundary crossing! next node = " << nextVol << std::endl; + vParticle.SetNode(nextVol); + // DoBoundary may delete the particle (or not) + fProcessSequence.DoBoundaryCrossing(vParticle, *currentLogicalNode, *nextVol); + } + } + + template <typename TTracking, typename TProcessList, typename TStack, typename TStackView> + auto Cascade<TTracking, TProcessList, TStack, TStackView >::decay(Particle& particle, + decltype(std::declval<TStackView>().GetProjectile()) projectile) + { + std::cout << "decay" << std::endl; + units::si::InverseTimeType const actual_decay_time = + fProcessSequence.GetTotalInverseLifetime(particle); + + random::UniformRealDistribution<units::si::InverseTimeType> uniDist( + actual_decay_time); + const auto sample_process = uniDist(fRNG); + units::si::InverseTimeType inv_decay_count = units::si::InverseTimeType::zero(); + return fProcessSequence.SelectDecay(particle, projectile, sample_process, + inv_decay_count); + } + + template <typename TTracking, typename TProcessList, typename TStack, typename TStackView> + auto Cascade<TTracking, TProcessList, TStack, TStackView >::interaction(particle_type& particle, + decltype(std::declval<TStackView>().GetProjectile()) projectile) + { + std::cout << "collide" << std::endl; + + units::si::InverseGrammageType const current_inv_length = + fProcessSequence.GetTotalInverseInteractionLength(particle); + + random::UniformRealDistribution<units::si::InverseGrammageType> uniDist( + current_inv_length); + const auto sample_process = uniDist(fRNG); + auto inv_lambda_count = units::si::InverseGrammageType::zero(); + return fProcessSequence.SelectInteraction(particle, projectile, sample_process, + inv_lambda_count); + } + + +} // namespace corsika + diff --git a/corsika/detail/framework/geometry/BaseVector.inl b/corsika/detail/framework/geometry/BaseVector.inl new file mode 100644 index 000000000..b1b7361ce --- /dev/null +++ b/corsika/detail/framework/geometry/BaseVector.inl @@ -0,0 +1,26 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/CoordinateSystem.hpp> +#include <corsika/framework/geometry/QuantityVector.hpp> + +namespace corsika { + + template <typename dim> + auto const& BaseVector<dim>::GetCoordinateSystem() const + { + return *cs; + } + + +} // namespace corsika + diff --git a/corsika/detail/framework/geometry/CoordinateSystem.inl b/corsika/detail/framework/geometry/CoordinateSystem.inl new file mode 100644 index 000000000..732f44e09 --- /dev/null +++ b/corsika/detail/framework/geometry/CoordinateSystem.inl @@ -0,0 +1,152 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/QuantityVector.hpp> +#include <Eigen/Dense> +#include <stdexcept> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/utility/sgn.hpp> + + +namespace corsika { + + + CoordinateSystem& CoordinateSystem::operator=(const corsika::CoordinateSystem& pCS) + { + reference = pCS.reference; + transf = pCS.transf; + return *this; + } + + inline CoordinateSystem CoordinateSystem::translate(QuantityVector<length_d> vector) const + { + EigenTransform const translation{EigenTranslation(vector.eVector)}; + + return CoordinateSystem(*this, translation); + } + + template <typename TDim> + auto CoordinateSystem::RotateToZ(Vector<TDim> vVec) const + { + auto const a = vVec.normalized().GetComponents(*this).eVector; + auto const a1 = a(0), a2 = a(1); + + auto const s = corsika::sgn(a(2)); + auto const c = 1 / (1 + s * a(2)); + + Eigen::Matrix3d A, B; + + if (s > 0) { + A << 1, 0, -a1, // comment to prevent clang-format + 0, 1, -a2, // . + a1, a2, 1; // . + B << -a1 * a1 * c, -a1 * a2 * c, 0, // . + -a1 * a2 * c, -a2 * a2 * c, 0, // . + 0, 0, -(a1 * a1 + a2 * a2) * c; // . + + } else { + A << 1, 0, a1, // . + 0, -1, -a2, // . + a1, a2, -1; // . + B << -a1 * a1 * c, -a1 * a2 * c, 0, // . + +a1 * a2 * c, +a2 * a2 * c, 0, // . + 0, 0, (a1 * a1 + a2 * a2) * c; // . + } + + return CoordinateSystem(*this, EigenTransform(A + B)); + } + + template <typename TDim> + auto CoordinateSystem::rotate(QuantityVector<TDim> axis, double angle) const + { + if (axis.eVector.isZero()) { + throw std::runtime_error("null-vector given as axis parameter"); + } + + EigenTransform const rotation{Eigen::AngleAxisd(angle, axis.eVector.normalized())}; + + return CoordinateSystem(*this, rotation); + } + + template <typename TDim> + auto CoordinateSystem::translateAndRotate(QuantityVector<phys::units::length_d> translation, QuantityVector<TDim> axis, double angle) + { + if (axis.eVector.isZero()) { + throw std::runtime_error("null-vector given as axis parameter"); + } + + EigenTransform const transf{Eigen::AngleAxisd(angle, axis.eVector.normalized()) * + EigenTranslation(translation.eVector)}; + + return CoordinateSystem(*this, transf); + } + + CoordinateSystem const* CoordinateSystem::GetReference() const + { + return reference; + } + + const EigenTransform& CoordinateSystem::GetTransform() const + { + return transf; + } + + /** + * returns the transformation matrix necessary to transform primitives with coordinates + * in \a pFrom to \a pTo, e.g. + * \f$ \vec{v}^{\text{(to)}} = \mathcal{M} \vec{v}^{\text{(from)}} \f$ + * (\f$ \vec{v}^{(.)} \f$ denotes the coordinates/components of the component in + * the indicated CoordinateSystem). + */ + inline EigenTransform getTransformation(CoordinateSystem const& pFrom, + CoordinateSystem const& pTo) { + CoordinateSystem const* a{&pFrom}; + CoordinateSystem const* b{&pTo}; + CoordinateSystem const* commonBase{nullptr}; + + while (a != b && b != nullptr) { + a = &pFrom; + + while (a != b && a != nullptr) { a = a->GetReference(); } + + if (a == b) break; + + b = b->GetReference(); + } + + if (a == b && a != nullptr) { + commonBase = a; + + } else { + throw std::runtime_error("no connection between coordinate systems found!"); + } + + EigenTransform t = EigenTransform::Identity(); + auto* p = &pFrom; + + while (p != commonBase) { + t = p->GetTransform() * t; + p = p->GetReference(); + } + + p = &pTo; + + while (p != commonBase) { + t = t * p->GetTransform().inverse(Eigen::TransformTraits::Isometry); + p = p->GetReference(); + } + + return t; + } + +} // namespace corsika + diff --git a/corsika/detail/framework/geometry/FourVector.inl b/corsika/detail/framework/geometry/FourVector.inl new file mode 100644 index 000000000..4d629b659 --- /dev/null +++ b/corsika/detail/framework/geometry/FourVector.inl @@ -0,0 +1,189 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <iostream> +#include <type_traits> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Vector.hpp> + + + +namespace corsika { + + + template <typename TimeType, typename SpaceVecType> + TimeType FourVector<TimeType, SpaceVecType>::GetTimeLikeComponent() const + { + return fTimeLike; + } + + template <typename TimeType, typename SpaceVecType> + SpaceVecType& FourVector<TimeType, SpaceVecType>::GetSpaceLikeComponents() + { + return fSpaceLike; + } + + + template <typename TimeType, typename SpaceVecType> + const SpaceVecType& FourVector<TimeType, SpaceVecType>::GetSpaceLikeComponents() const + { + return fSpaceLike; + } + + template <typename TimeType, typename SpaceVecType> + auto FourVector<TimeType, SpaceVecType>::GetNormSqr() const + { + return GetTimeSquared() - fSpaceLike.squaredNorm(); + } + + template <typename TimeType, typename SpaceVecType> + typename FourVector<TimeType, SpaceVecType>::SpaceType + FourVector<TimeType, SpaceVecType>::GetNorm() const + { + + return sqrt(abs(GetNormSqr())); + } + + template <typename TimeType, typename SpaceVecType> + bool FourVector<TimeType, SpaceVecType>::IsTimelike() const + { + return GetTimeSquared() < fSpaceLike.squaredNorm(); + } + + template <typename TimeType, typename SpaceVecType> + bool FourVector<TimeType, SpaceVecType>::IsSpacelike() const { + return GetTimeSquared() > fSpaceLike.squaredNorm(); + } + + template <typename TimeType, typename SpaceVecType> + FourVector<TimeType, SpaceVecType>& + FourVector<TimeType, SpaceVecType>::operator+=(const FourVector& b) + { + fTimeLike += b.fTimeLike; + fSpaceLike += b.fSpaceLike; + + return *this; + } + + template <typename TimeType, typename SpaceVecType> + FourVector<TimeType, SpaceVecType>& + FourVector<TimeType, SpaceVecType>::operator-=(const FourVector& b) + { + fTimeLike -= b.fTimeLike; + fSpaceLike -= b.fSpaceLike; + return *this; + } + + template <typename TimeType, typename SpaceVecType> + FourVector<TimeType, SpaceVecType>& + FourVector<TimeType, SpaceVecType>::operator*=(const double b) + { + fTimeLike *= b; + fSpaceLike *= b; + return *this; + } + + template <typename TimeType, typename SpaceVecType> + FourVector<TimeType, SpaceVecType>& + FourVector<TimeType, SpaceVecType>::operator/=(const double b) + { + fTimeLike /= b; + fSpaceLike.GetComponents() /= b; // TODO: WHY IS THIS?????? + return *this; + } + + template <typename TimeType, typename SpaceVecType> + FourVector<TimeType, SpaceVecType>& + FourVector<TimeType, SpaceVecType>::operator/(const double b) + { + *this /= b; + return *this; + } + + template <typename TimeType, typename SpaceVecType> + typename FourVector<TimeType, SpaceVecType>::SpaceType + FourVector<TimeType, SpaceVecType>::operator*(const FourVector& b) + { + if constexpr (std::is_same<typename std::decay<TimeType>::type, + decltype(std::declval<SpaceType>() / + corsika::units::si::meter * + corsika::units::si::second)>::value) + return fTimeLike * b.fTimeLike * + (corsika::units::constants::c * corsika::units::constants::c) - + fSpaceLike.norm(); + else + return fTimeLike * fTimeLike - fSpaceLike.norm(); + } + + template <typename TimeType, typename SpaceVecType> + auto FourVector<TimeType, SpaceVecType>::GetTimeSquared() const + { + if constexpr (std::is_same<typename std::decay<TimeType>::type, + decltype(std::declval<SpaceType>() / + corsika::units::si::meter * + corsika::units::si::second)>::value) + return fTimeLike * fTimeLike * + (corsika::units::constants::c * corsika::units::constants::c); + else + return fTimeLike * fTimeLike; + } + + /** + The math operator+ + */ + template <typename TimeType, typename SpaceVecType> + inline FourVector<typename std::decay<TimeType>::type, typename std::decay<SpaceVecType>::type> + operator+(const FourVector<TimeType, SpaceVecType>& a, const FourVector<TimeType, SpaceVecType>& b) + { + return FourVector<typename std::decay<TimeType>::type, + typename std::decay<SpaceVecType>::type>(a.fTimeLike + b.fTimeLike, a.fSpaceLike + b.fSpaceLike); + } + + /** + The math operator- + */ + template <typename TimeType, typename SpaceVecType> + inline FourVector<typename std::decay<TimeType>::type, + typename std::decay<SpaceVecType>::type> + operator-(const FourVector<TimeType, SpaceVecType>& a, const FourVector<TimeType, SpaceVecType>& b) + { + return FourVector<typename std::decay<TimeType>::type, + typename std::decay<SpaceVecType>::type>( + a.fTimeLike - b.fTimeLike, a.fSpaceLike - b.fSpaceLike); + } + + /** + The math operator* + */ + template <typename TimeType, typename SpaceVecType> + inline FourVector<typename std::decay<TimeType>::type, + typename std::decay<SpaceVecType>::type> + operator*(const FourVector<TimeType, SpaceVecType>& a, const double b) + { + return FourVector<typename std::decay<TimeType>::type, + typename std::decay<SpaceVecType>::type>(a.fTimeLike * b, + a.fSpaceLike * b); + } + + /** + The math operator/ + */ + template <typename TimeType, typename SpaceVecType> + inline FourVector<typename std::decay<TimeType>::type, + typename std::decay<SpaceVecType>::type> + operator/(const FourVector<TimeType, SpaceVecType>& a, const double b) { + return FourVector<typename std::decay<TimeType>::type, + typename std::decay<SpaceVecType>::type>(a.fTimeLike / b, + a.fSpaceLike / b); + } + +} // namespace corsika diff --git a/corsika/detail/framework/geometry/Helix.inl b/corsika/detail/framework/geometry/Helix.inl new file mode 100644 index 000000000..103aac982 --- /dev/null +++ b/corsika/detail/framework/geometry/Helix.inl @@ -0,0 +1,51 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/Point.hpp> +#include <cmath> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Vector.hpp> + +namespace corsika { + + + Point Helix::GetPosition(corsika::units::si::TimeType t) const + { + return r0 + vPar * t + + (vPerp * (cos(omegaC * t) - 1) + uPerp * sin(omegaC * t)) / omegaC; + } + + Point Helix::PositionFromArclength(corsika::units::si::LengthType l) const + { + return GetPosition(TimeFromArclength(l)); + } + + units::si::LengthType Helix::GetRadius() const + { + return radius; + } + + corsika::units::si::LengthType + Helix::ArcLength(corsika::units::si::TimeType t1, corsika::units::si::TimeType t2) const + { + return (vPar + vPerp).norm() * (t2 - t1); + } + + corsika::units::si::TimeType + Helix::TimeFromArclength(corsika::units::si::LengthType l) const + { + return l / (vPar + vPerp).norm(); + } + + +} // namespace corsika + diff --git a/corsika/detail/framework/geometry/Line.inl b/corsika/detail/framework/geometry/Line.inl new file mode 100644 index 000000000..5446bad4e --- /dev/null +++ b/corsika/detail/framework/geometry/Line.inl @@ -0,0 +1,54 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Vector.hpp> + +namespace corsika { + + + Point Line::GetPosition(units::si::TimeType t) const + { + return r0 + v0 * t; + } + + Point Line::PositionFromArclength(units::si::LengthType l) const + { + return r0 + v0.normalized() * l; + } + + units::si::LengthType + Line::ArcLength(units::si::TimeType t1, units::si::TimeType t2) const + { + return v0.norm() * (t2 - t1); + } + + units::si::TimeType + Line::TimeFromArclength( units::si::LengthType t) const + { + return t / v0.norm(); + } + + const Point& Line::GetR0() const + { + return r0; + } + + const Line::VelocityVec& Line::GetV0() const + { + return v0; + } + + +} // namespace corsika + diff --git a/corsika/detail/framework/geometry/Plane.inl b/corsika/detail/framework/geometry/Plane.inl new file mode 100644 index 000000000..f2170b48e --- /dev/null +++ b/corsika/detail/framework/geometry/Plane.inl @@ -0,0 +1,42 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Vector.hpp> + +namespace corsika { + + + bool Plane::IsAbove(Point const& vP) const + { + return fNormal.dot(vP - fCenter) > corsika::units::si::LengthType::zero(); + } + + units::si::LengthType Plane::DistanceTo(geometry::Point const& vP) const + { + return (fNormal * (vP - fCenter).dot(fNormal)).norm(); + } + + Point const& Plane::GetCenter() const + { + return fCenter; + } + + Plane::DimLessVec const& Plane::GetNormal() const + { + return fNormal; + } + + +} // namespace corsika + diff --git a/corsika/detail/framework/geometry/Point.inl b/corsika/detail/framework/geometry/Point.inl new file mode 100644 index 000000000..b2c01105b --- /dev/null +++ b/corsika/detail/framework/geometry/Point.inl @@ -0,0 +1,82 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/BaseVector.hpp> +#include <corsika/framework/geometry/QuantityVector.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Vector.hpp> + +namespace corsika { + + + // TODO: this should be private or protected, we don NOT want to expose numbers + // without reference to outside: + auto Point::GetCoordinates() const + { + return BaseVector<length_d>::qVector; + } + + auto Point::GetX() const + { + return BaseVector<length_d>::qVector.GetX(); + } + + auto Point::GetY() const + { + return BaseVector<length_d>::qVector.GetY(); + } + + auto Point::GetZ() const + { + return BaseVector<length_d>::qVector.GetZ(); + } + + /// this always returns a QuantityVector as triple + auto Point::GetCoordinates( CoordinateSystem const& pCS) const + { + if (&pCS == BaseVector<length_d>::cs) { + return BaseVector<length_d>::qVector; + } else { + return QuantityVector<length_d>( + getTransformation(*BaseVector<length_d>::cs, pCS) * + BaseVector<length_d>::qVector.eVector); + } + } + + /*! + * transforms the Point into another CoordinateSystem by changing its + * coordinates interally + */ + void Point::rebase(CoordinateSystem const& pCS) + { + BaseVector<length_d>::qVector = GetCoordinates(pCS); + BaseVector<length_d>::cs = &pCS; + } + + Point Point::operator+(Vector<length_d> const& pVec) const + { + return Point(*BaseVector<length_d>::cs, + GetCoordinates() + pVec.GetComponents(*BaseVector<length_d>::cs)); + } + + /*! + * returns the distance Vector between two points + */ + Vector<length_d> Point::operator-( Point const& pB) const + { + auto& cs = *BaseVector<length_d>::cs; + return Vector<length_d>(cs, GetCoordinates() - pB.GetCoordinates(cs)); + } + + +} // namespace corsika + diff --git a/corsika/detail/framework/geometry/QuantityVector.inl b/corsika/detail/framework/geometry/QuantityVector.inl new file mode 100644 index 000000000..9ac8513a9 --- /dev/null +++ b/corsika/detail/framework/geometry/QuantityVector.inl @@ -0,0 +1,152 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <Eigen/Dense> + +#include <iostream> +#include <utility> +#include <corsika/framework/core/PhysicalUnits.hpp> + +namespace corsika { + + template <typename dim> + inline auto QuantityVector<dim>::operator[](size_t index) const { + return Quantity(phys::units::detail::magnitude_tag, eVector[index]); + } + + template <typename dim> + inline auto QuantityVector<dim>::GetX() const + { + return (*this)[0]; + } + + template <typename dim> + inline auto QuantityVector<dim>::GetY() const + { + return (*this)[1]; + } + + template <typename dim> + inline auto QuantityVector<dim>::GetZ() const + { + return (*this)[2]; + } + + template <typename dim> + inline auto QuantityVector<dim>::norm() const + { + return Quantity(phys::units::detail::magnitude_tag, eVector.norm()); + } + + template <typename dim> + inline auto QuantityVector<dim>::squaredNorm() const + { + using QuantitySquared = + decltype(std::declval<Quantity>() * std::declval<Quantity>()); + return QuantitySquared(phys::units::detail::magnitude_tag, eVector.squaredNorm()); + } + + template <typename dim> + inline auto QuantityVector<dim>::operator+(QuantityVector<dim> const& pQVec) const + { + return QuantityVector<dim>(eVector + pQVec.eVector); + } + + template <typename dim> + inline auto QuantityVector<dim>::operator-(QuantityVector<dim> const& pQVec) const + { + return QuantityVector<dim>(eVector - pQVec.eVector); + } + + template <typename dim> + template <typename ScalarDim> + inline auto QuantityVector<dim>::operator*(phys::units::quantity<ScalarDim, double> const p) const + { + using ResQuantity = phys::units::detail::Product<ScalarDim, dim, double, double>; + + if constexpr (std::is_same<ResQuantity, double>::value) // result dimensionless, not + // a "Quantity" anymore + { + return QuantityVector<phys::units::dimensionless_d>(eVector * p.magnitude()); + } else { + return QuantityVector<typename ResQuantity::dimension_type>(eVector * + p.magnitude()); + } + } + + template <typename dim> + template <typename ScalarDim> + inline auto QuantityVector<dim>::operator/(phys::units::quantity<ScalarDim, double> const p) const + { + return (*this) * (1 / p); + } + + template <typename dim> + inline auto QuantityVector<dim>::operator*(double const p) const + { + return QuantityVector<dim>(eVector * p); + } + + template <typename dim> + inline auto QuantityVector<dim>::operator/(double const p) const + { + return QuantityVector<dim>(eVector / p); + } + + template <typename dim> + inline auto& QuantityVector<dim>::operator/=(double const p) { + eVector /= p; + return *this; + } + + template <typename dim> + inline auto& QuantityVector<dim>::operator*=(double const p) { + eVector *= p; + return *this; + } + + template <typename dim> + inline auto& QuantityVector<dim>::operator+=(QuantityVector<dim> const& pQVec) { + eVector += pQVec.eVector; + return *this; + } + + template <typename dim> + inline auto& QuantityVector<dim>::operator-=(QuantityVector<dim> const& pQVec) { + eVector -= pQVec.eVector; + return *this; + } + + template <typename dim> + inline auto& QuantityVector<dim>::operator-() const { + return QuantityVector<dim>(-eVector); + } + + template <typename dim> + inline auto QuantityVector<dim>::normalized() const { return QuantityVector<dim>(eVector.normalized()); } + + template <typename dim> + inline auto QuantityVector<dim>::operator==(QuantityVector<dim> const& p) const { return eVector == p.eVector; } + + + template <typename dim> + inline auto& operator<<(std::ostream& os, corsika::QuantityVector<dim> qv) { + using Quantity = phys::units::quantity<dim, double>; + + os << '(' << qv.eVector(0) << ' ' << qv.eVector(1) << ' ' << qv.eVector(2) << ") " + << phys::units::to_unit_symbol<dim, double>( + Quantity(phys::units::detail::magnitude_tag, 1)); + return os; + } + +} // namespace corsika + diff --git a/corsika/detail/framework/geometry/Sphere.inl b/corsika/detail/framework/geometry/Sphere.inl new file mode 100644 index 000000000..68e10467c --- /dev/null +++ b/corsika/detail/framework/geometry/Sphere.inl @@ -0,0 +1,36 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Volume.hpp> + +namespace corsika { + + //! returns true if the Point p is within the sphere + bool Sphere::Contains(Point const& p) const + { + return fRadius * fRadius > (fCenter - p).squaredNorm(); + } + + const Point& Sphere::GetCenter() const + { + return fCenter; + } + + units::si::LengthType Sphere::GetRadius() const + { + return fRadius; + } + +} // namespace corsika + diff --git a/corsika/detail/framework/geometry/Trajectory.inl b/corsika/detail/framework/geometry/Trajectory.inl new file mode 100644 index 000000000..8a34d758d --- /dev/null +++ b/corsika/detail/framework/geometry/Trajectory.inl @@ -0,0 +1,61 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +namespace corsika { + + template <typename T> + Point Trajectory<T>::GetPosition(double u) const + { + return T::GetPosition(fTimeLength * u); + } + + template <typename T> + corsika::units::si::TimeType Trajectory<T>::GetDuration() const + { + return fTimeLength; + } + + template <typename T> + corsika::units::si::LengthType Trajectory<T>::GetLength() const + { + return GetDistance(fTimeLength); + } + + template <typename T> + corsika::units::si::LengthType Trajectory<T>::GetDistance(corsika::units::si::TimeType t) const + { + assert(t <= fTimeLength); + assert(t >= 0 * corsika::units::si::second); + return T::ArcLength(0 * corsika::units::si::second, t); + } + + template <typename T> + void Trajectory<T>::LimitEndTo(corsika::units::si::LengthType limit) + { + fTimeLength = T::TimeFromArclength(limit); + } + + template <typename T> + auto Trajectory<T>::NormalizedDirection() const + { + static_assert(std::is_same_v<T, corsika::Line>); + return T::GetV0().normalized(); + } + + +} // namespace corsika + + diff --git a/corsika/detail/framework/geometry/Vector.inl b/corsika/detail/framework/geometry/Vector.inl new file mode 100644 index 000000000..419bce298 --- /dev/null +++ b/corsika/detail/framework/geometry/Vector.inl @@ -0,0 +1,195 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/BaseVector.hpp> +#include <corsika/framework/geometry/QuantityVector.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + + +namespace corsika { + + + template <typename dim> + auto Vector<dim>::GetComponents() const + { + return BaseVector<dim>::qVector; + } + + + template <typename dim> + auto Vector<dim>::GetComponents(CoordinateSystem const& pCS) const + { + if (&pCS == BaseVector<dim>::cs) { + return BaseVector<dim>::qVector; + } else { + return QuantityVector<dim>( + getTransformation(*BaseVector<dim>::cs, pCS).linear() * + BaseVector<dim>::qVector.eVector); + } + } + + template <typename dim> + void Vector<dim>::rebase(CoordinateSystem const& pCS) + { + BaseVector<dim>::qVector = GetComponents(pCS); + BaseVector<dim>::cs = &pCS; + } + + template <typename dim> + auto Vector<dim>::norm() const + { + return BaseVector<dim>::qVector.norm(); + } + + template <typename dim> + auto Vector<dim>::GetNorm() const + { + return BaseVector<dim>::qVector.norm(); + } + + template <typename dim> + auto Vector<dim>::squaredNorm() const + { + return BaseVector<dim>::qVector.squaredNorm(); + } + + template <typename dim> + auto Vector<dim>::GetSquaredNorm() const + { + return BaseVector<dim>::qVector.squaredNorm(); + } + + template <typename dim> + template <typename dim2> + auto Vector<dim>::parallelProjectionOnto(Vector<dim2> const& pVec, + CoordinateSystem const& pCS) const + { + auto const ourCompVec = GetComponents(pCS); + auto const otherCompVec = pVec.GetComponents(pCS); + auto const& a = ourCompVec.eVector; + auto const& b = otherCompVec.eVector; + + return Vector<dim>(pCS, QuantityVector<dim>(b * ((a.dot(b)) / b.squaredNorm()))); + } + + template <typename dim> + template <typename dim2> + auto Vector<dim>::parallelProjectionOnto(Vector<dim2> const& pVec) const + { + return parallelProjectionOnto<dim2>(pVec, *BaseVector<dim>::cs); + } + + template <typename dim> + auto Vector<dim>::operator+(Vector<dim> const& pVec) const + { + auto const components = + GetComponents(*BaseVector<dim>::cs) + pVec.GetComponents(*BaseVector<dim>::cs); + return Vector<dim>(*BaseVector<dim>::cs, components); + } + + template <typename dim> + auto Vector<dim>::operator-(Vector<dim> const& pVec) const + { + auto const components = GetComponents() - pVec.GetComponents(*BaseVector<dim>::cs); + return Vector<dim>(*BaseVector<dim>::cs, components); + } + + template <typename dim> + auto& Vector<dim>::operator*=(double const p) + { + BaseVector<dim>::qVector *= p; + return *this; + } + + template <typename dim> + template <typename ScalarDim> + auto Vector<dim>::operator*(phys::units::quantity<ScalarDim, double> const p) const + { + using ProdDim = phys::units::detail::product_d<dim, ScalarDim>; + + return Vector<ProdDim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p); + } + + template <typename dim> + template <typename ScalarDim> + auto Vector<dim>::operator/(phys::units::quantity<ScalarDim, double> const p) const + { + return (*this) * (1 / p); + } + + template <typename dim> + auto Vector<dim>::operator*(double const p) const + { + return Vector<dim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector * p); + } + + template <typename dim> + auto Vector<dim>::operator/(double const p) const + { + return Vector<dim>(*BaseVector<dim>::cs, BaseVector<dim>::qVector / p); + } + + template <typename dim> + auto& Vector<dim>::operator+=(Vector<dim> const& pVec) + { + BaseVector<dim>::qVector += pVec.GetComponents(*BaseVector<dim>::cs); + return *this; + } + + template <typename dim> + auto& Vector<dim>::operator-=(Vector<dim> const& pVec) + { + BaseVector<dim>::qVector -= pVec.GetComponents(*BaseVector<dim>::cs); + return *this; + } + + template <typename dim> + auto& Vector<dim>::operator-() const + { + return Vector<dim>(*BaseVector<dim>::cs, -BaseVector<dim>::qVector); + } + + template <typename dim> + auto Vector<dim>::normalized() const + { + return (*this) * (1 / norm()); + } + + template <typename dim> + template <typename dim2> + auto Vector<dim>::cross(Vector<dim2> pV) const + { + auto const c1 = GetComponents().eVector; + auto const c2 = pV.GetComponents(*BaseVector<dim>::cs).eVector; + auto const bareResult = c1.cross(c2); + + using ProdDim = phys::units::detail::product_d<dim, dim2>; + return Vector<ProdDim>(*BaseVector<dim>::cs, bareResult); + } + + template <typename dim> + template <typename dim2> + auto Vector<dim>::dot(Vector<dim2> pV) const + { + auto const c1 = GetComponents().eVector; + auto const c2 = pV.GetComponents(*BaseVector<dim>::cs).eVector; + auto const bareResult = c1.dot(c2); + + using ProdDim = phys::units::detail::product_d<dim, dim2>; + + return phys::units::quantity<ProdDim, double>(phys::units::detail::magnitude_tag, + bareResult); + } + + +} // namespace corsika + diff --git a/corsika/detail/framework/random/RNGManager.inl b/corsika/detail/framework/random/RNGManager.inl new file mode 100644 index 000000000..8bc88135b --- /dev/null +++ b/corsika/detail/framework/random/RNGManager.inl @@ -0,0 +1,59 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + + +namespace corsika { + + void RNGManager::RegisterRandomStream(std::string const& pStreamName) + { + RNG rng; + + if (auto const& it = seeds.find(pStreamName); it != seeds.end()) { + rng.seed(it->second); + } + + rngs[pStreamName] = std::move(rng); + } + + RNG& RNGManager::GetRandomStream + ( + std::string const& pStreamName) { + return rngs.at(pStreamName); + } + + std::stringstream RNGManager::dumpState() const + { + std::stringstream buffer; + for (auto const& [streamName, rng] : rngs) { + buffer << '"' << streamName << "\" = \"" << rng << '"' << std::endl; + } + + return buffer; + } + + void RNGManager::SeedAll(uint64_t vSeed) + { + for (auto& entry : rngs) { entry.second.seed(vSeed++); } + } + + void RNGManager::SeedAll() + { + std::random_device rd; + + for (auto& entry : rngs) { + std::seed_seq sseq{rd(), rd(), rd(), rd(), rd(), rd()}; + entry.second.seed(sseq); + } + } + +} // namespace corsika + diff --git a/corsika/detail/framework/sequence/ProcessSequence.inl b/corsika/detail/framework/sequence/ProcessSequence.inl new file mode 100644 index 000000000..60295fd8b --- /dev/null +++ b/corsika/detail/framework/sequence/ProcessSequence.inl @@ -0,0 +1,258 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/sequence/BaseProcess.hpp> +#include <corsika/framework/sequence/BoundaryCrossingProcess.hpp> +#include <corsika/framework/sequence/DecayProcess.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/framework/sequence/StackProcess.hpp> +#include <cmath> +#include <limits> +#include <type_traits> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/sequence/ContinuousProcess.hpp> +#include <corsika/framework/sequence/ProcessReturn.hpp> +#include <corsika/framework/sequence/SecondariesProcess.hpp> + +namespace corsika { + + + + template <typename T1, typename T2> + template <typename Particle, typename VTNType> + EProcessReturn ProcessSequence<T1, T2>::DoBoundaryCrossing(Particle& p, VTNType const& from, + VTNType const& to) { + EProcessReturn ret = EProcessReturn::eOk; + + if constexpr (std::is_base_of<BoundaryCrossingProcess<T1type>, T1type>::value || + t1ProcSeq) { + ret |= A.DoBoundaryCrossing(p, from, to); + } + + if constexpr (std::is_base_of<BoundaryCrossingProcess<T2type>, T2type>::value || + t2ProcSeq) { + ret |= B.DoBoundaryCrossing(p, from, to); + } + + return ret; + } + + template <typename T1, typename T2> + template <typename TParticle, typename TTrack> + EProcessReturn ProcessSequence<T1, T2>::DoContinuous(TParticle& vP, TTrack& vT) { + EProcessReturn ret = EProcessReturn::eOk; + if constexpr (std::is_base_of<ContinuousProcess<T1type>, T1type>::value || t1ProcSeq) { + + ret |= A.DoContinuous(vP, vT); + } + if constexpr (std::is_base_of<ContinuousProcess<T2type>, T2type>::value || t2ProcSeq) { + ret |= B.DoContinuous(vP, vT); + } + return ret; + } + + template <typename T1, typename T2> + template <typename TSecondaries> + EProcessReturn ProcessSequence<T1, T2>::DoSecondaries(TSecondaries& vS) { + EProcessReturn ret = EProcessReturn::eOk; + if constexpr (std::is_base_of<SecondariesProcess<T1type>, T1type>::value || t1ProcSeq) { + ret |= A.DoSecondaries(vS); + } + if constexpr (std::is_base_of<SecondariesProcess<T2type>, T2type>::value || t2ProcSeq) { + ret |= B.DoSecondaries(vS); + } + return ret; + } + + template <typename T1, typename T2> + bool ProcessSequence<T1, T2>::CheckStep() { + bool ret = false; + if constexpr (std::is_base_of<StackProcess<T1type>, T1type>::value || t1ProcSeq) { + ret |= A.CheckStep(); + } + if constexpr (std::is_base_of<StackProcess<T2type>, T2type>::value || t2ProcSeq) { + ret |= B.CheckStep(); + } + return ret; + } + + template <typename T1, typename T2> + template <typename TStack> + EProcessReturn ProcessSequence<T1, T2>::DoStack(TStack& vS) { + EProcessReturn ret = EProcessReturn::eOk; + if constexpr (std::is_base_of<StackProcess<T1type>, T1type>::value || t1ProcSeq) { + if (A.CheckStep()) { ret |= A.DoStack(vS); } + } + if constexpr (std::is_base_of<StackProcess<T2type>, T2type>::value || t2ProcSeq) { + if (B.CheckStep()) { ret |= B.DoStack(vS); } + } + return ret; + } + + template <typename T1, typename T2> + template <typename TParticle, typename TTrack> + corsika::units::si::LengthType ProcessSequence<T1, T2>::MaxStepLength(TParticle& vP, TTrack& vTrack) { + corsika::units::si::LengthType + max_length = // if no other process in the sequence implements it + std::numeric_limits<double>::infinity() * corsika::units::si::meter; + + if constexpr (std::is_base_of<ContinuousProcess<T1type>, T1type>::value || t1ProcSeq) { + corsika::units::si::LengthType const len = A.MaxStepLength(vP, vTrack); + max_length = std::min(max_length, len); + } + if constexpr (std::is_base_of<ContinuousProcess<T2type>, T2type>::value || t2ProcSeq) { + corsika::units::si::LengthType const len = B.MaxStepLength(vP, vTrack); + max_length = std::min(max_length, len); + } + return max_length; + } + + template <typename T1, typename T2> + template <typename TParticle> + corsika::units::si::GrammageType ProcessSequence<T1, T2>::GetTotalInteractionLength(TParticle& vP) { + return 1. / GetInverseInteractionLength(vP); + } + + template <typename T1, typename T2> + template <typename TParticle> + corsika::units::si::InverseGrammageType ProcessSequence<T1, T2>::GetTotalInverseInteractionLength( + TParticle& vP) { + return GetInverseInteractionLength(vP); + } + + template <typename T1, typename T2> + template <typename TParticle> + corsika::units::si::InverseGrammageType ProcessSequence<T1, T2>::GetInverseInteractionLength(TParticle& vP) { + corsika::units::si::InverseGrammageType tot = 0 * corsika::units::si::meter * corsika::units::si::meter / corsika::units::si::gram; + + if constexpr (std::is_base_of<InteractionProcess<T1type>, T1type>::value || t1ProcSeq || + t1SwitchProc) { + tot += A.GetInverseInteractionLength(vP); + } + if constexpr (std::is_base_of<InteractionProcess<T2type>, T2type>::value || t2ProcSeq || + t2SwitchProc) { + tot += B.GetInverseInteractionLength(vP); + } + return tot; + } + + template <typename T1, typename T2> + template <typename TParticle, typename TSecondaries> + EProcessReturn ProcessSequence<T1, T2>::SelectInteraction( + TParticle& vP, TSecondaries& vS, + [[maybe_unused]] corsika::units::si::InverseGrammageType lambda_select, + corsika::units::si::InverseGrammageType& lambda_inv_count) + { + + if constexpr (t1ProcSeq || t1SwitchProc) { + // if A is a process sequence --> check inside + const EProcessReturn ret = + A.SelectInteraction(vP, vS, lambda_select, lambda_inv_count); + // if A did succeed, stop routine + if (ret != EProcessReturn::eOk) { return ret; } + } else if constexpr (std::is_base_of<InteractionProcess<T1type>, T1type>::value ) { + // if this is not a ContinuousProcess --> evaluate probability + lambda_inv_count += A.GetInverseInteractionLength(vP); + // check if we should execute THIS process and then EXIT + if (lambda_select < lambda_inv_count) { + A.DoInteraction(vS); + return EProcessReturn::eInteracted; + } + } // end branch A + + if constexpr (t2ProcSeq || t2SwitchProc) { + // if A is a process sequence --> check inside + const EProcessReturn ret = + B.SelectInteraction(vP, vS, lambda_select, lambda_inv_count); + // if A did succeed, stop routine + if (ret != EProcessReturn::eOk) { return ret; } + } else if constexpr (std::is_base_of<InteractionProcess<T2type>, T2type>::value) { + // if this is not a ContinuousProcess --> evaluate probability + lambda_inv_count += B.GetInverseInteractionLength(vP); + // check if we should execute THIS process and then EXIT + if (lambda_select < lambda_inv_count) { + B.DoInteraction(vS); + return EProcessReturn::eInteracted; + } + } // end branch A + return EProcessReturn::eOk; + } + + template <typename T1, typename T2> + template <typename TParticle> + corsika::units::si::TimeType ProcessSequence<T1, T2>::GetTotalLifetime(TParticle& p) { + return 1. / GetInverseLifetime(p); + } + + template <typename T1, typename T2> + template <typename TParticle> + corsika::units::si::InverseTimeType ProcessSequence<T1, T2>::GetTotalInverseLifetime(TParticle& p) { + return GetInverseLifetime(p); + } + + template <typename T1, typename T2> + template <typename TParticle> + corsika::units::si::InverseTimeType ProcessSequence<T1, T2>::GetInverseLifetime(TParticle& p) { + corsika::units::si::InverseTimeType tot = 0 / corsika::units::si::second; + + if constexpr (std::is_base_of<DecayProcess<T1type>, T1type>::value || t1ProcSeq) { + tot += A.GetInverseLifetime(p); + } + if constexpr (std::is_base_of<DecayProcess<T2type>, T2type>::value || t2ProcSeq) { + tot += B.GetInverseLifetime(p); + } + return tot; + } + + + template <typename T1, typename T2> + template <typename TParticle, typename TSecondaries> + EProcessReturn ProcessSequence<T1, T2>::SelectDecay( + TParticle& vP, TSecondaries& vS, + [[maybe_unused]] corsika::units::si::InverseTimeType decay_select, + corsika::units::si::InverseTimeType& decay_inv_count) { + if constexpr (t1ProcSeq) { + // if A is a process sequence --> check inside + const EProcessReturn ret = A.SelectDecay(vP, vS, decay_select, decay_inv_count); + // if A did succeed, stop routine + if (ret != EProcessReturn::eOk) { return ret; } + } else if constexpr (std::is_base_of<DecayProcess<T1type>, T1type>::value) { + // if this is not a ContinuousProcess --> evaluate probability + decay_inv_count += A.GetInverseLifetime(vP); + // check if we should execute THIS process and then EXIT + if (decay_select < decay_inv_count) { // more pedagogical: rndm_select < + // decay_inv_count / decay_inv_tot + A.DoDecay(vS); + return EProcessReturn::eDecayed; + } + } // end branch A + + if constexpr (t2ProcSeq) { + // if A is a process sequence --> check inside + const EProcessReturn ret = B.SelectDecay(vP, vS, decay_select, decay_inv_count); + // if A did succeed, stop routine + if (ret != EProcessReturn::eOk) { return ret; } + } else if constexpr (std::is_base_of<DecayProcess<T2type>, T2type>::value) { + // if this is not a ContinuousProcess --> evaluate probability + decay_inv_count += B.GetInverseLifetime(vP); + // check if we should execute THIS process and then EXIT + if (decay_select < decay_inv_count) { + B.DoDecay(vS); + return EProcessReturn::eDecayed; + } + } // end branch B + return EProcessReturn::eOk; + } + + +} // namespace corsika + diff --git a/corsika/detail/framework/stack/CombinedStack.inl b/corsika/detail/framework/stack/CombinedStack.inl new file mode 100644 index 000000000..48ff64e71 --- /dev/null +++ b/corsika/detail/framework/stack/CombinedStack.inl @@ -0,0 +1,119 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + + +namespace corsika { + + template <template <typename> typename ParticleInterfaceA, + template <typename> typename ParticleInterfaceB, typename StackIterator> + template <typename... Args1> + void CombinedParticleInterface<ParticleInterfaceA, ParticleInterfaceB, + StackIterator>::SetParticleData(const std::tuple<Args1...> vA) { + PI_A::SetParticleData(vA); + PI_B::SetParticleData(); + } + + template <template <typename> typename ParticleInterfaceA, + template <typename> typename ParticleInterfaceB, typename StackIterator> + template <typename... Args1, typename... Args2> + void CombinedParticleInterface<ParticleInterfaceA, ParticleInterfaceB, + StackIterator>::SetParticleData(const std::tuple<Args1...> vA, const std::tuple<Args2...> vB) { + PI_A::SetParticleData(vA); + PI_B::SetParticleData(vB); + } + + template <template <typename> typename ParticleInterfaceA, + template <typename> typename ParticleInterfaceB, typename StackIterator> + template <typename... Args1> + void CombinedParticleInterface<ParticleInterfaceA, ParticleInterfaceB, + StackIterator>::SetParticleData(PI_C& p, const std::tuple<Args1...> vA) { + // static_assert(MT<I>::has_not, "error"); + PI_A::SetParticleData(static_cast<PI_A&>(p), vA); // original stack + PI_B::SetParticleData(static_cast<PI_B&>(p)); // addon stack + } + + template <template <typename> typename ParticleInterfaceA, + template <typename> typename ParticleInterfaceB, typename StackIterator> + template <typename... Args1, typename... Args2> + void CombinedParticleInterface<ParticleInterfaceA, ParticleInterfaceB, + StackIterator>::SetParticleData(PI_C& p, const std::tuple<Args1...> vA, + const std::tuple<Args2...> vB) { + PI_A::SetParticleData(static_cast<PI_A&>(p), vA); + PI_B::SetParticleData(static_cast<PI_B&>(p), vB); + } + + +namespace detail { + + template <typename Stack1Impl, typename Stack2Impl> + class CombinedStackImpl : public Stack1Impl, public Stack2Impl { + + public: + void Init() { + Stack1Impl::Init(); + Stack2Impl::Init(); + } + + void Clear() { + Stack1Impl::Clear(); + Stack2Impl::Clear(); + } + + unsigned int GetSize() const { return Stack1Impl::GetSize(); } + unsigned int GetCapacity() const { return Stack1Impl::GetCapacity(); } + + /** + * Function to copy particle at location i1 in stack to i2 + */ + void Copy(const unsigned int i1, const unsigned int i2) { + if (i1 >= GetSize() || i2 >= GetSize()) { + std::ostringstream err; + err << "CombinedStack: trying to access data beyond size of stack!"; + throw std::runtime_error(err.str()); + } + Stack1Impl::Copy(i1, i2); + Stack2Impl::Copy(i1, i2); + } + + /** + * Function to copy particle at location i2 in stack to i1 + */ + void Swap(const unsigned int i1, const unsigned int i2) { + if (i1 >= GetSize() || i2 >= GetSize()) { + std::ostringstream err; + err << "CombinedStack: trying to access data beyond size of stack!"; + throw std::runtime_error(err.str()); + } + Stack1Impl::Swap(i1, i2); + Stack2Impl::Swap(i1, i2); + } + + void IncrementSize() { + Stack1Impl::IncrementSize(); + Stack2Impl::IncrementSize(); + } + + void DecrementSize() { + Stack1Impl::DecrementSize(); + Stack2Impl::DecrementSize(); + } + + }; // end class CombinedStackImpl + +} // namespace detail + + +} // namespace corsika + diff --git a/corsika/detail/framework/stack/SecondaryView.inl b/corsika/detail/framework/stack/SecondaryView.inl new file mode 100644 index 000000000..13fa27de4 --- /dev/null +++ b/corsika/detail/framework/stack/SecondaryView.inl @@ -0,0 +1,80 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <stdexcept> +#include <vector> +#include <corsika/framework/stack/Stack.hpp> + +namespace corsika { + + + + // template <typename StackDataType, template <typename> typename ParticleInterface> + // SecondaryView<StackDataType, ParticleInterface>: + + + + template <typename StackDataType, template <typename> typename ParticleInterface> + template <typename... Args> + auto SecondaryView<StackDataType, ParticleInterface>::AddSecondary(const Args... v) { + StackIterator proj = GetProjectile(); + return AddSecondary(proj, v...); + } + + template <typename StackDataType, template <typename> typename ParticleInterface> + template <typename... Args> + auto SecondaryView<StackDataType, ParticleInterface>::AddSecondary(StackIterator& proj, const Args... v) { + // make space on stack + InnerStackType::GetStackData().IncrementSize(); + // get current number of secondaries on stack + const unsigned int idSec = GetSize(); + // determine index on (inner) stack where new particle will be located + const unsigned int index = InnerStackType::GetStackData().GetSize() - 1; + fIndices.push_back(index); + // NOTE: "+1" is since "0" is special marker here for PROJECTILE, see + // GetIndexFromIterator + return StackIterator(*this, idSec + 1, proj, v...); + } + + + + template <typename StackDataType, template <typename> typename ParticleInterface> + void SecondaryView<StackDataType, ParticleInterface>::Delete(StackIterator p) { + if (IsEmpty()) { /* error */ + throw std::runtime_error("Stack, cannot delete entry since size is zero"); + } + const int innerSize = InnerStackType::GetSize(); + const int innerIndex = GetIndexFromIterator(p.GetIndex()); + if (innerIndex < innerSize - 1) + InnerStackType::GetStackData().Copy(innerSize - 1, + GetIndexFromIterator(p.GetIndex())); + DeleteLast(); + } + + template <typename StackDataType, template <typename> typename ParticleInterface> + void SecondaryView<StackDataType, ParticleInterface>::Delete(ParticleInterfaceType p) { Delete(p.GetIterator()); } + + template <typename StackDataType, template <typename> typename ParticleInterface> + void SecondaryView<StackDataType, ParticleInterface>::DeleteLast() { + fIndices.pop_back(); + InnerStackType::GetStackData().DecrementSize(); + } + + template <typename StackDataType, template <typename> typename ParticleInterface> + unsigned int SecondaryView<StackDataType, ParticleInterface>::GetIndexFromIterator(const unsigned int vI) const { + if (vI == 0) return fProjectileIndex; + return fIndices[vI - 1]; + } + + +} // namespace corsika + diff --git a/corsika/detail/framework/utility/COMBoost.inl b/corsika/detail/framework/utility/COMBoost.inl new file mode 100644 index 000000000..da63c03fe --- /dev/null +++ b/corsika/detail/framework/utility/COMBoost.inl @@ -0,0 +1,126 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/CoordinateSystem.hpp> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/utility/sgn.hpp> +#include <Eigen/Dense> +#include <corsika/framework/core/PhysicalUnits.hpp> + +namespace corsika { + + auto const& COMBoost::GetRotationMatrix() const { return fRotation; } + + //! transforms a 4-momentum from lab frame to the center-of-mass frame + template <typename FourVector> + FourVector COMBoost::toCoM(const FourVector& p) const { + using namespace corsika::units::si; + auto pComponents = p.GetSpaceLikeComponents().GetComponents(fCS); + Eigen::Vector3d eVecRotated = fRotation * pComponents.eVector; + Eigen::Vector2d lab; + + lab << (p.GetTimeLikeComponent() * (1 / 1_GeV)), + (eVecRotated(2) * (1 / 1_GeV).magnitude()); + + auto const boostedZ = fBoost * lab; + auto const E_CoM = boostedZ(0) * 1_GeV; + + eVecRotated(2) = boostedZ(1) * (1_GeV).magnitude(); + + return FourVector(E_CoM, + corsika::Vector<corsika::units::si::hepmomentum_d>(fCS, eVecRotated)); + } + + //! transforms a 4-momentum from the center-of-mass frame back to lab frame + template <typename FourVector> + FourVector COMBoost::fromCoM(const FourVector& p) const { + using namespace corsika::units::si; + Eigen::Vector2d com; + com << (p.GetTimeLikeComponent() * (1 / 1_GeV)), + (p.GetSpaceLikeComponents().GetComponents().eVector(2) * + (1 / 1_GeV).magnitude()); + + auto const plab = p.GetSpaceLikeComponents().GetComponents(); + std::cout << "COMBoost::fromCoM Ecm=" << p.GetTimeLikeComponent() / 1_GeV + << " GeV, " + << " pcm = " << plab / 1_GeV << " (norm = " << plab.norm() / 1_GeV + << " GeV), invariant mass = " << p.GetNorm() / 1_GeV << " GeV" + << std::endl; + + auto const boostedZ = fInverseBoost * com; + auto const E_lab = boostedZ(0) * 1_GeV; + + auto pLab = p.GetSpaceLikeComponents().GetComponents(); + pLab.eVector(2) = boostedZ(1) * (1_GeV).magnitude(); + pLab.eVector = fRotation.transpose() * pLab.eVector; + + FourVector f(E_lab, corsika::Vector(fCS, pLab)); + + std::cout << "COMBoost::fromCoM --> Elab=" << E_lab / 1_GeV << "GeV, " + << " pcm = " << pLab / 1_GeV << " (norm =" << pLab.norm() / 1_GeV + << " GeV), invariant mass = " << f.GetNorm() / 1_GeV << " GeV" + << std::endl; + + return f; + } + + COMBoost::COMBoost(FourVector<corsika::units::si::HEPEnergyType, Vector<corsika::units::si::hepmomentum_d>> const& Pprojectile, + const corsika::units::si::HEPMassType massTarget) + : fCS(Pprojectile.GetSpaceLikeComponents().GetCoordinateSystem()) { + auto const pProjectile = Pprojectile.GetSpaceLikeComponents(); + auto const pProjNorm = pProjectile.norm(); + auto const a = (pProjectile / pProjNorm).GetComponents().eVector; + auto const a1 = a(0), a2 = a(1); + + auto const s = sgn(a(2)); + auto const c = 1 / (1 + s * a(2)); + + Eigen::Matrix3d A, B; + + if (s > 0) { + A << 1, 0, -a1, // comment to prevent clang-format + 0, 1, -a2, // . + a1, a2, 1; // . + B << -a1 * a1 * c, -a1 * a2 * c, 0, // . + -a1 * a2 * c, -a2 * a2 * c, 0, // . + 0, 0, -(a1 * a1 + a2 * a2) * c; // . + + } else { + A << 1, 0, a1, // comment to prevent clang-format + 0, -1, -a2, // . + a1, a2, -1; // . + B << -a1 * a1 * c, -a1 * a2 * c, 0, // . + +a1 * a2 * c, +a2 * a2 * c, 0, // . + 0, 0, (a1 * a1 + a2 * a2) * c; // . + } + + fRotation = A + B; + + // calculate boost + double const beta = pProjNorm / (Pprojectile.GetTimeLikeComponent() + massTarget); + + /* Accurracy matters here, beta = 1 - epsilon for ultra-relativistic boosts */ + double const coshEta = 1 / std::sqrt((1 + beta) * (1 - beta)); + //~ double const coshEta = 1 / std::sqrt((1-beta*beta)); + double const sinhEta = -beta * coshEta; + + std::cout << "COMBoost (1-beta)=" << 1 - beta << " gamma=" << coshEta << std::endl; + std::cout << " det = " << fRotation.determinant() - 1 << std::endl; + + fBoost << coshEta, sinhEta, sinhEta, coshEta; + + fInverseBoost << coshEta, -sinhEta, -sinhEta, coshEta; + } +} // namespace corsika diff --git a/corsika/detail/framework/utility/CorsikaFenvFallback.inl b/corsika/detail/framework/utility/CorsikaFenvFallback.inl new file mode 100644 index 000000000..4fb6e1c65 --- /dev/null +++ b/corsika/detail/framework/utility/CorsikaFenvFallback.inl @@ -0,0 +1,20 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/framework/utility/CorsikaFenv.hpp> +#include <cfenv> + +extern "C" { +#warning No enabling/disabling of floating point exceptions - platform needs better implementation + +int feenableexcept(int excepts) { return -1; } + +int fedisableexcept(int excepts) { return -1; } +} diff --git a/Framework/Utilities/CorsikaFenvOSX.cc b/corsika/detail/framework/utility/CorsikaFenvOSX.inl similarity index 96% rename from Framework/Utilities/CorsikaFenvOSX.cc rename to corsika/detail/framework/utility/CorsikaFenvOSX.inl index 1028c4b7e..490dfec65 100644 --- a/Framework/Utilities/CorsikaFenvOSX.cc +++ b/corsika/detail/framework/utility/CorsikaFenvOSX.inl @@ -10,7 +10,7 @@ * */ -#include <corsika/utl/CorsikaFenv.h> +#include <corsika/framework/utility/CorsikaFenv.hpp> #include <cfenv> // Implementation for OS X on intel X64_86 diff --git a/corsika/detail/media/BaseExponential.inl b/corsika/detail/media/BaseExponential.inl new file mode 100644 index 000000000..c4c51cb77 --- /dev/null +++ b/corsika/detail/media/BaseExponential.inl @@ -0,0 +1,63 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/BaseExponential.hpp> + +namespace corsika { + + + template <class TDerived> + auto const& BaseExponential<TDerived>::GetImplementation() const +{ return *static_cast<TDerived const*>(this); } + + template <class TDerived> + units::si::GrammageType BaseExponential<TDerived>::IntegratedGrammage( + Trajectory<Line> const& vLine, + units::si::LengthType vL, + Vector<units::si::dimensionless_d> const& vAxis) const { + if (vL == units::si::LengthType::zero()) { return units::si::GrammageType::zero(); } + + auto const uDotA = vLine.NormalizedDirection().dot(vAxis).magnitude(); + auto const rhoStart = GetImplementation().GetMassDensity(vLine.GetR0()); + + if (uDotA == 0) { + return vL * rhoStart; + } else { + return rhoStart * (fLambda / uDotA) * (exp(uDotA * vL * fInvLambda) - 1); + } + } + + template <class TDerived> + units::si::LengthType BaseExponential<TDerived>::ArclengthFromGrammage( + Trajectory<Line> const& vLine, + units::si::GrammageType vGrammage, + Vector<units::si::dimensionless_d> const& vAxis) const { + auto const uDotA = vLine.NormalizedDirection().dot(vAxis).magnitude(); + auto const rhoStart = GetImplementation().GetMassDensity(vLine.GetR0()); + + if (uDotA == 0) { + return vGrammage / rhoStart; + } else { + auto const logArg = vGrammage * fInvLambda * uDotA / rhoStart + 1; + if (logArg > 0) { + return fLambda / uDotA * log(logArg); + } else { + return std::numeric_limits<typename decltype( + vGrammage)::value_type>::infinity() * + units::si::meter; + } + } + } + + +} // namespace corsika + diff --git a/corsika/detail/media/Environment.inl b/corsika/detail/media/Environment.inl new file mode 100644 index 000000000..cc5a94551 --- /dev/null +++ b/corsika/detail/media/Environment.inl @@ -0,0 +1,39 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/Environment.hpp> + +namespace corsika { + + template <typename IEnvironmentModel> + auto& Environment<IEnvironmentModel>::GetUniverse() { + return fUniverse; } + + template <typename IEnvironmentModel> + auto const& Environment<IEnvironmentModel>::GetUniverse() const { return fUniverse; } + + template <typename IEnvironmentModel> + auto const& Environment<IEnvironmentModel>::GetCoordinateSystem() const { return fCoordinateSystem; } + + // factory method for creation of VolumeTreeNodes + template <typename IEnvironmentModel> + template <class TVolumeType, typename... TVolumeArgs> + auto Environment<IEnvironmentModel>::CreateNode(TVolumeArgs&&... args) { + static_assert(std::is_base_of_v<corsika::Volume, TVolumeType>, + "unusable type provided, needs to be derived from " + "\"corsika::Volume\""); + + return std::make_unique<BaseNodeType>( + std::make_unique<TVolumeType>(std::forward<TVolumeArgs>(args)...)); + } + +} \ No newline at end of file diff --git a/corsika/detail/media/FlatExponential.inl b/corsika/detail/media/FlatExponential.inl new file mode 100644 index 000000000..24f66e557 --- /dev/null +++ b/corsika/detail/media/FlatExponential.inl @@ -0,0 +1,41 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/FlatExponential.hpp> + +namespace corsika { + + template <class T> + units::si::MassDensityType FlatExponential<T>::GetMassDensity(Point const& vP) const { + return Base::fRho0 * exp(Base::fInvLambda * (vP - Base::fP0).dot(fAxis)); + } + + template <class T> + NuclearComposition const& FlatExponential<T>::GetNuclearComposition() const { + return fNuclComp; + } + + template <class T> + units::si::GrammageType FlatExponential<T>::IntegratedGrammage( + Trajectory<Line> const& vLine, units::si::LengthType vTo) const { + return Base::IntegratedGrammage(vLine, vTo, fAxis); + } + + template <class T> + units::si::LengthType FlatExponential<T>::ArclengthFromGrammage( + Trajectory<Line> const& vLine, units::si::GrammageType vGrammage) const { + return Base::ArclengthFromGrammage(vLine, vGrammage, fAxis); + } + +} // namespace corsika + +#include <corsika/detail/media/BaseExponential.inl> diff --git a/corsika/detail/media/LayeredSphericalAtmosphereBuilder.inl b/corsika/detail/media/LayeredSphericalAtmosphereBuilder.inl new file mode 100644 index 000000000..be0781236 --- /dev/null +++ b/corsika/detail/media/LayeredSphericalAtmosphereBuilder.inl @@ -0,0 +1,87 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/media/LayeredSphericalAtmosphereBuilder.hpp> +#include <corsika/media/FlatExponential.hpp> +#include <corsika/media/HomogeneousMedium.hpp> +#include <corsika/media/SlidingPlanarExponential.hpp> + +namespace corsika { + +void LayeredSphericalAtmosphereBuilder::checkRadius(units::si::LengthType r) const { + if (r <= previousRadius_) { + throw std::runtime_error("radius must be greater than previous"); + } +} + +void LayeredSphericalAtmosphereBuilder::setNuclearComposition( + NuclearComposition composition) { + composition_ = std::make_unique<NuclearComposition>(composition); +} + +void LayeredSphericalAtmosphereBuilder::addExponentialLayer( + units::si::GrammageType b, units::si::LengthType c, + units::si::LengthType upperBoundary) { + auto const radius = seaLevel_ + upperBoundary; + checkRadius(radius); + previousRadius_ = radius; + + auto node = std::make_unique<VolumeTreeNode<IMediumModel>>( + std::make_unique<Sphere>(center_, radius)); + + auto const rho0 = b / c; + std::cout << "rho0 = " << rho0 << ", c = " << c << std::endl; + + node->SetModelProperties<SlidingPlanarExponential<IMediumModel>>( + center_, rho0, -c, *composition_, seaLevel_); + + layers_.push(std::move(node)); +} + +void LayeredSphericalAtmosphereBuilder::addLinearLayer( + units::si::LengthType c, units::si::LengthType upperBoundary) { + using namespace units::si; + + auto const radius = seaLevel_ + upperBoundary; + checkRadius(radius); + previousRadius_ = radius; + + units::si::GrammageType constexpr b = 1 * 1_g / (1_cm * 1_cm); + auto const rho0 = b / c; + + std::cout << "rho0 = " << rho0; + + auto node = std::make_unique<VolumeTreeNode<IMediumModel>>( + std::make_unique<Sphere>(center_, radius)); + node->SetModelProperties<HomogeneousMedium<IMediumModel>>(rho0, *composition_); + + layers_.push(std::move(node)); +} + +Environment<IMediumModel> LayeredSphericalAtmosphereBuilder::assemble() { + Environment<IMediumModel> env; + assemble(env); + return env; +} + +void LayeredSphericalAtmosphereBuilder::assemble(Environment<IMediumModel>& env) { + auto& universe = env.GetUniverse(); + auto* outmost = universe.get(); + + while (!layers_.empty()) { + auto l = std::move(layers_.top()); + auto* tmp = l.get(); + outmost->AddChild(std::move(l)); + layers_.pop(); + outmost = tmp; + } +} + +} // namespace corsika diff --git a/corsika/detail/media/LinearApproximationIntegrator.inl b/corsika/detail/media/LinearApproximationIntegrator.inl new file mode 100644 index 000000000..77766a6d9 --- /dev/null +++ b/corsika/detail/media/LinearApproximationIntegrator.inl @@ -0,0 +1,57 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/LinearApproximationIntegrator.hpp> + +namespace corsika { + + + template <class TDerived> + auto const& LinearApproximationIntegrator<TDerived>::GetImplementation() const { + return *static_cast<TDerived const*>(this); + } + + + template <class TDerived> + auto LinearApproximationIntegrator<TDerived>::IntegrateGrammage( + corsika::Trajectory<corsika::Line> const& line, + corsika::units::si::LengthType length) const { + auto const c0 = GetImplementation().EvaluateAt(line.GetPosition(0)); + auto const c1 = GetImplementation().fRho.FirstDerivative( + line.GetPosition(0), line.NormalizedDirection()); + return (c0 + 0.5 * c1 * length) * length; + } + + template <class TDerived> + auto LinearApproximationIntegrator<TDerived>::ArclengthFromGrammage( + corsika::Trajectory<corsika::Line> const& line, + corsika::units::si::GrammageType grammage) const { + auto const c0 = GetImplementation().fRho(line.GetPosition(0)); + auto const c1 = GetImplementation().fRho.FirstDerivative( + line.GetPosition(0), line.NormalizedDirection()); + + return (1 - 0.5 * grammage * c1 / (c0 * c0)) * grammage / c0; + } + + template <class TDerived> + auto LinearApproximationIntegrator<TDerived>::MaximumLength(corsika::Trajectory<corsika::Line> const& line, + [[maybe_unused]] double relError) const { + using namespace corsika::units::si; + [[maybe_unused]] auto const c1 = GetImplementation().fRho.SecondDerivative( + line.GetPosition(0), line.NormalizedDirection()); + + // todo: provide a real, working implementation + return 1_m * std::numeric_limits<double>::infinity(); + } + + +} \ No newline at end of file diff --git a/corsika/detail/media/SlidingPlanarExponential.inl b/corsika/detail/media/SlidingPlanarExponential.inl new file mode 100644 index 000000000..224826efc --- /dev/null +++ b/corsika/detail/media/SlidingPlanarExponential.inl @@ -0,0 +1,38 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/SlidingPlanarExponential.hpp> + +namespace corsika { + + template <class T> + units::si::MassDensityType SlidingPlanarExponential<T>::GetMassDensity( + Point const& p) const { + auto const height = (p - Base::fP0).norm() - referenceHeight_; + return Base::fRho0 * exp(Base::fInvLambda * height); + } + + template <class T> + units::si::GrammageType SlidingPlanarExponential<T>::IntegratedGrammage( + Trajectory<Line> const& line, units::si::LengthType l) const { + auto const axis = (line.GetR0() - Base::fP0).normalized(); + return Base::IntegratedGrammage(line, l, axis); + } + + template <class T> + units::si::LengthType SlidingPlanarExponential<T>::ArclengthFromGrammage( + Trajectory<Line> const& line, units::si::GrammageType grammage) const { + auto const axis = (line.GetR0() - Base::fP0).normalized(); + return Base::ArclengthFromGrammage(line, grammage, axis); + } + +} // namespace corsika \ No newline at end of file diff --git a/corsika/detail/media/Universe.inl b/corsika/detail/media/Universe.inl new file mode 100644 index 000000000..d1f16c4e5 --- /dev/null +++ b/corsika/detail/media/Universe.inl @@ -0,0 +1,31 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/Environment.hpp> + +namespace corsika { + + Universe::Universe(corsika::CoordinateSystem const& pCS): + corsika::Sphere( + corsika::Point{pCS, + 0 * corsika::units::si::meter, + 0 * corsika::units::si::meter, + 0 * corsika::units::si::meter}, + corsika::units::si::meter * std::numeric_limits<double>::infinity()) + {} + + bool Universe::Contains(corsika::Point const&) const + { + return true; + } + +} \ No newline at end of file diff --git a/corsika/detail/media/VolumeTreeNode.inl b/corsika/detail/media/VolumeTreeNode.inl new file mode 100644 index 000000000..14eaef6b5 --- /dev/null +++ b/corsika/detail/media/VolumeTreeNode.inl @@ -0,0 +1,92 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/Volume.hpp> +#include <corsika/media/IMediumModel.hpp> + +namespace corsika { + + //! convenience function equivalent to Volume::Contains + template <typename IModelProperties> + bool VolumeTreeNode<IModelProperties>::Contains(corsika::Point const& p) const { + return fGeoVolume->Contains(p); + } + + template <typename IModelProperties> + inline VolumeTreeNode<IModelProperties> const* + VolumeTreeNode<IModelProperties>::Excludes(corsika::Point const& p) const { + auto exclContainsIter = + std::find_if(fExcludedNodes.cbegin(), fExcludedNodes.cend(), + [&](auto const& s) { return bool(s->Contains(p)); }); + + return exclContainsIter != fExcludedNodes.cend() ? *exclContainsIter : nullptr; + } + + /** returns a pointer to the sub-VolumeTreeNode which is "responsible" for the given + * \class Point \p p, or nullptr iff \p p is not contained in this volume. + */ + template <typename IModelProperties> + VolumeTreeNode<IModelProperties> const* + VolumeTreeNode<IModelProperties>::GetContainingNode(corsika::Point const& p) const { + if (!Contains(p)) { return nullptr; } + + if (auto const childContainsIter = + std::find_if(fChildNodes.cbegin(), fChildNodes.cend(), + [&](auto const& s) { return bool(s->Contains(p)); }); + childContainsIter == fChildNodes.cend()) // not contained in any of the children + { + if (auto const exclContainsIter = Excludes(p)) // contained in any excluded nodes + { + return exclContainsIter->GetContainingNode(p); + } else { + return this; + } + } else { + return (*childContainsIter)->GetContainingNode(p); + } + } + + template <typename IModelProperties> + template <typename TCallable, bool preorder> + void VolumeTreeNode<IModelProperties>::walk(TCallable func) { + if constexpr (preorder) { func(*this); } + + std::for_each(fChildNodes.begin(), fChildNodes.end(), + [&](auto& v) { v->walk(func); }); + + if constexpr (!preorder) { func(*this); }; + } + + template <typename IModelProperties> + void VolumeTreeNode<IModelProperties>::AddChild(typename VolumeTreeNode<IModelProperties>::VTNUPtr pChild) { + pChild->fParentNode = this; + fChildNodes.push_back(std::move(pChild)); + // It is a bad idea to return an iterator to the inserted element + // because it might get invalidated when the vector needs to grow + // later and the caller won't notice. + } + + template <typename IModelProperties> + void VolumeTreeNode<IModelProperties>::ExcludeOverlapWith(typename VolumeTreeNode<IModelProperties>::VTNUPtr const& pNode) { + fExcludedNodes.push_back(pNode.get()); + } + + template <typename IModelProperties> + template <class MediumType, typename... Args> + auto VolumeTreeNode<IModelProperties>::CreateMedium(Args&&... args) { + static_assert(std::is_base_of_v<IMediumModel, MediumType>, + "unusable type provided, needs to be derived from \"IMediumModel\""); + + return std::make_shared<MediumType>(std::forward<Args>(args)...); + } + +} // namespace corsika \ No newline at end of file diff --git a/corsika/detail/modules/sibyll/Decay.inl b/corsika/detail/modules/sibyll/Decay.inl new file mode 100644 index 000000000..a6ffafa22 --- /dev/null +++ b/corsika/detail/modules/sibyll/Decay.inl @@ -0,0 +1,163 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/modules/sibyll/Decay.hpp> +#include <corsika/modules/sibyll/ParticleConversion.hpp> +#include <corsika/modules/sibyll/SibStack.hpp> + +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> + +#include <iostream> +#include <vector> + +using SetupView = corsika::setup::StackView; +using SetupProjectile = corsika::setup::StackView::ParticleType; +using SetupParticle = corsika::setup::Stack::ParticleType; + +namespace corsika::sibyll { + + Decay::Decay() {} + Decay::~Decay() { std::cout << "Sibyll::Decay n=" << fCount << std::endl; } + void Decay::Init() { + // switch off decays to avoid internal decay chains + SetAllStable(); + } + + void Decay::SetStable(const std::vector<corsika::Code> vParticleList) { + for (auto p : vParticleList) Decay::SetStable(p); + } + + void Decay::SetUnstable(const std::vector<corsika::Code> vParticleList) { + for (auto p : vParticleList) Decay::SetUnstable(p); + } + + bool Decay::IsStable(const corsika::Code vCode) { + return abs(corsika::sibyll::ConvertToSibyllRaw(vCode)) <= 0 ? true : false; + } + + bool Decay::IsUnstable(const corsika::Code vCode) { + return abs(corsika::sibyll::ConvertToSibyllRaw(vCode)) > 0 ? true : false; + } + + void Decay::SetDecay(const corsika::Code vCode, const bool vMakeUnstable) { + vMakeUnstable ? SetUnstable(vCode) : SetStable(vCode); + } + + void Decay::SetUnstable(const corsika::Code vCode) { + std::cout << "Sibyll::Interaction: setting " << vCode << " unstable.." << std::endl; + const int s_id = abs(corsika::sibyll::ConvertToSibyllRaw(vCode)); + s_csydec_.idb[s_id - 1] = abs(s_csydec_.idb[s_id - 1]); + } + + void Decay::SetStable(const corsika::Code vCode) { + std::cout << "Sibyll::Interaction: setting " << vCode << " stable.." << std::endl; + const int s_id = abs(corsika::sibyll::ConvertToSibyllRaw(vCode)); + s_csydec_.idb[s_id - 1] = (-1) * abs(s_csydec_.idb[s_id - 1]); + } + + void Decay::SetAllStable() { + for (int i = 0; i < 99; ++i) s_csydec_.idb[i] = -1 * abs(s_csydec_.idb[i]); + } + + void Decay::SetAllUnstable() { + for (int i = 0; i < 99; ++i) s_csydec_.idb[i] = abs(s_csydec_.idb[i]); + } + + void Decay::PrintDecayConfig(const corsika::Code vCode) { + std::cout << "Decay: Sibyll decay configuration:" << std::endl; + const int sibCode = corsika::sibyll::ConvertToSibyllRaw(vCode); + const int absSibCode = abs(sibCode); + std::cout << vCode << " is "; + if (s_csydec_.idb[absSibCode - 1] <= 0) + std::cout << "stable" << std::endl; + else + std::cout << "unstable" << std::endl; + } + + template <> + units::si::TimeType Decay::GetLifetime(SetupParticle const& vP) const { + using namespace units::si; + + HEPEnergyType E = vP.GetEnergy(); + HEPMassType m = vP.GetMass(); + + const double gamma = E / m; + + const TimeType t0 = corsika::GetLifetime(vP.GetPID()); + auto const lifetime = gamma * t0; + + const auto mkin = + (E * E - vP.GetMomentum().squaredNorm()); // delta_mass(vP.GetMomentum(), E, m); + std::cout << "Decay: code: " << vP.GetPID() << std::endl; + std::cout << "Decay: MinStep: t0: " << t0 << std::endl; + std::cout << "Decay: MinStep: energy: " << E / 1_GeV << " GeV" << std::endl; + std::cout << "Decay: momentum: " << vP.GetMomentum().GetComponents() / 1_GeV << " GeV" + << std::endl; + std::cout << "Decay: momentum: shell mass-kin. inv. mass " << mkin / 1_GeV / 1_GeV << " " + << m / 1_GeV * m / 1_GeV << std::endl; + auto sib_id = corsika::sibyll::ConvertToSibyllRaw(vP.GetPID()); + std::cout << "Decay: sib mass: " << get_sibyll_mass2(sib_id) << std::endl; + std::cout << "Decay: MinStep: gamma: " << gamma << std::endl; + std::cout << "Decay: MinStep: tau: " << lifetime << std::endl; + + return lifetime; + } + + template <> + void Decay::DoDecay(SetupProjectile& vP) { + using corsika::Point; + using namespace units::si; + + fCount++; + SibStack ss; + ss.Clear(); + const corsika::Code pCode = vP.GetPID(); + // copy particle to sibyll stack + ss.AddParticle(corsika::sibyll::ConvertToSibyllRaw(pCode), vP.GetEnergy(), + vP.GetMomentum(), + // setting particle mass with Corsika values, may be inconsistent + // with sibyll internal values + corsika::GetMass(pCode)); + // remember position + Point const decayPoint = vP.GetPosition(); + TimeType const t0 = vP.GetTime(); + // remember if particles is unstable + // auto const priorIsUnstable = IsUnstable(pCode); + // switch on decay for this particle + SetUnstable(pCode); + PrintDecayConfig(pCode); + + // call sibyll decay + std::cout << "Decay: calling Sibyll decay routine.." << std::endl; + decsib_(); + + // reset to stable + SetStable(pCode); + // print output + int print_unit = 6; + sib_list_(print_unit); + + // copy particles from sibyll stack to corsika + for (auto& psib : ss) { + // FOR NOW: skip particles that have decayed in Sibyll, move to iterator? + if (psib.HasDecayed()) continue; + // add to corsika stack + vP.AddSecondary( + std::tuple<corsika::Code, units::si::HEPEnergyType, corsika::MomentumVector, + Point, units::si::TimeType>{ + corsika::sibyll::ConvertFromSibyll(psib.GetPID()), psib.GetEnergy(), + psib.GetMomentum(), decayPoint, t0}); + } + // empty sibyll stack + ss.Clear(); + } + +} // namespace corsika::sibyll diff --git a/corsika/detail/modules/sibyll/Interaction.inl b/corsika/detail/modules/sibyll/Interaction.inl new file mode 100644 index 000000000..b27988241 --- /dev/null +++ b/corsika/detail/modules/sibyll/Interaction.inl @@ -0,0 +1,365 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/modules/sibyll/Interaction.hpp> + +#include <corsika/media/Environment.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/modules/sibyll/ParticleConversion.hpp> +#include <corsika/modules/sibyll/SibStack.hpp> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> +#include <corsika/framework/utility/COMBoost.hpp> + +#include <sibyll2.3d.hpp> + +#include <tuple> + +using std::make_tuple; +using std::tuple; + +using namespace corsika; +using SetupParticle = setup::Stack::StackIterator; +using SetupView = setup::StackView; +using Track = setup::Trajectory; + +namespace corsika::sibyll { + + Interaction::Interaction() { + using corsika::RNGManager; + + // initialize Sibyll + if (!initialized_) { + sibyll_ini_(); + initialized_ = true; + } + } + + Interaction::~Interaction() { + std::cout << "Sibyll::Interaction n=" << count_ << " Nnuc=" << nucCount_ << std::endl; + } + + void Interaction::SetStable(std::vector<corsika::Code> const& vParticleList) { + for (auto p : vParticleList) Interaction::SetStable(p); + } + + void Interaction::SetUnstable(std::vector<corsika::Code> const& vParticleList) { + for (auto p : vParticleList) Interaction::SetUnstable(p); + } + + void Interaction::SetUnstable(const corsika::Code vCode) { + std::cout << "Sibyll::Interaction: setting " << vCode << " unstable.." << std::endl; + const int s_id = abs(corsika::sibyll::ConvertToSibyllRaw(vCode)); + s_csydec_.idb[s_id - 1] = abs(s_csydec_.idb[s_id - 1]); + } + + void Interaction::SetStable(const corsika::Code vCode) { + std::cout << "Sibyll::Interaction: setting " << vCode << " stable.." << std::endl; + const int s_id = abs(corsika::sibyll::ConvertToSibyllRaw(vCode)); + s_csydec_.idb[s_id - 1] = (-1) * abs(s_csydec_.idb[s_id - 1]); + } + + void Interaction::SetAllUnstable() { + for (int i = 0; i < 99; ++i) s_csydec_.idb[i] = abs(s_csydec_.idb[i]); + } + + void Interaction::SetAllStable() { + for (int i = 0; i < 99; ++i) s_csydec_.idb[i] = -1 * abs(s_csydec_.idb[i]); + } + + tuple<units::si::CrossSectionType, units::si::CrossSectionType> + Interaction::GetCrossSection(const corsika::Code BeamId, + const corsika::Code TargetId, + const units::si::HEPEnergyType CoMenergy) const { + using namespace units::si; + double sigProd, sigEla, dummy, dum1, dum3, dum4; + double dumdif[3]; + const int iBeam = corsika::sibyll::GetSibyllXSCode(BeamId); + if (!IsValidCoMEnergy(CoMenergy)) { + throw std::runtime_error( + "Interaction: GetCrossSection: CoM energy outside range for Sibyll!"); + } + const double dEcm = CoMenergy / 1_GeV; + if (corsika::IsNucleus(TargetId)) { + const int iTarget = corsika::GetNucleusA(TargetId); + if (iTarget > maxTargetMassNumber_ || iTarget == 0) + throw std::runtime_error( + "Sibyll target outside range. Only nuclei with A<18 are allowed."); + sib_sigma_hnuc_(iBeam, iTarget, dEcm, sigProd, dummy, sigEla); + } else if (TargetId == corsika::Proton::GetCode()) { + sib_sigma_hp_(iBeam, dEcm, dum1, sigEla, sigProd, dumdif, dum3, dum4); + } else { + // no interaction in sibyll possible, return infinite cross section? or throw? + sigProd = std::numeric_limits<double>::infinity(); + sigEla = std::numeric_limits<double>::infinity(); + } + return std::make_tuple(sigProd * 1_mb, sigEla * 1_mb); + } + + + template <> + units::si::GrammageType Interaction::GetInteractionLength( + SetupParticle const& vP) const { + + using namespace units; + using namespace units::si; + + // coordinate system, get global frame of reference + CoordinateSystem& rootCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + + const corsika::Code corsikaBeamId = vP.GetPID(); + + // beam corsika for sibyll : 1, 2, 3 for p, pi, k + // read from cross section code table + const bool kInteraction = corsika::sibyll::CanInteract(corsikaBeamId); + + // FOR NOW: assume target is at rest + MomentumVector pTarget(rootCS, {0_GeV, 0_GeV, 0_GeV}); + + // total momentum and energy + HEPEnergyType Elab = vP.GetEnergy() + constants::nucleonMass; + MomentumVector pTotLab(rootCS, {0_GeV, 0_GeV, 0_GeV}); + pTotLab += vP.GetMomentum(); + pTotLab += pTarget; + auto const pTotLabNorm = pTotLab.norm(); + // calculate cm. energy + const HEPEnergyType ECoM = sqrt( + (Elab + pTotLabNorm) * (Elab - pTotLabNorm)); // binomial for numerical accuracy + + std::cout << "Interaction: LambdaInt: \n" + << " input energy: " << vP.GetEnergy() / 1_GeV << std::endl + << " beam can interact:" << kInteraction << std::endl + << " beam pid:" << vP.GetPID() << std::endl; + + // TODO: move limits into variables + // FR: removed && Elab >= 8.5_GeV + if (kInteraction && IsValidCoMEnergy(ECoM)) { + + // get target from environment + /* + the target should be defined by the Environment, + ideally as full particle object so that the four momenta + and the boosts can be defined.. + */ + + auto const* currentNode = vP.GetNode(); + const auto& mediumComposition = + currentNode->GetModelProperties().GetNuclearComposition(); + + si::CrossSectionType weightedProdCrossSection = mediumComposition.WeightedSum( + [=](corsika::Code targetID) -> si::CrossSectionType { + return std::get<0>(this->GetCrossSection(corsikaBeamId, targetID, ECoM)); + }); + + std::cout << "Interaction: " + << "IntLength: weighted CrossSection (mb): " << weightedProdCrossSection / 1_mb + << std::endl; + + // calculate interaction length in medium + GrammageType const int_length = mediumComposition.GetAverageMassNumber() * + units::constants::u / weightedProdCrossSection; + std::cout << "Interaction: " + << "interaction length (g/cm2): " << int_length / (0.001_kg) * 1_cm * 1_cm + << std::endl; + + return int_length; + } + + return std::numeric_limits<double>::infinity() * 1_g / (1_cm * 1_cm); + } + + /** + In this function SIBYLL is called to produce one event. The + event is copied (and boosted) into the shower lab frame. + */ + + template <> + corsika::EProcessReturn Interaction::DoInteraction(SetupProjectile& vP) { + + using namespace units::si; + + const auto corsikaBeamId = vP.GetPID(); + std::cout << "ProcessSibyll: " + << "DoInteraction: " << corsikaBeamId << " interaction? " + << corsika::sibyll::CanInteract(corsikaBeamId) << std::endl; + + if (corsika::IsNucleus(corsikaBeamId)) { + // nuclei handled by different process, this should not happen + throw std::runtime_error("Nuclear projectile are not handled by SIBYLL!"); + } + + if (corsika::sibyll::CanInteract(corsikaBeamId)) { + const CoordinateSystem& rootCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + + // position and time of interaction, not used in Sibyll + Point pOrig = vP.GetPosition(); + TimeType tOrig = vP.GetTime(); + + // define target + // for Sibyll is always a single nucleon + // FOR NOW: target is always at rest + const auto eTargetLab = 0_GeV + corsika::units::constants::nucleonMass; + const auto pTargetLab = MomentumVector(rootCS, 0_GeV, 0_GeV, 0_GeV); + const FourVector PtargLab(eTargetLab, pTargetLab); + + // define projectile + HEPEnergyType const eProjectileLab = vP.GetEnergy(); + auto const pProjectileLab = vP.GetMomentum(); + + std::cout << "Interaction: ebeam lab: " << eProjectileLab / 1_GeV << std::endl + << "Interaction: pbeam lab: " << pProjectileLab.GetComponents() / 1_GeV + << std::endl; + std::cout << "Interaction: etarget lab: " << eTargetLab / 1_GeV << std::endl + << "Interaction: ptarget lab: " << pTargetLab.GetComponents() / 1_GeV << std::endl; + + const FourVector PprojLab(eProjectileLab, pProjectileLab); + + // define target kinematics in lab frame + // define boost to and from CoM frame + // CoM frame definition in Sibyll projectile: +z + COMBoost const boost(PprojLab, corsika::units::constants::nucleonMass); + + // just for show: + // boost projecticle + auto const PprojCoM = boost.toCoM(PprojLab); + + // boost target + auto const PtargCoM = boost.toCoM(PtargLab); + + std::cout << "Interaction: ebeam CoM: " << PprojCoM.GetTimeLikeComponent() / 1_GeV + << std::endl + << "Interaction: pbeam CoM: " + << PprojCoM.GetSpaceLikeComponents().GetComponents() / 1_GeV << std::endl; + std::cout << "Interaction: etarget CoM: " << PtargCoM.GetTimeLikeComponent() / 1_GeV + << std::endl + << "Interaction: ptarget CoM: " + << PtargCoM.GetSpaceLikeComponents().GetComponents() / 1_GeV << std::endl; + + std::cout << "Interaction: position of interaction: " << pOrig.GetCoordinates() << std::endl; + std::cout << "Interaction: time: " << tOrig << std::endl; + + HEPEnergyType Etot = eProjectileLab + eTargetLab; + MomentumVector Ptot = vP.GetMomentum(); + // invariant mass, i.e. cm. energy + HEPEnergyType Ecm = sqrt(Etot * Etot - Ptot.squaredNorm()); + + // sample target mass number + auto const* currentNode = vP.GetNode(); + auto const& mediumComposition = + currentNode->GetModelProperties().GetNuclearComposition(); + // get cross sections for target materials + /* + Here we read the cross section from the interaction model again, + should be passed from GetInteractionLength if possible + */ + //#warning reading interaction cross section again, should not be necessary + auto const& compVec = mediumComposition.GetComponents(); + std::vector<corsika::units::si::CrossSectionType> cross_section_of_components(compVec.size()); + + for (size_t i = 0; i < compVec.size(); ++i) { + auto const targetId = compVec[i]; + const auto [sigProd, sigEla] = GetCrossSection(corsikaBeamId, targetId, Ecm); + [[maybe_unused]] const auto& dummy_sigEla = sigEla; + cross_section_of_components[i] = sigProd; + } + + const auto targetCode = + mediumComposition.SampleTarget(cross_section_of_components, RNG_); + std::cout << "Interaction: target selected: " << targetCode << std::endl; + /* + FOR NOW: allow nuclei with A<18 or protons only. + when medium composition becomes more complex, approximations will have to be + allowed air in atmosphere also contains some Argon. + */ + int targetSibCode = -1; + if (IsNucleus(targetCode)) targetSibCode = GetNucleusA(targetCode); + if (targetCode == corsika::Proton::GetCode()) targetSibCode = 1; + std::cout << "Interaction: sibyll code: " << targetSibCode << std::endl; + if (targetSibCode > maxTargetMassNumber_ || targetSibCode < 1) + throw std::runtime_error( + "Sibyll target outside range. Only nuclei with A<18 or protons are " + "allowed."); + + // beam id for sibyll + const int kBeam = corsika::sibyll::ConvertToSibyllRaw(corsikaBeamId); + + std::cout << "Interaction: " + << " DoInteraction: E(GeV):" << eProjectileLab / 1_GeV + << " Ecm(GeV): " << Ecm / 1_GeV << std::endl; + if (Ecm > GetMaxEnergyCoM()) + throw std::runtime_error("Interaction::DoInteraction: CoM energy too high!"); + // FR: removed eProjectileLab < 8.5_GeV || + if (Ecm < GetMinEnergyCoM()) { + std::cout << "Interaction: " + << " DoInteraction: should have dropped particle.. " + << "THIS IS AN ERROR" << std::endl; + throw std::runtime_error("energy too low for SIBYLL"); + } else { + count_++; + // Sibyll does not know about units.. + const double sqs = Ecm / 1_GeV; + // running sibyll, filling stack + std::cout << "kBeam " << kBeam << " targetSibCode " << targetSibCode << " sqs " << sqs << std::endl; + sibyll_(kBeam, targetSibCode, sqs); + if (internalDecays_) { + // corsika that decay internally will never appear on the corsika stack + // switch on all decays except for the corsika we want to take part in the + // tracking + SetAllUnstable(); + SetStable(trackedParticles_); + decsib_(); + // reset + SetAllStable(); + } + // print final state + int print_unit = 6; + sib_list_(print_unit); + nucCount_ += get_nwounded() - 1; + + // add corsika from sibyll to stack + // link to sibyll stack + SibStack ss; + + MomentumVector Plab_final(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); + HEPEnergyType Elab_final = 0_GeV, Ecm_final = 0_GeV; + for (auto& psib : ss) { + + // skip corsika that have decayed in Sibyll + if (psib.HasDecayed()) continue; + + // transform energy to lab. frame + auto const pCoM = psib.GetMomentum(); + HEPEnergyType const eCoM = psib.GetEnergy(); + auto const Plab = boost.fromCoM(FourVector(eCoM, pCoM)); + + // add to corsika stack + auto pnew = vP.AddSecondary( + std::tuple<corsika::Code, units::si::HEPEnergyType, corsika::MomentumVector, + corsika::Point, units::si::TimeType>{ + corsika::sibyll::ConvertFromSibyll(psib.GetPID()), + Plab.GetTimeLikeComponent(), Plab.GetSpaceLikeComponents(), pOrig, + tOrig}); + + Plab_final += pnew.GetMomentum(); + Elab_final += pnew.GetEnergy(); + Ecm_final += psib.GetEnergy(); + } + std::cout << "conservation (all GeV): Ecm_final=" << Ecm_final / 1_GeV << std::endl + << "Elab_final=" << Elab_final / 1_GeV + << ", Plab_final=" << (Plab_final / 1_GeV).GetComponents() << std::endl; + } + } + return corsika::EProcessReturn::eOk; + } + +} // namespace corsika::sibyll diff --git a/corsika/detail/modules/sibyll/NuclearInteraction.inl b/corsika/detail/modules/sibyll/NuclearInteraction.inl new file mode 100644 index 000000000..5f08a662f --- /dev/null +++ b/corsika/detail/modules/sibyll/NuclearInteraction.inl @@ -0,0 +1,600 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/modules/sibyll/Interaction.hpp> +#include <corsika/modules/sibyll/NuclearInteraction.hpp> + +#include <corsika/media/Environment.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/utility/COMBoost.hpp> + +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> + +#include <nuclib.hpp> + +namespace corsika::sibyll { + + template <> + NuclearInteraction<corsika::setup::SetupEnvironment>::NuclearInteraction( + corsika::sibyll::Interaction& hadint, corsika::setup::SetupEnvironment const& env) + : environment_(env) + , hadronicInteraction_(hadint) {} + + template <> + NuclearInteraction<corsika::setup::SetupEnvironment>::~NuclearInteraction() { + std::cout << "Nuclib::NuclearInteraction n=" << count_ << " Nnuc=" << nucCount_ << std::endl; + } + + template <> + void NuclearInteraction<corsika::setup::SetupEnvironment>::PrintCrossSectionTable( + corsika::Code pCode) { + const int k = targetComponentsIndex_.at(pCode); + Code pNuclei[] = {Code::Helium, Code::Lithium7, Code::Oxygen, + Code::Neon, Code::Argon, Code::Iron}; + std::cout << "en/A "; + for (auto& j : pNuclei) std::cout << std::setw(9) << j; + std::cout << std::endl; + + // loop over energy bins + for (unsigned int i = 0; i < GetNEnergyBins(); ++i) { + std::cout << " " << i << " "; + for (auto& n : pNuclei) { + auto const j = GetNucleusA(n); + std::cout << " " << std::setprecision(5) << std::setw(8) + << cnucsignuc_.sigma[j - 1][k][i]; + } + std::cout << std::endl; + } + } + + template <> + void NuclearInteraction<corsika::setup::SetupEnvironment>::InitializeNuclearCrossSections() { + + using namespace corsika::units::si; + + auto& universe = *(environment_.GetUniverse()); + + auto const allElementsInUniverse = std::invoke([&]() { + std::set<corsika::Code> allElementsInUniverse; + auto collectElements = [&](auto& vtn) { + if (vtn.HasModelProperties()) { + auto const& comp = + vtn.GetModelProperties().GetNuclearComposition().GetComponents(); + for (auto const c : comp) allElementsInUniverse.insert(c); + } + }; + universe.walk(collectElements); + return allElementsInUniverse; + }); + + std::cout << "NuclearInteraction: initializing nuclear cross sections..." << std::endl; + + // loop over target components, at most 4!! + int k = -1; + for (auto& ptarg : allElementsInUniverse) { + ++k; + std::cout << "NuclearInteraction: init target component: " << ptarg << std::endl; + const int ib = GetNucleusA(ptarg); + if (!hadronicInteraction_.IsValidTarget(ptarg)) { + std::cout << "NuclearInteraction::InitializeNuclearCrossSections: target nucleus? id=" + << ptarg << std::endl; + throw std::runtime_error( + " target can not be handled by hadronic interaction model! "); + } + targetComponentsIndex_.insert(std::pair<Code, int>(ptarg, k)); + // loop over energies, fNEnBins log. energy bins + for (unsigned int i = 0; i < GetNEnergyBins(); ++i) { + // hard coded energy grid, has to be aligned to definition in signuc2!!, no + // comment.. + const corsika::units::si::HEPEnergyType Ecm = pow(10., 1. + 1. * i) * 1_GeV; + // get p-p cross sections + auto const protonId = Code::Proton; + auto const [siginel, sigela] = + hadronicInteraction_.GetCrossSection(protonId, protonId, Ecm); + const double dsig = siginel / 1_mb; + const double dsigela = sigela / 1_mb; + // loop over projectiles, mass numbers from 2 to fMaxNucleusAProjectile + for (unsigned int j = 1; j < gMaxNucleusAProjectile_; ++j) { + const int jj = j + 1; + double sig_out, dsig_out, sigqe_out, dsigqe_out; + sigma_mc_(jj, ib, dsig, dsigela, gNSample_, sig_out, dsig_out, sigqe_out, + dsigqe_out); + // write to table + cnucsignuc_.sigma[j][k][i] = sig_out; + cnucsignuc_.sigqe[j][k][i] = sigqe_out; + } + } + } + std::cout << "NuclearInteraction: cross sections for " << targetComponentsIndex_.size() + << " components initialized!" << std::endl; + for (auto& ptarg : allElementsInUniverse) { + std::cout << "cross section table: " << ptarg << std::endl; + PrintCrossSectionTable(ptarg); + } + } + + template <> + void NuclearInteraction<corsika::setup::SetupEnvironment>::Init() { + + // initialize hadronic interaction module + // TODO: safe to run multiple initializations? + if (!hadronicInteraction_.WasInitialized()) hadronicInteraction_.Init(); + + // check compatibility of energy ranges, someone could try to use low-energy model.. + if (!hadronicInteraction_.IsValidCoMEnergy(GetMinEnergyPerNucleonCoM()) || + !hadronicInteraction_.IsValidCoMEnergy(GetMaxEnergyPerNucleonCoM())) + throw std::runtime_error( + "NuclearInteraction: hadronic interaction model incompatible!"); + + // initialize nuclib + // TODO: make sure this does not overlap with sibyll + nuc_nuc_ini_(); + + // initialize cross sections + InitializeNuclearCrossSections(); + } + + template <> + corsika::units::si::CrossSectionType NuclearInteraction<corsika::setup::SetupEnvironment>::ReadCrossSectionTable( + const int ia, corsika::Code pTarget, corsika::units::si::HEPEnergyType elabnuc) { + + using namespace corsika::units::si; + + const int ib = targetComponentsIndex_.at(pTarget) + 1; // table index in fortran + auto const ECoMNuc = sqrt(2. * corsika::units::constants::nucleonMass * elabnuc); + if (ECoMNuc < GetMinEnergyPerNucleonCoM() || ECoMNuc > GetMaxEnergyPerNucleonCoM()) + throw std::runtime_error("NuclearInteraction: energy outside tabulated range!"); + const double e0 = elabnuc / 1_GeV; + double sig; + std::cout << "ReadCrossSectionTable: " << ia << " " << ib << " " << e0 << std::endl; + signuc2_(ia, ib, e0, sig); + std::cout << "ReadCrossSectionTable: sig=" << sig << std::endl; + return sig * 1_mb; + } + + // TODO: remove elastic cross section? + template <> + template <typename TParticle> + std::tuple<corsika::units::si::CrossSectionType, corsika::units::si::CrossSectionType> + NuclearInteraction<corsika::setup::SetupEnvironment>::GetCrossSection(const TParticle& vP, + const corsika::Code TargetId) { + + using namespace corsika::units::si; + + if (vP.GetPID() != corsika::Code::Nucleus) + throw std::runtime_error( + "NuclearInteraction: GetCrossSection: particle not a nucleus!"); + + unsigned int const iBeamA = vP.GetNuclearA(); + HEPEnergyType LabEnergyPerNuc = vP.GetEnergy() / iBeamA; + std::cout << "NuclearInteraction: GetCrossSection: called with: beamNuclA= " << iBeamA + << " TargetId= " << TargetId << " LabEnergyPerNuc= " << LabEnergyPerNuc / 1_GeV + << std::endl; + + // use nuclib to calc. nuclear cross sections + // TODO: for now assumes air with hard coded composition + // extend to arbitrary mixtures, requires smarter initialization + // get nuclib projectile code: nucleon number + if (iBeamA > GetMaxNucleusAProjectile() || iBeamA < 2) { + std::cout << "NuclearInteraction: beam nucleus outside allowed range for NUCLIB!" << std::endl + << "A=" << iBeamA << std::endl; + throw std::runtime_error( + "NuclearInteraction: GetCrossSection: beam nucleus outside allowed range for " + "NUCLIB!"); + } + + if (hadronicInteraction_.IsValidTarget(TargetId)) { + auto const sigProd = ReadCrossSectionTable(iBeamA, TargetId, LabEnergyPerNuc); + std::cout << "cross section (mb): " << sigProd / 1_mb << std::endl; + return std::make_tuple(sigProd, 0_mb); + } else { + throw std::runtime_error("target outside range."); + } + return std::make_tuple(std::numeric_limits<double>::infinity() * 1_mb, + std::numeric_limits<double>::infinity() * 1_mb); + } + + template <> + template <typename TParticle> + corsika::units::si::GrammageType NuclearInteraction<corsika::setup::SetupEnvironment>::GetInteractionLength( + const TParticle& vP) { + + using namespace corsika::units::si; + + // coordinate system, get global frame of reference + CoordinateSystem& rootCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + + const corsika::Code corsikaBeamId = vP.GetPID(); + + if (corsikaBeamId != corsika::Code::Nucleus) { + // check if target-style nucleus (enum), these are not allowed as projectile + if (corsika::IsNucleus(corsikaBeamId)) + throw std::runtime_error( + "NuclearInteraction: GetInteractionLength: Wrong nucleus type. Nuclear " + "projectiles should use NuclearStackExtension!"); + else { + // no nuclear interaction + return std::numeric_limits<double>::infinity() * 1_g / (1_cm * 1_cm); + } + } + + // read from cross section code table + + // FOR NOW: assume target is at rest + corsika::MomentumVector pTarget(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); + + // total momentum and energy + HEPEnergyType Elab = vP.GetEnergy() + corsika::units::constants::nucleonMass; + int const nuclA = vP.GetNuclearA(); + auto const ElabNuc = vP.GetEnergy() / nuclA; + + corsika::MomentumVector pTotLab(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); + pTotLab += vP.GetMomentum(); + pTotLab += pTarget; + auto const pTotLabNorm = pTotLab.norm(); + // calculate cm. energy + const HEPEnergyType ECoM = sqrt( + (Elab + pTotLabNorm) * (Elab - pTotLabNorm)); // binomial for numerical accuracy + auto const ECoMNN = sqrt(2. * ElabNuc * corsika::units::constants::nucleonMass); + std::cout << "NuclearInteraction: LambdaInt: \n" + << " input energy: " << Elab / 1_GeV << std::endl + << " input energy CoM: " << ECoM / 1_GeV << std::endl + << " beam pid:" << corsikaBeamId << std::endl + << " beam A: " << nuclA << std::endl + << " input energy per nucleon: " << ElabNuc / 1_GeV << std::endl + << " input energy CoM per nucleon: " << ECoMNN / 1_GeV << std::endl; + // throw std::runtime_error("stop here"); + + // energy limits + // TODO: values depend on hadronic interaction model !! this is sibyll specific + if (ElabNuc >= 8.5_GeV && ECoMNN >= gMinEnergyPerNucleonCoM_ && + ECoMNN < gMaxEnergyPerNucleonCoM_) { + + // get target from environment + /* + the target should be defined by the Environment, + ideally as full particle object so that the four momenta + and the boosts can be defined.. + */ + auto const* const currentNode = vP.GetNode(); + auto const& mediumComposition = + currentNode->GetModelProperties().GetNuclearComposition(); + // determine average interaction length + // weighted sum + int i = -1; + CrossSectionType weightedProdCrossSection = 0_mb; + // get weights of components from environment/medium + const auto& w = mediumComposition.GetFractions(); + // loop over components in medium + for (auto const targetId : mediumComposition.GetComponents()) { + i++; + std::cout << "NuclearInteraction: get interaction length for target: " << targetId + << std::endl; + auto const [productionCrossSection, elaCrossSection] = + GetCrossSection(vP, targetId); + [[maybe_unused]] auto& dummy_elaCrossSection = elaCrossSection; + + std::cout << "NuclearInteraction: " + << "IntLength: nuclib return (mb): " << productionCrossSection / 1_mb + << std::endl; + weightedProdCrossSection += w[i] * productionCrossSection; + } + std::cout << "NuclearInteraction: " + << "IntLength: weighted CrossSection (mb): " << weightedProdCrossSection / 1_mb + << std::endl; + + // calculate interaction length in medium + GrammageType const int_length = mediumComposition.GetAverageMassNumber() * + corsika::units::constants::u / weightedProdCrossSection; + std::cout << "NuclearInteraction: " + << "interaction length (g/cm2): " << int_length * (1_cm * 1_cm / (0.001_kg)) + << std::endl; + + return int_length; + } else { + return std::numeric_limits<double>::infinity() * 1_g / (1_cm * 1_cm); + } + } + + template <> + template <typename TProjectile> + corsika::EProcessReturn NuclearInteraction<corsika::setup::SetupEnvironment>::DoInteraction( + TProjectile& vP) { + + using namespace corsika::units::si; + + // this routine superimposes different nucleon-nucleon interactions + // in a nucleus-nucleus interaction, based the SIBYLL routine SIBNUC + + const auto ProjId = vP.GetPID(); + // TODO: calculate projectile mass in nuclearStackExtension + // const auto ProjMass = vP.GetMass(); + std::cout << "NuclearInteraction: DoInteraction: called with:" << ProjId << std::endl; + + // check if target-style nucleus (enum) + if (ProjId != corsika::Code::Nucleus) + throw std::runtime_error( + "NuclearInteraction: DoInteraction: Wrong nucleus type. Nuclear projectiles " + "should use NuclearStackExtension!"); + + auto const ProjMass = + vP.GetNuclearZ() * corsika::Proton::GetMass() + + (vP.GetNuclearA() - vP.GetNuclearZ()) * corsika::Neutron::GetMass(); + std::cout << "NuclearInteraction: projectile mass: " << ProjMass / 1_GeV << std::endl; + + count_++; + + const CoordinateSystem& rootCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + + // position and time of interaction, not used in NUCLIB + Point pOrig = vP.GetPosition(); + TimeType tOrig = vP.GetTime(); + + std::cout << "Interaction: position of interaction: " << pOrig.GetCoordinates() << std::endl; + std::cout << "Interaction: time: " << tOrig << std::endl; + + // projectile nucleon number + const unsigned int kAProj = vP.GetNuclearA(); + if (kAProj > GetMaxNucleusAProjectile()) + throw std::runtime_error("Projectile nucleus too large for NUCLIB!"); + + // kinematics + // define projectile nucleus + HEPEnergyType const eProjectileLab = vP.GetEnergy(); + auto const pProjectileLab = vP.GetMomentum(); + const FourVector PprojLab(eProjectileLab, pProjectileLab); + + std::cout << "NuclearInteraction: eProj lab: " << eProjectileLab / 1_GeV << std::endl + << "NuclearInteraction: pProj lab: " << pProjectileLab.GetComponents() / 1_GeV + << std::endl; + + // define projectile nucleon + HEPEnergyType const eProjectileNucLab = vP.GetEnergy() / kAProj; + auto const pProjectileNucLab = vP.GetMomentum() / kAProj; + const FourVector PprojNucLab(eProjectileNucLab, pProjectileNucLab); + + std::cout << "NuclearInteraction: eProjNucleon lab: " << eProjectileNucLab / 1_GeV << std::endl + << "NuclearInteraction: pProjNucleon lab: " + << pProjectileNucLab.GetComponents() / 1_GeV << std::endl; + + // define target + // always a nucleon + // target is always at rest + const auto eTargetNucLab = 0_GeV + corsika::units::constants::nucleonMass; + const auto pTargetNucLab = + corsika::MomentumVector(rootCS, 0_GeV, 0_GeV, 0_GeV); + const FourVector PtargNucLab(eTargetNucLab, pTargetNucLab); + + std::cout << "NuclearInteraction: etarget lab: " << eTargetNucLab / 1_GeV << std::endl + << "NuclearInteraction: ptarget lab: " << pTargetNucLab.GetComponents() / 1_GeV + << std::endl; + + // center-of-mass energy in nucleon-nucleon frame + auto const PtotNN4 = PtargNucLab + PprojNucLab; + HEPEnergyType EcmNN = PtotNN4.GetNorm(); + std::cout << "NuclearInteraction: nuc-nuc cm energy: " << EcmNN / 1_GeV << std::endl; + + if (!hadronicInteraction_.IsValidCoMEnergy(EcmNN)) { + std::cout << "NuclearInteraction: nuc-nuc. CoM energy too low for hadronic " + "interaction model!" + << std::endl; + throw std::runtime_error("NuclearInteraction: DoInteraction: energy too low!"); + } + + // define boost to NUCLEON-NUCLEON frame + COMBoost const boost(PprojNucLab, corsika::units::constants::nucleonMass); + // boost projecticle + auto const PprojNucCoM = boost.toCoM(PprojNucLab); + + // boost target + auto const PtargNucCoM = boost.toCoM(PtargNucLab); + + std::cout << "Interaction: ebeam CoM: " << PprojNucCoM.GetTimeLikeComponent() / 1_GeV + << std::endl + << "Interaction: pbeam CoM: " + << PprojNucCoM.GetSpaceLikeComponents().GetComponents() / 1_GeV << std::endl; + std::cout << "Interaction: etarget CoM: " << PtargNucCoM.GetTimeLikeComponent() / 1_GeV + << std::endl + << "Interaction: ptarget CoM: " + << PtargNucCoM.GetSpaceLikeComponents().GetComponents() / 1_GeV << std::endl; + + // sample target nucleon number + // + // proton stand-in for nucleon + const auto beamId = corsika::Proton::GetCode(); + auto const* const currentNode = vP.GetNode(); + const auto& mediumComposition = + currentNode->GetModelProperties().GetNuclearComposition(); + std::cout << "get nucleon-nucleus cross sections for target materials.." << std::endl; + // get cross sections for target materials + // using nucleon-target-nucleus cross section!!! + /* + Here we read the cross section from the interaction model again, + should be passed from GetInteractionLength if possible + */ + auto const& compVec = mediumComposition.GetComponents(); + std::vector<CrossSectionType> cross_section_of_components(compVec.size()); + + for (size_t i = 0; i < compVec.size(); ++i) { + auto const targetId = compVec[i]; + std::cout << "target component: " << targetId << std::endl; + std::cout << "beam id: " << beamId << std::endl; + const auto [sigProd, sigEla] = + hadronicInteraction_.GetCrossSection(beamId, targetId, EcmNN); + cross_section_of_components[i] = sigProd; + [[maybe_unused]] auto sigElaCopy = sigEla; // ONLY TO AVOID COMPILER WARNINGS + } + + const auto targetCode = + mediumComposition.SampleTarget(cross_section_of_components, RNG_); + std::cout << "Interaction: target selected: " << targetCode << std::endl; + /* + FOR NOW: allow nuclei with A<18 or protons only. + when medium composition becomes more complex, approximations will have to be + allowed air in atmosphere also contains some Argon. + */ + int kATarget = -1; + if (IsNucleus(targetCode)) kATarget = GetNucleusA(targetCode); + if (targetCode == corsika::Proton::GetCode()) kATarget = 1; + std::cout << "NuclearInteraction: nuclib target code: " << kATarget << std::endl; + if (!hadronicInteraction_.IsValidTarget(targetCode)) + throw std::runtime_error("target outside range. "); + // end of target sampling + + // superposition + std::cout << "NuclearInteraction: sampling nuc. multiple interaction structure.. " << std::endl; + // get nucleon-nucleon cross section + // (needed to determine number of nucleon-nucleon scatterings) + const auto protonId = corsika::Proton::GetCode(); + const auto [prodCrossSection, elaCrossSection] = + hadronicInteraction_.GetCrossSection(protonId, protonId, EcmNN); + const double sigProd = prodCrossSection / 1_mb; + const double sigEla = elaCrossSection / 1_mb; + // sample number of interactions (only input variables, output in common cnucms) + // nuclear multiple scattering according to glauber (r.i.p.) + int_nuc_(kATarget, kAProj, sigProd, sigEla); + + std::cout << "number of nucleons in target : " << kATarget << std::endl + << "number of wounded nucleons in target : " << cnucms_.na << std::endl + << "number of nucleons in projectile : " << kAProj << std::endl + << "number of wounded nucleons in project. : " << cnucms_.nb << std::endl + << "number of inel. nuc.-nuc. interactions : " << cnucms_.ni << std::endl + << "number of elastic nucleons in target : " << cnucms_.nael << std::endl + << "number of elastic nucleons in project. : " << cnucms_.nbel << std::endl + << "impact parameter: " << cnucms_.b << std::endl; + + // calculate fragmentation + std::cout << "calculating nuclear fragments.." << std::endl; + // number of interactions + // include elastic + const int nElasticNucleons = cnucms_.nbel; + const int nInelNucleons = cnucms_.nb; + const int nIntProj = nInelNucleons + nElasticNucleons; + const double impactPar = cnucms_.b; // only needed to avoid passing common var. + int nFragments; + // number of fragments is limited to 60 + int AFragments[60]; + // call fragmentation routine + // input: target A, projectile A, number of int. nucleons in projectile, impact + // parameter (fm) output: nFragments, AFragments in addition the momenta ar stored + // in pf in common fragments, neglected + fragm_(kATarget, kAProj, nIntProj, impactPar, nFragments, AFragments); + + // this should not occur but well :) + if (nFragments > GetMaxNFragments()) + throw std::runtime_error("Number of nuclear fragments in NUCLIB exceeded!"); + + std::cout << "number of fragments: " << nFragments << std::endl; + for (int j = 0; j < nFragments; ++j) + std::cout << "fragment: " << j << " A=" << AFragments[j] + << " px=" << fragments_.ppp[j][0] << " py=" << fragments_.ppp[j][1] + << " pz=" << fragments_.ppp[j][2] << std::endl; + + std::cout << "adding nuclear fragments to particle stack.." << std::endl; + // put nuclear fragments on corsika stack + for (int j = 0; j < nFragments; ++j) { + corsika::Code specCode; + const auto nuclA = AFragments[j]; + // get Z from stability line + const auto nuclZ = int(nuclA / 2.15 + 0.7); + + // TODO: do we need to catch single nucleons?? + if (nuclA == 1) + // TODO: sample neutron or proton + specCode = corsika::Code::Proton; + else + specCode = corsika::Code::Nucleus; + + // TODO: mass of nuclei? + const HEPMassType mass = + corsika::Proton::GetMass() * nuclZ + + (nuclA - nuclZ) * corsika::Neutron::GetMass(); // this neglects binding energy + + std::cout << "NuclearInteraction: adding fragment: " << specCode << std::endl; + std::cout << "NuclearInteraction: A,Z: " << nuclA << "," << nuclZ << std::endl; + std::cout << "NuclearInteraction: mass: " << mass / 1_GeV << std::endl; + + // CORSIKA 7 way + // spectators inherit momentum from original projectile + const double mass_ratio = mass / ProjMass; + + std::cout << "NuclearInteraction: mass ratio " << mass_ratio << std::endl; + + auto const Plab = PprojLab * mass_ratio; + + std::cout << "NuclearInteraction: fragment momentum: " + << Plab.GetSpaceLikeComponents().GetComponents() / 1_GeV << std::endl; + + if (nuclA == 1) + // add nucleon + vP.AddSecondary( + std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, corsika::MomentumVector, + corsika::Point, corsika::units::si::TimeType>{ + specCode, Plab.GetTimeLikeComponent(), Plab.GetSpaceLikeComponents(), + pOrig, tOrig}); + else + // add nucleus + vP.AddSecondary(std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + corsika::MomentumVector, corsika::Point, + corsika::units::si::TimeType, unsigned short, unsigned short>{ + specCode, Plab.GetTimeLikeComponent(), Plab.GetSpaceLikeComponents(), pOrig, + tOrig, nuclA, nuclZ}); + } + + // add elastic nucleons to corsika stack + // TODO: the elastic interaction could be external like the inelastic interaction, + // e.g. use existing ElasticModel + std::cout << "adding elastically scattered nucleons to particle stack.." << std::endl; + for (int j = 0; j < nElasticNucleons; ++j) { + // TODO: sample proton or neutron + auto const elaNucCode = corsika::Code::Proton; + + // CORSIKA 7 way + // elastic nucleons inherit momentum from original projectile + // neglecting momentum transfer in interaction + const double mass_ratio = corsika::GetMass(elaNucCode) / ProjMass; + auto const Plab = PprojLab * mass_ratio; + + vP.AddSecondary( + std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, corsika::MomentumVector, + corsika::Point, corsika::units::si::TimeType>{ + elaNucCode, Plab.GetTimeLikeComponent(), Plab.GetSpaceLikeComponents(), + pOrig, tOrig}); + } + + // add inelastic interactions + std::cout << "calculate inelastic nucleon-nucleon interactions.." << std::endl; + for (int j = 0; j < nInelNucleons; ++j) { + // TODO: sample neutron or proton + auto pCode = corsika::Proton::GetCode(); + // temporarily add to stack, will be removed after interaction in DoInteraction + std::cout << "inelastic interaction no. " << j << std::endl; + auto inelasticNucleon = vP.AddSecondary( + std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, corsika::MomentumVector, + corsika::Point, corsika::units::si::TimeType>{ + pCode, PprojNucLab.GetTimeLikeComponent(), + PprojNucLab.GetSpaceLikeComponents(), pOrig, tOrig}); + // create inelastic interaction + std::cout << "calling HadronicInteraction..." << std::endl; + hadronicInteraction_.DoInteraction(inelasticNucleon); + } + + std::cout << "NuclearInteraction: DoInteraction: done" << std::endl; + + return corsika::EProcessReturn::eOk; + } + +} // namespace corsika::sibyll + diff --git a/corsika/detail/modules/sibyll/ParticleConversion.inl b/corsika/detail/modules/sibyll/ParticleConversion.inl new file mode 100644 index 000000000..fbc978d2a --- /dev/null +++ b/corsika/detail/modules/sibyll/ParticleConversion.inl @@ -0,0 +1,26 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/ParticleProperties.hpp> + +using namespace corsika::sibyll; + +corsika::units::si::HEPMassType corsika::sibyll::GetSibyllMass( + corsika::Code const pCode) { + using namespace corsika::units; + using namespace corsika::units::si; + if (pCode == corsika::Code::Nucleus) + throw std::runtime_error("Cannot GetMass() of particle::Nucleus -> unspecified"); + auto sCode = ConvertToSibyllRaw(pCode); + if (sCode == 0) + throw std::runtime_error("GetSibyllMass: unknown particle!"); + else + return sqrt(get_sibyll_mass2(sCode)) * 1_GeV; +} diff --git a/corsika/framework/CMakeLists.txt b/corsika/framework/CMakeLists.txt new file mode 100644 index 000000000..8fabe1c93 --- /dev/null +++ b/corsika/framework/CMakeLists.txt @@ -0,0 +1,21 @@ +set (input_dir ${PROJECT_SOURCE_DIR}/corsika/framework/core) +set (output_dir ${PROJECT_BINARY_DIR}/corsika/framework/core) + +file (MAKE_DIRECTORY ${output_dir}) + +add_custom_command ( + OUTPUT ${output_dir}/GeneratedParticleProperties.inc + ${output_dir}/particle_db.pkl + COMMAND ${input_dir}/pdxml_reader.py ${input_dir}/ParticleData.xml ${input_dir}/NuclearData.xml ${input_dir}/ParticleClassNames.xml + DEPENDS ${input_dir}/pdxml_reader.py + ${input_dir}/ParticleData.xml + ${input_dir}/NuclearData.xml + ${input_dir}/ParticleClassNames.xml + WORKING_DIRECTORY + ${output_dir} + COMMENT "Read PYTHIA8 particle data and produce C++ source code GeneratedParticleProperties.inc" + VERBATIM + ) + +add_custom_target (GenParticlesHeaders DEPENDS ${output_dir}/GeneratedParticleProperties.inc) +add_dependencies (CORSIKA8 GenParticlesHeaders) diff --git a/corsika/framework/core/CMakeLists.txt b/corsika/framework/core/CMakeLists.txt new file mode 100644 index 000000000..c922c93da --- /dev/null +++ b/corsika/framework/core/CMakeLists.txt @@ -0,0 +1,18 @@ +add_custom_command ( + OUTPUT ${PROJECT_BINARY_DIR}/GeneratedParticleProperties.inc + ${PROJECT_BINARY_DIR}/particle_db.pkl + COMMAND ${PROJECT_SOURCE_DIR}/Framework/Particles/pdxml_reader.py + ${PROJECT_SOURCE_DIR}/Framework/Particles/ParticleData.xml + ${PROJECT_SOURCE_DIR}/Framework/Particles/NuclearData.xml + ${PROJECT_SOURCE_DIR}/Framework/Particles/ParticleClassNames.xml + DEPENDS pdxml_reader.py + ParticleData.xml + NuclearData.xml + ParticleClassNames.xml + WORKING_DIRECTORY + ${PROJECT_BINARY_DIR}/ + COMMENT "Read PYTHIA8 particle data and produce C++ source code GeneratedParticleProperties.inc" + VERBATIM + ) + +add_dependencies (CORSIKA8 ${PROJECT_BINARY_DIR}/Framework/Particles/GeneratedParticleProperties.inc) diff --git a/corsika/framework/core/Cascade.hpp b/corsika/framework/core/Cascade.hpp new file mode 100644 index 000000000..0a7bf3d7b --- /dev/null +++ b/corsika/framework/core/Cascade.hpp @@ -0,0 +1,125 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <cassert> +#include <cmath> +#include <limits> + +//FIXME: importing what from BOOST ? +#include <boost/type_index.hpp> + +#include <corsika/media/Environment.hpp> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> +#include <corsika/framework/random/ExponentialDistribution.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/random/UniformRealDistribution.hpp> +#include <corsika/framework/sequence/ProcessReturn.hpp> +#include <corsika/framework/stack/SecondaryView.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +//FIXME: importing what from BOOST ? +//using boost::typeindex::type_id_with_cvr; + +#include <fstream> + +/** + * The cascade namespace assembles all objects needed to simulate full particles cascades. + */ + +namespace corsika { + + /** + * \class Cascade + * + * The Cascade class is constructed from template arguments making + * it very versatile. Via the template arguments physics models are + * plugged into the cascade simulation. + * + * <b>TTracking</b> must be a class according to the + * TrackingInterface providing the functions: + * + * <code> + * auto GetTrack(Particle const& p)</auto>, + * with the return type <code>geometry::Trajectory<corsika::Line> + * </code> + * + * <b>TProcessList</b> must be a ProcessSequence. * + * <b>Stack</b> is the storage object for particle data, i.e. with + * Particle class type <code>Stack::ParticleType</code> + * + * + */ + template <typename TTracking, typename TProcessList, typename TStack, + typename TStackView = corsika::StackView> + class Cascade + { + + typedef typename TStack::ParticleType Particle; + typedef std::remove_pointer_t<decltype(((Particle*)nullptr)->GetNode())> VolumeTreeNode; + typedef typename VolumeTreeNode::IModelProperties MediumInterface; + + public: + + Cascade() = delete; + + Cascade(corsika::Environment<MediumInterface> const& env, TTracking& tr, + TProcessList& pl, TStack& stack): + fEnvironment(env), + fTracking(tr), + fProcessSequence(pl), + fStack(stack) + { } + + /** + * The Init function is called before the actual cascade simulations. + * All components of the Cascade simulation must be configured here. + */ + void Init(); + + /** + * set the nodes for all particles on the stack according to their numerical + * position + */ + void SetNodes(); + + /** + * The Run function is the main simulation loop, which processes + * particles from the Stack until the Stack is empty. + */ + void Run(); + + /** + * Force an interaction of the top particle of the stack at its current position. + * Note that SetNodes() or an equivalent procedure needs to be called first if you + * want to call forceInteraction() for the primary interaction. + */ + void forceInteraction(); + + private: + + void Step(Particle& vParticle); + + auto decay(Particle& particle, decltype(std::declval<TStackView>().GetProjectile()) projectile); + + auto interaction(particle_type& particle, decltype(std::declval<TStackView>().GetProjectile()) projectile) ; + + corsika::Environment<MediumInterface> const& fEnvironment; + TTracking& fTracking; + TProcessList& fProcessSequence; + TStack& fStack; + corsika::RNG& fRNG = + corsika::RNGManager::GetInstance().GetRandomStream("cascade"); + + }; + +} // namespace corsika + +#include <corsika/detail/framework/core/Cascade.inl> diff --git a/Framework/Particles/NuclearData.xml b/corsika/framework/core/NuclearData.xml similarity index 100% rename from Framework/Particles/NuclearData.xml rename to corsika/framework/core/NuclearData.xml diff --git a/Framework/Particles/ParticleClassNames.xml b/corsika/framework/core/ParticleClassNames.xml similarity index 100% rename from Framework/Particles/ParticleClassNames.xml rename to corsika/framework/core/ParticleClassNames.xml diff --git a/corsika/framework/core/ParticleData.xml b/corsika/framework/core/ParticleData.xml new file mode 100644 index 000000000..40cd64c8a --- /dev/null +++ b/corsika/framework/core/ParticleData.xml @@ -0,0 +1,9721 @@ +<chapter name="Particle Data"> + + <!-- MR: copied from Pythia 8235 --> +<particle id="0" name="void" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<!-- +<particle id="1" name="d" antiName="dbar" spinType="2" chargeType="-1" colType="1" + m0="0.33000"> +</particle> + +<particle id="2" name="u" antiName="ubar" spinType="2" chargeType="2" colType="1" + m0="0.33000"> +</particle> + +<particle id="3" name="s" antiName="sbar" spinType="2" chargeType="-1" colType="1" + m0="0.50000"> +</particle> + +<particle id="4" name="c" antiName="cbar" spinType="2" chargeType="2" colType="1" + m0="1.50000"> +</particle> + +<particle id="5" name="b" antiName="bbar" spinType="2" chargeType="-1" colType="1" + m0="4.80000"> +</particle> + +<particle id="6" name="t" antiName="tbar" spinType="2" chargeType="2" colType="1" + m0="171.00000" mWidth="1.40000" mMin="86.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000300" products="24 1"/> + <channel onMode="1" bRatio="0.0017650" products="24 3"/> + <channel onMode="1" bRatio="0.9982050" products="24 5"/> + <channel onMode="0" bRatio="0.0000000" products="37 5"/> +</particle> + +<particle id="7" name="b'" antiName="b'bar" spinType="2" chargeType="-1" colType="1" + m0="400.00000"> + <channel onMode="1" bRatio="0.0000000" products="-24 2"/> + <channel onMode="1" bRatio="0.0000000" products="-24 4"/> + <channel onMode="1" bRatio="0.0000000" products="-24 6"/> + <channel onMode="1" bRatio="1.0000000" products="-24 8"/> +</particle> + +<particle id="8" name="t'" antiName="t'bar" spinType="2" chargeType="2" colType="1" + m0="400.00000"> + <channel onMode="1" bRatio="0.0000000" products="24 1"/> + <channel onMode="1" bRatio="0.0000000" products="24 3"/> + <channel onMode="1" bRatio="0.0000000" products="24 5"/> + <channel onMode="1" bRatio="1.0000000" products="24 7"/> +</particle> +--> + +<particle id="11" name="e-" antiName="e+" spinType="2" chargeType="-3" colType="0" + m0="5.110e-04"> +</particle> + +<particle id="12" name="nu_e" antiName="nu_ebar" spinType="2" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="13" name="mu-" antiName="mu+" spinType="2" chargeType="-3" colType="0" + m0="0.10566" tau0="6.58654e+05"> + <channel onMode="1" bRatio="1.0000000" meMode="22" products="-12 11 14"/> +</particle> + +<particle id="14" name="nu_mu" antiName="nu_mubar" spinType="2" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="15" name="tau-" antiName="tau+" spinType="2" chargeType="-3" colType="0" + m0="1.77682" tau0="8.71100e-02"> + <channel onMode="1" bRatio="0.1076825" meMode="1521" products="16 -211"/> + <channel onMode="1" bRatio="0.0069601" meMode="1521" products="16 -321"/> + <channel onMode="1" bRatio="0.1772832" meMode="1531" products="16 11 -12"/> + <channel onMode="1" bRatio="0.1731072" meMode="1531" products="16 13 -14"/> + <channel onMode="1" bRatio="0.2537447" meMode="1532" products="16 111 -211"/> + <channel onMode="1" bRatio="0.0015809" meMode="1532" products="16 311 -321"/> + <channel onMode="1" bRatio="0.0001511" meMode="1532" products="16 221 -321"/> + <channel onMode="1" bRatio="0.0083521" meMode="1533" products="16 -211 -311"/> + <channel onMode="1" bRatio="0.0042655" meMode="1533" products="16 111 -321"/> + <channel onMode="1" bRatio="0.0924697" meMode="1541" products="16 111 111 -211"/> + <channel onMode="1" bRatio="0.0925691" meMode="1541" products="16 -211 -211 211"/> + <channel onMode="1" bRatio="0.0039772" meMode="1542" products="16 111 -211 -311"/> + <channel onMode="1" bRatio="0.0034701" meMode="1542" products="16 -211 211 -321"/> + <channel onMode="1" bRatio="0.0014318" meMode="1542" products="16 -211 -321 321"/> + <channel onMode="1" bRatio="0.0015809" meMode="1542" products="16 111 311 -321"/> + <channel onMode="1" bRatio="0.0011932" meMode="1542" products="16 130 -211 310"/> + <channel onMode="1" bRatio="0.0006463" meMode="1542" products="16 111 111 -321"/> + <channel onMode="1" bRatio="0.0002386" meMode="1542" products="16 130 130 -211"/> + <channel onMode="1" bRatio="0.0002386" meMode="1542" products="16 -211 310 310"/> + <channel onMode="1" bRatio="0.0013821" meMode="1543" products="16 111 -211 221"/> + <channel onMode="1" bRatio="0.0017520" meMode="1544" products="16 22 111 -211"/> + <channel onMode="1" bRatio="0.0459365" meMode="1551" products="16 111 -211 -211 211"/> + <channel onMode="1" bRatio="0.0104401" meMode="1551" products="16 111 111 111 -211"/> + <channel onMode="1" bRatio="0.0049069" meMode="1561" products="16 111 111 -211 -211 211"/> + <channel onMode="1" bRatio="0.0009515" meMode="1561" products="16 111 111 111 111 -211"/> + <channel onMode="1" bRatio="0.0008342" meMode="1561" products="16 -211 -211 -211 211 211"/> + <channel onMode="1" bRatio="0.0001631" meMode="0" products="16 -211 -211 211 221"/> + <channel onMode="1" bRatio="0.0001491" meMode="0" products="16 111 111 -211 221"/> + <channel onMode="1" bRatio="0.0001392" meMode="0" products="16 111 111 -211 223"/> + <channel onMode="1" bRatio="0.0001193" meMode="0" products="16 -211 -211 211 223"/> + <channel onMode="1" bRatio="0.0004077" meMode="0" products="16 223 -321"/> + <channel onMode="1" bRatio="0.0004773" meMode="0" products="16 111 111 111 -321"/> + <channel onMode="1" bRatio="0.0003052" meMode="0" products="16 111 -211 211 -321"/> + <channel onMode="1" bRatio="0.0002784" meMode="0" products="16 221 -323"/> + <channel onMode="1" bRatio="0.0002366" meMode="0" products="16 111 111 -211 -311"/> + <channel onMode="1" bRatio="0.0002237" meMode="0" products="16 -211 -211 211 -311"/> + <channel onMode="1" bRatio="0.0002953" meMode="0" products="16 111 -211 -311 311"/> + <channel onMode="1" bRatio="0.0000590" meMode="0" products="16 111 -211 -321 321"/> +</particle> + +<particle id="16" name="nu_tau" antiName="nu_taubar" spinType="2" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<!-- +<particle id="17" name="tau'-" antiName="tau'+" spinType="2" chargeType="-3" colType="0" + m0="400.00000"> + <channel onMode="1" bRatio="1.0000000" products="-24 18"/> +</particle> +--> + +<!-- +<particle id="18" name="nu'_tau" antiName="nu'_taubar" spinType="2" chargeType="0" colType="0" + m0="400.00000"> + <channel onMode="1" bRatio="1.0000000" products="24 17"/> +</particle> +--> + +<!-- +<particle id="21" name="g" spinType="3" chargeType="0" colType="2" + m0="0.00000"> +</particle> +--> + +<particle id="22" name="gamma" spinType="3" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<!-- +<particle id="23" name="Z0" spinType="3" chargeType="0" colType="0" + m0="91.18760" mWidth="2.49520" mMin="10.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.1539950" products="1 -1"/> + <channel onMode="1" bRatio="0.1194200" products="2 -2"/> + <channel onMode="1" bRatio="0.1539840" products="3 -3"/> + <channel onMode="1" bRatio="0.1192590" products="4 -4"/> + <channel onMode="1" bRatio="0.1522720" products="5 -5"/> + <channel onMode="1" bRatio="0.0335760" products="11 -11"/> + <channel onMode="1" bRatio="0.0668060" products="12 -12"/> + <channel onMode="1" bRatio="0.0335760" products="13 -13"/> + <channel onMode="1" bRatio="0.0668060" products="14 -14"/> + <channel onMode="1" bRatio="0.0335000" products="15 -15"/> + <channel onMode="1" bRatio="0.0668060" products="16 -16"/> +</particle> + +<particle id="24" name="W+" antiName="W-" spinType="3" chargeType="3" colType="0" + m0="80.38500" mWidth="2.08500" mMin="10.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.3213690" products="-1 2"/> + <channel onMode="1" bRatio="0.0164940" products="-1 4"/> + <channel onMode="1" bRatio="0.0165020" products="-3 2"/> + <channel onMode="1" bRatio="0.3206150" products="-3 4"/> + <channel onMode="1" bRatio="0.0000100" products="-5 2"/> + <channel onMode="1" bRatio="0.0005910" products="-5 4"/> + <channel onMode="1" bRatio="0.1081660" products="-11 12"/> + <channel onMode="1" bRatio="0.1081660" products="-13 14"/> + <channel onMode="1" bRatio="0.1080870" products="-15 16"/> +</particle> + +<particle id="25" name="h0" spinType="1" chargeType="0" colType="0" + m0="125.00000" mWidth="0.00374" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000009" products="1 -1"/> + <channel onMode="1" bRatio="0.0000002" products="2 -2"/> + <channel onMode="1" bRatio="0.0002361" products="3 -3"/> + <channel onMode="1" bRatio="0.0335602" products="4 -4"/> + <channel onMode="1" bRatio="0.5876728" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="11 -11"/> + <channel onMode="1" bRatio="0.0002445" products="13 -13"/> + <channel onMode="1" bRatio="0.0690800" products="15 -15"/> + <channel onMode="1" bRatio="0.0630585" products="21 21"/> + <channel onMode="1" bRatio="0.0028438" products="22 22"/> + <channel onMode="1" bRatio="0.0017601" products="22 23"/> + <channel onMode="1" bRatio="0.0259708" products="23 23"/> + <channel onMode="1" bRatio="0.2155720" products="24 -24"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000022 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000023 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000023 1000023"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000025 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000025 1000023"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000025 1000025"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000023"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000025"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000035"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000024 -1000024"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000024 -1000037"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000037 -1000024"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000037 -1000037"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000001 -1000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000001 -2000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000001 -2000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000001 2000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000002 -1000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000002 -2000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000002 -2000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000002 2000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000003 -1000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000003 -2000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000003 -2000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000003 2000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000004 -1000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000004 -2000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000004 -2000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000004 2000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000005 -1000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000005 -2000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000005 -2000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000005 2000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000006 -1000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000006 -2000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000006 -2000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000006 2000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000011 -1000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000011 -2000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000011 -2000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000011 2000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000012 -1000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000012 -2000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000012 -2000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000012 2000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000013 -1000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000013 -2000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000013 -2000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000013 2000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000014 -1000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000014 -2000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000014 -2000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000014 2000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000015 -1000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000015 -2000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000015 -2000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000015 2000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000016 -1000016"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000016 -2000016"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000016 -2000016"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000016 2000016"/> +</particle> + +<particle id="32" name="Z'0" spinType="3" chargeType="0" colType="0" + m0="500.00000" mWidth="14.54029" mMin="10.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.1458350" products="1 -1"/> + <channel onMode="1" bRatio="0.1132760" products="2 -2"/> + <channel onMode="1" bRatio="0.1458350" products="3 -3"/> + <channel onMode="1" bRatio="0.1132710" products="4 -4"/> + <channel onMode="1" bRatio="0.1457810" products="5 -5"/> + <channel onMode="1" bRatio="0.0490020" products="6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="7 -7"/> + <channel onMode="1" bRatio="0.0000000" products="8 -8"/> + <channel onMode="1" bRatio="0.0320250" products="11 -11"/> + <channel onMode="1" bRatio="0.0636420" products="12 -12"/> + <channel onMode="1" bRatio="0.0320250" products="13 -13"/> + <channel onMode="1" bRatio="0.0636420" products="14 -14"/> + <channel onMode="1" bRatio="0.0320220" products="15 -15"/> + <channel onMode="1" bRatio="0.0636420" products="16 -16"/> + <channel onMode="1" bRatio="0.0000000" products="17 -17"/> + <channel onMode="1" bRatio="0.0000000" products="18 -18"/> + <channel onMode="1" bRatio="0.0000000" products="24 -24"/> +</particle> + +<particle id="33" name="Z''0" spinType="3" chargeType="0" colType="0" + m0="900.00000"> +</particle> + +<particle id="34" name="W'+" antiName="W'-" spinType="3" chargeType="3" colType="0" + m0="500.00000" mWidth="16.66099" mMin="10.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.2512250" products="-1 2"/> + <channel onMode="1" bRatio="0.0129000" products="-1 4"/> + <channel onMode="1" bRatio="0.0000060" products="-1 6"/> + <channel onMode="1" bRatio="0.0129000" products="-3 2"/> + <channel onMode="1" bRatio="0.2507640" products="-3 4"/> + <channel onMode="1" bRatio="0.0003800" products="-3 6"/> + <channel onMode="1" bRatio="0.0000080" products="-5 2"/> + <channel onMode="1" bRatio="0.0004650" products="-5 4"/> + <channel onMode="1" bRatio="0.2154180" products="-5 6"/> + <channel onMode="1" bRatio="0.0853120" products="-11 12"/> + <channel onMode="1" bRatio="0.0853120" products="-13 14"/> + <channel onMode="1" bRatio="0.0853100" products="-15 16"/> + <channel onMode="1" bRatio="0.0000000" products="24 23"/> +</particle> + +<particle id="35" name="H0" spinType="1" chargeType="0" colType="0" + m0="300.00000" mWidth="8.38842" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" products="1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="3 -3"/> + <channel onMode="1" bRatio="0.0000490" products="4 -4"/> + <channel onMode="1" bRatio="0.0007740" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="13 -13"/> + <channel onMode="1" bRatio="0.0000740" products="15 -15"/> + <channel onMode="1" bRatio="0.0004170" products="21 21"/> + <channel onMode="1" bRatio="0.0000150" products="22 22"/> + <channel onMode="1" bRatio="0.0000610" products="22 23"/> + <channel onMode="1" bRatio="0.3067100" products="23 23"/> + <channel onMode="1" bRatio="0.6890110" products="24 -24"/> + <channel onMode="1" bRatio="0.0000000" products="23 25"/> + <channel onMode="1" bRatio="0.0028890" products="25 25"/> + <channel onMode="1" bRatio="0.0000000" products="24 -37"/> + <channel onMode="1" bRatio="0.0000000" products="37 -24"/> + <channel onMode="1" bRatio="0.0000000" products="23 36"/> + <channel onMode="1" bRatio="0.0000000" products="25 36"/> + <channel onMode="1" bRatio="0.0000000" products="36 36"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000022 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000023 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000023 1000023"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000025 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000025 1000023"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000025 1000025"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000023"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000025"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000035"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000024 -1000024"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000024 -1000037"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000037 -1000024"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000037 -1000037"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000001 -1000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000001 -2000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000001 -2000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000001 2000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000002 -1000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000002 -2000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000002 -2000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000002 2000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000003 -1000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000003 -2000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000003 -2000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000003 2000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000004 -1000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000004 -2000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000004 -2000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000004 2000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000005 -1000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000005 -2000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000005 -2000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000005 2000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000006 -1000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000006 -2000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000006 -2000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000006 2000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000011 -1000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000011 -2000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000011 -2000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000011 2000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000012 -1000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000012 -2000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000012 -2000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000012 2000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000013 -1000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000013 -2000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000013 -2000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000013 2000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000014 -1000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000014 -2000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000014 -2000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000014 2000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000015 -1000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000015 -2000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000015 -2000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000015 2000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000016 -1000016"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000016 -2000016"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000016 -2000016"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000016 2000016"/> +</particle> + +<particle id="36" name="A0" spinType="1" chargeType="0" colType="0" + m0="300.00000" mWidth="3.37520" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" products="1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="2 -2"/> + <channel onMode="1" bRatio="0.0000010" products="3 -3"/> + <channel onMode="1" bRatio="0.0001210" products="4 -4"/> + <channel onMode="1" bRatio="0.0019240" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="11 -11"/> + <channel onMode="1" bRatio="0.0000010" products="13 -13"/> + <channel onMode="1" bRatio="0.0001840" products="15 -15"/> + <channel onMode="1" bRatio="0.0031060" products="21 21"/> + <channel onMode="1" bRatio="0.0000150" products="22 22"/> + <channel onMode="1" bRatio="0.0000030" products="22 23"/> + <channel onMode="1" bRatio="0.0000000" products="23 23"/> + <channel onMode="1" bRatio="0.0000000" products="24 -24"/> + <channel onMode="1" bRatio="0.9946460" products="23 25"/> + <channel onMode="1" bRatio="0.0000000" products="25 25"/> + <channel onMode="1" bRatio="0.0000000" products="24 -37"/> + <channel onMode="1" bRatio="0.0000000" products="37 -24"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000022 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000023 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000023 1000023"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000025 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000025 1000023"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000025 1000025"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000022"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000023"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000025"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000035"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000024 -1000024"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000024 -1000037"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000037 -1000024"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000037 -1000037"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000001 -1000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000001 -2000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000001 -2000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000001 2000001"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000002 -1000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000002 -2000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000002 -2000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000002 2000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000003 -1000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000003 -2000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000003 -2000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000003 2000003"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000004 -1000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000004 -2000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000004 -2000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000004 2000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000005 -1000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000005 -2000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000005 -2000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000005 2000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000006 -1000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000006 -2000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000006 -2000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000006 2000006"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000011 -1000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000011 -2000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000011 -2000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000011 2000011"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000012 -1000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000012 -2000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000012 -2000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000012 2000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000013 -1000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000013 -2000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000013 -2000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000013 2000013"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000014 -1000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000014 -2000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000014 -2000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000014 2000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000015 -1000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000015 -2000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000015 -2000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000015 2000015"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000016 -1000016"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000016 -2000016"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000016 -2000016"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000016 2000016"/> +</particle> + +<particle id="37" name="H+" antiName="H-" spinType="1" chargeType="3" colType="0" + m0="300.00000" mWidth="4.17669" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" products="-1 2"/> + <channel onMode="1" bRatio="0.0000210" products="-3 4"/> + <channel onMode="1" bRatio="0.0901350" products="-5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 12"/> + <channel onMode="1" bRatio="0.0000130" products="-13 14"/> + <channel onMode="1" bRatio="0.0037140" products="-15 16"/> + <channel onMode="1" bRatio="0.9061170" products="24 25"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000022 1000024"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000022 1000037"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000023 1000024"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000023 1000037"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000025 1000024"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000025 1000037"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000024"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000035 1000037"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000006 -1000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000006 -1000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000006 -2000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="2000006 -2000005"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000001 1000002"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000003 1000004"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000011 1000012"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000013 1000014"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-1000015 1000016"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="-2000015 1000016"/> +</particle> + +<particle id="39" name="Graviton" spinType="5" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="40" name="BlackHole" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="41" name="R0" antiName="Rbar0" spinType="3" chargeType="0" colType="0" + m0="5.000e+03" mWidth="4.173e+02" mMin="1.000e+02" mMax="0.000e+00"> + <channel onMode="1" bRatio="0.2151190" products="1 -3"/> + <channel onMode="1" bRatio="0.2151190" products="2 -4"/> + <channel onMode="1" bRatio="0.2151190" products="3 -5"/> + <channel onMode="1" bRatio="0.2147240" products="4 -6"/> + <channel onMode="1" bRatio="0.0699600" products="11 -13"/> + <channel onMode="1" bRatio="0.0699590" products="13 -15"/> +</particle> + +<particle id="42" name="LQ_ue" antiName="LQ_uebar" spinType="1" chargeType="-1" colType="1" + m0="200.00000" mWidth="0.39162" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" products="2 11"/> +</particle> + +<particle id="45" name="H_3" spinType="1" chargeType="0" colType="0" + m0="500.00000"> +</particle> + +<particle id="46" name="A_2" spinType="1" chargeType="0" colType="0" + m0="500.00000"> +</particle> + +<particle id="51" name="DM(s=0)" antiName="DMbar(s=0)" spinType="1" chargeType="0" colType="0" + m0="100.00000"> +</particle> + +<particle id="52" name="DM(s=1/2)" antiName="DMbar(s=1/2)" spinType="2" chargeType="0" colType="0" + m0="100.00000"> +</particle> + +<particle id="53" name="DM(s=1)" antiName="DMbar(s=1)" spinType="3" chargeType="0" colType="0" + m0="100.00000"> +</particle> + +<particle id="54" name="DMmed(s=0)" antiName="DMmedbar(s=0)" spinType="1" chargeType="0" colType="0" + m0="500.00000" mWidth="0.1" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.000" products=" 1 -1"/> + <channel onMode="1" bRatio="0.000" products=" 2 -2"/> + <channel onMode="1" bRatio="0.000" products=" 3 -3"/> + <channel onMode="1" bRatio="0.000" products=" 4 -4"/> + <channel onMode="1" bRatio="0.300" products=" 5 -5"/> + <channel onMode="1" bRatio="0.000" products=" 6 -6"/> + <channel onMode="1" bRatio="0.000" products="11 -11"/> + <channel onMode="1" bRatio="0.000" products="12 -12"/> + <channel onMode="1" bRatio="0.000" products="13 -13"/> + <channel onMode="1" bRatio="0.000" products="14 -14"/> + <channel onMode="1" bRatio="0.000" products="15 -15"/> + <channel onMode="1" bRatio="0.000" products="16 -16"/> + <channel onMode="1" bRatio="0.100" products="21 21"/> + <channel onMode="1" bRatio="0.000" products="22 22"/> + <channel onMode="1" bRatio="0.000" products="22 23"/> + <channel onMode="1" bRatio="0.000" products="23 23"/> + <channel onMode="1" bRatio="0.000" products="24 -24"/> + <channel onMode="1" bRatio="0.000" products="25 25"/> + <channel onMode="1" bRatio="0.000" products="51 -51"/> + <channel onMode="1" bRatio="0.000" products="51 51"/> + <channel onMode="1" bRatio="0.600" products="52 -52"/> + <channel onMode="1" bRatio="0.000" products="52 52"/> + <channel onMode="1" bRatio="0.000" products="53 -53"/> + <channel onMode="1" bRatio="0.000" products="53 53"/> +</particle> + +<particle id="55" name="DMmed(s=1)" antiName="DMmedbar(s=1)" spinType="3" chargeType="0" colType="0" + m0="500.00000" mWidth="0.1" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.050" products=" 1 -1"/> + <channel onMode="1" bRatio="0.050" products=" 2 -2"/> + <channel onMode="1" bRatio="0.050" products=" 3 -3"/> + <channel onMode="1" bRatio="0.050" products=" 4 -4"/> + <channel onMode="1" bRatio="0.050" products=" 5 -5"/> + <channel onMode="1" bRatio="0.050" products=" 6 -6"/> + <channel onMode="1" bRatio="0.050" products="11 -11"/> + <channel onMode="1" bRatio="0.050" products="12 -12"/> + <channel onMode="1" bRatio="0.050" products="13 -13"/> + <channel onMode="1" bRatio="0.050" products="14 -14"/> + <channel onMode="1" bRatio="0.050" products="15 -15"/> + <channel onMode="1" bRatio="0.050" products="16 -16"/> + <channel onMode="1" bRatio="0.025" products="21 21"/> + <channel onMode="1" bRatio="0.025" products="22 22"/> + <channel onMode="1" bRatio="0.050" products="22 23"/> + <channel onMode="1" bRatio="0.050" products="23 23"/> + <channel onMode="1" bRatio="0.050" products="24 -24"/> + <channel onMode="1" bRatio="0.050" products="25 25"/> + <channel onMode="1" bRatio="0.025" products="51 -51"/> + <channel onMode="1" bRatio="0.025" products="51 51"/> + <channel onMode="1" bRatio="0.025" products="52 -52"/> + <channel onMode="1" bRatio="0.025" products="52 52"/> + <channel onMode="1" bRatio="0.025" products="53 -53"/> + <channel onMode="1" bRatio="0.025" products="53 53"/> +</particle> + +<particle id="56" name="DM?1" antiName="DMbar?1" spinType="1" chargeType="0" colType="0" + m0="100.00000"> +</particle> + +<particle id="57" name="DM?2" antiName="DMbar?1" spinType="1" chargeType="0" colType="0" + m0="100.00000"> +</particle> + +<particle id="58" name="DM?3" antiName="DMbar?3" spinType="1" chargeType="0" colType="0" + m0="100.00000"> +</particle> + +<particle id="59" name="DM?4" antiName="DMbar?4" spinType="1" chargeType="0" colType="0" + m0="100.00000"> +</particle> + +<particle id="60" name="DM?5" antiName="DMbar?5" spinType="1" chargeType="0" colType="0" + m0="100.00000"> +</particle> + +<particle id="81" name="specflav" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="82" name="rndmflavq" antiName="rndmflavqbar" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="83" name="rndmflavg" antiName="rndmflavgbar" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="90" name="system" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="93" name="Z0copy" spinType="3" chargeType="0" colType="0" + m0="91.18760" mWidth="2.49520" mMin="10.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.1539950" products="1 -1"/> + <channel onMode="1" bRatio="0.1194200" products="2 -2"/> + <channel onMode="1" bRatio="0.1539840" products="3 -3"/> + <channel onMode="1" bRatio="0.1192590" products="4 -4"/> + <channel onMode="1" bRatio="0.1522720" products="5 -5"/> + <channel onMode="1" bRatio="0.0335760" products="11 -11"/> + <channel onMode="1" bRatio="0.0668060" products="12 -12"/> + <channel onMode="1" bRatio="0.0335760" products="13 -13"/> + <channel onMode="1" bRatio="0.0668060" products="14 -14"/> + <channel onMode="1" bRatio="0.0335000" products="15 -15"/> + <channel onMode="1" bRatio="0.0668060" products="16 -16"/> +</particle> + +<particle id="94" name="W+copy" antiName="W-copy" spinType="3" chargeType="3" colType="0" + m0="80.38500" mWidth="2.08500" mMin="10.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.3213690" products="-1 2"/> + <channel onMode="1" bRatio="0.0164940" products="-1 4"/> + <channel onMode="1" bRatio="0.0165020" products="-3 2"/> + <channel onMode="1" bRatio="0.3206150" products="-3 4"/> + <channel onMode="1" bRatio="0.0000100" products="-5 2"/> + <channel onMode="1" bRatio="0.0005910" products="-5 4"/> + <channel onMode="1" bRatio="0.1081660" products="-11 12"/> + <channel onMode="1" bRatio="0.1081660" products="-13 14"/> + <channel onMode="1" bRatio="0.1080870" products="-15 16"/> +</particle> + +<particle id="110" name="Reggeon" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> +--> + +<particle id="111" name="pi0" spinType="1" chargeType="0" colType="0" + m0="0.13498" tau0="2.55313e-05"> + <channel onMode="1" bRatio="0.9879900" products="22 22"/> + <channel onMode="1" bRatio="0.0119800" meMode="11" products="22 11 -11"/> + <channel onMode="1" bRatio="0.0000300" meMode="13" products="11 -11 11 -11"/> +</particle> + +<particle id="113" name="rho0" spinType="3" chargeType="0" colType="0" + m0="0.77549" mWidth="0.14910" mMin="0.30000" mMax="1.50000"> + <channel onMode="1" bRatio="0.9988447" meMode="2" products="211 -211"/> + <channel onMode="1" bRatio="0.0005993" products="111 22"/> + <channel onMode="1" bRatio="0.0002997" products="221 22"/> + <channel onMode="1" bRatio="0.0001009" meMode="1" products="211 -211 111"/> + <channel onMode="1" bRatio="0.0000471" products="11 -11"/> + <channel onMode="1" bRatio="0.0000454" products="13 -13"/> + <channel onMode="1" bRatio="0.0000449" products="111 111 22"/> + <channel onMode="1" bRatio="0.0000180" products="211 -211 211 -211"/> +</particle> + +<!-- +<particle id="115" name="a_20" spinType="5" chargeType="0" colType="0" + m0="1.31830" mWidth="0.10700" mMin="1.00000" mMax="1.70000"> + <channel onMode="1" bRatio="0.3483455" products="213 -211"/> + <channel onMode="1" bRatio="0.3483455" products="-213 211"/> + <channel onMode="1" bRatio="0.1440000" products="221 111"/> + <channel onMode="1" bRatio="0.1050000" products="223 211 -211"/> + <channel onMode="1" bRatio="0.0245000" products="321 -321"/> + <channel onMode="1" bRatio="0.0122500" products="130 130"/> + <channel onMode="1" bRatio="0.0122500" products="310 310"/> + <channel onMode="1" bRatio="0.0053000" products="331 111"/> + <channel onMode="1" bRatio="0.0000090" products="22 22"/> +</particle> +--> + +<particle id="130" name="K_L0" spinType="1" chargeType="0" colType="0" + m0="0.49761" tau0="1.53300e+04"> + <channel onMode="1" bRatio="0.1952278" products="111 111 111"/> + <channel onMode="1" bRatio="0.1254178" products="211 -211 111"/> + <channel onMode="1" bRatio="0.2027688" meMode="22" products="-12 11 211"/> + <channel onMode="1" bRatio="0.2027688" meMode="22" products="12 -11 -211"/> + <channel onMode="1" bRatio="0.1352191" meMode="22" products="-14 13 211"/> + <channel onMode="1" bRatio="0.1352191" meMode="22" products="14 -13 -211"/> + <channel onMode="1" bRatio="0.0019673" products="211 -211"/> + <channel onMode="1" bRatio="0.0008641" products="111 111"/> + <channel onMode="1" bRatio="0.0005471" products="22 22"/> +</particle> + +<particle id="211" name="pi+" antiName="pi-" spinType="1" chargeType="3" colType="0" + m0="0.13957" tau0="7.80450e+03"> + <channel onMode="1" bRatio="0.9998770" products="-13 14"/> + <channel onMode="1" bRatio="0.0001230" products="-11 12"/> +</particle> + +<particle id="213" name="rho+" antiName="rho-" spinType="3" chargeType="3" colType="0" + m0="0.77549" mWidth="0.14910" mMin="0.30000" mMax="1.50000"> + <channel onMode="1" bRatio="0.9995502" meMode="2" products="211 111"/> + <channel onMode="1" bRatio="0.0004498" products="211 22"/> +</particle> + +<particle id="100211" name="pi(1300)+" antiName="pi(1300)-" spinType="1" chargeType="3" colType="0" + m0="1.300" mWidth="0.200"> +</particle> + +<particle id="100111" name="pi(1300)0" spinType="1" chargeType="3" colType="0" + m0="1.300" mWidth="0.200"> +</particle> + +<!-- +<particle id="215" name="a_2+" antiName="a_2-" spinType="5" chargeType="3" colType="0" + m0="1.31830" mWidth="0.10700" mMin="1.00000" mMax="1.70000"> + <channel onMode="1" bRatio="0.3480100" products="213 111"/> + <channel onMode="1" bRatio="0.3480100" products="113 211"/> + <channel onMode="1" bRatio="0.1440000" products="221 211"/> + <channel onMode="1" bRatio="0.1040000" products="223 211 111"/> + <channel onMode="1" bRatio="0.0480000" products="321 -311"/> + <channel onMode="1" bRatio="0.0053000" products="331 211"/> + <channel onMode="1" bRatio="0.0026800" products="211 22"/> +</particle> +--> + +<particle id="221" name="eta" spinType="1" chargeType="0" colType="0" + m0="0.54785" tau0="1.51e-07"> + <channel onMode="1" bRatio="0.3931181" products="22 22"/> + <channel onMode="1" bRatio="0.3257150" products="111 111 111"/> + <channel onMode="1" bRatio="0.0002700" products="111 22 22"/> + <channel onMode="1" bRatio="0.2274105" products="211 -211 111"/> + <channel onMode="1" bRatio="0.0460021" products="211 -211 22"/> + <channel onMode="1" bRatio="0.0069003" meMode="11" products="22 11 -11"/> + <channel onMode="1" bRatio="0.0003100" meMode="11" products="22 13 -13"/> + <channel onMode="1" bRatio="0.0000060" products="13 -13"/> + <channel onMode="1" bRatio="0.0002680" meMode="12" products="211 -211 11 -11"/> +</particle> + +<particle id="223" name="omega" spinType="3" chargeType="0" colType="0" + m0="0.78265" mWidth="0.00849" mMin="0.50000" mMax="1.10000"> + <channel onMode="1" bRatio="0.8994773" meMode="1" products="211 -211 111"/> + <channel onMode="1" bRatio="0.0834941" products="111 22"/> + <channel onMode="1" bRatio="0.0154283" meMode="2" products="211 -211"/> + <channel onMode="1" bRatio="0.0004639" products="221 22"/> + <channel onMode="1" bRatio="0.0007765" meMode="11" products="111 11 -11"/> + <channel onMode="1" bRatio="0.0001311" meMode="11" products="111 13 -13"/> + <channel onMode="1" bRatio="0.0000728" products="11 -11"/> + <channel onMode="1" bRatio="0.0000900" products="13 -13"/> + <channel onMode="1" bRatio="0.0000660" products="111 111 22"/> +</particle> + +<!-- +<particle id="225" name="f_2" spinType="5" chargeType="0" colType="0" + m0="1.27510" mWidth="0.18510" mMin="0.60000" mMax="2.00000"> + <channel onMode="1" bRatio="0.5653260" products="211 -211"/> + <channel onMode="1" bRatio="0.2826600" products="111 111"/> + <channel onMode="1" bRatio="0.0710000" products="211 -211 111 111"/> + <channel onMode="1" bRatio="0.0280000" products="211 -211 211 -211"/> + <channel onMode="1" bRatio="0.0230000" products="321 -321"/> + <channel onMode="1" bRatio="0.0115000" products="130 130"/> + <channel onMode="1" bRatio="0.0115000" products="310 310"/> + <channel onMode="1" bRatio="0.0040000" products="221 221"/> + <channel onMode="1" bRatio="0.0030000" products="111 111 111 111"/> + <channel onMode="1" bRatio="0.0000140" products="22 22"/> +</particle> +--> + +<particle id="310" name="K_S0" spinType="1" chargeType="0" colType="0" + m0="0.49761" tau0="2.68420e+01"> + <channel onMode="1" bRatio="0.6922420" products="211 -211"/> + <channel onMode="1" bRatio="0.3070073" products="111 111"/> + <channel onMode="1" bRatio="0.0000479" meMode="12" products="211 -211 11 -11"/> + <channel onMode="1" bRatio="0.0003501" meMode="22" products="-12 11 211"/> + <channel onMode="1" bRatio="0.0003501" meMode="22" products="12 -11 -211"/> + <channel onMode="1" bRatio="0.0000026" products="22 22"/> +</particle> + +<particle id="311" name="K0" antiName="Kbar0" spinType="1" chargeType="0" colType="0" + m0="0.49761" tau0="1e-15"> + <channel onMode="1" bRatio="0.5000000" products="130"/> + <channel onMode="1" bRatio="0.5000000" products="310"/> +</particle> + +<particle id="313" name="K*0" antiName="K*bar0" spinType="3" chargeType="0" colType="0" + m0="0.89594" mWidth="0.04870" mMin="0.65000" mMax="1.20000"> + <channel onMode="1" bRatio="0.6649467" meMode="2" products="321 -211"/> + <channel onMode="1" bRatio="0.3326633" meMode="2" products="311 111"/> + <channel onMode="1" bRatio="0.0023900" products="311 22"/> +</particle> + +<particle id="10311" name="K*0(1430)0" antiName="K*0(1430)0bar" spinType="1" chargeType="0" colType="0" + m0="1.425" mWidth="0.270" mMin="1.3750" mMax="1.4750"> +</particle> + +<particle id="10321" name="K*0(1430)+" antiName="K*0(1430)bar-" spinType="1" chargeType="0" colType="0" + m0="1.425" mWidth="0.270" mMin="1.3750" mMax="1.4750"> +</particle> + +<!-- +<particle id="315" name="K*_2(1430)0" antiName="K*_2(1430)bar0" spinType="5" chargeType="0" colType="0" + m0="1.43240" mWidth="0.10900" mMin="1.10000" mMax="1.80000"> + <channel onMode="1" bRatio="0.3335002" products="321 -211"/> + <channel onMode="1" bRatio="0.1667502" products="311 111"/> + <channel onMode="1" bRatio="0.1650794" products="323 -211"/> + <channel onMode="1" bRatio="0.0825397" products="313 111"/> + <channel onMode="1" bRatio="0.0892231" products="323 -211 111"/> + <channel onMode="1" bRatio="0.0451128" products="313 211 -211"/> + <channel onMode="1" bRatio="0.0581454" products="321 -213"/> + <channel onMode="1" bRatio="0.0290727" products="311 113"/> + <channel onMode="1" bRatio="0.0290727" products="311 223"/> + <channel onMode="1" bRatio="0.0015038" products="311 221"/> +</particle> +--> + +<particle id="321" name="K+" antiName="K-" spinType="1" chargeType="3" colType="0" + m0="0.49368" tau0="3.71300e+03"> + <channel onMode="1" bRatio="0.6355250" products="-13 14"/> + <channel onMode="1" bRatio="0.0000158" products="-11 12"/> + <channel onMode="1" bRatio="0.2066081" products="211 111"/> + <channel onMode="1" bRatio="0.0559022" products="211 211 -211"/> + <channel onMode="1" bRatio="0.0176107" products="211 111 111"/> + <channel onMode="1" bRatio="0.0507020" meMode="22" products="12 -11 111"/> + <channel onMode="1" bRatio="0.0335313" meMode="22" products="14 -13 111"/> + <channel onMode="1" bRatio="0.0000220" products="-11 12 111 111"/> + <channel onMode="1" bRatio="0.0000409" products="-11 12 211 -211"/> + <channel onMode="1" bRatio="0.0000140" products="-13 14 111 111"/> + <channel onMode="1" bRatio="0.0000280" products="-13 14 211 -211"/> +</particle> + +<particle id="323" name="K*+" antiName="K*-" spinType="3" chargeType="3" colType="0" + m0="0.89166" mWidth="0.05080" mMin="0.65000" mMax="1.20000"> + <channel onMode="1" bRatio="0.6660067" meMode="2" products="311 211"/> + <channel onMode="1" bRatio="0.3330033" meMode="2" products="321 111"/> + <channel onMode="1" bRatio="0.0009900" products="321 22"/> +</particle> + +<!-- +<particle id="325" name="K*_2(1430)+" antiName="K*_2(1430)-" spinType="5" chargeType="3" colType="0" + m0="1.42560" mWidth="0.09850" mMin="1.10000" mMax="1.80000"> + <channel onMode="1" bRatio="0.3330333" products="311 211"/> + <channel onMode="1" bRatio="0.1660166" products="321 111"/> + <channel onMode="1" bRatio="0.1646498" products="313 211"/> + <channel onMode="1" bRatio="0.0823749" products="323 111"/> + <channel onMode="1" bRatio="0.0890089" products="313 211 111"/> + <channel onMode="1" bRatio="0.0450045" products="323 211 -211"/> + <channel onMode="1" bRatio="0.0580058" products="311 213"/> + <channel onMode="1" bRatio="0.0290029" products="321 113"/> + <channel onMode="1" bRatio="0.0290029" products="321 223"/> + <channel onMode="1" bRatio="0.0015002" products="321 221"/> + <channel onMode="1" bRatio="0.0024002" products="321 22"/> +</particle> +--> + +<particle id="331" name="eta'" spinType="1" chargeType="0" colType="0" + m0="0.95778" mWidth="0.00020" mMin="0.95578" mMax="0.95978"> + <channel onMode="1" bRatio="0.4365815" products="211 -211 221"/> + <channel onMode="1" bRatio="0.2947428" products="113 22"/> + <channel onMode="1" bRatio="0.2172848" products="111 111 221"/> + <channel onMode="1" bRatio="0.0276636" products="223 22"/> + <channel onMode="1" bRatio="0.0219297" products="22 22"/> + <channel onMode="1" bRatio="0.0016900" products="111 111 111"/> + <channel onMode="1" bRatio="0.0001076" products="13 -13 22"/> +</particle> + +<particle id="333" name="phi" spinType="3" chargeType="0" colType="0" + m0="1.01946" mWidth="0.00426" mMin="1.00000" mMax="1.04000"> + <channel onMode="1" bRatio="0.4893042" meMode="2" products="321 -321"/> + <channel onMode="1" bRatio="0.3422127" meMode="2" products="130 310"/> + <channel onMode="1" bRatio="0.0420984" products="-213 211"/> + <channel onMode="1" bRatio="0.0420984" products="113 111"/> + <channel onMode="1" bRatio="0.0420984" products="213 -211"/> + <channel onMode="1" bRatio="0.0270000" meMode="1" products="211 -211 111"/> + <channel onMode="1" bRatio="0.0130981" products="221 22"/> + <channel onMode="1" bRatio="0.0012708" products="111 22"/> + <channel onMode="1" bRatio="0.0002956" products="11 -11"/> + <channel onMode="1" bRatio="0.0002872" products="13 -13"/> + <channel onMode="1" bRatio="0.0001151" meMode="11" products="221 11 -11"/> + <channel onMode="1" bRatio="0.0000740" meMode="2" products="211 -211"/> + <channel onMode="1" bRatio="0.0000470" products="223 111"/> +</particle> + +<!-- +<particle id="335" name="f'_2(1525)" spinType="5" chargeType="0" colType="0" + m0="1.52500" mWidth="0.07300" mMin="1.10000" mMax="2.00000"> + <channel onMode="1" bRatio="0.4444000" products="321 -321"/> + <channel onMode="1" bRatio="0.2222000" products="130 130"/> + <channel onMode="1" bRatio="0.2222000" products="310 310"/> + <channel onMode="1" bRatio="0.1030000" products="221 221"/> + <channel onMode="1" bRatio="0.0041000" products="211 -211"/> + <channel onMode="1" bRatio="0.0041000" products="111 111"/> +</particle> +--> + +<particle id="411" name="D+" antiName="D-" spinType="1" chargeType="3" colType="0" + m0="1.86962" tau0="3.11800e-01"> + <channel onMode="1" bRatio="0.0004000" products="-13 14"/> + <channel onMode="1" bRatio="0.0010000" products="-15 16"/> + <channel onMode="1" bRatio="0.0043000" meMode="22" products="-11 12 111"/> + <channel onMode="1" bRatio="0.0028000" meMode="22" products="-11 12 113"/> + <channel onMode="1" bRatio="0.0026000" meMode="22" products="-11 12 221"/> + <channel onMode="1" bRatio="0.0028000" meMode="22" products="-11 12 223"/> + <channel onMode="1" bRatio="0.0900000" meMode="22" products="-11 12 311"/> + <channel onMode="1" bRatio="0.0554000" meMode="22" products="-11 12 -313"/> + <channel onMode="1" bRatio="0.0038000" meMode="22" products="-11 12 -315"/> + <channel onMode="1" bRatio="0.0005000" meMode="22" products="-11 12 331"/> + <channel onMode="1" bRatio="0.0036000" meMode="22" products="-11 12 -10313"/> + <channel onMode="1" bRatio="0.0043000" meMode="22" products="-13 14 111"/> + <channel onMode="1" bRatio="0.0028000" meMode="22" products="-13 14 113"/> + <channel onMode="1" bRatio="0.0026000" meMode="22" products="-13 14 221"/> + <channel onMode="1" bRatio="0.0028000" meMode="22" products="-13 14 223"/> + <channel onMode="1" bRatio="0.0874000" meMode="22" products="-13 14 311"/> + <channel onMode="1" bRatio="0.0533000" meMode="22" products="-13 14 -313"/> + <channel onMode="1" bRatio="0.0038000" meMode="22" products="-13 14 -315"/> + <channel onMode="1" bRatio="0.0005000" meMode="22" products="-13 14 331"/> + <channel onMode="1" bRatio="0.0036000" meMode="22" products="-13 14 -10313"/> + <channel onMode="1" bRatio="0.0014000" meMode="22" products="-11 12 311 111"/> + <channel onMode="1" bRatio="0.0027000" meMode="22" products="-11 12 -321 211"/> + <channel onMode="1" bRatio="0.0014000" meMode="22" products="-13 14 311 111"/> + <channel onMode="1" bRatio="0.0027000" meMode="22" products="-13 14 -321 211"/> + <channel onMode="1" bRatio="0.0026000" products="211 111"/> + <channel onMode="1" bRatio="0.0010000" products="211 113"/> + <channel onMode="1" bRatio="0.0076000" products="221 211"/> + <channel onMode="1" bRatio="0.0282000" products="311 211"/> + <channel onMode="1" bRatio="0.0210000" products="-313 213"/> + <channel onMode="1" bRatio="0.0074000" products="321 311"/> + <channel onMode="1" bRatio="0.0042000" products="321 -313"/> + <channel onMode="1" bRatio="0.0310000" products="323 311"/> + <channel onMode="1" bRatio="0.0180000" products="323 -313"/> + <channel onMode="1" bRatio="0.0070000" products="333 211"/> + <channel onMode="1" bRatio="0.0115000" products="-10311 211"/> + <channel onMode="1" bRatio="0.0800000" products="20213 311"/> + <channel onMode="1" bRatio="0.0508000" products="-20313 211"/> + <channel onMode="1" bRatio="0.0015000" products="211 111 111"/> + <channel onMode="1" bRatio="0.0020000" products="211 211 -211"/> + <channel onMode="1" bRatio="0.0030000" products="221 211 111"/> + <channel onMode="1" bRatio="0.0970000" products="311 211 111"/> + <channel onMode="1" bRatio="0.0050000" products="311 211 113"/> + <channel onMode="1" bRatio="0.0100000" products="311 221 211"/> + <channel onMode="1" bRatio="0.0050000" products="311 223 211"/> + <channel onMode="1" bRatio="0.0010000" products="311 311 211"/> + <channel onMode="1" bRatio="0.0010000" products="313 311 211"/> + <channel onMode="1" bRatio="0.0100000" products="-313 211 111"/> + <channel onMode="1" bRatio="0.0078000" products="-313 211 113"/> + <channel onMode="1" bRatio="0.0100000" products="-313 221 211"/> + <channel onMode="1" bRatio="0.0050000" products="-313 223 211"/> + <channel onMode="1" bRatio="0.0010000" products="-313 311 211"/> + <channel onMode="1" bRatio="0.0010000" products="321 311 111"/> + <channel onMode="1" bRatio="0.0100000" products="321 311 311"/> + <channel onMode="1" bRatio="0.0010000" products="321 -313 111"/> + <channel onMode="1" bRatio="0.0046000" products="321 -321 211"/> + <channel onMode="1" bRatio="0.0920000" products="-321 211 211"/> + <channel onMode="1" bRatio="0.0110000" products="-321 213 211"/> + <channel onMode="1" bRatio="0.0010000" products="323 311 111"/> + <channel onMode="1" bRatio="0.0010000" products="323 -321 211"/> + <channel onMode="1" bRatio="0.0070000" products="-323 211 211"/> + <channel onMode="1" bRatio="0.0100000" products="-323 213 211"/> + <channel onMode="1" bRatio="0.0010000" products="-323 321 211"/> + <channel onMode="1" bRatio="0.0230000" products="333 211 111"/> + <channel onMode="1" bRatio="0.0050000" products="211 111 111 111"/> + <channel onMode="1" bRatio="0.0090000" products="211 211 -211 111"/> + <channel onMode="1" bRatio="0.0020000" products="221 211 111 111"/> + <channel onMode="1" bRatio="0.0030000" products="221 211 211 -211"/> + <channel onMode="1" bRatio="0.0188000" products="311 211 111 111"/> + <channel onMode="1" bRatio="0.0120000" products="-321 211 211 111"/> + <channel onMode="1" bRatio="0.0021000" products="211 211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0035000" products="311 211 111 111 111"/> + <channel onMode="1" bRatio="0.0087000" products="311 211 211 -211 111"/> + <channel onMode="1" bRatio="0.0050000" products="-321 211 211 111 111"/> + <channel onMode="1" bRatio="0.0022000" products="-321 211 211 211 -211"/> +</particle> + +<particle id="413" name="D*+" antiName="D*-" spinType="3" chargeType="3" colType="0" + m0="2.01028" tau0="2.36e-09"> + <channel onMode="1" bRatio="0.6770000" meMode="2" products="421 211"/> + <channel onMode="1" bRatio="0.3070000" meMode="2" products="411 111"/> + <channel onMode="1" bRatio="0.0160000" products="411 22"/> +</particle> + +<!-- +<particle id="415" name="D*_2(2460)+" antiName="D*_2(2460)-" spinType="5" chargeType="3" colType="0" + m0="2.46440" mWidth="0.03700" mMin="2.30000" mMax="2.65000"> + <channel onMode="1" bRatio="0.2200000" products="423 211"/> + <channel onMode="1" bRatio="0.1100000" products="413 111"/> + <channel onMode="1" bRatio="0.3800000" products="421 211"/> + <channel onMode="1" bRatio="0.1900000" products="411 111"/> + <channel onMode="1" bRatio="0.0670000" products="423 211 111"/> + <channel onMode="1" bRatio="0.0330000" products="413 211 -211"/> +</particle> +--> + +<particle id="421" name="D0" antiName="Dbar0" spinType="1" chargeType="0" colType="0" + m0="1.86486" tau0="1.22900e-01"> + <channel onMode="1" bRatio="0.0034000" meMode="22" products="-11 12 -211"/> + <channel onMode="1" bRatio="0.0022000" meMode="22" products="-11 12 -213"/> + <channel onMode="1" bRatio="0.0350000" meMode="22" products="-11 12 -321"/> + <channel onMode="1" bRatio="0.0225000" meMode="22" products="-11 12 -323"/> + <channel onMode="1" bRatio="0.0015000" meMode="22" products="-11 12 -325"/> + <channel onMode="1" bRatio="0.0014000" meMode="22" products="-11 12 -10323"/> + <channel onMode="1" bRatio="0.0034000" meMode="22" products="-13 14 -211"/> + <channel onMode="1" bRatio="0.0022000" meMode="22" products="-13 14 -213"/> + <channel onMode="1" bRatio="0.0340000" meMode="22" products="-13 14 -321"/> + <channel onMode="1" bRatio="0.0214000" meMode="22" products="-13 14 -323"/> + <channel onMode="1" bRatio="0.0015000" meMode="22" products="-13 14 -325"/> + <channel onMode="1" bRatio="0.0014000" meMode="22" products="-13 14 -10323"/> + <channel onMode="1" bRatio="0.0011000" meMode="22" products="-11 12 311 -211"/> + <channel onMode="1" bRatio="0.0006000" meMode="22" products="-11 12 -321 111"/> + <channel onMode="1" bRatio="0.0011000" meMode="22" products="-13 14 311 -211"/> + <channel onMode="1" bRatio="0.0006000" meMode="22" products="-13 14 -321 111"/> + <channel onMode="1" bRatio="0.0008000" products="111 111"/> + <channel onMode="1" bRatio="0.0020000" products="113 111"/> + <channel onMode="1" bRatio="0.0006000" products="130 130"/> + <channel onMode="1" bRatio="0.0015000" products="211 -211"/> + <channel onMode="1" bRatio="0.0040000" products="213 -211"/> + <channel onMode="1" bRatio="0.0040000" products="-213 211"/> + <channel onMode="1" bRatio="0.0010000" products="221 111"/> + <channel onMode="1" bRatio="0.0010000" products="221 221"/> + <channel onMode="1" bRatio="0.0006000" products="310 310"/> + <channel onMode="1" bRatio="0.0212000" products="311 111"/> + <channel onMode="1" bRatio="0.0071000" products="311 221"/> + <channel onMode="1" bRatio="0.0210000" products="311 223"/> + <channel onMode="1" bRatio="0.0004000" products="313 311"/> + <channel onMode="1" bRatio="0.0014000" products="313 -313"/> + <channel onMode="1" bRatio="0.0085000" products="-313 111"/> + <channel onMode="1" bRatio="0.0146000" products="-313 113"/> + <channel onMode="1" bRatio="0.0190000" products="-313 221"/> + <channel onMode="1" bRatio="0.0110000" products="-313 223"/> + <channel onMode="1" bRatio="0.0008000" products="-313 311"/> + <channel onMode="1" bRatio="0.0001500" products="321 -211"/> + <channel onMode="1" bRatio="0.0043000" products="321 -321"/> + <channel onMode="1" bRatio="0.0383000" products="-321 211"/> + <channel onMode="1" bRatio="0.0035000" products="323 -321"/> + <channel onMode="1" bRatio="0.0610000" products="-323 213"/> + <channel onMode="1" bRatio="0.0018000" products="-323 321"/> + <channel onMode="1" bRatio="0.0010000" products="331 111"/> + <channel onMode="1" bRatio="0.0172000" products="331 311"/> + <channel onMode="1" bRatio="0.0020000" products="331 -313"/> + <channel onMode="1" bRatio="0.0007000" products="333 111"/> + <channel onMode="1" bRatio="0.0086000" products="333 311"/> + <channel onMode="1" bRatio="0.0071000" products="-10313 111"/> + <channel onMode="1" bRatio="0.0107000" products="-10323 211"/> + <channel onMode="1" bRatio="0.0730000" products="20213 -321"/> + <channel onMode="1" bRatio="0.0010000" products="111 111 111"/> + <channel onMode="1" bRatio="0.0060000" products="211 -211 111"/> + <channel onMode="1" bRatio="0.0270000" products="211 -211 130"/> + <channel onMode="1" bRatio="0.0270000" products="310 211 -211"/> + <channel onMode="1" bRatio="0.0008000" products="310 310 310"/> + <channel onMode="1" bRatio="0.0078000" products="311 111 111"/> + <channel onMode="1" bRatio="0.0116000" products="-313 111 111"/> + <channel onMode="1" bRatio="0.0225000" products="-313 211 -211"/> + <channel onMode="1" bRatio="0.0005000" products="321 -211 111"/> + <channel onMode="1" bRatio="0.0051000" products="321 -321 311"/> + <channel onMode="1" bRatio="0.1390000" products="-321 211 111"/> + <channel onMode="1" bRatio="0.0060000" products="-321 211 113"/> + <channel onMode="1" bRatio="0.0068000" products="-321 213 111"/> + <channel onMode="1" bRatio="0.0100000" products="-321 221 211"/> + <channel onMode="1" bRatio="0.0303000" products="-321 223 211"/> + <channel onMode="1" bRatio="0.0100000" products="-323 211 111"/> + <channel onMode="1" bRatio="0.0075000" products="331 -321 211"/> + <channel onMode="1" bRatio="0.0011000" products="333 211 -211"/> + <channel onMode="1" bRatio="0.0073000" products="211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0050000" products="211 -211 111 111"/> + <channel onMode="1" bRatio="0.0143000" products="311 111 111 111"/> + <channel onMode="1" bRatio="0.0085000" products="311 211 -211 111"/> + <channel onMode="1" bRatio="0.0015000" products="311 311 111 111"/> + <channel onMode="1" bRatio="0.0015000" products="311 311 211 -211"/> + <channel onMode="1" bRatio="0.0030000" products="321 -321 111 111"/> + <channel onMode="1" bRatio="0.0025000" products="321 -321 211 -211"/> + <channel onMode="1" bRatio="0.0257500" products="-321 211 111 111"/> + <channel onMode="1" bRatio="0.0074000" products="-321 211 211 -211"/> + <channel onMode="1" bRatio="0.0177000" products="211 211 -211 -211 111"/> + <channel onMode="1" bRatio="0.0060000" products="211 -211 111 111 111"/> + <channel onMode="1" bRatio="0.0058000" products="311 211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0638000" products="311 211 -211 111 111"/> + <channel onMode="1" bRatio="0.0038000" products="-321 211 111 111 111"/> + <channel onMode="1" bRatio="0.0038000" products="-321 211 211 -211 111"/> + <channel onMode="1" bRatio="0.0192000" products="311 211 -211 111 111 111"/> +</particle> + +<particle id="423" name="D*0" antiName="D*bar0" spinType="3" chargeType="0" colType="0" + m0="2.00698"> + <channel onMode="1" bRatio="0.6190000" meMode="2" products="421 111"/> + <channel onMode="1" bRatio="0.3810000" products="421 22"/> +</particle> + +<!-- +<particle id="425" name="D*_2(2460)0" antiName="D*_2(2460)bar0" spinType="5" chargeType="0" colType="0" + m0="2.46260" mWidth="0.04900" mMin="2.30000" mMax="2.65000"> + <channel onMode="1" bRatio="0.2200000" products="413 -211"/> + <channel onMode="1" bRatio="0.1100000" products="423 111"/> + <channel onMode="1" bRatio="0.3800000" products="411 -211"/> + <channel onMode="1" bRatio="0.1900000" products="421 111"/> + <channel onMode="1" bRatio="0.0670000" products="413 -211 111"/> + <channel onMode="1" bRatio="0.0330000" products="423 211 -211"/> +</particle> +--> + +<particle id="431" name="D_s+" antiName="D_s-" spinType="1" chargeType="3" colType="0" + m0="1.96849" tau0="1.49900e-01"> + <channel onMode="1" bRatio="0.0061600" products="-13 14"/> + <channel onMode="1" bRatio="0.0640000" products="-15 16"/> + <channel onMode="1" bRatio="0.0307000" meMode="22" products="-11 12 221"/> + <channel onMode="1" bRatio="0.0027000" meMode="22" products="-11 12 311"/> + <channel onMode="1" bRatio="0.0010000" meMode="22" products="-11 12 -313"/> + <channel onMode="1" bRatio="0.0106000" meMode="22" products="-11 12 331"/> + <channel onMode="1" bRatio="0.0242000" meMode="22" products="-11 12 333"/> + <channel onMode="1" bRatio="0.0307000" meMode="22" products="-13 14 221"/> + <channel onMode="1" bRatio="0.0027000" meMode="22" products="-13 14 311"/> + <channel onMode="1" bRatio="0.0010000" meMode="22" products="-13 14 -313"/> + <channel onMode="1" bRatio="0.0106000" meMode="22" products="-13 14 331"/> + <channel onMode="1" bRatio="0.0242000" meMode="22" products="-13 14 333"/> + <channel onMode="1" bRatio="0.0010000" products="211 111"/> + <channel onMode="1" bRatio="0.0004000" products="211 113"/> + <channel onMode="1" bRatio="0.0004000" products="213 111"/> + <channel onMode="1" bRatio="0.0210000" products="221 211"/> + <channel onMode="1" bRatio="0.1310400" products="221 213"/> + <channel onMode="1" bRatio="0.0034000" products="223 211"/> + <channel onMode="1" bRatio="0.0023000" products="225 211"/> + <channel onMode="1" bRatio="0.0040000" products="311 211"/> + <channel onMode="1" bRatio="0.0015000" products="311 213"/> + <channel onMode="1" bRatio="0.0079000" products="313 211"/> + <channel onMode="1" bRatio="0.0050000" products="313 213"/> + <channel onMode="1" bRatio="0.0015000" products="321 113"/> + <channel onMode="1" bRatio="0.0002000" products="321 221"/> + <channel onMode="1" bRatio="0.0440000" products="321 311"/> + <channel onMode="1" bRatio="0.0400000" products="321 -313"/> + <channel onMode="1" bRatio="0.0530000" products="323 311"/> + <channel onMode="1" bRatio="0.0700000" products="323 -313"/> + <channel onMode="1" bRatio="0.0470000" products="331 211"/> + <channel onMode="1" bRatio="0.1220000" products="331 213"/> + <channel onMode="1" bRatio="0.0002000" products="331 321"/> + <channel onMode="1" bRatio="0.0440000" products="333 211"/> + <channel onMode="1" bRatio="0.0820000" products="333 213"/> + <channel onMode="1" bRatio="0.0003000" products="333 321"/> + <channel onMode="1" bRatio="0.0025000" products="20213 311"/> + <channel onMode="1" bRatio="0.0100000" products="9010221 211"/> + <channel onMode="1" bRatio="0.0000500" products="211 111 111"/> + <channel onMode="1" bRatio="0.0000500" products="211 211 -211"/> + <channel onMode="1" bRatio="0.0150000" products="221 211 111"/> + <channel onMode="1" bRatio="0.0010000" products="311 211 111"/> + <channel onMode="1" bRatio="0.0050000" products="313 211 111"/> + <channel onMode="1" bRatio="0.0002000" products="321 221 111"/> + <channel onMode="1" bRatio="0.0030000" products="321 311 111"/> + <channel onMode="1" bRatio="0.0012000" products="321 -313 111"/> + <channel onMode="1" bRatio="0.0002000" products="321 321 -321"/> + <channel onMode="1" bRatio="0.0110000" products="321 -321 211"/> + <channel onMode="1" bRatio="0.0012000" products="323 311 111"/> + <channel onMode="1" bRatio="0.0040000" products="323 -313 111"/> + <channel onMode="1" bRatio="0.0150000" products="331 211 111"/> + <channel onMode="1" bRatio="0.0002000" products="331 321 111"/> + <channel onMode="1" bRatio="0.0100000" products="333 211 111"/> + <channel onMode="1" bRatio="0.0050000" products="221 211 111 111"/> + <channel onMode="1" bRatio="0.0050000" products="221 211 211 -211"/> + <channel onMode="1" bRatio="0.0002000" products="321 221 211 -211"/> + <channel onMode="1" bRatio="0.0010000" products="321 311 111 111"/> + <channel onMode="1" bRatio="0.0010000" products="321 311 211 -211"/> + <channel onMode="1" bRatio="0.0002000" products="331 321 211 -211"/> + <channel onMode="1" bRatio="0.0050000" products="333 211 111 111"/> + <channel onMode="1" bRatio="0.0080000" products="333 211 211 -211"/> + <channel onMode="1" bRatio="0.0043000" products="321 -321 211 211 -211"/> +</particle> + +<particle id="433" name="D*_s+" antiName="D*_s-" spinType="3" chargeType="3" colType="0" + m0="2.11230"> + <channel onMode="1" bRatio="0.9420000" products="431 22"/> + <channel onMode="1" bRatio="0.0580000" meMode="2" products="431 111"/> +</particle> + +<!-- +<particle id="435" name="D*_2s(2573)+" antiName="D*_2s(2573)-" spinType="5" chargeType="3" colType="0" + m0="2.57190" mWidth="0.01700" mMin="2.51000" mMax="2.70000"> + <channel onMode="1" bRatio="0.0500000" products="413 311"/> + <channel onMode="1" bRatio="0.0500000" products="423 321"/> + <channel onMode="1" bRatio="0.4500000" products="411 311"/> + <channel onMode="1" bRatio="0.4500000" products="421 321"/> +</particle> +--> + +<particle id="441" name="eta_c" spinType="1" chargeType="0" colType="0" + m0="2.98100" mWidth="0.02970" mMin="2.78040" mMax="3.18040"> + <channel onMode="1" bRatio="0.0002800" products="22 22"/> + <channel onMode="1" bRatio="0.0087000" products="113 113"/> + <channel onMode="1" bRatio="0.0173000" products="213 -213"/> + <channel onMode="1" bRatio="0.0042000" products="313 -313"/> + <channel onMode="1" bRatio="0.0043000" products="323 -323"/> + <channel onMode="1" bRatio="0.0026000" products="333 333"/> + <channel onMode="1" bRatio="0.0013000" products="2212 -2212"/> + <channel onMode="1" bRatio="0.0163000" products="221 111 111"/> + <channel onMode="1" bRatio="0.0327000" products="221 211 -211"/> + <channel onMode="1" bRatio="0.0095000" products="311 311 111"/> + <channel onMode="1" bRatio="0.0191000" products="321 311 -211"/> + <channel onMode="1" bRatio="0.0072000" products="321 -313 -211"/> + <channel onMode="1" bRatio="0.0095000" products="321 -321 111"/> + <channel onMode="1" bRatio="0.0191000" products="-321 311 211"/> + <channel onMode="1" bRatio="0.0072000" products="-321 313 211"/> + <channel onMode="1" bRatio="0.0137000" products="331 111 111"/> + <channel onMode="1" bRatio="0.0273000" products="331 211 -211"/> + <channel onMode="1" bRatio="0.0018000" products="333 321 -321"/> + <channel onMode="1" bRatio="0.0033000" products="211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0006000" products="321 321 -321 -321"/> + <channel onMode="1" bRatio="0.0054000" products="321 -321 211 -211"/> + <channel onMode="1" bRatio="0.7886200" meMode="52" products="83 -83"/> +</particle> + +<particle id="443" name="J/psi" spinType="3" chargeType="0" colType="0" + m0="3.09692" mWidth="0.00009" mMin="3.09602" mMax="3.09782"> + <channel onMode="1" bRatio="0.8023950" meMode="43" products="83 -83"/> + <channel onMode="1" bRatio="0.0594000" products="11 -11"/> + <channel onMode="1" bRatio="0.0593000" products="13 -13"/> + <channel onMode="1" bRatio="0.0130000" products="441 22"/> + <channel onMode="1" bRatio="0.0056000" products="113 111"/> + <channel onMode="1" bRatio="0.0056500" products="213 -211"/> + <channel onMode="1" bRatio="0.0056500" products="-213 211"/> + <channel onMode="1" bRatio="0.0036000" products="115 113"/> + <channel onMode="1" bRatio="0.0036000" products="-215 213"/> + <channel onMode="1" bRatio="0.0036000" products="215 -213"/> + <channel onMode="1" bRatio="0.0043000" products="225 223"/> + <channel onMode="1" bRatio="0.0022000" products="313 -315"/> + <channel onMode="1" bRatio="0.0022000" products="323 -325"/> + <channel onMode="1" bRatio="0.0022000" products="-323 325"/> + <channel onMode="1" bRatio="0.0025000" products="321 -323"/> + <channel onMode="1" bRatio="0.0025000" products="-321 323"/> + <channel onMode="1" bRatio="0.0021000" products="311 -313"/> + <channel onMode="1" bRatio="0.0021000" products="-311 313"/> + <channel onMode="1" bRatio="0.0019000" products="20323 -321"/> + <channel onMode="1" bRatio="0.0019000" products="-20323 321"/> + <channel onMode="1" bRatio="0.0015000" products="10213 -211"/> + <channel onMode="1" bRatio="0.0015000" products="-10213 211"/> + <channel onMode="1" bRatio="0.0023000" products="10113 111"/> + <channel onMode="1" bRatio="0.0004800" products="10331 223"/> + <channel onMode="1" bRatio="0.0007400" products="223 221"/> + <channel onMode="1" bRatio="0.0003600" products="10331 333"/> + <channel onMode="1" bRatio="0.0008000" products="333 335"/> + <channel onMode="1" bRatio="0.0006800" products="20333 223"/> + <channel onMode="1" bRatio="0.0007400" products="333 221"/> + <channel onMode="1" bRatio="0.0004500" products="223 111"/> + <channel onMode="1" bRatio="0.0004000" products="333 331"/> + <channel onMode="1" bRatio="0.0003200" products="333 9010221"/> + <channel onMode="1" bRatio="0.0002600" products="333 20223"/> + <channel onMode="1" bRatio="0.0001930" products="113 221"/> + <channel onMode="1" bRatio="0.0001820" products="223 331"/> + <channel onMode="1" bRatio="0.0001400" products="223 9010221"/> + <channel onMode="1" bRatio="0.0001050" products="113 331"/> + <channel onMode="1" bRatio="0.0011000" products="2224 -2224"/> + <channel onMode="1" bRatio="0.0005150" products="3112 -3112"/> + <channel onMode="1" bRatio="0.0005900" products="3314 -3314"/> + <channel onMode="1" bRatio="0.0003200" products="3324 -3324"/> + <channel onMode="1" bRatio="0.0003200" products="3324 -3324"/> + <channel onMode="1" bRatio="0.0001550" products="3114 -3114"/> + <channel onMode="1" bRatio="0.0001550" products="3224 -3224"/> +</particle> + +<!-- +<particle id="445" name="chi_2c" spinType="5" chargeType="0" colType="0" + m0="3.55620" mWidth="0.00198" mMin="3.53620" mMax="3.57620"> + <channel onMode="1" bRatio="0.0002590" products="22 22"/> + <channel onMode="1" bRatio="0.2020000" products="443 22"/> + <channel onMode="1" bRatio="0.0008900" products="130 130"/> + <channel onMode="1" bRatio="0.0018000" products="211 -211"/> + <channel onMode="1" bRatio="0.0008900" products="310 310"/> + <channel onMode="1" bRatio="0.0047000" products="313 -313"/> + <channel onMode="1" bRatio="0.0009000" products="321 -321"/> + <channel onMode="1" bRatio="0.0024000" products="333 333"/> + <channel onMode="1" bRatio="0.0000680" products="2212 -2212"/> + <channel onMode="1" bRatio="0.0003000" products="3122 -3122"/> + <channel onMode="1" bRatio="0.0046000" products="211 -211 113"/> + <channel onMode="1" bRatio="0.0046000" products="213 -211 111"/> + <channel onMode="1" bRatio="0.0046000" products="-213 211 111"/> + <channel onMode="1" bRatio="0.0015000" products="321 -313 -211"/> + <channel onMode="1" bRatio="0.0015000" products="-321 313 211"/> + <channel onMode="1" bRatio="0.0016000" products="323 311 -211"/> + <channel onMode="1" bRatio="0.0016000" products="-323 311 211"/> + <channel onMode="1" bRatio="0.0102000" products="211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0003000" products="310 310 211 -211"/> + <channel onMode="1" bRatio="0.0012000" products="321 321 -321 -321"/> + <channel onMode="1" bRatio="0.0103000" products="321 -321 211 -211"/> + <channel onMode="1" bRatio="0.0003000" products="321 -321 310 310"/> + <channel onMode="1" bRatio="0.0017000" products="2212 -2212 211 -211"/> + <channel onMode="1" bRatio="0.0107000" products="211 211 211 -211 -211 -211"/> + <channel onMode="1" bRatio="0.7310930" meMode="52" products="83 -83"/> +</particle> +--> + +<particle id="511" name="B0" antiName="Bbar0" spinType="1" chargeType="0" colType="0" + m0="5.27958" tau0="4.58700e-01"> + <channel onMode="1" bRatio="0.0001330" meMode="22" products="12 -11 -211"/> + <channel onMode="1" bRatio="0.0002690" meMode="22" products="12 -11 -213"/> + <channel onMode="1" bRatio="0.0207000" meMode="22" products="12 -11 -411"/> + <channel onMode="1" bRatio="0.0570000" meMode="22" products="12 -11 -413"/> + <channel onMode="1" bRatio="0.0023000" meMode="22" products="12 -11 -415"/> + <channel onMode="1" bRatio="0.0045000" meMode="22" products="12 -11 -10411"/> + <channel onMode="1" bRatio="0.0052000" meMode="22" products="12 -11 -10413"/> + <channel onMode="1" bRatio="0.0083000" meMode="22" products="12 -11 -20413"/> + <channel onMode="1" bRatio="0.0001330" meMode="22" products="14 -13 -211"/> + <channel onMode="1" bRatio="0.0002690" meMode="22" products="14 -13 -213"/> + <channel onMode="1" bRatio="0.0207000" meMode="22" products="14 -13 -411"/> + <channel onMode="1" bRatio="0.0570000" meMode="22" products="14 -13 -413"/> + <channel onMode="1" bRatio="0.0023000" meMode="22" products="14 -13 -415"/> + <channel onMode="1" bRatio="0.0045000" meMode="22" products="14 -13 -10411"/> + <channel onMode="1" bRatio="0.0052000" meMode="22" products="14 -13 -10413"/> + <channel onMode="1" bRatio="0.0083000" meMode="22" products="14 -13 -20413"/> + <channel onMode="1" bRatio="0.0000600" meMode="22" products="16 -15 -211"/> + <channel onMode="1" bRatio="0.0000830" meMode="22" products="16 -15 -213"/> + <channel onMode="1" bRatio="0.0000080" meMode="22" products="16 -15 -215"/> + <channel onMode="1" bRatio="0.0070000" meMode="22" products="16 -15 -411"/> + <channel onMode="1" bRatio="0.0160000" meMode="22" products="16 -15 -413"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="16 -15 -415"/> + <channel onMode="1" bRatio="0.0000080" meMode="22" products="16 -15 -10213"/> + <channel onMode="1" bRatio="0.0013000" meMode="22" products="16 -15 -10411"/> + <channel onMode="1" bRatio="0.0013000" meMode="22" products="16 -15 -10413"/> + <channel onMode="1" bRatio="0.0000900" meMode="22" products="16 -15 -20213"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="16 -15 -20413"/> + <channel onMode="1" bRatio="0.0000080" meMode="22" products="16 -15 -9000211"/> + <channel onMode="1" bRatio="0.0010000" meMode="22" products="12 -11 -411 111"/> + <channel onMode="1" bRatio="0.0003000" meMode="22" products="12 -11 -413 111"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="12 -11 -421 -211"/> + <channel onMode="1" bRatio="0.0007000" meMode="22" products="12 -11 -423 -211"/> + <channel onMode="1" bRatio="0.0010000" meMode="22" products="14 -13 -411 111"/> + <channel onMode="1" bRatio="0.0003000" meMode="22" products="14 -13 -413 111"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="14 -13 -421 -211"/> + <channel onMode="1" bRatio="0.0007000" meMode="22" products="14 -13 -423 -211"/> + <channel onMode="1" bRatio="0.0000015" products="111 111"/> + <channel onMode="1" bRatio="0.0000020" products="113 113"/> + <channel onMode="1" bRatio="0.0000060" products="130 111"/> + <channel onMode="1" bRatio="0.0000026" products="130 113"/> + <channel onMode="1" bRatio="0.0000006" products="130 130"/> + <channel onMode="1" bRatio="0.0000046" products="211 -211"/> + <channel onMode="1" bRatio="0.0000300" products="213 -213"/> + <channel onMode="1" bRatio="0.0000010" products="221 111"/> + <channel onMode="1" bRatio="0.0000010" products="221 113"/> + <channel onMode="1" bRatio="0.0000010" products="221 130"/> + <channel onMode="1" bRatio="0.0000010" products="221 221"/> + <channel onMode="1" bRatio="0.0000005" products="223 22"/> + <channel onMode="1" bRatio="0.0000010" products="223 111"/> + <channel onMode="1" bRatio="0.0000010" products="223 113"/> + <channel onMode="1" bRatio="0.0000023" products="223 130"/> + <channel onMode="1" bRatio="0.0000010" products="223 221"/> + <channel onMode="1" bRatio="0.0000010" products="223 223"/> + <channel onMode="1" bRatio="0.0000060" products="310 111"/> + <channel onMode="1" bRatio="0.0000026" products="310 113"/> + <channel onMode="1" bRatio="0.0000010" products="310 221"/> + <channel onMode="1" bRatio="0.0000023" products="310 223"/> + <channel onMode="1" bRatio="0.0000006" products="310 310"/> + <channel onMode="1" bRatio="0.0000401" products="313 22"/> + <channel onMode="1" bRatio="0.0000017" products="313 111"/> + <channel onMode="1" bRatio="0.0000100" products="313 113"/> + <channel onMode="1" bRatio="0.0000190" products="313 221"/> + <channel onMode="1" bRatio="0.0000010" products="313 223"/> + <channel onMode="1" bRatio="0.0000030" products="313 311"/> + <channel onMode="1" bRatio="0.0000010" products="313 -313"/> + <channel onMode="1" bRatio="0.0000180" products="321 -211"/> + <channel onMode="1" bRatio="0.0000099" products="321 -213"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321"/> + <channel onMode="1" bRatio="0.0000130" products="323 -211"/> + <channel onMode="1" bRatio="0.0000200" products="323 -213"/> + <channel onMode="1" bRatio="0.0000020" products="323 -321"/> + <channel onMode="1" bRatio="0.0000010" products="323 -323"/> + <channel onMode="1" bRatio="0.0000010" products="331 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 113"/> + <channel onMode="1" bRatio="0.0000320" products="331 130"/> + <channel onMode="1" bRatio="0.0000010" products="331 221"/> + <channel onMode="1" bRatio="0.0000010" products="331 223"/> + <channel onMode="1" bRatio="0.0000320" products="331 310"/> + <channel onMode="1" bRatio="0.0000010" products="331 313"/> + <channel onMode="1" bRatio="0.0000010" products="331 331"/> + <channel onMode="1" bRatio="0.0000010" products="333 111"/> + <channel onMode="1" bRatio="0.0000001" products="333 113"/> + <channel onMode="1" bRatio="0.0000042" products="333 130"/> + <channel onMode="1" bRatio="0.0000010" products="333 221"/> + <channel onMode="1" bRatio="0.0000010" products="333 223"/> + <channel onMode="1" bRatio="0.0000042" products="333 310"/> + <channel onMode="1" bRatio="0.0000110" products="333 313"/> + <channel onMode="1" bRatio="0.0000010" products="333 331"/> + <channel onMode="1" bRatio="0.0000001" products="333 333"/> + <channel onMode="1" bRatio="0.0002700" products="411 -411"/> + <channel onMode="1" bRatio="0.0028000" products="-411 211"/> + <channel onMode="1" bRatio="0.0077000" products="-411 213"/> + <channel onMode="1" bRatio="0.0002000" products="-411 321"/> + <channel onMode="1" bRatio="0.0003700" products="-411 323"/> + <channel onMode="1" bRatio="0.0003350" products="413 -411"/> + <channel onMode="1" bRatio="0.0008300" products="413 -413"/> + <channel onMode="1" bRatio="0.0028000" products="-413 211"/> + <channel onMode="1" bRatio="0.0068000" products="-413 213"/> + <channel onMode="1" bRatio="0.0001700" products="-413 321"/> + <channel onMode="1" bRatio="0.0003800" products="-413 323"/> + <channel onMode="1" bRatio="0.0003350" products="-413 411"/> + <channel onMode="1" bRatio="0.0009000" products="-415 211"/> + <channel onMode="1" bRatio="0.0022000" products="-415 213"/> + <channel onMode="1" bRatio="0.0000100" products="421 313"/> + <channel onMode="1" bRatio="0.0002900" products="-421 111"/> + <channel onMode="1" bRatio="0.0002900" products="-421 113"/> + <channel onMode="1" bRatio="0.0002200" products="-421 221"/> + <channel onMode="1" bRatio="0.0002500" products="-421 223"/> + <channel onMode="1" bRatio="0.0000400" products="-421 311"/> + <channel onMode="1" bRatio="0.0000400" products="-421 313"/> + <channel onMode="1" bRatio="0.0001700" products="-421 331"/> + <channel onMode="1" bRatio="0.0000100" products="423 313"/> + <channel onMode="1" bRatio="0.0002700" products="-423 111"/> + <channel onMode="1" bRatio="0.0002900" products="-423 113"/> + <channel onMode="1" bRatio="0.0002600" products="-423 221"/> + <channel onMode="1" bRatio="0.0004200" products="-423 223"/> + <channel onMode="1" bRatio="0.0000400" products="-423 311"/> + <channel onMode="1" bRatio="0.0000400" products="-423 313"/> + <channel onMode="1" bRatio="0.0001700" products="-423 331"/> + <channel onMode="1" bRatio="0.0000390" products="431 -211"/> + <channel onMode="1" bRatio="0.0000160" products="431 -213"/> + <channel onMode="1" bRatio="0.0090000" products="431 -411"/> + <channel onMode="1" bRatio="0.0126000" products="431 -413"/> + <channel onMode="1" bRatio="0.0042000" products="431 -415"/> + <channel onMode="1" bRatio="0.0000460" products="-431 321"/> + <channel onMode="1" bRatio="0.0000160" products="-431 323"/> + <channel onMode="1" bRatio="0.0000260" products="433 -211"/> + <channel onMode="1" bRatio="0.0000160" products="433 -213"/> + <channel onMode="1" bRatio="0.0090000" products="433 -411"/> + <channel onMode="1" bRatio="0.0240000" products="433 -413"/> + <channel onMode="1" bRatio="0.0040000" products="433 -415"/> + <channel onMode="1" bRatio="0.0000160" products="-433 321"/> + <channel onMode="1" bRatio="0.0000160" products="-433 323"/> + <channel onMode="1" bRatio="0.0006000" products="441 130"/> + <channel onMode="1" bRatio="0.0006000" products="441 310"/> + <channel onMode="1" bRatio="0.0016200" products="441 313"/> + <channel onMode="1" bRatio="0.0000220" products="443 111"/> + <channel onMode="1" bRatio="0.0000160" products="443 113"/> + <channel onMode="1" bRatio="0.0004400" products="443 130"/> + <channel onMode="1" bRatio="0.0000300" products="443 223"/> + <channel onMode="1" bRatio="0.0004400" products="443 310"/> + <channel onMode="1" bRatio="0.0005000" products="443 315"/> + <channel onMode="1" bRatio="0.0000300" products="445 313"/> + <channel onMode="1" bRatio="0.0000001" products="2212 -2212"/> + <channel onMode="1" bRatio="0.0000010" products="10113 111"/> + <channel onMode="1" bRatio="0.0000010" products="10113 221"/> + <channel onMode="1" bRatio="0.0000100" products="10113 311"/> + <channel onMode="1" bRatio="0.0000010" products="10113 331"/> + <channel onMode="1" bRatio="0.0000100" products="10213 -211"/> + <channel onMode="1" bRatio="0.0000100" products="-10213 211"/> + <channel onMode="1" bRatio="0.0000100" products="-10213 321"/> + <channel onMode="1" bRatio="0.0000010" products="10311 111"/> + <channel onMode="1" bRatio="0.0000100" products="10311 113"/> + <channel onMode="1" bRatio="0.0000030" products="10311 311"/> + <channel onMode="1" bRatio="0.0000100" products="10311 333"/> + <channel onMode="1" bRatio="0.0015000" products="10313 443"/> + <channel onMode="1" bRatio="0.0000010" products="10321 -211"/> + <channel onMode="1" bRatio="0.0000200" products="10321 -213"/> + <channel onMode="1" bRatio="0.0000020" products="10321 -321"/> + <channel onMode="1" bRatio="0.0002000" products="-10411 211"/> + <channel onMode="1" bRatio="0.0006000" products="-10413 211"/> + <channel onMode="1" bRatio="0.0004000" products="-10413 213"/> + <channel onMode="1" bRatio="0.0012000" products="-10413 431"/> + <channel onMode="1" bRatio="0.0024000" products="-10413 433"/> + <channel onMode="1" bRatio="0.0016000" products="10431 -411"/> + <channel onMode="1" bRatio="0.0016000" products="10431 -413"/> + <channel onMode="1" bRatio="0.0001500" products="10441 130"/> + <channel onMode="1" bRatio="0.0001500" products="10441 310"/> + <channel onMode="1" bRatio="0.0003000" products="10441 313"/> + <channel onMode="1" bRatio="0.0000010" products="20113 111"/> + <channel onMode="1" bRatio="0.0000100" products="20113 113"/> + <channel onMode="1" bRatio="0.0000010" products="20113 221"/> + <channel onMode="1" bRatio="0.0000100" products="20113 223"/> + <channel onMode="1" bRatio="0.0000100" products="20113 311"/> + <channel onMode="1" bRatio="0.0000200" products="20113 313"/> + <channel onMode="1" bRatio="0.0000010" products="20113 331"/> + <channel onMode="1" bRatio="0.0000500" products="20113 20113"/> + <channel onMode="1" bRatio="0.0000400" products="20213 -211"/> + <channel onMode="1" bRatio="0.0000100" products="20213 -213"/> + <channel onMode="1" bRatio="0.0083400" products="20213 -411"/> + <channel onMode="1" bRatio="0.0120000" products="20213 -413"/> + <channel onMode="1" bRatio="0.0000500" products="20213 -20213"/> + <channel onMode="1" bRatio="0.0000400" products="-20213 211"/> + <channel onMode="1" bRatio="0.0000100" products="-20213 213"/> + <channel onMode="1" bRatio="0.0000100" products="-20213 321"/> + <channel onMode="1" bRatio="0.0000200" products="-20213 323"/> + <channel onMode="1" bRatio="0.0000020" products="20313 333"/> + <channel onMode="1" bRatio="0.0001000" products="20313 443"/> + <channel onMode="1" bRatio="0.0001000" products="-20413 211"/> + <channel onMode="1" bRatio="0.0013000" products="-20413 213"/> + <channel onMode="1" bRatio="0.0006000" products="-20413 431"/> + <channel onMode="1" bRatio="0.0012000" products="-20413 433"/> + <channel onMode="1" bRatio="0.0041000" products="20433 -411"/> + <channel onMode="1" bRatio="0.0098000" products="20433 -413"/> + <channel onMode="1" bRatio="0.0002300" products="20443 130"/> + <channel onMode="1" bRatio="0.0002300" products="20443 310"/> + <channel onMode="1" bRatio="0.0003000" products="20443 313"/> + <channel onMode="1" bRatio="0.0000010" products="30313 111"/> + <channel onMode="1" bRatio="0.0000010" products="30313 311"/> + <channel onMode="1" bRatio="0.0000010" products="30323 -211"/> + <channel onMode="1" bRatio="0.0000010" products="30323 -321"/> + <channel onMode="1" bRatio="0.0002400" products="30443 130"/> + <channel onMode="1" bRatio="0.0002400" products="30443 310"/> + <channel onMode="1" bRatio="0.0004800" products="30443 313"/> + <channel onMode="1" bRatio="0.0002900" products="30443 10313"/> + <channel onMode="1" bRatio="0.0000005" products="100113 130"/> + <channel onMode="1" bRatio="0.0000005" products="100113 310"/> + <channel onMode="1" bRatio="0.0002400" products="100441 130"/> + <channel onMode="1" bRatio="0.0002400" products="100441 310"/> + <channel onMode="1" bRatio="0.0006600" products="100441 313"/> + <channel onMode="1" bRatio="0.0003300" products="100443 130"/> + <channel onMode="1" bRatio="0.0003300" products="100443 310"/> + <channel onMode="1" bRatio="0.0006600" products="100443 313"/> + <channel onMode="1" bRatio="0.0004000" products="100443 10313"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 111"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 113"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 221"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 223"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 311"/> + <channel onMode="1" bRatio="0.0000050" products="9000111 313"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 331"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 10113"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 20113"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 9000111"/> + <channel onMode="1" bRatio="0.0000010" products="9000211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="9000211 -213"/> + <channel onMode="1" bRatio="0.0000030" products="-9000211 211"/> + <channel onMode="1" bRatio="0.0000100" products="-9000211 213"/> + <channel onMode="1" bRatio="0.0000010" products="-9000211 321"/> + <channel onMode="1" bRatio="0.0000050" products="-9000211 323"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 111"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 113"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 221"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 223"/> + <channel onMode="1" bRatio="0.0000060" products="9010221 311"/> + <channel onMode="1" bRatio="0.0000050" products="9010221 313"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 331"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 10113"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 20113"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 9000111"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 9010221"/> + <channel onMode="1" bRatio="0.0000010" products="111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="113 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="113 113 111"/> + <channel onMode="1" bRatio="0.0000240" products="211 -211 111"/> + <channel onMode="1" bRatio="0.0000030" products="211 -211 113"/> + <channel onMode="1" bRatio="0.0000100" products="213 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="213 -213 111"/> + <channel onMode="1" bRatio="0.0000100" products="-213 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="221 111 111"/> + <channel onMode="1" bRatio="0.0000005" products="221 113 111"/> + <channel onMode="1" bRatio="0.0000050" products="221 113 113"/> + <channel onMode="1" bRatio="0.0000170" products="221 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="221 213 -211"/> + <channel onMode="1" bRatio="0.0000050" products="221 213 -213"/> + <channel onMode="1" bRatio="0.0000050" products="221 -213 211"/> + <channel onMode="1" bRatio="0.0000010" products="221 221 111"/> + <channel onMode="1" bRatio="0.0000002" products="221 221 113"/> + <channel onMode="1" bRatio="0.0000010" products="223 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="223 113 111"/> + <channel onMode="1" bRatio="0.0000030" products="223 211 -211"/> + <channel onMode="1" bRatio="0.0000005" products="223 221 111"/> + <channel onMode="1" bRatio="0.0000050" products="223 221 113"/> + <channel onMode="1" bRatio="0.0000002" products="223 221 221"/> + <channel onMode="1" bRatio="0.0000006" meMode="11" products="311 11 -11"/> + <channel onMode="1" bRatio="0.0000006" meMode="11" products="311 13 -13"/> + <channel onMode="1" bRatio="0.0000001" meMode="11" products="311 15 -15"/> + <channel onMode="1" bRatio="0.0000020" products="311 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="311 113 111"/> + <channel onMode="1" bRatio="0.0000260" products="311 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="311 213 -211"/> + <channel onMode="1" bRatio="0.0000100" products="311 -213 211"/> + <channel onMode="1" bRatio="0.0000010" products="311 221 111"/> + <channel onMode="1" bRatio="0.0000020" products="311 221 113"/> + <channel onMode="1" bRatio="0.0000010" products="311 221 221"/> + <channel onMode="1" bRatio="0.0000050" products="311 223 111"/> + <channel onMode="1" bRatio="0.0000020" products="311 223 221"/> + <channel onMode="1" bRatio="0.0000020" products="311 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 113"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 221"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 223"/> + <channel onMode="1" bRatio="0.0000480" products="311 311 311"/> + <channel onMode="1" bRatio="0.0000018" meMode="11" products="313 11 -11"/> + <channel onMode="1" bRatio="0.0000014" meMode="11" products="313 13 -13"/> + <channel onMode="1" bRatio="0.0000002" meMode="11" products="313 15 -15"/> + <channel onMode="1" bRatio="0.0000100" products="313 113 111"/> + <channel onMode="1" bRatio="0.0000100" products="313 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="313 213 -211"/> + <channel onMode="1" bRatio="0.0000100" products="313 -213 211"/> + <channel onMode="1" bRatio="0.0000050" products="313 221 113"/> + <channel onMode="1" bRatio="0.0000100" products="313 223 111"/> + <channel onMode="1" bRatio="0.0000050" products="313 223 221"/> + <channel onMode="1" bRatio="0.0000010" products="313 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="313 -313 111"/> + <channel onMode="1" bRatio="0.0000005" products="313 -313 221"/> + <channel onMode="1" bRatio="0.0000010" products="-313 311 111"/> + <channel onMode="1" bRatio="0.0000020" products="321 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 -213 111"/> + <channel onMode="1" bRatio="0.0000200" products="321 221 -211"/> + <channel onMode="1" bRatio="0.0000050" products="321 221 -213"/> + <channel onMode="1" bRatio="0.0000050" products="321 223 -211"/> + <channel onMode="1" bRatio="0.0000005" products="321 311 -211"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 -213"/> + <channel onMode="1" bRatio="0.0000010" products="321 -313 -211"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 113"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 221"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 223"/> + <channel onMode="1" bRatio="0.0000100" products="321 -321 313"/> + <channel onMode="1" bRatio="0.0000005" products="-321 311 211"/> + <channel onMode="1" bRatio="0.0000010" products="-321 311 213"/> + <channel onMode="1" bRatio="0.0000010" products="-321 313 211"/> + <channel onMode="1" bRatio="0.0000100" products="323 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="323 -211 113"/> + <channel onMode="1" bRatio="0.0000100" products="323 -213 111"/> + <channel onMode="1" bRatio="0.0000050" products="323 221 -211"/> + <channel onMode="1" bRatio="0.0000050" products="323 221 -213"/> + <channel onMode="1" bRatio="0.0000100" products="323 223 -211"/> + <channel onMode="1" bRatio="0.0000010" products="323 311 -211"/> + <channel onMode="1" bRatio="0.0000010" products="323 -313 -211"/> + <channel onMode="1" bRatio="0.0000010" products="323 -321 111"/> + <channel onMode="1" bRatio="0.0000100" products="323 -321 311"/> + <channel onMode="1" bRatio="0.0000010" products="323 -323 111"/> + <channel onMode="1" bRatio="0.0000005" products="323 -323 221"/> + <channel onMode="1" bRatio="0.0000010" products="-323 311 211"/> + <channel onMode="1" bRatio="0.0000010" products="-323 313 211"/> + <channel onMode="1" bRatio="0.0000010" products="-323 321 111"/> + <channel onMode="1" bRatio="0.0000100" products="-323 321 311"/> + <channel onMode="1" bRatio="0.0000010" products="331 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 113 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 113 113"/> + <channel onMode="1" bRatio="0.0000010" products="331 211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="331 213 -213"/> + <channel onMode="1" bRatio="0.0000010" products="331 221 111"/> + <channel onMode="1" bRatio="0.0000001" products="331 221 113"/> + <channel onMode="1" bRatio="0.0000002" products="331 223 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 223 113"/> + <channel onMode="1" bRatio="0.0000001" products="331 223 221"/> + <channel onMode="1" bRatio="0.0000010" products="331 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 311 113"/> + <channel onMode="1" bRatio="0.0000010" products="331 311 221"/> + <channel onMode="1" bRatio="0.0000010" products="331 311 223"/> + <channel onMode="1" bRatio="0.0000010" products="331 311 311"/> + <channel onMode="1" bRatio="0.0000020" products="331 313 113"/> + <channel onMode="1" bRatio="0.0000020" products="331 313 223"/> + <channel onMode="1" bRatio="0.0000002" products="331 313 -313"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 -211"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 -213"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 -321"/> + <channel onMode="1" bRatio="0.0000020" products="331 323 -211"/> + <channel onMode="1" bRatio="0.0000020" products="331 323 -213"/> + <channel onMode="1" bRatio="0.0000002" products="331 323 -323"/> + <channel onMode="1" bRatio="0.0000010" products="331 331 311"/> + <channel onMode="1" bRatio="0.0000010" products="333 113 111"/> + <channel onMode="1" bRatio="0.0000001" products="333 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="333 213 -211"/> + <channel onMode="1" bRatio="0.0000010" products="333 -213 211"/> + <channel onMode="1" bRatio="0.0000005" products="333 221 113"/> + <channel onMode="1" bRatio="0.0000010" products="333 223 111"/> + <channel onMode="1" bRatio="0.0000100" products="333 311 111"/> + <channel onMode="1" bRatio="0.0000100" products="333 311 113"/> + <channel onMode="1" bRatio="0.0000100" products="333 311 223"/> + <channel onMode="1" bRatio="0.0000001" products="333 311 311"/> + <channel onMode="1" bRatio="0.0000100" products="333 313 111"/> + <channel onMode="1" bRatio="0.0000050" products="333 313 221"/> + <channel onMode="1" bRatio="0.0000100" products="333 321 -211"/> + <channel onMode="1" bRatio="0.0000100" products="333 321 -213"/> + <channel onMode="1" bRatio="0.0000001" products="333 321 -321"/> + <channel onMode="1" bRatio="0.0000100" products="333 323 -211"/> + <channel onMode="1" bRatio="0.0000002" products="333 331 113"/> + <channel onMode="1" bRatio="0.0000020" products="333 331 313"/> + <channel onMode="1" bRatio="0.0000001" products="333 333 111"/> + <channel onMode="1" bRatio="0.0000030" products="333 333 311"/> + <channel onMode="1" bRatio="0.0000030" products="333 333 313"/> + <channel onMode="1" bRatio="0.0015000" products="411 -411 311"/> + <channel onMode="1" bRatio="0.0025000" products="411 -411 313"/> + <channel onMode="1" bRatio="0.0005000" products="-411 211 111"/> + <channel onMode="1" bRatio="0.0011000" products="-411 211 113"/> + <channel onMode="1" bRatio="0.0011000" products="-411 213 111"/> + <channel onMode="1" bRatio="0.0047000" products="413 -411 311"/> + <channel onMode="1" bRatio="0.0025000" products="413 -411 313"/> + <channel onMode="1" bRatio="0.0070000" products="413 -413 311"/> + <channel onMode="1" bRatio="0.0050000" products="413 -413 313"/> + <channel onMode="1" bRatio="0.0008000" products="-413 211 111"/> + <channel onMode="1" bRatio="0.0010000" products="-413 211 113"/> + <channel onMode="1" bRatio="0.0010000" products="-413 213 111"/> + <channel onMode="1" bRatio="0.0018000" products="-413 411 311"/> + <channel onMode="1" bRatio="0.0025000" products="-413 411 313"/> + <channel onMode="1" bRatio="0.0017000" products="421 -411 321"/> + <channel onMode="1" bRatio="0.0025000" products="421 -411 323"/> + <channel onMode="1" bRatio="0.0031000" products="421 -413 321"/> + <channel onMode="1" bRatio="0.0025000" products="421 -413 323"/> + <channel onMode="1" bRatio="0.0005000" products="421 -421 311"/> + <channel onMode="1" bRatio="0.0005000" products="421 -421 313"/> + <channel onMode="1" bRatio="0.0005000" products="-421 211 -211"/> + <channel onMode="1" bRatio="0.0049000" products="423 -411 321"/> + <channel onMode="1" bRatio="0.0025000" products="423 -411 323"/> + <channel onMode="1" bRatio="0.0100000" products="423 -413 321"/> + <channel onMode="1" bRatio="0.0050000" products="423 -413 323"/> + <channel onMode="1" bRatio="0.0005000" products="423 -421 313"/> + <channel onMode="1" bRatio="0.0015000" products="423 -423 311"/> + <channel onMode="1" bRatio="0.0010000" products="423 -423 313"/> + <channel onMode="1" bRatio="0.0005000" products="-423 111 111"/> + <channel onMode="1" bRatio="0.0003000" products="-423 211 -211"/> + <channel onMode="1" bRatio="0.0005000" products="-423 421 313"/> + <channel onMode="1" bRatio="0.0018000" products="431 -411 111"/> + <channel onMode="1" bRatio="0.0037000" products="431 -421 -211"/> + <channel onMode="1" bRatio="0.0018000" products="433 -411 111"/> + <channel onMode="1" bRatio="0.0037000" products="433 -421 -211"/> + <channel onMode="1" bRatio="0.0001000" products="441 311 111"/> + <channel onMode="1" bRatio="0.0002000" products="441 321 -211"/> + <channel onMode="1" bRatio="0.0001000" products="443 311 111"/> + <channel onMode="1" bRatio="0.0002000" products="443 321 -211"/> + <channel onMode="1" bRatio="0.0000900" products="443 333 311"/> + <channel onMode="1" bRatio="0.0001000" products="445 311 111"/> + <channel onMode="1" bRatio="0.0002000" products="445 321 -211"/> + <channel onMode="1" bRatio="0.0000100" products="10311 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="10311 113 111"/> + <channel onMode="1" bRatio="0.0000100" products="10311 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="10311 213 -211"/> + <channel onMode="1" bRatio="0.0000100" products="10311 -213 211"/> + <channel onMode="1" bRatio="0.0000050" products="10311 221 113"/> + <channel onMode="1" bRatio="0.0000100" products="10311 321 -321"/> + <channel onMode="1" bRatio="0.0000020" products="10311 331 113"/> + <channel onMode="1" bRatio="0.0000100" products="10311 333 111"/> + <channel onMode="1" bRatio="0.0000100" products="10321 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="10321 -211 113"/> + <channel onMode="1" bRatio="0.0000100" products="10321 -213 111"/> + <channel onMode="1" bRatio="0.0000050" products="10321 221 -213"/> + <channel onMode="1" bRatio="0.0000100" products="10321 -321 311"/> + <channel onMode="1" bRatio="0.0000020" products="10321 331 -213"/> + <channel onMode="1" bRatio="0.0000100" products="10321 333 -211"/> + <channel onMode="1" bRatio="0.0000100" products="-10321 321 311"/> + <channel onMode="1" bRatio="0.0001000" products="10441 311 111"/> + <channel onMode="1" bRatio="0.0002000" products="10441 321 -211"/> + <channel onMode="1" bRatio="0.0000100" products="20113 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="20113 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="20113 221 111"/> + <channel onMode="1" bRatio="0.0000100" products="20113 311 111"/> + <channel onMode="1" bRatio="0.0000100" products="20113 321 -211"/> + <channel onMode="1" bRatio="0.0000020" products="20113 331 111"/> + <channel onMode="1" bRatio="0.0000100" products="20213 -211 111"/> + <channel onMode="1" bRatio="0.0000050" products="20213 221 -211"/> + <channel onMode="1" bRatio="0.0000100" products="20213 311 -211"/> + <channel onMode="1" bRatio="0.0000020" products="20213 331 -211"/> + <channel onMode="1" bRatio="0.0000100" products="-20213 211 111"/> + <channel onMode="1" bRatio="0.0000050" products="-20213 221 211"/> + <channel onMode="1" bRatio="0.0000100" products="-20213 311 211"/> + <channel onMode="1" bRatio="0.0000100" products="-20213 321 111"/> + <channel onMode="1" bRatio="0.0000020" products="-20213 331 211"/> + <channel onMode="1" bRatio="0.0000020" products="20313 321 -321"/> + <channel onMode="1" bRatio="0.0000020" products="20313 333 111"/> + <channel onMode="1" bRatio="0.0000010" products="20313 333 221"/> + <channel onMode="1" bRatio="0.0000010" products="20313 333 331"/> + <channel onMode="1" bRatio="0.0000020" products="20323 333 -211"/> + <channel onMode="1" bRatio="0.0002000" products="20443 311 111"/> + <channel onMode="1" bRatio="0.0004000" products="20443 321 -211"/> + <channel onMode="1" bRatio="0.0001400" products="30443 311 111"/> + <channel onMode="1" bRatio="0.0001400" products="30443 321 -211"/> + <channel onMode="1" bRatio="0.0000500" products="100441 311 111"/> + <channel onMode="1" bRatio="0.0000800" products="100441 321 -211"/> + <channel onMode="1" bRatio="0.0002000" products="100443 311 111"/> + <channel onMode="1" bRatio="0.0004000" products="100443 321 -211"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="9000111 113 111"/> + <channel onMode="1" bRatio="0.0000100" products="9000111 213 -211"/> + <channel onMode="1" bRatio="0.0000100" products="9000111 -213 211"/> + <channel onMode="1" bRatio="0.0000050" products="9000111 221 113"/> + <channel onMode="1" bRatio="0.0000050" products="9000111 313 111"/> + <channel onMode="1" bRatio="0.0000020" products="9000111 313 221"/> + <channel onMode="1" bRatio="0.0000050" products="9000111 323 -211"/> + <channel onMode="1" bRatio="0.0000020" products="9000111 331 113"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 331 313"/> + <channel onMode="1" bRatio="0.0000010" products="9000211 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="9000211 -211 113"/> + <channel onMode="1" bRatio="0.0000100" products="9000211 -213 111"/> + <channel onMode="1" bRatio="0.0000050" products="9000211 221 -213"/> + <channel onMode="1" bRatio="0.0000020" products="9000211 331 -213"/> + <channel onMode="1" bRatio="0.0000010" products="-9000211 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="-9000211 211 113"/> + <channel onMode="1" bRatio="0.0000100" products="-9000211 213 111"/> + <channel onMode="1" bRatio="0.0000050" products="-9000211 221 213"/> + <channel onMode="1" bRatio="0.0000050" products="-9000211 323 111"/> + <channel onMode="1" bRatio="0.0000020" products="-9000211 323 221"/> + <channel onMode="1" bRatio="0.0000020" products="-9000211 331 213"/> + <channel onMode="1" bRatio="0.0000010" products="-9000211 331 323"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 113 111"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 213 -211"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 -213 211"/> + <channel onMode="1" bRatio="0.0000050" products="9010221 221 113"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 223 111"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 313 111"/> + <channel onMode="1" bRatio="0.0000050" products="9010221 313 221"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 323 -211"/> + <channel onMode="1" bRatio="0.0000020" products="9010221 331 113"/> + <channel onMode="1" bRatio="0.0000020" products="9010221 331 313"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 333 111"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 333 311"/> + <channel onMode="1" bRatio="0.0000020" products="113 111 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="211 -211 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="211 -211 113 111"/> + <channel onMode="1" bRatio="0.0000020" products="213 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="213 -211 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="-213 211 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="-213 211 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="221 113 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="221 211 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="221 211 -211 113"/> + <channel onMode="1" bRatio="0.0000010" products="221 213 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="221 -213 211 111"/> + <channel onMode="1" bRatio="0.0000020" products="221 221 211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="223 111 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="223 211 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="223 221 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="223 221 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="311 111 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 113 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 211 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 211 -211 113"/> + <channel onMode="1" bRatio="0.0000100" products="311 213 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 -213 211 111"/> + <channel onMode="1" bRatio="0.0000050" products="311 221 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="311 221 113 111"/> + <channel onMode="1" bRatio="0.0000050" products="311 221 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="311 221 213 -211"/> + <channel onMode="1" bRatio="0.0000050" products="311 221 -213 211"/> + <channel onMode="1" bRatio="0.0000020" products="311 221 221 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 223 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 223 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="311 223 221 111"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 113 111"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 213 -211"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 -213 211"/> + <channel onMode="1" bRatio="0.0000005" products="311 311 221 111"/> + <channel onMode="1" bRatio="0.0000005" products="311 311 221 113"/> + <channel onMode="1" bRatio="0.0000002" products="311 311 221 221"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 223 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 311 311 111"/> + <channel onMode="1" bRatio="0.0000050" products="311 311 311 221"/> + <channel onMode="1" bRatio="0.0000001" products="311 311 311 311"/> + <channel onMode="1" bRatio="0.0000100" products="313 111 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="313 211 -211 111"/> + <channel onMode="1" bRatio="0.0000050" products="313 221 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="313 221 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="313 311 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="313 311 211 -211"/> + <channel onMode="1" bRatio="0.0000005" products="313 311 221 111"/> + <channel onMode="1" bRatio="0.0000010" products="-313 311 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="-313 311 211 -211"/> + <channel onMode="1" bRatio="0.0000005" products="-313 311 221 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 -211 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 -211 113 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 213 -211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 -213 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 -213 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="321 221 -211 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 221 -211 113"/> + <channel onMode="1" bRatio="0.0000050" products="321 221 -213 111"/> + <channel onMode="1" bRatio="0.0000020" products="321 221 221 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 223 -211 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 223 221 -211"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 -211 113"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 -213 111"/> + <channel onMode="1" bRatio="0.0000005" products="321 311 221 -213"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 223 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 313 311 -211"/> + <channel onMode="1" bRatio="0.0000010" products="321 -313 -211 111"/> + <channel onMode="1" bRatio="0.0000005" products="321 -313 221 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 -313 311 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 321 -321 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 321 -321 -213"/> + <channel onMode="1" bRatio="0.0000001" products="321 321 -321 -321"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 113 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 213 -211"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 -213 211"/> + <channel onMode="1" bRatio="0.0000005" products="321 -321 221 111"/> + <channel onMode="1" bRatio="0.0000005" products="321 -321 221 113"/> + <channel onMode="1" bRatio="0.0000002" products="321 -321 221 221"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 223 111"/> + <channel onMode="1" bRatio="0.0000005" products="321 -321 223 221"/> + <channel onMode="1" bRatio="0.0000100" products="321 -321 311 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 -321 311 113"/> + <channel onMode="1" bRatio="0.0000050" products="321 -321 311 221"/> + <channel onMode="1" bRatio="0.0000100" products="321 -321 311 223"/> + <channel onMode="1" bRatio="0.0000001" products="321 -321 311 311"/> + <channel onMode="1" bRatio="0.0000010" products="-321 311 211 113"/> + <channel onMode="1" bRatio="0.0000010" products="-321 311 213 111"/> + <channel onMode="1" bRatio="0.0000005" products="-321 311 221 213"/> + <channel onMode="1" bRatio="0.0000010" products="-321 311 223 211"/> + <channel onMode="1" bRatio="0.0000010" products="-321 313 211 111"/> + <channel onMode="1" bRatio="0.0000005" products="-321 313 221 211"/> + <channel onMode="1" bRatio="0.0000100" products="323 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="323 -211 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="323 221 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="323 311 -211 111"/> + <channel onMode="1" bRatio="0.0000005" products="323 311 221 -211"/> + <channel onMode="1" bRatio="0.0000100" products="323 311 311 -211"/> + <channel onMode="1" bRatio="0.0000100" products="323 321 -321 -211"/> + <channel onMode="1" bRatio="0.0000010" products="323 -321 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="323 -321 211 -211"/> + <channel onMode="1" bRatio="0.0000005" products="323 -321 221 111"/> + <channel onMode="1" bRatio="0.0000010" products="-323 311 211 111"/> + <channel onMode="1" bRatio="0.0000005" products="-323 311 221 211"/> + <channel onMode="1" bRatio="0.0000010" products="-323 321 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="-323 321 211 -211"/> + <channel onMode="1" bRatio="0.0000005" products="-323 321 221 111"/> + <channel onMode="1" bRatio="0.0000100" products="-323 321 321 -211"/> + <channel onMode="1" bRatio="0.0000010" products="331 113 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 211 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 211 -211 113"/> + <channel onMode="1" bRatio="0.0000010" products="331 213 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 -213 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 221 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="331 223 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 223 211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="331 311 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 311 113 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 311 213 -211"/> + <channel onMode="1" bRatio="0.0000020" products="331 311 -213 211"/> + <channel onMode="1" bRatio="0.0000010" products="331 311 221 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 311 223 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 311 311 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 311 311 113"/> + <channel onMode="1" bRatio="0.0000001" products="331 311 311 221"/> + <channel onMode="1" bRatio="0.0000020" products="331 313 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 313 211 -211"/> + <channel onMode="1" bRatio="0.0000002" products="331 313 311 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 -313 311 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 -211 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 -211 113"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 -213 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 221 -211"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 223 -211"/> + <channel onMode="1" bRatio="0.0000002" products="331 321 311 -213"/> + <channel onMode="1" bRatio="0.0000002" products="331 321 -313 -211"/> + <channel onMode="1" bRatio="0.0000002" products="331 321 -321 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 321 -321 113"/> + <channel onMode="1" bRatio="0.0000001" products="331 321 -321 221"/> + <channel onMode="1" bRatio="0.0000002" products="331 321 -321 223"/> + <channel onMode="1" bRatio="0.0000002" products="331 -321 311 213"/> + <channel onMode="1" bRatio="0.0000002" products="331 -321 313 211"/> + <channel onMode="1" bRatio="0.0000020" products="331 323 -211 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 323 311 -211"/> + <channel onMode="1" bRatio="0.0000002" products="331 323 -321 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 -323 311 211"/> + <channel onMode="1" bRatio="0.0000002" products="331 -323 321 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 211 -211 111"/> + <channel onMode="1" bRatio="0.0000005" products="333 221 111 111"/> + <channel onMode="1" bRatio="0.0000005" products="333 221 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="333 311 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="333 311 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="333 311 221 111"/> + <channel onMode="1" bRatio="0.0000001" products="333 311 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 311 311 311"/> + <channel onMode="1" bRatio="0.0000010" products="333 313 311 311"/> + <channel onMode="1" bRatio="0.0000010" products="333 -313 311 311"/> + <channel onMode="1" bRatio="0.0000100" products="333 321 -211 111"/> + <channel onMode="1" bRatio="0.0000050" products="333 321 221 -211"/> + <channel onMode="1" bRatio="0.0000001" products="333 321 311 -211"/> + <channel onMode="1" bRatio="0.0000001" products="333 321 -321 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 321 -321 311"/> + <channel onMode="1" bRatio="0.0000010" products="333 321 -321 313"/> + <channel onMode="1" bRatio="0.0000001" products="333 -321 311 211"/> + <channel onMode="1" bRatio="0.0000010" products="333 -323 321 311"/> + <channel onMode="1" bRatio="0.0000002" products="333 331 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="333 331 211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="333 331 311 111"/> + <channel onMode="1" bRatio="0.0000020" products="333 331 321 -211"/> + <channel onMode="1" bRatio="0.0010000" products="-411 211 111 111"/> + <channel onMode="1" bRatio="0.0022000" products="-411 211 211 -211"/> + <channel onMode="1" bRatio="0.0010000" products="-413 211 111 111"/> + <channel onMode="1" bRatio="0.0001000" products="-421 111 111 111"/> + <channel onMode="1" bRatio="0.0010000" products="-421 211 -211 111"/> + <channel onMode="1" bRatio="0.0001000" products="-423 111 111 111"/> + <channel onMode="1" bRatio="0.0010000" products="-423 211 -211 111"/> + <channel onMode="1" bRatio="0.0022000" products="431 -411 111 111"/> + <channel onMode="1" bRatio="0.0030000" products="431 -411 211 -211"/> + <channel onMode="1" bRatio="0.0022000" products="431 -421 -211 111"/> + <channel onMode="1" bRatio="0.0022000" products="433 -411 111 111"/> + <channel onMode="1" bRatio="0.0030000" products="433 -411 211 -211"/> + <channel onMode="1" bRatio="0.0022000" products="433 -421 -211 111"/> + <channel onMode="1" bRatio="0.0001000" products="441 311 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="441 311 211 -211"/> + <channel onMode="1" bRatio="0.0001000" products="441 321 -211 111"/> + <channel onMode="1" bRatio="0.0001000" products="445 311 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="445 311 211 -211"/> + <channel onMode="1" bRatio="0.0001000" products="445 321 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="10311 111 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="10311 211 -211 111"/> + <channel onMode="1" bRatio="0.0000050" products="10311 221 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="10311 221 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="10311 311 311 111"/> + <channel onMode="1" bRatio="0.0000050" products="10311 311 311 221"/> + <channel onMode="1" bRatio="0.0000100" products="10311 321 311 -211"/> + <channel onMode="1" bRatio="0.0000100" products="10311 321 -321 111"/> + <channel onMode="1" bRatio="0.0000050" products="10311 321 -321 221"/> + <channel onMode="1" bRatio="0.0000050" products="10311 331 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="10311 331 211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="10311 331 311 311"/> + <channel onMode="1" bRatio="0.0000020" products="10311 331 321 -321"/> + <channel onMode="1" bRatio="0.0000100" products="-10311 311 311 111"/> + <channel onMode="1" bRatio="0.0000050" products="-10311 311 311 221"/> + <channel onMode="1" bRatio="0.0000100" products="-10311 321 311 -211"/> + <channel onMode="1" bRatio="0.0000020" products="-10311 331 311 311"/> + <channel onMode="1" bRatio="0.0000100" products="10321 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="10321 -211 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="10321 221 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="10321 311 311 -211"/> + <channel onMode="1" bRatio="0.0000100" products="10321 321 -321 -211"/> + <channel onMode="1" bRatio="0.0000020" products="10321 331 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="-10321 321 321 -211"/> + <channel onMode="1" bRatio="0.0001000" products="10441 311 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="10441 311 211 -211"/> + <channel onMode="1" bRatio="0.0001000" products="10441 321 -211 111"/> + <channel onMode="1" bRatio="0.0000020" products="20313 311 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="20313 311 311 221"/> + <channel onMode="1" bRatio="0.0000020" products="20313 321 -321 111"/> + <channel onMode="1" bRatio="0.0000010" products="20313 321 -321 221"/> + <channel onMode="1" bRatio="0.0000010" products="20313 331 311 311"/> + <channel onMode="1" bRatio="0.0000010" products="20313 331 321 -321"/> + <channel onMode="1" bRatio="0.0000020" products="-20313 311 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="-20313 311 311 221"/> + <channel onMode="1" bRatio="0.0000010" products="-20313 331 311 311"/> + <channel onMode="1" bRatio="0.0000020" products="20323 321 -321 -211"/> + <channel onMode="1" bRatio="0.0000020" products="-20323 321 321 -211"/> + <channel onMode="1" bRatio="0.0002000" products="20443 311 111 111"/> + <channel onMode="1" bRatio="0.0004000" products="20443 311 211 -211"/> + <channel onMode="1" bRatio="0.0002000" products="20443 321 -211 111"/> + <channel onMode="1" bRatio="0.0000700" products="30443 311 111 111"/> + <channel onMode="1" bRatio="0.0001400" products="30443 311 211 -211"/> + <channel onMode="1" bRatio="0.0000700" products="30443 321 -211 111"/> + <channel onMode="1" bRatio="0.0000500" products="100441 311 111 111"/> + <channel onMode="1" bRatio="0.0000800" products="100441 311 211 -211"/> + <channel onMode="1" bRatio="0.0000500" products="100441 321 -211 111"/> + <channel onMode="1" bRatio="0.0001000" products="100443 311 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="100443 311 211 -211"/> + <channel onMode="1" bRatio="0.0001000" products="100443 321 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 211 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="9000211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="9000211 -211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="-9000211 211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="-9000211 211 211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="9010221 111 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="9010221 211 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 221 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 221 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 311 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 321 311 -211"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 321 -321 111"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 321 -321 311"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 -321 311 211"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 331 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 331 211 -211"/> + <channel onMode="1" bRatio="0.0000005" products="111 111 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="211 211 -211 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="211 -211 111 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="221 111 111 111 111"/> + <channel onMode="1" bRatio="0.0000005" products="221 211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000005" products="221 211 -211 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="311 111 111 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="311 211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="311 211 -211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="311 221 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="311 221 211 -211 111"/> + <channel onMode="1" bRatio="0.0000002" products="311 311 111 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="311 311 211 -211 111"/> + <channel onMode="1" bRatio="0.0000001" products="311 311 221 111 111"/> + <channel onMode="1" bRatio="0.0000001" products="311 311 221 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="311 311 311 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 311 311 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="311 311 311 221 111"/> + <channel onMode="1" bRatio="0.0000001" products="311 311 311 311 111"/> + <channel onMode="1" bRatio="0.0000020" products="321 211 -211 -211 111"/> + <channel onMode="1" bRatio="0.0000020" products="321 -211 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 221 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="321 221 -211 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="321 311 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000002" products="321 311 -211 111 111"/> + <channel onMode="1" bRatio="0.0000001" products="321 311 221 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 311 311 -211 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 311 311 221 -211"/> + <channel onMode="1" bRatio="0.0000001" products="321 311 311 311 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 321 -321 -211 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 321 -321 221 -211"/> + <channel onMode="1" bRatio="0.0000001" products="321 321 -321 311 -211"/> + <channel onMode="1" bRatio="0.0000001" products="321 321 -321 -321 111"/> + <channel onMode="1" bRatio="0.0000001" products="321 321 -321 -321 311"/> + <channel onMode="1" bRatio="0.0000002" products="321 -321 111 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="321 -321 211 -211 111"/> + <channel onMode="1" bRatio="0.0000001" products="321 -321 221 111 111"/> + <channel onMode="1" bRatio="0.0000001" products="321 -321 221 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 -321 311 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 -321 311 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="321 -321 311 221 111"/> + <channel onMode="1" bRatio="0.0000001" products="321 -321 311 311 111"/> + <channel onMode="1" bRatio="0.0000001" products="321 -321 311 311 311"/> + <channel onMode="1" bRatio="0.0000001" products="321 -321 -321 311 211"/> + <channel onMode="1" bRatio="0.0000002" products="-321 311 211 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="-321 311 211 211 -211"/> + <channel onMode="1" bRatio="0.0000001" products="-321 311 221 211 111"/> + <channel onMode="1" bRatio="0.0000001" products="-321 311 311 311 211"/> + <channel onMode="1" bRatio="0.0000001" products="331 111 111 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000002" products="331 211 -211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 311 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 311 211 -211 111"/> + <channel onMode="1" bRatio="0.0000001" products="331 311 311 111 111"/> + <channel onMode="1" bRatio="0.0000001" products="331 311 311 211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="331 311 311 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 -211 111 111"/> + <channel onMode="1" bRatio="0.0000001" products="331 321 311 -211 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 311 311 -211"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 321 -321 -211"/> + <channel onMode="1" bRatio="0.0000001" products="331 321 -321 111 111"/> + <channel onMode="1" bRatio="0.0000001" products="331 321 -321 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="331 321 -321 311 111"/> + <channel onMode="1" bRatio="0.0000001" products="331 -321 311 211 111"/> + <channel onMode="1" bRatio="0.0000001" products="333 311 311 311 111"/> + <channel onMode="1" bRatio="0.0000001" products="333 321 311 311 -211"/> + <channel onMode="1" bRatio="0.0000001" products="333 321 321 -321 -211"/> + <channel onMode="1" bRatio="0.0000001" products="333 321 -321 311 111"/> + <channel onMode="1" bRatio="0.0050000" meMode="55" products="-3 1"/> + <channel onMode="1" bRatio="0.0110000" meMode="63" products="-4101 2101"/> + <channel onMode="1" bRatio="0.0220000" meMode="63" products="-4103 2103"/> + <channel onMode="1" bRatio="0.0030000" meMode="63" products="-4301 2101"/> + <channel onMode="1" bRatio="0.0060000" meMode="63" products="-4303 2103"/> + <channel onMode="1" bRatio="0.0000700" meMode="23" products="1 -1 -1 1"/> + <channel onMode="1" bRatio="0.0018000" meMode="23" products="1 -1 -3 1"/> + <channel onMode="1" bRatio="0.0030000" meMode="23" products="2 -1 -2 1"/> + <channel onMode="1" bRatio="0.0020500" meMode="23" products="2 -2 -1 1"/> + <channel onMode="1" bRatio="0.0022000" meMode="23" products="2 -2 -3 1"/> + <channel onMode="1" bRatio="0.0210000" meMode="63" products="2 -3 -4 1"/> + <channel onMode="1" bRatio="0.0180000" meMode="23" products="2 -4 -1 1"/> + <channel onMode="1" bRatio="0.0009000" meMode="23" products="2 -4 -3 1"/> + <channel onMode="1" bRatio="0.0000900" meMode="23" products="3 -3 -1 1"/> + <channel onMode="1" bRatio="0.0015000" meMode="23" products="3 -3 -3 1"/> + <channel onMode="1" bRatio="0.0060000" meMode="43" products="4 -1 -4 1"/> + <channel onMode="1" bRatio="0.0040000" meMode="23" products="4 -3 -2 1"/> + <channel onMode="1" bRatio="0.0740000" meMode="43" products="4 -3 -4 1"/> + <channel onMode="2" bRatio="0.0018920" meMode="22" products="12 -11 1 -2"/> + <channel onMode="2" bRatio="0.0018920" meMode="22" products="14 -13 1 -2"/> + <channel onMode="2" bRatio="0.0012910" products="443 313"/> + <channel onMode="2" bRatio="0.0000500" products="445 130"/> + <channel onMode="2" bRatio="0.0000500" products="445 310"/> + <channel onMode="2" bRatio="0.0000100" products="213 -211 113"/> + <channel onMode="2" bRatio="0.0000100" products="223 213 -211"/> + <channel onMode="2" bRatio="0.0000067" products="313 111 111"/> + <channel onMode="2" bRatio="0.0000100" products="321 -211 113"/> + <channel onMode="2" bRatio="0.0000010" products="321 -321 130"/> + <channel onMode="2" bRatio="0.0000010" products="321 -321 310"/> + <channel onMode="2" bRatio="0.0000070" products="333 311 221"/> + <channel onMode="2" bRatio="0.0005000" products="423 -421 311"/> + <channel onMode="2" bRatio="0.0015000" products="-423 421 311"/> + <channel onMode="2" bRatio="0.0000050" products="9000211 313 -211"/> + <channel onMode="2" bRatio="0.0003118" meMode="31" products="1 -3 22"/> + <channel onMode="2" bRatio="0.0000050" meMode="12" products="1 -3 11 -11"/> + <channel onMode="2" bRatio="0.0000025" meMode="12" products="1 -3 13 -13"/> + <channel onMode="2" bRatio="0.0000002" meMode="12" products="1 -3 15 -15"/> + <channel onMode="2" bRatio="0.3158500" meMode="23" products="2 -1 -4 1"/> + <channel onMode="3" bRatio="0.0018920" meMode="22" products="12 -11 -2 1"/> + <channel onMode="3" bRatio="0.0018920" meMode="22" products="14 -13 -2 1"/> + <channel onMode="3" bRatio="0.0012310" products="443 313"/> + <channel onMode="3" bRatio="0.0000100" products="445 130"/> + <channel onMode="3" bRatio="0.0000100" products="445 310"/> + <channel onMode="3" bRatio="0.0000100" products="-213 211 113"/> + <channel onMode="3" bRatio="0.0000100" products="223 -213 211"/> + <channel onMode="3" bRatio="0.0000067" products="-313 111 111"/> + <channel onMode="3" bRatio="0.0000050" products="321 -211 113"/> + <channel onMode="3" bRatio="0.0000105" products="321 -321 130"/> + <channel onMode="3" bRatio="0.0000105" products="321 -321 310"/> + <channel onMode="3" bRatio="0.0000050" products="333 311 221"/> + <channel onMode="3" bRatio="0.0015000" products="423 -421 311"/> + <channel onMode="3" bRatio="0.0005000" products="-423 421 311"/> + <channel onMode="3" bRatio="0.0000050" products="-9000211 313 211"/> + <channel onMode="3" bRatio="0.0003118" meMode="31" products="-3 1 22"/> + <channel onMode="3" bRatio="0.3160000" meMode="23" products="2 -1 -4 1"/> + <channel onMode="3" bRatio="0.0000050" meMode="12" products="-3 1 11 -11"/> + <channel onMode="3" bRatio="0.0000025" meMode="12" products="-3 1 13 -13"/> + <channel onMode="3" bRatio="0.0000002" meMode="12" products="-3 1 15 -15"/> +</particle> + +<!-- +<particle id="513" name="B*0" antiName="B*bar0" spinType="3" chargeType="0" colType="0" + m0="5.32520"> + <channel onMode="1" bRatio="1.0000000" products="511 22"/> +</particle> +--> + +<!-- +<particle id="515" name="B*_20" antiName="B*_2bar0" spinType="5" chargeType="0" colType="0" + m0="5.74300" mWidth="0.02300" mMin="5.63000" mMax="6.03000"> + <channel onMode="1" bRatio="0.3100000" products="523 -211"/> + <channel onMode="1" bRatio="0.1500000" products="513 111"/> + <channel onMode="1" bRatio="0.3100000" products="521 -211"/> + <channel onMode="1" bRatio="0.1500000" products="511 111"/> + <channel onMode="1" bRatio="0.0500000" products="523 -211 111"/> + <channel onMode="1" bRatio="0.0300000" products="513 211 -211"/> +</particle> +--> + +<particle id="521" name="B+" antiName="B-" spinType="1" chargeType="3" colType="0" + m0="5.27925" tau0="4.91100e-01"> + <channel onMode="1" bRatio="0.0000930" products="16 -15"/> + <channel onMode="1" bRatio="0.0000720" meMode="22" products="12 -11 111"/> + <channel onMode="1" bRatio="0.0001450" meMode="22" products="12 -11 113"/> + <channel onMode="1" bRatio="0.0000840" meMode="22" products="12 -11 221"/> + <channel onMode="1" bRatio="0.0001450" meMode="22" products="12 -11 223"/> + <channel onMode="1" bRatio="0.0000840" meMode="22" products="12 -11 331"/> + <channel onMode="1" bRatio="0.0224000" meMode="22" products="12 -11 -421"/> + <channel onMode="1" bRatio="0.0617000" meMode="22" products="12 -11 -423"/> + <channel onMode="1" bRatio="0.0030000" meMode="22" products="12 -11 -425"/> + <channel onMode="1" bRatio="0.0049000" meMode="22" products="12 -11 -10421"/> + <channel onMode="1" bRatio="0.0056000" meMode="22" products="12 -11 -10423"/> + <channel onMode="1" bRatio="0.0090000" meMode="22" products="12 -11 -20423"/> + <channel onMode="1" bRatio="0.0000720" meMode="22" products="14 -13 111"/> + <channel onMode="1" bRatio="0.0001450" meMode="22" products="14 -13 113"/> + <channel onMode="1" bRatio="0.0000840" meMode="22" products="14 -13 221"/> + <channel onMode="1" bRatio="0.0001450" meMode="22" products="14 -13 223"/> + <channel onMode="1" bRatio="0.0000840" meMode="22" products="14 -13 331"/> + <channel onMode="1" bRatio="0.0224000" meMode="22" products="14 -13 -421"/> + <channel onMode="1" bRatio="0.0617000" meMode="22" products="14 -13 -423"/> + <channel onMode="1" bRatio="0.0030000" meMode="22" products="14 -13 -425"/> + <channel onMode="1" bRatio="0.0049000" meMode="22" products="14 -13 -10421"/> + <channel onMode="1" bRatio="0.0056000" meMode="22" products="14 -13 -10423"/> + <channel onMode="1" bRatio="0.0090000" meMode="22" products="14 -13 -20423"/> + <channel onMode="1" bRatio="0.0000300" meMode="22" products="16 -15 111"/> + <channel onMode="1" bRatio="0.0000420" meMode="22" products="16 -15 113"/> + <channel onMode="1" bRatio="0.0000120" meMode="22" products="16 -15 221"/> + <channel onMode="1" bRatio="0.0000420" meMode="22" products="16 -15 223"/> + <channel onMode="1" bRatio="0.0000200" meMode="22" products="16 -15 225"/> + <channel onMode="1" bRatio="0.0000180" meMode="22" products="16 -15 331"/> + <channel onMode="1" bRatio="0.0000200" meMode="22" products="16 -15 335"/> + <channel onMode="1" bRatio="0.0070000" meMode="22" products="16 -15 -421"/> + <channel onMode="1" bRatio="0.0160000" meMode="22" products="16 -15 -423"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="16 -15 -425"/> + <channel onMode="1" bRatio="0.0000270" meMode="22" products="16 -15 10113"/> + <channel onMode="1" bRatio="0.0000020" meMode="22" products="16 -15 10221"/> + <channel onMode="1" bRatio="0.0000130" meMode="22" products="16 -15 10223"/> + <channel onMode="1" bRatio="0.0000130" meMode="22" products="16 -15 10333"/> + <channel onMode="1" bRatio="0.0013000" meMode="22" products="16 -15 -10421"/> + <channel onMode="1" bRatio="0.0013000" meMode="22" products="16 -15 -10423"/> + <channel onMode="1" bRatio="0.0000460" meMode="22" products="16 -15 20113"/> + <channel onMode="1" bRatio="0.0000230" meMode="22" products="16 -15 20223"/> + <channel onMode="1" bRatio="0.0000230" meMode="22" products="16 -15 20333"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="16 -15 -20423"/> + <channel onMode="1" bRatio="0.0000040" meMode="22" products="16 -15 9000111"/> + <channel onMode="1" bRatio="0.0000020" meMode="22" products="16 -15 9010221"/> + <channel onMode="1" bRatio="0.0019000" meMode="22" products="12 -11 -411 211"/> + <channel onMode="1" bRatio="0.0006000" meMode="22" products="12 -11 -413 211"/> + <channel onMode="1" bRatio="0.0010000" meMode="22" products="12 -11 -421 111"/> + <channel onMode="1" bRatio="0.0003000" meMode="22" products="12 -11 -423 111"/> + <channel onMode="1" bRatio="0.0019000" meMode="22" products="14 -13 -411 211"/> + <channel onMode="1" bRatio="0.0006000" meMode="22" products="14 -13 -413 211"/> + <channel onMode="1" bRatio="0.0010000" meMode="22" products="14 -13 -421 111"/> + <channel onMode="1" bRatio="0.0003000" meMode="22" products="14 -13 -423 111"/> + <channel onMode="1" bRatio="0.0000055" products="211 111"/> + <channel onMode="1" bRatio="0.0000091" products="211 113"/> + <channel onMode="1" bRatio="0.0000120" products="211 130"/> + <channel onMode="1" bRatio="0.0000120" products="213 111"/> + <channel onMode="1" bRatio="0.0000150" products="213 113"/> + <channel onMode="1" bRatio="0.0000048" products="221 211"/> + <channel onMode="1" bRatio="0.0000086" products="221 213"/> + <channel onMode="1" bRatio="0.0000059" products="223 211"/> + <channel onMode="1" bRatio="0.0000130" products="223 213"/> + <channel onMode="1" bRatio="0.0000023" products="225 211"/> + <channel onMode="1" bRatio="0.0000120" products="310 211"/> + <channel onMode="1" bRatio="0.0000010" products="311 213"/> + <channel onMode="1" bRatio="0.0000100" products="313 213"/> + <channel onMode="1" bRatio="0.0000120" products="321 111"/> + <channel onMode="1" bRatio="0.0000052" products="321 113"/> + <channel onMode="1" bRatio="0.0000026" products="321 221"/> + <channel onMode="1" bRatio="0.0000051" products="321 223"/> + <channel onMode="1" bRatio="0.0000010" products="321 311"/> + <channel onMode="1" bRatio="0.0000403" products="323 22"/> + <channel onMode="1" bRatio="0.0000020" products="323 111"/> + <channel onMode="1" bRatio="0.0000100" products="323 113"/> + <channel onMode="1" bRatio="0.0000240" products="323 221"/> + <channel onMode="1" bRatio="0.0000010" products="323 223"/> + <channel onMode="1" bRatio="0.0000030" products="323 311"/> + <channel onMode="1" bRatio="0.0000010" products="323 -313"/> + <channel onMode="1" bRatio="0.0000042" products="331 211"/> + <channel onMode="1" bRatio="0.0000010" products="331 213"/> + <channel onMode="1" bRatio="0.0000780" products="331 321"/> + <channel onMode="1" bRatio="0.0000010" products="331 323"/> + <channel onMode="1" bRatio="0.0000010" products="333 211"/> + <channel onMode="1" bRatio="0.0000010" products="333 213"/> + <channel onMode="1" bRatio="0.0000090" products="333 321"/> + <channel onMode="1" bRatio="0.0000110" products="333 323"/> + <channel onMode="1" bRatio="0.0000005" products="411 111"/> + <channel onMode="1" bRatio="0.0000110" products="411 311"/> + <channel onMode="1" bRatio="0.0000005" products="413 111"/> + <channel onMode="1" bRatio="0.0000060" products="413 311"/> + <channel onMode="1" bRatio="0.0050000" products="-421 211"/> + <channel onMode="1" bRatio="0.0134000" products="-421 213"/> + <channel onMode="1" bRatio="0.0004100" products="-421 321"/> + <channel onMode="1" bRatio="0.0006100" products="-421 323"/> + <channel onMode="1" bRatio="0.0002700" products="-421 411"/> + <channel onMode="1" bRatio="0.0003350" products="-421 413"/> + <channel onMode="1" bRatio="0.0046000" products="-423 211"/> + <channel onMode="1" bRatio="0.0098000" products="-423 213"/> + <channel onMode="1" bRatio="0.0003600" products="-423 321"/> + <channel onMode="1" bRatio="0.0007700" products="-423 323"/> + <channel onMode="1" bRatio="0.0003350" products="-423 411"/> + <channel onMode="1" bRatio="0.0010400" products="-423 413"/> + <channel onMode="1" bRatio="0.0008000" products="-425 211"/> + <channel onMode="1" bRatio="0.0038000" products="-425 213"/> + <channel onMode="1" bRatio="0.0000200" products="431 111"/> + <channel onMode="1" bRatio="0.0000280" products="431 113"/> + <channel onMode="1" bRatio="0.0129000" products="431 -421"/> + <channel onMode="1" bRatio="0.0124000" products="431 -423"/> + <channel onMode="1" bRatio="0.0042000" products="431 -425"/> + <channel onMode="1" bRatio="0.0000200" products="433 111"/> + <channel onMode="1" bRatio="0.0000280" products="433 113"/> + <channel onMode="1" bRatio="0.0111000" products="433 -421"/> + <channel onMode="1" bRatio="0.0278000" products="433 -423"/> + <channel onMode="1" bRatio="0.0040000" products="433 -425"/> + <channel onMode="1" bRatio="0.0009000" products="441 321"/> + <channel onMode="1" bRatio="0.0012000" products="441 323"/> + <channel onMode="1" bRatio="0.0000400" products="443 211"/> + <channel onMode="1" bRatio="0.0000600" products="443 213"/> + <channel onMode="1" bRatio="0.0010600" products="443 321"/> + <channel onMode="1" bRatio="0.0014300" products="443 323"/> + <channel onMode="1" bRatio="0.0005000" products="443 325"/> + <channel onMode="1" bRatio="0.0000200" products="445 321"/> + <channel onMode="1" bRatio="0.0000100" products="10113 211"/> + <channel onMode="1" bRatio="0.0000100" products="10113 321"/> + <channel onMode="1" bRatio="0.0000100" products="10213 111"/> + <channel onMode="1" bRatio="0.0000100" products="10213 311"/> + <channel onMode="1" bRatio="0.0000700" products="10311 211"/> + <channel onMode="1" bRatio="0.0000100" products="10311 213"/> + <channel onMode="1" bRatio="0.0000020" products="-10311 321"/> + <channel onMode="1" bRatio="0.0000020" products="10321 111"/> + <channel onMode="1" bRatio="0.0000100" products="10321 113"/> + <channel onMode="1" bRatio="0.0000020" products="10321 311"/> + <channel onMode="1" bRatio="0.0000100" products="10321 333"/> + <channel onMode="1" bRatio="0.0018000" products="10323 443"/> + <channel onMode="1" bRatio="0.0009100" products="-10421 211"/> + <channel onMode="1" bRatio="0.0010000" products="-10423 211"/> + <channel onMode="1" bRatio="0.0007000" products="-10423 213"/> + <channel onMode="1" bRatio="0.0012000" products="-10423 431"/> + <channel onMode="1" bRatio="0.0024000" products="-10423 433"/> + <channel onMode="1" bRatio="0.0016000" products="10431 -421"/> + <channel onMode="1" bRatio="0.0016000" products="10431 -423"/> + <channel onMode="1" bRatio="0.0003000" products="10441 321"/> + <channel onMode="1" bRatio="0.0004000" products="10441 323"/> + <channel onMode="1" bRatio="0.0000400" products="20113 211"/> + <channel onMode="1" bRatio="0.0000100" products="20113 321"/> + <channel onMode="1" bRatio="0.0000200" products="20113 323"/> + <channel onMode="1" bRatio="0.0000400" products="20213 111"/> + <channel onMode="1" bRatio="0.0000100" products="20213 113"/> + <channel onMode="1" bRatio="0.0000100" products="20213 223"/> + <channel onMode="1" bRatio="0.0000100" products="20213 311"/> + <channel onMode="1" bRatio="0.0000200" products="20213 313"/> + <channel onMode="1" bRatio="0.0088700" products="20213 -421"/> + <channel onMode="1" bRatio="0.0159700" products="20213 -423"/> + <channel onMode="1" bRatio="0.0000500" products="20213 20113"/> + <channel onMode="1" bRatio="0.0000020" products="20323 333"/> + <channel onMode="1" bRatio="0.0001000" products="20323 443"/> + <channel onMode="1" bRatio="0.0007500" products="-20423 211"/> + <channel onMode="1" bRatio="0.0022000" products="-20423 213"/> + <channel onMode="1" bRatio="0.0006000" products="-20423 431"/> + <channel onMode="1" bRatio="0.0012000" products="-20423 433"/> + <channel onMode="1" bRatio="0.0041000" products="20433 -421"/> + <channel onMode="1" bRatio="0.0098000" products="20433 -423"/> + <channel onMode="1" bRatio="0.0005700" products="20443 321"/> + <channel onMode="1" bRatio="0.0002900" products="20443 323"/> + <channel onMode="1" bRatio="0.0004800" products="30443 321"/> + <channel onMode="1" bRatio="0.0005000" products="30443 323"/> + <channel onMode="1" bRatio="0.0003000" products="30443 10323"/> + <channel onMode="1" bRatio="0.0000022" products="100113 211"/> + <channel onMode="1" bRatio="0.0000010" products="100113 321"/> + <channel onMode="1" bRatio="0.0003600" products="100441 321"/> + <channel onMode="1" bRatio="0.0004800" products="100441 323"/> + <channel onMode="1" bRatio="0.0006300" products="100443 321"/> + <channel onMode="1" bRatio="0.0006000" products="100443 323"/> + <channel onMode="1" bRatio="0.0004000" products="100443 10323"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 211"/> + <channel onMode="1" bRatio="0.0000100" products="9000111 213"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 321"/> + <channel onMode="1" bRatio="0.0000050" products="9000111 323"/> + <channel onMode="1" bRatio="0.0000010" products="9000211 111"/> + <channel onMode="1" bRatio="0.0000020" products="9000211 113"/> + <channel onMode="1" bRatio="0.0000010" products="9000211 311"/> + <channel onMode="1" bRatio="0.0000050" products="9000211 313"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 211"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 213"/> + <channel onMode="1" bRatio="0.0000085" products="9010221 321"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 323"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 20213"/> + <channel onMode="1" bRatio="0.0000260" products="211 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="211 113 111"/> + <channel onMode="1" bRatio="0.0000100" products="211 113 113"/> + <channel onMode="1" bRatio="0.0000160" products="211 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="213 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="213 113 111"/> + <channel onMode="1" bRatio="0.0000100" products="213 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="213 -213 211"/> + <channel onMode="1" bRatio="0.0000100" products="-213 211 211"/> + <channel onMode="1" bRatio="0.0000010" products="221 211 111"/> + <channel onMode="1" bRatio="0.0000050" products="221 211 113"/> + <channel onMode="1" bRatio="0.0000050" products="221 213 111"/> + <channel onMode="1" bRatio="0.0000050" products="221 213 113"/> + <channel onMode="1" bRatio="0.0000010" products="221 221 211"/> + <channel onMode="1" bRatio="0.0000020" products="221 221 213"/> + <channel onMode="1" bRatio="0.0000100" products="223 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="223 211 113"/> + <channel onMode="1" bRatio="0.0000100" products="223 213 111"/> + <channel onMode="1" bRatio="0.0000050" products="223 221 211"/> + <channel onMode="1" bRatio="0.0000050" products="223 221 213"/> + <channel onMode="1" bRatio="0.0000010" products="311 211 111"/> + <channel onMode="1" bRatio="0.0000050" products="311 211 113"/> + <channel onMode="1" bRatio="0.0000100" products="311 213 111"/> + <channel onMode="1" bRatio="0.0000010" products="311 221 211"/> + <channel onMode="1" bRatio="0.0000050" products="311 221 213"/> + <channel onMode="1" bRatio="0.0000050" products="311 223 211"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 211"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 213"/> + <channel onMode="1" bRatio="0.0000100" products="313 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="313 211 113"/> + <channel onMode="1" bRatio="0.0000100" products="313 213 111"/> + <channel onMode="1" bRatio="0.0000050" products="313 221 211"/> + <channel onMode="1" bRatio="0.0000050" products="313 221 213"/> + <channel onMode="1" bRatio="0.0000100" products="313 223 211"/> + <channel onMode="1" bRatio="0.0000010" products="313 311 211"/> + <channel onMode="1" bRatio="0.0000010" products="313 -313 211"/> + <channel onMode="1" bRatio="0.0000010" products="-313 311 211"/> + <channel onMode="1" bRatio="0.0000006" meMode="11" products="321 11 -11"/> + <channel onMode="1" bRatio="0.0000006" meMode="11" products="321 13 -13"/> + <channel onMode="1" bRatio="0.0000001" meMode="11" products="321 15 -15"/> + <channel onMode="1" bRatio="0.0000010" products="321 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 113 111"/> + <channel onMode="1" bRatio="0.0000049" products="321 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 213 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 -213 211"/> + <channel onMode="1" bRatio="0.0000010" products="321 221 111"/> + <channel onMode="1" bRatio="0.0000020" products="321 221 113"/> + <channel onMode="1" bRatio="0.0000010" products="321 221 221"/> + <channel onMode="1" bRatio="0.0000050" products="321 223 111"/> + <channel onMode="1" bRatio="0.0000020" products="321 223 221"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 113"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 221"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 223"/> + <channel onMode="1" bRatio="0.0000480" products="321 311 311"/> + <channel onMode="1" bRatio="0.0000100" products="321 313 311"/> + <channel onMode="1" bRatio="0.0000010" products="321 -313 111"/> + <channel onMode="1" bRatio="0.0000005" products="321 -313 221"/> + <channel onMode="1" bRatio="0.0000100" products="321 -313 311"/> + <channel onMode="1" bRatio="0.0000001" products="321 321 -211"/> + <channel onMode="1" bRatio="0.0000260" products="321 321 -321"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 211"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 213"/> + <channel onMode="1" bRatio="0.0000001" products="-321 211 211"/> + <channel onMode="1" bRatio="0.0000018" meMode="11" products="323 11 -11"/> + <channel onMode="1" bRatio="0.0000014" meMode="11" products="323 13 -13"/> + <channel onMode="1" bRatio="0.0000002" meMode="11" products="323 15 -15"/> + <channel onMode="1" bRatio="0.0000100" products="323 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="323 113 111"/> + <channel onMode="1" bRatio="0.0000100" products="323 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="323 213 -211"/> + <channel onMode="1" bRatio="0.0000100" products="323 -213 211"/> + <channel onMode="1" bRatio="0.0000050" products="323 221 111"/> + <channel onMode="1" bRatio="0.0000050" products="323 221 113"/> + <channel onMode="1" bRatio="0.0000020" products="323 221 221"/> + <channel onMode="1" bRatio="0.0000100" products="323 223 111"/> + <channel onMode="1" bRatio="0.0000050" products="323 223 221"/> + <channel onMode="1" bRatio="0.0000010" products="323 311 111"/> + <channel onMode="1" bRatio="0.0000005" products="323 311 221"/> + <channel onMode="1" bRatio="0.0000100" products="323 311 311"/> + <channel onMode="1" bRatio="0.0000010" products="323 -313 111"/> + <channel onMode="1" bRatio="0.0000005" products="323 -313 221"/> + <channel onMode="1" bRatio="0.0000100" products="323 321 -321"/> + <channel onMode="1" bRatio="0.0000010" products="323 -321 211"/> + <channel onMode="1" bRatio="0.0000010" products="-323 321 211"/> + <channel onMode="1" bRatio="0.0000100" products="-323 321 321"/> + <channel onMode="1" bRatio="0.0000010" products="331 211 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 211 113"/> + <channel onMode="1" bRatio="0.0000020" products="331 213 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 213 113"/> + <channel onMode="1" bRatio="0.0000010" products="331 221 211"/> + <channel onMode="1" bRatio="0.0000020" products="331 223 211"/> + <channel onMode="1" bRatio="0.0000020" products="331 223 213"/> + <channel onMode="1" bRatio="0.0000010" products="331 311 211"/> + <channel onMode="1" bRatio="0.0000020" products="331 311 213"/> + <channel onMode="1" bRatio="0.0000020" products="331 313 213"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 113"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 221"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 223"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 311"/> + <channel onMode="1" bRatio="0.0000002" products="331 321 -313"/> + <channel onMode="1" bRatio="0.0000020" products="331 323 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 323 113"/> + <channel onMode="1" bRatio="0.0000010" products="331 323 221"/> + <channel onMode="1" bRatio="0.0000020" products="331 323 223"/> + <channel onMode="1" bRatio="0.0000002" products="331 323 311"/> + <channel onMode="1" bRatio="0.0000002" products="331 323 -313"/> + <channel onMode="1" bRatio="0.0000010" products="331 331 321"/> + <channel onMode="1" bRatio="0.0000010" products="333 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 211 113"/> + <channel onMode="1" bRatio="0.0000010" products="333 213 111"/> + <channel onMode="1" bRatio="0.0000005" products="333 221 211"/> + <channel onMode="1" bRatio="0.0000005" products="333 221 213"/> + <channel onMode="1" bRatio="0.0000010" products="333 223 211"/> + <channel onMode="1" bRatio="0.0000100" products="333 311 211"/> + <channel onMode="1" bRatio="0.0000100" products="333 311 213"/> + <channel onMode="1" bRatio="0.0000100" products="333 321 111"/> + <channel onMode="1" bRatio="0.0000100" products="333 321 113"/> + <channel onMode="1" bRatio="0.0000050" products="333 321 221"/> + <channel onMode="1" bRatio="0.0000100" products="333 321 223"/> + <channel onMode="1" bRatio="0.0000010" products="333 321 311"/> + <channel onMode="1" bRatio="0.0000100" products="333 323 111"/> + <channel onMode="1" bRatio="0.0000002" products="333 331 211"/> + <channel onMode="1" bRatio="0.0000002" products="333 331 213"/> + <channel onMode="1" bRatio="0.0000020" products="333 331 321"/> + <channel onMode="1" bRatio="0.0000010" products="333 333 211"/> + <channel onMode="1" bRatio="0.0000030" products="333 333 321"/> + <channel onMode="1" bRatio="0.0000030" products="333 333 323"/> + <channel onMode="1" bRatio="0.0005000" products="411 -411 321"/> + <channel onMode="1" bRatio="0.0005000" products="411 -411 323"/> + <channel onMode="1" bRatio="0.0010200" products="-411 211 211"/> + <channel onMode="1" bRatio="0.0020000" products="-411 213 211"/> + <channel onMode="1" bRatio="0.0005000" products="413 -411 321"/> + <channel onMode="1" bRatio="0.0005000" products="413 -411 323"/> + <channel onMode="1" bRatio="0.0015000" products="413 -413 321"/> + <channel onMode="1" bRatio="0.0010000" products="413 -413 323"/> + <channel onMode="1" bRatio="0.0012500" products="-413 211 211"/> + <channel onMode="1" bRatio="0.0020000" products="-413 213 211"/> + <channel onMode="1" bRatio="0.0015000" products="-413 411 321"/> + <channel onMode="1" bRatio="0.0005000" products="-413 411 323"/> + <channel onMode="1" bRatio="0.0015000" products="421 -421 321"/> + <channel onMode="1" bRatio="0.0025000" products="421 -421 323"/> + <channel onMode="1" bRatio="0.0005000" products="-421 211 111"/> + <channel onMode="1" bRatio="0.0021000" products="-421 211 113"/> + <channel onMode="1" bRatio="0.0017000" products="-421 411 311"/> + <channel onMode="1" bRatio="0.0025000" products="-421 411 313"/> + <channel onMode="1" bRatio="0.0049000" products="-421 413 311"/> + <channel onMode="1" bRatio="0.0025000" products="-421 413 313"/> + <channel onMode="1" bRatio="0.0047000" products="423 -421 321"/> + <channel onMode="1" bRatio="0.0025000" products="423 -421 323"/> + <channel onMode="1" bRatio="0.0070000" products="423 -423 321"/> + <channel onMode="1" bRatio="0.0050000" products="423 -423 323"/> + <channel onMode="1" bRatio="0.0005000" products="-423 211 111"/> + <channel onMode="1" bRatio="0.0005000" products="-423 211 113"/> + <channel onMode="1" bRatio="0.0005000" products="-423 213 111"/> + <channel onMode="1" bRatio="0.0031000" products="-423 411 311"/> + <channel onMode="1" bRatio="0.0025000" products="-423 411 313"/> + <channel onMode="1" bRatio="0.0100000" products="-423 413 311"/> + <channel onMode="1" bRatio="0.0050000" products="-423 413 313"/> + <channel onMode="1" bRatio="0.0018000" products="-423 421 321"/> + <channel onMode="1" bRatio="0.0025000" products="-423 421 323"/> + <channel onMode="1" bRatio="0.0036000" products="431 -411 211"/> + <channel onMode="1" bRatio="0.0018000" products="431 -421 111"/> + <channel onMode="1" bRatio="0.0037000" products="433 -411 211"/> + <channel onMode="1" bRatio="0.0018000" products="433 -421 111"/> + <channel onMode="1" bRatio="0.0002000" products="441 311 211"/> + <channel onMode="1" bRatio="0.0001000" products="441 321 111"/> + <channel onMode="1" bRatio="0.0002000" products="443 311 211"/> + <channel onMode="1" bRatio="0.0001000" products="443 321 111"/> + <channel onMode="1" bRatio="0.0000900" products="443 333 321"/> + <channel onMode="1" bRatio="0.0002000" products="445 311 211"/> + <channel onMode="1" bRatio="0.0001000" products="445 321 111"/> + <channel onMode="1" bRatio="0.0000100" products="10311 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="10311 211 113"/> + <channel onMode="1" bRatio="0.0000100" products="10311 213 111"/> + <channel onMode="1" bRatio="0.0000050" products="10311 221 213"/> + <channel onMode="1" bRatio="0.0000100" products="10311 321 311"/> + <channel onMode="1" bRatio="0.0000020" products="10311 331 213"/> + <channel onMode="1" bRatio="0.0000100" products="10311 333 211"/> + <channel onMode="1" bRatio="0.0000100" products="-10311 321 311"/> + <channel onMode="1" bRatio="0.0000100" products="10321 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="10321 113 111"/> + <channel onMode="1" bRatio="0.0000100" products="10321 213 -211"/> + <channel onMode="1" bRatio="0.0000050" products="10321 221 113"/> + <channel onMode="1" bRatio="0.0000100" products="10321 321 -321"/> + <channel onMode="1" bRatio="0.0000020" products="10321 331 113"/> + <channel onMode="1" bRatio="0.0000100" products="10321 333 111"/> + <channel onMode="1" bRatio="0.0000050" products="10321 333 221"/> + <channel onMode="1" bRatio="0.0000020" products="10321 333 331"/> + <channel onMode="1" bRatio="0.0000100" products="-10321 321 321"/> + <channel onMode="1" bRatio="0.0002000" products="10441 311 211"/> + <channel onMode="1" bRatio="0.0001000" products="10441 321 111"/> + <channel onMode="1" bRatio="0.0000100" products="20113 211 111"/> + <channel onMode="1" bRatio="0.0000050" products="20113 221 211"/> + <channel onMode="1" bRatio="0.0000100" products="20113 311 211"/> + <channel onMode="1" bRatio="0.0000100" products="20113 321 111"/> + <channel onMode="1" bRatio="0.0000020" products="20113 331 211"/> + <channel onMode="1" bRatio="0.0000100" products="20213 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="20213 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="20213 221 111"/> + <channel onMode="1" bRatio="0.0000100" products="20213 311 111"/> + <channel onMode="1" bRatio="0.0000100" products="20213 321 -211"/> + <channel onMode="1" bRatio="0.0000020" products="20213 331 111"/> + <channel onMode="1" bRatio="0.0000100" products="-20213 211 211"/> + <channel onMode="1" bRatio="0.0000020" products="20313 333 211"/> + <channel onMode="1" bRatio="0.0000020" products="20323 321 -321"/> + <channel onMode="1" bRatio="0.0000020" products="20323 333 111"/> + <channel onMode="1" bRatio="0.0000010" products="20323 333 221"/> + <channel onMode="1" bRatio="0.0000010" products="20323 333 331"/> + <channel onMode="1" bRatio="0.0004000" products="20443 311 211"/> + <channel onMode="1" bRatio="0.0002000" products="20443 321 111"/> + <channel onMode="1" bRatio="0.0003000" products="30443 311 211"/> + <channel onMode="1" bRatio="0.0002000" products="30443 321 111"/> + <channel onMode="1" bRatio="0.0000800" products="100441 311 211"/> + <channel onMode="1" bRatio="0.0000500" products="100441 321 111"/> + <channel onMode="1" bRatio="0.0004000" products="100443 311 211"/> + <channel onMode="1" bRatio="0.0002000" products="100443 321 111"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="9000111 213 111"/> + <channel onMode="1" bRatio="0.0000050" products="9000111 221 213"/> + <channel onMode="1" bRatio="0.0000050" products="9000111 323 111"/> + <channel onMode="1" bRatio="0.0000020" products="9000111 331 213"/> + <channel onMode="1" bRatio="0.0000010" products="9000211 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="9000211 113 111"/> + <channel onMode="1" bRatio="0.0000100" products="9000211 -213 211"/> + <channel onMode="1" bRatio="0.0000050" products="9000211 221 113"/> + <channel onMode="1" bRatio="0.0000050" products="9000211 313 111"/> + <channel onMode="1" bRatio="0.0000020" products="9000211 331 113"/> + <channel onMode="1" bRatio="0.0000010" products="-9000211 211 211"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 211 113"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 213 111"/> + <channel onMode="1" bRatio="0.0000050" products="9010221 221 213"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 223 211"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 313 211"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 323 111"/> + <channel onMode="1" bRatio="0.0000050" products="9010221 323 221"/> + <channel onMode="1" bRatio="0.0000020" products="9010221 331 213"/> + <channel onMode="1" bRatio="0.0000020" products="9010221 331 323"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 333 211"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 333 321"/> + <channel onMode="1" bRatio="0.0000100" products="211 111 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="211 113 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="211 211 -211 111"/> + <channel onMode="1" bRatio="0.0000020" products="211 211 -211 113"/> + <channel onMode="1" bRatio="0.0000020" products="213 111 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="213 211 -211 111"/> + <channel onMode="1" bRatio="0.0000020" products="-213 211 211 111"/> + <channel onMode="1" bRatio="0.0000050" products="221 211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="221 211 113 111"/> + <channel onMode="1" bRatio="0.0000050" products="221 211 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="221 213 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="221 213 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="221 -213 211 211"/> + <channel onMode="1" bRatio="0.0000020" products="221 221 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="221 221 213 111"/> + <channel onMode="1" bRatio="0.0000020" products="223 211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="223 221 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 211 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 211 113 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 211 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="311 213 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 213 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="311 -213 211 211"/> + <channel onMode="1" bRatio="0.0000050" products="311 221 211 111"/> + <channel onMode="1" bRatio="0.0000050" products="311 221 213 111"/> + <channel onMode="1" bRatio="0.0000020" products="311 221 221 211"/> + <channel onMode="1" bRatio="0.0000100" products="311 223 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 211 113"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 213 111"/> + <channel onMode="1" bRatio="0.0000005" products="311 311 221 211"/> + <channel onMode="1" bRatio="0.0000005" products="311 311 221 213"/> + <channel onMode="1" bRatio="0.0000010" products="311 311 223 211"/> + <channel onMode="1" bRatio="0.0000100" products="311 311 311 211"/> + <channel onMode="1" bRatio="0.0000100" products="313 211 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="313 211 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="313 221 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="313 311 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="-313 311 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 111 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 113 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 211 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 213 -211 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 -213 211 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 221 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 221 113 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 221 211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="321 221 221 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 223 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 223 221 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 113 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 213 -211"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 -213 211"/> + <channel onMode="1" bRatio="0.0000005" products="321 311 221 111"/> + <channel onMode="1" bRatio="0.0000005" products="321 311 221 113"/> + <channel onMode="1" bRatio="0.0000002" products="321 311 221 221"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 223 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 311 311 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 311 311 221"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 311 311"/> + <channel onMode="1" bRatio="0.0000100" products="321 313 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 -313 111 111"/> + <channel onMode="1" bRatio="0.0000005" products="321 -313 221 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 -313 311 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 321 -321 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 321 -321 113"/> + <channel onMode="1" bRatio="0.0000050" products="321 321 -321 221"/> + <channel onMode="1" bRatio="0.0000100" products="321 321 -321 223"/> + <channel onMode="1" bRatio="0.0000010" products="321 321 -321 311"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 211 113"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 213 111"/> + <channel onMode="1" bRatio="0.0000005" products="321 -321 221 211"/> + <channel onMode="1" bRatio="0.0000005" products="321 -321 221 213"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 223 211"/> + <channel onMode="1" bRatio="0.0000100" products="321 -321 311 211"/> + <channel onMode="1" bRatio="0.0000100" products="321 -321 311 213"/> + <channel onMode="1" bRatio="0.0000010" products="-321 311 213 211"/> + <channel onMode="1" bRatio="0.0000010" products="-321 313 211 211"/> + <channel onMode="1" bRatio="0.0000100" products="323 111 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="323 211 -211 111"/> + <channel onMode="1" bRatio="0.0000050" products="323 221 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="323 221 211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="323 221 221 111"/> + <channel onMode="1" bRatio="0.0000010" products="323 311 111 111"/> + <channel onMode="1" bRatio="0.0000005" products="323 311 221 111"/> + <channel onMode="1" bRatio="0.0000100" products="323 311 311 111"/> + <channel onMode="1" bRatio="0.0000100" products="323 321 -321 111"/> + <channel onMode="1" bRatio="0.0000010" products="323 -321 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="-323 311 211 211"/> + <channel onMode="1" bRatio="0.0000010" products="-323 321 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="-323 321 321 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 211 113 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 211 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="331 213 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 213 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="331 -213 211 211"/> + <channel onMode="1" bRatio="0.0000010" products="331 221 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 223 211 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 311 213 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 311 311 211"/> + <channel onMode="1" bRatio="0.0000002" products="331 311 311 213"/> + <channel onMode="1" bRatio="0.0000020" products="331 313 211 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 113 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 221 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 223 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 321 311 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 321 311 113"/> + <channel onMode="1" bRatio="0.0000001" products="331 321 311 221"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 311 311"/> + <channel onMode="1" bRatio="0.0000002" products="331 321 -313 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 321 -321"/> + <channel onMode="1" bRatio="0.0000002" products="331 321 -321 211"/> + <channel onMode="1" bRatio="0.0000002" products="331 321 -321 213"/> + <channel onMode="1" bRatio="0.0000020" products="331 323 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 323 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="331 323 221 111"/> + <channel onMode="1" bRatio="0.0000002" products="331 323 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 211 211 -211"/> + <channel onMode="1" bRatio="0.0000005" products="333 221 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="333 311 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 311 311 211"/> + <channel onMode="1" bRatio="0.0000100" products="333 321 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="333 321 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="333 321 221 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 321 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 321 311 311"/> + <channel onMode="1" bRatio="0.0000010" products="333 321 321 -321"/> + <channel onMode="1" bRatio="0.0000010" products="333 323 311 311"/> + <channel onMode="1" bRatio="0.0000010" products="333 323 321 -321"/> + <channel onMode="1" bRatio="0.0000002" products="333 331 211 111"/> + <channel onMode="1" bRatio="0.0000020" products="333 331 321 111"/> + <channel onMode="1" bRatio="0.0020000" products="-411 211 211 111"/> + <channel onMode="1" bRatio="0.0150000" products="-413 211 211 111"/> + <channel onMode="1" bRatio="0.0050000" products="-421 211 211 -211"/> + <channel onMode="1" bRatio="0.0005000" products="-423 211 111 111"/> + <channel onMode="1" bRatio="0.0005000" products="-423 211 211 -211"/> + <channel onMode="1" bRatio="0.0033000" products="431 -411 211 111"/> + <channel onMode="1" bRatio="0.0008000" products="431 -421 111 111"/> + <channel onMode="1" bRatio="0.0033000" products="431 -421 211 -211"/> + <channel onMode="1" bRatio="0.0033000" products="433 -411 211 111"/> + <channel onMode="1" bRatio="0.0008000" products="433 -421 111 111"/> + <channel onMode="1" bRatio="0.0033000" products="433 -421 211 -211"/> + <channel onMode="1" bRatio="0.0001000" products="441 311 211 111"/> + <channel onMode="1" bRatio="0.0001000" products="441 321 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="441 321 211 -211"/> + <channel onMode="1" bRatio="0.0001000" products="445 311 211 111"/> + <channel onMode="1" bRatio="0.0001000" products="445 321 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="445 321 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="10311 211 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="10311 211 211 -211"/> + <channel onMode="1" bRatio="0.0000050" products="10311 221 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="10311 321 311 111"/> + <channel onMode="1" bRatio="0.0000050" products="10311 321 311 221"/> + <channel onMode="1" bRatio="0.0000100" products="10311 321 -321 211"/> + <channel onMode="1" bRatio="0.0000020" products="10311 331 211 111"/> + <channel onMode="1" bRatio="0.0000020" products="10311 331 321 311"/> + <channel onMode="1" bRatio="0.0000100" products="-10311 311 311 211"/> + <channel onMode="1" bRatio="0.0000100" products="-10311 321 311 111"/> + <channel onMode="1" bRatio="0.0000050" products="-10311 321 311 221"/> + <channel onMode="1" bRatio="0.0000100" products="-10311 321 321 -211"/> + <channel onMode="1" bRatio="0.0000020" products="-10311 331 321 311"/> + <channel onMode="1" bRatio="0.0000100" products="10321 111 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="10321 221 111 111"/> + <channel onMode="1" bRatio="0.0000100" products="10321 321 -321 111"/> + <channel onMode="1" bRatio="0.0000050" products="10321 321 -321 221"/> + <channel onMode="1" bRatio="0.0000020" products="10321 331 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="10321 331 321 -321"/> + <channel onMode="1" bRatio="0.0000100" products="-10321 321 321 111"/> + <channel onMode="1" bRatio="0.0000050" products="-10321 321 321 221"/> + <channel onMode="1" bRatio="0.0000020" products="-10321 331 321 321"/> + <channel onMode="1" bRatio="0.0001000" products="10441 311 211 111"/> + <channel onMode="1" bRatio="0.0001000" products="10441 321 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="10441 321 211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="20313 311 311 211"/> + <channel onMode="1" bRatio="0.0000100" products="20313 321 311 111"/> + <channel onMode="1" bRatio="0.0000050" products="20313 321 311 221"/> + <channel onMode="1" bRatio="0.0000020" products="20313 321 -321 211"/> + <channel onMode="1" bRatio="0.0000020" products="20313 331 321 311"/> + <channel onMode="1" bRatio="0.0000020" products="-20313 311 311 211"/> + <channel onMode="1" bRatio="0.0000100" products="-20313 321 311 111"/> + <channel onMode="1" bRatio="0.0000050" products="-20313 321 311 221"/> + <channel onMode="1" bRatio="0.0000020" products="-20313 331 321 311"/> + <channel onMode="1" bRatio="0.0000040" products="20323 311 311 111"/> + <channel onMode="1" bRatio="0.0000020" products="20323 311 311 221"/> + <channel onMode="1" bRatio="0.0000020" products="20323 321 -321 111"/> + <channel onMode="1" bRatio="0.0000010" products="20323 321 -321 221"/> + <channel onMode="1" bRatio="0.0000020" products="20323 331 311 311"/> + <channel onMode="1" bRatio="0.0000010" products="20323 331 321 -321"/> + <channel onMode="1" bRatio="0.0000020" products="-20323 321 321 111"/> + <channel onMode="1" bRatio="0.0002000" products="20443 311 211 111"/> + <channel onMode="1" bRatio="0.0002000" products="20443 321 111 111"/> + <channel onMode="1" bRatio="0.0004000" products="20443 321 211 -211"/> + <channel onMode="1" bRatio="0.0001000" products="30443 311 211 111"/> + <channel onMode="1" bRatio="0.0001000" products="30443 321 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="30443 321 211 -211"/> + <channel onMode="1" bRatio="0.0000500" products="100441 311 211 111"/> + <channel onMode="1" bRatio="0.0000500" products="100441 321 111 111"/> + <channel onMode="1" bRatio="0.0000800" products="100441 321 211 -211"/> + <channel onMode="1" bRatio="0.0001000" products="100443 311 211 111"/> + <channel onMode="1" bRatio="0.0001000" products="100443 321 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="100443 321 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="9000111 211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="9000211 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="-9000211 211 211 111"/> + <channel onMode="1" bRatio="0.0000020" products="9010221 211 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="9010221 211 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 221 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 311 311 211"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 321 311 111"/> + <channel onMode="1" bRatio="0.0000100" products="9010221 321 321 -321"/> + <channel onMode="1" bRatio="0.0000010" products="9010221 331 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="211 111 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="211 211 -211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="221 211 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="221 211 211 -211 111"/> + <channel onMode="1" bRatio="0.0000020" products="311 211 111 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="311 211 211 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="311 221 211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="311 221 211 211 -211"/> + <channel onMode="1" bRatio="0.0000010" products="311 221 221 211 111"/> + <channel onMode="1" bRatio="0.0000002" products="311 311 211 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="311 311 211 211 -211"/> + <channel onMode="1" bRatio="0.0000001" products="311 311 221 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="311 311 311 211 111"/> + <channel onMode="1" bRatio="0.0000020" products="321 111 111 111 111"/> + <channel onMode="1" bRatio="0.0000020" products="321 211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="321 211 -211 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 221 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 221 211 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 221 221 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="321 311 111 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="321 311 211 -211 111"/> + <channel onMode="1" bRatio="0.0000001" products="321 311 221 111 111"/> + <channel onMode="1" bRatio="0.0000001" products="321 311 221 211 -211"/> + <channel onMode="1" bRatio="0.0000100" products="321 311 311 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 311 311 221 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 311 311 311 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 321 -321 111 111"/> + <channel onMode="1" bRatio="0.0000050" products="321 321 -321 221 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 321 -321 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 321 -321 -321 211"/> + <channel onMode="1" bRatio="0.0000002" products="321 -321 211 111 111"/> + <channel onMode="1" bRatio="0.0000002" products="321 -321 211 211 -211"/> + <channel onMode="1" bRatio="0.0000001" products="321 -321 221 211 111"/> + <channel onMode="1" bRatio="0.0000100" products="321 -321 311 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="321 -321 311 311 211"/> + <channel onMode="1" bRatio="0.0000002" products="-321 311 211 211 111"/> + <channel onMode="1" bRatio="0.0000001" products="-321 311 221 211 211"/> + <channel onMode="1" bRatio="0.0000010" products="331 211 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 211 211 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 311 211 211 -211"/> + <channel onMode="1" bRatio="0.0000001" products="331 311 311 211 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 111 111 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 211 -211 111"/> + <channel onMode="1" bRatio="0.0000010" products="331 321 221 111 111"/> + <channel onMode="1" bRatio="0.0000001" products="331 321 311 111 111"/> + <channel onMode="1" bRatio="0.0000001" products="331 321 311 211 -211"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 311 311 111"/> + <channel onMode="1" bRatio="0.0000020" products="331 321 321 -321 111"/> + <channel onMode="1" bRatio="0.0000001" products="331 321 -321 211 111"/> + <channel onMode="1" bRatio="0.0000001" products="331 -321 311 211 211"/> + <channel onMode="1" bRatio="0.0000010" products="333 311 311 311 211"/> + <channel onMode="1" bRatio="0.0000010" products="333 321 311 311 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 321 321 311 -211"/> + <channel onMode="1" bRatio="0.0000010" products="333 321 321 -321 111"/> + <channel onMode="1" bRatio="0.0000010" products="333 321 -321 311 211"/> + <channel onMode="1" bRatio="0.0050000" meMode="55" products="-3 2"/> + <channel onMode="1" bRatio="0.0330000" meMode="63" products="-4103 2203"/> + <channel onMode="1" bRatio="0.0090000" meMode="63" products="-4303 2203"/> + <channel onMode="1" bRatio="0.0000700" meMode="23" products="1 -1 -1 2"/> + <channel onMode="1" bRatio="0.0018000" meMode="23" products="1 -1 -3 2"/> + <channel onMode="1" bRatio="0.0030000" meMode="23" products="2 -1 -2 2"/> + <channel onMode="1" bRatio="0.0020500" meMode="23" products="2 -2 -1 2"/> + <channel onMode="1" bRatio="0.0022000" meMode="23" products="2 -2 -3 2"/> + <channel onMode="1" bRatio="0.0225000" meMode="43" products="2 -3 -4 2"/> + <channel onMode="1" bRatio="0.0000900" meMode="23" products="3 -3 -1 2"/> + <channel onMode="1" bRatio="0.0015000" meMode="23" products="3 -3 -3 2"/> + <channel onMode="1" bRatio="0.0040000" meMode="43" products="4 -1 -4 2"/> + <channel onMode="1" bRatio="0.0040000" meMode="23" products="4 -3 -2 2"/> + <channel onMode="1" bRatio="0.0740000" meMode="43" products="4 -3 -4 2"/> + <channel onMode="2" bRatio="0.0019480" meMode="22" products="12 -11 2 -2"/> + <channel onMode="2" bRatio="0.0019480" meMode="22" products="14 -13 2 -2"/> + <channel onMode="2" bRatio="0.0000200" products="445 323"/> + <channel onMode="2" bRatio="0.0000010" products="333 321 313 311"/> + <channel onMode="2" bRatio="0.0000020" products="-20313 321 321 -211"/> + <channel onMode="2" bRatio="0.0003118" meMode="31" products="2 -3 22"/> + <channel onMode="2" bRatio="0.2682660" meMode="23" products="2 -1 -4 2"/> + <channel onMode="2" bRatio="0.0000050" meMode="12" products="2 -3 11 -11"/> + <channel onMode="2" bRatio="0.0000025" meMode="12" products="2 -3 13 -13"/> + <channel onMode="2" bRatio="0.0000002" meMode="12" products="2 -3 15 -15"/> + <channel onMode="3" bRatio="0.0019480" meMode="22" products="12 -11 -2 2"/> + <channel onMode="3" bRatio="0.0019480" meMode="22" products="14 -13 -2 2"/> + <channel onMode="3" bRatio="0.0000400" products="445 323"/> + <channel onMode="3" bRatio="0.0000010" products="333 321 -313 311"/> + <channel onMode="3" bRatio="0.0000020" products="20313 321 321 -211"/> + <channel onMode="3" bRatio="0.0003118" meMode="31" products="-3 2 22"/> + <channel onMode="3" bRatio="0.2683360" meMode="23" products="2 -1 -4 2"/> + <channel onMode="3" bRatio="0.0000050" meMode="12" products="-3 2 11 -11"/> + <channel onMode="3" bRatio="0.0000025" meMode="12" products="-3 2 13 -13"/> + <channel onMode="3" bRatio="0.0000002" meMode="12" products="-3 2 15 -15"/> +</particle> + +<!-- +<particle id="523" name="B*+" antiName="B*-" spinType="3" chargeType="3" colType="0" + m0="5.32520"> + <channel onMode="1" bRatio="1.0000000" products="521 22"/> +</particle> + +<particle id="525" name="B*_2+" antiName="B*_2-" spinType="5" chargeType="3" colType="0" + m0="5.74300" mWidth="0.02300" mMin="5.63000" mMax="6.03000"> + <channel onMode="1" bRatio="0.3100000" products="513 211"/> + <channel onMode="1" bRatio="0.1500000" products="523 111"/> + <channel onMode="1" bRatio="0.3100000" products="511 211"/> + <channel onMode="1" bRatio="0.1500000" products="521 111"/> + <channel onMode="1" bRatio="0.0500000" products="513 211 111"/> + <channel onMode="1" bRatio="0.0300000" products="523 211 -211"/> +</particle> +--> + +<particle id="531" name="B_s0" antiName="B_sbar0" spinType="1" chargeType="0" colType="0" + m0="5.36677" tau0="4.39000e-01"> + <channel onMode="1" bRatio="0.0002000" meMode="22" products="12 -11 -321"/> + <channel onMode="1" bRatio="0.0003000" meMode="22" products="12 -11 -323"/> + <channel onMode="1" bRatio="0.0210000" meMode="22" products="12 -11 -431"/> + <channel onMode="1" bRatio="0.0490000" meMode="22" products="12 -11 -433"/> + <channel onMode="1" bRatio="0.0070000" meMode="22" products="12 -11 -435"/> + <channel onMode="1" bRatio="0.0003000" meMode="22" products="12 -11 -10323"/> + <channel onMode="1" bRatio="0.0040000" meMode="22" products="12 -11 -10431"/> + <channel onMode="1" bRatio="0.0070000" meMode="22" products="12 -11 -10433"/> + <channel onMode="1" bRatio="0.0002000" meMode="22" products="12 -11 -20323"/> + <channel onMode="1" bRatio="0.0040000" meMode="22" products="12 -11 -20433"/> + <channel onMode="1" bRatio="0.0002000" meMode="22" products="14 -13 -321"/> + <channel onMode="1" bRatio="0.0003000" meMode="22" products="14 -13 -323"/> + <channel onMode="1" bRatio="0.0210000" meMode="22" products="14 -13 -431"/> + <channel onMode="1" bRatio="0.0490000" meMode="22" products="14 -13 -433"/> + <channel onMode="1" bRatio="0.0070000" meMode="22" products="14 -13 -435"/> + <channel onMode="1" bRatio="0.0003000" meMode="22" products="14 -13 -10323"/> + <channel onMode="1" bRatio="0.0040000" meMode="22" products="14 -13 -10431"/> + <channel onMode="1" bRatio="0.0070000" meMode="22" products="14 -13 -10433"/> + <channel onMode="1" bRatio="0.0002000" meMode="22" products="14 -13 -20323"/> + <channel onMode="1" bRatio="0.0040000" meMode="22" products="14 -13 -20433"/> + <channel onMode="1" bRatio="0.0080000" meMode="22" products="16 -15 -431"/> + <channel onMode="1" bRatio="0.0160000" meMode="22" products="16 -15 -433"/> + <channel onMode="1" bRatio="0.0028000" meMode="22" products="16 -15 -435"/> + <channel onMode="1" bRatio="0.0018000" meMode="22" products="16 -15 -10431"/> + <channel onMode="1" bRatio="0.0028000" meMode="22" products="16 -15 -10433"/> + <channel onMode="1" bRatio="0.0018000" meMode="22" products="16 -15 -20433"/> + <channel onMode="1" bRatio="0.0000005" products="22 22"/> + <channel onMode="1" bRatio="0.0000100" products="130 130"/> + <channel onMode="1" bRatio="0.0000000" products="211 -211"/> + <channel onMode="1" bRatio="0.0000040" products="221 221"/> + <channel onMode="1" bRatio="0.0000012" products="223 221"/> + <channel onMode="1" bRatio="0.0000100" products="310 310"/> + <channel onMode="1" bRatio="0.0000002" products="311 111"/> + <channel onMode="1" bRatio="0.0000000" products="311 113"/> + <channel onMode="1" bRatio="0.0000002" products="311 221"/> + <channel onMode="1" bRatio="0.0000001" products="311 223"/> + <channel onMode="1" bRatio="0.0000020" products="313 130"/> + <channel onMode="1" bRatio="0.0000020" products="313 310"/> + <channel onMode="1" bRatio="0.0000040" products="313 -313"/> + <channel onMode="1" bRatio="0.0000000" products="-313 111"/> + <channel onMode="1" bRatio="0.0000008" products="-313 113"/> + <channel onMode="1" bRatio="0.0000020" products="-313 130"/> + <channel onMode="1" bRatio="0.0000001" products="-313 221"/> + <channel onMode="1" bRatio="0.0000020" products="-313 310"/> + <channel onMode="1" bRatio="0.0000185" products="321 -321"/> + <channel onMode="1" bRatio="0.0000048" products="-321 211"/> + <channel onMode="1" bRatio="0.0000120" products="-321 213"/> + <channel onMode="1" bRatio="0.0000046" products="323 -321"/> + <channel onMode="1" bRatio="0.0000060" products="323 -323"/> + <channel onMode="1" bRatio="0.0000250" products="-323 211"/> + <channel onMode="1" bRatio="0.0000200" products="-323 213"/> + <channel onMode="1" bRatio="0.0000082" products="-323 321"/> + <channel onMode="1" bRatio="0.0000250" products="331 221"/> + <channel onMode="1" bRatio="0.0000025" products="331 223"/> + <channel onMode="1" bRatio="0.0000001" products="331 311"/> + <channel onMode="1" bRatio="0.0000000" products="331 -313"/> + <channel onMode="1" bRatio="0.0000580" products="331 331"/> + <channel onMode="1" bRatio="0.0000450" products="333 22"/> + <channel onMode="1" bRatio="0.0000213" products="333 221"/> + <channel onMode="1" bRatio="0.0000004" products="333 -313"/> + <channel onMode="1" bRatio="0.0000125" products="333 331"/> + <channel onMode="1" bRatio="0.0000080" products="333 333"/> + <channel onMode="1" bRatio="0.0002000" products="-421 311"/> + <channel onMode="1" bRatio="0.0002000" products="-421 -313"/> + <channel onMode="1" bRatio="0.0002000" products="-423 311"/> + <channel onMode="1" bRatio="0.0002000" products="-423 -313"/> + <channel onMode="1" bRatio="0.0017000" products="431 -411"/> + <channel onMode="1" bRatio="0.0017000" products="431 -413"/> + <channel onMode="1" bRatio="0.0086000" products="431 -431"/> + <channel onMode="1" bRatio="0.0026000" products="-431 211"/> + <channel onMode="1" bRatio="0.0073000" products="-431 213"/> + <channel onMode="1" bRatio="0.0001500" products="-431 321"/> + <channel onMode="1" bRatio="0.0003000" products="-431 323"/> + <channel onMode="1" bRatio="0.0017000" products="433 -411"/> + <channel onMode="1" bRatio="0.0017000" products="433 -413"/> + <channel onMode="1" bRatio="0.0197000" products="433 -433"/> + <channel onMode="1" bRatio="0.0027000" products="-433 211"/> + <channel onMode="1" bRatio="0.0070000" products="-433 213"/> + <channel onMode="1" bRatio="0.0001500" products="-433 321"/> + <channel onMode="1" bRatio="0.0003000" products="-433 323"/> + <channel onMode="1" bRatio="0.0013000" products="-435 211"/> + <channel onMode="1" bRatio="0.0004000" products="441 221"/> + <channel onMode="1" bRatio="0.0008000" products="441 331"/> + <channel onMode="1" bRatio="0.0015000" products="441 333"/> + <channel onMode="1" bRatio="0.0003200" products="443 221"/> + <channel onMode="1" bRatio="0.0000800" products="443 311"/> + <channel onMode="1" bRatio="0.0006400" products="443 331"/> + <channel onMode="1" bRatio="0.0013500" products="443 333"/> + <channel onMode="1" bRatio="0.0002350" products="445 221"/> + <channel onMode="1" bRatio="0.0004650" products="445 331"/> + <channel onMode="1" bRatio="0.0000500" products="10441 221"/> + <channel onMode="1" bRatio="0.0001000" products="10441 331"/> + <channel onMode="1" bRatio="0.0002000" products="10441 333"/> + <channel onMode="1" bRatio="0.0002350" products="10443 221"/> + <channel onMode="1" bRatio="0.0004650" products="10443 331"/> + <channel onMode="1" bRatio="0.0010000" products="10443 333"/> + <channel onMode="1" bRatio="0.0085000" products="20213 -431"/> + <channel onMode="1" bRatio="0.0122000" products="20213 -433"/> + <channel onMode="1" bRatio="0.0008000" products="-20433 211"/> + <channel onMode="1" bRatio="0.0021000" products="-20433 213"/> + <channel onMode="1" bRatio="0.0003000" products="20443 221"/> + <channel onMode="1" bRatio="0.0007000" products="20443 331"/> + <channel onMode="1" bRatio="0.0014000" products="20443 333"/> + <channel onMode="1" bRatio="0.0002000" products="100441 221"/> + <channel onMode="1" bRatio="0.0004000" products="100441 331"/> + <channel onMode="1" bRatio="0.0006000" products="100441 333"/> + <channel onMode="1" bRatio="0.0002350" products="100443 221"/> + <channel onMode="1" bRatio="0.0004650" products="100443 331"/> + <channel onMode="1" bRatio="0.0012000" products="100443 333"/> + <channel onMode="1" bRatio="0.0000023" meMode="11" products="333 11 -11"/> + <channel onMode="1" bRatio="0.0000023" meMode="11" products="333 13 -13"/> + <channel onMode="1" bRatio="0.0007000" products="411 -411 311"/> + <channel onMode="1" bRatio="0.0007000" products="413 -411 311"/> + <channel onMode="1" bRatio="0.0007000" products="421 411 -321"/> + <channel onMode="1" bRatio="0.0007000" products="-421 413 -321"/> + <channel onMode="1" bRatio="0.0096000" products="431 -411 311"/> + <channel onMode="1" bRatio="0.0096000" products="431 421 -321"/> + <channel onMode="1" bRatio="0.0009000" products="-431 211 113"/> + <channel onMode="1" bRatio="0.0009000" products="-431 213 111"/> + <channel onMode="1" bRatio="0.0020000" products="-431 411 311"/> + <channel onMode="1" bRatio="0.0025000" products="-431 411 313"/> + <channel onMode="1" bRatio="0.0050000" products="-431 413 311"/> + <channel onMode="1" bRatio="0.0025000" products="-431 413 313"/> + <channel onMode="1" bRatio="0.0020000" products="-431 421 321"/> + <channel onMode="1" bRatio="0.0025000" products="-431 421 323"/> + <channel onMode="1" bRatio="0.0050000" products="-431 423 321"/> + <channel onMode="1" bRatio="0.0025000" products="-431 423 323"/> + <channel onMode="1" bRatio="0.0096000" products="433 -411 311"/> + <channel onMode="1" bRatio="0.0096000" products="433 -421 -321"/> + <channel onMode="1" bRatio="0.0010000" products="-433 211 113"/> + <channel onMode="1" bRatio="0.0010000" products="-433 213 111"/> + <channel onMode="1" bRatio="0.0050000" products="-433 411 311"/> + <channel onMode="1" bRatio="0.0050000" products="-433 411 313"/> + <channel onMode="1" bRatio="0.0150000" products="-433 413 311"/> + <channel onMode="1" bRatio="0.0030000" products="-433 413 313"/> + <channel onMode="1" bRatio="0.0050000" products="-433 421 321"/> + <channel onMode="1" bRatio="0.0050000" products="-433 421 323"/> + <channel onMode="1" bRatio="0.0150000" products="-433 423 321"/> + <channel onMode="1" bRatio="0.0030000" products="-433 423 323"/> + <channel onMode="1" bRatio="0.0002800" products="441 311 311"/> + <channel onMode="1" bRatio="0.0002800" products="441 321 -321"/> + <channel onMode="1" bRatio="0.0002000" products="443 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="443 211 -211"/> + <channel onMode="1" bRatio="0.0007000" products="443 311 311"/> + <channel onMode="1" bRatio="0.0007000" products="443 321 -321"/> + <channel onMode="1" bRatio="0.0001600" products="445 311 311"/> + <channel onMode="1" bRatio="0.0001600" products="445 321 -321"/> + <channel onMode="1" bRatio="0.0000300" products="10441 311 311"/> + <channel onMode="1" bRatio="0.0000300" products="10441 321 -321"/> + <channel onMode="1" bRatio="0.0001600" products="10443 311 311"/> + <channel onMode="1" bRatio="0.0001600" products="10443 321 -321"/> + <channel onMode="1" bRatio="0.0002600" products="20443 311 311"/> + <channel onMode="1" bRatio="0.0002600" products="20443 321 -321"/> + <channel onMode="1" bRatio="0.0001200" products="100441 311 311"/> + <channel onMode="1" bRatio="0.0001200" products="100441 321 -321"/> + <channel onMode="1" bRatio="0.0002000" products="100443 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="100443 211 -211"/> + <channel onMode="1" bRatio="0.0003000" products="100443 311 311"/> + <channel onMode="1" bRatio="0.0003000" products="100443 321 -321"/> + <channel onMode="1" bRatio="0.0003000" products="411 -411 311 111"/> + <channel onMode="1" bRatio="0.0003000" products="411 -411 -321 211"/> + <channel onMode="1" bRatio="0.0003000" products="413 -411 311 111"/> + <channel onMode="1" bRatio="0.0003000" products="413 -411 -321 211"/> + <channel onMode="1" bRatio="0.0007000" products="-421 411 311 -211"/> + <channel onMode="1" bRatio="0.0007000" products="-421 411 -321 111"/> + <channel onMode="1" bRatio="0.0007000" products="-421 413 311 -211"/> + <channel onMode="1" bRatio="0.0007000" products="-421 413 -321 111"/> + <channel onMode="1" bRatio="0.0024000" products="431 -411 311 111"/> + <channel onMode="1" bRatio="0.0048000" products="431 -411 -321 211"/> + <channel onMode="1" bRatio="0.0048000" products="431 -421 311 -211"/> + <channel onMode="1" bRatio="0.0024000" products="431 -421 -321 111"/> + <channel onMode="1" bRatio="0.0009000" products="-431 211 111 111"/> + <channel onMode="1" bRatio="0.0009000" products="-431 211 211 -211"/> + <channel onMode="1" bRatio="0.0024000" products="433 -411 311 111"/> + <channel onMode="1" bRatio="0.0048000" products="433 -411 -321 211"/> + <channel onMode="1" bRatio="0.0048000" products="433 -421 311 -211"/> + <channel onMode="1" bRatio="0.0024000" products="433 -421 -321 111"/> + <channel onMode="1" bRatio="0.0010000" products="-433 211 111 111"/> + <channel onMode="1" bRatio="0.0077000" products="-433 211 211 -211"/> + <channel onMode="1" bRatio="0.0001000" products="441 221 111 111"/> + <channel onMode="1" bRatio="0.0001000" products="441 221 211 -211"/> + <channel onMode="1" bRatio="0.0002800" products="441 311 311 111"/> + <channel onMode="1" bRatio="0.0002800" products="441 321 -321 111"/> + <channel onMode="1" bRatio="0.0002800" products="441 -321 311 211"/> + <channel onMode="1" bRatio="0.0002000" products="441 331 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="441 331 211 -211"/> + <channel onMode="1" bRatio="0.0004000" products="441 333 111 111"/> + <channel onMode="1" bRatio="0.0004000" products="441 333 211 -211"/> + <channel onMode="1" bRatio="0.0002000" products="443 221 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="443 221 211 -211"/> + <channel onMode="1" bRatio="0.0007000" products="443 311 311 111"/> + <channel onMode="1" bRatio="0.0007000" products="443 321 -321 111"/> + <channel onMode="1" bRatio="0.0007000" products="443 -321 311 211"/> + <channel onMode="1" bRatio="0.0004000" products="443 331 111 111"/> + <channel onMode="1" bRatio="0.0004000" products="443 331 211 -211"/> + <channel onMode="1" bRatio="0.0003900" products="443 333 111 111"/> + <channel onMode="1" bRatio="0.0003900" products="443 333 211 -211"/> + <channel onMode="1" bRatio="0.0001600" products="445 311 311 111"/> + <channel onMode="1" bRatio="0.0001600" products="445 321 -321 111"/> + <channel onMode="1" bRatio="0.0001600" products="445 -321 311 211"/> + <channel onMode="1" bRatio="0.0000300" products="10441 311 311 111"/> + <channel onMode="1" bRatio="0.0000300" products="10441 321 -321 111"/> + <channel onMode="1" bRatio="0.0000300" products="10441 -321 311 211"/> + <channel onMode="1" bRatio="0.0001600" products="10443 311 311 111"/> + <channel onMode="1" bRatio="0.0001600" products="10443 321 -321 111"/> + <channel onMode="1" bRatio="0.0001600" products="10443 -321 311 211"/> + <channel onMode="1" bRatio="0.0001000" products="20443 221 111 111"/> + <channel onMode="1" bRatio="0.0001000" products="20443 221 211 -211"/> + <channel onMode="1" bRatio="0.0002600" products="20443 311 311 111"/> + <channel onMode="1" bRatio="0.0002600" products="20443 321 -321 111"/> + <channel onMode="1" bRatio="0.0002600" products="20443 -321 311 211"/> + <channel onMode="1" bRatio="0.0002000" products="20443 331 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="20443 331 211 -211"/> + <channel onMode="1" bRatio="0.0004000" products="20443 333 111 111"/> + <channel onMode="1" bRatio="0.0004000" products="20443 333 211 -211"/> + <channel onMode="1" bRatio="0.0001200" products="100441 311 311 111"/> + <channel onMode="1" bRatio="0.0001200" products="100441 321 -321 111"/> + <channel onMode="1" bRatio="0.0001200" products="100441 -321 311 211"/> + <channel onMode="1" bRatio="0.0002000" products="100443 221 111 111"/> + <channel onMode="1" bRatio="0.0002000" products="100443 221 211 -211"/> + <channel onMode="1" bRatio="0.0003000" products="100443 311 311 111"/> + <channel onMode="1" bRatio="0.0003000" products="100443 321 -321 111"/> + <channel onMode="1" bRatio="0.0003000" products="100443 -321 311 211"/> + <channel onMode="1" bRatio="0.0004000" products="100443 331 111 111"/> + <channel onMode="1" bRatio="0.0004000" products="100443 331 211 -211"/> + <channel onMode="1" bRatio="0.0003400" products="100443 333 111 111"/> + <channel onMode="1" bRatio="0.0003400" products="100443 333 211 -211"/> + <channel onMode="1" bRatio="0.0050000" meMode="55" products="-3 3"/> + <channel onMode="1" bRatio="0.0200000" meMode="63" products="-4301 2101"/> + <channel onMode="1" bRatio="0.0400000" meMode="63" products="-4303 2103"/> + <channel onMode="1" bRatio="0.0007000" meMode="23" products="1 -1 -1 3"/> + <channel onMode="1" bRatio="0.0016000" meMode="23" products="1 -1 -3 3"/> + <channel onMode="1" bRatio="0.3574344" meMode="23" products="2 -1 -4 3"/> + <channel onMode="1" bRatio="0.0036000" meMode="23" products="2 -2 -1 3"/> + <channel onMode="1" bRatio="0.0020000" meMode="23" products="2 -2 -3 3"/> + <channel onMode="1" bRatio="0.0172000" meMode="23" products="2 -3 -4 3"/> + <channel onMode="1" bRatio="0.0195000" meMode="23" products="2 -4 -1 3"/> + <channel onMode="1" bRatio="0.0009000" meMode="23" products="2 -4 -3 3"/> + <channel onMode="1" bRatio="0.0009000" meMode="23" products="3 -3 -1 3"/> + <channel onMode="1" bRatio="0.0013000" meMode="23" products="3 -3 -3 3"/> + <channel onMode="1" bRatio="0.0070000" meMode="43" products="4 -1 -4 3"/> + <channel onMode="1" bRatio="0.0040000" meMode="23" products="4 -3 -2 3"/> + <channel onMode="2" bRatio="0.0090000" products="433 -431"/> + <channel onMode="2" bRatio="0.0099000" products="-433 431"/> + <channel onMode="3" bRatio="0.0099000" products="433 -431"/> + <channel onMode="3" bRatio="0.0090000" products="-433 431"/> +</particle> + +<!-- +<particle id="533" name="B*_s0" antiName="B*_sbar0" spinType="3" chargeType="0" colType="0" + m0="5.41540"> + <channel onMode="1" bRatio="1.0000000" products="531 22"/> +</particle> +--> + +<!-- +<particle id="535" name="B*_2s0" antiName="B*_2sbar0" spinType="5" chargeType="0" colType="0" + m0="5.83970" mWidth="0.02000" mMin="5.81970" mMax="5.85970"> + <channel onMode="1" bRatio="0.1700000" products="513 311"/> + <channel onMode="1" bRatio="0.1700000" products="523 -321"/> + <channel onMode="1" bRatio="0.3300000" products="511 311"/> + <channel onMode="1" bRatio="0.3300000" products="521 -321"/> +</particle> +--> + +<particle id="541" name="B_c+" antiName="B_c-" spinType="1" chargeType="3" colType="0" + m0="6.27700" tau0="1.38000e-01"> + <channel onMode="1" bRatio="0.0160000" products="16 -15"/> + <channel onMode="1" bRatio="0.0034000" meMode="22" products="-11 12 511"/> + <channel onMode="1" bRatio="0.0058000" meMode="22" products="-11 12 513"/> + <channel onMode="1" bRatio="0.0403000" meMode="22" products="-11 12 531"/> + <channel onMode="1" bRatio="0.0506000" meMode="22" products="-11 12 533"/> + <channel onMode="1" bRatio="0.0000400" meMode="22" products="12 -11 421"/> + <channel onMode="1" bRatio="0.0001800" meMode="22" products="12 -11 423"/> + <channel onMode="1" bRatio="0.0075000" meMode="22" products="12 -11 441"/> + <channel onMode="1" bRatio="0.0190000" meMode="22" products="12 -11 443"/> + <channel onMode="1" bRatio="0.0002000" meMode="22" products="12 -11 100441"/> + <channel onMode="1" bRatio="0.0009400" meMode="22" products="12 -11 100443"/> + <channel onMode="1" bRatio="0.0034000" meMode="22" products="-13 14 511"/> + <channel onMode="1" bRatio="0.0058000" meMode="22" products="-13 14 513"/> + <channel onMode="1" bRatio="0.0403000" meMode="22" products="-13 14 531"/> + <channel onMode="1" bRatio="0.0506000" meMode="22" products="-13 14 533"/> + <channel onMode="1" bRatio="0.0000400" meMode="22" products="14 -13 421"/> + <channel onMode="1" bRatio="0.0001800" meMode="22" products="14 -13 423"/> + <channel onMode="1" bRatio="0.0075000" meMode="22" products="14 -13 441"/> + <channel onMode="1" bRatio="0.0190000" meMode="22" products="14 -13 443"/> + <channel onMode="1" bRatio="0.0002000" meMode="22" products="14 -13 100441"/> + <channel onMode="1" bRatio="0.0009400" meMode="22" products="14 -13 100443"/> + <channel onMode="1" bRatio="0.0000200" meMode="22" products="16 -15 421"/> + <channel onMode="1" bRatio="0.0000800" meMode="22" products="16 -15 423"/> + <channel onMode="1" bRatio="0.0023000" meMode="22" products="16 -15 441"/> + <channel onMode="1" bRatio="0.0048000" meMode="22" products="16 -15 443"/> + <channel onMode="1" bRatio="0.0000160" meMode="22" products="16 -15 100441"/> + <channel onMode="1" bRatio="0.0000800" meMode="22" products="16 -15 100443"/> + <channel onMode="1" bRatio="0.0000200" products="211 113"/> + <channel onMode="1" bRatio="0.0000003" products="421 411"/> + <channel onMode="1" bRatio="0.0000004" products="421 413"/> + <channel onMode="1" bRatio="0.0000530" products="-421 411"/> + <channel onMode="1" bRatio="0.0000490" products="-421 413"/> + <channel onMode="1" bRatio="0.0000003" products="423 411"/> + <channel onMode="1" bRatio="0.0000016" products="423 413"/> + <channel onMode="1" bRatio="0.0000750" products="-423 411"/> + <channel onMode="1" bRatio="0.0003300" products="-423 413"/> + <channel onMode="1" bRatio="0.0000066" products="431 421"/> + <channel onMode="1" bRatio="0.0000048" products="431 -421"/> + <channel onMode="1" bRatio="0.0000063" products="431 423"/> + <channel onMode="1" bRatio="0.0000071" products="431 -423"/> + <channel onMode="1" bRatio="0.0000085" products="433 421"/> + <channel onMode="1" bRatio="0.0000045" products="433 -421"/> + <channel onMode="1" bRatio="0.0000404" products="433 423"/> + <channel onMode="1" bRatio="0.0000260" products="433 -423"/> + <channel onMode="1" bRatio="0.0020000" products="441 211"/> + <channel onMode="1" bRatio="0.0042000" products="441 213"/> + <channel onMode="1" bRatio="0.0001300" products="441 321"/> + <channel onMode="1" bRatio="0.0002000" products="441 323"/> + <channel onMode="1" bRatio="0.0001500" products="441 411"/> + <channel onMode="1" bRatio="0.0001000" products="441 413"/> + <channel onMode="1" bRatio="0.0028000" products="441 431"/> + <channel onMode="1" bRatio="0.0027000" products="441 433"/> + <channel onMode="1" bRatio="0.0013000" products="443 211"/> + <channel onMode="1" bRatio="0.0040000" products="443 213"/> + <channel onMode="1" bRatio="0.0001100" products="443 321"/> + <channel onMode="1" bRatio="0.0002200" products="443 323"/> + <channel onMode="1" bRatio="0.0000900" products="443 411"/> + <channel onMode="1" bRatio="0.0002800" products="443 413"/> + <channel onMode="1" bRatio="0.0017000" products="443 431"/> + <channel onMode="1" bRatio="0.0067000" products="443 433"/> + <channel onMode="1" bRatio="0.0106000" products="511 211"/> + <channel onMode="1" bRatio="0.0096000" products="511 213"/> + <channel onMode="1" bRatio="0.0007000" products="511 321"/> + <channel onMode="1" bRatio="0.0001500" products="511 323"/> + <channel onMode="1" bRatio="0.0095000" products="513 211"/> + <channel onMode="1" bRatio="0.0257000" products="513 213"/> + <channel onMode="1" bRatio="0.0005500" products="513 321"/> + <channel onMode="1" bRatio="0.0005800" products="513 323"/> + <channel onMode="1" bRatio="0.0003700" products="521 111"/> + <channel onMode="1" bRatio="0.0003400" products="521 113"/> + <channel onMode="1" bRatio="0.0198000" products="521 311"/> + <channel onMode="1" bRatio="0.0003300" products="523 111"/> + <channel onMode="1" bRatio="0.0009000" products="523 113"/> + <channel onMode="1" bRatio="0.0160000" products="523 311"/> + <channel onMode="1" bRatio="0.1640000" products="531 211"/> + <channel onMode="1" bRatio="0.0720000" products="531 213"/> + <channel onMode="1" bRatio="0.0106000" products="531 321"/> + <channel onMode="1" bRatio="0.0650000" products="533 211"/> + <channel onMode="1" bRatio="0.2020000" products="533 213"/> + <channel onMode="1" bRatio="0.0037000" products="533 321"/> + <channel onMode="1" bRatio="0.0600502" meMode="42" products="4 -3"/> + <channel onMode="2" bRatio="0.0043000" products="521 313"/> + <channel onMode="2" bRatio="0.0167000" products="523 313"/> + <channel onMode="3" bRatio="0.0043000" products="521 -313"/> + <channel onMode="3" bRatio="0.0167000" products="523 -313"/> +</particle> + +<!-- +<particle id="543" name="B*_c+" antiName="B*_c-" spinType="3" chargeType="3" colType="0" + m0="6.34000"> + <channel onMode="1" bRatio="1.0000000" products="541 22"/> +</particle> +--> + +<!-- +<particle id="545" name="B*_2c+" antiName="B*_2c-" spinType="5" chargeType="3" colType="0" + m0="7.35000" mWidth="0.02000" mMin="7.20000" mMax="7.50000"> + <channel onMode="1" bRatio="0.3000000" products="511 411"/> + <channel onMode="1" bRatio="0.3000000" products="521 421"/> + <channel onMode="1" bRatio="0.2000000" products="513 411"/> + <channel onMode="1" bRatio="0.2000000" products="523 421"/> +</particle> +--> + +<!-- +<particle id="551" name="eta_b" spinType="1" chargeType="0" colType="0" + m0="9.40000" mWidth="0.010" mMin="9.30000" mMax="9.50000"> + <channel onMode="1" bRatio="1.0000000" meMode="91" products="21 21"/> +</particle> +--> + +<!-- +<particle id="553" name="Upsilon" spinType="3" chargeType="0" colType="0" + m0="9.46030" mWidth="0.00005" mMin="9.45980" mMax="9.46080"> + <channel onMode="1" bRatio="0.7757000" meMode="92" products="21 21 21"/> + <channel onMode="1" bRatio="0.0290000" meMode="92" products="22 21 21"/> + <channel onMode="1" bRatio="0.0238000" products="11 -11"/> + <channel onMode="1" bRatio="0.0248000" products="13 -13"/> + <channel onMode="1" bRatio="0.0267000" products="15 -15"/> + <channel onMode="1" bRatio="0.0150000" meMode="91" products="1 -1"/> + <channel onMode="1" bRatio="0.0450000" meMode="91" products="2 -2"/> + <channel onMode="1" bRatio="0.0150000" meMode="91" products="3 -3"/> + <channel onMode="1" bRatio="0.0450000" meMode="91" products="4 -4"/> +</particle> +--> + +<!-- +<particle id="555" name="chi_2b" spinType="5" chargeType="0" colType="0" + m0="9.91220"> + <channel onMode="1" bRatio="0.2200000" products="553 22"/> + <channel onMode="1" bRatio="0.7800000" meMode="91" products="21 21"/> +</particle> +--> + +<!-- +<particle id="990990" name="Pomeron" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="1103" name="dd_1" antiName="dd_1bar" spinType="3" chargeType="-2" colType="-1" + m0="0.77133"> +</particle> +--> + +<particle id="1114" name="Delta-" antiName="Deltabar+" spinType="4" chargeType="-3" colType="0" + m0="1.23200" mWidth="0.11700" mMin="1.08000" mMax="1.60000"> + <channel onMode="1" bRatio="1.0000000" products="2112 -211"/> +</particle> + +<!-- +<particle id="2101" name="ud_0" antiName="ud_0bar" spinType="1" chargeType="1" colType="-1" + m0="0.57933"> +</particle> + +<particle id="2103" name="ud_1" antiName="ud_1bar" spinType="3" chargeType="1" colType="-1" + m0="0.77133"> +</particle> +--> + +<particle id="2112" name="n0" antiName="nbar0" spinType="2" chargeType="0" colType="0" + m0="0.93957" tau0="2.65500e+14"> + <channel onMode="1" bRatio="1.0000000" meMode="22" products="-12 11 2212"/> +</particle> + +<particle id="2114" name="Delta0" antiName="Deltabar0" spinType="4" chargeType="0" colType="0" + m0="1.23200" mWidth="0.11700" mMin="1.08000" mMax="1.60000"> + <channel onMode="1" bRatio="0.3314104" products="2212 -211"/> + <channel onMode="1" bRatio="0.6630208" products="2112 111"/> + <channel onMode="1" bRatio="0.0055688" products="2112 22"/> +</particle> + +<!-- +<particle id="2203" name="uu_1" antiName="uu_1bar" spinType="3" chargeType="4" colType="-1" + m0="0.77133"> +</particle> +--> + +<particle id="2212" name="p+" antiName="pbar-" spinType="2" chargeType="3" colType="0" + m0="0.93827"> +</particle> + +<particle id="202212" name="N(1440)+" antiName="N(1440)bar-" spinType="2" chargeType="3" colType="0" + m0="1.440" mWidth="0.350" mMin="1.4100" mMax="1.4500"> + <channel onMode="1" bRatio="0.466" products="2212 211"/> + <channel onMode="1" bRatio="0.2340" products="2112 111"/> + <channel onMode="1" bRatio="0.1990" products="2212 211 111"/> + <channel onMode="1" bRatio="0.1010" products="2112 211 -211"/> +</particle> + +<particle id="202112" name="N(1440)0" antiName="N(1440)bar0" spinType="2" chargeType="3" colType="0" + m0="1.440" mWidth="0.350" mMin="1.4100" mMax="1.4500"> + <channel onMode="1" bRatio="0.4660" products="2112 -211"/> + <channel onMode="1" bRatio="0.2340" products="2212 111"/> + <channel onMode="1" bRatio="0.1990" products="2112 111 -211"/> + <channel onMode="1" bRatio="0.1010" products="2212 211 -211"/> +</particle> + +<particle id="212212" name="N(1710)+" antiName="N(1710)bar-" spinType="2" chargeType="3" colType="0" + m0="1.710" mWidth="0.100" mMin="1.6800" mMax="1.7400"> + <channel onMode="1" bRatio="0.3334" products="2212 211 111"/> + <channel onMode="1" bRatio="0.1666" products="2112 211 -211"/> + <channel onMode="1" bRatio="0.1334" products="2212 211"/> + <channel onMode="1" bRatio="0.1300" products="2112 223"/> + <channel onMode="1" bRatio="0.1100" products="3122 321"/> + <channel onMode="1" bRatio="0.0660" products="2112 111"/> + <channel onMode="1" bRatio="0.0660" products="2112 221"/> +</particle> + +<particle id="212112" name="N(1710)0" antiName="N(1710)bar0" spinType="2" chargeType="3" colType="0" + m0="1.710" mWidth="0.100" mMin="1.6800" mMax="1.7400"> + <channel onMode="1" bRatio="0.3334" products="2112 -211 111"/> + <channel onMode="1" bRatio="0.1666" products="2212 211 -211"/> + <channel onMode="1" bRatio="0.1334" products="2112 -211"/> + <channel onMode="1" bRatio="0.1300" products="2212 223"/> + <channel onMode="1" bRatio="0.1100" products="3122 311"/> + <channel onMode="1" bRatio="0.0660" products="2212 111"/> + <channel onMode="1" bRatio="0.0660" products="2212 221"/> +</particle> + +<particle id="2214" name="Delta+" antiName="Deltabar-" spinType="4" chargeType="3" colType="0" + m0="1.23200" mWidth="0.11700" mMin="1.08000" mMax="1.60000"> + <channel onMode="1" bRatio="0.6630208" products="2212 111"/> + <channel onMode="1" bRatio="0.3314104" products="2112 211"/> + <channel onMode="1" bRatio="0.0055688" products="2212 22"/> +</particle> + +<particle id="2224" name="Delta++" antiName="Deltabar--" spinType="4" chargeType="6" colType="0" + m0="1.23200" mWidth="0.11700" mMin="1.08000" mMax="1.60000"> + <channel onMode="1" bRatio="1.0000000" products="2212 211"/> +</particle> + +<!-- +<particle id="3101" name="sd_0" antiName="sd_0bar" spinType="1" chargeType="-2" colType="-1" + m0="0.80473"> +</particle> +--> + +<!-- +<particle id="3103" name="sd_1" antiName="sd_1bar" spinType="3" chargeType="-2" colType="-1" + m0="0.92953"> +</particle> +--> + +<particle id="3112" name="Sigma-" antiName="Sigmabar+" spinType="2" chargeType="-3" colType="0" + m0="1.19745" tau0="4.43400e+01"> + <channel onMode="1" bRatio="0.9984757" products="2112 -211"/> + <channel onMode="1" bRatio="0.0010170" meMode="22" products="-12 11 2112"/> + <channel onMode="1" bRatio="0.0004500" meMode="22" products="-14 13 2112"/> + <channel onMode="1" bRatio="0.0000573" meMode="22" products="-12 11 3122"/> +</particle> + + +<particle id="3114" name="Sigma*-" antiName="Sigma*bar+" spinType="4" chargeType="-3" colType="0" + m0="1.38720" mWidth="0.03940" mMin="1.34000" mMax="1.70000"> + <channel onMode="1" bRatio="0.8814590" products="3122 -211"/> + <channel onMode="1" bRatio="0.0592705" products="3212 -211"/> + <channel onMode="1" bRatio="0.0592705" products="3112 111"/> +</particle> + + +<particle id="3122" name="Lambda0" antiName="Lambdabar0" spinType="2" chargeType="0" colType="0" + m0="1.11568" tau0="7.89000e+01"> + <channel onMode="1" bRatio="0.6391668" products="2212 -211"/> + <channel onMode="1" bRatio="0.3580935" products="2112 111"/> + <channel onMode="1" bRatio="0.0017505" products="2112 22"/> + <channel onMode="1" bRatio="0.0008322" meMode="22" products="-12 11 2212"/> + <channel onMode="1" bRatio="0.0001570" meMode="22" products="-14 13 2212"/> +</particle> + +<!-- +<particle id="3124" name="Lambda(1520)0" antiName="Lambda(1520)bar0" spinType="4" chargeType="0" colType="0" + m0="1.51950" mWidth="0.01560" mMin="1.40000" mMax="1.65000"> + <channel onMode="1" bRatio="0.2300000" products="2212 -321"/> + <channel onMode="1" bRatio="0.2300000" products="2112 -311"/> + <channel onMode="1" bRatio="0.1400000" products="3222 -211"/> + <channel onMode="1" bRatio="0.1400000" products="3112 211"/> + <channel onMode="1" bRatio="0.1400000" products="3212 111"/> + <channel onMode="1" bRatio="0.0333000" products="3122 111 111"/> + <channel onMode="1" bRatio="0.0667000" products="3122 211 -211"/> + <channel onMode="1" bRatio="0.0030000" products="3222 -211 111"/> + <channel onMode="1" bRatio="0.0030000" products="3112 211 111"/> + <channel onMode="1" bRatio="0.0010000" products="3212 111 111"/> + <channel onMode="1" bRatio="0.0020000" products="3212 211 -211"/> + <channel onMode="1" bRatio="0.0110000" products="3122 22"/> +</particle> +--> + +<!-- +<particle id="3201" name="su_0" antiName="su_0bar" spinType="1" chargeType="1" colType="-1" + m0="0.80473"> +</particle> +--> + +<!-- +<particle id="3203" name="su_1" antiName="su_1bar" spinType="3" chargeType="1" colType="-1" + m0="0.92953"> +</particle> +--> + +<particle id="3212" name="Sigma0" antiName="Sigmabar0" spinType="2" chargeType="0" colType="0" + m0="1.19264" tau0="2.22e-08"> + <channel onMode="1" bRatio="0.9950249" products="3122 22"/> + <channel onMode="1" bRatio="0.0049751" meMode="11" products="3122 11 -11"/> +</particle> + + +<particle id="3214" name="Sigma*0" antiName="Sigma*bar0" spinType="4" chargeType="0" colType="0" + m0="1.38370" mWidth="0.03600" mMin="1.34000" mMax="1.70000"> + <channel onMode="1" bRatio="0.8700000" products="3122 111"/> + <channel onMode="1" bRatio="0.0585000" products="3222 -211"/> + <channel onMode="1" bRatio="0.0585000" products="3112 211"/> + <channel onMode="1" bRatio="0.0130000" products="3122 22"/> +</particle> + + +<particle id="3222" name="Sigma+" antiName="Sigmabar-" spinType="2" chargeType="3" colType="0" + m0="1.18937" tau0="2.40400e+01"> + <channel onMode="1" bRatio="0.5156743" products="2212 111"/> + <channel onMode="1" bRatio="0.4830758" products="2112 211"/> + <channel onMode="1" bRatio="0.0012299" products="2212 22"/> + <channel onMode="1" bRatio="0.0000200" meMode="22" products="-11 12 3122"/> +</particle> + + +<particle id="3224" name="Sigma*+" antiName="Sigma*bar-" spinType="4" chargeType="3" colType="0" + m0="1.38280" mWidth="0.03600" mMin="1.34000" mMax="1.70000"> + <channel onMode="1" bRatio="0.8814590" products="3122 211"/> + <channel onMode="1" bRatio="0.0592705" products="3222 111"/> + <channel onMode="1" bRatio="0.0592705" products="3212 211"/> +</particle> + + +<!-- +<particle id="3303" name="ss_1" antiName="ss_1bar" spinType="3" chargeType="-2" colType="-1" + m0="1.09361"> +</particle> +--> + +<particle id="3312" name="Xi-" antiName="Xibar+" spinType="2" chargeType="-3" colType="0" + m0="1.32171" tau0="4.91000e+01"> + <channel onMode="1" bRatio="0.9988730" products="3122 -211"/> + <channel onMode="1" bRatio="0.0001270" products="3112 22"/> + <channel onMode="1" bRatio="0.0005630" meMode="22" products="-12 11 3122"/> + <channel onMode="1" bRatio="0.0003500" meMode="22" products="-14 13 3122"/> + <channel onMode="1" bRatio="0.0000870" meMode="22" products="-12 11 3212"/> +</particle> + + +<particle id="3314" name="Xi*-" antiName="Xi*bar+" spinType="4" chargeType="-3" colType="0" + m0="1.53500" mWidth="0.00990" mMin="1.46000" mMax="1.63000"> + <channel onMode="1" bRatio="0.6670000" products="3322 -211"/> + <channel onMode="1" bRatio="0.3330000" products="3312 111"/> +</particle> + +<particle id="3322" name="Xi0" antiName="Xibar0" spinType="2" chargeType="0" colType="0" + m0="1.31486" tau0="8.71000e+01"> + <channel onMode="1" bRatio="0.9952424" products="3122 111"/> + <channel onMode="1" bRatio="0.0011700" products="3122 22"/> + <channel onMode="1" bRatio="0.0033300" products="3212 22"/> + <channel onMode="1" bRatio="0.0002530" meMode="22" products="-12 11 3222"/> + <channel onMode="1" bRatio="0.0000046" meMode="22" products="-14 13 3222"/> +</particle> + +<particle id="3324" name="Xi*0" antiName="Xi*bar0" spinType="4" chargeType="0" colType="0" + m0="1.53180" mWidth="0.00910" mMin="1.46000" mMax="1.63000"> + <channel onMode="1" bRatio="0.3330000" products="3322 111"/> + <channel onMode="1" bRatio="0.6670000" products="3312 211"/> +</particle> + +<particle id="3334" name="Omega-" antiName="Omegabar+" spinType="4" chargeType="-3" colType="0" + m0="1.67245" tau0="2.46100e+01"> + <channel onMode="1" bRatio="0.6737955" products="3122 -321"/> + <channel onMode="1" bRatio="0.2345365" products="3322 -211"/> + <channel onMode="1" bRatio="0.0854667" products="3312 111"/> + <channel onMode="1" bRatio="0.0006360" products="3324 -211"/> + <channel onMode="1" bRatio="0.0055653" meMode="22" products="-12 11 3322"/> +</particle> + +<!-- +<particle id="4101" name="cd_0" antiName="cd_0bar" spinType="1" chargeType="1" colType="-1" + m0="1.96908"> +</particle> +--> + +<!-- +<particle id="4103" name="cd_1" antiName="cd_1bar" spinType="3" chargeType="1" colType="-1" + m0="2.00808"> +</particle> +--> + +<particle id="4112" name="Sigma_c0" antiName="Sigma_cbar0" spinType="2" chargeType="0" colType="0" + m0="2.45374" mWidth="0.00216" mMin="2.43176" mMax="2.47576"> + <channel onMode="1" bRatio="1.0000000" products="4122 -211"/> +</particle> + +<particle id="4114" name="Sigma*_c0" antiName="Sigma*_cbar0" spinType="4" chargeType="0" colType="0" + m0="2.51880" mWidth="0.01450" mMin="2.43000" mMax="2.68000"> + <channel onMode="1" bRatio="1.0000000" products="4122 -211"/> +</particle> + +<particle id="4122" name="Lambda_c+" antiName="Lambda_cbar-" spinType="2" chargeType="3" colType="0" + m0="2.28646" tau0="5.99000e-02"> + <channel onMode="1" bRatio="0.0030000" meMode="22" products="-11 12 2112"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="-11 12 2114"/> + <channel onMode="1" bRatio="0.0180000" meMode="22" products="-11 12 3122"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-11 12 3212"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-11 12 3214"/> + <channel onMode="1" bRatio="0.0030000" meMode="22" products="-13 14 2112"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="-13 14 2114"/> + <channel onMode="1" bRatio="0.0180000" meMode="22" products="-13 14 3122"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-13 14 3212"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-13 14 3214"/> + <channel onMode="1" bRatio="0.0060000" meMode="22" products="-11 12 2112 111"/> + <channel onMode="1" bRatio="0.0060000" meMode="22" products="-11 12 2212 -211"/> + <channel onMode="1" bRatio="0.0060000" meMode="22" products="-13 14 2112 111"/> + <channel onMode="1" bRatio="0.0060000" meMode="22" products="-13 14 2212 -211"/> + <channel onMode="1" bRatio="0.0030000" products="2112 211"/> + <channel onMode="1" bRatio="0.0030000" products="2112 213"/> + <channel onMode="1" bRatio="0.0030000" products="2114 211"/> + <channel onMode="1" bRatio="0.0030000" products="2114 213"/> + <channel onMode="1" bRatio="0.0020000" products="2212 111"/> + <channel onMode="1" bRatio="0.0020000" products="2212 113"/> + <channel onMode="1" bRatio="0.0010000" products="2212 221"/> + <channel onMode="1" bRatio="0.0020000" products="2212 223"/> + <channel onMode="1" bRatio="0.0230000" products="2212 311"/> + <channel onMode="1" bRatio="0.0400000" products="2212 -313"/> + <channel onMode="1" bRatio="0.0010000" products="2212 331"/> + <channel onMode="1" bRatio="0.0013000" products="2212 333"/> + <channel onMode="1" bRatio="0.0010000" products="2214 111"/> + <channel onMode="1" bRatio="0.0010000" products="2214 113"/> + <channel onMode="1" bRatio="0.0010000" products="2214 221"/> + <channel onMode="1" bRatio="0.0010000" products="2214 223"/> + <channel onMode="1" bRatio="0.0050000" products="2214 311"/> + <channel onMode="1" bRatio="0.0050000" products="2214 -313"/> + <channel onMode="1" bRatio="0.0010000" products="2214 331"/> + <channel onMode="1" bRatio="0.0010000" products="2224 -211"/> + <channel onMode="1" bRatio="0.0010000" products="2224 -213"/> + <channel onMode="1" bRatio="0.0066000" products="2224 -321"/> + <channel onMode="1" bRatio="0.0250000" products="2224 -323"/> + <channel onMode="1" bRatio="0.0058000" products="3122 211"/> + <channel onMode="1" bRatio="0.0050000" products="3122 213"/> + <channel onMode="1" bRatio="0.0050000" products="3122 321"/> + <channel onMode="1" bRatio="0.0050000" products="3122 323"/> + <channel onMode="1" bRatio="0.0055000" products="3212 211"/> + <channel onMode="1" bRatio="0.0040000" products="3212 213"/> + <channel onMode="1" bRatio="0.0020000" products="3212 321"/> + <channel onMode="1" bRatio="0.0020000" products="3212 323"/> + <channel onMode="1" bRatio="0.0040000" products="3214 211"/> + <channel onMode="1" bRatio="0.0040000" products="3214 213"/> + <channel onMode="1" bRatio="0.0010000" products="3214 321"/> + <channel onMode="1" bRatio="0.0010000" products="3214 323"/> + <channel onMode="1" bRatio="0.0040000" products="3222 111"/> + <channel onMode="1" bRatio="0.0040000" products="3222 113"/> + <channel onMode="1" bRatio="0.0020000" products="3222 221"/> + <channel onMode="1" bRatio="0.0040000" products="3222 223"/> + <channel onMode="1" bRatio="0.0020000" products="3222 311"/> + <channel onMode="1" bRatio="0.0020000" products="3222 313"/> + <channel onMode="1" bRatio="0.0020000" products="3222 331"/> + <channel onMode="1" bRatio="0.0030000" products="3224 111"/> + <channel onMode="1" bRatio="0.0030000" products="3224 113"/> + <channel onMode="1" bRatio="0.0020000" products="3224 221"/> + <channel onMode="1" bRatio="0.0030000" products="3224 223"/> + <channel onMode="1" bRatio="0.0010000" products="3224 311"/> + <channel onMode="1" bRatio="0.0010000" products="3224 313"/> + <channel onMode="1" bRatio="0.0020000" products="3322 321"/> + <channel onMode="1" bRatio="0.0020000" products="3322 323"/> + <channel onMode="1" bRatio="0.0020000" products="3324 321"/> + <channel onMode="1" bRatio="0.0018000" products="9010221 2212"/> + <channel onMode="1" bRatio="0.0300000" meMode="43" products="1 2203"/> + <channel onMode="1" bRatio="0.0150000" meMode="43" products="2 2101"/> + <channel onMode="1" bRatio="0.0150000" meMode="43" products="2 2103"/> + <channel onMode="1" bRatio="0.1400000" meMode="43" products="2 3201"/> + <channel onMode="1" bRatio="0.1400000" meMode="43" products="2 3203"/> + <channel onMode="1" bRatio="0.0950000" meMode="43" products="3 2203"/> + <channel onMode="1" bRatio="0.0350000" meMode="43" products="2 -1 1 2101"/> + <channel onMode="1" bRatio="0.1300000" meMode="43" products="2 -1 1 3201"/> + <channel onMode="1" bRatio="0.0570000" meMode="43" products="2 -1 1 3203"/> + <channel onMode="1" bRatio="0.0350000" meMode="43" products="2 -3 1 3201"/> +</particle> + +<!-- +<particle id="4124" name="Lambda_c(2625)+" antiName="Lambda_c(2625)-" spinType="4" chargeType="3" colType="0" + m0="2.62810"> + <channel onMode="1" bRatio="0.6600000" products="4122 211 -211"/> + <channel onMode="1" bRatio="0.3300000" products="4122 111"/> + <channel onMode="1" bRatio="0.0100000" products="4122 22"/> +</particle> +--> + +<particle id="4132" name="Xi_c0" antiName="Xi_cbar0" spinType="2" chargeType="0" colType="0" + m0="2.47088" tau0="3.36000e-02"> + <channel onMode="1" bRatio="0.0200000" meMode="22" products="-11 12 3 3101"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-11 12 3 3103"/> + <channel onMode="1" bRatio="0.0200000" meMode="22" products="-13 14 3 3101"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-13 14 3 3103"/> + <channel onMode="1" bRatio="0.5400000" meMode="42" products="2 -1 3 3101"/> + <channel onMode="1" bRatio="0.2100000" meMode="42" products="3 3201"/> + <channel onMode="1" bRatio="0.1000000" meMode="42" products="3 3203"/> + <channel onMode="1" bRatio="0.1000000" meMode="42" products="2 3303"/> +</particle> + +<!-- +<particle id="4201" name="cu_0" antiName="cu_0bar" spinType="1" chargeType="4" colType="-1" + m0="1.96908"> +</particle> +--> + +<!-- +<particle id="4203" name="cu_1" antiName="cu_1bar" spinType="3" chargeType="4" colType="-1" + m0="2.00808"> +</particle> +--> + +<particle id="4212" name="Sigma_c+" antiName="Sigma_cbar-" spinType="2" chargeType="3" colType="0" + m0="2.45290" mWidth="0.00220" mMin="2.43090" mMax="2.47490"> + <channel onMode="1" bRatio="1.0000000" products="4122 111"/> +</particle> + +<particle id="4214" name="Sigma*_c+" antiName="Sigma*_cbar-" spinType="4" chargeType="3" colType="0" + m0="2.51750" mWidth="0.01550" mMin="2.43000" mMax="2.68000"> + <channel onMode="1" bRatio="1.0000000" products="4122 111"/> +</particle> + +<particle id="4222" name="Sigma_c++" antiName="Sigma_cbar--" spinType="2" chargeType="6" colType="0" + m0="2.45398" mWidth="0.00226" mMin="2.43202" mMax="2.47602"> + <channel onMode="1" bRatio="1.0000000" products="4122 211"/> +</particle> + +<particle id="4224" name="Sigma*_c++" antiName="Sigma*_cbar--" spinType="4" chargeType="6" colType="0" + m0="2.51790" mWidth="0.01490" mMin="2.43000" mMax="2.68000"> + <channel onMode="1" bRatio="1.0000000" products="4122 211"/> +</particle> + +<particle id="4232" name="Xi_c+" antiName="Xi_cbar-" spinType="2" chargeType="3" colType="0" + m0="2.46780" tau0="1.32000e-01"> + <channel onMode="1" bRatio="0.0280000" meMode="22" products="-11 12 3 3201"/> + <channel onMode="1" bRatio="0.0070000" meMode="22" products="-11 12 3 3203"/> + <channel onMode="1" bRatio="0.0280000" meMode="22" products="-13 14 3 3201"/> + <channel onMode="1" bRatio="0.0070000" meMode="22" products="-13 14 3 3203"/> + <channel onMode="1" bRatio="0.9300000" meMode="42" products="2 -1 3 3201"/> +</particle> + +<!-- +<particle id="4301" name="cs_0" antiName="cs_0bar" spinType="1" chargeType="1" colType="-1" + m0="2.15432"> +</particle> +--> + +<!-- +<particle id="4303" name="cs_1" antiName="cs_1bar" spinType="3" chargeType="1" colType="-1" + m0="2.17967"> +</particle> +--> + +<particle id="4312" name="Xi'_c0" antiName="Xi'_cbar0" spinType="2" chargeType="0" colType="0" + m0="2.57790"> + <channel onMode="1" bRatio="1.0000000" products="4132 22"/> +</particle> + + +<particle id="4314" name="Xi*_c0" antiName="Xi*_cbar0" spinType="4" chargeType="0" colType="0" + m0="2.64590" mWidth="0.0026" mMin="2.63590" mMax="2.65590"> + <channel onMode="1" bRatio="0.5000000" products="4132 111"/> + <channel onMode="1" bRatio="0.5000000" products="4132 22"/> +</particle> + + +<particle id="4322" name="Xi'_c+" antiName="Xi'_cbar-" spinType="2" chargeType="3" colType="0" + m0="2.57560"> + <channel onMode="1" bRatio="1.0000000" products="4232 22"/> +</particle> + + +<particle id="4324" name="Xi*_c+" antiName="Xi*_cbar-" spinType="4" chargeType="3" colType="0" + m0="2.64590" mWidth="0.0026" mMin="2.63590" mMax="2.65590"> + <channel onMode="1" bRatio="0.5000000" products="4232 111"/> + <channel onMode="1" bRatio="0.5000000" products="4232 22"/> +</particle> + + +<particle id="4332" name="Omega_c0" antiName="Omega_cbar0" spinType="2" chargeType="0" colType="0" + m0="2.69520" tau0="2.10000e-02"> + <channel onMode="1" bRatio="0.0180000" meMode="22" products="-11 12 3 3303"/> + <channel onMode="1" bRatio="0.0180000" meMode="22" products="-13 14 3 3303"/> + <channel onMode="1" bRatio="0.9640000" meMode="42" products="2 -1 3 3303"/> +</particle> + +<!-- +<particle id="4334" name="Omega*_c0" antiName="Omega*_cbar0" spinType="4" chargeType="0" colType="0" + m0="2.76590"> + <channel onMode="1" bRatio="1.0000000" products="4332 22"/> +</particle> +--> + +<!-- +<particle id="4403" name="cc_1" antiName="cc_1bar" spinType="3" chargeType="4" colType="-1" + m0="3.27531"> +</particle> +--> + +<!-- +<particle id="4412" name="Xi_cc+" antiName="Xi_ccbar-" spinType="2" chargeType="3" colType="0" + m0="3.59798" tau0="1.00000e-01"> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-11 12 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-13 14 3 81"/> + <channel onMode="1" bRatio="0.7600000" meMode="42" products="2 -1 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="42" products="2 -3 3 81"/> +</particle> +--> + +<!-- +<particle id="4414" name="Xi*_cc+" antiName="Xi*_ccbar-" spinType="4" chargeType="3" colType="0" + m0="3.65648" tau0="1.00000e-01"> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-11 12 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-13 14 3 81"/> + <channel onMode="1" bRatio="0.7600000" meMode="42" products="2 -1 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="42" products="2 -3 3 81"/> +</particle> +--> + +<!-- +<particle id="4422" name="Xi_cc++" antiName="Xi_ccbar--" spinType="2" chargeType="6" colType="0" + m0="3.59798" tau0="1.00000e-01"> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-11 12 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-13 14 3 81"/> + <channel onMode="1" bRatio="0.7600000" meMode="42" products="2 -1 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="42" products="2 -3 3 81"/> +</particle> +--> + +<!-- +<particle id="4424" name="Xi*_cc++" antiName="Xi*_ccbar--" spinType="4" chargeType="6" colType="0" + m0="3.65648" tau0="1.00000e-01"> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-11 12 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-13 14 3 81"/> + <channel onMode="1" bRatio="0.7600000" meMode="42" products="2 -1 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="42" products="2 -3 3 81"/> +</particle> +--> + +<!-- +<particle id="4432" name="Omega_cc+" antiName="Omega_ccbar-" spinType="2" chargeType="3" colType="0" + m0="3.78663" tau0="1.00000e-01"> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-11 12 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-13 14 3 81"/> + <channel onMode="1" bRatio="0.7600000" meMode="42" products="2 -1 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="42" products="2 -3 3 81"/> +</particle> +--> + +<!-- +<particle id="4434" name="Omega*_cc+" antiName="Omega*_ccbar-" spinType="4" chargeType="3" colType="0" + m0="3.82466" tau0="1.00000e-01"> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-11 12 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-13 14 3 81"/> + <channel onMode="1" bRatio="0.7600000" meMode="42" products="2 -1 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="42" products="2 -3 3 81"/> +</particle> +--> + +<!-- +<particle id="4444" name="Omega*_ccc++" antiName="Omega*_cccbar--" spinType="4" chargeType="6" colType="0" + m0="4.91594" tau0="1.00000e-01"> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-11 12 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-13 14 3 81"/> + <channel onMode="1" bRatio="0.7600000" meMode="42" products="2 -1 3 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="42" products="2 -3 3 81"/> +</particle> +--> + +<!-- +<particle id="5101" name="bd_0" antiName="bd_0bar" spinType="1" chargeType="-2" colType="-1" + m0="5.38897"> +</particle> +--> + +<!-- +<particle id="5103" name="bd_1" antiName="bd_1bar" spinType="3" chargeType="-2" colType="-1" + m0="5.40145"> +</particle> +--> + +<particle id="5112" name="Sigma_b-" antiName="Sigma_bbar+" spinType="2" chargeType="-3" colType="0" + m0="5.81550"> + <channel onMode="1" bRatio="1.0000000" products="5122 -211"/> +</particle> + +<!-- +<particle id="5114" name="Sigma*_b-" antiName="Sigma*_bbar+" spinType="4" chargeType="-3" colType="0" + m0="5.83510"> + <channel onMode="1" bRatio="1.0000000" products="5122 -211"/> +</particle> +--> + +<particle id="5122" name="Lambda_b0" antiName="Lambda_bbar0" spinType="2" chargeType="0" colType="0" + m0="5.61940" tau0="3.69000e-01"> + <channel onMode="1" bRatio="0.0546000" meMode="22" products="-12 11 4122"/> + <channel onMode="1" bRatio="0.0096000" meMode="22" products="-12 11 4124"/> + <channel onMode="1" bRatio="0.0128000" meMode="22" products="-12 11 14122"/> + <channel onMode="1" bRatio="0.0546000" meMode="22" products="-14 13 4122"/> + <channel onMode="1" bRatio="0.0096000" meMode="22" products="-14 13 4124"/> + <channel onMode="1" bRatio="0.0128000" meMode="22" products="-14 13 14122"/> + <channel onMode="1" bRatio="0.0172000" meMode="22" products="-16 15 4122"/> + <channel onMode="1" bRatio="0.0032000" meMode="22" products="-16 15 4124"/> + <channel onMode="1" bRatio="0.0043000" meMode="22" products="-16 15 14122"/> + <channel onMode="1" bRatio="0.0008000" products="2112 421"/> + <channel onMode="1" bRatio="0.0000048" products="2212 -211"/> + <channel onMode="1" bRatio="0.0000185" products="2212 -321"/> + <channel onMode="1" bRatio="0.0000650" products="3122 22"/> + <channel onMode="1" bRatio="0.0000050" products="3122 113"/> + <channel onMode="1" bRatio="0.0000200" products="3122 333"/> + <channel onMode="1" bRatio="0.0008000" products="3122 -421"/> + <channel onMode="1" bRatio="0.0010000" products="3122 441"/> + <channel onMode="1" bRatio="0.0004700" products="3122 443"/> + <channel onMode="1" bRatio="0.0000590" products="3124 22"/> + <channel onMode="1" bRatio="0.0006000" products="4112 111"/> + <channel onMode="1" bRatio="0.0004000" products="4112 221"/> + <channel onMode="1" bRatio="0.0005000" products="4112 331"/> + <channel onMode="1" bRatio="0.0400000" products="4122 -211"/> + <channel onMode="1" bRatio="0.0100000" products="4122 -213"/> + <channel onMode="1" bRatio="0.0005500" products="4122 -321"/> + <channel onMode="1" bRatio="0.0220000" products="4122 -431"/> + <channel onMode="1" bRatio="0.0440000" products="4122 -433"/> + <channel onMode="1" bRatio="0.0003000" products="4132 311"/> + <channel onMode="1" bRatio="0.0006000" products="4212 -211"/> + <channel onMode="1" bRatio="0.0005000" products="4312 311"/> + <channel onMode="1" bRatio="0.0200000" products="-20213 4122"/> + <channel onMode="1" bRatio="0.0000570" products="23122 22"/> + <channel onMode="1" bRatio="0.0000560" products="33122 22"/> + <channel onMode="1" bRatio="0.0003800" products="100443 3122"/> + <channel onMode="1" bRatio="0.0220000" products="4122 211 -211 -211"/> + <channel onMode="1" bRatio="0.0200000" products="3122 311 211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0120000" meMode="22" products="-2 1 2 2101"/> + <channel onMode="1" bRatio="0.4411147" meMode="23" products="-2 1 4 2101"/> + <channel onMode="1" bRatio="0.0910000" meMode="43" products="-2 4 1 2101"/> + <channel onMode="1" bRatio="0.0120000" meMode="22" products="-4 3 2 2101"/> + <channel onMode="1" bRatio="0.0800000" meMode="43" products="-4 3 4 2101"/> +</particle> + +<particle id="5132" name="Xi_b-" antiName="Xi_bbar+" spinType="2" chargeType="-3" colType="0" + m0="5.79110" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1080010" meMode="22" products="-12 11 4 3101"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="-12 11 2 3101"/> + <channel onMode="1" bRatio="0.1080000" meMode="22" products="-14 13 4 3101"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="-14 13 2 3101"/> + <channel onMode="1" bRatio="0.0250000" meMode="22" products="-16 15 4 3101"/> + <channel onMode="1" bRatio="0.0010000" meMode="22" products="-16 15 4 3101"/> + <channel onMode="1" bRatio="0.0010000" products="443 3312"/> + <channel onMode="1" bRatio="0.0004370" products="100443 3312"/> + <channel onMode="1" bRatio="0.0004710" products="20443 3312"/> + <channel onMode="1" bRatio="0.0000900" products="445 3312"/> + <channel onMode="1" bRatio="0.0004900" products="441 3312"/> + <channel onMode="1" bRatio="0.0015000" products="443 3314"/> + <channel onMode="1" bRatio="0.0006560" products="100443 3314"/> + <channel onMode="1" bRatio="0.0007060" products="20443 3314"/> + <channel onMode="1" bRatio="0.0001350" products="445 3314"/> + <channel onMode="1" bRatio="0.0007350" products="441 3314"/> + <channel onMode="1" bRatio="0.0012000" products="443 -321 3122"/> + <channel onMode="1" bRatio="0.0005240" products="100443 -321 3122"/> + <channel onMode="1" bRatio="0.0005650" products="20443 -321 3122"/> + <channel onMode="1" bRatio="0.0001080" products="445 -321 3122"/> + <channel onMode="1" bRatio="0.0005880" products="441 -321 3122"/> + <channel onMode="1" bRatio="0.0006000" products="443 -311 3112"/> + <channel onMode="1" bRatio="0.0002620" products="100443 -311 3112"/> + <channel onMode="1" bRatio="0.0002830" products="20443 -311 3112"/> + <channel onMode="1" bRatio="0.0000540" products="445 -311 3112"/> + <channel onMode="1" bRatio="0.0002940" products="441 -311 3112"/> + <channel onMode="1" bRatio="0.0038200" meMode="43" products="443 3 3101"/> + <channel onMode="1" bRatio="0.0016690" meMode="43" products="100443 3 3101"/> + <channel onMode="1" bRatio="0.0017990" meMode="43" products="20443 3 3101"/> + <channel onMode="1" bRatio="0.0003440" meMode="43" products="445 3 3101"/> + <channel onMode="1" bRatio="0.0018720" meMode="43" products="441 3 3101"/> + <channel onMode="1" bRatio="0.1096770" meMode="22" products="-2 1 4 3101"/> + <channel onMode="1" bRatio="0.2632250" meMode="22" products="-2 4 1 3101"/> + <channel onMode="1" bRatio="0.0658060" meMode="42" products="-2 1 4 3101"/> + <channel onMode="1" bRatio="0.0000000" meMode="42" products="-2 4 1 3101"/> + <channel onMode="1" bRatio="0.0057720" meMode="22" products="-2 3 4 3101"/> + <channel onMode="1" bRatio="0.0138540" meMode="22" products="-2 4 3 3101"/> + <channel onMode="1" bRatio="0.0034630" meMode="42" products="-2 3 4 3101"/> + <channel onMode="1" bRatio="0.0000000" meMode="42" products="-2 4 3 3101"/> + <channel onMode="1" bRatio="0.0090000" meMode="22" products="-2 1 2 3101"/> + <channel onMode="1" bRatio="0.0060000" meMode="22" products="-2 2 1 3101"/> + <channel onMode="1" bRatio="0.0230000" meMode="63" products="-431 4 3101"/> + <channel onMode="1" bRatio="0.0230000" meMode="63" products="-433 4 3101"/> + <channel onMode="1" bRatio="0.0130000" products="-431 4132"/> + <channel onMode="1" bRatio="0.0090000" products="-431 4314"/> + <channel onMode="1" bRatio="0.0090000" products="-433 4132"/> + <channel onMode="1" bRatio="0.0230000" products="-433 4314"/> + <channel onMode="1" bRatio="0.0080000" meMode="22" products="-421 -321 4 3101"/> + <channel onMode="1" bRatio="0.0080000" meMode="22" products="-411 -311 4 3101"/> + <channel onMode="1" bRatio="0.0320000" meMode="22" products="-423 -321 4 3101"/> + <channel onMode="1" bRatio="0.0320000" meMode="22" products="-413 -311 4 3101"/> + <channel onMode="1" bRatio="0.0770000" meMode="42" products="4122 -2203 3101"/> +</particle> + +<!-- +<particle id="5142" name="Xi_bc0" antiName="Xi_bcbar0" spinType="2" chargeType="0" colType="0" + m0="7.00575" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5201" name="bu_0" antiName="bu_0bar" spinType="1" chargeType="1" colType="-1" + m0="5.38897"> +</particle> +--> + +<!-- +<particle id="5203" name="bu_1" antiName="bu_1bar" spinType="3" chargeType="1" colType="-1" + m0="5.40145"> +</particle> +--> + +<!-- +<particle id="5212" name="Sigma_b0" antiName="Sigma_bbar0" spinType="2" chargeType="0" colType="0" + m0="5.80000"> + <channel onMode="1" bRatio="1.0000000" products="5122 111"/> +</particle> +--> + +<!-- +<particle id="5214" name="Sigma*_b0" antiName="Sigma*_bbar0" spinType="4" chargeType="0" colType="0" + m0="5.81000"> + <channel onMode="1" bRatio="1.0000000" products="5122 111"/> +</particle> +--> + +<particle id="5222" name="Sigma_b+" antiName="Sigma_bbar-" spinType="2" chargeType="3" colType="0" + m0="5.81130"> + <channel onMode="1" bRatio="1.0000000" products="5122 211"/> +</particle> + +<!-- +<particle id="5224" name="Sigma*_b+" antiName="Sigma*_bbar-" spinType="4" chargeType="3" colType="0" + m0="5.83210"> + <channel onMode="1" bRatio="1.0000000" products="5122 211"/> +</particle> +--> + +<particle id="5232" name="Xi_b0" antiName="Xi_bbar0" spinType="2" chargeType="0" colType="0" + m0="5.78800" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1080010" meMode="22" products="-12 11 4 3201"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="-12 11 2 3201"/> + <channel onMode="1" bRatio="0.1080000" meMode="22" products="-14 13 4 3201"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="-14 13 2 3201"/> + <channel onMode="1" bRatio="0.0250000" meMode="22" products="-16 15 4 3201"/> + <channel onMode="1" bRatio="0.0010000" meMode="22" products="-16 15 4 3201"/> + <channel onMode="1" bRatio="0.0010000" products="443 3322"/> + <channel onMode="1" bRatio="0.0004370" products="100443 3322"/> + <channel onMode="1" bRatio="0.0004710" products="20443 3322"/> + <channel onMode="1" bRatio="0.0000900" products="445 3322"/> + <channel onMode="1" bRatio="0.0004900" products="441 3322"/> + <channel onMode="1" bRatio="0.0015000" products="443 3324"/> + <channel onMode="1" bRatio="0.0006560" products="100443 3324"/> + <channel onMode="1" bRatio="0.0007060" products="20443 3324"/> + <channel onMode="1" bRatio="0.0001350" products="445 3324"/> + <channel onMode="1" bRatio="0.0007350" products="441 3324"/> + <channel onMode="1" bRatio="0.0012000" products="443 -321 3222"/> + <channel onMode="1" bRatio="0.0005240" products="100443 -321 3222"/> + <channel onMode="1" bRatio="0.0005650" products="20443 -321 3222"/> + <channel onMode="1" bRatio="0.0001080" products="445 -321 3222"/> + <channel onMode="1" bRatio="0.0005880" products="441 -321 3222"/> + <channel onMode="1" bRatio="0.0006000" products="443 -311 3212"/> + <channel onMode="1" bRatio="0.0002620" products="100443 -311 3212"/> + <channel onMode="1" bRatio="0.0002830" products="20443 -311 3212"/> + <channel onMode="1" bRatio="0.0000540" products="445 -311 3212"/> + <channel onMode="1" bRatio="0.0002940" products="441 -311 3212"/> + <channel onMode="1" bRatio="0.0038200" meMode="43" products="443 3 3201"/> + <channel onMode="1" bRatio="0.0016690" meMode="43" products="100443 3 3201"/> + <channel onMode="1" bRatio="0.0017990" meMode="43" products="20443 3 3201"/> + <channel onMode="1" bRatio="0.0003440" meMode="43" products="445 3 3201"/> + <channel onMode="1" bRatio="0.0018720" meMode="43" products="441 3 3201"/> + <channel onMode="1" bRatio="0.1096770" meMode="22" products="-2 1 4 3201"/> + <channel onMode="1" bRatio="0.2632250" meMode="22" products="-2 4 1 3201"/> + <channel onMode="1" bRatio="0.0658060" meMode="42" products="-2 1 4 3201"/> + <channel onMode="1" bRatio="0.0000000" meMode="42" products="-2 4 1 3201"/> + <channel onMode="1" bRatio="0.0057720" meMode="22" products="-2 3 4 3201"/> + <channel onMode="1" bRatio="0.0138540" meMode="22" products="-2 4 3 3201"/> + <channel onMode="1" bRatio="0.0034630" meMode="42" products="-2 3 4 3201"/> + <channel onMode="1" bRatio="0.0000000" meMode="42" products="-2 4 3 3201"/> + <channel onMode="1" bRatio="0.0090000" meMode="22" products="-2 1 2 3201"/> + <channel onMode="1" bRatio="0.0060000" meMode="22" products="-2 2 1 3201"/> + <channel onMode="1" bRatio="0.0230000" meMode="63" products="-431 4 3201"/> + <channel onMode="1" bRatio="0.0230000" meMode="63" products="-433 4 3201"/> + <channel onMode="1" bRatio="0.0130000" products="-431 4232"/> + <channel onMode="1" bRatio="0.0090000" products="-431 4324"/> + <channel onMode="1" bRatio="0.0090000" products="-433 4232"/> + <channel onMode="1" bRatio="0.0230000" products="-433 4324"/> + <channel onMode="1" bRatio="0.0080000" meMode="22" products="-421 -321 4 3201"/> + <channel onMode="1" bRatio="0.0080000" meMode="22" products="-411 -311 4 3201"/> + <channel onMode="1" bRatio="0.0320000" meMode="22" products="-423 -321 4 3201"/> + <channel onMode="1" bRatio="0.0320000" meMode="22" products="-413 -311 4 3201"/> + <channel onMode="1" bRatio="0.0770000" meMode="42" products="4122 -2203 3201"/> +</particle> + +<!-- +<particle id="5242" name="Xi_bc+" antiName="Xi_bcbar-" spinType="2" chargeType="3" colType="0" + m0="7.00575" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5301" name="bs_0" antiName="bs_0bar" spinType="1" chargeType="-2" colType="-1" + m0="5.56725"> +</particle> +--> + +<!-- +<particle id="5303" name="bs_1" antiName="bs_1bar" spinType="3" chargeType="-2" colType="-1" + m0="5.57536"> +</particle> +--> + +<!-- +<particle id="5312" name="Xi'_b-" antiName="Xi'_bbar+" spinType="2" chargeType="-3" colType="0" + m0="5.96000"> + <channel onMode="1" bRatio="1.0000000" products="5132 22"/> +</particle> +--> + +<!-- +<particle id="5314" name="Xi*_b-" antiName="Xi*_bbar+" spinType="4" chargeType="-3" colType="0" + m0="5.97000"> + <channel onMode="1" bRatio="1.0000000" products="5132 22"/> +</particle> +--> + +<!-- +<particle id="5322" name="Xi'_b0" antiName="Xi'_bbar0" spinType="2" chargeType="0" colType="0" + m0="5.96000"> + <channel onMode="1" bRatio="1.0000000" products="5232 22"/> +</particle> +--> + +<!-- +<particle id="5324" name="Xi*_b0" antiName="Xi*_bbar0" spinType="4" chargeType="0" colType="0" + m0="5.97000"> + <channel onMode="1" bRatio="1.0000000" products="5232 22"/> +</particle> +--> + +<particle id="5332" name="Omega_b-" antiName="Omega_bbar+" spinType="2" chargeType="-3" colType="0" + m0="6.07000" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1080010" meMode="22" products="-12 11 4 3303"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="-12 11 2 3303"/> + <channel onMode="1" bRatio="0.1080000" meMode="22" products="-14 13 4 3303"/> + <channel onMode="1" bRatio="0.0020000" meMode="22" products="-14 13 2 3303"/> + <channel onMode="1" bRatio="0.0250000" meMode="22" products="-16 15 4 3303"/> + <channel onMode="1" bRatio="0.0010000" meMode="22" products="-16 15 4 3303"/> + <channel onMode="1" bRatio="0.0025000" products="443 3334"/> + <channel onMode="1" bRatio="0.0010930" products="100443 3334"/> + <channel onMode="1" bRatio="0.0011770" products="20443 3334"/> + <channel onMode="1" bRatio="0.0002250" products="445 3334"/> + <channel onMode="1" bRatio="0.0012250" products="441 3334"/> + <channel onMode="1" bRatio="0.0012000" products="443 -321 3322"/> + <channel onMode="1" bRatio="0.0005240" products="100443 -321 3322"/> + <channel onMode="1" bRatio="0.0005650" products="20443 -321 3322"/> + <channel onMode="1" bRatio="0.0001080" products="445 -321 3322"/> + <channel onMode="1" bRatio="0.0005880" products="441 -321 3322"/> + <channel onMode="1" bRatio="0.0006000" products="443 -311 3312"/> + <channel onMode="1" bRatio="0.0002620" products="100443 -311 3312"/> + <channel onMode="1" bRatio="0.0002830" products="20443 -311 3312"/> + <channel onMode="1" bRatio="0.0000540" products="445 -311 3312"/> + <channel onMode="1" bRatio="0.0002940" products="441 -311 3312"/> + <channel onMode="1" bRatio="0.0038200" meMode="43" products="443 3 3303"/> + <channel onMode="1" bRatio="0.0016690" meMode="43" products="100443 3 3303"/> + <channel onMode="1" bRatio="0.0017990" meMode="43" products="20443 3 3303"/> + <channel onMode="1" bRatio="0.0003440" meMode="43" products="445 3 3303"/> + <channel onMode="1" bRatio="0.0018720" meMode="43" products="441 3 3303"/> + <channel onMode="1" bRatio="0.1096770" meMode="22" products="-2 1 4 3303"/> + <channel onMode="1" bRatio="0.2632250" meMode="22" products="-2 4 1 3303"/> + <channel onMode="1" bRatio="0.0658060" meMode="42" products="-2 1 4 3303"/> + <channel onMode="1" bRatio="0.0000000" meMode="42" products="-2 4 1 3303"/> + <channel onMode="1" bRatio="0.0057720" meMode="22" products="-2 3 4 3303"/> + <channel onMode="1" bRatio="0.0138540" meMode="22" products="-2 4 3 3303"/> + <channel onMode="1" bRatio="0.0034630" meMode="42" products="-2 3 4 3303"/> + <channel onMode="1" bRatio="0.0000000" meMode="42" products="-2 4 3 3303"/> + <channel onMode="1" bRatio="0.0090000" meMode="22" products="-2 1 2 3303"/> + <channel onMode="1" bRatio="0.0060000" meMode="22" products="-2 2 1 3303"/> + <channel onMode="1" bRatio="0.0230000" meMode="63" products="-431 4 3303"/> + <channel onMode="1" bRatio="0.0230000" meMode="63" products="-433 4 3303"/> + <channel onMode="1" bRatio="0.0130000" products="-431 4332"/> + <channel onMode="1" bRatio="0.0090000" products="-431 4334"/> + <channel onMode="1" bRatio="0.0090000" products="-433 4332"/> + <channel onMode="1" bRatio="0.0230000" products="-433 4334"/> + <channel onMode="1" bRatio="0.0080000" meMode="22" products="-421 -321 4 3303"/> + <channel onMode="1" bRatio="0.0080000" meMode="22" products="-411 -311 4 3303"/> + <channel onMode="1" bRatio="0.0320000" meMode="22" products="-423 -321 4 3303"/> + <channel onMode="1" bRatio="0.0320000" meMode="22" products="-413 -311 4 3303"/> + <channel onMode="1" bRatio="0.0770000" meMode="42" products="4122 -2203 3303"/> +</particle> + +<!-- +<particle id="5334" name="Omega*_b-" antiName="Omega*_bbar+" spinType="4" chargeType="-3" colType="0" + m0="6.13000"> + <channel onMode="1" bRatio="1.0000000" products="5332 22"/> +</particle> +--> + +<!-- +<particle id="5342" name="Omega_bc0" antiName="Omega_bcbar0" spinType="2" chargeType="0" colType="0" + m0="7.19099" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5401" name="bc_0" antiName="bc_0bar" spinType="1" chargeType="1" colType="-1" + m0="6.67143"> +</particle> +--> + +<!-- +<particle id="5403" name="bc_1" antiName="bc_1bar" spinType="3" chargeType="1" colType="-1" + m0="6.67397"> +</particle> +--> + +<!-- +<particle id="5412" name="Xi'_bc0" antiName="Xi'_bcbar0" spinType="2" chargeType="0" colType="0" + m0="7.03724" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5414" name="Xi*_bc0" antiName="Xi*_bcbar0" spinType="4" chargeType="0" colType="0" + m0="7.04850" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5422" name="Xi'_bc+" antiName="Xi'_bcbar-" spinType="2" chargeType="3" colType="0" + m0="7.03724" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5424" name="Xi*_bc+" antiName="Xi*_bcbar-" spinType="4" chargeType="3" colType="0" + m0="7.04850" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5432" name="Omega'_bc0" antiName="Omega'_bcbar0" spinType="2" chargeType="0" colType="0" + m0="7.21101" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5434" name="Omega*_bc0" antiName="Omega*_bcbar0" spinType="4" chargeType="0" colType="0" + m0="7.21900" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5442" name="Omega_bcc+" antiName="Omega_bccbar-" spinType="2" chargeType="3" colType="0" + m0="8.30945" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5444" name="Omega*_bcc+" antiName="Omega*_bccbar-" spinType="4" chargeType="3" colType="0" + m0="8.31325" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5503" name="bb_1" antiName="bb_1bar" spinType="3" chargeType="-2" colType="-1" + m0="10.07354"> +</particle> +--> + +<!-- +<particle id="5512" name="Xi_bb-" antiName="Xi_bbbar+" spinType="2" chargeType="-3" colType="0" + m0="10.42272" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5514" name="Xi*_bb-" antiName="Xi*_bbbar+" spinType="4" chargeType="-3" colType="0" + m0="10.44144" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5522" name="Xi_bb0" antiName="Xi_bbbar0" spinType="2" chargeType="0" colType="0" + m0="10.42272" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5524" name="Xi*_bb0" antiName="Xi*_bbbar0" spinType="4" chargeType="0" colType="0" + m0="10.44144" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5532" name="Omega_bb-" antiName="Omega_bbbar+" spinType="2" chargeType="-3" colType="0" + m0="10.60209" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5534" name="Omega*_bb-" antiName="Omega*_bbbar+" spinType="4" chargeType="-3" colType="0" + m0="10.61426" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5542" name="Omega_bbc0" antiName="Omega_bbcbar0" spinType="2" chargeType="0" colType="0" + m0="11.70767" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5544" name="Omega*_bbc0" antiName="Omega*_bbcbar0" spinType="4" chargeType="0" colType="0" + m0="11.71147" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="5554" name="Omega*_bbb-" antiName="Omega*_bbbbar+" spinType="4" chargeType="-3" colType="0" + m0="15.11061" tau0="3.64000e-01"> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-12 11 4 81"/> + <channel onMode="1" bRatio="0.1050000" meMode="22" products="-14 13 4 81"/> + <channel onMode="1" bRatio="0.0400000" meMode="22" products="-16 15 4 81"/> + <channel onMode="1" bRatio="0.5000000" meMode="22" products="-2 1 4 81"/> + <channel onMode="1" bRatio="0.0800000" meMode="22" products="-2 4 1 81"/> + <channel onMode="1" bRatio="0.1400000" meMode="22" products="-4 3 4 81"/> + <channel onMode="1" bRatio="0.0100000" meMode="22" products="-4 4 3 81"/> + <channel onMode="1" bRatio="0.0150000" meMode="22" products="-2 1 2 81"/> + <channel onMode="1" bRatio="0.0050000" meMode="22" products="-4 3 2 81"/> +</particle> +--> + +<!-- +<particle id="10111" name="a_0(1450)0" spinType="1" chargeType="0" colType="0" + m0="1.47400" mWidth="0.26500" mMin="1.00000" mMax="2.00000"> + <channel onMode="1" bRatio="0.3000000" products="111 221"/> + <channel onMode="1" bRatio="0.1000000" products="111 331"/> + <channel onMode="1" bRatio="0.1200000" products="321 -321"/> + <channel onMode="1" bRatio="0.0600000" products="130 130"/> + <channel onMode="1" bRatio="0.0600000" products="310 310"/> + <channel onMode="1" bRatio="0.1800000" products="223 211 -211"/> + <channel onMode="1" bRatio="0.1800000" products="223 111 111"/> +</particle> + +<particle id="10113" name="b_1(1235)0" spinType="3" chargeType="0" colType="0" + m0="1.22950" mWidth="0.14200" mMin="0.95000" mMax="1.70000"> + <channel onMode="1" bRatio="1.0000000" products="223 111"/> +</particle> + +<particle id="10211" name="a_0(1450)+" antiName="a_0(1450)-" spinType="1" chargeType="3" colType="0" + m0="1.47400" mWidth="0.26500" mMin="1.00000" mMax="2.00000"> + <channel onMode="1" bRatio="0.3000000" products="211 221"/> + <channel onMode="1" bRatio="0.1000000" products="211 331"/> + <channel onMode="1" bRatio="0.2400000" products="321 -311"/> + <channel onMode="1" bRatio="0.3600000" products="223 211 111"/> +</particle> + +<particle id="10213" name="b_1(1235)+" antiName="b_1(1235)-" spinType="3" chargeType="3" colType="0" + m0="1.22950" mWidth="0.14200" mMin="0.95000" mMax="1.70000"> + <channel onMode="1" bRatio="0.9984000" products="223 211"/> + <channel onMode="1" bRatio="0.0016000" products="211 22"/> +</particle> + +<particle id="10221" name="f_0(1370)" spinType="1" chargeType="0" colType="0" + m0="1.35000" mWidth="0.20000" mMin="1.00000" mMax="2.00000"> + <channel onMode="1" bRatio="0.2000000" products="113 111"/> + <channel onMode="1" bRatio="0.2000000" products="213 -213"/> + <channel onMode="1" bRatio="0.1000000" products="111 111 111 111"/> + <channel onMode="1" bRatio="0.2000000" products="211 -211"/> + <channel onMode="1" bRatio="0.1000000" products="111 111"/> + <channel onMode="1" bRatio="0.0500000" products="321 -321"/> + <channel onMode="1" bRatio="0.0250000" products="130 130"/> + <channel onMode="1" bRatio="0.0250000" products="310 310"/> + <channel onMode="1" bRatio="0.1000000" products="221 221"/> +</particle> + +<particle id="10223" name="h_1(1170)" spinType="3" chargeType="0" colType="0" + m0="1.17000" mWidth="0.36000" mMin="0.95000" mMax="2.00000"> + <channel onMode="1" bRatio="0.3330000" products="213 -211"/> + <channel onMode="1" bRatio="0.3340000" products="113 111"/> + <channel onMode="1" bRatio="0.3330000" products="-213 211"/> +</particle> + +<particle id="10311" name="K*_0(1430)0" antiName="K*_0(1430)bar0" spinType="1" chargeType="0" colType="0" + m0="1.43000" mWidth="0.27000" mMin="0.70000" mMax="2.20000"> + <channel onMode="1" bRatio="0.6670000" products="321 -211"/> + <channel onMode="1" bRatio="0.3330000" products="311 111"/> +</particle> + +<particle id="10313" name="K_1(1270)0" antiName="K_1(1270)bar0" spinType="3" chargeType="0" colType="0" + m0="1.27200" mWidth="0.09000" mMin="1.00000" mMax="2.00000"> + <channel onMode="1" bRatio="0.2886598" products="321 -213"/> + <channel onMode="1" bRatio="0.1443299" products="311 113"/> + <channel onMode="1" bRatio="0.1924399" products="10321 -211"/> + <channel onMode="1" bRatio="0.0962199" products="10311 111"/> + <channel onMode="1" bRatio="0.1099656" products="323 -211"/> + <channel onMode="1" bRatio="0.0549828" products="313 111"/> + <channel onMode="1" bRatio="0.1134021" products="311 223"/> +</particle> + +<particle id="10321" name="K*_0(1430)+" antiName="K*_0(1430)-" spinType="1" chargeType="3" colType="0" + m0="1.43000" mWidth="0.27000" mMin="0.70000" mMax="2.20000"> + <channel onMode="1" bRatio="0.6670000" products="311 211"/> + <channel onMode="1" bRatio="0.3330000" products="321 111"/> +</particle> + +<particle id="10323" name="K_1(1270)+" antiName="K_1(1270)-" spinType="3" chargeType="3" colType="0" + m0="1.27200" mWidth="0.09000" mMin="1.00000" mMax="2.00000"> + <channel onMode="1" bRatio="0.2886598" products="311 213"/> + <channel onMode="1" bRatio="0.1443299" products="321 113"/> + <channel onMode="1" bRatio="0.1924399" products="10311 211"/> + <channel onMode="1" bRatio="0.0962199" products="10321 111"/> + <channel onMode="1" bRatio="0.1099656" products="313 211"/> + <channel onMode="1" bRatio="0.0549828" products="323 111"/> + <channel onMode="1" bRatio="0.1134021" products="321 223"/> +</particle> + +<particle id="10331" name="f_0(1710)" spinType="1" chargeType="0" colType="0" + m0="1.72000" mWidth="0.13500" mMin="1.10000" mMax="2.40000"> + <channel onMode="1" bRatio="0.3000000" products="321 -321"/> + <channel onMode="1" bRatio="0.1500000" products="130 130"/> + <channel onMode="1" bRatio="0.1500000" products="310 310"/> + <channel onMode="1" bRatio="0.3000000" products="221 221"/> + <channel onMode="1" bRatio="0.0500000" products="211 -211"/> + <channel onMode="1" bRatio="0.0500000" products="111 111"/> +</particle> + +<particle id="10333" name="h_1(1380)" spinType="3" chargeType="0" colType="0" + m0="1.38600" mWidth="0.09100" mMin="1.38000" mMax="1.60000"> + <channel onMode="1" bRatio="0.2500000" products="313 -311"/> + <channel onMode="1" bRatio="0.2500000" products="-313 311"/> + <channel onMode="1" bRatio="0.2500000" products="323 -321"/> + <channel onMode="1" bRatio="0.2500000" products="-323 321"/> +</particle> + +<particle id="10411" name="D*_0+" antiName="D*_0-" spinType="1" chargeType="3" colType="0" + m0="2.31800" mWidth="0.27000" mMin="2.05000" mMax="2.50000"> + <channel onMode="1" bRatio="0.6670000" products="421 211"/> + <channel onMode="1" bRatio="0.3330000" products="411 111"/> +</particle> + +<particle id="10413" name="D_1+" antiName="D_1-" spinType="3" chargeType="3" colType="0" + m0="2.42400" mWidth="0.02000" mMin="2.22400" mMax="2.62400"> + <channel onMode="1" bRatio="0.6670000" products="423 211"/> + <channel onMode="1" bRatio="0.3330000" products="413 111"/> +</particle> + +<particle id="10421" name="D*_00" antiName="D*_0bar0" spinType="1" chargeType="0" colType="0" + m0="2.31800" mWidth="0.27000" mMin="2.05000" mMax="2.50000"> + <channel onMode="1" bRatio="0.6670000" products="411 -211"/> + <channel onMode="1" bRatio="0.3330000" products="421 111"/> +</particle> + +<particle id="10423" name="D_10" antiName="D_1bar0" spinType="3" chargeType="0" colType="0" + m0="2.42130" mWidth="0.02710" mMin="2.21830" mMax="2.62630"> + <channel onMode="1" bRatio="0.6670000" products="413 -211"/> + <channel onMode="1" bRatio="0.3330000" products="423 111"/> +</particle> + +<particle id="10431" name="D*_0s+" antiName="D*_0s-" spinType="1" chargeType="3" colType="0" + m0="2.31780" mWidth="0.02000" mMin="2.20000" mMax="2.44000"> + <channel onMode="1" bRatio="1.0000000" products="431 111"/> +</particle> + +<particle id="10433" name="D_1s+" antiName="D_1s-" spinType="3" chargeType="3" colType="0" + m0="2.53512" mWidth="0.00092" mMin="2.52512" mMax="2.54512"> + <channel onMode="1" bRatio="0.5000000" products="423 321"/> + <channel onMode="1" bRatio="0.5000000" products="413 311"/> +</particle> + +<particle id="10441" name="chi_0c" spinType="1" chargeType="0" colType="0" + m0="3.41475" mWidth="0.01040" mMin="3.31076" mMax="3.51876"> + <channel onMode="1" bRatio="0.0002600" products="22 22"/> + <channel onMode="1" bRatio="0.0021000" products="130 130"/> + <channel onMode="1" bRatio="0.0049000" products="211 -211"/> + <channel onMode="1" bRatio="0.0021000" products="221 221"/> + <channel onMode="1" bRatio="0.0021000" products="310 310"/> + <channel onMode="1" bRatio="0.0016000" products="313 -313"/> + <channel onMode="1" bRatio="0.0060000" products="321 -321"/> + <channel onMode="1" bRatio="0.0010000" products="333 333"/> + <channel onMode="1" bRatio="0.0200000" products="443 22"/> + <channel onMode="1" bRatio="0.0002200" products="2212 -2212"/> + <channel onMode="1" bRatio="0.0005000" products="3122 -3122"/> + <channel onMode="1" bRatio="0.0028000" products="9010221 9010221"/> + <channel onMode="1" bRatio="0.0100000" products="211 -211 113"/> + <channel onMode="1" bRatio="0.0100000" products="213 -211 111"/> + <channel onMode="1" bRatio="0.0100000" products="-213 211 111"/> + <channel onMode="1" bRatio="0.0032000" products="321 -313 -211"/> + <channel onMode="1" bRatio="0.0032000" products="-321 313 211"/> + <channel onMode="1" bRatio="0.0043000" products="323 311 -211"/> + <channel onMode="1" bRatio="0.0043000" products="-323 311 211"/> + <channel onMode="1" bRatio="0.0134000" products="211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0021000" products="321 321 -321 -321"/> + <channel onMode="1" bRatio="0.0153000" products="321 -321 211 -211"/> + <channel onMode="1" bRatio="0.0022000" products="2212 -2212 211 -211"/> + <channel onMode="1" bRatio="0.0098000" products="211 211 211 -211 -211 -211"/> + <channel onMode="1" bRatio="0.8686200" meMode="52" products="83 -83"/> +</particle> + +<particle id="10443" name="h_1c" spinType="3" chargeType="0" colType="0" + m0="3.52541" mWidth="0.01000" mMin="3.36000" mMax="3.56000"> + <channel onMode="1" bRatio="0.5000000" products="441 22"/> + <channel onMode="1" bRatio="0.0100000" products="443 111"/> + <channel onMode="1" bRatio="0.4900000" meMode="42" products="83 -83"/> +</particle> + +<particle id="10511" name="B*_00" antiName="B*_0bar0" spinType="1" chargeType="0" colType="0" + m0="5.68000" mWidth="0.05000" mMin="5.58000" mMax="5.78000"> + <channel onMode="1" bRatio="0.6670000" products="521 -211"/> + <channel onMode="1" bRatio="0.3330000" products="511 111"/> +</particle> + +<particle id="10513" name="B_10" antiName="B_1bar0" spinType="3" chargeType="0" colType="0" + m0="5.73000" mWidth="0.05000" mMin="5.63000" mMax="5.83000"> + <channel onMode="1" bRatio="0.6670000" products="523 -211"/> + <channel onMode="1" bRatio="0.3330000" products="513 111"/> +</particle> + +<particle id="10521" name="B*_0+" antiName="B*_0-" spinType="1" chargeType="3" colType="0" + m0="5.68000" mWidth="0.05000" mMin="5.58000" mMax="5.78000"> + <channel onMode="1" bRatio="0.6670000" products="511 211"/> + <channel onMode="1" bRatio="0.3330000" products="521 111"/> +</particle> + +<particle id="10523" name="B_1+" antiName="B_1-" spinType="3" chargeType="3" colType="0" + m0="5.73000" mWidth="0.05000" mMin="5.63000" mMax="5.83000"> + <channel onMode="1" bRatio="0.6670000" products="513 211"/> + <channel onMode="1" bRatio="0.3330000" products="523 111"/> +</particle> + +<particle id="10531" name="B*_0s0" antiName="B*_0sbar0" spinType="1" chargeType="0" colType="0" + m0="5.92000" mWidth="0.05000" mMin="5.82000" mMax="6.02000"> + <channel onMode="1" bRatio="0.5000000" products="521 -321"/> + <channel onMode="1" bRatio="0.5000000" products="511 -311"/> +</particle> + +<particle id="10533" name="B_1s0" antiName="B_1sbar0" spinType="3" chargeType="0" colType="0" + m0="5.82900" mWidth="0.05000" mMin="5.77900" mMax="5.87900"> + <channel onMode="1" bRatio="0.5000000" products="523 -321"/> + <channel onMode="1" bRatio="0.5000000" products="513 -311"/> +</particle> + +<particle id="10541" name="B*_0c+" antiName="B*_0c-" spinType="1" chargeType="3" colType="0" + m0="7.25000" mWidth="0.05000" mMin="7.20000" mMax="7.30000"> + <channel onMode="1" bRatio="0.5000000" products="511 411"/> + <channel onMode="1" bRatio="0.5000000" products="521 421"/> +</particle> + +<particle id="10543" name="B_1c+" antiName="B_1c-" spinType="3" chargeType="3" colType="0" + m0="7.30000" mWidth="0.05000" mMin="7.20000" mMax="7.40000"> + <channel onMode="1" bRatio="0.5000000" products="513 411"/> + <channel onMode="1" bRatio="0.5000000" products="523 421"/> +</particle> + +<particle id="10551" name="chi_0b" spinType="1" chargeType="0" colType="0" + m0="9.85940"> + <channel onMode="1" bRatio="0.9800000" meMode="91" products="21 21"/> + <channel onMode="1" bRatio="0.0200000" products="553 22"/> +</particle> + +<particle id="10553" name="h_1b" spinType="3" chargeType="0" colType="0" + m0="9.89860" mWidth="0.01000" mMin="9.85500" mMax="9.89500"> + <channel onMode="1" bRatio="1.0000000" meMode="91" products="21 21"/> +</particle> +--> + +<particle id="13122" name="Lambda(1405)0" antiName="Lambda(1405)bar0" spinType="2" chargeType="0" colType="0" + m0="1.40510" mWidth="0.05000" mMin="1.32000" mMax="1.80000"> + <channel onMode="1" bRatio="0.3333000" products="3222 -211"/> + <channel onMode="1" bRatio="0.3333000" products="3112 211"/> + <channel onMode="1" bRatio="0.3334000" products="3212 111"/> +</particle> +<!-- +<particle id="14122" name="Lambda_c(2593)+" antiName="Lambda_c(2593)-" spinType="2" chargeType="3" colType="0" + m0="2.59225" mWidth="0.00260" mMin="2.57000" mMax="2.63000"> + <channel onMode="1" bRatio="0.2400000" products="4222 -211"/> + <channel onMode="1" bRatio="0.2400000" products="4112 211"/> + <channel onMode="1" bRatio="0.1800000" products="4122 211 -211"/> + <channel onMode="1" bRatio="0.2400000" products="4212 111"/> + <channel onMode="1" bRatio="0.0900000" products="4122 111 111"/> + <channel onMode="1" bRatio="0.0100000" products="4122 22"/> +</particle> + +<particle id="20113" name="a_1(1260)0" spinType="3" chargeType="0" colType="0" + m0="1.23000" mWidth="0.42000" mMin="0.93000" mMax="2.00000"> + <channel onMode="1" bRatio="0.3300000" products="213 -211"/> + <channel onMode="1" bRatio="0.3300000" products="-213 211"/> + <channel onMode="1" bRatio="0.3400000" products="113 111"/> +</particle> + +<particle id="20213" name="a_1(1260)+" antiName="a_1(1260)-" spinType="3" chargeType="3" colType="0" + m0="1.23000" mWidth="0.42000" mMin="0.93000" mMax="2.00000"> + <channel onMode="1" bRatio="0.5000000" products="113 211"/> + <channel onMode="1" bRatio="0.5000000" products="213 111"/> +</particle> + +<particle id="20223" name="f_1(1285)" spinType="3" chargeType="0" colType="0" + m0="1.28210" mWidth="0.02420" mMin="1.20000" mMax="1.50000"> + <channel onMode="1" bRatio="0.1200000" products="9000211 -211"/> + <channel onMode="1" bRatio="0.1200000" products="9000111 111"/> + <channel onMode="1" bRatio="0.1200000" products="-9000211 211"/> + <channel onMode="1" bRatio="0.0800000" products="221 211 -211"/> + <channel onMode="1" bRatio="0.0800000" products="221 111 111"/> + <channel onMode="1" bRatio="0.1100000" products="113 211 -211"/> + <channel onMode="1" bRatio="0.0740000" products="213 -211 111"/> + <channel onMode="1" bRatio="0.0740000" products="113 111 111"/> + <channel onMode="1" bRatio="0.0740000" products="-213 211 111"/> + <channel onMode="1" bRatio="0.0230000" products="321 -321 111"/> + <channel onMode="1" bRatio="0.0230000" products="321 -311 -211"/> + <channel onMode="1" bRatio="0.0230000" products="311 -311 111"/> + <channel onMode="1" bRatio="0.0230000" products="311 -321 211"/> + <channel onMode="1" bRatio="0.0552600" products="113 22"/> + <channel onMode="1" bRatio="0.0007400" products="333 22"/> +</particle> + +<particle id="20313" name="K_1(1400)0" antiName="K_1(1400)bar0" spinType="3" chargeType="0" colType="0" + m0="1.40300" mWidth="0.17400" mMin="1.10000" mMax="2.00000"> + <channel onMode="1" bRatio="0.6270000" products="323 -211"/> + <channel onMode="1" bRatio="0.3130000" products="313 111"/> + <channel onMode="1" bRatio="0.0200000" products="321 -213"/> + <channel onMode="1" bRatio="0.0100000" products="311 113"/> + <channel onMode="1" bRatio="0.0200000" products="311 10221"/> + <channel onMode="1" bRatio="0.0100000" products="311 223"/> +</particle> + +<particle id="20323" name="K_1(1400)+" antiName="K_1(1400)-" spinType="3" chargeType="3" colType="0" + m0="1.40300" mWidth="0.17400" mMin="1.10000" mMax="2.00000"> + <channel onMode="1" bRatio="0.6270000" products="313 211"/> + <channel onMode="1" bRatio="0.3130000" products="323 111"/> + <channel onMode="1" bRatio="0.0200000" products="311 213"/> + <channel onMode="1" bRatio="0.0100000" products="321 113"/> + <channel onMode="1" bRatio="0.0200000" products="321 10221"/> + <channel onMode="1" bRatio="0.0100000" products="321 223"/> +</particle> + +<particle id="20333" name="f_1(1420)" spinType="3" chargeType="0" colType="0" + m0="1.42640" mWidth="0.05490" mMin="1.40000" mMax="1.80000"> + <channel onMode="1" bRatio="0.2500000" products="313 -311"/> + <channel onMode="1" bRatio="0.2500000" products="-313 311"/> + <channel onMode="1" bRatio="0.2500000" products="323 -321"/> + <channel onMode="1" bRatio="0.2500000" products="-323 321"/> +</particle> + +<particle id="20413" name="D*_1+" antiName="D*_1-" spinType="3" chargeType="3" colType="0" + m0="2.42700" mWidth="0.38400" mMin="2.15000" mMax="3.00000"> + <channel onMode="1" bRatio="0.6670000" products="423 211"/> + <channel onMode="1" bRatio="0.3330000" products="413 111"/> +</particle> + +<particle id="20423" name="D*_10" antiName="D*_1bar0" spinType="3" chargeType="0" colType="0" + m0="2.42700" mWidth="0.38400" mMin="2.15000" mMax="3.00000"> + <channel onMode="1" bRatio="0.6670000" products="413 -211"/> + <channel onMode="1" bRatio="0.3330000" products="423 111"/> +</particle> + +<particle id="20433" name="D*_1s+" antiName="D*_1s-" spinType="3" chargeType="3" colType="0" + m0="2.45960" mWidth="0.03000" mMin="2.40000" mMax="2.60000"> + <channel onMode="1" bRatio="0.7600000" products="433 111"/> + <channel onMode="1" bRatio="0.2400000" products="433 22"/> +</particle> + +<particle id="20443" name="chi_1c" spinType="3" chargeType="0" colType="0" + m0="3.51066" mWidth="0.00086" mMin="3.50176" mMax="3.51956"> + <channel onMode="1" bRatio="0.3560000" products="443 22"/> + <channel onMode="1" bRatio="0.0000100" products="130 130"/> + <channel onMode="1" bRatio="0.0000100" products="310 310"/> + <channel onMode="1" bRatio="0.0016000" products="313 -313"/> + <channel onMode="1" bRatio="0.0000720" products="2212 -2212"/> + <channel onMode="1" bRatio="0.0003000" products="3122 -3122"/> + <channel onMode="1" bRatio="0.0020000" products="211 -211 113"/> + <channel onMode="1" bRatio="0.0020000" products="213 -211 111"/> + <channel onMode="1" bRatio="0.0020000" products="-213 211 111"/> + <channel onMode="1" bRatio="0.0025000" products="321 311 -211"/> + <channel onMode="1" bRatio="0.0002000" products="321 -313 -211"/> + <channel onMode="1" bRatio="0.0025000" products="-321 311 211"/> + <channel onMode="1" bRatio="0.0002000" products="-321 313 211"/> + <channel onMode="1" bRatio="0.0009000" products="323 311 -211"/> + <channel onMode="1" bRatio="0.0009000" products="-323 311 211"/> + <channel onMode="1" bRatio="0.0062000" products="211 211 -211 -211"/> + <channel onMode="1" bRatio="0.0008000" products="310 310 211 -211"/> + <channel onMode="1" bRatio="0.0004000" products="321 321 -321 -321"/> + <channel onMode="1" bRatio="0.0038000" products="321 -321 211 -211"/> + <channel onMode="1" bRatio="0.0003000" products="321 -321 310 310"/> + <channel onMode="1" bRatio="0.0005000" products="2212 -2212 211 -211"/> + <channel onMode="1" bRatio="0.0058000" products="211 211 211 -211 -211 -211"/> + <channel onMode="1" bRatio="0.6110080" meMode="52" products="83 -83"/> +</particle> + +<particle id="20513" name="B*_10" antiName="B*_1bar0" spinType="3" chargeType="0" colType="0" + m0="5.78000" mWidth="0.05000" mMin="5.68000" mMax="5.88000"> + <channel onMode="1" bRatio="0.6670000" products="523 -211"/> + <channel onMode="1" bRatio="0.3330000" products="513 111"/> +</particle> + +<particle id="20523" name="B*_1+" antiName="B*_1-" spinType="3" chargeType="3" colType="0" + m0="5.78000" mWidth="0.05000" mMin="5.68000" mMax="5.88000"> + <channel onMode="1" bRatio="0.6670000" products="513 211"/> + <channel onMode="1" bRatio="0.3330000" products="523 111"/> +</particle> + +<particle id="20533" name="B*_1s0" antiName="B*_1sbar0" spinType="3" chargeType="0" colType="0" + m0="6.02000" mWidth="0.05000" mMin="5.92000" mMax="6.12000"> + <channel onMode="1" bRatio="0.5000000" products="523 -321"/> + <channel onMode="1" bRatio="0.5000000" products="513 -311"/> +</particle> + +<particle id="20543" name="B*_1c+" antiName="B*_1c-" spinType="3" chargeType="3" colType="0" + m0="7.30000" mWidth="0.05000" mMin="7.20000" mMax="7.40000"> + <channel onMode="1" bRatio="0.5000000" products="513 411"/> + <channel onMode="1" bRatio="0.5000000" products="523 421"/> +</particle> + +<particle id="20553" name="chi_1b" spinType="3" chargeType="0" colType="0" + m0="9.89280"> + <channel onMode="1" bRatio="0.3500000" products="553 22"/> + <channel onMode="1" bRatio="0.6500000" meMode="91" products="21 21"/> +</particle> + +<particle id="23122" name="Lambda(1600)0" antiName="Lambda(1600)bar0" spinType="2" chargeType="0" colType="0" + m0="1.60000" mWidth="0.15000" mMin="1.42000" mMax="2.20000"> + <channel onMode="1" bRatio="0.1760000" products="2212 -321"/> + <channel onMode="1" bRatio="0.1760000" products="2112 -311"/> + <channel onMode="1" bRatio="0.2160000" products="3222 -211"/> + <channel onMode="1" bRatio="0.2160000" products="3112 211"/> + <channel onMode="1" bRatio="0.2160000" products="3212 111"/> +</particle> + +<particle id="30313" name="K*(1680)0" antiName="K*(1680)bar0" spinType="3" chargeType="0" colType="0" + m0="1.71700" mWidth="0.32000" mMin="1.05000" mMax="2.50000"> + <channel onMode="1" bRatio="0.2580000" products="321 -211"/> + <channel onMode="1" bRatio="0.1290000" products="311 111"/> + <channel onMode="1" bRatio="0.2093000" products="323 -211"/> + <channel onMode="1" bRatio="0.1047000" products="313 111"/> + <channel onMode="1" bRatio="0.1993000" products="-213 321"/> + <channel onMode="1" bRatio="0.0997000" products="113 311"/> +</particle> + +<particle id="30323" name="K*(1680)+" antiName="K*(1680)-" spinType="3" chargeType="3" colType="0" + m0="1.71700" mWidth="0.32000" mMin="1.05000" mMax="2.50000"> + <channel onMode="1" bRatio="0.2580000" products="311 211"/> + <channel onMode="1" bRatio="0.1290000" products="321 111"/> + <channel onMode="1" bRatio="0.2093000" products="313 211"/> + <channel onMode="1" bRatio="0.1047000" products="323 111"/> + <channel onMode="1" bRatio="0.1993000" products="213 311"/> + <channel onMode="1" bRatio="0.0997000" products="113 321"/> +</particle> + +<particle id="30443" name="psi(3770)" spinType="3" chargeType="0" colType="0" + m0="3.77315" mWidth="0.02720" mMin="3.54110" mMax="4.00110"> + <channel onMode="1" bRatio="0.4243000" products="411 -411"/> + <channel onMode="1" bRatio="0.5723000" products="421 -421"/> + <channel onMode="1" bRatio="0.0034000" products="443 211 -211"/> +</particle> + +<particle id="33122" name="Lambda(1670)0" antiName="Lambda(1670)bar0" spinType="2" chargeType="0" colType="0" + m0="1.67000" mWidth="0.03500" mMin="1.42000" mMax="2.00000"> + <channel onMode="1" bRatio="0.1000000" products="2212 -321"/> + <channel onMode="1" bRatio="0.1000000" products="2112 -311"/> + <channel onMode="1" bRatio="0.1600000" products="3222 -211"/> + <channel onMode="1" bRatio="0.1600000" products="3112 211"/> + <channel onMode="1" bRatio="0.1600000" products="3212 111"/> + <channel onMode="1" bRatio="0.3200000" products="3122 221"/> +</particle> + +<particle id="100113" name="rho(1450)0" spinType="3" chargeType="0" colType="0" + m0="1.46500" mWidth="0.40000" mMin="1.00000" mMax="2.20000"> + <channel onMode="1" bRatio="0.4000000" products="211 -211"/> + <channel onMode="1" bRatio="0.3500000" products="211 -211 211 -211"/> + <channel onMode="1" bRatio="0.1500000" products="211 -211 111 111"/> + <channel onMode="1" bRatio="0.1000000" products="111 111 111 111"/> +</particle> + +<particle id="100213" name="rho(1450)+" antiName="rho(1450)-" spinType="3" chargeType="3" colType="0" + m0="1.46500" mWidth="0.40000" mMin="1.00000" mMax="2.20000"> + <channel onMode="1" bRatio="0.4000000" products="211 111"/> + <channel onMode="1" bRatio="0.4000000" products="211 211 -211 111"/> + <channel onMode="1" bRatio="0.2000000" products="211 111 111 111"/> +</particle> + +<particle id="100441" name="eta_c(2S)" spinType="1" chargeType="0" colType="0" + m0="3.63890" mWidth="0.01000" mMin="3.49800" mMax="3.77800"> + <channel onMode="1" bRatio="0.0190000" products="321 -311 -211"/> + <channel onMode="1" bRatio="0.0190000" products="-321 311 211"/> + <channel onMode="1" bRatio="0.0095000" products="111 321 -321"/> + <channel onMode="1" bRatio="0.0095000" products="311 -311 111"/> + <channel onMode="1" bRatio="0.9430000" meMode="52" products="83 -83"/> +</particle> + +<particle id="100443" name="psi(2S)" spinType="3" chargeType="0" colType="0" + m0="3.68611" mWidth="0.00030" mMin="3.68269" mMax="3.68949"> + <channel onMode="1" bRatio="0.0073500" products="11 -11"/> + <channel onMode="1" bRatio="0.0073000" products="13 -13"/> + <channel onMode="1" bRatio="0.0028000" products="15 -15"/> + <channel onMode="1" bRatio="0.0000080" products="113 111"/> + <channel onMode="1" bRatio="0.0000800" products="211 -211"/> + <channel onMode="1" bRatio="0.0000080" products="213 -211"/> + <channel onMode="1" bRatio="0.0000080" products="-213 211"/> + <channel onMode="1" bRatio="0.0000300" products="221 113"/> + <channel onMode="1" bRatio="0.0000250" products="223 111"/> + <channel onMode="1" bRatio="0.0000010" products="223 221"/> + <channel onMode="1" bRatio="0.0002100" products="225 22"/> + <channel onMode="1" bRatio="0.0000520" products="310 130"/> + <channel onMode="1" bRatio="0.0000460" products="313 311"/> + <channel onMode="1" bRatio="0.0000460" products="-313 311"/> + <channel onMode="1" bRatio="0.0001000" products="321 -321"/> + <channel onMode="1" bRatio="0.0000065" products="323 -321"/> + <channel onMode="1" bRatio="0.0000065" products="-323 321"/> + <channel onMode="1" bRatio="0.0001500" products="331 22"/> + <channel onMode="1" bRatio="0.0000010" products="333 111"/> + <channel onMode="1" bRatio="0.0000200" products="333 221"/> + <channel onMode="1" bRatio="0.0032000" products="441 22"/> + <channel onMode="1" bRatio="0.0013000" products="443 111"/> + <channel onMode="1" bRatio="0.0324000" products="443 221"/> + <channel onMode="1" bRatio="0.0933000" products="445 22"/> + <channel onMode="1" bRatio="0.0002100" products="2212 -2212"/> + <channel onMode="1" bRatio="0.0001300" products="2224 -2224"/> + <channel onMode="1" bRatio="0.0001800" products="3122 -3122"/> + <channel onMode="1" bRatio="0.0001200" products="3212 -3212"/> + <channel onMode="1" bRatio="0.0001100" products="3224 -3224"/> + <channel onMode="1" bRatio="0.0000900" products="3312 -3312"/> + <channel onMode="1" bRatio="0.0002140" products="10113 111"/> + <channel onMode="1" bRatio="0.0002140" products="10213 -211"/> + <channel onMode="1" bRatio="0.0002140" products="-10213 211"/> + <channel onMode="1" bRatio="0.0010000" products="10323 -321"/> + <channel onMode="1" bRatio="0.0010000" products="-10323 321"/> + <channel onMode="1" bRatio="0.0922000" products="10441 22"/> + <channel onMode="1" bRatio="0.0008000" products="10443 111"/> + <channel onMode="1" bRatio="0.0907000" products="20443 22"/> + <channel onMode="1" bRatio="0.0001640" products="211 -211 111"/> + <channel onMode="1" bRatio="0.0004200" products="211 -211 113"/> + <channel onMode="1" bRatio="0.0001500" products="321 -321 223"/> + <channel onMode="1" bRatio="0.0001500" products="333 211 -211"/> + <channel onMode="1" bRatio="0.0000600" products="333 321 -321"/> + <channel onMode="1" bRatio="0.1658000" products="443 111 111"/> + <channel onMode="1" bRatio="0.3366000" products="443 211 -211"/> + <channel onMode="1" bRatio="0.0001400" products="2212 -2212 111"/> + <channel onMode="1" bRatio="0.0002200" products="310 310 211 -211"/> + <channel onMode="1" bRatio="0.0016000" products="321 -321 211 -211"/> + <channel onMode="1" bRatio="0.0008000" products="2212 -2212 211 -211"/> + <channel onMode="1" bRatio="0.0030000" products="211 211 -211 -211 111"/> + <channel onMode="1" bRatio="0.0001500" products="211 211 211 -211 -211 -211"/> + <channel onMode="1" bRatio="0.0035000" products="211 211 211 -211 -211 -211 111"/> + <channel onMode="1" bRatio="0.0168000" meMode="53" products="83 -83"/> + <channel onMode="1" bRatio="0.1258780" meMode="92" products="21 21 21"/> + <channel onMode="1" bRatio="0.0089380" meMode="92" products="22 21 21"/> +</particle> + +<particle id="100553" name="Upsilon(2S)" spinType="3" chargeType="0" colType="0" + m0="10.02326" mWidth="0.00003" mMin="10.02297" mMax="10.02357"> + <channel onMode="1" bRatio="0.0191000" products="11 -11"/> + <channel onMode="1" bRatio="0.0193000" products="13 -13"/> + <channel onMode="1" bRatio="0.0170000" products="15 -15"/> + <channel onMode="1" bRatio="0.0670000" products="555 22"/> + <channel onMode="1" bRatio="0.0430000" products="10551 22"/> + <channel onMode="1" bRatio="0.0660000" products="20553 22"/> + <channel onMode="1" bRatio="0.0900000" products="553 111 111"/> + <channel onMode="1" bRatio="0.1850000" products="553 211 -211"/> + <channel onMode="1" bRatio="0.0050000" meMode="91" products="1 -1"/> + <channel onMode="1" bRatio="0.0200000" meMode="91" products="2 -2"/> + <channel onMode="1" bRatio="0.0050000" meMode="91" products="3 -3"/> + <channel onMode="1" bRatio="0.0200000" meMode="91" products="4 -4"/> + <channel onMode="1" bRatio="0.4276000" meMode="92" products="21 21 21"/> + <channel onMode="1" bRatio="0.0160000" meMode="92" products="22 21 21"/> +</particle> + +<particle id="200553" name="Upsilon(3S)" spinType="3" chargeType="0" colType="0" + m0="10.3552" mWidth="0.00002" mMin="10.3552" mMax="10.3552"> + <channel onMode="1" bRatio="0.0000000" products="11 -11"/> + <channel onMode="1" bRatio="0.0379639" products="13 -13"/> + <channel onMode="1" bRatio="0.0398795" products="15 -15"/> + <channel onMode="1" bRatio="0.0383122" products="553 111 111"/> + <channel onMode="1" bRatio="0.0761019" products="553 211 -211"/> + <channel onMode="1" bRatio="0.0322171" products="100553 111 111"/> + <channel onMode="1" bRatio="0.0491092" products="100553 211 -211"/> + <channel onMode="1" bRatio="0.0870731" products="100553 22 22"/> + <channel onMode="1" bRatio="0.0007488" products="10553 111"/> + <channel onMode="1" bRatio="0.6217021" meMode="92" products="21 21 21"/> + <channel onMode="1" bRatio="0.0168922" meMode="92" products="22 21 21"/> +</particle> + +<particle id="1000001" name="~d_L" antiName="~d_Lbar" spinType="1" chargeType="-1" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 1"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 3"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2"/> + <channel onMode="1" bRatio="0.0000000" products="12 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4"/> + <channel onMode="1" bRatio="0.0000000" products="12 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6"/> + <channel onMode="1" bRatio="0.0000000" products="14 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2"/> + <channel onMode="1" bRatio="0.0000000" products="14 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4"/> + <channel onMode="1" bRatio="0.0000000" products="14 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6"/> + <channel onMode="1" bRatio="0.0000000" products="16 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2"/> + <channel onMode="1" bRatio="0.0000000" products="16 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4"/> + <channel onMode="1" bRatio="0.0000000" products="16 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -5"/> +</particle> + +<particle id="1000002" name="~u_L" antiName="~u_Lbar" spinType="1" chargeType="2" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 2"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 4"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 -5"/> +</particle> + +<particle id="1000003" name="~s_L" antiName="~s_Lbar" spinType="1" chargeType="-1" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 1"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 3"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2"/> + <channel onMode="1" bRatio="0.0000000" products="12 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4"/> + <channel onMode="1" bRatio="0.0000000" products="12 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6"/> + <channel onMode="1" bRatio="0.0000000" products="14 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2"/> + <channel onMode="1" bRatio="0.0000000" products="14 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4"/> + <channel onMode="1" bRatio="0.0000000" products="14 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6"/> + <channel onMode="1" bRatio="0.0000000" products="16 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2"/> + <channel onMode="1" bRatio="0.0000000" products="16 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4"/> + <channel onMode="1" bRatio="0.0000000" products="16 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -5"/> +</particle> + +<particle id="1000004" name="~c_L" antiName="~c_Lbar" spinType="1" chargeType="2" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 2"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 4"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 -5"/> +</particle> + +<particle id="1000005" name="~b_1" antiName="~b_1bar" spinType="1" chargeType="-1" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 1"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 3"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2"/> + <channel onMode="1" bRatio="0.0000000" products="12 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4"/> + <channel onMode="1" bRatio="0.0000000" products="12 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6"/> + <channel onMode="1" bRatio="0.0000000" products="14 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2"/> + <channel onMode="1" bRatio="0.0000000" products="14 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4"/> + <channel onMode="1" bRatio="0.0000000" products="14 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6"/> + <channel onMode="1" bRatio="0.0000000" products="16 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2"/> + <channel onMode="1" bRatio="0.0000000" products="16 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4"/> + <channel onMode="1" bRatio="0.0000000" products="16 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -3"/> +</particle> + +<particle id="1000006" name="~t_1" antiName="~t_1bar" spinType="1" chargeType="2" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 2"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 4"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 -5"/> +</particle> + +<particle id="1000011" name="~e_L-" antiName="~e_L+" spinType="1" chargeType="-3" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 11"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 12"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000012 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000012 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000012 -37"/> + <channel onMode="1" bRatio="0.0000000" products="12 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 15"/> + <channel onMode="1" bRatio="0.0000000" products="-2 1"/> + <channel onMode="1" bRatio="0.0000000" products="-2 3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 1"/> + <channel onMode="1" bRatio="0.0000000" products="-4 3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 1"/> + <channel onMode="1" bRatio="0.0000000" products="-6 3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 5"/> +</particle> + +<particle id="1000012" name="~nu_eL" antiName="~nu_eLbar" spinType="1" chargeType="0" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000011 24"/> + <channel onMode="1" bRatio="0.0000000" products="2000011 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000011 37"/> + <channel onMode="1" bRatio="0.0000000" products="2000011 37"/> + <channel onMode="1" bRatio="0.0000000" products="-13 11"/> + <channel onMode="1" bRatio="0.0000000" products="-13 13"/> + <channel onMode="1" bRatio="0.0000000" products="-13 15"/> + <channel onMode="1" bRatio="0.0000000" products="-15 11"/> + <channel onMode="1" bRatio="0.0000000" products="-15 13"/> + <channel onMode="1" bRatio="0.0000000" products="-15 15"/> + <channel onMode="1" bRatio="0.0000000" products="-1 1"/> + <channel onMode="1" bRatio="0.0000000" products="-1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 1"/> + <channel onMode="1" bRatio="0.0000000" products="-3 3"/> + <channel onMode="1" bRatio="0.0000000" products="-3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-5 1"/> + <channel onMode="1" bRatio="0.0000000" products="-5 3"/> + <channel onMode="1" bRatio="0.0000000" products="-5 5"/> +</particle> + +<particle id="1000013" name="~mu_L-" antiName="~mu_L+" spinType="1" chargeType="-3" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 13"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 14"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000014 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000014 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000014 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000014 -37"/> + <channel onMode="1" bRatio="0.0000000" products="12 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 15"/> + <channel onMode="1" bRatio="0.0000000" products="-2 1"/> + <channel onMode="1" bRatio="0.0000000" products="-2 3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 1"/> + <channel onMode="1" bRatio="0.0000000" products="-4 3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 1"/> + <channel onMode="1" bRatio="0.0000000" products="-6 3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 5"/> +</particle> + +<particle id="1000014" name="~nu_muL" antiName="~nu_muLbar" spinType="1" chargeType="0" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000013 24"/> + <channel onMode="1" bRatio="0.0000000" products="2000013 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000013 37"/> + <channel onMode="1" bRatio="0.0000000" products="2000013 37"/> + <channel onMode="1" bRatio="0.0000000" products="-11 11"/> + <channel onMode="1" bRatio="0.0000000" products="-11 13"/> + <channel onMode="1" bRatio="0.0000000" products="-11 15"/> + <channel onMode="1" bRatio="0.0000000" products="-15 11"/> + <channel onMode="1" bRatio="0.0000000" products="-15 13"/> + <channel onMode="1" bRatio="0.0000000" products="-15 15"/> + <channel onMode="1" bRatio="0.0000000" products="-1 1"/> + <channel onMode="1" bRatio="0.0000000" products="-1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 1"/> + <channel onMode="1" bRatio="0.0000000" products="-3 3"/> + <channel onMode="1" bRatio="0.0000000" products="-3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-5 1"/> + <channel onMode="1" bRatio="0.0000000" products="-5 3"/> + <channel onMode="1" bRatio="0.0000000" products="-5 5"/> +</particle> + +<particle id="1000015" name="~tau_1-" antiName="~tau_1+" spinType="1" chargeType="-3" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 15"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 16"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000016 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000016 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000016 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000016 -37"/> + <channel onMode="1" bRatio="0.0000000" products="12 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 15"/> + <channel onMode="1" bRatio="0.0000000" products="-2 1"/> + <channel onMode="1" bRatio="0.0000000" products="-2 3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 1"/> + <channel onMode="1" bRatio="0.0000000" products="-4 3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 1"/> + <channel onMode="1" bRatio="0.0000000" products="-6 3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 5"/> +</particle> + +<particle id="1000016" name="~nu_tauL" antiName="~nu_tauLbar" spinType="1" chargeType="0" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000015 24"/> + <channel onMode="1" bRatio="0.0000000" products="2000015 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000015 37"/> + <channel onMode="1" bRatio="0.0000000" products="2000015 37"/> + <channel onMode="1" bRatio="0.0000000" products="-11 11"/> + <channel onMode="1" bRatio="0.0000000" products="-11 13"/> + <channel onMode="1" bRatio="0.0000000" products="-11 15"/> + <channel onMode="1" bRatio="0.0000000" products="-13 11"/> + <channel onMode="1" bRatio="0.0000000" products="-13 13"/> + <channel onMode="1" bRatio="0.0000000" products="-13 15"/> + <channel onMode="1" bRatio="0.0000000" products="-1 1"/> + <channel onMode="1" bRatio="0.0000000" products="-1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 1"/> + <channel onMode="1" bRatio="0.0000000" products="-3 3"/> + <channel onMode="1" bRatio="0.0000000" products="-3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-5 1"/> + <channel onMode="1" bRatio="0.0000000" products="-5 3"/> + <channel onMode="1" bRatio="0.0000000" products="-5 5"/> +</particle> + +<particle id="1000021" name="~g" spinType="2" chargeType="0" colType="2" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 21"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 6"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 2"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 6"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 2"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000006 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="4 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="6 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 3 5"/> +</particle> + +<particle id="1000022" name="~chi_10" spinType="2" chargeType="0" colType="0" + m0="500.00000" mWidth="1.00000" mMin="20.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 22"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 23"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 25"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 35"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 36"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="4 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="6 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 3 5"/> +</particle> + +<particle id="1000023" name="~chi_20" spinType="2" chargeType="0" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 22"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 23"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 25"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 35"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 22"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 -24"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 -37"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 -37"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 -24"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000011 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-1000011 11"/> + <channel onMode="1" bRatio="0.0000000" products="2000011 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-2000011 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000012 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-1000012 12"/> + <channel onMode="1" bRatio="0.0000000" products="2000012 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-2000012 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000013 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-1000013 13"/> + <channel onMode="1" bRatio="0.0000000" products="2000013 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-2000013 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000014 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-1000014 14"/> + <channel onMode="1" bRatio="0.0000000" products="2000014 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-2000014 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000015 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-1000015 15"/> + <channel onMode="1" bRatio="0.0000000" products="2000015 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-2000015 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000016 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-1000016 16"/> + <channel onMode="1" bRatio="0.0000000" products="2000016 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-2000016 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 16 -16"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 11 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 13 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 15 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 11 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 13 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 15 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 6"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 2"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 6"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 2"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000006 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="4 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="6 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 3 5"/> +</particle> + +<particle id="1000024" name="~chi_1+" antiName="~chi_1-" spinType="2" chargeType="3" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 24"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000012 -11"/> + <channel onMode="1" bRatio="0.0000000" products="2000012 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-1000011 12"/> + <channel onMode="1" bRatio="0.0000000" products="-2000011 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000014 -13"/> + <channel onMode="1" bRatio="0.0000000" products="2000014 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-1000013 14"/> + <channel onMode="1" bRatio="0.0000000" products="-2000013 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000016 -15"/> + <channel onMode="1" bRatio="0.0000000" products="2000016 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-1000015 16"/> + <channel onMode="1" bRatio="0.0000000" products="-2000015 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -1"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -1"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -1"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 12"/> + <channel onMode="1" bRatio="0.0000000" products="12 14 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="12 14 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 16"/> + <channel onMode="1" bRatio="0.0000000" products="12 14 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 12"/> + <channel onMode="1" bRatio="0.0000000" products="12 16 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 14"/> + <channel onMode="1" bRatio="0.0000000" products="12 16 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="12 16 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 14"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 16"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 12"/> + <channel onMode="1" bRatio="0.0000000" products="14 16 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 14"/> + <channel onMode="1" bRatio="0.0000000" products="14 16 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="14 16 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 14"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 16"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 12"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 16"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 2 3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2 2 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 4 1"/> + <channel onMode="1" bRatio="0.0000000" products="2 4 3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2 4 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 6 1"/> + <channel onMode="1" bRatio="0.0000000" products="2 6 3"/> + <channel onMode="1" bRatio="0.0000000" products="2 6 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 4 1"/> + <channel onMode="1" bRatio="0.0000000" products="4 4 5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 6 1"/> + <channel onMode="1" bRatio="0.0000000" products="4 6 3"/> + <channel onMode="1" bRatio="0.0000000" products="4 6 5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 -5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 6 1"/> + <channel onMode="1" bRatio="0.0000000" products="6 6 3"/> +</particle> + +<particle id="1000025" name="~chi_30" spinType="2" chargeType="0" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 22"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 23"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 25"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 35"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 22"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 22"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 -24"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 -37"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 -24"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 -37"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000011 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-1000011 11"/> + <channel onMode="1" bRatio="0.0000000" products="2000011 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-2000011 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000012 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-1000012 12"/> + <channel onMode="1" bRatio="0.0000000" products="2000012 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-2000012 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000013 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-1000013 13"/> + <channel onMode="1" bRatio="0.0000000" products="2000013 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-2000013 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000014 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-1000014 14"/> + <channel onMode="1" bRatio="0.0000000" products="2000014 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-2000014 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000015 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-1000015 15"/> + <channel onMode="1" bRatio="0.0000000" products="2000015 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-2000015 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000016 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-1000016 16"/> + <channel onMode="1" bRatio="0.0000000" products="2000016 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-2000016 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 16 -16"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 16 -16"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 11 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 13 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 15 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 11 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 13 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 15 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 6"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 2"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 6"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 2"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000006 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="4 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="6 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 3 5"/> +</particle> + +<particle id="1000035" name="~chi_40" spinType="2" chargeType="0" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 22"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 23"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 25"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 35"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 22"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 22"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 22"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 -24"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 -24"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 -37"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 -37"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 16 -16"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 16 -16"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 16 -16"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 11 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 13 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 15 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 11 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 13 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 15 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000011 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-1000011 11"/> + <channel onMode="1" bRatio="0.0000000" products="2000011 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-2000011 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000012 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-1000012 12"/> + <channel onMode="1" bRatio="0.0000000" products="2000012 -12"/> + <channel onMode="1" bRatio="0.0000000" products="-2000012 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000013 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-1000013 13"/> + <channel onMode="1" bRatio="0.0000000" products="2000013 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-2000013 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000014 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-1000014 14"/> + <channel onMode="1" bRatio="0.0000000" products="2000014 -14"/> + <channel onMode="1" bRatio="0.0000000" products="-2000014 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000015 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-1000015 15"/> + <channel onMode="1" bRatio="0.0000000" products="2000015 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-2000015 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000016 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-1000016 16"/> + <channel onMode="1" bRatio="0.0000000" products="2000016 -16"/> + <channel onMode="1" bRatio="0.0000000" products="-2000016 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000002 6"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 2"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000002 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000004 6"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 2"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000004 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 5"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 1"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 3"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000006 4"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000006 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="4 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 3 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="6 1 3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 1 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 3 5"/> +</particle> + +<particle id="1000037" name="~chi_2+" antiName="~chi_2-" spinType="2" chargeType="3" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 24"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 24"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 37"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 16 -16"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000012 -11"/> + <channel onMode="1" bRatio="0.0000000" products="2000012 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-1000011 12"/> + <channel onMode="1" bRatio="0.0000000" products="-2000011 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000014 -13"/> + <channel onMode="1" bRatio="0.0000000" products="2000014 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-1000013 14"/> + <channel onMode="1" bRatio="0.0000000" products="-2000013 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000016 -15"/> + <channel onMode="1" bRatio="0.0000000" products="2000016 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-1000015 16"/> + <channel onMode="1" bRatio="0.0000000" products="-2000015 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 2 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 2 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 4 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 4 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 6 -2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 6 -4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -1"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000001 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000001 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -1"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000003 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000003 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -1"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -3"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -1"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000005 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 2"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 4"/> + <channel onMode="1" bRatio="0.0000000" products="-2000005 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 12"/> + <channel onMode="1" bRatio="0.0000000" products="12 14 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="12 14 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -13 16"/> + <channel onMode="1" bRatio="0.0000000" products="12 14 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 12"/> + <channel onMode="1" bRatio="0.0000000" products="12 16 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 14"/> + <channel onMode="1" bRatio="0.0000000" products="12 16 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="12 16 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="14 12 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 14"/> + <channel onMode="1" bRatio="0.0000000" products="14 12 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -11 16"/> + <channel onMode="1" bRatio="0.0000000" products="14 12 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 12"/> + <channel onMode="1" bRatio="0.0000000" products="14 16 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -15 11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 14"/> + <channel onMode="1" bRatio="0.0000000" products="14 16 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -15 13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -15 16"/> + <channel onMode="1" bRatio="0.0000000" products="14 16 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -15 15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 12"/> + <channel onMode="1" bRatio="0.0000000" products="16 12 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -11 11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 14"/> + <channel onMode="1" bRatio="0.0000000" products="16 12 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -11 13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -11 16"/> + <channel onMode="1" bRatio="0.0000000" products="16 12 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -11 15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 12"/> + <channel onMode="1" bRatio="0.0000000" products="16 14 -11"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -13 11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 14"/> + <channel onMode="1" bRatio="0.0000000" products="16 14 -13"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -13 13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -13 16"/> + <channel onMode="1" bRatio="0.0000000" products="16 14 -15"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -13 15"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -2 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -4 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 2"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="12 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 4"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="12 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -6 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -2 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -4 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 2"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="14 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 4"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="14 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -6 6"/> + <channel onMode="1" bRatio="0.0000000" products="-13 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="14 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -1 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -1 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -1 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -2 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -1 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -3 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -3 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -3 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -4 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -3 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 2"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -5 1"/> + <channel onMode="1" bRatio="0.0000000" products="16 6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 4"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -5 3"/> + <channel onMode="1" bRatio="0.0000000" products="16 6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 -5 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -6 6"/> + <channel onMode="1" bRatio="0.0000000" products="-15 -5 5"/> + <channel onMode="1" bRatio="0.0000000" products="16 6 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 2 3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2 2 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 4 1"/> + <channel onMode="1" bRatio="0.0000000" products="2 4 3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="2 4 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="2 6 1"/> + <channel onMode="1" bRatio="0.0000000" products="2 6 3"/> + <channel onMode="1" bRatio="0.0000000" products="2 6 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 4 1"/> + <channel onMode="1" bRatio="0.0000000" products="4 4 5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 -3 -5"/> + <channel onMode="1" bRatio="0.0000000" products="4 6 1"/> + <channel onMode="1" bRatio="0.0000000" products="4 6 3"/> + <channel onMode="1" bRatio="0.0000000" products="4 6 5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 -5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 6 1"/> + <channel onMode="1" bRatio="0.0000000" products="6 6 3"/> +</particle> + +<particle id="1000039" name="~Gravitino" spinType="4" chargeType="0" colType="0" + m0="1.000e-03"> +</particle> + +<particle id="1000045" name="~chi_50" spinType="2" chargeType="0" colType="0" + m0="500.00000"> +</particle> + +<particle id="1000512" name="R0(~b dbar)" antiName="R0(~bbar d)" spinType="2" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1000522" name="R-(~b ubar)" antiName="R+(~bbar u)" spinType="2" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1000532" name="R0(~b sbar)" antiName="R0(~bbar s)" spinType="2" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1000542" name="R-(~b cbar)" antiName="R+(~bbar c)" spinType="2" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1000552" name="R0(~b bbar)" antiName="R0(~bbar b)" spinType="2" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1000612" name="R+(~t dbar)" antiName="R-(~tbar d)" spinType="2" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1000622" name="R0(~t ubar)" antiName="R0(~tbar u)" spinType="2" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1000632" name="R+(~t sbar)" antiName="R-(~tbar s)" spinType="2" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1000642" name="R0(~t cbar)" antiName="R0(~tbar c)" spinType="2" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1000652" name="R+(~t bbar)" antiName="R-(~tbar b)" spinType="2" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1000993" name="R0(~g g)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1005113" name="R-(~b dd1)" antiName="Rbar+(~b dd1)" spinType="3" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1005211" name="R0(~b ud0)" antiName="Rbar0(~b ud0)" spinType="1" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1005213" name="R0(~b ud1)" antiName="Rbar0(~b ud1)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1005223" name="R+(~b uu1)" antiName="Rbar-(~b uu1)" spinType="3" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1005311" name="R-(~b sd0)" antiName="Rbar+(~b sd0)" spinType="1" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1005313" name="R-(~b sd1)" antiName="Rbar+(~b sd1)" spinType="3" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1005321" name="R0(~b su0)" antiName="Rbar0(~b su0)" spinType="1" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1005323" name="R0(~b su1)" antiName="Rbar0(~b su1)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1005333" name="R-(~b ss1)" antiName="Rbar+(~b ss1)" spinType="3" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1006113" name="R0(~t dd1)" antiName="Rbar0(~t dd1)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1006211" name="R+(~t ud0)" antiName="Rbar-(~t ud0)" spinType="1" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1006213" name="R+(~t ud1)" antiName="Rbar-(~t ud1)" spinType="3" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1006223" name="R++(~t uu1)" antiName="Rbar--(~t uu1)" spinType="3" chargeType="6" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1006311" name="R-(~t sd0)" antiName="Rbar+(~t sd0)" spinType="1" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1006313" name="R-(~t sd1)" antiName="Rbar+(~t sd1)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1006321" name="R0(~t su0)" antiName="Rbar0(~t su0)" spinType="1" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1006323" name="R0(~t su1)" antiName="Rbar0(~t su1)" spinType="3" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1006333" name="R0(~t ss1)" antiName="Rbar0(~t ss1)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009002" name="Rtemp(~g q)" antiName="Rtemp(~g qbar)" spinType="2" chargeType="0" colType="1" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009113" name="R0(~g d dbar)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009213" name="R+(~g u dbar)" antiName="R-(~g d ubar)" spinType="3" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009223" name="R0(~g u ubar)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009313" name="R0(~g d sbar)" antiName="R0(~g s dbar)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009323" name="R+(~g u sbar)" antiName="R-(~g s ubar)" spinType="3" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009333" name="R0(~g s sbar)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009413" name="R+(~g c dbar)" antiName="R-(~g d cbar)" spinType="3" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009423" name="R0(~g c ubar)" antiName="R0(~g u cbar)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009433" name="R+(~g c sbar)" antiName="R-(~g s cbar)" spinType="3" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009443" name="R0(~g c cbar)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009513" name="R0(~g d bbar)" antiName="R0(~g b dbar)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009523" name="R+(~g u bbar)" antiName="R-(~g b ubar)" spinType="3" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009533" name="R0(~g s bbar)" antiName="R0(~g b sbar)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009543" name="R+(~g c bbar)" antiName="R-(~g b cbar)" spinType="3" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1009553" name="R0(~g b bbar)" spinType="3" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1091114" name="R-(~g ddd)" antiName="Rbar+(~g ddd)" spinType="4" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1092114" name="R0(~g udd)" antiName="Rbar0(~g udd)" spinType="4" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1092214" name="R+(~g uud)" antiName="Rbar-(~g uud)" spinType="4" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1092224" name="R++(~g uuu)" antiName="Rbar--(~g uuu)" spinType="4" chargeType="6" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1093114" name="R-(~g sdd)" antiName="Rbar+(~g sdd)" spinType="4" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1093214" name="R0(~g sud)" antiName="Rbar0(~g sud)" spinType="4" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1093224" name="R+(~g suu)" antiName="Rbar-(~g suu)" spinType="4" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1093314" name="R-(~g ssd)" antiName="Rbar+(~g ssd)" spinType="4" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1093324" name="R0(~g ssu)" antiName="Rbar0(~g ssu)" spinType="4" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1093334" name="R-(~g sss)" antiName="Rbar+(~g sss)" spinType="4" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1094114" name="R0(~g cdd)" antiName="Rbar0(~g cdd)" spinType="4" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1094214" name="R+(~g cud)" antiName="Rbar-(~g cud)" spinType="4" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1094224" name="R++(~g cuu)" antiName="Rbar--(~g cuu)" spinType="4" chargeType="6" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1094314" name="R0(~g csd)" antiName="Rbar0(~g csd)" spinType="4" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1094324" name="R+(~g csu)" antiName="Rbar-(~g csu)" spinType="4" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1094334" name="R0(~g css)" antiName="Rbar0(~g css)" spinType="4" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1095114" name="R-(~g bdd)" antiName="Rbar+(~g bdd)" spinType="4" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1095214" name="R0(~g bud)" antiName="Rbar0(~g bud)" spinType="4" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1095224" name="R+(~g buu)" antiName="Rbar-(~g buu)" spinType="4" chargeType="3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1095314" name="R-(~g bsd)" antiName="Rbar+(~g bsd)" spinType="4" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1095324" name="R0(~g bsu)" antiName="Rbar0(~g bsu)" spinType="4" chargeType="0" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="1095334" name="R-(~g bss)" antiName="Rbar+(~g bss)" spinType="4" chargeType="-3" colType="0" + m0="500.00000" tau0="1e-05"> +</particle> + +<particle id="2000001" name="~d_R" antiName="~d_Rbar" spinType="1" chargeType="-1" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 1"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 3"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2"/> + <channel onMode="1" bRatio="0.0000000" products="12 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4"/> + <channel onMode="1" bRatio="0.0000000" products="12 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6"/> + <channel onMode="1" bRatio="0.0000000" products="14 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2"/> + <channel onMode="1" bRatio="0.0000000" products="14 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4"/> + <channel onMode="1" bRatio="0.0000000" products="14 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6"/> + <channel onMode="1" bRatio="0.0000000" products="16 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2"/> + <channel onMode="1" bRatio="0.0000000" products="16 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4"/> + <channel onMode="1" bRatio="0.0000000" products="16 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -5"/> +</particle> + +<particle id="2000002" name="~u_R" antiName="~u_Rbar" spinType="1" chargeType="2" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 2"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 4"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 -5"/> +</particle> + +<particle id="2000003" name="~s_R" antiName="~s_Rbar" spinType="1" chargeType="-1" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 1"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 3"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2"/> + <channel onMode="1" bRatio="0.0000000" products="12 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4"/> + <channel onMode="1" bRatio="0.0000000" products="12 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6"/> + <channel onMode="1" bRatio="0.0000000" products="14 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2"/> + <channel onMode="1" bRatio="0.0000000" products="14 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4"/> + <channel onMode="1" bRatio="0.0000000" products="14 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6"/> + <channel onMode="1" bRatio="0.0000000" products="16 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2"/> + <channel onMode="1" bRatio="0.0000000" products="16 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4"/> + <channel onMode="1" bRatio="0.0000000" products="16 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -5"/> +</particle> + +<particle id="2000004" name="~c_R" antiName="~c_Rbar" spinType="1" chargeType="2" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 2"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 4"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 -5"/> +</particle> + +<particle id="2000005" name="~b_2" antiName="~b_2bar" spinType="1" chargeType="-1" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 1"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 3"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 2"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 6"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000006 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 5"/> + <channel onMode="1" bRatio="0.0000000" products="-12 1"/> + <channel onMode="1" bRatio="0.0000000" products="-12 3"/> + <channel onMode="1" bRatio="0.0000000" products="-12 5"/> + <channel onMode="1" bRatio="0.0000000" products="-14 1"/> + <channel onMode="1" bRatio="0.0000000" products="-14 3"/> + <channel onMode="1" bRatio="0.0000000" products="-14 5"/> + <channel onMode="1" bRatio="0.0000000" products="-16 1"/> + <channel onMode="1" bRatio="0.0000000" products="-16 3"/> + <channel onMode="1" bRatio="0.0000000" products="-16 5"/> + <channel onMode="1" bRatio="0.0000000" products="12 1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2"/> + <channel onMode="1" bRatio="0.0000000" products="12 3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4"/> + <channel onMode="1" bRatio="0.0000000" products="12 5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6"/> + <channel onMode="1" bRatio="0.0000000" products="14 1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2"/> + <channel onMode="1" bRatio="0.0000000" products="14 3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4"/> + <channel onMode="1" bRatio="0.0000000" products="14 5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6"/> + <channel onMode="1" bRatio="0.0000000" products="16 1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2"/> + <channel onMode="1" bRatio="0.0000000" products="16 3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4"/> + <channel onMode="1" bRatio="0.0000000" products="16 5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-2 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-4 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -1"/> + <channel onMode="1" bRatio="0.0000000" products="-6 -3"/> +</particle> + +<particle id="2000006" name="~t_2" antiName="~t_2bar" spinType="1" chargeType="2" colType="1" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 2"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 4"/> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000024 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 1"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 3"/> + <channel onMode="1" bRatio="0.0000000" products="1000037 5"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 6"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 23"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 25"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 35"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000002 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000004 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000006 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000002 36"/> + <channel onMode="1" bRatio="0.0000000" products="2000004 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000001 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000003 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000005 -37"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 2"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 4"/> + <channel onMode="1" bRatio="0.0000000" products="1000021 6"/> + <channel onMode="1" bRatio="0.0000000" products="-11 1"/> + <channel onMode="1" bRatio="0.0000000" products="-11 3"/> + <channel onMode="1" bRatio="0.0000000" products="-11 5"/> + <channel onMode="1" bRatio="0.0000000" products="-13 1"/> + <channel onMode="1" bRatio="0.0000000" products="-13 3"/> + <channel onMode="1" bRatio="0.0000000" products="-13 5"/> + <channel onMode="1" bRatio="0.0000000" products="-15 1"/> + <channel onMode="1" bRatio="0.0000000" products="-15 3"/> + <channel onMode="1" bRatio="0.0000000" products="-15 5"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -3"/> + <channel onMode="1" bRatio="0.0000000" products="-1 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-3 -5"/> +</particle> + +<particle id="2000011" name="~e_R-" antiName="~e_R+" spinType="1" chargeType="-3" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 11"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 12"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 12"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 11"/> + <channel onMode="1" bRatio="0.0000000" products="1000011 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000011 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000011 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000011 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000012 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000012 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000012 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000012 -37"/> + <channel onMode="1" bRatio="0.0000000" products="12 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 15"/> + <channel onMode="1" bRatio="0.0000000" products="-2 1"/> + <channel onMode="1" bRatio="0.0000000" products="-2 3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 1"/> + <channel onMode="1" bRatio="0.0000000" products="-4 3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 1"/> + <channel onMode="1" bRatio="0.0000000" products="-6 3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 5"/> +</particle> + +<particle id="2000012" name="~nu_eR" antiName="~nu_eRbar" spinType="1" chargeType="0" colType="0" + m0="500.00000"> +</particle> + +<particle id="2000013" name="~mu_R-" antiName="~mu_R+" spinType="1" chargeType="-3" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 13"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 14"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 14"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 13"/> + <channel onMode="1" bRatio="0.0000000" products="1000013 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000013 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000013 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000013 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000014 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000014 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000014 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000014 -37"/> + <channel onMode="1" bRatio="0.0000000" products="12 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 15"/> + <channel onMode="1" bRatio="0.0000000" products="-16 11"/> + <channel onMode="1" bRatio="0.0000000" products="-16 13"/> + <channel onMode="1" bRatio="0.0000000" products="-16 15"/> + <channel onMode="1" bRatio="0.0000000" products="-2 1"/> + <channel onMode="1" bRatio="0.0000000" products="-2 3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 1"/> + <channel onMode="1" bRatio="0.0000000" products="-4 3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 1"/> + <channel onMode="1" bRatio="0.0000000" products="-6 3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 5"/> +</particle> + +<particle id="2000014" name="~nu_muR" antiName="~nu_muRbar" spinType="1" chargeType="0" colType="0" + m0="500.00000"> +</particle> + +<particle id="2000015" name="~tau_2-" antiName="~tau_2+" spinType="1" chargeType="-3" colType="0" + m0="500.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" meMode="103" products="1000039 15"/> + <channel onMode="1" bRatio="0.0000000" products="-1000024 16"/> + <channel onMode="1" bRatio="0.0000000" products="-1000037 16"/> + <channel onMode="1" bRatio="0.0000000" products="1000022 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000023 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000025 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000035 15"/> + <channel onMode="1" bRatio="0.0000000" products="1000015 23"/> + <channel onMode="1" bRatio="0.0000000" products="1000015 25"/> + <channel onMode="1" bRatio="0.0000000" products="1000015 35"/> + <channel onMode="1" bRatio="0.0000000" products="1000015 36"/> + <channel onMode="1" bRatio="0.0000000" products="1000016 -24"/> + <channel onMode="1" bRatio="0.0000000" products="2000016 -24"/> + <channel onMode="1" bRatio="0.0000000" products="1000016 -37"/> + <channel onMode="1" bRatio="0.0000000" products="2000016 -37"/> + <channel onMode="1" bRatio="0.0000000" products="12 13"/> + <channel onMode="1" bRatio="0.0000000" products="12 15"/> + <channel onMode="1" bRatio="0.0000000" products="14 11"/> + <channel onMode="1" bRatio="0.0000000" products="14 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 11"/> + <channel onMode="1" bRatio="0.0000000" products="16 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 11"/> + <channel onMode="1" bRatio="0.0000000" products="-12 13"/> + <channel onMode="1" bRatio="0.0000000" products="-12 15"/> + <channel onMode="1" bRatio="0.0000000" products="-14 11"/> + <channel onMode="1" bRatio="0.0000000" products="-14 13"/> + <channel onMode="1" bRatio="0.0000000" products="-14 15"/> + <channel onMode="1" bRatio="0.0000000" products="-2 1"/> + <channel onMode="1" bRatio="0.0000000" products="-2 3"/> + <channel onMode="1" bRatio="0.0000000" products="-2 5"/> + <channel onMode="1" bRatio="0.0000000" products="-4 1"/> + <channel onMode="1" bRatio="0.0000000" products="-4 3"/> + <channel onMode="1" bRatio="0.0000000" products="-4 5"/> + <channel onMode="1" bRatio="0.0000000" products="-6 1"/> + <channel onMode="1" bRatio="0.0000000" products="-6 3"/> + <channel onMode="1" bRatio="0.0000000" products="-6 5"/> +</particle> + +<particle id="2000016" name="~nu_tauR" antiName="~nu_tauRbar" spinType="1" chargeType="0" colType="0" + m0="500.00000"> +</particle> + +<particle id="3000111" name="pi_tc0" spinType="1" chargeType="0" colType="0" + m0="110.00000" mWidth="0.02911" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0174310" products="3 -3"/> + <channel onMode="1" bRatio="0.0540480" products="4 -4"/> + <channel onMode="1" bRatio="0.8576940" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="11 -11"/> + <channel onMode="1" bRatio="0.0002500" products="13 -13"/> + <channel onMode="1" bRatio="0.0705780" products="15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="21 21"/> +</particle> + +<particle id="3000113" name="rho_tc0" spinType="3" chargeType="0" colType="0" + m0="210.00000" mWidth="0.86860" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.1440510" products="24 -24"/> + <channel onMode="1" bRatio="0.3519020" products="24 -3000211"/> + <channel onMode="1" bRatio="0.3519020" products="3000211 -24"/> + <channel onMode="1" bRatio="0.0000000" products="3000211 -3000211"/> + <channel onMode="1" bRatio="0.0821070" products="22 3000111"/> + <channel onMode="1" bRatio="0.0295660" products="22 3000221"/> + <channel onMode="1" bRatio="0.0015110" products="23 3000111"/> + <channel onMode="1" bRatio="0.0007260" products="23 3000221"/> + <channel onMode="1" bRatio="0.0045180" products="1 -1"/> + <channel onMode="1" bRatio="0.0065220" products="2 -2"/> + <channel onMode="1" bRatio="0.0045180" products="3 -3"/> + <channel onMode="1" bRatio="0.0065220" products="4 -4"/> + <channel onMode="1" bRatio="0.0045130" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> + <channel onMode="1" bRatio="0.0029080" products="11 -11"/> + <channel onMode="1" bRatio="0.0009730" products="12 -12"/> + <channel onMode="1" bRatio="0.0029080" products="13 -13"/> + <channel onMode="1" bRatio="0.0009730" products="14 -14"/> + <channel onMode="1" bRatio="0.0029080" products="15 -15"/> + <channel onMode="1" bRatio="0.0009730" products="16 -16"/> +</particle> + +<particle id="3000211" name="pi_tc+" antiName="pi_tc-" spinType="1" chargeType="3" colType="0" + m0="110.00000" mWidth="0.01741" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0227480" products="4 -1"/> + <channel onMode="1" bRatio="0.0265760" products="4 -3"/> + <channel onMode="1" bRatio="0.3594860" products="2 -5"/> + <channel onMode="1" bRatio="0.5615810" products="4 -5"/> + <channel onMode="1" bRatio="0.0000000" products="24 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="-11 12"/> + <channel onMode="1" bRatio="0.0001040" products="-13 14"/> + <channel onMode="1" bRatio="0.0295040" products="-15 16"/> +</particle> + +<particle id="3000213" name="rho_tc+" antiName="rho_tc-" spinType="3" chargeType="3" colType="0" + m0="210.00000" mWidth="0.62395" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.1439820" products="24 23"/> + <channel onMode="1" bRatio="0.4898880" products="24 3000111"/> + <channel onMode="1" bRatio="0.1951000" products="3000211 23"/> + <channel onMode="1" bRatio="0.0000000" products="3000211 3000111"/> + <channel onMode="1" bRatio="0.1143020" products="3000211 22"/> + <channel onMode="1" bRatio="0.0084260" products="24 3000221"/> + <channel onMode="1" bRatio="0.0148680" products="-1 2"/> + <channel onMode="1" bRatio="0.0007630" products="-1 4"/> + <channel onMode="1" bRatio="0.0000000" products="-1 6"/> + <channel onMode="1" bRatio="0.0007630" products="-3 2"/> + <channel onMode="1" bRatio="0.0148400" products="-3 4"/> + <channel onMode="1" bRatio="0.0000030" products="-3 6"/> + <channel onMode="1" bRatio="0.0000000" products="-5 2"/> + <channel onMode="1" bRatio="0.0000270" products="-5 4"/> + <channel onMode="1" bRatio="0.0019450" products="-5 6"/> + <channel onMode="1" bRatio="0.0050300" products="-11 12"/> + <channel onMode="1" bRatio="0.0050300" products="-13 14"/> + <channel onMode="1" bRatio="0.0050300" products="-15 16"/> +</particle> + +<particle id="3000221" name="pi'_tc0" spinType="1" chargeType="0" colType="0" + m0="110.00000" mWidth="0.04536" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0111850" products="3 -3"/> + <channel onMode="1" bRatio="0.0346810" products="4 -4"/> + <channel onMode="1" bRatio="0.5503540" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="11 -11"/> + <channel onMode="1" bRatio="0.0001600" products="13 -13"/> + <channel onMode="1" bRatio="0.0452870" products="15 -15"/> + <channel onMode="1" bRatio="0.3583330" products="21 21"/> +</particle> + +<particle id="3000223" name="omega_tc" spinType="3" chargeType="0" colType="0" + m0="210.00000" mWidth="0.19192" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.1337760" products="22 3000111"/> + <channel onMode="1" bRatio="0.0032840" products="23 3000111"/> + <channel onMode="1" bRatio="0.3716900" products="22 3000221"/> + <channel onMode="1" bRatio="0.0068380" products="23 3000221"/> + <channel onMode="1" bRatio="0.0309540" products="24 -3000211"/> + <channel onMode="1" bRatio="0.0309540" products="3000211 -24"/> + <channel onMode="1" bRatio="0.0016300" products="24 -24"/> + <channel onMode="1" bRatio="0.0000000" products="3000211 -3000211"/> + <channel onMode="1" bRatio="0.0472240" products="1 -1"/> + <channel onMode="1" bRatio="0.0737370" products="2 -2"/> + <channel onMode="1" bRatio="0.0472240" products="3 -3"/> + <channel onMode="1" bRatio="0.0737320" products="4 -4"/> + <channel onMode="1" bRatio="0.0471790" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> + <channel onMode="1" bRatio="0.0347610" products="11 -11"/> + <channel onMode="1" bRatio="0.0091660" products="12 -12"/> + <channel onMode="1" bRatio="0.0347610" products="13 -13"/> + <channel onMode="1" bRatio="0.0091660" products="14 -14"/> + <channel onMode="1" bRatio="0.0347590" products="15 -15"/> + <channel onMode="1" bRatio="0.0091660" products="16 -16"/> +</particle> + +<particle id="3000331" name="eta_tc0" spinType="1" chargeType="0" colType="2" + m0="350.00000" mWidth="0.09511" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.4457810" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> + <channel onMode="1" bRatio="0.5542190" products="21 21"/> +</particle> + +<particle id="3100021" name="V8_tc" spinType="1" chargeType="0" colType="2" + m0="500.00000" mWidth="123.27638" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0090690" products="1 -1"/> + <channel onMode="1" bRatio="0.0090690" products="2 -2"/> + <channel onMode="1" bRatio="0.0090690" products="3 -3"/> + <channel onMode="1" bRatio="0.0090690" products="4 -4"/> + <channel onMode="1" bRatio="0.5101470" products="5 -5"/> + <channel onMode="1" bRatio="0.4535760" products="6 -6"/> +</particle> + +<particle id="3100111" name="pi_22_1_tc" spinType="1" chargeType="0" colType="0" + m0="125.00000" mWidth="0.02296" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" products="1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> + <channel onMode="1" bRatio="1.0000000" products="21 21"/> +</particle> + +<particle id="3100113" name="rho_11_tc" spinType="3" chargeType="0" colType="2" + m0="400.00000" mWidth="23.26819" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0011280" products="1 -1"/> + <channel onMode="1" bRatio="0.0011280" products="2 -2"/> + <channel onMode="1" bRatio="0.0011280" products="3 -3"/> + <channel onMode="1" bRatio="0.0011280" products="4 -4"/> + <channel onMode="1" bRatio="0.5710470" products="5 -5"/> + <channel onMode="1" bRatio="0.3822880" products="6 -6"/> + <channel onMode="1" bRatio="0.0421530" products="21 21"/> +</particle> + +<particle id="3200111" name="pi_22_8_tc" spinType="1" chargeType="0" colType="2" + m0="250.00000" mWidth="0.18886" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0000000" products="1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> + <channel onMode="1" bRatio="1.0000000" products="21 21"/> +</particle> + +<particle id="3200113" name="rho_12_tc" spinType="3" chargeType="0" colType="2" + m0="350.00000" mWidth="2.86306" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0165970" products="1 -1"/> + <channel onMode="1" bRatio="0.0165970" products="2 -2"/> + <channel onMode="1" bRatio="0.0165970" products="3 -3"/> + <channel onMode="1" bRatio="0.0165970" products="4 -4"/> + <channel onMode="1" bRatio="0.9336100" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> +</particle> + +<particle id="3300113" name="rho_21_tc" spinType="3" chargeType="0" colType="2" + m0="350.00000"> + <channel onMode="1" bRatio="0.0165970" products="1 -1"/> + <channel onMode="1" bRatio="0.0165970" products="2 -2"/> + <channel onMode="1" bRatio="0.0165970" products="3 -3"/> + <channel onMode="1" bRatio="0.0165970" products="4 -4"/> + <channel onMode="1" bRatio="0.9336100" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> +</particle> + +<particle id="3400113" name="rho_22_tc" spinType="3" chargeType="0" colType="2" + m0="300.00000" mWidth="3.45903" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0551500" products="1 -1"/> + <channel onMode="1" bRatio="0.0551500" products="2 -2"/> + <channel onMode="1" bRatio="0.0551500" products="3 -3"/> + <channel onMode="1" bRatio="0.0551500" products="4 -4"/> + <channel onMode="1" bRatio="0.3446900" products="5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="6 -6"/> + <channel onMode="1" bRatio="0.2289980" products="21 21"/> + <channel onMode="1" bRatio="0.1642080" products="3100111 21"/> + <channel onMode="1" bRatio="0.0415030" products="3200111 21"/> +</particle> + +<particle id="4000001" name="d*" antiName="d*bar" spinType="2" chargeType="-1" colType="1" + m0="400.00000" mWidth="2.59359" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.8509730" products="21 1"/> + <channel onMode="1" bRatio="0.0054110" products="22 1"/> + <channel onMode="1" bRatio="0.0450250" products="23 1"/> + <channel onMode="1" bRatio="0.0985910" products="-24 2"/> +</particle> + +<particle id="4000002" name="u*" antiName="u*bar" spinType="2" chargeType="2" colType="1" + m0="400.00000" mWidth="2.59687" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.8498980" products="21 2"/> + <channel onMode="1" bRatio="0.0216170" products="22 2"/> + <channel onMode="1" bRatio="0.0300180" products="23 2"/> + <channel onMode="1" bRatio="0.0984660" products="24 1"/> +</particle> + +<particle id="4000003" name="s*" antiName="s*bar" spinType="2" chargeType="-1" colType="1" + m0="400.00000" mWidth="2.59359" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.8509730" products="21 3"/> + <channel onMode="1" bRatio="0.0054110" products="22 3"/> + <channel onMode="1" bRatio="0.0450250" products="23 3"/> + <channel onMode="1" bRatio="0.0985910" products="-24 4"/> +</particle> + +<particle id="4000004" name="c*" antiName="c*bar" spinType="2" chargeType="2" colType="1" + m0="400.00000" mWidth="2.59687" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.8498980" products="21 4"/> + <channel onMode="1" bRatio="0.0216170" products="22 4"/> + <channel onMode="1" bRatio="0.0300180" products="23 4"/> + <channel onMode="1" bRatio="0.0984660" products="24 3"/> +</particle> + +<particle id="4000005" name="b*" antiName="b*bar" spinType="2" chargeType="-1" colType="1" + m0="400.00000" mWidth="2.59359" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.8509730" products="21 5"/> + <channel onMode="1" bRatio="0.0054110" products="22 5"/> + <channel onMode="1" bRatio="0.0450250" products="23 5"/> + <channel onMode="1" bRatio="0.0985910" products="-24 6"/> +</particle> + +<particle id="4000006" name="t*" antiName="t*bar" spinType="2" chargeType="2" colType="1" + m0="400.00000" mWidth="2.59687" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.8498980" products="21 6"/> + <channel onMode="1" bRatio="0.0216170" products="22 6"/> + <channel onMode="1" bRatio="0.0300180" products="23 6"/> + <channel onMode="1" bRatio="0.0984660" products="24 5"/> +</particle> + +<particle id="4000011" name="e*-" antiName="e*bar+" spinType="2" chargeType="-3" colType="0" + m0="400.00000" mWidth="0.42896" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.2944480" products="22 11"/> + <channel onMode="1" bRatio="0.1094500" products="23 11"/> + <channel onMode="1" bRatio="0.5961020" products="-24 12"/> + <channel onMode="1" bRatio="0.0000000" products="11 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="11 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="11 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="11 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="11 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="11 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="11 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="11 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="11 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="11 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="11 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="11 16 -16"/> +</particle> + +<particle id="4000012" name="nu*_e0" antiName="nu*_ebar0" spinType="2" chargeType="0" colType="0" + m0="400.00000" mWidth="0.41912" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.3899060" products="23 12"/> + <channel onMode="1" bRatio="0.6100940" products="24 11"/> + <channel onMode="1" bRatio="0.0000000" products="12 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="12 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="12 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="12 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="12 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="12 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="12 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="12 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="12 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="12 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="12 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="12 16 -16"/> +</particle> + +<particle id="4000013" name="mu*-" antiName="mu*bar+" spinType="2" chargeType="-3" colType="0" + m0="400.00000" mWidth="0.42896" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.2944480" products="22 13"/> + <channel onMode="1" bRatio="0.1094500" products="23 13"/> + <channel onMode="1" bRatio="0.5961020" products="-24 14"/> + <channel onMode="1" bRatio="0.0000000" products="13 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="13 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="13 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="13 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="13 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="13 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="13 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="13 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="13 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="13 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="13 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="13 16 -16"/> +</particle> + +<particle id="4000014" name="nu*_mu0" antiName="nu*_mubar0" spinType="2" chargeType="0" colType="0" + m0="400.00000" mWidth="0.41912" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.3899060" products="23 14"/> + <channel onMode="1" bRatio="0.6100940" products="24 13"/> + <channel onMode="1" bRatio="0.0000000" products="14 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="14 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="14 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="14 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="14 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="14 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="14 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="14 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="14 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="14 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="14 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="14 16 -16"/> +</particle> + +<particle id="4000015" name="tau*-" antiName="tau*bar+" spinType="2" chargeType="-3" colType="0" + m0="400.00000" mWidth="0.42896" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.2944480" products="22 15"/> + <channel onMode="1" bRatio="0.1094500" products="23 15"/> + <channel onMode="1" bRatio="0.5961020" products="-24 16"/> + <channel onMode="1" bRatio="0.0000000" products="15 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="15 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="15 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="15 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="15 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="15 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="15 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="15 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="15 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="15 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="15 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="15 16 -16"/> +</particle> + +<particle id="4000016" name="nu*_tau0" antiName="nu*_taubar0" spinType="2" chargeType="0" colType="0" + m0="400.00000" mWidth="0.41912" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.3899060" products="23 16"/> + <channel onMode="1" bRatio="0.6100940" products="24 15"/> + <channel onMode="1" bRatio="0.0000000" products="16 1 -1"/> + <channel onMode="1" bRatio="0.0000000" products="16 2 -2"/> + <channel onMode="1" bRatio="0.0000000" products="16 3 -3"/> + <channel onMode="1" bRatio="0.0000000" products="16 4 -4"/> + <channel onMode="1" bRatio="0.0000000" products="16 5 -5"/> + <channel onMode="1" bRatio="0.0000000" products="16 6 -6"/> + <channel onMode="1" bRatio="0.0000000" products="16 11 -11"/> + <channel onMode="1" bRatio="0.0000000" products="16 12 -12"/> + <channel onMode="1" bRatio="0.0000000" products="16 13 -13"/> + <channel onMode="1" bRatio="0.0000000" products="16 14 -14"/> + <channel onMode="1" bRatio="0.0000000" products="16 15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="16 16 -16"/> +</particle> + +<particle id="4900001" name="Dv" antiName="Dvbar" spinType="2" chargeType="-1" colType="1" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="1 4900101"/> +</particle> + +<particle id="4900002" name="Uv" antiName="Uvbar" spinType="2" chargeType="2" colType="1" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="2 4900101"/> +</particle> + +<particle id="4900003" name="Sv" antiName="Svbar" spinType="2" chargeType="-1" colType="1" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="3 4900101"/> +</particle> + +<particle id="4900004" name="Cv" antiName="Cvbar" spinType="2" chargeType="2" colType="1" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="4 4900101"/> +</particle> + +<particle id="4900005" name="Bv" antiName="Bvbar" spinType="2" chargeType="-1" colType="1" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="5 4900101"/> +</particle> + +<particle id="4900006" name="Tv" antiName="Tvbar" spinType="2" chargeType="2" colType="1" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="6 4900101"/> +</particle> + +<particle id="4900011" name="Ev" antiName="Evbar" spinType="2" chargeType="-3" colType="0" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="11 4900101"/> +</particle> + +<particle id="4900012" name="nuEv" antiName="nuEvbar" spinType="2" chargeType="0" colType="0" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="12 4900101"/> +</particle> + +<particle id="4900013" name="MUv" antiName="MUvbar" spinType="2" chargeType="-3" colType="0" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="13 4900101"/> +</particle> + +<particle id="4900014" name="nuMUv" antiName="nuMUvbar" spinType="2" chargeType="0" colType="0" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="14 4900101"/> +</particle> + +<particle id="4900015" name="TAUv" antiName="TAUvbar" spinType="2" chargeType="-3" colType="0" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="15 4900101"/> +</particle> + +<particle id="4900016" name="nuTAUv" antiName="nuTAUvbar" spinType="2" chargeType="0" colType="0" + m0="400.00000" mWidth="1.00000" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="1.0000000" meMode="103" products="16 4900101"/> +</particle> + +<particle id="4900021" name="gv" spinType="3" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="4900022" name="gammav" spinType="3" chargeType="0" colType="0" + m0="0.00000"> + <channel onMode="0" bRatio="0.05" meMode="91" products="1 -1"/> + <channel onMode="0" bRatio="0.20" meMode="91" products="2 -2"/> + <channel onMode="0" bRatio="0.05" meMode="91" products="3 -3"/> + <channel onMode="0" bRatio="0.20" meMode="91" products="4 -4"/> + <channel onMode="0" bRatio="0.05" meMode="91" products="5 -5"/> + <channel onMode="0" bRatio="0.15" meMode="91" products="11 -11"/> + <channel onMode="0" bRatio="0.00" meMode="91" products="12 -12"/> + <channel onMode="0" bRatio="0.15" meMode="91" products="13 -13"/> + <channel onMode="0" bRatio="0.00" meMode="91" products="14 -14"/> + <channel onMode="0" bRatio="0.15" meMode="91" products="15 -15"/> + <channel onMode="0" bRatio="0.00" meMode="91" products="16 -16"/> +</particle> + +<particle id="4900023" name="Zv" spinType="3" chargeType="0" colType="0" + m0="1000.00000" mWidth="20.00000" mMin="100.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.075" meMode="102" products="1 -1"/> + <channel onMode="1" bRatio="0.075" meMode="102" products="2 -2"/> + <channel onMode="1" bRatio="0.075" meMode="102" products="3 -3"/> + <channel onMode="1" bRatio="0.075" meMode="102" products="4 -4"/> + <channel onMode="1" bRatio="0.075" meMode="102" products="5 -5"/> + <channel onMode="1" bRatio="0.075" meMode="102" products="6 -6"/> + <channel onMode="1" bRatio="0.025" meMode="102" products="11 -11"/> + <channel onMode="1" bRatio="0.025" meMode="102" products="12 -12"/> + <channel onMode="1" bRatio="0.025" meMode="102" products="13 -13"/> + <channel onMode="1" bRatio="0.025" meMode="102" products="14 -14"/> + <channel onMode="1" bRatio="0.025" meMode="102" products="15 -15"/> + <channel onMode="1" bRatio="0.025" meMode="102" products="16 -16"/> + <channel onMode="1" bRatio="0.400" meMode="102" products="4900101 -4900101"/> +</particle> + +<particle id="4900101" name="qv" antiName="qvbar" spinType="1" chargeType="0" colType="0" + m0="100.00000"> +</particle> + +<particle id="4900111" name="pivDiag" spinType="1" chargeType="0" colType="0" + m0="10.00000"> + <channel onMode="0" bRatio="1.23e-6" meMode="91" products="1 -1"/> + <channel onMode="0" bRatio="4.96e-7" meMode="91" products="2 -2"/> + <channel onMode="0" bRatio="0.000492" meMode="91" products="3 -3"/> + <channel onMode="0" bRatio="0.079384" meMode="91" products="4 -4"/> + <channel onMode="0" bRatio="0.8679713" meMode="91" products="5 -5"/> + <channel onMode="0" bRatio="4.0e-9" meMode="91" products="11 -11"/> + <channel onMode="0" bRatio="0.00" meMode="91" products="12 -12"/> + <channel onMode="0" bRatio="0.000184" meMode="91" products="13 -13"/> + <channel onMode="0" bRatio="0.00" meMode="91" products="14 -14"/> + <channel onMode="0" bRatio="0.051967" meMode="91" products="15 -15"/> + <channel onMode="0" bRatio="0.00" meMode="91" products="16 -16"/> +</particle> + +<particle id="4900113" name="rhovDiag" spinType="3" chargeType="0" colType="0" + m0="10.00000"> + <channel onMode="0" bRatio="0.05" meMode="91" products="1 -1"/> + <channel onMode="0" bRatio="0.20" meMode="91" products="2 -2"/> + <channel onMode="0" bRatio="0.05" meMode="91" products="3 -3"/> + <channel onMode="0" bRatio="0.20" meMode="91" products="4 -4"/> + <channel onMode="0" bRatio="0.05" meMode="91" products="5 -5"/> + <channel onMode="0" bRatio="0.15" meMode="91" products="11 -11"/> + <channel onMode="0" bRatio="0.00" meMode="91" products="12 -12"/> + <channel onMode="0" bRatio="0.15" meMode="91" products="13 -13"/> + <channel onMode="0" bRatio="0.00" meMode="91" products="14 -14"/> + <channel onMode="0" bRatio="0.15" meMode="91" products="15 -15"/> + <channel onMode="0" bRatio="0.00" meMode="91" products="16 -16"/> +</particle> + +<particle id="4900211" name="pivUp" antiName="pivDn" spinType="1" chargeType="0" colType="0" + m0="10.00000"> +</particle> + +<particle id="4900213" name="rhovUp" antiName="rhovDn" spinType="3" chargeType="0" colType="0" + m0="10.00000"> +</particle> + +<particle id="4900991" name="ggv" spinType="1" chargeType="0" colType="0" + m0="1.00000"> +</particle> + +<particle id="5000023" name="Z_KK" spinType="3" chargeType="0" colType="0" + m0="4000.00000" mWidth="240.00000" mMin="1000.00000" mMax="0.00000"> +</particle> + +<particle id="5000039" name="Graviton" spinType="5" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="5100021" name="KKgluon*" spinType="3" chargeType="0" colType="2" + m0="1.000e+03" mWidth="1.7e02" mMin="5.000e+01" mMax="0.000e+00"> + <channel onMode="1" bRatio="0.005" products="1 -1"/> + <channel onMode="1" bRatio="0.005" products="2 -2"/> + <channel onMode="1" bRatio="0.005" products="3 -3"/> + <channel onMode="1" bRatio="0.005" products="4 -4"/> + <channel onMode="1" bRatio="0.055" products="5 -5"/> + <channel onMode="1" bRatio="0.925" products="6 -6"/> +</particle> + +<particle id="5100039" name="Graviton*" spinType="5" chargeType="0" colType="0" + m0="1.000e+03" mWidth="1.415e-01" mMin="5.000e+01" mMax="0.000e+00"> + <channel onMode="1" bRatio="0.0633000" products="1 -1"/> + <channel onMode="1" bRatio="0.0633000" products="2 -2"/> + <channel onMode="1" bRatio="0.0633000" products="3 -3"/> + <channel onMode="1" bRatio="0.0632990" products="4 -4"/> + <channel onMode="1" bRatio="0.0632950" products="5 -5"/> + <channel onMode="1" bRatio="0.0562810" products="6 -6"/> + <channel onMode="1" bRatio="0.0204950" products="11 -11"/> + <channel onMode="1" bRatio="0.0204950" products="12 -12"/> + <channel onMode="1" bRatio="0.0204950" products="13 -13"/> + <channel onMode="1" bRatio="0.0204950" products="14 -14"/> + <channel onMode="1" bRatio="0.0204950" products="15 -15"/> + <channel onMode="1" bRatio="0.0204950" products="16 -16"/> + <channel onMode="1" bRatio="0.3279190" products="21 21"/> + <channel onMode="1" bRatio="0.0409900" products="22 22"/> + <channel onMode="1" bRatio="0.0452360" products="23 23"/> + <channel onMode="1" bRatio="0.0901120" products="24 -24"/> + <channel onMode="1" bRatio="0.0" products="25 25"/> +</particle> + +<particle id="9000111" name="a_0(980)0" spinType="1" chargeType="0" colType="0" + m0="0.98350" mWidth="0.06000" mMin="0.70000" mMax="1.50000"> + <channel onMode="1" bRatio="0.9000000" products="221 111"/> + <channel onMode="1" bRatio="0.0250000" products="130 130"/> + <channel onMode="1" bRatio="0.0250000" products="310 310"/> + <channel onMode="1" bRatio="0.0500000" products="321 -321"/> +</particle> + +<particle id="9000211" name="a_0(980)+" antiName="a_0(980)-" spinType="1" chargeType="3" colType="0" + m0="0.98350" mWidth="0.06000" mMin="0.70000" mMax="1.50000"> + <channel onMode="1" bRatio="0.9000000" products="221 211"/> + <channel onMode="1" bRatio="0.1000000" products="321 311"/> +</particle> + +<particle id="9010221" name="f_0(980)" spinType="1" chargeType="0" colType="0" + m0="1.00000" tau0="4e-12"> + <channel onMode="1" bRatio="0.5200000" products="211 -211"/> + <channel onMode="1" bRatio="0.2600000" products="111 111"/> + <channel onMode="1" bRatio="0.1100000" products="321 -321"/> + <channel onMode="1" bRatio="0.0550000" products="130 130"/> + <channel onMode="1" bRatio="0.0550000" products="310 310"/> +</particle> + +<particle id="9900012" name="nu_Re" spinType="2" chargeType="0" colType="0" + m0="500.00000" mWidth="0.00098" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.1987400" products="11 -1 2"/> + <channel onMode="1" bRatio="0.0102040" products="11 -1 4"/> + <channel onMode="1" bRatio="0.0000030" products="11 -1 6"/> + <channel onMode="1" bRatio="0.0102050" products="11 -3 2"/> + <channel onMode="1" bRatio="0.1983560" products="11 -3 4"/> + <channel onMode="1" bRatio="0.0001510" products="11 -3 6"/> + <channel onMode="1" bRatio="0.0000060" products="11 -5 2"/> + <channel onMode="1" bRatio="0.0003670" products="11 -5 4"/> + <channel onMode="1" bRatio="0.0819670" products="11 -5 6"/> + <channel onMode="1" bRatio="0.1987400" products="-11 1 -2"/> + <channel onMode="1" bRatio="0.0102040" products="-11 1 -4"/> + <channel onMode="1" bRatio="0.0000030" products="-11 1 -6"/> + <channel onMode="1" bRatio="0.0102050" products="-11 3 -2"/> + <channel onMode="1" bRatio="0.1983560" products="-11 3 -4"/> + <channel onMode="1" bRatio="0.0001510" products="-11 3 -6"/> + <channel onMode="1" bRatio="0.0000060" products="-11 5 -2"/> + <channel onMode="1" bRatio="0.0003670" products="-11 5 -4"/> + <channel onMode="1" bRatio="0.0819670" products="-11 5 -6"/> + <channel onMode="1" bRatio="0.0000000" products="11 -13 9900014"/> + <channel onMode="1" bRatio="0.0000000" products="-11 13 9900014"/> + <channel onMode="1" bRatio="0.0000000" products="11 -15 9900016"/> + <channel onMode="1" bRatio="0.0000000" products="-11 15 9900016"/> +</particle> + +<particle id="9900014" name="nu_Rmu" spinType="2" chargeType="0" colType="0" + m0="500.00000" mWidth="0.00098" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.1987760" products="13 -1 2"/> + <channel onMode="1" bRatio="0.0102060" products="13 -1 4"/> + <channel onMode="1" bRatio="0.0000030" products="13 -1 6"/> + <channel onMode="1" bRatio="0.0102070" products="13 -3 2"/> + <channel onMode="1" bRatio="0.1983900" products="13 -3 4"/> + <channel onMode="1" bRatio="0.0001510" products="13 -3 6"/> + <channel onMode="1" bRatio="0.0000060" products="13 -5 2"/> + <channel onMode="1" bRatio="0.0003670" products="13 -5 4"/> + <channel onMode="1" bRatio="0.0818930" products="13 -5 6"/> + <channel onMode="1" bRatio="0.1987760" products="-13 1 -2"/> + <channel onMode="1" bRatio="0.0102060" products="-13 1 -4"/> + <channel onMode="1" bRatio="0.0000030" products="-13 1 -6"/> + <channel onMode="1" bRatio="0.0102070" products="-13 3 -2"/> + <channel onMode="1" bRatio="0.1983900" products="-13 3 -4"/> + <channel onMode="1" bRatio="0.0001510" products="-13 3 -6"/> + <channel onMode="1" bRatio="0.0000060" products="-13 5 -2"/> + <channel onMode="1" bRatio="0.0003670" products="-13 5 -4"/> + <channel onMode="1" bRatio="0.0818930" products="-13 5 -6"/> + <channel onMode="1" bRatio="0.0000000" products="13 -11 9900012"/> + <channel onMode="1" bRatio="0.0000000" products="-13 11 9900012"/> + <channel onMode="1" bRatio="0.0000000" products="13 -15 9900016"/> + <channel onMode="1" bRatio="0.0000000" products="-13 15 9900016"/> +</particle> + +<particle id="9900016" name="nu_Rtau" spinType="2" chargeType="0" colType="0" + m0="500.00000" mWidth="0.00097" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.1993440" products="15 -1 2"/> + <channel onMode="1" bRatio="0.0102340" products="15 -1 4"/> + <channel onMode="1" bRatio="0.0000030" products="15 -1 6"/> + <channel onMode="1" bRatio="0.0102360" products="15 -3 2"/> + <channel onMode="1" bRatio="0.1989280" products="15 -3 4"/> + <channel onMode="1" bRatio="0.0001490" products="15 -3 6"/> + <channel onMode="1" bRatio="0.0000060" products="15 -5 2"/> + <channel onMode="1" bRatio="0.0003680" products="15 -5 4"/> + <channel onMode="1" bRatio="0.0807330" products="15 -5 6"/> + <channel onMode="1" bRatio="0.1993440" products="-15 1 -2"/> + <channel onMode="1" bRatio="0.0102340" products="-15 1 -4"/> + <channel onMode="1" bRatio="0.0000030" products="-15 1 -6"/> + <channel onMode="1" bRatio="0.0102360" products="-15 3 -2"/> + <channel onMode="1" bRatio="0.1989280" products="-15 3 -4"/> + <channel onMode="1" bRatio="0.0001490" products="-15 3 -6"/> + <channel onMode="1" bRatio="0.0000060" products="-15 5 -2"/> + <channel onMode="1" bRatio="0.0003680" products="-15 5 -4"/> + <channel onMode="1" bRatio="0.0807330" products="-15 5 -6"/> + <channel onMode="1" bRatio="0.0000000" products="15 -11 9900012"/> + <channel onMode="1" bRatio="0.0000000" products="-15 11 9900012"/> + <channel onMode="1" bRatio="0.0000000" products="15 -13 9900014"/> + <channel onMode="1" bRatio="0.0000000" products="-15 13 9900014"/> +</particle> + +<particle id="9900020" name="gam_diff0" spinType="3" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="9900023" name="Z_R0" spinType="3" chargeType="0" colType="0" + m0="1.200e+03" mWidth="2.672e+01" mMin="5.000e+01" mMax="0.000e+00"> + <channel onMode="1" bRatio="0.1847380" products="1 -1"/> + <channel onMode="1" bRatio="0.1045880" products="2 -2"/> + <channel onMode="1" bRatio="0.1847380" products="3 -3"/> + <channel onMode="1" bRatio="0.1045870" products="4 -4"/> + <channel onMode="1" bRatio="0.1847310" products="5 -5"/> + <channel onMode="1" bRatio="0.0958200" products="6 -6"/> + <channel onMode="1" bRatio="0.0229020" products="11 -11"/> + <channel onMode="1" bRatio="0.0084290" products="12 -12"/> + <channel onMode="1" bRatio="0.0156020" products="9900012 9900012"/> + <channel onMode="1" bRatio="0.0229020" products="13 -13"/> + <channel onMode="1" bRatio="0.0084290" products="14 -14"/> + <channel onMode="1" bRatio="0.0156020" products="9900014 9900014"/> + <channel onMode="1" bRatio="0.0229020" products="15 -15"/> + <channel onMode="1" bRatio="0.0084290" products="16 -16"/> + <channel onMode="1" bRatio="0.0156020" products="9900016 9900016"/> +</particle> + +<particle id="9900024" name="W_R+" antiName="W_R-" spinType="3" chargeType="3" colType="0" + m0="750.00000" mWidth="21.74916" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.2895900" products="-1 2"/> + <channel onMode="1" bRatio="0.0148700" products="-1 4"/> + <channel onMode="1" bRatio="0.0000080" products="-1 6"/> + <channel onMode="1" bRatio="0.0148700" products="-3 2"/> + <channel onMode="1" bRatio="0.2890610" products="-3 4"/> + <channel onMode="1" bRatio="0.0004920" products="-3 6"/> + <channel onMode="1" bRatio="0.0000090" products="-5 2"/> + <channel onMode="1" bRatio="0.0005360" products="-5 4"/> + <channel onMode="1" bRatio="0.2791100" products="-5 6"/> + <channel onMode="1" bRatio="0.0371510" products="-11 9900012"/> + <channel onMode="1" bRatio="0.0371510" products="-13 9900014"/> + <channel onMode="1" bRatio="0.0371500" products="-15 9900016"/> +</particle> + +<particle id="9900041" name="H_L++" antiName="H_L--" spinType="1" chargeType="6" colType="0" + m0="200.00000" mWidth="0.88159" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0902660" products="-11 -11"/> + <channel onMode="1" bRatio="0.0018050" products="-11 -13"/> + <channel onMode="1" bRatio="0.0018050" products="-11 -15"/> + <channel onMode="1" bRatio="0.0902660" products="-13 -13"/> + <channel onMode="1" bRatio="0.0018050" products="-13 -15"/> + <channel onMode="1" bRatio="0.8122630" products="-15 -15"/> + <channel onMode="1" bRatio="0.0017900" products="24 24"/> +</particle> + +<particle id="9900042" name="H_R++" antiName="H_R--" spinType="1" chargeType="6" colType="0" + m0="200.00000" mWidth="0.88001" mMin="50.00000" mMax="0.00000"> + <channel onMode="1" bRatio="0.0904280" products="-11 -11"/> + <channel onMode="1" bRatio="0.0018090" products="-11 -13"/> + <channel onMode="1" bRatio="0.0018080" products="-11 -15"/> + <channel onMode="1" bRatio="0.0904280" products="-13 -13"/> + <channel onMode="1" bRatio="0.0018080" products="-13 -15"/> + <channel onMode="1" bRatio="0.8137200" products="-15 -15"/> + <channel onMode="1" bRatio="0.0000000" products="9900024 9900024"/> +</particle> + +<particle id="9900110" name="rho_diff0" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="9900210" name="pi_diffr+" antiName="pi_diffr-" spinType="0" chargeType="3" colType="0" + m0="0.00000"> +</particle> + +<particle id="9900220" name="omega_di" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="9900330" name="phi_diff" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="9900440" name="J/psi_di" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="9902110" name="n_diffr0" antiName="n_diffrbar0" spinType="0" chargeType="0" colType="0" + m0="0.00000"> +</particle> + +<particle id="9902210" name="p_diffr+" antiName="p_diffrbar-" spinType="0" chargeType="3" colType="0" + m0="0.00000"> +</particle> + +<particle id="9940003" name="J/psi[3S1(8)]" spinType="3" chargeType="0" colType="2" + m0="3.29692" mWidth="0.0" mMin="3.29692" mMax="3.29692"> + <channel onMode="1" bRatio="1.0000000" products="443 21"/> +</particle> + +<particle id="9940005" name="chi_2c[3S1(8)]" spinType="3" chargeType="0" colType="2" + m0="3.7562" mWidth="0.0" mMin="3.7562" mMax="3.7562"> + <channel onMode="1" bRatio="1.0000000" products="445 21"/> +</particle> + +<particle id="9940011" name="chi_0c[3S1(8)]" spinType="3" chargeType="0" colType="2" + m0="3.61475" mWidth="0.0" mMin="3.61475" mMax="3.61475"> + <channel onMode="1" bRatio="1.0000000" products="10441 21"/> +</particle> + +<particle id="9940023" name="chi_1c[3S1(8)]" spinType="3" chargeType="0" colType="2" + m0="3.71066" mWidth="0.0" mMin="3.71066" mMax="3.71066"> + <channel onMode="1" bRatio="1.0000000" products="20443 21"/> +</particle> + +<particle id="9940103" name="psi(2S)[3S1(8)]" spinType="3" chargeType="0" colType="2" + m0="3.88611" mWidth="0.0" mMin="3.88611" mMax="3.88611"> + <channel onMode="1" bRatio="1.0000000" products="100443 21"/> +</particle> + +<particle id="9941003" name="J/psi[1S0(8)]" spinType="1" chargeType="0" colType="2" + m0="3.29692" mWidth="0.0" mMin="3.29692" mMax="3.29692"> + <channel onMode="1" bRatio="1.0000000" products="443 21"/> +</particle> + +<particle id="9941103" name="psi(2S)[1S0(8)]" spinType="1" chargeType="0" colType="2" + m0="3.88611" mWidth="0.0" mMin="3.88611" mMax="3.88611"> + <channel onMode="1" bRatio="1.0000000" products="100443 21"/> +</particle> + +<particle id="9942003" name="J/psi[3PJ(8)]" spinType="3" chargeType="0" colType="2" + m0="3.29692" mWidth="0.0" mMin="3.29692" mMax="3.29692"> + <channel onMode="1" bRatio="1.0000000" products="443 21"/> +</particle> + +<particle id="9942033" name="psi(3770)[3PJ(8)]" spinType="3" chargeType="0" colType="2" + m0="3.97315" mWidth="0.0" mMin="3.97315" mMax="3.97315"> + <channel onMode="1" bRatio="1.0000000" products="30443 21"/> +</particle> + +<particle id="9942103" name="psi(2S)[3PJ(8)]" spinType="3" chargeType="0" colType="2" + m0="3.88611" mWidth="0.0" mMin="3.88611" mMax="3.88611"> + <channel onMode="1" bRatio="1.0000000" products="100443 21"/> +</particle> + +<particle id="9950003" name="Upsilon[3S1(8)]" spinType="3" chargeType="0" colType="2" + m0="9.6603" mWidth="0.0" mMin="9.6603" mMax="9.6603"> + <channel onMode="1" bRatio="1.0000000" products="553 21"/> +</particle> + +<particle id="9950005" name="chi_2b[3S1(8)]" spinType="3" chargeType="0" colType="2" + m0="10.1122" mWidth="0.0" mMin="10.1122" mMax="10.1122"> + <channel onMode="1" bRatio="1.0000000" products="555 21"/> +</particle> + +<particle id="9950011" name="chi_0b[3S1(8)]" spinType="3" chargeType="0" colType="2" + m0="10.0594" mWidth="0.0" mMin="10.0594" mMax="10.0594"> + <channel onMode="1" bRatio="1.0000000" products="10551 21"/> +</particle> + +<particle id="9950023" name="chi_1b[3S1(8)]" spinType="3" chargeType="0" colType="2" + m0="10.09280" mWidth="0.0" mMin="10.09280" mMax="10.09280"> + <channel onMode="1" bRatio="1.0000000" products="20553 21"/> +</particle> + +<particle id="9950103" name="Upsilon(2S)[3S1(8)]" spinType="3" chargeType="0" colType="2" + m0="10.22326" mWidth="0.0" mMin="10.22326" mMax="10.22326"> + <channel onMode="1" bRatio="1.0000000" products="100553 21"/> +</particle> + +<particle id="9950203" name="Upsilon(3S)[3S1(8)]" spinType="3" chargeType="0" colType="2" + m0="10.5552" mWidth="0.0" mMin="10.5552" mMax="10.5552"> + <channel onMode="1" bRatio="1.0000000" products="200553 21"/> +</particle> + +<particle id="9951003" name="Upsilon[1S0(8)]" spinType="1" chargeType="0" colType="2" + m0="9.6603" mWidth="0.0" mMin="9.6603" mMax="9.6603"> + <channel onMode="1" bRatio="1.0000000" products="553 21"/> +</particle> + +<particle id="9951103" name="Upsilon(2S)[1S0(8)]" spinType="1" chargeType="0" colType="2" + m0="10.22326" mWidth="0.0" mMin="10.22326" mMax="10.22326"> + <channel onMode="1" bRatio="1.0000000" products="100553 21"/> +</particle> + +<particle id="9951203" name="Upsilon(3S)[1S0(8)]" spinType="1" chargeType="0" colType="2" + m0="10.5552" mWidth="0.0" mMin="10.5552" mMax="10.5552"> + <channel onMode="1" bRatio="1.0000000" products="200553 21"/> +</particle> + +<particle id="9952003" name="Upsilon[3PJ(8)]" spinType="3" chargeType="0" colType="2" + m0="9.6603" mWidth="0.0" mMin="9.6603" mMax="9.6603"> + <channel onMode="1" bRatio="1.0000000" products="553 21"/> +</particle> + +<particle id="9952103" name="Upsilon(2S)[3PJ(8)]" spinType="3" chargeType="0" colType="2" + m0="10.22326" mWidth="0.0" mMin="10.22326" mMax="10.22326"> + <channel onMode="1" bRatio="1.0000000" products="100553 21"/> +</particle> + +<particle id="9952203" name="Upsilon(3S)[3PJ(8)]" spinType="3" chargeType="0" colType="2" + m0="10.5552" mWidth="0.0" mMin="10.5552" mMax="10.5552"> + <channel onMode="1" bRatio="1.0000000" products="200553 21"/> +</particle> + +<particle id="1000020040" name="4He" antiName="4Hebar" + spinType="1" chargeType="6" colType="0" m0="3.7284"> +</particle> + +<particle id="1000030060" name="6Li" antiName="6Libar" + spinType="1" chargeType="9" colType="0" m0="5.6030512"> +</particle> + +<particle id="1000060120" name="12C" antiName="12Cbar" + spinType="1" chargeType="18" colType="0" m0="11.177929"> +</particle> + +<particle id="1000080160" name="16O" antiName="16Obar" + spinType="1" chargeType="24" colType="0" m0="14.899168"> +</particle> + +<particle id="1000290630" name="63Cu" antiName="63Cubar" + spinType="2" chargeType="87" colType="0" m0="58.618646"> +</particle> + +<particle id="1000541290" name="129Xe" antiName="129Xebar" + spinType="2" chargeType="162" colType="0" m0="120.04645"> +</particle> + +<particle id="1000791970" name="197Au" antiName="197Aubar" + spinType="2" chargeType="237" colType="0" m0="183.47319"> +</particle> + +<particle id="1000822080" name="208Pb" antiName="208Pbbar" + spinType="1" chargeType="246" colType="0" m0="193.72902"> +</particle> +--> + +</chapter> + +<!-- Copyright (C) 2018 Torbjorn Sjostrand --> diff --git a/Framework/Particles/ParticleProperties.h b/corsika/framework/core/ParticleProperties.hpp similarity index 63% rename from Framework/Particles/ParticleProperties.h rename to corsika/framework/core/ParticleProperties.hpp index 7abcc768b..3bba1f509 100644 --- a/Framework/Particles/ParticleProperties.h +++ b/corsika/framework/core/ParticleProperties.hpp @@ -18,7 +18,7 @@ #include <cstdint> #include <iosfwd> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> /** * @@ -27,7 +27,7 @@ * */ -namespace corsika::particles { +namespace corsika { /** * @enum Code @@ -54,10 +54,7 @@ namespace corsika::particles { int constexpr GetNucleusA(Code const); int constexpr GetNucleusZ(Code const); -} // namespace corsika::particles - -// here we read the implementation of all those objects and function -#include <corsika/particles/GeneratedParticleProperties.inc> +#include <corsika/framework/core/GeneratedParticleProperties.inc> namespace corsika::particles { @@ -67,14 +64,14 @@ namespace corsika::particles { corsika::units::si::HEPMassType constexpr GetMass(Code const p) { if (p == Code::Nucleus) throw std::runtime_error("Cannot GetMass() of particle::Nucleus -> unspecified"); - return detail::masses[static_cast<CodeIntType>(p)]; + return particle::detail::masses[static_cast<CodeIntType>(p)]; } /*! * returns PDG id */ PDGCode constexpr GetPDG(Code const p) { - return detail::pdg_codes[static_cast<CodeIntType>(p)]; + return particle::detail::pdg_codes[static_cast<CodeIntType>(p)]; } /*! @@ -85,7 +82,7 @@ namespace corsika::particles { throw std::runtime_error( "Cannot GetChargeNumber() of particle::Nucleus -> unspecified"); // electric_charges stores charges in units of (e/3), e.g. 3 for a proton - return detail::electric_charges[static_cast<CodeIntType>(p)] / 3; + return particle::detail::electric_charges[static_cast<CodeIntType>(p)] / 3; } /*! @@ -98,43 +95,43 @@ namespace corsika::particles { } constexpr std::string const& GetName(Code const p) { - return detail::names[static_cast<CodeIntType>(p)]; + return particle::detail::names[static_cast<CodeIntType>(p)]; } - corsika::units::si::TimeType constexpr GetLifetime(Code const p) { - return detail::lifetime[static_cast<CodeIntType>(p)] * corsika::units::si::second; + inline corsika::units::si::TimeType constexpr GetLifetime(Code const p) { + return particle::detail::lifetime[static_cast<CodeIntType>(p)] * corsika::units::si::second; } - bool constexpr IsHadron(Code const p) { - return detail::isHadron[static_cast<CodeIntType>(p)]; + inline bool constexpr IsHadron(Code const p) { + return particle::detail::isHadron[static_cast<CodeIntType>(p)]; } - bool constexpr IsEM(Code c) { + inline bool constexpr IsEM(Code c) { return c == Code::Electron || c == Code::Positron || c == Code::Gamma; } - bool constexpr IsMuon(Code c) { return c == Code::MuPlus || c == Code::MuMinus; } + inline bool constexpr IsMuon(Code c) { return c == Code::MuPlus || c == Code::MuMinus; } - bool constexpr IsNeutrino(Code c) { + inline bool constexpr IsNeutrino(Code c) { return c == Code::NuE || c == Code::NuMu || c == Code::NuTau || c == Code::NuEBar || c == Code::NuMuBar || c == Code::NuTauBar; } - int constexpr GetNucleusA(Code const p) { + inline int constexpr GetNucleusA(Code const p) { if (p == Code::Nucleus) { throw std::runtime_error("GetNucleusA(Code::Nucleus) is impossible!"); } - return detail::nucleusA[static_cast<CodeIntType>(p)]; + return particle::detail::nucleusA[static_cast<CodeIntType>(p)]; } - int constexpr GetNucleusZ(Code const p) { + inline int constexpr GetNucleusZ(Code const p) { if (p == Code::Nucleus) { throw std::runtime_error("GetNucleusZ(Code::Nucleus) is impossible!"); } - return detail::nucleusZ[static_cast<CodeIntType>(p)]; + return particle::detail::nucleusZ[static_cast<CodeIntType>(p)]; } - bool constexpr IsNucleus(Code const p) { + inline bool constexpr IsNucleus(Code const p) { return (p == Code::Nucleus) || (GetNucleusA(p) != 0); } @@ -142,19 +139,27 @@ namespace corsika::particles { * the output operator for humand-readable particle codes **/ - std::ostream& operator<<(std::ostream&, corsika::particles::Code); - - Code ConvertFromPDG(PDGCode); + inline std::ostream& operator<<(std::ostream& stream, corsika::Code const p) { + return stream << corsika::GetName(p); + } + inline Code ConvertFromPDG(PDGCode p) { + static_assert(particle::detail::conversionArray.size() % 2 == 1); + // this will fail, for the strange case where the maxPDG is negative... + unsigned int constexpr maxPDG{(particle::detail::conversionArray.size() - 1) >> 1}; + auto k = static_cast<PDGCodeType>(p); + if ((unsigned int)abs(k) <= maxPDG) { + return particle::detail::conversionArray[k + maxPDG]; + } else { + return particle::detail::conversionMap.at(p); + } + } /** * Get mass of nucleus **/ - corsika::units::si::HEPMassType constexpr GetNucleusMass(const int vA, const int vZ) { + inline corsika::units::si::HEPMassType constexpr GetNucleusMass(const int vA, const int vZ) { return Proton::GetMass() * vZ + (vA - vZ) * Neutron::GetMass(); } - std::initializer_list<Code> constexpr getAllParticles() { - return detail::all_particles; - } +} // namespace corsika -} // namespace corsika::particles diff --git a/Framework/Units/PhysicalConstants.h b/corsika/framework/core/PhysicalConstants.hpp similarity index 99% rename from Framework/Units/PhysicalConstants.h rename to corsika/framework/core/PhysicalConstants.hpp index f47b917e6..306f48ebd 100644 --- a/Framework/Units/PhysicalConstants.h +++ b/corsika/framework/core/PhysicalConstants.hpp @@ -64,3 +64,4 @@ namespace corsika::units::constants { // etc. } // namespace corsika::units::constants + diff --git a/Framework/Units/PhysicalUnits.h b/corsika/framework/core/PhysicalUnits.hpp similarity index 98% rename from Framework/Units/PhysicalUnits.h rename to corsika/framework/core/PhysicalUnits.hpp index 36a835e7e..ebbdbcb2e 100644 --- a/Framework/Units/PhysicalUnits.h +++ b/corsika/framework/core/PhysicalUnits.hpp @@ -8,8 +8,9 @@ #pragma once -#include <corsika/units/PhysicalConstants.h> +#include <corsika/framework/core/PhysicalConstants.hpp> +//FIXME: What package is this? #include <phys/units/io.hpp> #include <phys/units/quantity.hpp> diff --git a/Framework/Particles/ParticleProperties.cc b/corsika/framework/core/detail/ParticleProperties.cc similarity index 100% rename from Framework/Particles/ParticleProperties.cc rename to corsika/framework/core/detail/ParticleProperties.cc diff --git a/corsika/framework/core/pdxml_reader.py b/corsika/framework/core/pdxml_reader.py new file mode 100755 index 000000000..8ce20b80a --- /dev/null +++ b/corsika/framework/core/pdxml_reader.py @@ -0,0 +1,516 @@ +#!/usr/bin/env python3 + +import sys, math, itertools, re, csv, pprint +import xml.etree.ElementTree as ET +from collections import OrderedDict +import pickle +import io + +GeVfm = 0.19732696312541853 +c_speed_of_light = 29.9792458e10 # mm / s +# for nuclear masses +mneutron = 0.9395654133 # GeV +mproton = 0.9382720813 # GeV + +namespace = "corsika" + +############################################################## +# +# reading xml input data, return line by line particle data +# +def parsePythia(filename): + tree = ET.parse(filename) + root = tree.getroot() + + for particle in root.iter("particle"): + name = particle.attrib["name"] + antiName = "Unknown" + if ("antiName" in particle.attrib): + antiName = particle.attrib["antiName"] + pdg_id = int(particle.attrib["id"]) + mass = float(particle.attrib["m0"]) # GeV + electric_charge = int(particle.attrib["chargeType"]) # in units of e/3 + ctau = 0. + if pdg_id in (11, 12, 14, 16, 22, 2212): # these are the stable particles ! + ctau = float('Inf') + elif 'tau0' in particle.attrib: + ctau = float(particle.attrib['tau0']) # mm / c + elif 'mWidth' in particle.attrib: + ctau = GeVfm / float(particle.attrib['mWidth']) * 1e-15 * 1000.0 # mm / s + elif pdg_id in (0, 423, 433, 4312, 4322, 5112, 5222): # those are certainly not stable.... + ctau = 0. + else: + print ("missing lifetime: " + str(pdg_id) + " " + str(name)) + sys.exit(1) + + yield (pdg_id, name, mass, electric_charge, antiName, ctau/c_speed_of_light) + + # TODO: read decay channels from child elements + + if "antiName" in particle.attrib: + yield (-pdg_id, antiName, mass, -electric_charge, name, ctau/c_speed_of_light) + + +############################################################## +# +# reading xml input data, return line by line particle data +# +def parseNuclei(filename): + tree = ET.parse(filename) + root = tree.getroot() + + for particle in root.iter("particle"): + name = particle.attrib["name"] + antiName = "Unknown" + if ("antiName" in particle.attrib): + antiName = particle.attrib["antiName"] + pdg_id = int(particle.attrib["id"]) + A = int(particle.attrib["A"]) + Z = int(particle.attrib["Z"]) + # mass in GeV + if ("mass" in particle.attrib): + mass = particle.attrib["mass"] + else: + mass = (A-Z)*mneutron + Z*mproton + + electric_charge = Z*3 # in units of e/3 + ctau = float('Inf') + + yield (pdg_id, name, mass, electric_charge, antiName, ctau/c_speed_of_light, A, Z) + + + +############################################################## +# +# returns dict with particle codes and class names +# +def class_names(filename): + tree = ET.parse(filename) + root = tree.getroot() + + map = {} + + for particle in root.iter("particle"): + name = particle.attrib["classname"] + pdg_id = int(particle.attrib["pdgID"]) + map[pdg_id] = name + + return map + +############################################################## +# +# Automatically produce a string qualifying as C++ class name +# +# This function produces names of type "DeltaPlusPlus" +# +def c_identifier_camel(name): + orig = name + name = name[0].upper() + name[1:].lower() # all lower case + + for c in "() /": # replace funny characters + name = name.replace(c, "_") + + name = name.replace("bar", "Bar") + name = name.replace("*", "Star") + name = name.replace("'", "Prime") + name = name.replace("+", "Plus") + name = name.replace("-", "Minus") + + # move "Bar" to end of name + ibar = name.find('Bar') + if ibar > 0 and ibar < len(name)-3: + name = name[:ibar] + name[ibar+3:] + 'Bar' + + # cleanup "_"s + while True: + tmp = name.replace("__", "_") + if tmp == name: + break + else: + name = tmp + name.strip("_") + + # remove all "_", if this does not by accident concatenate two numbers + istart = 0 + while True: + i = name.find('_', istart) + if i < 1 or i > len(name)-1: + break + istart = i + if name[i-1].isdigit() and name[i+1].isdigit(): + # there is a number on both sides + break + name = name[:i] + name[i+1:] + # and last, for example: make NuE out of Nue + if name[i-1].islower() and name[i].islower(): + if i < len(name)-1: + name = name[:i] + name[i].upper() + name[i+1:] + else: + name = name[:i] + name[i].upper() + + # check if name is valid C++ identifier + pattern = re.compile(r'^[a-zA-Z_][a-zA-Z_0-9]*$') + if pattern.match(name): + return name + else: + raise Exception("could not generate C identifier for '{:s}': result '{:s}'".format(orig, name)) + + + +########################################################## +# +# returns dict containing all data from pythia-xml input +# +def read_pythia_db(filename, particle_db, classnames): + + counter = itertools.count(len(particle_db)) + + for (pdg, name, mass, electric_charge, antiName, lifetime) in parsePythia(filename): + + c_id = "Unknown" + if pdg in classnames: + c_id = classnames[pdg] + else: + c_id = c_identifier_camel(name) # the camel case names + + hadron =abs(pdg) > 100 + + if c_id in particle_db.keys(): + raise RuntimeError("particle '{:s}' already known (new PDG id {:d}, stored PDG id: {:d})".format(c_id, pdg, particle_db[c_id]['pdg'])) + + particle_db[c_id] = { + "name" : name, + "antiName" : antiName, + "pdg" : pdg, + "mass" : mass, # in GeV + "electric_charge" : electric_charge, # in e/3 + "lifetime" : lifetime, + "ngc_code" : next(counter), + "isNucleus" : False, + "isHadron" : hadron, + } + + return particle_db + + + +########################################################## +# +# returns dict containing all data from pythia-xml input +# +def read_nuclei_db(filename, particle_db, classnames): + + counter = itertools.count(len(particle_db)) + + for (pdg, name, mass, electric_charge, antiName, lifetime, A, Z) in parseNuclei(filename): + + c_id = "Unknown" + if pdg in classnames: + c_id = classnames[pdg] + else: + c_id = c_identifier_camel(name) + + particle_db[c_id] = { + "name" : name, + "antiName" : antiName, + "pdg" : pdg, + "mass" : mass, # in GeV + "electric_charge" : electric_charge, # in e/3 + "lifetime" : lifetime, + "ngc_code" : next(counter), + "A" : A, + "Z" : Z, + "isNucleus" : True, + "isHadron" : True, + } + + return particle_db + + +############################################################### +# +# build conversion table PDG -> ngc +# +def gen_conversion_PDG_ngc(particle_db): + # todo: find a optimum value, think about cache miss with array vs lookup time with map + P_MAX = 500 # the maximum PDG code that is still filled into the table + + conversionDict = dict() + conversionTable = [None] * (2*P_MAX + 1) + for cId, p in particle_db.items(): + pdg = p['pdg'] + + if abs(pdg) < P_MAX: + if conversionTable[pdg + P_MAX]: + raise Exception("table entry already occupied") + else: + conversionTable[pdg + P_MAX] = cId + else: + if pdg in conversionDict.keys(): + raise Exception(f"map entry {pdg} already occupied") + else: + conversionDict[pdg] = cId + + output = io.StringIO() + def oprint(*args, **kwargs): + print(*args, **kwargs, file=output) + + oprint(f"static std::array<Code, {len(conversionTable)}> constexpr conversionArray {{") + for ngc in conversionTable: + oprint(" Code::{0},".format(ngc if ngc else "Unknown")) + oprint("};") + oprint() + + oprint("static std::map<PDGCode, Code> const conversionMap {") + for ngc in conversionDict.values(): + oprint(f" {{PDGCode::{ngc}, Code::{ngc}}},") + oprint("};") + oprint() + + return output.getvalue() + + +############################################################### +# +# return string with enum of all internal particle codes +# +def gen_internal_enum(particle_db): + string = ("enum class Code : CodeIntType {\n" + " FirstParticle = 1, // if you want to loop over particles, you want to start with \"1\" \n") # identifier for eventual loops... + + + for k in filter(lambda k: "ngc_code" in particle_db[k], particle_db): + last_ngc_id = particle_db[k]['ngc_code'] + string += " {key:s} = {code:d},\n".format(key = k, code = last_ngc_id) + + string += (" LastParticle = {:d},\n" # identifier for eventual loops... + "}};").format(last_ngc_id + 1) + + if last_ngc_id > 0x7fff: # does not fit into int16_t + raise Exception("Integer overflow in internal particle code definition prevented!") + + return string + + +############################################################### +# +# return string with enum of all PDG particle codes +# +def gen_pdg_enum(particle_db): + string = "enum class PDGCode : PDGCodeType {\n" + + for cId in particle_db: + pdgCode = particle_db[cId]['pdg'] + string += " {key:s} = {code:d},\n".format(key = cId, code = pdgCode) + + string += " };\n" + + return string + + +############################################################### +# +# return string with all data arrays +# +def gen_properties(particle_db): + + # number of particles, size of tables + string = "static constexpr std::size_t size = {size:d};\n".format(size = len(particle_db)) + string += "\n" + + # all particle initializer_list + string += "constexpr std::initializer_list<Code> all_particles = {" + for k in particle_db: + string += " Code::{name:s},\n".format(name = k) + string += "};\n" + string += "\n" + + # particle masses table + string += "static constexpr std::array<corsika::units::si::HEPMassType const, size> masses = {\n" + for p in particle_db.values(): + string += " {mass:e} * 1e9 * corsika::units::si::electronvolt, // {name:s}\n".format(mass = p['mass'], name = p['name']) + string += "};\n\n" + + # PDG code table + string += "static constexpr std::array<PDGCode, size> pdg_codes = {\n" + for p in particle_db.keys(): + string += f" PDGCode::{p},\n" + string += "};\n" + + # name string table + string += "static const std::array<std::string const, size> names = {\n" + for p in particle_db.values(): + string += " \"{name:s}\",\n".format(name = p['name']) + string += "};\n" + + # electric charges table + string += "static constexpr std::array<int16_t, size> electric_charges = {\n" + for p in particle_db.values(): + string += " {charge:d},\n".format(charge = p['electric_charge']) + string += "};\n" + + # anti-particle table + # string += "static constexpr std::array<size, size> anti_particle = {\n" + # for p in particle_db.values(): + # string += " {anti:d},\n".format(charge = p['anti_particle']) + # string += "};\n" + + # lifetime + #string += "static constexpr std::array<corsika::units::si::TimeType const, size> lifetime = {\n" + string += "static constexpr std::array<double const, size> lifetime = {\n" + for p in particle_db.values(): + if p['lifetime'] == float("Inf") : + string += " std::numeric_limits<double>::infinity(), \n" # * corsika::units::si::second, \n" + else : + string += " {tau:e}, \n".format(tau = p['lifetime']) + #string += " {tau:e} * corsika::units::si::second, \n".format(tau = p['lifetime']) + string += "};\n" + + # is Hadron flag + string += "static constexpr std::array<bool, size> isHadron = {\n" + for p in particle_db.values(): + value = 'false' + if p['isHadron']: + value = 'true' + string += " {val},\n".format(val = value) + string += "};\n" + + + ### nuclear data ### + + # nucleus mass number A + string += "static constexpr std::array<int16_t, size> nucleusA = {\n" + for p in particle_db.values(): + A = p.get('A', 0) + string += " {val},\n".format(val = A) + string += "};\n" + + # nucleus charge number Z + string += "static constexpr std::array<int16_t, size> nucleusZ = {\n" + for p in particle_db.values(): + Z = p.get('Z', 0) + string += " {val},\n".format(val = Z) + string += "};\n" + + return string + + +############################################################### +# +# return string with a list of classes for all particles +# +def gen_classes(particle_db): + + string = "// list of C++ classes to access particle properties" + + for cname in particle_db: + + antiP = 'Unknown' + for cname_anti in particle_db: + if (particle_db[cname_anti]['name'] == particle_db[cname]['antiName']): + antiP = cname_anti + break + + string += "\n" + string += "/** @class " + cname + "\n\n" + string += " * Particle properties are taken from the PYTHIA8 ParticleData.xml file:<br>\n" + string += " * - pdg=" + str(particle_db[cname]['pdg']) +"\n" + string += " * - mass=" + str(particle_db[cname]['mass']) + " GeV \n" + string += " * - charge= " + str(particle_db[cname]['electric_charge']/3) + " \n" + string += " * - name=" + str(cname) + "\n" + string += " * - anti=" + str(antiP) + "\n" + if (particle_db[cname]['isNucleus']): + string += " * - nuclear A=" + str(particle_db[cname]['A']) + "\n" + string += " * - nuclear Z=" + str(particle_db[cname]['Z']) + "\n" + string += "*/\n\n" + string += "class " + cname + " {\n" + string += " public:\n" + string += " static constexpr Code GetCode() { return Type; }\n" + string += " static constexpr corsika::units::si::HEPMassType GetMass() { return corsika::GetMass(Type); }\n" + string += " static constexpr corsika::units::si::ElectricChargeType GetCharge() { return corsika::GetCharge(Type); }\n" + string += " static constexpr int16_t GetChargeNumber() { return corsika::GetChargeNumber(Type); }\n" + string += " static std::string const& GetName() { return corsika::GetName(Type); }\n" + string += " static constexpr Code GetAntiParticle() { return AntiType; }\n" + string += " static constexpr bool IsNucleus() { return corsika::IsNucleus(Type); }\n" + string += " static constexpr int16_t GetNucleusA() { return corsika::GetNucleusA(Type); }\n" + string += " static constexpr int16_t GetNucleusZ() { return corsika::GetNucleusZ(Type); }\n" + string += " static constexpr Code Type = Code::" + cname + ";\n" + string += " static constexpr Code AntiType = Code::" + antiP + ";\n" + string += " private:\n" + string += " static constexpr CodeIntType TypeIndex = static_cast<CodeIntType const>(Type);\n" + string += "};\n" + + return string + + +############################################################### +# +# +def inc_start(): + string = ('// generated by pdxml_reader.py\n' + '// MANUAL EDITS ON OWN RISK. THEY WILL BE OVERWRITTEN. \n') + return string + + +############################################################### +# +# +def detail_start(): + string = ('namespace particle::detail {\n\n') + return string + + +############################################################### +# +# +def detail_end(): + string = "\n}//end namespace particle::detail\n" + return string + +############################################################### +# +# +def inc_end(): + string = "" + return string + + +################################################################### +# +# Serialize particle_db into file +# +def serialize_particle_db(particle_db, file): + pickle.dump(particle_db, file) + + +################################################################### +# +# Main function +# +if __name__ == "__main__": + + if len(sys.argv) != 4: + print("usage: {:s} <Pythia8.xml> <Nuclei.xml> <ClassNames.xml>".format(sys.argv[0]), file=sys.stderr) + sys.exit(1) + + print("\n pdxml_reader.py: automatically produce particle properties from input files\n") + + names = class_names(sys.argv[3]) + particle_db = OrderedDict() + read_pythia_db(sys.argv[1], particle_db, names) + read_nuclei_db(sys.argv[2], particle_db, names) + + with open("GeneratedParticleProperties.inc", "w") as f: + print(inc_start(), file=f) + print(gen_internal_enum(particle_db), file=f) + print(gen_pdg_enum(particle_db), file=f) + print(detail_start(), file=f) + print(gen_properties(particle_db), file=f) + print(gen_conversion_PDG_ngc(particle_db), file=f) + print(detail_end(), file=f) + print(gen_classes(particle_db), file=f) + print(inc_end(), file=f) + + with open("particle_db.pkl", "wb") as f: + serialize_particle_db(particle_db, f) + diff --git a/corsika/framework/geometry/BaseVector.hpp b/corsika/framework/geometry/BaseVector.hpp new file mode 100644 index 000000000..97becb2d5 --- /dev/null +++ b/corsika/framework/geometry/BaseVector.hpp @@ -0,0 +1,49 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/CoordinateSystem.hpp> +#include <corsika/framework/geometry/QuantityVector.hpp> + +namespace corsika { + + /*! + * Common base class for Vector and Point. Currently it does basically nothing. + */ + /* + * FIXME Many potential issues: + * 1. does this class really need to be templated ? + * 2. copy constructor, assignment operator not implemented + * 3. this member pointer is quite scary... + */ + template <typename dim> + class BaseVector { + + public: + + /* + * FIXME Why to copy pQVector twice? + */ + BaseVector(CoordinateSystem const& pCS, QuantityVector<dim> pQVector): + qVector(pQVector), + cs(&pCS) + {} + + auto const& GetCoordinateSystem() const; + + + protected: + QuantityVector<dim> qVector; + CoordinateSystem const* cs; + + }; + +} // namespace corsika + +#include <corsika/detail/framework/geometry/BaseVector.inl> diff --git a/corsika/framework/geometry/CoordinateSystem.hpp b/corsika/framework/geometry/CoordinateSystem.hpp new file mode 100644 index 000000000..3b155fc4a --- /dev/null +++ b/corsika/framework/geometry/CoordinateSystem.hpp @@ -0,0 +1,90 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/QuantityVector.hpp> +#include <corsika/framework/utility/sgn.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <Eigen/Dense> +#include <stdexcept> + + +/* + * FIXME Review this global typedef. + */ +typedef Eigen::Transform<double, 3, Eigen::Affine> EigenTransform; +typedef Eigen::Translation<double, 3> EigenTranslation; + +namespace corsika { + + class RootCoordinateSystem; + + + template <typename T> + class Vector; + + /* + * FIXME this statement should be scoped. + */ + using corsika::units::si::length_d; + + class CoordinateSystem + { + + CoordinateSystem const* reference = nullptr; + EigenTransform transf; + + CoordinateSystem(CoordinateSystem const& reference, EigenTransform const& transf): + reference(&reference), + transf(transf) + {} + + CoordinateSystem() + : // for creating the root CS + transf(EigenTransform::Identity()) {} + + public: + + //FIXME missing test for self assignment + inline CoordinateSystem& operator=(const CoordinateSystem& pCS); + + inline CoordinateSystem translate(QuantityVector<length_d> vector) const; + + /** + * creates a new CS in which vVec points in direction of the new z-axis + */ + template <typename TDim> + auto RotateToZ(Vector<TDim> vVec) const; + + template <typename TDim> + auto rotate(QuantityVector<TDim> axis, double angle) const ; + + template <typename TDim> + auto translateAndRotate(QuantityVector<phys::units::length_d> translation, + QuantityVector<TDim> axis, double angle); + + inline CoordinateSystem const* GetReference() const; + + inline const EigenTransform& GetTransform() const; + + protected: + + static CoordinateSystem CreateCS() { return CoordinateSystem(); } + + friend corsika::RootCoordinateSystem; /// this is the only class that can + /// create ONE unique root CS + }; + + + EigenTransform getTransformation(CoordinateSystem const& c1, CoordinateSystem const& c2); + +} // namespace corsika + +#include <corsika/detail/framework/geometry/CoordinateSystem.inl> diff --git a/corsika/framework/geometry/FourVector.hpp b/corsika/framework/geometry/FourVector.hpp new file mode 100644 index 000000000..2dcde2131 --- /dev/null +++ b/corsika/framework/geometry/FourVector.hpp @@ -0,0 +1,207 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <iostream> +#include <type_traits> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Vector.hpp> + +namespace corsika { + + /** + FourVector supports "full" units, e.g. E in [GeV/c] and p in [GeV], + or also t in [s] and r in [m], etc. + + However, for HEP applications it is also possible to use E and p + both in [GeV]. + + The FourVector can return NormSqr and Norm, whereas Norm is + sqrt(abs(NormSqr)). The physical units are always calculated and + returned properly. + + FourVector can also return if it is TimeLike, SpaceLike or PhotonLike. + + When a FourVector is initialized with a lvalue reference, this is + also used for the internal storage, which should lead to complete + disappearance of the FourVector class during optimization. + */ + + template <typename TimeType, typename SpaceVecType> + class FourVector + { + + public: + + using SpaceType = typename std::decay<SpaceVecType>::type::Quantity; + + //! check the types and the physical units here: + static_assert( + std::is_same<typename std::decay<TimeType>::type, SpaceType>::value || + std::is_same<typename std::decay<TimeType>::type, + decltype(std::declval<SpaceType>() / corsika::units::si::meter * + corsika::units::si::second)>::value, + "Units of time-like and space-like coordinates must either be idential " + "(e.g. GeV) or [E/c]=[p]"); + + public: + + FourVector() = default; + + FourVector(const TimeType& eT, const SpaceVecType& eS): + fTimeLike(eT), + fSpaceLike(eS) + {} + + /* + * FIXME: These Getters are mis-leading and does not favor + * locality. Adhere to Getter/Setter + */ + /** + * @brief + * + * @return fTimeLike + */ + TimeType GetTimeLikeComponent() const ; + + /** + * @brief + * + * @return fSpaceLike + */ + SpaceVecType& GetSpaceLikeComponents() ; + + /** + * @brief + * + * @return fSpaceLike; + */ + const SpaceVecType& GetSpaceLikeComponents() const ; + + /** + * @brief + * + * @return + */ + auto GetNormSqr() const; + + /** + * @brief + * + * @return + */ + SpaceType GetNorm() const; + + + /* + * FIXME: a better alternative would be to define an enumeration + * enum { SpaceLike =-1, TimeLike, LightLike } V4R_Category; + * and a method called V4R_Category GetCategory() const; + */ + /** + * @brief + * + * @return + */ + bool IsTimelike() const; + + /** + * @brief + * + * @return + */ + bool IsSpacelike() const; + + + FourVector& operator+=(const FourVector& b); + + FourVector& operator-=(const FourVector& b); + + FourVector& operator*=(const double b); + + FourVector& operator/=(const double b); + + FourVector& operator/(const double b); + + /** + Note that the product between two 4-vectors assumes that you use + the same "c" convention for both. Only the LHS vector is checked + for this. You cannot mix different conventions due to + unit-checking. + */ + SpaceType operator*(const FourVector& b) ; + + + protected: + + //! the data members + TimeType fTimeLike; + SpaceVecType fSpaceLike; + + //! the friends: math operators + template <typename T, typename U> + friend FourVector<typename std::decay<T>::type, typename std::decay<U>::type> + operator+(const FourVector<T, U>&, const FourVector<T, U>&); + + template <typename T, typename U> + friend FourVector<typename std::decay<T>::type, typename std::decay<U>::type> + operator-(const FourVector<T, U>&, const FourVector<T, U>&); + + template <typename T, typename U> + friend FourVector<typename std::decay<T>::type, typename std::decay<U>::type> + operator*(const FourVector<T, U>&, const double); + + template <typename T, typename U> + friend FourVector<typename std::decay<T>::type, typename std::decay<U>::type> + operator/(const FourVector<T, U>&, const double); + + private: + /** + This function is automatically compiled to use of ignore the + extra factor of "c" for the time-like quantity + */ + auto GetTimeSquared() const ; + + }; + + + + /** + The math operator+ + */ + template <typename TimeType, typename SpaceVecType> + inline FourVector<typename std::decay<TimeType>::type, typename std::decay<SpaceVecType>::type> + operator+(const FourVector<TimeType, SpaceVecType>& a, const FourVector<TimeType, SpaceVecType>& b) ; + + /** + The math operator- + */ + template <typename TimeType, typename SpaceVecType> + inline FourVector<typename std::decay<TimeType>::type, typename std::decay<SpaceVecType>::type> + operator-(const FourVector<TimeType, SpaceVecType>& a, const FourVector<TimeType, SpaceVecType>& b) ; + + /** + The math operator* + FIXME: Add overload to deal with multiplication by a scalar and 3-vectors + */ + template <typename TimeType, typename SpaceVecType> + inline FourVector<typename std::decay<TimeType>::type, typename std::decay<SpaceVecType>::type> + operator*(const FourVector<TimeType, SpaceVecType>& a, const double b) ; + + /** + The math operator/ + */ + template <typename TimeType, typename SpaceVecType> + inline FourVector<typename std::decay<TimeType>::type,typename std::decay<SpaceVecType>::type> + operator/(const FourVector<TimeType, SpaceVecType>& a, const double b) ; + + +} // namespace corsika + +#include <corsika/detail/framework/geometry/FourVector.inl> diff --git a/corsika/framework/geometry/Helix.hpp b/corsika/framework/geometry/Helix.hpp new file mode 100644 index 000000000..09f8672f9 --- /dev/null +++ b/corsika/framework/geometry/Helix.hpp @@ -0,0 +1,66 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <cmath> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Vector.hpp> + +namespace corsika { + /*! + * A Helix is defined by the cyclotron frequency \f$ \omega_c \f$, the initial + * Point r0 and + * the velocity vectors \f$ \vec{v}_{\parallel} \f$ and \f$ \vec{v}_{\perp} \f$ + * denoting the projections of the initial velocity \f$ \vec{v}_0 \f$ parallel + * and perpendicular to the axis \f$ \vec{B} \f$, respectively, i.e. + * \f{align*}{ + \vec{v}_{\parallel} &= \frac{\vec{v}_0 \cdot \vec{B}}{\vec{B}^2} \vec{B} \\ + \vec{v}_{\perp} &= \vec{v}_0 - \vec{v}_{\parallel} + \f} + */ + + class Helix { + + using VelocityVec = Vector<units::si::SpeedType::dimension_type>; + + Point const r0; + units::si::FrequencyType const omegaC; + VelocityVec const vPar; + VelocityVec const vPerp, uPerp; + + corsika::units::si::LengthType const radius; + + public: + + Helix(Point const& pR0, units::si::FrequencyType pOmegaC, + VelocityVec const& pvPar, VelocityVec const& pvPerp) + : r0(pR0) + , omegaC(pOmegaC) + , vPar(pvPar) + , vPerp(pvPerp) + , uPerp(vPerp.cross(vPar.normalized())) + , radius(pvPar.norm() / abs(pOmegaC)) {} + + inline Point GetPosition(units::si::TimeType t) const ; + + inline Point PositionFromArclength(units::si::LengthType l) const ; + + inline units::si::LengthType GetRadius() const ; + + inline units::si::LengthType + ArcLength(units::si::TimeType t1, units::si::TimeType t2) const ; + + inline units::si::TimeType TimeFromArclength(units::si::LengthType l) const ; + + }; + +} // namespace corsika + +#include <corsika/detail/framework/geometry/Helix.inl> diff --git a/corsika/framework/geometry/Line.hpp b/corsika/framework/geometry/Line.hpp new file mode 100644 index 000000000..f25a3d9e3 --- /dev/null +++ b/corsika/framework/geometry/Line.hpp @@ -0,0 +1,56 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Vector.hpp> + +namespace corsika { + + /** + * \class Line + * + * A Line describes a movement in three dimensional space. It + * consists of a Point `$\vec{p_0}$` and and a speed-Vector + * `$\vec{v}$`, so that it can return GetPosition as + * `$\vec{p_0}*\vec{v}*t$` for any value of time `$t$`. + * + **/ + + class Line { + + using VelocityVec = Vector<units::si::SpeedType::dimension_type>; + + Point const r0; + VelocityVec const v0; + + public: + + Line(Point const& pR0, VelocityVec const& pV0) + : r0(pR0) + , v0(pV0) {} + + inline Point GetPosition(units::si::TimeType t) const ; + + inline Point PositionFromArclength(units::si::LengthType l) const ; + + inline units::si::LengthType ArcLength(units::si::TimeType t1, units::si::TimeType t2) const ; + + inline units::si::TimeType TimeFromArclength( units::si::LengthType t) const ; + + inline const Point& GetR0() const ; + + inline const VelocityVec& GetV0() const ; + + }; + +} // namespace corsika + +#include <corsika/detail/framework/geometry/Line.inl> diff --git a/Framework/Geometry/Plane.h b/corsika/framework/geometry/Plane.hpp similarity index 55% rename from Framework/Geometry/Plane.h rename to corsika/framework/geometry/Plane.hpp index 9a3b04ff4..6a0d04f4c 100644 --- a/Framework/Geometry/Plane.h +++ b/corsika/framework/geometry/Plane.hpp @@ -8,11 +8,12 @@ #pragma once -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +namespace corsika { -namespace corsika::geometry { class Plane { using DimLessVec = Vector<corsika::units::si::dimensionless_d>; @@ -21,20 +22,23 @@ namespace corsika::geometry { DimLessVec const fNormal; public: + Plane(Point const& vCenter, DimLessVec const& vNormal) : fCenter(vCenter) , fNormal(vNormal.normalized()) {} - bool IsAbove(Point const& vP) const { - return fNormal.dot(vP - fCenter) > corsika::units::si::LengthType::zero(); - } + bool IsAbove(Point const& vP) const ; + + units::si::LengthType DistanceTo(geometry::Point const& vP) const ; + - units::si::LengthType DistanceTo(geometry::Point const& vP) const { - return (fNormal * (vP - fCenter).dot(fNormal)).norm(); - } + Point const& GetCenter() const ; + + DimLessVec const& GetNormal() const ; - Point const& GetCenter() const { return fCenter; } - DimLessVec const& GetNormal() const { return fNormal; } }; -} // namespace corsika::geometry +} // namespace corsika + +#include <corsika/detail/framework/geometry/Plane.inl> + diff --git a/corsika/framework/geometry/Point.hpp b/corsika/framework/geometry/Point.hpp new file mode 100644 index 000000000..22b9f7558 --- /dev/null +++ b/corsika/framework/geometry/Point.hpp @@ -0,0 +1,66 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/QuantityVector.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/BaseVector.hpp> +#include <corsika/framework/geometry/Vector.hpp> + +namespace corsika { + + //FIXME: remove aliasing here + using corsika::units::si::length_d; + using corsika::units::si::LengthType; + + /*! + * A Point represents a point in position space. It is defined by its + * coordinates with respect to some CoordinateSystem. + */ + class Point : public BaseVector<length_d> { + + public: + + Point(CoordinateSystem const& pCS, QuantityVector<length_d> pQVector) + : BaseVector<length_d>(pCS, pQVector) {} + + Point(CoordinateSystem const& cs, LengthType x, LengthType y, LengthType z) + : BaseVector<length_d>(cs, {x, y, z}) {} + + // TODO: this should be private or protected, we don NOT want to expose numbers + // without reference to outside: + inline auto GetCoordinates() const ; + + inline auto GetX() const ; + + inline auto GetY() const ; + + inline auto GetZ() const ; + + /// this always returns a QuantityVector as triple + inline auto GetCoordinates(CoordinateSystem const& pCS) const ; + + /*! + * transforms the Point into another CoordinateSystem by changing its + * coordinates interally + */ + inline void rebase(CoordinateSystem const& pCS) ; + + inline Point operator+(Vector<length_d> const& pVec) const ; + + /*! + * returns the distance Vector between two points + */ + inline Vector<length_d> operator-(Point const& pB) const ; + + }; + +} // namespace corsika + +#include <corsika/detail/framework/geometry/Point.inl> diff --git a/corsika/framework/geometry/QuantityVector.hpp b/corsika/framework/geometry/QuantityVector.hpp new file mode 100644 index 000000000..e3195c34e --- /dev/null +++ b/corsika/framework/geometry/QuantityVector.hpp @@ -0,0 +1,100 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <Eigen/Dense> + +#include <iostream> +#include <utility> +#include <corsika/framework/core/PhysicalUnits.hpp> + +namespace corsika { + + /*! + * A QuantityVector is a three-component container based on Eigen::Vector3d + * with a phys::units::si::dimension. Arithmethic operators are defined that + * propagate the dimensions by dimensional analysis. + */ + + template <typename dim> + class QuantityVector { + public: + using Quantity = phys::units::quantity<dim, double>; //< the phys::units::quantity + // corresponding to the dimension + + public: + Eigen::Vector3d eVector; //!< the actual container where the raw numbers are stored + + typedef dim dimension; //!< should be a phys::units::dimension + + QuantityVector(Quantity a, Quantity b, Quantity c) + : eVector{a.magnitude(), b.magnitude(), c.magnitude()} {} + + QuantityVector(double a, double b, double c) + : eVector{a, b, c} { + static_assert( + std::is_same_v<dim, phys::units::dimensionless_d>, + "initialization of dimensionful QuantityVector with pure numbers not allowed!"); + } + + QuantityVector(Eigen::Vector3d pBareVector) + : eVector(pBareVector) {} + + auto operator[](size_t index) const ; + + auto GetX() const ; + + auto GetY() const ; + + auto GetZ() const ; + + auto norm() const ; + + auto squaredNorm() const ; + + auto operator+(QuantityVector<dim> const& pQVec) const ; + + auto operator-(QuantityVector<dim> const& pQVec) const ; + + template <typename ScalarDim> + auto operator*(phys::units::quantity<ScalarDim, double> const p) const ; + + template <typename ScalarDim> + auto operator/(phys::units::quantity<ScalarDim, double> const p) const ; + + auto operator*(double const p) const ; + + auto operator/(double const p) const ; + + auto& operator/=(double const p) ; + + auto& operator*=(double const p) ; + + auto& operator+=(QuantityVector<dim> const& pQVec) ; + + auto& operator-=(QuantityVector<dim> const& pQVec) ; + + auto& operator-() const ; + + auto normalized() const ; + + auto operator==(QuantityVector<dim> const& p) const ; + + }; + + /* + * FIXME free function operators not implemented. + */ + + template <typename dim> + auto& operator<<(std::ostream& os, corsika::QuantityVector<dim> qv); + +} // namespace corsika + +#include <corsika/detail/framework/geometry/QuantityVector.inl> diff --git a/Framework/Geometry/RootCoordinateSystem.h b/corsika/framework/geometry/RootCoordinateSystem.hpp similarity index 50% rename from Framework/Geometry/RootCoordinateSystem.h rename to corsika/framework/geometry/RootCoordinateSystem.hpp index a2208fd71..f88c7a270 100644 --- a/Framework/Geometry/RootCoordinateSystem.h +++ b/corsika/framework/geometry/RootCoordinateSystem.hpp @@ -8,9 +8,8 @@ #pragma once -#include <corsika/utl/Singleton.h> - -#include <corsika/geometry/CoordinateSystem.h> +#include <corsika/framework/utility/Singleton.hpp> +#include <corsika/framework/geometry/CoordinateSystem.hpp> /*! * This is the only way to get a root-coordinate system, and it is a @@ -18,23 +17,28 @@ * RootCoordinateSystem */ -namespace corsika::geometry { +namespace corsika { - class RootCoordinateSystem : public corsika::utl::Singleton<RootCoordinateSystem> { + class RootCoordinateSystem : public corsika::Singleton<RootCoordinateSystem> { - friend class corsika::utl::Singleton<RootCoordinateSystem>; + friend class corsika::Singleton<RootCoordinateSystem>; protected: RootCoordinateSystem() {} public: - corsika::geometry::CoordinateSystem& GetRootCoordinateSystem() { return fRootCS; } - const corsika::geometry::CoordinateSystem& GetRootCoordinateSystem() const { + corsika::CoordinateSystem& GetRootCoordinateSystem() + { + return fRootCS; + } + const corsika::CoordinateSystem& GetRootCoordinateSystem() const + { return fRootCS; } private: - corsika::geometry::CoordinateSystem fRootCS; // THIS IS IT + corsika::CoordinateSystem fRootCS; // THIS IS IT }; -} // namespace corsika::geometry +} // namespace corsika + diff --git a/corsika/framework/geometry/Sphere.hpp b/corsika/framework/geometry/Sphere.hpp new file mode 100644 index 000000000..edbeae194 --- /dev/null +++ b/corsika/framework/geometry/Sphere.hpp @@ -0,0 +1,36 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Volume.hpp> + +namespace corsika { + + class Sphere : public Volume { + Point const fCenter; + units::si::LengthType const fRadius; + + public: + Sphere(Point const& pCenter, units::si::LengthType const pRadius) + : fCenter(pCenter) + , fRadius(pRadius) {} + + //! returns true if the Point p is within the sphere + inline bool Contains(Point const& p) const override ; + + inline const Point& GetCenter() const; + + inline units::si::LengthType GetRadius() const; + }; + +} // namespace corsika + +#include <corsika/detail/framework/geometry/Sphere.inl> diff --git a/corsika/framework/geometry/Trajectory.hpp b/corsika/framework/geometry/Trajectory.hpp new file mode 100644 index 000000000..89a9490ad --- /dev/null +++ b/corsika/framework/geometry/Trajectory.hpp @@ -0,0 +1,111 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Point.hpp> + +namespace corsika { + + /** + * \class LineTrajectory + * + * A Trajectory is a description of a momvement of an object in + * three-dimensional space that describes the trajectory (connection + * between two Points in space), as well as the direction of motion + * at any given point. + * + * A Trajectory has a start `0` and an end `1`, where + * e.g. GetPosition(0) returns the start point and GetDirection(1) + * the direction of motion at the end. Values outside 0...1 are not + * defined. + * + * A Trajectory has a length in [m], GetLength, a duration in [s], GetDuration. + * + * Note: so far it is assumed that the speed (d|vec{r}|/dt) between + * start and end does not change and is constant for the entire + * Trajectory. + * + **/ + + class LineTrajectory { + + using VelocityVec = Vector<corsika::units::si::SpeedType::dimension_type>; + + public: + LineTrajectory() = delete; + LineTrajectory(const LineTrajectory&) = default; + LineTrajectory(LineTrajectory&&) = default; + LineTrajectory& operator=(const LineTrajectory&) = delete; + + /** + * \param theLine The geometric \sa Line object that represents a straight-line + * connection + * + * \param timeLength The time duration to traverse the straight trajectory + * in units of \sa TimeType + */ + LineTrajectory(Line const& theLine, corsika::units::si::TimeType timeLength) + : line_(theLine) + , timeLength_(timeLength) + , timeStep_(timeLength) + , initialVelocity_(theLine.GetVelocity(corsika::units::si::TimeType::zero())) + , finalVelocity_(theLine.GetVelocity(timeLength)) {} + + /** + * \param theLine The geometric \sa Line object that represents a straight-line + * connection + * + * \param timeLength The time duration to traverse the straight trajectory + * in units of \sa TimeType + * + * \param timeStep Time duration to folow eventually curved + * trajectory in units of \sa TimesType + * + * \param initialV Initial velocity vector at + * start of trajectory \param finalV Final velocity vector at start of trajectory + */ + LineTrajectory( + Line const& theLine, + corsika::units::si::TimeType timeLength, // length of theLine (straight) + corsika::units::si::TimeType timeStep, // length of bend step (curved) + const VelocityVec& initialV, const VelocityVec& finalV) + : line_(theLine) + , timeLength_(timeLength) + , timeStep_(timeStep) + , initialVelocity_(initialV) + , finalVelocity_(finalV) {} + + const Line& GetLine() const { return line_; } + Point GetPosition(double u) const { return line_.GetPosition(timeLength_ * u); } + VelocityVec GetVelocity(double u) const { + return initialVelocity_ * (1 - u) + finalVelocity_ * u; + } + Vector<corsika::units::si::dimensionless_d> GetDirection(double u) const { + return GetVelocity(u).normalized(); + } + + Point GetPosition(double u) const ; + + corsika::units::si::TimeType GetDuration() const ; + + corsika::units::si::LengthType GetLength() const ; + + corsika::units::si::LengthType GetDistance(corsika::units::si::TimeType t) const ; + + void LimitEndTo(corsika::units::si::LengthType limit) ; + + auto NormalizedDirection() const ; + + }; + +} // namespace corsika + +#include <corsika/detail/framework/geometry/Trajectory.inl> diff --git a/corsika/framework/geometry/Vector.hpp b/corsika/framework/geometry/Vector.hpp new file mode 100644 index 000000000..d117e3fcc --- /dev/null +++ b/corsika/framework/geometry/Vector.hpp @@ -0,0 +1,117 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/BaseVector.hpp> +#include <corsika/framework/geometry/QuantityVector.hpp> + +/*! + * A Vector represents a 3-vector in Euclidean space. It is defined by components + * given in a specific CoordinateSystem. It has a physical dimension ("unit") + * as part of its type, so you cannot mix up e.g. electric with magnetic fields + * (but you could calculate their cross-product to get an energy flux vector). + * + * When transforming coordinate systems, a Vector is subject to the rotational + * part only and invariant under translations. + */ + +namespace corsika { + + template <typename dim> + class Vector : public BaseVector<dim> { + public: + using Quantity = phys::units::quantity<dim, double>; + + public: + Vector(CoordinateSystem const& pCS, QuantityVector<dim> pQVector) + : BaseVector<dim>(pCS, pQVector) {} + + Vector(CoordinateSystem const& cs, Quantity x, Quantity y, Quantity z) + : BaseVector<dim>(cs, QuantityVector<dim>(x, y, z)) {} + + /*! + * returns a QuantityVector with the components given in the "home" + * CoordinateSystem of the Vector + */ + auto GetComponents() const; + + /*! + * returns a QuantityVector with the components given in an arbitrary + * CoordinateSystem + */ + auto GetComponents(CoordinateSystem const& pCS) const; + + /*! + * transforms the Vector into another CoordinateSystem by changing + * its components internally + */ + void rebase(CoordinateSystem const& pCS); + + /*! + * returns the norm/length of the Vector. Before using this method, + * think about whether squaredNorm() might be cheaper for your computation. + */ + auto norm() const; + + auto GetNorm() const ; + + /*! + * returns the squared norm of the Vector. Before using this method, + * think about whether norm() might be cheaper for your computation. + */ + auto squaredNorm() const ; + + auto GetSquaredNorm() const ; + /*! + * returns a Vector \f$ \vec{v}_{\parallel} \f$ which is the parallel projection + * of this vector \f$ \vec{v}_1 \f$ along another Vector \f$ \vec{v}_2 \f$ given by + * \f[ + * \vec{v}_{\parallel} = \frac{\vec{v}_1 \cdot \vec{v}_2}{\vec{v}_2^2} \vec{v}_2 + * \f] + */ + template <typename dim2> + auto parallelProjectionOnto(Vector<dim2> const& pVec, CoordinateSystem const& pCS) const ; + template <typename dim2> + auto parallelProjectionOnto(Vector<dim2> const& pVec) const ; + + auto operator+(Vector<dim> const& pVec) const ; + + auto operator-(Vector<dim> const& pVec) const ; + + auto& operator*=(double const p) ; + + template <typename ScalarDim> + auto operator*(phys::units::quantity<ScalarDim, double> const p) const ; + template <typename ScalarDim> + auto operator/(phys::units::quantity<ScalarDim, double> const p) const ; + + auto operator*(double const p) const ; + + auto operator/(double const p) const ; + + auto& operator+=(Vector<dim> const& pVec) ; + + auto& operator-=(Vector<dim> const& pVec); + + auto& operator-() const ; + + auto normalized() const ; + + template <typename dim2> + auto cross(Vector<dim2> pV) const ; + + template <typename dim2> + auto dot(Vector<dim2> pV) const ; + + }; + +} // namespace corsika + +#include <corsika/detail/framework/geometry/Vector.inl> diff --git a/Framework/Geometry/Volume.h b/corsika/framework/geometry/Volume.hpp similarity index 81% rename from Framework/Geometry/Volume.h rename to corsika/framework/geometry/Volume.hpp index c1dfbd313..d566e45c1 100644 --- a/Framework/Geometry/Volume.h +++ b/corsika/framework/geometry/Volume.hpp @@ -8,9 +8,9 @@ #pragma once -#include <corsika/geometry/Point.h> +#include <corsika/framework/geometry/Point.hpp> -namespace corsika::geometry { +namespace corsika { class Volume { @@ -21,4 +21,5 @@ namespace corsika::geometry { virtual ~Volume() = default; }; -} // namespace corsika::geometry +} // namespace corsika + diff --git a/Framework/Geometry/CoordinateSystem.cc b/corsika/framework/geometry/detail/CoordinateSystem.cc similarity index 100% rename from Framework/Geometry/CoordinateSystem.cc rename to corsika/framework/geometry/detail/CoordinateSystem.cc diff --git a/corsika/framework/logging/BufferedSink.h b/corsika/framework/logging/BufferedSink.h new file mode 100644 index 000000000..5b2b3a62a --- /dev/null +++ b/corsika/framework/logging/BufferedSink.h @@ -0,0 +1,80 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#ifndef _include_BufferedSink_h_ +#define _include_BufferedSink_h_ + +namespace corsika::logging { + + namespace sink { + + /** + Output buffer template. NoBuffer does nothingk. + */ + /* + struct NoBuffer { + inline bool Test(const std::string&) const { return false; } + inline std::string GetString() const { return std::string(""); } + inline void Clear() {} + inline void Add(const std::string&) {} + }; + */ + /** + Output buffer template. StdBuffer records fSize characters in + local memeory before passing it on to further output stages. + */ + + struct StdBuffer { + StdBuffer(const int size) + : fSize(size) {} + inline bool Test(const std::string& s) { + return int(fBuffer.tellp()) + s.length() < fSize; + } + inline std::string GetString() const { return fBuffer.str(); } + inline void Clear() { fBuffer.str(""); } + inline void Add(const std::string& s) { fBuffer << s; } + + private: + unsigned int fSize; + std::ostringstream fBuffer; + }; + + /** + Definition of Sink for log output. + */ + template <typename TStream, typename TBuffer = StdBuffer> + class BufferedSink { + public: + BufferedSink(TStream& out, TBuffer buffer = {}) + : fOutput(out) + , fBuffer(std::move(buffer)) {} + void operator<<(const std::string& msg) { + if (!fBuffer.Test(msg)) { + fOutput << fBuffer.GetString(); + fBuffer.Clear(); + } + if (!fBuffer.Test(msg)) + fOutput << msg; + else + fBuffer.Add(msg); + } + void Close() { fOutput << fBuffer.GetString(); } + + private: + TStream& fOutput; + TBuffer fBuffer; + }; + + typedef BufferedSink<std::ostream, StdBuffer> BufferedSinkStream; + + } // namespace sink +} // namespace corsika::logging + +#endif diff --git a/corsika/framework/logging/Logger.h b/corsika/framework/logging/Logger.h new file mode 100644 index 000000000..15ebe3c54 --- /dev/null +++ b/corsika/framework/logging/Logger.h @@ -0,0 +1,90 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +/** + @File Logger.h + + Everything around logfile generation and text output. + */ + +#ifndef _include_logger_h_ +#define _include_logger_h_ + +#include <iosfwd> +#include <sstream> +#include <string> +#include <typeinfo> + +#include <boost/format.hpp> + +#include <corsika/logging/BufferedSink.h> +#include <corsika/logging/MessageOff.h> +#include <corsika/logging/MessageOn.h> +#include <corsika/logging/NoSink.h> +#include <corsika/logging/Sink.h> + +namespace corsika::logging { + + /** + @class Logger + + Defines one stream to accept messages, and to wrote those into + TSink. The helper class MessageOn will convert input at + compile-time into message strings. The helper class MessageOff, + will just do nothing and will be optimized away at compile time. + */ + template <typename MSG = MessageOn, typename TSink = sink::NoSink> + class Logger : private MSG { + + using MSG::Message; + + public: + // Logger() : fName("") {} + Logger(const std::string color, const std::string name, TSink& sink) + : fSink(sink) + , fName(color + "[" + name + "]\033[39m ") {} + ~Logger() { fSink.Close(); } + // Logger(const Logger&) = delete; + + /** + Function to add string-concatenation of all inputs to output + sink. + */ + template <typename... Strings> + void Log(const Strings&... inputs) { + fSink << MSG::Message(inputs...); + } + + const std::string& GetName() const { return fName; } + + private: + TSink& fSink; + std::string fName; + }; + +} // namespace corsika::logging + +/** + * @def LOG(...) + * + * This is the main interface to the logging facilities. If Logger + * object are defined (e.g. log1) use as + * @example LOG(log1, "var1=", variable1int, "var2=", variabl2double) + * for arbitrary long sequence + * of arguments. This may also include boost::format objects the + * output is concatenated, if log1 is switched off at compile time, + * the whole LOG command is optimized away by the compiler. + */ + +#define LOG(__LOGGER, ...) \ + __LOGGER.Log(__LOGGER.GetName(), __FILE__, ":", __LINE__, " (", __func__, ") -> ", \ + __VA_ARGS__); + +#endif diff --git a/corsika/framework/logging/MessageOff.h b/corsika/framework/logging/MessageOff.h new file mode 100644 index 000000000..691824be0 --- /dev/null +++ b/corsika/framework/logging/MessageOff.h @@ -0,0 +1,30 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#ifndef _include_MessageOff_h_ +#define _include_MessageOff_h_ + +namespace corsika::logging { + + /** + Helper class to ignore all arguments to MessagesOn::Message and + always return empty string "". + */ + class MessageOff { + protected: + template <typename First, typename... Strings> + std::string Message(const First&, const Strings&...) { + return ""; + } + }; + +} // namespace corsika::logging + +#endif diff --git a/corsika/framework/logging/MessageOn.h b/corsika/framework/logging/MessageOn.h new file mode 100644 index 000000000..0b013a635 --- /dev/null +++ b/corsika/framework/logging/MessageOn.h @@ -0,0 +1,70 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#ifndef _include_MessageOn_h_ +#define _include_MessageOn_h_ + +namespace corsika::logging { + + /** + Helper class to convert all input arguments of MessageOn::Message + into string-concatenated version and return this as string. + */ + class MessageOn { + protected: + std::string Message() { return "\n"; } + + template <typename First, typename... Strings> + std::string Message(const First& arg, const Strings&... rest) { + std::ostringstream ss; + ss << arg << Message(rest...); + return ss.str(); + } + + template <typename... Strings> + std::string Message(const int& arg, const Strings&... rest) { + return std::to_string(arg) + Message(rest...); + } + + template <typename... Strings> + std::string Message(const double& arg, const Strings&... rest) { + return std::to_string(arg) + Message(rest...); + } + + template <typename... Strings> + std::string Message(char const* arg, const Strings&... rest) { + return std::string(arg) + Message(rest...); + } + + template <typename... Strings> + std::string Message(const std::string& arg, const Strings&... rest) { + return arg + Message(rest...); + } + + // ---------------------- + // boost format + template <typename... Strings> + std::string Message(const boost::format& fmt, const Strings&... rest) { + boost::format FMT(fmt); + return bformat(FMT, rest...); + } + + template <typename Arg, typename... Strings> + std::string bformat(boost::format& fmt, const Arg& arg, const Strings&... rest) { + fmt % arg; + return bformat(fmt, rest...); + } + + std::string bformat(boost::format& fmt) { return fmt.str() + "\n"; } + }; + +} // namespace corsika::logging + +#endif diff --git a/corsika/framework/logging/NoSink.h b/corsika/framework/logging/NoSink.h new file mode 100644 index 000000000..866d35601 --- /dev/null +++ b/corsika/framework/logging/NoSink.h @@ -0,0 +1,26 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#ifndef _include_NoSink_h_ +#define _include_NoSink_h_ + +namespace corsika::logging { + + namespace sink { + + struct NoSink { + inline void operator<<(const std::string&) {} + inline void Close() {} + }; + + } // namespace sink +} // namespace corsika::logging + +#endif diff --git a/corsika/framework/logging/Sink.h b/corsika/framework/logging/Sink.h new file mode 100644 index 000000000..28c768d6f --- /dev/null +++ b/corsika/framework/logging/Sink.h @@ -0,0 +1,47 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#ifndef _include_Sink_h_ +#define _include_Sink_h_ + +namespace corsika::logging { + + /** + a sink for the logger must implement the two functions + operator<<(const std::string&) + and + Close() + + See example: NoSink + */ + + namespace sink { + + /** + Definition of Sink for log output. + */ + template <typename TStream> + class Sink { + public: + Sink(TStream& out) + : fOutput(out) {} + void operator<<(const std::string& msg) { fOutput << msg; } + void Close() {} + + private: + TStream& fOutput; + }; + + typedef Sink<std::ostream> SinkStream; + + } // namespace sink +} // namespace corsika::logging + +#endif diff --git a/Framework/Random/ExponentialDistribution.h b/corsika/framework/random/ExponentialDistribution.hpp similarity index 69% rename from Framework/Random/ExponentialDistribution.h rename to corsika/framework/random/ExponentialDistribution.hpp index 2431e316e..d0d08be73 100644 --- a/Framework/Random/ExponentialDistribution.h +++ b/corsika/framework/random/ExponentialDistribution.hpp @@ -8,10 +8,14 @@ #pragma once -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <random> -namespace corsika::random { +namespace corsika { + //FIXME: This whole facility needs to re-designed. + //It is not parallel friendly neither polymorphic + //and the streaming management is prone to produce + //huge correlation between the streams template <class TQuantity> class ExponentialDistribution { @@ -30,4 +34,5 @@ namespace corsika::random { } }; -} // namespace corsika::random +} // namespace corsika + diff --git a/Framework/Random/RNGManager.h b/corsika/framework/random/RNGManager.hpp similarity index 76% rename from Framework/Random/RNGManager.h rename to corsika/framework/random/RNGManager.hpp index 0826642a8..7fc2d327a 100644 --- a/Framework/Random/RNGManager.h +++ b/corsika/framework/random/RNGManager.hpp @@ -8,32 +8,34 @@ #pragma once -#include <corsika/utl/Singleton.h> - #include <map> #include <random> #include <string> +#include <corsika/framework/utility/Singleton.hpp> /*! * With this class modules can register streams of random numbers. */ -namespace corsika::random { +namespace corsika { + + //FIXME: This while facility needs to re-designed. + //It is not parallel friendly neither polymorphic + //and the streaming management is prone to produce + //huge correlation between the streams using RNG = std::mt19937; //!< the actual RNG type that will be used - /*! - * Manage random number generators. - */ - class RNGManager final : public corsika::utl::Singleton<RNGManager> { + class RNGManager : public corsika::Singleton<RNGManager> { - friend class corsika::utl::Singleton<RNGManager>; + friend class corsika::Singleton<RNGManager>; std::map<std::string, RNG> rngs; std::map<std::string, std::seed_seq> seeds; protected: - RNGManager() {} + + RNGManager() {} // why ? public: /*! @@ -70,4 +72,6 @@ namespace corsika::random { void SeedAll(); //!< seed all currently registered streams with "real" randomness }; -} // namespace corsika::random +} // namespace corsika + +#include <corsika/detail/framework/random/RNGManager.inl> diff --git a/Framework/Random/UniformRealDistribution.h b/corsika/framework/random/UniformRealDistribution.hpp similarity index 73% rename from Framework/Random/UniformRealDistribution.h rename to corsika/framework/random/UniformRealDistribution.hpp index 0c63e8542..ce112acc4 100644 --- a/Framework/Random/UniformRealDistribution.h +++ b/corsika/framework/random/UniformRealDistribution.hpp @@ -8,9 +8,15 @@ #pragma once +#include <corsika/framework/core/PhysicalUnits.hpp> #include <random> -namespace corsika::random { +namespace corsika { + + //FIXME: This while facility needs to re-designed. + //It is not parallel friendly neither polymorphic + //and the streaming management is prone to produce + //huge correlation between the streams template <class TQuantity> class UniformRealDistribution { @@ -33,4 +39,5 @@ namespace corsika::random { } }; -} // namespace corsika::random +} // namespace corsika + diff --git a/Framework/ProcessSequence/BaseProcess.h b/corsika/framework/sequence/BaseProcess.hpp similarity index 78% rename from Framework/ProcessSequence/BaseProcess.h rename to corsika/framework/sequence/BaseProcess.hpp index c1a4e232e..a17b8faf6 100644 --- a/Framework/ProcessSequence/BaseProcess.h +++ b/corsika/framework/sequence/BaseProcess.hpp @@ -8,9 +8,10 @@ #pragma once -#include <corsika/process/ProcessReturn.h> // for convenience +#include <type_traits> +#include <corsika/framework/sequence/ProcessReturn.hpp> // for convenience -namespace corsika::process { +namespace corsika { class TDerived; // fwd decl @@ -42,4 +43,9 @@ namespace corsika::process { using TProcessType = TDerived; }; -} // namespace corsika::process + // overwrite the default trait class, to mark BaseProcess<T> as useful process + template <class T> + std::true_type is_process_impl(const BaseProcess<T>* impl); + +} // namespace corsika + diff --git a/Framework/ProcessSequence/BoundaryCrossingProcess.h b/corsika/framework/sequence/BoundaryCrossingProcess.hpp similarity index 61% rename from Framework/ProcessSequence/BoundaryCrossingProcess.h rename to corsika/framework/sequence/BoundaryCrossingProcess.hpp index 6526648a8..057d156bc 100644 --- a/Framework/ProcessSequence/BoundaryCrossingProcess.h +++ b/corsika/framework/sequence/BoundaryCrossingProcess.hpp @@ -8,12 +8,15 @@ #pragma once -#include <corsika/process/BaseProcess.h> -#include <corsika/process/ProcessReturn.h> +#include <corsika/media/Environment.hpp> +#include <corsika/framework/sequence/ProcessReturn.hpp> -#include <type_traits> +namespace corsika { -namespace corsika::process { + template <typename TDerived> + struct BoundaryCrossingProcess { + auto& GetRef() { return static_cast<TDerived&>(*this); } + auto const& GetRef() const { return static_cast<const TDerived&>(*this); } template <typename TDerived> class BoundaryCrossingProcess : public BaseProcess<TDerived> { @@ -29,4 +32,9 @@ namespace corsika::process { TVolumeNode const& to); }; -} // namespace corsika::process + template <class T> + std::true_type is_process_impl(BoundaryCrossingProcess<T> const* impl); + +} // namespace corsika + + diff --git a/Framework/ProcessSequence/ContinuousProcess.h b/corsika/framework/sequence/ContinuousProcess.hpp similarity index 74% rename from Framework/ProcessSequence/ContinuousProcess.h rename to corsika/framework/sequence/ContinuousProcess.hpp index c4138a755..ec20510db 100644 --- a/Framework/ProcessSequence/ContinuousProcess.h +++ b/corsika/framework/sequence/ContinuousProcess.hpp @@ -8,10 +8,10 @@ #pragma once -#include <corsika/process/BaseProcess.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/sequence/ProcessReturn.hpp> // for convenience -namespace corsika::process { +namespace corsika { /** \class ContinuousProcess @@ -37,4 +37,10 @@ namespace corsika::process { units::si::LengthType MaxStepLength(TParticle const& p, TTrack const& track) const; }; -} // namespace corsika::process + // overwrite the default trait class, to mark BaseProcess<T> as useful process + template <class T> + std::true_type is_process_impl(const ContinuousProcess<T>* impl); + +} // namespace corsika + + diff --git a/Framework/ProcessSequence/DecayProcess.h b/corsika/framework/sequence/DecayProcess.hpp similarity index 84% rename from Framework/ProcessSequence/DecayProcess.h rename to corsika/framework/sequence/DecayProcess.hpp index 09ba80743..5b238fda5 100644 --- a/Framework/ProcessSequence/DecayProcess.h +++ b/corsika/framework/sequence/DecayProcess.hpp @@ -8,10 +8,13 @@ #pragma once -#include <corsika/process/BaseProcess.h> -#include <corsika/units/PhysicalUnits.h> +#include <type_traits> -namespace corsika::process { +#include <corsika/setup/SetupTrajectory.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include "corsika/framework/sequence/ProcessReturn.hpp" // for convenience + +namespace corsika { /** \class DecayProcess @@ -46,4 +49,4 @@ namespace corsika::process { }*/ }; -} // namespace corsika::process +} // namespace corsika diff --git a/Framework/ProcessSequence/InteractionProcess.h b/corsika/framework/sequence/InteractionProcess.hpp similarity index 73% rename from Framework/ProcessSequence/InteractionProcess.h rename to corsika/framework/sequence/InteractionProcess.hpp index e70729db8..153364e30 100644 --- a/Framework/ProcessSequence/InteractionProcess.h +++ b/corsika/framework/sequence/InteractionProcess.hpp @@ -8,10 +8,13 @@ #pragma once -#include <corsika/process/BaseProcess.h> -#include <corsika/units/PhysicalUnits.h> +#include <type_traits> -namespace corsika::process { +#include <corsika/setup/SetupTrajectory.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/sequence/ProcessReturn.hpp> // for convenience + +namespace corsika { /** \class InteractionProcess @@ -42,4 +45,9 @@ namespace corsika::process { } }; -} // namespace corsika::process + // overwrite the default trait class, to mark BaseProcess<T> as useful process + template <class T> + std::true_type is_process_impl(const InteractionProcess<T>* impl); + +} // namespace corsika + diff --git a/Framework/ProcessSequence/ProcessReturn.h b/corsika/framework/sequence/ProcessReturn.hpp similarity index 69% rename from Framework/ProcessSequence/ProcessReturn.h rename to corsika/framework/sequence/ProcessReturn.hpp index c4e7d5890..e54877fab 100644 --- a/Framework/ProcessSequence/ProcessReturn.h +++ b/corsika/framework/sequence/ProcessReturn.hpp @@ -8,7 +8,7 @@ #pragma once -namespace corsika::process { +namespace corsika { /** since in a process sequence many status updates can accumulate @@ -39,20 +39,5 @@ namespace corsika::process { return (static_cast<int>(a) & static_cast<int>(b)) != 0; } - inline bool isOk(const EProcessReturn a) { - return static_cast<int>(a & EProcessReturn::eOk); - } - - inline bool isAbsorbed(const EProcessReturn a) { - return static_cast<int>(a & EProcessReturn::eParticleAbsorbed); - } - - inline bool isDecayed(const EProcessReturn a) { - return static_cast<int>(a & EProcessReturn::eDecayed); - } - - inline bool isInteracted(const EProcessReturn a) { - return static_cast<int>(a & EProcessReturn::eInteracted); - } +} // namespace corsika -} // namespace corsika::process diff --git a/corsika/framework/sequence/ProcessSequence.hpp b/corsika/framework/sequence/ProcessSequence.hpp new file mode 100644 index 000000000..4ef3effef --- /dev/null +++ b/corsika/framework/sequence/ProcessSequence.hpp @@ -0,0 +1,175 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <cmath> +#include <limits> +#include <type_traits> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/sequence/BaseProcess.hpp> +#include <corsika/framework/sequence/BoundaryCrossingProcess.hpp> +#include <corsika/framework/sequence/ContinuousProcess.hpp> +#include <corsika/framework/sequence/DecayProcess.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/framework/sequence/ProcessReturn.hpp> +#include <corsika/framework/sequence/SecondariesProcess.hpp> +#include <corsika/framework/sequence/StackProcess.hpp> + +namespace corsika { + + /** + * FIXME + \class ProcessSequence + + A compile time static list of processes. The compiler will + generate a new type based on template logic containing all the + elements provided by the user. + + TProcess1 and TProcess2 must both be derived from BaseProcess, + and are both references if possible (lvalue), otherwise (rvalue) + they are just classes. This allows us to handle both, rvalue as + well as lvalue Processes in the ProcessSequence. + + \comment Using CRTP pattern, + https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern + */ + template <typename TProcess1, typename TProcess2 = NullModel> + class ProcessSequence : public BaseProcess<ProcessSequence<TProcess1, TProcess2>> { + + using TProcess1type = typename std::decay_t<TProcess1>; + using TProcess2type = typename std::decay_t<TProcess2>; + + static bool constexpr t1ProcSeq = is_process_sequence_v<TProcess1type>; + static bool constexpr t2ProcSeq = is_process_sequence_v<TProcess2type>; + + static bool constexpr t1SwitchProcSeq = is_switch_process_sequence_v<TProcess1type>; + static bool constexpr t2SwitchProcSeq = is_switch_process_sequence_v<TProcess2type>; + + // make sure only BaseProcess types TProcess1/2 are passed + static_assert(std::is_base_of_v<BaseProcess<TProcess1type>, TProcess1type>, + "can only use process derived from BaseProcess in " + "ProcessSequence, for Process 1"); + static_assert(std::is_base_of_v<BaseProcess<TProcess2type>, TProcess2type>, + "can only use process derived from BaseProcess in " + "ProcessSequence, for Process 2"); + + TProcess1 A_; // this is a reference, if possible + TProcess2 B_; // this is a reference, if possible + + public: + ProcessSequence(TProcess1 in_A, TProcess2 in_B) + : A_(in_A) + , B_(in_B) {} + + // example for a trait-based call: + // void Hello() const { detail::CallHello<T1,T2>::Call(A, B); } + + template <typename Particle, typename VTNType> + EProcessReturn DoBoundaryCrossing(Particle& p, VTNType const& from, + VTNType const& to); + + template <typename TParticle, typename TTrack> + EProcessReturn DoContinuous(TParticle& vP, TTrack& vT) ; + + template <typename TSecondaries> + EProcessReturn DoSecondaries(TSecondaries& vS) ; + + /** + The processes of type StackProcess do have an internal counter, + so they can be exectuted only each N steps. Often these are + "maintenacne processes" that do not need to run after each + single step of the simulations. In the CheckStep function it is + tested if either A_ or B_ are StackProcess and if they are due + for execution. + */ + bool CheckStep() ; + + /** + Execute the StackProcess-es in the ProcessSequence + */ + template <typename TStack> + EProcessReturn DoStack(TStack& vS); + + template <typename TParticle, typename TTrack> + corsika::units::si::LengthType MaxStepLength(TParticle& vP, TTrack& vTrack) ; + template <typename TParticle> + corsika::units::si::GrammageType GetTotalInteractionLength(TParticle& vP); + + template <typename TParticle> + inline corsika::units::si::InverseGrammageType GetTotalInverseInteractionLength( + TParticle& vP) ; + + template <typename TParticle> + inline corsika::units::si::InverseGrammageType GetInverseInteractionLength(TParticle& vP) ; + + template <typename TParticle, typename TSecondaries> + EProcessReturn SelectInteraction( + TParticle& vP, TSecondaries& vS, + [[maybe_unused]] corsika::units::si::InverseGrammageType lambda_select, + corsika::units::si::InverseGrammageType& lambda_inv_count); + + template <typename TParticle> + corsika::units::si::TimeType GetTotalLifetime(TParticle& p) ; + + template <typename TParticle> + corsika::units::si::InverseTimeType GetTotalInverseLifetime(TParticle& p) ; + + template <typename TParticle> + corsika::units::si::InverseTimeType GetInverseLifetime(TParticle& p) ; + + // select decay process + template <typename TParticle, typename TSecondaries> + EProcessReturn SelectDecay( + TParticle& vP, TSecondaries& vS, + [[maybe_unused]] corsika::units::si::InverseTimeType decay_select, + corsika::units::si::InverseTimeType& decay_inv_count) ; + + void Init() { + A.Init(); + B.Init(); + } + }; + + /** + * \function sequence + * + * to construct ProcessSequences in a flexible and dynamic way the + * `sequence` factory functions are provided + * + * Any objects of type + * - BaseProcess, + * - ContinuousProcess, and + * - Interaction/DecayProcess, + * - StackProcess, + * - SecondariesProcess + * can be assembled into a ProcessSequence, all + * combinatorics are allowed. + + * The sequence function checks that all its arguments are all of + * types derived from BaseProcess. Also the ProcessSequence itself + * is derived from type BaseProcess + **/ + + template <typename... TProcesses, typename TProcess1> + inline typename std::enable_if_t< + std::is_base_of_v<BaseProcess<typename std::decay_t<TProcess1>>, + typename std::decay_t<TProcess1>>, + ProcessSequence<TProcess1, decltype(sequence(std::declval<TProcesses>()...))>> + sequence(TProcess1&& vA, TProcesses&&... vBs) { + return ProcessSequence<TProcess1, decltype(sequence(std::declval<TProcesses>()...))>( + vA, sequence(std::forward<TProcesses>(vBs)...)); + } + + /// marker to identify objectas ProcessSequence + template <typename A, typename B> + struct is_process_sequence<corsika::ProcessSequence<A, B>> : std::true_type {}; + +} // namespace corsika + +#include<corsika/detail/framework/sequence/ProcessSequence.inl> diff --git a/Framework/ProcessSequence/ProcessSignature.h b/corsika/framework/sequence/ProcessSignature.hpp similarity index 99% rename from Framework/ProcessSequence/ProcessSignature.h rename to corsika/framework/sequence/ProcessSignature.hpp index 346e8a33c..56148548a 100644 --- a/Framework/ProcessSequence/ProcessSignature.h +++ b/corsika/framework/sequence/ProcessSignature.hpp @@ -24,3 +24,4 @@ } // FORCE_SIGNATURE(thisMustBeDefined, T::thisMustBeDefined, int(*)(void)); + diff --git a/Framework/ProcessSequence/SecondariesProcess.h b/corsika/framework/sequence/SecondariesProcess.hpp similarity index 66% rename from Framework/ProcessSequence/SecondariesProcess.h rename to corsika/framework/sequence/SecondariesProcess.hpp index a9bc3832a..ecedb02e5 100644 --- a/Framework/ProcessSequence/SecondariesProcess.h +++ b/corsika/framework/sequence/SecondariesProcess.hpp @@ -8,10 +8,11 @@ #pragma once -#include <corsika/process/BaseProcess.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/setup/SetupTrajectory.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/sequence/ProcessReturn.hpp> // for convenience -namespace corsika::process { +namespace corsika { /** \class SecondariesProcess @@ -31,4 +32,9 @@ namespace corsika::process { inline void DoSecondaries(TSecondaries&); }; -} // namespace corsika::process + // overwrite the default trait class, to mark BaseProcess<T> as useful process + template <class T> + std::true_type is_process_impl(const SecondariesProcess<T>* impl); + +} // namespace corsika + diff --git a/Framework/ProcessSequence/StackProcess.h b/corsika/framework/sequence/StackProcess.hpp similarity index 76% rename from Framework/ProcessSequence/StackProcess.h rename to corsika/framework/sequence/StackProcess.hpp index ce5c0998d..6e503d68a 100644 --- a/Framework/ProcessSequence/StackProcess.h +++ b/corsika/framework/sequence/StackProcess.hpp @@ -8,10 +8,11 @@ #pragma once -#include <corsika/process/BaseProcess.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/setup/SetupTrajectory.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/sequence/ProcessReturn.hpp> // for convenience -namespace corsika::process { +namespace corsika { /** \class StackProcess @@ -51,4 +52,8 @@ namespace corsika::process { //! @} }; -} // namespace corsika::process + // overwrite the default trait class, to mark BaseProcess<T> as useful process + template <class T> + std::true_type is_process_impl(const StackProcess<T>* impl); + +} // namespace corsika diff --git a/Framework/StackInterface/CombinedStack.h b/corsika/framework/stack/CombinedStack.hpp similarity index 59% rename from Framework/StackInterface/CombinedStack.h rename to corsika/framework/stack/CombinedStack.hpp index d8cecfd57..8bbe41e6d 100644 --- a/Framework/StackInterface/CombinedStack.h +++ b/corsika/framework/stack/CombinedStack.hpp @@ -8,12 +8,11 @@ #pragma once -#include <corsika/logging/Logging.h> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/stack/Stack.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/stack/Stack.hpp> -namespace corsika::stack { +namespace corsika { /** * @class CombinedParticleInterface @@ -38,6 +37,12 @@ namespace corsika::stack { class CombinedParticleInterface : public ParticleInterfaceB<ParticleInterfaceA<StackIterator>> { + //FIXME: class has no ctors, assignment operators etc. + + // template<template <typename> typename _PI> + // template <typename StackDataType, template <typename> typename ParticleInterface> + // template<typename T1, template <typename> typename T2> friend class Stack<T1, T2>; + using PI_C = CombinedParticleInterface<ParticleInterfaceA, ParticleInterfaceB, StackIterator>; using PI_A = ParticleInterfaceA<StackIterator>; @@ -65,28 +70,17 @@ namespace corsika::stack { */ template <typename... Args1> - void SetParticleData(const std::tuple<Args1...> vA) { - PI_A::SetParticleData(vA); - PI_B::SetParticleData(); - } + void SetParticleData(const std::tuple<Args1...> vA) ; + template <typename... Args1, typename... Args2> - void SetParticleData(const std::tuple<Args1...> vA, const std::tuple<Args2...> vB) { - PI_A::SetParticleData(vA); - PI_B::SetParticleData(vB); - } + void SetParticleData(const std::tuple<Args1...> vA, const std::tuple<Args2...> vB) ; template <typename... Args1> - void SetParticleData(PI_C& p, const std::tuple<Args1...> vA) { - // static_assert(MT<I>::has_not, "error"); - PI_A::SetParticleData(static_cast<PI_A&>(p), vA); // original stack - PI_B::SetParticleData(static_cast<PI_B&>(p)); // addon stack - } + void SetParticleData(PI_C& p, const std::tuple<Args1...> vA) ; + template <typename... Args1, typename... Args2> void SetParticleData(PI_C& p, const std::tuple<Args1...> vA, - const std::tuple<Args2...> vB) { - PI_A::SetParticleData(static_cast<PI_A&>(p), vA); - PI_B::SetParticleData(static_cast<PI_B&>(p), vB); - } + const std::tuple<Args2...> vB) ; ///@} std::string as_string() const { @@ -94,6 +88,8 @@ namespace corsika::stack { } }; + namespace detail { + /** * @class CombinedStackImpl * @@ -104,54 +100,9 @@ namespace corsika::stack { * access to the combined number of data entries. */ template <typename Stack1Impl, typename Stack2Impl> - class CombinedStackImpl : public Stack1Impl, public Stack2Impl { - - public: - void Clear() { - Stack1Impl::Clear(); - Stack2Impl::Clear(); - } - - unsigned int GetSize() const { return Stack1Impl::GetSize(); } - unsigned int GetCapacity() const { return Stack1Impl::GetCapacity(); } + class CombinedStackImpl ; - /** - * Function to copy particle at location i1 in stack to i2 - */ - void Copy(const unsigned int i1, const unsigned int i2) { - if (i1 >= GetSize() || i2 >= GetSize()) { - std::ostringstream err; - err << "CombinedStack: trying to access data beyond size of stack!"; - throw std::runtime_error(err.str()); - } - Stack1Impl::Copy(i1, i2); - Stack2Impl::Copy(i1, i2); - } - - /** - * Function to copy particle at location i2 in stack to i1 - */ - void Swap(const unsigned int i1, const unsigned int i2) { - if (i1 >= GetSize() || i2 >= GetSize()) { - std::ostringstream err; - err << "CombinedStack: trying to access data beyond size of stack!"; - throw std::runtime_error(err.str()); - } - Stack1Impl::Swap(i1, i2); - Stack2Impl::Swap(i1, i2); - } - - void IncrementSize() { - Stack1Impl::IncrementSize(); - Stack2Impl::IncrementSize(); - } - - void DecrementSize() { - Stack1Impl::DecrementSize(); - Stack2Impl::DecrementSize(); - } - - }; // end class CombinedStackImpl +} // namespace detail /** * Helper template alias `CombinedStack` to construct new combined @@ -163,6 +114,8 @@ namespace corsika::stack { */ template <typename Stack1Impl, typename Stack2Impl, template <typename> typename _PI> - using CombinedStack = Stack<CombinedStackImpl<Stack1Impl, Stack2Impl>, _PI>; + using CombinedStack = Stack<detail::CombinedStackImpl<Stack1Impl, Stack2Impl>, _PI>; + +} // namespace corsika -} // namespace corsika::stack +#include <corsika/detail/framework/stack/CombinedStack.inl> diff --git a/Framework/StackInterface/ParticleBase.h b/corsika/framework/stack/ParticleBase.hpp similarity index 98% rename from Framework/StackInterface/ParticleBase.h rename to corsika/framework/stack/ParticleBase.hpp index 1bf7d0ad8..067f54afb 100644 --- a/Framework/StackInterface/ParticleBase.h +++ b/corsika/framework/stack/ParticleBase.hpp @@ -8,7 +8,9 @@ #pragma once -namespace corsika::stack { +#include <type_traits> + +namespace corsika { /** @class ParticleBase @@ -105,4 +107,4 @@ namespace corsika::stack { ///@} }; -} // namespace corsika::stack +} // namespace corsika diff --git a/Framework/StackInterface/SecondaryView.h b/corsika/framework/stack/SecondaryView.hpp similarity index 79% rename from Framework/StackInterface/SecondaryView.h rename to corsika/framework/stack/SecondaryView.hpp index 709a8c4fe..a45a6d4fc 100644 --- a/Framework/StackInterface/SecondaryView.h +++ b/corsika/framework/stack/SecondaryView.hpp @@ -8,14 +8,13 @@ #pragma once -#include <corsika/stack/Stack.h> - -#include <corsika/logging/Logging.h> - #include <stdexcept> #include <vector> +#include <type_traits> +#include <corsika/framework/stack/Stack.hpp> +#include <corsika/framework/stack/StackIteratorInterface.hpp> -namespace corsika::stack { +namespace corsika { // forward-decl: template <class T1, template <class> class T2> @@ -196,11 +195,7 @@ namespace corsika::stack { * Method to add a new secondary particle on this SecondaryView */ template <typename... Args> - StackIterator AddSecondary(const Args... v) { - C8LOG_TRACE("SecondaryView::AddSecondary(Args&&)"); - StackIterator proj = GetProjectile(); // make this const - return AddSecondary(proj, v...); - } + auto AddSecondary(const Args... v) ; protected: /** @@ -213,24 +208,7 @@ namespace corsika::stack { * StackIterator::AddSecondary via ParticleBase */ template <typename... Args> - StackIterator AddSecondary(StackIterator& proj, const Args... v) { - C8LOG_TRACE("SecondaryView::AddSecondary(StackIterator&, Args&&)"); - // make space on stack - InnerStackTypeRef::GetStackData().IncrementSize(); - inner_stack_.deleted_.push_back(false); - // get current number of secondaries on stack - const unsigned int idSec = getSize(); - // determine index on (inner) stack where new particle will be located - const unsigned int index = InnerStackTypeRef::GetStackData().GetSize() - 1; - indices_.push_back(index); - // NOTE: "+1" is since "0" is special marker here for PROJECTILE, see - // GetIndexFromIterator - auto sec = StackIterator(*this, idSec + 1, proj, v...); - MSecondaryProducer<StackDataType, ParticleInterface>::new_secondary(sec); - return sec; - } - - public: + auto AddSecondary(StackIterator& proj, const Args... v) ; /** * overwrite Stack::GetSize to return actual number of secondaries */ @@ -327,27 +305,13 @@ namespace corsika::stack { * remove the last particle. * */ - void Delete(StackIterator p) { - C8LOG_TRACE("SecondaryView::Delete"); - if (IsEmpty()) { /*error*/ - throw std::runtime_error("Stack, cannot delete entry since size is zero"); - } - if (isDeleted(p.GetIndex() - 1)) { /*error*/ - throw std::runtime_error("Stack, cannot delete entry since already deleted"); - } - inner_stack_.Delete(GetIndexFromIterator(p.GetIndex())); - InnerStackTypeRef::nDeleted_++; // also count in SecondaryView - } + inline void Delete(StackIterator p); /** * return next particle from stack, need to overwrtie Stack::GetNextParticle to get * right reference */ - StackIterator GetNextParticle() { - while (purgeLastIfDeleted()) {} - return last(); - } - + inline void Delete(ParticleInterfaceType p) ; /** * check if this particle was already deleted * @@ -361,24 +325,14 @@ namespace corsika::stack { /** * delete this particle */ - bool isDeleted(const ParticleInterfaceType& p) const { - return isDeleted(p.GetIterator()); - } + inline void DeleteLast() ; /** * Function to ultimatively remove the last entry from the stack, * if it was marked as deleted before. If this is not the case, * the function will just return false and do nothing. */ - bool purgeLastIfDeleted() { - C8LOG_TRACE("SecondaryView::purgeLastIfDeleted"); - if (!isDeleted(getSize() - 1)) - return false; // the last particle is not marked for deletion. Do nothing. - inner_stack_.purge(GetIndexFromIterator(getSize())); - InnerStackTypeRef::nDeleted_--; - indices_.pop_back(); - return true; - } + inline StackIterator GetNextParticle() { return last(); } /** * Function to ultimatively remove all entries from the stack @@ -388,34 +342,7 @@ namespace corsika::stack { * "gaps" in the stack are filled with entries from the back * (copied). */ - void purge() { - unsigned int iStack = 0; - unsigned int size = getSize(); - while (iStack < size) { - if (isDeleted(iStack)) { - inner_stack_.purge(iStack); - indices_.erase(indices_.begin() + iStack); - } - size = getSize(); - iStack++; - } - InnerStackTypeRef::nDeleted_ = 0; - } - - std::string as_string() const { - std::string str(fmt::format("size {}\n", getSize())); - // we make our own begin/end since we want ALL entries - std::string new_line = " "; - for (unsigned int iPart = 0; iPart != getSize(); ++iPart) { - ConstStackIterator itPart(*this, iPart); - str += fmt::format( - "{}{}{}", new_line, itPart.as_string(), - (inner_stack_.deleted_[GetIndexFromIterator(itPart.GetIndex())] ? " [deleted]" - : "")); - new_line = "\n "; - } - return str; - } + inline bool IsEmpty() { return GetSize() == 0; } protected: // forward to inner stack @@ -430,13 +357,7 @@ namespace corsika::stack { * function the conversion form iterator-index to stack-index is * performed. */ - unsigned int GetIndexFromIterator(const unsigned int vI) const { - // this is too much: C8LOG_TRACE("SecondaryView::GetIndexFromIterator({})={}", vI, - // (vI?indices_[vI-1]:projectile_index_)); - if (vI == 0) return projectile_index_; - return indices_[vI - 1]; - } - }; + inline unsigned int GetIndexFromIterator(const unsigned int vI) const; /** * Class to handle the generation of new secondaries. Used as default mix-in for @@ -489,9 +410,10 @@ namespace corsika::stack { class MSecondaryProducer = corsika::stack::DefaultSecondaryProducer, template <typename> typename MPIType_ = TStack::template MPIType> struct MakeView { - using type = corsika::stack::SecondaryView<typename TStack::StackImpl, MPIType_, - MSecondaryProducer>; + using type = corsika::SecondaryView<typename S::StackImpl, _PIType>; }; #endif -} // namespace corsika::stack +} // namespace corsika + +#include <corsika/detail/framework/stack/SecondaryView.inl> diff --git a/Framework/StackInterface/Stack.h b/corsika/framework/stack/Stack.hpp similarity index 92% rename from Framework/StackInterface/Stack.h rename to corsika/framework/stack/Stack.hpp index 85ec6418f..4f20d4a7e 100644 --- a/Framework/StackInterface/Stack.h +++ b/corsika/framework/stack/Stack.hpp @@ -8,19 +8,20 @@ #pragma once -#include <corsika/logging/Logging.h> -#include <corsika/stack/StackIteratorInterface.h> -#include <corsika/utl/MetaProgramming.h> - +#include <corsika/framework/stack/StackIteratorInterface.hpp> +// must be after StackIteratorInterface #include <stdexcept> #include <string> #include <vector> +#include <corsika/framework/utility/MetaProgramming.hpp> +#include <corsika/framework/stack/SecondaryView.hpp> + /** All classes around management of particles on a stack. */ -namespace corsika::stack { +namespace corsika { /** This is just a forward declatation for the user-defined @@ -71,11 +72,9 @@ namespace corsika::stack { * if TStackData is a reference member we *HAVE* to initialize * it in the constructor, this is typically needed for SecondaryView */ - template <typename _ = TStackData, typename = utl::enable_if<std::is_reference<_>>> - Stack(TStackData vD) - : data_(vD) - , deleted_(std::vector<bool>(data_.GetSize(), false)) - , nDeleted_(0) {} + template <typename _ = StackDataType, typename = corsika::enable_if<std::is_reference<_>>> + Stack(StackDataType vD) + : fData(vD) {} /** * This constructor takes any argument and passes it on to the @@ -86,12 +85,10 @@ namespace corsika::stack { * stacks, where the inner data container is always a reference * and cannot be initialized here. */ - template <typename... TArgs, typename _ = TStackData, - typename = utl::disable_if<std::is_reference<_>>> - Stack(TArgs... args) - : data_(args...) - , deleted_(std::vector<bool>(data_.GetSize(), false)) - , nDeleted_(0) {} + template <typename... Args, typename _ = StackDataType, + typename = corsika::disable_if<std::is_reference<_>>> + Stack(Args... args) + : fData(args...) {} public: typedef TStackData @@ -141,15 +138,17 @@ namespace corsika::stack { * @name Most generic proxy methods for TStackData data_ * @{ */ - unsigned int GetCapacity() const { return data_.GetCapacity(); } - unsigned int getDeleted() const { return nDeleted_; } - unsigned int getEntries() const { return getSize() - getDeleted(); } + unsigned int GetCapacity() const { return fData.GetCapacity(); } + unsigned int GetSize() const { return fData.GetSize(); } - template <typename... TArgs> - void Clear(TArgs... args) { - data_.Clear(args...); - deleted_ = std::vector<bool>(data_.GetSize(), false); - nDeleted_ = 0; + template <typename... Args> + auto Init(Args... args) { + return fData.Init(args...); + } + + template <typename... Args> + auto Clear(Args... args) { + return fData.Clear(args...); } ///@} @@ -409,4 +408,6 @@ namespace corsika::stack { ///@} }; -} // namespace corsika::stack +} // namespace corsika + + diff --git a/Framework/StackInterface/StackIteratorInterface.h b/corsika/framework/stack/StackIteratorInterface.hpp similarity index 92% rename from Framework/StackInterface/StackIteratorInterface.h rename to corsika/framework/stack/StackIteratorInterface.hpp index 6c4901084..d72586239 100644 --- a/Framework/StackInterface/StackIteratorInterface.h +++ b/corsika/framework/stack/StackIteratorInterface.hpp @@ -8,14 +8,9 @@ #pragma once -#include <corsika/stack/ParticleBase.h> +#include <corsika/framework/stack/ParticleBase.hpp> -namespace corsika::history { - template <typename T, template <typename> typename ParticleInterface> - class HistorySecondaryProducer; // forward decl. -} - -namespace corsika::stack { +namespace corsika { template <typename TStackData, template <typename> typename TParticleInterface> class Stack; // forward decl @@ -63,8 +58,8 @@ namespace corsika::stack { vIndex). For two examples see stack_example.cc, or the - corsika::processes::sibyll::SibStack class - **/ + corsikaes::sibyll::SibStack class + */ template <typename TStackData, template <typename> typename TParticleInterface, typename StackType = Stack<TStackData, TParticleInterface>> @@ -74,8 +69,8 @@ namespace corsika::stack { public: using ParticleInterfaceType = - TParticleInterface<corsika::stack::StackIteratorInterface< - TStackData, TParticleInterface, StackType>>; + ParticleInterface<corsika::StackIteratorInterface< + StackDataType, ParticleInterface, StackType>>; // friends are needed for access to protected methods friend class Stack<TStackData, @@ -360,20 +355,5 @@ namespace corsika::stack { ///@} }; // end class ConstStackIterator - template <typename TStackData, template <typename> typename TParticleInterface, - typename StackType> - bool StackIteratorInterface<TStackData, TParticleInterface, StackType>::operator==( - const ConstStackIteratorInterface<TStackData, TParticleInterface, StackType>& rhs) - const { - return index_ == rhs.index_; - } - - template <typename TStackData, template <typename> typename TParticleInterface, - typename StackType> - bool StackIteratorInterface<TStackData, TParticleInterface, StackType>::operator!=( - const ConstStackIteratorInterface<TStackData, TParticleInterface, StackType>& rhs) - const { - return index_ != rhs.index_; - } +} // namespace corsika -} // namespace corsika::stack diff --git a/Framework/Utilities/Bit.h b/corsika/framework/utility/Bit.hpp similarity index 97% rename from Framework/Utilities/Bit.h rename to corsika/framework/utility/Bit.hpp index 1443ddf9b..94faa5dc7 100644 --- a/Framework/Utilities/Bit.h +++ b/corsika/framework/utility/Bit.hpp @@ -21,7 +21,7 @@ // #include <utl/AugerException.h> -namespace corsika::utl { +namespace corsika { namespace Bit { @@ -88,4 +88,5 @@ namespace corsika::utl { return Bit::Array<T>(target); } -} // namespace corsika::utl +} // namespace corsika + diff --git a/corsika/framework/utility/COMBoost.hpp b/corsika/framework/utility/COMBoost.hpp new file mode 100644 index 000000000..04232fe6e --- /dev/null +++ b/corsika/framework/utility/COMBoost.hpp @@ -0,0 +1,52 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <iostream> + +#include <Eigen/Dense> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/CoordinateSystem.hpp> +#include <corsika/framework/geometry/FourVector.hpp> + +namespace corsika { + + /** + This utility class handles Lorentz boost between different + referenence frames, using FourVectors. + */ + + class COMBoost { + Eigen::Matrix3d fRotation; + Eigen::Matrix2d fBoost, fInverseBoost; + corsika::CoordinateSystem const& fCS; + + public: + //! construct a COMBoost given four-vector of prjectile and mass of target + COMBoost( + const corsika::FourVector< + corsika::units::si::HEPEnergyType, + corsika::Vector<corsika::units::si::hepmomentum_d>>& Pprojectile, + const corsika::units::si::HEPEnergyType massTarget); + + auto const& GetRotationMatrix() const; + + //! transforms a 4-momentum from lab frame to the center-of-mass frame + template <typename FourVector> + FourVector toCoM(const FourVector& p) const ; + + //! transforms a 4-momentum from the center-of-mass frame back to lab frame + template <typename FourVector> + FourVector fromCoM(const FourVector& p) const ; + }; +} // namespace corsika + +#include <corsika/detail/framework/utility/COMBoost.inl> diff --git a/Framework/Utilities/CorsikaFenv.h b/corsika/framework/utility/CorsikaFenv.hpp similarity index 100% rename from Framework/Utilities/CorsikaFenv.h rename to corsika/framework/utility/CorsikaFenv.hpp diff --git a/Framework/Utilities/MetaProgramming.h b/corsika/framework/utility/MetaProgramming.hpp similarity index 77% rename from Framework/Utilities/MetaProgramming.h rename to corsika/framework/utility/MetaProgramming.hpp index 689357769..9bd9688b4 100644 --- a/Framework/Utilities/MetaProgramming.h +++ b/corsika/framework/utility/MetaProgramming.hpp @@ -16,14 +16,14 @@ Tools to emulate conditional compilation of method overloads. ``` - #include <corsika/utl/MetaProgramming.h> + #include <corsika/framework/utility/MetaProgramming.h> template <class T> struct Foo { - template <class U, class = corsika::utl::enable_if<std::reference<U>>> + template <class U, class = corsika::enable_if<std::reference<U>>> void enable_only_if_U_is_reference(U x) {} - template <class _ = T, class = corsika::utl::disable_if<std::reference<_>>> + template <class _ = T, class = corsika::disable_if<std::reference<_>>> void enable_only_if_T_is_not_reference() {} }; ``` @@ -31,12 +31,12 @@ To combine traits, use boost::mp11::mp_and or boost::mp11::mp_or. ``` - #include <corsika/utl/MetaProgramming.h> + #include <corsika/framework/utility/MetaProgramming.h> #include <boost/mp11.hpp> template <class T> struct Foo { - template <class U, class = corsika::utl::enable_if< + template <class U, class = corsika::enable_if< boost::mp11::mp_and<std::is_reference<T>, std::is_const<T>> > void enable_only_if_U_is_const_reference(U x) {} @@ -51,10 +51,11 @@ } */ -namespace corsika::utl { +namespace corsika { template <class Trait> using enable_if = typename std::enable_if<(Trait::value == true)>::type; template <class Trait> using disable_if = typename std::enable_if<(Trait::value == false)>::type; -} // namespace corsika::utl +} // namespace corsika + diff --git a/Framework/Utilities/Singleton.h b/corsika/framework/utility/Singleton.hpp similarity index 93% rename from Framework/Utilities/Singleton.h rename to corsika/framework/utility/Singleton.hpp index 68667df8d..801c3f5e5 100644 --- a/Framework/Utilities/Singleton.h +++ b/corsika/framework/utility/Singleton.hpp @@ -10,7 +10,7 @@ //#define OFFLINE_USE_GAMMA_SINGLETON -namespace corsika::utl { +namespace corsika { /** * \class Singleton Singleton.h utl/Singleton.h * @@ -18,7 +18,7 @@ namespace corsika::utl { * * The singleton class is implemented as follows * \code - * #include <utl/Singleton.h> + * #include <utl/Singleton.hpp> * * class SomeClass : public utl::Singleton<SomeClass> { * ... @@ -55,4 +55,5 @@ namespace corsika::utl { ~Singleton() {} }; -} // namespace corsika::utl +} // namespace corsika + diff --git a/Framework/Utilities/COMBoost.cc b/corsika/framework/utility/detail/COMBoost.cc similarity index 100% rename from Framework/Utilities/COMBoost.cc rename to corsika/framework/utility/detail/COMBoost.cc diff --git a/corsika/framework/utility/detail/COMBoost.inl b/corsika/framework/utility/detail/COMBoost.inl new file mode 100644 index 000000000..95ac32b4b --- /dev/null +++ b/corsika/framework/utility/detail/COMBoost.inl @@ -0,0 +1,125 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/CoordinateSystem.hpp> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/utility/sgn.hpp> +#include <Eigen/Dense> +#include "../../core/PhysicalUnits.hpp" + +namespace corsika::utl { + + auto const& COMBoost::GetRotationMatrix() const { return fRotation; } + + //! transforms a 4-momentum from lab frame to the center-of-mass frame + template <typename FourVector> + FourVector COMBoost::toCoM(const FourVector& p) const { + using namespace corsika::units::si; + auto pComponents = p.GetSpaceLikeComponents().GetComponents(rotatedCS_); + Eigen::Vector3d eVecRotated = pComponents.eVector; + Eigen::Vector2d lab; + + lab << (p.GetTimeLikeComponent() * (1 / 1_GeV)), + (eVecRotated(2) * (1 / 1_GeV).magnitude()); + + auto const boostedZ = boost_ * lab; + auto const E_CoM = boostedZ(0) * 1_GeV; + + eVecRotated(2) = boostedZ(1) * (1_GeV).magnitude(); + + return FourVector( + E_CoM, corsika::geometry::Vector<hepmomentum_d>(rotatedCS_, eVecRotated)); + } + + //! transforms a 4-momentum from the center-of-mass frame back to lab frame + template <typename FourVector> + FourVector COMBoost::fromCoM(const FourVector& p) const { + using namespace corsika::units::si; + auto pCM = p.GetSpaceLikeComponents().GetComponents(rotatedCS_); + auto const Ecm = p.GetTimeLikeComponent(); + + Eigen::Vector2d com; + com << (Ecm * (1 / 1_GeV)), (pCM.eVector(2) * (1 / 1_GeV).magnitude()); + + C8LOG_TRACE( + "COMBoost::fromCoM Ecm={} GeV" + " pcm={} GeV (norm = {} GeV), invariant mass={} GeV", + Ecm / 1_GeV, pCM / 1_GeV, pCM.norm() / 1_GeV, p.GetNorm() / 1_GeV); + + auto const boostedZ = inverseBoost_ * com; + auto const E_lab = boostedZ(0) * 1_GeV; + + pCM.eVector(2) = boostedZ(1) * (1_GeV).magnitude(); + + geometry::Vector<typename decltype(pCM)::dimension> pLab{rotatedCS_, pCM}; + pLab.rebase(originalCS_); + + FourVector f(E_lab, pLab); + + C8LOG_TRACE("COMBoost::fromCoM --> Elab={} GeV", + " plab={} GeV (norm={} GeV) " + " GeV), invariant mass = {}", + E_lab / 1_GeV, f.GetNorm() / 1_GeV, pLab.GetComponents(), + pLab.norm() / 1_GeV); + + return f; + } + + COMBoost::COMBoost(FourVector<HEPEnergyType, Vector<hepmomentum_d>> const& Pprojectile, + const HEPMassType massTarget) + : fCS(Pprojectile.GetSpaceLikeComponents().GetCoordinateSystem()) { + auto const pProjectile = Pprojectile.GetSpaceLikeComponents(); + auto const pProjNorm = pProjectile.norm(); + auto const a = (pProjectile / pProjNorm).GetComponents().eVector; + auto const a1 = a(0), a2 = a(1); + + auto const s = sgn(a(2)); + auto const c = 1 / (1 + s * a(2)); + + Eigen::Matrix3d A, B; + + if (s > 0) { + A << 1, 0, -a1, // comment to prevent clang-format + 0, 1, -a2, // . + a1, a2, 1; // . + B << -a1 * a1 * c, -a1 * a2 * c, 0, // . + -a1 * a2 * c, -a2 * a2 * c, 0, // . + 0, 0, -(a1 * a1 + a2 * a2) * c; // . + + } else { + A << 1, 0, a1, // comment to prevent clang-format + 0, -1, -a2, // . + a1, a2, -1; // . + B << -a1 * a1 * c, -a1 * a2 * c, 0, // . + +a1 * a2 * c, +a2 * a2 * c, 0, // . + 0, 0, (a1 * a1 + a2 * a2) * c; // . + } + + fRotation = A + B; + + // calculate boost + double const beta = pProjNorm / (Pprojectile.GetTimeLikeComponent() + massTarget); + + /* Accurracy matters here, beta = 1 - epsilon for ultra-relativistic boosts */ + double const coshEta = 1 / std::sqrt((1 + beta) * (1 - beta)); + //~ double const coshEta = 1 / std::sqrt((1-beta*beta)); + double const sinhEta = -beta * coshEta; + + std::cout << "COMBoost (1-beta)=" << 1 - beta << " gamma=" << coshEta << std::endl; + std::cout << " det = " << fRotation.determinant() - 1 << std::endl; + + fBoost << coshEta, sinhEta, sinhEta, coshEta; + + fInverseBoost << coshEta, -sinhEta, -sinhEta, coshEta; + } +} // namespace corsika::utl diff --git a/Framework/Utilities/CorsikaFenvDefault.cc b/corsika/framework/utility/detail/CorsikaFenvDefault.cc similarity index 100% rename from Framework/Utilities/CorsikaFenvDefault.cc rename to corsika/framework/utility/detail/CorsikaFenvDefault.cc diff --git a/Framework/Utilities/CorsikaFenvFallback.cc b/corsika/framework/utility/detail/CorsikaFenvFallback.inl similarity index 89% rename from Framework/Utilities/CorsikaFenvFallback.cc rename to corsika/framework/utility/detail/CorsikaFenvFallback.inl index 64327b2c7..ba847a3a0 100644 --- a/Framework/Utilities/CorsikaFenvFallback.cc +++ b/corsika/framework/utility/detail/CorsikaFenvFallback.inl @@ -6,7 +6,7 @@ * the license. */ -#include <corsika/utl/CorsikaFenv.h> +#include <corsika/framework/utility/CorsikaFenv.hpp> #include <cfenv> extern "C" { diff --git a/Framework/Utilities/sgn.h b/corsika/framework/utility/sgn.hpp similarity index 88% rename from Framework/Utilities/sgn.h rename to corsika/framework/utility/sgn.hpp index 2cc3a936b..e9e0f514d 100644 --- a/Framework/Utilities/sgn.h +++ b/corsika/framework/utility/sgn.hpp @@ -9,7 +9,7 @@ #pragma once -namespace corsika::utl { +namespace corsika { //! sign function without branches template <typename T> @@ -17,4 +17,5 @@ namespace corsika::utl { return (T(0) < val) - (val < T(0)); } -} // namespace corsika::utl +} // namespace corsika + diff --git a/Environment/BaseExponential.h b/corsika/media/BaseExponential.hpp similarity index 52% rename from Environment/BaseExponential.h rename to corsika/media/BaseExponential.hpp index bf8c16d96..48fe5a520 100644 --- a/Environment/BaseExponential.h +++ b/corsika/media/BaseExponential.hpp @@ -8,29 +8,42 @@ #pragma once -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Point.h> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/units/PhysicalUnits.h> -#include <corsika/setup/SetupTrajectory.h> +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Trajectory.hpp> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <limits> -namespace corsika::environment { +namespace corsika { /** * This class provides the grammage/length conversion functionality for * (locally) flat exponential atmospheres. */ template <class TDerived> - class BaseExponential { + class BaseExponential + { + + public: + + BaseExponential(Point const& vP0, units::si::MassDensityType vRho, + units::si::LengthType vLambda): + fRho0(vRho), + fLambda(vLambda), + fInvLambda(1 / vLambda), + fP0(vP0) + {} + protected: + units::si::MassDensityType const fRho0; units::si::LengthType const fLambda; units::si::InverseLengthType const fInvLambda; - geometry::Point const fP0; + Point const fP0; - auto const& GetImplementation() const { return *static_cast<TDerived const*>(this); } + auto const& GetImplementation() const ; // clang-format off /** @@ -47,19 +60,9 @@ namespace corsika::environment { */ // clang-format on units::si::GrammageType IntegratedGrammage( - setup::Trajectory const& vLine, units::si::LengthType vL, - geometry::Vector<units::si::dimensionless_d> const& vAxis) const { - if (vL == units::si::LengthType::zero()) { return units::si::GrammageType::zero(); } - - auto const uDotA = vLine.GetDirection(0).dot(vAxis).magnitude(); - auto const rhoStart = GetImplementation().GetMassDensity(vLine.GetLine().GetR0()); - - if (uDotA == 0) { - return vL * rhoStart; - } else { - return rhoStart * (fLambda / uDotA) * (exp(uDotA * vL * fInvLambda) - 1); - } - } + Trajectory<Line> const& vLine, + units::si::LengthType vL, + Vector<units::si::dimensionless_d> const& vAxis) const; // clang-format off /** @@ -80,32 +83,13 @@ namespace corsika::environment { */ // clang-format on units::si::LengthType ArclengthFromGrammage( - setup::Trajectory const& vLine, units::si::GrammageType vGrammage, - geometry::Vector<units::si::dimensionless_d> const& vAxis) const { - auto const uDotA = vLine.GetDirection(0).dot(vAxis).magnitude(); - auto const rhoStart = GetImplementation().GetMassDensity(vLine.GetLine().GetR0()); - - if (uDotA == 0) { - return vGrammage / rhoStart; - } else { - auto const logArg = vGrammage * fInvLambda * uDotA / rhoStart + 1; - if (logArg > 0) { - return fLambda / uDotA * log(logArg); - } else { - return std::numeric_limits<typename decltype( - vGrammage)::value_type>::infinity() * - units::si::meter; - } - } - } + Trajectory<Line> const& vLine, + units::si::GrammageType vGrammage, + Vector<units::si::dimensionless_d> const& vAxis) const; + - public: - BaseExponential(geometry::Point const& vP0, units::si::MassDensityType vRho, - units::si::LengthType vLambda) - : fRho0(vRho) - , fLambda(vLambda) - , fInvLambda(1 / vLambda) - , fP0(vP0) {} }; } // namespace corsika::environment + +#include <corsika/detail/media/BaseExponential.inl> diff --git a/Environment/DensityFunction.h b/corsika/media/DensityFunction.hpp similarity index 55% rename from Environment/DensityFunction.h rename to corsika/media/DensityFunction.hpp index 3ac33c3f2..2105f521f 100644 --- a/Environment/DensityFunction.h +++ b/corsika/media/DensityFunction.hpp @@ -8,27 +8,30 @@ #pragma once -#include <corsika/environment/LinearApproximationIntegrator.h> -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Point.h> +#include <corsika/media/LinearApproximationIntegrator.hpp> +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Trajectory.hpp> -namespace corsika::environment { +namespace corsika { - template <class TDerivableRho, - template <typename> class TIntegrator = LinearApproximationIntegrator> - class DensityFunction - : public TIntegrator<DensityFunction<TDerivableRho, TIntegrator>> { + template <class TDerivableRho, template <typename> class TIntegrator = LinearApproximationIntegrator> + class DensityFunction: public TIntegrator<DensityFunction<TDerivableRho, TIntegrator>> + { friend class TIntegrator<DensityFunction<TDerivableRho, TIntegrator>>; TDerivableRho fRho; //!< functor for density public: + DensityFunction(TDerivableRho rho) : fRho(rho) {} corsika::units::si::MassDensityType EvaluateAt( - corsika::geometry::Point const& p) const { + corsika::Point const& p) const { return fRho(p); } }; + } // namespace corsika::environment + diff --git a/corsika/media/Environment.hpp b/corsika/media/Environment.hpp new file mode 100644 index 000000000..9c909a631 --- /dev/null +++ b/corsika/media/Environment.hpp @@ -0,0 +1,60 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/Universe.hpp> +#include <corsika/media/IMediumModel.hpp> +#include <corsika/media/VolumeTreeNode.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Sphere.hpp> +#include <limits> + +namespace corsika { + + template <typename IEnvironmentModel> + class Environment + { + public: + using BaseNodeType = VolumeTreeNode<IEnvironmentModel>; + + Environment(): + fCoordinateSystem( + corsika::RootCoordinateSystem::GetInstance().GetRootCoordinateSystem()), + fUniverse( + std::make_unique<BaseNodeType>(std::make_unique<Universe>(fCoordinateSystem))) + {} + + // using IEnvironmentModel = corsika::IEnvironmentModel; + + inline auto& GetUniverse(); + + inline auto const& GetUniverse() const ; + + inline auto const& GetCoordinateSystem() const ; + + // factory method for creation of VolumeTreeNodes + template <class TVolumeType, typename... TVolumeArgs> + static auto CreateNode(TVolumeArgs&&... args); + + + private: + + corsika::CoordinateSystem const& fCoordinateSystem; + typename BaseNodeType::VTNUPtr fUniverse; + + }; + + // using SetupBaseNodeType = VolumeTreeNode<corsika::IEnvironmentModel>; + // using SetupEnvironment = Environment<corsika::IEnvironmentModel>; + +} // namespace corsika::environment + + +#include <corsika/detail/media/Environment.inl> diff --git a/corsika/media/FlatExponential.hpp b/corsika/media/FlatExponential.hpp new file mode 100644 index 000000000..ed066bbe9 --- /dev/null +++ b/corsika/media/FlatExponential.hpp @@ -0,0 +1,51 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/BaseExponential.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Trajectory.hpp> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +namespace corsika { + + template <class T> + class FlatExponential : public BaseExponential<FlatExponential<T>>, public T + { + Vector<units::si::dimensionless_d> const fAxis; + NuclearComposition const fNuclComp; + + using Base = BaseExponential<FlatExponential<T>>; + + public: + + FlatExponential(Point const& vP0, Vector<units::si::dimensionless_d> const& vAxis, + units::si::MassDensityType vRho, units::si::LengthType vLambda, NuclearComposition vNuclComp): + Base(vP0, vRho, vLambda), + fAxis(vAxis), + fNuclComp(vNuclComp) + {} + + units::si::MassDensityType GetMassDensity(Point const& vP) const override; + + NuclearComposition const& GetNuclearComposition() const override ; + + units::si::GrammageType IntegratedGrammage(Trajectory<Line> const& vLine, + units::si::LengthType vTo) const override ; + + units::si::LengthType ArclengthFromGrammage( Trajectory<Line> const& vLine, + units::si::GrammageType vGrammage) const override ; + }; + +} // namespace corsika::environment + +#include <corsika/detail/media/FlatExponential.inl> diff --git a/corsika/media/HomogeneousMedium.hpp b/corsika/media/HomogeneousMedium.hpp new file mode 100644 index 000000000..cde94452e --- /dev/null +++ b/corsika/media/HomogeneousMedium.hpp @@ -0,0 +1,70 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Trajectory.hpp> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <corsika/setup/SetupTrajectory.h> + +#include <cassert> + +/** + * a homogeneous medium + */ + +namespace corsika { + + template <class T> + class HomogeneousMedium : public T { + corsika::units::si::MassDensityType const fDensity; + NuclearComposition const fNuclComp; + + public: + + HomogeneousMedium(corsika::units::si::MassDensityType pDensity, NuclearComposition pNuclComp): + fDensity(pDensity), + fNuclComp(pNuclComp) + {} + + corsika::units::si::MassDensityType + GetMassDensity( corsika::Point const&) const override + { + return fDensity; + } + + NuclearComposition const& + GetNuclearComposition() const override + { + return fNuclComp; + } + + corsika::units::si::GrammageType + IntegratedGrammage( corsika::Trajectory<corsika::Line> const&, + corsika::units::si::LengthType pTo) const override + { + using namespace corsika::units::si; + return pTo * fDensity; + } + + corsika::units::si::LengthType + ArclengthFromGrammage(corsika::Trajectory<corsika::Line> const&, + corsika::units::si::GrammageType pGrammage) const override + { + return pGrammage / fDensity; + } + }; + +} // namespace corsika::environment + diff --git a/Environment/IMediumModel.h b/corsika/media/IMediumModel.hpp similarity index 58% rename from Environment/IMediumModel.h rename to corsika/media/IMediumModel.hpp index 7a3b95171..1623ce225 100644 --- a/Environment/IMediumModel.h +++ b/corsika/media/IMediumModel.hpp @@ -8,33 +8,35 @@ #pragma once -#include <corsika/environment/NuclearComposition.h> -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Point.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Trajectory.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> -#include <corsika/setup/SetupTrajectory.h> +namespace corsika { -namespace corsika::environment { + class IMediumModel + { - class IMediumModel { public: virtual ~IMediumModel() = default; // LCOV_EXCL_LINE - virtual corsika::units::si::MassDensityType GetMassDensity( - corsika::geometry::Point const&) const = 0; + virtual corsika::units::si::MassDensityType + GetMassDensity( corsika::Point const&) const = 0; // todo: think about the mixin inheritance of the trajectory vs the BaseTrajectory // approach; for now, only lines are supported virtual corsika::units::si::GrammageType IntegratedGrammage( - corsika::setup::Trajectory const&, + corsika::Trajectory<corsika::Line> const&, corsika::units::si::LengthType) const = 0; virtual corsika::units::si::LengthType ArclengthFromGrammage( - corsika::setup::Trajectory const&, - corsika::units::si::GrammageType) const = 0; + corsika::Trajectory<corsika::Line> const&, + corsika::units::si::GrammageType ) const = 0; virtual NuclearComposition const& GetNuclearComposition() const = 0; }; } // namespace corsika::environment + diff --git a/Environment/InhomogeneousMedium.h b/corsika/media/InhomogeneousMedium.hpp similarity index 50% rename from Environment/InhomogeneousMedium.h rename to corsika/media/InhomogeneousMedium.hpp index 76378d5d5..a85016848 100644 --- a/Environment/InhomogeneousMedium.h +++ b/corsika/media/InhomogeneousMedium.hpp @@ -8,49 +8,65 @@ #pragma once -#include <corsika/environment/NuclearComposition.h> -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Trajectory.h> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/random/RNGManager.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Trajectory.hpp> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> /** * A general inhomogeneous medium. The mass density distribution TDensityFunction must be * a \f$C^2\f$-function. */ -namespace corsika::environment { +namespace corsika +{ template <class T, class TDensityFunction> - class InhomogeneousMedium : public T { + class InhomogeneousMedium : public T + { NuclearComposition const fNuclComp; TDensityFunction const fDensityFunction; public: + + /* + * FIXME: should have traits here for ...Args + */ template <typename... Args> - InhomogeneousMedium(NuclearComposition pNuclComp, Args&&... rhoArgs) - : fNuclComp(pNuclComp) - , fDensityFunction(rhoArgs...) {} + InhomogeneousMedium(NuclearComposition pNuclComp, Args&&... rhoArgs): + fNuclComp(pNuclComp), + fDensityFunction(rhoArgs...) + {} - corsika::units::si::MassDensityType GetMassDensity( - corsika::geometry::Point const& p) const override { + corsika::units::si::MassDensityType + GetMassDensity(corsika::Point const& p) const override + { return fDensityFunction.EvaluateAt(p); } - NuclearComposition const& GetNuclearComposition() const override { return fNuclComp; } - corsika::units::si::GrammageType IntegratedGrammage( - corsika::setup::Trajectory const& pLine, - corsika::units::si::LengthType pTo) const override { + NuclearComposition const& GetNuclearComposition() const override + { + return fNuclComp; + } + + corsika::units::si::GrammageType + IntegratedGrammage( corsika::Trajectory<corsika::Line> const& pLine, + corsika::units::si::LengthType pTo) const override + { return fDensityFunction.IntegrateGrammage(pLine, pTo); } - corsika::units::si::LengthType ArclengthFromGrammage( - corsika::setup::Trajectory const& pLine, - corsika::units::si::GrammageType pGrammage) const override { + corsika::units::si::LengthType + ArclengthFromGrammage( corsika::Trajectory<corsika::Line> const& pLine, + corsika::units::si::GrammageType pGrammage) const override + { return fDensityFunction.ArclengthFromGrammage(pLine, pGrammage); } + }; } // namespace corsika::environment + diff --git a/Environment/LayeredSphericalAtmosphereBuilder.h b/corsika/media/LayeredSphericalAtmosphereBuilder.hpp similarity index 56% rename from Environment/LayeredSphericalAtmosphereBuilder.h rename to corsika/media/LayeredSphericalAtmosphereBuilder.hpp index 096f9b181..13d1ce86a 100644 --- a/Environment/LayeredSphericalAtmosphereBuilder.h +++ b/corsika/media/LayeredSphericalAtmosphereBuilder.hpp @@ -6,17 +6,14 @@ * the license. */ -#include <corsika/environment/Environment.h> -#include <corsika/environment/FlatExponential.h> -#include <corsika/environment/HomogeneousMedium.h> -#include <corsika/environment/IMediumModel.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/environment/SlidingPlanarExponential.h> -#include <corsika/environment/VolumeTreeNode.h> - -#include <corsika/geometry/Point.h> -#include <corsika/units/PhysicalConstants.h> -#include <corsika/units/PhysicalUnits.h> +#pragma once + +#include <corsika/media/Environment.hpp> +#include <corsika/media/IMediumModel.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/media/VolumeTreeNode.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <functional> #include <memory> @@ -24,50 +21,17 @@ #include <tuple> #include <type_traits> -namespace corsika::environment { - - // forward-decl - template <typename TMediumInterface, template <typename> typename MExtraEnvirnoment> - struct make_layered_spherical_atmosphere_builder; - - /** - * Helper class to setup concentric spheres of layered atmosphere - * with spcified density profiles (exponential, linear, ...). - * - * This can be used most importantly to replicate CORSIKA7 - * atmospheres. - * - * Each layer by definition has a density profile and a (constant) - * nuclear composition model. - * - */ - - namespace detail { - - struct NoExtraModelInner {}; - - template <typename M> - struct NoExtraModel {}; - - template <template <typename> typename M> - struct has_extra_models : std::true_type {}; +namespace corsika { - template <> - struct has_extra_models<NoExtraModel> : std::false_type {}; - - } // namespace detail - - template <typename TMediumInterface = environment::IMediumModel, - template <typename> typename TMediumModelExtra = detail::NoExtraModel, - typename... TModelArgs> - class LayeredSphericalAtmosphereBuilder { + class LayeredSphericalAtmosphereBuilder + { std::unique_ptr<NuclearComposition> composition_; - geometry::Point center_; + Point center_; units::si::LengthType previousRadius_{units::si::LengthType::zero()}; units::si::LengthType earthRadius_; std::tuple<TModelArgs...> const additionalModelArgs_; - std::stack<typename VolumeTreeNode<TMediumInterface>::VTNUPtr> + std::stack<VolumeTreeNode<IMediumModel>::VTNUPtr> layers_; // innermost layer first void checkRadius(units::si::LengthType r) const { @@ -76,19 +40,12 @@ namespace corsika::environment { } } - LayeredSphericalAtmosphereBuilder() = delete; - LayeredSphericalAtmosphereBuilder(const LayeredSphericalAtmosphereBuilder&) = delete; - LayeredSphericalAtmosphereBuilder(const LayeredSphericalAtmosphereBuilder&&) = delete; - LayeredSphericalAtmosphereBuilder& operator=( - const LayeredSphericalAtmosphereBuilder&) = delete; + public: - // friend, to allow construction - template <typename, template <typename> typename> - friend struct make_layered_spherical_atmosphere_builder; + static auto constexpr earthRadius = 6'371'000 * units::si::meter; - protected: - LayeredSphericalAtmosphereBuilder(TModelArgs... args, corsika::geometry::Point center, - units::si::LengthType earthRadius) + LayeredSphericalAtmosphereBuilder(corsika::Point center, + units::si::LengthType seaLevel = earthRadius) : center_(center) , earthRadius_(earthRadius) , additionalModelArgs_{args...} {} @@ -194,26 +151,12 @@ namespace corsika::environment { }; // end class LayeredSphericalAtmosphereBuilder - /** - * \class make_layered_spherical_atmosphere_builder - * - * Helper class to create LayeredSphericalAtmosphereBuilder, the - * extra environment models have to be passed as template-template - * argument to make_layered_spherical_atmosphere_builder, the member - * function `create` does then take an unspecified number of extra - * parameters to internalize those models for all layers later - * produced. - **/ - template <typename TMediumInterface = environment::IMediumModel, - template <typename> typename MExtraEnvirnoment = detail::NoExtraModel> - struct make_layered_spherical_atmosphere_builder { - template <typename... TArgs> - static auto create(geometry::Point const& center, units::si::LengthType earthRadius, - TArgs... args) { - return environment::LayeredSphericalAtmosphereBuilder<TMediumInterface, - MExtraEnvirnoment, TArgs...>{ - std::forward<TArgs>(args)..., center, earthRadius}; - } + void assemble(Environment<IMediumModel>&); + + Environment<IMediumModel> assemble(); + }; } // namespace corsika::environment + +#include <corsika/detail/media/LayeredSphericalAtmosphereBuilder.inl> diff --git a/corsika/media/LinearApproximationIntegrator.hpp b/corsika/media/LinearApproximationIntegrator.hpp new file mode 100644 index 000000000..37f52f358 --- /dev/null +++ b/corsika/media/LinearApproximationIntegrator.hpp @@ -0,0 +1,38 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <limits> + +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Trajectory.hpp> + +namespace corsika { + + template <class TDerived> + class LinearApproximationIntegrator + { + + auto const& GetImplementation() const; + + public: + + inline auto IntegrateGrammage( corsika::Trajectory<corsika::Line> const& line, + corsika::units::si::LengthType length) const; + + inline auto ArclengthFromGrammage( corsika::Trajectory<corsika::Line> const& line, + corsika::units::si::GrammageType grammage) const ; + + inline auto MaximumLength(corsika::Trajectory<corsika::Line> const& line, + [[maybe_unused]] double relError) const ; + }; + +} // namespace corsika::environment + +#include <corsika/detail/media/LinearApproximationIntegrator.inl> diff --git a/Environment/NameModel.h b/corsika/media/NameModel.hpp similarity index 93% rename from Environment/NameModel.h rename to corsika/media/NameModel.hpp index d5b6ea4fe..5f6b9b24f 100644 --- a/Environment/NameModel.h +++ b/corsika/media/NameModel.hpp @@ -11,7 +11,7 @@ #include <string> #include <utility> -namespace corsika::environment { +namespace corsika { template <typename T> struct NameModel : public T { diff --git a/corsika/media/NuclearComposition.hpp b/corsika/media/NuclearComposition.hpp new file mode 100644 index 000000000..42de98fc0 --- /dev/null +++ b/corsika/media/NuclearComposition.hpp @@ -0,0 +1,145 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <cassert> +#include <functional> +#include <numeric> +#include <random> +#include <stdexcept> +#include <vector> + +namespace corsika { + + + namespace nuc_comp::detail { + + template <class AConstIterator, class BConstIterator> + class WeightProviderIterator + { + AConstIterator fAIter; + BConstIterator fBIter; + + public: + using value_type = double; + using iterator_category = std::input_iterator_tag; + using pointer = value_type*; + using reference = value_type&; + using difference_type = ptrdiff_t; + + WeightProviderIterator(AConstIterator a, BConstIterator b) + : fAIter(a) + , fBIter(b) {} + + value_type operator*() const { return ((*fAIter) * (*fBIter)).magnitude(); } + + WeightProviderIterator& operator++() { // prefix ++ + ++fAIter; + ++fBIter; + return *this; + } + + auto operator==(WeightProviderIterator other) { return fAIter == other.fAIter; } + + auto operator!=(WeightProviderIterator other) { return !(*this == other); } + }; + + }// namespace nuc_comp::detail + + class NuclearComposition + { + std::vector<float> const fNumberFractions; //!< relative fractions of number density + std::vector<corsika::Code> const fComponents; //!< particle codes of consitutents + + double const fAvgMassNumber; + + /* + * FIXME: smelling here... nested class why? ...done + * FIXME: promote it to namespace detail ... done + */ + + + public: + + NuclearComposition(std::vector<corsika::Code> pComponents, std::vector<float> pFractions): + fNumberFractions(pFractions), + fComponents(pComponents), + fAvgMassNumber( std::inner_product( + pComponents.cbegin(), pComponents.cend(), pFractions.cbegin(), 0., + std::plus<double>(), [](auto const compID, auto const fraction) -> double { + if (IsNucleus(compID)) { + return GetNucleusA(compID) * fraction; + } else { + return GetMass(compID) / + units::si::ConvertSIToHEP(units::constants::u) * fraction; + } + })) + { + assert(pComponents.size() == pFractions.size()); + auto const sumFractions = + std::accumulate(pFractions.cbegin(), pFractions.cend(), 0.f); + + if (!(0.999f < sumFractions && sumFractions < 1.001f)) { + throw std::runtime_error("element fractions do not add up to 1"); + } + } + + template <typename TFunction> + auto WeightedSum(TFunction func) const { + using ResultQuantity = decltype(func(*fComponents.cbegin())); + + auto const prod = [&](auto const compID, auto const fraction) { + return func(compID) * fraction; + }; + + if constexpr (phys::units::is_quantity_v<ResultQuantity>) { + return std::inner_product( + fComponents.cbegin(), fComponents.cend(), fNumberFractions.cbegin(), + ResultQuantity::zero(), // .zero() is defined for quantity types only + std::plus<ResultQuantity>(), prod); + } else { + return std::inner_product( + fComponents.cbegin(), fComponents.cend(), fNumberFractions.cbegin(), + ResultQuantity(0), // in other cases we have to use a bare 0 + std::plus<ResultQuantity>(), prod); + } + } + + auto size() const { return fNumberFractions.size(); } + + auto const& GetFractions() const { return fNumberFractions; } + auto const& GetComponents() const { return fComponents; } + auto const GetAverageMassNumber() const { return fAvgMassNumber; } + + template <class TRNG> + corsika::Code SampleTarget( + std::vector<corsika::units::si::CrossSectionType> const& sigma, + TRNG& randomStream) const { + using namespace corsika::units::si; + + assert(sigma.size() == fNumberFractions.size()); + + std::discrete_distribution channelDist( + nuc_comp::detail::WeightProviderIterator<decltype(fNumberFractions.begin()), + decltype(sigma.begin())>(fNumberFractions.begin(), + sigma.begin()), + nuc_comp::detail::WeightProviderIterator<decltype(fNumberFractions.begin()), + decltype(sigma.end())>(fNumberFractions.end(), + sigma.end())); + + auto const iChannel = channelDist(randomStream); + return fComponents[iChannel]; + } + }; + +} // namespace corsika::environment + diff --git a/corsika/media/SlidingPlanarExponential.hpp b/corsika/media/SlidingPlanarExponential.hpp new file mode 100644 index 000000000..264fcf4d2 --- /dev/null +++ b/corsika/media/SlidingPlanarExponential.hpp @@ -0,0 +1,62 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/FlatExponential.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Trajectory.hpp> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +namespace corsika { + + + template <class T> + class SlidingPlanarExponential : public BaseExponential<SlidingPlanarExponential<T>>, public T + { + + NuclearComposition const nuclComp_; + units::si::LengthType const referenceHeight_; + + using Base = BaseExponential<SlidingPlanarExponential<T>>; + + public: + + SlidingPlanarExponential(Point const& p0, + units::si::MassDensityType rho0, units::si::LengthType lambda, + NuclearComposition nuclComp, units::si::LengthType referenceHeight = units::si::LengthType::zero()): + Base(p0, rho0, lambda), + nuclComp_(nuclComp), + referenceHeight_(referenceHeight) + {} + + inline units::si::MassDensityType + GetMassDensity(Point const& p) const override ; + + inline NuclearComposition const& + GetNuclearComposition() const override + { + return nuclComp_; + } + + inline units::si::GrammageType + IntegratedGrammage( Trajectory<Line> const& line, + units::si::LengthType l) const override ; + + inline units::si::LengthType + ArclengthFromGrammage( Trajectory<Line> const& line, + units::si::GrammageType grammage) const override; + }; + +} // namespace corsika::environment + +#include <corsika/detail/media/SlidingPlanarExponential.inl> diff --git a/corsika/media/Universe.hpp b/corsika/media/Universe.hpp new file mode 100644 index 000000000..7241b794b --- /dev/null +++ b/corsika/media/Universe.hpp @@ -0,0 +1,26 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/Sphere.hpp> +#include <limits> + +namespace corsika { + + struct Universe : public corsika::Sphere + { + Universe(corsika::CoordinateSystem const& pCS); + inline bool Contains(corsika::Point const&) const override; + }; + +} + +#include <corsika/detail/media/Universe.inl> diff --git a/corsika/media/VolumeTreeNode.hpp b/corsika/media/VolumeTreeNode.hpp new file mode 100644 index 000000000..f280dba40 --- /dev/null +++ b/corsika/media/VolumeTreeNode.hpp @@ -0,0 +1,98 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/IMediumModel.hpp> +#include <corsika/framework/geometry/Volume.hpp> +#include <memory> +#include <vector> + +namespace corsika { + + class Empty {}; //<! intended for usage as default template argument + + template <typename TModelProperties = Empty> + class VolumeTreeNode + { + + public: + + using IModelProperties = TModelProperties; + using VTN_type = VolumeTreeNode<IModelProperties>; + using VTNUPtr = std::unique_ptr<VolumeTreeNode<IModelProperties>>; + using IMPSharedPtr = std::shared_ptr<IModelProperties>; + using VolUPtr = std::unique_ptr<corsika::Volume>; + + VolumeTreeNode(VolUPtr pVolume = nullptr): + fGeoVolume(std::move(pVolume)) + {} + + //! convenience function equivalent to Volume::Contains + inline bool Contains(corsika::Point const& p) const; + + inline VolumeTreeNode<IModelProperties> const* + Excludes(corsika::Point const& p) const ; + + /** returns a pointer to the sub-VolumeTreeNode which is "responsible" for the given + * \class Point \p p, or nullptr iff \p p is not contained in this volume. + */ + inline VolumeTreeNode<IModelProperties> const* + GetContainingNode(corsika::Point const& p) const; + + + /** + * Traverses the VolumeTree pre- or post-order and calls the functor \p func for each + * node. \p func takes a reference to VolumeTreeNode as argument. The return value \p + * func is ignored. + */ + template <typename TCallable, bool preorder = true> + inline void walk(TCallable func) ; + + inline void AddChild(VTNUPtr pChild) ; + + inline void ExcludeOverlapWith(VTNUPtr const& pNode) ; + + inline auto* GetParent() const { return fParentNode; }; + + inline auto const& GetChildNodes() const { return fChildNodes; } + + inline auto const& GetExcludedNodes() const { return fExcludedNodes; } + + inline auto const& GetVolume() const { return *fGeoVolume; } + + inline auto const& GetModelProperties() const { return *fModelProperties; } + + inline bool HasModelProperties() const { return fModelProperties.get() != nullptr; } + + template <typename ModelProperties, typename... Args> + inline auto SetModelProperties(Args&&... args) { + static_assert(std::is_base_of_v<IModelProperties, ModelProperties>, + "unusable model properties type provided"); + + fModelProperties = std::make_shared<ModelProperties>(std::forward<Args>(args)...); + return fModelProperties; + } + + inline void SetModelProperties(IMPSharedPtr ptr) { fModelProperties = ptr; } + + /* + template <class MediumType, typename... Args> + static auto CreateMedium(Args&&... args) ; + + private: + std::vector<VTNUPtr> fChildNodes; + std::vector<VolumeTreeNode<IModelProperties> const*> fExcludedNodes; + VolumeTreeNode<IModelProperties> const* fParentNode = nullptr; + VolUPtr fGeoVolume; + IMPSharedPtr fModelProperties; + }; + +} // namespace corsika::environment + +#include <corsika/detail/media/VolumeTreeNode.inl> diff --git a/Processes/Sibyll/Decay.cc b/corsika/modules/Sibyll/Decay.cc similarity index 92% rename from Processes/Sibyll/Decay.cc rename to corsika/modules/Sibyll/Decay.cc index 8297739b7..844f3fdab 100644 --- a/Processes/Sibyll/Decay.cc +++ b/corsika/modules/Sibyll/Decay.cc @@ -11,21 +11,21 @@ #include <corsika/process/sibyll/ParticleConversion.h> #include <corsika/process/sibyll/SibStack.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> +#include "../../corsika/setup/SetupStack.hpp" +#include "../../corsika/setup/SetupTrajectory.hpp" using std::make_tuple; using std::tuple; using std::vector; using namespace corsika; -using namespace corsika::setup; +using namespace corsika; -using SetupView = corsika::setup::StackView; -using SetupProjectile = corsika::setup::StackView::ParticleType; -using Particle = corsika::setup::Stack::ParticleType; +using SetupView = corsika::StackView; +using SetupProjectile = corsika::StackView::ParticleType; +using SetupParticle = corsika::Stack::ParticleType; -namespace corsika::process::sibyll { +namespace corsika::sibyll { Decay::Decay(const bool sibyll_printout_on) : sibyll_listing_(sibyll_printout_on) { @@ -222,11 +222,14 @@ namespace corsika::process::sibyll { // FOR NOW: skip particles that have decayed in Sibyll, move to iterator? if (psib.HasDecayed()) continue; // add to corsika stack - view.AddSecondary(make_tuple(process::sibyll::ConvertFromSibyll(psib.GetPID()), - psib.GetEnergy(), psib.GetMomentum(), decayPoint, t0)); + vP.AddSecondary( + tuple<particles::Code, units::si::HEPEnergyType, corsika::MomentumVector, + geometry::Point, units::si::TimeType>{ + process::sibyll::ConvertFromSibyll(psib.GetPID()), psib.GetEnergy(), + psib.GetMomentum(), decayPoint, t0}); } // empty sibyll stack ss.Clear(); } -} // namespace corsika::process::sibyll +} // namespace corsika::sibyll diff --git a/Processes/Sibyll/Interaction.cc b/corsika/modules/Sibyll/Interaction.cc similarity index 95% rename from Processes/Sibyll/Interaction.cc rename to corsika/modules/Sibyll/Interaction.cc index aa222b7f6..219494e05 100644 --- a/Processes/Sibyll/Interaction.cc +++ b/corsika/modules/Sibyll/Interaction.cc @@ -8,28 +8,30 @@ #include <corsika/process/sibyll/Interaction.h> -#include <corsika/environment/Environment.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/geometry/FourVector.h> +#include <corsika/media/Environment.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/FourVector.hpp> #include <corsika/process/sibyll/ParticleConversion.h> #include <corsika/process/sibyll/SibStack.h> -#include <corsika/process/sibyll/sibyll2.3d.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> -#include <corsika/utl/COMBoost.h> +#include <corsika/process/sibyll/sibyll2.3c.h> +#include <corsika/framework/utility/COMBoost.hpp> #include <tuple> -using std::make_tuple; +#include "../../corsika/setup/SetupStack.hpp" +#include "../../corsika/setup/SetupTrajectory.hpp" + +using std::cout; +using std::endl; using std::tuple; using namespace corsika; -using namespace corsika::setup; -using Particle = setup::Stack::StackIterator; -using SetupView = setup::StackView; +using namespace corsika; +using SetupParticle = setup::Stack::StackIterator; +using SetupProjectile = setup::StackView::StackIterator; using Track = Trajectory; -namespace corsika::process::sibyll { +namespace corsika::sibyll { bool Interaction::initialized_ = false; @@ -356,4 +358,4 @@ namespace corsika::process::sibyll { return process::EProcessReturn::eOk; } -} // namespace corsika::process::sibyll +} // namespace corsika::sibyll diff --git a/Processes/Sibyll/NuclearInteraction.cc b/corsika/modules/Sibyll/NuclearInteraction.cc similarity index 86% rename from Processes/Sibyll/NuclearInteraction.cc rename to corsika/modules/Sibyll/NuclearInteraction.cc index 4c22491a4..2ec18ed40 100644 --- a/Processes/Sibyll/NuclearInteraction.cc +++ b/corsika/modules/Sibyll/NuclearInteraction.cc @@ -9,31 +9,31 @@ #include <corsika/process/sibyll/Interaction.h> #include <corsika/process/sibyll/NuclearInteraction.h> -#include <corsika/environment/Environment.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/geometry/FourVector.h> +#include <corsika/media/Environment.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/FourVector.hpp> #include <corsika/process/sibyll/nuclib.h> -#include <corsika/units/PhysicalUnits.h> -#include <corsika/utl/COMBoost.h> - -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> - -#include <corsika/logging/Logging.h> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/utility/COMBoost.hpp> #include <set> #include <sstream> -using std::make_tuple; +#include "../../corsika/setup/SetupStack.hpp" +#include "../../corsika/setup/SetupTrajectory.hpp" + +using std::cout; +using std::endl; using std::tuple; using std::vector; using namespace corsika; -using Particle = corsika::setup::Stack::ParticleType; // StackIterator; // ParticleType; -using View = corsika::setup::StackView; // StackView::ParticleType; -using Track = setup::Trajectory; +using namespace corsika; +using Particle = Stack::ParticleType; // StackIterator; // ParticleType; +using Projectile = StackView::StackIterator; // StackView::ParticleType; +using Track = Trajectory; -namespace corsika::process::sibyll { +namespace corsika::sibyll { template <> NuclearInteraction<setup::Environment>::~NuclearInteraction() { @@ -42,9 +42,9 @@ namespace corsika::process::sibyll { } template <> - void NuclearInteraction<setup::Environment>::PrintCrossSectionTable( - corsika::particles::Code pCode) { - using namespace corsika::particles; + void NuclearInteraction<SetupEnvironment>::PrintCrossSectionTable( + corsika::Code pCode) { + using namespace corsika; const int k = targetComponentsIndex_.at(pCode); Code pNuclei[] = {Code::Helium, Code::Lithium7, Code::Oxygen, Code::Neon, Code::Argon, Code::Iron}; @@ -67,8 +67,8 @@ namespace corsika::process::sibyll { } template <> - void NuclearInteraction<setup::Environment>::InitializeNuclearCrossSections() { - using namespace corsika::particles; + void NuclearInteraction<SetupEnvironment>::InitializeNuclearCrossSections() { + using namespace corsika; using namespace units::si; auto& universe = *(environment_.GetUniverse()); @@ -136,7 +136,7 @@ namespace corsika::process::sibyll { units::si::CrossSectionType NuclearInteraction<setup::Environment>::ReadCrossSectionTable( const int ia, particles::Code pTarget, units::si::HEPEnergyType elabnuc) { - using namespace corsika::particles; + using namespace corsika; using namespace units::si; const int ib = targetComponentsIndex_.at(pTarget) + 1; // table index in fortran auto const ECoMNuc = sqrt(2. * corsika::units::constants::nucleonMass * elabnuc); @@ -223,14 +223,14 @@ namespace corsika::process::sibyll { // read from cross section code table // FOR NOW: assume target is at rest - corsika::stack::MomentumVector pTarget(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); + corsika::MomentumVector pTarget(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); // total momentum and energy HEPEnergyType Elab = vP.GetEnergy() + constants::nucleonMass; unsigned int const nuclA = vP.GetNuclearA(); auto const ElabNuc = vP.GetEnergy() / nuclA; - corsika::stack::MomentumVector pTotLab(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); + corsika::MomentumVector pTotLab(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); pTotLab += vP.GetMomentum(); pTotLab += pTarget; auto const pTotLabNorm = pTotLab.norm(); @@ -382,7 +382,7 @@ namespace corsika::process::sibyll { // target is always at rest const auto eTargetNucLab = 0_GeV + constants::nucleonMass; const auto pTargetNucLab = - corsika::stack::MomentumVector(rootCS, 0_GeV, 0_GeV, 0_GeV); + corsika::MomentumVector(rootCS, 0_GeV, 0_GeV, 0_GeV); const FourVector PtargNucLab(eTargetNucLab, pTargetNucLab); C8LOG_DEBUG( @@ -559,9 +559,11 @@ namespace corsika::process::sibyll { Plab.GetSpaceLikeComponents(), pOrig, tOrig)); else // add nucleus - projectile.AddSecondary(make_tuple(specCode, Plab.GetTimeLikeComponent(), - Plab.GetSpaceLikeComponents(), pOrig, tOrig, - nuclA, nuclZ)); + vP.AddSecondary(tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, + units::si::TimeType, unsigned short, unsigned short>{ + specCode, Plab.GetTimeLikeComponent(), Plab.GetSpaceLikeComponents(), pOrig, + tOrig, nuclA, nuclZ}); } // add elastic nucleons to corsika stack @@ -578,8 +580,11 @@ namespace corsika::process::sibyll { const double mass_ratio = particles::GetMass(elaNucCode) / ProjMass; auto const Plab = PprojLab * mass_ratio; - projectile.AddSecondary(make_tuple(elaNucCode, Plab.GetTimeLikeComponent(), - Plab.GetSpaceLikeComponents(), pOrig, tOrig)); + vP.AddSecondary( + tuple<particles::Code, units::si::HEPEnergyType, corsika::MomentumVector, + geometry::Point, units::si::TimeType>{ + elaNucCode, Plab.GetTimeLikeComponent(), Plab.GetSpaceLikeComponents(), + pOrig, tOrig}); } // add inelastic interactions @@ -588,25 +593,15 @@ namespace corsika::process::sibyll { // TODO: sample neutron or proton auto pCode = particles::Proton::GetCode(); // temporarily add to stack, will be removed after interaction in DoInteraction - C8LOG_DEBUG(fmt::format("inelastic interaction no. {}", j)); - setup::Stack nucleonStack; - // auto inelasticNucleon = projectile.AddSecondary( - auto inelasticNucleon = nucleonStack.AddParticle( - make_tuple(pCode, PprojNucLab.GetTimeLikeComponent(), - PprojNucLab.GetSpaceLikeComponents(), pOrig, tOrig)); - inelasticNucleon.SetNode(projectile.GetNode()); - // create inelastic interaction for each nucleon - C8LOG_TRACE("calling HadronicInteraction..."); - // create new StackView for each of the nucleons - View nucleon_secondaries(inelasticNucleon); - // all inner hadronic event generator - hadronicInteraction_.DoInteraction(nucleon_secondaries); - // inelasticNucleon.Delete(); // this is just a temporary object - for (const auto& pSec : nucleon_secondaries) { - projectile.AddSecondary(make_tuple(pSec.GetPID(), pSec.GetEnergy(), - pSec.GetMomentum(), pSec.GetPosition(), - pSec.GetTime())); - } + cout << "inelastic interaction no. " << j << endl; + auto inelasticNucleon = vP.AddSecondary( + tuple<particles::Code, units::si::HEPEnergyType, corsika::MomentumVector, + geometry::Point, units::si::TimeType>{ + pCode, PprojNucLab.GetTimeLikeComponent(), + PprojNucLab.GetSpaceLikeComponents(), pOrig, tOrig}); + // create inelastic interaction + cout << "calling HadronicInteraction..." << endl; + hadronicInteraction_.DoInteraction(inelasticNucleon); } C8LOG_DEBUG("NuclearInteraction: DoInteraction: done"); @@ -614,27 +609,4 @@ namespace corsika::process::sibyll { return process::EProcessReturn::eOk; } - template <> - NuclearInteraction<setup::Environment>::NuclearInteraction( - process::sibyll::Interaction& hadint, setup::Environment const& env) - : environment_(env) - , hadronicInteraction_(hadint) { - - // initialize hadronic interaction module - // TODO: safe to run multiple initializations? - - // check compatibility of energy ranges, someone could try to use low-energy model.. - if (!hadronicInteraction_.IsValidCoMEnergy(GetMinEnergyPerNucleonCoM()) || - !hadronicInteraction_.IsValidCoMEnergy(GetMaxEnergyPerNucleonCoM())) - throw std::runtime_error( - "NuclearInteraction: hadronic interaction model incompatible!"); - - // initialize nuclib - // TODO: make sure this does not overlap with sibyll - nuc_nuc_ini_(); - - // initialize cross sections - InitializeNuclearCrossSections(); - } - -} // namespace corsika::process::sibyll +} // namespace corsika::sibyll diff --git a/Processes/Sibyll/ParticleConversion.cc b/corsika/modules/Sibyll/ParticleConversion.cc similarity index 89% rename from Processes/Sibyll/ParticleConversion.cc rename to corsika/modules/Sibyll/ParticleConversion.cc index a6cf965cb..2e73f3a66 100644 --- a/Processes/Sibyll/ParticleConversion.cc +++ b/corsika/modules/Sibyll/ParticleConversion.cc @@ -6,10 +6,10 @@ * the license. */ -#include <corsika/particles/ParticleProperties.h> +#include <corsika/framework/core/ParticleProperties.hpp> #include <corsika/process/sibyll/ParticleConversion.h> -using namespace corsika::process::sibyll; +using namespace corsika::sibyll; corsika::units::si::HEPMassType corsika::process::sibyll::GetSibyllMass( corsika::particles::Code const pCode) { diff --git a/Processes/Sibyll/code_generator.py b/corsika/modules/Sibyll/code_generator.py similarity index 96% rename from Processes/Sibyll/code_generator.py rename to corsika/modules/Sibyll/code_generator.py index 7044c95e0..22cb11022 100755 --- a/Processes/Sibyll/code_generator.py +++ b/corsika/modules/Sibyll/code_generator.py @@ -106,14 +106,14 @@ def generate_sibyll2corsika(particle_db) : pDict[sib_code] = identifier nPart = max(pDict.keys()) - min(pDict.keys()) + 1 - string += "std::array<corsika::particles::Code, {:d}> constexpr sibyll2corsika = {{\n".format(nPart) + string += "std::array<corsika::Code, {:d}> constexpr sibyll2corsika = {{\n".format(nPart) for iPart in range(nPart) : if iPart in pDict: identifier = pDict[iPart] else: identifier = "Unknown" - string += " corsika::particles::Code::{:s}, \n".format(identifier) + string += " corsika::Code::{:s}, \n".format(identifier) string += "};\n" return string diff --git a/Processes/Sibyll/sibyll_codes.dat b/corsika/modules/Sibyll/sibyll_codes.dat similarity index 100% rename from Processes/Sibyll/sibyll_codes.dat rename to corsika/modules/Sibyll/sibyll_codes.dat diff --git a/Processes/Sibyll/testSibyll.cc b/corsika/modules/Sibyll/testSibyll.cc similarity index 76% rename from Processes/Sibyll/testSibyll.cc rename to corsika/modules/Sibyll/testSibyll.cc index c229e8861..cc9245629 100644 --- a/Processes/Sibyll/testSibyll.cc +++ b/corsika/modules/Sibyll/testSibyll.cc @@ -11,20 +11,18 @@ #include <corsika/process/sibyll/NuclearInteraction.h> #include <corsika/process/sibyll/ParticleConversion.h> -#include <corsika/random/RNGManager.h> +#include <corsika/framework/random/RNGManager.hpp> -#include <corsika/particles/ParticleProperties.h> +#include <corsika/framework/core/ParticleProperties.hpp> -#include <corsika/geometry/Point.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <catch2/catch.hpp> #include <tuple> using namespace corsika; -using namespace corsika::process::sibyll; -using namespace corsika::units; -using namespace corsika::units::si; +using namespace corsika::sibyll; TEST_CASE("Sibyll", "[processes]") { @@ -67,21 +65,20 @@ TEST_CASE("Sibyll", "[processes]") { } } -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/setup/SetupEnvironment.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include "../../corsika/setup/SetupStack.hpp" +#include "../../corsika/setup/SetupTrajectory.hpp" -#include <corsika/environment/Environment.h> -#include <corsika/environment/HomogeneousMedium.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/environment/UniformMagneticField.h> +#include <corsika/media/Environment.hpp> +#include <corsika/media/HomogeneousMedium.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/process/sibyll/sibyll2.3c.h> using namespace corsika::units::si; using namespace corsika::units; @@ -111,7 +108,19 @@ TEST_CASE("SibyllInterface", "[processes]") { cs, {P0, 0_eV, 0_eV}); // this is secret knowledge about setupStack setup::StackView& view = *viewPtr; - auto particle = stack->first(); + setup::Stack stack; + const HEPEnergyType E0 = 100_GeV; + HEPMomentumType P0 = + sqrt(E0 * E0 - particles::Proton::GetMass() * particles::Proton::GetMass()); + auto plab = corsika::MomentumVector(cs, {0_GeV, 0_GeV, -P0}); + geometry::Point pos(cs, 0_m, 0_m, 0_m); + auto particle = stack.AddParticle( + std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, units::si::TimeType>{ + particles::Code::Proton, E0, plab, pos, 0_ns}); + particle.SetNode(nodePtr); + corsika::SecondaryView view(particle); + auto projectile = view.GetProjectile(); Interaction model; @@ -187,10 +196,21 @@ TEST_CASE("SibyllInterface", "[processes]") { SECTION("NuclearInteractionInterface") { - auto [stack, viewPtr] = - setup::testing::setupStack(particles::Code::Nucleus, 4, 2, 500_GeV, nodePtr, cs); - setup::StackView& view = *viewPtr; - auto particle = stack->first(); + setup::Stack stack; + const HEPEnergyType E0 = 400_GeV; + HEPMomentumType P0 = + sqrt(E0 * E0 - particles::Proton::GetMass() * particles::Proton::GetMass()); + auto plab = corsika::MomentumVector(cs, {0_GeV, 0_GeV, -P0}); + geometry::Point pos(cs, 0_m, 0_m, 0_m); + + auto particle = + stack.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, + units::si::TimeType, unsigned short, unsigned short>{ + particles::Code::Nucleus, E0, plab, pos, 0_ns, 4, 2}); + particle.SetNode(nodePtr); + corsika::SecondaryView view(particle); + auto projectile = view.GetProjectile(); Interaction hmodel; NuclearInteraction model(hmodel, *env); @@ -203,11 +223,18 @@ TEST_CASE("SibyllInterface", "[processes]") { SECTION("DecayInterface") { - auto [stackPtr, viewPtr] = - setup::testing::setupStack(particles::Code::Lambda0, 0, 0, 10_GeV, nodePtr, cs); - setup::StackView& view = *viewPtr; - auto& stack = *stackPtr; - auto particle = stack.first(); + setup::Stack stack; + const HEPEnergyType E0 = 10_GeV; + HEPMomentumType P0 = + sqrt(E0 * E0 - particles::Proton::GetMass() * particles::Proton::GetMass()); + auto plab = corsika::MomentumVector(cs, {0_GeV, 0_GeV, -P0}); + geometry::Point pos(cs, 0_m, 0_m, 0_m); + auto particle = stack.AddParticle( + std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, units::si::TimeType>{ + particles::Code::Lambda0, E0, plab, pos, 0_ns}); + corsika::SecondaryView view(particle); + auto projectile = view.GetProjectile(); Decay model; model.PrintDecayConfig(); diff --git a/corsika/modules/UrQMD/UrQMD.cc b/corsika/modules/UrQMD/UrQMD.cc new file mode 100644 index 000000000..a43308845 --- /dev/null +++ b/corsika/modules/UrQMD/UrQMD.cc @@ -0,0 +1,385 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/framework/geometry/QuantityVector.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/process/urqmd/UrQMD.h> +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <algorithm> +#include <array> +#include <cassert> +#include <cmath> +#include <fstream> +#include <functional> +#include <random> +#include <sstream> + +using namespace corsika::UrQMD; +using namespace corsika::units::si; + +UrQMD::UrQMD() { iniurqmd_(); } + +using SetupStack = corsika::Stack; +using SetupParticle = corsika::Stack::StackIterator; +using SetupProjectile = corsika::StackView::StackIterator; + +CrossSectionType UrQMD::GetCrossSection(particles::Code vProjectileCode, + corsika::Code vTargetCode, + HEPEnergyType vLabEnergy, int vAProjectile = 1) { + // the following is a translation of ptsigtot() into C++ + if (vProjectileCode != particles::Code::Nucleus && + !IsNucleus(vTargetCode)) { // both particles are "special" + auto const mProj = particles::GetMass(vProjectileCode); + auto const mTar = particles::GetMass(vTargetCode); + double sqrtS = sqrt(units::si::detail::static_pow<2>(mProj) + + units::si::detail::static_pow<2>(mTar) + 2 * vLabEnergy * mTar) * + (1 / 1_GeV); + + // we must set some UrQMD globals first... + auto const [ityp, iso3] = ConvertToUrQMD(projectileCode); + inputs_.spityp[0] = ityp; + inputs_.spiso3[0] = iso3; + + auto const [itypTar, iso3Tar] = ConvertToUrQMD(targetCode); + inputs_.spityp[1] = itypTar; + inputs_.spiso3[1] = iso3Tar; + + int one = 1; + int two = 2; + int three = 3; + + double const totalXS = sigtot_(one, two, sqrtS); + + // subtract elastic cross-section as in ptsigtot() + int itypmn, itypmx, iso3mn, iso3mx; + if (ityp < itypTar) { + itypmn = ityp; + itypmx = itypTar; + + iso3mn = iso3; + iso3mx = iso3Tar; + } else { + itypmx = ityp; + itypmn = itypTar; + + iso3mx = iso3; + iso3mn = iso3Tar; + } + + int isigline = collclass_(itypmx, iso3mx, itypmn, iso3mn); + int iline = readsigmaln_(three, one, isigline); + double sigEl; + double massProj = mProj / 1_GeV; + double massTar = mTar / 1_GeV; + + crossx_(iline, sqrtS, ityp, iso3, massProj, itypTar, iso3Tar, massTar, sigEl); + + if (totalXS > sigEl) { + return (totalXS - sigEl) * 1_mb; + } else { + return sigEl * 0_mb; + } + } else { + int const Ap = projectileA; + int const At = IsNucleus(targetCode) ? particles::GetNucleusA(targetCode) : 1; + + double const maxImpact = nucrad_(Ap) + nucrad_(At) + 2 * options_.CTParam[30 - 1]; + return 10_mb * M_PI * units::static_pow<2>(maxImpact); + // is a constant cross-section really reasonable? + } +} + +template <typename TParticle> // need template here, as this is called both with + // SetupParticle as well as SetupProjectile +CrossSectionType UrQMD::GetCrossSection(TParticle const& vProjectile, + corsika::Code vTargetCode) const { + // TODO: return 0 for non-hadrons? + + auto const projectileCode = vProjectile.GetPID(); + auto const projectileEnergyLab = vProjectile.GetEnergy(); + + if (projectileCode == particles::Code::K0Long) { + return 0.5 * + (GetCrossSection(particles::Code::K0, vTargetCode, projectileEnergyLab) + + GetCrossSection(particles::Code::K0Bar, vTargetCode, projectileEnergyLab)); + } + + return GetTabulatedCrossSection(projectileCode, targetCode, projectileEnergyLab); +} + +bool UrQMD::CanInteract(particles::Code code) const { + // According to the manual, UrQMD can use all mesons, baryons and nucleons + // which are modeled also as input particles. I think it is safer to accept + // only the usual long-lived species as input. + + // Interactions with nucleus projectiles are possible in principle with UrQMD + // but right now we don't have access to the inelastic (production) cross-section, + // so we unfortunately have to forbid these interactions for the time being. + + static particles::Code const validProjectileCodes[] = { + particles::Code::Proton, particles::Code::AntiProton, particles::Code::Neutron, + particles::Code::AntiNeutron, particles::Code::PiPlus, particles::Code::PiMinus, + particles::Code::KPlus, particles::Code::KMinus, particles::Code::K0Short, + particles::Code::K0Long}; + + return std::find(std::cbegin(validProjectileCodes), std::cend(validProjectileCodes), + code) != std::cend(validProjectileCodes); +} + +GrammageType UrQMD::GetInteractionLength(SetupParticle const& particle) const { + if (!CanInteract(particle.GetPID())) { + // we could do the canInteract check in GetCrossSection, too but if + // we do it here we have the advantage of avoiding the loop + return std::numeric_limits<double>::infinity() * 1_g / (1_cm * 1_cm); + } + + auto const& mediumComposition = + particle.GetNode()->GetModelProperties().GetNuclearComposition(); + using namespace std::placeholders; + + CrossSectionType const weightedProdCrossSection = mediumComposition.WeightedSum( + std::bind(&UrQMD::GetCrossSection<decltype(particle)>, this, particle, _1)); + + return mediumComposition.GetAverageMassNumber() * units::constants::u / + weightedProdCrossSection; +} + +corsika::EProcessReturn UrQMD::DoInteraction(SetupProjectile& vProjectile) { + using namespace units::si; + + auto const projectile = view.GetProjectile(); + + auto projectileCode = projectile.GetPID(); + auto const projectileEnergyLab = projectile.GetEnergy(); + auto const& projectileMomentumLab = projectile.GetMomentum(); + auto const& projectilePosition = projectile.GetPosition(); + auto const projectileTime = projectile.GetTime(); + + C8LOG_DEBUG("UrQMD::DoInteraction pid={} E={} GeV", projectileCode, + projectileEnergyLab / 1_GeV); + + // sample target particle + auto const& mediumComposition = + projectile.GetNode()->GetModelProperties().GetNuclearComposition(); + auto const componentCrossSections = std::invoke([&]() { + auto const& components = mediumComposition.GetComponents(); + std::vector<CrossSectionType> crossSections; + crossSections.reserve(components.size()); + + for (auto const c : components) { + crossSections.push_back(GetCrossSection(projectile, c)); + } + + return crossSections; + }); + + auto const targetCode = mediumComposition.SampleTarget(componentCrossSections, rng_); + auto const targetA = particles::GetNucleusA(targetCode); + auto const targetZ = particles::GetNucleusZ(targetCode); + + inputs_.nevents = 1; + sys_.eos = 0; // could be configurable in principle + inputs_.outsteps = 1; + sys_.nsteps = 1; + + // initialization regarding projectile + if (particles::Code::Nucleus == projectileCode) { + // is this everything? + inputs_.prspflg = 0; + + sys_.Ap = projectile.GetNuclearA(); + sys_.Zp = projectile.GetNuclearZ(); + rsys_.ebeam = (projectileEnergyLab - projectile.GetMass()) * (1 / 1_GeV) / + projectile.GetNuclearA(); + + rsys_.bdist = nucrad_(targetA) + nucrad_(sys_.Ap) + 2 * options_.CTParam[30 - 1]; + + int const id = 1; + cascinit_(sys_.Zp, sys_.Ap, id); + } else { + inputs_.prspflg = 1; + sys_.Ap = 1; // even for non-baryons this has to be set, see vanilla UrQMD.f + rsys_.bdist = nucrad_(targetA) + nucrad_(1) + 2 * options_.CTParam[30 - 1]; + rsys_.ebeam = (projectileEnergyLab - projectile.GetMass()) * (1 / 1_GeV); + + if (projectileCode == particles::Code::K0Long || + projectileCode == particles::Code::K0Short) { + projectileCode = booleanDist_(rng_) ? particles::Code::K0 : particles::Code::K0Bar; + } + + auto const [ityp, iso3] = ConvertToUrQMD(projectileCode); + // todo: conversion of K_long/short into strong eigenstates; + inputs_.spityp[0] = ityp; + inputs_.spiso3[0] = iso3; + } + + // initilazation regarding target + if (particles::IsNucleus(targetCode)) { + sys_.Zt = targetZ; + sys_.At = targetA; + inputs_.trspflg = 0; // nucleus as target + int const id = 2; + cascinit_(sys_.Zt, sys_.At, id); + } else { + inputs_.trspflg = 1; // special particle as target + auto const [ityp, iso3] = ConvertToUrQMD(targetCode); + inputs_.spityp[1] = ityp; + inputs_.spiso3[1] = iso3; + } + + int iflb = 0; // flag for retrying interaction in case of empty event, 0 means retry + urqmd_(iflb); + + // now retrieve secondaries from UrQMD + auto const& originalCS = projectileMomentumLab.GetCoordinateSystem(); + geometry::CoordinateSystem const zAxisFrame = + originalCS.RotateToZ(projectileMomentumLab); + + for (int i = 0; i < sys_.npart; ++i) { + auto code = ConvertFromUrQMD(isys_.ityp[i], isys_.iso3[i]); + if (code == particles::Code::K0 || code == particles::Code::K0Bar) { + code = booleanDist_(rng_) ? particles::Code::K0Short : particles::Code::K0Long; + } + + // "coor_.p0[i] * 1_GeV" is likely off-shell as UrQMD doesn't preserve masses well + auto momentum = geometry::Vector( + zAxisFrame, + geometry::QuantityVector<dimensionless_d>{coor_.px[i], coor_.py[i], coor_.pz[i]} * + 1_GeV); + + auto const energy = sqrt(momentum.squaredNorm() + square(particles::GetMass(code))); + + momentum.rebase(originalCS); // transform back into standard lab frame + C8LOG_DEBUG(" Secondary {} code {} p={} GeV", i, code, + momentum.GetComponents() / 1_GeV); + + view.AddSecondary( + std::make_tuple(code, energy, momentum, projectilePosition, projectileTime)); + } + + C8LOG_DEBUG("UrQMD generated {} secondaries!", sys_.npart); + + return process::EProcessReturn::eOk; +} + +/** + * the random number generator function of UrQMD + */ +double corsika::UrQMD::ranf_(int&) { + static corsika::RNG& rng = + corsika::RNGManager::GetInstance().GetRandomStream("UrQMD"); + static std::uniform_real_distribution<double> dist; + + return dist(rng); +} + +corsika::Code corsika::UrQMD::ConvertFromUrQMD(int vItyp, int vIso3) { + int const pdgInt = + pdgid_(vItyp, vIso3); // use the conversion function provided by UrQMD + if (pdgInt == 0) { // pdgid_ returns 0 on error + throw std::runtime_error("UrQMD pdgid() returned 0"); + } + auto const pdg = static_cast<particles::PDGCode>(pdgInt); + return particles::ConvertFromPDG(pdg); +} + +std::pair<int, int> corsika::UrQMD::ConvertToUrQMD( + corsika::Code code) { + static const std::map<int, std::pair<int, int>> mapPDGToUrQMD{ + // data mostly from github.com/afedynitch/ParticleDataTool + {22, {100, 0}}, // gamma + {111, {101, 0}}, // pi0 + {211, {101, 2}}, // pi+ + {-211, {101, -2}}, // pi- + {321, {106, 1}}, // K+ + {-321, {-106, -1}}, // K- + {311, {106, -1}}, // K0 + {-311, {-106, 1}}, // K0bar + {2212, {1, 1}}, // p + {2112, {1, -1}}, // n + {-2212, {-1, -1}}, // pbar + {-2112, {-1, 1}}, // nbar + {221, {102, 0}}, // eta + {213, {104, 2}}, // rho+ + {-213, {104, -2}}, // rho- + {113, {104, 0}}, // rho0 + {323, {108, 2}}, // K*+ + {-323, {108, -2}}, // K*- + {313, {108, 0}}, // K*0 + {-313, {-108, 0}}, // K*0-bar + {223, {103, 0}}, // omega + {333, {109, 0}}, // phi + {3222, {40, 2}}, // Sigma+ + {3212, {40, 0}}, // Sigma0 + {3112, {40, -2}}, // Sigma- + {3322, {49, 0}}, // Xi0 + {3312, {49, -1}}, // Xi- + {3122, {27, 0}}, // Lambda0 + {2224, {17, 4}}, // Delta++ + {2214, {17, 2}}, // Delta+ + {2114, {17, 0}}, // Delta0 + {1114, {17, -2}}, // Delta- + {3224, {41, 2}}, // Sigma*+ + {3214, {41, 0}}, // Sigma*0 + {3114, {41, -2}}, // Sigma*- + {3324, {50, 0}}, // Xi*0 + {3314, {50, -1}}, // Xi*- + {3334, {55, 0}}, // Omega- + {411, {133, 2}}, // D+ + {-411, {133, -2}}, // D- + {421, {133, 0}}, // D0 + {-421, {-133, 0}}, // D0-bar + {441, {107, 0}}, // etaC + {431, {138, 1}}, // Ds+ + {-431, {138, -1}}, // Ds- + {433, {139, 1}}, // Ds*+ + {-433, {139, -1}}, // Ds*- + {413, {134, 1}}, // D*+ + {-413, {134, -1}}, // D*- + {10421, {134, 0}}, // D*0 + {-10421, {-134, 0}}, // D*0-bar + {443, {135, 0}}, // jpsi + }; + + return mapPDGToUrQMD.at(static_cast<int>(GetPDG(code))); +} + +void UrQMD::readXSFile(std::string const& filename) { + std::ifstream file(filename, std::ios::in); + + if (!file.is_open()) { throw std::runtime_error(filename + " could not be opened."); } + + std::string line; + + std::getline(file, line); + std::stringstream ss(line); + + char dummy; + int nTargets, nProjectiles, nSupports; + ss >> dummy >> nTargets >> nProjectiles >> nSupports; + + decltype(xs_interp_support_table_)::extent_gen extents; + xs_interp_support_table_.resize(extents[nProjectiles][nTargets][nSupports]); + + for (int i = 0; i < nTargets; ++i) { + for (int j = 0; j < nProjectiles; ++j) { + for (int k = 0; k < nSupports; ++k) { + std::getline(file, line); + std::stringstream s(line); + double energy, sigma; + s >> energy >> sigma; + xs_interp_support_table_[j][i][k] = sigma * 1_mb; + } + + std::getline(file, line); + std::getline(file, line); + } + } +} diff --git a/corsika/modules/UrQMD/UrQMD.h b/corsika/modules/UrQMD/UrQMD.h new file mode 100644 index 000000000..61a23b0ef --- /dev/null +++ b/corsika/modules/UrQMD/UrQMD.h @@ -0,0 +1,148 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <array> +#include <random> +#include <string> +#include <utility> +#include "../../corsika/setup/SetupStack.hpp" + +namespace corsika::UrQMD { + class UrQMD : public corsika::InteractionProcess<UrQMD> { + public: + UrQMD(std::string const& path = utl::CorsikaData("UrQMD/UrQMD-1.3.1-xs.dat")); + corsika::units::si::GrammageType GetInteractionLength( + corsika::Stack::StackIterator&) const; + + template <typename TParticle> + corsika::units::si::CrossSectionType GetCrossSection(TParticle const&, + corsika::Code) const; + + corsika::EProcessReturn DoInteraction( + corsika::StackView::StackIterator&); + + bool CanInteract(particles::Code) const; + + private: + static corsika::units::si::CrossSectionType GetCrossSection( + particles::Code, particles::Code, corsika::units::si::HEPEnergyType, int); + corsika::RNG& fRNG = + corsika::RNGManager::GetInstance().GetRandomStream("UrQMD"); + + corsika::random::RNG& rng_ = + corsika::random::RNGManager::GetInstance().GetRandomStream("urqmd"); + + std::uniform_int_distribution<int> booleanDist_{0, 1}; + boost::multi_array<corsika::units::si::CrossSectionType, 3> xs_interp_support_table_; + }; + + namespace details::constants { + // from coms.f + int constexpr nmax = 500; + + // from options.f + int constexpr numcto = 400; + int constexpr numctp = 400; + + // from inputs.f + int constexpr aamax = 300; + + } // namespace details::constants + + template <typename T> + using nmaxArray = std::array<T, details::constants::nmax>; + using nmaxIntArray = nmaxArray<int>; + using nmaxDoubleArray = nmaxArray<double>; + + extern "C" { + // FORTRAN functions defined in UrQMD + void iniurqmdc8_(); + double ranf_(int&); + void cascinit_(int const&, int const&, int const&); + double nucrad_(int const&); + void urqmd_(int&); + int pdgid_(int const&, int const&); + double sigtot_(int&, int&, double&); + int collclass_(int&, int&, int&, int&); + double crossx_(int const&, double const&, int const&, int const&, double const&, + int const&, int const&, double const&, double&); + int readsigmaln_(int const&, int const&, int const&); + + // defined in coms.f + extern struct { + int npart, nbar, nmes, ctag, nsteps, uid_cnt, ranseed, event; + int Ap; // projectile mass number (in case of nucleus) + int At; // target mass number (in case of nucleus) + int Zp; // projectile charge number (in case of nucleus) + int Zt; // target charge number (in case of nucleus) + int eos, dectag, NHardRes, NSoftRes, NDecRes, NElColl, NBlColl; + } sys_; + + extern struct { + double time, acttime, bdist, bimp, bmin; + double ebeam; // lab-frame energy of projectile + double ecm; + } rsys_; + + // defined in coms.f + extern struct { + nmaxIntArray spin, ncoll, charge, ityp, lstcoll, iso3, origin, strid, uid; + } isys_; + + // defined in coor.f + extern struct { + nmaxDoubleArray r0, rx, ry, rz, p0, px, py, pz, fmass, rww, dectime; + } coor_; + + // defined in inputs.f + extern struct { + int nevents; + std::array<int, 2> spityp; // particle codes of: [0]: projectile, [1]: target + int prspflg; // projectile special flag + int trspflg; // target special flag, set to 1 unless target is nucleus > H + std::array<int, 2> spiso3; // particle codes of: [0]: projectile, [1]: target + int outsteps, bflag, srtflag, efuncflag, nsrt, npb, firstev; + } inputs_; + + // defined in inputs.f + extern struct { + double srtmin, srtmax, pbeam, betann, betatar, betapro, pbmin, pbmax; + } input2_; + + // defined in options.f + extern struct { + std::array<double, details::constants::numcto> CTOption; + std::array<double, details::constants::numctp> CTParam; + } options_; + + extern struct { + int fixedseed, bf13, bf14, bf15, bf16, bf17, bf18, bf19, bf20; + } loptions_; + + // defined in urqmdInterface.F + extern struct { std::array<double, 3> xs, bim; } cxs_u2_; + } + + /** + * convert CORSIKA code to UrQMD code tuple + * + * In the current implementation a detour via the PDG code is made. + */ + std::pair<int, int> ConvertToUrQMD(particles::Code); + particles::Code ConvertFromUrQMD(int vItyp, int vIso3); + +} // namespace corsika::UrQMD + +#endif diff --git a/Processes/UrQMD/testUrQMD.cc b/corsika/modules/UrQMD/testUrQMD.cc similarity index 62% rename from Processes/UrQMD/testUrQMD.cc rename to corsika/modules/UrQMD/testUrQMD.cc index 17a010c2f..8bcfd651c 100644 --- a/Processes/UrQMD/testUrQMD.cc +++ b/corsika/modules/UrQMD/testUrQMD.cc @@ -7,32 +7,32 @@ */ #include <corsika/process/urqmd/UrQMD.h> -#include <corsika/random/RNGManager.h> +#include <corsika/framework/random/RNGManager.hpp> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> -#include <corsika/units/PhysicalConstants.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalConstants.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> -#include <corsika/utl/CorsikaFenv.h> +#include <corsika/framework/utility/CorsikaFenv.hpp> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> - -#include <corsika/environment/Environment.h> -#include <corsika/environment/HomogeneousMedium.h> -#include <corsika/environment/NuclearComposition.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/media/Environment.hpp> +#include <corsika/media/HomogeneousMedium.hpp> +#include <corsika/media/NuclearComposition.hpp> #include <tuple> #include <utility> #include <catch2/catch.hpp> +#include "../../corsika/setup/SetupStack.hpp" +#include "../../corsika/setup/SetupTrajectory.hpp" + using namespace corsika; -using namespace corsika::process::UrQMD; +using namespace corsika::UrQMD; using namespace corsika::units::si; template <typename TStackView> @@ -53,6 +53,74 @@ auto sumMomentum(TStackView const& view, geometry::CoordinateSystem const& vCS) return sum; } +auto setupEnvironment(particles::Code vTargetCode) { + // setup environment, geometry + auto env = std::make_unique<environment::Environment<environment::IMediumModel>>(); + auto& universe = *(env->GetUniverse()); + const geometry::CoordinateSystem& cs = env->GetCoordinateSystem(); + + auto theMedium = + environment::Environment<environment::IMediumModel>::CreateNode<geometry::Sphere>( + geometry::Point{cs, 0_m, 0_m, 0_m}, + 1_km * std::numeric_limits<double>::infinity()); + + using MyHomogeneousModel = environment::HomogeneousMedium<environment::IMediumModel>; + theMedium->SetModelProperties<MyHomogeneousModel>( + 1_kg / (1_m * 1_m * 1_m), + environment::NuclearComposition(std::vector<particles::Code>{vTargetCode}, + std::vector<float>{1.})); + + auto const* nodePtr = theMedium.get(); + universe.AddChild(std::move(theMedium)); + + return std::make_tuple(std::move(env), &cs, nodePtr); +} + +template <typename TNodeType> +auto setupStack(int vA, int vZ, HEPEnergyType vMomentum, TNodeType* vNodePtr, + geometry::CoordinateSystem const& cs) { + auto stack = std::make_unique<setup::Stack>(); + auto constexpr mN = corsika::units::constants::nucleonMass; + + geometry::Point const origin(cs, {0_m, 0_m, 0_m}); + corsika::MomentumVector const pLab(cs, {vMomentum, 0_GeV, 0_GeV}); + + HEPEnergyType const E0 = + sqrt(units::si::detail::static_pow<2>(mN * vA) + pLab.squaredNorm()); + auto particle = + stack->AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, + units::si::TimeType, unsigned short, unsigned short>{ + particles::Code::Nucleus, E0, pLab, origin, 0_ns, vA, vZ}); + + particle.SetNode(vNodePtr); + return std::make_tuple( + std::move(stack), + std::make_unique<decltype(corsika::SecondaryView(particle))>(particle)); +} + +template <typename TNodeType> +auto setupStack(particles::Code vProjectileType, HEPEnergyType vMomentum, + TNodeType* vNodePtr, geometry::CoordinateSystem const& cs) { + auto stack = std::make_unique<setup::Stack>(); + + geometry::Point const origin(cs, {0_m, 0_m, 0_m}); + corsika::MomentumVector const pLab(cs, {vMomentum, 0_GeV, 0_GeV}); + + HEPEnergyType const E0 = + sqrt(units::si::detail::static_pow<2>(particles::GetMass(vProjectileType)) + + pLab.squaredNorm()); + auto particle = stack->AddParticle( + std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, units::si::TimeType>{ + vProjectileType, E0, pLab, origin, 0_ns}); + + particle.SetNode(vNodePtr); + return std::make_tuple( + std::move(stack), + std::make_unique<decltype(corsika::SecondaryView(particle))>(particle)); +} + TEST_CASE("UrQMD") { SECTION("conversion") { REQUIRE_THROWS(process::UrQMD::ConvertFromUrQMD(106, 0)); @@ -62,7 +130,7 @@ TEST_CASE("UrQMD") { } feenableexcept(FE_INVALID); - corsika::random::RNGManager::GetInstance().RegisterRandomStream("urqmd"); + corsika::RNGManager::GetInstance().RegisterRandomStream("UrQMD"); UrQMD urqmd; SECTION("interaction length") { diff --git a/Processes/UrQMD/urqmdInterface.F b/corsika/modules/UrQMD/urqmdInterface.F similarity index 100% rename from Processes/UrQMD/urqmdInterface.F rename to corsika/modules/UrQMD/urqmdInterface.F diff --git a/corsika/modules/sibyll/CMakeLists.txt b/corsika/modules/sibyll/CMakeLists.txt new file mode 100644 index 000000000..7982d74c3 --- /dev/null +++ b/corsika/modules/sibyll/CMakeLists.txt @@ -0,0 +1,22 @@ +set (input_dir ${PROJECT_SOURCE_DIR}/corsika/modules/sibyll) +set (output_dir ${PROJECT_BINARY_DIR}/corsika/modules/sibyll) + +file (MAKE_DIRECTORY ${output_dir}) + +add_custom_command ( + OUTPUT ${output_dir}/Generated.inc + COMMAND ${input_dir}/code_generator.py + ${PROJECT_BINARY_DIR}/corsika/framework/core/particle_db.pkl + ${input_dir}/sibyll_codes.dat + DEPENDS code_generator.py + ${PROJECT_BINARY_DIR}/corsika/framework/core/particle_db.pkl + sibyll_codes.dat + WORKING_DIRECTORY + ${output_dir}/ + COMMENT "Generate conversion tables for particle codes SIBYLL <-> CORSIKA" + VERBATIM + ) + +add_custom_target (SourceDirLinkSib DEPENDS ${output_dir}/Generated.inc) +add_dependencies (CORSIKA8 SourceDirLinkSib) + diff --git a/corsika/modules/sibyll/Decay.hpp b/corsika/modules/sibyll/Decay.hpp new file mode 100644 index 000000000..9de7938a1 --- /dev/null +++ b/corsika/modules/sibyll/Decay.hpp @@ -0,0 +1,86 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/sequence/DecayProcess.hpp> + +#include <set> +#include <vector> + +namespace corsika::sibyll { + + class Decay : public corsika::DecayProcess<Decay> { + int fCount = 0; + bool handleAllDecays_ = true; + + public: + Decay(); + Decay(std::set< Code>); + ~Decay(); + + void Init(); + + void SetStable(const std::vector< Code>); + void SetUnstable(const std::vector< Code>); + + void SetStable(const corsika::Code); + void SetUnstable(const corsika::Code); + + // internally set all particles to decay/not to decay + void SetAllUnstable(); + void SetAllStable(); + + // will this particle be stable in sibyll ? + bool IsStable(const corsika::Code); + // will this particle decay in sibyll ? + bool IsUnstable(const corsika::Code); + // set particle with input code to decay or not + void SetDecay(const Code, const bool); + + + void PrintDecayConfig(const corsika::Code); + void PrintDecayConfig(); + void SetHadronsUnstable(); + + // is Sibyll::Decay set to handle the decay of this particle? + bool IsDecayHandled(const corsika::Code); + + // is decay possible in principle? + bool CanHandleDecay(const corsika::Code); + + // set Sibyll::Decay to handle the decay of this particle! + void SetHandleDecay(const corsika::Code); + // set Sibyll::Decay to handle the decay of this list of particles! + void SetHandleDecay(const std::vector< Code>); + // set Sibyll::Decay to handle all particle decays + void SetHandleAllDecay(); + + template <typename TParticle> + corsika::units::si::TimeType GetLifetime(TParticle const&) const; + + /** + In this function SIBYLL is called to produce to decay the input particle. + */ + + template <typename TSecondaryParticle> + void DoDecay(TSecondaryParticle&); + + private: + // internal routines to set particles stable and unstable in the COMMON blocks in + // sibyll + + std::set< Code> handledDecays_; + }; + +} // namespace corsika::sibyll + + +#include <corsika/detail/modules/sibyll/Decay.inl> + diff --git a/corsika/modules/sibyll/Interaction.hpp b/corsika/modules/sibyll/Interaction.hpp new file mode 100644 index 000000000..4c29a5f01 --- /dev/null +++ b/corsika/modules/sibyll/Interaction.hpp @@ -0,0 +1,92 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <tuple> + +namespace corsika::sibyll { + + class Interaction : public corsika::InteractionProcess<Interaction> { + + int count_ = 0; + int nucCount_ = 0; + bool initialized_ = false; + + public: + Interaction(); + ~Interaction(); + + void Init() {} + + void SetStable(std::vector<corsika::Code> const&); + void SetUnstable(std::vector<corsika::Code> const&); + + void SetUnstable(const corsika::Code); + void SetStable(const corsika::Code); + void SetAllUnstable(); + void SetAllStable(); + + bool WasInitialized() { return initialized_; } + bool IsValidCoMEnergy(corsika::units::si::HEPEnergyType ecm) const { + return (minEnergyCoM_ <= ecm) && (ecm <= maxEnergyCoM_); + } + int GetMaxTargetMassNumber() const { return maxTargetMassNumber_; } + corsika::units::si::HEPEnergyType GetMinEnergyCoM() const { return minEnergyCoM_; } + corsika::units::si::HEPEnergyType GetMaxEnergyCoM() const { return maxEnergyCoM_; } + bool IsValidTarget(corsika::Code TargetId) const { + return (corsika::GetNucleusA(TargetId) < maxTargetMassNumber_) && + corsika::IsNucleus(TargetId); + } + + std::tuple<corsika::units::si::CrossSectionType, corsika::units::si::CrossSectionType> + GetCrossSection(const corsika::Code, const corsika::Code, + const corsika::units::si::HEPEnergyType) const; + + template <typename TParticle> + corsika::units::si::GrammageType GetInteractionLength(TParticle const&) const; + + /** + In this function SIBYLL is called to produce one event. The + event is copied (and boosted) into the shower lab frame. + */ + + template <typename TProjectile> + corsika::EProcessReturn DoInteraction(TProjectile&); + + private: + corsika::RNG& RNG_ = + corsika::RNGManager::GetInstance().GetRandomStream("s_rndm"); + // FOR NOW keep trackedParticles private, could be configurable + std::vector<corsika::Code> const trackedParticles_ = { + corsika::Code::PiPlus, corsika::Code::PiMinus, + corsika::Code::Pi0, corsika::Code::KMinus, + corsika::Code::KPlus, corsika::Code::K0Long, + corsika::Code::K0Short, corsika::Code::SigmaPlus, + corsika::Code::Sigma0, corsika::Code::Sigma0Bar, + corsika::Code::SigmaMinus, corsika::Code::Lambda0, + corsika::Code::Xi0, corsika::Code::XiMinus, + corsika::Code::OmegaMinus, corsika::Code::DPlus, + corsika::Code::DMinus, corsika::Code::D0, + corsika::Code::MuMinus, corsika::Code::MuPlus, + corsika::Code::D0Bar}; + const bool internalDecays_ = true; + const corsika::units::si::HEPEnergyType minEnergyCoM_ = + 10. * 1e9 * corsika::units::si::electronvolt; + const corsika::units::si::HEPEnergyType maxEnergyCoM_ = + 1.e6 * 1e9 * corsika::units::si::electronvolt; + const int maxTargetMassNumber_ = 18; + }; + +} // namespace corsika::sibyll + +#include <corsika/detail/modules/sibyll/Interaction.inl> diff --git a/Processes/Sibyll/NuclearInteraction.h b/corsika/modules/sibyll/NuclearInteraction.hpp similarity index 68% rename from Processes/Sibyll/NuclearInteraction.h rename to corsika/modules/sibyll/NuclearInteraction.hpp index 4a561fad1..5ec3f1866 100644 --- a/Processes/Sibyll/NuclearInteraction.h +++ b/corsika/modules/sibyll/NuclearInteraction.hpp @@ -8,11 +8,11 @@ #pragma once -#include <corsika/particles/ParticleProperties.h> -#include <corsika/process/InteractionProcess.h> -#include <corsika/random/RNGManager.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/framework/random/RNGManager.hpp> -namespace corsika::process::sibyll { +namespace corsika::sibyll { class Interaction; // fwd-decl @@ -22,19 +22,21 @@ namespace corsika::process::sibyll { **/ template <class TEnvironment> class NuclearInteraction - : public corsika::process::InteractionProcess<NuclearInteraction<TEnvironment>> { + : public corsika::InteractionProcess<NuclearInteraction<TEnvironment>> { int count_ = 0; int nucCount_ = 0; public: - NuclearInteraction(corsika::process::sibyll::Interaction&, TEnvironment const&); + NuclearInteraction(corsika::sibyll::Interaction&, TEnvironment const&); ~NuclearInteraction(); + void Init(); + void InitializeNuclearCrossSections(); - void PrintCrossSectionTable(corsika::particles::Code); + void PrintCrossSectionTable(corsika::Code); corsika::units::si::CrossSectionType ReadCrossSectionTable( - const int, corsika::particles::Code, corsika::units::si::HEPEnergyType); + const int, corsika::Code, corsika::units::si::HEPEnergyType); corsika::units::si::HEPEnergyType GetMinEnergyPerNucleonCoM() { return gMinEnergyPerNucleonCoM_; } @@ -47,20 +49,20 @@ namespace corsika::process::sibyll { template <typename Particle> std::tuple<corsika::units::si::CrossSectionType, corsika::units::si::CrossSectionType> - GetCrossSection(Particle const& p, const corsika::particles::Code TargetId); + GetCrossSection(Particle const& p, const corsika::Code TargetId); template <typename Particle> corsika::units::si::GrammageType GetInteractionLength(Particle const&); template <typename TSecondaryView> - corsika::process::EProcessReturn DoInteraction(TSecondaryView&); + corsika::EProcessReturn DoInteraction(TSecondaryView&); private: TEnvironment const& environment_; - corsika::process::sibyll::Interaction& hadronicInteraction_; - std::map<corsika::particles::Code, int> targetComponentsIndex_; - corsika::random::RNG& RNG_ = - corsika::random::RNGManager::GetInstance().GetRandomStream("sibyll"); + corsika::sibyll::Interaction& hadronicInteraction_; + std::map<corsika::Code, int> targetComponentsIndex_; + corsika::RNG& RNG_ = + corsika::RNGManager::GetInstance().GetRandomStream("s_rndm"); static constexpr unsigned int gNSample_ = 500; // number of samples in MC estimation of cross section static constexpr unsigned int gMaxNucleusAProjectile_ = 56; @@ -74,4 +76,7 @@ namespace corsika::process::sibyll { 1.e6 * 1e9 * corsika::units::si::electronvolt; }; -} // namespace corsika::process::sibyll +} // namespace corsika::sibyll + + +#include <corsika/detail/modules/sibyll/NuclearInteraction.inl> diff --git a/corsika/modules/sibyll/ParticleConversion.hpp b/corsika/modules/sibyll/ParticleConversion.hpp new file mode 100644 index 000000000..52bcb3094 --- /dev/null +++ b/corsika/modules/sibyll/ParticleConversion.hpp @@ -0,0 +1,70 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <sibyll2.3d.hpp> + +#include <string> + +namespace corsika::sibyll { + + enum class SibyllCode : int8_t; + using SibyllCodeIntType = std::underlying_type<SibyllCode>::type; + + /** + These are the possible projectile for which Sibyll knows the cross section + */ + enum class SibyllXSClass : int8_t { + CannotInteract = 0, + Baryon = 1, + Pion = 2, + Kaon = 3, + }; + using SibyllXSClassIntType = std::underlying_type<SibyllXSClass>::type; + +#include <corsika/modules/sibyll/Generated.inc> + + SibyllCode constexpr ConvertToSibyll(corsika::Code pCode) { + return corsika2sibyll[static_cast<corsika::CodeIntType>(pCode)]; + } + + corsika::Code constexpr ConvertFromSibyll(SibyllCode pCode) { + auto const s = static_cast<SibyllCodeIntType>(pCode); + auto const corsikaCode = sibyll2corsika[s - minSibyll]; + if (corsikaCode == corsika::Code::Unknown) { + throw std::runtime_error(std::string("SIBYLL/CORSIKA conversion of ") + .append(std::to_string(s)) + .append(" impossible")); + } + return corsikaCode; + } + + int constexpr ConvertToSibyllRaw(corsika::Code pCode) { + return static_cast<int>(ConvertToSibyll(pCode)); + } + + int constexpr GetSibyllXSCode(corsika::Code pCode) { + return static_cast<SibyllXSClassIntType>( + corsika2sibyllXStype[static_cast<corsika::CodeIntType>(pCode)]); + } + + bool constexpr CanInteract(corsika::Code pCode) { + return GetSibyllXSCode(pCode) > 0; + } + + corsika::units::si::HEPMassType GetSibyllMass(corsika::Code const); + +} // namespace corsika::sibyll + + + +#include <corsika/detail/modules/sibyll/ParticleConversion.inl> diff --git a/corsika/modules/sibyll/Random.hpp b/corsika/modules/sibyll/Random.hpp new file mode 100644 index 000000000..3d82be78b --- /dev/null +++ b/corsika/modules/sibyll/Random.hpp @@ -0,0 +1,22 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/framework/random/RNGManager.hpp> +#include <random> + +namespace sibyll { + + double rndm_interface() { + static corsika::RNG& rng = + corsika::RNGManager::GetInstance().GetRandomStream("s_rndm"); + std::uniform_real_distribution<double> dist; + return dist(rng); + } + +} + diff --git a/corsika/modules/sibyll/SibStack.hpp b/corsika/modules/sibyll/SibStack.hpp new file mode 100644 index 000000000..d28fb66ab --- /dev/null +++ b/corsika/modules/sibyll/SibStack.hpp @@ -0,0 +1,147 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/modules/sibyll/ParticleConversion.hpp> +#include <corsika/framework/stack/Stack.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <sibyll2.3d.hpp> + +namespace corsika::sibyll { + + typedef corsika::Vector<corsika::units::si::hepmomentum_d> MomentumVector; + + class SibStackData { + + public: + void Dump() const {} + + void Clear() { s_plist_.np = 0; } + unsigned int GetSize() const { return s_plist_.np; } + unsigned int GetCapacity() const { return 8000; } + + void SetId(const unsigned int i, const int v) { s_plist_.llist[i] = v; } + void SetEnergy(const unsigned int i, const corsika::units::si::HEPEnergyType v) { + using namespace corsika::units::si; + s_plist_.p[3][i] = v / 1_GeV; + } + void SetMass(const unsigned int i, const corsika::units::si::HEPMassType v) { + using namespace corsika::units::si; + s_plist_.p[4][i] = v / 1_GeV; + } + void SetMomentum(const unsigned int i, const MomentumVector& v) { + using namespace corsika::units::si; + auto tmp = v.GetComponents(); + for (int idx = 0; idx < 3; ++idx) s_plist_.p[idx][i] = tmp[idx] / 1_GeV; + } + + int GetId(const unsigned int i) const { return s_plist_.llist[i]; } + corsika::units::si::HEPEnergyType GetEnergy(const int i) const { + using namespace corsika::units::si; + return s_plist_.p[3][i] * 1_GeV; + } + corsika::units::si::HEPEnergyType GetMass(const unsigned int i) const { + using namespace corsika::units::si; + return s_plist_.p[4][i] * 1_GeV; + } + MomentumVector GetMomentum(const unsigned int i) const { + using corsika::CoordinateSystem; + using corsika::QuantityVector; + using corsika::RootCoordinateSystem; + using namespace corsika::units::si; + CoordinateSystem& rootCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + QuantityVector<hepmomentum_d> components = { + s_plist_.p[0][i] * 1_GeV, s_plist_.p[1][i] * 1_GeV, s_plist_.p[2][i] * 1_GeV}; + return MomentumVector(rootCS, components); + } + + void Copy(const unsigned int i1, const unsigned int i2) { + s_plist_.llist[i2] = s_plist_.llist[i1]; + for (unsigned int i = 0; i < 5; ++i) s_plist_.p[i][i2] = s_plist_.p[i][i1]; + } + + void Swap(const unsigned int i1, const unsigned int i2) { + std::swap(s_plist_.llist[i1], s_plist_.llist[i2]); + for (unsigned int i = 0; i < 5; ++i) + std::swap(s_plist_.p[i][i1], s_plist_.p[i][i2]); + } + + void IncrementSize() { s_plist_.np++; } + void DecrementSize() { + if (s_plist_.np > 0) { s_plist_.np--; } + } + }; + + template <typename StackIteratorInterface> + class ParticleInterface : public corsika::ParticleBase<StackIteratorInterface> { + + using corsika::ParticleBase<StackIteratorInterface>::GetStackData; + using corsika::ParticleBase<StackIteratorInterface>::GetIndex; + + public: + void SetParticleData(const int vID, // corsika::sibyll::SibyllCode vID, + const corsika::units::si::HEPEnergyType vE, + const MomentumVector& vP, + const corsika::units::si::HEPMassType vM) { + SetPID(vID); + SetEnergy(vE); + SetMomentum(vP); + SetMass(vM); + } + + void SetParticleData(ParticleInterface<StackIteratorInterface>& /*parent*/, + const int vID, // corsika::sibyll::SibyllCode vID, + const corsika::units::si::HEPEnergyType vE, + const MomentumVector& vP, + const corsika::units::si::HEPMassType vM) { + SetPID(vID); + SetEnergy(vE); + SetMomentum(vP); + SetMass(vM); + } + + void SetEnergy(const corsika::units::si::HEPEnergyType v) { + GetStackData().SetEnergy(GetIndex(), v); + } + + corsika::units::si::HEPEnergyType GetEnergy() const { + return GetStackData().GetEnergy(GetIndex()); + } + + bool HasDecayed() const { return abs(GetStackData().GetId(GetIndex())) > 100; } + + void SetMass(const corsika::units::si::HEPMassType v) { + GetStackData().SetMass(GetIndex(), v); + } + + corsika::units::si::HEPEnergyType GetMass() const { + return GetStackData().GetMass(GetIndex()); + } + + void SetPID(const int v) { GetStackData().SetId(GetIndex(), v); } + + corsika::sibyll::SibyllCode GetPID() const { + return static_cast<corsika::sibyll::SibyllCode>( + GetStackData().GetId(GetIndex())); + } + + MomentumVector GetMomentum() const { return GetStackData().GetMomentum(GetIndex()); } + + void SetMomentum(const MomentumVector& v) { + GetStackData().SetMomentum(GetIndex(), v); + } + }; + + typedef corsika::Stack<SibStackData, ParticleInterface> SibStack; + +} // end namespace corsika::sibyll diff --git a/corsika/modules/sibyll/code_generator.py b/corsika/modules/sibyll/code_generator.py new file mode 100755 index 000000000..22cb11022 --- /dev/null +++ b/corsika/modules/sibyll/code_generator.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 + +# (c) Copyright 2018-2019 CORSIKA Project, corsika-project@lists.kit.edu +# +# See file AUTHORS for a list of contributors. +# +# This software is distributed under the terms of the GNU General Public +# Licence version 3 (GPL Version 3). See file LICENSE for a full version of +# the license. + + +import pickle, sys, itertools + + + +def load_particledb(filename): + ''' + loads the pickled particle_db (which is an OrderedDict) + ''' + with open(filename, "rb") as f: + particle_db = pickle.load(f) + return particle_db + + + +def read_sibyll_codes(filename, particle_db): + ''' + reads to sibyll codes data file + + For particls known to sibyll, add 'sibyll_code' and 'sibyll_xsType' to particle_db + ''' + with open(filename) as f: + for line in f: + line = line.strip() + if len(line)==0 or line[0] == '#': + continue + identifier, sib_code, canInteractFlag, xsType = line.split() + try: + particle_db[identifier]["sibyll_code"] = int(sib_code) + particle_db[identifier]["sibyll_xsType"] = xsType + except KeyError as e: + raise Exception("Identifier '{:s}' not found in particle_db".format(identifier)) + + + + +def generate_sibyll_enum(particle_db): + ''' + generates the enum to access sibyll particles by readable names + ''' + output = "enum class SibyllCode : int8_t {\n" + for identifier, pData in particle_db.items(): + if 'sibyll_code' in pData: + output += " {:s} = {:d},\n".format(identifier, pData['sibyll_code']) + output += "};\n" + return output + + + +def generate_corsika2sibyll(particle_db): + ''' + generates the look-up table to convert corsika codes to sibyll codes + ''' + string = "std::array<SibyllCode, {:d}> constexpr corsika2sibyll = {{\n".format(len(particle_db)) + for identifier, pData in particle_db.items(): + if 'sibyll_code' in pData: + string += " SibyllCode::{:s}, \n".format(identifier) + else: + string += " SibyllCode::Unknown, // {:s}\n".format(identifier + ' not implemented in SIBYLL') + string += "};\n" + return string + + + +def generate_corsika2sibyll_xsType(particle_db): + ''' + generates the look-up table to convert corsika codes to sibyll codes + ''' + string = "std::array<SibyllXSClass, {:d}> constexpr corsika2sibyllXStype = {{\n".format(len(particle_db)) + for identifier, pData in particle_db.items(): + if 'sibyll_xsType' in pData: + string += " SibyllXSClass::{:s}, // {:s}\n".format(pData['sibyll_xsType'], identifier) + else: + string += " SibyllXSClass::CannotInteract, // {:s}\n".format(identifier + ' not implemented in SIBYLL') + string += "};\n" + return string + + +def generate_sibyll2corsika(particle_db) : + ''' + generates the look-up table to convert sibyll codes to corsika codes + ''' + string = "" + + minID = 0 + for identifier, pData in particle_db.items() : + if 'sibyll_code' in pData: + minID = min(minID, pData['sibyll_code']) + + string += "SibyllCodeIntType constexpr minSibyll = {:d};\n\n".format(minID) + + pDict = {} + for identifier, pData in particle_db.items() : + if 'sibyll_code' in pData: + sib_code = pData['sibyll_code'] - minID + pDict[sib_code] = identifier + + nPart = max(pDict.keys()) - min(pDict.keys()) + 1 + string += "std::array<corsika::Code, {:d}> constexpr sibyll2corsika = {{\n".format(nPart) + + for iPart in range(nPart) : + if iPart in pDict: + identifier = pDict[iPart] + else: + identifier = "Unknown" + string += " corsika::Code::{:s}, \n".format(identifier) + + string += "};\n" + return string + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("usage: {:s} <particle_db.pkl> <sibyll_codes.dat>".format(sys.argv[0]), file=sys.stderr) + sys.exit(1) + + print("code_generator.py for SIBYLL") + + particle_db = load_particledb(sys.argv[1]) + read_sibyll_codes(sys.argv[2], particle_db) + + with open("Generated.inc", "w") as f: + print("// this file is automatically generated\n// edit at your own risk!\n", file=f) + print(generate_sibyll_enum(particle_db), file=f) + print(generate_corsika2sibyll(particle_db), file=f) + print(generate_sibyll2corsika(particle_db), file=f) + print(generate_corsika2sibyll_xsType(particle_db), file=f) diff --git a/corsika/modules/sibyll/sibyll_codes.dat b/corsika/modules/sibyll/sibyll_codes.dat new file mode 100644 index 000000000..d8cce42e4 --- /dev/null +++ b/corsika/modules/sibyll/sibyll_codes.dat @@ -0,0 +1,132 @@ +# input file for particle conversion to/from SIBYLL +# the format of this file is: "corsika-identifier" "sibyll-id" "can-interact-in-sibyll" "cross-section-type" + +# The unknown particle is to handle all particles that are not known to SIBYLL. +# It is important that sibyll-id does not overlap with any existing sibyll particle! +# Be careful +Unknown 0 0 CannotInteract + +# Here is the list of particles known to sibyll +Electron 3 0 CannotInteract +Positron 2 0 CannotInteract +NuE 15 0 CannotInteract +NuEBar 16 0 CannotInteract +MuMinus 5 0 CannotInteract +MuPlus 4 0 CannotInteract +NuMu 17 0 CannotInteract +NuMuBar 18 0 CannotInteract +TauMinus 91 0 CannotInteract +TauPlus 90 0 CannotInteract +NuTau 92 0 CannotInteract +NuTauBar 93 0 CannotInteract +Gamma 1 0 CannotInteract +Pi0 6 1 Pion +# rho0 could interact but sibyll has no cross section/interaction length. was used for gamma had int +Rho0 27 0 CannotInteract +K0Long 11 1 Kaon +K0 21 0 Kaon +K0Bar 22 0 Kaon +PiPlus 7 1 Pion +PiMinus 8 1 Pion +RhoPlus 25 0 CannotInteract +RhoMinus 26 0 CannotInteract +Eta 23 0 CannotInteract +EtaPrime 24 0 CannotInteract +Pi1300Plus 62 0 CannotInteract +Pi1300Minus 63 0 CannotInteract +Pi1300_0 61 0 CannotInteract +Omega 32 0 CannotInteract +K0Short 12 1 Kaon +KStar0 30 0 CannotInteract +KStar0Bar 31 0 CannotInteract +KPlus 9 1 Kaon +KMinus 10 1 Kaon +KStarPlus 28 0 CannotInteract +KStarMinus 29 0 CannotInteract +KStar0_1430_0 66 0 CannotInteract +KStar0_1430_0Bar 67 0 CannotInteract +KStar0_1430_Plus 64 0 CannotInteract +KStar0_1430_MinusBar 65 0 CannotInteract +DPlus 59 1 Kaon +DMinus 60 1 Kaon +DStarPlus 78 0 CannotInteract +DStarMinus 79 0 CannotInteract +D0 71 1 Kaon +D0Bar 72 1 Kaon +DStar0 80 0 CannotInteract +DStar0Bar 81 0 CannotInteract +DsPlus 74 1 Kaon +DsMinus 75 1 Kaon +DStarSPlus 76 0 CannotInteract +DStarSMinus 77 0 CannotInteract +EtaC 73 0 CannotInteract +Neutron 14 1 Baryon +AntiNeutron -14 1 Baryon +Delta0 42 0 CannotInteract +Delta0Bar -42 0 CannotInteract +DeltaMinus 43 0 CannotInteract +DeltaPlusBar -43 0 CannotInteract +Proton 13 1 Baryon +AntiProton -13 1 Baryon +N1440Plus 51 0 CannotInteract +N1440MinusBar -51 0 CannotInteract +N1440_0 52 0 CannotInteract +N1440_0Bar -52 0 CannotInteract +N1710Plus 53 0 CannotInteract +N1710MinusBar -53 0 CannotInteract +N1710_0 54 0 CannotInteract +N1710_0Bar -54 0 CannotInteract +DeltaPlus 41 0 CannotInteract +DeltaMinusBar -41 0 CannotInteract +DeltaPlusPlus 40 0 CannotInteract +DeltaMinusMinusBar -40 0 CannotInteract +SigmaMinus 36 1 Baryon +SigmaPlusBar -36 1 Baryon +SigmaStarMinus 46 0 CannotInteract +SigmaStarPlusBar -46 0 CannotInteract +SigmaStarPlus 44 0 CannotInteract +SigmaStarMinusBar -44 0 CannotInteract +SigmaStar0 45 0 CannotInteract +SigmaStar0Bar -45 0 CannotInteract +Lambda0 39 1 Baryon +Lambda0Bar -39 1 Baryon +Sigma0 35 1 Baryon +Sigma0Bar -35 1 Baryon +SigmaPlus 34 1 Baryon +SigmaMinusBar -34 1 Baryon +XiMinus 38 1 Baryon +XiPlusBar -38 1 Baryon +Xi0 37 1 Baryon +Xi0Bar -37 1 Baryon +XiStarMinus 48 0 CannotInteract +XiStarPlusBar -48 0 CannotInteract +XiStar0 47 0 CannotInteract +XiStar0Bar -47 0 CannotInteract +OmegaMinus 49 0 CannotInteract +OmegaPlusBar -49 0 CannotInteract +SigmaC0 86 0 CannotInteract +SigmaC0Bar -86 0 CannotInteract +SigmaStarC0 96 0 CannotInteract +SigmaStarC0Bar -96 0 CannotInteract +LambdaCPlus 89 1 Baryon +LambdaCMinusBar -89 1 Baryon +XiC0 88 1 Baryon +XiC0Bar -88 1 Baryon +SigmaCPlus 85 0 CannotInteract +SigmaCMinusBar -85 0 CannotInteract +SigmaStarCPlus 95 0 CannotInteract +SigmaStarCMinusBar -95 0 CannotInteract +SigmaCPlusPlus 84 0 CannotInteract +SigmaCMinusMinusBar -84 0 CannotInteract +SigmaStarCPlusPlus 94 0 CannotInteract +SigmaStarCMinusMinusBar -94 0 CannotInteract +XiCPlus 87 1 Baryon +XiCMinusBar -87 1 Baryon +XiStarCPlus 97 0 CannotInteract +XiStarCMinusBar -97 0 CannotInteract +XiStarC0 98 0 CannotInteract +XiStarC0Bar -98 0 CannotInteract +OmegaC0 99 0 CannotInteract +OmegaC0Bar -99 0 CannotInteract +Jpsi 83 0 CannotInteract +Phi 33 0 CannotInteract diff --git a/Processes/EnergyLoss/EnergyLoss.h b/corsika/process/EnergyLoss.hpp similarity index 73% rename from Processes/EnergyLoss/EnergyLoss.h rename to corsika/process/EnergyLoss.hpp index f60e16b35..6378824d2 100644 --- a/Processes/EnergyLoss/EnergyLoss.h +++ b/corsika/process/EnergyLoss.hpp @@ -8,20 +8,19 @@ #pragma once -#include <corsika/environment/ShowerAxis.h> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Vector.h> -#include <corsika/process/ContinuousProcess.h> -#include <corsika/units/PhysicalUnits.h> - -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/framework/sequence/ContinuousProcess.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <map> -namespace corsika::process::energy_loss { +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> + +namespace corsika { - class EnergyLoss : public corsika::process::ContinuousProcess<EnergyLoss> { + class EnergyLoss : public corsika::ContinuousProcess<EnergyLoss> { using MeVgcm2 = decltype(1e6 * units::si::electronvolt / units::si::gram * units::si::square(1e-2 * units::si::meter)); @@ -29,8 +28,15 @@ namespace corsika::process::energy_loss { void MomentumUpdate(setup::Stack::ParticleType&, units::si::HEPEnergyType Enew); public: - EnergyLoss(environment::ShowerAxis const& showerAxis, - corsika::units::si::HEPEnergyType emCut); + + template <typename TDim> + EnergyLoss(geometry::Point const& injectionPoint, + geometry::Vector<TDim> const& direction) + : InjectionPoint_(injectionPoint) + , ShowerAxisDirection_(direction.normalized()) {} + + EnergyLoss(setup::Trajectory const& trajectory) + : EnergyLoss(trajectory.GetPosition(0), trajectory.GetV0()){}; process::EProcessReturn DoContinuous(setup::Stack::ParticleType&, setup::Trajectory const&); @@ -68,4 +74,5 @@ namespace corsika::process::energy_loss { using namespace units::si; return 0.0001_g / square(1_cm); }); -} // namespace corsika::process::energy_loss +} // namespace corsika + diff --git a/Processes/HadronicElasticModel/HadronicElasticModel.h b/corsika/process/HadronicElasticModel.hpp similarity index 74% rename from Processes/HadronicElasticModel/HadronicElasticModel.h rename to corsika/process/HadronicElasticModel.hpp index 3273bfec1..3b15c4b52 100644 --- a/Processes/HadronicElasticModel/HadronicElasticModel.h +++ b/corsika/process/HadronicElasticModel.hpp @@ -8,14 +8,14 @@ #pragma once -#include <corsika/particles/ParticleProperties.h> -#include <corsika/process/InteractionProcess.h> -#include <corsika/random/RNGManager.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/framework/random/RNGManager.hpp> -#include <corsika/units/PhysicalConstants.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalConstants.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> -namespace corsika::process::HadronicElasticModel { +namespace corsika::HadronicElasticModel { /** * A simple model for elastic hadronic interactions based on the formulas * in Gaisser, Engel, Resconi, Cosmic Rays and Particle Physics (Cambridge Univ. Press, @@ -25,7 +25,7 @@ namespace corsika::process::HadronicElasticModel { * \f$pp\f$-like even for nuclei. */ class HadronicElasticInteraction - : public corsika::process::InteractionProcess<HadronicElasticInteraction> { + : public corsika::InteractionProcess<HadronicElasticInteraction> { private: corsika::units::si::CrossSectionType const fX, fY; @@ -39,8 +39,8 @@ namespace corsika::process::HadronicElasticModel { using eV2 = decltype(units::si::square(units::si::electronvolt)); using inveV2 = decltype(1 / units::si::square(units::si::electronvolt)); - corsika::random::RNG& fRNG = - corsika::random::RNGManager::GetInstance().GetRandomStream( + corsika::RNG& fRNG = + corsika::RNGManager::GetInstance().GetRandomStream( "HadronicElasticModel"); inveV2 B(eV2 s) const; @@ -54,8 +54,9 @@ namespace corsika::process::HadronicElasticModel { template <typename Particle> corsika::units::si::GrammageType GetInteractionLength(Particle const& p); - template <typename TStackView> - corsika::process::EProcessReturn DoInteraction(TStackView&); + template <typename Particle> + corsika::EProcessReturn DoInteraction(Particle&); }; -} // namespace corsika::process::HadronicElasticModel +} // namespace corsika::HadronicElasticModel + diff --git a/Processes/ObservationPlane/ObservationPlane.h b/corsika/process/ObservationPlane.hpp similarity index 63% rename from Processes/ObservationPlane/ObservationPlane.h rename to corsika/process/ObservationPlane.hpp index 3b530f621..5749e69d9 100644 --- a/Processes/ObservationPlane/ObservationPlane.h +++ b/corsika/process/ObservationPlane.hpp @@ -8,35 +8,36 @@ #pragma once -#include <corsika/geometry/Plane.h> -#include <corsika/process/ContinuousProcess.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/geometry/Plane.hpp> +#include <corsika/framework/sequence/ContinuousProcess.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <fstream> -namespace corsika::process::observation_plane { +#include "corsika/setup/SetupStack.hpp" +#include "corsika/setup/SetupTrajectory.hpp" + +namespace corsika::observation_plane { /** * The ObservationPlane writes PDG codes, energies, and distances of particles to the * central point of the plane into its output file. The particles are considered * "absorbed" afterwards. */ - class ObservationPlane : public corsika::process::ContinuousProcess<ObservationPlane> { + class ObservationPlane : public corsika::ContinuousProcess<ObservationPlane> { public: ObservationPlane(geometry::Plane const&, geometry::Vector<units::si::dimensionless_d> const&, std::string const&, bool = true); - corsika::process::EProcessReturn DoContinuous( - corsika::setup::Stack::ParticleType& vParticle, - corsika::setup::Trajectory const& vTrajectory); + corsika::EProcessReturn DoContinuous( + corsika::Stack::ParticleType const& vParticle, + corsika::Trajectory const& vTrajectory); corsika::units::si::LengthType MaxStepLength( - corsika::setup::Stack::ParticleType const&, - corsika::setup::Trajectory const& vTrajectory); + corsika::Stack::ParticleType const&, + corsika::Trajectory const& vTrajectory); void ShowResults() const; void Reset(); @@ -51,4 +52,6 @@ namespace corsika::process::observation_plane { unsigned int count_ground_ = 0; geometry::Vector<units::si::dimensionless_d> const xAxis_, yAxis_; }; -} // namespace corsika::process::observation_plane +} // namespace corsika::observation_plane + + diff --git a/Processes/ParticleCut/ParticleCut.h b/corsika/process/ParticleCut.hpp similarity index 82% rename from Processes/ParticleCut/ParticleCut.h rename to corsika/process/ParticleCut.hpp index b0e897753..5674e2c03 100644 --- a/Processes/ParticleCut/ParticleCut.h +++ b/corsika/process/ParticleCut.hpp @@ -8,14 +8,12 @@ #pragma once -#include <corsika/particles/ParticleProperties.h> -#include <corsika/process/ContinuousProcess.h> -#include <corsika/process/SecondariesProcess.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> -#include <corsika/units/PhysicalUnits.h> - -namespace corsika::process { +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/sequence/SecondariesProcess.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include "corsika/setup/SetupStack.hpp" + +namespace corsika { namespace particle_cut { class ParticleCut : public process::SecondariesProcess<ParticleCut>, public corsika::process::ContinuousProcess<ParticleCut> { @@ -31,7 +29,11 @@ namespace corsika::process { unsigned int uiInvCount = 0; public: - ParticleCut(const units::si::HEPEnergyType eCut, bool em, bool inv); + ParticleCut(const units::si::HEPEnergyType vCut) + : fECut(vCut) {} + + bool ParticleIsInvisible(particles::Code) const; + EProcessReturn DoSecondaries(corsika::StackView&); void DoSecondaries(corsika::setup::StackView&); @@ -64,4 +66,6 @@ namespace corsika::process { bool ParticleIsInvisible(particles::Code) const; }; } // namespace particle_cut -} // namespace corsika::process +} // namespace corsika + + diff --git a/corsika/process/Pythia/Decay.hpp b/corsika/process/Pythia/Decay.hpp new file mode 100644 index 000000000..f8cfa8f97 --- /dev/null +++ b/corsika/process/Pythia/Decay.hpp @@ -0,0 +1,58 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <Pythia8/Pythia.h> + +#include <iostream> +#include <vector> +#include <tuple> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/sequence/DecayProcess.hpp> + +namespace corsika { + + namespace pythia { + + typedef corsika::Vector<corsika::units::si::hepmomentum_d> MomentumVector; + + class Decay : public corsika::DecayProcess<Decay> + { + + const std::vector<particles::Code> fTrackedParticles; + int fCount = 0; + + public: + + Decay(std::vector<corsika::Code>); + ~Decay(); + + void SetParticleListStable(std::vector<particles::Code> const& ); + void SetUnstable(const corsika::Code); + void SetStable(const corsika::Code); + + corsika::units::si::TimeType GetLifetime(corsika::Stack::ParticleType const&); + + void DoDecay(corsika::StackView::ParticleType&); + + private: + void SetUnstable(const corsika::particles::Code); + void SetStable(const corsika::particles::Code); + void SetStable(const std::vector<particles::Code>); + bool IsStable(const corsika::particles::Code); + + Pythia8::Pythia fPythia; + std::set<particles::Code> handledDecays_; + }; + + } // namespace pythia +} // namespace corsika + +#include <corsika/detail/process/Pythia/Decay.inl> diff --git a/Processes/Pythia/Interaction.h b/corsika/process/Pythia/Interaction.hpp similarity index 58% rename from Processes/Pythia/Interaction.h rename to corsika/process/Pythia/Interaction.hpp index ef2bdfbcc..27634e0f0 100644 --- a/Processes/Pythia/Interaction.h +++ b/corsika/process/Pythia/Interaction.hpp @@ -10,15 +10,15 @@ #include <Pythia8/Pythia.h> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/process/InteractionProcess.h> -#include <corsika/random/RNGManager.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <tuple> -namespace corsika::process::pythia { +namespace corsika::pythia { - class Interaction : public corsika::process::InteractionProcess<Interaction> { + class Interaction : public corsika::InteractionProcess<Interaction> { int fCount = 0; bool fInitialized = false; @@ -29,8 +29,8 @@ namespace corsika::process::pythia { ~Interaction() = default; void SetParticleListStable(std::vector<particles::Code> const&); - void SetUnstable(const corsika::particles::Code); - void SetStable(const corsika::particles::Code); + void SetUnstable(const corsika::Code); + void SetStable(const corsika::Code); bool WasInitialized() { return fInitialized; } bool ValidCoMEnergy(corsika::units::si::HEPEnergyType ecm) { @@ -38,13 +38,13 @@ namespace corsika::process::pythia { return (10_GeV < ecm) && (ecm < 1_PeV); } - bool CanInteract(const corsika::particles::Code); - void ConfigureLabFrameCollision(const corsika::particles::Code, - const corsika::particles::Code, + bool CanInteract(const corsika::Code); + void ConfigureLabFrameCollision(const corsika::Code, + const corsika::Code, const corsika::units::si::HEPEnergyType); std::tuple<corsika::units::si::CrossSectionType, corsika::units::si::CrossSectionType> - GetCrossSection(const corsika::particles::Code BeamId, - const corsika::particles::Code TargetId, + GetCrossSection(const corsika::Code BeamId, + const corsika::Code TargetId, const corsika::units::si::HEPEnergyType CoMenergy); template <typename TParticle> @@ -55,15 +55,17 @@ namespace corsika::process::pythia { event is copied (and boosted) into the shower lab frame. */ - template <typename TSecondaryView> - corsika::process::EProcessReturn DoInteraction(TSecondaryView&); + template <typename TProjectile> + corsika::EProcessReturn DoInteraction(TProjectile&); private: - corsika::random::RNG& fRNG = - corsika::random::RNGManager::GetInstance().GetRandomStream("pythia"); + corsika::RNG& fRNG = + corsika::RNGManager::GetInstance().GetRandomStream("pythia"); Pythia8::Pythia fPythia; Pythia8::SigmaTotal fSigma; const bool fInternalDecays = true; }; -} // namespace corsika::process::pythia +} // namespace corsika::pythia + +#endif diff --git a/corsika/process/Pythia/Random.hpp b/corsika/process/Pythia/Random.hpp new file mode 100644 index 000000000..339a9cf87 --- /dev/null +++ b/corsika/process/Pythia/Random.hpp @@ -0,0 +1,30 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <Pythia8/Pythia.h> +#include <corsika/framework/random/RNGManager.hpp> + +namespace corsika { + + namespace pythia { + + class Random : public Pythia8::RndmEngine { + double flat(); + + private: + std::uniform_real_distribution<double> fDist; + corsika::RNG& fRNG = + corsika::RNGManager::GetInstance().GetRandomStream("pythia"); + }; + + } // namespace pythia +} // namespace corsika + +#endif diff --git a/corsika/process/QGSJetII/Interaction.hpp b/corsika/process/QGSJetII/Interaction.hpp new file mode 100644 index 000000000..dbe201090 --- /dev/null +++ b/corsika/process/QGSJetII/Interaction.hpp @@ -0,0 +1,63 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <string> + +namespace corsika::qgsjetII { + + class Interaction : public corsika::InteractionProcess<Interaction> { + + std::string data_path_; + int count_ = 0; + bool initialized_ = false; + QgsjetIIHadronType alternate_ = + QgsjetIIHadronType::PiPlusType; // for pi0, rho0 projectiles + + public: + Interaction(const std::string& dataPath = ""); + ~Interaction(); + + bool WasInitialized() { return initialized_; } + int GetMaxTargetMassNumber() const { return maxMassNumber_; } + bool IsValidTarget(corsika::Code TargetId) const { + return (corsika::GetNucleusA(TargetId) < maxMassNumber_) && + corsika::IsNucleus(TargetId); + } + + corsika::units::si::CrossSectionType GetCrossSection( + const corsika::Code, const corsika::Code, + const corsika::units::si::HEPEnergyType, const unsigned int Abeam = 0, + const unsigned int Atarget = 0) const; + + template <typename TParticle> + corsika::units::si::GrammageType GetInteractionLength(TParticle const&) const; + + /** + In this function QGSJETII is called to produce one event. The + event is copied (and boosted) into the shower lab frame. + */ + + template <typename TProjectile> + corsika::EProcessReturn DoInteraction(TProjectile&); + + private: + corsika::RNG& fRNG = + corsika::RNGManager::GetInstance().GetRandomStream("qgran"); + const int maxMassNumber_ = 208; + }; + +} // namespace corsika::qgsjetII + +#endif diff --git a/corsika/process/QGSJetII/ParticleConversion.hpp b/corsika/process/QGSJetII/ParticleConversion.hpp new file mode 100644 index 000000000..aef660ee2 --- /dev/null +++ b/corsika/process/QGSJetII/ParticleConversion.hpp @@ -0,0 +1,88 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/ParticleProperties.hpp> + +#include <string> + +namespace corsika::qgsjetII { + + /** + These are the possible secondaries produced by QGSJetII + */ + enum class QgsjetIICode : int8_t; + using QgsjetIICodeIntType = std::underlying_type<QgsjetIICode>::type; + + /** + These are the possible projectile for which QGSJetII knwos cross section + */ + enum class QgsjetIIXSClass : int8_t { + CannotInteract = 0, + LightMesons = 1, + Baryons = 2, + Kaons = 3, + }; + using QgsjetIIXSClassIntType = std::underlying_type<QgsjetIIXSClass>::type; + + /** + These are the only possible projectile types in QGSJetII + */ + enum class QgsjetIIHadronType : int8_t { + UndefinedType = 0, + PiPlusType = +1, + PiMinusType = -1, + ProtonType = +2, + AntiProtonType = -2, + NeutronType = +3, + AntiNeutronType = -3, + KaonPlusType = +4, + KaonMinusType = -4, + Kaon0LType = +5, + Kaon0SType = -5, + // special codes, not in QGSJetII + NucleusType = 100, + NeutralLightMesonType = 101, + }; + using QgsjetIIHadronTypeIntType = std::underlying_type<QgsjetIIHadronType>::type; + +#include <corsika/process/qgsjetII/Generated.inc> + + QgsjetIICode constexpr ConvertToQgsjetII(corsika::Code pCode) { + return static_cast<QgsjetIICode>( + corsika2qgsjetII[static_cast<corsika::CodeIntType>(pCode)]); + } + + corsika::Code constexpr ConvertFromQgsjetII(QgsjetIICode pCode) { + auto const pCodeInt = static_cast<QgsjetIICodeIntType>(pCode); + auto const corsikaCode = qgsjetII2corsika[pCodeInt - minQgsjetII]; + if (corsikaCode == corsika::Code::Unknown) { + throw std::runtime_error(std::string("QGSJETII/CORSIKA conversion of pCodeInt=") + .append(std::to_string(pCodeInt)) + .append(" impossible")); + } + return corsikaCode; + } + + int constexpr ConvertToQgsjetIIRaw(corsika::Code pCode) { + return static_cast<int>(ConvertToQgsjetII(pCode)); + } + + int constexpr GetQgsjetIIXSCode(corsika::Code pCode) { + if (pCode == corsika::Code::Nucleus) return 2; + return corsika2qgsjetIIXStype[static_cast<corsika::CodeIntType>(pCode)]; + } + + bool constexpr CanInteract(corsika::Code pCode) { + return (GetQgsjetIIXSCode(pCode) > 0) && (ConvertToQgsjetIIRaw(pCode) <= 5); + } + +} // namespace corsika::qgsjetII + +} // namespace corsika::process::qgsjetII diff --git a/corsika/process/QGSJetII/QGSJetIIFragmentsStack.hpp b/corsika/process/QGSJetII/QGSJetIIFragmentsStack.hpp new file mode 100644 index 000000000..bbb852f24 --- /dev/null +++ b/corsika/process/QGSJetII/QGSJetIIFragmentsStack.hpp @@ -0,0 +1,76 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/process/QGSJetII/ParticleConversion.hpp> +#include <corsika/process/QGSJetII/qgsjet-II-04.h> +#include <corsika/framework/stack/Stack.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +namespace corsika::qgsjetII { + + class QGSJetIIFragmentsStackData { + + public: + void Dump() const {} + + void Clear() { + qgarr13_.nsf = 0; + qgarr55_.nwt = 0; + } + unsigned int GetSize() const { return qgarr13_.nsf; } + unsigned int GetCapacity() const { return iapmax; } + + static unsigned int GetWoundedNucleonsTarget() { return qgarr55_.nwt; } + static unsigned int GetWoundedNucleonsProjectile() { return qgarr55_.nwp; } + + int GetFragmentSize(const unsigned int i) const { return qgarr13_.iaf[i]; } + void SetFragmentSize(const unsigned int i, const int v) { qgarr13_.iaf[i] = v; } + + void Copy(const unsigned int i1, const unsigned int i2) { + qgarr13_.iaf[i2] = qgarr13_.iaf[i1]; + } + + void Swap(const unsigned int i1, const unsigned int i2) { + std::swap(qgarr13_.iaf[i1], qgarr13_.iaf[i2]); + } + + void IncrementSize() { qgarr13_.nsf++; } + void DecrementSize() { + if (qgarr13_.nsf > 0) { qgarr13_.nsf--; } + } + }; + + template <typename StackIteratorInterface> + class FragmentsInterface : public corsika::ParticleBase<StackIteratorInterface> { + + using corsika::ParticleBase<StackIteratorInterface>::GetStackData; + using corsika::ParticleBase<StackIteratorInterface>::GetIndex; + + public: + void SetParticleData(const int vSize) { SetFragmentSize(vSize); } + + void SetParticleData(FragmentsInterface<StackIteratorInterface>& /*parent*/, + const int vSize) { + SetFragmentSize(vSize); + } + + void SetFragmentSize(const int v) { GetStackData().SetFragmentSize(GetIndex(), v); } + + double GetFragmentSize() const { return GetStackData().GetFragmentSize(GetIndex()); } + }; + + typedef corsika::Stack<QGSJetIIFragmentsStackData, FragmentsInterface> + QGSJetIIFragmentsStack; + +} // end namespace corsika::qgsjetII + +#endif diff --git a/corsika/process/QGSJetII/QGSJetIIStack.hpp b/corsika/process/QGSJetII/QGSJetIIStack.hpp new file mode 100644 index 000000000..9bd8512d1 --- /dev/null +++ b/corsika/process/QGSJetII/QGSJetIIStack.hpp @@ -0,0 +1,129 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/geometry/CoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/process/QGSJetII/ParticleConversion.hpp> +#include <corsika/process/QGSJetII/qgsjet-II-04.h> +#include <corsika/framework/stack/Stack.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> + +namespace corsika::qgsjetII { + + typedef corsika::Vector<corsika::units::si::hepmomentum_d> MomentumVector; + + class QGSJetIIStackData { + + public: + void Dump() const {} + + void Clear() { + qgarr12_.nsp = 0; + qgarr13_.nsf = 0; + qgarr55_.nwt = 0; + } + unsigned int GetSize() const { return qgarr12_.nsp; } + unsigned int GetCapacity() const { return nptmax; } + + void SetId(const unsigned int i, const int v) { qgarr14_.ich[i] = v; } + void SetEnergy(const unsigned int i, const corsika::units::si::HEPEnergyType v) { + using namespace corsika::units::si; + qgarr14_.esp[i][0] = v / 1_GeV; + } + + void SetMomentum(const unsigned int i, const MomentumVector& v) { + using namespace corsika::units::si; + auto tmp = v.GetComponents(); + qgarr14_.esp[i][2] = tmp[0] / 1_GeV; + qgarr14_.esp[i][3] = tmp[1] / 1_GeV; + qgarr14_.esp[i][1] = tmp[2] / 1_GeV; + } + + int GetId(const unsigned int i) const { return qgarr14_.ich[i]; } + corsika::units::si::HEPEnergyType GetEnergy(const int i) const { + using namespace corsika::units::si; + return qgarr14_.esp[i][0] * 1_GeV; + } + MomentumVector GetMomentum(const unsigned int i, const corsika::CoordinateSystem& CS) const { + using namespace corsika::units::si; + geometry::QuantityVector<hepmomentum_d> components = {qgarr14_.esp[i][2] * 1_GeV, + qgarr14_.esp[i][3] * 1_GeV, + qgarr14_.esp[i][1] * 1_GeV}; + return MomentumVector(CS, components); + } + + void Copy(const unsigned int i1, const unsigned int i2) { + qgarr14_.ich[i2] = qgarr14_.ich[i1]; + for (unsigned int i = 0; i < 4; ++i) qgarr14_.esp[i2][i] = qgarr14_.esp[i1][i]; + } + + void Swap(const unsigned int i1, const unsigned int i2) { + std::swap(qgarr14_.ich[i1], qgarr14_.ich[i2]); + for (unsigned int i = 0; i < 4; ++i) + std::swap(qgarr14_.esp[i1][i], qgarr14_.esp[i2][i]); + } + + void IncrementSize() { qgarr12_.nsp++; } + void DecrementSize() { + if (qgarr12_.nsp > 0) { qgarr12_.nsp--; } + } + }; + + template <typename StackIteratorInterface> + class ParticleInterface : public corsika::ParticleBase<StackIteratorInterface> { + + using corsika::ParticleBase<StackIteratorInterface>::GetStackData; + using corsika::ParticleBase<StackIteratorInterface>::GetIndex; + + public: + void SetParticleData(const int vID, const corsika::units::si::HEPEnergyType vE, + const MomentumVector& vP, + const corsika::units::si::HEPMassType) { + SetPID(vID); + SetEnergy(vE); + SetMomentum(vP); + } + + void SetParticleData(ParticleInterface<StackIteratorInterface>& /*parent*/, + const int vID, const corsika::units::si::HEPEnergyType vE, + const MomentumVector& vP, + const corsika::units::si::HEPMassType) { + SetPID(vID); + SetEnergy(vE); + SetMomentum(vP); + } + + void SetEnergy(const corsika::units::si::HEPEnergyType v) { + GetStackData().SetEnergy(GetIndex(), v); + } + + corsika::units::si::HEPEnergyType GetEnergy() const { + return GetStackData().GetEnergy(GetIndex()); + } + + void SetPID(const int v) { GetStackData().SetId(GetIndex(), v); } + + corsika::qgsjetII::QgsjetIICode GetPID() const { + return static_cast<corsika::qgsjetII::QgsjetIICode>( + GetStackData().GetId(GetIndex())); + } + + MomentumVector GetMomentum(const corsika::CoordinateSystem& CS) const { return GetStackData().GetMomentum(GetIndex(), CS); } + + void SetMomentum(const MomentumVector& v) { + GetStackData().SetMomentum(GetIndex(), v); + } + }; + + typedef corsika::Stack<QGSJetIIStackData, ParticleInterface> QGSJetIIStack; + +} // end namespace corsika::qgsjetII + +#endif diff --git a/Processes/QGSJetII/qgsjet-II-04.h b/corsika/process/QGSJetII/qgsjet-II-04.h similarity index 100% rename from Processes/QGSJetII/qgsjet-II-04.h rename to corsika/process/QGSJetII/qgsjet-II-04.h diff --git a/Processes/Sibyll/Decay.h b/corsika/process/Sibyll/Decay.hpp similarity index 76% rename from Processes/Sibyll/Decay.h rename to corsika/process/Sibyll/Decay.hpp index e5862344e..dbd009dcf 100644 --- a/Processes/Sibyll/Decay.h +++ b/corsika/process/Sibyll/Decay.hpp @@ -8,29 +8,37 @@ #pragma once -#include <corsika/particles/ParticleProperties.h> +#include <corsika/framework/core/ParticleProperties.hpp> #include <corsika/process/DecayProcess.h> -#include <corsika/process/SecondariesProcess.h> +#include <corsika/framework/sequence/SecondariesProcess.hpp> #include <set> #include <vector> -namespace corsika::process { +namespace corsika { namespace sibyll { - class Decay : public corsika::process::DecayProcess<Decay> { - int count_ = 0; - bool handleAllDecays_ = true; - bool sibyll_listing_ = false; + class Decay : public corsika::DecayProcess<Decay> { + int fCount = 0; public: Decay(const bool sibyll_listing = false); Decay(std::set<particles::Code>); ~Decay(); + void Init(); - void PrintDecayConfig(const corsika::particles::Code); - void PrintDecayConfig(); + void SetStable(const std::vector<particles::Code>); + void SetUnstable(const std::vector<particles::Code>); + void SetUnstable(const corsika::Code); + void SetStable(const corsika::Code); + void SetAllUnstable(); + void SetAllStable(); + bool IsStable(const corsika::Code); + bool IsUnstable(const corsika::Code); + void SetDecay(const particles::Code, const bool); + + void PrintDecayConfig(const corsika::Code); void SetHadronsUnstable(); // is Sibyll::Decay set to handle the decay of this particle? @@ -84,4 +92,6 @@ namespace corsika::process { } // namespace sibyll -} // namespace corsika::process +} // namespace corsika + +#endif diff --git a/corsika/process/Sibyll/Interaction.hpp b/corsika/process/Sibyll/Interaction.hpp new file mode 100644 index 000000000..f89245b21 --- /dev/null +++ b/corsika/process/Sibyll/Interaction.hpp @@ -0,0 +1,93 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <tuple> + +namespace corsika::sibyll { + + class Interaction : public corsika::InteractionProcess<Interaction> { + + int count_ = 0; + int nucCount_ = 0; + static bool initialized_; ///! flag to assure init is done only once + bool sibyll_listing_; + + public: + Interaction(const bool sibyll_printout_on = false); + ~Interaction(); + + void Init(); + + void SetStable(std::vector<particles::Code> const&); + void SetUnstable(std::vector<particles::Code> const&); + + void SetUnstable(const corsika::Code); + void SetStable(const corsika::Code); + void SetAllUnstable(); + void SetAllStable(); + + static bool WasInitialized() { return initialized_; } + bool IsValidCoMEnergy(corsika::units::si::HEPEnergyType ecm) const { + return (minEnergyCoM_ <= ecm) && (ecm <= maxEnergyCoM_); + } + int GetMaxTargetMassNumber() const { return maxTargetMassNumber_; } + corsika::units::si::HEPEnergyType GetMinEnergyCoM() const { return minEnergyCoM_; } + corsika::units::si::HEPEnergyType GetMaxEnergyCoM() const { return maxEnergyCoM_; } + bool IsValidTarget(corsika::Code TargetId) const { + return (corsika::GetNucleusA(TargetId) < maxTargetMassNumber_) && + corsika::IsNucleus(TargetId); + } + + std::tuple<corsika::units::si::CrossSectionType, corsika::units::si::CrossSectionType> + GetCrossSection(const corsika::Code, const corsika::Code, + const corsika::units::si::HEPEnergyType) const; + + template <typename TParticle> + corsika::units::si::GrammageType GetInteractionLength(const TParticle&) const; + + /** + In this function SIBYLL is called to produce one event. The + event is copied (and boosted) into the shower lab frame. + */ + + template <typename TProjectile> + corsika::EProcessReturn DoInteraction(TProjectile&); + + private: + corsika::RNG& RNG_ = + corsika::RNGManager::GetInstance().GetRandomStream("s_rndm"); + // FOR NOW keep trackedParticles private, could be configurable + std::vector<particles::Code> const trackedParticles_ = { + particles::Code::PiPlus, particles::Code::PiMinus, + particles::Code::Pi0, particles::Code::KMinus, + particles::Code::KPlus, particles::Code::K0Long, + particles::Code::K0Short, particles::Code::SigmaPlus, + particles::Code::Sigma0, particles::Code::Sigma0Bar, + particles::Code::SigmaMinus, particles::Code::Lambda0, + particles::Code::Xi0, particles::Code::XiMinus, + particles::Code::OmegaMinus, particles::Code::DPlus, + particles::Code::DMinus, particles::Code::D0, + particles::Code::MuMinus, particles::Code::MuPlus, + particles::Code::D0Bar}; + const bool internalDecays_ = true; + const corsika::units::si::HEPEnergyType minEnergyCoM_ = + 10. * 1e9 * corsika::units::si::electronvolt; + const corsika::units::si::HEPEnergyType maxEnergyCoM_ = + 1.e6 * 1e9 * corsika::units::si::electronvolt; + const int maxTargetMassNumber_ = 18; + }; + +} // namespace corsika::sibyll + +#endif diff --git a/corsika/process/Sibyll/NuclearInteraction.hpp b/corsika/process/Sibyll/NuclearInteraction.hpp new file mode 100644 index 000000000..7a0fe1dfc --- /dev/null +++ b/corsika/process/Sibyll/NuclearInteraction.hpp @@ -0,0 +1,79 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/framework/random/RNGManager.hpp> + +namespace corsika::sibyll { + + class Interaction; // fwd-decl + + /** + * + * + **/ + template <class TEnvironment> + class NuclearInteraction + : public corsika::InteractionProcess<NuclearInteraction<TEnvironment>> { + + int count_ = 0; + int nucCount_ = 0; + + public: + NuclearInteraction(corsika::sibyll::Interaction&, TEnvironment const&); + ~NuclearInteraction(); + + void InitializeNuclearCrossSections(); + void PrintCrossSectionTable(corsika::Code); + corsika::units::si::CrossSectionType ReadCrossSectionTable( + const int, corsika::Code, corsika::units::si::HEPEnergyType); + corsika::units::si::HEPEnergyType GetMinEnergyPerNucleonCoM() { + return gMinEnergyPerNucleonCoM_; + } + corsika::units::si::HEPEnergyType GetMaxEnergyPerNucleonCoM() { + return gMaxEnergyPerNucleonCoM_; + } + unsigned int constexpr GetMaxNucleusAProjectile() { return gMaxNucleusAProjectile_; } + unsigned int constexpr GetMaxNFragments() { return gMaxNFragments_; } + unsigned int constexpr GetNEnergyBins() { return gNEnBins_; } + + template <typename Particle> + std::tuple<corsika::units::si::CrossSectionType, corsika::units::si::CrossSectionType> + GetCrossSection(Particle& p, const corsika::Code TargetId); + + template <typename Particle> + corsika::units::si::GrammageType GetInteractionLength(Particle const&); + + template <typename Projectile> + corsika::EProcessReturn DoInteraction(Projectile&); + + private: + TEnvironment const& environment_; + corsika::sibyll::Interaction& hadronicInteraction_; + std::map<corsika::Code, int> targetComponentsIndex_; + corsika::RNG& RNG_ = + corsika::RNGManager::GetInstance().GetRandomStream("s_rndm"); + static constexpr int gNSample_ = + 500; // number of samples in MC estimation of cross section + static constexpr unsigned int gMaxNucleusAProjectile_ = 56; + static constexpr unsigned int gNEnBins_ = 6; + static constexpr unsigned int gMaxNFragments_ = 60; + // energy limits defined by table used for cross section in signuc.f + // 10**1 GeV to 10**6 GeV + static constexpr corsika::units::si::HEPEnergyType gMinEnergyPerNucleonCoM_ = + 10. * 1e9 * corsika::units::si::electronvolt; + static constexpr corsika::units::si::HEPEnergyType gMaxEnergyPerNucleonCoM_ = + 1.e6 * 1e9 * corsika::units::si::electronvolt; + }; + +} // namespace corsika::sibyll + +#endif diff --git a/Processes/Sibyll/ParticleConversion.h b/corsika/process/Sibyll/ParticleConversion.h similarity index 58% rename from Processes/Sibyll/ParticleConversion.h rename to corsika/process/Sibyll/ParticleConversion.h index 143e15e63..a2bc716ca 100644 --- a/Processes/Sibyll/ParticleConversion.h +++ b/corsika/process/Sibyll/ParticleConversion.h @@ -8,13 +8,11 @@ #pragma once -#include <corsika/particles/ParticleProperties.h> -#include <corsika/process/sibyll/sibyll2.3d.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/ParticleProperties.hpp> #include <string> -namespace corsika::process::sibyll { +namespace corsika::sibyll { enum class SibyllCode : int8_t; using SibyllCodeIntType = std::underlying_type<SibyllCode>::type; @@ -32,14 +30,15 @@ namespace corsika::process::sibyll { #include <corsika/process/sibyll/Generated.inc> - SibyllCode constexpr ConvertToSibyll(corsika::particles::Code pCode) { - return corsika2sibyll[static_cast<corsika::particles::CodeIntType>(pCode)]; + SibyllCode constexpr ConvertToSibyll(corsika::Code pCode) { + return static_cast<SibyllCode>( + corsika2sibyll[static_cast<corsika::CodeIntType>(pCode)]); } - corsika::particles::Code constexpr ConvertFromSibyll(SibyllCode pCode) { + corsika::Code constexpr ConvertFromSibyll(SibyllCode pCode) { auto const s = static_cast<SibyllCodeIntType>(pCode); auto const corsikaCode = sibyll2corsika[s - minSibyll]; - if (corsikaCode == corsika::particles::Code::Unknown) { + if (corsikaCode == corsika::Code::Unknown) { throw std::runtime_error(std::string("SIBYLL/CORSIKA conversion of ") .append(std::to_string(s)) .append(" impossible")); @@ -47,19 +46,18 @@ namespace corsika::process::sibyll { return corsikaCode; } - int constexpr ConvertToSibyllRaw(corsika::particles::Code pCode) { + int constexpr ConvertToSibyllRaw(corsika::Code pCode) { return static_cast<int>(ConvertToSibyll(pCode)); } - int constexpr GetSibyllXSCode(corsika::particles::Code pCode) { - return static_cast<SibyllXSClassIntType>( - corsika2sibyllXStype[static_cast<corsika::particles::CodeIntType>(pCode)]); + int constexpr GetSibyllXSCode(corsika::Code pCode) { + return corsika2sibyllXStype[static_cast<corsika::CodeIntType>(pCode)]; } - bool constexpr CanInteract(corsika::particles::Code pCode) { + bool constexpr CanInteract(corsika::Code pCode) { return GetSibyllXSCode(pCode) > 0; } - corsika::units::si::HEPMassType GetSibyllMass(corsika::particles::Code const); +} // namespace corsika::sibyll } // namespace corsika::process::sibyll diff --git a/Processes/Sibyll/SibStack.h b/corsika/process/Sibyll/SibStack.hpp similarity index 78% rename from Processes/Sibyll/SibStack.h rename to corsika/process/Sibyll/SibStack.hpp index e3ebcc8ff..e17e2c536 100644 --- a/Processes/Sibyll/SibStack.h +++ b/corsika/process/Sibyll/SibStack.hpp @@ -8,16 +8,16 @@ #pragma once -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> #include <corsika/process/sibyll/ParticleConversion.h> -#include <corsika/process/sibyll/sibyll2.3d.h> -#include <corsika/stack/Stack.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/process/sibyll/sibyll2.3c.h> +#include <corsika/framework/stack/Stack.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> -namespace corsika::process::sibyll { +namespace corsika::sibyll { - typedef corsika::geometry::Vector<corsika::units::si::hepmomentum_d> MomentumVector; + typedef corsika::Vector<corsika::units::si::hepmomentum_d> MomentumVector; class SibStackData { @@ -53,9 +53,9 @@ namespace corsika::process::sibyll { return s_plist_.p[4][i] * 1_GeV; } MomentumVector GetMomentum(const unsigned int i) const { - using corsika::geometry::CoordinateSystem; - using corsika::geometry::QuantityVector; - using corsika::geometry::RootCoordinateSystem; + using corsika::CoordinateSystem; + using corsika::QuantityVector; + using corsika::RootCoordinateSystem; using namespace corsika::units::si; CoordinateSystem& rootCS = RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); @@ -82,13 +82,13 @@ namespace corsika::process::sibyll { }; template <typename StackIteratorInterface> - class ParticleInterface : public corsika::stack::ParticleBase<StackIteratorInterface> { + class ParticleInterface : public corsika::ParticleBase<StackIteratorInterface> { - using corsika::stack::ParticleBase<StackIteratorInterface>::GetStackData; - using corsika::stack::ParticleBase<StackIteratorInterface>::GetIndex; + using corsika::ParticleBase<StackIteratorInterface>::GetStackData; + using corsika::ParticleBase<StackIteratorInterface>::GetIndex; public: - void SetParticleData(const int vID, // corsika::process::sibyll::SibyllCode vID, + void SetParticleData(const int vID, // corsika::sibyll::SibyllCode vID, const corsika::units::si::HEPEnergyType vE, const MomentumVector& vP, const corsika::units::si::HEPMassType vM) { @@ -99,7 +99,7 @@ namespace corsika::process::sibyll { } void SetParticleData(ParticleInterface<StackIteratorInterface>& /*parent*/, - const int vID, // corsika::process::sibyll::SibyllCode vID, + const int vID, // corsika::sibyll::SibyllCode vID, const corsika::units::si::HEPEnergyType vE, const MomentumVector& vP, const corsika::units::si::HEPMassType vM) { @@ -129,8 +129,8 @@ namespace corsika::process::sibyll { void SetPID(const int v) { GetStackData().SetId(GetIndex(), v); } - corsika::process::sibyll::SibyllCode GetPID() const { - return static_cast<corsika::process::sibyll::SibyllCode>( + corsika::sibyll::SibyllCode GetPID() const { + return static_cast<corsika::sibyll::SibyllCode>( GetStackData().GetId(GetIndex())); } @@ -141,6 +141,8 @@ namespace corsika::process::sibyll { } }; - typedef corsika::stack::Stack<SibStackData, ParticleInterface> SibStack; + typedef corsika::Stack<SibStackData, ParticleInterface> SibStack; -} // end namespace corsika::process::sibyll +} // end namespace corsika::sibyll + +#endif diff --git a/Processes/StackInspector/StackInspector.h b/corsika/process/StackInspector.hpp similarity index 75% rename from Processes/StackInspector/StackInspector.h rename to corsika/process/StackInspector.hpp index 6d99a4164..0b2d8aaf7 100644 --- a/Processes/StackInspector/StackInspector.h +++ b/corsika/process/StackInspector.hpp @@ -8,22 +8,22 @@ #pragma once -#include <corsika/process/StackProcess.h> -#include <corsika/setup/SetupTrajectory.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/sequence/StackProcess.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <chrono> +#include "corsika/setup/SetupTrajectory.hpp" -namespace corsika::process { +namespace corsika { namespace stack_inspector { template <typename TStack> - class StackInspector : public corsika::process::StackProcess<StackInspector<TStack>> { + class StackInspector : public corsika::StackProcess<StackInspector<TStack>> { typedef typename TStack::ParticleType Particle; - using corsika::process::StackProcess<StackInspector<TStack>>::GetStep; + using corsika::StackProcess<StackInspector<TStack>>::GetStep; public: StackInspector(const int vNStep, const bool vReportStack, @@ -49,4 +49,5 @@ namespace corsika::process { } // namespace stack_inspector -} // namespace corsika::process +} // namespace corsika + diff --git a/Processes/SwitchProcess/SwitchProcess.h b/corsika/process/SwitchProcess.hpp similarity index 92% rename from Processes/SwitchProcess/SwitchProcess.h rename to corsika/process/SwitchProcess.hpp index 6da1b82d8..1ade22295 100644 --- a/Processes/SwitchProcess/SwitchProcess.h +++ b/corsika/process/SwitchProcess.hpp @@ -8,12 +8,12 @@ #pragma once -#include <corsika/process/InteractionProcess.h> -#include <corsika/process/ProcessSequence.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/framework/sequence/ProcessSequence.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include "corsika/setup/SetupStack.hpp" -namespace corsika::process::switch_process { +namespace corsika::switch_process { /** * This process provides an energy-based switch between two interaction processes P1 and @@ -97,4 +97,5 @@ namespace corsika::process::switch_process { } } }; -} // namespace corsika::process::switch_process +} // namespace corsika::switch_process + diff --git a/Processes/TrackWriter/TrackWriter.h b/corsika/process/TrackWriter.hpp similarity index 68% rename from Processes/TrackWriter/TrackWriter.h rename to corsika/process/TrackWriter.hpp index b62e09fea..3af5fdda6 100644 --- a/Processes/TrackWriter/TrackWriter.h +++ b/corsika/process/TrackWriter.hpp @@ -8,21 +8,21 @@ #pragma once -#include <corsika/process/ContinuousProcess.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/sequence/ContinuousProcess.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <fstream> #include <string> -namespace corsika::process::track_writer { +namespace corsika::track_writer { - class TrackWriter : public corsika::process::ContinuousProcess<TrackWriter> { + class TrackWriter : public corsika::ContinuousProcess<TrackWriter> { public: TrackWriter(std::string const& filename); template <typename Particle, typename Track> - corsika::process::EProcessReturn DoContinuous(Particle&, Track&); + corsika::EProcessReturn DoContinuous(Particle&, Track&); template <typename Particle, typename Track> corsika::units::si::LengthType MaxStepLength(Particle&, Track&) { @@ -37,4 +37,5 @@ namespace corsika::process::track_writer { int precision = 6; }; -} // namespace corsika::process::track_writer +} // namespace corsika::track_writer + diff --git a/corsika/process/detail/EnergyLoss.cc b/corsika/process/detail/EnergyLoss.cc new file mode 100644 index 000000000..6e6d44ac7 --- /dev/null +++ b/corsika/process/detail/EnergyLoss.cc @@ -0,0 +1,303 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/process/energy_loss/EnergyLoss.h> + +#include <corsika/framework/core/ParticleProperties.hpp> + +#include <corsika/framework/geometry/Line.hpp> + +#include <cmath> +#include <fstream> +#include <iostream> +#include <limits> +#include <numeric> + +#include "../corsika/setup/SetupStack.hpp" +#include "../corsika/setup/SetupTrajectory.hpp" + +using namespace std; + +using namespace corsika; +using namespace corsika::units::si; +using SetupParticle = corsika::Stack::ParticleType; +using SetupTrack = corsika::Trajectory; + +namespace corsika { + + auto elab2plab = [](HEPEnergyType Elab, HEPMassType m) { + return sqrt((Elab - m) * (Elab + m)); + }; + + /** + * PDG2018, passage of particles through matter + * + * Note, that \f$I_{\mathrm{eff}}\f$ of composite media a determined from \f$ \ln I = + * \sum_i a_i \ln(I_i) \f$ where \f$ a_i \f$ is the fraction of the electron population + * (\f$\sim Z_i\f$) of the \f$i\f$-th element. This can also be used for shell + * corrections or density effects. + * + * The \f$I_{\mathrm{eff}}\f$ of compounds is not better than a few percent, if not + * measured explicitly. + * + * For shell correction, see Sec 6 of https://www.nap.edu/read/20066/chapter/8#115 + * + */ + HEPEnergyType EnergyLoss::BetheBloch(SetupParticle const& p, GrammageType const dX) { + + // all these are material constants and have to come through Environment + // right now: values for nitrogen_D + // 7 nitrogen_gas 82.0 0.49976 D E 0.0011653 0.0 1.7378 4.1323 0.15349 3.2125 10.54 + auto Ieff = 82.0_eV; + [[maybe_unused]] auto Zmat = 7; + auto ZoverA = 0.49976_mol / 1_g; + const double x0 = 1.7378; + const double x1 = 4.1323; + const double Cbar = 10.54; + const double delta0 = 0.0; + const double aa = 0.15349; + const double sk = 3.2125; + // end of material constants + + // this is the Bethe-Bloch coefficiet 4pi N_A r_e^2 m_e c^2 + auto constexpr K = 0.307075_MeV / 1_mol * square(1_cm); + HEPEnergyType const E = p.GetEnergy(); + HEPMassType const m = p.GetMass(); + double const gamma = E / m; + int const Z = p.GetChargeNumber(); + int const Z2 = Z * Z; + HEPMassType constexpr me = particles::Electron::GetMass(); + auto const m2 = m * m; + auto constexpr me2 = me * me; + double const gamma2 = gamma * gamma; + + double const beta2 = (gamma2 - 1) / gamma2; // 1-1/gamma2 (1-1/gamma)*(1+1/gamma); + // (gamma_2-1)/gamma_2 = (1-1/gamma2); + double constexpr c2 = 1; // HEP convention here c=c2=1 + cout << "BetheBloch beta2=" << beta2 << " gamma2=" << gamma2 << endl; + [[maybe_unused]] double const eta2 = beta2 / (1 - beta2); + HEPMassType const Wmax = + 2 * me * c2 * beta2 * gamma2 / (1 + 2 * gamma * me / m + me2 / m2); + // approx, but <<1% HEPMassType const Wmax = 2*me*c2*beta2*gamma2; for HEAVY + // PARTICLES Wmax ~ 2me v2 for non-relativistic particles + cout << "BetheBloch Wmax=" << Wmax << endl; + + // Sternheimer parameterization, density corrections towards high energies + // NOTE/TODO: when Cbar is 0 it needs to be approximated from parameterization -> + // MISSING + cout << "BetheBloch p.GetMomentum().GetNorm()/m=" << p.GetMomentum().GetNorm() / m + << endl; + double const x = log10(p.GetMomentum().GetNorm() / m); + double delta = 0; + if (x >= x1) { + delta = 2 * (log(10)) * x - Cbar; + } else if (x < x1 && x >= x0) { + delta = 2 * (log(10)) * x - Cbar + aa * pow((x1 - x), sk); + } else if (x < x0) { // and IF conductor (otherwise, this is 0) + delta = delta0 * pow(100, 2 * (x - x0)); + } + cout << "BetheBloch delta=" << delta << endl; + + // with further low energies correction, accurary ~1% down to beta~0.05 (1MeV for p) + + // shell correction, <~100MeV + // need more clarity about formulas and units + const double Cadj = 0; + /* + // https://www.nap.edu/read/20066/chapter/8#104 + HEPEnergyType Iadj = 12_eV * Z + 7_eV; // Iadj<163eV + if (Iadj>=163_eV) + Iadj = 9.76_eV * Z + 58.8_eV * pow(Z, -0.19); // Iadj>=163eV + double const Cadj = (0.422377/eta2 + 0.0304043/(eta2*eta2) - + 0.00038106/(eta2*eta2*eta2)) * 1e-6 * Iadj*Iadj + (3.858019/eta2 - + 0.1667989/(eta2*eta2) + 0.00157955/(eta2*eta2*eta2)) * 1e-9 * Iadj*Iadj*Iadj; + */ + + // Barkas correction O(Z3) higher-order Born approximation + // see Appl. Phys. 85 (1999) 1249 + // double A = 1; + // if (p.GetPID() == particles::Code::Nucleus) A = p.GetNuclearA(); + // double const Erel = (p.GetEnergy()-p.GetMass()) / A / 1_keV; + // double const Llow = 0.01 * Erel; + // double const Lhigh = 1.5/pow(Erel, 0.4) + 45000./Zmat * pow(Erel, 1.6); + // double const barkas = Z * Llow*Lhigh/(Llow+Lhigh); // RU, I think the Z was + // missing... + double const barkas = 1; // does not work yet + + // Bloch correction for O(Z4) higher-order Born approximation + // see Appl. Phys. 85 (1999) 1249 + const double alpha = 1. / 137.035999173; + double const y2 = Z * Z * alpha * alpha / beta2; + double const bloch = -y2 * (1.202 - y2 * (1.042 - 0.855 * y2 + 0.343 * y2 * y2)); + + // cout << "BetheBloch Erel=" << Erel << " barkas=" << barkas << " bloch=" << bloch << + // endl; + + double const aux = 2 * me * c2 * beta2 * gamma2 * Wmax / (Ieff * Ieff); + return -K * Z2 * ZoverA / beta2 * + (0.5 * log(aux) - beta2 - Cadj / Z - delta / 2 + barkas + bloch) * dX; + } + +EnergyLoss::EnergyLoss(environment::ShowerAxis const& shower_axis, + corsika::units::si::HEPEnergyType emCut) + : shower_axis_(shower_axis) + , emCut_(emCut) + , profile_(int(shower_axis.maximumX() / dX_) + 1) {} + +auto elab2plab = [](HEPEnergyType Elab, HEPMassType m) { + return sqrt((Elab - m) * (Elab + m)); +}; + +/** + * PDG2018, passage of particles through matter + * + * Note, that \f$I_{\mathrm{eff}}\f$ of composite media a determined from \f$ \ln I = + * \sum_i a_i \ln(I_i) \f$ where \f$ a_i \f$ is the fraction of the electron population + * (\f$\sim Z_i\f$) of the \f$i\f$-th element. This can also be used for shell + * corrections or density effects. + * + * The \f$I_{\mathrm{eff}}\f$ of compounds is not better than a few percent, if not + * measured explicitly. + * + * For shell correction, see Sec 6 of https://www.nap.edu/read/20066/chapter/8#115 + * + */ +HEPEnergyType EnergyLoss::BetheBloch(SetupParticle const& p, GrammageType const dX) { + + // all these are material constants and have to come through Environment + // right now: values for nitrogen_D + // 7 nitrogen_gas 82.0 0.49976 D E 0.0011653 0.0 1.7378 4.1323 0.15349 3.2125 10.54 + auto Ieff = 82.0_eV; + [[maybe_unused]] auto Zmat = 7; + auto ZoverA = 0.49976_mol / 1_g; + const double x0 = 1.7378; + const double x1 = 4.1323; + const double Cbar = 10.54; + const double delta0 = 0.0; + const double aa = 0.15349; + const double sk = 3.2125; + // end of material constants + + // this is the Bethe-Bloch coefficiet 4pi N_A r_e^2 m_e c^2 + auto constexpr K = 0.307075_MeV / 1_mol * square(1_cm); + HEPEnergyType const E = p.GetEnergy(); + HEPMassType const m = p.GetMass(); + double const gamma = E / m; + int const Z = p.GetChargeNumber(); + int const Z2 = Z * Z; + HEPMassType constexpr me = particles::Electron::GetMass(); + auto const m2 = m * m; + auto constexpr me2 = me * me; + double const gamma2 = gamma * gamma; + + double const beta2 = (gamma2 - 1) / gamma2; // 1-1/gamma2 (1-1/gamma)*(1+1/gamma); + // (gamma_2-1)/gamma_2 = (1-1/gamma2); + double constexpr c2 = 1; // HEP convention here c=c2=1 + C8LOG_DEBUG("BetheBloch beta2={}, gamma2={}", beta2, gamma2); + [[maybe_unused]] double const eta2 = beta2 / (1 - beta2); + HEPMassType const Wmax = + 2 * me * c2 * beta2 * gamma2 / (1 + 2 * gamma * me / m + me2 / m2); + // approx, but <<1% HEPMassType const Wmax = 2*me*c2*beta2*gamma2; for HEAVY + // PARTICLES Wmax ~ 2me v2 for non-relativistic particles + C8LOG_DEBUG("BetheBloch Wmax={}", Wmax); + + // Sternheimer parameterization, density corrections towards high energies + // NOTE/TODO: when Cbar is 0 it needs to be approximated from parameterization -> + // MISSING + C8LOG_DEBUG("BetheBloch p.GetMomentum().GetNorm()/m{}=", p.GetMomentum().GetNorm() / m); + double const x = log10(p.GetMomentum().GetNorm() / m); + double delta = 0; + if (x >= x1) { + delta = 2 * (log(10)) * x - Cbar; + } else if (x < x1 && x >= x0) { + delta = 2 * (log(10)) * x - Cbar + aa * pow((x1 - x), sk); + } else if (x < x0) { // and IF conductor (otherwise, this is 0) + delta = delta0 * pow(100, 2 * (x - x0)); + } + + void EnergyLoss::MomentumUpdate(corsika::Stack::ParticleType& vP, + corsika::units::si::HEPEnergyType Enew) { + HEPMomentumType Pnew = elab2plab(Enew, vP.GetMass()); + auto pnew = vP.GetMomentum(); + vP.SetMomentum(pnew * Pnew / pnew.GetNorm()); + } + + void EnergyLoss::FillProfile(SetupParticle const& vP, SetupTrack const& vTrack, + const HEPEnergyType dE) { + + using namespace corsika; + + auto const toStart = vTrack.GetPosition(0) - InjectionPoint_; + auto const toEnd = vTrack.GetPosition(1) - InjectionPoint_; + + auto const v1 = (toStart * 1_Hz).dot(ShowerAxisDirection_); + auto const v2 = (toEnd * 1_Hz).dot(ShowerAxisDirection_); + geometry::Line const lineToStartBin(InjectionPoint_, ShowerAxisDirection_ * v1); + geometry::Line const lineToEndBin(InjectionPoint_, ShowerAxisDirection_ * v2); + + SetupTrack const trajToStartBin(lineToStartBin, 1_s); + SetupTrack const trajToEndBin(lineToEndBin, 1_s); + + GrammageType const grammageStart = + vP.GetNode()->GetModelProperties().IntegratedGrammage(trajToStartBin, + trajToStartBin.GetLength()); + GrammageType const grammageEnd = + vP.GetNode()->GetModelProperties().IntegratedGrammage(trajToEndBin, + trajToEndBin.GetLength()); + + const int binStart = grammageStart / dX_; + const int binEnd = grammageEnd / dX_; + + std::cout << "energy deposit of " << -dE << " between " << grammageStart << " and " + << grammageEnd << std::endl; + + auto energyCount = HEPEnergyType::zero(); + + auto fill = [&](int bin, GrammageType weight) { + const auto dX = grammageEnd - grammageStart; + if (dX > dX_threshold_) { + auto const increment = -dE * weight / (grammageEnd - grammageStart); + Profile_[bin] += increment; + energyCount += increment; + + std::cout << "filling bin " << bin << " with weight " << weight << ": " + << increment << std::endl; + } + }; + + // fill longitudinal profile + fill(binStart, (1 + binStart) * dX_ - grammageStart); + fill(binEnd, grammageEnd - binEnd * dX_); + + if (binStart == binEnd) { fill(binStart, -dX_); } + + for (int bin = binStart + 1; bin < binEnd; ++bin) { fill(bin, dX_); } + + // fill longitudinal profile + if (binStart == binEnd) { + fill(binStart, 1); + } else { + fill(binStart, ((1 + binStart) * dX_ - grammageStart) / deltaX); + fill(binEnd, (grammageEnd - binEnd * dX_) / deltaX); + for (int bin = binStart + 1; bin < binEnd; ++bin) { fill(bin, 1); } + } + + C8LOG_DEBUG("total energy added to histogram: {} ", energyCount); +} + +void EnergyLoss::PrintProfile() const { + std::ofstream file("EnergyLossProfile.dat"); + file << "# EnergyLoss profile" << std::endl + << "# lower X bin edge [g/cm2] dE/dX [GeV/g/cm2]" << endl; + double const deltaX = dX_ / 1_g * square(1_cm); + for (size_t i = 0; i < profile_.size(); ++i) { + file << std::scientific << std::setw(15) << i * deltaX << std::setw(15) + << profile_.at(i) / (deltaX * 1_GeV) << endl; + } + +} // namespace corsika diff --git a/corsika/process/detail/HadronicElasticModel.cc b/corsika/process/detail/HadronicElasticModel.cc new file mode 100644 index 000000000..a7fad5814 --- /dev/null +++ b/corsika/process/detail/HadronicElasticModel.cc @@ -0,0 +1,122 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/process/hadronic_elastic_model/HadronicElasticModel.h> + +#include <corsika/media/Environment.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/random/ExponentialDistribution.hpp> +#include <corsika/framework/utility/COMBoost.hpp> + +#include <iomanip> +#include <iostream> +#include "../corsika/setup/SetupStack.hpp" + +using namespace corsika; +using SetupParticle = corsika::Stack::ParticleType; + +namespace corsika::HadronicElasticModel { + + void HadronicElasticInteraction::Init() {} + + HadronicElasticInteraction::HadronicElasticInteraction(units::si::CrossSectionType x, + units::si::CrossSectionType y) + : fX(x) + , fY(y) {} + + template <> + units::si::GrammageType HadronicElasticInteraction::GetInteractionLength( + SetupParticle const& p) { + using namespace units::si; + if (p.GetPID() == particles::Code::Proton) { + auto const* currentNode = p.GetNode(); + auto const& mediumComposition = + currentNode->GetModelProperties().GetNuclearComposition(); + + auto const& components = mediumComposition.GetComponents(); + auto const& fractions = mediumComposition.GetFractions(); + + auto const projectileMomentum = p.GetMomentum(); + auto const projectileMomentumSquaredNorm = projectileMomentum.squaredNorm(); + auto const projectileEnergy = p.GetEnergy(); + +HadronicElasticInteraction::HadronicElasticInteraction(units::si::CrossSectionType x, + units::si::CrossSectionType y) + : fX(x) + , fY(y) {} + +template <> +units::si::GrammageType HadronicElasticInteraction::GetInteractionLength( + SetupParticle const& p) { + using namespace units::si; + if (p.GetPID() == particles::Code::Proton) { + auto const* currentNode = p.GetNode(); + auto const& mediumComposition = + currentNode->GetModelProperties().GetNuclearComposition(); + + auto const& components = mediumComposition.GetComponents(); + auto const& fractions = mediumComposition.GetFractions(); + + auto const projectileMomentum = p.GetMomentum(); + auto const projectileMomentumSquaredNorm = projectileMomentum.squaredNorm(); + auto const projectileEnergy = p.GetEnergy(); + + auto const avgCrossSection = [&]() { + CrossSectionType avgCrossSection = 0_b; + + for (size_t i = 0; i < fractions.size(); ++i) { + auto const targetMass = particles::GetMass(components[i]); + auto const s = units::static_pow<2>(projectileEnergy + targetMass) - + projectileMomentumSquaredNorm; + avgCrossSection += CrossSection(s) * fractions[i]; + } + + std::cout << "avgCrossSection: " << avgCrossSection / 1_mb << " mb" << std::endl; + + return avgCrossSection; + }(); + + auto const avgTargetMassNumber = mediumComposition.GetAverageMassNumber(); + + GrammageType const interactionLength = + avgTargetMassNumber * units::constants::u / avgCrossSection; + + return interactionLength; + } else { + return std::numeric_limits<double>::infinity() * 1_g / (1_cm * 1_cm); + } +} + +template <> +process::EProcessReturn HadronicElasticInteraction::DoInteraction(SetupView& view) { + using namespace units::si; + using namespace units::constants; + + auto p = view.GetProjectile(); + if (p.GetPID() != particles::Code::Proton) { return process::EProcessReturn::eOk; } + + const auto* currentNode = p.GetNode(); + const auto& composition = currentNode->GetModelProperties().GetNuclearComposition(); + const auto& components = composition.GetComponents(); + + std::vector<units::si::CrossSectionType> cross_section_of_components( + composition.GetComponents().size()); + + auto const projectileMomentum = p.GetMomentum(); + auto const projectileMomentumSquaredNorm = projectileMomentum.squaredNorm(); + auto const projectileEnergy = p.GetEnergy(); + + for (size_t i = 0; i < components.size(); ++i) { + auto const targetMass = particles::GetMass(components[i]); + auto const s = units::static_pow<2>(projectileEnergy + targetMass) - + projectileMomentumSquaredNorm; + cross_section_of_components[i] = CrossSection(s); + } + +} // namespace corsika::HadronicElasticModel diff --git a/Processes/ObservationPlane/ObservationPlane.cc b/corsika/process/detail/ObservationPlane.cc similarity index 95% rename from Processes/ObservationPlane/ObservationPlane.cc rename to corsika/process/detail/ObservationPlane.cc index dd8b79743..402d9c0f3 100644 --- a/Processes/ObservationPlane/ObservationPlane.cc +++ b/corsika/process/detail/ObservationPlane.cc @@ -6,12 +6,11 @@ * the license. */ -#include <corsika/process/observation_plane/ObservationPlane.h> -#include <corsika/logging/Logging.h> +#include <corsika/process/observation_plane/ObservationPlane.hpp> #include <fstream> -using namespace corsika::process::observation_plane; +using namespace corsika::observation_plane; using namespace corsika::units::si; ObservationPlane::ObservationPlane( @@ -28,9 +27,8 @@ ObservationPlane::ObservationPlane( outputStream_ << "#PDG code, energy / eV, x distance / m, y distance / m" << std::endl; } -corsika::process::EProcessReturn ObservationPlane::DoContinuous( - setup::Stack::ParticleType& particle, setup::Trajectory const& trajectory) { - +corsika::EProcessReturn ObservationPlane::DoContinuous( + setup::Stack::ParticleType const& particle, setup::Trajectory const& trajectory) { TimeType const timeOfIntersection = (plane_.GetCenter() - trajectory.GetLine().GetR0()).dot(plane_.GetNormal()) / trajectory.GetLine().GetV0().dot(plane_.GetNormal()); diff --git a/Processes/ParticleCut/ParticleCut.cc b/corsika/process/detail/ParticleCut.cc similarity index 71% rename from Processes/ParticleCut/ParticleCut.cc rename to corsika/process/detail/ParticleCut.cc index 5176ab887..5cd87dad7 100644 --- a/Processes/ParticleCut/ParticleCut.cc +++ b/corsika/process/detail/ParticleCut.cc @@ -6,18 +6,17 @@ * the license. */ -#include <corsika/logging/Logging.h> -#include <corsika/process/particle_cut/ParticleCut.h> +#include <corsika/process/particle_cut/ParticleCut.hpp> using namespace std; using namespace corsika; -using namespace corsika::process; +using namespace corsika; using namespace corsika::units::si; -using namespace corsika::particles; -using namespace corsika::setup; +using namespace corsika; +using namespace corsika; -namespace corsika::process { +namespace corsika { namespace particle_cut { template <typename TParticle> @@ -57,32 +56,35 @@ namespace corsika::process { } } - template <typename TParticle> - bool ParticleCut::checkCutParticle(const TParticle& particle) { - - const Code pid = particle.GetPID(); - HEPEnergyType energy = particle.GetEnergy(); - C8LOG_DEBUG(fmt::format("ParticleCut: checking {}, E= {} GeV, EcutTot={} GeV", pid, - energy / 1_GeV, - (fEmEnergy + fInvEnergy + fEnergy) / 1_GeV)); - if (bCutEm && ParticleIsEmParticle(pid)) { - C8LOG_DEBUG("removing em. particle..."); - fEmEnergy += energy; - uiEmCount += 1; - return true; - } else if (bCutInv && ParticleIsInvisible(pid)) { - C8LOG_DEBUG("removing inv. particle..."); - fInvEnergy += energy; - uiInvCount += 1; - return true; - } else if (ParticleIsBelowEnergyCut(particle)) { - C8LOG_DEBUG("removing low en. particle..."); - fEnergy += energy; - return true; - } else if (particle.GetTime() > 10_ms) { - C8LOG_DEBUG("removing OLD particle..."); - fEnergy += energy; - return true; + EProcessReturn ParticleCut::DoSecondaries(corsika::StackView& vS) { + auto p = vS.begin(); + while (p != vS.end()) { + const Code pid = p.GetPID(); + HEPEnergyType energy = p.GetEnergy(); + cout << "ProcessCut: DoSecondaries: " << pid << " E= " << energy + << ", EcutTot=" << (fEmEnergy + fInvEnergy + fEnergy) / 1_GeV << " GeV" + << endl; + if (ParticleIsEmParticle(pid)) { + cout << "removing em. particle..." << endl; + fEmEnergy += energy; + fEmCount += 1; + p.Delete(); + } else if (ParticleIsInvisible(pid)) { + cout << "removing inv. particle..." << endl; + fInvEnergy += energy; + fInvCount += 1; + p.Delete(); + } else if (ParticleIsBelowEnergyCut(p)) { + cout << "removing low en. particle..." << endl; + fEnergy += energy; + p.Delete(); + } else if (p.GetTime() > 10_ms) { + cout << "removing OLD particle..." << endl; + fEnergy += energy; + p.Delete(); + } else { + ++p; // next entry in SecondaryView + } } return false; // this particle will not be removed/cut } @@ -143,4 +145,4 @@ namespace corsika::process { } } // namespace particle_cut -} // namespace corsika::process +} // namespace corsika diff --git a/Processes/Pythia/Decay.cc b/corsika/process/detail/Pythia/Decay.cc similarity index 93% rename from Processes/Pythia/Decay.cc rename to corsika/process/detail/Pythia/Decay.cc index 92920dfba..e79d534bd 100644 --- a/Processes/Pythia/Decay.cc +++ b/corsika/process/detail/Pythia/Decay.cc @@ -10,10 +10,8 @@ #include <corsika/process/pythia/Decay.h> #include <corsika/process/pythia/Random.h> -#include <corsika/geometry/FourVector.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> -#include <corsika/utl/COMBoost.h> +#include "../../corsika/setup/SetupStack.hpp" +#include "../../corsika/setup/SetupTrajectory.hpp" using std::cout; using std::endl; @@ -21,18 +19,18 @@ using std::tuple; using std::vector; using namespace corsika; -using namespace corsika::setup; -using View = corsika::setup::StackView; -using Particle = corsika::setup::Stack::ParticleType; +using namespace corsika; +using Projectile = corsika::StackView::ParticleType; +using Particle = corsika::Stack::ParticleType; using Track = Trajectory; -namespace corsika::process::pythia { +namespace corsika::pythia { Decay::Decay(const bool print_listing) : print_listing_(print_listing) { // set random number generator in pythia - Pythia8::RndmEngine* rndm = new corsika::process::pythia::Random(); + Pythia8::RndmEngine* rndm = new corsika::pythia::Random(); fPythia.setRndmEnginePtr(rndm); /* @@ -255,13 +253,12 @@ namespace corsika::process::pythia { view.AddSecondary( tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ - pyId, fourMomLab.GetTimeLikeComponent(), - fourMomLab.GetSpaceLikeComponents(), decayPoint, t0}); + corsika::MomentumVector, geometry::Point, units::si::TimeType>{ + pyId, pyEn, pyP, decayPoint, t0}); } // set particle stable Decay::SetStable(particleId); } -} // namespace corsika::process::pythia +} // namespace corsika::pythia diff --git a/Processes/Pythia/Interaction.cc b/corsika/process/detail/Pythia/Interaction.cc similarity index 94% rename from Processes/Pythia/Interaction.cc rename to corsika/process/detail/Pythia/Interaction.cc index 7a0dbfa64..1b22153ef 100644 --- a/Processes/Pythia/Interaction.cc +++ b/corsika/process/detail/Pythia/Interaction.cc @@ -8,26 +8,26 @@ #include <corsika/process/pythia/Interaction.h> -#include <corsika/environment/Environment.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/geometry/FourVector.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/utl/COMBoost.h> +#include <corsika/media/Environment.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/utility/COMBoost.hpp> #include <tuple> +#include "../../corsika/setup/SetupStack.hpp" using std::cout; using std::endl; using std::tuple; using namespace corsika; -using namespace corsika::setup; -using SecondaryView = corsika::setup::StackView; -using Particle = corsika::setup::Stack::ParticleType; +using namespace corsika; +using Projectile = corsika::StackView::ParticleType; +using Particle = corsika::Stack::ParticleType; -namespace corsika::process::pythia { +namespace corsika::pythia { - typedef corsika::geometry::Vector<corsika::units::si::hepmomentum_d> MomentumVector; + typedef corsika::Vector<corsika::units::si::hepmomentum_d> MomentumVector; Interaction::Interaction(const bool print_listing) : print_listing_(print_listing) { @@ -120,13 +120,13 @@ namespace corsika::process::pythia { fPythia.init(); } - bool Interaction::CanInteract(const corsika::particles::Code pCode) { - return pCode == corsika::particles::Code::Proton || - pCode == corsika::particles::Code::Neutron || - pCode == corsika::particles::Code::AntiProton || - pCode == corsika::particles::Code::AntiNeutron || - pCode == corsika::particles::Code::PiMinus || - pCode == corsika::particles::Code::PiPlus; + bool Interaction::CanInteract(const corsika::Code pCode) { + return pCode == corsika::Code::Proton || + pCode == corsika::Code::Neutron || + pCode == corsika::Code::AntiProton || + pCode == corsika::Code::AntiNeutron || + pCode == corsika::Code::PiMinus || + pCode == corsika::Code::PiPlus; } tuple<units::si::CrossSectionType, units::si::CrossSectionType> @@ -402,4 +402,4 @@ namespace corsika::process::pythia { return process::EProcessReturn::eOk; } -} // namespace corsika::process::pythia +} // namespace corsika::pythia diff --git a/Processes/Pythia/Random.cc b/corsika/process/detail/Pythia/Random.cc similarity index 81% rename from Processes/Pythia/Random.cc rename to corsika/process/detail/Pythia/Random.cc index acf2837a5..0ebfbd85b 100644 --- a/Processes/Pythia/Random.cc +++ b/corsika/process/detail/Pythia/Random.cc @@ -8,8 +8,8 @@ #include <corsika/process/pythia/Random.h> -namespace corsika::process::pythia { +namespace corsika::pythia { double Random::flat() { return fDist(fRNG); } -} // namespace corsika::process::pythia +} // namespace corsika::pythia diff --git a/Processes/QGSJetII/Interaction.cc b/corsika/process/detail/QGSJetII/Interaction.cc similarity index 90% rename from Processes/QGSJetII/Interaction.cc rename to corsika/process/detail/QGSJetII/Interaction.cc index c16233af5..086f98a9a 100644 --- a/Processes/QGSJetII/Interaction.cc +++ b/corsika/process/detail/QGSJetII/Interaction.cc @@ -8,22 +8,24 @@ #include <corsika/process/qgsjetII/Interaction.h> -#include <corsika/environment/Environment.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/geometry/FourVector.h> -#include <corsika/geometry/QuantityVector.h> +#include <corsika/media/Environment.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/framework/geometry/QuantityVector.hpp> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/process/qgsjetII/ParticleConversion.h> #include <corsika/process/qgsjetII/QGSJetIIFragmentsStack.h> #include <corsika/process/qgsjetII/QGSJetIIStack.h> #include <corsika/process/qgsjetII/qgsjet-II-04.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> -#include <corsika/utl/COMBoost.h> +#include <corsika/framework/utility/COMBoost.hpp> #include <random> #include <sstream> #include <string> #include <tuple> +#include "../../corsika/setup/SetupStack.hpp" +#include "../../corsika/setup/SetupTrajectory.hpp" + using std::cout; using std::endl; using std::ostringstream; @@ -31,12 +33,12 @@ using std::string; using std::tuple; using namespace corsika; -using namespace corsika::setup; +using namespace corsika; using SetupParticle = setup::Stack::StackIterator; using SetupView = setup::StackView; using Track = Trajectory; -namespace corsika::process::qgsjetII { +namespace corsika::qgsjetII { Interaction::Interaction(const string& dataPath) : data_path_(dataPath) { @@ -141,7 +143,7 @@ namespace corsika::process::qgsjetII { si::CrossSectionType weightedProdCrossSection = mediumComposition.WeightedSum( [=](particles::Code targetID) -> si::CrossSectionType { int targetA = 0; - if (corsika::particles::IsNucleus(targetID)) + if (corsika::IsNucleus(targetID)) targetA = particles::GetNucleusA(targetID); return GetCrossSection(corsikaBeamId, targetID, Elab, Abeam, targetA); }); @@ -233,7 +235,7 @@ namespace corsika::process::qgsjetII { for (size_t i = 0; i < compVec.size(); ++i) { auto const targetId = compVec[i]; int targetA = 0; - if (corsika::particles::IsNucleus(targetId)) + if (corsika::IsNucleus(targetId)) targetA = particles::GetNucleusA(targetId); const auto sigProd = GetCrossSection(corsikaBeamId, targetId, projectileEnergyLab, beamA, targetA); @@ -306,28 +308,18 @@ namespace corsika::process::qgsjetII { int Z = 0; switch (A) { case 1: { // proton/neutron - std::uniform_real_distribution<double> select; - if (select(rng_) > 0.5) { - idFragm = particles::Code::Proton; - Z = 1; - } else { - idFragm = particles::Code::Neutron; - Z = 0; - } - - const HEPMassType nucleonMass = particles::GetMass(idFragm); - - auto momentum = geometry::Vector( - zAxisFrame, corsika::geometry::QuantityVector<hepmomentum_d>{ - 0.0_GeV, 0.0_GeV, - sqrt((projectileEnergyLabPerNucleon + nucleonMass) * - (projectileEnergyLabPerNucleon - nucleonMass))}); - - auto const energy = sqrt(momentum.squaredNorm() + square(nucleonMass)); - momentum.rebase(originalCS); // transform back into standard lab frame - std::cout << "secondary fragment> id=" << idFragm - << " p=" << momentum.GetComponents() << std::endl; - auto pnew = view.AddSecondary( + idFragm = particles::Code::Proton; + + auto momentum = geometry::Vector( + zAxisFrame, + corsika::QuantityVector<hepmomentum_d>{0.0_GeV, 0.0_GeV, + sqrt((projectileEnergyLab + particles::Proton::GetMass()) * + (projectileEnergyLab - particles::Proton::GetMass()))}); + + auto const energy = sqrt(momentum.squaredNorm() + square(particles::GetMass(idFragm))); + momentum.rebase(originalCS); // transform back into standard lab frame + std::cout << "secondary fragment> id=" << idFragm << " p=" << momentum.GetComponents() << std::endl; + auto pnew = vP.AddSecondary( tuple<particles::Code, units::si::HEPEnergyType, stack::MomentumVector, geometry::Point, units::si::TimeType>{idFragm, energy, momentum, pOrig, tOrig}); @@ -403,4 +395,4 @@ namespace corsika::process::qgsjetII { return process::EProcessReturn::eOk; } -} // namespace corsika::process::qgsjetII +} // namespace corsika::qgsjetII diff --git a/Processes/QGSJetII/ParticleConversion.cc b/corsika/process/detail/QGSJetII/ParticleConversion.cc similarity index 76% rename from Processes/QGSJetII/ParticleConversion.cc rename to corsika/process/detail/QGSJetII/ParticleConversion.cc index c8057e9ad..b9e405354 100644 --- a/Processes/QGSJetII/ParticleConversion.cc +++ b/corsika/process/detail/QGSJetII/ParticleConversion.cc @@ -6,7 +6,7 @@ * the license. */ -#include <corsika/particles/ParticleProperties.h> +#include <corsika/framework/core/ParticleProperties.hpp> #include <corsika/process/qgsjetII/ParticleConversion.h> -using namespace corsika::process::qgsjetII; +using namespace corsika::qgsjetII; diff --git a/Processes/QGSJetII/qgsjet-II-04.cc b/corsika/process/detail/QGSJetII/qgsjet-II-04.cc similarity index 83% rename from Processes/QGSJetII/qgsjet-II-04.cc rename to corsika/process/detail/QGSJetII/qgsjet-II-04.cc index a318d0a6c..d668daf0b 100644 --- a/Processes/QGSJetII/qgsjet-II-04.cc +++ b/corsika/process/detail/QGSJetII/qgsjet-II-04.cc @@ -8,7 +8,7 @@ #include <corsika/process/qgsjetII/qgsjet-II-04.h> -#include <corsika/random/RNGManager.h> +#include <corsika/framework/random/RNGManager.hpp> #include <iostream> #include <random> @@ -25,8 +25,8 @@ datadir::datadir(const std::string& dir) { } double qgran_(int&) { - static corsika::random::RNG& rng = - corsika::random::RNGManager::GetInstance().GetRandomStream("qgsjet"); + static corsika::RNG& rng = + corsika::RNGManager::GetInstance().GetRandomStream("qgran"); std::uniform_real_distribution<double> dist; return dist(rng); diff --git a/Processes/StackInspector/StackInspector.cc b/corsika/process/detail/StackInspector.cc similarity index 87% rename from Processes/StackInspector/StackInspector.cc rename to corsika/process/detail/StackInspector.cc index 6bd1bceb3..2a5622b3e 100644 --- a/Processes/StackInspector/StackInspector.cc +++ b/corsika/process/detail/StackInspector.cc @@ -6,23 +6,25 @@ * the license. */ -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/process/stack_inspector/StackInspector.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/process/stack_inspector/StackInspector.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> -#include <corsika/setup/SetupTrajectory.h> +#include <corsika/logging/Logger.h> #include <chrono> #include <iomanip> #include <iostream> #include <limits> + +#include "../corsika/setup/SetupTrajectory.hpp" using namespace std; using namespace corsika; -using namespace corsika::particles; +using namespace corsika; using namespace corsika::units::si; -using namespace corsika::process::stack_inspector; +using namespace corsika_inspector; template <typename TStack> StackInspector<TStack>::StackInspector(const int vNStep, const bool vReportStack, @@ -81,7 +83,7 @@ void StackInspector<TStack>::DoStack(const TStack& vS) { } #include <corsika/cascade/testCascade.h> -#include <corsika/setup/SetupStack.h> +#include "../corsika/setup/SetupStack.hpp" template class process::stack_inspector::StackInspector<setup::Stack>; template class process::stack_inspector::StackInspector<TestCascadeStack>; diff --git a/Processes/TrackWriter/TrackWriter.cc b/corsika/process/detail/TrackWriter.cc similarity index 82% rename from Processes/TrackWriter/TrackWriter.cc rename to corsika/process/detail/TrackWriter.cc index 2d9825d86..7ce08e49d 100644 --- a/Processes/TrackWriter/TrackWriter.cc +++ b/corsika/process/detail/TrackWriter.cc @@ -8,19 +8,19 @@ #include <corsika/process/track_writer/TrackWriter.h> -#include <corsika/particles/ParticleProperties.h> - -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> +#include <corsika/framework/core/ParticleProperties.hpp> #include <iomanip> #include <limits> -using namespace corsika::setup; +#include "../corsika/setup/SetupStack.hpp" +#include "../corsika/setup/SetupTrajectory.hpp" + +using namespace corsika; using Particle = Stack::ParticleType; using Track = Trajectory; -namespace corsika::process::track_writer { +namespace corsika::track_writer { TrackWriter::TrackWriter(std::string const& filename) : fFilename(filename) { @@ -56,4 +56,9 @@ namespace corsika::process::track_writer { return process::EProcessReturn::eOk; } -} // namespace corsika::process::track_writer + template <> + units::si::LengthType TrackWriter::MaxStepLength(Particle&, Track&) { + return units::si::meter * std::numeric_limits<double>::infinity(); + } + +} // namespace corsika::track_writer diff --git a/corsika/setup/SetupEnvironment.hpp b/corsika/setup/SetupEnvironment.hpp new file mode 100644 index 000000000..37b9357b6 --- /dev/null +++ b/corsika/setup/SetupEnvironment.hpp @@ -0,0 +1,19 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/Environment.hpp> +#include <corsika/media/IMediumModel.hpp> +#include <corsika/media/NameModel.hpp> + +namespace corsika::setup { + using IEnvironmentModel = corsika::IMediumModel; + using SetupEnvironment = corsika::Environment<IEnvironmentModel>; +} // namespace corsika + diff --git a/Framework/Utilities/try_feenableexcept.cc b/corsika/setup/SetupLogger.hpp similarity index 74% rename from Framework/Utilities/try_feenableexcept.cc rename to corsika/setup/SetupLogger.hpp index d70dbebad..5bddc24d1 100644 --- a/Framework/Utilities/try_feenableexcept.cc +++ b/corsika/setup/SetupLogger.hpp @@ -1,14 +1,14 @@ /* * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu * + * See file AUTHORS for a list of contributors. + * * This software is distributed under the terms of the GNU General Public * Licence version 3 (GPL Version 3). See file LICENSE for a full version of * the license. */ -#include <cfenv> +#pragma once + +namespace corsika {} -int main() { - feenableexcept(FE_ALL_EXCEPT); - return 0; -} \ No newline at end of file diff --git a/corsika/setup/SetupStack.hpp b/corsika/setup/SetupStack.hpp new file mode 100644 index 000000000..8b16947d5 --- /dev/null +++ b/corsika/setup/SetupStack.hpp @@ -0,0 +1,204 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +// the basic particle data stack: +#include <corsika/stack/SuperStupidStack.h> + +// extension with nuclear data for Code::Nucleus +#include <corsika/stack/NuclearStackExtension.h> + +// extension with geometry information for tracking +#include <corsika/media/Environment.hpp> +#include <corsika/framework/stack/CombinedStack.hpp> + +#include <tuple> +#include <utility> +#include <vector> +#include <corsika/setup/SetupEnvironment.hpp> + + namespace detail { + +/** + * @class GeometryData + * + * definition of stack-data object to store geometry information + */ +class GeometryData { + +public: + using BaseNodeType = typename TEnvType::BaseNodeType; + + // these functions are needed for the Stack interface + void Init() {} + void Clear() { fNode.clear(); } + unsigned int GetSize() const { return fNode.size(); } + unsigned int GetCapacity() const { return fNode.size(); } + void Copy(const int i1, const int i2) { fNode[i2] = fNode[i1]; } + void Swap(const int i1, const int i2) { std::swap(fNode[i1], fNode[i2]); } + + // custom data access function + void SetNode(const int i, BaseNodeType const* v) { fNode[i] = v; } + auto const* GetNode(const int i) const { return fNode[i]; } + + // these functions are also needed by the Stack interface + void IncrementSize() { fNode.push_back(nullptr); } + void DecrementSize() { + if (fNode.size() > 0) { fNode.pop_back(); } + } + + // custom private data section +private: + std::vector<const BaseNodeType*> fNode; +}; + +/** + * @class GeometryDataInterface + * + * corresponding defintion of a stack-readout object, the iteractor + * dereference operator will deliver access to these function +// defintion of a stack-readout object, the iteractor dereference +// operator will deliver access to these function + */ +template <typename T, typename TEnvType> +class GeometryDataInterface : public T { + +public: + using T::GetIndex; + using T::GetStackData; + using T::SetParticleData; + using BaseNodeType = typename TEnvType::BaseNodeType; + + // default version for particle-creation from input data + void SetParticleData(const std::tuple<BaseNodeType const*> v) { + SetNode(std::get<0>(v)); + } + void SetParticleData(GeometryDataInterface& parent, + const std::tuple<BaseNodeType const*>) { + SetNode(parent.GetNode()); // copy Node from parent particle! + } + void SetParticleData() { SetNode(nullptr); } + void SetParticleData(GeometryDataInterface& parent) { + SetNode(parent.GetNode()); // copy Node from parent particle! + } + void SetNode(BaseNodeType const* v) { GetStackData().SetNode(GetIndex(), v); } + auto const* GetNode() const { return GetStackData().GetNode(GetIndex()); } +}; + +namespace corsika::setup { + + // the GeometryNode stack needs to know the type of geometry-nodes from the + // environment: + template <typename TStackIter> + using SetupGeometryDataInterface = typename stack::node::MakeGeometryDataInterface< + TStackIter, corsika::setup::Environment>::type; + + // + // this is an auxiliary help typedef, which I don't know how to put + // into NuclearStackExtension.h where it belongs... + template <typename StackIter> + using ExtendedParticleInterfaceType = + corsika::nuclear_extension::NuclearParticleInterface< + corsika::super_stupid::SuperStupidStack::PIType, StackIter>; + // + + // the particle data stack with extra nuclear information: + using ParticleDataStack = corsika::nuclear_extension::NuclearStackExtension< + corsika::super_stupid::SuperStupidStack, ExtendedParticleInterfaceType>; + + // ------------------------------------------ + // Add [optional] history data to stack, too: + + // combine particle data stack with geometry information for tracking + template <typename StackIter> + using StackWithGeometryInterface = + corsika::CombinedParticleInterface<ParticleDataStack::PIType, + SetupGeometryDataInterface, StackIter>; + + using StackWithGeometry = + corsika::CombinedStack<typename ParticleDataStack::StackImpl, + GeometryData<setup::SetupEnvironment>, + StackWithGeometryInterface>; + + } // namespace detail + + // --------------------------------------- + // this is the FINAL stack we use in C8: + +#ifdef WITH_HISTORY + + /* + * the version with history + */ + using Stack = detail::StackWithHistory; + template <typename T1, template <typename> typename M2> + using StackViewProducer = corsika::history::HistorySecondaryProducer<T1, M2>; + + namespace detail { + /* + See Issue 161 + + unfortunately clang does not support this in the same way (yet) as + gcc, so we have to distinguish here. If clang cataches up, we + could remove the clang branch here and also in + corsika::Cascade. The gcc code is much more generic and + universal. If we could do the gcc version, we won't had to define + StackView globally, we could do it with MakeView whereever it is + actually needed. Keep an eye on this! + */ +#if defined(__clang__) + using TheStackView = corsika::stack::SecondaryView< + typename corsika::setup::Stack::StackImpl, + // CHECK with CLANG: corsika::setup::Stack::MPIType>; + corsika::setup::detail::StackWithHistoryInterface, StackViewProducer>; +#elif defined(__GNUC__) || defined(__GNUG__) + using TheStackView = + corsika::stack::MakeView<corsika::setup::Stack, StackViewProducer>::type; +#endif + } // namespace detail + +#else // WITH_HISTORY + + /* + * the version without history + */ + using Stack = detail::StackWithGeometry; + template <typename T1, template <typename> typename M2> + using StackViewProducer = corsika::stack::DefaultSecondaryProducer<T1, M2>; + + namespace detail { + /* + See Issue 161 + + unfortunately clang does not support this in the same way (yet) as + gcc, so we have to distinguish here. If clang cataches up, we + could remove the clang branch here and also in + corsika::Cascade. The gcc code is much more generic and + universal. If we could do the gcc version, we won't had to define + StackView globally, we could do it with MakeView whereever it is + actually needed. Keep an eye on this! + */ +#if defined(__clang__) + using StackView = + corsika::SecondaryView<typename corsika::Stack::StackImpl, + corsika::detail::StackWithGeometryInterface>; +#elif defined(__GNUC__) || defined(__GNUG__) + using StackView = corsika::MakeView<corsika::setup::Stack>::type; +#endif + } // namespace detail + +#endif + + // --------------------------------------- + // this is the FINAL stackitertor (particle type) we use in C8: + + using StackView = detail::TheStackView; + +} // namespace corsika + diff --git a/Setup/SetupTrajectory.h b/corsika/setup/SetupTrajectory.hpp similarity index 78% rename from Setup/SetupTrajectory.h rename to corsika/setup/SetupTrajectory.hpp index 2a42db7a6..5b84a1400 100644 --- a/Setup/SetupTrajectory.h +++ b/corsika/setup/SetupTrajectory.hpp @@ -8,25 +8,23 @@ #pragma once -#include <corsika/geometry/Helix.h> -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Trajectory.h> +#include <corsika/framework/geometry/Helix.hpp> +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Trajectory.hpp> -#include <corsika/process/tracking_line/Tracking.h> -#include <corsika/process/tracking_leapfrog_curved/Tracking.h> -#include <corsika/process/tracking_leapfrog_straight/Tracking.h> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <corsika/units/PhysicalUnits.h> namespace corsika::setup { - /** - Note/Warning: Tracking and Trajectory must fit together ! + /// definition of Trajectory base class, to be used in tracking and cascades + typedef corsika::Trajectory<corsika::Line> Trajectory; - tracking_leapfrog_curved::Tracking is the result of the Bachelor - thesis of Andre Schmidt, KIT. This is a leap-frog algorithm with - an analytical, precise calculation of volume intersections. This - algorithm needs a LeapFrogTrajectory. + /* + typedef std::variant<std::monostate, corsika::Trajectory<Line>, + corsika::Trajectory<Helix>> + Trajectory; tracking_leapfrog_straight::Tracking is a more simple and direct leap-frog implementation. The two halve steps are coded explicitly @@ -79,7 +77,7 @@ namespace corsika::setup { MagneticFieldVector{line.GetR0().GetCoordinateSystem(), 0_T, 0_T, 0_T}, k, tEnd); } - - } // namespace testing - + }; + */ } // namespace corsika::setup + diff --git a/Stack/DummyStack/DummyStack.h b/corsika/stack/DummyStack.h similarity index 90% rename from Stack/DummyStack/DummyStack.h rename to corsika/stack/DummyStack.h index 26270b51c..64934107b 100644 --- a/Stack/DummyStack/DummyStack.h +++ b/corsika/stack/DummyStack.h @@ -8,15 +8,14 @@ #pragma once -#include <corsika/logging/Logging.h> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/stack/Stack.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/stack/Stack.hpp> #include <string> #include <tuple> -namespace corsika::stack { +namespace corsika { namespace dummy { @@ -84,4 +83,4 @@ namespace corsika::stack { } // namespace dummy -} // namespace corsika::stack +} // namespace corsika diff --git a/Stack/NuclearStackExtension/NuclearStackExtension.h b/corsika/stack/NuclearStackExtension.h similarity index 77% rename from Stack/NuclearStackExtension/NuclearStackExtension.h rename to corsika/stack/NuclearStackExtension.h index c2ac33e2e..a8dc43230 100644 --- a/Stack/NuclearStackExtension/NuclearStackExtension.h +++ b/corsika/stack/NuclearStackExtension.h @@ -8,15 +8,12 @@ #pragma once -#include <corsika/particles/ParticleProperties.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/stack/Stack.hpp> -#include <corsika/stack/Stack.h> -#include <corsika/stack/super_stupid/SuperStupidStack.h> - -#include <corsika/units/PhysicalUnits.h> - -#include <corsika/geometry/Point.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Vector.hpp> #include <corsika/logging/Logging.h> @@ -24,7 +21,7 @@ #include <tuple> #include <vector> -namespace corsika::stack { +namespace corsika { /** * @namespace nuclear_extension @@ -44,7 +41,7 @@ namespace corsika::stack { * */ - typedef corsika::geometry::Vector<corsika::units::si::hepmomentum_d> MomentumVector; + typedef corsika::Vector<corsika::units::si::hepmomentum_d> MomentumVector; namespace nuclear_extension { @@ -66,10 +63,10 @@ namespace corsika::stack { public: void SetParticleData( - const std::tuple<corsika::particles::Code, corsika::units::si::HEPEnergyType, - corsika::stack::MomentumVector, corsika::geometry::Point, + const std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + corsika::MomentumVector, corsika::Point, corsika::units::si::TimeType>& v) { - if (std::get<0>(v) == corsika::particles::Code::Nucleus) { + if (std::get<0>(v) == corsika::Code::Nucleus) { std::ostringstream err; err << "NuclearStackExtension: no A and Z specified for new Nucleus!"; throw std::runtime_error(err.str()); @@ -79,13 +76,13 @@ namespace corsika::stack { } void SetParticleData( - const std::tuple<corsika::particles::Code, corsika::units::si::HEPEnergyType, - corsika::stack::MomentumVector, corsika::geometry::Point, + const std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + corsika::MomentumVector, corsika::Point, corsika::units::si::TimeType, unsigned short, unsigned short>& v) { const unsigned short A = std::get<5>(v); const unsigned short Z = std::get<6>(v); - if (std::get<0>(v) != corsika::particles::Code::Nucleus || A == 0 || Z == 0) { + if (std::get<0>(v) != corsika::Code::Nucleus || A == 0 || Z == 0) { std::ostringstream err; err << "NuclearStackExtension: no A and Z specified for new Nucleus!"; throw std::runtime_error(err.str()); @@ -94,8 +91,8 @@ namespace corsika::stack { SetNuclearA(A); SetNuclearZ(Z); InnerParticleInterface<StackIteratorInterface>::SetParticleData( - std::tuple<corsika::particles::Code, corsika::units::si::HEPEnergyType, - corsika::stack::MomentumVector, corsika::geometry::Point, + std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + corsika::MomentumVector, corsika::Point, corsika::units::si::TimeType>{std::get<0>(v), std::get<1>(v), std::get<2>(v), std::get<3>(v), std::get<4>(v)}); @@ -103,17 +100,17 @@ namespace corsika::stack { void SetParticleData( InnerParticleInterface<StackIteratorInterface>& p, - const std::tuple<corsika::particles::Code, corsika::units::si::HEPEnergyType, - corsika::stack::MomentumVector, corsika::geometry::Point, + const std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + corsika::MomentumVector, corsika::Point, corsika::units::si::TimeType>& v) { - if (std::get<0>(v) == corsika::particles::Code::Nucleus) { + if (std::get<0>(v) == corsika::Code::Nucleus) { std::ostringstream err; err << "NuclearStackExtension: no A and Z specified for new Nucleus!"; throw std::runtime_error(err.str()); } InnerParticleInterface<StackIteratorInterface>::SetParticleData( - p, std::tuple<corsika::particles::Code, corsika::units::si::HEPEnergyType, - corsika::stack::MomentumVector, corsika::geometry::Point, + p, std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + corsika::MomentumVector, corsika::Point, corsika::units::si::TimeType>{std::get<0>(v), std::get<1>(v), std::get<2>(v), std::get<3>(v), std::get<4>(v)}); @@ -122,13 +119,13 @@ namespace corsika::stack { void SetParticleData( InnerParticleInterface<StackIteratorInterface>& p, - const std::tuple<corsika::particles::Code, corsika::units::si::HEPEnergyType, - corsika::stack::MomentumVector, corsika::geometry::Point, + const std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + corsika::MomentumVector, corsika::Point, corsika::units::si::TimeType, unsigned short, unsigned short>& v) { const unsigned short A = std::get<5>(v); const unsigned short Z = std::get<6>(v); - if (std::get<0>(v) != corsika::particles::Code::Nucleus || A == 0 || Z == 0) { + if (std::get<0>(v) != corsika::Code::Nucleus || A == 0 || Z == 0) { std::ostringstream err; err << "NuclearStackExtension: no A and Z specified for new Nucleus!"; throw std::runtime_error(err.str()); @@ -137,8 +134,8 @@ namespace corsika::stack { SetNuclearA(A); SetNuclearZ(Z); InnerParticleInterface<StackIteratorInterface>::SetParticleData( - p, std::tuple<corsika::particles::Code, corsika::units::si::HEPEnergyType, - corsika::stack::MomentumVector, corsika::geometry::Point, + p, std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + corsika::MomentumVector, corsika::Point, corsika::units::si::TimeType>{std::get<0>(v), std::get<1>(v), std::get<2>(v), std::get<3>(v), std::get<4>(v)}); @@ -176,8 +173,8 @@ namespace corsika::stack { */ corsika::units::si::HEPMassType GetMass() const { if (InnerParticleInterface<StackIteratorInterface>::GetPID() == - corsika::particles::Code::Nucleus) - return corsika::particles::GetNucleusMass(GetNuclearA(), GetNuclearZ()); + corsika::Code::Nucleus) + return corsika::GetNucleusMass(GetNuclearA(), GetNuclearZ()); return InnerParticleInterface<StackIteratorInterface>::GetMass(); } /** @@ -185,7 +182,7 @@ namespace corsika::stack { **/ int16_t GetChargeNumber() const { if (InnerParticleInterface<StackIteratorInterface>::GetPID() == - corsika::particles::Code::Nucleus) + corsika::Code::Nucleus) return GetNuclearZ(); return InnerParticleInterface<StackIteratorInterface>::GetChargeNumber(); } @@ -345,19 +342,48 @@ namespace corsika::stack { }; // end class NuclearStackExtensionImpl + // template<typename StackIteratorInterface> + // using NuclearParticleInterfaceType<StackIteratorInterface> = + // NuclearParticleInterface< ,StackIteratorInterface> + + // works, but requires stupd _PI class + // template<typename SS> using TEST = + // NuclearParticleInterface<corsika::super_stupid::SuperStupidStack::PIType, + // SS>; template <typename InnerStack, template <typename> typename _PI> using NuclearStackExtension = Stack<NuclearStackExtensionImpl<typename InnerStack::StackImpl>, _PI>; - // - template <typename StackIter> - using ExtendedParticleInterfaceType = - corsika::stack::nuclear_extension::NuclearParticleInterface< - corsika::stack::super_stupid::SuperStupidStack::MPIType, StackIter>; - - // the particle data stack with extra nuclear information: - using ParticleDataStack = corsika::stack::nuclear_extension::NuclearStackExtension< - corsika::stack::super_stupid::SuperStupidStack, ExtendedParticleInterfaceType>; + // ---- + + // I'm dont't manage to do this properly....... + /* + template<typename TT, typename SS> using TESTi = typename + NuclearParticleInterface<TT::template PIType, SS>::ExtendedParticleInterface; + template<typename TT, typename SS> using TEST1 = TESTi<TT, SS>; + template<typename SS> using TEST2 = TEST1<typename + corsika::super_stupid::SuperStupidStack, SS>; + + using NuclearStackExtension = Stack<NuclearStackExtensionImpl<typename + InnerStack::StackImpl>, TEST2>; + */ + /* + // .... this should be fixed .... + + template <typename InnerStack, typename SS=StackIteratorInterface> + //using NuclearStackExtension = Stack<NuclearStackExtensionImpl<typename + InnerStack::StackImpl>, NuclearParticleInterface<typename InnerStack::template PIType, + StackIteratorInterface>::ExtendedParticleInterface>; using NuclearStackExtension = + Stack<NuclearStackExtensionImpl<typename InnerStack::StackImpl>, TEST1<typename + corsika::super_stupid::SuperStupidStack, SS> >; + + //template <typename InnerStack> + // using NuclearStackExtension = Stack<NuclearStackExtensionImpl<typename + InnerStack::StackImpl>, TEST<typename + corsika::super_stupid::SuperStupidStack::PIType>>; + //using NuclearStackExtension = Stack<NuclearStackExtensionImpl<typename + InnerStack::StackImpl>, TEST>; + */ } // namespace nuclear_extension -} // namespace corsika::stack +} // namespace corsika diff --git a/Stack/SuperStupidStack/SuperStupidStack.h b/corsika/stack/SuperStupidStack.h similarity index 64% rename from Stack/SuperStupidStack/SuperStupidStack.h rename to corsika/stack/SuperStupidStack.h index eae265cc7..267f172dd 100644 --- a/Stack/SuperStupidStack/SuperStupidStack.h +++ b/corsika/stack/SuperStupidStack.h @@ -8,21 +8,21 @@ #pragma once -#include <corsika/particles/ParticleProperties.h> -#include <corsika/stack/Stack.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/stack/Stack.hpp> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> // remove -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> // remove +#include <corsika/framework/geometry/Vector.hpp> #include <string> #include <tuple> #include <vector> -namespace corsika::stack { +namespace corsika { - typedef corsika::geometry::Vector<corsika::units::si::hepmomentum_d> MomentumVector; + typedef corsika::Vector<corsika::units::si::hepmomentum_d> MomentumVector; namespace super_stupid { @@ -34,11 +34,11 @@ namespace corsika::stack { class ParticleInterface : public ParticleBase<StackIteratorInterface> { protected: - using corsika::stack::ParticleBase<StackIteratorInterface>::GetStack; - using corsika::stack::ParticleBase<StackIteratorInterface>::GetStackData; + using corsika::ParticleBase<StackIteratorInterface>::GetStack; + using corsika::ParticleBase<StackIteratorInterface>::GetStackData; public: - using corsika::stack::ParticleBase<StackIteratorInterface>::GetIndex; + using corsika::ParticleBase<StackIteratorInterface>::GetIndex; public: std::string as_string() const { @@ -48,39 +48,56 @@ namespace corsika::stack { } void SetParticleData( - const std::tuple<corsika::particles::Code, corsika::units::si::HEPEnergyType, - MomentumVector, corsika::geometry::Point, - corsika::units::si::TimeType>& v) { + const std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + MomentumVector, corsika::Point, corsika::units::si::TimeType>& + v) { SetPID(std::get<0>(v)); SetEnergy(std::get<1>(v)); SetMomentum(std::get<2>(v)); SetPosition(std::get<3>(v)); SetTime(std::get<4>(v)); } + /* + void SetParticleData(const corsika::Code vDataPID, + const corsika::units::si::HEPEnergyType vDataE, + const MomentumVector& vMomentum, + const corsika::Point& vPosition, + const corsika::units::si::TimeType vTime) { + }*/ void SetParticleData( ParticleInterface<StackIteratorInterface>&, - const std::tuple<corsika::particles::Code, corsika::units::si::HEPEnergyType, - MomentumVector, corsika::geometry::Point, - corsika::units::si::TimeType>& v) { + const std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + MomentumVector, corsika::Point, corsika::units::si::TimeType>& + v) { SetPID(std::get<0>(v)); SetEnergy(std::get<1>(v)); SetMomentum(std::get<2>(v)); SetPosition(std::get<3>(v)); SetTime(std::get<4>(v)); } + /* void SetParticleData(ParticleInterface<StackIteratorInterface>&, + const corsika::Code vDataPID, + const corsika::units::si::HEPEnergyType vDataE, + const MomentumVector& vMomentum, + const corsika::Point& vPosition, + const corsika::units::si::TimeType vTime) { + SetPID(vDataPID); + SetEnergy(vDataE); + SetMomentum(vMomentum); + SetPosition(vPosition); + SetTime(vTime); + }*/ /// individual setters - void SetPID(const corsika::particles::Code id) { - GetStackData().SetPID(GetIndex(), id); - } + void SetPID(const corsika::Code id) { GetStackData().SetPID(GetIndex(), id); } void SetEnergy(const corsika::units::si::HEPEnergyType& e) { GetStackData().SetEnergy(GetIndex(), e); } void SetMomentum(const MomentumVector& v) { GetStackData().SetMomentum(GetIndex(), v); } - void SetPosition(const corsika::geometry::Point& v) { + void SetPosition(const corsika::Point& v) { GetStackData().SetPosition(GetIndex(), v); } void SetTime(const corsika::units::si::TimeType& v) { @@ -88,16 +105,14 @@ namespace corsika::stack { } /// individual getters - corsika::particles::Code GetPID() const { - return GetStackData().GetPID(GetIndex()); - } + corsika::Code GetPID() const { return GetStackData().GetPID(GetIndex()); } corsika::units::si::HEPEnergyType GetEnergy() const { return GetStackData().GetEnergy(GetIndex()); } MomentumVector GetMomentum() const { return GetStackData().GetMomentum(GetIndex()); } - corsika::geometry::Point GetPosition() const { + corsika::Point GetPosition() const { return GetStackData().GetPosition(GetIndex()); } corsika::units::si::TimeType GetTime() const { @@ -108,16 +123,13 @@ namespace corsika::stack { * * @{ */ - corsika::geometry::Vector<corsika::units::si::dimensionless_d> GetDirection() - const { + corsika::Vector<corsika::units::si::dimensionless_d> GetDirection() const { return GetMomentum() / GetEnergy(); } corsika::units::si::HEPMassType GetMass() const { - return corsika::particles::GetMass(GetPID()); - } - int16_t GetChargeNumber() const { - return corsika::particles::GetChargeNumber(GetPID()); + return corsika::GetMass(GetPID()); } + int16_t GetChargeNumber() const { return corsika::GetChargeNumber(GetPID()); } ///@} }; @@ -142,30 +154,26 @@ namespace corsika::stack { unsigned int GetSize() const { return fDataPID.size(); } unsigned int GetCapacity() const { return fDataPID.size(); } - void SetPID(const unsigned int i, const corsika::particles::Code id) { - fDataPID[i] = id; - } + void SetPID(const unsigned int i, const corsika::Code id) { fDataPID[i] = id; } void SetEnergy(const unsigned int i, const corsika::units::si::HEPEnergyType e) { fDataE[i] = e; } void SetMomentum(const unsigned int i, const MomentumVector& v) { fMomentum[i] = v; } - void SetPosition(const unsigned int i, const corsika::geometry::Point& v) { + void SetPosition(const unsigned int i, const corsika::Point& v) { fPosition[i] = v; } void SetTime(const unsigned int i, const corsika::units::si::TimeType& v) { fTime[i] = v; } - corsika::particles::Code GetPID(const unsigned int i) const { return fDataPID[i]; } + corsika::Code GetPID(const unsigned int i) const { return fDataPID[i]; } corsika::units::si::HEPEnergyType GetEnergy(const unsigned int i) const { return fDataE[i]; } MomentumVector GetMomentum(const unsigned int i) const { return fMomentum[i]; } - corsika::geometry::Point GetPosition(const unsigned int i) const { - return fPosition[i]; - } + corsika::Point GetPosition(const unsigned int i) const { return fPosition[i]; } corsika::units::si::TimeType GetTime(const unsigned int i) const { return fTime[i]; } @@ -193,12 +201,12 @@ namespace corsika::stack { } void IncrementSize() { - using corsika::geometry::Point; - using corsika::particles::Code; + using corsika::Code; + using corsika::Point; fDataPID.push_back(Code::Unknown); fDataE.push_back(0 * corsika::units::si::electronvolt); - geometry::CoordinateSystem& dummyCS = - geometry::RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + CoordinateSystem& dummyCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); fMomentum.push_back(MomentumVector( dummyCS, {0 * corsika::units::si::electronvolt, 0 * corsika::units::si::electronvolt, @@ -222,10 +230,10 @@ namespace corsika::stack { private: /// the actual memory to store particle data - std::vector<corsika::particles::Code> fDataPID; + std::vector<corsika::Code> fDataPID; std::vector<corsika::units::si::HEPEnergyType> fDataE; std::vector<MomentumVector> fMomentum; - std::vector<corsika::geometry::Point> fPosition; + std::vector<corsika::Point> fPosition; std::vector<corsika::units::si::TimeType> fTime; }; // end class SuperStupidStackImpl @@ -234,4 +242,4 @@ namespace corsika::stack { } // namespace super_stupid -} // namespace corsika::stack +} // namespace corsika diff --git a/dependencies/CMakeLists.txt b/dependencies/CMakeLists.txt new file mode 100644 index 000000000..ed2ead3f6 --- /dev/null +++ b/dependencies/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required (VERSION 3.9) + +project ( + corsika_modules + VERSION 8.0.0 + DESCRIPTION "CORSIKA modules" + LANGUAGES CXX + ) + +include (FeatureSummary) + +# as long as there still are modules using it: +enable_language (Fortran) + +set (CMAKE_CXX_STANDARD 17) +set (CMAKE_CXX_EXTENSIONS OFF) + +# enable warnings and disallow non-standard language +# configure the various build types here, too +# FYI: optimizer flags: -O2 would not trade speed for size, neither O2/3 use fast-math +# debug: O0, relwithdebinfo: 02, release: O3, minsizerel: Os (all defaults) +set (CMAKE_CXX_FLAGS "-Wall -pedantic -Wextra -Wno-ignored-qualifiers") +set (CMAKE_Fortran_FLAGS "-std=legacy -Wfunction-elimination") + +# clang produces a lot of unecessary warnings without this: +add_compile_options ("$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:-Wno-nonportable-include-path>") + +# order of subdirectories +add_subdirectory (Sibyll) +#add_subdirectory (Pythia) +add_subdirectory (QGSJetII) +add_subdirectory (UrQMD) diff --git a/Processes/Pythia/CMakeLists.txt b/dependencies/Pythia/CMakeLists.txt similarity index 97% rename from Processes/Pythia/CMakeLists.txt rename to dependencies/Pythia/CMakeLists.txt index f4fab9493..516afe3af 100644 --- a/Processes/Pythia/CMakeLists.txt +++ b/dependencies/Pythia/CMakeLists.txt @@ -14,7 +14,7 @@ set ( set ( MODEL_NAMESPACE - corsika/process/pythia + dependencies/Pythia ) add_library (ProcessPythia8 STATIC ${MODEL_SOURCES}) diff --git a/dependencies/Pythia/Decay.cc b/dependencies/Pythia/Decay.cc new file mode 100644 index 000000000..690593913 --- /dev/null +++ b/dependencies/Pythia/Decay.cc @@ -0,0 +1,262 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <Pythia8/Pythia.h> +#include <dependencies/Pythia/Decay.h> +#include <dependencies/Pythia/Random.h> + +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/utility/COMBoost.hpp> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> + +using std::cout; +using std::endl; +using std::tuple; +using std::vector; + +using namespace corsika; +using namespace corsika::setup; +using View = corsika::StackView; +using Particle = corsika::Stack::ParticleType; +using Track = Trajectory; + +namespace corsika::pythia { + + Decay::Decay() { + + // set random number generator in pythia + Pythia8::RndmEngine* rndm = new corsika::pythia::Random(); + fPythia.setRndmEnginePtr(rndm); + + /* + issue xyz: definition of particles and decay channels use the same mechanism in + corsika and pythia we should force pythia to use the file in corsika. + */ + // bool ParticleData::reInit(string startFile, bool xmlFormat = true) + // read in particle data from Corsika 8 + // fPythia.particleData.reInit("/home/felix/ngcorsika/corsika-build/include/corsika/framework/coreParticleData.xml"); + // fPythia.particleData.checkTable(); + + fPythia.readString("Next:numberShowInfo = 0"); + fPythia.readString("Next:numberShowProcess = 0"); + fPythia.readString("Next:numberShowEvent = 0"); + + fPythia.readString("Print:quiet = on"); + fPythia.readString("Check:particleData = 0"); + + /* + switching off event check in pythia is needed to allow decays that are off-shell + according to the mass definition in pythia. + the consistency of particle masses between event generators is an unsolved issues + */ + cout << "Pythia::Init: switching off event checking in pythia.." << endl; + fPythia.readString("Check:event = 1"); + + fPythia.readString("ProcessLevel:all = off"); + fPythia.readString("ProcessLevel:resonanceDecays = off"); + + // making sure + SetStable(Code::Pi0); + + // fPythia.particleData.readString("59:m0 = 101.00"); + + if (!fPythia.init()) + throw std::runtime_error("Pythia::Decay: Initialization failed!"); + } + + Decay::Decay(std::set<Code> vHandled) + : handleAllDecays_(false) + , handledDecays_(vHandled) {} + + Decay::~Decay() { cout << "Pythia::Decay n=" << fCount << endl; } + + bool Decay::CanHandleDecay(const Code vParticleCode) { + using namespace corsika::particles; + // if known to pythia and not proton, electron or neutrino it can decay + if (vParticleCode == Code::Proton || vParticleCode == Code::AntiProton || + vParticleCode == Code::NuE || vParticleCode == Code::NuMu || + vParticleCode == Code::NuTau || vParticleCode == Code::NuEBar || + vParticleCode == Code::NuMuBar || vParticleCode == Code::NuTauBar || + vParticleCode == Code::Electron || vParticleCode == Code::Positron) + return false; + else if (CanDecay(vParticleCode)) // non-zero for particles known to sibyll + return true; + else + return false; + } + + void Decay::SetHandleDecay(const Code vParticleCode) { + handleAllDecays_ = false; + cout << "Pythia::Decay: set to handle decay of " << vParticleCode << endl; + if (Decay::CanHandleDecay(vParticleCode)) + handledDecays_.insert(vParticleCode); + else + throw std::runtime_error("this decay can not be handled by pythia!"); + } + + void Decay::SetHandleDecay(const vector<Code> vParticleList) { + handleAllDecays_ = false; + for (auto p : vParticleList) SetHandleDecay(p); + } + + bool Decay::IsDecayHandled(const corsika::Code vParticleCode) { + if (handleAllDecays_ && CanHandleDecay(vParticleCode)) + return true; + else + return handledDecays_.find(vParticleCode) != Decay::handledDecays_.end(); + } + + bool Decay::IsStable(const Code vCode) { + return fPythia.particleData.canDecay(static_cast<int>(GetPDG(vCode))); + } + + void Decay::PrintDecayConfig(const Code vCode) { + cout << "Decay: Pythia decay configuration:" << endl; + cout << vCode << " is "; + if (IsStable(vCode)) + cout << "stable" << endl; + else + cout << "unstable" << endl; + } + + void Decay::PrintDecayConfig() { + cout << "Pythia::Decay: decay configuration:" << endl; + if (handleAllDecays_) + cout << " all particles known to Pythia are handled by Pythia::Decay!" << endl; + else + for (auto& pCode : handledDecays_) + cout << "Decay of " << pCode << " is handled by Pythia!" << endl; + } + + void Decay::SetStable(const vector<Code> particleList) { + for (auto p : particleList) Decay::SetStable(p); + } + + bool Decay::CanDecay(const Code pCode) { + std::cout << "Pythia::Decay: checking if particle: " << pCode + << " can decay in PYTHIA? "; + const bool ans = fPythia.particleData.canDecay(static_cast<int>(GetPDG(pCode))); + std::cout << ans << std::endl; + return ans; + } + + void Decay::SetUnstable(const Code pCode) { + cout << "Pythia::Decay: setting " << pCode << " unstable.." << endl; + fPythia.particleData.mayDecay(static_cast<int>(GetPDG(pCode)), true); + } + + void Decay::SetStable(const Code pCode) { + cout << "Pythia::Decay: setting " << pCode << " stable.." << endl; + fPythia.particleData.mayDecay(static_cast<int>(GetPDG(pCode)), false); + } + + template <> + units::si::TimeType Decay::GetLifetime(Particle const& vP) { + using namespace units::si; + + const auto pid = vP.GetPID(); + if (CanDecay(pid)) { + HEPEnergyType E = vP.GetEnergy(); + HEPMassType m = vP.GetMass(); + + const double gamma = E / m; + + const TimeType t0 = GetLifetime(pid); + auto const lifetime = gamma * t0; + cout << "Pythia::Decay: code: " << vP.GetPID() << endl; + cout << "Pythia::Decay: MinStep: t0: " << t0 << endl; + cout << "Pythia::Decay: MinStep: energy: " << E / 1_GeV << " GeV" << endl; + cout << "Pythia::Decay: momentum: " << vP.GetMomentum().GetComponents() / 1_GeV + << " GeV" << endl; + cout << "Pythia::Decay: MinStep: gamma: " << gamma << endl; + cout << "Pythia::Decay: MinStep: tau: " << lifetime << endl; + + return lifetime; + } else + return std::numeric_limits<double>::infinity() * 1_s; + } + + template <> + void Decay::DoDecay(View& view) { + using geometry::Point; + using namespace units; + using namespace units::si; + + auto const projectile = view.GetProjectile(); + + auto const& decayPoint = projectile.GetPosition(); + auto const t0 = projectile.GetTime(); + + auto const& labMomentum = projectile.GetMomentum(); + geometry::CoordinateSystem const& labCS = labMomentum.GetCoordinateSystem(); + + // define target kinematics in lab frame + // define boost to and from CoM frame + // CoM frame definition in Pythia projectile: +z + utl::COMBoost const boost(labMomentum, projectile.GetMass()); + auto const& rotatedCS = boost.GetRotatedCS(); + + fCount++; + + // pythia stack + Pythia8::Event& event = fPythia.event; + event.reset(); + + auto const particleId = projectile.GetPID(); + + // set particle unstable + Decay::SetUnstable(particleId); + + // input particle PDG + auto const pdgCode = static_cast<int>(GetPDG(particleId)); + + double constexpr px = 0; + double constexpr py = 0; + double constexpr pz = 0; + double const en = projectile.GetMass() / 1_GeV; + double const m = en; + + // add particle to pythia stack + event.append(pdgCode, 1, 0, 0, px, py, pz, en, m); + + if (!fPythia.next()) + throw std::runtime_error("Pythia::Decay: decay failed!"); + else + cout << "Pythia::Decay: particles after decay: " << event.size() << endl; + + // list final state + event.list(); + + // loop over final state + for (int i = 0; i < event.size(); ++i) + if (event[i].isFinal()) { + auto const pyId = ConvertFromPDG(static_cast<PDGCode>(event[i].id())); + HEPEnergyType const Erest = event[i].e() * 1_GeV; + MomentumVector const pRest( + rotatedCS, + {event[i].px() * 1_GeV, event[i].py() * 1_GeV, event[i].pz() * 1_GeV}); + geometry::FourVector const fourMomRest{Erest, pRest}; + auto const fourMomLab = boost.fromCoM(fourMomRest); + + cout << "particle: id=" << pyId << " momentum=" + << fourMomLab.GetSpaceLikeComponents().GetComponents(labCS) / 1_GeV + << " energy=" << fourMomLab.GetTimeLikeComponent() << endl; + + view.AddSecondary( + tuple<Code, units::si::HEPEnergyType, corsika::stack::MomentumVector, + geometry::Point, units::si::TimeType>{ + pyId, fourMomLab.GetTimeLikeComponent(), + fourMomLab.GetSpaceLikeComponents(), decayPoint, t0}); + } + + // set particle stable + Decay::SetStable(particleId); + } + +} // namespace corsika::pythia diff --git a/Processes/Pythia/Decay.h b/dependencies/Pythia/Decay.h similarity index 58% rename from Processes/Pythia/Decay.h rename to dependencies/Pythia/Decay.h index 51a43b7e3..48ce89f8e 100644 --- a/Processes/Pythia/Decay.h +++ b/dependencies/Pythia/Decay.h @@ -9,46 +9,43 @@ #pragma once #include <Pythia8/Pythia.h> -#include <corsika/particles/ParticleProperties.h> +#include <corsika/framework/coreParticleProperties.h> #include <corsika/process/DecayProcess.h> -#include <corsika/units/PhysicalUnits.h> -#include <corsika/geometry/FourVector.h> -namespace corsika::process { +namespace corsika { namespace pythia { - typedef corsika::geometry::Vector<corsika::units::si::hepmomentum_d> MomentumVector; + typedef corsika::Vector<corsika::units::si::hepmomentum_d> MomentumVector; - class Decay : public corsika::process::DecayProcess<Decay> { + class Decay : public corsika::DecayProcess<Decay> { int fCount = 0; bool handleAllDecays_ = true; - bool print_listing_ = false; public: - Decay(const bool print_listing = false); - Decay(std::set<particles::Code>); + Decay(); + Decay(std::set<Code>); ~Decay(); // is Pythia::Decay set to handle the decay of this particle? - bool IsDecayHandled(const corsika::particles::Code); + bool IsDecayHandled(const corsika::Code); // is decay possible in principle? - bool CanHandleDecay(const corsika::particles::Code); + bool CanHandleDecay(const corsika::Code); // set Pythia::Decay to handle the decay of this particle! - void SetHandleDecay(const corsika::particles::Code); + void SetHandleDecay(const corsika::Code); // set Pythia::Decay to handle the decay of this list of particles! - void SetHandleDecay(const std::vector<particles::Code>); + void SetHandleDecay(const std::vector<Code>); // set Pythia::Decay to handle all particle decays void SetHandleAllDecays(); // print internal configuration for this particle - void PrintDecayConfig(const corsika::particles::Code); + void PrintDecayConfig(const corsika::Code); // print configuration of decays in corsika void PrintDecayConfig(); - bool CanDecay(const corsika::particles::Code); + bool CanDecay(const corsika::Code); /** In this function PYTHIA is asked for the lifetime of the input particle. @@ -67,14 +64,14 @@ namespace corsika::process { void DoDecay(TSecondaryView&); private: - void SetUnstable(const corsika::particles::Code); - void SetStable(const corsika::particles::Code); - void SetStable(const std::vector<particles::Code>); - bool IsStable(const corsika::particles::Code); + void SetUnstable(const corsika::Code); + void SetStable(const corsika::Code); + void SetStable(const std::vector<Code>); + bool IsStable(const corsika::Code); Pythia8::Pythia fPythia; - std::set<particles::Code> handledDecays_; + std::set<Code> handledDecays_; }; } // namespace pythia -} // namespace corsika::process +} // namespace corsika diff --git a/dependencies/Pythia/Interaction.cc b/dependencies/Pythia/Interaction.cc new file mode 100644 index 000000000..dbe514cf2 --- /dev/null +++ b/dependencies/Pythia/Interaction.cc @@ -0,0 +1,389 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <dependencies/Pythia/Interaction.h> + +#include <corsika/environment/Environment.h> +#include <corsika/environment/NuclearComposition.h> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/utility/COMBoost.hpp> +#include <corsika/setup/SetupStack.hpp> + +#include <tuple> + +using std::cout; +using std::endl; +using std::tuple; + +using namespace corsika; +using namespace corsika::setup; +using SecondaryView = corsika::setup::StackView; +using Particle = corsika::setup::Stack::ParticleType; + +namespace corsika::pythia { + + typedef corsika::Vector<corsika::units::si::hepmomentum_d> MomentumVector; + + Interaction::~Interaction() {} + + Interaction::Interaction() { + cout << "Pythia::Interaction n=" << fCount << endl; + + using random::RNGManager; + + // initialize Pythia + if (!fInitialized) { + + fPythia.readString("Print:quiet = on"); + // TODO: proper process initialization for MinBias needed + fPythia.readString("HardQCD:all = on"); + fPythia.readString("ProcessLevel:resonanceDecays = off"); + + fPythia.init(); + + // any decays in pythia? if yes need to define which particles + if (fInternalDecays) { + // define which particles are passed to corsika, i.e. which particles make it into + // history even very shortlived particles like charm or pi0 are of interest here + const std::vector<Code> HadronsWeWantTrackedByCorsika = { + Code::PiPlus, Code::PiMinus, Code::Pi0, Code::KMinus, + Code::KPlus, Code::K0Long, Code::K0Short, Code::SigmaPlus, + Code::SigmaMinus, Code::Lambda0, Code::Xi0, Code::XiMinus, + Code::OmegaMinus, Code::DPlus, Code::DMinus, Code::D0, + Code::D0Bar}; + + Interaction::SetParticleListStable(HadronsWeWantTrackedByCorsika); + } + + // basic initialization of cross section routines + fSigma.init(&fPythia.info, fPythia.settings, &fPythia.particleData, &fPythia.rndm); + + fInitialized = true; + } + } + + void Interaction::SetParticleListStable(std::vector<Code> const& particleList) { + for (auto p : particleList) Interaction::SetStable(p); + } + + void Interaction::SetUnstable(const Code pCode) { + cout << "Pythia::Interaction: setting " << pCode << " unstable.." << endl; + fPythia.particleData.mayDecay(static_cast<int>(GetPDG(pCode)), true); + } + + void Interaction::SetStable(const Code pCode) { + cout << "Pythia::Interaction: setting " << pCode << " stable.." << endl; + fPythia.particleData.mayDecay(static_cast<int>(GetPDG(pCode)), false); + } + + void Interaction::ConfigureLabFrameCollision( + const Code BeamId, const Code TargetId, const units::si::HEPEnergyType BeamEnergy) { + using namespace units::si; + // Pythia configuration of the current event + // very clumsy. I am sure this can be done better.. + + // set beam + // beam id for pythia + auto const pdgBeam = static_cast<int>(GetPDG(BeamId)); + std::stringstream stBeam; + stBeam << "Beams:idA = " << pdgBeam; + fPythia.readString(stBeam.str()); + // set target + auto pdgTarget = static_cast<int>(GetPDG(TargetId)); + // replace hydrogen with proton, otherwise pythia goes into heavy ion mode! + if (TargetId == Code::Hydrogen) pdgTarget = static_cast<int>(GetPDG(Code::Proton)); + std::stringstream stTarget; + stTarget << "Beams:idB = " << pdgTarget; + fPythia.readString(stTarget.str()); + // set frame to lab. frame + fPythia.readString("Beams:frameType = 2"); + // set beam energy + const double Elab = BeamEnergy / 1_GeV; + std::stringstream stEnergy; + stEnergy << "Beams:eA = " << Elab; + fPythia.readString(stEnergy.str()); + // target at rest + fPythia.readString("Beams:eB = 0."); + // initialize this config + fPythia.init(); + } + + bool Interaction::CanInteract(const corsika::Code pCode) { + return pCode == corsika::Code::Proton || pCode == corsika::Code::Neutron || + pCode == corsika::Code::AntiProton || pCode == corsika::Code::AntiNeutron || + pCode == corsika::Code::PiMinus || pCode == corsika::Code::PiPlus; + } + + tuple<units::si::CrossSectionType, units::si::CrossSectionType> + Interaction::GetCrossSection(const Code BeamId, const Code TargetId, + const units::si::HEPEnergyType CoMenergy) { + using namespace units::si; + + // interaction possible in pythia? + if (TargetId == Code::Proton || TargetId == Code::Hydrogen) { + if (CanInteract(BeamId) && ValidCoMEnergy(CoMenergy)) { + // input particle PDG + auto const pdgCodeBeam = static_cast<int>(GetPDG(BeamId)); + auto const pdgCodeTarget = static_cast<int>(GetPDG(TargetId)); + const double ecm = CoMenergy / 1_GeV; + + // calculate cross section + fSigma.calc(pdgCodeBeam, pdgCodeTarget, ecm); + if (fSigma.hasSigmaTot()) { + const double sigEla = fSigma.sigmaEl(); + const double sigProd = fSigma.sigmaTot() - sigEla; + + return std::make_tuple(sigProd * (1_fm * 1_fm), sigEla * (1_fm * 1_fm)); + + } else + throw std::runtime_error("pythia cross section init failed"); + + } else { + return std::make_tuple(std::numeric_limits<double>::infinity() * 1_mb, + std::numeric_limits<double>::infinity() * 1_mb); + } + } else { + throw std::runtime_error("invalid target for pythia"); + } + } + + template <> + units::si::GrammageType Interaction::GetInteractionLength(Particle& p) { + + using namespace units; + using namespace units::si; + using namespace geometry; + + // coordinate system, get global frame of reference + CoordinateSystem& rootCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + + const Code corsikaBeamId = p.GetPID(); + + // beam particles for pythia : 1, 2, 3 for p, pi, k + // read from cross section code table + const bool kInteraction = CanInteract(corsikaBeamId); + + // FOR NOW: assume target is at rest + process::pythia::MomentumVector pTarget(rootCS, {0_GeV, 0_GeV, 0_GeV}); + + // total momentum and energy + HEPEnergyType Elab = p.GetEnergy() + constants::nucleonMass; + process::pythia::MomentumVector pTotLab(rootCS, {0_GeV, 0_GeV, 0_GeV}); + pTotLab += p.GetMomentum(); + pTotLab += pTarget; + auto const pTotLabNorm = pTotLab.norm(); + // calculate cm. energy + const HEPEnergyType ECoM = sqrt( + (Elab + pTotLabNorm) * (Elab - pTotLabNorm)); // binomial for numerical accuracy + + cout << "Interaction: LambdaInt: \n" + << " input energy: " << p.GetEnergy() / 1_GeV << endl + << " beam can interact:" << kInteraction << endl + << " beam pid:" << p.GetPID() << endl; + + // TODO: move limits into variables + if (kInteraction && Elab >= 8.5_GeV && ValidCoMEnergy(ECoM)) { + + // get target from environment + /* + the target should be defined by the Environment, + ideally as full particle object so that the four momenta + and the boosts can be defined.. + */ + const auto* currentNode = p.GetNode(); + const auto mediumComposition = + currentNode->GetModelProperties().GetNuclearComposition(); + // determine average interaction length + + auto const weightedProdCrossSection = + mediumComposition.WeightedSum([=](auto vTargetID) { + return std::get<0>(this->GetCrossSection(corsikaBeamId, vTargetID, ECoM)); + }); + + cout << "Interaction: IntLength: weighted CrossSection (mb): " + << weightedProdCrossSection / 1_mb << endl + << "Interaction: IntLength: average mass number: " + << mediumComposition.GetAverageMassNumber() << endl; + + // calculate interaction length in medium + GrammageType const int_length = mediumComposition.GetAverageMassNumber() * + units::constants::u / weightedProdCrossSection; + cout << "Interaction: " + << "interaction length (g/cm2): " << int_length / (0.001_kg) * 1_cm * 1_cm + << endl; + + return int_length; + } + + return std::numeric_limits<double>::infinity() * 1_g / (1_cm * 1_cm); + } + + /** + In this function PYTHIA is called to produce one event. The + event is copied (and boosted) into the shower lab frame. + */ + + template <> + process::EProcessReturn Interaction::DoInteraction(SecondaryView& view) { + + using namespace units; + using namespace utl; + using namespace units::si; + using namespace geometry; + + auto const projectile = view.GetProjectile(); + + const auto corsikaBeamId = projectile.GetPID(); + cout << "Pythia::Interaction: " + << "DoInteraction: " << corsikaBeamId << " interaction? " + << process::pythia::Interaction::CanInteract(corsikaBeamId) << endl; + + if (IsNucleus(corsikaBeamId)) { + // nuclei handled by different process, this should not happen + throw std::runtime_error("Nuclear projectile are not handled by PYTHIA!"); + } + + if (process::pythia::Interaction::CanInteract(corsikaBeamId)) { + + const CoordinateSystem& rootCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + + // position and time of interaction, not used in Sibyll + Point pOrig = projectile.GetPosition(); + TimeType tOrig = projectile.GetTime(); + + // define target + // FOR NOW: target is always at rest + const auto eTargetLab = 0_GeV + constants::nucleonMass; + const auto pTargetLab = MomentumVector(rootCS, 0_GeV, 0_GeV, 0_GeV); + const FourVector PtargLab(eTargetLab, pTargetLab); + + // define projectile + HEPEnergyType const eProjectileLab = projectile.GetEnergy(); + auto const pProjectileLab = projectile.GetMomentum(); + + cout << "Interaction: ebeam lab: " << eProjectileLab / 1_GeV << endl + << "Interaction: pbeam lab: " << pProjectileLab.GetComponents() / 1_GeV + << endl; + cout << "Interaction: etarget lab: " << eTargetLab / 1_GeV << endl + << "Interaction: ptarget lab: " << pTargetLab.GetComponents() / 1_GeV << endl; + + const FourVector PprojLab(eProjectileLab, pProjectileLab); + + // define target kinematics in lab frame + // define boost to and from CoM frame + // CoM frame definition in Pythia projectile: +z + COMBoost const boost(PprojLab, constants::nucleonMass); + + // just for show: + // boost projecticle + auto const PprojCoM = boost.toCoM(PprojLab); + + // boost target + auto const PtargCoM = boost.toCoM(PtargLab); + + cout << "Interaction: ebeam CoM: " << PprojCoM.GetTimeLikeComponent() / 1_GeV + << endl + << "Interaction: pbeam CoM: " + << PprojCoM.GetSpaceLikeComponents().GetComponents() / 1_GeV << endl; + cout << "Interaction: etarget CoM: " << PtargCoM.GetTimeLikeComponent() / 1_GeV + << endl + << "Interaction: ptarget CoM: " + << PtargCoM.GetSpaceLikeComponents().GetComponents() / 1_GeV << endl; + + cout << "Interaction: position of interaction: " << pOrig.GetCoordinates() << endl; + cout << "Interaction: time: " << tOrig << endl; + + HEPEnergyType Etot = eProjectileLab + eTargetLab; + MomentumVector Ptot = projectile.GetMomentum(); + // invariant mass, i.e. cm. energy + HEPEnergyType Ecm = sqrt(Etot * Etot - Ptot.squaredNorm()); + + // sample target mass number + const auto* currentNode = projectile.GetNode(); + const auto& mediumComposition = + currentNode->GetModelProperties().GetNuclearComposition(); + // get cross sections for target materials + /* + Here we read the cross section from the interaction model again, + should be passed from GetInteractionLength if possible + */ + //#warning reading interaction cross section again, should not be necessary + auto const& compVec = mediumComposition.GetComponents(); + std::vector<si::CrossSectionType> cross_section_of_components(compVec.size()); + + for (size_t i = 0; i < compVec.size(); ++i) { + auto const targetId = compVec[i]; + const auto [sigProd, sigEla] = GetCrossSection(corsikaBeamId, targetId, Ecm); + [[maybe_unused]] const auto& dummy_sigEla = sigEla; + cross_section_of_components[i] = sigProd; + } + + const auto corsikaTargetId = + mediumComposition.SampleTarget(cross_section_of_components, fRNG); + cout << "Interaction: target selected: " << corsikaTargetId << endl; + + if (corsikaTargetId != Code::Hydrogen && corsikaTargetId != Code::Neutron && + corsikaTargetId != Code::Proton) + throw std::runtime_error("DoInteraction: wrong target for PYTHIA"); + + cout << "Interaction: " + << " DoInteraction: E(GeV):" << eProjectileLab / 1_GeV + << " Ecm(GeV): " << Ecm / 1_GeV << endl; + + if (eProjectileLab < 8.5_GeV || !ValidCoMEnergy(Ecm)) { + cout << "Interaction: " + << " DoInteraction: should have dropped particle.. " + << "THIS IS AN ERROR" << endl; + throw std::runtime_error("energy too low for PYTHIA"); + + } else { + fCount++; + + ConfigureLabFrameCollision(corsikaBeamId, corsikaTargetId, eProjectileLab); + + // create event in pytia + if (!fPythia.next()) throw std::runtime_error("Pythia::DoInteraction: failed!"); + + // link to pythia stack + Pythia8::Event& event = fPythia.event; + // print final state + event.list(); + + MomentumVector Plab_final(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); + HEPEnergyType Elab_final = 0_GeV; + for (int i = 0; i < event.size(); ++i) { + Pythia8::Particle& p8p = event[i]; + // skip particles that have decayed in pythia + if (!p8p.isFinal()) continue; + + auto const pyId = ConvertFromPDG(static_cast<PDGCode>(p8p.id())); + + const MomentumVector pyPlab( + rootCS, {p8p.px() * 1_GeV, p8p.py() * 1_GeV, p8p.pz() * 1_GeV}); + HEPEnergyType const pyEn = p8p.e() * 1_GeV; + + // add to corsika stack + auto pnew = view.AddSecondary( + tuple<Code, units::si::HEPEnergyType, stack::MomentumVector, + geometry::Point, units::si::TimeType>{pyId, pyEn, pyPlab, pOrig, + tOrig}); + + Plab_final += pnew.GetMomentum(); + Elab_final += pnew.GetEnergy(); + } + cout << "conservation (all GeV): " + << "Elab_final=" << Elab_final / 1_GeV + << ", Plab_final=" << (Plab_final / 1_GeV).GetComponents() << endl; + } + } + return process::EProcessReturn::eOk; + } + +} // namespace corsika::pythia diff --git a/dependencies/Pythia/Interaction.h b/dependencies/Pythia/Interaction.h new file mode 100644 index 000000000..c5006ea68 --- /dev/null +++ b/dependencies/Pythia/Interaction.h @@ -0,0 +1,66 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <Pythia8/Pythia.h> + +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <tuple> + +namespace corsika::pythia { + + class Interaction : public corsika::InteractionProcess<Interaction> { + + int fCount = 0; + bool fInitialized = false; + + public: + Interaction(); + ~Interaction(); + + void SetParticleListStable(std::vector<Code> const&); + void SetUnstable(const corsika::Code); + void SetStable(const corsika::Code); + + bool WasInitialized() { return fInitialized; } + bool ValidCoMEnergy(corsika::units::si::HEPEnergyType ecm) { + using namespace corsika::units::si; + return (10_GeV < ecm) && (ecm < 1_PeV); + } + + bool CanInteract(const corsika::Code); + void ConfigureLabFrameCollision(const corsika::Code, const corsika::Code, + const corsika::units::si::HEPEnergyType); + std::tuple<corsika::units::si::CrossSectionType, corsika::units::si::CrossSectionType> + GetCrossSection(const corsika::Code BeamId, const corsika::Code TargetId, + const corsika::units::si::HEPEnergyType CoMenergy); + + template <typename TParticle> + corsika::units::si::GrammageType GetInteractionLength(TParticle&); + + /** + In this function PYTHIA is called to produce one event. The + event is copied (and boosted) into the shower lab frame. + */ + + template <typename TSecondaryView> + corsika::EProcessReturn DoInteraction(TSecondaryView&); + + private: + corsika::random::RNG& fRNG = + corsika::random::RNGManager::GetInstance().GetRandomStream("pythia"); + Pythia8::Pythia fPythia; + Pythia8::SigmaTotal fSigma; + const bool fInternalDecays = true; + }; + +} // namespace corsika::pythia diff --git a/dependencies/Pythia/Random.cc b/dependencies/Pythia/Random.cc new file mode 100644 index 000000000..099a1fd2a --- /dev/null +++ b/dependencies/Pythia/Random.cc @@ -0,0 +1,15 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <dependencies/Pythia/Random.h> + +namespace corsika::pythia { + + double Random::flat() { return fDist(fRNG); } + +} // namespace corsika::pythia diff --git a/Processes/Pythia/Random.h b/dependencies/Pythia/Random.h similarity index 92% rename from Processes/Pythia/Random.h rename to dependencies/Pythia/Random.h index c649e42bc..59bee7a35 100644 --- a/Processes/Pythia/Random.h +++ b/dependencies/Pythia/Random.h @@ -9,7 +9,7 @@ #pragma once #include <Pythia8/Pythia.h> -#include <corsika/random/RNGManager.h> +#include <corsika/framework/random/RNGManager.hpp> namespace corsika::process { diff --git a/dependencies/Pythia/testPythia8.cc b/dependencies/Pythia/testPythia8.cc new file mode 100644 index 000000000..f495f56ec --- /dev/null +++ b/dependencies/Pythia/testPythia8.cc @@ -0,0 +1,185 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <Pythia8/Pythia.h> +#include <dependencies/Pythia/Decay.h> +#include <dependencies/Pythia/Interaction.h> + +#include <corsika/framework/random/RNGManager.hpp> + +#include <corsika/framework/coreParticleProperties.h> + +#include <corsika/framework/geometry/Point.h> +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <corsika/utl/CorsikaFenv.h> +#include <catch2/catch.hpp> + +TEST_CASE("Pythia", "[processes]") { + + SECTION("linking pythia") { + using namespace Pythia8; + using std::cout; + using std::endl; + + // Generator. Process selection. LHC initialization. Histogram. + Pythia pythia; + + pythia.readString("Next:numberShowInfo = 0"); + pythia.readString("Next:numberShowProcess = 0"); + pythia.readString("Next:numberShowEvent = 0"); + + pythia.readString("ProcessLevel:all = off"); + + pythia.init(); + + Event& event = pythia.event; + event.reset(); + + pythia.particleData.mayDecay(321, true); + double pz = 100.; + double m = 0.49368; + event.append(321, 1, 0, 0, 0., 0., 100., sqrt(pz * pz + m * m), m); + + if (!pythia.next()) + cout << "decay failed!" << endl; + else + cout << "particles after decay: " << event.size() << endl; + event.list(); + + // loop over final state + for (int i = 0; i < pythia.event.size(); ++i) + if (pythia.event[i].isFinal()) { + cout << "particle: id=" << pythia.event[i].id() << endl; + } + } + + SECTION("pythia interface") { + using namespace corsika; + + random::RNGManager::GetInstance().RegisterRandomStream("pythia"); + + process::pythia::Decay model; + } +} + +#include <corsika/framework/geometry/Point.h> +#include <corsika/framework/geometry/RootCoordinateSystem.h> +#include <corsika/framework/geometry/Vector.h> + +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <corsika/framework/coreParticleProperties.h> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> + +#include <corsika/environment/Environment.h> +#include <corsika/environment/HomogeneousMedium.h> +#include <corsika/environment/NuclearComposition.h> + +using namespace corsika; +using namespace corsika::units::si; + +template <typename TStackView> +auto sumMomentum(TStackView const& view, geometry::CoordinateSystem const& vCS) { + geometry::Vector<hepenergy_d> sum{vCS, 0_eV, 0_eV, 0_eV}; + + for (auto const& p : view) { sum += p.GetMomentum(); } + + return sum; +} + +TEST_CASE("pythia process") { + + // setup environment, geometry + environment::Environment<environment::IMediumModel> env; + + geometry::CoordinateSystem const& cs = env.GetCoordinateSystem(); + + auto theMedium = + environment::Environment<environment::IMediumModel>::CreateNode<geometry::Sphere>( + geometry::Point{cs, 0_m, 0_m, 0_m}, + 1_km * std::numeric_limits<double>::infinity()); + + using MyHomogeneousModel = environment::HomogeneousMedium<environment::IMediumModel>; + theMedium->SetModelProperties<MyHomogeneousModel>( + 1_kg / (1_m * 1_m * 1_m), + environment::NuclearComposition(std::vector<Code>{Code::Hydrogen}, + std::vector<float>{1.})); + + auto const* nodePtr = theMedium.get(); // save the medium for later use before moving it + + SECTION("pythia decay") { + feenableexcept(FE_INVALID); + setup::Stack stack; + const HEPEnergyType E0 = 10_GeV; + HEPMomentumType P0 = sqrt(E0 * E0 - PiPlus::GetMass() * PiPlus::GetMass()); + auto plab = corsika::stack::MomentumVector(cs, {0_GeV, 0_GeV, P0}); + geometry::Point pos(cs, 0_m, 0_m, 0_m); + auto particle = stack.AddParticle( + std::tuple<Code, units::si::HEPEnergyType, corsika::stack::MomentumVector, + geometry::Point, units::si::TimeType>{Code::PiPlus, E0, plab, pos, + 0_ns}); + + random::RNGManager::GetInstance().RegisterRandomStream("pythia"); + + setup::StackView view(particle); + + process::pythia::Decay model; + + [[maybe_unused]] const TimeType time = model.GetLifetime(particle); + model.DoDecay(view); + CHECK(stack.getEntries() == 3); + auto const pSum = sumMomentum(view, cs); + CHECK((pSum - plab).norm() / 1_GeV == Approx(0).margin(1e-4)); + CHECK((pSum.norm() - plab.norm()) / 1_GeV == Approx(0).margin(1e-4)); + } + + SECTION("pythia decay config") { + process::pythia::Decay model({Code::PiPlus, Code::PiMinus}); + REQUIRE(model.IsDecayHandled(Code::PiPlus)); + REQUIRE(model.IsDecayHandled(Code::PiMinus)); + REQUIRE_FALSE(model.IsDecayHandled(Code::KPlus)); + + const std::vector<Code> particleTestList = {Code::PiPlus, Code::PiMinus, Code::KPlus, + Code::Lambda0Bar, Code::D0Bar}; + + // setup decays + model.SetHandleDecay(particleTestList); + for (auto& pCode : particleTestList) REQUIRE(model.IsDecayHandled(pCode)); + + // individually + model.SetHandleDecay(Code::KMinus); + + // possible decays + REQUIRE_FALSE(model.CanHandleDecay(Code::Proton)); + REQUIRE_FALSE(model.CanHandleDecay(Code::Electron)); + REQUIRE(model.CanHandleDecay(Code::PiPlus)); + REQUIRE(model.CanHandleDecay(Code::MuPlus)); + } + + SECTION("pythia interaction") { + + setup::Stack stack; + const HEPEnergyType E0 = 100_GeV; + HEPMomentumType P0 = sqrt(E0 * E0 - PiPlus::GetMass() * PiPlus::GetMass()); + auto plab = corsika::stack::MomentumVector(cs, {0_GeV, 0_GeV, -P0}); + geometry::Point pos(cs, 0_m, 0_m, 0_m); + auto particle = stack.AddParticle( + std::tuple<Code, units::si::HEPEnergyType, corsika::stack::MomentumVector, + geometry::Point, units::si::TimeType>{Code::PiPlus, E0, plab, pos, + 0_ns}); + particle.SetNode(nodePtr); + setup::StackView view(particle); + + process::pythia::Interaction model; + + [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(view); + [[maybe_unused]] const GrammageType length = model.GetInteractionLength(particle); + } +} diff --git a/dependencies/QGSJetII/CMakeLists.txt b/dependencies/QGSJetII/CMakeLists.txt new file mode 100644 index 000000000..75327b3f6 --- /dev/null +++ b/dependencies/QGSJetII/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.1) + +project(libQGSJetII) + +set ( + MODEL_SOURCES + qgsjet-II-04.f + ) + +set ( + MODEL_HEADERS + ) + + +enable_language(Fortran) +add_library (QGSJetII SHARED ${MODEL_SOURCES}) +set_property(TARGET QGSJetII PROPERTY POSITION_INDEPENDENT_CODE 1) + +add_library (QGSJetII_static STATIC ${MODEL_SOURCES}) +set_property(TARGET QGSJetII_static PROPERTY POSITION_INDEPENDENT_CODE 1) + diff --git a/dependencies/QGSJetII/Interaction.cc b/dependencies/QGSJetII/Interaction.cc new file mode 100644 index 000000000..df505c115 --- /dev/null +++ b/dependencies/QGSJetII/Interaction.cc @@ -0,0 +1,403 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/process/qgsjetII/Interaction.h> + +#include <corsika/environment/Environment.h> +#include <corsika/environment/NuclearComposition.h> +#include <corsika/framework/geometry/QuantityVector.h> +#include <corsika/process/qgsjetII/QGSJetIIFragmentsStack.h> +#include <corsika/process/qgsjetII/QGSJetIIStack.h> +#include <corsika/process/qgsjetII/qgsjet-II-04.h> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/utility/COMBoost.hpp> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> + +#include <random> +#include <sstream> +#include <string> +#include <tuple> + +using std::cout; +using std::endl; +using std::ostringstream; +using std::string; +using std::tuple; + +using namespace corsika; +using namespace corsika::setup; +using SetupParticle = setup::Stack::StackIterator; +using SetupView = setup::StackView; +using Track = Trajectory; + +namespace corsika::qgsjetII { + + Interaction::Interaction(const string& dataPath) + : data_path_(dataPath) { + if (dataPath == "") { + if (std::getenv("CORSIKA_DATA")) { + data_path_ = string(std::getenv("CORSIKA_DATA")) + "/QGSJetII/"; + cout << "Searching for QGSJetII data tables in " << data_path_ << endl; + } + } + + // initialize QgsjetII + if (!initialized_) { + qgset_(); + datadir DIR(data_path_); + qgaini_(DIR.data); + initialized_ = true; + } + } + + Interaction::~Interaction() { cout << "QgsjetII::Interaction n=" << count_ << endl; } + + units::si::CrossSectionType Interaction::GetCrossSection( + const Code beamId, const Code targetId, const units::si::HEPEnergyType Elab, + const unsigned int Abeam, const unsigned int targetA) const { + using namespace units::si; + double sigProd = std::numeric_limits<double>::infinity(); + + if (process::qgsjetII::CanInteract(beamId)) { + + const int xsCode = process::qgsjetII::GetQgsjetIIXSCodeRaw(beamId); + int iTarget = 1; + if (IsNucleus(targetId)) { + iTarget = targetA; + if (iTarget > maxMassNumber_ || iTarget <= 0) { + std::ostringstream txt; + txt << "QgsjetII target outside range. iTarget=" << iTarget; + throw std::runtime_error(txt.str().c_str()); + } + } + int iProjectile = 1; + if (IsNucleus(beamId)) { + iProjectile = Abeam; + if (iProjectile > maxMassNumber_ || iProjectile <= 0) + throw std::runtime_error("QgsjetII target outside range. "); + } + + cout << "QgsjetII::GetCrossSection Elab=" << Elab << " xs-code=" << xsCode + << " iProjectile=" << iProjectile << " iTarget=" << iTarget << endl; + sigProd = qgsect_(Elab / 1_GeV, xsCode, iProjectile, iTarget); + cout << "QgsjetII::GetCrossSection sigProd=" << sigProd << endl; + } + + return sigProd * 1_mb; + } + + template <> + units::si::GrammageType Interaction::GetInteractionLength( + SetupParticle const& vP) const { + + using namespace units; + using namespace units::si; + using namespace geometry; + + // coordinate system, get global frame of reference + CoordinateSystem& rootCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + + const Code corsikaBeamId = vP.GetPID(); + + // beam particles for qgsjetII : 1, 2, 3 for p, pi, k + // read from cross section code table + const bool kInteraction = process::qgsjetII::CanInteract(corsikaBeamId); + + // FOR NOW: assume target is at rest + MomentumVector pTarget(rootCS, {0_GeV, 0_GeV, 0_GeV}); + + // total momentum and energy + HEPEnergyType Elab = vP.GetEnergy(); + + cout << "Interaction: LambdaInt: \n" + << " input energy: " << vP.GetEnergy() / 1_GeV << endl + << " beam can interact:" << kInteraction << endl + << " beam pid:" << vP.GetPID() << endl; + + if (kInteraction) { + + int Abeam = 0; + if (IsNucleus(vP.GetPID())) Abeam = vP.GetNuclearA(); + + // get target from environment + /* + the target should be defined by the Environment, + ideally as full particle object so that the four momenta + and the boosts can be defined.. + */ + + auto const* currentNode = vP.GetNode(); + const auto& mediumComposition = + currentNode->GetModelProperties().GetNuclearComposition(); + + si::CrossSectionType weightedProdCrossSection = + mediumComposition.WeightedSum([=](Code targetID) -> si::CrossSectionType { + int targetA = 0; + if (corsika::IsNucleus(targetID)) targetA = GetNucleusA(targetID); + return GetCrossSection(corsikaBeamId, targetID, Elab, Abeam, targetA); + }); + + cout << "Interaction: " + << "IntLength: weighted CrossSection (mb): " << weightedProdCrossSection / 1_mb + << endl; + + // calculate interaction length in medium + GrammageType const int_length = mediumComposition.GetAverageMassNumber() * + units::constants::u / weightedProdCrossSection; + cout << "Interaction: " + << "interaction length (g/cm2): " << int_length / (0.001_kg) * 1_cm * 1_cm + << endl; + + return int_length; + } + + return std::numeric_limits<double>::infinity() * 1_g / (1_cm * 1_cm); + } + + /** + In this function QGSJETII is called to produce one event. The + event is copied (and boosted) into the shower lab frame. + */ + + template <> + process::EProcessReturn Interaction::DoInteraction(SetupView& view) { + + using namespace units; + using namespace utl; + using namespace units::si; + using namespace geometry; + + auto const projectile = view.GetProjectile(); + + const auto corsikaBeamId = projectile.GetPID(); + cout << "ProcessQgsjetII: " + << "DoInteraction: " << corsikaBeamId << " interaction? " + << process::qgsjetII::CanInteract(corsikaBeamId) << endl; + + if (process::qgsjetII::CanInteract(corsikaBeamId)) { + + const CoordinateSystem& rootCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + + // position and time of interaction, not used in QgsjetII + Point pOrig = projectile.GetPosition(); + TimeType tOrig = projectile.GetTime(); + + // define target + // for QgsjetII is always a single nucleon + // FOR NOW: target is always at rest + const auto targetEnergyLab = 0_GeV + constants::nucleonMass; + const auto targetMomentumLab = MomentumVector(rootCS, 0_GeV, 0_GeV, 0_GeV); + const FourVector PtargLab(targetEnergyLab, targetMomentumLab); + + // define projectile + HEPEnergyType const projectileEnergyLab = projectile.GetEnergy(); + auto const projectileMomentumLab = projectile.GetMomentum(); + + int beamA = 1; + if (IsNucleus(corsikaBeamId)) beamA = projectile.GetNuclearA(); + + const HEPEnergyType projectileEnergyLabPerNucleon = projectileEnergyLab / beamA; + + cout << "Interaction: ebeam lab: " << projectileEnergyLab / 1_GeV << endl + << "Interaction: pbeam lab: " << projectileMomentumLab.GetComponents() / 1_GeV + << endl; + cout << "Interaction: etarget lab: " << targetEnergyLab / 1_GeV << endl + << "Interaction: ptarget lab: " << targetMomentumLab.GetComponents() / 1_GeV + << endl; + + cout << "Interaction: position of interaction: " << pOrig.GetCoordinates() << endl; + cout << "Interaction: time: " << tOrig << endl; + + // sample target mass number + auto const* currentNode = projectile.GetNode(); + auto const& mediumComposition = + currentNode->GetModelProperties().GetNuclearComposition(); + // get cross sections for target materials + /* + Here we read the cross section from the interaction model again, + should be passed from GetInteractionLength if possible + */ + auto const& compVec = mediumComposition.GetComponents(); + std::vector<si::CrossSectionType> cross_section_of_components(compVec.size()); + + for (size_t i = 0; i < compVec.size(); ++i) { + auto const targetId = compVec[i]; + int targetA = 0; + if (corsika::IsNucleus(targetId)) targetA = GetNucleusA(targetId); + const auto sigProd = + GetCrossSection(corsikaBeamId, targetId, projectileEnergyLab, beamA, targetA); + cross_section_of_components[i] = sigProd; + } + + const auto targetCode = + mediumComposition.SampleTarget(cross_section_of_components, rng_); + cout << "Interaction: target selected: " << targetCode << endl; + + int targetMassNumber = 1; // proton + if (IsNucleus(targetCode)) { // nucleus + targetMassNumber = GetNucleusA(targetCode); + if (targetMassNumber > maxMassNumber_) + throw std::runtime_error("QgsjetII target mass outside range."); + } else { + if (targetCode != Proton::GetCode()) + throw std::runtime_error("QgsjetII Taget not possible."); + } + cout << "Interaction: target qgsjetII code/A: " << targetMassNumber << endl; + + int projectileMassNumber = 1; // "1" means "hadron" + QgsjetIIHadronType qgsjet_hadron_type = + process::qgsjetII::GetQgsjetIIHadronType(corsikaBeamId); + if (qgsjet_hadron_type == QgsjetIIHadronType::NucleusType) { + projectileMassNumber = projectile.GetNuclearA(); + if (projectileMassNumber > maxMassNumber_) + throw std::runtime_error("QgsjetII projectile mass outside range."); + std::array<QgsjetIIHadronType, 2> constexpr nucleons = { + QgsjetIIHadronType::ProtonType, QgsjetIIHadronType::NeutronType}; + std::uniform_int_distribution select(0, 1); + qgsjet_hadron_type = nucleons[select(rng_)]; + } else { + // from conex: replace pi0 or rho0 with pi+/pi- in alternating sequence + if (qgsjet_hadron_type == QgsjetIIHadronType::NeutralLightMesonType) { + qgsjet_hadron_type = alternate_; + alternate_ = (alternate_ == QgsjetIIHadronType::PiPlusType + ? QgsjetIIHadronType::PiMinusType + : QgsjetIIHadronType::PiPlusType); + } + } + cout << "Interaction: projectile qgsjetII code/A: " << projectileMassNumber << " " + << corsikaBeamId << endl; + + int qgsjet_hadron_type_int = static_cast<QgsjetIICodeIntType>(qgsjet_hadron_type); + + cout << "Interaction: " + << " DoInteraction: E(GeV):" << projectileEnergyLab / 1_GeV << endl; + count_++; + qgini_(projectileEnergyLab / 1_GeV, qgsjet_hadron_type_int, projectileMassNumber, + targetMassNumber); + qgconf_(); + + // bookkeeping + MomentumVector Plab_final(rootCS, {0.0_GeV, 0.0_GeV, 0.0_GeV}); + HEPEnergyType Elab_final = 0_GeV; + + // to read the secondaries + // define rotation to and from CoM frame + // CoM frame definition in QgsjetII projectile: +z + auto const& originalCS = projectileMomentumLab.GetCoordinateSystem(); + geometry::CoordinateSystem const zAxisFrame = + originalCS.RotateToZ(projectileMomentumLab); + + // nuclear projectile fragments + QGSJetIIFragmentsStack qfs; + for (auto& fragm : qfs) { + Code idFragm = Code::Nucleus; + const int A = fragm.GetFragmentSize(); + int Z = 0; + switch (A) { + case 1: { // proton/neutron + std::uniform_real_distribution<double> select; + if (select(rng_) > 0.5) { + idFragm = Code::Proton; + Z = 1; + } else { + idFragm = Code::Neutron; + Z = 0; + } + + const HEPMassType nucleonMass = GetMass(idFragm); + + auto momentum = geometry::Vector( + zAxisFrame, corsika::QuantityVector<hepmomentum_d>{ + 0.0_GeV, 0.0_GeV, + sqrt((projectileEnergyLabPerNucleon + nucleonMass) * + (projectileEnergyLabPerNucleon - nucleonMass))}); + + auto const energy = sqrt(momentum.squaredNorm() + square(nucleonMass)); + momentum.rebase(originalCS); // transform back into standard lab frame + std::cout << "secondary fragment> id=" << idFragm + << " p=" << momentum.GetComponents() << std::endl; + auto pnew = view.AddSecondary( + tuple<Code, units::si::HEPEnergyType, stack::MomentumVector, + geometry::Point, units::si::TimeType>{idFragm, energy, momentum, + pOrig, tOrig}); + Plab_final += pnew.GetMomentum(); + Elab_final += pnew.GetEnergy(); + } break; + case 2: // deuterium + Z = 1; + break; + case 3: // tritium + Z = 1; + break; + case 4: // helium + Z = 2; + break; + default: // nucleus + { + Z = int(A / 2.15 + 0.7); + } + } + + if (idFragm == Code::Nucleus) { // thus: not p or n + const HEPMassType nucleusMass = + Proton::GetMass() * Z + Neutron::GetMass() * (A - Z); + auto momentum = geometry::Vector( + zAxisFrame, geometry::QuantityVector<hepmomentum_d>{ + 0.0_GeV, 0.0_GeV, + sqrt((projectileEnergyLabPerNucleon * A + nucleusMass) * + (projectileEnergyLabPerNucleon * A - nucleusMass))}); + + auto const energy = sqrt(momentum.squaredNorm() + square(nucleusMass)); + momentum.rebase(originalCS); // transform back into standard lab frame + std::cout << "secondary fragment> id=" << idFragm + << " p=" << momentum.GetComponents() << " A=" << A << " Z=" << Z + << std::endl; + auto pnew = view.AddSecondary( + tuple<Code, units::si::HEPEnergyType, stack::MomentumVector, + geometry::Point, units::si::TimeType, unsigned short, unsigned short>{ + idFragm, energy, momentum, pOrig, tOrig, A, Z}); + Plab_final += pnew.GetMomentum(); + Elab_final += pnew.GetEnergy(); + } + } + + // secondaries + QGSJetIIStack qs; + for (auto& psec : qs) { + + auto momentum = psec.GetMomentum(zAxisFrame); + auto const energy = psec.GetEnergy(); + + momentum.rebase(originalCS); // transform back into standard lab frame + std::cout << "secondary fragment> id=" + << process::qgsjetII::ConvertFromQgsjetII(psec.GetPID()) + << " p=" << momentum.GetComponents() << std::endl; + auto pnew = + view.AddSecondary(tuple<Code, units::si::HEPEnergyType, stack::MomentumVector, + geometry::Point, units::si::TimeType>{ + process::qgsjetII::ConvertFromQgsjetII(psec.GetPID()), energy, momentum, + pOrig, tOrig}); + Plab_final += pnew.GetMomentum(); + Elab_final += pnew.GetEnergy(); + } + cout << "conservation (all GeV): Ecm_final= n/a" /* << Ecm_final / 1_GeV*/ << endl + << "Elab_final=" << Elab_final / 1_GeV + << ", Plab_final=" << (Plab_final / 1_GeV).GetComponents() + << ", N_wounded,targ=" + << QGSJetIIFragmentsStackData::GetWoundedNucleonsTarget() + << ", N_wounded,proj=" + << QGSJetIIFragmentsStackData::GetWoundedNucleonsProjectile() + << ", N_fragm,proj=" << qfs.getEntries() << endl; + } + return process::EProcessReturn::eOk; + } + +} // namespace corsika::qgsjetII diff --git a/Processes/QGSJetII/Interaction.h b/dependencies/QGSJetII/Interaction.h similarity index 61% rename from Processes/QGSJetII/Interaction.h rename to dependencies/QGSJetII/Interaction.h index bef66e3ce..4984761c2 100644 --- a/Processes/QGSJetII/Interaction.h +++ b/dependencies/QGSJetII/Interaction.h @@ -8,17 +8,17 @@ #pragma once -#include <corsika/particles/ParticleProperties.h> -#include <corsika/process/InteractionProcess.h> +#include <corsika/framework/coreParticleProperties.h> #include <corsika/process/qgsjetII/ParticleConversion.h> -#include <corsika/random/RNGManager.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> #include <string> -namespace corsika::process::qgsjetII { +namespace corsika::qgsjetII { - class Interaction : public corsika::process::InteractionProcess<Interaction> { + class Interaction : public corsika::InteractionProcess<Interaction> { std::string data_path_; int count_ = 0; @@ -32,15 +32,14 @@ namespace corsika::process::qgsjetII { bool WasInitialized() { return initialized_; } int GetMaxTargetMassNumber() const { return maxMassNumber_; } - bool IsValidTarget(corsika::particles::Code TargetId) const { - return (corsika::particles::GetNucleusA(TargetId) < maxMassNumber_) && - corsika::particles::IsNucleus(TargetId); + bool IsValidTarget(corsika::Code TargetId) const { + return (corsika::GetNucleusA(TargetId) < maxMassNumber_) && + corsika::IsNucleus(TargetId); } corsika::units::si::CrossSectionType GetCrossSection( - const corsika::particles::Code, const corsika::particles::Code, - const corsika::units::si::HEPEnergyType, const unsigned int Abeam = 0, - const unsigned int Atarget = 0) const; + const corsika::Code, const corsika::Code, const corsika::units::si::HEPEnergyType, + const unsigned int Abeam = 0, const unsigned int Atarget = 0) const; template <typename TParticle> corsika::units::si::GrammageType GetInteractionLength(TParticle const&) const; @@ -51,7 +50,7 @@ namespace corsika::process::qgsjetII { */ template <typename TSecondaryView> - corsika::process::EProcessReturn DoInteraction(TSecondaryView&); + corsika::EProcessReturn DoInteraction(TSecondaryView&); private: corsika::random::RNG& rng_ = @@ -59,4 +58,4 @@ namespace corsika::process::qgsjetII { static constexpr int maxMassNumber_ = 208; }; -} // namespace corsika::process::qgsjetII +} // namespace corsika::qgsjetII diff --git a/dependencies/QGSJetII/ParticleConversion.cc b/dependencies/QGSJetII/ParticleConversion.cc new file mode 100644 index 000000000..8dc5ed9a7 --- /dev/null +++ b/dependencies/QGSJetII/ParticleConversion.cc @@ -0,0 +1,12 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/framework/coreParticleProperties.h> +#include <corsika/process/qgsjetII/ParticleConversion.h> + +using namespace corsika::qgsjetII; diff --git a/Processes/QGSJetII/ParticleConversion.h b/dependencies/QGSJetII/ParticleConversion.h similarity index 67% rename from Processes/QGSJetII/ParticleConversion.h rename to dependencies/QGSJetII/ParticleConversion.h index 9171706b3..db19a2453 100644 --- a/Processes/QGSJetII/ParticleConversion.h +++ b/dependencies/QGSJetII/ParticleConversion.h @@ -8,11 +8,11 @@ #pragma once -#include <corsika/particles/ParticleProperties.h> +#include <corsika/framework/coreParticleProperties.h> #include <string> -namespace corsika::process::qgsjetII { +namespace corsika::qgsjetII { /** These are the possible secondaries produced by QGSJetII @@ -54,14 +54,14 @@ namespace corsika::process::qgsjetII { #include <corsika/process/qgsjetII/Generated.inc> - QgsjetIICode constexpr ConvertToQgsjetII(corsika::particles::Code pCode) { - return corsika2qgsjetII[static_cast<corsika::particles::CodeIntType>(pCode)]; + QgsjetIICode constexpr ConvertToQgsjetII(corsika::Code pCode) { + return corsika2qgsjetII[static_cast<corsika::CodeIntType>(pCode)]; } - corsika::particles::Code constexpr ConvertFromQgsjetII(QgsjetIICode pCode) { + corsika::Code constexpr ConvertFromQgsjetII(QgsjetIICode pCode) { auto const pCodeInt = static_cast<QgsjetIICodeIntType>(pCode); auto const corsikaCode = qgsjetII2corsika[pCodeInt - minQgsjetII]; - if (corsikaCode == corsika::particles::Code::Unknown) { + if (corsikaCode == corsika::Code::Unknown) { throw std::runtime_error(std::string("QGSJETII/CORSIKA conversion of pCodeInt=") .append(std::to_string(pCodeInt)) .append(" impossible")); @@ -69,27 +69,26 @@ namespace corsika::process::qgsjetII { return corsikaCode; } - QgsjetIICodeIntType constexpr ConvertToQgsjetIIRaw(corsika::particles::Code pCode) { + QgsjetIICodeIntType constexpr ConvertToQgsjetIIRaw(corsika::Code pCode) { return static_cast<QgsjetIICodeIntType>(ConvertToQgsjetII(pCode)); } - QgsjetIIXSClass constexpr GetQgsjetIIXSCode(corsika::particles::Code pCode) { - // if (pCode == corsika::particles::Code::Nucleus) + QgsjetIIXSClass constexpr GetQgsjetIIXSCode(corsika::Code pCode) { + // if (pCode == corsika::Code::Nucleus) // static_cast(QgsjetIIXSClassIntType>(); - return corsika2qgsjetIIXStype[static_cast<corsika::particles::CodeIntType>(pCode)]; + return corsika2qgsjetIIXStype[static_cast<corsika::CodeIntType>(pCode)]; } - QgsjetIIXSClassIntType constexpr GetQgsjetIIXSCodeRaw(corsika::particles::Code pCode) { + QgsjetIIXSClassIntType constexpr GetQgsjetIIXSCodeRaw(corsika::Code pCode) { return static_cast<QgsjetIIXSClassIntType>(GetQgsjetIIXSCode(pCode)); } - bool constexpr CanInteract(corsika::particles::Code pCode) { + bool constexpr CanInteract(corsika::Code pCode) { return GetQgsjetIIXSCode(pCode) != QgsjetIIXSClass::CannotInteract; } - QgsjetIIHadronType constexpr GetQgsjetIIHadronType(corsika::particles::Code pCode) { - return corsika2qgsjetIIHadronType[static_cast<corsika::particles::CodeIntType>( - pCode)]; + QgsjetIIHadronType constexpr GetQgsjetIIHadronType(corsika::Code pCode) { + return corsika2qgsjetIIHadronType[static_cast<corsika::CodeIntType>(pCode)]; } -} // namespace corsika::process::qgsjetII +} // namespace corsika::qgsjetII diff --git a/Processes/QGSJetII/QGSJetIIFragmentsStack.h b/dependencies/QGSJetII/QGSJetIIFragmentsStack.h similarity index 90% rename from Processes/QGSJetII/QGSJetIIFragmentsStack.h rename to dependencies/QGSJetII/QGSJetIIFragmentsStack.h index 5da94661c..3776a85a8 100644 --- a/Processes/QGSJetII/QGSJetIIFragmentsStack.h +++ b/dependencies/QGSJetII/QGSJetIIFragmentsStack.h @@ -8,14 +8,14 @@ #pragma once -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/RootCoordinateSystem.h> +#include <corsika/framework/geometry/Vector.h> #include <corsika/process/qgsjetII/ParticleConversion.h> #include <corsika/process/qgsjetII/qgsjet-II-04.h> #include <corsika/stack/Stack.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> -namespace corsika::process::qgsjetII { +namespace corsika::qgsjetII { class QGSJetIIFragmentsStackData { @@ -71,4 +71,4 @@ namespace corsika::process::qgsjetII { typedef corsika::stack::Stack<QGSJetIIFragmentsStackData, FragmentsInterface> QGSJetIIFragmentsStack; -} // end namespace corsika::process::qgsjetII +} // end namespace corsika::qgsjetII diff --git a/Processes/QGSJetII/QGSJetIIStack.h b/dependencies/QGSJetII/QGSJetIIStack.h similarity index 86% rename from Processes/QGSJetII/QGSJetIIStack.h rename to dependencies/QGSJetII/QGSJetIIStack.h index 04685ab7c..9f1d18cd4 100644 --- a/Processes/QGSJetII/QGSJetIIStack.h +++ b/dependencies/QGSJetII/QGSJetIIStack.h @@ -8,16 +8,16 @@ #pragma once -#include <corsika/geometry/CoordinateSystem.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/CoordinateSystem.h> +#include <corsika/framework/geometry/Vector.h> #include <corsika/process/qgsjetII/ParticleConversion.h> #include <corsika/process/qgsjetII/qgsjet-II-04.h> #include <corsika/stack/Stack.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> -namespace corsika::process::qgsjetII { +namespace corsika::qgsjetII { - typedef corsika::geometry::Vector<corsika::units::si::hepmomentum_d> MomentumVector; + typedef corsika::Vector<corsika::units::si::hepmomentum_d> MomentumVector; class QGSJetIIStackData { @@ -52,7 +52,7 @@ namespace corsika::process::qgsjetII { return qgarr14_.esp[i][0] * 1_GeV; } MomentumVector GetMomentum(const unsigned int i, - const corsika::geometry::CoordinateSystem& CS) const { + const corsika::CoordinateSystem& CS) const { using namespace corsika::units::si; geometry::QuantityVector<hepmomentum_d> components = {qgarr14_.esp[i][2] * 1_GeV, qgarr14_.esp[i][3] * 1_GeV, @@ -111,12 +111,12 @@ namespace corsika::process::qgsjetII { void SetPID(const int v) { GetStackData().SetId(GetIndex(), v); } - corsika::process::qgsjetII::QgsjetIICode GetPID() const { - return static_cast<corsika::process::qgsjetII::QgsjetIICode>( + corsika::qgsjetII::QgsjetIICode GetPID() const { + return static_cast<corsika::qgsjetII::QgsjetIICode>( GetStackData().GetId(GetIndex())); } - MomentumVector GetMomentum(const corsika::geometry::CoordinateSystem& CS) const { + MomentumVector GetMomentum(const corsika::CoordinateSystem& CS) const { return GetStackData().GetMomentum(GetIndex(), CS); } @@ -127,4 +127,4 @@ namespace corsika::process::qgsjetII { typedef corsika::stack::Stack<QGSJetIIStackData, ParticleInterface> QGSJetIIStack; -} // end namespace corsika::process::qgsjetII +} // end namespace corsika::qgsjetII diff --git a/dependencies/QGSJetII/code_generator.py b/dependencies/QGSJetII/code_generator.py new file mode 100755 index 000000000..65c3fe54f --- /dev/null +++ b/dependencies/QGSJetII/code_generator.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python3 + +# (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu +# +# See file AUTHORS for a list of contributors. +# +# This software is distributed under the terms of the GNU General Public +# Licence version 3 (GPL Version 3). See file LICENSE for a full version of +# the license. + + +import pickle, sys, itertools + + + +def load_particledb(filename): + ''' + loads the pickled particle_db (which is an OrderedDict) + definition of particle_db dict is: "name", "antiName", "pdg", "mass", "electric_charge", "lifetime", "ngc_code", "isNucleus", "isHadron" + ''' + with open(filename, "rb") as f: + particle_db = pickle.load(f) + return particle_db + + +def set_default_qgsjetII_definition(particle_db): + ''' + Also particles not explicitly known by QGSJetII may in fact interact via mapping + to cross section types (xsType) and hadron type (hadronType) + + This is achieved here. + + The function return nothing, but modified the input particle_db by adding the + fields 'xsType' and 'hadronType' + ''' + for identifier, pData in particle_db.items(): + # the cross-section types + xsType = "CannotInteract" + hadronType = "UndefinedType" + if (pData['isNucleus']): + xsType = "Baryons" + hadronType = "NucleusType" + elif (pData['isHadron']): + pdg = abs(pData['pdg']) + anti = pData['pdg'] < 0 + isBaryon = (1000 <= pdg < 4000) + charge = pData['electric_charge'] + if (pdg>=100 and pdg<300 and pdg!=130): # light mesons + xsType = "LightMesons" + if (charge==0): + hadronType = "NeutralLightMesonType" + else: + if (charge>0): + hadronType = "PiPlusType" + else: + hadronType = "PiMinusType" + elif ((pdg>=300 and pdg<400) or pdg in [130, 10313, 10323]): # kaons + xsType = "Kaons" + if (charge>0): + hadronType = "KaonPlusType" + else: + hadronType = "KaonMinusType" + if (charge==0): + hadronType = "Kaon0SType" + if (pdg == 130): + hadronType = "Kaon0LType" + elif (pdg == 310): + hadronType = "Kaon0SType" + elif (isBaryon or pData['isNucleus']): # baryons + xsType = "Baryons" + if (charge==0): + if (anti): + hadronType = "AntiNeutronType" + else: + hadronType = "NeutronType" + else: + if (charge>0): + hadronType = "ProtonType" + else: + hadronType = "AntiProtonType" + # all othe not-captured cased are hopefully irrelevant + + pData['qgsjetII_xsType'] = xsType + pData['qgsjetII_hadronType'] = hadronType + + +def read_qgsjetII_codes(filename, particle_db): + ''' + reads the qgsjet-codes data file. For particles known to QGSJetII the 'qgsjetII_code' is set in the particle_db, as + well as the 'xsType' is updated in case it is different from its default value set above. + ''' + with open(filename) as f: + for line in f: + line = line.strip() + if len(line)==0 or line[0] == '#': + continue + line = line.split('#')[0] + print (line) + identifier, model_code, xsType = line.split() + try: + particle_db[identifier]["qgsjetII_code"] = int(model_code) + particle_db[identifier]["qgsjetII_xsType"] = xsType + except KeyError as e: + raise Exception("Identifier '{:s}' not found in particle_db".format(identifier)) + + +def generate_qgsjetII_enum(particle_db): + ''' + generates the enum to access qgsjetII particles by readable names + ''' + output = "enum class QgsjetIICode : int8_t {\n" + for identifier, pData in particle_db.items(): + if 'qgsjetII_code' in pData: + output += " {:s} = {:d},\n".format(identifier, pData['qgsjetII_code']) + output += "};\n" + return output + + +def generate_corsika2qgsjetII(particle_db): + ''' + generates the look-up table to convert corsika codes to qgsjetII codes + ''' + string = "std::array<QgsjetIICode, {:d}> constexpr corsika2qgsjetII = {{\n".format(len(particle_db)) + for identifier, pData in particle_db.items(): + if 'qgsjetII_code' in pData: + string += " QgsjetIICode::{:s}, \n".format(identifier) + else: + string += " QgsjetIICode::Unknown, // {:s}\n".format(identifier + ' not implemented in QGSJetII') + string += "};\n" + return string + + +def generate_corsika2qgsjetII_xsType(particle_db): + ''' + generates the look-up table to convert corsika codes to qgsjetII codes + ''' + string = "std::array<QgsjetIIXSClass, {:d}> constexpr corsika2qgsjetIIXStype = {{\n".format(len(particle_db)) + for identifier, pData in particle_db.items(): + modelCodeXS = pData.get("qgsjetII_xsType", "CannotInteract") + string += " QgsjetIIXSClass::{:s}, // {:s}\n".format(modelCodeXS, identifier if modelCodeXS else identifier + " (not implemented in QGSJETII)") + string += "};\n" + return string + + +def generate_corsika2qgsjetII_hadronType(particle_db): + ''' + generates the look-up table to convert corsika codes to qgsjetII codes + ''' + string = "std::array<QgsjetIIHadronType, {:d}> constexpr corsika2qgsjetIIHadronType = {{\n".format(len(particle_db)) + for identifier, pData in particle_db.items(): + modelCode = pData.get("qgsjetII_hadronType", "UndefinedType") + string += " QgsjetIIHadronType::{:s}, // {:s}\n".format(modelCode, identifier if modelCode else identifier + " (not implemented in QGSJETII)") + string += "};\n" + return string + + +def generate_qgsjetII2corsika(particle_db) : + ''' + generates the look-up table to convert qgsjetII codes to corsika codes + ''' + minID = 0 + for identifier, pData in particle_db.items() : + if 'qgsjetII_code' in pData: + minID = min(minID, pData['qgsjetII_code']) + + string = "QgsjetIICodeIntType constexpr minQgsjetII = {:d};\n\n".format(minID) + + pDict = {} + for identifier, pData in particle_db.items() : + if 'qgsjetII_code' in pData: + model_code = pData['qgsjetII_code'] - minID + pDict[model_code] = identifier + + nPart = max(pDict.keys()) - min(pDict.keys()) + 1 + string += "std::array<corsika::Code, {:d}> constexpr qgsjetII2corsika = {{\n".format(nPart) + + for iPart in range(nPart) : + identifier = pDict.get(iPart, "Unknown") + qgsID = iPart + minID + string += " corsika::Code::{:s}, // {:d} \n".format(identifier, qgsID) + + string += "};\n" + return string + + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("usage: {:s} <particle_db.pkl> <qgsjetII_codes.dat>".format(sys.argv[0]), file=sys.stderr) + sys.exit(1) + + print("code_generator.py for QGSJETII") + + particle_db = load_particledb(sys.argv[1]) + read_qgsjetII_codes(sys.argv[2], particle_db) + set_default_qgsjetII_definition(particle_db) + + with open("Generated.inc", "w") as f: + print("// this file is automatically generated\n// edit at your own risk!\n", file=f) + print(generate_qgsjetII_enum(particle_db), file=f) + print(generate_corsika2qgsjetII(particle_db), file=f) + print(generate_qgsjetII2corsika(particle_db), file=f) + print(generate_corsika2qgsjetII_xsType(particle_db), file=f) + print(generate_corsika2qgsjetII_hadronType(particle_db), file=f) diff --git a/dependencies/QGSJetII/qgsjet-II-04-codes.dat b/dependencies/QGSJetII/qgsjet-II-04-codes.dat new file mode 100644 index 000000000..8b1bee7c7 --- /dev/null +++ b/dependencies/QGSJetII/qgsjet-II-04-codes.dat @@ -0,0 +1,44 @@ +# input file for particle conversion to/from QGSJet +# the format of this file is: "corsika-identifier" "qgsjet-id" "xs-class" + +# The 'Unknown' particle is needed to mark all particles qgsjetII does +# not know +# IMPORTANT Note: the code "20" MAY NOT BE USED by qgsjetII. Change to +# another positive integer if a conflict arises. Since we use std::array +# to store PID data keep the number as low as reasonable. +Unknown 20 CannotInteract + +# Note, we list here only the particles, which are produced by +# QGSJetII as secondaries. There is additional mapping of corsika +# particles on QGSJetII "xs-class"es and "hadron-type"s, which are +# programmed in code_generator.py + +# class 1 (-> as pions) +Pi0 0 LightMesons +PiPlus 1 LightMesons +PiMinus -1 LightMesons +Eta 10 LightMesons +Rho0 -10 LightMesons + +# class 2 (-> as proton) +Neutron 3 Baryons +AntiNeutron -3 Baryons +Proton 2 Baryons +AntiProton -2 Baryons +Lambda0 6 Baryons +Lambda0Bar -6 Baryons +LambdaCPlus 9 Baryons +LambdaCMinusBar -9 Baryons + +# class 3 (-> as kaon) +K0Short 5 Kaons +K0Long -5 Kaons +KPlus 4 Kaons +KMinus -4 Kaons + +# class 4 (-> charmed mesons, not in qgsjetII) +D0 8 Charmed +D0Bar -8 Charmed +DPlus 7 Charmed +DMinus -7 Charmed + diff --git a/dependencies/QGSJetII/qgsjet-II-04.cc b/dependencies/QGSJetII/qgsjet-II-04.cc new file mode 100644 index 000000000..7bb93c1a4 --- /dev/null +++ b/dependencies/QGSJetII/qgsjet-II-04.cc @@ -0,0 +1,33 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <qgsjet-II-04.h> + +//#include <corsika/framework/random/RNGManager.hpp> + +#include <iostream> +#include <random> + +datadir::datadir(const std::string& dir) { + if (dir.length() > 130) { + std::cerr << "QGSJetII error, will cut datadir \"" << dir + << "\" to 130 characters: " << std::endl; + } + int i = 0; + for (i = 0; i < std::min(130, int(dir.length())); ++i) data[i] = dir[i]; + data[i + 0] = ' '; + data[i + 1] = '\0'; +} + +double qgran_(int&) { + // static corsika::random::RNG& rng = + // corsika::random::RNGManager::GetInstance().GetRandomStream("qgsjet"); + + // std::uniform_real_distribution<double> dist; + return 0; // dist(rng); +} diff --git a/Processes/QGSJetII/qgsjet-II-04.f b/dependencies/QGSJetII/qgsjet-II-04.f similarity index 100% rename from Processes/QGSJetII/qgsjet-II-04.f rename to dependencies/QGSJetII/qgsjet-II-04.f diff --git a/dependencies/QGSJetII/qgsjet-II-04.h b/dependencies/QGSJetII/qgsjet-II-04.h new file mode 100644 index 000000000..f9f75d826 --- /dev/null +++ b/dependencies/QGSJetII/qgsjet-II-04.h @@ -0,0 +1,100 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <string> + +//---------------------------------------------- +// C++ interface for the QGSJetII event generator +//---------------------------------------------- +// wrapper + +extern "C" { + +// data memory layout + +extern struct { int nsp; } qgarr12_; + +const int nptmax = 95000; +const int iapmax = 208; + +extern struct { + double esp[nptmax][4]; + int ich[nptmax]; +} qgarr14_; + +extern struct { + // c nsf - number of secondary fragments; + // c iaf(i) - mass of the i-th fragment + int nsf; + int iaf[iapmax]; +} qgarr13_; + +extern struct { + int nwt; + int nwp; +} qgarr55_; + +/** + Small helper class to provide a data-directory name in the format qgsjetII expects + */ +class datadir { +private: + datadir operator=(const std::string& dir); + datadir operator=(const datadir&); + +public: + datadir(const std::string& dir); + char data[132]; +}; + +// functions +void qgset_(); +void qgaini_( + const char* datdir); // Note: there is a length limiation 132 from fortran-qgsjet here + +/** + @function qgini_ + + additional initialization procedure per event + + @parameter e0n - interaction energy (per hadron/nucleon), + @parameter icp0 - hadron type (+-1 - pi+-, +-2 - p(p~), +-3 - n(n~), +-4 - K+-, +-5 - + K_l/s), + @parameter iap - projectile mass number (1 - for a hadron), + @parameter iat - target mass number +*/ +void qgini_(const double& e0n, const int& icp0, const int& iap, const int& iat); + +/** + @function qgconf_ + + generate one event configuration +*/ +void qgconf_(); + +/** + @function qgsect_ + + hadron-nucleus (hadron-nucleus) particle production cross section + + @parameter e0n lab. energy per projectile nucleon (hadron) + @parameter icz hadron class (1 - pion, 2 - nucleon, 3 - kaon) + @parameter iap projectile mass number (1=<iap<=iapmax), + @parameter iat target mass number (1=<iat<=iapmax) + */ +double qgsect_(const double& e0n, const int& icz, const int& iap0, const int& iat0); + +/** + @function qgran + + link to random number generation + */ +double qgran_(int&); +} diff --git a/dependencies/QGSJetII/testQGSJetII.cc b/dependencies/QGSJetII/testQGSJetII.cc new file mode 100644 index 000000000..a5f8a145a --- /dev/null +++ b/dependencies/QGSJetII/testQGSJetII.cc @@ -0,0 +1,186 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/process/qgsjetII/Interaction.h> +#include <corsika/process/qgsjetII/ParticleConversion.h> + +#include <corsika/framework/random/RNGManager.hpp> + +#include <corsika/framework/coreParticleProperties.h> + +#include <corsika/framework/geometry/Point.h> +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <catch2/catch.hpp> + +#include <cstdlib> +#include <experimental/filesystem> +#include <iostream> + +using namespace corsika; +using namespace corsika::qgsjetII; +using namespace corsika::units::si; + +template <typename TStackView> +auto sumCharge(TStackView const& view) { + int totalCharge = 0; + + for (auto const& p : view) { totalCharge += GetChargeNumber(p.GetPID()); } + + return totalCharge; +} + +template <typename TStackView> +auto sumMomentum(TStackView const& view, geometry::CoordinateSystem const& vCS) { + geometry::Vector<hepenergy_d> sum{vCS, 0_eV, 0_eV, 0_eV}; + + for (auto const& p : view) { sum += p.GetMomentum(); } + + return sum; +} + +TEST_CASE("CORSIKA_DATA", "[processes]") { + + SECTION("check CORSIKA_DATA") { + + const char* data = std::getenv("CORSIKA_DATA"); + // these REQUIRES are needed: + REQUIRE(data != 0); + REQUIRE(std::experimental::filesystem::is_directory( + std::experimental::filesystem::path(std::string(data) + "/QGSJetII"))); + std::cout << "data: " << data << " isDir: " + << std::experimental::filesystem::is_directory(std::string(data) + + "/QGSJetII") + << std::endl; + } +} + +TEST_CASE("QgsjetII", "[processes]") { + + SECTION("Corsika -> QgsjetII") { + CHECK(process::qgsjetII::ConvertToQgsjetII(PiMinus::GetCode()) == + process::qgsjetII::QgsjetIICode::PiMinus); + CHECK(process::qgsjetII::ConvertToQgsjetIIRaw(Proton::GetCode()) == 2); + } + + SECTION("QgsjetII -> Corsika") { + CHECK(PiPlus::GetCode() == process::qgsjetII::ConvertFromQgsjetII( + process::qgsjetII::QgsjetIICode::PiPlus)); + } + + SECTION("Corsika -> QgsjetII") { + CHECK(process::qgsjetII::ConvertToQgsjetII(PiMinus::GetCode()) == + process::qgsjetII::QgsjetIICode::PiMinus); + CHECK(process::qgsjetII::ConvertToQgsjetIIRaw(Proton::GetCode()) == 2); + } + + SECTION("canInteractInQgsjetII") { + + CHECK(process::qgsjetII::CanInteract(Proton::GetCode())); + CHECK(process::qgsjetII::CanInteract(Code::KPlus)); + CHECK(process::qgsjetII::CanInteract(Nucleus::GetCode())); + // CHECK(process::qgsjetII::CanInteract( Helium::GetCode())); + + CHECK_FALSE(process::qgsjetII::CanInteract(EtaC::GetCode())); + CHECK_FALSE(process::qgsjetII::CanInteract(SigmaC0::GetCode())); + } + + SECTION("cross-section type") { + + CHECK(process::qgsjetII::GetQgsjetIIXSCode(Code::Neutron) == + process::qgsjetII::QgsjetIIXSClass::Baryons); + CHECK(process::qgsjetII::GetQgsjetIIXSCode(Code::K0Long) == + process::qgsjetII::QgsjetIIXSClass::Kaons); + CHECK(process::qgsjetII::GetQgsjetIIXSCode(Code::Proton) == + process::qgsjetII::QgsjetIIXSClass::Baryons); + CHECK(process::qgsjetII::GetQgsjetIIXSCode(Code::PiMinus) == + process::qgsjetII::QgsjetIIXSClass::LightMesons); + } +} + +#include <corsika/framework/geometry/Point.h> +#include <corsika/framework/geometry/RootCoordinateSystem.h> +#include <corsika/framework/geometry/Vector.h> + +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <corsika/framework/coreParticleProperties.h> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> + +#include <corsika/environment/Environment.h> +#include <corsika/environment/HomogeneousMedium.h> +#include <corsika/environment/NuclearComposition.h> +#include <corsika/process/qgsjetII/qgsjet-II-04.h> + +using namespace corsika::units::si; +using namespace corsika::units; + +TEST_CASE("QgsjetIIInterface", "[processes]") { + + // setup environment, geometry + environment::Environment<environment::IMediumModel> env; + auto& universe = *(env.GetUniverse()); + + auto theMedium = + environment::Environment<environment::IMediumModel>::CreateNode<geometry::Sphere>( + geometry::Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, + 1_km * std::numeric_limits<double>::infinity()); + + using MyHomogeneousModel = environment::HomogeneousMedium<environment::IMediumModel>; + theMedium->SetModelProperties<MyHomogeneousModel>( + 1_kg / (1_m * 1_m * 1_m), + environment::NuclearComposition(std::vector<Code>{Code::Oxygen}, + std::vector<float>{1.})); + + auto const* nodePtr = theMedium.get(); + universe.AddChild(std::move(theMedium)); + + const geometry::CoordinateSystem& cs = env.GetCoordinateSystem(); + + corsika::random::RNGManager::GetInstance().RegisterRandomStream("qgsjet"); + + SECTION("InteractionInterface") { + + setup::Stack stack; + const HEPEnergyType E0 = 100_GeV; + HEPMomentumType P0 = sqrt(E0 * E0 - Proton::GetMass() * Proton::GetMass()); + auto plab = corsika::stack::MomentumVector(cs, {0_GeV, 0_GeV, -P0}); + geometry::Point pos(cs, 0_m, 0_m, 0_m); + auto particle = stack.AddParticle( + std::tuple<Code, units::si::HEPEnergyType, corsika::stack::MomentumVector, + geometry::Point, units::si::TimeType>{Code::Proton, E0, plab, pos, + 0_ns}); + + particle.SetNode(nodePtr); + setup::StackView view(particle); + auto projectile = view.GetProjectile(); + auto const projectileMomentum = projectile.GetMomentum(); + + Interaction model; + + [[maybe_unused]] const process::EProcessReturn ret = model.DoInteraction(view); + [[maybe_unused]] const GrammageType length = model.GetInteractionLength(particle); + + CHECK(length / (1_g / square(1_cm)) == Approx(93.47).margin(0.1)); + + /*********************************** + It as turned out already two times (#291 and #307) that the detailed output of + QGSJetII event generation depends on the gfortran version used. This is not reliable + and cannot be tested in a unit test here. One related problem was already found (#291) + and is realted to undefined behaviour in the evaluation of functions in logical + expressions. It is not clear if #307 is the same issue. + + CHECK(view.GetSize() == 14); + CHECK(sumCharge(view) == 2); + ************************************/ + auto const secMomSum = sumMomentum(view, projectileMomentum.GetCoordinateSystem()); + CHECK((secMomSum - projectileMomentum).norm() / projectileMomentum.norm() == + Approx(0).margin(1e-2)); + } +} diff --git a/dependencies/UrQMD/CMakeLists.txt b/dependencies/UrQMD/CMakeLists.txt new file mode 100644 index 000000000..6c538f7ff --- /dev/null +++ b/dependencies/UrQMD/CMakeLists.txt @@ -0,0 +1,51 @@ +cmake_minimum_required(VERSION 3.1) + +project(libUrQMD) + +set ( + MODEL_SOURCES + urqmdInterface.F + addpart.f + angdis.f + anndec.f + blockres.f + boxprg.f + cascinit.f + coload.f + dectim.f + delpart.f + detbal.f + dwidth.f + error.f + getmass.f + getspin.f + init.f + iso.f + ityp2pdg.f + jdecay2.f + make22.f + numrec.f + output.f + paulibl.f + proppot.f + saveinfo.f + scatter.f + siglookup.f + string.f + tabinit.f + urqmd.f + whichres.f +) + +set ( + MODEL_HEADERS + ) + +enable_language(Fortran) +add_library (UrQMD SHARED ${MODEL_SOURCES}) +set_property(TARGET UrQMD PROPERTY POSITION_INDEPENDENT_CODE 1) + +add_library (UrQMD_static STATIC ${MODEL_SOURCES}) +set_property(TARGET UrQMD_static PROPERTY POSITION_INDEPENDENT_CODE 1) + + diff --git a/Processes/UrQMD/Copyright b/dependencies/UrQMD/Copyright similarity index 100% rename from Processes/UrQMD/Copyright rename to dependencies/UrQMD/Copyright diff --git a/Processes/UrQMD/README b/dependencies/UrQMD/README similarity index 100% rename from Processes/UrQMD/README rename to dependencies/UrQMD/README diff --git a/Processes/UrQMD/UrQMD.cc b/dependencies/UrQMD/UrQMD.cc similarity index 78% rename from Processes/UrQMD/UrQMD.cc rename to dependencies/UrQMD/UrQMD.cc index 9d78d20ae..90be92d6e 100644 --- a/Processes/UrQMD/UrQMD.cc +++ b/dependencies/UrQMD/UrQMD.cc @@ -6,12 +6,12 @@ * the license. */ -#include <corsika/geometry/QuantityVector.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/coreParticleProperties.h> +#include <corsika/framework/geometry/QuantityVector.h> +#include <corsika/framework/geometry/Vector.h> #include <corsika/logging/Logging.h> -#include <corsika/particles/ParticleProperties.h> #include <corsika/process/urqmd/UrQMD.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <algorithm> #include <array> @@ -19,10 +19,11 @@ #include <cmath> #include <fstream> #include <functional> +#include <iostream> #include <random> #include <sstream> -using namespace corsika::process::UrQMD; +using namespace corsika::UrQMD; using namespace corsika::units::si; using SetupStack = corsika::setup::Stack; @@ -34,12 +35,15 @@ UrQMD::UrQMD(std::string const& xs_file) { iniurqmdc8_(); } -CrossSectionType UrQMD::GetTabulatedCrossSection(particles::Code projectileCode, - corsika::particles::Code targetCode, +CrossSectionType UrQMD::GetTabulatedCrossSection(Code projectileCode, + corsika::Code targetCode, HEPEnergyType labEnergy) const { // translated to C++ from CORSIKA 7 subroutine cxtot_u - auto const kinEnergy = labEnergy - particles::GetMass(projectileCode); + C8LOG_DEBUG("UrQMD::GetTabulatedCrossSection proj={}, targ={}, E={}GeV", + GetName(projectileCode), GetName(targetCode), labEnergy / 1_GeV); + + auto const kinEnergy = labEnergy - GetMass(projectileCode); assert(kinEnergy >= HEPEnergyType::zero()); @@ -54,53 +58,53 @@ CrossSectionType UrQMD::GetTabulatedCrossSection(particles::Code projectileCode, int projectileIndex; switch (projectileCode) { - case particles::Code::Proton: + case Code::Proton: projectileIndex = 0; break; - case particles::Code::AntiProton: + case Code::AntiProton: projectileIndex = 1; break; - case particles::Code::Neutron: + case Code::Neutron: projectileIndex = 2; break; - case particles::Code::AntiNeutron: + case Code::AntiNeutron: projectileIndex = 3; break; - case particles::Code::PiPlus: + case Code::PiPlus: projectileIndex = 4; break; - case particles::Code::PiMinus: + case Code::PiMinus: projectileIndex = 5; break; - case particles::Code::KPlus: + case Code::KPlus: projectileIndex = 6; break; - case particles::Code::KMinus: + case Code::KMinus: projectileIndex = 7; break; - case particles::Code::K0Short: - case particles::Code::K0Long: + case Code::K0Short: + case Code::K0Long: /* since K0Short and K0Long are treated the same, we can also add K0 and K0Bar * to the list. This is a deviation from CORSIKA 7. */ - case particles::Code::K0: - case particles::Code::K0Bar: + case Code::K0: + case Code::K0Bar: projectileIndex = 8; break; - default: { - C8LOG_WARN("WARNING: UrQMD cross-section not tabulated for {}", projectileCode); + default: + std::cout << "WARNING: UrQMD cross-section not tabulated for " << projectileCode + << std::endl; return CrossSectionType::zero(); - } } int targetIndex; switch (targetCode) { - case particles::Code::Nitrogen: + case Code::Nitrogen: targetIndex = 0; break; - case particles::Code::Oxygen: + case Code::Oxygen: targetIndex = 1; break; - case particles::Code::Argon: + case Code::Argon: targetIndex = 2; break; default: @@ -115,21 +119,16 @@ CrossSectionType UrQMD::GetTabulatedCrossSection(particles::Code projectileCode, xs_interp_support_table_[projectileIndex][targetIndex][je + i - 1 - 1] * w[i]; } - C8LOG_DEBUG("UrQMD::GetTabulatedCrossSection proj={}, targ={}, E={}GeV, sigma={}", - particles::GetName(projectileCode), particles::GetName(targetCode), - labEnergy / 1_GeV, result); - return result; } -CrossSectionType UrQMD::GetCrossSection(particles::Code projectileCode, - corsika::particles::Code targetCode, +CrossSectionType UrQMD::GetCrossSection(Code projectileCode, corsika::Code targetCode, HEPEnergyType labEnergy, int projectileA) const { // the following is a (incomplete!) translation of ptsigtot() into C++ - if (projectileCode != particles::Code::Nucleus && + if (projectileCode != Code::Nucleus && !IsNucleus(targetCode)) { // both particles are "special" - auto const mProj = particles::GetMass(projectileCode); - auto const mTar = particles::GetMass(targetCode); + auto const mProj = GetMass(projectileCode); + auto const mTar = GetMass(targetCode); double sqrtS = sqrt(units::static_pow<2>(mProj) + units::static_pow<2>(mTar) + 2 * labEnergy * mTar) * (1 / 1_GeV); @@ -180,7 +179,7 @@ CrossSectionType UrQMD::GetCrossSection(particles::Code projectileCode, } } else { int const Ap = projectileA; - int const At = IsNucleus(targetCode) ? particles::GetNucleusA(targetCode) : 1; + int const At = IsNucleus(targetCode) ? GetNucleusA(targetCode) : 1; double const maxImpact = nucrad_(Ap) + nucrad_(At) + 2 * options_.CTParam[30 - 1]; return 10_mb * M_PI * units::static_pow<2>(maxImpact); @@ -191,12 +190,12 @@ CrossSectionType UrQMD::GetCrossSection(particles::Code projectileCode, template <typename TParticle> // need template here, as this is called both with // SetupParticle as well as SetupProjectile CrossSectionType UrQMD::GetCrossSection(TParticle const& projectile, - corsika::particles::Code targetCode) const { + corsika::Code targetCode) const { auto const projectileCode = projectile.GetPID(); auto const projectileEnergyLab = projectile.GetEnergy(); - if (projectileCode == particles::Code::Nucleus) { + if (projectileCode == Code::Nucleus) { /* * unfortunately unavoidable at the moment until we have tools to get the actual * inealstic cross-section from UrQMD @@ -207,7 +206,7 @@ CrossSectionType UrQMD::GetCrossSection(TParticle const& projectile, return GetTabulatedCrossSection(projectileCode, targetCode, projectileEnergyLab); } -bool UrQMD::CanInteract(particles::Code code) const { +bool UrQMD::CanInteract(Code code) const { // According to the manual, UrQMD can use all mesons, baryons and nucleons // which are modeled also as input particles. I think it is safer to accept // only the usual long-lived species as input. @@ -216,11 +215,9 @@ bool UrQMD::CanInteract(particles::Code code) const { // but right now we don't have access to the inelastic (production) cross-section, // so we unfortunately have to forbid these interactions for the time being. - static particles::Code const validProjectileCodes[] = { - particles::Code::Proton, particles::Code::AntiProton, particles::Code::Neutron, - particles::Code::AntiNeutron, particles::Code::PiPlus, particles::Code::PiMinus, - particles::Code::KPlus, particles::Code::KMinus, particles::Code::K0Short, - particles::Code::K0Long}; + static Code const validProjectileCodes[] = { + Code::Proton, Code::AntiProton, Code::Neutron, Code::AntiNeutron, Code::PiPlus, + Code::PiMinus, Code::KPlus, Code::KMinus, Code::K0Short, Code::K0Long}; return std::find(std::cbegin(validProjectileCodes), std::cend(validProjectileCodes), code) != std::cend(validProjectileCodes); @@ -244,7 +241,7 @@ GrammageType UrQMD::GetInteractionLength(SetupParticle const& particle) const { weightedProdCrossSection; } -corsika::process::EProcessReturn UrQMD::DoInteraction(SetupView& view) { +corsika::EProcessReturn UrQMD::DoInteraction(SetupView& view) { using namespace units::si; auto const projectile = view.GetProjectile(); @@ -255,9 +252,6 @@ corsika::process::EProcessReturn UrQMD::DoInteraction(SetupView& view) { auto const& projectilePosition = projectile.GetPosition(); auto const projectileTime = projectile.GetTime(); - C8LOG_DEBUG("UrQMD::DoInteraction pid={} E={} GeV", projectileCode, - projectileEnergyLab / 1_GeV); - // sample target particle auto const& mediumComposition = projectile.GetNode()->GetModelProperties().GetNuclearComposition(); @@ -274,8 +268,8 @@ corsika::process::EProcessReturn UrQMD::DoInteraction(SetupView& view) { }); auto const targetCode = mediumComposition.SampleTarget(componentCrossSections, rng_); - auto const targetA = particles::GetNucleusA(targetCode); - auto const targetZ = particles::GetNucleusZ(targetCode); + auto const targetA = GetNucleusA(targetCode); + auto const targetZ = GetNucleusZ(targetCode); inputs_.nevents = 1; sys_.eos = 0; // could be configurable in principle @@ -283,7 +277,7 @@ corsika::process::EProcessReturn UrQMD::DoInteraction(SetupView& view) { sys_.nsteps = 1; // initialization regarding projectile - if (particles::Code::Nucleus == projectileCode) { + if (Code::Nucleus == projectileCode) { // is this everything? inputs_.prspflg = 0; @@ -302,9 +296,8 @@ corsika::process::EProcessReturn UrQMD::DoInteraction(SetupView& view) { rsys_.bdist = nucrad_(targetA) + nucrad_(1) + 2 * options_.CTParam[30 - 1]; rsys_.ebeam = (projectileEnergyLab - projectile.GetMass()) * (1 / 1_GeV); - if (projectileCode == particles::Code::K0Long || - projectileCode == particles::Code::K0Short) { - projectileCode = booleanDist_(rng_) ? particles::Code::K0 : particles::Code::K0Bar; + if (projectileCode == Code::K0Long || projectileCode == Code::K0Short) { + projectileCode = booleanDist_(rng_) ? Code::K0 : Code::K0Bar; } auto const [ityp, iso3] = ConvertToUrQMD(projectileCode); @@ -314,7 +307,7 @@ corsika::process::EProcessReturn UrQMD::DoInteraction(SetupView& view) { } // initilazation regarding target - if (particles::IsNucleus(targetCode)) { + if (IsNucleus(targetCode)) { sys_.Zt = targetZ; sys_.At = targetA; inputs_.trspflg = 0; // nucleus as target @@ -337,8 +330,8 @@ corsika::process::EProcessReturn UrQMD::DoInteraction(SetupView& view) { for (int i = 0; i < sys_.npart; ++i) { auto code = ConvertFromUrQMD(isys_.ityp[i], isys_.iso3[i]); - if (code == particles::Code::K0 || code == particles::Code::K0Bar) { - code = booleanDist_(rng_) ? particles::Code::K0Short : particles::Code::K0Long; + if (code == Code::K0 || code == Code::K0Bar) { + code = booleanDist_(rng_) ? Code::K0Short : Code::K0Long; } // "coor_.p0[i] * 1_GeV" is likely off-shell as UrQMD doesn't preserve masses well @@ -347,17 +340,17 @@ corsika::process::EProcessReturn UrQMD::DoInteraction(SetupView& view) { geometry::QuantityVector<dimensionless_d>{coor_.px[i], coor_.py[i], coor_.pz[i]} * 1_GeV); - auto const energy = sqrt(momentum.squaredNorm() + square(particles::GetMass(code))); + auto const energy = sqrt(momentum.squaredNorm() + square(GetMass(code))); momentum.rebase(originalCS); // transform back into standard lab frame - C8LOG_DEBUG(" Secondary {} code {} p={} GeV", i, code, - momentum.GetComponents() / 1_GeV); + std::cout << i << " " << code << " " << momentum.GetComponents() << std::endl; view.AddSecondary( - std::make_tuple(code, energy, momentum, projectilePosition, projectileTime)); + std::tuple<Code, HEPEnergyType, stack::MomentumVector, geometry::Point, TimeType>{ + code, energy, momentum, projectilePosition, projectileTime}); } - C8LOG_DEBUG("UrQMD generated {} secondaries!", sys_.npart); + std::cout << "UrQMD generated " << sys_.npart << " secondaries!" << std::endl; return process::EProcessReturn::eOk; } @@ -365,7 +358,7 @@ corsika::process::EProcessReturn UrQMD::DoInteraction(SetupView& view) { /** * the random number generator function of UrQMD */ -double corsika::process::UrQMD::ranf_(int&) { +double corsika::UrQMD::ranf_(int&) { static corsika::random::RNG& rng = corsika::random::RNGManager::GetInstance().GetRandomStream("urqmd"); static std::uniform_real_distribution<double> dist; @@ -373,18 +366,17 @@ double corsika::process::UrQMD::ranf_(int&) { return dist(rng); } -corsika::particles::Code corsika::process::UrQMD::ConvertFromUrQMD(int vItyp, int vIso3) { +corsika::Code corsika::UrQMD::ConvertFromUrQMD(int vItyp, int vIso3) { int const pdgInt = pdgid_(vItyp, vIso3); // use the conversion function provided by UrQMD if (pdgInt == 0) { // pdgid_ returns 0 on error throw std::runtime_error("UrQMD pdgid() returned 0"); } - auto const pdg = static_cast<particles::PDGCode>(pdgInt); - return particles::ConvertFromPDG(pdg); + auto const pdg = static_cast<PDGCode>(pdgInt); + return ConvertFromPDG(pdg); } -std::pair<int, int> corsika::process::UrQMD::ConvertToUrQMD( - corsika::particles::Code code) { +std::pair<int, int> corsika::UrQMD::ConvertToUrQMD(corsika::Code code) { static const std::map<int, std::pair<int, int>> mapPDGToUrQMD{ // data mostly from github.com/afedynitch/ParticleDataTool {22, {100, 0}}, // gamma diff --git a/Processes/UrQMD/UrQMD.h b/dependencies/UrQMD/UrQMD.h similarity index 83% rename from Processes/UrQMD/UrQMD.h rename to dependencies/UrQMD/UrQMD.h index 937b6d702..e6535ca54 100644 --- a/Processes/UrQMD/UrQMD.h +++ b/dependencies/UrQMD/UrQMD.h @@ -8,12 +8,12 @@ #pragma once -#include <corsika/particles/ParticleProperties.h> -#include <corsika/process/InteractionProcess.h> -#include <corsika/random/RNGManager.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/coreParticleProperties.h> #include <corsika/utl/CorsikaData.h> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/sequence/InteractionProcess.hpp> +#include <corsika/setup/SetupStack.hpp> #include <boost/multi_array.hpp> @@ -22,8 +22,8 @@ #include <string> #include <utility> -namespace corsika::process::UrQMD { - class UrQMD : public corsika::process::InteractionProcess<UrQMD> { +namespace corsika::UrQMD { + class UrQMD : public corsika::InteractionProcess<UrQMD> { public: UrQMD(std::string const& path = utl::CorsikaData("UrQMD/UrQMD-1.3.1-xs.dat")); corsika::units::si::GrammageType GetInteractionLength( @@ -31,18 +31,17 @@ namespace corsika::process::UrQMD { template <typename TParticle> corsika::units::si::CrossSectionType GetCrossSection(TParticle const&, - corsika::particles::Code) const; + corsika::Code) const; corsika::units::si::CrossSectionType GetCrossSection( - particles::Code, particles::Code, corsika::units::si::HEPEnergyType, - int Ap = 1) const; + Code, Code, corsika::units::si::HEPEnergyType, int Ap = 1) const; corsika::units::si::CrossSectionType GetTabulatedCrossSection( - particles::Code, particles::Code, corsika::units::si::HEPEnergyType) const; + Code, Code, corsika::units::si::HEPEnergyType) const; - corsika::process::EProcessReturn DoInteraction(corsika::setup::StackView&); + corsika::EProcessReturn DoInteraction(corsika::setup::StackView&); - bool CanInteract(particles::Code) const; + bool CanInteract(Code) const; private: void readXSFile(std::string const&); @@ -146,7 +145,7 @@ namespace corsika::process::UrQMD { * * In the current implementation a detour via the PDG code is made. */ - std::pair<int, int> ConvertToUrQMD(particles::Code); - particles::Code ConvertFromUrQMD(int vItyp, int vIso3); + std::pair<int, int> ConvertToUrQMD(Code); + Code ConvertFromUrQMD(int vItyp, int vIso3); -} // namespace corsika::process::UrQMD +} // namespace corsika::UrQMD diff --git a/Processes/UrQMD/addpart.f b/dependencies/UrQMD/addpart.f similarity index 100% rename from Processes/UrQMD/addpart.f rename to dependencies/UrQMD/addpart.f diff --git a/Processes/UrQMD/angdis.f b/dependencies/UrQMD/angdis.f similarity index 100% rename from Processes/UrQMD/angdis.f rename to dependencies/UrQMD/angdis.f diff --git a/Processes/UrQMD/anndec.f b/dependencies/UrQMD/anndec.f similarity index 100% rename from Processes/UrQMD/anndec.f rename to dependencies/UrQMD/anndec.f diff --git a/Processes/UrQMD/blockres.f b/dependencies/UrQMD/blockres.f similarity index 100% rename from Processes/UrQMD/blockres.f rename to dependencies/UrQMD/blockres.f diff --git a/Processes/UrQMD/boxinc.f b/dependencies/UrQMD/boxinc.f similarity index 100% rename from Processes/UrQMD/boxinc.f rename to dependencies/UrQMD/boxinc.f diff --git a/Processes/UrQMD/boxprg.f b/dependencies/UrQMD/boxprg.f similarity index 100% rename from Processes/UrQMD/boxprg.f rename to dependencies/UrQMD/boxprg.f diff --git a/Processes/UrQMD/cascinit.f b/dependencies/UrQMD/cascinit.f similarity index 100% rename from Processes/UrQMD/cascinit.f rename to dependencies/UrQMD/cascinit.f diff --git a/Processes/UrQMD/colltab.f b/dependencies/UrQMD/colltab.f similarity index 100% rename from Processes/UrQMD/colltab.f rename to dependencies/UrQMD/colltab.f diff --git a/Processes/UrQMD/coload.f b/dependencies/UrQMD/coload.f similarity index 100% rename from Processes/UrQMD/coload.f rename to dependencies/UrQMD/coload.f diff --git a/Processes/UrQMD/comnorm.f b/dependencies/UrQMD/comnorm.f similarity index 100% rename from Processes/UrQMD/comnorm.f rename to dependencies/UrQMD/comnorm.f diff --git a/Processes/UrQMD/comres.f b/dependencies/UrQMD/comres.f similarity index 100% rename from Processes/UrQMD/comres.f rename to dependencies/UrQMD/comres.f diff --git a/Processes/UrQMD/coms.f b/dependencies/UrQMD/coms.f similarity index 100% rename from Processes/UrQMD/coms.f rename to dependencies/UrQMD/coms.f diff --git a/Processes/UrQMD/comstr.f b/dependencies/UrQMD/comstr.f similarity index 100% rename from Processes/UrQMD/comstr.f rename to dependencies/UrQMD/comstr.f diff --git a/Processes/UrQMD/comwid.f b/dependencies/UrQMD/comwid.f similarity index 100% rename from Processes/UrQMD/comwid.f rename to dependencies/UrQMD/comwid.f diff --git a/Processes/UrQMD/dectim.f b/dependencies/UrQMD/dectim.f similarity index 100% rename from Processes/UrQMD/dectim.f rename to dependencies/UrQMD/dectim.f diff --git a/Processes/UrQMD/delpart.f b/dependencies/UrQMD/delpart.f similarity index 100% rename from Processes/UrQMD/delpart.f rename to dependencies/UrQMD/delpart.f diff --git a/Processes/UrQMD/detbal.f b/dependencies/UrQMD/detbal.f similarity index 100% rename from Processes/UrQMD/detbal.f rename to dependencies/UrQMD/detbal.f diff --git a/Processes/UrQMD/dwidth.f b/dependencies/UrQMD/dwidth.f similarity index 100% rename from Processes/UrQMD/dwidth.f rename to dependencies/UrQMD/dwidth.f diff --git a/Processes/UrQMD/error.f b/dependencies/UrQMD/error.f similarity index 100% rename from Processes/UrQMD/error.f rename to dependencies/UrQMD/error.f diff --git a/Processes/UrQMD/freezeout.f b/dependencies/UrQMD/freezeout.f similarity index 100% rename from Processes/UrQMD/freezeout.f rename to dependencies/UrQMD/freezeout.f diff --git a/Processes/UrQMD/getmass.f b/dependencies/UrQMD/getmass.f similarity index 100% rename from Processes/UrQMD/getmass.f rename to dependencies/UrQMD/getmass.f diff --git a/Processes/UrQMD/getspin.f b/dependencies/UrQMD/getspin.f similarity index 100% rename from Processes/UrQMD/getspin.f rename to dependencies/UrQMD/getspin.f diff --git a/Processes/UrQMD/init.f b/dependencies/UrQMD/init.f similarity index 100% rename from Processes/UrQMD/init.f rename to dependencies/UrQMD/init.f diff --git a/Processes/UrQMD/inputs.f b/dependencies/UrQMD/inputs.f similarity index 100% rename from Processes/UrQMD/inputs.f rename to dependencies/UrQMD/inputs.f diff --git a/Processes/UrQMD/iso.f b/dependencies/UrQMD/iso.f similarity index 100% rename from Processes/UrQMD/iso.f rename to dependencies/UrQMD/iso.f diff --git a/Processes/UrQMD/ityp2pdg.f b/dependencies/UrQMD/ityp2pdg.f similarity index 100% rename from Processes/UrQMD/ityp2pdg.f rename to dependencies/UrQMD/ityp2pdg.f diff --git a/Processes/UrQMD/jdecay2.f b/dependencies/UrQMD/jdecay2.f similarity index 100% rename from Processes/UrQMD/jdecay2.f rename to dependencies/UrQMD/jdecay2.f diff --git a/Processes/UrQMD/make22.f b/dependencies/UrQMD/make22.f similarity index 100% rename from Processes/UrQMD/make22.f rename to dependencies/UrQMD/make22.f diff --git a/Processes/UrQMD/newpart.f b/dependencies/UrQMD/newpart.f similarity index 100% rename from Processes/UrQMD/newpart.f rename to dependencies/UrQMD/newpart.f diff --git a/Processes/UrQMD/numrec.f b/dependencies/UrQMD/numrec.f similarity index 100% rename from Processes/UrQMD/numrec.f rename to dependencies/UrQMD/numrec.f diff --git a/Processes/UrQMD/options.f b/dependencies/UrQMD/options.f similarity index 100% rename from Processes/UrQMD/options.f rename to dependencies/UrQMD/options.f diff --git a/Processes/UrQMD/outcom.f b/dependencies/UrQMD/outcom.f similarity index 100% rename from Processes/UrQMD/outcom.f rename to dependencies/UrQMD/outcom.f diff --git a/Processes/UrQMD/output.f b/dependencies/UrQMD/output.f similarity index 100% rename from Processes/UrQMD/output.f rename to dependencies/UrQMD/output.f diff --git a/Processes/UrQMD/paulibl.f b/dependencies/UrQMD/paulibl.f similarity index 100% rename from Processes/UrQMD/paulibl.f rename to dependencies/UrQMD/paulibl.f diff --git a/Processes/UrQMD/proppot.f b/dependencies/UrQMD/proppot.f similarity index 100% rename from Processes/UrQMD/proppot.f rename to dependencies/UrQMD/proppot.f diff --git a/Processes/UrQMD/saveinfo.f b/dependencies/UrQMD/saveinfo.f similarity index 100% rename from Processes/UrQMD/saveinfo.f rename to dependencies/UrQMD/saveinfo.f diff --git a/Processes/UrQMD/scatter.f b/dependencies/UrQMD/scatter.f similarity index 100% rename from Processes/UrQMD/scatter.f rename to dependencies/UrQMD/scatter.f diff --git a/Processes/UrQMD/siglookup.f b/dependencies/UrQMD/siglookup.f similarity index 100% rename from Processes/UrQMD/siglookup.f rename to dependencies/UrQMD/siglookup.f diff --git a/Processes/UrQMD/string.f b/dependencies/UrQMD/string.f similarity index 100% rename from Processes/UrQMD/string.f rename to dependencies/UrQMD/string.f diff --git a/Processes/UrQMD/tabinit.f b/dependencies/UrQMD/tabinit.f similarity index 100% rename from Processes/UrQMD/tabinit.f rename to dependencies/UrQMD/tabinit.f diff --git a/dependencies/UrQMD/testUrQMD.cc b/dependencies/UrQMD/testUrQMD.cc new file mode 100644 index 000000000..2fcb9b083 --- /dev/null +++ b/dependencies/UrQMD/testUrQMD.cc @@ -0,0 +1,222 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/process/urqmd/UrQMD.h> +#include <corsika/framework/random/RNGManager.hpp> + +#include <corsika/framework/geometry/Point.h> +#include <corsika/framework/geometry/RootCoordinateSystem.h> +#include <corsika/framework/geometry/Vector.h> + +#include <corsika/units/PhysicalConstants.h> +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <corsika/utl/CorsikaFenv.h> + +#include <corsika/framework/coreParticleProperties.h> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> + +#include <corsika/environment/Environment.h> +#include <corsika/environment/HomogeneousMedium.h> +#include <corsika/environment/NuclearComposition.h> + +#include <tuple> +#include <utility> + +#include <catch2/catch.hpp> + +using namespace corsika; +using namespace corsika::UrQMD; +using namespace corsika::units::si; + +template <typename TStackView> +auto sumCharge(TStackView const& view) { + int totalCharge = 0; + + for (auto const& p : view) { totalCharge += GetChargeNumber(p.GetPID()); } + + return totalCharge; +} + +template <typename TStackView> +auto sumMomentum(TStackView const& view, geometry::CoordinateSystem const& vCS) { + geometry::Vector<hepenergy_d> sum{vCS, 0_eV, 0_eV, 0_eV}; + + for (auto const& p : view) { sum += p.GetMomentum(); } + + return sum; +} + +auto setupEnvironment(Code vTargetCode) { + // setup environment, geometry + auto env = std::make_unique<environment::Environment<environment::IMediumModel>>(); + auto& universe = *(env->GetUniverse()); + const geometry::CoordinateSystem& cs = env->GetCoordinateSystem(); + + auto theMedium = + environment::Environment<environment::IMediumModel>::CreateNode<geometry::Sphere>( + geometry::Point{cs, 0_m, 0_m, 0_m}, + 1_km * std::numeric_limits<double>::infinity()); + + using MyHomogeneousModel = environment::HomogeneousMedium<environment::IMediumModel>; + theMedium->SetModelProperties<MyHomogeneousModel>( + 1_kg / (1_m * 1_m * 1_m), + environment::NuclearComposition(std::vector<Code>{vTargetCode}, + std::vector<float>{1.})); + + auto const* nodePtr = theMedium.get(); + universe.AddChild(std::move(theMedium)); + + return std::make_tuple(std::move(env), &cs, nodePtr); +} + +template <typename TNodeType> +auto setupStack(int vA, int vZ, HEPEnergyType vMomentum, TNodeType* vNodePtr, + geometry::CoordinateSystem const& cs) { + auto stack = std::make_unique<setup::Stack>(); + auto constexpr mN = corsika::units::constants::nucleonMass; + + geometry::Point const origin(cs, {0_m, 0_m, 0_m}); + corsika::stack::MomentumVector const pLab(cs, {vMomentum, 0_GeV, 0_GeV}); + + HEPEnergyType const E0 = sqrt(units::static_pow<2>(mN * vA) + pLab.squaredNorm()); + auto particle = stack->AddParticle( + std::tuple<Code, units::si::HEPEnergyType, corsika::stack::MomentumVector, + geometry::Point, units::si::TimeType, unsigned short, unsigned short>{ + Code::Nucleus, E0, pLab, origin, 0_ns, vA, vZ}); + + particle.SetNode(vNodePtr); + return std::make_tuple( + std::move(stack), std::make_unique<decltype(setup::StackView{particle})>(particle)); +} + +template <typename TNodeType> +auto setupStack(Code vProjectileType, HEPEnergyType vMomentum, TNodeType* vNodePtr, + geometry::CoordinateSystem const& cs) { + auto stack = std::make_unique<setup::Stack>(); + + geometry::Point const origin(cs, {0_m, 0_m, 0_m}); + corsika::stack::MomentumVector const pLab(cs, {vMomentum, 0_GeV, 0_GeV}); + + HEPEnergyType const E0 = + sqrt(units::static_pow<2>(GetMass(vProjectileType)) + pLab.squaredNorm()); + auto particle = stack->AddParticle( + std::tuple<Code, units::si::HEPEnergyType, corsika::stack::MomentumVector, + geometry::Point, units::si::TimeType>{vProjectileType, E0, pLab, origin, + 0_ns}); + + particle.SetNode(vNodePtr); + return std::make_tuple( + std::move(stack), std::make_unique<decltype(setup::StackView{particle})>(particle)); +} + +TEST_CASE("UrQMD") { + SECTION("conversion") { + REQUIRE_THROWS(process::UrQMD::ConvertFromUrQMD(106, 0)); + REQUIRE(process::UrQMD::ConvertFromUrQMD(101, 0) == Code::Pi0); + REQUIRE(process::UrQMD::ConvertToUrQMD(Code::PiPlus) == + std::make_pair<int, int>(101, 2)); + } + + feenableexcept(FE_INVALID); + corsika::random::RNGManager::GetInstance().RegisterRandomStream("urqmd"); + UrQMD urqmd; + + SECTION("interaction length") { + auto [env, csPtr, nodePtr] = setupEnvironment(Code::Nitrogen); + auto const& cs = *csPtr; + [[maybe_unused]] auto const& env_dummy = env; + [[maybe_unused]] auto const& node_dummy = nodePtr; + + Code validProjectileCodes[] = {Code::PiPlus, Code::PiMinus, Code::Proton, + Code::Neutron, Code::KPlus, Code::KMinus, + Code::K0, Code::K0Bar, Code::K0Long}; + + for (auto code : validProjectileCodes) { + auto [stack, view] = setupStack(code, 100_GeV, nodePtr, cs); + REQUIRE(stack->getEntries() == 1); + REQUIRE(view->getEntries() == 0); + + // simple check whether the cross-section is non-vanishing + // only nuclei with available tabluated data so far + REQUIRE(urqmd.GetInteractionLength(stack->GetNextParticle()) > 1_g / square(1_cm)); + } + } + + SECTION("nucleus projectile") { + auto [env, csPtr, nodePtr] = setupEnvironment(Code::Oxygen); + [[maybe_unused]] auto const& env_dummy = env; // against warnings + [[maybe_unused]] auto const& node_dummy = nodePtr; // against warnings + + unsigned short constexpr A = 14, Z = 7; + auto [stackPtr, secViewPtr] = setupStack(A, Z, 400_GeV, nodePtr, *csPtr); + REQUIRE(stackPtr->getEntries() == 1); + REQUIRE(secViewPtr->getEntries() == 0); + + // must be assigned to variable, cannot be used as rvalue?! + auto projectile = secViewPtr->GetProjectile(); + auto const projectileMomentum = projectile.GetMomentum(); + [[maybe_unused]] process::EProcessReturn const ret = urqmd.DoInteraction(*secViewPtr); + + REQUIRE(sumCharge(*secViewPtr) == Z + GetChargeNumber(Code::Oxygen)); + + auto const secMomSum = + sumMomentum(*secViewPtr, projectileMomentum.GetCoordinateSystem()); + REQUIRE((secMomSum - projectileMomentum).norm() / projectileMomentum.norm() == + Approx(0).margin(1e-2)); + } + + SECTION("\"special\" projectile") { + auto [env, csPtr, nodePtr] = setupEnvironment(Code::Oxygen); + [[maybe_unused]] auto const& env_dummy = env; // against warnings + [[maybe_unused]] auto const& node_dummy = nodePtr; // against warnings + + auto [stackPtr, secViewPtr] = setupStack(Code::PiPlus, 400_GeV, nodePtr, *csPtr); + REQUIRE(stackPtr->getEntries() == 1); + REQUIRE(secViewPtr->getEntries() == 0); + + // must be assigned to variable, cannot be used as rvalue?! + auto projectile = secViewPtr->GetProjectile(); + auto const projectileMomentum = projectile.GetMomentum(); + + [[maybe_unused]] process::EProcessReturn const ret = urqmd.DoInteraction(*secViewPtr); + + REQUIRE(sumCharge(*secViewPtr) == + GetChargeNumber(Code::PiPlus) + GetChargeNumber(Code::Oxygen)); + + auto const secMomSum = + sumMomentum(*secViewPtr, projectileMomentum.GetCoordinateSystem()); + REQUIRE((secMomSum - projectileMomentum).norm() / projectileMomentum.norm() == + Approx(0).margin(1e-2)); + } + + SECTION("K0Long projectile") { + auto [env, csPtr, nodePtr] = setupEnvironment(Code::Oxygen); + [[maybe_unused]] auto const& env_dummy = env; // against warnings + [[maybe_unused]] auto const& node_dummy = nodePtr; // against warnings + + auto [stackPtr, secViewPtr] = setupStack(Code::K0Long, 400_GeV, nodePtr, *csPtr); + REQUIRE(stackPtr->getEntries() == 1); + REQUIRE(secViewPtr->getEntries() == 0); + + // must be assigned to variable, cannot be used as rvalue?! + auto projectile = secViewPtr->GetProjectile(); + auto const projectileMomentum = projectile.GetMomentum(); + + [[maybe_unused]] process::EProcessReturn const ret = urqmd.DoInteraction(*secViewPtr); + + REQUIRE(sumCharge(*secViewPtr) == + GetChargeNumber(Code::K0Long) + GetChargeNumber(Code::Oxygen)); + + auto const secMomSum = + sumMomentum(*secViewPtr, projectileMomentum.GetCoordinateSystem()); + REQUIRE((secMomSum - projectileMomentum).norm() / projectileMomentum.norm() == + Approx(0).margin(1e-2)); + } +} diff --git a/Processes/UrQMD/urqmd.f b/dependencies/UrQMD/urqmd.f similarity index 100% rename from Processes/UrQMD/urqmd.f rename to dependencies/UrQMD/urqmd.f diff --git a/dependencies/UrQMD/urqmdInterface.F b/dependencies/UrQMD/urqmdInterface.F new file mode 100644 index 000000000..ec2bd092a --- /dev/null +++ b/dependencies/UrQMD/urqmdInterface.F @@ -0,0 +1,447 @@ +c 18.11.2011 Link routines between UrQMD 1.3 and CONEX. +c author T. Pierog based on CORSIKA and EPOS link to UrQMD + +c adapted by M. Reininghaus for linking UrQMD to CORSIKA 8 (Apr 2019) + +#ifdef __STD__ +#define __GHEISHA__ +#define __QGSJET__ +#define __ANALYSIS__ +#endif + + +c----------------------------------------------------------------------- + subroutine IniUrQMDC8 +c----------------------------------------------------------------------- +c Primary initialization for UrQMD 1.31 +c----------------------------------------------------------------------- + implicit none +c CONEX includes +c~ #include "conex.h" +c~ #include "conex.incnex" +#ifndef __CXCORSIKA__ +c~ character*500 furqdat +c~ integer ifurqdat, nfurqdat +c~ common/urqfname/ furqdat, ifurqdat, nfurqdat + + include 'boxinc.f' + include 'inputs.f' + include 'options.f' + +c commons from coms.f + integer Ap, At, Zp, Zt, npart, nbar, nmes, ctag + integer nsteps,ranseed,event,eos,dectag,uid_cnt + integer NHardRes,NSoftRes,NDecRes,NElColl,NBlColl + common /sys/ npart, nbar, nmes, ctag,nsteps,uid_cnt, + + ranseed,event,Ap,At,Zp,Zt,eos,dectag, + + NHardRes,NSoftRes,NDecRes,NElColl,NBlColl + +c local + INTEGER i,io,ia,ie,id + CHARACTER CTPStrg(numctp)*60, CTOStrng(numcto)*60 + integer mxie,mxid,mxia + parameter (mxie=41,mxid=10,mxia=3) + character adum + double precision sig_u1,ekdummy + integer iamaxu,idmaxu,iemaxu +c~ common /cxs_u1/ sig_u1(mxie,mxid,mxia),iamaxu,idmaxu,iemaxu +c~ double precision xs(3),bim(3) +c~ c M.R.: bim added to cxs_u2 +c~ common /cxs_u2/ xs,bim + integer iudebug +c~ data bim/6.d0,6.d0,7.d0/ + integer init + data init/0/ + SAVE + + if(init.ge.1)return + init=init+1 +#ifdef __CXDEBUG__ + call utisx1('iniurqmd ',4) + write(*,'(a)')'initialize URQMD ...' +#endif + +C----------------------------------------------------------------------- + +c~ IF ( isx.ge.2 ) THEN +c~ IUDEBUG = isx-1 +c~ ELSE +c~ IUDEBUG = 0 +c~ ENDIF + + WRITE (*,*) + $ '############################################################' + WRITE (*,*) + $ '## ##' + WRITE (*,*) + $ '## UrQMD 1.3.1 University of Frankfurt ##' + WRITE (*,*) + $ '## urqmd@th.physik.uni-frankfurt.de ##' + WRITE (*,*) + $ '## ##' + WRITE (*,*) + $ '############################################################' + WRITE (*,*) + $ '## ##' + WRITE (*,*) + $ '## please cite when using this model: ##' + WRITE (*,*) + $ '## S.A.Bass et al. Prog.Part.Nucl.Phys. 41 (1998) 225 ##' + WRITE (*,*) + $ '## M.Bleicher et al. J.Phys. G25 (1999) 1859 ##' + WRITE (*,*) + $ '## ##' + WRITE (*,*) + $ '############################################################' + +C SET THE 'LARGE' CROSS-SECTIONS FOR ALL 3 TARGET ELEMENTS +c~ DO I = 1, 3 +c~ XS(I) = 10.D0 * PI * BIM(I)**2 +c~ ENDDO + +C SET NMAX TO DEFAULT VALUE + call set0 + call params + +C THIS IS THE SUBSTITUE FOR THE URQMD INPUT ROUTINE +C INITIALIZE COUNTERS + boxflag = 0 + mbflag = 0 + edens = 0.d0 + para = 0 + solid = 0 + mbox = 0 + io = 0 + +C THE FOLLOWING FLAGS CHECK, WHETHER ALL NECESSARY INPUT IS GIVEN +C PROJECTILE + prspflg = 0 +C TARGET + trspflg = 0 +C + srtflag = 0 + firstev = 0 +C EXCITATION FUNCTION + nsrt = 1 + npb = 1 + efuncflag = 0 +C DEFAULT NUMBER OF EVENTS + nevents = 1 +C DEFAULT NUMBER OF TIMESTEPS + nsteps = 1000 + +C SKIP CONDITIONS ON UNIT 13, 14, 15, 16 & 18 +C SUPPRESS ALL OUTPUT + bf13 = .true. + bf14 = .true. + bf15 = .true. + bf16 = .true. + bf18 = .true. + bf19 = .true. + bf20 = .true. +C SET DEBUG OUTPUT DEPENDING ON CHOSEN DEBUG LEVEL +C SET THE OUTPUT OF UNITS 13, 14, 15 TO THE DEBUG OUTPUT UNIT +c~ IF ( IUDEBUG .EQ. 1 ) THEN +c~ bf13 = .true. +c~ bf14 = .false. +c~ call uounit(14,IFCK) +c~ bf15 = .true. +c~ ELSEIF ( IUDEBUG .EQ. 2 ) THEN +c~ bf13 = .false. +c~ call uounit(13,IFCK) +c~ bf14 = .true. +c~ bf15 = .true. +c~ ELSEIF ( IUDEBUG .GT. 2 ) THEN +c~ bf13 = .true. +c~ bf14 = .true. +c~ bf15 = .false. +c~ call uounit(15,IFCK) +c~ ENDIF + do i = 1, numcto + CTOdc(i) = ' ' + enddo + do i = 1, numctp + CTPdc(i) = ' ' + enddo + do i = 1, maxstables + stabvec(i) = 0 + enddo + nstable = 0 + +C DEFAULT SETTINGS FOR CTParam AND CTOption +C DEFAULT SETTINGS FOR CTParam + CTParam(1)=1.d0 + CTPStrg(1)='scaling factor for decay-width' + CTParam(2)=0.52d0 + CTPStrg(2)='used for minimal stringmass & el/inel cut in makestr' + CTParam(3)=2.d0 + CTPStrg(3)='velocity exponent for modified AQM' + CTParam(4)=0.3d0 + CTPStrg(4)='transverse pion mass, used in make22 & strexct' + CTParam(5)=0.d0 + CTPStrg(5)='probabil. for quark rearrangement in cluster' + CTParam(6)=0.37d0 + CTPstrg(6)='strangeness probability' + CTParam(7)=0.d0 + CTPStrg(7)='charm probability (not yet implemented in UQMD)' + CTParam(8)=0.093d0 + CTPStrg(8)='probability to create a diquark' + CTParam(9)=0.35d0 + CTPStrg(9)='kinetic energy cut off for last string break' + CTParam(10)=0.25d0 + CTPStrg(10)='min. kinetic energy for hadron in string' + CTParam(11)=0.d0 + CTPStrg(11)='fraction of non groundstate resonances' + CTParam(12)=.5d0 + CTPStrg(12)='probability for rho 770 in String' + CTParam(13)=.27d0 + CTPStrg(13)='probability for rho 1450 (rest->rho1700)' + CTParam(14)=.49d0 + CTPStrg(14)='probability for omega 782' + CTParam(15)=.27d0 + CTPStrg(15)='probability for omega 1420(rest->om1600)' + CTParam(16)=1.0d0 + CTPStrg(16)='mass cut betw. rho770 and rho 1450' + CTParam(17)=1.6d0 + CTPSTRG(17)='mass cut betw. rho1450 and rho1700' + CTParam(18)=.85d0 + CTPStrg(18)='mass cut betw. om 782 and om1420' + CTParam(19)=1.55d0 + CTPStrg(19)='mass cut betw. om1420 and om1600' + CTParam(20)=0.0d0 + CTPStrg(20)=' distance for second projectile' + CTParam(21)=0.0d0 + CTPStrg(21)=' deformation parameter' + + CTParam(25)=.9d0 + CTPStrg(25)=' probability for diquark not to break' + CTParam(26)=50.d0 + CTPStrg(26)=' maximum trials to get string masses' + CTParam(27)=1.d0 + CTPStrg(27)=' scaling factor for xmin in string excitation' + CTParam(28)=1.d0 + CTPStrg(28)=' scaling factor for transverse fermi motion' + CTParam(29)=0.4d0 + CTPStrg(29)=' single strange di-quark suppression factor ' + CTParam(30)=1.5d0 + CTPStrg(30)=' radius offset for initialization ' + CTParam(31)=1.6d0 + CTPStrg(31)=' sigma of gaussian for tranverse momentum tranfer ' + CTParam(32)=0.d0 + CTPStrg(32)=' alpha-1 for valence quark distribution ' + CTParam(33)=2.5d0 + CTPStrg(33)=' betav for valence quark distribution (DPM)' + CTParam(34)=0.1d0 + CTPStrg(34)=' minimal x multiplied with ecm ' + CTParam(35)=3.0d0 + CTPStrg(35)=' offset for cut for the FSM ' + CTParam(36)=0.275d0 + CTPStrg(36)=' fragmentation function parameter a ' + CTParam(37)=0.42d0 + CTPStrg(37)=' fragmentation function parameter b ' + CTParam(38)=1.08d0 + CTPStrg(38)=' diquark pt scaling factor ' + CTParam(39)=0.8d0 + CTPStrg(39)=' strange quark pt scaling factor ' + CTParam(40)=0.5d0 + CTPStrg(40)=' betas-1 for valence quark distribution (LEM)' + CTParam(41)=0.d0 + CTPStrg(41)=' distance of initialization' + CTParam(42)=0.55d0 + CTPStrg(42)=' width of gaussian -> pt in string-fragmentation ' + CTParam(43)=5.d0 + CTPStrg(43)=' maximum kinetic energy in mesonic clustr ' + CTParam(44)=0.8d0 + CTPStrg(44)=' prob. of double vs. single excitation for AQM inel.' + CTParam(45)=0.5d0 + CTPStrg(45)=' offset for minimal mass generation of strings' + CTParam(46)=800000.d0 + CTPStrg(46)=' maximal number of rejections for initialization' + CTParam(47)=1.0d0 + CTPStrg(47)=' field feynman fragmentation funct. param. a' + CTParam(48)=2.0d0 + CTPStrg(48)=' field feynman fragmentation funct. param. b' + + CTParam(50)=1.d0 + CTPStrg(50)=' enhancement factor for 0- mesons' + CTParam(51)=1.d0 + CTPStrg(51)=' enhancement factor for 1- mesons' + CTParam(52)=1.d0 + CTPStrg(52)=' enhancement factor for 0+ mesons' + CTParam(53)=1.d0 + CTPStrg(53)=' enhancement factor for 1+ mesons' + CTParam(54)=1.d0 + CTPStrg(54)=' enhancement factor for 2+ mesons' + CTParam(55)=1.d0 + CTPStrg(55)=' enhancement factor for 1+-mesons' + CTParam(56)=1.d0 + CTPStrg(56)=' enhancement factor for 1-*mesons' + CTParam(57)=1.d0 + CTPStrg(57)=' enhancement factor for 1-*mesons' + CTParam(58)=1.d0 + CTPStrg(58)=' scaling factor for DP time-delay' + +C DEFAULT SETTINGS FOR CTOption + CTOption(1)=1 ! hjd1 + CTOStrng(1)=' resonance widths are mass dependent ' + CTOption(2)=0 + CTOStrng(2)=' conservation of scattering plane' + CTOption(3)=0 + CTOStrng(3)=' use modified detailed balance' + CTOption(4)=0 + CTOStrng(4)=' no initial conf. output ' + CTOption(5)=0 + CTOStrng(5)=' fixed random impact parameter' + CTOption(6)=0 + CTOStrng(6)=' no first collisions inside proj/target' + CTOption(7)=0 + CTOStrng(7)=' elastic cross-section enabled (<>0:total=inelast)' + CTOption(8)=0 + CTOStrng(8)=' extrapolate branching ratios ' + CTOption(9)=0 + CTOStrng(9)=' use tabulated pp cross-sections ' + CTOption(10)=0 + CTOStrng(10)=' enable Pauli Blocker' + CTOption(11)=0 + CTOStrng(11)=' mass reduction for cascade initialization' + CTOption(12)=0 + CTOStrng(12)=' string condition =0 (.ne.0 no strings)' + CTOption(13)=0 + CTOStrng(13)=' enhanced file16 output ' + CTOption(14)=0 + CTOStrng(14)=' cos(the) is distributet between -1..1 ' + CTOption(15)=0 + CTOStrng(15)=' allow mm&mb-scattering' + CTOption(16)=0 + CTOStrng(16)=' propagate without collisions' + CTOption(17)=0 + CTOStrng(17)=' colload after every timestep ' + CTOption(18)=0 + CTOStrng(18)=' final decay of unstable particles' + CTOption(19)=0 + CTOStrng(19)=' allow bbar annihilaion' + CTOption(20)=0 + CTOStrng(20)=' dont generate e+e- instead of bbar' + CTOption(21)=0 + CTOStrng(21)=' use field feynman frgm. function' + CTOption(22)=1 + CTOStrng(22)=' use lund excitation function' + CTOption(23)=0 + CTOStrng(23)=' lorentz contraction of projectile & targed' + CTOption(24)=2 ! 1 is default 2 means fast method + CTOStrng(24)=' Wood-Saxon initialization' + CTOption(25)=0 + CTOStrng(25)=' phase space corrections for resonance mass' + CTOption(26)=0 + CTOStrng(26)=' use z -> 1-z for diquark-pairs' + CTOption(27)=1 ! hjd1 + CTOStrng(27)=' reference frame (1=target, 2=projectile, else=cms)' + CTOption(28)=1 ! M.R. 2019-04-15 + CTOStrng(28)=' propagate spectators also ' + CTOption(29)=2 + CTOStrng(29)=' no transverse momentum in clustr ' + CTOption(30)=1 + CTOStrng(30)=' frozen fermi motion ' + CTOption(31)=0 + CTOStrng(31)=' reduced mass spectrum in string' + CTOption(32)=0 + CTOStrng(32)=' masses are distributed acc. to m-dep. widths' + CTOption(33)=0 + CTOStrng(33)=' use tables & m-dep. for pmean in fprwdt & fwidth' + CTOption(34)=1 + CTOStrng(34)=' lifetme according to m-dep. width' + CTOption(35)=1 + CTOStrng(35)=' generate high precision tables' + CTOption(36)=0 + CTOStrng(36)=' normalize Breit-Wigners with m.dep. widths ' + CTOption(37)=0 + CTOStrng(37)=' heavy quarks form di-quark clusters' + CTOption(38)=0 + CTOStrng(38)=' scale p-pbar to b-bbar with equal p_lab ' + CTOption(39)=0 + CTOStrng(39)=' dont call pauliblocker' + CTOption(40)=0 + CTOStrng(40)=' read old fort.14 file ' + CTOption(41)=0 + CTOStrng(41)=' generate extended output for cto40' + CTOption(42)=0 + CTOStrng(42)=' hadrons now have color fluctuations' + CTOption(43)=0 + CTOStrng(43)=' dont generate dimuon intead of dielectron output' + CTOption(44)=0 + CTOStrng(44)=' not used at the moment' + CTOption(45)=0 + CTOStrng(45)=' not used at the moment' + +C INITIALIZE ARRAYS FOR SPECIAL PRO/TAR COMBINATIONS + do i = 1, 2 + spityp(i) = 0 + spiso3(i) = 0 + enddo + +C INITIALIZE ARRAYS FOR SPECIAL PARTICLES + EoS = 0 + +C READ CROSS-SECTION FILES +Cdh CALL URQREC() + +C INITIALIZES SOME ARRAYS + call strini ! initialize mixing angles for meson-multipletts + call loginit + + IF ( CTOption(33) .EQ. 0 .OR. CTOption(9) .EQ. 0 ) THEN + call loadwtab(io) +c~ IF ( IUDEBUG .GT. 0 ) WRITE(IFCK,*) 'URQINI: AFTER LOADWTAB' + ENDIF + +C READ URQMD TOTAL CROSS SECTION TABLE +c +c ie=1..41 E=10.0**(float(ie)/10-1.0-0.05) (bin-middle) +c id=1..9 p,ap,n,an,pi+,pi-,K+,K-,KS +c ia=1..3 N,O,Ar +c +c~ if(ifurqdat.eq.1)then +c~ OPEN(UNIT=76,FILE=furqdat(1:nfurqdat),STATUS='OLD') +c~ else +c~ OPEN(UNIT=76,FILE='UrQMD-1.3.1-xs.dat',STATUS='OLD') +c~ endif +c~ read(76,*) adum,iamaxu,idmaxu,iemaxu +c~ do ia=1,iamaxu +c~ do id=1,idmaxu +c~ do ie=1,iemaxu +c~ read(76,*) ekdummy,sig_u1(ie,id,ia) +c~ enddo +c~ read(76,*) +c~ read(76,*) +c~ enddo +c~ enddo +c~ close(76) + +C IN CASE OF CASCADE MODE, THE POTENTIALS NEED NOT BE CALCULATED + +C CALCULATE NORMALIZATION OF RESONANCES DISTRIBUTION... + call norm_init +#endif + + +c~ xsegymin=0.25d0 + +#ifdef __CXDEBUG__ + call utisx2 +#endif + + end + +c +c M. Reininghaus, 2020-04-08 +c + integer function ReadSigmaLn(ia, ib, ic) + implicit none + + include 'comres.f' + + integer :: ia, ib, ic + + ReadSigmaLn = SigmaLn(ia, ib, ic) + + end function ReadSigmaLn diff --git a/dependencies/UrQMD/urqmd_xs.cc b/dependencies/UrQMD/urqmd_xs.cc new file mode 100644 index 000000000..79ce9c7c8 --- /dev/null +++ b/dependencies/UrQMD/urqmd_xs.cc @@ -0,0 +1,39 @@ +/* + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +// a little helper to dump UrQMD cross-sections + +#include <corsika/process/urqmd/UrQMD.h> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/random/RNGManager.hpp> + +#include <cstdlib> +#include <fstream> +#include <iostream> + +using namespace corsika; +using namespace corsika::units::si; + +int main() { + random::RNGManager::GetInstance().RegisterRandomStream("UrQMD"); + corsika::UrQMD::UrQMD urqmd; + + std::vector<Code> const projectiles{{Code::Proton, Code::AntiProton, Code::Neutron, + Code::AntiNeutron, Code::PiPlus, Code::PiMinus, + Code::KPlus, Code::KMinus, Code::K0Short}}; + + for (auto const& p : projectiles) { + std::ofstream file(std::string("xs_") + GetName(p) + ".dat"); + for (auto Elab = GetMass(p) + 200_MeV; Elab <= 10_TeV; Elab *= 1.02) { + file << Elab / 1_GeV << '\t' + << urqmd.GetTabulatedCrossSection(p, Code::Nitrogen, Elab) / 1_mb << std::endl; + } + } + + return EXIT_SUCCESS; +} diff --git a/Processes/UrQMD/whichres.f b/dependencies/UrQMD/whichres.f similarity index 100% rename from Processes/UrQMD/whichres.f rename to dependencies/UrQMD/whichres.f diff --git a/dependencies/sibyll/CMakeLists.txt b/dependencies/sibyll/CMakeLists.txt new file mode 100644 index 000000000..32c967165 --- /dev/null +++ b/dependencies/sibyll/CMakeLists.txt @@ -0,0 +1,47 @@ +#cmake_minimum_required(VERSION 3.1) +#project(Sibyll) + +set ( + MODEL_SOURCES + sibyll2.3d.cpp + sibyll2.3d.f + nuclib.f + signuc.f + gasdev.f + #rndm_dbl.f + ) + +set ( + MODEL_HEADERS + sibyll2.3d.hpp + nuclib.hpp + ) + +enable_language(Fortran) +add_library (Sibyll SHARED ${MODEL_SOURCES}) +set_property(TARGET Sibyll PROPERTY POSITION_INDEPENDENT_CODE 1) + +add_library (Sibyll_static STATIC ${MODEL_SOURCES}) +set_property(TARGET Sibyll_static PROPERTY POSITION_INDEPENDENT_CODE 1) + +target_include_directories ( + Sibyll + PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> + $<INSTALL_INTERFACE:include/include> + ) + +target_include_directories ( + Sibyll_static + PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> + $<INSTALL_INTERFACE:include/include> + ) + +target_link_libraries ( + Sibyll_static + PUBLIC + gfortran + ) + +add_dependencies (CORSIKA8 Sibyll_static) diff --git a/Processes/Sibyll/gasdev.f b/dependencies/sibyll/gasdev.f similarity index 100% rename from Processes/Sibyll/gasdev.f rename to dependencies/sibyll/gasdev.f diff --git a/Processes/Sibyll/nuclib.f b/dependencies/sibyll/nuclib.f similarity index 100% rename from Processes/Sibyll/nuclib.f rename to dependencies/sibyll/nuclib.f diff --git a/Processes/Sibyll/nuclib.h b/dependencies/sibyll/nuclib.hpp similarity index 100% rename from Processes/Sibyll/nuclib.h rename to dependencies/sibyll/nuclib.hpp diff --git a/Processes/Sibyll/rndm_dbl.f b/dependencies/sibyll/rndm_dbl.f similarity index 100% rename from Processes/Sibyll/rndm_dbl.f rename to dependencies/sibyll/rndm_dbl.f diff --git a/dependencies/sibyll/sibyll2.3d.cpp b/dependencies/sibyll/sibyll2.3d.cpp new file mode 100644 index 000000000..229ddad9c --- /dev/null +++ b/dependencies/sibyll/sibyll2.3d.cpp @@ -0,0 +1,19 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <sibyll2.3d.hpp> + +#include <cmath> + +int get_nwounded() { return s_chist_.nwd; } +double get_sibyll_mass2(int& id) { return s_mass1_.am2[std::abs(id) - 1]; } + +double s_rndm_(int&) { + return sibyll::rndm_interface(); +} + diff --git a/dependencies/sibyll/sibyll2.3d.f b/dependencies/sibyll/sibyll2.3d.f new file mode 100644 index 000000000..8fccb7a42 --- /dev/null +++ b/dependencies/sibyll/sibyll2.3d.f @@ -0,0 +1,20471 @@ +C======================================================================= +C SSSSSS IIIIIII BBBBB YY YY L L +C S I B B YY YY L L +C SSSSS I BBBBB YY L L +C S I B B YY L L +C SSSSSS IIIIIII BBBBB YY LLLLLLL LLLLLLL +C======================================================================= +C Code for SIBYLL: hadronic interaction Monte Carlo event generator +C======================================================================= +C Version 2.3d (Jun-01-2017, modified May-20-2020) +C +C with CHARM production +C +C By Eun-Joo Ahn +C Ralph Engel +C A. Fedynitch +C R.S. Fletcher +C T.K. Gaisser +C Paolo Lipari +C Felix Riehn +C Todor Stanev +C +C----------------------------------------------------------------------- +C*** Please have people who want this code contact one of the authors. +C*** Please report any problems. **** +C +C For a correct copy contact: +C sein@fnal.gov +C ralph.engel@kit.edu +C afedynitch@gmail.com +C gaisser@bartol.udel.edu +C paolo.lipari@roma1.infn.it +C friehn@lip.pt +C stanev@bartol.udel.edu +C +C last changes relative to Sibyll 2.3c: +C * no pi0 suppression in minijets +C * added cross section tables for hadron-nitrogen and hadron-oxygen +C (changed S_CCSIG common) +C * no remnant in high mass diff. events (pi0-had scattering) +C * repaired had-nuc. cross section routine for kaon beams +C routine remains inactive in ordinary calls. +C +C======================================================================= + + SUBROUTINE SIBYLL (K_beam, IATARG, Ecm) + +C----------------------------------------------------------------------- +C...Main routine for the production of hadronic events, +C. generates an inelastic hadronic interaction of +C. a `projectile particle' of code K_beam with a +C. target nucleus of mass number A = IATARG (integer) +C. IATARG = 0 is an "air" nucleus (superposition of oxygen and nitrogen) +C. with c.m. energy for the hadron-nucleon system Ecm (GeV) +C. +C. Allowed values of K_beam: 7,8,9,10,11,12,13,14,-13,-14 +C. pi+-,K+-,KL,KS,p,n,pbar,nbar +C. also: +C. hyperons: 34,35,36,37,38,39 +C. Sig+-,Sig0,Xi0-,Lam0 +C. +C. charmed: 59,60,71,72,74,75 +C. D+,D-,D0,D0b,Ds+,Ds- +C. 87,88,89,99 +C. Xic+,Xic0,LamC+,OmC0 +C. rho0:27 is allowed as well to emulate photons! +C. +C. The output is contained in COMMON /S_PLIST/ that contains: +C. +C. NP number of final particles +C. P(1:NP, 1:5) 4-momenta + masses of the final particles +C. LLIST (1:NP) codes of final particles. +C. the reaction is studied in the c.m. of hadron-nucleon system +C. +C. The COMMON block /S_CHIST/ contains information about +C. the structure of the generated event: +C. NW = number of wounded nucleons +C. NJET = total number of hard interactions +C. NSOF = total number of soft interactions +C. NNSOF (1:NW) = number of soft pomeron cuts in each interaction +C. NNJET (1:NW) = number of minijets produced in each interaction +C. XJ1 (1:Index) = x1 for each string +C. XJ2 (1:Index) = x2 " " " +C. PTJET (1:Index) = pT " " " +C. NNPJET (1:Index) = total number of particles in each string +C. NNPSTR (1:2*NW) = number of particles in each `beam string' +C. JDIF(1:NW) = diffraction code +C---------------------------------------------------------------------- + IMPLICIT NONE +c external type declarations + DOUBLE PRECISION ECM + INTEGER K_beam, IATARG + +c COMMONs + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER LDIFF + COMMON /S_CLDIF/ LDIFF +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + INTEGER NW_max + PARAMETER (NW_max = 20) +C parameters that represent: NW: max. number of wounded nucleons, +C NS,NH: max. number of soft and hard interactions +c PARAMETER (NW_max = 20) +C The COMMON block /S_CHIST/ contains information about the +C the structure of the generated event: +C NWD = number of wounded nucleons +C NJET = total number of hard interactions +C NSOF = total number of soft interactions +C NNSOF (1:NW) = number of soft pomeron cuts in each interaction +C NNJET (1:NW) = number of minijets produced in each interaction +C JDIF(1:NW) = diffraction code +C 0 : non-diff, +C 1 : beam-diff +C 2 : target-diff +C 3 : double-diff + INTEGER NNSOF,NNJET,JDIF,NWD,NJET,NSOF + COMMON /S_CHIST/ NNSOF(NW_max),NNJET(NW_max), + & JDIF(NW_max),NWD,NJET,NSOF + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + +c internal type declarations + DOUBLE PRECISION Esum,PXsum,PYsum,PZsum,xchgRate + INTEGER LL,IATARGET,IAIR,KBM,L,NW,IREJ,NF,J + DIMENSION LL(99) + SAVE + DATA LL /5*0,7*2,2*1,12*0,2,6*0,6*1,19*0,2,2,10*0, + & 2,2,0,2,2,11*0,1,1,1,9*0,1/ + + if(Ndebug.gt.0)then + WRITE(LUN,'(A42,I3,I3,1X,F10.2)') + & ' SIBYLL: called with (K_beam,IATARG,Ecm):', + & K_beam,IATARG,Ecm + WRITE(LUN,*)'Event type selection LDIFF: ',LDIFF + endif + + 100 CONTINUE + + Ncall = Ncall+1 + + IATARGET = IATARG + IAIR = IABS(MIN(IATARG-1,0)) + KBM = K_beam + + CALL INI_EVENT(ECM,KBM,IATARGET,1) + + L = LL(IABS(K_beam)) + IF(L.eq.0) THEN + WRITE(LUN,*)'SIB_MAIN: unknown beam particle! kbeam=',k_beam + WRITE(6,*)'SIB_MAIN: unknown beam particle! kbeam=',k_beam + CALL SIB_REJECT('SIB_MAIN ') + endif + +C...Generate number NW wounded nucleons, and diffraction code. + +1000 continue + CALL SIB_START_EV (Ecm, L, IATARGET, IAIR, NWD, JDIF) + NW = NWD +C...limits on simulation of pure diffraction dissociation + IF((LDIFF.NE.0).and.(NW.EQ.1)) THEN + IF((LDIFF.EQ.-1) .AND. (JDIF(1).NE.0) ) GOTO 1000 + IF((LDIFF.EQ. 1) .AND. ((JDIF(1).NE.0).AND.(JDIF(1).NE.3))) + + GOTO 1000 + IF((LDIFF.EQ. 5) .AND. (JDIF(1).EQ.2)) GOTO 1000 + IF((LDIFF.GE. 2) .AND. (LDIFF.LE.4)) THEN + JDIF(1) = LDIFF-1 + ENDIF + ENDIF + +C...Diffractive/non-diffractive interactions + + IF((NW.EQ.1).and.(JDIF(1).NE.0)) THEN + CALL SIB_DIFF (KBM, JDIF(1), Ecm, 1, IREJ) + ELSE + CALL SIB_NDIFF (KBM, NW, Ecm, 1, IREJ) + ENDIF + + IF (IREJ.NE.0) THEN + if(Ndebug.gt.0) WRITE(LUN,'(A38,F10.2,I3,I3,I3)') + & ' SIBYLL: rejection (Ecm,Ncall,Nw,JDIF):',Ecm,Ncall,NW,JDIF(1) + GOTO 100 + ENDIF + + do J=1,NP + if (P(J,4).lt.0.D0 ) then + if(Ndebug.gt.0)then + WRITE(LUN,*)' negative energy particle!' , P(J,4) + CALL SIB_LIST(LUN) + endif + goto 100 + endif + enddo + +C...Check energy-momentum conservation + + CALL PFSUM(1,NP,Esum,PXsum,PYsum,PZsum,NF) + IF (ABS(Esum/(0.5D0*Ecm*DBLE(NW+1)) - 1.D0) .GT. EPS3) THEN + WRITE(LUN,*) ' SIBYLL: energy not conserved (L,call): ',L,Ncall + WRITE(LUN,*) ' sqs_inp = ', Ecm, ' sqs_out = ', Esum + CALL PRNT_PRTN_STCK + CALL SIB_LIST(LUN) + WRITE(LUN,*) ' SIBYLL: event rejected' +c a = -1.D0 +c a = log(a) +c stop + goto 100 + ENDIF + IF (ABS(PZsum+0.5D0*Ecm*DBLE(NW-1)) .GT. 0.1D0) THEN + if(Ndebug.gt.0)THEN + WRITE(LUN,*) ' SIBYLL: momentum not conserved (L,call): ', + & L,Ncall + WRITE(LUN,*) ' pz_inp = ', 0., ' pz_out = ', pzsum + ENDIF + IF(ndebug.gt.0)then + CALL PRNT_PRTN_STCK + CALL SIB_LIST(LUN) + WRITE(LUN,*) ' SIBYLL: event rejected' + endif +c a = -1.D0 +c a = log(a) +c stop + goto 100 + ENDIF + +c exchange pions with vector mesons + IF(IPAR(45).ne.0) then + xchgRate = PAR(75) + CALL FORCE_VECTORS(xchgRate,1,NP) + endif + +c exchange pi0 with charged pions for meson projectiles + IF(IPAR(50).ne.0.and.IABS(KBM).lt.13) then + xchgrate = PAR(136) + CALL REMOVE_PI0(xchgRate,1,NP) + endif + + +C...list final state particles + if(Ndebug.gt.10) CALL SIB_LIST(LUN) + + END + + +C====================================================================== + + SUBROUTINE SIBNUC (IAB, IATG, ECM) + +C----------------------------------------------------------------------- +C. Routine that generates the interaction of a nucleus of +C. mass number IAB with a target nucleus of mass IATG +C. (IATG=0 : air). +C. SQS (GeV) is the center of mass energy of each +C. nucleon - nucleon cross section +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + COMMON /S_PLNUC/ PA(5,40000), LLA(40000), NPA + COMMON /CKFRAG/ KODFRAG + PARAMETER (IAMAX=56) + COMMON /CNUCMS/ B, BMAX, NTRY, NA, NB, NI, NAEL, NBEL + + ,JJA(IAMAX), JJB(IAMAX), JJINT(IAMAX,IAMAX) + + ,JJAEL(IAMAX), JJBEL(IAMAX) + COMMON /FRAGMENTS/ PPP(3,60) + DIMENSION SIGDIF(3) + DIMENSION IAF(60) + DOUBLE PRECISION FOX + SAVE + DATA FOX /0.21522D0/ !atomic percentage of 'non-nitrogen' in air + +C...Target mass + IF (IATG .EQ. 0) THEN +c select target IATARGET from air composition + R = S_RNDM(0) + IATARGET = 14 + IF (R .LT. FOX) IATARGET = 16 + ELSE + IATARGET = IATG + ENDIF + +C...Single nucleon (proton) case + + IF (IAB .EQ. 1) THEN + NPA = 0 + CALL SIBYLL (13,IATARGET, ECM) + CALL DECSIB + DO J=1,NP + LA = IABS(LLIST(J)) + IF (LA .LT. 10000) THEN + NPA = NPA + 1 + LLA(NPA) = LLIST(J) + DO K=1,5 + PA(K,NPA) = P(J,K) + ENDDO + ENDIF + ENDDO + RETURN + ENDIF + + +C...Nuclei + + CALL SIB_SIGMA_HP(1,ECM,SIGT,SIGEL,SIG0,SIGDIF,SLOPE,RHO) + CALL INT_NUC (IATARGET, IAB, SIG0, SIGEL) + +C...fragment spectator nucleons + NBT = NB + NBEL + IF (KODFRAG .EQ. 1) THEN + CALL FRAGM1(IAB,NBT, NF, IAF) + ELSE IF(KODFRAG .EQ. 2) THEN + CALL FRAGM2(IAB,NBT, NF, IAF) + ELSE + CALL FRAGM (IATARGET, IAB, NBT,B, NF, IAF) + ENDIF + +C...Spectator fragments + NPA = 0 + DO J=1,NF + NPA = NPA+1 + if(NPA.gt.40000) then + write(6,'(1x,a,2i8)') + & ' SIBNUC: no space left in S_PLNUC (NPA,NF)',NPA,NF + NPA = NPA-1 + return + endif + LLA(NPA) = 1000+IAF(J) + PA(1,NPA) = 0.D0 + PA(2,NPA) = 0.D0 + PA(3,NPA) = ECM/2.D0 + PA(4,NPA) = ECM/2.D0 + PA(5,NPA) = DBLE(IAF(J))*0.5D0*(AM(13)+AM(14)) + ENDDO + +C...Elastically scattered fragments + DO J=1,NBEL + NPA = NPA+1 + if(NPA.gt.40000) then + write(6,'(1x,a,2i8)') + & ' SIBNUC: no space left in S_PLNUC (NPA,NBEL)',NPA,NBEL + NPA = NPA-1 + return + endif + LLA(NPA) = 1001 + PA(1,NPA) = 0.D0 + PA(2,NPA) = 0.D0 + PA(3,NPA) = ECM/2.D0 + PA(4,NPA) = ECM/2.D0 + PA(5,NPA) = 0.5D0*(AM(13)+AM(14)) + ENDDO + +C...Superimpose NB nucleon interactions + DO JJ=1,NB + CALL SIBYLL (13,IATARGET, ECM) + CALL DECSIB + DO J=1,NP + LA = IABS(LLIST(J)) + IF (LA .LT. 10000) THEN + NPA = NPA + 1 + if(NPA.gt.40000) then + write(6,'(1x,a,2i8)') + & ' SIBNUC: no space left in S_PLNUC (NPA,NP)',NPA,NP + NPA = NPA-1 + return + endif + LLA(NPA) = LLIST(J) + DO K=1,5 + PA(K,NPA) = P(J,K) + ENDDO + ENDIF + ENDDO + ENDDO + + END +C======================================================================= + + SUBROUTINE SIBYLL_INI + +C----------------------------------------------------------------------- +C...Initialization routine for SYBILL +C. +C. the routine fills the COMMON block /CCSIG/ that contains +C. important information for the generation of events +C. +C PARAMETER (NS_max = 20, NH_max = 80) +C COMMON /S_CCSIG/ SSIG(61,3), PJETC(0:NS_max,0:NH_max,61,2), +C & SSIGN(61,3,3),SSIGNSD(61,3,3) ALINT(61,3,3), ASQSMIN, ASQSMAX, DASQS, NSQS +C. +C. NSQS = number of energy points (61 is current version) +C. ASQSMIN = log_10 [sqrt(s) GeV] minimum value +C. ASQSMIN = log_10 [sqrt(s) GeV] maximum value +C. DASQS = step in log_10[sqrt(s)] +C. DASQS = (ASQSMAX - ASQSMIN)/(NSQS-1) +C. +C. SSIG(J,1) inelastic cross section for pp interaction +C. at energy: sqrt(s)(GeV) = 10**[ASQSMIN+DASQS*(J-1)] +C. SSIG(J,2) inelastic cross section for pi-p interaction +C. SSIGN(J,1,1) inelastic cross section for p-Air interaction +C. SSIGN(J,2,1) inelastic cross section for pi-Air interaction +C. SSIGN(J,1,2) inelastic cross section for p-Nitrogen interaction +C. SSIGN(J,2,2) inelastic cross section for pi-Nitrogen interaction +C. +C. PJETC(n_s,n_j,J,1) Cumulative probability distribution +C. for the production of n_s soft interactions and +C. n_j (n_j=0:30) jet pairs at sqrt(s) labeled +C. by J, for p-p interaction +C. PJETC(n_s,n_j,J,2) Same as above for pi-p interaction +C. ALINT(J,1) proton-air interaction length (g cm-2) +C. ALINT(J,2) pi-air interaction length (g cm-2) +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + SAVE + + WRITE(*,100) + 100 FORMAT(' ','====================================================', + * /,' ','| |', + * /,' ','| S I B Y L L 2.3d |', + * /,' ','| |', + * /,' ','| HADRONIC INTERACTION MONTE CARLO |', + * /,' ','| BY |', + * /,' ','| Eun-Joo AHN, Felix RIEHN |', + * /,' ','| R. ENGEL, A. FEDYNITCH, R.S. FLETCHER, |', + * /,' ','| T.K. GAISSER, P. LIPARI, T. STANEV |', + * /,' ','| |', + * /,' ','| Publication to be cited when using this program: |', + * /,' ','| Eun-Joo AHN et al., Phys.Rev. D80 (2009) 094003 |', + * /,' ','| F. RIEHN et al., hep-ph: 1912.03300 |', + * /,' ','| last modifications: F. Riehn (05/20/2020) |', + * /,' ','====================================================', + * /) + + CALL PAR_INI + CALL DIFF_INI + CALL JET_INI + CALL PDF_INI + CALL BLOCK_INI + CALL NUC_GEOM_INI + CALL SIG_AIR_INI + +c... charm frag. normalisation + CALL ZNORMAL + + END + +C======================================================================= + + SUBROUTINE NO_CHARM + IMPLICIT NONE + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) +c turn off charm production +c global charm rate + PAR(24) = 0.D0 +c minijet string charm rate + PAR(156) = 0.D0 +c remnant string charm rate + PAR(107) = 0.D0 +c soft sea charm rate + PAR(97) = 0.D0 +c valence string charm rate + PAR(25) = 0.D0 +c minijet charm rate + PAR(27) = 0.D0 + END + +C======================================================================= + + SUBROUTINE PAR_INI + + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + DOUBLE PRECISION FAin, FB0in + COMMON /S_CZDIS/ FAin, FB0in + + DOUBLE PRECISION FAs1, fAs2 + COMMON /S_CZDISs/ FAs1, fAs2 + DOUBLE PRECISION ZDMAX, EPSI + COMMON /S_CZDISc/ ZDMAX, EPSI + + DOUBLE PRECISION CLEAD, FLEAD + COMMON /S_CZLEAD/ CLEAD, FLEAD + DOUBLE PRECISION CCHIK + COMMON /S_CPSPL/ CCHIK(4,99) + + PARAMETER ( NPARFIT = 22 ) + DOUBLE PRECISION PARS + COMMON /XSCTN_FIT/ PARS( 50 , 2 ) + DOUBLE PRECISION STR_mass_val, STR_mass_val_hyp, STR_mass_sea + COMMON /S_CUTOFF/ STR_mass_val, STR_mass_val_hyp, STR_mass_sea + SAVE + DATA (PARS(K,1),K= 1,NPARFIT) / + &3.9223D+01,4.2055D+01,5.0913D-02,-4.0000D-01,2.0000D-01, + &5.0000D-01,0.0000D+00,6.0000D-01,9.0000D-02,1.0000D+00, + &2.0000D+00,3.2327D+00,2.5000D-01,5.4000D-01,1.0000D+00, + &-8.8000D-01,5.4000D-01,5.0000D-01,9.0000D-01,5.4000D-01, + &6.5000D-02,9.0000D-01/ + DATA (PARS(K,2),K= 1,NPARFIT) / + &2.0590D+01,9.6579D+01,5.6069D-02,-7.6393D-01,2.0000D-01, + &5.0000D-01,0.0000D+00,6.0000D-01,9.0000D-02,1.0000D+00, + &2.0000D+00,2.9191D+00,2.5000D-01,5.4000D-01,1.0000D+00, + &-8.8000D-01,5.4000D-01,5.4895D-01,9.0000D-01,5.4000D-01, + &6.5000D-02,9.0000D-01/ +c +c adjusted central particle production +c 23rc5.4frgB1 aka retune5 aka Sibyll 2.3.5 + PAR(1) = 4.0000D-02 + PAR(2) = 2.5000D-01 + PAR(3) = 5.0000D-01 + PAR(4) = 1.4000D-01 + PAR(5) = 3.0000D-01 + PAR(6) = 3.0000D-01 + PAR(7) = 1.5000D-01 + PAR(8) = 1.3903D-02 + PAR(9) = 7.0000D+00 + PAR(10) = 1.0000D+00 + PAR(11) = 6.5000D-02 + PAR(12) = 9.0000D-01 + PAR(13) = 1.0000D-01 + PAR(14) = 6.0000D-02 + PAR(15) = 1.3000D-01 + PAR(16) = 4.0000D-02 + PAR(17) = 4.0000D-02 + PAR(18) = 5.0000D-01 + PAR(19) = 8.0000D-01 + PAR(20) = 8.0000D-01 + PAR(21) = 6.0000D-01 + PAR(22) = 4.0000D+00 + PAR(23) = 7.0000D-01 + PAR(24) = 4.0000D-03 + PAR(25) = 4.0000D-03 + PAR(26) = 2.0000D+01 + PAR(27) = 2.0000D-02 + PAR(28) = 2.0000D+01 + PAR(29) = 0.0000D+00 + PAR(30) = 2.0000D+00 + PAR(31) = 3.3000D-01 + PAR(32) = 0.0000D+00 + PAR(33) = 1.0000D-01 + PAR(34) = 0.0000D+00 + PAR(35) = 0.0000D+00 + PAR(36) = 7.0000D-01 + PAR(37) = 0.0000D+00 + PAR(38) = 5.0000D-01 + PAR(39) = 8.0000D-01 + PAR(40) = 0.0000D+00 + PAR(41) = 1.0000D+00 + PAR(42) = 0.0000D+00 + PAR(43) = 2.3564D-01 + PAR(44) = 9.9000D-01 + PAR(45) = 1.0000D+00 + PAR(46) = 1.8000D-01 + PAR(47) = 2.8000D-01 + PAR(48) = 2.7000D-01 + PAR(49) = 1.0000D-01 + PAR(50) = 6.0000D-01 + PAR(51) = 6.0000D-03 + PAR(52) = 6.0000D-03 + PAR(53) = 6.0000D+00 + PAR(54) = 2.0000D-01 + PAR(55) = 0.0000D+00 + PAR(56) = 0.0000D+00 + PAR(57) = 0.0000D+00 + PAR(58) = 0.0000D+00 + PAR(59) = 6.8345D-01 + PAR(60) = 8.0000D-01 + PAR(61) = 6.6000D-01 + PAR(62) = 0.0000D+00 + PAR(63) = 1.0000D+00 + PAR(64) = 2.5000D-01 + PAR(65) = 3.0000D-01 + PAR(66) = 3.0000D-01 + PAR(67) = 6.0000D-01 + PAR(68) = 6.0000D-03 + PAR(69) = 5.0000D-02 + PAR(70) = 7.0000D-03 + PAR(71) = 1.0000D+00 + PAR(72) = 3.8000D-01 + PAR(73) = 5.0000D-01 + PAR(74) = 6.0000D-01 + PAR(75) = 0.0000D+00 + PAR(76) = 3.5298D-01 + PAR(77) = 7.0000D-01 + PAR(78) = 2.0000D+00 + PAR(79) = 1.0000D+01 + PAR(80) = 5.0816D-01 + PAR(81) = 1.0000D+04 + PAR(82) = 1.0000D-01 + PAR(83) = 0.0000D+00 + PAR(84) = 6.0000D+00 + PAR(85) = 1.0000D+00 + PAR(86) = 1.0000D+00 + PAR(87) = 3.0000D-01 + PAR(88) = 8.0000D-01 + PAR(89) = 6.0000D-01 + PAR(90) = 1.1000D+01 + PAR(91) = -7.2000D+00 + PAR(92) = 3.5000D+00 + PAR(93) = 1.0000D+00 + PAR(94) = 4.0000D+00 + PAR(95) = 0.0000D+00 + PAR(96) = 1.0000D+00 + PAR(97) = 2.0000D-03 + PAR(98) = 1.5000D+00 + PAR(99) = 5.0000D-01 + PAR(100) = 2.0000D+00 + PAR(101) = 1.0000D+00 + PAR(102) = 0.0000D+00 + PAR(103) = 2.0000D+00 + PAR(104) = 4.0000D-01 + PAR(105) = 1.0000D-01 + PAR(106) = 0.0000D+00 + PAR(107) = 0.0000D+00 + PAR(108) = 0.0000D+00 + PAR(109) = 2.0000D+01 + PAR(110) = 1.5000D+00 + PAR(111) = 0.0000D+00 + PAR(112) = 7.0000D-01 + PAR(113) = 8.0000D-01 + PAR(114) = 2.0000D+00 + PAR(115) = 0.0000D+00 + PAR(116) = 1.0000D+00 + PAR(117) = 0.0000D+00 + PAR(118) = 5.0000D-03 + PAR(119) = 0.0000D+00 + PAR(120) = 1.0000D+00 + PAR(121) = 3.0000D-01 + PAR(122) = 0.0000D+00 + PAR(123) = 3.0000D-01 + PAR(124) = 1.0000D+00 + PAR(125) = 1.0000D+00 + PAR(126) = 1.0000D+00 + PAR(127) = 6.0000D+00 + PAR(128) = 1.0000D+00 + PAR(129) = 8.0000D-02 + PAR(130) = 1.2000D+01 + PAR(131) = 5.0000D-01 + PAR(132) = 5.0000D-01 + PAR(133) = 1.0000D+01 + PAR(134) = -5.0000D+00 + PAR(135) = 6.0000D+00 + PAR(136) = 0.0000D+00 + PAR(137) = 1.2000D+00 + PAR(138) = 0.0000D+00 + PAR(139) = 5.0000D-01 + PAR(140) = 4.5000D-01 + PAR(141) = 1.5000D+00 + PAR(142) = 0.0000D+00 + PAR(143) = 5.0000D-01 + PAR(144) = 9.5000D-01 + PAR(145) = 8.5000D-01 + PAR(146) = 0.0000D+00 + PAR(147) = 3.0000D-01 + PAR(148) = 5.0000D-01 + PAR(149) = 3.0000D-01 + PAR(150) = 4.0000D-03 + PAR(151) = 2.0000D+00 + PAR(152) = 4.0000D+00 + PAR(153) = 1.0000D+01 + PAR(154) = 3.0000D-01 + PAR(155) = 0.0000D+00 + PAR(156) = 5.0000D-01 + PAR(157) = 8.0000D-01 + PAR(158) = 0.0000D+00 + PAR(159) = 0.0000D+00 + PAR(160) = 0.0000D+00 + PAR(161) = 0.0000D+00 + PAR(162) = 0.0000D+00 + PAR(163) = 0.0000D+00 + PAR(164) = 0.0000D+00 + PAR(165) = 0.0000D+00 + PAR(166) = 0.0000D+00 + PAR(167) = 0.0000D+00 + PAR(168) = 0.0000D+00 + PAR(169) = 0.0000D+00 + PAR(170) = 0.0000D+00 + PAR(171) = 0.0000D+00 + PAR(172) = 0.0000D+00 + PAR(173) = 0.0000D+00 + PAR(174) = 0.0000D+00 + PAR(175) = 0.0000D+00 + PAR(176) = 0.0000D+00 + PAR(177) = 0.0000D+00 + PAR(178) = 0.0000D+00 + PAR(179) = 0.0000D+00 + PAR(180) = 0.0000D+00 + PAR(181) = 0.0000D+00 + PAR(182) = 0.0000D+00 + PAR(183) = 0.0000D+00 + PAR(184) = 0.0000D+00 + PAR(185) = 0.0000D+00 + PAR(186) = 0.0000D+00 + PAR(187) = 0.0000D+00 + PAR(188) = 0.0000D+00 + PAR(189) = 0.0000D+00 + PAR(190) = 0.0000D+00 + PAR(191) = 0.0000D+00 + PAR(192) = 0.0000D+00 + PAR(193) = 0.0000D+00 + PAR(194) = 0.0000D+00 + PAR(195) = 0.0000D+00 + PAR(196) = 0.0000D+00 + PAR(197) = 0.0000D+00 + PAR(198) = 0.0000D+00 + PAR(199) = 0.0000D+00 + PAR(200) = 0.0000D+00 + IPAR(1) = 1 + IPAR(2) = 0 + IPAR(3) = 8 + IPAR(4) = 0 + IPAR(5) = 1 + IPAR(6) = 0 + IPAR(7) = 0 + IPAR(8) = 1 + IPAR(9) = 1 + IPAR(10) = 1 + IPAR(11) = 0 + IPAR(12) = 3 + IPAR(13) = 0 + IPAR(14) = -2 + IPAR(15) = 9 + IPAR(16) = 8 + IPAR(17) = 1 + IPAR(18) = 4 + IPAR(19) = 1 + IPAR(20) = 0 + IPAR(21) = 0 + IPAR(22) = 0 + IPAR(23) = 0 + IPAR(24) = 0 + IPAR(25) = 1 + IPAR(26) = 0 + IPAR(27) = 0 + IPAR(28) = 4 + IPAR(29) = 1 + IPAR(30) = 0 + IPAR(31) = 1 + IPAR(32) = 0 + IPAR(33) = 0 + IPAR(34) = 0 + IPAR(35) = 0 + IPAR(36) = 1 + IPAR(37) = 0 + IPAR(38) = 1 + IPAR(39) = 0 + IPAR(40) = 0 + IPAR(41) = 0 + IPAR(42) = 3 + IPAR(43) = 1 + IPAR(44) = 0 + IPAR(45) = 0 + IPAR(46) = 2 + IPAR(47) = 6 + IPAR(48) = 1 + IPAR(49) = 4 + IPAR(50) = 0 + IPAR(51) = 2 + IPAR(52) = 0 + IPAR(53) = 1 + IPAR(54) = 0 + IPAR(55) = 0 + IPAR(56) = 0 + IPAR(57) = 1 + IPAR(58) = 3 + IPAR(59) = 1 + IPAR(60) = 0 + IPAR(61) = 100 + IPAR(62) = 1 + IPAR(63) = 0 + IPAR(64) = 0 + IPAR(65) = 1 + IPAR(66) = 3 + IPAR(67) = 0 + IPAR(68) = 0 + IPAR(69) = 1 + IPAR(70) = 1 + IPAR(71) = 0 + IPAR(72) = 0 + IPAR(73) = 0 + IPAR(74) = 1 + IPAR(75) = 0 + IPAR(76) = 0 + IPAR(77) = 0 + IPAR(78) = 2 + IPAR(79) = 1 + IPAR(80) = 1 + IPAR(81) = 5 + IPAR(82) = 2 + IPAR(83) = 0 + IPAR(84) = 2 + IPAR(85) = 1 + IPAR(86) = 0 + IPAR(87) = 3 + IPAR(88) = 1 + IPAR(89) = 0 + IPAR(90) = 1 + IPAR(91) = 0 + IPAR(92) = 1 + IPAR(93) = 1 + IPAR(94) = 0 + IPAR(95) = 1 + IPAR(96) = 0 + IPAR(97) = 0 + IPAR(98) = 0 + IPAR(99) = 0 + IPAR(100) = 0 + +C... valence quark distribution function +c large x suppression + do i=1,3 ! quark flavors + CCHIK(i,13)=PAR(62) + CCHIK(i,14)=PAR(62) + enddo +C...string fragmentation parameters +c effective quark mass + STR_mass_val = PAR(36) + STR_mass_sea = PAR(41) + +C...energy dependence of PTmin +c pt_cut offset + PAR(10) = PARS(10 , 1) +c lambda + PAR(11) = PARS(21 , 1) +c c parameter + PAR(12) = PARS(22 , 1) + +C...fragmentation function + FAin = PAR(20) + FB0in = PAR(21) + +C...Strange fragmentation function + FAs1 = PAR(35) + FAs2 = PAR(35) + +C...leading baryon fragmentation function +c hard proton mixing + CLEAD = PAR(50) + + END +C======================================================================= + + SUBROUTINE PAR_INI_FROM_FILE + IMPLICIT NONE +c locals + CHARACTER*10 FILENA + CHARACTER*6 CNAME + CHARACTER*70 NUMBER + + INTEGER ISTAT,J,IVAL,I + DOUBLE PRECISION VAL +c commons + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + + DOUBLE PRECISION STR_mass_val, STR_mass_val_hyp, STR_mass_sea + COMMON /S_CUTOFF/ STR_mass_val, STR_mass_val_hyp, STR_mass_sea + + DOUBLE PRECISION FAin, FB0in + COMMON /S_CZDIS/ FAin, FB0in + + DOUBLE PRECISION FAs1, fAs2 + COMMON /S_CZDISs/ FAs1, fAs2 + DOUBLE PRECISION ZDMAX, EPSI + COMMON /S_CZDISc/ ZDMAX, EPSI + + DOUBLE PRECISION CLEAD, FLEAD + COMMON /S_CZLEAD/ CLEAD, FLEAD + DOUBLE PRECISION CCHIK + COMMON /S_CPSPL/ CCHIK(4,99) + + SAVE + DATA FILENA /'sibyll.par'/ + 14 FORMAT(A6,A70) + 15 FORMAT(A5,I3,A2,I8) + 16 FORMAT(A5,I3,A2,F8.2) + OPEN(unit=4,file=filena,status='OLD') + istat = 1 +c set standard parameters (full set) + CALL PAR_INI +c read new parameters from file + IF(ndebug.gt.0)WRITE(LUN,*)'reading parameter file: sibyll.par' + DO WHILE (istat.ge.0) + READ(4,14,iostat=ISTAT) CNAME,NUMBER + IF(CNAME.eq.'IPAR ')THEN + READ(NUMBER,*) j, ival + IF(ndebug.gt.1)write(LUN,15) 'IPAR(',j,')=', ival + IPAR(J) = iVAL + ELSEif(CNAME.eq.'PAR ')THEN + READ(NUMBER,*) j, val + PAR(J) = VAL + IF(ndebug.gt.1)write(LUN,16) ' PAR(',j,')=', val + ELSE + WRITE(LUN,*)'wrong format in parameter file!' + WRITE(6,*)'wrong format in parameter file!' + WRITE(LUN,*) CNAME, NUMBER + stop + ENDIF + ENDDO +C copy parameter values to their respective COMMONs +C... valence quark distribution function +c large x suppression + do i=1,3 ! quark flavors + CCHIK(i,13)=PAR(62) + CCHIK(i,14)=PAR(62) + enddo +C...string fragmentation parameters +c effective quark mass + STR_mass_val = PAR(36) + STR_mass_sea = PAR(41) +C...fragmentation function + FAin = PAR(20) + FB0in = PAR(21) +C...Strange fragmentation function + FAs1 = PAR(35) + FAs2 = PAR(35) +C...leading baryon fragmentation function +c hard proton mixing + CLEAD = PAR(50) + END + +C======================================================================= + + SUBROUTINE MESON_FLV_MRG_INI + +C----------------------------------------------------------------------- +c change flavor merging for pions (favor spin) +C----------------------------------------------------------------------- + INTEGER KFLV + COMMON /S_KFLV/ KFLV(4,43) + +c pi+ --> rho+ + KFLV(2,1) = 25 +c pi- --> rho- + KFLV(1,2) = 26 +c pi0 --> rho0 + KFLV(1,1) = 27 + KFLV(2,2) = 27 + END +C======================================================================= + + BLOCK DATA PARAM_INI + +C----------------------------------------------------------------------- +C....This block data contains default values +C. of the parameters used in fragmentation +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + DOUBLE PRECISION STR_mass_val, STR_mass_val_hyp, STR_mass_sea + COMMON /S_CUTOFF/ STR_mass_val, STR_mass_val_hyp, STR_mass_sea + DOUBLE PRECISION FAin, FB0in + COMMON /S_CZDIS/ FAin, FB0in + + DOUBLE PRECISION FAs1, fAs2 + COMMON /S_CZDISs/ FAs1, fAs2 + DOUBLE PRECISION ZDMAX, EPSI + COMMON /S_CZDISc/ ZDMAX, EPSI + + DOUBLE PRECISION CLEAD, FLEAD + COMMON /S_CZLEAD/ CLEAD, FLEAD + DOUBLE PRECISION CCHIK + COMMON /S_CPSPL/ CCHIK(4,99) + + INTEGER ITRY, NREJ + COMMON /S_CNT/ ITRY(20), NREJ(20) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + COMMON /CKFRAG/ KODFRAG + SAVE + + DATA ITRY /20*0/ + DATA NREJ /5,5,20,10,20,20,14*0/ + DATA EPS3,EPS5,EPS8,EPS10 /1.D-3,1.D-5,1.D-8,1.D-10/ + DATA PI,TWOPI,CMBARN/3.14159265358979D0,6.283185308D0,0.389385D0/ + DATA FACN /2.D0,5.D0,15.D0,60.D0,250.D0,1500.D0,12000.D0, + & 120000.D0/ + +C... default output unit + DATA LUN /7/ +c...new fragmentation for charmed particles + DATA EPSI /2.D0/ +C...mass cutoff for soft strings + data STR_mass_val /0.35D0/ + data STR_mass_val_hyp /0.4D0/ + data STR_mass_sea /1.D0/ +C...Longitudinal Fragmentation function + DATA FAin /0.5D0/, FB0in /0.8D0/ +C...Longitudinal Fragmentation function for leading baryons + DATA CLEAD /0.6D0/, FLEAD /0.6D0/ +c strange fragmentation + data FAs1 /3.D0/, fAs2 /3.D0/ +C... Splitting parameters + DATA CCHIK /20*0.D0,28*2.D0,8*3.D0,48*0.D0,4*2.D0,24*0.D0, + & 24*3.D0,76*0.D0,8*2.D0,40*0.D0,12*2.D0,40*0.D0,24*3.D0, + & 40*0.D0/ +C...Parameters of flavor formation +c last in use: 158 + DATA PAR/0.04D0,0.3D0,0.3D0,0.14D0,0.3D0,0.3D0,0.15D0,0.D0,7.D0, ! 10 + & 2*0.D0,0.9D0,0.2D0,4*0.04D0,0.5D0,0.8D0,0.5D0, ! 20 + & 0.8D0,6.D0,0.5D0,0.004D0,5*0.D0,0.7D0, ! 30 + & 2*0.D0,0.1D0,0.D0,3.D0,0.35D0,0.D0,0.5D0,2*0.D0, ! 40 + & 1.D0,2.D0,0.D0,0.99D0,0.D0,0.3D0,0.45D0,0.6D0,0.6D0,0.6D0, ! 50 + & .03D0,.03D0,6.D0,0.2D0,4*0.D0,1.1D0,0.8D0, ! 60 + & .33D0,3.D0,1.D0,.25D0,.3D0,0.3D0,0.6D0,.007D0,.03D0,.007D0, ! 70 + & 1.D0,0.3D0,0.D0,0.3D0,0.0D0,0.2D0,0.5D0,1.0D0,10.D0,0.D0, ! 80 + & 1000.D0,1000.D0,1.D0,6.D0,1.D0,0.D0,0.3D0,0.8D0,0.3D0,31.D0,! 90 + & 1.D0,6.5D0,1.D0,1.D0,0.D0,1.0D0,0.004D0,1.D0,0.33D0,1.D0, ! 100 + & 1.D0,0.D0,2.D0,0.3D0,0.15D0,3*0.D0,20.D0,0.25D0, ! 110 + & 0.D0,0.7D0,0.3D0,0.D0,0.D0,1.D0,3*0.D0,1.D0, ! 120 + & 0.3D0,0.D0,0.3D0,1.D0,1.D0,1.D0,6.D0,1.D0,1.D0,6.D0, ! 130 + & 0.0001D0,0.5D0,31.10362D0,-15.29012D0,6.5D0, ! 135 + & 0.D0,4 *0.D0, ! 140 + & 1.D0,0.D0,0.5D0,0.D0,0.5D0,0.D0,0.3D0,0.8D0,0.08D0,0.004D0, ! 150 + & 2.D0,1.D0,1.D0,1.D0,1.D0,1.D0,0.D0,1.D0,2*0.D0, ! 160 + & 40*0.D0/ ! 200 +c last in use:93 + DATA IPAR /9*0,1,0,1,8*0,20*0, ! 40 + & 9*0,0,2,9*0, ! 60 + & 100,25*0,2,1,0,0,0,1,0,7*0/ ! 100 + +C...Fragmentation of nuclei + DATA KODFRAG /0/ +C...Debug label and event counter + DATA Ndebug /0/ + DATA Ncall /0/ + + END + +C======================================================================= + + SUBROUTINE PARAM_PRINT(LUN) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON /S_CZLEAD/ CLEAD, FLEAD + COMMON /S_CPSPL/ CCHIK(4,99) + COMMON /S_DEBUG/ Ncall, Ndebug, Lunn + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + DOUBLE PRECISION STR_mass_val, STR_mass_val_hyp, STR_mass_sea + COMMON /S_CUTOFF/ STR_mass_val, STR_mass_val_hyp, STR_mass_sea + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + DOUBLE PRECISION FAin, FB0in + COMMON /S_CZDIS/ FAin, FB0in + + DOUBLE PRECISION PPT02 + COMMON /S_CQDIS2/ PPT02(44) + DOUBLE PRECISION PPT0,ptflag + COMMON /S_CQDIS/ PPT0(35),ptflag + SAVE + + WRITE (LUN, 25) +25 FORMAT( /,1x,40('-'), / + + ' SIBYLL MONTE CARLO PROGRAM. Version 2.3.f',/, + + 1x,40('-'),/' List of parameters: ' ) + + WRITE (LUN, 31) FAin, FB0in +31 FORMAT (' Parameters of longitudinal fragmentation: ', /, + + ' f(z) = (1-z)**a * exp(-b * mt**2/z) ', /, + + ' a = ', f9.3, 3x, ' b = ', f9.3, ' GeV**-2' ) + WRITE (LUN, 32) CLEAD, 1.D0/FLEAD-1.D0 +32 FORMAT (' Parameters of leading fragmentation: ', /, + + ' f(z) = c + (1-z)**a ', /, + + ' c = ',f9.3,3x,' a = ',f9.3) + + WRITE (LUN, 33) str_mass_val, str_mass_sea + 33 FORMAT (' Mass cuts ', /, + + ' val = ', f9.3, 3x, ' sea = ', f9.3, ' GeV' ) + + WRITE (LUN, 35) PPT02(1), PPT02(3), PPT02(11),ppt02(10),ppt02(20) +35 FORMAT (' <pT> of sea partons ', /, + + 3x,'<pT>(u/d) ',F8.3,2x,'<pT>(s) ',f8.3,2x,'<pT>(qq) ',f8.3, + + 2x,'<pT>(val) ',f8.3,2x,'<pT>(sea) ',f8.3) + + WRITE (LUN, 120) (PAR(K),K=1,24) +120 FORMAT (1x, ' Parameters of flavor formation: ',/, + + 3x,'PAR(1) = Prob(qq)/Prob(q) = ',F10.2,/, + + 3x,'PAR(2) = Prob(s)/Prob(u) = ',F10.2,/, + + 3x,'PAR(3) = Prob(us)/Prob(ud) = ',F10.2,/, + + 3x,'PAR(4) = Prob(ud_0)/Prob(ud_1) = ',F10.2,/, + + 3x,'PAR(5) = Prob(Vector)/Prob(Scalar) = ',F10.2,/, + + 3x,'PAR(6) = Prob(K*)/Prob(K) = ',F10.2,/, + + 3x,'PAR(7) = Prob(spin 3/2)/Prob(spin=1/2) = ',F10.2,/, + + 3x,'PAR(8) = Prob(B-M-Bbar)/Prob(B-Bbar) = ',F10.2,/, + + 3x,'PAR(9) = Phase space suppression of MI = ',F10.2,/, + + 3x,'PAR(10)= Low-energy limit for pt cutoff= ',F10.2,/, + + 3x,'PAR(11)= Pt cutoff factor for exp = ',F10.2,/, + + 3x,'PAR(12)= Pt cutoff factor for exp = ',F10.2,/, + + 3x,'PAR(13)= max. mass in diffraction = ',F10.2,/, + + 3x,'PAR(14)= Prob(qq)/Prob(q) std. value = ',F10.2,/, + + 3x,'PAR(15)= Prob(qq)/Prob(q) in hard jets = ',F10.2,/, + + 3x,'PAR(16)= Prob(qq)/Prob(q) in diff. = ',F10.2,/, + + 3x,'PAR(17)= not used = ',F10.2,/, + + 3x,'PAR(18)= not used = ',F10.2,/, + + 3x,'PAR(19)= not used = ',F10.2,/, + + 3x,'PAR(20)= not used = ',F10.2,/, + + 3x,'PAR(21)= not used = ',F10.2,/, + + 3x,'PAR(22)= effective scale in PDF (Q2) = ',F10.2,/, + + 3x,'PAR(23)= not used = ',F10.2,/, + + 3x,'PAR(24)= Prob(s->c) = ',F10.2 ) + + WRITE (LUN, 130) (IPAR(K),K=1,17) +130 FORMAT (1x, ' Model switches: ',/, + + 3x,'IPAR(1) = not used =',I4,/, + + 3x,'IPAR(2) = not used =',I4,/, + + 3x,'IPAR(3) = exponential pt =',I4,/, + + 3x,'IPAR(4) = decouple qq/q in val. strings =',I4,/, + + 3x,'IPAR(5) = decouple qq/q in hm. diff. =',I4,/, + + 3x,'IPAR(6) = decouple qq/q in hard strings =',I4,/, + + 3x,'IPAR(7) = remnant (not implemented yet) =',I4,/, + + 3x,'IPAR(8) = jet kinematic pdf set (DO/GRV)=',I4,/, + + 3x,'IPAR(9) = smear lowest diff. mass =',I4,/, + + 3x,'IPAR(10)= high mass diff. mode (d:ON) =',I4,/, + + 3x,'IPAR(11)= leading vec. meson prod. model=',I4,/, + + 3x,'IPAR(12)= inel. screening in pAir =',I4,/, + + 3x,'IPAR(13)= decouple qq/q in val. strings =',I4,/, + + 3x,'IPAR(14)= fireball model =',I4,/, + + 3x,'IPAR(15)= charm production =',I4,/, + + 3x,'IPAR(16)= charmed transverse momentum =',I4,/, + + 3x,'IPAR(17)= full charm model =',I4 ) + + WRITE (LUN, 40) + WRITE (LUN, 41) CCHIK (1,13), CCHIK(2,13) + 40 FORMAT(' Parameters of hadron splitting ' ) + 41 FORMAT(' p -> [(ud) u] splitting: alpha = ', F10.3, /, + + ' p -> [(uu) d] splitting: alpha = ', F10.3 ) +c print rho0 splitting + WRITE (LUN, 42) CCHIK (1,27), CCHIK(2,27) + 42 FORMAT(' rho0 -> [u ubar] splitting: alpha = ', F10.3, /, + + ' rho0 -> [d dbar] splitting: alpha = ', F10.3 ) +c print d+ splitting + WRITE (LUN, 43) CCHIK (4,59), CCHIK(2,59) + 43 FORMAT(' dp -> [c ubar] splitting: alpha = ', F10.3, /, + + ' dp -> [dbar c] splitting: alpha = ', F10.3 ) + END + +C======================================================================= + + SUBROUTINE SIB_LIST(LUN) + +C----------------------------------------------------------------------- +C...This routine prints the event record for the +C. current event on unit LUN +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON /S_DEBUG/ Ncall, Ndebug, Lunn + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT + INTEGER LLIST1 + COMMON /S_PLIST1/ LLIST1(8000) +C parameters that represent: NW: max. number of wounded nucleons, +C NS,NH: max. number of soft and hard interactions +c PARAMETER (NW_max = 20) +C The COMMON block /S_CHIST/ contains information about the +C the structure of the generated event: +C NWD = number of wounded nucleons +C NJET = total number of hard interactions +C NSOF = total number of soft interactions +C NNSOF (1:NW) = number of soft pomeron cuts in each interaction +C NNJET (1:NW) = number of minijets produced in each interaction +C JDIF(1:NW) = diffraction code +C 0 : non-diff, +C 1 : beam-diff +C 2 : target-diff +C 3 : double-diff + INTEGER NNSOF,NNJET,JDIF,NWD,NJET,NSOF + COMMON /S_CHIST/ NNSOF(NW_max),NNJET(NW_max), + & JDIF(NW_max),NWD,NJET,NSOF + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + CHARACTER*6 NAMP + COMMON /S_CNAM/ NAMP (0:99) + INTEGER IRMNT,KRB,KRT + DOUBLE PRECISION XRMASS,XRMEX + COMMON /S_RMNT/ XRMASS(2),XRMEX(2),IRMNT(NW_max),KRB,KRT(NW_max) + + CHARACTER*7 CTGT(0:20) + CHARACTER CODE*18 + CHARACTER*18 NAMDIF(0:3) + CHARACTER*18 NAMRMNT(0:3) + SAVE + DATA CTGT /'Air ','Proton ',19*'Nucleus'/ + DATA NAMDIF /'Non-diff. event ', + & 'Beam diffraction ','Target diffraction','Double diffraction'/ + DATA NAMRMNT /'No resolvd remnant', + & 'Beam remnant ','Target remnant ','Double remnant '/ + + 50 FORMAT(3X,88('-'),/,25X,'SIBYLL EVENT SUMMARY',25X, + & /,3X,88('-')) + 52 FORMAT( 3X,'Beam + Target @ Energy:',2X,A6,2X,'+',2X,A7,2X, + & '@',1p,E11.3,' GeV') + 53 FORMAT( 3X,'Beam + Target @ Energy:',2X,'Anti-',A6,2X,'+',2X,A7, + & 2X,'@',1p,E11.3,' GeV') + + WRITE (LUN,50) + IF (KB .GT. 0 ) THEN + WRITE (LUN,52) + & NAMP(IABS(KB)),CTGT(IAT),SQS + ELSE + WRITE (LUN,53) + & NAMP(IABS(KB)),CTGT(IAT),SQS + ENDIF + if(NWD.eq.1)THEN + WRITE (LUN,*) ' ',NAMDIF(JDIF(1)) + IF(jdif(1).eq.0) + & WRITE (LUN,*) ' ',NAMRMNT(abs(IRMNT(1))) + else + WRITE (LUN,*) ' ',NAMDIF(0) + endif + + WRITE (LUN,*) ' A/N_w/N_s/N_j = ', IAT , NWD, NSOF, NJET + WRITE (LUN,100) + +C...Print particle list + kchar = 0 + ibary = 0 + ichmd = 0 + istrg = 0 + DO J=1,NP + L = MOD(LLIST(J),10000) + CODE = ' ' + CODE(1:6) = NAMP(IABS(L)) + IF (L .LT. 0) CODE(7:9) = 'bar' + IF(IABS(LLIST(J)) .GT. 10000) CODE(10:10) = '*' + WRITE (LUN,120) J, CODE, NIORIG(J),JDIF(NIORIG(J)),LLIST1(J), + & NPORIG(J), (P(J,K),K=1,4) + if(abs(LLIST(J)).LT.10000) then + kchar = kchar+sign(1,l)*ICHP(iabs(l)) + ibary = ibary+sign(1,l)*IBAR(iabs(l)) + ichmd = ichmd+sign(1,l)*ICHM(iabs(l)) + istrg = istrg+sign(1,l)*ISTR(iabs(l)) + endif + ENDDO + CALL PFSUM(1,NP,Esum,PXsum,PYsum,PZsum,NF) + WRITE(LUN,140) PXsum,PYsum,PZsum,Esum +100 FORMAT(3X,'N Particle',12X,'Int',2x,'Jdif',2x,'Prnt',2x,'Proc' + + ,6x,'PX',9x,'PY',9x,'PZ',9x,'E', /, 3X,88('-')) +120 FORMAT(I6,1X,A18,3I5,I8,2F10.3,1p,2E11.3) +140 FORMAT(3X,88('-'),/,' Tot =',41X,2F10.3,1p,2E11.3) + write(LUN,'(1x,a,i3,3x,a,i3)') ' Total charge: ',kchar, + & 'total baryon number:',ibary + write(LUN,'(1x,a,i3,3x,a,i3)') ' Total strangeness:',istrg, + & 'total charm number: ',ichmd + + RETURN + END + +C======================================================================= + + SUBROUTINE KCODE (J,CODE,NC) + +C----------------------------------------------------------------------- +C...Produce the code for parton J +C. Input K, Output CODE, NC=number of characters +C.................................................. + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + CHARACTER*5 CODE + CHARACTER*1 NAMQ(4) + SAVE + DATA NAMQ /'u','d','s','c'/ + + CODE = ' ' + IF(J.EQ.0) THEN + CODE(1:3) = 'glu' + NC = 3 + RETURN + ENDIF + JA = IABS(J) + J1 = MOD(JA,10) + J2 = (JA-J1)/10 + IF(JA .GT. 10) THEN + CODE(1:1) = NAMQ(J2) + CODE(2:2) = NAMQ(J1) + NC = 2 + ELSE + CODE(1:1) = NAMQ(J1) + NC = 1 + ENDIF + IF (J .LT. 0) THEN + CODE(NC+1:NC+3) = 'bar' + NC = NC+3 + ENDIF + RETURN + END +C======================================================================= + + SUBROUTINE SIB_PARTPR(LUN) + +C---------------------------------------------------------------- +C prints the particles known to SIBYLL with their internal +C and PDG labels \FR'13 +C---------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + + CHARACTER*6 NAMP + COMMON /S_CNAM/ NAMP (0:99) + SAVE + + WRITE(LUN,50) + 50 FORMAT(/,2X,16X,'SIBYLL PARTICLE TABLE:',/,2x,80('-')) + WRITE(LUN,100) + 100 FORMAT(2X,'Particle',4X,'SIB PID',6x,'SIB2PDG',6x,'SIB2PDG^-1', + & 4x,'MASS',4x,'STRG',4x,'CHRM',4x,'BRYN'/, 2X,80('-')) + + DO J=1,99 + IA = ISIB_PID2PDG( j ) + IF(IA.ne.0)THEN + ISIBPDG2PIDIA=ISIB_PDG2PID( IA ) + ELSE + WRITE(LUN,'(1X,A,I2)') 'PDG conversion not found! pid=', j + ENDIF + WRITE (LUN,120) NAMP(J), J, IA, ISIBPDG2PIDIA, AM(J), ISTR(J), + & ICHM(J), IBAR(J) + ENDDO + 120 FORMAT(4X,A6,4X,I4,7X,I7,8X,I4,5X,F9.3,3(6X,I2)) + + END + +C======================================================================= + + INTEGER FUNCTION ISIB_PID2PDG(Npid) + +C---------------------------------------------------------------- +C conversion of SIBYLL internal particle code to PDG standard +C +C input: Npid internal particle number +C output: sib_pid2pdg PDG particle number +C +C based on similar phojet function \FR'13 +C---------------------------------------------------------------- + COMMON /S_PDG2PID/ ID_PDG_LIST(99),ID_LIST(577) + INTEGER NPIDA,NPID + SAVE + + Npida = iabs(Npid) + ISIB_PID2PDG = ID_PDG_LIST(Npida) + IF(NPID.lt.0)ISIB_PID2PDG = isign(ISIB_PID2PDG,Npid) + RETURN + END + +C======================================================================= + + INTEGER FUNCTION ISIB_PDG2PID(Npdg) + +C----------------------------------------------------------------------- +C conversion of PDG standard particle code to SIBYLL internal +C +C input: Npdg PDG particle number +C output: sib_pdg2pid internal particle id +C +C based on similar phojet function \FR'13 +C---------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /S_PDG2PID/ IPID_PDG_LIST(99),ID_LIST(577) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + + DOUBLE PRECISION CBR + INTEGER KDEC,LBARP,IDB + COMMON /S_CSYDEC/ CBR(223+16+12+8), KDEC(1338+6*(16+12+8)), + & LBARP(99), IDB(99) + SAVE + + Nin = abs(Npdg) + if((Nin.gt.999999).or.(Nin.eq.0)) then +C invalid particle number + if(ndebug.gt.5) write(6,'(1x,A,I10)') + & ' ISIB_PDG2PID: invalid PDG ID number ',Npdg + ISIB_PDG2PID = 0 + return + else If(Nin.le.577) then +C simple case + Nout = Nin + else +C use hash algorithm + Nout = mod(Nin,577) + endif + + 100 continue + +C particle not in table + if(ID_list(Nout).Eq.0) then + if(ndebug.gt.0) write(6,'(1x,A,I10)') + & ' ISIB_PDG2PID: particle not in table ',Npdg + ISIB_PDG2PID = 0 + return + endif + ID_out = ID_list(Nout) + IF(abs(ID_out).gt.99)then + ISIB_PDG2PID = 0 + return + else + + if(IPID_PDG_LIST(ID_list(Nout)).eq.Nin) then +C particle ID found + ISIB_PDG2PID = ID_list(Nout) + if (NPDG.lt.0) ISIB_PDG2PID = lbarp( ISIB_PDG2PID ) + return + else +C increment and try again + Nout = Nout + 5 + If(Nout.gt.577) Nout = Mod(Nout,577) + goto 100 + endif + endif + END + +C======================================================================= + + SUBROUTINE PDG_INI + +C----------------------------------------------------------------------- +C PDG conversion blocks \FR'13 +C---------------------------------------------------------------- + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER ( ID_PDG_MAX = 260 ) + COMMON /S_PDG2PID/ ID_PDG_LIST(99),ID_LIST(577) + SAVE + DATA ID_PDG_LIST /22,-11,11,-13,13,111,211,-211,321,-321, !10 + & 130,310,2212,2112,12,-12,14,-14,-2212,-2112, !20 + & 311,-311,221,331,213,-213,113,323,-323,313, !30 + & -313,223,333,3222,3212,3112,3322,3312,3122,2224, !40 + & 2214,2114,1114,3224,3214,3114,3324,3314,3334,0, !50 + & 202212,202112,212212,212112,4*0,411,-411, !60 + & 900111,900211,-900211,7*0, !70 + & 421,-421,441,431,-431,433,-433,413,-413,423, !80 + & -423,0,443,4222,4212,4112,4232,4132,4122,-15, !90 + & 15,-16,16,4224,4214,4114,4324,4314,4332/ + + IF(Ndebug.gt.2) + & WRITE(LUN,*) ' INITIALIZING PDG TABLES..' + CALL SIB_CPCINI(ID_pdg_max,ID_pdg_list,ID_list) + + END + +C======================================================================= + + SUBROUTINE SIB_CPCINI(Nrows,Number,List) + +C----------------------------------------------------------------------- +C initialization of particle hash table +C +C input: Number vector with Nrows entries according to PDG +C convention +C +C output: List vector with hash table +C +C (this code is based on the function initpns written by +C Gerry Lynch, LBL, January 1990) +C +C*********************************************************************** + IMPLICIT NONE + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + integer Number(*),List(*),Nrows + Integer Nin,Nout,Ip,I + SAVE + + do I = 1,577 + List(I) = 0 + enddo + +C Loop over all of the elements in the Number vector + + Do 500 Ip = 1,Nrows + Nin = Number(Ip) + +C Calculate a list number for this particle id number + If(Nin.Gt.999999.or.Nin.Le.0) Then + Nout = -1 + Else If(Nin.Le.577) Then + Nout = Nin + Else + Nout = Mod(Nin,577) + End If + + 200 continue + + If(Nout.Lt.0) Then +C Count the bad entries + IF(Ndebug.gt.3) Write(LUN,'(1x,a,i10)') + & ' SIB_CPCINI: invalid particle ID',Nin + Go to 500 + End If + If(List(Nout).eq.0) Then + List(Nout) = Ip + Else + If(Nin.eq.Number(List(Nout))) Then + IF(Ndebug.gt.3)Write(LUN,'(1x,a,i10)') + & ' SIB_CPCINI: double particle ID',Nin + End If + Nout = Nout + 5 + If(Nout.Gt.577) Nout = Mod(Nout, 577) + + Go to 200 + End If + 500 Continue + + END +C======================================================================= + + SUBROUTINE PFSUM(N1,N2,ETOT,PXT,PYT,PZT,NF) + +C----------------------------------------------------------------------- +C...Return the energy,px,py,pz and the number of stable +C. particles in the list between N1 and N2 + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) +c COMMON /S_PLIST/ P(8000,5), LLIST(8000), NP +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + SAVE + + NF=0 + ETOT=0.D0 + PXT=0.D0 + PYT=0.D0 + PZT=0.D0 + DO J=N1,N2 + L = LLIST(J) + IF (IABS(L) .LT. 10000) THEN + NF = NF+1 + ETOT = ETOT + ABS( P(J,4) ) + PXT = PXT + P(J,1) + PYT = PYT + P(J,2) + PZT = PZT + P(J,3) + ENDIF + ENDDO + RETURN + END + +C======================================================================= + + SUBROUTINE QNUM (JQ,JS,JC,JB,JBA, NC, NF) + +C----------------------------------------------------------------------- +C...Return the quantum numbers of one event +C. JQ = charge, JB = baryon number, JS = strangeness, JC = charmedness +C. JBA = (number of baryons+antibaryons) +C. NC = number of charged particles +C. NF = number of final particles +C.................................................. + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + SAVE + + JQ = 0 + JB = 0 + JS = 0 + JC = 0 + JBA= 0 + NC = 0 + NF = 0 + DO J=1,NP + L = LLIST(J) + LL = IABS(L) + IF (LL .LT. 10000) THEN + IF(ICHP(LL) .NE. 0) NC = NC + 1 + NF = NF + 1 + JQ = JQ + ICHP(LL)*ISIGN(1,L) + JB = JB + IBAR(LL)*ISIGN(1,L) + JBA= JBA+ IBAR(LL) + JS = JS + ISTR(LL)*ISIGN(1,L) + JC = JC + ICHM(LL)*ISIGN(1,L) + ENDIF + ENDDO + RETURN + END + +C======================================================================= + + BLOCK DATA KFLV_INI + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + INTEGER KFLV + COMMON /S_KFLV/ KFLV(4,43) + SAVE + DATA (KFLV(1,i),i=1,4) /6,8,10,71/ + DATA (KFLV(1,i),i=5,43) /6*0,40,13,34,84,6*0,13,14,39,89,6*0, + & 34,39,37,87,6*0,84,85,87/ + DATA (KFLV(2,i),i=1,4) /7,6,21,59/ + DATA (KFLV(2,i),i=5,43) /6*0,13,14,39,89,6*0,14,43,36,86,6*0, + & 39,36,38,88,6*0,84,85,87/ + DATA (KFLV(3,i),i=1,4) /9,22,33,74/ + DATA (KFLV(3,i),i=5,43) /6*0,34,39,35,87,6*0,39,36,38,88,6*0, + & 35,36,49,99,6*0,84,85,87/ + DATA (KFLV(4,i),i=1,4) /72,60,75,83/ + DATA (KFLV(4,i),i=5,43) /6*0,84,85,87,0,6*0,85,86,88,0,6*0, + & 87,88,99,0,6*0,0,0,0/ + + END +C======================================================================= + + SUBROUTINE SIB_I4FLAV (IFL1, IFL2_A, IRNK, IFL2, KF) + +C----------------------------------------------------------------------- +C. This subroutine receives as input IFL1 the flavor code +C. of a quark (antiquark) and generates the antiquark (quark) +C. of flavor code IFL2 that combine with the original parton +C. to compose an hadron of code KF. +C. +C. updated to 4 FLAVORS \FR'13 +C. Baryon sector is from jetset code +C. assuming D*_s+- are J=1, only Charm=1 baryons +C. +C. If (IFL2_A.NE.0) returns an hadron KF composed of IFL1 and IFL2_A +c +c Input: IFL1 - flavor of first quark +c IFL2_A - flavor of second quark ( if 0 randomly chosen ) +c IRNK - position in hadron chain +c Output: IFL2 - flavor of second quark partner to be passed on +c KF - final hadron +C----------------------------------------------------------------------- +Cf2py integer,intent(out) :: ifl2 +Cf2py integer,intent(out) :: kf + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + DIMENSION KFLA(4,4,2), CDIAG(16), KDIAG(8) + DIMENSION KBAR(40), CFR(28), KFR(80) + SAVE + DATA KFLA /0,8,10,71,7,0,22,59,9,21,0,74,72,60,75,0, ! spin-zero mesons + + 0,26,29,80,25,0,31,78,28,30,0,76,81,79,77,0/ ! spin-one mesons + DATA CDIAG/.5D0,.25D0,.5D0,.25D0,1.D0,.5D0,2.D0,1.D0, !spin-zero diagonal mesons + + .5D0,0.D0,.5D0,0.D0,1.D0,1.D0,2.D0,1.D0/ ! spin-one diagonal mesons + DATA KDIAG /6,23,24,73,27,32,33,83/ + DATA KBAR /13,14,34,35,36,37,38,84,85,86, !jetset -> sibyll part. code map + + 87,88,99,3*0,39,89,87,88, + + 40,41,42,43,44,45,46,47,48,49, + + 94,95,96,97,98,99,4*0/ ! spin-3/2 css baryon added to 1/2 css + DATA CFR /0.75D0,0.D0,0.5D0,0.D0,0.D0,1.D0,0.1667D0,0.3333D0, + $ 0.0833D0,0.6667D0,0.1667D0,0.3333D0,-3.D0,1.D0,-2.D0, + $ -2.D0,1.D0,0.D0,0.D0,-3.D0,1.D0,1.D0,1.D0,5*0.D0/ + DATA KFR/0,16,17,19,100,104,109,115,0,26,27,29,122,126,131,137 + + ,0,40,42,47,144,158,178,205,0,1,3,6,10,15,21,28,0,0,56,57,240, + + 246,256,271,0,0,1,3,6,10,15,21,60,61,64,70,292,307,328,356, + + 0,1,3,6,10,15,21,28,16*0/ + + IF(NDEBUG.gt.6) + & WRITE(LUN,*)' SIB_FLAV: input:',IFL1, IFL2_A, IRNK, IFL2, KF + +c set rho0 / ( omega, phi ) ratio, i.e. I=1 to I=0 +c default: 0.5, 0.0 ( phi only created from s-sbar) + CDIAG(8+1) = 1.D0-PAR(143) ! u-flavor, Prob. I=1 vs 0 + CDIAG(8+3) = 1.D0-PAR(143) ! d-flavor, Prob. I=1 vs 0 + + XDIQ = 1.D0 + + IARNK = IABS(IRNK) + IFLA = IABS(IFL1) +c check if diq production allowed? +c for strings with leading diquarks the immediate formation of another diquark may be forbidden + if(ifla.gt.100.and.mod(ifla,100).lt.10)then + XDIQ = PAR(158) + ifl1 = mod(ifl1,100) + IFLA = IABS(IFL1) + endif + + IFL2A = IFL2_A + IF (IFL2A .NE. 0) THEN +c combine existing flavors to hadron +c three cases: input diquark (MB=2): need to sample additional quark, +c input quark (MB=0,1): sample quark (0) or diquark (1)? + IFL2A = MOD(IFL2A,100) + IFL2 = IFL2A + IFLB = IABS(IFL2A) + MB = 0 + IF (IFLB .GT. 10) MB=1 + IF (IFLA .GT. 10) MB=2 + ELSE +c sample new flavor + MB = 2 + IF (IFLA .LT. 10) THEN + MB = 1 + IF ((1.D0+PAR(1))*S_RNDM(0).LT. 1.D0) MB=0 + XDIQ = 1.D0 +c suppress baryons close to the string end +c IPAR(55) defines largest forbidden rank +c PAR(101) is the rejection probability + IF (IPAR(54).eq.1)THEN + IF(IARNK.le.IPAR(55).and.S_RNDM(1).lt.PAR(101)) MB=0 + ENDIF + ENDIF + ENDIF + + 50 IF (MB .EQ. 0) THEN +c flavor open, sample from u,d,s,c + IF (IFL2A.EQ.0)THEN + IF(IPAR(69).eq.2)THEN +c asymmetric between u,d + IFL2 = MIN(2,1+INT((2.D0+PAR(115))*S_RNDM(0))) + IFLS = 3*INT(INT((2.D0+PAR(2))*S_RNDM(1))*0.5D0) + IFL2 = MAX(IFL2,IFLS) + IFL2 = ISIGN(IFL2,-IFL1) + ELSE +c symmetric in u,d + IFL2=ISIGN(1+INT((2.D0+PAR(2))*S_RNDM(0)),-IFL1) + ENDIF + IF(IABS(IFL2).eq.3) THEN + IF(S_RNDM(1).lt.PAR(24)*PAR(125)) + + IFL2=ISIGN(4,-IFL1) + ENDIF + ENDIF + IFLD = MAX(IFL1,IFL2) + IFLE = MIN(IFL1,IFL2) + GOTO 100 + ENDIF + +C... Decide if the diquark must be split +c if diquark is from previous splitting (popcorn) do NOT split diquark +c jump to sample quark and form baryon + IF (MB .EQ. 2 .AND. IFLA .GT. 100) THEN + IFLA = MOD(IFLA,100) + GOTO 200 + ENDIF +c split diquark? if yes sample single flavor and form meson +c diquark with any flavor combination is passed on with id+100 + IF (MB .EQ. 2 .AND. IFL2A .EQ. 0) THEN + IF (S_RNDM(0) .LT. PAR(8)) THEN + MB = 0 + IFLG = MOD(IFL1,10) + IFLH =(IFL1-IFLG)/10 + IF (S_RNDM(1) .GT. 0.5D0) THEN + IFLDUM = IFLG + IFLG = IFLH + IFLH = IFLDUM + ENDIF + IFL11=IFLG + IFL22=ISIGN(1+INT((2.D0+PAR(2))*S_RNDM(2)),-IFL1) + IFLD = MAX(IFL11,IFL22) + IFLE = MIN(IFL11,IFL22) + IFL2 = -IFLH*10+IFL22 + IF (S_RNDM(3) .GT. 0.5D0) IFL2 = IFL22*10-IFLH +c limit diquark splitting to B-M-B (default: yes) + IF(IPAR(92).eq.1) IFL2 = IFL2+ISIGN(100,IFL2) + ENDIF + ENDIF + +C...Form a meson: consider spin and flavor mixing for the diagonal states + 100 IF (MB .EQ. 0) THEN + IF1 = IABS(IFLD) + IF2 = IABS(IFLE) + IFLC = MAX(IF1,IF2) + KSP = INT(PAR(5)+S_RNDM(0)) + KSP = MIN(KSP,1) + IF (IFLC.EQ.3) KSP = INT(PAR(6)+S_RNDM(1)) + IF (IFLC.EQ.4) KSP = INT(PAR(6)+S_RNDM(2)) + IF (IF1 .NE. IF2) THEN + KF = KFLA(IF1,IF2,KSP+1) + ELSE + R = S_RNDM(0) + JF=1+INT(R+CDIAG(8*KSP+2*IF1-1))+ + + INT(R+CDIAG(8*KSP+2*IF1)) + JF = MIN(JF,4) + KF=KDIAG(JF+4*KSP) +c suppress neutral pions + IF(KF.eq.6)THEN + IF(IPAR(82).eq.1.and. + + S_RNDM(kf).lt.PAR(137))then + IF(IFL2A.ne.0) goto 100 + IF(IFLA.gt.10) mb = 2 + GOTO 50 + endif +c suppress neutral pions, depending on rank + IF(IPAR(82).eq.2.and.S_RNDM(3).lt.PAR(137).and. + + irnk.gt.0.and.irnk.lt.2) then + IF(IFL2A.ne.0) goto 100 + IF(IFLA.gt.10) mb = 2 + GOTO 50 + endif + ENDIF +c suppress rank1 (leading) omega + IF(KF.eq.32)THEN + IF(IPAR(83).ne.0.and. + + S_RNDM(kf).lt.PAR(138))then + IF(IFL2A.ne.0) goto 100 + IF(IFLA.gt.10) mb = 2 + GOTO 50 + endif + ENDIF + ENDIF +c PRINT*,' I4FLAV returns :(IFL1,IFL2,LL)',IFL1,IFL2,KF + IF(NDEBUG.gt.6) + & WRITE(LUN,*)' SIB_FLAV: output:',IFL1, IFL2_A, IRNK, IFL2, KF + RETURN + ENDIF + +C...Form a baryon + 200 IF (IFL2A .NE. 0) THEN + IF (MB .EQ. 1) THEN + IFLD = IFLA + IFLE = IFLB/10 + IFLF = MOD(IFLB,10) + ELSE + IFLD = IFLB + IFLE = IFLA/10 + IFLF = MOD(IFLA,10) + ENDIF + LFR = 3+2*((2*(IFLE-IFLF))/(1+IABS(IFLE-IFLF))) + IF(IFLD.NE.IFLE.AND.IFLD.NE.IFLF) LFR=LFR+1 + ELSE + 110 CONTINUE + IF(MB.EQ.1) THEN ! generate diquark + IFLD = IFLA + 120 IFLE = 1+INT((2.D0+PAR(2)*PAR(3))*S_RNDM(0)) + IFLF = 1+INT((2.D0+PAR(2)*PAR(3))*S_RNDM(1)) + IF(IFLD.NE.4)THEN + IF(IFLE.EQ.3)THEN + IF(S_RNDM(2).lt.PAR(24)*PAR(125)) + + IFLE=4 + ENDIF + IF(IFLF.EQ.3.and.IFLE.NE.4)THEN + IF(S_RNDM(3).lt.PAR(24)*PAR(125)) + + IFLF=4 + ENDIF + ENDIF + IF(IFLE.GE.IFLF.AND.PAR(4).LT.S_RNDM(4)) GOTO 120 + IF(IFLE.LT.IFLF.AND.PAR(4)*S_RNDM(5).GT.1.D0) GOTO 120 + IFL2=ISIGN(10*IFLE+IFLF,IFL1) + ELSE ! generate quark + IF(IPAR(69).eq.2)THEN +c asymmetric between u,d + IFL2 = MIN(2,1+INT((2.D0+PAR(115))*S_RNDM(6))) + IFLS = 3*(INT((2.D0+PAR(2))*S_RNDM(7))/2) + IFL2 = MAX(IFL2,IFLS) + IFL2 = ISIGN(IFL2,IFL1) + ELSE +c symmetric in u,d + IFL2=ISIGN(1+INT((2.D0+PAR(2))*S_RNDM(8)),IFL1) + ENDIF + IFLE=IFLA/10 + IFLF=MOD(IFLA,10) + IF(IABS(IFL2).EQ.3.and.IFLF.ne.4.and.IFLE.ne.4) THEN + IF(S_RNDM(9).lt.PAR(24)*PAR(125)) + + IFL2=ISIGN(4,IFL1) + ENDIF + IFLD=IABS(IFL2) + ENDIF +C...SU(6) factors for baryon formation + LFR=3+2*((2*(IFLE-IFLF))/(1+IABS(IFLE-IFLF))) + IF(IFLD.NE.IFLE.AND.IFLD.NE.IFLF) LFR=LFR+1 + WT = CFR(2*LFR-1)+PAR(7)*CFR(2*LFR) + IF(IFLE.LT.IFLF) WT=WT/3.D0 + IF (WT.LT.S_RNDM(0)) GOTO 110 + ENDIF + +C...Form Baryon + IFLG=MAX(IFLD,IFLE,IFLF) + IFLI=MIN(IFLD,IFLE,IFLF) + IFLH=IFLD+IFLE+IFLF-IFLG-IFLI +c IF(IFLG+IFLH.gt.7) GOTO 200 ! forbid double charmed + KSP=2+2*INT(1.D0-CFR(2*LFR-1)+(CFR(2*LFR-1)+PAR(7)* + 1 CFR(2*LFR))*S_RNDM(0)) + +C...Distinguish Lambda- and Sigma- like particles + IF (KSP.EQ.2.AND.IFLG.GT.IFLH.AND.IFLH.GT.IFLI) THEN + IF(IFLE.GT.IFLF.AND.IFLD.NE.IFLG) KSP=2+INT(0.75D0+S_RNDM(1)) + IF(IFLE.LT.IFLF.AND.IFLD.EQ.IFLG) KSP=3 + IF(IFLE.LT.IFLF.AND.IFLD.NE.IFLG) KSP=2+INT(0.25D0+S_RNDM(2)) + ENDIF + KF=KFR(16*KSP-16+IFLG)+KFR(16*KSP-8+IFLH)+IFLI + IF(KBAR(KF-40).eq.0)THEN + WRITE(LUN,*)' jetset code missing,flvs:',kf,IFLG,IFLH,IFLI + CALL SIB_REJECT('SIB_I4FLAV ') + ENDIF + KF=KBAR(KF-40) + IF(KF.le.14)THEN + IF(PAR(106).gt.S_RNDM(3).and.IARNK.le.IPAR(61)) KF=KF-13+51 + & +2*INT(PAR(108)+S_RNDM(4)) + ENDIF + KF=ISIGN(KF,IFL1) +c if leading baryon, mark quark to supress baryon production in the next iteration +c i.e. forbid: Blead-Bbar-B combination + if(iarnk.eq.1.and.IPAR(93).eq.1.and.iabs(mod(ifl1,100)).gt.10)then + IFL2 = IFL2 + ISIGN(100,IFL2) + endif + + IF(NDEBUG.gt.6) + & WRITE(LUN,*)' SIB_FLAV: output:',IFL1, IFL2_A, IRNK, IFL2, KF + + RETURN + END +C======================================================================= + + SUBROUTINE SIB_ICFLAV( Q2, IS0, IS, IFL ) + +C----------------------------------------------------------------------- +C Routine that samples symmetric between the available flavors +C Input: Q2 - mass scale, usually filled with s_hat +C IS0 - input flavor sign +C +C Output: IFL - flavor code: u,d,s,c or anti-quarks +C IS - flavor sign: quark or anti-quark, if 0 passed then +C a new value is sampled +C Parameters: kT_s and kT_c i.e. width of the fermi function +C----------------------------------------------------------------------- +C f2py double precision,intent(in) :: q2 +Cf2py integer,intent(in) :: is0 +Cf2py integer,intent(out) :: is +Cf2py integer,intent(out) :: ifl + IMPLICIT NONE + DOUBLE PRECISION Q2 + INTEGER IFL,IS + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + DOUBLE PRECISION XMS2,XMC2,P_S,P_C,S_RNDM,QMASS,FERMI + INTEGER IFL1,IS0 + + IF( NDEBUG.gt.6 ) + & WRITE(LUN,*)' SIB_ICFLAV: input (Q2,IFL,IS):',Q2,IFL,IS + +c quark or antiquark, sampled if input is zero + IF(IS0.eq.0) THEN + IS = -1 + 2*INT((2.D0-EPS8)*S_RNDM(IS0)) + ELSE + IS = IS0 + ENDIF + +c strange and charm quark masses + XMS2 = 4*QMASS(3)**2 + XMC2 = 4*QMASS(4)**2 * PAR(153) + +c strange and charm parameters + IF(IPAR(89).eq.1)THEN +c exponential thresholds + P_S = PAR(154) * EXP(-PAR(151)/Q2) + P_C = PAR(156) * EXP(-PAR(152)/Q2) + ELSE +c fermi func. threshold +c P_s: 0 (u,d only) --> 1 (u,d,s equal) --> 2 (u+d,s+c equal) +c P_c: 0 (s only) --> 1 (s,c) equal + P_S = PAR(154) * FERMI( Q2, XMS2, -PAR(151) ) + & + PAR(155) * FERMI( Q2, XMC2, -PAR(152) ) + P_C = PAR(156) * 0.5D0*FERMI( Q2, XMC2, -PAR(152) ) + ENDIF + IF(NDEBUG.gt.6)THEN + WRITE(LUN,*)' SIB_ICFLAV: (4*M_S**2, P_S, kT):', + & xms2, P_s, PAR(151) + WRITE(LUN,*)' SIB_ICFLAV: (4*M_C**2, P_C, kT):', + & xmc2, P_c, PAR(152) + ENDIF + +c sample u,d,s + IFL1 = MIN(INT((2.D0+P_S)*S_RNDM(IS0))+1,3) + +c replace s with c + IFL1 = IFL1 + IFL1/3*MIN(INT(P_C+S_RNDM(IS0)),1) + + IFL = IS*IFL1 + + IF(NDEBUG.gt.6) + & WRITE(LUN,*)' SIB_ICFLAV: output (Q2,IFL,IS):',Q2,IFL,IS + + END +C======================================================================= + + SUBROUTINE SIB_DIFF (L0, JDIF1, Ecm, Irec, IREJ) + +C----------------------------------------------------------------------- +C...diffraction dissociation +C. INPUT L0 = index of "beam particle" +C. the target is assumed to be a proton. +C. JDIF1 = 1 "beam diffraction" +C. = 2 "target diffraction" +C. = 3 "double diffraction" +C Irec flag to avoid recursive calls of SIB_DIFF and SIB_NDIFF +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + DOUBLE PRECISION XM2MIN,ALXMIN,SLOP0,ASLOP,BSLOP,XMASS + COMMON /S_DIFMAss/ XM2MIN(6),ALXMIN(6),SLOP0,ASLOP,BSLOP,XMASS(2) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT + + INTEGER LRNK + COMMON /SIB_RNK/ LRNK(8000) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + DIMENSION P0(5),P1(5),P2(5) + +C mapping array from particle space to diff. mass +c six groups: proton, pion, kaons, hyperons, +c charmed mesons, charmed baryons + INTEGER KK,I + DIMENSION KK(99) + SAVE + DATA (KK(I), I= 1,39) /5*0,3*2,4*3,2*1,6*0,6*2,3,6*2,6*4/ + DATA (KK(I), I=40,99) /19*0,5,5,10*0,5,5,0,5,5,11*0,6,6,6,9*0,6/ + + if(Ndebug.gt.1) + & WRITE(LUN,*)' SIB_DIFF: called with (L0,JDIF1,Ecm):', + & L0,JDIF1,Ecm + + if(Irec.eq.1) THEN + Ipflag= -1 + IIFLAG = 1 +c add incoming target particles + PZ = PAWT(ECM,AM(IABS(L0)),AM(13)) + E2 = SQRT(PZ**2+AM2(13)) + CALL ADD_PRTN(0.D0,0.D0,-PZ,E2,AM(13),13,-2,0,IREFout) + +c add interactions + xjdif = dble(jdif1) + CALL ADD_PRTN(0.D0,0.D0,xjdif,ecm,0.D0,1,-1,IREFout,IREF) + ENDIF + CALL GET_NPP(NPP_0,NPP0_0) + + IDBAD = 0 + NTRY = 0 + 20 IREJ = 1 + CALL INI_PRTN_STCK(NPP_0,NPP0_0) + + IF(NTRY.gt.20*Irec) RETURN ! zero tolerance for recursive calls + NTRY = NTRY + 1 + + LL = L0 + LA = IABS(L0) + XM2MAX = PAR(13)*Ecm*Ecm + if(Ndebug.gt.1) + & WRITE(LUN,*)' SIB_DIFF: max diff. mass (M,Xi):',XM2MAX,PAR(13) + +C...Double diffraction + IF (JDIF1 .EQ. 3) THEN + K = MAX(1,2-IBAR(LA)-ISTR(LA)-ICHM(LA)) + IF(Irec.eq.1) K = KK(LA) +c minimal mass if larger than particle mass plus one pion + XMMIN = XM2MIN(K) + IF(Irec.eq.0) XMMIN = MAX(XMMIN,(AM(LA)+AM(7)+0.02D0)**2) + XMB2 = XM2DIS(XMMIN,XM2MAX,1.D0) + XMB = SQRT (XMB2) + XMT2 = XM2DIS(XM2MIN(1),XM2MAX,1.D0) + XMT = SQRT (XMT2) + CALL TRANSFONSHELL(ECM,XMB,XMT,XM2MAX,0,P1,P2,IBAD) + IF(IBAD.ne.0) goto 20 + XMASS(1) = XMB + IF(Irec.eq.1)THEN +c add diffractive system to parton stack + CALL ADD_PRTN_4VEC(P1,3,0,0,Iref) + CALL ADD_INT_REF(Iref,1) + CALL ADD_PRTN_4VEC(P2,-3,0,0,Iref) + CALL ADD_INT_REF(Iref,1) + ENDIF + if(Ndebug.gt.1) + & write(lun,*)' double-diff.: (kb,xmb,kt,xmt)',LL,xmb,13,xmt + CALL DIFDEC (LL, Irec, IDBAD, P1) + IF(IDBAD.eq.1)goto 20 + Ipflag= -2 + XMASS(2) = XMT + CALL DIFDEC (13, Irec, IDBAD, P2) + IF(IDBAD.eq.1)goto 20 + IREJ = 0 + RETURN + ENDIF + +C...Single diffraction + IF (JDIF1.EQ. 1) THEN + K = MAX(1,2-IBAR(LA)) + IF(Irec.eq.1) K = KK(LA) + EM = AM(13) + EM2 = AM2(13) + L = 13 + ZD = -1.D0 + if(Ndebug.gt.1) + & write(lun,*)' single-diff. (beam): (kb)',LL + ELSE + K = 1 + EM = AM(LA) + EM2 = AM2(LA) + L = LL + LL = 13 + ZD = +1.D0 + if(Ndebug.gt.1) + & write(lun,*)' single-diff. (target): (kt)', LL + + ENDIF +C...Generate the mass of the diffracted system Mx (1/Mx**2 distribution) + XMMIN = XM2MIN(K) + IF(Irec.eq.0) XMMIN = MAX(XMMIN,(AM(LA)+AM(7)+0.02D0)**2) + XM2 = XM2DIS(XMMIN,XM2MAX,1.D0) + ALX = log(XM2) +c... added part + X = XM2/XM2MAX*PAR(13) + IF (X.GT.PAR(13)-0.05D0) THEN + PRO = 0.5D0*(1.D0+(X-PAR(13))/0.05D0) + IF (S_RNDM(0).LT.PRO) X = 2.D0*PAR(13)-X + XM2 = XM2MAX*X/PAR(13) + ENDIF +c... + + XM = SQRT (XM2) + XMB = XM + XMT = XM + XMASS(1) = XMB + XMASS(2) = XMT + +C.. kinematics + CALL TRANSFONSHELL(ECM,XMB,EM,XM2MAX,0,P1,P2,IBAD) + IF(IBAD.ne.0) goto 20 + +C...Generate the Kinematics of the pseudoelastic hadron + NP = NP+1 + P(NP,4) = P2(4) + P(NP,3) = abs(P2(3))*ZD + P(NP,1) = p2(1) + P(NP,2) = p2(2) + P(NP,5) = EM + LLIST(NP) = L + NPORIG(NP) = IPFLAG + niorig(NP) = iiflag + LRNK(NP) = 0 + +C...Generating the hadronic system recoiling against the produced particle + P0(5) = SQRT(XM2) + P0(4) = P1(4) + DO J=1,3 + P0(J) = -P(NP,J) + ENDDO + IF(Irec.eq.1)THEN +c add diffractive system to parton stack + CALL ADD_PRTN_4VEC(P1,JDIF1,0,0,Iref) + CALL ADD_INT_REF(Iref,1) + CALL ADD_PRTN_4VEC(P2,int(zd),0,0,Iref) + CALL ADD_INT_REF(Iref,1) + ENDIF + CALL DIFDEC (LL, Irec, IDBAD, P0) + IF(IDBAD.eq.1)goto 20 + IREJ = 0 + + END + +C======================================================================= + + SUBROUTINE DIFF_INI + +C---------------------------------------------------------------------- + IMPLICIT NONE + INTEGER I,NPION + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + DOUBLE PRECISION XM2MIN,ALXMIN,SLOP0,ASLOP,BSLOP,XMASS + COMMON /S_DIFMAss/ XM2MIN(6),ALXMIN(6),SLOP0,ASLOP,BSLOP,XMASS(2) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + SAVE +C... Diffractive mass parameters from Sibyll 2.1 +c minimal mass + DATA (XM2MIN(I), I=1,3) /1.5D0, 0.2D0, 0.6D0/ ! M_x**2(min) GeV**2 + DATA (ALXMIN(I), I=1,3) ! log[M_x**2(min)] + & /0.405465D0,-1.6094379D0,-0.5108256D0/ +C... pt spectrum + DATA SLOP0 /6.5D0/ ! b (slope_ for Mx**2 > 5 GeV**2 + DATA ASLOP /31.10362D0/ ! fit to the slope parameter. + DATA BSLOP /-15.29012D0/ + +C minimal mass for strange and charmed hadrons: +C m_beam + n_pi * m_pi + NPION = IPAR(86) + +C hyperons (4), lowest mass: lambda + XM2MIN(4) = AM2(39) + NPION * AM2(7) + ALXMIN(4) = log(XM2MIN(4)) + +C charmed mesons (5), lowest mass: Dmeson + XM2MIN(5) = AM2(59) + NPION * AM2(7) + ALXMIN(5) = log(XM2MIN(5)) + +C charmed baryons (6), lowest mass: lambda_c + XM2MIN(6) = AM2(89) + NPION * AM2(7) + ALXMIN(6) = log(XM2MIN(6)) + +c debug output + IF(NDEBUG.gt.1)THEN + WRITE(LUN,*)'DIFF_INI: setting diff. mass parameters' + WRITE(LUN,*)' min mass: ', (XM2MIN(I), I=1,6) + WRITE(LUN,*)' log min mass: ', (ALXMIN(I), I=1,6) + ENDIF + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGELA_PN(plab) + +C----------------------------------------------------------------------- +C +C low-energy pn/np elastic cross section +C (based on spline interpolations) +C +C (R.Engel 02/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C pn elastic cross section + DATA (PTPP(K),K= 1, 18) / + & -1.0128D+00,-8.8365D-01,-7.8000D-01,-6.8973D-01,-5.7462D-01, + & -4.2138D-01,-2.9384D-01,-1.1581D-01, 1.1309D-01, 5.3273D-01, + & 9.6497D-01, 1.4860D+00, 2.0449D+00, 2.6798D+00, 3.5939D+00, + & 4.9903D+00, 6.2215D+00, 6.8942D+00/ + DATA (STPP(K),K= 1, 18) / + &1.0001D+02,8.2414D+01,6.5819D+01,5.4660D+01,4.7794D+01,4.0500D+01, + &3.5781D+01,3.3208D+01,2.9921D+01,2.3919D+01,1.8633D+01,1.4206D+01, + &1.1068D+01,9.0752D+00,7.5167D+00,6.6817D+00,6.8455D+00,6.8568D+00/ + + +C initialize cross section tables + + if(init) then + N = 18 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_PN: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigela_pn = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_PN: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigela_pn = FV(1) + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGELA_PP(plab) + +C----------------------------------------------------------------------- +C +C low-energy pp elastic cross section +C (based on spline interpolations) +C +C (R.Engel 02/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C pp elastic cross section + DATA (PTPP(K),K= 1, 20) / + & -1.0548D+00,-9.9070D-01,-8.2516D-01,-6.8608D-01,-4.7199D-01, + & -2.7085D-01,-1.0784D-01,-7.6152D-03, 1.6806D-01, 3.3154D-01, + & 5.4551D-01, 8.2275D-01, 1.3768D+00, 2.0058D+00, 2.9862D+00, + & 3.7151D+00, 4.3182D+00, 5.1348D+00, 5.6750D+00, 6.2152D+00/ + DATA (STPP(K),K= 1, 20) / + &4.2555D+01,3.7310D+01,2.8426D+01,2.4873D+01,2.2758D+01,2.2166D+01, + &2.3350D+01,2.4450D+01,2.5212D+01,2.4535D+01,2.2927D+01,1.9459D+01, + &1.4213D+01,1.0745D+01,8.4602D+00,7.3604D+00,6.8528D+00,6.6836D+00, + &6.6836D+00,6.6836D+00/ + + +C initialize cross section tables + + if(init) then + N = 20 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_PP: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigela_pp = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_PP: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigela_pp = FV(1) + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGTOT_PN(plab) + +C----------------------------------------------------------------------- +C +C low-energy pn and np total cross section +C (based on spline interpolations) +C +C (R.Engel 02/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C pn total cross section + DATA (PTPP(K),K= 1, 17) / + & -1.0129D+00,-8.4520D-01,-7.4136D-01,-5.3626D-01,-3.3210D-01, + & -1.2859D-01, 8.7237D-02, 3.1519D-01, 6.7022D-01, 1.0889D+00, + & 1.5714D+00, 2.0792D+00, 2.6760D+00, 3.9453D+00, 4.9226D+00, + & 5.6207D+00, 6.7629D+00/ + DATA (STPP(K),K= 1, 17) / + &1.0000D+02,7.9053D+01,6.0976D+01,4.5194D+01,3.6729D+01,3.3429D+01, + &3.3142D+01,3.7303D+01,4.0316D+01,4.1607D+01,4.0746D+01,3.9885D+01, + &3.8594D+01,3.8307D+01,3.8881D+01,3.9168D+01,4.1320D+01/ + + +C initialize cross section tables + + if(init) then + N = 17 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_PN: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigtot_pn = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_PN: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigtot_pn = FV(1) + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGTOT_PP(plab) + +C----------------------------------------------------------------------- +C +C low-energy pp +C (based on spline interpolations) +C +C (R.Engel 02/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C pp total cross section + DATA (PTPP(K),K= 1, 23) / + & -1.4202D+00,-1.2583D+00,-1.0464D+00,-8.3253D-01,-6.0471D-01, + & -3.6376D-01,-8.4289D-02, 6.8739D-02, 1.9666D-01, 3.2471D-01, + & 4.2673D-01, 5.5375D-01, 7.5675D-01, 1.0737D+00, 1.5176D+00, + & 2.1393D+00, 2.7230D+00, 3.5353D+00, 4.3223D+00, 5.1728D+00, + & 5.7949D+00, 6.2392D+00, 6.9122D+00/ + DATA (STPP(K),K= 1, 23) / + &9.2081D+01,7.0000D+01,4.2437D+01,2.8579D+01,2.3858D+01,2.2335D+01, + &2.3858D+01,2.8883D+01,3.5888D+01,4.3807D+01,4.7157D+01,4.7766D+01, + &4.7157D+01,4.4569D+01,4.1523D+01,3.9695D+01,3.8782D+01,3.8173D+01, + &3.8173D+01,3.8477D+01,3.9391D+01,4.0000D+01,4.1523D+01/ + + +C initialize cross section tables + + if(init) then + N = 23 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_PP: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigtot_pp = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_PP: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigtot_pp = FV(1) + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGELA_PIPP(plab) + +C----------------------------------------------------------------------- +C +C low-energy pi+p elastic cross section +C (based on spline interpolations) +C +C (R.Engel 05/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C pi+p elastic cross section + DATA (PTPP(K),K= 1, 24) / + & -9.1117D-01,-8.4887D-01,-7.8656D-01,-6.6196D-01,-5.3736D-01, + & -4.4390D-01,-3.6083D-01,-2.6738D-01,-1.8431D-01,-5.9706D-02, + & 5.4515D-02, 1.3758D-01, 2.4142D-01, 3.5564D-01, 4.0756D-01, + & 5.1140D-01, 6.9830D-01, 1.0410D+00, 1.6225D+00, 2.2455D+00, + & 2.9620D+00, 3.7407D+00, 4.6026D+00, 5.5163D+00/ + DATA (STPP(K),K= 1, 24) / + &7.3812D+01,5.8453D+01,4.5967D+01,3.1602D+01,2.2652D+01,1.6133D+01, + &1.2044D+01,9.2818D+00,8.3978D+00,9.9448D+00,1.2818D+01,1.4144D+01, + &1.6354D+01,1.8011D+01,1.7238D+01,1.2928D+01,1.0055D+01,7.1823D+00, + &5.5249D+00,4.6409D+00,3.6464D+00,2.9834D+00,3.2044D+00,3.0939D+00/ + + +C initialize cross section tables + + if(init) then + N = 24 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_PIPP: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigela_pipp = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_PIPP: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigela_pipp = FV(1) + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGTOT_PIPP(plab) + +C----------------------------------------------------------------------- +C +C low-energy pi+p total cross section +C (based on spline interpolations) +C +C (R.Engel 05/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C pi+p total cross section + DATA (PTPP(K),K= 1, 37) / + & -9.2155D-01,-8.6963D-01,-8.0733D-01,-7.2426D-01,-5.4774D-01, + & -4.7505D-01,-4.1275D-01,-3.6083D-01,-3.0891D-01,-2.2585D-01, + & -1.7393D-01,-8.0473D-02, 2.3363D-02, 1.5835D-01, 2.3104D-01, + & 2.9334D-01, 3.1411D-01, 3.5564D-01, 4.1794D-01, 4.2833D-01, + & 4.9063D-01, 5.7370D-01, 6.7754D-01, 7.2945D-01, 8.1252D-01, + & 8.8521D-01, 9.9943D-01, 1.1033D+00, 1.4044D+00, 1.7782D+00, + & 2.1313D+00, 2.6712D+00, 3.2942D+00, 3.8342D+00, 4.6441D+00, + & 5.4748D+00, 5.8382D+00/ + DATA (STPP(K),K= 1, 37) / + &7.3812D+01,6.4420D+01,5.0939D+01,3.7790D+01,2.3867D+01,1.8674D+01, + &1.6022D+01,1.5138D+01,1.4365D+01,1.5138D+01,1.7127D+01,2.0773D+01, + &2.4420D+01,2.7845D+01,3.3591D+01,3.9116D+01,4.0773D+01,4.1215D+01, + &4.0000D+01,3.8232D+01,3.3370D+01,3.0608D+01,2.9061D+01,2.8619D+01, + &2.9834D+01,3.0829D+01,3.0497D+01,2.9061D+01,2.7514D+01,2.5746D+01, + &2.4862D+01,2.3646D+01,2.3094D+01,2.2873D+01,2.3204D+01,2.3978D+01, + &2.4420D+01/ + + +C initialize cross section tables + + if(init) then + N = 37 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_PIPP: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigtot_pipp = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_PIPP: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigtot_pipp = FV(1) + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGELA_PIMP(plab) + +C----------------------------------------------------------------------- +C +C low-energy pi-p elastic cross section +C (based on spline interpolations) +C +C (R.Engel 05/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C pi-p elastic cross section + DATA (PTPP(K),K= 1, 56) / + & -1.8980D+00,-1.5458D+00,-1.4323D+00,-1.3602D+00,-1.2880D+00, + & -1.2571D+00,-1.1845D+00,-1.1531D+00,-1.1112D+00,-1.0691D+00, + & -1.0063D+00,-9.1252D-01,-8.2935D-01,-7.0477D-01,-6.0118D-01, + & -4.6652D-01,-4.1489D-01,-3.9435D-01,-3.6334D-01,-3.4267D-01, + & -3.0100D-01,-2.6966D-01,-2.4866D-01,-2.1741D-01,-1.6542D-01, + & -1.1357D-01,-9.2992D-02,-8.2923D-02,-4.1875D-02,-1.1054D-02, + & 3.0281D-02, 7.2145D-02, 8.2958D-02, 1.1458D-01, 1.5645D-01, + & 2.6051D-01, 3.4368D-01, 3.8539D-01, 4.7900D-01, 5.3080D-01, + & 6.3455D-01, 7.4898D-01, 9.1527D-01, 1.1023D+00, 1.3412D+00, + & 1.5594D+00, 1.9541D+00, 2.4007D+00, 2.7122D+00, 3.0653D+00, + & 3.4392D+00, 3.8130D+00, 4.2387D+00, 5.0175D+00, 5.3602D+00, + & 5.8897D+00/ + DATA (STPP(K),K= 1, 56) / + &2.9793D+00,9.7103D+00,1.5007D+01,1.9862D+01,2.3393D+01,2.5269D+01, + &2.6041D+01,2.4276D+01,2.1076D+01,1.6772D+01,1.3021D+01,1.0372D+01, + &9.6000D+00,9.8207D+00,1.1697D+01,1.4234D+01,1.6441D+01,1.8207D+01, + &1.9310D+01,2.0083D+01,1.8979D+01,1.7545D+01,1.5779D+01,1.5007D+01, + &1.4455D+01,1.5007D+01,1.6441D+01,1.8869D+01,2.2621D+01,2.5159D+01, + &2.6703D+01,2.4166D+01,2.0855D+01,1.7214D+01,1.4676D+01,1.2910D+01, + &1.2138D+01,1.0814D+01,9.6000D+00,1.0483D+01,1.1145D+01,9.6000D+00, + &8.3862D+00,7.5034D+00,6.6207D+00,6.0690D+00,4.9655D+00,4.4138D+00, + &4.4138D+00,3.7517D+00,3.3103D+00,3.2000D+00,3.3103D+00,3.3103D+00, + &3.3103D+00,3.5310D+00/ + + +C initialize cross section tables + + if(init) then + N = 56 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_PIMP: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigela_pimp = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_PIMP: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigela_pimp = FV(1) + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGTOT_PIMP(plab) + +C----------------------------------------------------------------------- +C +C low-energy pi-p total cross section +C (based on spline interpolations) +C +C (R.Engel 05/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C pi-p total cross section + DATA (PTPP(K),K= 1, 53) / + & -1.9302D+00,-1.8269D+00,-1.6617D+00,-1.5490D+00,-1.4577D+00, + & -1.3146D+00,-1.2630D+00,-1.2211D+00,-1.1686D+00,-1.1364D+00, + & -1.0937D+00,-1.0305D+00,-9.4645D-01,-8.5245D-01,-7.6915D-01, + & -6.7584D-01,-5.2057D-01,-4.3813D-01,-4.0781D-01,-3.6669D-01, + & -3.1507D-01,-2.8372D-01,-2.6240D-01,-2.0995D-01,-1.7861D-01, + & -1.1661D-01,-9.6329D-02,-7.6149D-02,-3.5817D-02,-5.0811D-03, + & 1.5958D-02, 5.8095D-02, 1.1175D-01, 1.7444D-01, 1.9540D-01, + & 2.8868D-01, 3.7173D-01, 4.5500D-01, 5.4845D-01, 6.4176D-01, + & 7.1436D-01, 8.3919D-01, 9.6397D-01, 1.3069D+00, 1.7018D+00, + & 2.0447D+00, 2.5952D+00, 3.1249D+00, 3.6130D+00, 4.1426D+00, + & 4.8175D+00, 5.3159D+00, 5.9284D+00/ + DATA (STPP(K),K= 1, 53) / + &1.1145D+01,1.5007D+01,2.2179D+01,3.4428D+01,5.0428D+01,6.7862D+01, + &7.0952D+01,6.7972D+01,6.3007D+01,5.5393D+01,4.6566D+01,3.9614D+01, + &3.1779D+01,2.7586D+01,2.5821D+01,2.6924D+01,3.0676D+01,3.5531D+01, + &4.1931D+01,4.5131D+01,4.7448D+01,4.5903D+01,4.1600D+01,3.7517D+01, + &3.6083D+01,3.8400D+01,4.2152D+01,4.6676D+01,5.5945D+01,5.9145D+01, + &5.7048D+01,5.2414D+01,3.9062D+01,3.6083D+01,3.4538D+01,3.5862D+01, + &3.6083D+01,3.4538D+01,3.4538D+01,3.5641D+01,3.6303D+01,3.4538D+01, + &3.3214D+01,3.1117D+01,2.8690D+01,2.7145D+01,2.5600D+01,2.4717D+01, + &2.4166D+01,2.4166D+01,2.3945D+01,2.4055D+01,2.5159D+01/ + + +C initialize cross section tables + + if(init) then + N = 53 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_PIMP: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigtot_pimp = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_PIMP: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigtot_pimp = FV(1) + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGELA_KPP(plab) + +C----------------------------------------------------------------------- +C +C low-energy K+p elastic cross section +C (based on spline interpolations) +C +C (R.Engel 05/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C K+p elastic cross section + DATA (PTPP(K),K= 1, 22) / + & -1.1500D+00,-8.0733D-01,-5.4774D-01,-4.1275D-01,-2.5700D-01, + & -8.0474D-02, 7.5281D-02, 2.5180D-01, 3.7641D-01, 5.3216D-01, + & 6.8792D-01, 8.4368D-01, 1.0929D+00, 1.5913D+00, 1.9340D+00, + & 2.3182D+00, 2.8166D+00, 3.2215D+00, 3.4708D+00, 3.9276D+00, + & 4.6233D+00, 5.5475D+00/ + DATA (STPP(K),K= 1, 22) / + &1.2227D+01,1.2570D+01,1.2499D+01,1.2498D+01,1.2428D+01,1.2012D+01, + &1.1183D+01,1.0284D+01,9.4544D+00,8.2796D+00,6.8977D+00,5.9300D+00, + &4.6854D+00,3.6461D+00,3.2293D+00,3.0193D+00,2.6704D+00,2.4602D+00, + &2.3203D+00,2.0407D+00,2.2426D+00,2.5809D+00/ + + +C initialize cross section tables + + if(init) then + N = 22 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_KPP: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigela_kpp = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_KPP: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigela_kpp = FV(1) + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGTOT_KPP(plab) + +C----------------------------------------------------------------------- +C +C low-energy K+p total cross section +C (based on spline interpolations) +C +C (R.Engel 05/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C K+p total cross section + DATA (PTPP(K),K= 1, 20) / + & -1.0981D+00,-7.1388D-01,-4.7505D-01,-3.1930D-01,-1.7393D-01, + & -8.0474D-02, 2.3363D-02, 9.6049D-02, 1.9989D-01, 3.2449D-01, + & 4.6986D-01, 6.2562D-01, 8.3329D-01, 1.0825D+00, 1.4355D+00, + & 2.1001D+00, 2.6920D+00, 3.5434D+00, 4.6337D+00, 5.7448D+00/ + DATA (STPP(K),K= 1, 20) / + &1.2158D+01,1.2362D+01,1.2429D+01,1.2428D+01,1.3187D+01,1.4429D+01, + &1.5809D+01,1.7327D+01,1.8224D+01,1.8430D+01,1.7945D+01,1.7806D+01, + &1.7459D+01,1.7250D+01,1.7041D+01,1.7381D+01,1.7446D+01,1.7853D+01, + &1.8881D+01,2.0529D+01/ + + +C initialize cross section tables + + if(init) then + N = 20 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_KPP: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigtot_kpp = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_KPP: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigtot_kpp = FV(1) + + END + + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGELA_KMP(plab) + +C----------------------------------------------------------------------- +C +C low-energy K-p elastic cross section +C (based on spline interpolations) +C +C (R.Engel 05/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C K-p elastic cross section + DATA (PTPP(K),K= 1, 36) / + & -1.7871D+00,-1.4709D+00,-1.2813D+00,-1.1867D+00,-1.0179D+00, + & -8.8055D-01,-8.0666D-01,-7.9648D-01,-7.7560D-01,-6.5951D-01, + & -5.6450D-01,-4.7995D-01,-3.9539D-01,-3.4256D-01,-2.7894D-01, + & -2.4691D-01,-2.0439D-01,-1.1952D-01,-1.3598D-02, 6.0479D-02, + & 1.1311D-01, 1.4462D-01, 2.0784D-01, 2.6053D-01, 3.2387D-01, + & 4.4022D-01, 5.5672D-01, 6.9424D-01, 8.6348D-01, 1.2127D+00, + & 1.6678D+00, 2.3770D+00, 3.2133D+00, 3.9226D+00, 4.6425D+00, + & 5.1612D+00/ + DATA (STPP(K),K= 1, 36) / + &6.8962D+01,5.6135D+01,4.7307D+01,4.0271D+01,3.5582D+01,3.2549D+01, + &3.0480D+01,2.6617D+01,2.3858D+01,2.0410D+01,1.7927D+01,1.6549D+01, + &1.5308D+01,1.4343D+01,1.5310D+01,1.7794D+01,1.9451D+01,2.1108D+01, + &2.1661D+01,2.1386D+01,1.8490D+01,1.6144D+01,1.3386D+01,1.1041D+01, + &9.3860D+00,8.4219D+00,8.8376D+00,7.8738D+00,6.4965D+00,4.7080D+00, + &3.8869D+00,3.3456D+00,2.6682D+00,2.5409D+00,2.6896D+00,2.6974D+00/ + + +C initialize cross section tables + + if(init) then + N = 36 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_KMP: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigela_kmp = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGELA_KMP: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigela_kmp = FV(1) + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIGTOT_KMP(plab) + +C----------------------------------------------------------------------- +C +C low-energy K-p total cross section +C (based on spline interpolations) +C +C (R.Engel 05/01) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + + dimension PTPP(100),STPP(100),DERIV(100,2),Z(10),FV(10),FD(10,2) + logical init + SAVE + data init /.true./ + +C K-p total cross section + DATA (PTPP(K),K= 1, 43) / + & -1.3500D+00,-1.2345D+00,-9.8216D-01,-8.2491D-01,-7.4143D-01, + & -6.1508D-01,-4.5679D-01,-3.7223D-01,-2.9802D-01,-2.6595D-01, + & -1.7037D-01,-1.0660D-01,-2.1599D-02,-2.5037D-04, 6.3445D-02, + & 8.4428D-02, 1.3703D-01, 1.5769D-01, 1.8898D-01, 2.4156D-01, + & 3.3667D-01, 3.5796D-01, 4.1106D-01, 5.1700D-01, 5.9099D-01, + & 6.5431D-01, 6.9651D-01, 7.7067D-01, 8.5538D-01, 9.6104D-01, + & 1.1303D+00, 1.3209D+00, 1.4266D+00, 1.5853D+00, 1.8075D+00, + & 1.9769D+00, 2.4743D+00, 3.0353D+00, 3.5222D+00, 4.0515D+00, + & 4.6550D+00, 5.1949D+00, 5.7455D+00/ + DATA (STPP(K),K= 1, 43) / + &9.7669D+01,8.8840D+01,7.2700D+01,5.8076D+01,4.6625D+01,4.0142D+01, + &3.5315D+01,3.4074D+01,3.5041D+01,3.7939D+01,4.0838D+01,4.3185D+01, + &4.6084D+01,4.7740D+01,4.9397D+01,4.7603D+01,4.4430D+01,3.9601D+01, + &3.5186D+01,3.1876D+01,3.0221D+01,3.1325D+01,3.2982D+01,3.3674D+01, + &3.2571D+01,3.0640D+01,2.9261D+01,2.9814D+01,2.9953D+01,2.8023D+01, + &2.6922D+01,2.6924D+01,2.5684D+01,2.4859D+01,2.4034D+01,2.3761D+01, + &2.2112D+01,2.1155D+01,2.0472D+01,2.0480D+01,2.0627D+01,2.0773D+01, + &2.1472D+01/ + + +C initialize cross section tables + + if(init) then + N = 43 + M = 0 + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,-1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_KMP: spline initialization failed: ',IERR + stop + endif + NXY_save = NXY + init = .false. + endif + +C spline interpolation + + sigtot_kmp = 0.D0 + Z(1) = log(plab) + + if((Z(1).gt.PTPP(1)).and.(Z(1).lt.PTPP(N))) then + M = 1 + NXY = NXY_save + CALL SPLIN3(PTPP,STPP,DERIV,N,100,Z,FV,FD,M,10,1) + if(IERR.ne.0) then + write(6,'(1x,a,i6)') + & ' SIGTOT_KMP: spline interpolation failed: ',IERR + return + endif + else + return + endif + + sigtot_kmp = FV(1) + + END + + +C======================================================================= + + SUBROUTINE SPLIN3(X,Y,DERIV,N,NC,Z,FVALUE,FDERIV,M,MC,IOP) + +C----------------------------------------------------------------------- +C +C CERN LIBRARY PROGRAM NO E-209. +C +C REVISED VERSION JULY 1973. +C +C CHANGED BY R.ENGEL (10/10/93) TO CONFORM WITH F77 STANDARD +C +C PURPOSE = TO COMPUTE A NATURAL SPLINE APPROXIMATION OF THIRD ORDER +C FOR A FUNCTION Y(X) GIVEN IN THE N POINTS (X(I),Y(I)) , +C I=1(1)N. +C +C PARAMETERS (IN LIST). +C +C X = AN ARRAY STORING THE INPUT ARGUMENTS.DIMENSION X(N). +C Y = AN ARRAY STORING THE INPUT FUNCTION VALUES.THE ELEMENT +C Y(I) REPRESENT THE FUNCTION VALUE Y(X) FOR X=X(I). +C DERIV = AN ARRAY USED FOR STORING THE COMPUTED DERIVATIVES OF +C THE FUNCTION Y(X).IN DERIV(I,1) AND DERIV(I,2) ARE STOR- +C ED THE FIRST-AND SECOND ORDER DERIVATIVES OF Y(X) FOR +C X=X(I) RESPECTIVELY. +C N = NUMBER OF INPUT FUNCTION VALUES. +C NC = ARRAY DERIV IS DIMENSIONED DERIV(NC,2) IN CALLING +C PROGRAM. +C Z = AN ARRAY STORING THE ARGUMENTS FOR THE INTERPOLATED +C VALUES TO BE COMPUTED. +C FVALUE = AN ARRAY STORING THE COMPUTED INTERPOLATED VALUES. +C FVALUE(J) REPRESENT THE FUNCTION VALUE FVALUE(Z) FOR +C Z=Z(J). +C FDERIV = AN ARRAY USED FOR STORING THE DERIVATIVES OF THE COM- +C PUTED INTERPOLATED VALUES.EXPLANATION AS FOR DERIV. +C M = NUMBER OF INTERPOLATED VALUES TO BE COMPUTED. +C MC = ARRAY FDERIV IS DIMENSIONED FDERIV(MC,2) IN CALLING +C PROGRAM. +C IOP = OPTION PARAMETER.FOR IOP.LE.0 THE DERIVATIVES FOR EACH +C SUB-INTERVAL IN THE SPLINE APPROXIMATION ARE COMPUTED. +C IOP=-1, THE SECOND ORDER END-POINT +C DERIVATIVES ARE COMPUTED BY +C LINEAR EXTRAPOLATION. +C IOP=0 , THE SECOND ORDER END-POINT +C DERIVATIVES ASSUMED TO BE GI- +C VEN (SEE COMMON /SPAPPR/). +C IOP=1 , COMPUTE SPLINE APPROXIMATIONS +C FOR THE ARGUMENTS GIVEN IN +C THE ARRAY Z,THE DERIVATIVES +C BEEING ASSUMED TO HAVE BEEN +C CALCULATED IN A PREVIOUS CALL +C ON THE ROUTINE. +C +C PARAMETERS (IN COMMON BLOCK / SPAPPR /). +C +C SECD1 = VALUE OF THE SECOND DERIVATIVE D2Y(X)/DX2 FOR THE INPUT +C ARGUMENT X=X(1). +C SECDN = VALUE OF THE SECOND DERIVATIVE D2Y(X)/DX2 FOR THE INPUT +C ARGUMENT X=X(N). +C NB. VALUES HAVE TO BE ASSIGNED TO SECD1 AND SECDN IN THE +C CALLING PROGRAM.IF A NATURAL SPLINE FIT IS WANTED PUT +C SECD1=SECDN=0. +C VOFINT = COMPUTED APPROXIMATION FOR THE INTEGRAL OF Y(X) TAKEN +C FROM X(1) TO X(N). +C IERR = ERROR PARAMETER.IERR=0,NO ERRORS OCCURED. +C IERR=1,THE NUMBER OF POINTS TOO SMALL +C I.E.N LESS THAN 4. +C IERR=2,THE ARGUMENTS X(I) NOT IN INCREA- +C SING ORDER. +C IERR=3,ARGUMENT TO BE USED IN INTERPOLA- +C TION ABOVE RANGE. +C IERR=4,ARGUMENT TO BE USED IN INTERPOLA- +C TION BELOW RANGE. +C NXY = N (SEE ABOVE),HAS TO BE STORED FOR ENTRIES CORRESPONDING +C TO IOP=1. +C +C********************************************************************** + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) +C + DIMENSION X(NC) , Y(NC) , DERIV(NC,2) , Z(MC) , FVALUE(MC) , + 1 FDERIV(MC,2) +C + COMMON / SPAPPR / SECD1 , SECDN , VOFINT , IERR , NXY + SAVE + DATA THIRD , SIXTH / .333333333333333D0 , .166666666666667D0 / +C +C 1000 + IF (IOP.GT.0) GO TO 1110 +C + IERR=0 +C +C CHECK IF ENOUGH DATA-POINTS ARE AVAILABLEI.E. IF N LESS THAN 4 NO +C THIRD ORDER SPLINE APPROXIMATION IS POSSIBLE. +C + IF (N.GE.4) GO TO 1010 +C + IERR=1 + GO TO 2000 +C +C START CALCULATION OF COEFFICIENTS TO BE USED IN THE SYSTEM OF EQU- +C ATIONS FOR THE SECOND ORDER DERIVATIVES OF Y(X). +C + 1010 IF (IOP.NE.-1) GO TO 1015 + SECD1=0.D0 + SECDN = 0.D0 + BET1=1.D0/(1.D0+0.5D0*(X(2)-X(1))/(X(3)-X(2))) + ALF1=BET1*(1.D0- ((X(2)-X(1))/(X(3)-X(2)))**2) + BETN=1.D0/(1.D0+0.5D0*(X(N)-X(N-1))/(X(N-1)-X(N-2))) + ALFN=BETN*(1.D0- ((X(N)-X(N-1))/(X(N-1)-X(N-2)))**2) +C + 1015 DERIV(1,2)=SECD1 + DERIV(N,2)=SECDN + DERIV(1,1)=0.D0 + DXPLUS=X(2)-X(1) +C +C CHECK IF ARGUMENTS ARE IN INCREASING ORDER.IF NOT PRINT ERROR +C MESSAGE AND STOP. +C + IF ( DXPLUS.GT.0.D0) GO TO 1020 + IN=1 + IERR=2 + GO TO 2000 +C + 1020 DYPLUS=(Y(2)-Y(1))/DXPLUS + IU=N-1 + DO 1040 I=2,IU + DXMIN =DXPLUS + DYMIN =DYPLUS + DXPLUS=X(I+1)-X(I) +C +C CHECK IF ARGUMENTS ARE IN INCREASING ORDER.IF NOT PRINT ERROR +C MESSAGE AND STOP. +C + IF (DXPLUS.GT.0.D0) GO TO 1030 +C + IN=I + IERR=2 + GO TO 2000 +C + 1030 DXINV =1.D0/(DXPLUS+DXMIN) + DYPLUS=(Y(I+1)-Y(I))/DXPLUS + DIVDIF=DXINV*(DYPLUS-DYMIN) + ALF =0.5D0*DXINV*DXMIN + BET =0.5D0-ALF +C + IF (I.EQ.2) DIVDIF=DIVDIF-THIRD*ALF*DERIV(1,2) + IF (I.EQ.IU) DIVDIF=DIVDIF-THIRD*BET*DERIV(N,2) + IF (I.EQ.2) ALF=0.D0 +C + IF (IOP.NE.-1) GO TO 1035 + IF (I.NE.2) GO TO 1032 + BET=BET*ALF1 + DIVDIF=DIVDIF*BET1 + GO TO 1035 + 1032 IF (I.NE.IU) GO TO 1035 + ALF=ALF*ALFN + DIVDIF=DIVDIF*BETN +C + 1035 DXINV =1.D0/(1.D0+ALF*DERIV(I-1,1)) + DERIV(I,1)=-DXINV*BET + DERIV(I,2)= DXINV*(3.D0*DIVDIF-ALF*DERIV(I-1,2)) + 1040 CONTINUE +C +C COMPUTE THE SECOND DERIVATIVES BY BACKWARDS RECURRENCE RELATION. +C THE SECOND ORDER DERIVATIVES FOR X=X(N-1) ALREADY COMPUTED. +C +C 1050 + DO 1060 I=2,IU + J=N-I + DERIV(J,2)=DERIV(J,1)*DERIV(J+1,2)+DERIV(J,2) + 1060 CONTINUE +C + IF (IOP.NE.-1) GO TO 1070 + DERIV(1,2)=((X(3)-X(1))/(X(3)-X(2)))*DERIV(2,2)-((X(2)-X(1))/(X(3) + $-X(2)))*DERIV(3,2) + DERIV(N,2)=-((X(N)-X(N-1))/(X(N-1)-X(N-2)))*DERIV(N-2,2)+((X(N)-X( + $N-2))/(X(N-1)-X(N-2)))*DERIV(N-1,2) +C +C CALCULATION OF THE SECOND ORDER DERIVATIVES FINISHED.START CAL- +C CULATION OF THE FIRST ORDER DERIVATIVES AND OF THE INTEGRAL. +C + 1070 VOFINT=0.D0 + DO 1080 I=1,IU + DXPLUS=X(I+1)-X(I) + DYPLUS=Y(I+1)-Y(I) + DIVDIF=DYPLUS/DXPLUS + DERIV(I,1)=DIVDIF-DXPLUS*(THIRD*DERIV(I,2)+SIXTH*DERIV(I+1,2)) + DXPLUS=0.5D0*DXPLUS + VOFINT=VOFINT+DXPLUS*(Y(I+1)+Y(I)-THIRD*(DERIV(I+1,2)+DERIV(I,2))* + $DXPLUS**2) + 1080 CONTINUE +C +C COMPUTE THE LAST FIRST ORDER DERIVATIVE. +C + DXPLUS=X(N)-X(N-1) + DYPLUS=Y(N)-Y(N-1) + DIVDIF=DYPLUS/DXPLUS + DERIV(N,1)=DIVDIF+DXPLUS*(SIXTH*DERIV(N-1,2)+THIRD*DERIV(N,2)) +C +C CALCULATION OF FIRST ORDER DERIVATIVES AND INTEGRAL FINISHED. +C +C SET VALUE OF N IN COMMON BLOCK / SPAPPR /. +C + NXY=N +C +C COMPUTE INTERPOLATED VALUES IF ANY. +C + 1110 IF (M.LT.1) RETURN +C + XL=X(1) + XU=X(2) + IP=3 + IL=0 +C +C 1120 + DO 1160 J=1,M + ARG=Z(J) + IF (ARG.GT.XU) GO TO 1170 + IF (ARG.LT.XL) GO TO 1190 +C +C ARGUMENT IN CORRECT RANGE.CHECK IF POLYNOMIAL COEFFICIENTS HAVE +C TO BE CALCULATED. +C +C 1130 + IF (IL.GT.0) GO TO 1150 +C +C COMPUTE POLYNOMIAL COEFFICIENTS. +C + 1140 II=IP-2 + A0=Y(II) + A1=DERIV(II,1) + A4=DERIV(II,2) + A6=(DERIV(II+1,2)-A4)/(XU-XL) + A2=0.5D0*A4 + A3=SIXTH*A6 + A5=0.5D0*A6 + IL=1 +C +C CALCULATION OF POLYNOMIAL COEFFICIENTS FINISHED.COMPUTE VALUES. +C + 1150 ARG=ARG-XL + FVALUE(J)=((A3*ARG+A2)*ARG+A1)*ARG+A0 + FDERIV(J,1)=(A5*ARG+A4)*ARG+A1 + FDERIV(J,2)=A6*ARG+A4 +C + 1155 CONTINUE + GOTO 1160 +C +C RANGE MOVING +C +C +C ARGUMENT ABOVE PRESENT RANGE.SHIFT RANGE UPWARDS. +C + 1170 IF(IP.GT.NXY) GO TO 1185 + IPP=IP + DO 1180 I=IPP,NXY + IF (ARG.GT.X(I)) GO TO 1180 + XL=X(I-1) + XU=X(I) + IP=I+1 + IL=0 + GO TO 1140 +C + 1180 CONTINUE +C +C ARGUMENT OUT OF RANGE,I.E. ARG GREATER THAN X(N). +C + 1185 IERR=3 + IP=NXY+1 + GO TO 2010 +C +C ARGUMENT BELOW PRESENT RANGE.SHIFT DOWNWARDS. +C + 1190 IPP=IP + DO 1200 I=1,IPP + II=IP-I-2 + IF (II.EQ.0) GO TO 1210 + IF (ARG.LT.X(II)) GO TO 1200 + XL=X(II) + XU=X(II+1) + IP=II+2 + IL=0 + GO TO 1140 +C + 1200 CONTINUE +C +C ARGUMENT OUT OF RANGE,I.E. ARG LESS THAN X(1). +C + 1210 IERR=4 + IP=3 + GO TO 2010 +C + 2010 WRITE(6,3000) IERR , ARG +C + FVALUE(J)=0.D0 + FDERIV(J,1)=0.D0 + FDERIV(J,2)=0.D0 +C + II=IP-2 + XL=X(II) + XU=X(II+1) + IL=0 + GO TO 1155 +C +C +C END OF INTERPOLATION LOOP +C + 1160 CONTINUE +C +C CALCULATION OF INTERPOLATED VALUES FINISHED. +C + RETURN +C +C PRINT ERROR MESSAGES. +C + 2000 IF (IERR.EQ.1) WRITE(6,3000) IERR + IF (IERR.EQ.2) WRITE(6,3000) IERR , X(IN) , X(IN+1) + RETURN +C + 3000 FORMAT(//5X,'*** SUBROUTINE SPLIN3 ERROR NO ',I2,' ***', + $ 2(4X,E21.14)) +C + END +C======================================================================= + + SUBROUTINE FRAG_VLNCE(IDX,LBAD) + +C----------------------------------------------------------------------- +C routine that fragments a quark - quark system \FR'14 +C +C INPUT: IDX : parton stack index of central string +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER IDX,LBAD + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + INTEGER NW_max + PARAMETER (NW_max = 20) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) +C parameters that represent: NW: max. number of wounded nucleons, +C NS,NH: max. number of soft and hard interactions +c PARAMETER (NW_max = 20) +C The COMMON block /S_CHIST/ contains information about the +C the structure of the generated event: +C NWD = number of wounded nucleons +C NJET = total number of hard interactions +C NSOF = total number of soft interactions +C NNSOF (1:NW) = number of soft pomeron cuts in each interaction +C NNJET (1:NW) = number of minijets produced in each interaction +C JDIF(1:NW) = diffraction code +C 0 : non-diff, +C 1 : beam-diff +C 2 : target-diff +C 3 : double-diff + INTEGER NNSOF,NNJET,JDIF,NWD,NJET,NSOF + COMMON /S_CHIST/ NNSOF(NW_max),NNJET(NW_max), + & JDIF(NW_max),NWD,NJET,NSOF + + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + DOUBLE PRECISION PST,PBM,PTG,PSTH,P1,P2,GABE,EE, + & PAR1_def,PAR24_def,PX1,PY1,PX2,PY2,GAM,BET,P1TOT,P2TOT, + & SIF,COF,COD,SID,ANORF,PZ + DIMENSION PST(5),PBM(5),PTG(5),PSTH(5),P1(4),P2(4),GABE(4) + INTEGER LSTH,IPID,IBMST,ITGST,ISTH,IFLB,IFLT,IST,I,IFBAD,JJ, + & NOLD,II,K,J + SAVE + + LBAD = 2 + LSTH = 0 + +c references are: +c string --> bm-parton --> tg-parton (--> merged string/hadron) +c read string 4momentum from stack + CALL RD_PRTN_4VEC(IDX,PST,IPID,IBMST) + CALL RD_PRTN_4VEC(IBMST,PBM,IFLB,ITGST) + CALL RD_PRTN_4VEC(ITGST,PTG,IFLT,ISTH) + +C kinematic variables + EE = PST(5) ! string mass + + IF(NDEBUG.gt.1) WRITE(LUN,*)' FRAG_VLNCE: IDX,EE,IFLB,IFLT', + & IDX,EE,IFLB,IFLT + + IF(IDX.ne.ISTH) then +c read merged string and add hadron to final particle stack.. + CALL RD_PRTN_4VEC(ISTH,PstH,LSTH,IST) + IF(NDEBUG.gt.1) WRITE(LUN,*)' FRAG_VLNCE: found merged string', + & LSTH,(PSTH(I),I=1,5) + IF(IDX.ne.IST) then + write(lun,*) ' FRAG_VLNCE: reference loop broken!' , IDX + CALL SIB_REJECT('FRAG_VLNCE ') + endif + NP = NP + 1 + DO I=1,4 + P(NP,I) = PST(I) + ENDDO + P(NP,5) = AM(IABS(LSTH)) + LLIST(NP) = LSTH + NPORIG(NP) = IPFLAG*2+KINT + niorig(NP) = iiflag + LBAD = 0 + RETURN + ENDIF + +c baryon production setup + PAR1_def = PAR(1) + if( NSOF+NJET.gt.0) then + PAR(1)= PAR(15) + else + PAR(1)= PAR(14) + endif + +c charm fractions in different parameterizations + PAR24_def = PAR(24) + IF(IPAR(15).gt.2.and.IPAR(15).ne.7.and.IPAR(15).lt.12)THEN + PAR(24) = PAR(25)*EXP(-PAR(26)/EE) + ENDIF + + IF(NDEBUG.gt.1) + & WRITE(LUN,*)' FRAG_VLNCE: parameters (CHM,DIQ,STR,VEC,POP)', + & PAR(24),PAR(1),PAR(2),PAR(5),PAR(8) + + NOLD=NP + IF(IPAR(38).eq.1.or.IPAR(38).eq.2)THEN +C... rotate strings instead of attaching all pt to string end hadrons + PX1 = 0.D0 + PY1 = 0.D0 + PX2 = 0.D0 + PY2 = 0.D0 + ELSEIF(IPAR(38).eq.0.or.IPAR(38).eq.3)THEN +c assign pt to hadrons at string end (old model) + PX1 = PBM(1) + PY1 = PBM(2) + PX2 = PTG(1) + PY2 = PTG(2) + GAM = PST(4)/EE + BET = PST(3)/PST(4) + ENDIF + +C... fragment strings in string restframe + CALL STRING_FRAG_4FLV + & (EE,IFLB,IFLT,PX1,PY1,PX2,PY2,IFBAD,1) + + PAR(24) = PAR24_def + PAR(1) = PAR1_def + KINT= 0 + IF (IFBAD .EQ. 1) then + if(Ndebug.gt.1) + & WRITE(LUN,*)' STRING_FRAG: rejection (Ncall):',Ncall + RETURN + ENDIF + +C... rotate and boost string + IF(IPAR(38).eq.1.or.IPAR(38).eq.2)THEN +C boost quark momentum to string center-of-mass +c to calculate rotation angles in string center-of-mass + do jj=1,3 + gabe(jj) = PST(jj)/PST(5) + enddo + GABE(4) = PST(4)/PST(5) + CALL SIB_ALTRA(gabe(4),-gabe(1),-gabe(2),-gabe(3), + & PBM(1),pbm(2),pbm(3),pbm(4), + & P1TOT,p1(1),p1(2),p1(3),p1(4)) + CALL SIB_ALTRA(gabe(4),-gabe(1),-gabe(2),-gabe(3), + & PTG(1),pTG(2),ptg(3),ptg(4), + & P2TOT,p2(1),p2(2),p2(3),p2(4)) + +c should be back-to-back... + IF(ndebug.gt.1)THEN + write(lun,*) + & ' FRAG_VLNCE: string c.m. momentum, parton 1 (Pabs,P(i)):' , + & P1TOT, (P1(j),j=1,4) + write(lun,*) + & ' FRAG_VLNCE: string c.m. momentum, parton 2 (Pabs,P(i)):' , + & P2TOT, (P2(j),j=1,4) + write(lun,*) ' partons should be back to back...' + ENDIF +c rotation factors + COD= P1(3)/P1TOT + SID= DSQRT(P1(1)**2+P1(2)**2)/P1TOT + COF=1.D0 + SIF=0.D0 + IF(P1TOT*SID.GT.EPS5) THEN + COF=P1(1)/(SID*P1TOT) + SIF=P1(2)/(SID*P1TOT) + ANORF=DSQRT(COF*COF+SIF*SIF) + COF=COF/ANORF + SIF=SIF/ANORF + ENDIF +c rotate string final state + DO K=NOLD+1,NP + CALL SIB_TRANI(P(K,1),P(k,2),P(k,3),cod,sid,cof,sif + & ,P2(1),P2(2),P2(3)) + do ii=1,3 + P(K,ii)=P2(ii) + enddo + ENDDO +c boost to hadron - hadron center-of-mass + DO K=NOLD+1,NP + CALL SIB_ALTRA(gabe(4),gabe(1),gabe(2), + & gabe(3),P(k,1),p(k,2),p(k,3),p(k,4), + & P1TOT,p2(1),p2(2),p2(3),p2(4)) + do ii=1,4 + P(K,ii)=P2(ii) + enddo + ENDDO + ELSEIF(IPAR(38).eq.0.or.IPAR(38).eq.3)THEN +C... boost string + DO K=NOLD+1,NP + PZ = P(K,3) + P(K,3) = GAM*(PZ+BET*P(K,4)) + P(K,4) = GAM*(P(K,4)+BET*PZ) + ENDDO + ENDIF + LBAD = 0 + END + + +C----------------------------------------------------------------------- +C fragmentation functions in SIBYLL \FR'14 +C======================================================================= + + FUNCTION ZDIS_4FLV (IFL1,IFL2, XMT2) + +C----------------------------------------------------------------------- +C...z distribution +c includes charmed fragmentation (Peterson/SLAC) + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + DOUBLE PRECISION FAin, FB0in + COMMON /S_CZDIS/ FAin, FB0in + + DOUBLE PRECISION FAs1, fAs2 + COMMON /S_CZDISs/ FAs1, fAs2 + DOUBLE PRECISION ZDMAX, EPSI + COMMON /S_CZDISc/ ZDMAX, EPSI + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + + IAFL1 = IABS(mod(IFL1,100)) + IAFL2 = IABS(mod(IFL2,100)) +c SLAC-Peterson fragmentation function for charm + IF ((IAFL1/10.eq.4.or.mod(IAFL1,10).eq.4) + + .or.(IAFL2/10.eq.4.or.mod(IAFL2,10).eq.4))THEN + 90 z = max(S_RNDM(0),1.e-8) + tcp = zmefn(z,epsi)/zdmax + if (tcp .lt. S_RNDM(1)) goto 90 + zdis_4flv = z + else +c original lund function, non charm + fa=fain ! lund parameter a + fb0=fb0in ! lund parameter b +c parameters for hard scattering (gluon) fragmentation + IF(IPAR(6).eq.2)THEN + fa= PAR(18) + fb0= PAR(19) + ENDIF +c special parameters for strange fragmentation +c only active for baryon beams (or K0,K0bar) +C DH correction may 10-1996 + if (iabs(kb).ge.13) then ! baryons only + if (iafl2.eq.3) fa=fain+fas2 + if (iafl1.eq.3) fa=fain+fas1 + endif +c special parameters for baryon fragmentation +c similar to pythia + IF((IAFL1+IAFL2).gt.10.and. + & (IPAR(36).eq.1.or.IPAR(20).eq.3))then + fa = fain + PAR(45) + fb0 = PAR(60) + ENDIF + FB = FB0*XMT2 + IF(FA.GT.0.01D0.AND.ABS(FA-1.D0)/FB.LE.0.01D0) + + ZMAX=FB/(1.D0+FB)+(1.D0-FA)*FB**2/(1.D0+FB)**3 + IF(FA.GT.0.01D0.AND.ABS(FA-1.D0)/FB.GT.0.01D0) + + ZMAX=0.5D0*(1.D0+FB-DSQRT((1.D0-FB)**2+4.D0*FA*FB))/(1.D0-FA) + IF(ZMAX.LT.0.1D0) ZDIV=2.75D0*ZMAX + IF(ZMAX.GT.0.85D0) + + ZDIV=ZMAX-0.6D0/FB**2+(FA/FB)*dLOG((0.01D0+FA)/FB) +C... Choice if z, preweighted for peaks at low or high z + 100 Z=S_RNDM(0) + IDIV=1 + FPRE=1.D0 + IF (ZMAX.LT.0.1D0) THEN + IF(1.D0.LT.S_RNDM(1)*(1.D0-dLOG(ZDIV))) IDIV=2 + IF (IDIV.EQ.1) Z=ZDIV*Z + IF (IDIV.EQ.2) Z=ZDIV**Z + IF (IDIV.EQ.2) FPRE=ZDIV/Z + ELSEIF (ZMAX.GT.0.85D0) THEN + IF(1.D0.LT.S_RNDM(2)*(FB*(1.D0-ZDIV)+1.D0)) IDIV=2 + IF (IDIV.EQ.1) Z=ZDIV+dLOG(Z)/FB + IF (IDIV.EQ.1) FPRE=dEXP(FB*(Z-ZDIV)) + IF (IDIV.EQ.2) Z=ZDIV+Z*(1.D0-ZDIV) + ENDIF +C...weighting according to the correct formula + IF (Z.LE.FB/(50.D0+FB).OR.Z.GE.1.D0) GOTO 100 + FVAL=(ZMAX/Z)*dEXP(FB*(1.D0/ZMAX-1.D0/Z)) + IF(FA.GT.0.01D0) FVAL=((1.D0-Z)/(1.D0-ZMAX))**FA*FVAL + IF(FVAL.LT.S_RNDM(3)*FPRE) GOTO 100 + ZDIS_4FLV=Z + + ENDIF + + RETURN + END +C======================================================================= + + SUBROUTINE ZNORMAL + +C----------------------------------------------------------------------- +C... normalisation for Peterson/SLAC frag. func + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + DOUBLE PRECISION ZDMAX, EPSI + COMMON /S_CZDISc/ ZDMAX, EPSI + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + SAVE + +c get the maximum zmefn value first for normalisation + jmax = 1000 + zdmax = 1.D-10 + + DO j = 1, jmax + z = dble(j)/dble(jmax+1) + zdmax = max(zdmax, zmefn(z,epsi)) + enddo + if (ndebug .gt. 0) WRITE(LUN,*)' ZDMAX,EPS:',zdmax, epsi + RETURN + END +C======================================================================= + + FUNCTION ZMEFN(z,eps) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + SAVE + +C... Peterson/SLAC frag. func +cdh zmefn = (z*(1.D0-z**(-1)-eps/(1.D0-z))**2)**(-1) + zmefn = 1.D0/(z*(1.D0-z**(-1)-eps/(1.D0-z))**2) + RETURN + END + +C======================================================================= + + FUNCTION ZBLEAD (LB) + +C----------------------------------------------------------------------- +C...fragmentation function for leading baryon +C. simple form: f(z) = a + x**b +C INPUT : LB = particle code. +C.................................................. + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + DOUBLE PRECISION CLEAD, FLEAD + COMMON /S_CZLEAD/ CLEAD, FLEAD + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + +c ncall = ncall + 1 +c print*,'leading baryon frag. called:',lb,ncall + +C... leading z lower bound +c used for protons only in Sib21 (if ..) +c used for all baryons alike in Sib22 (else..) + ZLMIN = PAR(55) + ZSMR = PAR(56) + + IF(IPAR(30).ne.0)THEN +C Sibyll 2.1 hard fragmentation function + + IC = ICHP(LB)*ISIGN(1,LB) + + if (LB.ge.34.and.LB.le.39) then ! Lambda's and Sigma's + IF(IPAR(35).eq.1)then + zblead=zdisn(1) ! zblead**2 !soft + ELSE + 665 ZBLEAD = S_RNDM(LB) + if (zblead.le.0.01D0) goto 665 + ENDIF +c zblead=zdisn(1) ! blead**2 ! soft + elseif (ic.eq.0) then + if(IPAR(30).eq.2)then + 555 zblead = S_RNDM(1) + if (zblead .le. 0.01D0) goto 555 + else + zblead=zdisn(1) ! blead**2 !soft + endif + elseif (ic.eq.1) then ! fast protons only + if (abs(lb).eq.13) then + 661 IF (S_RNDM(2) .LT. CLEAD) THEN + 666 ZBLEAD = S_RNDM(0) + if (zblead.le.0.01D0) goto 666 + ELSE + zblead=1.D0-zdisn(1) ! zblead**2 !hard + ENDIF +c truncated zblead to fix antiprotons + if (zblead.le.ZLMIN+ZSMR*(1.D0-2.D0*S_RNDM(LB))) goto 661 + else + zblead=zdisn(1) ! zblead**2 !hard + endif + else if (ic.eq.2) then ! fast delta++ + zblead=1.D0- zdisn(1) ! (zblead)**.3333 + else + zblead=S_RNDM(0) ! zdisn(1) !hard + endif + RETURN + ELSE +C... Sein's flat baryon fragmentation function a.k.a. Sibyll 2.2 + 999 zblead = S_RNDM(0) + if (zblead .le. 0.01D0) goto 999 +c truncated zblead to fix instring pair production (antiprotons) + if (zblead.le.ZLMIN+ZSMR*(1.D0-2.D0*S_RNDM(LB))) goto 999 + RETURN + ENDIF + END + +C======================================================================= + + FUNCTION ZDISN (n) + +C----------------------------------------------------------------------- +C...Generate (1-x)**n + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + SAVE + +666 rmin=1.1D0 + do i=1,n+1 + R1=S_RNDM(i) + IF (R1.LE.RMIN) RMIN=R1 + ENDDO + ZDISn=RMIN + if (zdisn.le.0.01D0) goto 666 + if (zdisn.ge.0.99D0) goto 666 + END +C======================================================================= + + SUBROUTINE SIB_SIG(Jint,SIB_SQS,SIB_PTmin,SIB_SIG_tot, + & SIB_SIG_ine,SIB_diff,SIB_diff2,SIB_B_el,SIB_PJET) + +C----------------------------------------------------------------------- +C +C...SIBYLL 2.1 cross sections +C +C input parameter: SIB_SQS c.m.s. energy (GeV) +C Jint 1 p-p cross sections +C 2 pi-p cross sections +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + DOUBLE PRECISION SIB_PJET(0:NS_max,0:NH_max) + DOUBLE PRECISION SIB_SQS,SIB_PTmin, + & SIB_SIG_ine,SIB_SIG_tot,SIB_diff(3),SIB_diff2(3,2),SIB_B_el + + + COMMON /SIGMAS/SQS,SIGTOT,SIGEL,SIGINE, + & SIGSD1(2),SIGSD2(2),SIGDD(2), + & SLOPE,SLOPEc,RHO,PROB(0:NS_max,0:NH_max),SIGSUM + + + COMMON /PROFILE/XNUS2,XMUS2,XNUSPI2, + & XNUH2,XMUH2,XNUHPI2, + & ENHPP,ENHPIP,al1,be1,al2,be2 + + COMMON /S_CHDCNV/ABR(2,400),ABP(2,400),ABH(2,400),DB,NB + + DIMENSION XI(50) + + DIMENSION SIG_BRN(3) + DIMENSION SIG_dif_1(2),SIG_dif_2(2),SIG_dd(2) + + DIMENSION IHAR(2) + + PARAMETER ( NPARFIT = 22 ) + DOUBLE PRECISION PARS + COMMON /XSCTN_FIT/ PARS( 50 , 2 ) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + COMMON /QCD_XSCTN/SIGQCD(61,2),INIT + DOUBLE PRECISION SIGQCD + SAVE + DATA INIT /0/ + DATA (SIGQCD(K,1),K= 1, 61) / + &8.4663D-02,1.8246D-01,3.3880D-01,5.6845D-01,8.8686D-01,1.3116D+00, + &1.8626D+00,2.5645D+00,3.4445D+00,4.5343D+00,5.8715D+00,7.4962D+00, + &9.4579D+00,1.1811D+01,1.4620D+01,1.7955D+01,2.1890D+01,2.6522D+01, + &3.1952D+01,3.8303D+01,4.5704D+01,5.4307D+01,6.4284D+01,7.5818D+01, + &8.9121D+01,1.0447D+02,1.2213D+02,1.4240D+02,1.6562D+02,1.9221D+02, + &2.2260D+02,2.5733D+02,2.9694D+02,3.4207D+02,3.9348D+02,4.5194D+02, + &5.1838D+02,5.9376D+02,6.7921D+02,7.7609D+02,8.8578D+02,1.0099D+03, + &1.1504D+03,1.3090D+03,1.4882D+03,1.6903D+03,1.9183D+03,2.1754D+03, + &2.4650D+03,2.7912D+03,3.1582D+03,3.5707D+03,4.0341D+03,4.5538D+03, + &5.1360D+03,5.7883D+03,6.5193D+03,7.3358D+03,8.2428D+03,9.2498D+03, + &1.0369D+04/ + DATA (SIGQCD(K,2),K= 1, 61) / + &1.5665D-01,2.8800D-01,4.7863D-01,7.4235D-01,1.0949D+00,1.5547D+00, + &2.1433D+00,2.8859D+00,3.8118D+00,4.9547D+00,6.3534D+00,8.0525D+00, + &1.0103D+01,1.2563D+01,1.5498D+01,1.8986D+01,2.3111D+01,2.7971D+01, + &3.3678D+01,4.0358D+01,4.8154D+01,5.7228D+01,6.7762D+01,7.9965D+01, + &9.4071D+01,1.1034D+02,1.2909D+02,1.5063D+02,1.7536D+02,2.0370D+02, + &2.3613D+02,2.7321D+02,3.1553D+02,3.6379D+02,4.1875D+02,4.8129D+02, + &5.5238D+02,6.3311D+02,7.2470D+02,8.2854D+02,9.4614D+02,1.0792D+03, + &1.2298D+03,1.3999D+03,1.5920D+03,1.8089D+03,2.0534D+03,2.3291D+03, + &2.6396D+03,2.9892D+03,3.3825D+03,3.8248D+03,4.3219D+03,4.8803D+03, + &5.5072D+03,6.2109D+03,7.0001D+03,7.8849D+03,8.8764D+03,9.9871D+03, + &1.1231D+04/ + + + IF(INIT.EQ.0) THEN +* CALL HAR_INI + CALL FACT_INI + IHAR(1) = 0 + IHAR(2) = 0 + INIT = 1 + ENDIF + + ECM = SIB_SQS + + IF(JINT.EQ.1) THEN +c K = 1 , proton + DO K=1,NPARFIT + XI(K) = PARS(K,1) + ENDDO + + ELSE IF(JINT.EQ.2) THEN +c K = 2 , pion + DO K=1,NPARFIT + XI(K) = PARS(K,2) + ENDDO + + ENDIF + + XNUS2 = XI(12) + XMUS2 = XI(13) + XNUSPI2 = XI(14) + + XNUH2 = XI(15) + XMUH2 = XI(16) + XNUHPI2 = XI(17) + + CALL HAD_CONV(IABS(JINT)) + + PTCUT = XI(10)+XI(21)*dEXP(XI(22)*DSQRT(2.D0*dLOG(ECM))) + INDX = abs(JINT) + IHAR(INDX) = IHAR(INDX)+1 + SIGHAR = SIGQCD(IHAR(INDX),INDX) + + S = ECM**2 + + BREG = ABS(XI(18)) + XI(19)*dLOG(S) + BPOM = ABS(XI(12)) + XI(13)*dLOG(S) + IK = ABS(JINT) + DO JB=1,NB + B = DB*DBLE(JB-1) + ABR(IK,JB) = 2.D0/(8.D0*PI*BREG)*dEXP(-B**2/(4.D0*BREG)) + ABP(IK,JB) = 2.D0/(8.D0*PI*BPOM)*dEXP(-B**2/(4.D0*BPOM)) + ENDDO + +C reggeon + SIGSR = ABS(XI(2))*S**(-ABS(XI(4))) + SIG_BRN(1) = SIGSR/CMBARN +C pomeron (soft part) + SIGSP = ABS(XI(1))*S**ABS(XI(3)) + SIG_BRN(2) = SIGSP/CMBARN +C pomeron (hard part) + SIG_BRN(3) = SIGHAR/CMBARN + +C 2x2 channel low-mass model and separate high-mass diffraction + + al1 = XI(5) + be1 = XI(6) + al2 = al1 + be2 = be1 + EnhPP = XI(9) + EnhPiP = EnhPP + + CALL SIG_JET_3 (SIG_brn,JINT,SIG_tot,SIG_ela,SIG_ine,SIG_sum, + & SIG_dif_1,SIG_dif_2,SIG_dd,B_el,PROB) + + SIGTOT = SIG_tot*CMBARN + SIGINE = SIG_ine*CMBARN + SIGSUM = SIG_sum*CMBARN + SIGELc = SIGTOT-SIGINE + SIGEL = SIG_ela*CMBARN + SIGSD1(1) = SIG_dif_1(1)*CMBARN + SIGSD1(2) = SIG_dif_1(2)*CMBARN + SIGSD2(1) = SIG_dif_2(1)*CMBARN + SIGSD2(2) = SIG_dif_2(2)*CMBARN + SIGDD(1) = SIG_dd(1)*CMBARN + SIGDD(2) = SIG_dd(2)*CMBARN + SLOPE = B_EL + SLOPEc = SIG_tot**2/(16.D0*PI*SIG_ela) + + DE = ABS(SIGEL+SIGINE-SIGTOT)/SIGTOT + IF(DE.GT.0.01D0) THEN + print *,'SIBSIG: Ecm: ',ECM + print *,' SIGTOT: ',SIGTOT + print *,' SIGEL1/2: ',SIGEL,SIGELc + print *,' SLOPE1/2: ',SLOPE,SLOPEc + print *,' SIGDIF 1: ',SIGSD1 + print *,' SIGDIF 2: ',SIGSD2 + print *,' SIGDDIF: ',SIGDD + print *,' SUM-SIGTOT: ',SIGEL+SIGINE-SIGTOT + ENDIF + +C SIBYLL interface to single precision + + SIB_PTmin = PTCUT + SIB_SIG_tot = SIGTOT + SIB_SIG_ine = SIGINE + SIB_diff(1) = SIGSD1(1)+SIGSD1(2) + SIB_diff(2) = SIGSD2(1)+SIGSD2(2) + SIB_diff(3) = SIGDD(1)+SIGDD(2) + SIB_B_el = SLOPE + DO I=0,NS_max + DO K=0,NH_max + SIB_PJET(I,K) = PROB(I,K) + ENDDO + ENDDO +c full diff. cross section +c ( ( b.single , t.single , double ) , ( low mass , high mass ) ) + SIB_diff2(1,1) = SIGSD1(1) + SIB_diff2(1,2) = SIGSD1(2) + SIB_diff2(2,1) = SIGSD2(1) + SIB_diff2(2,2) = SIGSD2(2) + SIB_diff2(3,1) = SIGDD(1) + SIB_diff2(3,2) = SIGDD(2) + END + +C======================================================================= + + SUBROUTINE SIG_JET_3 (SIG_brn, JINT, SIG_TOT, SIG_ELA, + & SIG_INE, SIG_sum, SIG_DIF1, SIG_DIF2, SIG_DD, B_EL, P_int) + +C----------------------------------------------------------------------- +C +C...This subroutine receives in INPUT: +C. SIG_brn (GeV-2) Born graph cross sections +C. JINT (1 = pp interaction) (2 pi-p interaction) +C. neg. value: without calculation of interaction probabilities +C. +C. and returns as output: +C. SIG_??? , B_el +C. and P_int(0:NS_max,0:NH_max) interaction probabilities +C +C two x two -channel approximation for diffraction +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) + + DIMENSION SIG_brn(3) + PARAMETER (NS_max = 20, NH_max = 80) + + COMMON /S_CFACT/ FACT(0:NH_max), CO_BIN(0:NH_max,0:NH_max) + COMMON /S_CHDCNV/ABR(2,400),ABP(2,400),ABH(2,400),DB,NB + + COMMON /PROFILE/XNUS2,XMUS2,XNUSPI2, + & XNUH2,XMUH2,XNUHPI2, + & EnhPP,EnhPiP,al1,be1,al2,be2 + + DIMENSION SIG_DIF1(2),SIG_DIF2(2),SIG_DD(2), + & P_int(0:NS_max,0:NH_max) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + DOUBLE PRECISION EPS100 + SAVE + DATA EPS100 /1.D-100/ + + DO J=0,NH_max + DO I=0,NS_max + P_int(I,J) = 0.D0 + ENDDO + ENDDO + + ga1 = dsqrt(al1*al1+be1*be1) + ga2 = dsqrt(al2*al2+be2*be2) + + fe_a_1 = (1.D0+al1/ga1)/2.D0 + fe_a_2 = (1.D0-al1/ga1)/2.D0 + fd_a_1 = sqrt(1.D0-(al1/ga1)**2)/2.D0 + fd_a_2 = -fd_a_1 + + fe_b_1 = (1.D0+al2/ga2)/2.D0 + fe_b_2 = (1.D0-al2/ga2)/2.D0 + fd_b_1 = dsqrt(1.D0-(al2/ga2)**2)/2.D0 + fd_b_2 = -fd_b_1 + + fe_11 = fe_a_1*fe_b_1 + fe_22 = fe_a_2*fe_b_2 + fe_12 = fe_a_1*fe_b_2 + fe_21 = fe_a_2*fe_b_1 + + fd_a_11 = fd_a_1*fe_b_1 + fd_a_22 = fd_a_2*fe_b_2 + fd_a_12 = fd_a_1*fe_b_2 + fd_a_21 = fd_a_2*fe_b_1 + + fd_b_11 = fe_a_1*fd_b_1 + fd_b_22 = fe_a_2*fd_b_2 + fd_b_12 = fe_a_1*fd_b_2 + fd_b_21 = fe_a_2*fd_b_1 + + fdd_11 = fd_a_1*fd_b_1 + fdd_22 = fd_a_2*fd_b_2 + fdd_12 = fd_a_1*fd_b_2 + fdd_21 = fd_a_2*fd_b_1 + + + sum_abs = 0.D0 + sum_tot = 0.D0 + sum_ela = 0.D0 + sum_sd_a = 0.D0 + sum_sd_b = 0.D0 + sum_dd = 0.D0 + sum_B = 0.D0 + + IK = ABS(JINT) + if(JINT.GT.0) then + I0MAX = NS_max + J0MAX = NH_max + ELSE + I0MAX = 1 + J0MAX = 1 + ENDIF + SIG_REG = SIG_BRN(1) + SIG_POM = SIG_BRN(2) + SIG_HAR = SIG_BRN(3) + + DO JB=1,NB + + B = DB*DBLE(JB-1) + + ABREG = ABR(IK,JB) + ABPOM = ABP(IK,JB) + ABHAR = ABH(IK,JB) + + chi2_soft = ABREG*SIG_REG+ABPOM*SIG_POM + chi2_soft_11 = (1.D0-al1+ga1)*(1.D0-al2+ga2)*chi2_soft + chi2_soft_22 = (1.D0-al1-ga1)*(1.D0-al2-ga2)*chi2_soft + chi2_soft_12 = (1.D0-al1+ga1)*(1.D0-al2-ga2)*chi2_soft + chi2_soft_21 = (1.D0-al1-ga1)*(1.D0-al2+ga2)*chi2_soft + + chi2_hard = ABHAR*SIG_HAR + chi2_hard_11 = (1.D0-al1+ga1)*(1.D0-al2+ga2)*chi2_hard + chi2_hard_22 = (1.D0-al1-ga1)*(1.D0-al2-ga2)*chi2_hard + chi2_hard_12 = (1.D0-al1+ga1)*(1.D0-al2-ga2)*chi2_hard + chi2_hard_21 = (1.D0-al1-ga1)*(1.D0-al2+ga2)*chi2_hard + + ef_11 = max(-0.5D0*(chi2_soft_11+chi2_hard_11),log(EPS100)) + ef_22 = max(-0.5D0*(chi2_soft_22+chi2_hard_22),log(EPS100)) + ef_12 = max(-0.5D0*(chi2_soft_12+chi2_hard_12),log(EPS100)) + ef_21 = max(-0.5D0*(chi2_soft_21+chi2_hard_21),log(EPS100)) + + ef_11 = dexp(ef_11) + ef_22 = dexp(ef_22) + ef_12 = dexp(ef_12) + ef_21 = dexp(ef_21) + + esf_11 = max(ef_11,EPS100)**2 + esf_22 = max(ef_22,EPS100)**2 + esf_12 = max(ef_12,EPS100)**2 + esf_21 = max(ef_21,EPS100)**2 + + F_ine = B*(1.D0 - fe_11*esf_11 - fe_12*esf_12 + & - fe_21*esf_21 - fe_22*esf_22) + F_tot = 1.D0 - fe_11*ef_11 - fe_12*ef_12 + & - fe_21*ef_21 - fe_22*ef_22 + F_ela = B*F_tot**2 + F_tot = B*F_tot + + F_sd_a = B*(fd_a_11*ef_11 + fd_a_12*ef_12 + & + fd_a_21*ef_21 + fd_a_22*ef_22)**2 + F_sd_b = B*(fd_b_11*ef_11 + fd_b_12*ef_12 + & + fd_b_21*ef_21 + fd_b_22*ef_22)**2 + F_dd = B*(fdd_11*ef_11 + fdd_12*ef_12 + & + fdd_21*ef_21 + fdd_22*ef_22)**2 + + sum_abs = sum_abs+F_ine + sum_tot = sum_tot+F_tot + sum_ela = sum_ela+F_ela + + sum_sd_a = sum_sd_a+F_sd_a + sum_sd_b = sum_sd_b+F_sd_b + sum_dd = sum_dd +F_dd + + sum_B = sum_b+B**2*F_tot + + fac_11 = B*esf_11 + fac_22 = B*esf_22 + fac_12 = B*esf_12 + fac_21 = B*esf_21 + soft_rec_11 = 1.D0/chi2_soft_11 + soft_rec_22 = 1.D0/chi2_soft_22 + soft_rec_12 = 1.D0/chi2_soft_12 + soft_rec_21 = 1.D0/chi2_soft_21 + chi2_hard_11 = max(chi2_hard_11,EPS100) + chi2_hard_22 = max(chi2_hard_22,EPS100) + chi2_hard_12 = max(chi2_hard_12,EPS100) + chi2_hard_21 = max(chi2_hard_21,EPS100) + DO I=0,I0MAX + soft_rec_11 = max(soft_rec_11*chi2_soft_11,EPS100) + soft_rec_22 = max(soft_rec_22*chi2_soft_22,EPS100) + soft_rec_12 = max(soft_rec_12*chi2_soft_12,EPS100) + soft_rec_21 = max(soft_rec_21*chi2_soft_21,EPS100) + hard_rec_11 = max(1.D0/chi2_hard_11,EPS100) + hard_rec_22 = max(1.D0/chi2_hard_22,EPS100) + hard_rec_12 = max(1.D0/chi2_hard_12,EPS100) + hard_rec_21 = max(1.D0/chi2_hard_21,EPS100) + DO J=0,J0MAX + hard_rec_11 = max(hard_rec_11*chi2_hard_11,EPS100) + hard_rec_22 = max(hard_rec_22*chi2_hard_22,EPS100) + hard_rec_12 = max(hard_rec_12*chi2_hard_12,EPS100) + hard_rec_21 = max(hard_rec_21*chi2_hard_21,EPS100) + P_int(I,J) = P_int(I,J) + & + fe_11*soft_rec_11*hard_rec_11*fac_11 + & + fe_22*soft_rec_22*hard_rec_22*fac_22 + & + fe_12*soft_rec_12*hard_rec_12*fac_12 + & + fe_21*soft_rec_21*hard_rec_21*fac_21 + ENDDO + ENDDO + + ENDDO + + SIG_abs = SUM_abs*TWOPI*DB + SIG_tot = SUM_tot*4.D0*PI*DB + SIG_ela = SUM_ela*TWOPI*DB + SIG_dif1(1) = SUM_sd_a*TWOPI*DB + SIG_dif2(1) = SUM_sd_b*TWOPI*DB + SIG_dd(1) = SUM_dd*TWOPI*DB + SIG_ine = SIG_abs + SIG_dif1(1) + SIG_dif2(1) + SIG_dd(1) + B_EL = sum_B/SUM_tot/2.D0 + + SA = 0.D0 + P_int(0,0) = 0.D0 + DO I=0,I0MAX + DO J=0,J0MAX + fac = FACT(I)*FACT(J) + P_int(I,J) = P_int(I,J)/fac + SA = SA + P_int(I,J) + ENDDO + ENDDO + + SIG_hmsd = EnhPP*(P_int(1,0)+P_int(0,1))*TWOPI*DB + SIG_hmdd = be1**2*SIG_hmsd + be2**2*SIG_hmsd + & + EnhPP**2*P_int(1,1)*TWOPI*DB + + SIG_dif1(2) = SIG_hmsd + SIG_dif2(2) = SIG_hmsd + SIG_dd(2) = SIG_hmdd + + SIG_sum = SA*TWOPI*DB + + DO I=0,I0MAX + DO J=0,J0MAX + P_int(I,J) = P_int(I,J)/SA + ENDDO + ENDDO + + END + +C======================================================================= + + SUBROUTINE HAD_CONV(JINT) + +C----------------------------------------------------------------------- +C +C...Convolution of hadrons profile +C. [function A(b) of Durand and Pi] +C. precalculate and put in COMMON block +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) +C + COMMON /S_CHDCNV/ABR(2,400),ABP(2,400),ABH(2,400),DB,NB + + DOUBLE PRECISION NU2, MU2, NUPI2, NU, MU, NUPI + COMMON /S_CH0CNV/ NU2, MU2, NUPI2, NU, MU, NUPI + +C + COMMON /PROFILE/XNUS2,XMUS2,XNUSPI2, + & XNUH2,XMUH2,XNUHPI2, + & ENHPP,ENHPIP,al1,be1,al2,be2 + SAVE + +C...integration constants + BMAX = 50.D0 + NB = 400 + DB = BMAX/DBLE(NB) + +C soft reggeon interactions + + NU2 = XNUS2 + MU2 = XMUS2 + NUPI2 = XNUSPI2 + + NU = SQRT(NU2) + MU = SQRT(ABS(MU2)) + NUPI = SQRT(NUPI2) + + DO JB=1,NB + B = DB*DBLE(JB-1) + IF(JINT.EQ.1) THEN + ABR(JINT,JB) = A_PP(B) + ELSE + ABR(JINT,JB) = A_PIP(B) + ENDIF + ENDDO + +C soft pomeron interactions + + NU2 = XNUS2 + MU2 = XMUS2 + NUPI2 = XNUSPI2 + + NU = SQRT(NU2) + MU = SQRT(ABS(MU2)) + NUPI = SQRT(NUPI2) + + DO JB=1,NB + B = DB*DBLE(JB-1) + IF(JINT.EQ.1) THEN + ABP(JINT,JB) = A_PP(B) + ELSE + ABP(JINT,JB) = A_PIP(B) + ENDIF + ENDDO + +C hard pomeron interactions + + NU2 = XNUH2 + MU2 = XMUH2 + NUPI2 = XNUHPI2 + + NU = SQRT(NU2) + MU = SQRT(ABS(MU2)) + NUPI = SQRT(NUPI2) + + DB = BMAX/DBLE(NB) + DO JB=1,NB + B = DB*DBLE(JB-1) + IF(JINT.EQ.1) THEN + ABH(JINT,JB) = A_PP(B) + ELSE + ABH(JINT,JB) = A_PIP(B) + ENDIF + ENDDO + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION A_PP (b) + +C----------------------------------------------------------------------- +C...Convolution of parton distribution for pp interaction + IMPLICIT DOUBLE PRECISION (A-Z) +C + DOUBLE PRECISION NU2, MU2, NUPI2, NU, MU, NUPI + COMMON /S_CH0CNV/ NU2, MU2, NUPI2, NU, MU, NUPI + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + SAVE + + ETA = NU2/MU2 + + IF(ETA.LT.0.D0) THEN + + c = nu**5/(96.D0*PI) + if (b .gt. 0.0001D0) then + A_pp = c*b**3 * bessk (3, b*nu) + else + A_pp = nu**2/(12.D0*PI) + endif + + ELSE + + X = B*NU + Y = B*MU + C = NU2/(12.D0*PI)/(1.D0-ETA)**2 + IF(X.GT.0.0001D0) THEN + A_PP = C*(1.D0/8.D0*X**3*BESSK(3,X) + & -3.D0/2.D0*ETA/(1.D0-ETA)*X**2*BESSK(2,X) + & + 9.D0*ETA**2/(1.D0-ETA)**2*X*BESSK1(X) + & -24.D0*ETA**3/(1.D0-ETA)**3*(BESSK0(X)-BESSK0(Y)) + & + 3.D0*ETA**3/(1.D0-ETA)**2*Y*BESSK1(Y)) + ELSE + A_PP = C*(1.D0 /8.D0*8.D0 + & -3.D0/2.D0*ETA/(1.D0-ETA)*2.D0 + & +9.D0*ETA**2/(1.D0-ETA)**2*1.D0 + & -24.D0*ETA**3/(1.D0-ETA)**3*LOG(MU/NU) + & +3.D0*ETA**3/(1.D0-ETA)**2*1.D0) + ENDIF + + ENDIF + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION A_PIP (b) + +C----------------------------------------------------------------------- +C...Convolution of parton distribution for pip interaction +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-Z) +C + DOUBLE PRECISION NU2, MU2, NUPI2, NU, MU, NUPI + COMMON /S_CH0CNV/ NU2, MU2, NUPI2, NU, MU, NUPI + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + SAVE + + eta = nu2/nupi2 + c = nu2/(2.D0*PI) * 1.D0/(1.D0-eta) + + if (b .gt. 0.0001D0) then + b1 = b*nu + b2 = b*nupi + f1 = 0.5D0*b1 * bessk1(b1) + f2 = eta/(1.D0-eta)*(bessk0(b2)- bessk0(b1)) + A_pip = c*(f1+f2) + else + A_pip = c*(0.5D0 + eta/(1.D0-eta)*log(nu/nupi)) + endif + return + end +C +C +C----------------------------------------------------------------------- +C Bessel functions +C======================================================================= + + FUNCTION BESSK0(X) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) +C + DOUBLE PRECISION P1,P2,P3,P4,P5,P6,P7, + * Q1,Q2,Q3,Q4,Q5,Q6,Q7 + SAVE + DATA P1,P2,P3,P4,P5,P6,P7/-0.57721566D0,0.42278420D0, + * 0.23069756D0,0.3488590D-1,0.262698D-2,0.10750D-3,0.74D-5/ + DATA Q1,Q2,Q3,Q4,Q5,Q6,Q7/1.25331414D0,-0.7832358D-1, + * 0.2189568D-1,-0.1062446D-1,0.587872D-2,-0.251540D-2,0.53208D-3/ + + IF (X.LE.2.0D0) THEN + Y=X*X/4.D0 + BESSK0=(-LOG(X/2.D0)*BESSI0(X))+(P1+Y*(P2+Y*(P3+ + * Y*(P4+Y*(P5+Y*(P6+Y*P7)))))) + ELSE + Y=(2.D0/X) + BESSK0=(EXP(-X)/SQRT(X))*(Q1+Y*(Q2+Y*(Q3+ + * Y*(Q4+Y*(Q5+Y*(Q6+Y*Q7)))))) + ENDIF + RETURN + END +C +C======================================================================= + + FUNCTION BESSK1(X) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) +C + DOUBLE PRECISION P1,P2,P3,P4,P5,P6,P7, + * Q1,Q2,Q3,Q4,Q5,Q6,Q7 + SAVE + DATA P1,P2,P3,P4,P5,P6,P7/1.0D0,0.15443144D0,-0.67278579D0, + * -0.18156897D0,-0.1919402D-1,-0.110404D-2,-0.4686D-4/ + DATA Q1,Q2,Q3,Q4,Q5,Q6,Q7/1.25331414D0,0.23498619D0, + * -0.3655620D-1,0.1504268D-1,-0.780353D-2,0.325614D-2, + * -0.68245D-3/ + + IF (X.LE.2.D0) THEN + Y=X*X/4.D0 + BESSK1=(LOG(X/2.D0)*BESSI1(X))+(1.D0/X)*(P1+Y*(P2+ + * Y*(P3+Y*(P4+Y*(P5+Y*(P6+Y*P7)))))) + ELSE + Y=2.D0/X + BESSK1=(EXP(-X)/SQRT(X))*(Q1+Y*(Q2+Y*(Q3+ + * Y*(Q4+Y*(Q5+Y*(Q6+Y*Q7)))))) + ENDIF + RETURN + END +C +C======================================================================= + + FUNCTION BESSK(N,X) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) + SAVE +C + IF (N.LT.2) stop 'bad argument N in BESSK' + TOX=2.D0/X + BKM=BESSK0(X) + BK=BESSK1(X) + DO 11 J=1,N-1 + BKP=BKM+J*TOX*BK + BKM=BK + BK=BKP +11 CONTINUE + BESSK=BK + RETURN + END +C +C======================================================================= + + FUNCTION BESSI0(X) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) +C + DOUBLE PRECISION P1,P2,P3,P4,P5,P6,P7, + * Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9 + SAVE + DATA P1,P2,P3,P4,P5,P6,P7/1.0D0,3.5156229D0,3.0899424D0, + * 1.2067492D0, 0.2659732D0,0.360768D-1,0.45813D-2/ + DATA Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9/0.39894228D0,0.1328592D-1, + * 0.225319D-2,-0.157565D-2,0.916281D-2,-0.2057706D-1, + * 0.2635537D-1,-0.1647633D-1,0.392377D-2/ + + IF (ABS(X).LT.3.75D0) THEN + Y=(X/3.75D0)**2 + BESSI0=P1+Y*(P2+Y*(P3+Y*(P4+Y*(P5+Y*(P6+Y*P7))))) + ELSE + AX=ABS(X) + Y=3.75D0/AX + BESSI0=(EXP(AX)/SQRT(AX))*(Q1+Y*(Q2+Y*(Q3+Y*(Q4 + * +Y*(Q5+Y*(Q6+Y*(Q7+Y*(Q8+Y*Q9)))))))) + ENDIF + RETURN + END +C +C======================================================================= + + FUNCTION BESSI1(X) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) +C + DOUBLE PRECISION P1,P2,P3,P4,P5,P6,P7, + * Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9 + SAVE + DATA P1,P2,P3,P4,P5,P6,P7/0.5D0,0.87890594D0,0.51498869D0, + * 0.15084934D0,0.2658733D-1,0.301532D-2,0.32411D-3/ + DATA Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9/0.39894228D0,-0.3988024D-1, + * -0.362018D-2,0.163801D-2,-0.1031555D-1,0.2282967D-1, + * -0.2895312D-1,0.1787654D-1,-0.420059D-2/ + + IF (ABS(X).LT.3.75D0) THEN + Y=(X/3.75D0)**2 + BESSI1=X*(P1+Y*(P2+Y*(P3+Y*(P4+Y*(P5+Y*(P6+Y*P7)))))) + ELSE + AX=ABS(X) + Y=3.75D0/AX + BESSI1=(EXP(AX)/SQRT(AX))*(Q1+Y*(Q2+Y*(Q3+Y*(Q4+ + * Y*(Q5+Y*(Q6+Y*(Q7+Y*(Q8+Y*Q9)))))))) + ENDIF + RETURN + END + +C======================================================================= + + SUBROUTINE FACT_INI + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + COMMON /S_CFACT/ FACT(0:NH_max), CO_BIN(0:NH_max,0:NH_max) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + + FACT(0) = 1.D0 + FACT(NS_max) = 1.D0 ! avoid unused warning and keep parameter block + DO J=1,NH_max + FACT(J) = FACT(J-1)*DBLE(J) + ENDDO + DO J=0,NH_max + DO K=0,J + CO_BIN(J,K) = FACT(J)/(FACT(K)*FACT(J-K)) + ENDDO + ENDDO + + END +cC======================================================================= +c +c SUBROUTINE SAMPLE_SOFT (STR_mass_min, X1,X2,PT) +c +C----------------------------------------------------------------------- +C... Routine for the sampling the kinematical variables of sea quarks +C. according to (1-x)**b / x**2 +C. INPUT: STR_mass_min : minimal string mass ** 2 = x1 * x2 * s +C. SLOPE : large x suppression exponent +C. OUTPUT: gluon 4momenta on parton stack (GeV) /FR'14 +C----------------------------------------------------------------------- +c IMPLICIT DOUBLE PRECISION (A-H,O-Z) +c IMPLICIT INTEGER(I-N) +c +c INTEGER NW_max +c PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- +c +c EVENT INFO COMMON +c contains overall interaction properties, like +c SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target +c DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN +c INTEGER KB,IAT,KT +c COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT +c +c INTEGER NCALL, NDEBUG, LUN +c COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +c +c DOUBLE PRECISION PPT02 +c COMMON /S_CQDIS2/ PPT02(44) +c INTEGER NIPAR_max,NPAR_max +c PARAMETER (NPAR_max=200,NIPAR_max=100) +c DOUBLE PRECISION PAR +c INTEGER IPAR +c COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) +c +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- +c DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 +c COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 +c +c DOUBLE PRECISION PI,TWOPI,CMBARN +c COMMON /SIB_CST/ PI,TWOPI,CMBARN +c +c DOUBLE PRECISION FACN +c DIMENSION FACN(3:10) +c COMMON /SIB_FAC/ FACN +c SAVE +c +c SLOPE = max(1.D0,PAR(42)) +c ZSOF = 2.D0*dLOG(STR_mass_min/SQS) ! minim. mass ~ x1 * x2 +c 50 XMIN = dEXP(ZSOF) +c axmin = 1.D0/xmin +c 100 Z1 = -1.D0*dLOG(axmin-(axmin-1.D0)*S_RNDM(0)) +c x1 = dexp(z1) +c XR = dlog(1.D0-X1) - dlog(1.D0-xmin) +c if(SLOPE*XR.le.log(S_RNDM(0))) goto 100 +c +c 200 Z2 = -1.D0*dLOG(axmin-(axmin-1.D0)*S_RNDM(0)) +c X2 = dEXP(Z2) +c XR = dlog(1.D0-X2) - dlog(1.D0-dEXP(ZSOF)) +c if(SLOPE*XR.le.dlog(S_RNDM(0))) goto 200 +c +c IF(Z1+Z2.LE.ZSOF) GOTO 50 +c STR_mass2 = dsqrt(X1*X2*S)/2.D0 +c PPTT = PPT02(10) +c 150 PT = PPTT*dSQRT(-dLOG(MAX(EPS10,S_RNDM(0)))) +c IF(IPAR(3).eq.6)THEN +c XM = 0.D0 +c XM2 = XM**2 +c RNDM = MAX(EPS10,S_RNDM(IFL)) +c XMT = PPTT * dLOG(RNDM) - XM +c XMT2 = XMT**2 +c PT = dSQRT(XMT2-XM2) +c ENDIF +c IF(PT.GT.PTmin) GOTO 150 +c IF(PT.GE.STR_mass2) GOTO 150 +c END +c +cC======================================================================= +c +c SUBROUTINE SAMPLE_SOFT2 (STR_mass_min, X1,X2,PT) +c +C----------------------------------------------------------------------- +C...Routine for sampling the kinematical variables +C. that characterize a soft cut pomeron (x1,x2, pT) +C. from the differential cross section: +C. d3sigma/(dx1 dx2 dpT) +C. ~ 1/x_i**a .*. exp(-mT) +C. INPUT: STR_mass_min : minimal string mass defined by kinematic limits +C. of the string fragmentation +C. PAR: PAR(42) : exponent a +C. OUTPUT: X1, X2, PT (GeV) +C----------------------------------------------------------------------- +c IMPLICIT DOUBLE PRECISION (A-H,O-Z) +c IMPLICIT INTEGER(I-N) +c INTEGER NW_max +c PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- +c +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target +c DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN +c INTEGER KB,IAT,KT +c COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT +c +c INTEGER NCALL, NDEBUG, LUN +c COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +c +c DOUBLE PRECISION PPT02 +c COMMON /S_CQDIS2/ PPT02(44) +c INTEGER NIPAR_max,NPAR_max +c PARAMETER (NPAR_max=200,NIPAR_max=100) +c DOUBLE PRECISION PAR +c INTEGER IPAR +c COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) +c +cC-------------------------------------------------------------------- +cC SIBYLL utility common blocks containing constants \FR'14 +cC-------------------------------------------------------------------- +c DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 +c COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 +c +c DOUBLE PRECISION PI,TWOPI,CMBARN +c COMMON /SIB_CST/ PI,TWOPI,CMBARN +c +c DOUBLE PRECISION FACN +c DIMENSION FACN(3:10) +c COMMON /SIB_FAC/ FACN +c SAVE +c +c SLOPE = PAR(42) +c ZSOF = 2.D0*dLOG(STR_mass_min/SQS) ! zmin +c zsof = zsof * slope +c 100 Z1=1.D0/SLOPE*(-zsof*S_RNDM(0)+zsof) +c Z2=1.D0/SLOPE*(-zsof*S_RNDM(0)+zsof) +cc print *,'zsof,z1,z2',zsof,z1,z2 +c IF(Z1+Z2.LE.ZSOF) GOTO 100 +c X1=dEXP(Z1) +c X2=dEXP(Z2) +c STR_mass2 = sqrt(X1*X2*S)/2.D0 +c if(str_mass2.lt.0.9D0)goto 100 +c PPTT = PPT02(10) +cc print *,'ptmin,str_mass:',ptmin,str_mass2 +c 150 PT = PPTT*dSQRT(-dLOG(MAX(EPS10,S_RNDM(0)))) +c IF(IPAR(3).eq.6)THEN +c XM = 0.D0 +c XM2 = XM**2 +c RNDM = MAX(EPS10,S_RNDM(IFL)) +c XMT = PPTT * dLOG(RNDM) - XM +c XMT2 = XMT**2 +c PT = dSQRT(XMT2-XM2) +c ENDIF +c IF(PT.GT.PTmin) GOTO 150 +c IF(PT.GE.STR_mass2) GOTO 150 +c PHI = TWOPI*S_RNDM(L) +c END +cC======================================================================= +cc +c SUBROUTINE SAMPLE_SOFT3 (STR_mass_min, X1,X2,PT) +c +cC----------------------------------------------------------------------- +cC...Routine for the sampling the kinematical variables +cC. that characterize a soft cut pomeron (x1,x2, pT) +cC. from the differential cross section: +cC. d3sigma/(dx1 dx2 dpT) +cC. INPUT: L=1 incident proton, L=2 incident pi +cC. (soft strings identical for pi and p interactions) +cC. OUTPUT: X1, X2, PT (GeV) +cC----------------------------------------------------------------------- +c IMPLICIT DOUBLE PRECISION (A-H,O-Z) +c IMPLICIT INTEGER(I-N) +c INTEGER NW_max +c PARAMETER (NW_max = 20) +cC-------------------------------------------------------------------- +cC SIBYLL common blocks containing event information \FR'14 +cC-------------------------------------------------------------------- +c +cC EVENT INFO COMMON +cC contains overall interaction properties, like +cC SQS : center-of-mass energy +cC S : " " squared +cC PTmin : low pt cut of QCD cross section, +cC i.e. minimal pt of hard minijets +cC Xmin : low-x bound for PDFs, +cC i.e. minimal momentum fraction of hard partons +cC Zmin : logarithm of that +cC KB : PID of beam hadron +cC KT() : PID of target +cC IAT : mass number of target +c DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN +c INTEGER KB,IAT,KT +c COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT +c +c INTEGER NCALL, NDEBUG, LUN +c COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +c +c DOUBLE PRECISION PPT02 +c COMMON /S_CQDIS2/ PPT02(44) +c INTEGER NIPAR_max,NPAR_max +c PARAMETER (NPAR_max=200,NIPAR_max=100) +c DOUBLE PRECISION PAR +c INTEGER IPAR +c COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) +c +cC-------------------------------------------------------------------- +cC SIBYLL utility common blocks containing constants \FR'14 +cC-------------------------------------------------------------------- +c DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 +c COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 +c +c DOUBLE PRECISION PI,TWOPI,CMBARN +c COMMON /SIB_CST/ PI,TWOPI,CMBARN +c +c DOUBLE PRECISION FACN +c DIMENSION FACN(3:10) +c COMMON /SIB_FAC/ FACN +c SAVE +c +c SLOPE = max(1.D0,PAR(42)) +c ZSOF = 2.D0*dLOG(STR_mass_min/SQS) ! minim. mass ~ x1 * x2 +c 100 Z1=-ZSOF*S_RNDM(0)+ZSOF ! sample envelope 1/x +c X1 = dEXP(Z1) +cc print *,'z1,x1:',z1,x1 +c XR = dlog(1.D0-X1) - dlog(1.D0-dEXP(ZSOF)) +cc print *,'ratio:',(1.-X1)/(1.-EXP(ZSOF)),(1.-X1),1.-EXP(ZSOF) +cc print *,'log ratio:',xr,log(1.-X1),log(1.-EXP(ZSOF)) +c if(SLOPE*XR.le.dlog(S_RNDM(0))) goto 100 +c +c 200 Z2=-ZSOF*S_RNDM(0)+ZSOF ! sample envelope 1/x +c X2 = dEXP(Z2) +c XR = dlog(1.D0-X2) - dlog(1.D0-dEXP(ZSOF)) +c if(SLOPE*XR.le.dlog(S_RNDM(0))) goto 200 +cc print *,'zsof,z1,z2',zsof,z1,z2 +c IF(Z1+Z2.LE.ZSOF) GOTO 100 +c STR_mass2 = sqrt(X1*X2*S)/2.D0 +c PPTT = PPT02(10) +c IF(IPAR(3).eq.8) PPTT = PPT02(20) +c 150 PT = PPTT*dSQRT(-dLOG(MAX(EPS10,S_RNDM(0)))) +c IF(IPAR(3).ge.6)THEN +c XM = 0.D0 +c XM2 = XM**2 +c RNDM = MAX(EPS10,S_RNDM(IFL)) +c XMT = PPTT * dLOG(RNDM) - XM +c XMT2 = XMT**2 +c PT = dSQRT(XMT2-XM2) +c ENDIF +c IF(PT.GT.PTmin) GOTO 150 +c IF(PT.GE.STR_mass2) GOTO 150 +c PHI = TWOPI*S_RNDM(L) +c END +cC======================================================================= +c +c SUBROUTINE SAMPLE_SOFT5 (STR_mass_min, X1,X2,PT) +c +cC----------------------------------------------------------------------- +cC...Routine for the sampling the kinematical variables of sea quarks +cC. according to (1-x)**b / x**2 +cC. INPUT: STR_mass_min : minimal string mass ** 2 = x1 * x2 * s +cC. SLOPE : large x suppression exponent +cC. OUTPUT: X1, X2, PT (GeV) /FR'14 +cC----------------------------------------------------------------------- +c IMPLICIT DOUBLE PRECISION (A-H,O-Z) +c IMPLICIT INTEGER(I-N) +c INTEGER NW_max +c PARAMETER (NW_max = 20) +cc COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, kb ,kt +cC-------------------------------------------------------------------- +cC SIBYLL common blocks containing event information \FR'14 +cC-------------------------------------------------------------------- +c +cC EVENT INFO COMMON +cC contains overall interaction properties, like +cC SQS : center-of-mass energy +cC S : " " squared +cC PTmin : low pt cut of QCD cross section, +cC i.e. minimal pt of hard minijets +cC Xmin : low-x bound for PDFs, +cC i.e. minimal momentum fraction of hard partons +cC Zmin : logarithm of that +cC KB : PID of beam hadron +cC KT() : PID of target +cC IAT : mass number of target +c DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN +c INTEGER KB,IAT,KT +c COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT +c +c INTEGER NCALL, NDEBUG, LUN +c COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +c +c DOUBLE PRECISION PPT02 +c COMMON /S_CQDIS2/ PPT02(44) +c INTEGER NIPAR_max,NPAR_max +c PARAMETER (NPAR_max=200,NIPAR_max=100) +c DOUBLE PRECISION PAR +c INTEGER IPAR +c COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) +c +cC-------------------------------------------------------------------- +cC SIBYLL utility common blocks containing constants \FR'14 +cC-------------------------------------------------------------------- +c DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 +c COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 +c +c DOUBLE PRECISION PI,TWOPI,CMBARN +c COMMON /SIB_CST/ PI,TWOPI,CMBARN +c +c DOUBLE PRECISION FACN +c DIMENSION FACN(3:10) +c COMMON /SIB_FAC/ FACN +c SAVE +c +c SLOPE = max(1.D0,PAR(42)) +c ZSOF = 2.D0*dLOG(STR_mass_min/SQS) ! minim. mass ~ x1 * x2 +c 50 XMIN = dEXP(ZSOF) +c axmin = 1.D0/xmin +c 100 Z1 = -1.D0*dLOG(axmin-(axmin-1.D0)*S_RNDM(0)) +c x1 = dexp(z1) +c XR = dlog(1.D0-X1) - dlog(1.D0-xmin) +c if(SLOPE*XR.le.log(S_RNDM(0))) goto 100 +c +c 200 Z2 = -1.D0*dLOG(axmin-(axmin-1.D0)*S_RNDM(0)) +c X2 = dEXP(Z2) +c XR = dlog(1.D0-X2) - dlog(1.D0-dEXP(ZSOF)) +c if(SLOPE*XR.le.dlog(S_RNDM(0))) goto 200 +c +c IF(Z1+Z2.LE.ZSOF) GOTO 50 +c STR_mass2 = dsqrt(X1*X2*S)/2.D0 +c PPTT = PPT02(10) +c IF(IPAR(3).eq.8) PPTT = PPT02(20) +c 150 PT = PPTT*dSQRT(-dLOG(MAX(EPS10,S_RNDM(0)))) +c IF(IPAR(3).ge.6)THEN +c XM = 0.D0 +c XM2 = XM**2 +c RNDM = MAX(EPS10,S_RNDM(IFL)) +c XMT = PPTT * dLOG(RNDM) - XM +c XMT2 = XMT**2 +c PT = dSQRT(XMT2-XM2) +c ENDIF +c IF(PT.GT.PTmin) GOTO 150 +c IF(PT.GE.STR_mass2) GOTO 150 +c END +c +C======================================================================= + + SUBROUTINE SAMPLE_SOFT6 (STR_mass_min, X1,X2,PT) + +C----------------------------------------------------------------------- +C...Routine for the sampling the kinematical variables of sea quarks +C. according to (1-x)**b / x +C. INPUT: STR_mass_min : minimal string mass ** 2 = x1 * x2 * s +C. SLOPE : large x suppression exponent +C. OUTPUT: X1, X2, PT (GeV) /FR'14 +C----------------------------------------------------------------------- +Cf2py double precision, intent(in) :: STR_mass_min +Cf2py double precision, intent(out) :: X1 +Cf2py double precision, intent(out) :: X2 +Cf2py double precision, intent(out) :: PT + + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + DOUBLE PRECISION PPT02 + COMMON /S_CQDIS2/ PPT02(44) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + + NOSLOPE = 0 + SLOPE = PAR(42) + IF(SLOPE.lt.0.5D0) NOSLOPE = 1 + XMAX = 0.8D0 + ZSOF = 2.D0*LOG(STR_mass_min/SQS) ! minim. mass ~ x1 * x2 + XMINA = MAX(EXP(ZSOF),EPS10) + AXMINA = 1.D0/XMINA + IF(ndebug.gt.2) + & write(lun,*) ' SAMPLE_SOFT6: Mmin,ZSOF,XMINA,XMAX,SLOPE:', + & STR_mass_min,ZSOF,XMINA,XMAX,SLOPE + + 100 X1 = XM2DIS(XMINA,XMAX,1.D0) ! ~(1/x)**alpha + IF(NOSLOPE.eq.1) goto 200 + XRNDM = S_RNDM(0) + XR = LOG(1.D0-X1)-LOG(1.D0-XMINA) + IF(ndebug.gt.5) + & write(lun,*) ' X1,XR,SLOPE*XR:',X1,XR,SLOPE*XR + if(SLOPE*XR.le.LOG(max(xrndm,eps10))) goto 100 + + 200 X2 = XM2DIS(XMINA,XMAX,1.D0) ! ~(1/x)**alpha + IF(NOSLOPE.eq.1) goto 300 + XRNDM = S_RNDM(1) + XR = log(1.D0-X2) - log(1.D0-XMINA) + IF(ndebug.gt.5) + & write(lun,*) ' X2,XR,SLOPE*XR:',X2,XR,SLOPE*XR + if(SLOPE*XR.le.log(max(xrndm,eps10))) goto 200 + + 300 Z1 = log(X1) + Z2 = log(X2) + IF(Z1+Z2.LE.ZSOF) GOTO 100 + STR_mass2 = sqrt(X1*X2*S)/2.D0 + PPTT = PPT02(10) + IF(IPAR(3).eq.8) PPTT = PPT02(20) + IF(ndebug.gt.2) + & write(lun,*) ' SAMPLE_SOFT6: PPTT,Mmin2,PTmin:', + &PPTT,STR_mass2,PTmin + 150 PT = PPTT*SQRT(-LOG(MAX(EPS10,S_RNDM(0)))) + IF(IPAR(3).ge.6)THEN + XM = 0.D0 + XM2 = XM**2 + RNDM = MAX(EPS10,S_RNDM(1)) + XMT = PPTT * LOG(RNDM) - XM + XMT2 = XMT**2 + PT = SQRT(XMT2-XM2) + ENDIF + IF(ndebug.gt.2) + & write(lun,*) ' XM,XMT2,PT:',XM,XMT2,PT + IF(PT.GT.PTmin) GOTO 150 + IF(PT.GE.STR_mass2) GOTO 150 + END +C======================================================================= + + SUBROUTINE SIB_START_EV (SQS, L, IA, IAFLG, NW, JDIF) + +C----------------------------------------------------------------------- +C...Beginning of a SIBYLL interaction +C. +C. add l.m. Glauber SD cross section for pAir 13/FR +C. +C. INPUT : SQS = c.m.s. energy (GeV) +C. L = 1:proton, 2:charged pion +C. IA = mass of target nucleon +C. IAFLG = target is air +C. +C. OUTPUT: NW = number of wounded nucleons +C. JDIF(JW) = diffraction code !!!! changed to field !!!! +C. (0 : non-diffractive interaction) +C. (1 : forward diffraction) +C. (2 : backward diffraction) +C. (3 : double diffraction) +C. +C----------------------------------------------------------------------- + IMPLICIT NONE + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +c external type declarations + INTEGER NW_max,JDIF,IA,L,IAFLG,NW + DOUBLE PRECISION SQS + PARAMETER (NW_max = 20) + DIMENSION JDIF(NW_max) + + DOUBLE PRECISION B, BMAX + INTEGER NTRY, NA + COMMON /S_CNCM0/ B, BMAX, NTRY, NA + DOUBLE PRECISION XM2MIN,ALXMIN,SLOP0,ASLOP,BSLOP,XMASS + COMMON /S_DIFMAss/ XM2MIN(6),ALXMIN(6),SLOP0,ASLOP,BSLOP,XMASS(2) + DOUBLE PRECISION XI_MAX, ALAM + COMMON /GLAUB_SCR/ XI_MAX, ALAM(61) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + +c local type declarations + DOUBLE PRECISION SIGT,SIGEL,SIGINEL,SIGDIF,SLOPE,RHO, + & SIGPROD,SIGBDIF,SIGELA,S_RNDM,S,PF,PB,PD,P0,P1,P2,R + DIMENSION SIGDIF(3) + INTEGER K + SAVE + + IF(NDEBUG.gt.0) + &WRITE(LUN,*)'SIB_START_EV:', SQS, L, IA, IAFLG, NW, JDIF + +C...sample number of wounded nucleons +c read hadron-nucleon cross section from table + CALL SIB_SIGMA_HP(L,SQS,SIGT,SIGEL,SIGINEL,SIGDIF,SLOPE,RHO) + + IF (IA .GT. 1) THEN + IF(IPAR(12).NE.0)THEN + IF(IPAR(12).eq.3)THEN +c distinguish between nuclear cross sections.. + IF(IAFLG.eq.0)THEN +c if target is nucleus calc. hadron-nucleus cross section + CALL SIB_SIGMA_HNUC(L,IA,SQS,SIGprod,SIGbdif,SIGela) + ELSE +c if target is air read hadron-air cross section from table + CALL SIB_SIGMA_HAIR(L,SQS,SIGprod,SIGbdif) + ENDIF + ELSE +c always use air cross section... + CALL SIB_SIGMA_HAIR(L,SQS,SIGprod,SIGbdif) + ENDIF +C 2channel low-mass (coherent) diffraction? + IF(S_RNDM(L).LT.SIGbdif/SIGprod)THEN + NW = 1 + JDIF(1) = 1 + RETURN + ENDIF + ENDIF +c sample number of wounded nucleons + CALL INT_H_NUC (IA, SIGT, SLOPE, RHO) + ELSE + NA = 1 + ENDIF + NW = NA + + IF(NDEBUG.gt.0) + & WRITE(LUN,'(A50,2I3,1P,3E10.3)') + & ' START_EVT: IA, NW, SIGT, SLOPE, RHO:',IA,NW,SIGT,SLOPE,RHO +C...new treatment of diffraction + IF(IA.GT.1) THEN +c hadron-nucleus case + IF(NW.eq.1)THEN + IF(IPAR(12).NE.0)THEN +c high mass (incoherent) diffraction? + S = SQS ** 2 + PF =(1.D0-dLOG(S*XI_MAX/XM2MIN(L))/ + & dLOG(S*PAR(13)/XM2MIN(L)))*SIGDIF(1)/SIGINEL + PB = SIGDIF(2)/SIGINEL + PD = SIGDIF(3)/SIGINEL + ELSE + PF = SIGDIF(1)/SIGINEL + PB = SIGDIF(2)/SIGINEL + PD = SIGDIF(3)/SIGINEL + ENDIF + ELSE +c Nw>1: + IF(IPAR(12).EQ.1)THEN +c all interactions with Nw>1 are non-diff. + DO K=1, NW + JDIF(K) = 0 + ENDDO + RETURN + ELSE +c some Nw>1 are attached by diff. + PF = PAR(124)*SIGDIF(1)/SIGINEL + PB = PAR(124)*SIGDIF(2)/SIGINEL + PD = PAR(124)*SIGDIF(3)/SIGINEL + ENDIF + ENDIF + ELSE +c hadron-nucleon case + PF = SIGDIF(1)/SIGINEL + PB = SIGDIF(2)/SIGINEL + PD = SIGDIF(3)/SIGINEL + ENDIF + P0 = 1.D0-PF-PB-PD + P1 = P0 + PF + P2 = P1 + PB + DO K=1, NW + R = S_RNDM(0) + IF (R .LT. P0) THEN + JDIF(K) = 0 + ELSE IF (R .LT. P1) THEN + JDIF(K) = 1 + ELSE IF (R .LT. P2) THEN + JDIF(K) = 2 + ELSE + JDIF(K) = 3 + ENDIF + ENDDO + + END +C======================================================================= + + SUBROUTINE INI_EVENT(ECM,KBEAM,IATARG,IMOD) + +C----------------------------------------------------------------------- +C initializes the stacks and event info common +c if Imod : 0 - initiate subevent in recursive call +c ( keeps the final hadron stack intact ) +C : 1 - initiate entire new event +C----------------------------------------------------------------------- + IMPLICIT NONE +c external type declarations + DOUBLE PRECISION ECM + INTEGER KBEAM,IATARG,IMOD + +c COMMONs + INTEGER NW_max + PARAMETER (NW_max = 20) + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP +C parameters that represent: NW: max. number of wounded nucleons, +C NS,NH: max. number of soft and hard interactions +c PARAMETER (NW_max = 20) +C The COMMON block /S_CHIST/ contains information about the +C the structure of the generated event: +C NWD = number of wounded nucleons +C NJET = total number of hard interactions +C NSOF = total number of soft interactions +C NNSOF (1:NW) = number of soft pomeron cuts in each interaction +C NNJET (1:NW) = number of minijets produced in each interaction +C JDIF(1:NW) = diffraction code +C 0 : non-diff, +C 1 : beam-diff +C 2 : target-diff +C 3 : double-diff + INTEGER NNSOF,NNJET,JDIF,NWD,NJET,NSOF + COMMON /S_CHIST/ NNSOF(NW_max),NNJET(NW_max), + & JDIF(NW_max),NWD,NJET,NSOF + + INTEGER IBMRDX,ITGRDX,IHMJDX,ISMJDX,ICSTDX,IINTDX + COMMON /S_INDX/ IBMRDX(3),ITGRDX(NW_max,3), + & IHMJDX(NW_max*NH_max),IINTDX(NW_max), + & ISMJDX(NW_max*NS_max),ICSTDX(2*NW_max,3) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + INTEGER II2,JJ2 + DOUBLE PRECISION U2,C2,CD2,CM2 + COMMON /SIB_RAND/ U2(97),C2,CD2,CM2,II2,JJ2 + +c local types + DOUBLE PRECISION PZ,E1,PAWT,S_RNDM,R,FOX + INTEGER KK,JJ,II,KBA,IREFout,JN + SAVE + DATA FOX /0.21522D0/ !atomic percentage of 'non-nitrogen' in air + + + IF(NDEBUG.gt.0.and.IMOD.eq.1) + & WRITE(LUN,'(A50,F10.2,I4,I3,I3)') + & ' INI_EVENT: called with (ECM,KBEAM,IATARG,NCALL):', + & ECM,KBEAM,IATARG,NCALL + +c set final particle stack to zero + IF(IMOD.eq.1)then + NP = 0 + NWD = 0 + NJET = 0 + NSOF = 0 + endif + + CALL INI_PRTN_STCK(0,0) + +c clear index cache + do kk=1,3 + IBMRDX(kk) = 0 + ENDDO + do jj=1,NW_max + do kk=1,3 + ICSTDX(jj,kk) = 0 + ICSTDX(jj+1,kk) = 0 + ITGRDX(jj,kk) = 0 + IINTDX(jj) = 0 + ENDDO + do ii=1,NH_max + IHMJDX(NH_max*(JJ-1)+II) = 0 + enddo + do ii=1,NS_max + ISMJDX(NS_max*(JJ-1)+II) = 0 + enddo + ENDDO + + SQS = Ecm + S = SQS*SQS + + KB = KBEAM + KBA = IABS(KBEAM) +c add beam particles to parton stack, lvl -2 + PZ = PAWT(SQS,AM(KBA),AM(13)) + E1 = SQRT(PZ**2+AM2(KBA)) + CALL ADD_PRTN(0.D0,0.D0,PZ,E1,AM(KBA),KB,-2,0,IREFout) + IF(IMOD.eq.1)THEN + IAT = IATARG + IF(IATARG.EQ.1)THEN + KT(1) = 13 + ELSE + IF(IATARG.eq.0)THEN +C... Generate an 'air' interaction by choosing Nitrogen or Oxygen + R = S_RNDM(0) + IATARG = 14 + IF (R .LT. FOX) IATARG = 16 + if (NDEBUG.gt.0) + * WRITE(lun,*)'fox,rndm,iatarg,eps:',fox,r,iatarg,eps8 + ENDIF + DO JN=1,IATARG +c for nuclear target: proton (13) or neutron (14) + KT(JN) = 13 + INT((2.D0-EPS8)*S_RNDM(JN)) + ENDDO + ENDIF + ELSE + KT(1) = IATARG + ENDIF + +C...energy-dependent transverse momentum cutoff +c...EJA correction 2007.03.27 + IF(IPAR(27).eq.1)THEN + PTmin = PAR(10)+PAR(11)*EXP(PAR(12)*SQRT(LOG(SQS))) + else + PTmin = PAR(10)+PAR(11)*EXP(PAR(12)*SQRT(LOG(S))) + endif + XMIN = 4.D0*PTmin**2/S + ZMIN = LOG(XMIN) + IF(ndebug.gt.0)then + write(lun,*) ' INI_EVENT: ncall:', ncall + write(lun,'(2X,A33,F10.2,1X,F16.2,F8.5,E10.3,F10.5)') + & 'INI_EVENT: (SQS,S,PTmin,Xmin,Zmin)', + & SQS,S,PTmin,Xmin,Zmin + write(lun,*) ' INI_EVENT: KB,IAT,IATARG,KT',KB,IAT,IATARG + write(lun,*) ' ',(KT(jj),jj=1,IATARG) + endif + + CALL PTSETUP_4FLV(ECM) + + return + END +C----------------------------------------------------------------------- +C parton level administration tools for SIBYLL \FR'14 +C----------------------------------------------------------------------- + +C... COMMON /S_PRTNS/ : parton stack +c PP: 4momentum of parton, px,py,pz,energy,mass +c LPID(1): parton id, i.e. flavor (u:1,d:2,s:3,c:4) for quarks +c LPID(2): level of parton +c fragmenting systems (strings,remnants) are marked as level0 +c partons that make up these systems are marked as level1 +c LPID(3): 'downward' reference +c pointer from level1 partons to their level0 parent +c LPID(4): 'upward' reference +c pointer from level0 partons to their level-1 parent +c LVL0IDX: index cache for level0 partons +c NPP: total number of partons on stack +c NPP0: number of level0 partons on stack + +C======================================================================= + + SUBROUTINE ADD_PRTN(PX,PY,PZ,E,XMS,IPID,LVL,IREFin,IREFout) + +C----------------------------------------------------------------------- +C routine to add a parton to the stack \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + + PP(NPP+1,1) = PX + PP(NPP+1,2) = PY + PP(NPP+1,3) = PZ + PP(NPP+1,4) = E + PP(NPP+1,5) = XMS + LPID(NPP+1,1) = IPID + LPID(NPP+1,2) = LVL + LPID(NPP+1,3) = IREFin + NPP = NPP + 1 +c level0 index + IF(LVL.eq.0)THEN + LVL0IDX(NPP0+1) = NPP + NPP0 = NPP0 + 1 + ENDIF + IREFout = NPP + IF(NDEBUG.gt.6)THEN + WRITE(LUN,*) ' ADD_PRTN: (#,PID,LEVEL,REF)', + & NPP,LPID(NPP,1),LPID(NPP,2),LPID(NPP,3) + WRITE(LUN,*) ' 4momentum: ',(PP(NPP,JJ),JJ=1,5) + ENDIF + END + +C======================================================================= + + SUBROUTINE ADD_PRTN_4VEC(PIN,IPID,LVL,IREFin,IREFout) + +C----------------------------------------------------------------------- +C wrapper for ADD_PRTN to add 4momentum directly \FR'14 +C---------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + DIMENSION PIN(5) + SAVE + + CALL ADD_PRTN + & (PIN(1),PIN(2),PIN(3),PIN(4),PIN(5),IPID,LVL,IREFin,IRF) + IREFout = IRF + END + +C======================================================================= + + SUBROUTINE ADD_REF(IDX,Irefin) + +C----------------------------------------------------------------------- +C routine to add a reference label to a particle +C after it has been added to the stack \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + +c IF(LPID(IDX,3).ne.0) WRITE(LUN,*) +c & ' ADD_REF: warning particle already has defined reference,', +c & IDX,' overwritting..' + IF(NDEBUG.gt.6) + &WRITE(LUN,*) ' ADD_REF: (IDX,REFin)',IDX,Irefin + LPID(IDX,3) = Irefin + END + +C======================================================================= + + SUBROUTINE RD_REF(IDX,Irefout) + +C----------------------------------------------------------------------- +C routine to add a reference label to a particle +C after it has been added to the stack \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + + Irefout = LPID(IDX,3) + IF(NDEBUG.gt.6) + & WRITE(LUN,*) ' RD_ref: (IDX,REFout)',IDX,Irefout + END + +C======================================================================= + + SUBROUTINE ADD_INT_REF(IDX,Irefin) + +C----------------------------------------------------------------------- +C routine to add a reference label to an interaction +C after it has been added to the stack \FR'15 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + + IF(NDEBUG.gt.6) + & WRITE(LUN,*) ' ADD_INT_REF: (IDX,REFin)',IDX,Irefin + LPID(IDX,4) = Irefin + END + +C======================================================================= + + SUBROUTINE RD_INT(IDX,Irefout,Iout) + +C----------------------------------------------------------------------- +C routine to add a reference label to an interaction +C after it has been added to the stack \FR'15 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + + Irefout = LPID(IDX,4) + IF(Irefout.ne.0) Iout = LPID(Irefout,1) + IF(NDEBUG.gt.6) + & WRITE(LUN,*) ' RD_INT: (IDX,REFout,Iint)',IDX,Irefout,Iout + END + +C======================================================================= + + SUBROUTINE EDT_PRTN(IDX,PX,PY,PZ,EN,XMS,IREFout) + +C----------------------------------------------------------------------- +C routine to edit a parton already on stack \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + + IF(NDEBUG.gt.6)THEN + WRITE(LUN,*) ' EDT_PRTN: (#,PID,LEVEL,REF)', + & IDX,LPID(IDX,1),LPID(IDX,2),LPID(IDX,3) + WRITE(LUN,*) ' initial 4momentum:',(PP(IDX,JJ),JJ=1,5) + ENDIF + PP(IDX,1) = PX + PP(IDX,2) = PY + PP(IDX,3) = PZ + PP(IDX,4) = EN + PP(IDX,5) = XMS +c return reference to other partons + IREFout = LPID(IDX,3) + IF(NDEBUG.gt.6) + & WRITE(LUN,*) ' final 4momentum: ',(PP(IDX,JJ),JJ=1,5) + END + +C======================================================================= + + SUBROUTINE RD_PRTN(IDX,PX,PY,PZ,EN,XMS,IFL,IREFout) + +C----------------------------------------------------------------------- +C routine to read a parton from the stack \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + + IF(NDEBUG.gt.6)THEN + WRITE(LUN,*) ' RD_PRTN: (#,PID,LEVEL,REF)', + & IDX,LPID(IDX,1),LPID(IDX,2),LPID(IDX,3) + WRITE(LUN,*) ' 4momentum: ',(PP(IDX,JJ),JJ=1,5) + ENDIF + PX = PP(IDX,1) + PY = PP(IDX,2) + PZ = PP(IDX,3) + EN = PP(IDX,4) + XMS = PP(IDX,5) + IFL = LPID(IDX,1) +c return reference to other partons + IREFout = LPID(IDX,3) + END + +C======================================================================= + + SUBROUTINE RD_PRTN_4VEC(IDX,Pin,IFL,IREFout) + +C----------------------------------------------------------------------- +C routine to read a parton from the stack \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + DIMENSION Pin(5) + SAVE + + IF(IDX.EQ.0) THEN + WRITE(LUN,*) ' RD_PRTN_4VEC: invalid index!',IDX + xa = -1.D0 + xa = log(xa) + RETURN + ELSE + do ii = 1,5 + PIN(ii) = PP(IDX,ii) + enddo + IFL = LPID(IDX,1) +c return reference to other partons + IREFout = LPID(IDX,3) + IF(NDEBUG.gt.6)THEN + WRITE(LUN,*) ' RD_PRTN: (#,PID,LEVEL,REF)', + & IDX,IFL,LPID(IDX,2),IREFout + WRITE(LUN,*) ' 4momentum: ',(PIN(JJ),JJ=1,5) + ENDIF + + ENDIF + END + +C======================================================================= + + SUBROUTINE ITR_LVL0_PRTN(JJ,IDX,LID) + +C----------------------------------------------------------------------- +C routine that serves as iterator over the level0 +C partons on the stack \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + + IDX = LVL0IDX(JJ) + IF(ndebug.gt.6) + & WRITE(LUN,*) ' ITR_LVL0_PRTN: JJ,IDX',JJ,IDX + LID = LPID(IDX,1) + IF(JJ+1.gt.NPP0) THEN + JJ = -1 + RETURN + ELSE + JJ = JJ + 1 + ENDIF + END + +C======================================================================= + + SUBROUTINE INI_PRTN_STCK(NOLD,N0OLD) + +C----------------------------------------------------------------------- +C reset parton stack \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + + IF(NDEBUG.gt.6) WRITE(LUN,*) ' PRTN_STCK: reset .. ' + IF(NDEBUG.gt.6) WRITE(LUN,*) ' old state: NPP,NPP0',NPP,NPP0 + + NPP = NOLD + NPP0 = N0OLD + + IF(NDEBUG.gt.6) WRITE(LUN,*) ' new state: NPP,NPP0',NPP,NPP0 + + END + +C======================================================================= + + SUBROUTINE GET_NPP(NPPLD,NPP0LD) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + + NPPLD = NPP + NPP0LD = NPP0 + END + +C======================================================================= + + SUBROUTINE GET_LVL0(NPP0LD,IDXLIST) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + DIMENSION IDXLIST(NPP0_max) + INTEGER N + SAVE + + NPP0LD = NPP0 + DO N = 1, NPP0_max + IDXLIST(N) = LVL0IDX(N) + ENDDO + + END + +C======================================================================= + + SUBROUTINE PRNT_PRTN_STCK + +C----------------------------------------------------------------------- +C as the name suggests, prints the current state +C of the parton stack +C print unit is defined in S_DEBUG:LUN \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + CHARACTER*5 CDE + CHARACTER*9 CODE + + CHARACTER*6 NAMP + COMMON /S_CNAM/ NAMP (0:99) + SAVE + + WRITE (LUN,50) + 50 FORMAT(3X,88('-'),/,21X,'SIBYLL PARTON LEVEL EVENT SUMMARY',21X, + & /,3X,75('-'),13('-')) + +c beam particles + WRITE(LUN,*) ' BEAM PARTICLES' + 52 FORMAT(4X,'#',3X,'PID',2x,'LVL',2x,'REF',20x,'PX',9x,'PY',7x, + + 'PZ',9x,'E',11X,'Mass', /, 3X,75('-'),13('-')) + WRITE (LUN,52) + DO J=1,NPP + IF(LPID(J,2).eq.-2)then + WRITE (LUN,60) J, (LPID(J,KK),KK=1,3), (PP(J,K),K=1,5) + ENDIF + ENDDO +c level -2 format + 60 FORMAT(4I5,14X,2F11.3,1p,2E11.3,0p,F9.3) + WRITE(LUN,61) + 61 FORMAT(3X,75('-'),13('-')) + +c interactions + WRITE(LUN,*) ' INTERACTIONS' + 62 FORMAT(4X,'#',3X,'PID',2x,'LVL',2x,'REF',20x,'NSOF',8x,'NJET',7x, + + 'JDIF',7x,'E',11X,'Mass', /, 3X,75('-'),13('-')) + WRITE (LUN,62) + DO J=1,NPP + IF(LPID(J,2).eq.-1)then + WRITE (LUN,63) J, (LPID(J,KK),KK=1,3), (PP(J,K),K=1,5) + ENDIF + ENDDO +c level -1 format + 63 FORMAT(4I5,12X,4F12.0,F11.3) + 64 FORMAT(3X,75('-'),13('-')) + WRITE(LUN,64) + +c partons + WRITE (LUN,100) + DO J=1,NPP + IF(LPID(J,2).eq.0)then + WRITE (LUN,120) J, (LPID(J,KK),KK=1,3), (PP(J,K),K=1,5) + elseif(LPID(J,2).eq.1)then + CALL KCODE(LPID(J,1),cde,nc) + WRITE (LUN,121) J, CDE(1:nc),(LPID(J,KK),KK=2,3), + & (PP(J,K),K=1,5) + elseif(LPID(J,2).eq.2)then + CODE = ' ' + L = LPID(J,1) + CODE(1:6) = NAMP(IABS(L)) + IF (L .LT. 0) CODE(7:9) = 'bar' + WRITE (LUN,122) J,CODE,(LPID(J,KK),KK=2,3), (PP(J,K),K=1,5) + endif + ENDDO + CALL PPSUM(1,NPP,Esum,PXsum,PYsum,PZsum,NF) + WRITE(LUN,140) PXsum,PYsum,PZsum,Esum + + 100 FORMAT(4X,'#',3X,'PID',2x,'LVL',2x,'REF',20x,'PX',9x,'PY',7x, + + 'PZ',9x,'E',11X,'Mass', /, 3X,75('-'),13('-')) +c level 0 format + 120 FORMAT(4I5,14X,2F11.3,1p,2E11.3,0p,F11.3) +c level 1 format cjoe + 121 FORMAT(I7,1X,A5,2I5,14X,2F11.3,1p,2E11.3,0p,F11.3) +c level 2 format + 122 FORMAT(I10,1X,A9,2I5,10X,2F11.3,1p,2E11.3,0p,F11.3) + 140 FORMAT(3X,75('-'),13('-'),/,' Tot = ',26X,2F11.3,1p,2e11.3) + + END + +C======================================================================= + + SUBROUTINE PPSUM(N1,N2,ETOT,PXT,PYT,PZT,NF) + +C----------------------------------------------------------------------- +C Return the energy,px,py,pz of level0 partons +C in the list between N1 and N2 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + + NF=0 + ETOT=0.D0 + PXT=0.D0 + PYT=0.D0 + PZT=0.D0 + DO J=N1,N2 + IF (LPID(J,2) .EQ. 0) THEN + NF = NF+1 + ETOT = ETOT + ABS( PP(J,4) ) + PXT = PXT + PP(J,1) + PYT = PYT + PP(J,2) + PZT = PZT + PP(J,3) + ENDIF + ENDDO + RETURN + END +C======================================================================= + + SUBROUTINE FOUR_LENGTH(XP,XM2) + +C----------------------------------------------------------------------- +C Calculate the length of a 4vector (+---) \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + DIMENSION XP(5) + SAVE + + XM2 = XP(4)**2 - XP(1)**2 - XP(2)**2 - XP(3)**2 + END +C======================================================================= + + DOUBLE PRECISION FUNCTION CALC_INVM(XP1,XP2) + +C----------------------------------------------------------------------- +C Calculate the invariant mass of two 4vectors FR'15 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + DIMENSION XP1(5),XP2(5) + SAVE + + CALC_INVM = (XP1(4)+ XP2(4))**2 + DO I=1,3 + CALC_INVM = CALC_INVM-(XP1(I)+XP2(I))**2 + ENDDO + CALC_INVM = SQRT(CALC_INVM) + END + +C======================================================================= + + SUBROUTINE GET_XMT2(IDX,XM2) + +C----------------------------------------------------------------------- +C Calculate the transverse mass of a parton +C on the stack \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + + XM2 = PP(IDX,1)**2 + PP(IDX,2)**2 + PP(IDX,5)**2 + END +C======================================================================= + + SUBROUTINE GET_IMASS2(IDX,XM2) + +C----------------------------------------------------------------------- +C Calculate the invariant mass squared of a parton +C on the stack (+---) \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + SAVE + + XM2 = PP(IDX,1)**2 + PP(IDX,2)**2 + PP(IDX,3)**2 + XM2 = PP(IDX,4)**2 - XM2 + END + +C======================================================================= + + SUBROUTINE GET_MASS(IDX,XM) + +C----------------------------------------------------------------------- +C read mass of parton on stack \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + + IF(IDX.EQ.0) THEN + XM2 = 0.D0 + else + XM = PP(IDX,5) + ENDIF + END +C======================================================================= + + SUBROUTINE GET_MASS2(IDX,XM2) + +C----------------------------------------------------------------------- +C read mass of parton on stack \FR'14 +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + + IF(IDX.EQ.0) THEN + XM2 = 0.D0 + else + XM2 = PP(IDX,5)**2 + ENDIF + END + +C======================================================================= + + SUBROUTINE GET_VRTLTY(IDX,XX) + +C----------------------------------------------------------------------- +C calculate virtuality of parton on stack \FR'14 +C = on-shell mass - inv. mass +C------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + PARAMETER (NPP_max = 1000, NPP0_max = 500) + COMMON /S_PRTNS/ PP(NPP_max,5), LPID(NPP_max,4), LVL0IDX(NPP0_max) + & ,NPP,NPP0 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + SAVE + + IF(IDX.EQ.0) XM2 = 0.D0 + CALL GET_IMASS2(IDX,xm2) + XX = PP(IDX,5)**2-xm2 + END + +C======================================================================= + + SUBROUTINE ADD_4VECS(P1,P2,POUT) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + DIMENSION P1(5),P2(5),POUT(5) + SAVE + + DO II=1,4 + POUT(II) = P1(II) + P2(II) + ENDDO + CALL FOUR_LENGTH(POUT,XM2) + IF(XM2.LT.0)THEN +c virtual particle + POUT(5) = -1.D0 + IF(NDEBUG.gt.6)then + WRITE(LUN,*) + & ' ADD_4VECS: resulting particle virtual!! (m**2):',XM2 + WRITE(LUN,*) ' p**2' , POUT(1)**2+POUT(2)**2+POUT(3)**2 + WRITE(LUN,*) ' E**2: ', POUT(4)**2 + ENDIF + ELSE + POUT(5) = sqrt(xm2) + ENDIF + END +C======================================================================= + + SUBROUTINE DECPAR (LA,P0,ND,LL,P) + +C----------------------------------------------------------------------- +C...This subroutine generates the decay of a particle +C. with ID = LA, and 5-momentum P0(1:5) +C. into ND particles of 5-momenta P(j,1:5) (j=1:ND) +C. +C. If the initial particle code is LA=0 +C. then ND and LL(1:ND) are considered as input and +C. the routine generates a phase space decay into ND +C. particles of codes LL(1:nd) +C. +C. june 1992 +C. This version contains the decay of polarized muons +C. The muon codes are L = 4 : mu+ R +C. -4 : mu+ L +C. 5 : mu- L +C. -5 : mu- R +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + DOUBLE PRECISION CBR + INTEGER KDEC,LBARP,IDB + COMMON /S_CSYDEC/ CBR(223+16+12+8), KDEC(1338+6*(16+12+8)), + & LBARP(99), IDB(99) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + DIMENSION P0(5), LL(10), P(10,5) + DIMENSION PV(10,5), RORD(10), UE(3),BE(3) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + +C...Phase space decay into the particles in the list + IF (LA .EQ. 0) THEN + MAT = 0 + MBST = 0 + PS = 0.D0 + DO J=1,ND +CDH following statements corrected by D.H. dec 20.,1995 + P (J,5) = AM(IABS(LL(J))) + PV(J,5) = AM(IABS(LL(J))) + PS = PS+P(J,5) + ENDDO + DO J=1,4 + PV(1,J) = P0(J) + ENDDO + PV(1,5) = P0(5) + GOTO 140 + ENDIF + +C...Choose decay channel + L = IABS(LA) + ND=0 + IDC = IDB(L)-1 + IF (IDC+1 .LE.0) RETURN + RBR = S_RNDM(0) +110 IDC=IDC+1 + IF(RBR.GT.CBR(IDC)) GOTO 110 + + KD =6*(IDC-1)+1 + ND = KDEC(KD) + MAT= KDEC(KD+1) + MBST=0 + IF (MAT .GT.0 .AND. P0(4) .GT. 20.D0*P0(5)) MBST=1 + IF (MAT .GT.0 .AND. MBST .EQ. 0) + + BETA = DSQRT(P0(1)**2+P0(2)**2+P0(3)**2)/P0(4) + PS = 0.D0 +c reduce omega mass by 50MeV to allow on-shell N(1710) decay + Xmomega = am(32) + IF(L.eq.53.or.L.eq.54) AM(32) = AM(32)-0.05D0 + DO J=1,ND + LL(J) = KDEC(KD+1+J) + P(J,5) = AM(LL(J)) + PV(J,5) = AM(LL(J)) + PS = PS + P(J,5) + ENDDO + AM(32) = Xmomega + DO J=1,4 + PV(1,J) = 0.D0 + IF (MBST .EQ. 0) PV(1,J) = P0(J) + ENDDO + IF (MBST .EQ. 1) PV(1,4) = P0(5) + PV(1,5) = P0(5) + +140 IF (ND .EQ. 2) GOTO 280 + + IF (ND .EQ. 1) THEN + DO J=1,4 + P(1,J) = P0(J) + ENDDO + RETURN + ENDIF + +C...Calculate maximum weight for ND-particle decay + WWTMAX = 1.D0/FACN(ND) + PMAX=PV(1,5)-PS+P(ND,5) + PMIN=0.D0 + DO IL=ND-1,1,-1 + PMAX = PMAX+P(IL,5) + PMIN = PMIN+P(IL+1,5) + WWTMAX = WWTMAX*PAWT(PMAX,PMIN,P(IL,5)) + ENDDO + +C...generation of the masses, compute weight, if rejected try again +240 RORD(1) = 1.D0 + DO 260 IL1=2,ND-1 + RSAV = S_RNDM(0) + DO 250 IL2=IL1-1,1,-1 + IF(RSAV.LE.RORD(IL2)) GOTO 260 +250 RORD(IL2+1)=RORD(IL2) +260 RORD(IL2+1)=RSAV + RORD(ND) = 0.D0 + WT = 1.D0 + DO 270 IL=ND-1,1,-1 + PV(IL,5)=PV(IL+1,5)+P(IL,5)+(RORD(IL)-RORD(IL+1))*(PV(1,5)-PS) +270 WT=WT*PAWT(PV(IL,5),PV(IL+1,5),P(IL,5)) + IF (WT.LT.S_RNDM(1)*WWTMAX) GOTO 240 + +C...Perform two particle decays in respective cm frame +280 DO 300 IL=1,ND-1 + PA=PAWT(PV(IL,5),PV(IL+1,5),P(IL,5)) + UE(3)=2.D0*S_RNDM(IL)-1.D0 + PHI=TWOPI*S_RNDM(3) + UT = DSQRT(1.D0-UE(3)**2) + UE(1) = UT*dCOS(PHI) + UE(2) = UT*dSIN(PHI) + DO 290 J=1,3 + P(IL,J)=PA*UE(J) +290 PV(IL+1,J)=-PA*UE(J) + P(IL,4)=DSQRT(PA**2+P(IL,5)**2) +300 PV(IL+1,4)=DSQRT(PA**2+PV(IL+1,5)**2) + +C...Lorentz transform decay products to lab frame + DO 310 J=1,4 +310 P(ND,J)=PV(ND,J) + DO 340 IL=ND-1,1,-1 + DO 320 J=1,3 +320 BE(J)=PV(IL,J)/PV(IL,4) + GA=PV(IL,4)/PV(IL,5) + DO 340 I=IL,ND + BEP = BE(1)*P(I,1)+BE(2)*P(I,2)+BE(3)*P(I,3) + DO 330 J=1,3 +330 P(I,J)=P(I,J)+GA*(GA*BEP/(1.D0+GA)+P(I,4))*BE(J) +340 P(I,4)=GA*(P(I,4)+BEP) + +C...Weak decays + IF (MAT .EQ. 1) THEN + F1=P(2,4)*P(3,4)-P(2,1)*P(3,1)-P(2,2)*P(3,2)-P(2,3)*P(3,3) + IF (MBST.EQ.1) THEN +C WT = P0(5)*P(1,4)*F1 + WT = P0(5)*(P(1,4)+DBLE(LA/L)*P(1,3))*F1 + ENDIF + IF (MBST.EQ.0) THEN + WT=F1*(P(1,4)*P0(4)-P(1,1)*P0(1)-P(1,2)*P0(2)-P(1,3)*P0(3)) + IF(L.lt.50) + + WT= WT-DBLE(LA/L)*(P0(4)*BETA*P(1,4)-P0(4)*P(1,3))*F1 + ENDIF + WTMAX = P0(5)**4/8.D0 + IF(WT.LT.S_RNDM(0)*WTMAX) GOTO 240 + ENDIF + +C...Boost back for rapidly moving particle + IF (MBST .EQ. 1) THEN + DO 440 J=1,3 +440 BE(J)=P0(J)/P0(4) + GA= P0(4)/P0(5) + DO 460 I=1,ND + BEP=BE(1)*P(I,1)+BE(2)*P(I,2)+BE(3)*P(I,3) + DO 450 J=1,3 +450 P(I,J)=P(I,J)+GA*(GA*BEP/(1.D0+GA)+P(I,4))*BE(J) +460 P(I,4)=GA*(P(I,4)+BEP) + ENDIF + +C...labels for antiparticle decay + IF (LA .LT. 0 .AND. L .GT. 18) THEN + DO J=1,ND + LL(J) = LBARP(LL(J)) + ENDDO + ENDIF + + RETURN + END + +C======================================================================= + + BLOCK DATA DATDEC + +C----------------------------------------------------------------------- +C...initialization of SIBYLL particle data +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + DOUBLE PRECISION CBR + INTEGER KDEC,LBARP,IDB + COMMON /S_CSYDEC/ CBR(223+16+12+8), KDEC(1338+6*(16+12+8)), + & LBARP(99), IDB(99) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + + DOUBLE PRECISION AW,AW2 + COMMON /S_WIDTH1/ AW(99), AW2(99) + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + + CHARACTER*6 NAMP + COMMON /S_CNAM/ NAMP (0:99) + SAVE +c CBR contains the normed sum of the branching ratios of the decay channels +c indexed by IDB, i.e. a particle with 4 decay channels will have the entries +c [B1/Btot, (B1+B2)/Btot, (B1+B2+B3)/Btot, 1.] + DATA CBR /3*1.D0,0.D0,1.D0,1.D0,0.6354D0,0.8422D0,0.8981D0, + + 0.9157D0,0.9492D0,1.D0,0.6354D0,0.8422D0,0.8981D0,0.9157D0, + + 0.9492D0,1.D0,0.1965D0,0.3224D0,0.4579D0,0.5934D0,0.7967D0,1.D0, + + 0.6925D0,1.D0,3*0.D0,0.5D0,1.D0,0.5D0,1.D0, + + 0.3941D0,0.7197D0,0.9470D0,0.9930D0,1.D0, ! eta + + 0.4285D0,0.7193D0,0.9487D0,0.9750D0,0.9973D0,0.9999D0,1.D0, ! eta' + + 3*1.D0, ! rho-mesons + + 0.6670D0,1.D0, ! K*+ + + 0.4894D0,0.8317D0,0.9850D0,0.9981D0,0.9994D0,0.9997D0,1.D0, ! phi(1020) + + 2*0.D0, ! (empty) + + 0.6670D0,1.D0, ! K*- + + 0.6670D0,1.D0, ! K*0 + + 0.6670D0,1.D0, ! K*0 bar + + 0.8940D0,0.9830D0,1.D0, ! omega + + 4*0.D0, ! (empty) + + 0.5160D0,5*1.D0,0.6410D0,2*1.D0,0.67D0,1.D0,0.33D0,2*1.D0, + + 0.88D0,0.94D0,1.D0,0.88D0,0.94D0,1.D0,0.88D0,0.94D0,1.D0,0.33D0, + + 1.D0,0.67D0,1.D0,0.678D0,0.914D0,1.D0,0.217D0,0.398D0,0.506D0, + + 0.595D0,0.684D0,0.768D0,0.852D0,0.923D0,0.976D0,1.D0,0.217D0, + + 0.398D0,0.506D0,0.595D0,0.684D0,0.768D0,0.852D0,0.923D0,0.976D0, + + 1.D0,0.2490D0,0.4604D0,0.5338D0,0.5703D0,0.7440D0,0.7840D0, + + 0.8460D0,0.8880D0,0.9230D0,0.9650D0,1.D0,0.2490D0,0.4604D0, + + 0.5338D0,0.5703D0,0.7440D0,0.7840D0,0.8460D0,0.8880D0,0.9230D0, + + 0.9650D0,1.D0,0.1666D0,0.3332D0,0.4998D0,0.6664D0,0.8330D0,1.D0, + + 0.6770D0,0.9840D0,1.D0, + + 0.6770D0,0.9840D0,1.D0,0.6190D0,1.D0,0.6190D0,1.D0,0.0602D0, + + 0.1203D0,1.D0,3*1.D0,0.06D0,0.08D0,0.14D0,0.16D0,0.73D0,0.855D0, + + 0.98D0,1.D0,0.08D0,0.16D0,0.92D0,1.D0,0.2335D0,0.4283D0,0.6446D0, + + 0.7099D0,0.8080D0,0.9080D0,0.9380D0,0.9540D0,0.9840D0,1.D0, + + 3*1.D0,0.5D0,1.D0,0.5D0,1.D0,0.08D0,0.16D0,0.92D0,1.D0,0.942D0, + + 1.D0,0.942D0,1.D0,0.2493D0,0.4061D0,0.5602D0,0.6860D0,0.7608D0, + + 0.8305D0,0.8818D0,0.9277D0,0.9691D0,1.D0,0.2493D0,0.4061D0, + + 0.5602D0,0.6860D0,0.7608D0,0.8305D0,0.8818D0,0.9277D0,0.9691D0, + + 1.D0, + & 0.466D0,0.7D0,0.899D0,1.D0,0.466D0,0.7D0,0.899D0,1.D0, ! N1440+- + & 0.3334D0,0.5D0,0.6334D0,0.7634D0,0.8734D0,0.9394D0,1.D0, ! N1710+ + & 0.3334D0,0.5D0,0.6334D0,0.7634D0,0.8734D0,0.9394D0,1.D0, ! N1710- + & 0.5D0, 1.D0, 0.5D0, 1.D0, 0.5D0, 1.0D0, ! pi1+-0 + & 0.6666D0,1.D0, 0.6666D0,1.D0,0.6666D0,1.D0,0.6666D0,1.D0/ ! K0* + DATA AM / 0.0,2*0.511D-3, 2*0.10566, 0.13497, 2*0.13957, + + 2*0.49368, 2*0.49761, 0.93827, 0.93957, 4*0.0,0.93827, + + 0.93957, 2*0.49761, 0.54785,0.95766,2*0.76690,0.76850, + + 2*0.89166D0,2*0.89600,0.78265,1.01946D0,1.18937D0,1.19264D0, + + 1.19745,1.31486,1.32171,1.11568,1.23100,1.23500, + + 1.23400,1.23300,1.38280,1.38370,1.38720, + + 1.53180,1.53500,1.67245,0.,1.44,1.44,1.71,1.71,4*0.0, + + 2*1.86926,1.30,1.30,1.30,4*1.430, 3*0.0, + + 2*1.86484,2.9803,2*1.9685,2*2.1123,2*2.01027,2*2.00697, + + 0.0,3.09692,2.45402,2.4529,2.45376,2.4679,2.4710, + + 2.28646, 2*1.777, 2*0.0, 2.5184,2.5175, 2.5180, 2.6466, + + 2.6461, 2.6975 / + DATA AM2 /0.0,2*2.61121D-07,2*0.011164,0.018217,0.019480, + + 0.019480,0.243720,0.243720,0.247616,0.247616,0.880351, + + 0.882792,0.000000,0.000000,0.000000,0.000000,0.880351, + + 0.882792,0.247616,0.247616,0.300140,0.917113,0.588136, + + 0.588136,0.590592,0.795058,0.795058,0.802816,0.802816, + + 0.612541,1.039299,1.414601,1.422390,1.433887,1.728857, + + 1.746917,1.244742,1.515361,1.525225,1.522765,1.520289, + + 1.912136,1.914626,1.924324,2.346411,2.356225,2.797022, + + 0.,2.0736,2.0736,2.9241,2.9241,4*0.0, 2*3.49414, + + 1.690, 1.690, 1.690, 4*2.0449, 3*0.0, 2*3.477628, 8.882188, + + 2*3.8750,2*4.4618,2*4.041186,2*4.027928, 0.0, 9.590914, 6.022214, + + 6.016718, 6.020938,6.09053, 6.105841, 5.227899, 2*3.158, 2*0.0, + + 6.342339, 6.337806, 6.340323,7.004492, 7.001845, 7.276506/ + DATA AW /24*0.D0,0.022231D0,0.022231D0,0.022231D0,0.002581D0, + & 0.002581D0,0.D0,0.D0,7.20801D-05,1.81476D-05,6*0.D0, + & 0.013689D0,0.013689D0,0.013689D0,0.013689D0,0.001296D0, + & 0.001295D0,0.00155D0,8.281D-05,9.801D-05,0.D0,0.D0,0.09D0, + & 0.01D0,0.09D0,0.01D0,6*0.D0,0.1D0,0.1D0,0.1D0,4*0.27D0, + & 32*0.D0/ + DATA AW2 /24*0.D0,0.022231D0,0.022231D0,0.022231D0,0.002581D0, + & 0.002581D0,0.D0,0.D0,7.20801D-05,1.81476D-05,6*0.D0, + & 0.013689D0,0.013689D0,0.013689D0,0.013689D0,0.001296D0, + & 0.001295D0,0.00155D0,8.281D-05,9.801D-05,0.D0,0.D0,0.09D0, + & 0.01D0,0.09D0,0.01D0,6*0.D0,0.01D0,0.01D0,0.01D0,4*0.0729D0, + & 32*0.D0/ +c IDB is the index to the branching ratios (CBR) and decay channels (KDEC). +c always indicates the first decay channel + DATA IDB / + + 0,0,0,1,2, ! leptons + + 3,5,6,7,13,19,25, ! pions and kaons + + 8*0,30,32,34,39,46,47,48,49,60,62,64,66,51, !69, ! meson resonances + + 73,75,76,77,78,79,81,82,84,86,87,90,93,96,98,100, ! baryons : Sibyll 2.1 + + 0,224,228,232,239,4*0, ! Nucleon resonaces + + 103,113,246,248,250, 252,254,256,258,3*0, + + 123,134,145,204,214,200,202,151,154,157,159,0, + + 161,164,165,166,167,175,179,4*0,189,190,191,192,194,196 / +c KDEC contains decay channels, format is [ND, MAT, LL(1:4)] +c where ND is the number of particles in the final state (max 4) +C MAT is 0, 1 for semi-leptonic (weak decay) or not +c (adds primitive matrix element) +c LL(1:4) are the particle ids of the final state particles + DATA KDEC / + + 3,1,15,2,18,0,3,1,16,3,17,0,2,0,1,1,8*0,2,0,4,17,0,0,2,0,5,18,0, + + 0,2,0,4,17,0,0,2,0,7,6,0,0,3,0,7,7,8,0,3,0,7,6,6,0,3,1,17,4,6,0, + + 3,1,15,2,6,0,2,0,5,18,0,0,2,0,8,6,0,0,3,0,8,8,7,0,3,0,8,6,6,0,3, + + 1,18,5,6,0,3,1,16,3,6,0,3,0,6,6,6,0,3,0,7,8,6,0,3,1,18,5,7,0,3, + + 1,17,4,8,0,3,1,16,3,7,0,3,1,15,2,8,0,2,0,7,8,0,0,2,0,6,6,20*0,1, + + 0,11,3*0,1,0,12,0,0,0,1,0,11,0,0,0,1,0,12,0,0,0,2,0,1,1,0,0,3,0, + + 6,6,6,0,3,0,7,8,6,0,3,0,1,7,8,0,3,0,1,3,2,0, + + 3,0,7,8,23,0, 3,0,6,6,23,0, 2,0,1,27,0,0, 2,0,1,32,0,0, ! eta' + + 2,0,1,1,0,0, 3,0,6,6,6,0, 3,0,1,4,5,0, ! eta' + + 2,0,7,6,0,0, ! rho+ + + 2,0,8,6,0,0, ! rho- + + 2,0,7,8,0,0, ! rho0 + + 2,0,21,7,0,0, 2,0,9,6,0,0, ! K*+ + + 2,0,9,10,0,0, 2,0,11,12,0,0, 3,0,7,8,6,0, 2,0,1,23,0,0, ! phi(1020) + + 2,0,1,6,0,0, 2,0,2,3,0,0, 2,0,4,5,0,0, ! phi(1020) + + 12*0, + + 2,0,22,8,0,0, 2,0,10,6,0,0, ! K*- + + 2,0,9,8,0,0, 2,0,21,6,0,0, ! K*0 + + 2,0,10,7,0,0, 2,0,22,6,0,0, ! K*0 bar + + 3,0,7,8,6,0, 2,0,1,6,0,0, 2,0,7,8,0,0, ! omega + + 24*0, + + 2,0,13,6,0,0,2,0,14,7,0,0,2,0,39,1,0,0,2, ! baryons + + 0,14,8,0,0,2,0,39,6,0,0,2,0,39,8,0,0,2,0,13,8,0,0,2,0, + + 14,6,0,0,2,0,13,7,0,0,2,0,13,6, + + 0,0,2,0,14,7,0,0,2,0,13,8,0,0,2,0,14,6,0,0,2,0,14,8,0,0,2,0, + + 39,7,0,0,2,0,34,6,0,0,2,0,35,7,0,0,2,0,39,6,0,0,2,0,34,8,0,0, + + 2,0,36,7,0,0,2,0,39,8,0,0,2, + + 0,35,8,0,0,2,0,36,6,0,0,2,0,37,6,0,0,2,0,38,7,0,0,2,0, + + 37,8,0,0,2,0,38,6,0,0,2,0,39,10,0,0,2,0,37,8,0,0,2,0,38,6,0,0, + + 3,0,22,7,6,0,3,0,22,9,22,0,2,0,22,7,0,0,3,1,2,15,22,0,3,1,4,17, + + 22,0,3,1,2,15,31,0,3,1,4,17,31,0,2,0,31,25,0,0,3,0,33,7,6,0, + + 3,0,10,7,7,0, + + 3,0,21,8,6,0,3,0,21,10,21,0,2,0,21,8,0,0,3,1,3,16,21,0,3,1,5,18, + + 21,0,3,1,3,16,30,0,3,1,5,18,30,0,2,0,30,26,0,0,3,0,33,8,6,0, + + 3,0,9,8,8,0, + + 2,0,29,7,0,0,2,0,31,6,0,0,2,0,22,6,0,0,2,0,10,7,0,0,2,0,31,27,0, + + 0,2,0,30,27,0,0,2,0,29,25,0,0,3,1,2,15,10,0,3,1,2,15,29,0, + + 3,1,4,17,10,0,3,1,4,17,29,0, + + 2,0,28,8,0,0,2,0,30,6,0,0,2,0,21,6,0,0,2,0,9,8,0,0,2,0,30,27,0, + + 0,2,0,31,27,0,0,2,0,28,26,0,0,3,1,3,16,9,0,3,1,3,16,28,0, + + 3,1,5,18,9,0,3,1,5,18,28,0, + + 3,0,6,21,22,0,3,0,6,9,10,0,3,0,23,6,6,0,3,0,23,7,8,0,3,0,24,6,6, + + 0,3,0,24,7,8,0, + + 2,0,71,7,0,0,2,0,59,6,0,0,2,0,59,1,0,0, + + 2,0,72,8,0,0,2,0,60,6,0,0,2,0,60,1,0,0, + + 2,0,71,6,0,0,2,0,71,1,0,0,2,0,72,6,0,0,2,0,72,1,0,0, + + 2,0,2,3,0,0,2,0,4,5,0,0,3,0,6,7,8,0, + + 2,0,89,7,0,0,2,0,89,6,0,0,2,0,89,8,0,0, + + 3,1,2,15,22,0,3,1,2,15,33,0,3,1,4,17,22,0,3,1,4,17,33,0,2,0,7,22, + + 0,0,2,0,9,22,0,0,2,0,7,33,0,0,2,0,9,33,0,0, + + 3,1,2,15,10,0,3,1,4,17,10,0,2,0,7,10,0,0,2,0,9,10,0,0, + + 3,0,7,10,13,0,3,0,7,22,14,0,3,0,7,8,13,0,3,0,9,10,13,0,3,0,9,22, + + 14,0,3,0,22,8,40,0,3,1,2,15,39,0,3,1,2,15,14,0,3,1,4,17,39,0,3, + + 1,4,17,14,0, + + 2,0,89,7,0,0,2,0,89,6,0,0,2,0,89,8,0,0, + + 2,0,87,6,0,0,2,0,87,1,0,0,2,0,88,6,0,0,2,0,88,1,0,0, + + 3,1,2,15,10,0,3,1,4,17,10,0,2,0,7,10,0,0,2,0,9,10,0,0 , + + 2,0,74,1,0,0 ,2,0,74,6,0,0 , 2,0,75,1,0,0 ,2,0,75,6,0,0, !C=1,S=1 mesons + + 2,0,23,25,0,0, 4,0,9,10,7,6, 3,0,9,10,7,0, 2,0,33,7,0,0, + + 3,1,23,2,15,0, 3,1,33,2,15,0, 2,0,23,7,0,0, 4,0,12,10,7,7, + + 2,0,9,12,0,0, 4,0,7,8,7,8, 2,0,23,26,0,0, 4,0,10,9,8,6, ! | D*(_s) + + 3,0,10,9,8,0, 2,0,33,8,0,0, 3,1,23,3,16,0, 3,1,33,3,16,0,! v + + 2,0,23,8,0,0, 4,0,12,9,8,8, 2,0,10,12,0,0, 4,0,7,8,7,8, ! ---- + & 2,0,14,7,0,0, 2,0,13,6,0,0, 3,0,14,7,6,0, 3,0,13,7,8,0, ! N-res + & 2,0,13,8,0,0, 2,0,14,6,0,0, 3,0,13,6,8,0, 3,0,14,7,8,0, + & 3,0,14,7,6,0, 3,0,13,7,8,0, 2,0,14,7,0,0, 2,0,13,32,0,0, + & 2,0,39,9,0,0, 2,0,13,6,0,0, 2,0,13,23,0,0, + & 3,0,13,8,6,0, 3,0,14,7,8,0, 2,0,13,8,0,0, 2,0,14,32,0,0, + & 2,0,39,21,0,0, 2,0,14,6,0,0, 2,0,14,23,0,0, ! --- + & 2,0,25,8,0,0, 2,0,26,7,0,0, ! pi10 | + & 2,0,25,6,0,0, 2,0,27,7,0,0, ! + v + & 2,0,27,8,0,0, 2,0,26,6,0,0, ! - --- + & 2,0,21,7,0,0, 2,0,9,6,0,0, 2,0,22,8,0,0, 2,0,10,6,0,0, ! k0* | + & 2,0,9,8,0,0, 2,0,21,6,0,0, 2,0,10,7,0,0, 2,0,22,6,0,0/ ! v + DATA LBARP/1,3,2,5,4,6,8,7,10,9,11,12,-13,-14,16,15,18,17,13,14, + + 22,21,23,24,26,25,27,29,28,31,30,32,33,-34,-35,-36,-37,-38,-39, + + -40,-41,-42,-43,-44,-45,-46,-47,-48,-49,0,-51,-52,-53,-54,4*0, + + 60,59,61,63,62,65,64,67,66,3*0,72,71, + + 73,75,74,77,76,79,78,81,80,0,83,-84,-85,-86,-87,-88,-89, + + 91,90,93,92,-94,-95,-96,-97,-98,-99 / + DATA ICHP /0,1,-1,1,-1,0,1,-1,1,-1,0,0,1,0,4*0,-1,0,4*0, !24 + + 1,-1,0,1,-1,4*0,1,0,-1,0,-1,0,2,1,0,-1,1,0,-1,0,-1,-1, !49 + + 0,1,0,1,0,4*0,1,-1,0,1,-1,1,-1,0,0,3*0, !70 + + 0,0,0,1,-1,1,-1,1,-1,0,0,0, !82 + + 0,2,1,0,1,0,1,1,-1,2*0,2,1,0,1,0,0 / ! charmed baryons + tau + + DATA ISTR /8*0,-1,+1,-1,-1,8*0,-1,+1,5*0,-1,+1,-1,+1,2*0, ! mesons + + 3*1,2*2,1,4*0,3*1,2*2,3,0,4*0, ! 54 + + 4*0,2*0,3*0,-1,1,-1,1,3*0,2*0,0,-1,1,-1,1,2*0,2*0,0,0, ! 83 + + 3*0,2*1,0,4*0,3*0,2*1,2 / ! charmed baryons + DATA IBAR /12*0,2*1,4*0,2*-1,13*0,16*1,0,4*1,4*0, + + 2*0,10*0,2*0,0,4*0,2*0,2*0,0,0,6*1,4*0,6*1 / + DATA ICHM /58*0,1,-1,10*0,1,-1,0,1,-1,+1,-1,1,-1,1,-1,0,0, + + 6*1,4*0,6*1/ + DATA NAMP / + + ' ','gam ','e+','e-','mu+','mu-','pi0', + + 'pi+','pi-','k+', 'k-', 'k0l','k0s', + + 'p', 'n', 'nue', 'nueb', 'num', 'numb', 'pbar', 'nbar', + + 'k0', 'k0b', 'eta', 'etap', 'rho+', 'rho-','rho0', + + 'k*+','k*-','k*0','k*0b','omeg', 'phi', 'SIG+', 'SIG0', + + 'SIG-','XI0','XI-','LAM','DELT++','DELT+','DELT0','DELT-', + + 'SIG*+','SIG*0','SIG*-', 'XI*0', 'XI*-', 'OME-', + + ' ','N144_+','N144_0','N171_+','N171_0', + + 4*' ', 'D+', 'D-','pi1_0 ','pi1_+ ','pi1_- ', + + 'k0*_+','k0*_-','k0*_0','k0*_0b', + + 3*' ', 'D0', 'D0b', 'eta_c', + + 'D_s+','D_s-','D*_s+','D*_s-','D*+', 'D*-', 'D*0', 'D*0b', + + ' ', 'J/psi', + + 'SIGc++', 'SIGc+', 'SIGc0','XI_c+','XI_c0','LAM_c+', + + 'tau+ ','tau- ','nut ','nutb ', + + 'SIc*++','SIGc*+','SIGc*0', 'XI_c*+', 'XI_c*0', + + 'OME_c0' / + END +C-> +C======================================================================= + + SUBROUTINE DECPR (LUN) + +C----------------------------------------------------------------------- +C...Print on unit LUN the list of particles and decay channels +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + DOUBLE PRECISION CBR + INTEGER KDEC,LBARP,IDB + COMMON /S_CSYDEC/ CBR(223+16+12+8), KDEC(1338+6*(16+12+8)), + & LBARP(99), IDB(99) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + + DOUBLE PRECISION AW,AW2 + COMMON /S_WIDTH1/ AW(99), AW2(99) + + CHARACTER*6 NAMP + COMMON /S_CNAM/ NAMP (0:99) + DIMENSION LL(4) + SAVE + + 100 FORMAT(/,1X,75('-'),/,28X,'SIBYLL DECAY TABLE') + WRITE(LUN,100) + 101 FORMAT(1X,75('-'),/,2X,'PID',1X,'Particle',6X,'Mass',9X,'Width',/, + + 4X,'Channel',1X,'Br.frac.',1X,'Nf',2X,'MAT',1X, + + 'Final Particles',/,1X,75('-')) + WRITE(LUN,101) + DO L=1,99 + IF(MOD(L,10).EQ.0)WRITE(LUN,101) + IDC = IDB(L)-1 + NC = 0 + WRITE (LUN,10) L,NAMP(L), AM(L), AW(L) + IF(IDC+1 .GT. 0) THEN + CB = 0.D0 +110 IDC=IDC+1 + NC = NC+1 + CBOLD = CB + CB = CBR(IDC) + BR = CB-CBOLD + KD = 6*(IDC-1)+1 + ND = KDEC(KD) + MAT= KDEC(KD+1) + DO J=1,ND + LL(J) = KDEC(KD+1+J) + ENDDO + WRITE (LUN,15) NC,BR,ND,MAT, (NAMP(LL(J)),J=1,ND) + IF (CB .LT. 1.D0) GOTO 110 + ENDIF + ENDDO + RETURN +10 FORMAT(2X,I3,2X,A6,3X,F10.4,3X,F10.4) +15 FORMAT(5X,I2,2X,F9.4,I4,I4,2X,3(A6,2X)) + END + +C======================================================================= + + SUBROUTINE DEC_DEBUG (L,P0, ND, LL, PD) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + CHARACTER*6 NAMP + COMMON /S_CNAM/ NAMP (0:99) + DIMENSION P0(5), LL(10), PD(10,5) + SAVE + + ETOT = 0.D0 + DO J=1,ND + ETOT = ETOT + PD(J,4) + ENDDO + WRITE(*,*) NAMP(IABS(L)),' -> ', (NAMP(IABS(LL(J))),J=1,ND) + WRITE(*,*) ' Ei, Ef = ', P0(4), ETOT, ' L = ', L + RETURN + END +C======================================================================= + + SUBROUTINE DEC_INI + +C----------------------------------------------------------------------- +C decay initialization routine +C sets which particles should decay and wich should be stable +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + DOUBLE PRECISION CBR + INTEGER KDEC,LBARP,IDB + COMMON /S_CSYDEC/ CBR(223+16+12+8), KDEC(1338+6*(16+12+8)), + & LBARP(99), IDB(99) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + SAVE + + if ( ndebug .gt. 0 ) then + write(lun,*)' -----------------------------------------' + write(lun,*)' SIBYLL DEC_INI: setting particle decays!' + write(lun,*)' to be used in stand-alone SIBYLL only ! ' + write(lun,*)' -----------------------------------------' + endif + +C... Definition of stable particles + DO J=4,12 + IDB(J) = -abs(IDB(J)) + ENDDO +c---------------------------------------------------------- +c if the folowing is commented out then all particles +c except leptons, protons and neutrons are UNSTABLE +c---------------------------------------------------------- +c all particles with t<0.3e-10s are considered unstable +c i.e. all the mesons from K0s onwards(K0l is stable) +c---------------------------------------------------------- +C K0s stable + if (ndebug .gt. 0 ) write(lun,*)' making K0s stable..' + IDB(12) = -abs(IDB(12)) + +C Lambda/Anti-lambda stable + if (ndebug .gt. 0 ) write(lun,*)' making LAMBDA stable..' + IDB(39) = -abs(IDB(39)) + +c Sigmas stable + if (ndebug .gt. 0 ) write(lun,*)' making SIGMAs stable..' + do i=34,36 + IDB(i) = -abs(IDB(i)) + enddo + IDB(35) = -abs(IDB(35)) +C Eta stable +cfr in reasonable contex eta is never stable ! + +cdh initializing the pythia routines is done in corsika/SIBINI +c IF(IPAR(44).eq.1)THEN +c use pythia decay routine +c if (ndebug .gt. 0 ) write(LUN,*) ' using PYTHIA decay routine...' +c CALL PYDEC_INI +c endif + + if (ndebug .gt. 0 ) + * write(lun,*)' ------------------------------------------' + end +C======================================================================= + + SUBROUTINE STRING_FRAG_4FLV + + (E0,IFL1,IFL2,PX1,PY1,PX2,PY2,IFBAD,IFQRK) + +C----------------------------------------------------------------------- +C. This routine fragments a string of energy E0 +C. the ends of the strings have flavors IFL1 and IFL2 +C. the particles produced are in the jet-jet frame +C. with IFL1 going in the +z direction +C. E0 = total energy in jet-jet system +C. This version consider also a primordial pT attached +C. to the ends of the string PX1,PY1, PX2,PY2 +C. OUTPUT: IFBAD =1 kinematically impossible decay +c 2010.03.11 ifqrk - leading quark flag +c 1 in valence quark, 0 in others +c +c Modified Nov. 91. RSF and TSS to fragment symmetrically +c ie forward and backward are fragmented as leading. +c Change- Dec. 92 RSF. call to ptdis moved- to use flavor +c of NEW quark in fragmentation. +c +c includes 4 FLAVORS \FR'13 +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + DOUBLE PRECISION ZLIST + COMMON /S_ZLIST/ ZLIST(8000) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT + DOUBLE PRECISION FAin, FB0in + COMMON /S_CZDIS/ FAin, FB0in + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + INTEGER LRNK + COMMON /SIB_RNK/ LRNK(8000) + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + + DIMENSION WW(2,2), PTOT(4), PX(3),PY(3),IFL(3),ILEAD(2) + DIMENSION LPOINT(8000), PMQ(3), IRNK(2), LRES(6:99) + LOGICAL LRANK + SAVE + DATA LRANK/.true./ + + DATA (LRES(I),I=6, 39) + & /27,25,26,28,29,9,9,41,42,19*0,44,45,46,47,48,39/ + DATA (LRES(I),I=40, 49) /40,41,42,43,44,45,46,47,48,49/ + DATA (LRES(I),I=50, 83) + & /0,51,52,53,54,4*0,78,79,10*0,71,72,73,76,77,76, + & 77,78,79,80,81,0,83/ + DATA (LRES(I),I=84, 99) /94,95,96,97,98,89,4*0,94,95,96,97,98,99/ + + IF(Ndebug.gt.3) THEN + WRITE(LUN,*) + & ' STRING_FRAG_4FLV: called with ', + & '(E0,IFL1,IFL2,PX1,PY1,PX2,PY2,IVAL)', + & E0,IFL1,IFL2,PX1,PY1,PX2,PY2,IFQRK + WRITE(LUN,*)' STRING_FRAG_4FLV: NP before fragmentation:',NP + ENDIF + +c... remember initial values +c strange fraction + par2_def = PAR(2) +c vector model + IPAR11_def = IPAR(11) +c vector fraction + PAR5_def = PAR(5) +c charm fraction + PAR24_def = PAR(24) +c popcorn fraction + PAR8_def = PAR(8) + +C...initialise + NTRY = 0 + IFBAD = 0 + 200 NTRY = NTRY + 1 + +c reset parameters after rejection + PAR(2) = PAR2_def + PAR(5) = PAR5_def + PAR(24) = PAR24_def + IPAR(11) = IPAR11_def + PAR(8) = PAR8_def + + IF (NTRY .GT. 50) THEN + IFBAD = 1 + RETURN + ENDIF + I = NP + DO K=1,2 + WW(K,1) = 1.D0 + WW(K,2) = 0.D0 + IRNK(K) = 0 + ENDDO + PX(1) = PX1 + PY(1) = PY1 + PX(2) = PX2 + PY(2) = PY2 + PX(3) = 0.D0 + PY(3) = 0.D0 + PTOT (1) = PX1+PX2 + PTOT (2) = PY1+PY2 + PTOT (3) = 0.D0 + PTOT (4) = E0 +c turn on/off splitting of leading diquark +c (1: no splitting, 0: diq may be split, producing leading meson) + IFL(1) = IFL1+ISIGN(100,IFL1)*MIN(1,IABS(IFL1)/10)*IPAR(90) + IFL(2) = IFL2+ISIGN(100,IFL2)*MIN(1,IABS(IFL2)/10)*IPAR(90) + PMQ(1) = QMASS(IFL(1)) + PMQ(2) = QMASS(IFL(2)) + + ILEAD(1) = 0 + ILEAD(2) = 0 + IBLEAD = 0 + IF(IABS(IFQRK).eq.1) THEN + ILEAD(1) = 1 + ILEAD(2) = 1 + ENDIF +c switch leading baryon fragmentation function on/off + IF(IPAR(20).eq.0) GOTO 300 +c set flags for leading baryon +C +C SET FLAG FOR GENERATION OF LEADING PARTICLES. +C "AND" IS FOR PPBAR ( DIQUARK AT BOTH ENDS) +C "OR" IS FOR PP, PPI, ( DIQUARK AT ONE END.) +C + IF (IABS(IFL1) .GT. 10 .AND. IABS(IFL2) .GT. 10) THEN + IBLEAD = 2 + I = I+1 + JT = INT(1.5D0+S_RNDM(0)) + GOTO 350 + ENDIF + IF (IABS(IFL1) .GT. 10 .OR. IABS(IFL2) .GT. 10) THEN + IBLEAD = 1 + I = I+1 + JT = 2 + IF (IABS(IFL2) .GT. 10) JT = 1 + GOTO 350 + ENDIF + +C...produce new particle: side, pT + 300 continue + I=I+1 + if(i.gt.8000) then + write(LUN,'(1x,a,i8)') + & ' STRING_FRAG_4FLV: no space left in S_PLIST:',I + CALL SIB_REJECT('STRING_FRAG_4FLV') + endif + IF (IBLEAD .GT. 0) THEN + JT = 3 - JT + GO TO 350 + ENDIF +c +c 349 continue +c choose side (1 or 2) + JT=INT(1.5D0+S_RNDM(0)) +c set 'other' side + 350 JR=3-JT +c remember side particle was produced + LPOINT(I) = JT +c increase rank counter + IRNK(JT) = ISIGN(ABS(IRNK(JT))+1,1-JT) +c set particle rank + LRNK(I) = IRNK(JT) + + nporig(I)= Ipflag*2 + KINT + niorig(I)= iiflag + IF(ILEAD(JT).eq.1) nporig(I)= -1 * nporig(I) + nforig(I) = 0 + + 555 CONTINUE +c +c.... CHARM config +c + charmPARdef=PAR(24) + IF(IPAR(15).lt.9)THEN +c no s->c + PAR(24) = 0.D0 + IF (IFQRK.EQ.1) THEN +c ifqrk = 1 (valence quark attatched) + IF(IPAR(15).ge.1) THEN +c enforce s->c at string end + IF(ILEAD(JT).eq.1) PAR(24)=charmPARdef +c produce charm in all strings + IF(IPAR(15).eq.8) PAR(24)=charmPARdef + ELSE +c compatibility to broken version + PAR(24)=charmPARdef + ENDIF + ELSE +c no val. quark at string end or diff + PAR(24)=charmPARdef + ENDIF + ENDIF +c +C.... Vector meson config +c +c increase vec.meson ratio for leading particle in str. diff. + IF(IFQRK.eq.-1)THEN + IF(IPAR(66).eq.1)THEN + IF(ILEAD(JT).EQ.1)THEN + IF(IBAR(IABS(kb)).eq.0.or.IPAR(70).eq.1) PAR(5) = PAR(113) + ENDIF + ELSEIF(IPAR(66).eq.2)THEN + IF(IBAR(IABS(kb)).eq.0.or.IPAR(70).eq.1) PAR(5) = PAR(113) + + ELSEIF(IPAR(66).eq.3)THEN +c increase vector meson rate for meson beam +c on beam side (rank+) only! + IF(ILEAD(JT).EQ.1)THEN + IF(IBAR(IABS(kb)).eq.0.and.IRNK(JT).gt.0) + & PAR(5) = PAR(113) +c always incr. vector rate for diff. strings independent of beam type + IF(IPAR(70).eq.1) PAR(5) = PAR(113) + ENDIF + + ENDIF + endif + +c... switch off for proton beam + IF(IPAR(31).eq.1)then +c print*,'ipar11,ipar11def,1-kb/13,kb',IPAR(11),ipar11_def, +c + max((1-iabs(kb)/13),0),kb + IPAR(11) = IPAR(11)*max((1-iabs(kb)/13),0) ! meson beam only + endif +c increase vec.meson ratio for leading quarks + IF(IABS(IFQRK).eq.1)THEN + IF(IPAR(11).le.-5.and.IPAR(11).ge.-7 + & .and.ilead(jt).eq.1) + & PAR(5) = 9.D0 + +c increase vec.meson ratio for diff. + IF(IFQRK.eq.-1.and.IPAR(11).le.-4.and.IPAR(11).ge.-7) + & PAR(5) = 9.D0 + +c increase vec.meson ratio for leading particle in str. diff. (lvec16) + IF(IFQRK.eq.-1.and.IPAR(11).le.-11.and.ILEAD(JT).EQ.1) + & PAR(5) = 99.D0 + ENDIF + +c... suppress leading charm for pion and kaon beams + IF(IPAR(15).eq.11)then + IF((1-IABS(KB)/13)*ILEAD(JT).gt.0) PAR(24)=0.D0 + ENDIF + +C... suppress rank-1 baryon through popcorn + IF(IBLEAD .GT. 0.and.abs(ifl(jt)).gt.10 + & .and.abs(ifl(3)).lt.10) PAR(8)=PAR(63)*PAR(8) + +C... leading strange/charm + IF(ILEAD(JT).eq.1.and.IPAR(39).gt.0) PAR(2) = PAR(65) + +c scale valence string end charm for assoc. prod. + IF(IPAR(41).eq.1)THEN + IF(ILEAD(JT).eq.1.and.IFQRK.eq.1) PAR(24) = PAR(71)*PAR(24) + ENDIF + +c suppress direct pi0 for meson projectiles +c rate set by par( 137 ) + ipar82_def = IPAR(82) +c skip if baryon projectile or minijet (i.e no flavor attached) + if(ibar(iabs(kb)).ne.0.or.ifqrk.eq.0) IPAR(82) = 0 + +c suppress direct omega for meson projectiles +c rate set by par( 138 ) + ipar83_def = IPAR(83) +c skip if baryon projectile or central string + if(ibar(iabs(kb)).ne.0.or.(ifqrk.gt.0.and.IPAR(83).eq.2)) + & IPAR(83) = 0 + +c change rho0 / omega ratio + PAR143_def = PAR(143) + IF(IPAR(81).eq.1)THEN +c change if beam is meson + if(ibar(iabs(kb)).eq.0) PAR(143) = PAR(144) + ELSEIF(IPAR(81).eq.2)THEN +c change if beam is meson, on meson side only + if(ibar(iabs(kb)).eq.0.and.IRNK(JT).gt.0) PAR(143) = PAR(144) + ELSEIF(IPAR(81).eq.3)THEN +c change if beam is meson, on meson side only, for leading only + if(ibar(iabs(kb)).eq.0.and.ISIGN(ILEAD(JT),IRNK(JT)).eq.1) + & PAR(143) = PAR(144) + ELSEIF(IPAR(81).eq.4)THEN +c change if beam is meson, on meson side only, for diff. strings only + if(ibar(iabs(kb)).eq.0.and.IFQRK.eq.-1) + & PAR(143) = PAR(144) + ELSEIF(IPAR(81).eq.5)THEN +c change if beam is meson, for leading on meson side only and +c for diff. strings only + if(ibar(iabs(kb)).eq.0.and.IFQRK.eq.-1.and. + & ISIGN(ILEAD(JT),IRNK(JT)).eq.1) PAR(143) = PAR(144) + ENDIF + +C...particle ID and pt. + + CALL SIB_I4FLAV (IFL(JT), 0, IRNK(JT), IFL(3), LLIST(I)) + +c reset strange fraction + PAR(2) = PAR2_def +c reset vec.meson production + PAR(5) = PAR5_def +c reset charm fraction + PAR(24) = PAR24_def +c reset popcorn + PAR(8) = par8_def + +c reset pi0 suppr. + IPAR(82) = ipar82_def + +c reset omega suppr. + IPAR(83) = ipar83_def + +c reset rho0 / omega ratio + PAR(143) = PAR143_def + +c reject iso 0 spin 1 for meson projectiles + IF(IBAR(IABS(KB)).eq.0)THEN +c reject leading spin1,isospin singlett + IF(ILEAD(JT).EQ.1.and.LLIST(I).eq.32.and. + + PAR(136).gt.S_RNDM(I)) LLIST(I) = 27 + endif + +c replace leading or all pi0 with rho0 + IF(IFQRK.eq.-1) THEN + IF(IPAR(67).eq.1)THEN + IF(ILEAD(JT).EQ.1) THEN +c replace leading pi0 with rho0 + IF(ABS(LLIST(I)).EQ.6) LLIST(I) = 27*isign(1,LLIST(I)) + ENDIF + ELSEIF(IPAR(67).eq.2)THEN +c replace all pi0 with rho0 for all beams + IF(ABS(LLIST(I)).EQ.6) LLIST(I) = 27*isign(1,LLIST(I)) + ELSEIF(IPAR(67).eq.3)THEN +c replace all pi0 with rho0 for meson beam only + IF(IBAR(IABS(KB)).eq.0)THEN + IF(ABS(LLIST(I)).EQ.6) LLIST(I) = 27*isign(1,LLIST(I)) + ENDIF + ELSEIF(IPAR(67).eq.4)THEN +c replace all pi0 with rho0 for meson beam only +c replace some beam mesons with their vector partner + IF(IBAR(IABS(KB)).eq.0)THEN + IF(ABS(LLIST(I)).EQ.6) LLIST(I) = 27*isign(1,LLIST(I)) +c reject leading spin1,isospin singlett + IF(ILEAD(JT).EQ.1.and.LLIST(I).eq.32.and. + + PAR(136).gt.S_RNDM(I)) LLIST(I) = 27 + IF(S_RNDM(0).lt.PAR(120).and.LLIST(I).eq.KB) + & LLIST(I) = LRES(LLIST(I)) + ENDIF + ENDIF + ENDIF + +c replace leading pi0 by rho0's + IF(IABS(IFQRK).eq.1)THEN + IF(ABS(IPAR(11)).ge.2.and.IPAR(11).ge.-3)THEN + IF(ilead(jt).EQ.1) then + IF(ABS(LLIST(I)).EQ.6) THEN + LLIST(I) = 27*isign(1,LLIST(I)) + endif + endif + +c replace leading pi0 in string diff by rho0's (lvec15) + ELSEIF(IFQRK.eq.-1.and.IPAR(11).eq.-10)THEN + IF(ILEAD(JT).EQ.1) THEN + IF(ABS(LLIST(I)).EQ.6) THEN + LLIST(I) = 27*isign(1,LLIST(I)) + ENDIF + ENDIF +c replace leading pi0 in string diff by rho0's +c in addition to increased leading vec.meson ratio (lvec20) + ELSEIF(IFQRK.eq.-1.and.IPAR(11).eq.-15)THEN + IF(ILEAD(JT).EQ.1) THEN + IF(ABS(LLIST(I)).EQ.6) THEN + LLIST(I) = 27*isign(1,LLIST(I)) + ENDIF + ENDIF +c replace leading omega in string diff by rho0's +c in addition to increased leading vec.meson ratio (lvec21) + ELSEIF(IFQRK.eq.-1.and.IPAR(11).eq.-16)THEN + IF(ILEAD(JT).EQ.1) THEN + IF(ABS(LLIST(I)).EQ.32) + & LLIST(I) = 27*isign(1,LLIST(I)) + ENDIF +c replace leading omega in string diff by rho0's +c suppress pi0 in diff. strings +c in addition to increased leading vec.meson ratio (lvec22) + ELSEIF(IFQRK.eq.-1.and.IPAR(11).eq.-17)THEN + IF(ILEAD(JT).EQ.1) THEN +c print*,'replacing leading omega with rho0' + IF(ABS(LLIST(I)).EQ.32) + & LLIST(I) = 27*isign(1,LLIST(I)) + ENDIF + IF(LLIST(I).EQ.6) then +c print*,'pi0 found! start again.. ' + GOTO 555 + endif + +c replace all for diff. + ELSEIF(IFQRK.eq.-1.and.IPAR(11).lt.0.and. + & IPAR(11).ge.-3) then + IF(ABS(LLIST(I)).EQ.6) LLIST(I) = 27*isign(1,LLIST(I)) + +c increased vec.meson ratio and replace pi0 with rho0 in str.diff + ELSEIF(IFQRK.eq.-1.and.IPAR(11).eq.-7) then + IF(ABS(LLIST(I)).EQ.6) LLIST(I) = 27*isign(1,LLIST(I)) + +c replace leading pi's by vec.mesons, iso-spin conserving + ELSEIF(IPAR(11).eq.-8.and.IPAR(11).lt.0)THEN + PAR(5) = 9.D0 + IF(ilead(jt).EQ.1.and. + $ INT((PAR(5)+1.D0)*S_RNDM(0)).gt.1) then + IF(ABS(LLIST(I)).EQ.6) LLIST(I) = 27*isign(1,LLIST(I)) + IF(ABS(LLIST(I)).EQ.7) LLIST(I) = 25*isign(1,LLIST(I)) +c IF(ABS(LLIST(I)).EQ.8) LLIST(I) = 26*isign(1,LLIST(I)) + endif + +c replace almost all for diff. + ELSEIF(IFQRK.eq.-1.and.IPAR(11).eq.-8.and.IPAR(11).lt.0) then + PAR(5) = 9.D0 + if( INT((PAR(5)+1.D0)*S_RNDM(0)).gt.1 ) then + IF(ABS(LLIST(I)).EQ.6) LLIST(I) = 27*isign(1,LLIST(I)) + IF(ABS(LLIST(I)).EQ.7) LLIST(I) = 25*isign(1,LLIST(I)) + endif + +c replace leading pi0's by vec.mesons + ELSEIF(IPAR(11).eq.-9.and.IPAR(11).lt.0)THEN + PCHF = 0.1D0 + IF(ilead(jt).EQ.1.and.ABS(LLIST(I)).EQ.6) + & LLIST(I) = 27*isign(1,LLIST(I)) + if(ilead(jt).EQ.1.and.ABS(LLIST(I)).EQ.7)then + if(S_RNDM(0).lt.PCHF) LLIST(I) = 25*isign(1,LLIST(I)) + endif + +c replace for string diff. + ELSEIF(IFQRK.eq.-1.and.IPAR(11).eq.-9) then + IF(ABS(LLIST(I)).EQ.6) + & LLIST(I) = 27*isign(1,LLIST(I)) + if(ABS(LLIST(I)).EQ.7)then + if(S_RNDM(0).lt.PCHF) + & LLIST(I) = 25*isign(1,LLIST(I)) + endif + ELSE + CONTINUE + ENDIF + ENDIF + +c reset vec.meson ratio + PAR(5) = 0.3D0 + IF(IABS(IFQRK).eq.1) ILEAD(JT) = 0 + + PMQ(3) = QMASS(IFL(3)) + P(I,5) = AM(IABS(LLIST(I))) + CALL PTDIS_4FLV (IFL(3), PX(3),PY(3)) + +C...fill transverse momentum + P(I,1) = PX(JT) + PX(3) + P(I,2) = PY(JT) + PY(3) + XMT2 = P(I,5)**2+P(I,1)**2+P(I,2)**2 + +C...test end of fragmentation + + WREM2 = PTOT(4)**2-PTOT(1)**2-PTOT(2)**2-PTOT(3)**2 +c IF (WREM2 .LT. 0.1) GOTO 200 + IF (WREM2 .LT. 0.1D0) GOTO 200 +c WMIN = PMQ(1)+PMQ(2)+2.*PMQ(3)+ 1.1 + (2.*S_RNDM(0)-1.)*0.2 + WMIN=PMQ(1)+PMQ(2)+2.D0*PMQ(3)+PAR(59)+(2.D0*S_RNDM(0)-1.D0)*0.2D0 + IF (WREM2 .LT. WMIN**2) Then + if (IABS(ifl(3)).ne.3.and.IABS(IFL(3)).ne.4) GOTO 400 + goto 200 + endif + +C...Choose z + IF(IABS(IFQRK).eq.1) THEN +c valence strings: ( str.diff and non diff. ) + IF(IPAR(11).EQ.1) THEN +c use hard distribution for leading quarks ( no exchange ) + IF(ILEAD(JT).eq.1) THEN + Z = ZBLEAD (IABS(LLIST(I))) + ELSE + IF(IBLEAD .GT. 0.and.iabs(ifl(jt)).gt.10 + & .and.iabs(ifl(3)).lt.10) THEN + Z = ZBLEAD (IABS(LLIST(I))) + IBLEAD = IBLEAD - 1 + ELSE + Z = ZDIS_4FLV (IFL(3),ifl(jt),XMT2) + ENDIF + ENDIF +c use hard frag. for leading particles + ELSEIF(IPAR(11).ge.3.or.IPAR(11).eq.-3.or.IPAR(11).eq.-6 + & .or.IPAR(11).eq.-7) THEN + IF(ILEAD(jt).eq.1) THEN + Z = ZBLEAD (IABS(LLIST(I))) + ELSE + IF(IBLEAD .GT. 0.and.iabs(ifl(jt)).gt.10 + & .and.iabs(ifl(3)).lt.10) THEN + Z = ZBLEAD (IABS(LLIST(I))) + IBLEAD = IBLEAD - 1 + ELSE + Z = ZDIS_4FLV (IFL(3),ifl(jt),XMT2) + ENDIF + ENDIF + ELSEIF(IPAR(11).EQ.-11) THEN +c very hard leading frag. for diff and non. diff val. strings (lvec16) + IF(IBLEAD .GT. 0.and.iabs(ifl(jt)).gt.10) THEN + Z = ZBLEAD (IABS(LLIST(I))) + ELSEIF(ILEAD(jt).eq.1)THEN + Z = 1.D0 - ZDISN(1) + ELSE + Z = ZDIS_4FLV (IFL(3),ifl(jt),XMT2) + ENDIF + + ELSEIF(IPAR(11).EQ.-12.OR.IPAR(11).LE.-15.or.IPAR(68).eq.1)THEN +c very hard leading frag. for diff. val. strings only (lvec17) + IF(IBLEAD .GT. 0.and.iabs(ifl(jt)).gt.10) THEN + Z = ZBLEAD (IABS(LLIST(I))) + ELSEIF(ILEAD(jt).eq.1.and.IFQRK.eq.-1)THEN + Z = 1.D0 - ZDISN(1) + ELSE + Z = ZDIS_4FLV (IFL(3),ifl(jt),XMT2) + ENDIF + + ELSEIF(IPAR(11).EQ.-13.AND.IFQRK.eq.-1) THEN +c hard leading frag. for diff. val. strings only (lvec18) + IF(IBLEAD .GT. 0.and.iabs(ifl(jt)).gt.10) THEN + Z = ZBLEAD (IABS(LLIST(I))) + ELSEIF(ILEAD(jt).eq.1)THEN + Z = S_RNDM(JT) + ELSE + Z = ZDIS_4FLV (IFL(3),ifl(jt),XMT2) + ENDIF + ELSEIF(IPAR(11).EQ.-14.AND.IFQRK.eq.-1) THEN +c hard leading frag. for diff. AND ndiff. val. strings (lvec19) + IF(IBLEAD .GT. 0.and.iabs(ifl(jt)).gt.10) THEN + Z = ZBLEAD (IABS(LLIST(I))) + ELSEIF(ILEAD(jt).eq.1)THEN + Z = S_RNDM(JT) + ELSE + Z = ZDIS_4FLV (IFL(3),ifl(jt),XMT2) + ENDIF + + ELSE + +c hard leading baryons only ( standard ) + IF(IBLEAD .GT. 0.and.iabs(ifl(jt)).gt.10 + & .and.abs(ifl(3)).lt.10) THEN +c print*,'calling zblead: i,id,jt,ncall', i,llist(i),jt,ncall + IF(IPAR(20).eq.3)THEN +c use lund function with different parameters for leading baryon + fa_def = FAin + fb_def = FB0in + FAin = PAR(57) + FB0in = PAR(58) + z = zdis_4flv(IFL(3),ifl(jt),xmt2) +c set parameters to initial values again + FAin = fa_def + FB0in = fb_def + ELSE + Z = ZBLEAD (IABS(LLIST(I))) + ENDIF + IBLEAD = IBLEAD - 1 + ELSE + Z = ZDIS_4FLV (IFL(3),ifl(jt),XMT2) + ENDIF + ENDIF + ELSE +c non valence string + IF (IBLEAD .GT. 0.and.iabs(ifl(jt)).gt.10 + & .and.iabs(ifl(3)).lt.10) THEN +C Special frag. for leading Baryon only +c print*,'calling zblead: i,id,jt,ncall', i,llist(i),jt,ncall + Z = ZBLEAD (IABS(LLIST(I))) + IBLEAD = IBLEAD - 1 + ELSE + Z = ZDIS_4FLV (IFL(3),ifl(jt),XMT2) + ENDIF + ENDIF + IF(IPAR(20).eq.2)IBLEAD = 2 + IF(IFQRK.eq.1) ILEAD(JT) = 0 + + ZLIST(I) = Z + WW(JT,2) = Z*WW(JT,1) + WW(JR,2) = XMT2/(WW(JT,2)*E0**2) + + P(I,3) = WW(1,2)*0.5D0*E0 - WW(2,2)*0.5D0*E0 + P(I,4) = WW(1,2)*0.5D0*E0 + WW(2,2)*0.5D0*E0 + + DO J=1,4 + PTOT (J) = PTOT(J) - P(I,J) + ENDDO + DO K=1,2 + WW(K,1) = WW(K,1) - WW(K,2) + ENDDO + +C...Reset pT and flavor at ends of the string + PX(JT) = -PX(3) + PY(JT) = -PY(3) + IFL(JT) =-IFL(3) + PMQ(JT) = PMQ(3) + + GOTO 300 + +C...Final two hadrons + 400 IAFL1 = IABS(mod(IFL(JR),100)) + IAFL2 = IABS(mod(IFL(3),100)) + IF(NDEBUG.gt.5) + & write(lun,*)'STRING_FRAG: final flavors:', IFL(JR), -IFL(3) + +C.. check if flavor combination is allowed.. + +c reject anti-baryon next to leading baryon +c remaining anti-quark from leading baryon is marked by id+100 + IF((IABS(IFL(JR)).gt.100.and.IAFL2.gt.10).or. + & (IABS(IFL(3)).gt.100.and.IAFL1.gt.10)) GOTO 200 + + IF(IPAR(40).eq.0)THEN +c reject two diquarks, two anti-diquarks AND diquark anti-diquark pairs + IF (IAFL1*IAFL2 .GT. 100) GOTO 200 + ELSE +c ONLY reject two diquarks or two anti-diquarks (unphysical) +c AND KEEP diquark anti-diquark pairs + IF (mod(IFL(JR),100)*mod(IFL(3),100).GT.100) GOTO 200 + ENDIF + + IF ((IAFL1/10.eq.4.or.mod(IAFL1,10).eq.4) + + .and.(IAFL2/10.eq.4.or.mod(IAFL2,10).eq.4)) + + GOTO 200 ! reject two charm quarks + +C.... Vector meson config +c increase vec.meson ration for diff. + IF(IFQRK.eq.-1.and.IPAR(11).le.-4.and.IPAR(11).gt.-8) PAR(5) =9.D0 +c increase vec.meson ration for leading quarks in valence interactions + IF(IABS(IFQRK).eq.1.and.IPAR(11).le.-5.and.ilead(jr).eq.1 + & .and.IPAR(11).gt.-8) PAR(5) = 9.D0 + +c suppress direct pi0 for meson projectiles +c rate set by par( 137 ) + 666 ipar82_def = IPAR(82) +c skip if baryon projectile + if(ibar(iabs(kb)).ne.0.or.ifqrk.eq.0) IPAR(82) = 0 + +c suppress direct omega for meson projectiles +c rate set by par( 138 ) + ipar83_def = IPAR(83) +c skip if baryon projectile or central string + if(ibar(iabs(kb)).ne.0.or.(ifqrk.gt.0.and.IPAR(83).eq.2)) + & IPAR(83) = 0 + +c set current rank + IRNK(JR)=ISIGN(IABS(IRNK(JR))+1,1-JR) + +c change rho0 / omega ratio + IF(IPAR(81).eq.1)THEN +c change if beam is meson + if(ibar(iabs(kb)).eq.0) PAR(143) = PAR(144) + ELSEIF(IPAR(81).eq.2)THEN +c change if beam is meson, on meson side only + if(ibar(iabs(kb)).eq.0.and.IRNK(JR).gt.0) PAR(143) = PAR(144) + ELSEIF(IPAR(81).eq.3)THEN +c change if beam is meson, on meson side only, for leading only + if(ibar(iabs(kb)).eq.0.and.ISIGN(ILEAD(JR),IRNK(JR)).eq.1) + & PAR(143) = PAR(144) + ELSEIF(IPAR(81).eq.4)THEN +c change if beam is meson, on meson side only, for diff. strings only + if(ibar(iabs(kb)).eq.0.and.IFQRK.eq.-1) + & PAR(143) = PAR(144) + ELSEIF(IPAR(81).eq.5)THEN +c change if beam is meson, for leading on meson side only and +c for diff. strings only + if(ibar(iabs(kb)).eq.0.and.IFQRK.eq.-1.and. + & ISIGN(ILEAD(JR),IRNK(JR)).eq.1) PAR(143) = PAR(144) + ENDIF + +c increase vec.meson ratio for leading particle in str. diff. + IF(IPAR(66).eq.1)THEN + IF(ILEAD(JT).EQ.1.and.IFQRK.eq.-1)THEN + IF(IBAR(IABS(kb)).eq.0.or.IPAR(70).eq.1) PAR(5) = PAR(113) + ENDIF + + ELSEIF(IPAR(66).eq.2)THEN + IF(IFQRK.eq.-1)THEN + IF(IBAR(IABS(kb)).eq.0.or.IPAR(70).eq.1) PAR(5) = PAR(113) + ENDIF + + ELSEIF(IPAR(66).eq.3)THEN +c increase vector meson rate for meson beam +c on beam side (rank+) only! + IF(IFQRK.eq.-1)THEN + IF(ILEAD(JR).EQ.1)THEN + IF(IBAR(IABS(kb)).eq.0.and.IRNK(JR).gt.0) + & PAR(5) = PAR(113) +c always incr. vector rate for diff. strings independent of beam type + IF(IPAR(70).eq.1) PAR(5) = PAR(113) + ENDIF + ENDIF + ENDIF + + CALL SIB_I4FLAV (IFL(JR), -IFL(3), IRNK(JR), IFLA, LLIST(I+1)) + + IPAR(82) = ipar82_def + IPAR(83) = ipar83_def + PAR(143) = PAR143_def + + nporig(I+1)= Ipflag*2 + KINT + niorig(I+1)= iiflag + IF(ILEAD(1).eq.1.or.ILEAD(2).eq.1) nporig(I+1)= -1 * nporig(I+1) + +c replace leading or all pi0 with rho0 + IF(IFQRK.eq.-1) THEN + IF(IPAR(67).eq.1)THEN + IF(ILEAD(JR).EQ.1) THEN + IF(IABS(LLIST(I+1)).EQ.6) + & LLIST(I+1) = 27*isign(1,LLIST(I+1)) + ENDIF + ELSEIF(IPAR(67).eq.2)THEN + IF(IABS(LLIST(I+1)).EQ.6) LLIST(I+1) =27*isign(1,LLIST(I+1)) + ELSEIF(IPAR(67).eq.3)THEN + IF(IBAR(IABS(KB)).eq.0)THEN + IF(ABS(LLIST(I+1)).EQ.6)LLIST(I+1)=27*isign(1,LLIST(I+1)) + ENDIF + ENDIF + ENDIF + +c replace all for diff. + IF(IABS(IFQRK).EQ.1)THEN + IF(IFQRK.eq.-1.and.IPAR(11).lt.0 + & .and.IPAR(11).ge.-3) then + IF(ABS(LLIST(I+1)).EQ.6) LLIST(I+1) = 27*isign(1,LLIST(I+1)) + endif +c replace all for leading val. + IF(IPAR(11).le.-2.and.IPAR(11).ge.-3) then + if( ilead(jr).eq.1 ) then + IF(IABS(LLIST(I+1)).EQ.6) + & LLIST(I+1) = 27*isign(1,LLIST(I+1)) + endif + endif + +c increased vec.meson ratio and replace pi0 with rho0 + IF(IFQRK.eq.-1.and.IPAR(11).eq.-7) then + IF(IABS(LLIST(I+1)).EQ.6) LLIST(I+1) = 27*isign(1,LLIST(I+1)) +c IF(ABS(LLIST(I+1)).EQ.7) LLIST(I+1) = 25*isign(1,LLIST(I+1)) + endif + +c replace all for diff. ( same as lvec6 but for rhop as well ) +c reset vec.meson ratio + IF(IFQRK.eq.-1.and.IPAR(11).eq.-8) then + PAR(5) = 9.D0 + if( INT((PAR(5)+1.D0)*S_RNDM(0)).gt.1 ) then + IF(IABS(LLIST(I+1)).EQ.6) + & LLIST(I+1) = 27*isign(1,LLIST(I+1)) + IF(IABS(LLIST(I+1)).EQ.7) + & LLIST(I+1) = 25*isign(1,LLIST(I+1)) + endif + endif +c replace leading pseudoscalar by vector + IF(IPAR(11).eq.-8.and.ilead(jr).eq.1) then + PAR(5) = 9.D0 + if( INT((PAR(5)+1.D0)*S_RNDM(0)).gt.1 ) then + IF(IABS(LLIST(I+1)).EQ.6) + & LLIST(I+1) = 27*isign(1,LLIST(I+1)) + IF(IABS(LLIST(I+1)).EQ.7) + & LLIST(I+1) = 25*isign(1,LLIST(I+1)) + endif + endif + +c replace all pi0 for string diff.( same as lvec7 but for rhop as well ) + IF(IFQRK.eq.-1.and.IPAR(11).eq.-9) then + if(IABS(LLIST(I+1)).EQ.6) LLIST(I+1) =27*isign(1,LLIST(I+1)) + endif +c replace leading pi0 by vector + IF(IPAR(11).eq.-9.and.ILEAD(JR).eq.1) then + if(IABS(LLIST(I+1)).EQ.6) LLIST(I+1) =27*isign(1,LLIST(I+1)) + endif + +c replace leading omega in string diff by rho0's +c suppress pi0 in diff. strings +c in addition to increased leading vec.meson ratio (lvec22) + IF(IFQRK.eq.-1.and.IPAR(11).eq.-17)THEN + IF(IABS(LLIST(I+1)).EQ.6)THEN +c print*,'found pi0, restarting..' + GOTO 666 + ENDIF + ENDIF + ILEAD(JR)= 0 + ENDIF + +c reject iso 0 spin 1 (omega) for meson projectiles + IF(IBAR(IABS(KB)).eq.0)THEN +c reject leading spin1,isospin singlett + IF(ILEAD(JR).EQ.1.and.LLIST(I+1).eq.32.and. + + PAR(136).gt.S_RNDM(I)) LLIST(I+1) = 27 + endif + +c reset vec.mes. ratio + PAR(5) = PAR5_def + PAR(24) = charmPARdef + IPAR(11) = IPAR11_def + + P(I,1) = PX(JT)+PX(3) + P(I,2) = PY(JT)+PY(3) + LPOINT(I) = JT + I1 = I+1 + nforig(I1) = 0 + P(I1,5) = AM(IABS(LLIST(I1))) + P(I1,1) = PX(JR)-PX(3) + P(I1,2) = PY(JR)-PY(3) + LPOINT(I1) = JR + LRNK(I1) = IRNK(JR) + XM1 = P(I,5)**2+P(I,1)**2+P(I,2)**2 + XM2 = P(I1,5)**2+P(I1,1)**2+P(I1,2)**2 + IF (DSQRT(XM1)+dSQRT(XM2) .GT. dSQRT(WREM2)) GOTO 200 + +c...RE & EJA fix + PT2 = (P(I,1)+P(I1,1))**2+(P(I,2)+P(I1,2))**2 + WREMPT = dsqrt(WREM2+PT2) + EA1 = (WREM2+XM1-XM2+PT2)/(2.D0*WREMPT) + + PA2 = (EA1**2-XM1) + if (pa2.gt.0.D0) then + PA = dSQRT(PA2) + else + goto 200 + endif + BA = PTOT(3)/PTOT(4) + GA = PTOT(4)/WREMPT + SGN = DBLE(3-2*JT) + P(I,3) = GA*(BA*EA1+SGN*PA) + P(I,4) = GA*(EA1+BA*SGN*PA) + P(I+1,3) = PTOT(3)-P(I,3) + P(I+1,4) = PTOT(4)-P(I,4) + +c mark as final hadrons + ZLIST(I) = 0.D0 + ZLIST(I+1) = 0.D0 + + NA= NP+1 + NP=I+1 + +C...reorder particles along chain (in rank) + IF (LRANK) THEN + N1 = NA-1 + N2 = 0 + DO J=NA,NP + IF(P(J,4).lt.0) THEN + NP=NA-1 + GOTO 200 ! negative energy bug 'fix' + ENDIF + IF(LPOINT(J) .EQ. 2) THEN + N2=N2+1 + LLIST (NP+N2) = LLIST(J) + LRNK(NP+N2) = LRNK(J) + ZLIST (NP+N2) = ZLIST(J) + nporig(NP+N2) = nporig(J) + niorig(NP+N2) = niorig(J) + nforig(NP+N2) = 0 + DO K=1,5 + P(NP+N2,K)=P(J,K) + ENDDO + ELSE + N1= N1+1 + IF (N1.LT.J) THEN + LLIST(N1) = LLIST(J) + LRNK(N1) = LRNK(J) + ZLIST(N1) = ZLIST(J) + nporig(N1) = nporig(J) + niorig(N1) = niorig(J) + nforig(N1) = nforig(J) + DO K=1,5 + P(N1,K) = P(J,K) + ENDDO + ENDIF + ENDIF + ENDDO + JJ=N1 + DO J=NP+N2,NP+1,-1 + JJ= JJ+1 + LLIST(JJ) = LLIST(J) + LRNK(JJ) = LRNK(J) + ZLIST(JJ) = ZLIST(J) + nporig(JJ) = nporig(J) + niorig(JJ) = niorig(J) + nforig(JJ) = nforig(J) + DO K=1,5 + P(JJ,K) = P(J,K) + ENDDO + ENDDO + ENDIF + + if(Ndebug.gt.3) + & WRITE(LUN,*)' STRING_FRAG_4FLV: NP after fragmentation:',NP + + END + + +C======================================================================= + + SUBROUTINE GG_FRAG_4FLV (E0) + +C----------------------------------------------------------------------- +C...This routine fragments a gluon-gluon system +C. of mass E0 (GeV) +C. the particles produced are in the jet-jet frame +C. oriented along the z axis +C........................................................... + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + DOUBLE PRECISION ZLIST + COMMON /S_ZLIST/ ZLIST(8000) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + DIMENSION WW(2,2),PTOT(4),PX(3),PY(3),IFL(3),PMQ(3) + SAVE + + if(Ndebug.gt.3) then + WRITE(LUN,*) + & ' GG_FRAG_4FLV: called with (E0)', + & E0 + WRITE(LUN,*)' GG_FRAG_4FLV: NP before fragmentation:',NP + endif + +C... 'leading' strange fraction + PAR2_def = PAR(2) + IF(IPAR(39).eq.2) PAR(2) = PAR(66) + + PAR24_def = PAR(24) +C leading charm fraction + IF(IPAR(87).eq.1) PAR(24) = PAR(150) + IF(IPAR(87).eq.2) PAR(24) = PAR(150)*PAR(24) + + E0S = E0**2 + +C...Generate the 'forward' leading particle. +100 I = NP+1 +c dummy rank argument + IDM = 5 +c sample new flavor, i.e. split gluon into quark-antiquark, quark or antiquark + if( IPAR(87).eq.3 )THEN +C flavor threshold model +c u,d -> u,d,s -> u,d,s,c + CALL SIB_ICFLAV(E0S,0,I0,IFL1) + ELSE +c default u,d,s model, same rates as in hadronization (string frag.) + I0 = INT(-1 + 2.D0*INT((2.D0-EPS8)*S_RNDM(I))) + CALL SIB_I4FLAV(I0,0,IDM,IFL1, LDUM) + ENDIF +c form first hadron from new flavor + CALL SIB_I4FLAV(IFL1,0,IDM,IFL2, LLIST(I)) + CALL PTDIS_4FLV(IFL1,PX1,PY1) + CALL PTDIS_4FLV(IFL2,PX2,PY2) + P(I,1) = PX1+PX2 + P(I,2) = PY1+PY2 + P(I,5) = AM(IABS(LLIST(I))) + XM1 = P(I,5)**2+P(I,1)**2+P(I,2)**2 + Z1 = ZDIS_4FLV (IFL1,1,0.25D0*XM1) + Z2 = ZDIS_4FLV (IFL2,1,0.25D0*XM1) + T1 = 4.D0*XM1/(E0S*(Z1+Z2)) + P(I,4) = 0.25D0*E0*(Z1+Z2 + T1) + P(I,3) = 0.25D0*E0*(Z1+Z2 - T1) + + nforig(I)= 0 + nporig(I)= Ipflag*3 + KINT + niorig(I)= iiflag + ZLIST(I) = Z1 + Z2 + +C...Generate the 'backward' leading particle. + I = I+1 + IF( IPAR(87).eq.3 )THEN + CALL SIB_ICFLAV(E0S,-I0,IDM,IFL3) + ELSE + CALL SIB_I4FLAV(-I0,0,IDM,IFL3, LDUM) + ENDIF + CALL SIB_I4FLAV(IFL3,0,IDM,IFL4, LLIST(I)) + CALL PTDIS_4FLV(IFL3,PX3,PY3) + CALL PTDIS_4FLV(IFL4,PX4,PY4) + P(I,1) = PX3+PX4 + P(I,2) = PY3+PY4 + P(I,5) = AM(IABS(LLIST(I))) + XM2 = P(I,5)**2+P(I,1)**2+P(I,2)**2 + Z3 = ZDIS_4FLV (IFL3,1,0.25D0*XM2) + Z4 = ZDIS_4FLV (IFL4,1,0.25D0*XM2) + T2 = 4.D0*XM2/(E0S*(Z3+Z4)) + P(I,4) = 0.25D0*E0*( Z3+Z4 + T2) + P(I,3) = 0.25D0*E0*(-Z3-Z4 + T2) + + nforig(I)= 0 + nporig(I)= Ipflag*3 + KINT + niorig(I)= iiflag + ZLIST(I) = Z3 + Z4 +c PAR24def = PAR(24) +c charm QCD fusion +c IF(IPAR(17).eq.2) PAR(24) = 0. + +c reset strange fraction + PAR(2) = PAR2_def + +c reset charm fraction + PAR(24) = PAR24_def + +C...Fragment the two remaning strings + N0 = 0 + DO KS=1,2 + + NTRY = 0 +200 NTRY = NTRY+1 + I = NP+2+N0 + IF (NTRY .GT. 30) GOTO 100 + + IF (KS .EQ. 1) THEN + WW(1,1) = 0.5D0 * (1.D0 - Z1 - 0.5D0*T2) + WW(2,1) = 0.5D0 * (1.D0 - Z3 - 0.5D0*T1) + PX(1) = -PX1 + PY(1) = -PY1 + PX(2) = -PX3 + PY(2) = -PY3 + IFL(1) = -IFL1 + IFL(2) = -IFL3 + ELSE + WW(1,1) = 0.5D0 * (1.D0 - Z2 - 0.5D0*T2) + WW(2,1) = 0.5D0 * (1.D0 - Z4 - 0.5D0*T1) + PX(1) = -PX2 + PY(1) = -PY2 + PX(2) = -PX4 + PY(2) = -PY4 + IFL(1) = -IFL2 + IFL(2) = -IFL4 + ENDIF + PX(3) = 0.D0 + PY(3) = 0.D0 + PTOT (1) = PX(1)+PX(2) + PTOT (2) = PY(1)+PY(2) + PTOT (3) = 0.5D0*E0*(WW(1,1)-WW(2,1)) + PTOT (4) = 0.5D0*E0*(WW(1,1)+WW(2,1)) + + PMQ(1) = QMASS(IFL(1)) + PMQ(2) = QMASS(IFL(2)) + +C...produce new particle: side, pT +300 I=I+1 + if(i.gt.8000) then + write(LUN,'(1x,a,i8)') + & ' GG_FRAG: no space left in S_PLIST:',I + CALL SIB_REJECT ('GG_FRAG ') + endif + nforig(I)= 0 + nporig(I)= Ipflag*2 + KINT + niorig(I)= iiflag + + JT=INT(1.5D0+S_RNDM(0)) + JR=3-JT +c CALL PTDIS (IFL(JT), PX(3),PY(3)) + +C...particle ID + CALL SIB_I4FLAV (IFL(JT), 0, IDM, IFL(3), LLIST(I)) + PMQ(3) = QMASS(IFL(3)) + P(I,5) = AM(IABS(LLIST(I))) + + CALL PTDIS_4FLV (IFL(3), PX(3),PY(3)) + +C...test end of fragmentation + WREM2 = PTOT(4)**2-PTOT(1)**2-PTOT(2)**2-PTOT(3)**2 + IF (WREM2 .LT. 0.1D0) GOTO 200 + WMIN = PMQ(1)+PMQ(2)+2.D0*PMQ(3)+1.1D0+(2.D0*S_RNDM(0)-1.D0)*0.2D0 + IF (WREM2 .LT. WMIN**2)THEN + GOTO 400 + ENDIF + +C...fill transverse momentum + P(I,1) = PX(JT) + PX(3) + P(I,2) = PY(JT) + PY(3) + +C...Choose z + XMT2 = P(I,5)**2+P(I,1)**2+P(I,2)**2 + Z = ZDIS_4FLV (ifl(3),IFL(JT), XMT2) + + ZLIST(I) = Z + WW(JT,2) = Z*WW(JT,1) + WW(JR,2) = XMT2/(WW(JT,2)*E0S) + + P(I,3) = WW(1,2)*0.5D0*E0 - WW(2,2)*0.5D0*E0 + P(I,4) = WW(1,2)*0.5D0*E0 + WW(2,2)*0.5D0*E0 + + DO J=1,4 + PTOT (J) = PTOT(J) - P(I,J) + ENDDO + DO K=1,2 + WW(K,1) = WW(K,1) - WW(K,2) + ENDDO + +C...Reset pT and flavor at ends of the string + PX(JT) = -PX(3) + PY(JT) = -PY(3) + IFL(JT) =-IFL(3) + PMQ(JT) = PMQ(3) + GOTO 300 + +C...Final two hadrons + 400 IAFL1 = mod(IABS(IFL(JR)),100) + IAFL2 = mod(IABS(IFL(3)),100) + IF (IAFL1*IAFL2 .GT. 100) GOTO 200 ! reject two diquarks + IF ((IAFL1/10.eq.4.or.mod(IAFL1,10).eq.4) + + .and.(IAFL2/10.eq.4.or.mod(IAFL2,10).eq.4)) + + GOTO 200 ! reject two charm quarks + + CALL SIB_I4FLAV (IFL(JR), -IFL(3), IDM, IFLA, LLIST(I+1)) + P(I+1,5) = AM(IABS(LLIST(I+1))) + P(I,1) = PX(JT)+PX(3) + P(I,2) = PY(JT)+PY(3) + nporig(I)= Ipflag*2 + KINT + niorig(I)= iiflag + I1 = I+1 + nporig(I1)= Ipflag*2 + KINT + niorig(I1)= iiflag + P(I1,1) = PX(JR)-PX(3) + P(I1,2) = PY(JR)-PY(3) + XM1 = P(I,5)**2+P(I,1)**2+P(I,2)**2 + XM2 = P(I1,5)**2+P(I1,1)**2+P(I1,2)**2 + IF (dSQRT(XM1)+dSQRT(XM2) .GT. dSQRT(WREM2)) GOTO 200 + if (ptot(4).le.0.D0) goto 200 + PT2 = (P(I,1)+P(I1,1))**2+(P(I,2)+P(I1,2))**2 + WREMPT = dsqrt(WREM2+PT2) + EA1 = (WREM2+XM1-XM2+PT2)/(2.D0*WREMPT) + PA2 = (EA1**2-XM1) + if (PA2.ge.0.D0) then + PA = dSQRT(PA2) + else + goto 200 + endif + BA = PTOT(3)/PTOT(4) + GA = PTOT(4)/WREMPT + SGN = DBLE(3-2*JT) + P(I,3) = GA*(BA*EA1+SGN*PA) + P(I,4) = GA*(EA1+BA*SGN*PA) + P(I+1,3) = PTOT(3)-P(I,3) + P(I+1,4) = PTOT(4)-P(I,4) + ZLIST(I) = 0.D0 + ZLIST(I+1) = 0.D0 + N0 = I-NP-1 + ENDDO ! loop on two `remaining strings' + + NP = I+1 +c PAR(24) = PAR24def + IF(Ndebug.gt.3) then + WRITE(LUN,*)' GG_FRAG_4FLV: NP after fragmentation:',NP + ENDIF + RETURN + END + +C======================================================================= + + SUBROUTINE DIFDEC (L0, Irec, IBAD, P0) + +C----------------------------------------------------------------------- +C..."decay" of an excited state with the quantum numbers +C. of particle L0 and the 5-momentum P0 +C. - low energy: phase space decay (fire ball model) +C. - intermediate energy: one-string decay (longitudinal phase space) +C. - high energy: pomeron-hadron scattering (multi-string model) +C----------------------------------------------------------------------- + IMPLICIT NONE + +c external types + INTEGER L0, Irec, IBAD + DOUBLE PRECISION P0 + DIMENSION P0(5) + + INTEGER NW_max + PARAMETER (NW_max = 20) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT + + INTEGER LRNK + COMMON /SIB_RNK/ LRNK(8000) + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + +c internal types + INTEGER LL,LCON,LRES,LRES1,NTRYS,NRJECT,LA,N1,IREJ,I,J,IFLA, + & IFL1,IFL2,IFBAD,NPI,IRES,LA1,JQQ,JQTOT,K,JQR, + & KB_0,IAT_0 + DOUBLE PRECISION PD,BE,EMIN,EMIN2,PCHEX,PRES,DELTAE, + & SQS_0,S_0,PTmin_0,XMIN_0,ZMIN_0, + & PAR1_def,PAR24_def,PAR53_def,GA,BEP,S_RNDM,AV,GASDEV,PCXG, + & XI1,XI2,XSMR !,FERMI + DIMENSION LL(10), PD(10,5), BE(3), LCON(6:99),LRES1(6:99) + DIMENSION LRES(6:99) + SAVE + EXTERNAL GASDEV + DATA (LRES(k),k=6,22) /27,25,26,28,29,0,0,51,52,6*0,30,31/ + DATA (LRES(k),k=23,33) /23,24,25,26,27,28,29,30,31,27,27/ + DATA (LRES(k),k=34,49) /34,35,36,37,38,39,40,41,42,43,34,35,36, + & 37,38,49/ + DATA (LRES(k),k=50,83) /0,51,52,53,54,4*0,78,79,10*0,80,81,73, + & 74,75,76,77,78,79,80,81,0,83/ + DATA (LRES(k),k=84,99) /94,95,96,97,98,89,4*0,94,95,96,97,98,99/ + + DATA EMIN /0.7D0/ + DATA EMIN2 /10.D0/ + DATA LCON /7,6,6,11,11,9,9,14,13,19*0,35,34,35,38,37,39, + & 19*0,71,72,10*0,59,60,73,10*0,85,86,85,88,87,89,10*0/ + DATA LRES1 /27,25,26,11,11,9,9,14,13,19*0,35,34,35,38,37,39, + & 19*0,78,79,10*0,80,81,83,10*0,94,95,96,97,98,89,10*0/ + DATA PCHEX /0.33D0/ ! probability of charge exchange + DATA PRES /0.7D0/ ! probability of forming a resonance + DATA NRJECT /0/ + + IF(NDEBUG.gt.2) + & WRITE(LUN,'(2X,A,1x,I2,1x,I2,/,5(2x,F10.3))') + & 'DIFDEC: (L0,Irec,P0):',L0,Irec,(P0(i),i=1,5) + + + NTRYS = 0 + + LA = IABS(L0) + DELTAE = P0(5) - AM(LA) + IF(IBAR(LA).ne.0.or.IPAR(65).eq.0)THEN +c baryons + EMIN = PAR(30) + ELSE +c mesons + EMIN = PAR(112) + ENDIF +c IBAD = 0 + PAR1_def= PAR(1) + if(Irec.gt.0) PAR(1)= PAR(16) +c XSMR = 0.5D0 +c XI2=FERMI(DELTAE,EMIN2,XSMR) +c XI1=FERMI(DELTAE,EMIN,XSMR) + XSMR=PAR(131)*EMIN + XI1=MAX((EMIN-DELTAE)/XSMR,0.D0) + XSMR=PAR(131)*EMIN2 + XI2=MAX((EMIN2-DELTAE)/XSMR,0.D0) + if(Ndebug.gt.2) + & WRITE(LUN,'(1x,A29,2(2x,F5.2),2(2x,F8.3))') + & ' DIFDEC: EMIN1,EMIN2,XI1,XI2', + & EMIN,EMIN2,Xi1,Xi2 + +C... pomeron-hadron scattering (pi0 is used instead of pomeron) + IF ((IPAR(10).gt.0).and.(Irec.gt.0).and. + & (DELTAE.gt.EMIN2.or.S_RNDM(LA).gt.XI2)) THEN + if(Ndebug.gt.2) + & WRITE(LUN,*)' DIFDEC: central (L0,DELTAE,NP,XI):', + & L0,DELTAE,NP,XI2 + N1 = NP+1 + if(irec.gt.0.and.IPAR(5).eq.1) par(1)= par(15) + 50 CONTINUE + IPFLAG= IPFLAG*100 +c create subevent + SQS_0 = SQS + S_0 = S + PTmin_0 = PTmin + XMIN_0 = XMIN + ZMIN_0 = ZMIN + KB_0 = KB + IAT_0 = IAT + CALL INI_EVENT(P0(5),L0,6,0) +c create L0 - pi0 interaction, pi0(pid=6) target + CALL SIB_NDIFF(L0, 1, P0(5), 0, IREJ) ! ori +c restore main event + SQS = SQS_0 + S = S_0 + PTmin = PTmin_0 + XMIN = XMIN_0 + ZMIN = ZMIN_0 + KB = KB_0 + IAT = IAT_0 + IF(IREJ.NE.0) THEN + NP = N1-1 + GOTO 50 + ENDIF + PAR(1) = PAR1_def + DO J=1,3 + BE(J)=P0(J)/P0(4) + ENDDO + GA=P0(4)/P0(5) + if(P0(3).lt.0.D0) then + do i=N1,NP + P(I,3) = -P(I,3) + enddo + endif + DO I=N1,NP + BEP=BE(1)*P(I,1)+BE(2)*P(I,2)+BE(3)*P(I,3) + DO J=1,3 + P(I,J)=P(I,J)+GA*(GA*BEP/(1.D0+GA)+P(I,4))*BE(J) + ENDDO + P(I,4)=GA*(P(I,4)+BEP) + ENDDO + +C..."string-like" decay + ELSE IF (DELTAE .GT. EMIN .or. S_RNDM(LA).gt.XI1) THEN + IF(NDEBUG.gt.2) + & WRITE(LUN,'(2X,A,3(2x,F8.3))') + & 'DIFDEC: string-like, (DELTAE,E0,central prob.):', + & DELTAE,P0(5),1.D0-XI2 +c set charge exchange probability, i.e. prob for p* -> n + pip + PAR53_def = PAR(53) + PAR(53) = PAR(130) + N1 = NP+1 + CALL HSPLI(L0,IFL1,IFL2) + PAR(53) = PAR53_def + IF (P0(3) .GT. 0.D0.and.L0.gt.0) THEN + IFLA = IFL2 + IFL2 = IFL1 + IFL1 = IFLA + ENDIF +c randomize flavor orientation in string + IF(IPAR(25).eq.1.and.S_RNDM(L0).gt.PAR(39))THEN + IFLA = IFL2 + IFL2 = IFL1 + IFL1 = IFLA + ENDIF + PAR24_def = PAR(24) + IF(IPAR(15).eq.2.and.IPAR(15).eq.3.and.IPAR(15).ne.7.and. + & IPAR(15).lt.12)THEN + PAR(24) = PAR(25)*dEXP(-PAR(26)/P0(5)) + ELSEIF(IPAR(15).eq.7)THEN + PAR(24) = PAR(25) + ENDIF + 10 CONTINUE + IPFLAG = IPFLAG*10 + CALL STRING_FRAG_4FLV + + (P0(5), IFL1, IFL2, 0.D0,0.D0,0.D0,0.D0,IFBAD,-1) + IF (IFBAD .EQ. 1)then + if(ndebug.gt.1) + & WRITE(lun,*)' SIB_DIFF: string-frag rejection! ', + & '(M,NCALL)',P0(5),NCALL + NTRYS = NTRYS + 1 + NP = N1-1 + IFBAD = 0 + IF(NTRYS.gt.5)then ! resample diff. mass + NP = 0 + IBAD = 1 + PAR(24) = PAR24_def + RETURN + endif + GOTO 10 + ENDIF + DO J=1,3 + BE(J)=P0(J)/P0(4) + ENDDO + GA=P0(4)/P0(5) + DO I=N1,NP + BEP=BE(1)*P(I,1)+BE(2)*P(I,2)+BE(3)*P(I,3) + DO J=1,3 + P(I,J)=P(I,J)+GA*(GA*BEP/(1.D0+GA)+P(I,4))*BE(J) + ENDDO + P(I,4)=GA*(P(I,4)+BEP) + ENDDO + PAR(24) = PAR24_def + +C...Phase space decay of the excited state + ELSEIF(DELTAE.GT.AM(7)+0.02D0)THEN + if(Ndebug.gt.2) + & WRITE(LUN,*)' DIFDEC: fireball, (DELTAE,string prob.):', + & DELTAE,1.D0-XI1 + IF(IPAR(14).GT.0.and.IPAR(14).NE.7)THEN + IF(IPAR(14).eq.5) PCHEX = 0.D0 + NPI=0 + IRES = 0 + IF (S_RNDM(0).LT.PRES) THEN + IF (LA.LT.9) THEN +c if kinematically possible produce rho0 in charge exchange + LL(1) = LRES(LA) + DELTAE = P0(5) - AM(LRES(LA)) + IF (DELTAE.GT.AM(7)+0.02D0) GOTO 100 + ENDIF + ENDIF +c switch charge exchange on/off + IF( S_RNDM(1).LT.PCHEX)THEN + LL(1) = LCON(LA)*ISIGN(1,L0) + IF( (L0 .EQ. 6) .OR. (L0 .EQ. 11) ) + . LL(1) = LL(1)+INT((2.D0-EPS8)*S_RNDM(2)) + ELSE + LL(1) = L0 + ENDIF + + DELTAE = P0(5) - AM(LA) + 100 AV = 2.D0*dSQRT(DELTAE) + LA1 = IABS(LL(1)) + NPI = INT(AV*(2.D0+0.5D0*GASDEV(LA))) + IF (IPAR(14).EQ.6)THEN + IF(NPI.LT.1.OR.NPI.GT.9.OR.AM(LA1)+NPI*AM(7)+0.02D0 + . .GT.P0(5)) GOTO 100 + ELSE + IF(NPI.LT.0.OR.NPI.GT.9.OR.AM(LA1)+NPI*AM(7)+0.02D0 + . .GT.P0(5)) GOTO 100 + ENDIF +c create resonances inside fireball.. + IF(IPAR(14).ge.2 + + .and.DELTAE.GE.AM(LA1)+AM(27)+(NPI-1)*AM(7)+0.02D0) + + IRES = 1 + IF(IPAR(14).ge.3.and.DELTAE.GE.AM(LA1)+NPI*AM(27)+0.02D0) + + IRES=3 + JQQ = ICHP(LA)*ISIGN(1,L0)- + . ICHP(IABS(LL(1)))*ISIGN(1,LL(1)) + 120 JQTOT = 0 + DO K=2,NPI + LL(K) = 6+INT(S_RNDM(K)*(3.D0-EPS8)) +c suppress pi0 in fireball + IF(IPAR(14).ge.4) + + LL(K) = 7+INT(S_RNDM(0)*(2.D0-EPS8)) +c IF(IRES.EQ.1.and.S_RNDM(LA).LT.0.5D0) + IF(IRES.EQ.1) THEN + LL(K) = 27-INT(S_RNDM(1)*(3.D0-EPS8)) + IRES = 2 + ENDIF + IF(IRES.EQ.3) + + LL(K) = 27-INT(S_RNDM(2)*(3.D0-EPS8)) + JQTOT = JQTOT + ICHP(LL(K)) + ENDDO + JQR = JQQ-JQTOT + IF (JQR.LT.-1.OR.JQR.GT.1) GOTO 120 + LL(NPI+1) = 6+JQR + IF (LL(NPI+1) .EQ. 5) LL(NPI+1)=8 + CALL DECPAR (0,P0,NPI+1,LL, PD) + DO J=1,NPI+1 + NP = NP+1 + LLIST(NP) = LL(J) + nporig(NP)= Ipflag*2 + lrnk(Np) = 0 + niorig(NP)= iiflag + DO K=1,5 + P(NP,K) = PD(J,K) + ENDDO + ENDDO + + ELSEIF (IPAR(14).EQ.7.AND.LA.LT.9) THEN +c all diff states go to resonances for pi beam .. + NPI=0 + IRES = 0 + LL(1) = LRES1(LA) + DELTAE = P0(5) - AM(LL(1)) +cdh IF( DELTAE.LT.AM(7)+0.02D0) GOTO 222 + IF( DELTAE.LT.AM(7)+0.02D0) THEN + IF(IPAR(14).EQ.7) DELTAE = P0(5) - AM(LA) + AV = 2.D0*DSQRT(DELTAE) + 201 NPI = INT(AV*(1.D0+0.5D0*GASDEV(LA))) +c print *,'npi:',npi,'av',av,'p05',p0(5),am(la),deltae + IF(NPI.LE.0.OR.NPI.GT.9.OR.AM(LA)+NPI*AM(7)+0.02D0 + . .GT.P0(5)) GOTO 201 + IF (S_RNDM(0).LT.PCHEX) THEN + LL(NPI+1) = LCON(LA)*ISIGN(1,L0) + IF( (L0 .EQ. 6) .OR. (L0 .EQ. 11) ) + . LL(NPI+1) = LL(NPI+1)+INT((2.D0-EPS8)*S_RNDM(1)) + ELSE + LL(NPI+1) = L0 + ENDIF + JQQ = ICHP(LA)*ISIGN(1,L0)- + . ICHP(IABS(LL(NPI+1)))*ISIGN(1,LL(NPI+1)) + 221 JQTOT = 0 + DO K=1,NPI-1 + LL(K) = 6+INT(S_RNDM(K)*(3.D0-EPS8)) + JQTOT = JQTOT + ICHP(LL(K)) + ENDDO + JQR = JQQ-JQTOT + IF (JQR.LT.-1.OR.JQR.GT.1) GOTO 221 + LL(NPI) = 6+JQR + IF (LL(NPI) .EQ. 5) LL(NPI)=8 + CALL DECPAR (0,P0,NPI+1,LL, PD) + DO J=1,NPI+1 + NP = NP+1 + LLIST(NP) = LL(J) + NPORIG(NP) = IPFLAG*2 + lrnk(Np) = 0 + niorig(NP)= iiflag + DO K=1,5 + P(NP,K) = PD(J,K) + ENDDO + ENDDO + + ELSE + IF( S_RNDM(0).LT.PAR(31))THEN + LL(1) = LRES1(LCON(LA)) + IF( (L0 .EQ. 6) .OR. (L0 .EQ. 11) ) + . LL(1) = LRES1(IABS(L0)+INT((2.D0-EPS8)*S_RNDM(1))) + ENDIF + 300 AV = 2.D0*dSQRT(DELTAE) + LA1 = IABS(LL(1)) + NPI = INT(AV*(2.D0+0.5D0*GASDEV(LA))) + IF(ABS(PAR(32)).gt.0.D0) + & NPI = INT(AV*(PAR(32)+0.5D0*GASDEV(LA))) + IF(NPI.LT.0.OR.NPI.GT.9.OR.AM(LA1)+NPI*AM(7)+0.02D0 + . .GT.P0(5)) GOTO 300 +c create resonances inside fireball.. +c IRES=3 + JQQ = ICHP(LA)*ISIGN(1,L0)- + . ICHP(IABS(LL(1)))*ISIGN(1,LL(1)) + 320 JQTOT = 0 + DO K=2,NPI + LL(K) = 6+INT(S_RNDM(K)*(3.D0-EPS8)) +c suppress pi0 in fireball +c IF(IPAR(14).ge.4) +c + LL(K) = 7+INT(S_RNDM(0)*1.99999D0) +c IF(IRES.EQ.1.and.S_RNDM(LA).LT.0.5D0) +c LL(K) = 27-INT(S_RNDM(0)*2.99999D0) + JQTOT = JQTOT + ICHP(LL(K)) + ENDDO + JQR = JQQ-JQTOT + IF (JQR.LT.-1.OR.JQR.GT.1) GOTO 320 + LL(NPI+1) = 6+JQR + IF (LL(NPI+1) .EQ. 5) LL(NPI+1)=8 + CALL DECPAR (0,P0,NPI+1,LL, PD) + DO J=1,NPI+1 + NP = NP+1 + LLIST(NP) = LL(J) + nporig(NP)= Ipflag*2 + lrnk(Np) = 0 + niorig(NP)= iiflag + DO K=1,5 + P(NP,K) = PD(J,K) + ENDDO + ENDDO + ENDIF + + ELSEIF (IPAR(14).LE.-1) THEN +C... generalized fireball model + IF(Ndebug.gt.2) + & WRITE(LUN,*)' DIFDEC: using generalized fireball!' +c set charge exchange probability, +c i.e. prob for p* -> n + pip + PCXG = PAR(61) + CALL FIREBALL_4FLV(L0,P0,PCXG,IFBAD) + IF(IFBAD.eq.1)THEN + IF(ndebug.gt.0)THEN + IF(NRJECT.le.10)THEN + WRITE(LUN,*) + & ' DIFDEC: warning: fireball rejection! ', + & 'diff. mass to low to dissociate beam!' + WRITE(LUN,*) + & ' DIFDEC: m_Beam, DELTAE ,AM(7)+0.02, NCALL: ', + & AM(LA),DELTAE,'>',AM(7)+0.02D0,NCALL + ENDIF + IF(NRJECT.eq.10) + & write(lun,*)' this was the last warning.. good luck!' + ENDIF + NRJECT = NRJECT + 1 + NP = 0 + IBAD = 1 + RETURN + ENDIF + + ELSE +cdh 222 IF(IPAR(14).EQ.7) DELTAE = P0(5) - AM(LA) + IF(IPAR(14).EQ.7) DELTAE = P0(5) - AM(LA) + AV = 2.D0*dSQRT(DELTAE) + 200 NPI = INT(AV*(1.D0+0.5D0*GASDEV(0))) +c print *,'npi:',npi,'av',av,'p05',p0(5),am(la),deltae + IF(NPI.LE.0.OR.NPI.GT.9.OR.AM(LA)+NPI*AM(7)+0.02D0 + . .GT.P0(5)) GOTO 200 + IF (S_RNDM(0).LT.PCHEX) THEN + LL(NPI+1) = LCON(LA)*ISIGN(1,L0) + IF( (L0 .EQ. 6) .OR. (L0 .EQ. 11) ) + . LL(NPI+1) = LL(NPI+1)+INT((2.D0-EPS8)*S_RNDM(1)) + ELSE + LL(NPI+1) = L0 + ENDIF + JQQ = ICHP(LA)*ISIGN(1,L0)- + . ICHP(IABS(LL(NPI+1)))*ISIGN(1,LL(NPI+1)) + 220 JQTOT = 0 + DO K=1,NPI-1 + LL(K) = 6+INT(S_RNDM(K)*(3.D0-EPS8)) + JQTOT = JQTOT + ICHP(LL(K)) + ENDDO + JQR = JQQ-JQTOT + IF (JQR.LT.-1.OR.JQR.GT.1) GOTO 220 + LL(NPI) = 6+JQR + IF (LL(NPI) .EQ. 5) LL(NPI)=8 + CALL DECPAR (0,P0,NPI+1,LL, PD) + DO J=1,NPI+1 + NP = NP+1 + LLIST(NP) = LL(J) + NPORIG(NP) = IPFLAG*2 + lrnk(Np) = 0 + niorig(NP)= iiflag + DO K=1,5 + P(NP,K) = PD(J,K) + ENDDO + ENDDO + ENDIF + ELSE + if (ndebug .gt. 0) then + IF(NRJECT.le.10)THEN + WRITE(LUN,*) ' DIFDEC rejection! ', + & 'diff. mass to low to dissociate beam!' + WRITE(LUN,*) ' DIFDEC: LA, m_Beam, DELTAE, NCALL : ', + & LA, AM(LA),DELTAE,'>',AM(7)+0.02D0,NCALL + IF(Irec.ne.1) + & WRITE(LUN,*) ' was recursive call! (ECM):',P0(5) + ENDIF + IF(NRJECT.eq.10) + & write(lun,*)' this was the last warning.. good luck!' + endif + NRJECT = NRJECT + 1 + NP = 0 + IBAD = 1 + RETURN + ENDIF + PAR(1) = PAR1_def + END +C======================================================================= + + SUBROUTINE EXCT_RMNT(JW,KRMNT,IREJ) + +C----------------------------------------------------------------------- +C routine to produce massive excitations of beam and/or target \FR'14 +C----------------------------------------------------------------------- + IMPLICIT NONE + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + INTEGER NW_max + PARAMETER (NW_max = 20) + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTMIN,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + + INTEGER IBMRDX,ITGRDX,IHMJDX,ISMJDX,ICSTDX,IINTDX + COMMON /S_INDX/ IBMRDX(3),ITGRDX(NW_max,3), + & IHMJDX(NW_max*NH_max),IINTDX(NW_max), + & ISMJDX(NW_max*NS_max),ICSTDX(2*NW_max,3) + + INTEGER IRMNT,KRB,KRT + DOUBLE PRECISION XRMASS,XRMEX + COMMON /S_RMNT/ XRMASS(2),XRMEX(2),IRMNT(NW_max),KRB,KRT(NW_max) + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) +C parameters that represent: NW: max. number of wounded nucleons, +C NS,NH: max. number of soft and hard interactions +c PARAMETER (NW_max = 20) +C The COMMON block /S_CHIST/ contains information about the +C the structure of the generated event: +C NWD = number of wounded nucleons +C NJET = total number of hard interactions +C NSOF = total number of soft interactions +C NNSOF (1:NW) = number of soft pomeron cuts in each interaction +C NNJET (1:NW) = number of minijets produced in each interaction +C JDIF(1:NW) = diffraction code +C 0 : non-diff, +C 1 : beam-diff +C 2 : target-diff +C 3 : double-diff + INTEGER NNSOF,NNJET,JDIF,NWD,NJET,NSOF + COMMON /S_CHIST/ NNSOF(NW_max),NNJET(NW_max), + & JDIF(NW_max),NWD,NJET,NSOF + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + INTEGER ITRY, NREJ + COMMON /S_CNT/ ITRY(20), NREJ(20) + DOUBLE PRECISION XM2MIN,ALXMIN,SLOP0,ASLOP,BSLOP,XMASS + COMMON /S_DIFMAss/ XM2MIN(6),ALXMIN(6),SLOP0,ASLOP,BSLOP,XMASS(2) + + DOUBLE PRECISION P1(5),P2(5),P1N(5),P2N(5),PBM1(5),PBM2(5),PBM(5), + & PTG1(5),PTG2(5),PTG(5),PTT(5),GABE(4) + DOUBLE PRECISION XMB,XMB2,ALPHA,XMSQMIN,XM2MAX,XM2,SHAT,ECM,EE,EE2 + DOUBLE PRECISION XMFRAC,XSFRAC,XMT,XMT2,XMT12,XMT22,P1TOT,P2TOT + DOUBLE PRECISION DELTAE,XMMIN,COD,COF,SID,SIF,ANORF,PX,PY,PZ + DOUBLE PRECISION XM1,ETOT,XI,XM2DIS,S_RNDM +c DOUBLE PRECISION XDUMMY + + INTEGER IMRG2HAD,LL(99) + INTEGER IBM1,IBM2,IBMST1,IBMST2,ITG1,ITG2,ITGST1,ITGST2,ITGH + INTEGER IDM,IFL,IBMH, IREF,I, II,K,J,JJ,L01,L02,NP0LD,NPLD + INTEGER JW,IREJ,KRMNT,LREJ,IBD,ICST11,ICST21 + INTEGER IFLB1,IFLB2,IFLT1,IFLT2,L0,IDHAD,ISTH,IBMST,ITGST + INTEGER IFL1,IFL2,IMRG,IMST,IMST1,IMRGBAR,ICST2,LBD + INTEGER IMST11,IMST2,IMST21,ISTH1,ISTH2,IAFL1,IAFL2!,IMST22 + + SAVE + DATA LL /5*0,7*2,2*1,12*0,2,6*0,6*1,19*0,2,2,10*0, + & 2,2,0,2,2,11*0,1,1,1,9*0,1/ + + +c default return point, beam and target sampling +c IREJ = 1 + + IF(NDEBUG.gt.2) + & WRITE(LUN,*) ' EXCT_RMNT: input (JW,KRMNT,IREJ)', + & JW,KRMNT,IREJ + + IF(NDEBUG.gt.3)THEN + write(LUN,*)' beam remnant index: (lvl0,flv1,flv2) ',IBMRDX + write(LUN,*)' 1st central string index: (lvl0,bm,tg)', + & (ICSTDX(2*(JW-1)+1,ii),ii=1,3) + write(LUN,*)' 2nd central string index: (lvl0,bm,tg)', + & (ICSTDX(2*(JW-1)+2,ii),ii=1,3) + write(LUN,*)' target remnant index: (lvl0,flv1,flv2)', + & (ITGRDX(JW,ii),ii=1,3) + ENDIF + + ITRY(5) = 0 + +C... select indices depending on configuration +C krmnt = 0 : no excitation on either side +c = 1 : beam side excited remnant +c = 2 : target side +c = 3 : both sides + +c write remnant configuration to remnant common + IRMNT(JW) = KRMNT + IF(KRMNT.eq.1)THEN +c beam side remnant only +c proto-remnant position: IBMRDX(1) +c partons in : IBMRDX(2:3) + IBM1 = IBMRDX(2) + IBM2 = IBMRDX(3) +c target side to transfer energy from: +c (sofar always choose valence pair) + ITG1 = ICSTDX(2*(JW-1)+1,3) + ITG2 = ICSTDX(2*(JW-1)+2,3) +c beam-side partons to go into central strings + IBMST1 = ICSTDX(2*(JW-1)+1,2) + IBMST2 = ICSTDX(2*(JW-1)+2,2) +c target-side partons to go into central strings + ITGST1 = ITG1 + ITGST2 = ITG2 + + ELSEIF(KRMNT.eq.2)THEN +c target side remnant only +c proto-remnant in ITGRDX(JW,1) + ITG1 = ITGRDX(JW,2) + ITG2 = ITGRDX(JW,3) +c transfer energy from beam remnant or +c central strings with valence quarks +c in ICSTDX(JW+0:1,2) +c means no beam remnant --> get from valence strings + IBM1 = ICSTDX(2*(JW-1)+1,2) + IBM2 = ICSTDX(2*(JW-1)+2,2) +c beam-side partons to go into central strings + IBMST1 = IBM1 + IBMST2 = IBM2 +c target-side partons to go into central strings + ITGST1 = ICSTDX(2*(JW-1)+1,3) + ITGST2 = ICSTDX(2*(JW-1)+2,3) + + ELSEIF(KRMNT.eq.3)THEN +c beam and target side remnant +c transfer energy from pairs in rmnt or central strings +c listed in I?RDX and ICSTDX() + IBM1 = IBMRDX(2) + IBM2 = IBMRDX(3) + ITG1 = ITGRDX(JW,2) + ITG2 = ITGRDX(JW,3) + + ELSEIF(KRMNT.eq.0)THEN +c no excited remnant case, jump straight to central strings.. + GOTO 100 + + ENDIF + + IF(NDEBUG.gt.3)then + write(lun,*) ' beam parton1: ',IBM1 + write(lun,*) ' beam parton2: ',IBM2 + write(lun,*) ' target parton1:',ITG1 + write(lun,*) ' target parton2:',ITG2 + endif + +c save status of parton stack + CALL GET_NPP(NPLD,NP0LD) + + 10 ITRY(5) = ITRY(5) + 1 + IF(ITRY(5).GT.NREJ(5))THEN + IF(NDEBUG.gt.2) + & WRITE(LUN,*) ' EXCT_RMNT: no. of trials exceeded, ', + & NREJ(5), 'resample minijets ...' , IREJ + RETURN + ENDIF +c reset parton stack after rmnt mass rejection + CALL INI_PRTN_STCK(NPLD,NP0LD) + +C.. construct 4momenta of proto-remnants +c index of beam remnant on stack: IBMRDX(1) + +C.. center-of-mass energy of parton system (s hat) +c calculated in hadron-hadron frame +c for first interaction (jw=1) partons are massless and collinear (sum pt=0) +c in this case ecm = SQS*SQRT(XB*XT), xb,t=x1+x2 +c for jw>1 beam partons may have already acquired mass and additional pt +c therefore ecm = sqs*sqrt(xb*xt) + corr. +c IRDX: index of remnant on parton stack +c SHAT = S*XB*XT+XM2+(XT/XB)*XMT2 + +c with 4momenta of partons on stack, momentum fractions are obsolete +c center-of-mass energy is simply: shat = (pbm+ptg)**2 + +c construct total 4momentum +c add beam-side parton momenta, in had.-had. frame + CALL RD_PRTN_4VEC(IBM1,PBM1,IFL,IDM) + CALL RD_PRTN_4VEC(IBM2,PBM2,IFL,IBMH) + CALL ADD_4VECS(PBM1,PBM2,PBM) + +c target-side parton momenta, in had.-had. frame + CALL RD_PRTN_4VEC(ITG1,PTG1,IFL,IDM) + CALL RD_PRTN_4VEC(ITG2,PTG2,IFL,IDM) + CALL ADD_4VECS(PTG1,PTG2,PTG) + +c add beam and target side to get total 4momentum + CALL ADD_4VECS(PBM,PTG,PTT) + SHAT = PTT(5)**2 + ECM = PTT(5) +c catch virtual remnants + IF(PTT(5).LT.0.D0) THEN + IF(NDEBUG.GT.2)THEN + WRITE(LUN,*) ' EXCT_RMNT: too little mass left (Shat):', + & SHAT + WRITE(LUN,*) ' resample minijets...' + ENDIF + LREJ = 2 + RETURN ! resample minijets + ENDIF + + + IF(NDEBUG.GT.2) WRITE(LUN,*) ' EXCT_RMNT: try no.',ITRY(5) + IF(NDEBUG.GT.3)THEN + write(LUN,*) ' 4momenta before scattering:' + write(LUN,*) ' PBM1:' , (PBM1(jj),jj=1,5) + write(LUN,*) ' PBM2:' , (PBM2(jj),jj=1,5) + write(LUN,*) ' PBM:' , (PBM(jj),jj=1,5) + + write(LUN,*) ' PTG1:' , (PTG1(jj),jj=1,5) + write(LUN,*) ' PTG2:' , (PTG2(jj),jj=1,5) + write(LUN,*) ' PTG:' , (PTG(jj),jj=1,5) + + write(LUN,*) ' PTT:' , (PTT(jj),jj=1,5) + ENDIF + + IF(NDEBUG.gt.2) + & WRITE(LUN,*)' EXCT_RMNT: SHAT:',SHAT + + XMFRAC = PAR(81) + XSFRAC = PAR(82) + +c exponent of remnant mass distribution (1/Mx**2)**alpha +c by default: alpha = 1 +c different for baryons and mesons +c ALPHA = PAR(98) + +C.. Sample masses + IF(KRMNT.eq.1)THEN + XM2MAX = MIN(XSFRAC*S,XMFRAC*AM2(IABS(KB))) + XM2MAX = MAX(XM2MAX,1.D0) + +c mass of target-side: 0 + XMT = 0.D0 + XMT2 = 0.D0 +c get remnant mass +c (might have received mass from prior interaction) + CALL GET_MASS2(IBMRDX(1),XM2) +c allowing excitation to fallback to beam means min. +c mass is beam mass, or more exact smallest mass of hadrons +c with flavors in remnant + IF(IPAR(64).eq.1)THEN +c remnant mass can also decrease through interactions + XMSQMIN = AM2(IABS(KB)) + ELSE +c remnant mass only increased by multiple interactions.. + XMSQMIN = MAX(AM2(IABS(KB)),XM2) + ENDIF +C select exponent from COMMON + ALPHA = XRMEX(LL(IABS(KB))) +c sample beam mass + XMB2 = XM2DIS(XMSQMIN,XM2MAX,ALPHA) + IF(NDEBUG.gt.2) + & WRITE(LUN,*)' EXCT_RMNT: XM2min,XM2max,ALPHA,XM2:', + & XMSQMIN,XM2MAX,ALPHA,XMB2 +c check if resonance or massive hadron has to be formed + CALL SEL_RES(XMB2,KRB,IBMRDX(1),IBMH) + XMB = dsqrt(XMB2) + + ELSEIF(KRMNT.eq.2)THEN +c target side mass + XM2MAX = MIN(XSFRAC*S,XMFRAC*AM2(IABS(KT(JW)))) + XM2MAX = MAX(XM2MAX,1.D0) + + XMB = 0.D0 + XMB2 = 0.D0 + XMSQMIN = AM2(KT(JW)) +C select exponent from COMMON + ALPHA = XRMEX(LL(IABS(KT(JW)))) + XMT2 = XM2DIS(XMSQMIN,XM2MAX,ALPHA) + IF(NDEBUG.gt.2) + & WRITE(LUN,*)' EXCT_RMNT: XM2min,XM2max,ALPHA,XM2:', + & XMSQMIN,XM2MAX,ALPHA,XMT2 + +c check if resonance or massive hadron has to be formed + CALL SEL_RES(XMT2,KRT(JW),ITGRDX(JW,1),ITGH) + XMT = dsqrt(XMT2) + + ELSEIF(KRMNT.eq.3)THEN + XM2MAX = MIN(XSFRAC*S,XMFRAC*AM2(IABS(KB))) + XM2MAX = MAX(XM2MAX,1.D0) + + CALL GET_MASS2(IBMRDX(1),XM2) + IF(IPAR(64).eq.1)THEN +c remnant mass can also decrease through interactions + XMSQMIN = AM2(IABS(KB)) + ELSE +c remnant mass only increased by multiple interactions.. + XMSQMIN = MAX(AM2(IABS(KB)),XM2) + ENDIF +C select exponent from COMMON + ALPHA = XRMEX(LL(IABS(KB))) + XMB2 = XM2DIS(XMSQMIN,XM2MAX,ALPHA) + IF(NDEBUG.gt.2) + & WRITE(LUN,*)' EXCT_RMNT: XM2min,XM2max,ALPHA,xm2:', + & XMSQMIN,XM2MAX,ALPHA,XMB2 + +c check if resonance or massive hadron has to be formed + CALL SEL_RES(XMB2,KRB,IBMRDX(1),IBMH) + XMB = SQRT(XMB2) + +c target always nucleon + XM2MAX = MIN(XSFRAC*S,XMFRAC*AM2(IABS(KT(JW)))) + XM2MAX = MAX(XM2MAX,1.D0) + + XMSQMIN = AM2(IABS(KT(JW))) +C select exponent from COMMON + ALPHA = XRMEX(LL(IABS(KT(JW)))) + XMT2 = XM2DIS(XMSQMIN,XM2MAX,ALPHA) + IF(NDEBUG.gt.2) + & WRITE(LUN,*)' EXCT_RMNT: XM2min,XM2max,alpha,XM2:', + & XMSQMIN,XM2MAX,ALPHA,XMT2 + +c check if resonance or massive hadron has to be formed + CALL SEL_RES(XMT2,KRT(JW),ITGRDX(JW,1),ITGH) + XMT = SQRT(XMT2) + + ENDIF +c write excitation mass to output common + XRMASS(1) = XMB + XRMASS(2) = XMT + +c minimal mass requirement +c IF(SHAT.lt.XMB2+XMT2+0.3) GOTO 10 + IF(SHAT.lt.XMB2+XMT2+2.D0*XMB*XMT+0.3D0) GOTO 10 + +C transfer cm energy to mass of particle in parton-parton cm + CALL TRANSFONSHELL(ECM,XMB,XMT,XM2MAX,1,P1,P2,IBD) + IF(IBD.eq.1) THEN + IF(NDEBUG.gt.2) WRITE(LUN,*) ' EXCT_RMNT: excitation rejected!' + RETURN + ENDIF + +C... Boost 4momenta to hadron-hadron center-of-mass +c along z only if initial partons do not carry transverse momentum +c (cancels between val1 and val2) +c with multiple nucleons interacting beam val partons can aquire +c transverse momentum from the target. in this case need arbitrary boost + DO K = 1,4 + GABE(k) = PTT(k)/PTT(5) + ENDDO + CALL SIB_ALTRA(GABE(4), GABE(1), GABE(2), GABE(3), + & P1(1),P1(2),P1(3),P1(4), + & P1TOT,P1N(1),P1N(2),P1N(3),P1N(4)) + P1N(5)=P1(5) + CALL SIB_ALTRA(GABE(4), GABE(1), GABE(2), GABE(3), + & P2(1),P2(2),P2(3),P2(4), + & P2TOT,P2N(1),P2N(2),P2N(3),P2N(4)) + P2N(5)=P2(5) + +C... Calculate new 4momentum of partons in had.-had. frame +c P1,P2: momenta after scattering in parton-parton cm. +c P1n,P2n: momenta after scattering in had.-had. cm +c PBM1,2: momenta of beam partons in had.-had. before scattering +c PTG1,2: momenta of target partons in had.-had. before scattering +c PBM: combined momentum of all beam partons before scattering +c PTG: combined momentum of all target partons before scattering + +c energy and z component + DO II=3,4 + PBM1(II) = PBM1(II)*P1n(II)/PBM(II) + PBM2(II) = PBM2(II)*P1n(II)/PBM(II) + + PTG1(II) = PTG1(II)*abs(P2N(II)/PTG(II)) + PTG2(ii) = PTG2(ii)*abs(P2N(II)/PTG(II)) + ENDDO + +c if transverse momentum prior to interaction zero then +c assign transverse momentum of partons according to random fraction + IF(ABS(PBM(1)).LT.EPS10.or.ABS(PBM(2)).LT.EPS10)THEN + DO II = 1,2 + XI = S_RNDM(II) + PBM1(II) = XI*P1N(Ii) + PBM2(II) = (1.D0-XI)*P1N(II) + ENDDO + ELSE + DO II=1,2 + PBM1(II) = PBM1(II)*P1N(II)/PBM(II) + PBM2(II) = PBM2(II)*P1N(II)/PBM(II) + ENDDO + ENDIF + + IF(ABS(PTG(1)).LT.EPS10.or.ABS(PTG(2)).LT.EPS10)THEN + DO II=1,2 + XI = S_RNDM(II) + PTG1(II) = XI*P2N(II) + PTG2(II) = (1.D0-XI)*P2N(II) + ENDDO + ELSE + DO II=1,2 + PTG1(II) = PTG1(II)*P2N(II)/PTG(II) + PTG2(II) = PTG2(II)*P2N(II)/PTG(II) + ENDDO + ENDIF + + IF(NDEBUG.GT.3)THEN + write(LUN,*) ' parton 4momenta after scattering:' + write(LUN,*) ' PBM1:' , (PBM1(jj),jj=1,5) + write(LUN,*) ' PBM2:' , (PBM2(jj),jj=1,5) + write(LUN,*) ' sum: ' , (PBM2(jj)+PBM1(jj),jj=1,5) + write(LUN,*) ' PTG1:' , (PTG1(jj),jj=1,5) + write(LUN,*) ' PTG2:' , (PTG2(jj),jj=1,5) + write(LUN,*) ' sum: ' , (PTG2(jj)+PTG1(jj),jj=1,5) + ENDIF + +C... change parton 4momenta on stack + CALL EDT_PRTN(IBM1,PBM1(1),PBM1(2),PBM1(3),PBM1(4),PBM1(5),IDM) + CALL EDT_PRTN(IBM2,PBM2(1),PBM2(2),PBM2(3),PBM2(4),PBM2(5),IDM) + + CALL EDT_PRTN(ITG1,PTG1(1),PTG1(2),PTG1(3),PTG1(4),PTG1(5),IDM) + CALL EDT_PRTN(ITG2,PTG2(1),PTG2(2),PTG2(3),PTG2(4),PTG2(5),IDM) + +C... add remnants +c references are circular: +c rmnt --> parton1 --> parton2 --> lvl2 rmnt (hadron) --> rmnt + IF(KRMNT.eq.1)THEN +c beam side remnant, add only if does not exist yet otherwise edit + IF(IBMRDX(1).eq.0)THEN + CALL ADD_PRTN + & (P1N(1),P1N(2),P1N(3),P1N(4),P1N(5),2,0,IBM1,IBMRDX(1)) + ELSE + CALL EDT_PRTN + & (IBMRDX(1),P1N(1),P1N(2),P1N(3),P1N(4),P1N(5),IREF) + ENDIF +c add beam hadron as hypothetical final state + IF(IBMH.eq.0)THEN + CALL ADD_PRTN + & (P1N(1),P1N(2),P1N(3),P1N(4),P1N(5),KRB,2,IBMRDX(1),IBMH) + ELSE + CALL EDT_PRTN + & (IBMH,P1N(1),P1N(2),P1N(3),P1N(4),P1N(5),IREF) + ENDIF +c add references rmnt --> parton1 etc + CALL ADD_REF(IBMRDX(1),IBM1) + CALL ADD_REF(IBM1,IBM2) + CALL ADD_REF(IBM2,IBMH) + + ELSEIF(KRMNT.eq.2)THEN +c add target side remnant + IF(ITGRDX(JW,1).eq.0)THEN + CALL ADD_PRTN + & (P2N(1),P2N(2),P2N(3),P2N(4),P2N(5), + & -2,0,0,ITGRDX(JW,1)) + ELSE + CALL EDT_PRTN + & (ITGRDX(JW,1),P2N(1),P2N(2),P2N(3),P2N(4),P2N(5),IREF) + ENDIF + IF(ITGH.eq.0)THEN +c add target hadron as hypothetical final state, always nucleon + CALL ADD_PRTN + & (P2N(1),P2N(2),P2N(3),P2N(4),P2N(5), + & KRT(JW),2,ITGRDX(JW,1),ITGH) + ELSE + CALL EDT_PRTN + & (ITGH,P2N(1),P2N(2),P2N(3),P2N(4),P2N(5),IREF) + ENDIF + +c add references rmnt --> parton1 etc + CALL ADD_REF(ITGRDX(JW,1),ITG1) + CALL ADD_REF(ITG1,ITG2) + CALL ADD_REF(ITG2,ITGH) + + ELSEIF(KRMNT.eq.3)THEN +c beam side remnant, add only if does not exist yet, otherwise edit + IF(IBMRDX(1).EQ.0)THEN + CALL ADD_PRTN + & (P1N(1),P1N(2),P1N(3),P1N(4),P1N(5),2,0,0,IBMRDX(1)) + ELSE + CALL EDT_PRTN + & (IBMRDX(1),P1N(1),P1N(2),P1N(3),P1N(4),P1N(5),IREF) + ENDIF +c add beam hadron as hypothetical final state + IF(IBMH.EQ.0)THEN + CALL ADD_PRTN + & (P1N(1),P1N(2),P1N(3),P1N(4),P1N(5),KRB,2,IBMRDX(1),IBMH) + ELSE + CALL EDT_PRTN + & (IBMH,P1N(1),P1N(2),P1N(3),P1N(4),P1N(5),IREF) + ENDIF + CALL ADD_REF(IBMRDX(1),IBM1) + CALL ADD_REF(IBM1,IBM2) + CALL ADD_REF(IBM2,IBMH) + +c add target side remnant + IF(ITGRDX(JW,1).eq.0)THEN + CALL ADD_PRTN + & (P2N(1),P2N(2),P2N(3),P2N(4),P2N(5),-2,0,0,IREF) + ITGRDX(JW,1) = IREF + ELSE + CALL EDT_PRTN + & (ITGRDX(JW,1),P2N(1),P2N(2),P2N(3),P2N(4),P2N(5),IREF) + ENDIF + IF(ITGH.eq.0)THEN +c add target hadron as hypothetical final state + CALL ADD_PRTN + & (P2N(1),P2N(2),P2N(3),P2N(4),P2N(5), + & KRT(JW),2,ITGRDX(JW,1),ITGH) + ELSE + CALL EDT_PRTN + & (ITGH,P2N(1),P2N(2),P2N(3),P2N(4),P2N(5),IREF) + ENDIF +c add references rmnt --> parton1 etc + CALL ADD_REF(ITGRDX(JW,1),ITG1) + CALL ADD_REF(ITG1,ITG2) + CALL ADD_REF(ITG2,ITGH) + + ENDIF + + 100 IF(JDIF(JW).ne.0.and.NWD.ne.1)THEN +c incoherent diffraction case +c add parton 4momenta to obtain c.m energy + +c beam side + IBMST1 = ICSTDX(2*(JW-1)+1,2) + IBMST2 = ICSTDX(2*(JW-1)+2,2) + +c target side + ITGST1 = ICSTDX(2*(JW-1)+1,3) + ITGST2 = ICSTDX(2*(JW-1)+2,3) + + CALL RD_PRTN_4VEC(IBMST1,PBM1,IFLB1,IDM) + CALL RD_PRTN_4VEC(IBMST2,PBM2,IFLB2,IDM) + CALL ADD_4VECS(PBM1,PBM2,PBM) + CALL RD_PRTN_4VEC(ITGST1,PTG1,IFLT1,IDM) + CALL RD_PRTN_4VEC(ITGST2,PTG2,IFLT2,IDM) + CALL ADD_4VECS(PTG1,PTG2,PTG) +c total 4momentum + CALL ADD_4VECS(PBM,PTG,PTT) +c add diffractive system to parton stack +c references are: diff --> diff. hadron +c --> beam parton1 --> beam parton2 --> target parton1 etc + CALL ADD_PRTN_4VEC(PTT,-10*JDIF(JW),0,IBMST1,IREF) + CALL ADD_INT_REF(IREF,IINTDX(JW)) +c both string indices point to diff. system + ICSTDX(2*(JW-1)+1,1) = IREF + ICSTDX(2*(JW-1)+2,1) = IREF +c add diff. beam hadron to stack +c model assumes remnant always excited in first interaction + L0 = KB +c if not first interaction or remnant excited, merge sea pair to hadron + IF(KRMNT.ne.0.or.JW.ne.1) THEN + L0 = IMRG2HAD(IFLB1,IFLB2) +c CALL SIB_I4FLAV(IFLB1,IFLB2,IDM,IDM1,L0) + ENDIF +c check kinematic limits +c m2_max should be smaller than m2_min + IREJ = 1 + EE = PTT(5) + EE2 = PTT(5)**2 + K = 2-IBAR(IABS(L0)) + IF(JDIF(jw).gt.1)THEN + DELTAE = EE-AM(13) + XMMIN=max(XM2MIN(1),(AM(IABS(l0))+AM(7)+0.02D0)**2) + ELSE + DELTAE = EE-AM(IABS(L0)) + XMMIN=max(XM2MIN(K),(AM(IABS(l0))+AM(7)+0.02D0)**2) + ENDIF +c print *,'jw,jdif,nwd,l0,ifl1,ifl2,deltae,xmin,ee,xmax', +c & jw,jdif(jw),nwd,l0,ifl1,ifl2,deltae,xmmin,ee,par(13)*ee2 + IF(DELTAE.lt.AM(7)+0.02D0) THEN + IF(ndebug.gt.2) + & WRITE(lun,*) ' EXCT_RMNT: inchoherent diff. :', + & ' not enough mass left for excitation! (DELTAE,PION,', + & 'IREJ,NCALL)',DELTAE,AM(7)+0.02D0,IREJ,NCALL + RETURN + ENDIF + IF(PAR(13)*EE2.lt.XMMIN)THEN + IF(ndebug.gt.2) + & WRITE(lun,*) ' EXCT_RMNT: inchoherent diff. :', + & ' not enough mass left for excitation! (min,max,', + & 'IREJ,NCALL)',PAR(13)*EE2,XMMIN,IREJ,NCALL + RETURN + ENDIF + CALL ADD_PRTN_4VEC(PTT,L0,2,IBMST1,IDHAD) + CALL ADD_REF(IREF,IDHAD) +c reset references of partons + CALL ADD_REF(IBMST1,IBMST2) + CALL ADD_REF(IBMST2,ITGST1) + CALL ADD_REF(ITGST1,ITGST2) + CALL ADD_REF(ITGST2,IREF) + IF(ndebug.gt.2) THEN + WRITE(LUN,*) ' EXCT_RMNT: incoherent diff. ', + & '(IDX,IDX2,JDIF,ECM,L0)',IREF,IDHAD,JDIF(JW),PTT(5),L0 + WRITE(LUN,*) ' EXCT_RMNT: DELTAE,XM2MAX:',DELTAE,PAR(13)*EE2 + ENDIF + IREJ = 0 + RETURN + ENDIF + +C... add central strings to stack +c partons designated for central strings +c are indexed in ICSTDX(JW,2:3) +c pstr_j = p_j_bm + p_j_tg +c string mass ** 2 = pstr_j ** 2 +c --> read momenta from stack, add beam and target side, +c references are set in a loop: +c string --> beam-parton --> target-parton --> string +c then write string 4momentum on stack + IMRG = 0 + DO JJ=1,2 + ISTH = 0 + IBMST = ICSTDX(2*(JW-1)+JJ,2) + ITGST = ICSTDX(2*(JW-1)+JJ,3) + CALL RD_PRTN_4VEC(IBMST,PBM1,IFL1,IDM) + CALL RD_PRTN_4VEC(ITGST,PTG1,IFL2,IDM) + CALL ADD_4VECS(PBM1,PTG1,PTT) +c transverse mass of string end partons (pt**2) + CALL GET_XMT2(IBMST,XMT12) + CALL GET_XMT2(ITGST,XMT22) +c available mass for string + EE = SQRT(PTT(4)**2-PTT(3)**2) +c catch virtual strings + IF(PTT(5).lt.0.D0) THEN + IREJ = 1 + IF(ndebug.gt.2) + & write(LUN,*)' EXCT_RMNT: virt. string (M):',EE + IF(ndebug.gt.3)then + CALL GET_IMASS2(IBMST,XM2) + write(LUN,*) ' PBM1:', (PBM1(j),j=1,5),XM2 + CALL GET_IMASS2(ITGST,xm2) + write(LUN,*) ' PTG1:', (PTG1(j),j=1,5),XM2 + write(LUN,*) ' Ptot:', (PTT(j),j=1,5) + ENDIF +c stop + RETURN + ENDIF +c minimal string mass requirement + IF(EE.lt.sqrt(XMT12)+sqrt(XMT22)+PAR(123))THEN + IAFL1 = IABS(IFL1) + IAFL2 = IABS(IFL2) + IF(IPAR(74).eq.1)THEN +c try to form single meson, set merge flag + IF(IAFL1.gt.10.and.IAFL2.gt.10) THEN +c skip if two diquarks need merging.. + IREJ = 1 + RETURN + ENDIF + IF((IAFL1/10.eq.4.or.mod(IAFL1,10).eq.4) + + .and.(IAFL2/10.eq.4.or.mod(IAFL2,10).eq.4)) THEN +c skip if two charm quarks need merging.. + IREJ = 1 + RETURN + ENDIF + L0 = IMRG2HAD(IFL1,IFL2) + IF(EE.gt.AM(IABS(L0))) then + IMRG = IMRG + JJ + CALL ADD_PRTN_4VEC(PTT,L0,2,IBMST,ISTH) + IF(ndebug.gt.2)then + write(lun,*) + & ' EXCT_RMNT: c.string mass too low! ', + & 'merge into hadron..',l0 + ENDIF + ENDIF + ELSE + IF(ndebug.gt.2)then + write(lun,*) + & ' EXCT_RMNT: c.string kinematic rejection!' + write(lun,*) ' EE,limit,XMT1,XMT2:', + & EE,sqrt(XMT12)+sqrt(XMT22)+0.3D0,sqrt(XMT12), + & sqrt(XMT22) + write(lun,*) ' return to momentum sampling..' + endif + IREJ = 1 + RETURN + ENDIF + ENDIF +c add central string to stack, refering to beam-end parton + CALL ADD_PRTN_4VEC(PTT,1,0,IBMST,IREF) + ICSTDX(2*(JW-1)+JJ,1) = IREF + CALL ADD_INT_REF(Iref,IINTDX(JW)) +c add reference to target parton to beam parton + CALL ADD_REF(IBMST,ITGST) + IF(ISTH.ne.0) THEN +c if string merged to hadron add reference corresponding reference + CALL ADD_REF(ITGST,ISTH) + CALL ADD_REF(ISTH,IREF) + ELSE +c add reference to corresponding central string to target parton + CALL ADD_REF(ITGST,IREF) + ENDIF + ENDDO + +c form single hadron from string if mass was too low .. +c need to put hadron on shell by exchanging energy with other string + IF(IMRG.eq.1.or.IMRG.eq.2)THEN + IF(ndebug.gt.2) + & WRITE(LUN,*)' EXCT_RMNT: merging one string..',IMRG +c one string merged +c index of merged string and its last parton + IMST = ICSTDX(2*(JW-1)+IMRG,1) + IMST1 = ICSTDX(2*(JW-1)+IMRG,3) +c index of ordinary string + IMRGBAR = 3-IMRG + ICST2 = ICSTDX(2*(JW-1)+IMRGBAR,1) +c read 4momenta + CALL RD_REF(IMST1,ISTH) + CALL RD_PRTN_4VEC(ISTH,P1,L0,IREF) +c string two + CALL RD_PRTN_4VEC(ICST2,P2,IFL2,IDM) +c cm energy + CALL ADD_4VECS(P1,P2,PTT) + IF(ndebug.gt.2)THEN + write(lun,*)' EXCT_RMNT: string A :',(P1(i),i=1,5) + write(lun,*)' EXCT_RMNT: string B :',(P2(i),i=1,5) + write(lun,*)' EXCT_RMNT: total :',(PTT(i),i=1,5) + ENDIF + ECM = PTT(5) + XM1 = AM(IABS(L0)) + XM2 = P2(5) + CALL TRANSFONSHELL(ECM,XM1,XM2,1.D0,3,P1N,P2N,LBD) + IF(LBD.eq.1) THEN + IF(NDEBUG.gt.2) + & WRITE(LUN,*)' EXCT_RMNT: mass transfer failed!' + RETURN + ENDIF +c by definition p1n is along +z in string cm, need to invert if pzA < pzB +c IF(P2(3).gt.P1(3)) CALL SWTCH_LMNTS(P1N(3),P2N(3)) + +C.. rotate parton-parton axis onto string-string axis +c therefore boost to parton-parton cm +c to calc. rotation angles BEFORE interaction ! + DO K = 1,4 + GABE(K) = PTT(K)/PTT(5) + enddo + CALL SIB_ALTRA(GABE(4),-GABE(1),-GABE(2),-GABE(3), + & P1(1),P1(2),P1(3),P1(4), + & P1TOT,PBM1(1),PBM1(2),PBM1(3),PBM1(4)) +c rotation factors + COD= PBM1(3)/P1TOT + SID= DSQRT(PBM1(1)**2+PBM1(2)**2)/P1TOT + COF=1.D0 + SIF=0.D0 + IF(P1TOT*SID.GT.EPS5) THEN + COF=PBM1(1)/(SID*P1TOT) + SIF=PBM1(2)/(SID*P1TOT) + ANORF=DSQRT(COF*COF+SIF*SIF) + COF=COF/ANORF + SIF=SIF/ANORF + ENDIF + IF(ndebug.gt.2)THEN + write(lun,*)' EXCT_RMNT: momentum in cm:',(PBM1(i),i=1,5) + write(lun,*)' EXCT_RMNT: rotation factors:',COD,SID,COF,SIF + write(lun,*)' EXCT_RMNT: rotation angles (theta,phi):', + & ACOS(COD),ACOS(COF),ASIN(SID),ASIN(SIF) + write(lun,*)' EXCT_RMNT: momentum:', + & sqrt(P1N(1)**2+P1N(2)**2+P1N(3)**2) + ENDIF +c rotate parton momenta after interaction, still in parton-parton frame + CALL SIB_TRANI(P1N(1),P1N(2),P1N(3),COD,SID,COF,SIF + & ,PX,PY,PZ) + P1N(1)=PX + P1N(2)=PY + P1N(3)=PZ + CALL SIB_TRANI(P2N(1),P2N(2),P2N(3),COD,SID,COF,SIF + & ,PX,PY,PZ) + P2N(1)=PX + P2N(2)=PY + P2N(3)=PZ + IF(ndebug.gt.2) write(lun,*)' EXCT_RMNT: momentum*:', + & sqrt(P1N(1)**2+P1N(2)**2+P1N(3)**2) + +c boost back to hadron-hadron + DO K = 1,4 + GABE(K) = PTT(K)/PTT(5) + ENDDO + CALL SIB_ALTRA(GABE(4), GABE(1), GABE(2), GABE(3), + & P1N(1),P1N(2),P1N(3),P1N(4), + & P1TOT,P1(1),P1(2),P1(3),P1(4)) + P1(5)=P1N(5) + CALL SIB_ALTRA(GABE(4), GABE(1), GABE(2), GABE(3), + & P2N(1),P2N(2),P2N(3),P2N(4), + & P2TOT,P2(1),P2(2),P2(3),P2(4)) + p2(5)=p2n(5) + IF(ndebug.gt.2)THEN + write(lun,*)' EXCT_RMNT: momenta after scattering:' + write(lun,*)' EXCT_RMNT: hadron A :',(P1(i),i=1,5) + write(lun,*)' EXCT_RMNT: string B :',(P2(i),i=1,5) + ENDIF + +c edit partons on stack + CALL EDT_PRTN + & (ISTH,P1(1),P1(2),P1(3),P1(4),P1(5),IREF) + ICST11 = ICSTDX(2*(JW-1)+IMRG,2) + CALL EDT_PRTN + & (IMST,P1(1),P1(2),P1(3),P1(4),P1(5),ICST11) + ICST21 = ICSTDX(2*(JW-1)+IMRGBAR,2) + CALL EDT_PRTN + & (ICST2,P2(1),P2(2),P2(3),P2(4),P2(5),ICST21) + + ELSEIF(IMRG.eq.3)THEN + IF(ndebug.gt.2) + & WRITE(LUN,*)' EXCT_RMNT: merge both strings..' + +c both strings merged +c index of merged string and its last parton + IMST1 = ICSTDX(2*(JW-1)+1,1) + IMST11 = ICSTDX(2*(JW-1)+1,3) +c index of ordinary string + IMST2 = ICSTDX(2*(JW-1)+2,1) + IMST21 = ICSTDX(2*(JW-1)+2,3) +c read 4momenta + CALL RD_REF(IMST11,ISTH1) + CALL RD_PRTN_4VEC(ISTH1,P1,L01,IREF) +c string two + CALL RD_REF(IMST21,ISTH2) + CALL RD_PRTN_4VEC(ISTH2,P2,L02,IREF) + XM1 = AM(IABS(L01)) + XM2 = AM(IABS(L02)) +c cm energy + CALL ADD_4VECS(P1,P2,PTT) + ECM = PTT(5) + ETOT = PTT(4) + IF(ndebug.gt.2)THEN + write(lun,*)' EXCT_RMNT: string A :',(P1(i),i=1,5) + write(lun,*)' EXCT_RMNT: string B :',(P2(i),i=1,5) + write(lun,*)' EXCT_RMNT: total :',(PTT(i),i=1,5) + ENDIF + + CALL TRANSFONSHELL(ecm,xm1,xm2,1.D0,3,P1n,P2n,LBD) + IF(LBD.eq.1) THEN + IF(NDEBUG.gt.2) + & WRITE(LUN,*)' EXCT_RMNT: mass transfer failed!' + RETURN + ENDIF +c by definition p1n is along +z in string cm, need to invert if pzA < pzB +c IF(P2(3).gt.P1(3)) CALL SWTCH_LMNTS(P1N(3),P2N(3)) +c rotate parton-parton axis onto string-string axis +c boost to parton-parton cm to calc. rotation angles BEFORE interaction! + DO K = 1,4 + GABE(K) = PTT(K)/PTT(5) + ENDDO + CALL SIB_ALTRA(GABE(4),-GABE(1),-GABE(2),-GABE(3), + & P1(1),P1(2),P1(3),P1(4), + & P1TOT,PBM1(1),PBM1(2),PBM1(3),PBM1(4)) +c rotation factors + COD= PBM1(3)/P1TOT + SID= DSQRT(PBM1(1)**2+PBM1(2)**2)/P1TOT + COF=1.D0 + SIF=0.D0 + IF(P1TOT*SID.GT.EPS5) THEN + COF=PBM1(1)/(SID*P1TOT) + SIF=PBM1(2)/(SID*P1TOT) + ANORF=DSQRT(COF*COF+SIF*SIF) + COF=COF/ANORF + SIF=SIF/ANORF + ENDIF +c rotate parton momenta after interaction + CALL SIB_TRANI(P1N(1),P1N(2),P1N(3),COD,SID,COF,SIF + & ,PX,PY,PZ) + P1N(1)=PX + P1N(2)=PY + P1N(3)=PZ + CALL SIB_TRANI(P2N(1),P2N(2),P2N(3),COD,SID,COF,SIF + & ,PX,PY,PZ) + P2N(1)=PX + P2N(2)=PY + P2N(3)=PZ + +c boost massive hadrons back to hadron-hadron + CALL SIB_ALTRA(GABE(4), GABE(1), GABE(2), GABE(3), + & P1N(1),P1N(2),P1N(3),P1N(4), + & P1TOT,P1(1),P1(2),P1(3),P1(4)) + P1(5)=P1N(5) + CALL SIB_ALTRA(GABE(4), GABE(1), GABE(2), GABE(3), + & P2N(1),P2N(2),P2N(3),P2N(4), + & P2TOT,P2(1),P2(2),P2(3),P2(4)) + P2(5)=P2N(5) + IF(ndebug.gt.2)THEN + write(lun,*)' EXCT_RMNT: hadron A :',(P1(i),i=1,5) + write(lun,*)' EXCT_RMNT: hadron B :',(P2(i),i=1,5) + ENDIF + +c edit partons on stack + CALL EDT_PRTN + & (ISTH1,P1(1),P1(2),P1(3),P1(4),P1(5),IREF) + ICST11 = ICSTDX(2*(JW-1)+1,2) + CALL EDT_PRTN + & (IMST1,P1(1),P1(2),P1(3),P1(4),P1(5),ICST11) + + CALL EDT_PRTN + & (ISTH2,P2(1),P2(2),P2(3),P2(4),P2(5),IREF) + ICST21 = ICSTDX(2*(JW-1)+2,2) + CALL EDT_PRTN + & (IMST2,P2(1),P2(2),P2(3),P2(4),P2(5),ICST21) + + ENDIF + + IREJ = 0 + + RETURN + END +C======================================================================= + + SUBROUTINE FIREBALL_4FLV(L0,P0,PCHEXin,IREJ) + +C----------------------------------------------------------------------- +C... "decay" of an excited state with the quantum numbers +C. of particle L0 and the 5-momentum P0 +C. 4 flavor generalization /FR'13 +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + + CHARACTER*6 NAMP + COMMON /S_CNAM/ NAMP (0:99) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT + + DIMENSION P0(5), LL(10), PD(10,5), IFL(3), INONLEAD(2) + DIMENSION LRESCHEX(6:99), LRES(6:99), LCON(6:99), LPIC(-1:1) + DIMENSION LSTR(6:99), LPICS(-2:2) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE +c charge exchange map + DATA (LCON(I),I=6, 33) /7,6,6,21,22,9,9,14,13,4*0,20,19,9,10,23, + & 24,27,27,25,30,31,28,29,32,33/ + DATA (LCON(I),I=34, 49) + & /35,34,35,38,37,39,41,42,41,42,45,44,45,48,47,49/ + DATA (LCON(I),I=50, 83) /0,52,51,54,53,4*0,71,72,10*0, + & 59,60,73,74,75,76,77,80,81,78,79,0,83/ + DATA (LCON(I),I=84, 99) /84,85,86,87,88,89,4*0,94,95,96,97,98,99/ +c pion charge conversion map + DATA LPIC /8,6,7/ +c kaon charge conversion map + DATA LPICS /9,21,0,22,10/ +c charge exchange to resonances map + DATA (LRESCHEX(I),I=6, 33) /26,27,27,30,31,9,9,42,41,19*0/ + DATA (LRESCHEX(I),I=34, 39) /45,44,45,48,47,39/ + DATA (LRESCHEX(I),I=40, 49) /41,42,43,42,45,46,45,48,47,49/ + DATA (LRESCHEX(I),I=50, 83) + & /0,52,51,54,53,4*0,60,59,10*0,71,72,73,75,74, + & 77,76,79,78,80,81,0,83/ + DATA (LRESCHEX(I),I=84, 99) + & /84,85,86,87,88,89,4*0,94,95,96,97,98,99/ +c resonance excitation map + DATA (LRES(I),I=6, 39) + & /27,25,26,28,29,9,9,41,42,19*0,44,45,46,47,48,39/ + DATA (LRES(I),I=40, 49) /40,41,42,43,44,45,46,47,48,49/ + DATA (LRES(I),I=50, 83) + & /0,51,52,53,54,4*0,78,79,10*0,71,72,73,76,77,76, + & 77,78,79,80,81,0,83/ + DATA (LRES(I),I=84, 99) /94,95,96,97,98,89,4*0,94,95,96,97,98,99/ +c strangeness excitation map + DATA LSTR(6:27) /6,7,8,9,10,11,12,34,39,6*0,21,22,23,24,25,26,27/ + DATA LSTR(28:39) /28,29,30,31,32,33,44,45,46,47,48,39/ + DATA LSTR(40:49) /40,41,42,43,44,45,46,47,48,49/ + DATA LSTR(50:83) /0,51,52,53,54,4*0,78,79,10*0,71,72,73,76,77,76, + & 77,78,79,80,81,0,83/ + DATA LSTR(84:99) /94,95,96,97,98,89,4*0,94,95,96,97,98,99/ + +c... charge exchange reaction rate +c DATA PCHEX /0.33/ + +c default parameter: PAR(61) + PCHEX = PCHEXin + +c split charge exchange between 2 and 3+ fireballs + IF(IPAR(91).eq.1.and.NPI.gt.2)THEN + PCHEX = 1.D0-PCHEX + ENDIF + +c hyperon production rate + PLAM = PAR(157) + +c... suppression of high mass particles in fireball +c xmpsuppr = prob. accepting additional proton + XMPSUPPR=PAR(33) + IF(ABS(XMPSUPPR).lt.EPS3) THEN + WRITE(LUN,*) + & ' Error: too low mass suppression in 4 flv fireball!' + WRITE(LUN,*) + & ' Probably PAR(33)/IPAR(14) not properly set, aborting..' + STOP + ENDIF + XTEMPH=(AM(6)-AM(13))/dLOG(XMPSUPPR) + + IF(Ndebug.gt.3) THEN + WRITE(LUN,*)' FIRBALL_4FLV: called with (L0,P0):', + & L0,P0 + WRITE(LUN,*)' 2nd Proton rejection prob.:',XMPSUPPR + WRITE(LUN,*)' fireball temperature:',XTEMPH + WRITE(LUN,*)' charge exchange prob.:',PCHEX + WRITE(LUN,*)' multiplicity width:',PAR(38) + ENDIF + +c... special vector resonance treatment for meson projectiles +c i.e. spin exchange probability + PAR5def = PAR(5) + IF(IPAR(14).eq.-2.and.abs(kb).lt.13)THEN + PAR(5)=PAR(34) + ENDIF + + NTRY=0 + 100 NTRY=NTRY+1 + IF(NTRY.GT.20)THEN + WRITE(LUN,*)' FIRBALL_4FLV: unable to sample 4flv fireball!' + WRITE(LUN,*)' lacking rejection mechanism, abort..' + CALL SIB_REJECT ('FIRBALL_4FLV ') +c RETURN + ENDIF + + LA = ABS(L0) + ISGN = ISIGN(1,L0) + DELTAE = P0(5) - AM(LA) + IF(DELTAE.lt.AM(6)+0.02D0)THEN + IREJ = 1 + IF(ndebug.gt.3) + & WRITE(LUN,*)' FIRBALL_4FLV: too low mass!! aborting...',IREJ +c xa=-1. +c xa=log(xa) +c stop + RETURN + ENDIF + AV = 2.D0*SQRT(DELTAE) + +c... select number of particles in fireball +c at least two + 200 XRNDM = GASDEV(LA) + NPI = INT(AV*(1.D0+PAR(38)*XRNDM)) + XMMIN = AM(LA)+DBLE(NPI-1)*AM(6)+0.02D0 + IF(Ndebug.gt.3) + & WRITE(LUN,*)' NPI,av,rndm,xmin,delta', + & NPI,av,XRNDM,xmmin,P0(5)-XMMIN + + IF((NPI.LE.1).OR.(NPI.GT.9).OR.(P0(5).LT.XMMIN))THEN + GOTO 200 + ENDIF + IF(Ndebug.gt.3) + & WRITE(LUN,*)' FIRBALL_4FLV: No. of particles sampled. ', + & '(NPI,DELTAE,NTRY):',NPI,DELTAE,NTRY + +c... sample particle list + NTRYL=0 + 210 CONTINUE +c... special vector resonance treatment with meson projectile + IF(IPAR(14).eq.-3.and.LA.lt.13)THEN +c form resonance from meson beam +cdh IF(NTRY.GT.5) GOTO 211 + IF(NTRY.GT.5) THEN +c split last hadron again to start hadron chain + CALL HSPLI (LL(I+1),IFL(1),IFL(2)) + + IF(Ndebug.gt.3) + & WRITE(LUN,*)' FIRBALL_4FLV: Input hadron split. ', + & '(L0,IFL1,IFL2):',LL(I+1),IFL(1),IFL(2) + WREM = P0(5) + WREM2 = AM2(ABS(LL(1))) + INONLEAD(1)=0 + INONLEAD(2)=0 + ELSE + I=1 + IF(PCHEX.gt.S_RNDM(LA))THEN + LL(I)=LRESCHEX(LA) + CALL HSPLI(LCON(LA),IFL1,IFL2) + IFL(1)=IFL1 + IFL(2)=IFL2 + ELSE + LL(I)=LRES(LA) + CALL HSPLI(L0,IFL1,IFL2) + IFL(1)=-IFL1 + IFL(2)=-IFL2 + ENDIF + WREM = P0(5)-AM(ABS(LL(1))) + WREM2 = AM2(ABS(LL(1))) + INONLEAD(1)=1 + INONLEAD(2)=1 + ENDIF + + ELSE +c... baryon projectile +c first two particles defined by charge exchange + I=1 + LA1=LA +c add strangeness + XLIMLAM=sqrt(AM2(35)+AM2(9)+0.4) + IF(S_RNDM(LA1).lt.PLAM*(1-IABS(ISTR(LA))).and. + & DELTAE.gt.XLIMLAM)THEN + LA1 = LSTR(LA) +c print *,'xlim<deltae?: ',xlimlam,deltae + IF(Ndebug.gt.3) + &write(lun,*)' FIRBALL_4FLV: producing hyperon:',namp(LA),namp(LA1) + endif + IF(PCHEX.gt.S_RNDM(LA1))THEN + L1=LCON(LA1) + if(la.eq.42) l1 = l1 + 2 * int(2.D0*S_RNDM(L1)) + LL(I)=L1*ISGN +c WRITE(LUN,*)' charge exchange!',ISGN*LA,'->',L1 + ELSE + L1=LA1 + LL(I)=LA1*ISGN + ENDIF +c determine remaining charge and strangeness + IDQ=ICHP(LA1)*ISGN-ICHP(L1)*ISIGN(1,LL(I)) + IDS=ISTR(LA)*ISGN-ISTR(L1)*ISIGN(1,LL(I)) + IF(ABS(IDQ).gt.1) write(lun,*) 'LA,LA1,L1',LA,LA1,L1 + IF(IABS(IDS).gt.1) + & write(lun,*) 'too much strangeness,LA,LA1,L1:' + & ,namp(LA),namp(LA1),namp(L1) + IF(IDS.ne.0)THEN + IDX = IDS-IDQ + LL(I+1)=LPICS(IDX) ! compensate with strange meson if + ELSE + LL(I+1)=LPIC(IDQ) ! compensate with meson + ENDIF + IF(NPI.eq.2) GOTO 300 +c split last hadron again to start hadron chain +cdh 211 CALL HSPLI (LL(I+1),IFL(1),IFL(2)) + CALL HSPLI (LL(I+1),IFL(1),IFL(2)) + + IF(Ndebug.gt.3) + & WRITE(LUN,*)' FIRBALL_4FLV: Input hadron split. ', + & '(L0,IFL1,IFL2):',LL(I+1),IFL(1),IFL(2) + WREM = P0(5) + WREM2 = AM2(ABS(LL(1))) + INONLEAD(1)=0 + INONLEAD(2)=0 + ENDIF + + IF(NTRYL.gt.20) GOTO 100 + NTRYL=NTRYL+1 + + 230 I=I+1 + JT=INT(1.5D0+S_RNDM(I)) + JR=3-JT + NTRYS=0 + IFLB=IFL(JT) + IDM = 5 + 240 CALL SIB_I4FLAV (IFL(JT), 0, IDM, IFL(3), LL(I)) + IF(NTRYS.gt.50) GOTO 210 + NTRYS=NTRYS+1 + W=dEXP(-AM(ABS(LL(I)))/XTEMPH) + IF(Ndebug.gt.4) + & WRITE(LUN,*)' FIRBALL_4FLV: flavor added: ', + & '(I,NTRYS,LL(I),IFL3,W):',I,NTRYS,LL(I),IFL(3),W + IF(W.LT.S_RNDM(I).and.INONLEAD(JT).eq.1) GOTO 240 + +c... kinematic limits... + WREM = WREM-AM(IABS(LL(I))) + WREM2_2=WREM2+2.D0*dSQRT(WREM2)*AM(IABS(LL(I)))+AM2(IABS(LL(I))) + IF(Ndebug.gt.4) + & WRITE(LUN,*)' FIRBALL_4FLV: kinematic limits: ', + & '(I,NTRYS,P05**2,WREM2):',I,NTRYS,P0(5)**2,WREM2_2 + IF(WREM2_2+0.2D0*S_RNDM(I+1).ge.P0(5)**2) GOTO 240 + WREM2=WREM2_2 + IF(Ndebug.gt.3) + & WRITE(LUN,*) + & ' FIRBALL_4FLV: Hadron added: (KF,NAMP,I,NONlead,WRME2)', + & LL(I),NAMP(ABS(LL(I))),I,INONLEAD(JT),WREM2 + + IFL(JT)=-IFL(3) + INONLEAD(JT)=1 + IF(I.lt.NPI-1) GOTO 230 + IF(ABS(IFL(JT)).gt.3.and.ABS(IFL(JR)).gt.3) THEN + IFL(JT)=IFLB + GOTO 240 + ENDIF + +c... close list + I=I+1 + NTRYC=0 +c$$$ IAFL1 = IABS(mod(IFL(JR),100)) +c$$$ IAFL2 = IABS(mod(IFL(jt),100)) +c$$$ IF ((IAFL1/10.eq.4.or.mod(IAFL1,10).eq.4) +c$$$ + .and.(IAFL2/10.eq.4.or.mod(IAFL2,10).eq.4)) +c$$$ + GOTO 100 ! reject two charm quarks +c$$$ IF(IAFL1*IAFL2.GT.100) GOTO 100 + 250 CALL SIB_I4FLAV (IFL(JT), IFL(JR), IDM, IFL(3), LL(I)) + IF(NTRYC.gt.10) GOTO 210 + NTRYC=NTRYC+1 + WREM2_2=WREM2+2.D0*dSQRT(WREM2)*AM(ABS(LL(I)))+AM2(ABS(LL(I))) + IF(Ndebug.gt.5) + & WRITE(LUN,*)' FIRBALL_4FLV: closing List: (IFL1,IFL2,KF,', + & 'NAMP,I,NTRYC,WREM2)', + & IFL(JT),IFL(JR),LL(I),NAMP(ABS(LL(I))),I,NTRYC,WREM2_2 + + IF(WREM2_2+0.2D0*S_RNDM(I).ge.P0(5)**2) GOTO 250 + + 300 IF(Ndebug.gt.3) + & WRITE(LUN,*) + & ' FIRBALL_4FLV: flavors sampled. (NPI,LL,WREM,NTRYL):', + & NPI,(LL(ii),ii=1,NPI),WREM,NTRYL + +c... fill phasespace + CALL DECPAR (0,P0,NPI,LL,PD) + DO J=1,NPI + NP = NP+1 + LLIST(NP) = LL(J) + NPORIG(NP) = IPFLAG*2 + niorig(NP)= iiflag + DO K=1,5 + P(NP,K) = PD(J,K) + ENDDO + ENDDO + PAR(5)=PAR5def + IREJ = 0 + RETURN + END +C======================================================================= + + SUBROUTINE SIG_RPP2014(L,KT,SQS,SLOPE,SIGT,SIGEL,SIGINEL,RHO) + +C----------------------------------------------------------------------- +C implementation of the PDG RPP 2014 cross section fit +C proton-, pion-, kaon-nucleon interactions +C +c projectile dependent parameters are stored in amp array +c dimensions are: (beam,target,exchange mode) +c cross section is used for interaction length in AIR +c therefore proton and neutron cross sections are averaged. +c +C Input: +c L : beam id (1: proton, 2: pion, 3: kaon) +c KT: target id (0: Nucleon, 1: proton, 2: neutron) +c SQS: c.m. energy in GeV +c SLOPE: fit does not include elastic slope, need input to calc +c elastic and inelastic cross section +c Output: +c SIGT,SIGEL,SIGINEL,RHO +c cross sections and ratio of real and imaginary part of ela. amp. +C----------------------------------------------------------------------- + IMPLICIT NONE +c external types + DOUBLE PRECISION SQS,SIGT,SIGEL,SIGINEL,SLOPE,RHO!,SIGDIF + integer l,kt +c commons + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN +c internal types + DOUBLE PRECISION S,S0,SIG,RHO1,XI + INTEGER k,i,INIT +C universal constants and parameters + DOUBLE PRECISION M0,ETA1,ETA2,H + DOUBLE PRECISION AMP(3,2,3) + DOUBLE PRECISION XMA(3),XMB(2) + SAVE + DATA M0,ETA1,ETA2,H /2.076D0,0.412D0,0.5626D0,0.2838D0/ +c hadron-proton + DATA (AMP(1,1,i),i=1,3) /33.73D0, 13.67D0, 7.77D0 / + DATA (AMP(2,1,i),i=1,3) /18.08D0, 10.44D0, 1.977D0 / + DATA (AMP(3,1,i),i=1,3) /15.84D0, 5.12D0, 3.538D0 / +c hadron-neutron + DATA (AMP(1,2,i),i=1,3) /33.77D0, 14.05D0, 6.93D0 / + DATA (AMP(2,2,i),i=1,3) /18.08D0, 10.44D0, 1.977D0 / + DATA (AMP(3,2,i),i=1,3) /15.73D0, 4.81D0, 1.86D0 / + DATA INIT/0/ +c particle masses +c DATA XMA /0.93827D0,0.13957D0,0.493667D0/ +c DATA XMB /0.93827D0,0.939565D0/ + + IF(INIT.EQ.0) THEN +c use the masses from the mass table + XMA(1) = AM(13) ! proton + XMA(2) = AM(7) ! pi+ + XMA(3) = AM(9) ! K+ + XMB(1) = AM(13) ! proton + XMB(2) = AM(14) ! neutron + INIT = 1 + ENDIF + + s = SQS**2 + sigt = 0.D0 + rho = 0.D0 + k = kt + 100 if(kt.eq.0.and.k.lt.2) k = k + 1 + s0=XMA(l)+XMB(k)+M0 + s0=s0**2 + xi=s/s0 +c print *,'s,s0,xi',s,s0,xi +c print *,'eta1,eta2,h,M0',eta1,eta2,h,M0 +c print *,'P,R1,R2',amp(l,k,1),amp(l,k,2),amp(l,k,3) +c print *,H*log(xi)**2,amp(l,k,1),amp(l,k,2)*(1.D0/xi)**eta1, +c & amp(l,k,3)*(1.D0/xi)**eta2 + sig = H*log(xi)**2+amp(l,k,1)+amp(l,k,2)*(1.D0/xi)**eta1 + & +amp(l,k,3)*(1.D0/xi)**eta2 +c print *,'sig',sig +c print *,'pi,0.5D0,0.D0',pi,0.5D0,0.D0 +c print *,pi*h*log(xi),amp(l,k,2)*xi**(-eta1),tan(eta1*pi*0.5D0), +c & amp(l,k,3)*xi**(-eta2),(tan(pi*eta2*0.5D0)+EPS5) + rho1 = PI*h*log(xi)-amp(l,k,2)*xi**(-eta1)*tan(eta1*PI*0.5D0) + & +amp(l,k,3)*xi**(-eta2)/(tan(PI*eta2*0.5D0)+EPS5) +c print *,'rho:',rho1 + rho = rho + rho1/sig + sigt = sigt + sig +c write(LUN,*) ' l,k,sig,rho:',l,k,sig,rho + if(kt.eq.0.and.k.lt.2) goto 100 + if(kt.eq.0) then + sigt = sigt*0.5D0 + rho = rho*0.5D0 + endif +c derive elastic and inelastic cross section + sigel = sigt**2*(1.D0+rho**2)/(16.D0*PI*slope*cmbarn) + siginel = sigt-sigel + IF(ndebug.gt.2) + & write(LUN,*) + & ' SIG_RPP2014: L,KT,SQS,SIGT,SIGEL,SIGINEL,SLOPE,RHO', + & L,KT,SQS,SIGT,SIGEL,SIGINEL,SLOPE,RHO + end +C======================================================================= + + DOUBLE PRECISION FUNCTION FERMI(XARG,X0,XALPH) + +C----------------------------------------------------------------------- +C fermi function, used to smoothen samplings +C f = 1/(1+exp((x-x0)/alpha)) +C----------------------------------------------------------------------- + IMPLICIT NONE +c externals + DOUBLE PRECISION XARG,X0,XALPH,XE +c COMMONs + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + +c internals + xe = max((xarg-x0)/xalph,-10.D0) + fermi=1.D0+exp(xe) + fermi=1.D0/fermi + END +C======================================================================= + + SUBROUTINE SEL_RES(XM2in,KDin,IRDX,IKDH) + +C-------------------------------------------------------------------- +C routine that checks if excitation should go into resonant state +C or rather should fallback to on-shell beam hadron +C Input: XM2in : squared excitation mass +C KDin : projectile hadron code +C IRDX : reference to remnant on stack +C Output: adds hadron to stack +C IKDH : parton stack index of final hadron +C-------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + + DOUBLE PRECISION AW,AW2 + COMMON /S_WIDTH1/ AW(99), AW2(99) + INTEGER MRES(6:99,2) + DOUBLE PRECISION XM2,XM1,DELTAE,EMIN1,EMIN2 + INTEGER KD + SAVE + + DATA (MRES(k,1),k=6,22) /27,25,26,28,29,0,0,51,52,6*0,30,31/ + DATA (MRES(k,1),k=23,33) /23,24,25,26,27,28,29,30,31,27,27/ + DATA (MRES(k,1),k=34,49) /34,35,36,37,38,39,40,41,42,43,34,35,36, + & 37,38,49/ + DATA (MRES(k,1),k=50,83) /0,51,52,53,54,4*0,78,79,10*0,80,81,73, + & 74,75,76,77,78,79,80,81,0,83/ + DATA (MRES(k,1),k=84,99) /94,95,96,97,98,89,4*0,94,95,96,97,98,99/ + + DATA (MRES(k,2),k=6,22) /61,62,63,64,65,0,0,53,54,6*0,66,67/ + DATA (MRES(k,2),k=23,33) /61,61,62,63,61,64,65,66,67,61,61/ + DATA (MRES(k,2),k=34,49) /34,35,36,37,38,39,40,41,42,43,44,45,46, + & 47,48,49/ + DATA (MRES(k,2),k=50,83) /0,51,52,53,54,4*0,78,79,10*0,80,81,73,74 + & ,75,76,77,78,79,80,81,0,83/ + DATA (MRES(k,2),k=84,99) /94,95,96,97,98,89,4*0,94,95,96,97,98,99/ + + XM2 = XM2in + XM1 = sqrt(XM2) + KD = KDin + +C thresholds +c fallback threshold + EMIN1 = PAR(76) + +c resonance threshold + EMIN2 = PAR(77) + +c parton stack index of incoming hadron + IKDH = 0 + +c if too low, fallback on beam + IF(ndebug.gt.2) + & write(lun,*)' SEL_RES: input (XM2in,KDin,IRDX):',XM2,KD,IRDX + DELTAE = XM1-AM(ABS(KD)) + IF(ndebug.gt.1)then + write(lun,*)' SEL_RES: DELTAE,EMIN1,EMIN2',deltae,emin1,emin2 + write(lun,*)' SEL_RES: XM,XM1,XM2', + & XM1,emin1+AM(ABS(KD)),emin2+AM(ABS(KD)) + endif + IF(DELTAE.LT.EMIN1)THEN +c fallback to beam region + KDH = kd + XM1 = AM(abs(kd)) + XM2 = AM2(abs(kd)) + + ELSEIF(DELTAE.LT.EMIN2)THEN +c form resonance + II = 1 + KDH = KD + DO WHILE (II.le.2.and.KDH.eq.KD) + KDD = IABS(KD) + +c K0s and K0l projection on K0 and K0bar +cdh IF(KDD.eq.11.or.KDD.eq.12)KDD=21 +cdh & +INT((2.D0-EPS10)*S_RNDM(KD)) + IF(KDD.eq.11.or.KDD.eq.12)KDD=21 + & +INT(0.5D0+S_RNDM(KD)) + IL = MRES(KDD,II) + IF(ndebug.gt.2) then + write(lun,*) ' SEL_RES: res. select (KD,II,IL):', + & KD,II,IL + ENDif +cdh to prevent index of array AW2 out of range + IF(IL.eq.0) write(lun,*) ' SEL_RES: KD,KDD:' , KD,KDD + IF(IL.eq.0) CALL SIB_REJECT('SEL_RES ') +c sample probability for resonance to occur at this mass +c from the relativistic breit-wigner dist. +c scale widths to artificially increase or decrease resonance occurence + XWDTH = PAR(94)*AW2(IL) + PRES = BREIT_WIGNER(XM2,AM2(IL),XWDTH) + IF(ndebug.gt.2) + & write(lun,*) + & ' SEL_RES: res. proposal (AM2,AW2,Prob.):', + & AM2(IL),XWDTH,PRES + IF(S_RNDM(ii).lt.PRES) KDH = ISIGN(IL,KD) + II = II + 1 + ENDDO +c no resonance selected, fallback to beam or phasespace decay? + IF(IPAR(59).eq.1.and.KDH.eq.KD)THEN +c distinguish regions in deltaE + IF(DELTAE.LT.EMIN1)THEN +c fallback to beam + XM1 = AM(abs(kdh)) + XM2 = AM2(abs(kdh)) + ELSE + KDH = 0 + ENDIF + ELSE +c case where resonance has been selected +c or no overlap between resonance and phasespace region exists +c set mass to pole masses of selected particles + XM1 = AM(abs(kdh)) + XM2 = AM2(abs(kdh)) + ENDIF + ELSE +c neither resonance nor fallback + KDH = 0 + ENDIF + IF(KDH.ne.0)THEN +c add new beam hadron to stack + XM2in = XM2 + CALL ADD_PRTN + & (0.D0,0.D0,0.D0,0.D0,XM1,KDH,2,IRDX,IKDH) + endif + IF(ndebug.gt.2) + & write(lun,*)' SEL_RES: output (XM2in,KDin,KDH):',XM2,KD,KDH + + RETURN + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION BREIT_WIGNER(S,XM2,XWDTH2) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + SAVE + +C peak set to one + x1 = (s-xm2)**2+xm2*xwdth2 + breit_wigner = xm2*xwdth2/x1 + end +C======================================================================= + + DOUBLE PRECISION FUNCTION TBREIT_WIGNER(S,XM2,XWDTH2) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + SAVE +C breit-wigner truncated at 2*gamma from peak +C peak set to one + DATA N /10/ + + XMLOW = MAX(XM2-N*XWDTH2,0.D0) + XCUT = SIGN(1.D0,S-XMLOW) + XCUT = MAX(XCUT,0.D0) + x1 = (S-xm2)**2+xm2*xwdth2 + TBREIT_WIGNER = xcut * xm2*xwdth2/x1 + + end +C======================================================================= + + SUBROUTINE FRAG_MINIJET(IDX,IBAD) + +C----------------------------------------------------------------------- +C routine that fragments a gluon - gluon system \FR'14 +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER IDX,IBAD + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) +C parameters that represent: NW: max. number of wounded nucleons, +C NS,NH: max. number of soft and hard interactions +c PARAMETER (NW_max = 20) +C The COMMON block /S_CHIST/ contains information about the +C the structure of the generated event: +C NWD = number of wounded nucleons +C NJET = total number of hard interactions +C NSOF = total number of soft interactions +C NNSOF (1:NW) = number of soft pomeron cuts in each interaction +C NNJET (1:NW) = number of minijets produced in each interaction +C JDIF(1:NW) = diffraction code +C 0 : non-diff, +C 1 : beam-diff +C 2 : target-diff +C 3 : double-diff + INTEGER NNSOF,NNJET,JDIF,NWD,NJET,NSOF + COMMON /S_CHIST/ NNSOF(NW_max),NNJET(NW_max), + & JDIF(NW_max),NWD,NJET,NSOF + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + DOUBLE PRECISION PGG,PST,PBM,PTG,E0,PT2JET,PTJET,TH,FI,S_RNDM, + & PAR1_def,PAR24_def,PAR3_def,PAR2_1_def,PAR2_2_def,PAR5_def, + & PAR6_def,PAR24_2_def,XM,QMASS,DBETJ + DIMENSION PST(5),PBM(5),PTG(5) + INTEGER IST,ITGST,IBMST,IPID,IFLB,IFLT,NOLD,IS,IFL1,IFBAD,IDM, + & ipar82_def + SAVE + DATA PGG /1.D0/ + +C read partons from stack +c references are string --> bm-parton --> tg-parton +c read string 4momentum from stack + CALL RD_PRTN_4VEC(IDX,PST,IPID,IBMST) + CALL RD_PRTN_4VEC(IBMST,PBM,IFLB,ITGST) + CALL RD_PRTN_4VEC(ITGST,PTG,IFLT,IST) + IF(IDX.ne.IST) then + write(lun,*) ' FRAG_MINIJET: reference loop broken!' , IDX + CALL SIB_REJECT('FRAG_MINIJET ') + endif + +C.. kinematic variables + E0 = PST(5) ! string mass + PT2JET = PBM(1)**2 + PBM(2)**2 + PTJET = sqrt(PT2JET) + TH = ASIN(MIN((1.D0-EPS8),2.D0*PTJET/E0)) +c FI = ASIN(MIN((1.D0-EPS8),PBM(2)/PTJET)) + FI = TWOPI*S_RNDM(IDX) +c TH = PST(1) +c FI = PST(2) + + IF(NDEBUG.gt.1) WRITE(LUN,*)' FRAG_MINIJET: IDX,EE,IFLB,IFLT,PT', + & IDX,E0,IFLB,IFLT,PTJET,IBAD + IF(NDEBUG.gt.1) WRITE(LUN,*)' FRAG_MINIJET: PTJET,TH,FI:', + & PTJET,TH,FI + +C... parameter setup (string fragmentation) + +c baryon production setup + PAR1_def = PAR(1) + if( NSOF+NJET.gt.0) then + PAR(1)= PAR(15) + else + PAR(1)= PAR(14) + endif + +C... charm setup + PAR24_def = PAR(24) + IF(IPAR(15).eq.2.or.IPAR(15).eq.3)THEN + PAR(24) = PAR(25)*EXP(-PAR(26)/E0) + ELSEIF(IPAR(15).eq.4)THEN + PAR(24) = PAR(27)*EXP(-PAR(26)/E0) + ELSEIF(IPAR(15).eq.5)THEN + PAR(24) = PAR(27)*EXP(-PAR(26)/E0) + PAR(29) = PAR(27)*EXP(-PAR(28)/E0) + ELSEIF(IPAR(15).eq.6.or.IPAR(15).eq.8.or.IPAR(15).eq.9.or. + & IPAR(15).eq.11)THEN + PAR(24) = PAR(27)*EXP(-PAR(28)/E0) + ELSEIF(IPAR(15).eq.7)THEN + PAR(24) = PAR(27) + ELSEIF(IPAR(15).eq.10)THEN + WRITE(LUN,*)' FRAG_minijet: charm model not implemented!' + CALL SIB_REJECT('FRAG_minijet ') + ENDIF + +C... strange setup + PAR2_1_def = PAR(2) + PAR3_def = PAR(3) + IF(IPAR(42).eq.1)THEN +c change to constant value + PAR(2) = PAR(72) + ELSEIF(IPAR(42).eq.2)THEN +c change according to string mass, saturating + PAR(2) = PAR(72)*EXP(-PAR(73)/E0) + ELSEIF(IPAR(42).eq.3)THEN +c change strange diq fraction as well + PAR(2) = PAR(72) ! P_s / P_ud + PAR(3) = PAR(73) ! P_us / P_ud + ENDIF + +C... vector setup + PAR5_def = PAR(5) + PAR6_def = PAR(6) + IF(IPAR(43).eq.1)THEN +c change vector rate and kaon vector rate + PAR(5) = PAR(74) ! P_vec + PAR(6) = PAR(74) ! P_K* from K + + ENDIF + +C... switch off pi0 suppression +c should only be applied for remnant, diff and valence +c in case of meson projectile + ipar82_def = IPAR(82) + IF(IPAR(95).eq.1)THEN + IPAR(82) = 0 + ENDIF + + NOLD = NP + IF ( (E0.LT.8.D0) .OR. (S_RNDM(0).GT.PGG)) THEN +C... one string case, q - qbar + +C sample flavor for q-qbar minijet + IF( IPAR(87).eq.3 )THEN +C flavor threshold model +c u,d -> u,d,s -> u,d,s,c +c s and transition from massive to massless at m_s and m_c thresholds +c beyond the charm mass all flavors are equally likely + CALL SIB_ICFLAV(E0**2,0,IDM,IFL1) + + ELSE +C default u,d,s model, same rates as in hadronization (string frag.) + PAR2_2_def = PAR(2) + PAR24_2_def = PAR(24) +C set 'leading' strange fraction + IF(IPAR(39).eq.2) PAR(2) = PAR(66) +c leading charm fraction + IF( IPAR(87).eq.1 )THEN + PAR(24) = PAR(150) + ELSEIF( IPAR(87).eq.2 )THEN + PAR(24) = PAR(150)*PAR(24) + ENDIF + + IS = -1 + 2*INT((2.D0-EPS8)*S_RNDM(0)) + 100 IFL1 = IS*(INT((2.D0+PAR(2))*S_RNDM(0))+1) + XM = 2.D0*QMASS(IFL1)+0.3D0 + if(E0.LE.XM) GOTO 100 + IF(IABS(IFL1).eq.3)THEN + IF(S_RNDM(IFL1).lt.PAR(24)*PAR(125))IFL1 = IS*4 + XM = 2.D0*QMASS(IFL1)+0.3D0 + if(E0.LE.XM) GOTO 100 + ENDIF + PAR(2) = PAR2_2_def + PAR(24) = PAR24_2_def + ENDIF + + CALL STRING_FRAG_4FLV + & (E0,IFL1,-IFL1,0.D0,0.D0,0.D0,0.D0,IFBAD,0) + if(IFBAD.gt.0) then + IF(ndebug.gt.1) + & WRITE(LUN,*) + & ' JET_FRAG: rejection in STRING_FRAG (IFL,E0,NCALL):', + & IFL1,E0,NCALL + PAR(24) = PAR24_def + PAR(1) = PAR1_def + PAR(2) = PAR2_1_def + PAR(5) = PAR5_def + PAR(6) = PAR6_def + PAR(3) = PAR3_def + IPAR(82) = ipar82_def + RETURN + ENDIF + ELSE +C... two string case, gluon - gluon + CALL GG_FRAG_4FLV(E0) + ENDIF + +c DBETJ = (DX1J-DX2J)/(DX1J+DX2J) + DBETJ = PST(3)/PST(4) + CALL SIROBO (NOLD+1,NP,TH,FI,0.D0,0.D0,DBETJ) + + if(Ndebug.gt.1) WRITE(LUN,*) + & ' JET_FRAG: particles produced:',NP-NOLD + PAR(24) = PAR24_def + PAR(1) = PAR1_def + PAR(2) = PAR2_1_def + PAR(5) = PAR5_def + PAR(6) = PAR6_def + PAR(3) = PAR3_def + IPAR(82) = ipar82_def + IBAD = 0 + END +C======================================================================= + + SUBROUTINE INT_H_NUC (IA, SIGT, SLOPE, RHO) + +C----------------------------------------------------------------------- +C...Compute with a montecarlo method the "multiple interaction structure" +C. of an hadron-nucleus collision. +C. +C. +C. INPUT : IA = mass of target nucleus +C. SIGT (mbarn) = total hp cross section +C. SLOPE (GeV**-2) = slope of hp elastic scattering +C. RHO = real/imaginary part of forward elastic +C. scattering amplitude +C. +C. OUTPUT : in COMMON block /CNCMS0/ +C. B = impact parameter (fm) +C. BMAX = maximum impact parameter for generation +C. NTRY = number of "trials" before one interaction +C. NA = number of wounded nucleons in A +C. Author : P.Lipari (may 1993) +C--------------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + PARAMETER (IAMAX=56) + COMMON /S_CNCM0/ B, BMAX, NTRY, NA + DIMENSION XA(IAMAX), YA(IAMAX) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + + + PI=4.d0*atan(1.d0) + + CC = SIGT/(4.D0*PI*SLOPE*CMBARN) + DEN = 2.D0*SLOPE*CMBARN*0.1D0 + BMAX = 1.D0*10.D0 ! fm + NTRY = 0 + CALL NUC_CONF (IA, XA, YA) +1000 CONTINUE + B = BMAX*dSQRT(S_RNDM(0)) + PHI = 2.D0*PI*S_RNDM(NTRY) + BX = B*DCOS(PHI) + BY = B*DSIN(PHI) + NTRY = NTRY + 1 + NA = 0 + DO JA=1,IA + S = (XA(JA)-BX)**2 + (YA(JA)-BY)**2 + F = dEXP(-S/DEN) + PEL = CC*CC*(1.D0+RHO*RHO)*F*F + PINEL = 2.D0*CC*F-PEL + R = S_RNDM(JA) + IF (R .LT. PINEL) THEN + NA = NA + 1 + ENDIF + ENDDO + IF (NA .EQ. 0 .and. NTRY .lt. 1000) GOTO 1000 + + RETURN + END +C======================================================================= + + SUBROUTINE SIB_REJECT(text) + +C----------------------------------------------------------------------- +c subroutine dumps state of random number generator +c at beginning of event to file then produces fpe/stops +C---------------------------------------------------------- + IMPLICIT NONE + + character*16 text + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER II2,JJ2 + DOUBLE PRECISION U2,C2,CD2,CM2 + COMMON /SIB_RAND/ U2(97),C2,CD2,CM2,II2,JJ2 + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + DOUBLE PRECISION XDM +c CHARACTER*13 FILENA + SAVE +c DATA FILENA /'sib_rjctn.rnd'/ + + WRITE(LUN,*) + & ' SIB_REJECT:(from,ncall,KB,iat,ECM) ', + & text,ncall,kb,iat,sqs +c produce floating point error + XDM = -1.D0 + XDM = LOG(XDM) + STOP + END +C======================================================================= + + SUBROUTINE CUT_PRO (L, SQS, PTmin, NSOFR, NJETR) + +C----------------------------------------------------------------------- +C... Generate a number of soft/hard (jet-)pairs for a 'projectile' +C (K=1:p),(K=2:pi) interacting with a nucleon at sqrt(s)=SQS(GeV) +C the interaction structure is only destinguished between nucleons +C (L=1) and mesons (L=2), for cross sections there is a +C distinction between pions and kaons as well (L=2 or 3). +C For Hyperons the same cross section and interaction structure +C as for nucleons is used (L=1). +C +C requires initialization by JET_INI /FR'14 +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +c COMMON /S_DEBUG/ Ncall, Ndebug, Lun + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + + DOUBLE PRECISION SSIG,PJETC,SSIGN,SSIGNSD,SSIGNEL,ALINT,ASQSMIN, + & ASQSMAX,DASQS + INTEGER NSQS + COMMON /S_CCSIG/ SSIG(61,3), PJETC(0:NS_max,0:NH_max,61,2), + & SSIGN(61,3,3), SSIGNSD(61,3,3), SSIGNEL(61,3,3), + & ALINT(61,3,3), ASQSMIN, ASQSMAX, DASQS, NSQS + DOUBLE PRECISION STR_mass_val, STR_mass_val_hyp, STR_mass_sea + COMMON /S_CUTOFF/ STR_mass_val, STR_mass_val_hyp, STR_mass_sea + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + +C check if tables initialized + IF(NSQS.eq.0) THEN + WRITE(LUN,*) ' CUT_PRO: tables not initialized! aborting...' + xa = -1.D0 + xa = log(xa) + stop + ENDIF + IF(NDEBUG.GT.1) + & WRITE(LUN,*) ' CUT_PRO: input: L, SQS, PTmin',L, SQS, PTmin + +c choose nucleon or meson table + K = L + if(K.eq.3) K = 2 + + AL = dLOG10 (SQS) + IF (AL .LT. ASQSMIN) THEN + WRITE(LUN,*) ' CUT_PRO: low sqrt(s) ', SQS + NSOFR = 1 + NJETR = 0 + RETURN + ENDIF + IF (AL .GT. ASQSMAX) THEN + WRITE(LUN,*) ' CUT_PRO: sqrt(s) out of bounds ', SQS + NJETR = 0 + RETURN + ENDIF + + J1 = INT((AL - ASQSMIN)/DASQS + 1) + J1 = MIN(J1,60) + J1 = MAX(J1,1) + J2 = J1+1 + T = (AL-ASQSMIN)/DASQS - DBLE(J1-1) + + R = (1.D0-EPS8)*S_RNDM(0) + DO I=0,NS_max + DO J=0,NH_max + IF (R.LT.(1.D0-T)*PJETC(I,J,J1,K)+T*PJETC(I,J,J2,K)) GOTO 100 + ENDDO + ENDDO +100 CONTINUE + +C...phase space limitation + + 120 CONTINUE + XM = DBLE(2*I)*STR_mass_sea + DBLE(2*J)*PTmin + PACC = EXP(PAR(9)*(2.D0-XM)/SQS) + IF(S_RNDM(0).GT.PACC) THEN + IF(I+J.GT.1) THEN + IF(I.GT.0) THEN + I = I-1 + GOTO 120 + ELSE IF(J.GT.0) THEN + J = J-1 + GOTO 120 + ENDIF + ENDIF + ENDIF + + NSOFR = I + NJETR = J + + if(Ndebug.gt.1) + & write(lun,*)' CUT_PRO: (L,SQS,PTmin,Ns,Nh) ',K,SQS,PTmin,I,J + + END + +C======================================================================= + + SUBROUTINE JET_INI + +C----------------------------------------------------------------------- +C...Compute table of cross sections, and table of probability +C. for the production of multiple soft and hard interactions +C. +C. The output of this routine is the COMMON block /S_CCSIG/ +C. that contains the cross sections h-p, h-Air, and the +C. cumulative probability of NS soft and NH hard interactions +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + + DOUBLE PRECISION SSIG,PJETC,SSIGN,SSIGNSD,SSIGNEL,ALINT,ASQSMIN, + & ASQSMAX,DASQS + INTEGER NSQS + COMMON /S_CCSIG/ SSIG(61,3), PJETC(0:NS_max,0:NH_max,61,2), + & SSIGN(61,3,3), SSIGNSD(61,3,3), SSIGNEL(61,3,3), + & ALINT(61,3,3), ASQSMIN, ASQSMAX, DASQS, NSQS + DOUBLE PRECISION SSIG_TOT,SSIG_SD1,SSIG_SD2,SSIG_DD,SSIG_B, + & SSIG_RHO + COMMON /S_CCSIG2/ SSIG_TOT(61,3),SSIG_SD1(61,3),SSIG_SD2(61,3), + & SSIG_DD(61,3),SSIG_B(61,3),SSIG_RHO(61,3) + DOUBLE PRECISION SSIG_SD1LM,SSIG_SD1HM,SSIG_SD2LM,SSIG_SD2HM, + & SSIG_DDLM,SSIG_DDHM + COMMON /S_CCSIG3/ SSIG_SD1LM(61,3),SSIG_SD1HM(61,3), + & SSIG_SD2LM(61,3),SSIG_SD2HM(61,3), + & SSIG_DDLM(61,3),SSIG_DDHM(61,3) + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + + DIMENSION Pjet(0:NS_max,0:NH_max) + DIMENSION SIG_df(3),SIG_df2(3,2),SIGDIF(3),SIGDIF_pi(3), + & PS_tab(61),PH_tab(61),PT_tab(61) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + +C...spacing in energy for table of cross sections. + + NSQS = 61 + ASQSMIN = 1.D0 + ASQSMAX = 7.D0 + DASQS = (ASQSMAX-ASQSMIN)/DBLE(NSQS-1) + +C...initialization of proton and pion tables + + IF(LUN.ne.6) WRITE(6,*)' Calculating cross section tables...' + DO KK=1,2 + + IF(NDEBUG.gt.0) + & WRITE(LUN,'(2(/,1X,A,A))') + & 'Table: J, sqs, PT_cut, SIG_tot, SIG_inel, B_el, ', + & 'rho, <n_s>, <n_h>, SIG_SD, SD1_lm, SD1_hm', + & '---------------------------------------------------', + & '----------------------------------------------' + + JINT = KK + DO J=1, NSQS + ASQS = ASQSMIN + DASQS*DBLE(J-1) + SQS = 10.D0**ASQS + + CALL SIB_SIG (JINT, SQS, PTmin, + & SIG_tot, SIG_inel, SIG_df, SIG_df2, B_el, Pjet) + +C...low-energy interpolation with data-parametrizations + CALL SIB_HADCSL(JINT,SQS, + & SIGTOT,SIGEL,SIGINEL,SIGDIF,SLOPE,RHO) + if(SQS.le.100.D0) then + SIG_TOT = SIGTOT + SIG_inel = SIGINEL + B_EL = SLOPE + else if(SQS.le.1000.D0) then + Xi = dlog(SQS/100.D0)/2.30258509299405D0 + SIG_TOT = Xi*SIG_TOT+(1.D0-Xi)*SIGTOT + SIG_inel = Xi*SIG_inel+(1.D0-Xi)*SIGINEL + B_EL = Xi*B_EL+(1.D0-Xi)*SLOPE + endif + + SSIG_TOT(J,KK) = SIG_TOT + SSIG(J,KK) = SIG_inel + SSIG_SD1(J,KK) = SIGDIF(1) + SSIG_SD2(J,KK) = SIGDIF(2) + SSIG_DD(J,KK) = SIG_df(3) + SSIG_B(J,KK) = B_EL + SSIG_RHO(J,KK) = RHO + + SSIG_SD1LM(J,KK) = SIG_df2(1,1) + SSIG_SD1HM(J,KK) = SIG_df2(1,2) + SSIG_SD2LM(J,KK) = SIG_df2(2,1) + SSIG_SD2HM(J,KK) = SIG_df2(2,2) + SSIG_DDLM(J,KK) = SIG_df2(3,1) + SSIG_DDHM(J,KK) = SIG_df2(3,2) + + PSUM = 0.D0 + PH = 0.D0 + PS = 0.D0 + DO NS=0,NS_max + DO NJ=0,NH_max + + PS = PS+DBLE(NS)*Pjet(NS,NJ) + PH = PH+DBLE(NJ)*Pjet(NS,NJ) + + PSUM = PSUM+Pjet(NS,NJ) + PJETC(NS,NJ,J,KK) = PSUM + + ENDDO + ENDDO + PS_tab(J) = PS + PH_tab(J) = PH + PT_tab(J) = PTmin + + IF(NDEBUG.gt.0) + & WRITE(LUN,'(3X,I2,1P,E12.3,0P,4F8.2,6F8.3)') + & JINT,SQS,PTmin,SIG_tot,SIG_inel,B_el,RHO,PS,PH + & ,SIGDIF(1)+SIGDIF(2),SIG_df2(1,1),SIG_df2(1,2) + + ENDDO + ENDDO + +C...initialization of kaon tables + + JINT = 3 + + IF(NDEBUG.gt.0) + & WRITE(LUN,'(2(/,1X,A,A))') + & 'Table: J, sqs, PT_cut, SIG_tot, SIG_inel, B_el, ', + & 'rho, <n_s>, <n_h>', + & '---------------------------------------------------', + & '---------------------' + DO J=1, NSQS + ASQS = ASQSMIN + DASQS*DBLE(J-1) + SQS = 10.D0**ASQS +C...use pion cross section rescaled for high-energy extrapolation + SIG_tot = SSIG_TOT(J,2) + SIG_inel = SSIG(J,2) + SIG_df(1) = SSIG_SD1(J,2) + SIG_df(2) = SSIG_SD2(J,2) + SIG_df(3) = SSIG_DD(J,2) + B_el = SSIG_B(J,2) + PTmin = PT_tab(J) + PS = PS_tab(J) + PH = PH_tab(J) + +C...low-energy interpolation with data-parametrizations + CALL SIB_HADCSL(2,SQS, + & SIGTOT_pi,SIGEL_pi,SIGINEL,SIGDIF_pi,SLOPE,RHO) + CALL SIB_HADCSL(3,SQS, + & SIGTOT,SIGEL,SIGINEL,SIGDIF,SLOPE,RHO) + SIG_el = (SIGEL/SIGEL_pi)*(SIG_TOT-SIG_inel) + SIG_TOT = (SIGTOT/SIGTOT_pi)*SIG_TOT + SIG_inel = SIG_TOT-SIG_el + SIG_df(3) = (SIGDIF(3)/SIGDIF_pi(3))*SIG_df(3) + if(SQS.le.100.D0) then + SIG_TOT = SIGTOT + SIG_inel = SIGINEL + B_EL = SLOPE + else if(SQS.le.1000.D0) then + Xi = dlog(SQS/100.D0)/2.30258509299405D0 + SIG_TOT = Xi*SIG_TOT+(1.D0-Xi)*SIGTOT + SIG_inel = Xi*SIG_inel+(1.D0-Xi)*SIGINEL + B_EL = Xi*B_EL+(1.D0-Xi)*SLOPE + endif + + SSIG_TOT(J,3) = SIG_TOT + SSIG(J,3) = SIG_inel + SSIG_SD1(J,3) = SIGDIF(1) + SSIG_SD2(J,3) = SIGDIF(2) + SSIG_DD(J,3) = SIG_df(3) + SSIG_B(J,3) = B_EL + SSIG_RHO(J,3) = RHO + + IF(NDEBUG.gt.0) + & WRITE(LUN,'(3X,I2,1P,E12.3,0P,4F8.2,3F8.3)') + & JINT,SQS,PTmin,SIG_tot,SIG_inel,B_el,RHO,PS,PH + + ENDDO + + END + +C======================================================================= + + SUBROUTINE INI_WRITE (LUN) + +C----------------------------------------------------------------------- +C This subroutine prints on unit LUN +C a table of the cross sections used in the program +C and of the average number of hard interactions, and the average +C number of wounded nucleons in a hadron-air interaction +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + + DOUBLE PRECISION SSIG,PJETC,SSIGN,SSIGNSD,SSIGNEL,ALINT,ASQSMIN, + & ASQSMAX,DASQS + INTEGER NSQS + COMMON /S_CCSIG/ SSIG(61,3), PJETC(0:NS_max,0:NH_max,61,2), + & SSIGN(61,3,3), SSIGNSD(61,3,3), SSIGNEL(61,3,3), + & ALINT(61,3,3), ASQSMIN, ASQSMAX, DASQS, NSQS + DIMENSION PJ(2),PS(2),PW(2) + + SAVE + DATA ATARGET /14.514D0/ + + if ( ndebug .gt. 3 ) CALL PARAM_PRINT(LUN) + if ( ndebug .gt. 0 ) THEN + WRITE (LUN, 10) + WRITE (LUN, 15) + WRITE (LUN, 16) + WRITE (LUN, 18) +10 FORMAT(//,' Table of cross sections, and average number', + & ' of minijets and wounded nucleons ') +15 FORMAT(' [sqrt(s) in GeV, cross sections in mbarn]. ') +16 FORMAT(' sqrt(s) sig(pp) sig(pA) <n_s> <n_j> <n_w>', + & ' sig(pip) sig(piA) <n_s> <n_j> <n_w>') +18 FORMAT(1X,77('-') ) + DO J=1,61,1 + SQS = 10.D0**(ASQSMIN + DASQS*DBLE(J-1)) + + DO K=1,2 + + PW(K) = ATARGET*SSIG(J,K)/SSIGN(J,K,1) + + PJ(K) = 0.D0 + PS(K) = 0.D0 + DO NS=0,NS_max + DO NJ=0,NH_max + IF(NJ.GT.0) THEN + PROB = PJETC(NS,NJ,J,K) - PJETC(NS,NJ-1,J,K) + ELSE IF(NS.GT.0) THEN + PROB = PJETC(NS,NJ,J,K) - PJETC(NS-1,NH_max,J,K) + ELSE + PROB = 0.D0 + ENDIF + PJ(K) = PJ(K)+DBLE(NJ)*PROB + PS(K) = PS(K)+DBLE(NS)*PROB + ENDDO + ENDDO + + ENDDO + + WRITE(LUN,20) SQS,SSIG(J,1),SSIGN(J,1,1),PS(1),PJ(1),PW(1) + & ,SSIG(J,2),SSIGN(J,2,1),PS(2),PJ(2),PW(2) + + ENDDO + + WRITE(LUN, 18) + endif +20 FORMAT(1p,E10.2,2(2F7.1,1X,3F6.2,1X)) + + return + END + +C======================================================================= + + SUBROUTINE SIG_AIR_INI + +C----------------------------------------------------------------------- +C... Initialize the cross section and interaction lengths on air, +C. nitrogen and oxygen +C. (this version initializes p-air, pi-air, and K-air cross sections) +C. +C. also calculates the low mass beam diffraction cross section in hAir \FR +C. using the same lambda for all hadrons +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + + DOUBLE PRECISION SSIG,PJETC,SSIGN,SSIGNSD,SSIGNEL,ALINT,ASQSMIN, + & ASQSMAX,DASQS + INTEGER NSQS + COMMON /S_CCSIG/ SSIG(61,3), PJETC(0:NS_max,0:NH_max,61,2), + & SSIGN(61,3,3), SSIGNSD(61,3,3), SSIGNEL(61,3,3), + & ALINT(61,3,3), ASQSMIN, ASQSMAX, DASQS, NSQS + COMMON /GLAUB_SCR/ XI_MAX , ALAM(61) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + DIMENSION SIGDIF(3) + DIMENSION ITARGC(3) + CHARACTER*3 TARGN + DIMENSION TARGN(3) + SAVE + DATA AVOG /6.0221367D-04/ + DATA ATARGET /14.514D0/ + DATA ITARGC /0,14,16/ + DATA TARGN /'air','nit','oxy'/ + + IF ( IPAR(12).GT.0 ) THEN + if (ndebug.gt.0) then + WRITE(LUN,*) ' SIG_AIR_INI:' + WRITE(LUN,*)' using Goulianos param. for res.coupling..' + endif + XI_MAX = 0.02D0 + if (ndebug.gt.0)WRITE(LUN,*)' low mass Xi_max: ' , XI_MAX + ENDIF + +C...target loop (air, N, O) + DO IK=1,3 + IAT = ITARGC(IK) + WRITE(6,*) 'SIG_AIR_INI: initializing target: (i,A)', + & ik, IAT, TARGN(IK) , '..' +C...particle loop (p, pi, K) + DO K=1,3 + + if (NDEBUG .gt. 0 ) then + WRITE(6,'(/,1X,A,A)') + & 'Table: J, IK, sqs, SIGtot, SIGprod, SIG_SD,', + &' Lambda ' + WRITE(6,*) + & '-------------------------------------------------', + & '-------------' + endif + DO J=1,NSQS + + ASQS = ASQSMIN + DASQS*DBLE(J-1) + SQS = 10.D0**ASQS + + IF (K.EQ.1) THEN +c Goulianos param. from GAP-2012-056, Mx**2s = 0.02 +c against PDG elastic cross section + CALL SIB_HADCS1 + & (K,SQS,SIGT1,SIGEL1,SIGINEL1,SLOPE1,RHO1) + SIGEFF = 0.68D0*(1.D0+36.D0/SQS**2)* + & dlog(0.6D0+XI_MAX/1.5D0*SQS**2) + ALAM(J) = dSQRT(SIGEFF/SIGEL1) + ENDIF + CALL SIB_SIGMA_HP(K,SQS, + & SIGT,SIGEL,SIGINEL,SIGDIF,SLOPE,RHO) + IF(IK.eq.1)THEN +c fixed O-N mixture + CALL SIG_H_AIR + & (SIGT, SLOPE, RHO, ALAM(J), + & SSIGT, SSIGEL, SSIGQE, SSIGSD, SSIGQSD) + ELSE + CALL SIG_H_NUC + & (IAT, SIGT, SLOPE, RHO, ALAM(J), + & SSIGT, SSIGEL, SSIGQE, SSIGSD, SSIGQSD) + ENDIF + if (ndebug .gt. 0 ) WRITE(6,'(1X,I2,1P,5E12.3)') + & K,SQS,SSIGT,SSIGT-SSIGQE,SSIGQSD,ALAM(J) +C particle production cross section + SSIGN(J,K,IK) = SSIGT-SSIGQE +c diffractive cross section + SSIGNSD(J,K,IK) = SSIGQSD +c elastic cross section + SSIGNEL(J,K,IK) = SSIGEL +c interaction length + IF(IK.eq.1)then + ALINT(J,K,IK) = 1.D0/(AVOG*SSIGn(j,K,IK)/ATARGET) + else + ALINT(J,K,IK) = 1.D0/(AVOG*SSIGn(j,K,IK)/IAT) + endif + ENDDO + ENDDO + + if (ndebug .gt. 0 ) then + WRITE(6,'(/,1X,A)') + & ' SIG_AIR_INI: NUCLIB interaction lengths [g/cm**2]' + WRITE(6,*) 'target:', TARGN(IK) + WRITE(6,'(1X,A)') + & ' sqs, p-targ, pi-targ, K-targ' + DO J=1,NSQS + ASQS = ASQSMIN + DASQS*DBLE(J-1) + SQS = 10.D0**ASQS + WRITE(6,'(1X,1P,4E12.3)') + & SQS,ALINT(J,1,IK),ALINT(J,2,IK),ALINT(J,3,IK) + ENDDO + endif + ENDDO + END +C======================================================================= + + SUBROUTINE SAMPLE_TARGET(NW,XCHG,KRMNT,XJET,Irec,IREJ) + +C-----------------------------------------------------------------------/ +C...Subroutine to sample valence and sea quark kinematic variables +C on the target side +C. fills IFLT,X2 and PXT,PYT +C. 1,2 are valence quarks, 3,4 are additional sea quarks +C. transverse momentum is shared between the val. and sea pairs +C. X and flv are exchanged occasionally, not pt so far +C------------------------------------------------------------------- + IMPLICIT NONE + + INTEGER NW_max + PARAMETER (NW_max = 20) +c external types + DOUBLE PRECISION XJET,XCHG + DIMENSION XJET(NW_max) + INTEGER KRMNT,NW,IREC,IREJ + DIMENSION KRMNT(NW_max) + + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + DOUBLE PRECISION STR_mass_val, STR_mass_val_hyp, STR_mass_sea + COMMON /S_CUTOFF/ STR_mass_val, STR_mass_val_hyp, STR_mass_sea +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + + INTEGER IBMRDX,ITGRDX,IHMJDX,ISMJDX,ICSTDX,IINTDX + COMMON /S_INDX/ IBMRDX(3),ITGRDX(NW_max,3), + & IHMJDX(NW_max*NH_max),IINTDX(NW_max), + & ISMJDX(NW_max*NS_max),ICSTDX(2*NW_max,3) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + INTEGER IRMNT,KRB,KRT + DOUBLE PRECISION XRMASS,XRMEX + COMMON /S_RMNT/ XRMASS(2),XRMEX(2),IRMNT(NW_max),KRB,KRT(NW_max) + +c internal types + DOUBLE PRECISION XX,X2,PX,PXT,PY,PYT,PZ,PZ1,PZ2 + DIMENSION XX(2*NW_max+2),PX(2*NW_max+2),PY(2*NW_max+2) + DIMENSION X2(4*NW_max),PXT(4*NW_max),PYT(4*NW_max) + INTEGER IFL,IFLT,IREJ1,J,J1,J2,J3,J4,JJ,JJJ,JI,I,KID,Iref1, + & Iref,KID1 + DIMENSION IFL(2*NW_max+2),IFLT(4*NW_max) + SAVE + + IREJ1 = 1 + + IF(ndebug.gt.2) + + WRITE(LUN,*) + + ' SAMPLE_TARGET: NW,XCHG,LRMNT,XJET,IREC,IREJ', + + NW,XCHG,(KRMNT(j),j=1,NW),(XJET(j),j=1,NW),IREC,IREJ + + DO J=1,NW ! zero arrays + j1 = 1+4*(j-1) + j2 = j1 + 1 + j3 = j2 + 1 + j4 = j3 + 1 + X2(j1) = 0.D0 + X2(j2) = 0.D0 + X2(j3) = 0.D0 + X2(j4) = 0.D0 + PXT(j1) = 0.D0 + PXT(j2) = 0.D0 + PXT(j3) = 0.D0 + PXT(j4) = 0.D0 + PyT(j1) = 0.D0 + PyT(j2) = 0.D0 + PyT(j3) = 0.D0 + PyT(j4) = 0.D0 + ENDDO + + DO j=1,NW +c read target id from event info + KID = KT(J) +c reset rejection + IREJ = IREJ1 +c always fills remnant partons into 1,2 and c.strings into 3,4 +c so far only one interaction possible (beam is always a single hadron!) + CALL SAMPLE_PROJECTILE + + (KID,1,KRMNT(j),XCHG,XJET(j),XX,PX,PY,IFL,KID1,IREJ) + IF(IREJ.ne.0) RETURN + +c write to target variables + do jj=3-2*KRMNT(j),4 + ji = jj+4*(j-1) + IFLT(ji) = IFL(jj) + X2(ji) = XX(jj) + PXT(ji) = PX(jj) + PYT(ji) = PY(jj) + enddo + + IF(KRMNT(j).ne.0)THEN +c by convention hadron is split such that diq is 2nd flv +c for string frag routine argument flv1 is along +z, flv2 -z +c by convention again flv2 in the remnant is passed to +z and flv1 to -z +c therefor on the target side the flavors need to be switched such that +c the diq is along -z + j1 = 1+4*(j-1) + j2 = j1 + 1 + CALL ISWTCH_LMNTS(IFLT(j1),IFLT(j2)) + ENDIF + +c central strings +c flavors need to be switched as well (strictly speaking color) +c in dual-parton model: q : color , diq : anticolor +c need to combine q with diq for color neutral system.. + j3 = 3+4*(j-1) + j4 = j3 + 1 + CALL ISWTCH_LMNTS(IFLT(j3),IFLT(j4)) + CALL SWTCH_LMNTS(X2(j3),X2(j4)) + +c reset remnant id +c might have changed in flavor exchange (actually color)... + KRT(J) = KID1 + ENDDO + +C.. write target partons to stack + DO I=1,NW + IF(KRMNT(I).ne.0)THEN +c add proto-remnant + j1 = 1+4*(i-1) + j2 = j1 + 1 + CALL ADD_PRTN(PXT(J1)+PXT(J2),PYT(J1)+PYT(J2), + & -0.5D0*SQS*(X2(J1)+X2(j2)),0.5D0*SQS*(X2(J1)+X2(j2)), + & 0.D0,-2,0,0,Iref1) + ITGRDX(I,1) = Iref1 + CALL ADD_INT_REF(Iref1,IINTDX(I)) +c add quarks to stack + do j = 1,2 + jj = 4*(i-1)+j + jjj = 4*(i-1)+j + 2 + pz1 = (0.5D0*SQS*X2(JJ))**2 +c PZ1 = (0.5D0*SQS*X2(JJ))**2-PXT(JJ)**2-PYT(JJ)**2 + CALL ADD_PRTN(PXT(JJ),PYT(JJ),-sqrt(pz1), + & 0.5D0*SQS*X2(JJ),0.D0,IFLT(JJ),1,Iref1,Iref) + ITGRDX(I,j+1) = Iref + pz2 = (0.5D0*SQS*X2(JJj))**2 +c pz2 = (0.5D0*SQS*X2(JJj))**2-PXT(JJj)**2-PYT(JJj)**2 + CALL ADD_PRTN(PXT(JJj),PYT(JJj),-sqrt(pz2), + & 0.5D0*SQS*X2(JJj),0.D0,IFLT(JJj),1,0,Iref) + ICSTDX(2*(I-1)+j,3) = Iref + enddo + else + do j = 3,4 + jj = 4*(i-1)+j + pz = (0.5D0*SQS*X2(JJ))**2 +c pz = (0.5D0*SQS*X2(JJ))**2-PXT(JJ)**2-PYT(JJ)**2 + CALL ADD_PRTN(PXT(JJ),PYT(JJ),-sqrt(pz), + & 0.5D0*SQS*X2(JJ),0.D0,IFLT(JJ),1,0,Iref) + ICSTDX(2*(I-1)+(J-2),3) = Iref + enddo + ENDIF + ENDDO + IF(NDEBUG.GT.3) CALL PRNT_PRTN_STCK + + IREJ = 0 + END +C======================================================================= + + SUBROUTINE SIGMA_NUC_AIR(IA,ECM,KINT) + +C----------------------------------------------------------------------- +C. wrapping for SIGMA_NUC in NUCLIB +C...Compute with a montecarlo method the "production" +C. and "quasi-elastic" cross section for +C. a nucleus-nucleus interaction +C. nucleon - nucleon cross section is taken from +C. the table calculated by SIBYLL_INI +C. +C. INPUT : IA = mass of target nucleus +C. ECM = c.m. energy +C. KINT = number of interactions to generate +C. OUTPUT : SIGMA (mbarn) = "production" cross section +C. DSIGMA " = error +C. SIGQE " = "quasi-elastic" cross section +C. DSIGQE " = error +C. in COMMON /NUCNUCSIG/ +C. additional output is in the common block /CPROBAB/ +C. Prob(n_A), Prob(n_B), Prob(n_int) +C.......................................................................... + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /NUCNUCSIG/ SIGPROD,DSIGPROD,SIGQE,DSIGQE,IBE,ITG + DIMENSION SIGDIF(3) + SAVE + DATA NDB /0/ + + DSIGPROD = 0.D0 + DSIGQE = 0.D0 + + CALL SIB_SIGMA_HP(1,ECM,SIGT,SIGEL,SIGINEL,SIGDIF,SLOPE,RHO) + CALL SIGMA_AIR(IA,SIGINEL,SIGEL,KINT,SIGPROD,DSIGPROD, + + SIGQE,DSIGQE) + IBE = IA + ITG = 0 + IF(DSIGPROD/SIGPROD.gt.0.1D0)THEN + IF( NDB.EQ.0 ) + + PRINT*,'SIG_NUC_AIR: warning! : large error in cross section' + NDB = 1 + ENDIF + RETURN + END + +C======================================================================= + + SUBROUTINE SIG_NUC_AIR(IA,SIGPP,SIGPPEL,KINT) + +C----------------------------------------------------------------------- +C. wrapping for SIGMA_NUC in NUCLIB +C...Compute with a montecarlo method the "production" +C. and "quasi-elastic" cross section for +C. a nucleus-nucleus interaction +C. +C. INPUT : IA = mass of target nucleus +C. IB = mass of projectile nucleus +C. SIGPP (mbarn) = inelastic pp cross section +C. SIGPPEL = elastic pp cross section +C. KINT = number of interactions to generate +C. OUTPUT : SIGMA (mbarn) = "production" cross section +C. DSIGMA " = error +C. SIGQE " = "quasi-elastic" cross section +C. DSIGQE " = error +C. in COMMON /NUCNUCSIG/ +C. additional output is in the common block /CPROBAB/ +C. Prob(n_A), Prob(n_B), Prob(n_int) +C.......................................................................... + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /NUCNUCSIG/ SIGPROD,DSIGPROD,SIGQE,DSIGQE,IBE,ITG + SAVE + + DSIGPROD = 0.D0 + DSIGQE = 0.D0 + CALL SIGMA_AIR(IA,SIGPP,SIGPPEL,KINT,SIGPROD,DSIGPROD, + + SIGQE,DSIGQE) + IBE = IA + ITG = 0 + IF(DSIGPROD/SIGPROD.gt.0.1D0)THEN + IF( NDB.EQ.0 ) + + PRINT*,'SIG_NUC_AIR: warning! : large error in cross section' + NDB = 1 + ENDIF + RETURN + END + +C======================================================================= + + SUBROUTINE SIG_NUC_NUC(IA,IB,SIGPP,SIGPPEL,KINT) + +C----------------------------------------------------------------------- +C. wrapping for SIGMA_NUC in NUCLIB +C...Compute with a montecarlo method the "production" +C. and "quasi-elastic" cross section for +C. a nucleus-nucleus interaction +C. +C. INPUT : IA = mass of target nucleus +C. IB = mass of projectile nucleus +C. SIGPP (mbarn) = inelastic pp cross section +C. SIGPPEL = elastic pp cross section +C. KINT = number of interactions to generate +C. OUTPUT : SIGMA (mbarn) = "production" cross section +C. DSIGMA " = error +C. SIGQE " = "quasi-elastic" cross section +C. DSIGQE " = error +C. in COMMON /NUCNUCSIG/ +C. additional output is in the common block /CPROBAB/ +C. Prob(n_A), Prob(n_B), Prob(n_int) +C.......................................................................... + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /NUCNUCSIG/ SIGPROD,DSIGPROD,SIGQE,DSIGQE,IBE,ITG + SAVE + + DSIGPROD = 0.D0 + DSIGQE = 0.D0 + CALL SIGMA_MC(IA,IB,SIGPP,SIGPPEL,KINT,SIGPROD,DSIGPROD, + + SIGQE,DSIGQE) + IBE = IA + ITG = IB + IF(DSIGPROD/SIGPROD.gt.0.1D0)THEN + IF( NDB.EQ.0 ) + + PRINT*,'SIG_NUC_NUC: warning! : large error in cross section' + NDB = 1 + ENDIF + RETURN + END +C======================================================================= + + SUBROUTINE SIG_HAD_NUC(L,IA,ECM,ALAM,ICSMOD,IPARM) + +C----------------------------------------------------------------------- +C********************************************************************** +C...Subroutine to compute hadron-nucleus cross sections +C. according to: +C. R.J. Glauber and G.Matthiae Nucl.Phys. B21, 135, (1970) +C. +C. +C. INPUT : L projectile particle (1:p , 2:pi, 3:K ) +C. IA mass-number of target nucleus +C. SSIG (mbarn) total pp cross section +C. SLOPE (GeV**-2) elastic scattering slope for pp +C. ALPHA real/imaginary part of the forward pp elastic +C. scattering amplitude +C. ALAM: inel. screening coupling +C. +C. OUTPUT : ( in COMMON block /NUCSIG/ ) +C. SIGT = Total cross section +C. SIGEL = Elastic cross section +C. SIGQEL = Elastic + Quasi elastic cross section +C. SIGSD = beam single diff. cross section +C...................................................................... + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /NUCSIG/ SIGT,SIGEL,SIGINEL,SIGQE,SIGSD, + + SIGQSD,SIGPPT,SIGPPEL,SIGPPSD,ITG + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) +c double precision dplab +c double precision DSSIG,DSLOPE,DALPHA,DALAM +c DOUBLE PRECISION SG1,SGEL1,SGQE1,SGSD1,SGQSD1 + DIMENSION SSIGDIF(3),XM(4) + SAVE +c DATA XM / 0.93956563, 0.13956995, 0.493677, 0.93956563 / + DATA GEV2MB /0.3893D0/ + DATA INIT/0/ + + IF(INIT.EQ.0) THEN +c use the masses from the mass table +cdh XM(1) = AM(14) ! neutron + XM(1) = AM(13) ! proton + XM(2) = AM(7) ! pi+ + XM(3) = AM(9) ! K+ + XM(4) = AM(14) ! neutron + INIT = 1 + ENDIF + + xma = XM(L) + xmb = (XM(1)+XM(4))/2.D0 + + Plab = dsqrt(((ecm**2-xma**2-xmb**2)/(2.D0*xmb))**2-xma**2) + +C hadron proton cross section to be used for calculation + + IF( ICSMOD.EQ.1 ) THEN +c sibyll 2.1 cross section + + CALL SIB_SIGMA_HP(L,ECM,SSIG,SSIGEL,SSIGINEL,SSIGDIF,SLOPE,RHO) + + ELSEIF( ICSMOD.EQ.0 ) THEN +c cross section parametrizations + + if(Ecm.gt.12.D0) then + + CALL SIB_HADCSL(L,ECM,SSIG,SSIGEL,SSIGINEL,SSIGDIF,SLOPE,RHO) + + else +c low energy parametrization + SSIG = (sigtot_pp(Plab)+sigtot_pn(plab))/2.D0 + SSIGEL = (sigela_pp(Plab)+sigela_pn(plab))/2.D0 +C parametrization from U. Dersch et al. Nucl Phys. B579 (2000) 277 + RHO = 6.8D0/plab**0.742D0-6.6D0/plab**0.599D0+0.124D0 + SLOPE = (1.D0+RHO**2)*SIGTOT**2/(16.D0*PI*SIGEL)/GEV2MB + SSIGDIF(1) = 0.D0 + SSIGDIF(2) = 0.D0 + SSIGDIF(3) = 0.D0 + endif + ENDIF + SSIGSD = SSIGDIF(1) + SSIGDIF(2) + +c energy dependence of lambda parameter + if( IPARM.eq.1 ) then + +c empirical parametrization + SIGEFF = 0.25D0*Ecm**2/(Ecm**2+10.D0**2)*dLOG(1000.D0*Ecm**2) + & -1.5D0/2.D0 + SIGEFF = MAX(0.D0,SIGEFF) + + ALAM = dsqrt(SIGEFF/SSIGEL) + + SSIGSD = 2.D0 * SIGEFF + + elseif( IPARM.EQ.2 ) then + +c lambda derived from proton interactions + CALL SIB_HADCS1(1,ECM,SIGT1,SSIGEL1,SIGINEL1,SLOPE1,RHO1) +C parametrization by Goulianos for diff. interaction + SIGEFF = 0.68D0*(1.D0+36.D0/Ecm**2) + & *LOG(0.6D0+0.02D0/1.5D0*Ecm**2) + SIGEFF = MAX(0.D0,SIGEFF) + ALAM = sqrt(SIGEFF/SSIGEL1) + + SSIGSD = 2.D0 * SIGEFF + + elseif( IPARM.eq.3)then + +C data from Paolo Lipari's note + SIGTOT = 129.D0 + SIGEL = 0.3D0*SIGTOT + SIGEFF = ECM*0.01D0*SIGTOT + RHO = 0.D0 + SLOPE = (1.D0+RHO**2)*SIGTOT**2/(16.D0*PI*SIGEL)/GEV2MB + ALAM = dsqrt(SIGEFF/SIGEL) + + SSIG = SIGTOT + SSIGEL = SIGEL + SSIGSD = 2.D0 * SIGEFF + endif + + ALPHA = RHO + +C hadron - nucleon cross section + + IF( IA.EQ.0 ) THEN + CALL SIG_H_AIR + + (SSIG,SLOPE,ALPHA,ALAM,SG1,SGEL1,SGQE1,SGSD1,SGQSD1) + else + CALL GLAUBER2 + + (IA,SSIG,SLOPE,ALPHA,ALAM,SG1,SGEL1,SGQE1,SGSD1,SGQSD1) + endif + + ITG = IA + + SIGPPT = SSIG + SIGPPEL = SSIGEL + SIGPPSD = SSIGSD + SIGT = SG1 + SIGEL = SGEL1 + SIGQE = SGQE1 + SIGSD = SGSD1 + SIGQSD = SGQSD1 + SIGINEL = SIGT - SIGEL + + RETURN + END +C======================================================================= + + SUBROUTINE SIG_H_AIR + + (SSIG,SLOPE,ALPHA,ALAM,SIGT,SIGEL,SIGQE,SIGSD,SIGQSD) + +C----------------------------------------------------------------------- +C********************************************************************** +C...Subroutine to compute hadron-air cross sections +C. according to: +C. R.J. Glauber and G.Matthiae Nucl.Phys. B21, 135, (1970) +C. +C. Air is a linear combination of Nitrogen and oxygen +C. +C. INPUT : SSIG (mbarn) total pp cross section +C. SLOPE (GeV**-2) elastic scattering slope for pp +C. ALPHA real/imaginary part of the forward pp elastic +C. scattering amplitude +C. ALAM coupling to inel. intermediat states +C. OUTPUT : SIGT = Total cross section +C. SIGEL = Elastic cross section +C. SIGQEL = Elastic + Quasi elastic cross section +C. SIGSD = single diff. cross section (beam) +C. SIGQSD = Elastic + Quasi elastic SD cross section (beam) +C. +C. ALSO including interface from single precision in SIBYLL to +C. double precision in GLAUBER2 +C...................................................................... + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + IMPLICIT INTEGER(I-N) + SAVE + DATA FOX /0.21522D0/ !atomic percentage of 'non-nitrogen' in air + + CALL GLAUBER2 + + (14,SSIG,SLOPE,ALPHA,ALAM,SIG1,SIGEL1,SIGQE1,SIGSD1,SIGQSD1) + CALL GLAUBER2 + + (16,SSIG,SLOPE,ALPHA,ALAM,SIG2,SIGEL2,SIGQE2,SIGSD2,SIGQSD2) + + SIGT = (1.D0-FOX)*SIG1 + FOX*SIG2 + SIGEL = (1.D0-FOX)*SIGEL1 + FOX*SIGEL2 + SIGQE = (1.D0-FOX)*SIGQE1 + FOX*SIGQE2 + SIGSD = (1.D0-FOX)*SIGSD1 + FOX*SIGSD2 + SIGQSD = (1.D0-FOX)*SIGQSD1 + FOX*SIGQSD2 + RETURN + END + +C======================================================================= + + SUBROUTINE SIG_H_NUC + + (IAT,SSIG,SLOPE,ALPHA,ALAM,SIGT,SIGEL,SIGQE,SIGSD,SIGQSD) + +C----------------------------------------------------------------------- +C********************************************************************** +C...Subroutine to compute hadron-nucleus cross sections +C. according to: +C. R.J. Glauber and G.Matthiae Nucl.Phys. B21, 135, (1970) +C. +C. INPUT : IAT nucleon number in target nucleus +C. SSIG (mbarn) total pp cross section +C. SLOPE (GeV**-2) elastic scattering slope for pp +C. ALPHA real/imaginary part of the forward pp elastic +C. scattering amplitude +C. OUTPUT : SIGT = Total cross section +C. SIGEL = Elastic cross section +C. SIGQEL = Elastic + Quasi elastic cross section +C. SIGSD = single diff. cross section (beam) +C. SIGQSD = Elastic + Quasi elastic SD cross section (beam) +C. +C...................................................................... + IMPLICIT NONE + INTEGER IAT + DOUBLE PRECISION SSIG,SLOPE,ALPHA,ALAM + DOUBLE PRECISION SIG1,SIGEL1,SIGQE1,SIGSD1,SIGQSD1 + DOUBLE PRECISION SIGT,SIGEL,SIGQE,SIGSD,SIGQSD + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + SAVE + IF(IAT.eq.0.or.IAT.gt.18) THEN + WRITE(LUN,'(//,1X,A)') + & ' SIG_H_NUC: number of target nucleons too large!', + & ' (1<=IAT<=18)' + SIGT = -1.D0 + STOP + ENDIF + + CALL GLAUBER2 + + (IAT,SSIG,SLOPE,ALPHA,ALAM,SIG1,SIGEL1,SIGQE1,SIGSD1,SIGQSD1) + SIGT = SIG1 + SIGEL = SIGEL1 + SIGQE = SIGQE1 + SIGSD = SIGSD1 + SIGQSD = SIGQSD1 + RETURN + END + +C======================================================================= + + SUBROUTINE GLAUBER2 + + (JA,SSIG,SLOPE,ALPHA,ALAM,SIGT,SIGEL,SIGQEL,SIGSD,SIGQSD) + +C----------------------------------------------------------------------- +C...Subroutine to compute hadron-Nucleus cross sections +C. according to: +C. R.J. Glauber and G.Matthiae Nucl.Phys. B21, 135, (1970) +C. +C. This formulas assume that the target nucleus density is +C. modeled by a shell-model form. A reasonable range of models +C. is 4 < JA < 18 +C. +C. This is a modified version with a two-channel model for inelastic +C. intermediate states of low mass (R. Engel 2012/03/26) +C. +C. INPUT : A = mass number of the nucleus +C. SSIG (mbarn) total pp cross section +C. SLOPE (GeV**-2) elastic scattering slope for pp +C. ALAM enhancement factor (sqrt of sigma_sd1/sigma_ela) +C. ALPHA real/imaginary part of the forward pp elastic +C. scattering amplitude +C. OUTPUT : SIGT = Total cross section +C. SIGEL = Elastic cross section +C. SIGQEL = Elastic + Quasi elastic cross section +C. SIGSD = single diff. cross section +C. SIGQSD = Quasi single diff. cross section +C. +C. Internally everything is computed in GeV (length = GeV**-1) +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /CA0SH/ R0, R02 + COMPLEX*16 ZS1, ZS2, ZP1, ZP2, Z1, Z2, OM12 + DIMENSION RR(18) + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + SAVE + DATA BMAX /100.D0/ ! GeV**-1 + DATA NB /500/ +C...data on Sqrt[<r**2>] (fm). (A=5,8 are not correct). +C From Barett and Jackson + DATA RR /0.81,2.095,1.88,1.674, 2.56,2.56,2.41,2.5,2.519,2.45 + + ,2.37, 2.460, 2.440, 2.54, 2.58, 2.718, 2.662,2.789 / + + A = DBLE(JA) +C...Parameter of shell model density + R0 = RR(JA)/0.197D0/dSQRT(5.D0/2.D0 - 4.D0/A) ! GeV**-1 + R02 = R0*R0 + + SIG1 = (1.D0+ALAM) * SSIG/CMBARN ! GeV**-2 + SIG2 = (1.D0-ALAM) * SSIG/CMBARN + SIG12 = dSQRT((1.D0+ALAM)*(1.D0-ALAM)) * SSIG/CMBARN + DB = BMAX/DBLE(NB) + SUM0 = 0.D0 + SUM1 = 0.D0 + SUM2 = 0.D0 + SUM3 = 0.D0 + SUM4 = 0.D0 + DO JB=1,NB + + B = DB*(DBLE(JB)-0.5D0) + + GS1 = GLAUBGS_D (B,SLOPE, SIG1) + XS1 = (1.D0- GS1) + YS1 = GS1*ALPHA + ZS1 = DCMPLX(XS1,YS1) + + GP1 = GLAUBGP_D (B,SLOPE, SIG1) + XP1 = (1.D0- GP1) + YP1 = GP1*ALPHA + ZP1 = DCMPLX(XP1,YP1) + + Z1 = ZS1**4 * ZP1**(A-4.D0) + + GS2 = GLAUBGS_D (B,SLOPE, SIG2) + XS2 = (1.D0- GS2) + YS2 = GS2*ALPHA + ZS2 = DCMPLX(XS2,YS2) + + GP2 = GLAUBGP_D (B,SLOPE, SIG2) + XP2 = (1.D0- GP2) + YP2 = GP2*ALPHA + ZP2 = DCMPLX(XP2,YP2) + + Z2 = ZS2**4 * ZP2**(A-4.D0) + + XZ = 0.5D0 * DREAL(Z1+Z2) + YZ = 0.5D0 * DIMAG(Z1+Z2) + + XZ2 = 0.5D0 * DREAL(Z2-Z1) + YZ2 = 0.5D0 * DIMAG(Z2-Z1) + + SUM0 = SUM0 + (1.D0-XZ)*B + + SUM1 = SUM1 + ((1.D0-XZ)**2 + YZ**2)*B + + SUM3 = SUM3 + (XZ2**2 + YZ2**2)*B + + OMS1 = OMEGAS_D(B,SIG1,SLOPE,ALPHA) + OMS2 = OMEGAS_D(B,SIG2,SLOPE,ALPHA) + OMS12 = OMEGAS_D(B,SIG12,SLOPE,ALPHA) + + OMP1 = OMEGAP_D(B,SIG1,SLOPE,ALPHA) + OMP2 = OMEGAP_D(B,SIG2,SLOPE,ALPHA) + OMP12 = OMEGAP_D(B,SIG12,SLOPE,ALPHA) + + OM1 = (1.D0 - 2.D0*GS1 + OMS1)**4 + & * (1.D0 - 2.D0*GP1 + OMP1)**(A-4.D0) + OM2 = (1.D0 - 2.D0*GS2 + OMS2)**4 + & * (1.D0 - 2.D0*GP2 + OMP2)**(A-4.D0) + OM12 = (1.D0 - GS1*DCMPLX(1.D0,ALPHA)-GS2*DCMPLX(1.D0,-ALPHA) + & + OMS12)**4 + & * (1.D0 - GP1*DCMPLX(1.D0,ALPHA)-GP2*DCMPLX(1.D0,-ALPHA) + & + OMP12)**(A-4.D0) + SUM2 = SUM2 + (1.D0-2.D0*XZ + (OM1+OM2)/4.D0 + & + DREAL(OM12)/2.D0)*B + SUM4 = SUM4 + ((OM1+OM2)/4.D0 + & - DREAL(OM12)/2.D0)*B + + ENDDO + + SIGT = SUM0 * DB * 4.D0*PI * CMBARN + SIGEL = SUM1 * DB * TWOPI * CMBARN + SIGQEL = SUM2 * DB * TWOPI * CMBARN + SIGSD = SUM3 * DB * TWOPI * CMBARN + SIGQSD = SUM4 * DB * TWOPI * CMBARN + END + +C======================================================================= + + FUNCTION GLAUBGS_D (B,SLOPE, SIG) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /CA0SH/ A0, A02 + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + SAVE + + GAMMA2 = A02/4.D0 + 0.5D0*SLOPE + ARG = B**2/(4.D0*GAMMA2) + GLAUBGS_D = SIG/(8.D0*PI*GAMMA2) * EXP(-ARG) + RETURN + END + +C======================================================================= + + FUNCTION GLAUBGP_D (B,SLOPE, SIG) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /CA0SH/ A0, A02 + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + SAVE + + GAMMA2 = A02/4.D0 + 0.5D0*SLOPE + ARG = B**2/(4.D0*GAMMA2) + C1 = 1.D0- A02/(6.D0*GAMMA2)*(1.D0-ARG) + GLAUBGP_D = SIG/(8.D0*PI*GAMMA2) * C1 * EXP(-ARG) + RETURN + END + +C======================================================================= + + FUNCTION OMEGAS_D (B, SIG, SLOPE, RHO) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /CA0SH/ A0, A02 + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + SAVE + + ETA2 = 0.25D0*(A02 + SLOPE) + F02 = SIG*SIG*(1.D0+RHO*RHO)/(16.D0*PI**2) + ARG = -B*B/(4.D0*ETA2) + OMEGAS_D = F02/(4.D0*ETA2*SLOPE) *EXP(ARG) + RETURN + END + +C======================================================================= + + FUNCTION OMEGAP_D (B, SIG, SLOPE, RHO) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /CA0SH/ A0, A02 + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + SAVE + + ETA2 = 0.25D0*(A02 + SLOPE) + F02 = SIG*SIG*(1.D0+RHO*RHO)/(16.D0*PI**2) + ARG = -B*B/(4.D0*ETA2) + OMEGAP_D=F02/(4.D0*ETA2*SLOPE)*(1.D0-A02/(6.D0*ETA2)*(1.D0+ARG)) + $ *EXP(ARG) + RETURN + END +C======================================================================= + + SUBROUTINE REMOVE_PI0(XRATE,N1,N2) + +C----------------------------------------------------------------------- +C routine to exchange pi0 on stack with charged pions +C violating charge conservation. +C final pions will be off-shell +C +C Input: exchange rate and stack positions inbetween +C which pions shall be exchanged. +C +C--------------------------------------------------------- + IMPLICIT NONE +c Commons + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN +C external types + DOUBLE PRECISION XRATE + INTEGER N1,N2 +C internals + INTEGER I,LL,LA,IFPI0 + DOUBLE PRECISION S_RNDM + SAVE + + IF(NDEBUG.gt.0)write(lun,*) + & ' REMOVE_PI0: Rate,Mode:',xrate,IPAR(50) +C select exchange model + IF(IPAR(50).eq.1)THEN +C stack loop + DO I=N1,N2 + LL = MOD(LLIST(I),10000) + LA = IABS(LL) +c IF(LA.eq.6)THEN + IFPI0=(1-MIN(IABS(1-LA/6),1))*MAX(1-MOD(LA,6),0) +c replace with pi+ or pi- + LL=LL+IFPI0*(2-INT(MIN((2.D0+XRATE)*S_RNDM(LA), + & 3.D0-EPS10))) + LLIST(I) = LL + IF(NDEBUG.gt.1) + & WRITE(LUN,*) ' REMOVE_PI0: LA,IFPI0,LNEW:',LA,IFPI0,LL + ENDDO + ENDIF + END +C======================================================================= + + SUBROUTINE SAMPLE_SEA_INDV(KRMNT,XMINA,XMINA_SEA,NSEA, + & XREM0,ALPHA,ASUP,XQMASS,XMAX,XX,IREJ) + +C----------------------------------------------------------------------- + IMPLICIT NONE + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + INTEGER NW_max + PARAMETER (NW_max = 20) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + INTEGER ITRY, NREJ + COMMON /S_CNT/ ITRY(20), NREJ(20) + + DOUBLE PRECISION XMINA,XMINA_SEA,XREM0,ALPHA,ASUP,XQMASS,XMAX + INTEGER NSEA,KRMNT + DOUBLE PRECISION XX + DIMENSION XX(2*NW_max+2) + INTEGER IREJ + + DOUBLE PRECISION XREM,XKIN,X1,X2,pt,S_RNDM,XQM + INTEGER ICNT2,J,jj1,jj2 + SAVE + DATA ICNT2 /0/ + + IF(ndebug.gt.2) + & write(lun,*)' SAMPLE_SEA_INDV: called with ', + & '(KRMNT,XMINA,XMINA_SEA,NSEA,XREM0,ALPHA,ASUP,XQMASS,XMAX):', + & KRMNT,XMINA,XMINA_SEA,NSEA,XREM0,ALPHA,ASUP,XQMASS,XMAX + XREM = 0.D0 + XKIN = 0.1D0 + XQM = XQMASS + ITRY(4) = 0 + DO WHILE ( XREM .lt. XMINA ) + XREM = XREM0 + IF ( XREM .LT. 2.D0*XMINA + Nsea*XMINA_SEA + & +XKIN*(1.5D0-S_RNDM(ICNT2)) ) THEN + IREJ = 2 ! resample event + RETURN + ENDIF + IF(ITRY(4).gt.Nsea/2*NREJ(4))THEN + ICNT2 = ICNT2 + 1 + IF(ndebug.gt.2)THEN + IF(ICNT2.le.5)THEN + write(lun,*)' SAMPLE_SEA_INDV: rejection!' + write(lun,*)' reached max. no. of trials!', NREJ(4) + write(lun,*)' XREM0,N,XMIN:' ,XREM0,Nsea,XMINA_SEA + ENDIF + IF(ICNT2.eq.5) + & write(lun,*)' last warning of this type..' + ENDIF + IREJ = IPAR(51) + RETURN + ENDIF + DO j=1,Nsea/2 +c scale for interactions other than first if Nw>1 + IF(IPAR(75).eq.1.and.J.gt.1) XQM = XQM*PAR(118) + CALL SAMPLE_SEA(ALPHA,ASUP,XQM,XMAX,x1,x2,pt) + jj1 = 2 + 2*(j-1) + 1 + IF(KRMNT.eq.0) jj1 = 4+2*(j-1) + 1 + jj2 = jj1 + 1 + XX(jj1) = x1 + XX(jj2) = x2 + XREM = XREM - XX(jj1) - XX(jj2) + IF(NDEBUG.gt.2) + & WRITE(LUN,*) ' x-frac: JW,X3,X4,XREM', + & J,XX(jj1),XX(jj2),XREM + ENDDO + ITRY(4) = ITRY(4) + 1 + IF(NDEBUG.gt.1) WRITE(LUN,*) + & ' SAMPLE_SEA_INDV: ISMPL,XREM0,XREM,XMINA,XMINSEA', + & ITRY(4),XREM0,XREM,XMINA,XMINA_SEA + ENDDO + XREM0 = XREM + IREJ = 0 + END +C======================================================================= + + SUBROUTINE FORCE_VECTORS(XRATE,N1,N2) + +C----------------------------------------------------------------------- + IMPLICIT NONE + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + +c external types + double precision xrate + integer n1,n2 + +c internal types + integer ipi2vec,lcon,lreschex,ll,la,la_new,i,j,kba + DIMENSION IPI2VEC(99) + double precision pz2,xmts,xf,xfs,S_RNDM!,pts + + DIMENSION LCON(6:43),LRESCHEX(6:39) + INTEGER IFIRST + SAVE +c charge exchange map, i.e. pip -> pi0 ... + DATA LCON /7,6,6,22,21,9,9,14,13,4*0,20,19,10,9,23,24,27,27,25, + & 31,30,29,28,32,33,35,34,35,38,37,39,41,42,41,42/ +c charge and spin exchange map, i.e. pip -> rho0 +c approximate, proton and neutron should go to N(1520) not Delta + DATA LRESCHEX /26,27,27,31,30,9,9,42,41,19*0,45,44,45,48,47,39/ + DATA IFIRST /0/ + + if(ifirst.eq.0)then + print *,'initializing..' + do j=1,99 + IPI2VEC(J) = J + enddo + IPI2VEC(6) = 27 ! pi(0) ---> rho(0) + IPI2VEC(7) = 25 ! pi+ ---> rho+ + IPI2VEC(8) = 26 ! pi- ---> rho- + ifirst = 1 + endif + + KBA = IABS(KB) + + IF(IPAR(45).eq.1)THEN +c trivial exchange model + do I=N1,N2 +c replace pions with vector mesons + LL = mod(llist(I),10000) + LA = abs(LL) + IF(S_RNDM(I).lt.xrate)then +c put back on mass shell + la_new = IPI2VEC(LA) + xmts = p(i,1)**2 + p(i,2)**2 + am2(la_new) + pz2 = p(i,4)**2 - xmts + if(pz2.gt.EPS8)then + p(i,3) = sign(sqrt(pz2),p(i,3)) + p(i,5) = am(la_new) + LLIST(I) = ISIGN(la_new,ll) + endif + endif + enddo + + ELSEIF(IPAR(45).eq.2)THEN +c large xf only, neutral pions only + do I=N1,N2 + LL = mod(llist(I),10000) + LA = abs(LL) + IF(LA.eq.6)then + xf = 2.D0*p(i,3)/SQS + IF(S_RNDM(I).lt.xrate*xf)then +c exhcange and put back on mass shell + la_new = IPI2VEC(la) + xmts = p(i,1)**2 + p(i,2)**2 + am2(la_new) + pz2 = p(i,4)**2 - xmts + if(pz2.gt.EPS8)then + p(i,3) = sign(dsqrt(pz2),p(i,3)) + p(i,5) = am(la_new) + LLIST(I) = ISIGN(la_new,ll) + endif + endif + endif + enddo + + ELSEIF(IPAR(45).eq.3)THEN +c large xf only, charge and spin exchange + do I=N1,N2 + LL = mod(llist(I),10000) + LA = abs(LL) + IF(ll.eq.LCON(KBA))then + xf = 2.D0*p(i,3)/sqs + IF(S_RNDM(I).lt.xrate*xf)then +c replace charge exchange product of beam with +c charge and spin exchange product, i.e. +c pip-beam -> rho0 instead of pip-beam -> pi0 +c so replace pi0 with rho0 in final state + la_new = LRESCHEX(KBA) +c put back on mass shell + xmts = p(i,1)**2 + p(i,2)**2 + am2(la_new) + pz2 = p(i,4)**2 - xmts + if(pz2.gt.EPS8)then + p(i,3) = sign(dsqrt(pz2),p(i,3)) + p(i,5) = am(la_new) + LLIST(I) = ISIGN(la_new,ll) + endif + endif + endif + enddo + + ELSEIF(IPAR(45).eq.4)THEN +c large xf only, charge and spin exchange + do I=N1,N2 + LL = mod(llist(I),10000) + LA = abs(ll) + IF(LL.eq.LCON(KBA))then + xf = 2.D0*p(i,3)/sqs + xfs = xf ** 2 + IF(S_RNDM(I).lt.xrate*xfs)then +c replace charge exchange product of beam with +c charge and spin exchange product, i.e. +c pip-beam -> rho0 instead of pip-beam -> pi0 +c so replace pi0 with rho0 in final state + la_new = LRESCHEX(KBA) +c put back on mass shell + xmts = p(i,1)**2 + p(i,2)**2 + am2(la_new) + pz2 = p(i,4)**2 - xmts + if(pz2.gt.EPS8)then + p(i,3) = sign(dsqrt(pz2),p(i,3)) + p(i,5) = am(la_new) + LLIST(I) = ISIGN(la_new,ll) + endif + endif + endif + enddo + ENDIF + if(ndebug.ge.5) CALL SIB_LIST(6) + END +C======================================================================= + + SUBROUTINE SAMPLE_BEAM(KID,NW,XCHG,KRMNT,XJET,IREJ) + +C----------------------------------------------------------------------- +C...Subroutine to sample valence and sea quark kinematics +C. fills IFL?,X? and PX?,PY? +C. 1,2 are valence quarks, 3,4 are additional sea quarks +C. transverse momentum is shared between the val. and sea pairs +C. X and flv are exchanged occasionally +C------------------------------------------------------------------- + IMPLICIT NONE + + DOUBLE PRECISION XCHG,XJET + INTEGER KID,NW,KRMNT,IREJ + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + INTEGER NW_max + PARAMETER (NW_max = 20) + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + + INTEGER IBMRDX,ITGRDX,IHMJDX,ISMJDX,ICSTDX,IINTDX + COMMON /S_INDX/ IBMRDX(3),ITGRDX(NW_max,3), + & IHMJDX(NW_max*NH_max),IINTDX(NW_max), + & ISMJDX(NW_max*NS_max),ICSTDX(2*NW_max,3) + + INTEGER IRMNT,KRB,KRT + DOUBLE PRECISION XRMASS,XRMEX + COMMON /S_RMNT/ XRMASS(2),XRMEX(2),IRMNT(NW_max),KRB,KRT(NW_max) + + DOUBLE PRECISION X1,PXB,PYB + DIMENSION X1(2*NW_max+2),PXB(2*NW_max+2),PYB(2*NW_max+2) + INTEGER IFLB,KID1,J,J1,J2,J3,J4,Iref1,Iref,Idm + DIMENSION IFLB(2*NW_max+2) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + +c default rejection +c options are: 1: resample minijets (Xjet).. +c 2: resample non-diff event (Ns,Nh).. +c 3: resample event (Nw,diff,ndiff).. + IREJ = 1 + + IF(ndebug.gt.2) + + WRITE(LUN,*) + + ' SAMPLE_BEAM: KID,NW,XCHG,KRMNT,XJET,IREJ', + + KID,NW,XCHG,KRMNT,XJET,IREJ + + CALL SAMPLE_PROJECTILE + + (KID,NW,KRMNT,XCHG,XJET,X1,PXB,PYB,IFLB,KID1,IREJ) + IF(IREJ.ne.0) RETURN + +c set remnant id to beam +c will be changed if flavor is exchanged between central strings and remnant + KRB = KID1 + +C.. write beam partons to stack +c order is: val1, val2, q, qbar etc + IF(KRMNT.ne.0)THEN + j1 = 1 + j2 = 2 +c add proto-remnant (still massless) + CALL ADD_PRTN(PXB(J1)+PXB(J2),PYB(J1)+PYB(J2), + & 0.5D0*SQS*(X1(J1)+X1(J2)), + & 0.5D0*SQS*(X1(J1)+X1(J2)),0.D0,2,0,0,Iref1) + IBMRDX(1) = Iref1 +c beam remnant always associated with first interaction + CALL ADD_INT_REF(Iref1,IINTDX(1)) +c add quarks designated for remnant + IF(KID.lt.0)THEN +c if beam is antibaryon then hspli puts diq into 1st flv +c need to switch to fit call to string frag routine +c such that diq is along +z + CALL ISWTCH_LMNTS(IFLB(j1),IFLB(j2)) + ENDIF + CALL ADD_PRTN(PXB(J1),PYB(J1),0.5D0*SQS*X1(J1), + & 0.5D0*SQS*X1(J1),0.D0,IFLB(J1),1,Iref1,Iref) + IBMRDX(2) = Iref + CALL ADD_PRTN(PXB(J2),PYB(J2),0.5D0*SQS*X1(J2), + & 0.5D0*SQS*X1(J2),0.D0,IFLB(J2),1,Idm,Iref) + IBMRDX(3) = Iref + ENDIF + DO j=1,NW + j3 = 3+(j-1)*2 + j4 = j3+1 +c add sea quarks + CALL ADD_PRTN(PXB(J3),PYB(J3),0.5D0*SQS*X1(J3), + & 0.5D0*SQS*X1(J3),0.D0,IFLB(J3),1,0,Iref) + ICSTDX(2*(J-1)+1,2) = Iref + CALL ADD_PRTN(PXB(J4),PYB(J4),0.5D0*SQS*X1(J4), + & 0.5D0*SQS*X1(J4),0.D0,IFLB(J4),1,0,Iref) + ICSTDX(2*(J-1)+2,2) = Iref +c add parton index to cache + ENDDO + IF(NDEBUG.GT.3) CALL PRNT_PRTN_STCK + + IREJ = 0 + + END +C======================================================================= + + SUBROUTINE FRAG_INCHRNT_DIFF(IDX,LBAD) + +C----------------------------------------------------------------------- +C routine that fragments a diffractive system \FR'15 +C +C INPUT: IDX : parton stack index of 4momentum +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER IDX,LBAD + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + + DOUBLE PRECISION PST,PDIFF,GABE,P2,EE,P1TOT + DIMENSION PST(5),PDIFF(5),GABE(4),P2(4) + INTEGER IDIFF1,IDIFF,IPID,L0,JDIFF,NOLD,LXBAD,K,II + SAVE + + LBAD = 2 + +c references are diff --> diff.hadron --> bm-partons --> tg-partons +c only diff and diff. hadron are read out +c read diff 4momentum from stack + CALL RD_PRTN_4VEC(IDX,PST,IPID,IDIFF1) + CALL RD_PRTN_4VEC(IDIFF1,PDIFF,L0,IDIFF) + +C kinematic variables + EE = PDIFF(5) ! center of mass energy in diff. system + +c set diffraction code of system (1:beam,2:target,3:double) + JDIFF = ABS(IPID)/10 + + IF(NDEBUG.gt.1) WRITE(LUN,*)' FRAG_INCHRNT_DIFF: IDX,EE,L0', + & IDX,EE,L0 + + IPFLAG = -1 + + NOLD = NP + +c diffractive interaction in center-of-mass system of (sea,rmnt)-nuc + CALL SIB_DIFF(L0,JDIFF,EE,0,LXBAD) + IF(LXBAD.ne.0) THEN + IF(NDEBUG.gt.1) + & WRITE(LUN,*)' FRAG_INCHRNT_DIFF: fragmentation rejection' + RETURN + ENDIF + IF(NDEBUG.gt.1) + & WRITE(LUN,*)' FRAG_INCHRNT_DIFF: particles before/after :', + & NOLD,NP + +c boost to hadron - hadron center-of-mass + do ii=1,4 + gabe(ii) = PDIFF(ii)/PDIFF(5) + enddo + DO K=NOLD+1,NP + CALL SIB_ALTRA(gabe(4),gabe(1),gabe(2), + & gabe(3),P(k,1),p(k,2),p(k,3),p(k,4), + & P1TOT,p2(1),p2(2),p2(3),p2(4)) + do ii=1,4 + P(K,ii)=P2(ii) + enddo + ENDDO + + LBAD = 0 + END +C======================================================================= + + SUBROUTINE SAMPLE_MINIJET + & (L,NW,NNJET,NNSOF,NJET,NSOF,X1JET,X2JET,LBAD) + +C----------------------------------------------------------------------- +C routine to sample minijets +C INPUT: L - hadron type (1:nucleon,2:pion or 3:kaon) +C NW - number of hadron-nucleon interactions +C NNJET(1:NW) - number of hard interactions per nucleon +C NNSOF(1:NW) - number of soft interactions per nucleon +C OUTPUT: X1JET - momentum fraction of beam in minijets +C X2JET(1:NW) - momentum fraction of target in minijets +C +C in addition minijets are added to parton stack +C----------------------------------------------------------------------- + IMPLICIT NONE + +c external types + INTEGER L,NW,NNJET,NNSOF,NJET,NSOF,LBAD + DOUBLE PRECISION X1JET,X2JET + + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + INTEGER NW_max + PARAMETER (NW_max = 20) + +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + DOUBLE PRECISION STR_mass_val, STR_mass_val_hyp, STR_mass_sea + COMMON /S_CUTOFF/ STR_mass_val, STR_mass_val_hyp, STR_mass_sea + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + + INTEGER IBMRDX,ITGRDX,IHMJDX,ISMJDX,ICSTDX,IINTDX + COMMON /S_INDX/ IBMRDX(3),ITGRDX(NW_max,3), + & IHMJDX(NW_max*NH_max),IINTDX(NW_max), + & ISMJDX(NW_max*NS_max),ICSTDX(2*NW_max,3) + DIMENSION NNSOF(NW_max),NNJET(NW_max),X2JET(NW_max) + +c internal types + INTEGER NALL,JW,JJ,IREF,IREFG1,IREFG2,NSOF_JW,II + DOUBLE PRECISION X1JJ,X2JJ,PTJET,FI,S_RNDM,SQSHALF,XM, + & X1S,X2S,PTSOF,PZ,EN + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + + if(Ndebug.gt.1) WRITE(LUN,*) + & ' SAMPLE_MINIJETS: (L,NW,NNJET,NNSOF):', + & L,NW,(NNJET(ii),ii=1,nw),(NNSOF(ii),ii=1,nw) + + IF(L.eq.0) THEN + WRITE(LUN,*) 'SAMPLE_minijets: unknown particle? L=',L + CALL SIB_REJECT('SAMPLE_minijets ') + ENDIF + + NJET = 0 + NSOF = 0 + Nall = 0 + X1JET = 0.D0 + DO JW=1,NW +C...hard sea-sea interactions + X2JET(JW) = 0.D0 + DO JJ=1,NNJET(JW) + Nall = Nall+1 + NJET = NJET+1 + CALL SAMPLE_HARD (L,X1Jj,X2Jj,PTJET) + X1JET = X1JET + X1Jj + X2JET(JW) = X2JET(JW)+X2Jj + if(Ndebug.gt.2) THEN + WRITE(LUN,*) + & ' SAMPLE_MINIJETS: hard JJ,JW,X1JET,X2JET(JW):', + & JJ,JW,X1JET,X2JET(JW) + WRITE(LUN,*) + & ' X1,X2,PT:',X1JJ,X2JJ,PTJET + ENDIF + IF ((X2JET(JW).GT.0.9D0).OR.(X1JET.GT.0.9D0)) then + if(Ndebug.gt.2) WRITE(LUN,*) + & ' SAMPLE_MINIJETS: not enough phase space', + & ' (Ncall,Njet,lbad):',Ncall,Njet,lBAD + return + ENDIF + FI = TWOPI*S_RNDM(JJ) + XM = SQS*sqrt(X1jj*X2jj) + SQSHALF = 0.5D0*SQS +c TH = ASIN(MIN((1.D0-EPS8),2.D0*PTJET/XM)) +c add gluon-gluon string to stack + CALL ADD_PRTN + & (0.D0,0.D0,SQSHALF*(X1jj-X2jj),SQSHALF*(X1jj+X2jj), + & XM,100,0,0,Iref) + CALL ADD_INT_REF(Iref,IINTDX(JW)) +c add gluon-gluon system to hard minijet index + IHMJDX(NJET) = Iref +c add gluons to stack + CALL ADD_PRTN(PTJET*COS(FI),PTJET*SIN(FI), + & SQSHALF*X1jj,SQSHALF*X1jj,0.D0,0,1,0,Irefg1) + CALL ADD_PRTN(-PTJET*COS(FI),-PTJET*SIN(FI), + & -SQSHALF*X2jj,SQSHALF*X2jj,0.D0,0,1,Iref,Irefg2) +c set up references +c minijet --> gluon1 --> gluon2 --> minijet + CALL ADD_REF(Irefg1,Irefg2) + CALL ADD_REF(Iref,Irefg1) + + ENDDO + +C...soft sea-sea interactions + NSOF_JW = 0 + DO JJ=1,NNSOF(JW)-1 +c different soft distributions + CALL SAMPLE_SOFT6 (STR_mass_sea,X1S,X2S,PTSOF) + IF ((X2JET(JW)+X2S.LT.0.9D0).AND.(X1JET+X1S.LT.0.9D0)) THEN + NSOF = NSOF+1 + Nall = Nall+1 + NSOF_JW = NSOF_JW+1 + X1JET = X1JET + X1S + X2JET(JW) = X2JET(JW)+X2S +c add to stack +c add gluon-gluon string to stack + XM = SQS*SQRT(X1S*X2S) + SQSHALF = 0.5D0*SQS + PZ = SQSHALF*(X1S-X2S) + EN = SQSHALF*(X1S+X2S) + FI = TWOPI*S_RNDM(JJ) + CALL ADD_PRTN(0.D0,0.D0,PZ,EN,XM,10,0,0,Iref) + CALL ADD_INT_REF(Iref,IINTDX(JW)) +c add gluons to stack +c add gluon-gluon system to soft minijet index + ISMJDX(NSOF) = Iref + CALL ADD_PRTN(PTSOF*COS(FI),PTSOF*SIN(FI), + & SQSHALF*X1S,SQSHALF*X1S,0.D0,0,1,0,Irefg1) + CALL ADD_PRTN(-PTSOF*COS(FI),-PTSOF*SIN(FI), + & -SQSHALF*X2S,SQSHALF*X2S,0.D0,0,1,Iref,Irefg2) +c set up references +c minijet --> gluon1 --> gluon2 --> minijet + CALL ADD_REF(Irefg1,Irefg2) + CALL ADD_REF(Iref,Irefg1) + IF(Ndebug.gt.2)THEN + WRITE(LUN,*) + & ' SAMPLE_MINIJETS: soft JJ,JW,X1JET,X2JET(JW):', + & JJ,JW,X1JET,X2JET(JW) + WRITE(LUN,*) + & ' X1,X2,PT:',X1s,X2s,PTSOF + ENDIF + ELSE + IF(Ndebug.gt.1) WRITE(LUN,*) + & ' SAMPLE_MINIJETS: not enough phase space', + & ' (Ncall,Nsof,lbad):',Ncall,Njet,lBAD + RETURN + ENDIF + ENDDO + NNSOF(JW) = NSOF_JW+1 + ENDDO + lbad = 0 + + END +C======================================================================= + + SUBROUTINE SIB_SIGMA_EXT + & (L0,SQS,SIGT,SIGEL,SIGINEL,SLOPE,RHO) + +C----------------------------------------------------------------------- +C Hadron-proton cross sections +C taken from EXTERNAL(!) interpolation table (calculated elsewhere) +C can be used to run NUCLIB with alternative cross section/int.length +C +C input: L 1,2,3 proton-,pion-,kaon-proton +C SQS sqrt(s) +C +C output: SIGT total cross section (mb) +C SIGEL elastic cross section (mb) +C SIGINEL inelastic cross section (mb) +C SLOPE elastic slope parameter (GeV^-2) +C RHO real/imaginary part of forward amplitude +C----------------------------------------------------------------------- + IMPLICIT NONE + +c external types + DOUBLE PRECISION SQS,SIGT,SIGEL,SIGINEL,SLOPE,RHO + INTEGER L0 + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + +c external cross section tables +C cross sections in model: 23rc1_sib23 + INTEGER K + DOUBLE PRECISION SSIG_TOT(61,3) + DOUBLE PRECISION SSIG(61,3) + DOUBLE PRECISION SSIG_B(61,3) + DOUBLE PRECISION SSIG_RHO(61,3) +c internal type declarations + DOUBLE PRECISION T,AL,ASQSMIN,ASQSMAX,DASQS + INTEGER LL,L,J1,NSQS + DIMENSION LL(39) + SAVE +C proton-proton: +C total cross section + DATA (SSIG_TOT(K,1),K= 1, 61) / + &3.8328D+01,3.8267D+01,3.8435D+01,3.8838D+01,3.9463D+01, + &4.0288D+01,4.1277D+01,4.2391D+01,4.3586D+01,4.4918D+01, + &4.6354D+01,4.7836D+01,4.9394D+01,5.1050D+01,5.2835D+01, + &5.4789D+01,5.6957D+01,5.9392D+01,6.2151D+01,6.5294D+01, + &6.8883D+01,7.2529D+01,7.6458D+01,8.0673D+01,8.5172D+01, + &8.9955D+01,9.5017D+01,1.0035D+02,1.0595D+02,1.1181D+02, + &1.1790D+02,1.2423D+02,1.3077D+02,1.3751D+02,1.4444D+02, + &1.5156D+02,1.5885D+02,1.6631D+02,1.7392D+02,1.8169D+02, + &1.8960D+02,1.9766D+02,2.0584D+02,2.1416D+02,2.2260D+02, + &2.3115D+02,2.3982D+02,2.4860D+02,2.5749D+02,2.6648D+02, + &2.7556D+02,2.8475D+02,2.9403D+02,3.0340D+02,3.1287D+02, + &3.2242D+02,3.3206D+02,3.4179D+02,3.5159D+02,3.6149D+02, + &3.7146D+02/ +C inel. cross section + DATA (SSIG(K,1),K= 1, 61) / + &3.0881D+01,3.1156D+01,3.1540D+01,3.2046D+01,3.2673D+01, + &3.3410D+01,3.4236D+01,3.5126D+01,3.6050D+01,3.7062D+01, + &3.8139D+01,3.9280D+01,4.0476D+01,4.1740D+01,4.3092D+01, + &4.4556D+01,4.6161D+01,4.7937D+01,4.9918D+01,5.2137D+01, + &5.4629D+01,5.7057D+01,5.9635D+01,6.2361D+01,6.5230D+01, + &6.8236D+01,7.1376D+01,7.4643D+01,7.8029D+01,8.1529D+01, + &8.5138D+01,8.8847D+01,9.2654D+01,9.6552D+01,1.0054D+02, + &1.0461D+02,1.0875D+02,1.1298D+02,1.1727D+02,1.2164D+02, + &1.2607D+02,1.3057D+02,1.3512D+02,1.3974D+02,1.4441D+02, + &1.4914D+02,1.5393D+02,1.5877D+02,1.6365D+02,1.6859D+02, + &1.7357D+02,1.7860D+02,1.8368D+02,1.8880D+02,1.9397D+02, + &1.9918D+02,2.0443D+02,2.0972D+02,2.1505D+02,2.2042D+02, + &2.2583D+02/ +C slope parameter + DATA (SSIG_B(K,1),K= 1, 61) / + &1.0828D+01,1.1096D+01,1.1363D+01,1.1629D+01,1.1894D+01, + &1.2159D+01,1.2424D+01,1.2688D+01,1.2953D+01,1.3217D+01, + &1.3482D+01,1.3728D+01,1.3980D+01,1.4237D+01,1.4500D+01, + &1.4770D+01,1.5047D+01,1.5333D+01,1.5632D+01,1.5945D+01, + &1.6278D+01,1.6613D+01,1.6961D+01,1.7324D+01,1.7703D+01, + &1.8100D+01,1.8515D+01,1.8949D+01,1.9404D+01,1.9880D+01, + &2.0378D+01,2.0899D+01,2.1443D+01,2.2010D+01,2.2600D+01, + &2.3212D+01,2.3845D+01,2.4499D+01,2.5173D+01,2.5867D+01, + &2.6579D+01,2.7309D+01,2.8055D+01,2.8819D+01,2.9599D+01, + &3.0394D+01,3.1205D+01,3.2031D+01,3.2870D+01,3.3724D+01, + &3.4590D+01,3.5470D+01,3.6362D+01,3.7266D+01,3.8181D+01, + &3.9109D+01,4.0047D+01,4.0995D+01,4.1955D+01,4.2924D+01, + &4.3903D+01/ +C + DATA (SSIG_RHO(K,1),K= 1, 61) / + &-1.8490D-01,-1.2654D-01,-7.7648D-02,-3.7250D-02,-4.2495D-03, + &2.2457D-02,4.3908D-02,6.1032D-02,7.4637D-02,8.5403D-02, + &9.3897D-02,1.0058D-01,1.0583D-01,1.0995D-01,1.1318D-01, + &1.1571D-01,1.1768D-01,1.1923D-01,1.2044D-01,1.2138D-01, + &1.2212D-01,1.2269D-01,1.2314D-01,1.2349D-01,1.2376D-01, + &1.2398D-01,1.2414D-01,1.2427D-01,1.2437D-01,1.2445D-01, + &1.2451D-01,1.2456D-01,1.2460D-01,1.2463D-01,1.2465D-01, + &1.2467D-01,1.2468D-01,1.2470D-01,1.2470D-01,1.2471D-01, + &1.2472D-01,1.2472D-01,1.2472D-01,1.2473D-01,1.2473D-01, + &1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01/ +C pion-proton: +C total cross section + DATA (SSIG_TOT(K,2),K= 1, 61) / + &2.3119D+01,2.3225D+01,2.3487D+01,2.3867D+01,2.4328D+01, + &2.4886D+01,2.5529D+01,2.6249D+01,2.7038D+01,2.7890D+01, + &2.8802D+01,2.9725D+01,3.0766D+01,3.1961D+01,3.3355D+01, + &3.4994D+01,3.6931D+01,3.9223D+01,4.1928D+01,4.5104D+01, + &4.8811D+01,5.2129D+01,5.5692D+01,5.9498D+01,6.3545D+01, + &6.7832D+01,7.2350D+01,7.7094D+01,8.2059D+01,8.7235D+01, + &9.2612D+01,9.8183D+01,1.0394D+02,1.0987D+02,1.1596D+02, + &1.2221D+02,1.2862D+02,1.3518D+02,1.4188D+02,1.4871D+02, + &1.5568D+02,1.6278D+02,1.7001D+02,1.7735D+02,1.8481D+02, + &1.9239D+02,2.0008D+02,2.0788D+02,2.1578D+02,2.2378D+02, + &2.3189D+02,2.4009D+02,2.4839D+02,2.5679D+02,2.6528D+02, + &2.7386D+02,2.8253D+02,2.9129D+02,3.0014D+02,3.0908D+02, + &3.1810D+02/ +C inel. cross section + DATA (SSIG(K,2),K= 1, 61) / + &1.9941D+01,2.0212D+01,2.0566D+01,2.0995D+01,2.1492D+01, + &2.1955D+01,2.2477D+01,2.3056D+01,2.3685D+01,2.4360D+01, + &2.5076D+01,2.5721D+01,2.6455D+01,2.7304D+01,2.8298D+01, + &2.9466D+01,3.0844D+01,3.2465D+01,3.4364D+01,3.6574D+01, + &3.9128D+01,4.1429D+01,4.3864D+01,4.6428D+01,4.9117D+01, + &5.1926D+01,5.4847D+01,5.7875D+01,6.1006D+01,6.4233D+01, + &6.7551D+01,7.0956D+01,7.4444D+01,7.8010D+01,8.1651D+01, + &8.5363D+01,8.9145D+01,9.2994D+01,9.6906D+01,1.0088D+02, + &1.0491D+02,1.0901D+02,1.1315D+02,1.1736D+02,1.2161D+02, + &1.2592D+02,1.3028D+02,1.3469D+02,1.3915D+02,1.4366D+02, + &1.4821D+02,1.5281D+02,1.5746D+02,1.6215D+02,1.6688D+02, + &1.7166D+02,1.7648D+02,1.8134D+02,1.8625D+02,1.9119D+02, + &1.9618D+02/ +C slope parameter + DATA (SSIG_B(K,2),K= 1, 61) / + &1.0120D+01,1.0270D+01,1.0416D+01,1.0559D+01,1.0698D+01, + &1.0836D+01,1.0971D+01,1.1105D+01,1.1238D+01,1.1371D+01, + &1.1502D+01,1.1435D+01,1.1392D+01,1.1377D+01,1.1395D+01, + &1.1452D+01,1.1549D+01,1.1690D+01,1.1878D+01,1.2118D+01, + &1.2413D+01,1.2781D+01,1.3163D+01,1.3558D+01,1.3967D+01, + &1.4391D+01,1.4829D+01,1.5282D+01,1.5751D+01,1.6236D+01, + &1.6738D+01,1.7256D+01,1.7791D+01,1.8343D+01,1.8912D+01, + &1.9498D+01,2.0100D+01,2.0718D+01,2.1351D+01,2.1999D+01, + &2.2661D+01,2.3338D+01,2.4029D+01,2.4733D+01,2.5451D+01, + &2.6182D+01,2.6926D+01,2.7682D+01,2.8450D+01,2.9231D+01, + &3.0023D+01,3.0827D+01,3.1642D+01,3.2468D+01,3.3305D+01, + &3.4152D+01,3.5010D+01,3.5878D+01,3.6757D+01,3.7645D+01, + &3.8543D+01/ +C + DATA (SSIG_RHO(K,2),K= 1, 61) / + &-6.7332D-02,-3.0879D-02,-5.4256D-04,2.4410D-02,4.4739D-02, + &6.1172D-02,7.4371D-02,8.4920D-02,9.3315D-02,9.9976D-02, + &1.0525D-01,1.0941D-01,1.1269D-01,1.1528D-01,1.1731D-01, + &1.1891D-01,1.2016D-01,1.2115D-01,1.2192D-01,1.2253D-01, + &1.2300D-01,1.2338D-01,1.2367D-01,1.2390D-01,1.2408D-01, + &1.2422D-01,1.2433D-01,1.2442D-01,1.2449D-01,1.2454D-01, + &1.2458D-01,1.2462D-01,1.2464D-01,1.2466D-01,1.2468D-01, + &1.2469D-01,1.2470D-01,1.2471D-01,1.2471D-01,1.2472D-01, + &1.2472D-01,1.2472D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01/ +C kaon-proton: +C total cross section + DATA (SSIG_TOT(K,3),K= 1, 61) / + &1.8299D+01,1.8827D+01,1.9408D+01,2.0016D+01,2.0633D+01, + &2.1318D+01,2.2044D+01,2.2810D+01,2.3615D+01,2.4458D+01, + &2.5339D+01,2.6253D+01,2.7209D+01,2.8235D+01,2.9372D+01, + &3.0683D+01,3.2250D+01,3.4173D+01,3.6576D+01,3.9602D+01, + &4.3417D+01,4.6380D+01,4.9560D+01,5.2954D+01,5.6563D+01, + &6.0384D+01,6.4411D+01,6.8639D+01,7.3062D+01,7.7674D+01, + &8.2464D+01,8.7426D+01,9.2551D+01,9.7831D+01,1.0326D+02, + &1.0883D+02,1.1454D+02,1.2037D+02,1.2634D+02,1.3243D+02, + &1.3864D+02,1.4496D+02,1.5139D+02,1.5793D+02,1.6458D+02, + &1.7133D+02,1.7817D+02,1.8512D+02,1.9215D+02,1.9928D+02, + &2.0650D+02,2.1380D+02,2.2119D+02,2.2867D+02,2.3623D+02, + &2.4387D+02,2.5160D+02,2.5940D+02,2.6728D+02,2.7524D+02, + &2.8328D+02/ +C inel. cross section + DATA (SSIG(K,3),K= 1, 61) / + &1.6131D+01,1.6687D+01,1.7256D+01,1.7835D+01,1.8414D+01, + &1.8990D+01,1.9596D+01,2.0228D+01,2.0887D+01,2.1572D+01, + &2.2282D+01,2.3007D+01,2.3748D+01,2.4525D+01,2.5373D+01, + &2.6337D+01,2.7475D+01,2.8859D+01,3.0574D+01,3.2718D+01, + &3.5399D+01,3.7521D+01,3.9768D+01,4.2138D+01,4.4626D+01, + &4.7228D+01,4.9939D+01,5.2752D+01,5.5666D+01,5.8673D+01, + &6.1770D+01,6.4952D+01,6.8215D+01,7.1555D+01,7.4969D+01, + &7.8453D+01,8.2007D+01,8.5626D+01,8.9308D+01,9.3052D+01, + &9.6855D+01,1.0072D+02,1.0463D+02,1.0861D+02,1.1263D+02, + &1.1671D+02,1.2084D+02,1.2501D+02,1.2924D+02,1.3352D+02, + &1.3784D+02,1.4220D+02,1.4662D+02,1.5107D+02,1.5558D+02, + &1.6012D+02,1.6471D+02,1.6934D+02,1.7401D+02,1.7872D+02, + &1.8348D+02/ +C slope parameter + DATA (SSIG_B(K,3),K= 1, 61) / + &8.8352D+00,9.1363D+00,9.4011D+00,9.6374D+00,9.8515D+00, + &1.0048D+01,1.0230D+01,1.0402D+01,1.0564D+01,1.0720D+01, + &1.0870D+01,1.1058D+01,1.1205D+01,1.1322D+01,1.1419D+01, + &1.1511D+01,1.1611D+01,1.1734D+01,1.1897D+01,1.2116D+01, + &1.2413D+01,1.2781D+01,1.3163D+01,1.3558D+01,1.3967D+01, + &1.4391D+01,1.4829D+01,1.5282D+01,1.5751D+01,1.6236D+01, + &1.6738D+01,1.7256D+01,1.7791D+01,1.8343D+01,1.8912D+01, + &1.9498D+01,2.0100D+01,2.0718D+01,2.1351D+01,2.1999D+01, + &2.2661D+01,2.3338D+01,2.4029D+01,2.4733D+01,2.5451D+01, + &2.6182D+01,2.6926D+01,2.7682D+01,2.8450D+01,2.9231D+01, + &3.0023D+01,3.0827D+01,3.1642D+01,3.2468D+01,3.3305D+01, + &3.4152D+01,3.5010D+01,3.5878D+01,3.6757D+01,3.7645D+01, + &3.8543D+01/ +C + DATA (SSIG_RHO(K,3),K= 1, 61) / + &-2.4506D-02,9.2028D-03,3.5513D-02,5.5961D-02,7.1799D-02, + &8.4036D-02,9.3471D-02,1.0074D-01,1.0632D-01,1.1061D-01, + &1.1391D-01,1.1643D-01,1.1837D-01,1.1986D-01,1.2100D-01, + &1.2187D-01,1.2254D-01,1.2305D-01,1.2345D-01,1.2375D-01, + &1.2398D-01,1.2416D-01,1.2429D-01,1.2439D-01,1.2447D-01, + &1.2453D-01,1.2458D-01,1.2462D-01,1.2464D-01,1.2467D-01, + &1.2468D-01,1.2469D-01,1.2470D-01,1.2471D-01,1.2472D-01, + &1.2472D-01,1.2472D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01,1.2473D-01, + &1.2473D-01/ + + DATA LL /5*0,3*2,4*3,2*1,19*0,6*1/ + + + L = L0 + NSQS = 61 + ASQSMIN = 1.D0 + ASQSMAX = 7.D0 + DASQS = (ASQSMAX-ASQSMIN)/DBLE(NSQS-1) + + IF(NSQS.LE.0) THEN + WRITE(LUN,'(//,1X,A)') + & 'SIB_SIGMA_EXT: interpolation table not initialized.' + STOP + ENDIF + IF(IABS(L).gt.39)THEN + WRITE(LUN,*) + & ' SIB_SIGMA_EXT: unknown beam particle!',L + STOP + ENDIF + IF(L.GT.3) L=LL(IABS(L)) + IF(L.EQ.0)THEN + WRITE(LUN,*) + & ' SIB_SIGMA_EXT: unknown beam particle!', L + STOP + ENDIF + + AL = LOG10(SQS) + J1 = INT((AL-1.D0)*10.D0 + 1) + if((j1.lt.1).or.(j1.gt.NSQS)) then + if (ndebug .gt. 0) + * write (LUN,'(1x,a,i3,1p,e12.3)') + & ' SIB_SIGMA_EXT: energy out of range ',L,sqs + endif + if((j1.lt.1).or.(j1.ge.NSQS)) then + J1 = min(J1,NSQS-1) + J1 = max(J1,1) + endif + T = (AL-1.D0)*10.D0 - DBLE(J1-1) + SIGT = SSIG_TOT(J1,L)*(1.D0-T) + SSIG_TOT(J1+1,L)*T + SIGINEL = SSIG(J1,L)*(1.D0-T) + SSIG(J1+1,L)*T + SIGEL = SIGT-SIGINEL + SLOPE = SSIG_B(J1,L) *(1.D0-T) + SSIG_B(J1+1,L)*T + RHO = SSIG_RHO(J1,L) *(1.D0-T) + SSIG_RHO(J1+1,L)*T + + END +C======================================================================= + + SUBROUTINE SAMPLE_PROJECTILE + + (KID,KINT,LRMNT,XCHG,XJET,XX,PX,PY,IFL,KID1,IREJ) + +C----------------------------------------------------------------------- +C... Subroutine to sample sea and valence quarks in a hadron. +C. variables are stored in xx,px,py and ifl arrays. +C. for each interaction the hadron undergoes there is one +C. pair of partons attached to the ends of two strings +C. (one cut pomeron) +C. In addition flavor and momentum may be set aside for the remnant +C. arrays are filled: rmnt1,rmnt2, c.str1,c.str2, etc.. +C. i.e. positions 1 and 2 are reserved for remnant. +C. +C. Input: KINT : number of interactions the hadron takes part in +C. KID : particle id of hadron +C. LRMNT : remnant excitation flag, +C. defines if valence quarks need to be sampled +C. XCHG : flavor exchange prob. between remnant and +C. central strings +C. XJET : momentum fraction already asigned to minijets +C. IREJ : rejection flag, default set in calling routine +C. +C. Output: XX,IFL,PX,PY : arrays of momentum fractions, flavor +C. and transverse momentum +C. KID1 : new hadron id (in case of flavor exchange) +C------------------------------------------------------------------- + IMPLICIT NONE + +C include COMMONs + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + DOUBLE PRECISION STR_mass_val, STR_mass_val_hyp, STR_mass_sea + COMMON /S_CUTOFF/ STR_mass_val, STR_mass_val_hyp, STR_mass_sea + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + INTEGER ITRY, NREJ + COMMON /S_CNT/ ITRY(20), NREJ(20) + +C input type declarations + INTEGER KID,KINT,LRMNT + DOUBLE PRECISION XCHG,XJET + +C output type declarations + DOUBLE PRECISION XX,PX,PY + INTEGER IFL,KID1,IREJ + DIMENSION XX(2*NW_max+2),PX(2*NW_max+2),PY(2*NW_max+2), + & IFL(2*NW_max+2) + +c local type declarations + INTEGER ICNT1,ICNT2,J,JJ,j1,j2,j3,j4,KRMNT,IRNK, + & IDXVAL,IDX,ISWTD,i,IFLS,NVAL,NSEA,IR,IDUM,IDUM2,KIDA,IMRG2HAD + DOUBLE PRECISION XSEAJET,XVAL,XMINA,XMINA_SEA,GAMMA,XREM,XMINA2, + & XMAX2,ALPHA,XM2DIS,ASUP,XMAX,XQM,S_RNDM, + & CHIDIS,CHI,GAMDIQ,XSUPP,XSUPP1,PAR53_def,PAR5_def,PAR6_def, + & PAR7_def,PAR143_def,XSUM,STR_mass,PTS,XSCL + SAVE + DATA ICNT1,ICNT2 /0,0/ + +C.. initialization + ITRY(3) = 0 + XVAL = 0.D0 + XSCL = 1.D0 + XSEAJET = 0.D0 + XSUM = 0.D0 + DO J=1,KINT ! zero arrays + j1 = 1+2*(j-1) + j2 = j1 + 1 + j3 = 3+2*(j-1) + j4 = j3 + 1 + XX(j1) = 0.D0 + XX(j2) = 0.D0 + XX(j3) = 0.D0 + XX(j4) = 0.D0 + PX(j1) = 0.D0 + PX(j2) = 0.D0 + PX(j3) = 0.D0 + PX(j4) = 0.D0 + ENDDO + + KRMNT = MIN(LRMNT,1) + + IF(ndebug.gt.3) + + WRITE(LUN,*) + + ' SAMPLE_PROJECTILE: KID,KINT,KRMNT,XCHG,XJET,IREJ', + + KID,KINT,KRMNT,XCHG,XJET,IREJ + + KID1 = KID + KIDA = IABS(KID) + +c number of valence quarks to sample +c if remnant is resolved (krmnt=1) no valence pair needed + Nval = 2*(1-KRMNT) + +c number of sea quarks to sample (one pair per interaction) +c if remnant is not resolved then on pair less is needed +c (valence pair takes role of one sea pair) + Nsea = 2*(KINT-(1-KRMNT)) + + IF(ndebug.gt.3) + + WRITE(LUN,*) + + ' SAMPLE_PROJECTILE: number of partons to sample ', + + '(tot,val,sea):',Nval+Nsea,Nval,Nsea + +c change proton splitting to enhance charge exchange by allowing +c ud more often than uu, default scenario is ud,du,uu: 3:1:2 + PAR53_def = PAR(53) + PAR(53) = PAR(84) +c change proton splitting in case no remnant is present + IF(LRMNT.eq.0) PAR(53) = PAR(127) + + 20 ITRY(3) = ITRY(3) + 1 + IF(ITRY(3).gt.NREJ(3)) THEN + ICNT1 = ICNT1 + 1 + IF(ICNT1.lt.10)THEN + if (NDEBUG.gt.0) then + WRITE(LUN,*)' SAMPLE_PROJECTILE: trials exceeded! return..' + WRITE(LUN,*) + + ' KID,KINT,KRMNT,XCHG,XJET,XVAL,IREJ,NCALL', + + KID,KINT,KRMNT,XCHG,XJET,XVAL,IREJ,NCALL + endif + ENDIF + PAR(53) = PAR53_def + RETURN + ENDIF + +C... kinematic limits + 22 XSEAJET = XJET + IF(KRMNT.eq.0)THEN +c minimal momentum fraction for valences + XMINA = 2.D0*STR_mass_val/SQS +c default for valence quarks: 0.35 , xmin@10GeV = 0.07 +c taken from COMMON s_cutoff + IF(ISTR(KIDA)*IBAR(KIDA).ne.0) + & XMINA = 2.D0*STR_mass_val_hyp/SQS + ELSE + IF(IPAR(47).eq.4.or.IPAR(47).eq.4.or.IPAR(47).eq.6)then +c no valence sampling model +c if remnant present then the minimal remnant mass has to be provided + XMINA = PAR(96)*AM(IABS(KID))/SQS + ELSEIF(IPAR(47).lt.4)THEN +c valences sampled, even if combined again in remnant + XMINA = 2.D0*STR_mass_val/SQS + ELSEIF(IPAR(47).eq.7)THEN +c minimal remnant mass not requiered, +c mass is taken from central strings anyway.. + XMINA = AM(IABS(KID))/SQS + ENDIF + ENDIF + +c minimal momentum fraction for sea partons + IF(IPAR(47).eq.0.or.IPAR(47).eq.3)THEN +c same as valence quarks + STR_mass = STR_mass_val + ELSEIF(IPAR(47).eq.1.or.IPAR(47).eq.2.or.IPAR(47).gt.4)THEN +c set by parameter + STR_mass = PAR(87) + ELSEIF(IPAR(47).eq.4)THEN +c same as soft minijets + STR_mass = STR_mass_sea + ENDIF + IF(IPAR(72).eq.2.and.KINT.gt.1)THEN + STR_mass = STR_mass * PAR(118) + ENDIF + XMINA_SEA = 2.D0*STR_mass/SQS +c default for sea quarks: 1.0 , xmin@10GeV = 0.2 +c taken from COMMON s_cutoff or s_cflafr +c should be the same as min. string mass in SAMPLE_SOFT ! + +c dependence on number of interactions + IF(IPAR(72).eq.1.and.KINT.gt.1)THEN + XMINA_SEA = XMINA_SEA * PAR(118) + ENDIF + +C.. check if enough energy left to sample all partons + IF (1.D0-XJET.LT.(Nsea*XMINA_SEA+2.D0*XMINA))THEN + ICNT2 = ICNT2 + 1 + IF(ICNT2.le.10)THEN + IF(NDEBUG.gt.3)THEN + write(lun,*)' SAMPLE_PROJECTILE: rejection!' + write(lun,*)' too little energy to sample all partons!' + write(lun,*)' (NW,Ntot,Nval,Nsea,XMIN,XMIN*N', + & 'XREM,XALL,NCALL,ICNT:)',KINT,nval+nsea,Nval,nsea, + & 2*xmina,nsea*xmina_sea,1.D0-xjet, + & Nsea*XMINA_SEA+2*XMINA,NCALL,ICNT2 + IF(ICNT2.eq.10) write(lun,*)' last warning ! good luck..' + ENDIF + ENDIF + + IREJ = 2 + PAR(53) = PAR53_def + RETURN + ENDIF + + +C... sample sea partons +c if no additional partons need to be sampled +C jump straight to valence quarks + IF(Nsea.EQ.0) GOTO 100 + +C select sea quark model + IF(IPAR(47).eq.0.or.IPAR(47).eq.3.or.IPAR(47).eq.4.or. + & IPAR(47).eq.5.or.IPAR(47).eq.7)THEN + GAMMA = PAR(103) + IF(IPAR(73).eq.1.and.KINT.gt.1) GAMMA = PAR(119) + CALL SAMPLE_SEA_TOT + & (KRMNT,KINT,NSEA,GAMMA,XJET,STR_MASS,XSEAJET,XX) + + ELSEIF(IPAR(47).eq.1)THEN +c sample from 1/x individually then reject if too large + XREM = 0.D0 + XMINA2 = XMINA_SEA ** 2 + XMAX2 = 0.8D0**2 + ALPHA = 1.D0 + DO WHILE ( XREM .lt. 2*XMINA ) + XREM = 1.D0-XJET + IF(NDEBUG.gt.3) + & WRITE(LUN,*) ' N,XREM,XMINA,XMIN2,XMAX2,ALPHA', + & Nsea,XREM,XMINA_SEA,XMINA2,XMAX2,ALPHA + DO j=1,Nsea + jj = 2 + j + IF(KRMNT.eq.0) jj = 4+j + XX(jj) = XM2DIS(XMINA2,XMAX2,ALPHA) + IF(NDEBUG.gt.3) + & WRITE(LUN,*) ' J,X,XREM',JJ,XX(JJ),XREM + XREM = XREM - XX(jj) + ENDDO + ENDDO + XSEAJET = 1.D0-XREM + + ELSEIF(IPAR(47).eq.2.or.IPAR(47).eq.6)THEN +c sample from (1-x)**b / x with common mass constraint + XREM = 1.D0-XJET + XMAX = PAR(88) + ALPHA = PAR(85) + ASUP = PAR(86) + XQM = STR_mass + CALL SAMPLE_SEA_INDV(KRMNT,XMINA,XMINA_SEA,NSEA, + & XREM,ALPHA,ASUP,XQM,XMAX,XX,IR) + IF(IR.ne.0)THEN + IREJ = IR + PAR(53) = PAR53_def + RETURN + ENDIF + + XSEAJET = 1.D0-XREM + ENDIF + +C... sample sea flavor: u,d,s,c +c write to ifl after valences.. + DO J=1+Nval/2,KINT + j3 = 3+2*(j-1) + j4 = j3 + 1 +c turn on strange sea.. + IF(IPAR(29).eq.1)THEN + IF(IPAR(69).ne.0)THEN +c sample asymmetric u,d + IFL(j3) = MIN(2,1+INT((2.D0+PAR(114))*S_RNDM(KID))) +c sample strange + IFLS = 3*(INT((2+PAR(43))*S_RNDM(j3))/2) + IFL(j3) = MAX(IFL(j3),IFLS) + else + IFL(j3) = 1+INT((2.D0+PAR(43))*S_RNDM(j4)) + endif +c sample charm +c scale up for mesons + IF(IPAR(76).eq.1) XSCL=XSCL+(1-IABS(IBAR(KIDA)))*PAR(126) + IF(IFL(j3).eq.3.and.S_RNDM(kid).lt.PAR(97)*PAR(125)*XSCL) + & IFL(j3) = 4 + ELSE + IFL(j3) = INT(1.5D0+S_RNDM(KID)) + ENDIF + IFL(j4) = -IFL(j3) + IF(NDEBUG.gt.3) + & WRITE(LUN,*) ' flavor: JW,FLV1,FLV2',J,IFL(j3),IFL(j4) + +C... sample sea pt + 33 IF(IPAR(49).eq.1)THEN +c in-string pt for sea partons +c flavor and cm energy dependent avg, exponential dist. +c avg pt (defined in subroutine ptsetup ): +c u,d : PAR(46)+PAR(68)*log10(sqs/20.D0)**2 +c s: PAR(47)+PAR(70)*log10(sqs/20.D0)**2 +c diq: PAR(48)+PAR(69)*log10(sqs/20.D0)**2 + CALL PTDIS_4FLV (IFL(j3),PX(j3),PY(j3)) + PX(j4) = -PX(j3) + PY(j4) = -PY(j3) + + ELSEIF(IPAR(49).eq.2)THEN +c 'primordial' pt +c c.m. energy dependent avg, exponential +c same for all flavors +c avg: PAR(49)+PAR(69)*log10(sqs/20.)**2 + CALL PTDIS_4FLV (10,PX(j3),PY(j3)) + PX(j4) = -PX(j3) + PY(j4) = -PY(j3) + + ELSEIF(IPAR(49).eq.3)THEN +c constant pt + PX(j3) = EPS5 + PY(j3) = EPS5 + PX(j4) = -PX(j3) + PY(j4) = -PY(j3) + + ELSEIF(IPAR(49).eq.4)THEN +c sea pt, same as primordial but different params.. +c c.m. energy dependent avg, exponential +c same for all flavors +c avg: PAR(132) + CALL PTDIS_4FLV (30,PX(j3),PY(j3)) + PX(j4) = -PX(j3) + PY(j4) = -PY(j3) + ENDIF +c limit parton virtuality + PTS = MAX(PX(j3)**2+PY(j3)**2,EPS10) + IF((XX(j3)**2+XX(J4)**2)/PTS.lt.8.D0*PAR(122)/S) GOTO 33 + IF(NDEBUG.gt.3) + & WRITE(LUN,*)' pt: JW,PX,PY,pt',J,Px(j3),Py(j3),sqrt(pts) + ENDDO + +C... Prepare the valence partons + 100 XVAL=1.D0-XSEAJET + IF(ndebug.gt.3) + & write(lun,*) ' SAMPLE_PROJECTILE: val. fraction remaining:', + & XVAL + + IF(IPAR(47).eq.7)THEN +c no remnant, sample valence quarks + IF(KRMNT.eq.0) THEN +c enough momentum left? + IF (XVAL.LT.XMINA) goto 20 ! reject sea kinematics + ELSE +c sample remnant + IF(IPAR(53).eq.1)THEN +c momentum dis: x**alpha + IF(S_RNDM(KID).gt.XVAL**(PAR(100)+1)) GOTO 22 + ENDIF +c split remnant momentum into partons, just to fill slots + + ENDIF + ELSE + IF(KRMNT.eq.0.or.IPAR(47).lt.4)THEN + IF (XVAL.LT.XMINA) goto 20 ! reject sea kinematics + ENDIF +c remnant momentum fraction + IF(KRMNT.ne.0.and.IPAR(53).eq.1)THEN + IF(S_RNDM(KID).gt.XVAL**(PAR(100)+1)) GOTO 22 + ENDIF + ENDIF +c valence quarks are in 1,2 of IFL,XX etc. + IDXVAL = 3 + IF(KRMNT.ne.0) IDXVAL = 1 + CALL HSPLI (KID,IFL(IDXVAL),IFL(IDXVAL+1)) + 110 CHI = CHIDIS(KID,IFL(IDXVAL),IFL(IDXVAL+1)) + XX(IDXVAL) = MAX(CHI*XVAL,XMINA) + XX(IDXVAL) = MIN(XX(IDXVAL),XVAL-XMINA) +C FOR MESONS, SPLIT ENERGY SYMMETRICALLY. + IF (IABS(KID).LT.13.AND.S_RNDM(0).LE.0.5D0) + & XX(IDXVAL)=XVAL-XX(IDXVAL) + XX(IDXVAL+1)=XVAL-XX(IDXVAL) + IF(ndebug.gt.3) + & write(lun,*) ' SAMPLE_PROJECTILE: val. sampled (x1,x2):', + & XX(IDXVAL),XX(IDXVAL+1) +c for baryons force diq distribution + IF(IBAR(IABS(KID)).ne.0.and.IPAR(47).ne.7)THEN + IF(IPAR(52).eq.1)THEN + GAMDIQ=PAR(95) + IF(S_RNDM(KID).gt.XX(IDXVAL+1)**(GAMDIQ+1)) GOTO 110 + ELSE + IF(KRMNT.eq.0.or.IPAR(47).lt.4.and.IPAR(53).eq.0)THEN +c force diquark distribution + GAMDIQ=PAR(95) + IF(S_RNDM(KID).gt.XX(IDXVAL+1)**(GAMDIQ+1)) GOTO 20 + ENDIF + ENDIF + ENDIF +C... val. quark transverse momentum + CALL PTDIS_4FLV (10,PX(IDXVAL),PY(IDXVAL)) + PX(IDXVAL+1) = -PX(IDXVAL) + PY(IDXVAL+1) = -PY(IDXVAL) + IF(ndebug.gt.3) + & write(lun,*) ' SAMPLE_PROJECTILE: val. pt (px,py):', + & PX(IDXVAL),PY(IDXVAL) + +C... exchange flavor between central strings and remnant +c there is one pair of strings for each interaction with another hadron +c in general allowed for both flavors but diquarks usually strongly suppressed +c Xchg : prob. of flv exchange between strgs and rmnt + IF(KRMNT.ne.0)THEN + do idx=1,2 + iswtd = 0 + i = 1 + XSUPP = 1.D0 + IF(iabs(ifl(idx)).gt.10)THEN +c suppress exchange of diq: prob_exchange = prob0 * xsupp + XSUPP = PAR(83) + ELSEIF(IPAR(46).eq.2)THEN +c suppress exchange for fast quark ( usually in mesons ) + IF(xx(idx).gt.xx(3-idx)) XSUPP = PAR(139) + ENDIF + DO WHILE (ISWTD.eq.0.and.i.le.KINT) +c sea flavor index + jj = idx+2*i +c forbid exchange for charmed hadrons if sea pair is charmed too +c needed to avoid double charmed particles + XSUPP1 = XSUPP + IF(IABS(KID).gt.50.and.IABS(IFL(JJ)).eq.4) XSUPP1 = 0.D0 + if(S_RNDM(I).lt.XCHG*XSUPP1) THEN +c exchange flavor between remnant and sea + CALL ISWTCH_LMNTS(ifl(jj),ifl(idx)) +c also exchange momentum fraction + IF(IPAR(46).ne.0) CALL SWTCH_LMNTS(xx(jj),xx(idx)) +c change flavor id accordingly, i.e. reassamble remnant from new flavor + IF(IPAR(58).eq.0)THEN +c combine to any hadron that matches flavor wise, ignoring (iso)spin + CALL SIB_I4FLAV(ifl(1),ifl(2),idum,idum2,KID1) + ELSEIF(IPAR(58).eq.1)THEN +c combine to lightest hadron + KID1 = IMRG2HAD(IFL(1),IFL(2)) + ELSEIF(IPAR(58).eq.2.or.IPAR(58).eq.3)THEN +c combine to any hadron that matches flavor wise, ignoring (iso)spin +c set vector meson rate + PAR5_def = PAR(5) + PAR(5) = PAR(104) +c set strange vector rate + PAR6_def = PAR(6) + PAR(6) = PAR(121) +c set spin3/2 vs spin1/2 rate + PAR7_def = PAR(7) + PAR(7) = PAR(105) +c set rho / omega-phi rate + PAR143_def = PAR(143) + if(ibar(iabs(kb)).eq.0.and.IPAR(85).eq.1) + & PAR(143) = PAR(145) + irnk = 0 + IF(IPAR(58).eq.3) irnk = 1 + CALL SIB_I4FLAV(ifl(1),ifl(2),irnk,idum2,KID1) + PAR(5) = PAR5_def + PAR(6) = PAR6_def + PAR(7) = PAR7_def + PAR(143) = PAR143_def + +c reject spin1,isospin singlett + IF(KID1.eq.32.and.PAR(111).gt.S_RNDM(KID1)) + & KID1 = 27 + ENDIF + iswtd = 1 + endif + i = i + 1 + ENDDO + enddo + ENDIF + IF(ndebug.gt.3)THEN + WRITE(LUN,*)' SAMPLE_PROJECTILE: rmnt PID,NTRY: ',KID1,ITRY(3) + WRITE(LUN,*)' SAMPLE_PROJECTILE: output: I,FLV,PX,PY,X,XSUM' + ENDIF + XSUM = XJET + DO j=IDXVAL,2*(KINT+Krmnt)+2*(1-Krmnt) + XSUM = XSUM + XX(j) + IF(NDEBUG.gt.3) WRITE(LUN,*) j,IFL(j),PX(J),PY(J),XX(j),XSUM + ENDDO + IF(ABS(XSUM-1.D0).gt.EPS3) THEN + WRITE(LUN,*)' SAMPLE_PROJECTILE: parton sum incomplete!', + & '(ID,XSUM,NCALL):' , KID1,XSUM, NCALL,' aborting..' + CALL SIB_REJECT('SAMPLE_PROJECTIL') + ENDIF + IREJ = 0 + + END +C======================================================================= + + SUBROUTINE DECSIB + +C----------------------------------------------------------------------- +C...Decay all unstable particle in Sibyll +C. decayed particle have the code increased by 10000 +C +C changed to allow for multiple calls to DECSIB in one event +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + DOUBLE PRECISION CBR + INTEGER KDEC,LBARP,IDB + COMMON /S_CSYDEC/ CBR(223+16+12+8), KDEC(1338+6*(16+12+8)), + & LBARP(99), IDB(99) +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + INTEGER LLIST1 + COMMON /S_PLIST1/ LLIST1(8000) + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + INTEGER LRNK + COMMON /SIB_RNK/ LRNK(8000) + DIMENSION P0(5), LL(10), PD(10,5) + SAVE + +c call pythia decay routine +c IF(IPAR(44).eq.1) CALL PYDEC + +c decay with sibyll + NN = 1 + IF(IPAR(44).ne.1)THEN + DO J=1,NP + LLIST1(J) = 0 + ENDDO + ENDIF + DO WHILE (NN .LE. NP) + L= LLIST(NN) + LA = IABS(L) + if(LA.lt.100) then + IF (IDB(LA) .GT. 0) THEN + DO K=1,5 + P0(K) = P(NN,K) + ENDDO + CALL DECPAR (L,P0,ND,LL,PD) + LLIST(NN) = LLIST(NN)+ISIGN(10000,LLIST(NN)) + DO J=1,ND + NP = NP+1 + if(NP.gt.8000) then + write(LUN,'(1x,a,2i8)') + & ' DECSIB: no space left in S_PLIST (NP,ND):',NP,ND + NP = NP-1 + return + endif + DO K=1,5 + P(NP,K) = PD(J,K) + ENDDO + LLIST(NP)=LL(J) + LLIST1(NP)=NN + LRNK(NP)=LRNK(NN) + NPORIG(NP)= NPORIG(NN) + niorig(NP)= NIORIG(NN) + NFORIG(NP) = L + ENDDO + ENDIF + endif + NN = NN+1 + ENDDO + +c CALL SIB_LIST(20) + + END +C======================================================================= + + SUBROUTINE SIB_SIGMA_HP + & (L0,SQS,SIGT,SIGEL,SIGINEL,SIGDIF,SLOPE,RHO) + +C----------------------------------------------------------------------- +C Hadron-proton cross sections, taken from interpolation table +C calculated by SIBYLL_INI +C +C input: L 1 proton-proton +C 2 pi-proton +C 3 K-proton +C SQS sqrt(s) +C +C output: SIGT total cross section (mb) +C SIGEL elastic cross section (mb) +C SIGINEL inelastic cross section (mb) +C SIGDIF diffraction dissociation CS (mb) +C SLOPE elastic slope parameter (GeV^-2) +C RHO real/imaginary part of forward amplitude +C----------------------------------------------------------------------- +Cf2py integer, intent(in) :: L0 +Cf2py double precision, intent(in) :: SQS +Cf2py double precision, intent(out) :: SIGT,SIGEL,SIGINEL,SLOPE,RHO +Cf2py double precision(3), intent(out) :: SIGDIF + IMPLICIT NONE + +c external types + DOUBLE PRECISION SQS,SIGT,SIGEL,SIGINEL,SIGDIF,SLOPE,RHO + DIMENSION SIGDIF(3) + INTEGER L0 + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + + DOUBLE PRECISION SSIG,PJETC,SSIGN,SSIGNSD,SSIGNEL,ALINT,ASQSMIN, + & ASQSMAX,DASQS + INTEGER NSQS + COMMON /S_CCSIG/ SSIG(61,3), PJETC(0:NS_max,0:NH_max,61,2), + & SSIGN(61,3,3), SSIGNSD(61,3,3), SSIGNEL(61,3,3), + & ALINT(61,3,3), ASQSMIN, ASQSMAX, DASQS, NSQS + DOUBLE PRECISION SSIG_TOT,SSIG_SD1,SSIG_SD2,SSIG_DD,SSIG_B, + & SSIG_RHO + COMMON /S_CCSIG2/ SSIG_TOT(61,3),SSIG_SD1(61,3),SSIG_SD2(61,3), + & SSIG_DD(61,3),SSIG_B(61,3),SSIG_RHO(61,3) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + +c internal type declarations + DOUBLE PRECISION T,AL + INTEGER LL,L,J1 + DIMENSION LL(39) + SAVE + DATA LL /5*0,3*2,4*3,2*1,19*0,6*1/ + + + L = L0 + IF(NSQS.LE.0) THEN + WRITE(LUN,'(//,1X,A)') + & ' SIB_SIGMA_HP: interpolation table not initialized.' + STOP + ENDIF + IF(IABS(L).gt.39)THEN + WRITE(LUN,*) + & ' SIB_SIGMA_HP: unknown beam particle!',L + STOP + ENDIF + IF(L.GT.3) L=LL(IABS(L)) + IF(L.EQ.0)THEN + WRITE(LUN,*) + & ' SIB_SIGMA_HP: unknown beam particle!', L + STOP + ENDIF + + AL = LOG10(SQS) + J1 = INT((AL-1.D0)*10.D0 + 1) + if((j1.lt.1).or.(j1.gt.NSQS)) then + if(ndebug.gt.0) + & write (LUN,'(1x,a,i3,1p,e12.3)') + & ' SIB_SIGMA_HP: energy out of range ',L,sqs + endif + if((j1.lt.1).or.(j1.ge.NSQS)) then + J1 = min(J1,NSQS-1) + J1 = max(J1,1) + endif + T = (AL-1.D0)*10.D0 - DBLE(J1-1) + SIGT = SSIG_TOT(J1,L)*(1.D0-T) + SSIG_TOT(J1+1,L)*T + SIGINEL = SSIG(J1,L)*(1.D0-T) + SSIG(J1+1,L)*T + SIGEL = SIGT-SIGINEL + SIGDIF(1) = SSIG_SD1(J1,L)*(1.D0-T) + SSIG_SD1(J1+1,L)*T + SIGDIF(2) = SSIG_SD2(J1,L)*(1.D0-T) + SSIG_SD2(J1+1,L)*T + SIGDIF(3) = SSIG_DD(J1,L)*(1.D0-T) + SSIG_DD(J1+1,L)*T + SLOPE = SSIG_B(J1,L) *(1.D0-T) + SSIG_B(J1+1,L)*T + RHO = SSIG_RHO(J1,L) *(1.D0-T) + SSIG_RHO(J1+1,L)*T + + END + +C======================================================================= + + SUBROUTINE SIB_SIGMA_HP2 + + (L,SQS,SIGT,SIGEL,SIGINEL,SIGDIF,SLOPE,RHO) + +C----------------------------------------------------------------------- +C Hadron-proton cross sections, taken from interpolation table +C calculated by SIBYLL_INI +C +C input: L 1 proton-proton +C 2 pi-proton +C 3 K-proton +C SQS sqrt(s) +C +C output: SIGT total cross section (mb) +C SIGEL elastic cross section (mb) +C SIGINEL inelastic cross section (mb) +C SIGDIF diffraction dissociation CS (mb) +C split in high and low mass !! +C ( taken from S_CCSIG3 ) +C SLOPE elastic slope parameter (GeV^-2) +C RHO real/imaginary part of forward amplitude +C----------------------------------------------------------------------- + IMPLICIT NONE +c external types + DOUBLE PRECISION SQS,SIGT,SIGEL,SIGINEL,SIGDIF,SLOPE,RHO + DIMENSION SIGDIF(3,2) + INTEGER L + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + + DOUBLE PRECISION SSIG,PJETC,SSIGN,SSIGNSD,SSIGNEL,ALINT,ASQSMIN, + & ASQSMAX,DASQS + INTEGER NSQS + COMMON /S_CCSIG/ SSIG(61,3), PJETC(0:NS_max,0:NH_max,61,2), + & SSIGN(61,3,3), SSIGNSD(61,3,3), SSIGNEL(61,3,3), + & ALINT(61,3,3), ASQSMIN, ASQSMAX, DASQS, NSQS + DOUBLE PRECISION SSIG_TOT,SSIG_SD1,SSIG_SD2,SSIG_DD,SSIG_B, + & SSIG_RHO + COMMON /S_CCSIG2/ SSIG_TOT(61,3),SSIG_SD1(61,3),SSIG_SD2(61,3), + & SSIG_DD(61,3),SSIG_B(61,3),SSIG_RHO(61,3) + DOUBLE PRECISION SSIG_SD1LM,SSIG_SD1HM,SSIG_SD2LM,SSIG_SD2HM, + & SSIG_DDLM,SSIG_DDHM + COMMON /S_CCSIG3/ SSIG_SD1LM(61,3),SSIG_SD1HM(61,3), + & SSIG_SD2LM(61,3),SSIG_SD2HM(61,3), + & SSIG_DDLM(61,3),SSIG_DDHM(61,3) + +c internal types + INTEGER J1 + DOUBLE PRECISION T,AL + SAVE + + IF(NSQS.LE.0) THEN + WRITE(LUN,'(//,1X,A)') + & ' SIB_SIGMA_HP2: interpolation table not initialized.' + STOP + ENDIF + + AL = dLOG10(SQS) + J1 = INT((AL - 1.D0)*10.D0 + 1) + if((j1.lt.1).or.(j1.gt.NSQS)) then + if(ndebug.gt.0)write(LUN,'(1x,a,i3,1p,e12.3)') + & ' SIB_SIGMA_HP2: energy out of range ',L,sqs + endif + if((j1.lt.1).or.(j1.ge.NSQS)) then + J1 = min(J1,NSQS-1) + J1 = max(J1,1) + endif + T = (AL-1.D0)*10.D0 - DBLE(J1-1) + SIGT = SSIG_TOT(J1,L)*(1.D0-T) + SSIG_TOT(J1+1,L)*T + SIGINEL = SSIG(J1,L)*(1.D0-T) + SSIG(J1+1,L)*T + SIGEL = SIGT-SIGINEL + SIGDIF(1,1) = SSIG_SD1LM(J1,L)*(1.D0-T) + SSIG_SD1LM(J1+1,L)*T + SIGDIF(1,2) = SSIG_SD1HM(J1,L)*(1.D0-T) + SSIG_SD1HM(J1+1,L)*T + SIGDIF(2,1) = SSIG_SD2LM(J1,L)*(1.D0-T) + SSIG_SD2LM(J1+1,L)*T + SIGDIF(2,2) = SSIG_SD2HM(J1,L)*(1.D0-T) + SSIG_SD2HM(J1+1,L)*T + SIGDIF(3,1) = SSIG_DDLM(J1,L)*(1.D0-T) + SSIG_DDLM(J1+1,L)*T + SIGDIF(3,2) = SSIG_DDHM(J1,L)*(1.D0-T) + SSIG_DDHM(J1+1,L)*T + SLOPE = SSIG_B(J1,L) *(1.D0-T) + SSIG_B(J1+1,L)*T + RHO = SSIG_RHO(J1,L) *(1.D0-T) + SSIG_RHO(J1+1,L)*T + + END + +C======================================================================= + + SUBROUTINE SIB_SIGMA_HAIR (L,SQS,SIGprod,SIGbdif) + +C----------------------------------------------------------------------- +C Hadron-air cross sections, taken from interpolation table +C calculated by SIBYLL_INI +C +C input: L 1 proton-air +C 2 pi-air +C 3 K-air +C SQS sqrt(s) +C +C output: SIGprod particle production cross section (mb) +C SIGbdif q.ela and ela beam diff. cross section +C----------------------------------------------------------------------- +Cf2py integer, intent(in) :: L +Cf2py double precision, intent(in) :: SQS +Cf2py double precision, intent(out) :: SIGprod,SIGbdif + IMPLICIT NONE + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + + DOUBLE PRECISION SSIG,PJETC,SSIGN,SSIGNSD,SSIGNEL,ALINT,ASQSMIN, + & ASQSMAX,DASQS + INTEGER NSQS + COMMON /S_CCSIG/ SSIG(61,3), PJETC(0:NS_max,0:NH_max,61,2), + & SSIGN(61,3,3), SSIGNSD(61,3,3), SSIGNEL(61,3,3), + & ALINT(61,3,3), ASQSMIN, ASQSMAX, DASQS, NSQS + +c external + DOUBLE PRECISION SQS,SIGPROD,SIGBDIF + INTEGER L + +c internal + DOUBLE PRECISION AL,T + INTEGER J1 + SAVE + + IF(NSQS.LE.0) THEN + WRITE(LUN,'(//,1X,A)') + & ' SIB_SIGMA_HAIR: interpolation table not initialized.' + STOP + ENDIF + + AL = LOG10(SQS) + J1 = INT((AL - 1.D0)*10.D0 + 1) + if((j1.lt.1).or.(j1.gt.NSQS)) then + if (ndebug .gt. 0) + & write (LUN,'(1x,a,i3,1p,e12.3)') + & ' SIB_SIGMA_HAIR: energy out of range ',L,sqs + endif + if((j1.lt.1).or.(j1.ge.NSQS)) then + J1 = min(J1,NSQS-1) + J1 = max(J1,1) + endif + T = (AL-1.D0)*10.D0 - DBLE(J1-1) + SIGprod = SSIGN(J1,L,1)*(1.D0-T) + SSIGN(J1+1,L,1)*T + SIGbdif = SSIGNSD(J1,L,1)*(1.D0-T) + SSIGNSD(J1+1,L,1)*T + + END +C======================================================================= + SUBROUTINE SIB_SIGMA_HNUC (L,IAT,SQS,SIGprod,SIGbdif,SIGela) + +C----------------------------------------------------------------------- +C calculate Hadron-nucleus cross sections +C +C input: L 1 proton-nuc +C 2 pi-nuc +C 3 K-nuc +C IAT 0-18 mass number of target nucleus +C (beyond A=18 nuclear profiles are inaccurate) +C SQS sqrt(s) +C +C output: SIGprod particle production cross section (mb) +C SIGbdif q.ela and ela beam diff. cross section +C SIGela elastic cross section +C----------------------------------------------------------------------- +Cf2py integer, intent(in) :: L,IAT +Cf2py double precision, intent(in) :: SQS +Cf2py double precision, intent(out) :: SIGprod,SIGbdif,SIGela + IMPLICIT NONE + + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + DOUBLE PRECISION SSIG,PJETC,SSIGN,SSIGNSD,SSIGNEL,ALINT,ASQSMIN, + & ASQSMAX,DASQS + INTEGER NSQS + COMMON /S_CCSIG/ SSIG(61,3), PJETC(0:NS_max,0:NH_max,61,2), + & SSIGN(61,3,3), SSIGNSD(61,3,3), SSIGNEL(61,3,3), + & ALINT(61,3,3), ASQSMIN, ASQSMAX, DASQS, NSQS + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + DOUBLE PRECISION SIGT,SIGEL,SIGINEL,SIGQE,SIGSD,SIGQSD,SIGPPT, + & SIGPPEL,SIGPPSD + INTEGER ITG + COMMON /NUCSIG/ SIGT,SIGEL,SIGINEL,SIGQE,SIGSD, + + SIGQSD,SIGPPT,SIGPPEL,SIGPPSD,ITG + +c external + DOUBLE PRECISION SQS,SIGPROD,SIGBDIF,SIGELA + INTEGER L,IAT + +c internal + DOUBLE PRECISION ALAM,T,AL + INTEGER IPARM,ICSMOD,IK,J1 + SAVE + IF(NSQS.LE.0) THEN + WRITE(LUN,'(//,1X,A)') + & ' SIB_SIGMA_HNUC: interpolation table not initialized.' + STOP + ENDIF + IF(IAT.eq.0.or.IAT.eq.14.or.IAT.eq.16)THEN +c read cross section from table + IF(IAT.eq.0) THEN + IK=1 + ELSEIF(IAT.eq.14)THEN + IK=2 + ELSE + IK=3 + ENDIF + AL = LOG10(SQS) + J1 = INT((AL - 1.D0)*10.D0 + 1) + if((j1.lt.1).or.(j1.gt.NSQS)) then + if (ndebug .gt. 0) + & write (LUN,'(1x,a,i3,1p,e12.3)') + & ' SIB_SIGMA_HNUC: energy out of range ',L,sqs + endif + if((j1.lt.1).or.(j1.ge.NSQS)) then + J1 = min(J1,NSQS-1) + J1 = max(J1,1) + endif + T = (AL-1.D0)*10.D0 - DBLE(J1-1) + SIGprod = SSIGN(J1,L,IK)*(1.D0-T) + SSIGN(J1+1,L,IK)*T + SIGbdif = SSIGNSD(J1,L,IK)*(1.D0-T) + SSIGNSD(J1+1,L,IK)*T + SIGela = SSIGNEL(J1,L,IK)*(1.D0-T) + SSIGNEL(J1+1,L,IK)*T + ELSEIF(IAT.lt.19)THEN +c calculate cross section + IF(ndebug.gt.0)THEN + WRITE(LUN,'(1X,A,2I4,F8.2)') + & 'SIB_SIGMA_HNUC: L,IAT,SQS:',L,IAT,SQS + ENDIF +c calculate hadron - nucleus cross section +c dummy arg, coupling derived from dif xsctn + ALAM = 1.D0 +c use Sibyll p-p cross section as input + ICSMOD = 1 +c use Goulianos param. for inel. coupling param. + IPARM = 2 + CALL SIG_HAD_NUC(L,IAT,SQS,ALAM,ICSMOD,IPARM) +C particle production cross section + SIGprod = SIGT-SIGQE +C quasi elastic + elastic singl. diff cross section + SIGbdif = SIGQSD +c elastic cross section + SIGela = SIGel + if(ndebug.gt.0)THEN + WRITE(LUN,'(1X,A,3F8.2)') + & 'SIB_SIGMA_HNUC: SIGprod, SIGbdif, ALAM:', + & SIGprod, SIGbdif, ALAM + ENDIF + ELSE + WRITE(LUN,'(//,1X,A)') + & ' SIB_SIGMA_HNUC: number of target nucleons too large!', + & ' (0<=IAT<=18)' + SIGprod = -1.D0 + ENDIF + RETURN + END + +C---------------------------------------------------------------------- +C sampling routines for hard partons in SIBYLL +C includes GRV98 pdf table and initialization routines +C---------------------------------------------------------------------- +C======================================================================= + + SUBROUTINE SAMPLE_HARD (L,X1,X2,PT) + +C----------------------------------------------------------------------- +C...Routine for sampling the kinematical variables +C. that determine a jet-jet (gluon - gluon) system (x1,x2, pT) +C. from the differential cross section: +C. d3sigma/(dx1 dx2 dpT) +C. This version assumes the `single parton approximation' +C. INPUT: L=1 incident proton, L=2 incident pi +C. NPLD: position on parton stack +C. OUTPUT: gluon 4momenta +C----------------------------------------------------------------------- + IMPLICIT NONE + +c external types + INTEGER L + DOUBLE PRECISION X1,X2,PT + + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN +c internal types + DOUBLE PRECISION Z1,Z2,SIG,S_RNDM,Q2,ZSAMPLE + SAVE + + IF(ndebug.gt.2)then + write(lun,*) ' SAMPLE_HARD: (SQS,S,PTmin,Xmin,Zmin)', + & SQS,S,PTmin,Xmin,Zmin + endif + + 100 Z1=ZSAMPLE (ZMIN,L) ! beam L=1,2 for proton or pion + Z2=ZSAMPLE (ZMIN,1) ! target always a nucleon + SIG=1.D0-XMIN*dEXP(-Z1-Z2) + IF (SIG .LT. S_RNDM(0)) GOTO 100 + X1=dEXP(Z1) + X2=dEXP(Z2) + IF (X1.gt.0.9D0.or.X2.gt.0.9D0) GOTO 100 + Q2=PTmin**2/(1.D0-S_RNDM(L)*SIG) + IF(Q2.gt.S*X1*X2) goto 100 + PT=dSQRT(Q2*(1.D0-Q2/(S*X1*X2))) + + IF(ndebug.gt.2)then + write(lun,*) ' SAMPLE_HARD: (X1,X2,PT)', + & X1,X2,PT + endif + + RETURN + END + +C======================================================================= + + FUNCTION ZSAMPLE (ZMIN,L) + +C----------------------------------------------------------------------- +C...This function returns as output a value z=log(x) +C. distributed as f(x) = g(x) + 4/9 *(q(x) + qbar(x)) +C. from a minimum value ZMIN to 0, +C. for a proton (L=1) or a pi (L=2) +C. needs to be initialised with: CALL ZSAMPLE_INI +C..................................................... + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + COMMON /S_CZGEN/ XA(2),XB(2),XMAX,ZA(2),ZB(2),ZMAX, + + DX(2),DZ(2),APART(2),FFA(2),FFB(2), + + DFX(2),DFZ(2),XX(200,2),ZZ(200,2),FFX(200,2),FFZ(200,2), + + NX,NZ + PARAMETER (b=0.268D0) + PARAMETER (bpi=3.7D0) + PARAMETER (cpi=0.698D0) + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + SAVE + + F = PART_INT(ZMIN,L)*S_RNDM(0) + IF (F .GE. FFA(L)) THEN + IF(IPAR(8).EQ.0)THEN + ZSAMPLE = ZA(L) - (F-FFA(L))/APART(L) + ELSE + if(L.eq.1) then + ZSAMPLE = -1.D0/b * dLOG( 1.D0 - F / APART(L) ) + else + ZSAMPLE = -1.D0 * ( (F - cpi)/APART(L) )**(1.D0/bpi) + endif + ENDIF + ELSE IF (F .GE. FFB(L)) THEN + JF = INT((F-FFB(L))/DFZ(L) + 1.D0) + JF = min(JF,199) + F0 = FFB(L) + DFZ(L)*DBLE(JF-1) + T = (F-F0)/DFZ(L) + ZSAMPLE = ZZ(JF,L)*(1.D0-T)+ZZ(JF+1,L)*T + ELSE + JF = INT(F/DFX(L)+1.D0) + JF = min(JF,199) + F0 = DFX(L)*DBLE(JF-1) + T = (F-F0)/DFX(L) + X = XX(JF,L)*(1.D0-T)+XX(JF+1,L)*T + ZSAMPLE = dLOG(X) + ENDIF + + RETURN + END + +C======================================================================= + + FUNCTION PART_INT (ZMIN,L) + +C----------------------------------------------------------------------- +C...This function returns as output the integral of +C. the parton structure function: +C. f(x) = g(x) + 4/9 *(q(x) + qbar(x)) +C. from xmin = exp(zmin) to 1 +C. for a proton (L=1) or a pi (L=2) +C. needs to be initialised with: CALL ZSAMPLE_INI +C..................................................... + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + COMMON /S_CZGEN/ XA(2),XB(2),XMAX,ZA(2),ZB(2),ZMAX, + + DX(2),DZ(2),APART(2),FFA(2),FFB(2), + + DFX(2),DFZ(2),XX(200,2),ZZ(200,2),FFX(200,2),FFZ(200,2), + + NX,NZ + DOUBLE PRECISION b,bpi,cpi + PARAMETER (b=0.268D0) + PARAMETER (bpi=3.7D0) + PARAMETER (cpi=0.698D0) + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + SAVE + + IF (ZMIN .LT. ZA(L)) THEN + IF(IPAR(8).EQ.0)THEN + PART_INT = FFA(L) + APART(L) * (ZA(L) - ZMIN) + ELSE + if(L.eq.1) then + PART_INT = APART(L) * ( 1.D0 - dEXP(-b*ZMIN) ) + else + PART_INT = APART(L) * ( -ZMIN )**bpi + cpi + endif + ENDIF + ELSE IF (ZMIN .LT. ZB(L)) THEN + JZ = INT((ZB(L)-ZMIN)/DZ(L)+1.D0) + JZ = min(JZ,199) + Z0 = ZB(L)-DZ(L)*DBLE(JZ-1) + T = (Z0-ZMIN)/DZ(L) + PART_INT = FFZ(JZ,L)*(1.D0-T) + FFZ(JZ+1,L)*T + + ELSE + X = EXP(ZMIN) + JX = INT((XMAX-X)/DX(L)+1.D0) + JX = min(JX,199) + X0 = XMAX-DX(L)*DBLE(JX-1) + T = (X0-X)/DX(L) + PART_INT = FFX(JX,L)*(1.D0-T) + FFX(JX+1,L)*T + + ENDIF + RETURN + END + +C======================================================================= + + SUBROUTINE GRV_INI + +C----------------------------------------------------------------------- +C...This subroutine initializes the COMMON block +C used for sampling z, according to the GRV98LO +C pdf set +C.................................................. + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + COMMON /S_CZGEN/ XA(2),XB(2),XMAX,ZA(2),ZB(2),ZMAX, + + DX(2),DZ(2),APART(2),FFA(2),FFB(2), + + DFX(2),DFZ(2),XX(200,2),ZZ(200,2),FFX(200,2),FFZ(200,2), + + NX,NZ + DOUBLE PRECISION b,bpi,cpi + PARAMETER (b=0.268D0) + PARAMETER (bpi=3.7D0) + PARAMETER (cpi=0.698D0) + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + SAVE + + IPAR(8) = 1 + + XA(1) = 1.D-06 + XB(1) = 1.D-01 + + XA(2) = 1.D-04 + XB(2) = 1.D-01 + + XMAX = 0.8D0 + ZMAX = dLOG(XMAX) + NX = 200 + NZ = 200 + + DO L=1,2 + + ZA(L) = dLOG(XA(L)) + ZB(L) = dLOG(XB(L)) + DX(L) = (XMAX-XB(L))/DBLE(NX) + DZ(L) = (ZB(L)-ZA(L))/DBLE(NZ) + +C large x: interpolation in x + FFX(1,L) = 0.D0 + DO J=2,NX + X = XMAX - DX(L)*(DBLE(J)-1.D0) + G = PARTON(X,L)/X + FFX(J,L) = FFX(J-1,L)+G*DX(L) + ENDDO + CALL INVERT_ARRAY (FFX(1,L),XMAX,-DX(L),NX,XX(1,L),FMIN,DFX(L)) + +C small x: interpolation in log(x) + FFZ(1,L) = FFX(NX,L) + DO J=2,NZ + Z = ZB(L) - DZ(L)*(DBLE(J)-1.D0) + X = dEXP(Z) + G = PARTON(X,L) + FFZ(J,L) = FFZ(J-1,L)+G*DZ(L) + ENDDO + CALL INVERT_ARRAY(FFZ(1,L),ZB(L),-DZ(L),NZ,ZZ(1,L),FMIN,DFZ(L)) + FFA(L) = FFZ(NZ,L) + FFB(L) = FFX(NX,L) + +C very small x: f(x) = A/x**b b=1.268 + IF(L.eq.1) THEN + APART(L) = FFA(L) / ( 1.D0 - dEXP(-b*ZA(L)) ) + ELSE + APART(L) = ( FFA(L) - cpi ) / ( -ZA(L) )**bpi + ENDIF + ENDDO + + RETURN + END + +C======================================================================= + + SUBROUTINE ZSAMPLE_INI + +C----------------------------------------------------------------------- +C...This subroutine initialise the generation of +C. z = log(x) for the generation of z according +C. to the structure functions +C.................................................. + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + COMMON /S_CZGEN/ XA(2),XB(2),XMAX,ZA(2),ZB(2),ZMAX, + + DX(2),DZ(2),APART(2),FFA(2),FFB(2), + + DFX(2),DFZ(2),XX(200,2),ZZ(200,2),FFX(200,2),FFZ(200,2), + + NX,NZ + SAVE + + IPAR(8) = 0 + + XA(1) = 1.D-04 + XB(1) = 1.D-01 + XMAX = 0.8D0 + ZA(1) = dLOG(XA(1)) + ZB(1) = dLOG(XB(1)) + ZMAX = dLOG(XMAX) + NX = 200 + NZ = 200 + DX(1) = (XMAX-XB(1))/DBLE(NX-1) + DZ(1) = (ZB(1)-ZA(1))/DBLE(NZ-1) + + XA(2) = 1.D-04 + XB(2) = 1.D-01 + XMAX = 0.8D0 + ZA(2) = dLOG(XA(2)) + ZB(2) = dLOG(XB(2)) + ZMAX = dLOG(XMAX) + NX = 200 + NZ = 200 + DX(2) = (XMAX-XB(2))/DBLE(NX-1) + DZ(2) = (ZB(2)-ZA(2))/DBLE(NZ-1) + + DO L=1,2 + +C very small x: f(x) = A/x + APART(L) = PARTON(0.D0,L) + +C large x: interpolation in x + FFX(1,L) = 0.D0 + DO J=2,NX + X = XMAX - DX(L)*(DBLE(J)-0.5D0) + G = PARTON(X,L)/X + FFX(J,L) = FFX(J-1,L)+G*DX(L) + ENDDO + CALL INVERT_ARRAY (FFX(1,L),XMAX,-DX(L),NX,XX(1,L),FMIN,DFX(L)) + +C small x: interpolation in log(x) + FFZ(1,L) = FFX(NX,L) + DO J=2,NZ + Z = ZB(L) - DZ(L)*(DBLE(J)-0.5D0) + X = dEXP(Z) + G = PARTON(X,L) + FFZ(J,L) = FFZ(J-1,L)+G*DZ(L) + ENDDO + CALL INVERT_ARRAY(FFZ(1,L),ZB(L),-DZ(L),NZ,ZZ(1,L),FMIN,DFZ(L)) + FFA(L) = FFZ(NZ,L) + FFB(L) = FFX(NX,L) + + ENDDO + RETURN + END + +C======================================================================= + + FUNCTION PARTON(X,L) + +C----------------------------------------------------------------------- +C...This function returns the structure function +C. f(x) = x * [ g(x) + 4/9 *(q(x) + qbar(x)) ] +C. for a proton. +C................................................ + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + PARAMETER (beta=1.925978D0) + SAVE + DATA NOUTP /0/ + +c effective scale + Q2inp = PAR(22) + IF (L .EQ. 2) GOTO 1000 + + IF(IPAR(8).eq.0) THEN +C... Eichten et al. (set 1) +c tp060203 100 uv = 1.78 * x**0.5 * (1.-x**1.51)**3.5 + uv = 1.78D0 * x**0.5D0 * (1.D0-x**1.51D0)**3.5D0 + dv = 0.67D0 * x**0.4D0 * (1.D0-x**1.51D0)**4.5D0 + us = 0.182D0 * (1.D0-x)**8.54D0 + ss = 0.081D0 * (1.D0-x)**8.54D0 + qq0 = uv + dv + 4.D0*us + 2.D0*ss + glu0 = (2.62D0 + 9.17D0*x)* (1.D0-x)**5.9D0 + ELSE + IF( NOUTP.eq.0 ) print *,' using GRV pdf set' + IF( NOUTP.eq.0 ) print *,' Q2 scale in pdf:',Q2INP + NOUTP = 1 + + CALL SIB_DOR98LO (X, Q2inp, UV, DV, US, DS, SS, GL) + qq0 = uv + dv + 4.D0* (us + ds) + 2.D0*ss + glu0 = gl + ENDIF + parton = glu0 + 4.D0/9.D0*qq0 + RETURN + + 1000 CONTINUE + IF(IPAR(8).eq.0) THEN +C...Owens set 1 from STRF from Wisc. Pheno. group. for q2=q2_min + AV=0.4D0 + BV=0.7D0 +c BETA=GGAMMA(AV)*GGAMMA(BV+1.)/GGAMMA(AV+BV+1.) =1.925978 + uv=X**(AV)*(1.D0-X)**BV/BETA + dv=uv + + A=0.9D0 + BET=5.D0 + us=(A*(1.D0-X)**BET)/6.D0 + + A=0.888D0 + BET=3.11D0 + GA1=6.D0 + glu0=A*(1.D0-X)**BET*(1.D0+GA1*X) +c Bug Fix thanks to Sue Kashahara- correct factor in front of +c sea quarks for Owens S.F. 5-94 + qq0 = uv + dv + 6.D0*us + parton = (glu0 + 4.D0/9.D0*qq0) + RETURN + ELSE + +c duv = valence quark distribution +c dgl = gluon distribution +c dus = sea quark distribution (u,d,s) +c dds = sea charm quark ( neglected ) +c dss = sea bottom quark ( neglected ) + CALL DORPLO (X, Q2inp, uv, gl, us, ds, ss) + qq0 = uv + dv + 4.D0*us + glu0 = gl + parton = (glu0 + 4.D0/9.D0*qq0) + RETURN + ENDIF + END +C======================================================================= + + SUBROUTINE PDF_INI + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + COMMON /S_CZGEN/ XA(2),XB(2),XMAX,ZA(2),ZB(2),ZMAX, + + DX(2),DZ(2),APART(2),FFA(2),FFB(2), + + DFX(2),DFZ(2),XX(200,2),ZZ(200,2),FFX(200,2),FFZ(200,2), + + NX,NZ + SAVE + + IF(IPAR(8).eq.0) THEN + if (ndebug .gt. 0 ) WRITE(LUN,*) + * ' PDF_INI: calcuLating pdf table using Eichten param..' + CALL ZSAMPLE_INI + ELSEIF(IPAR(8).eq.2) THEN + if (ndebug .gt. 0 ) then + WRITE(LUN,*)' PDF_INI: calculating pdf table using GRV', + * ' param..' + WRITE(LUN,*)' does not work with -fbounds-check !!' + endif + CALL GRV_INI + ELSE + if (ndebug .gt. 0 ) WRITE(LUN,*) + * ' PDF_INI: using common table of GRV parametrization..' + ENDIF + if (ndebug .gt. 0 ) THEN + WRITE(LUN,*)APART(1),FFA(1),FFB(1),DX(1),DZ(1) + WRITE(LUN,*)APART(2),FFA(2),FFB(2),DX(2),DZ(2) + ENDIF + END + +C======================================================================= + + BLOCK DATA PDFINI + +C----------------------------------------------------------------------- +C.. tabled parton distribution function +c Proton: GRV98LO , Eur.Phys.J. C5(1998) 461-470 +c Pion: GRV91 , Z. Phys. C53, 651-655 (1992) + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /S_CZGEN/ XA(2),XB(2),XMAX,ZA(2),ZB(2),ZMAX, + + DX(2),DZ(2),APART(2),FFA(2),FFB(2), + + DFX(2),DFZ(2),XX(200,2),ZZ(200,2),FFX(200,2),FFZ(200,2), + + NX,NZ + SAVE + DATA XA /1.D-06,0.0001D0/ + DATA XB /0.1D0,0.1D0/ + DATA XMAX /0.800000011921D0/ + DATA ZMAX /-0.223143532872D0/ + DATA NX /200/ + DATA NZ /200/ + DATA ZA /-13.8155D0,-9.21034D0/ + DATA ZB /-2.30259D0,-2.30259D0/ + DATA DX /0.00351759D0,0.00351759D0/ + DATA DZ /0.0578539D0,0.0347123D0/ + DATA DFX /0.00952501D0,0.00847474D0/ + DATA DFZ /1.93863D0,0.326082D0/ + DATA APART /-9.80215D0,0.0178207D0/ + DATA FFA /387.684D0,66.5767D0/ + DATA FFB /1.89548D0,1.68647D0/ + + DATA (FFX(K,1),K=1,200 ) / + &0.000D+00,6.380D-05,1.315D-04,2.034D-04,2.795D-04, + &3.601D-04,4.454D-04,5.356D-04,6.309D-04,7.315D-04, + &8.377D-04,9.497D-04,1.068D-03,1.192D-03,1.323D-03, + &1.460D-03,1.605D-03,1.756D-03,1.916D-03,2.083D-03, + &2.258D-03,2.441D-03,2.633D-03,2.835D-03,3.045D-03, + &3.265D-03,3.496D-03,3.736D-03,3.988D-03,4.250D-03, + &4.524D-03,4.810D-03,5.108D-03,5.418D-03,5.742D-03, + &6.078D-03,6.429D-03,6.794D-03,7.174D-03,7.570D-03, + &7.981D-03,8.408D-03,8.852D-03,9.313D-03,9.793D-03, + &1.029D-02,1.081D-02,1.134D-02,1.190D-02,1.247D-02, + &1.307D-02,1.369D-02,1.433D-02,1.500D-02,1.568D-02, + &1.640D-02,1.714D-02,1.790D-02,1.869D-02,1.951D-02, + &2.035D-02,2.123D-02,2.213D-02,2.307D-02,2.403D-02, + &2.503D-02,2.607D-02,2.713D-02,2.823D-02,2.937D-02, + &3.054D-02,3.176D-02,3.301D-02,3.430D-02,3.563D-02, + &3.701D-02,3.842D-02,3.989D-02,4.139D-02,4.295D-02, + &4.455D-02,4.620D-02,4.791D-02,4.966D-02,5.147D-02, + &5.334D-02,5.526D-02,5.724D-02,5.927D-02,6.137D-02, + &6.353D-02,6.576D-02,6.805D-02,7.041D-02,7.284D-02, + &7.534D-02,7.791D-02,8.056D-02,8.329D-02,8.609D-02, + &8.898D-02,9.195D-02,9.500D-02,9.814D-02,1.014D-01, + &1.047D-01,1.081D-01,1.116D-01,1.153D-01,1.190D-01, + &1.228D-01,1.267D-01,1.308D-01,1.350D-01,1.392D-01, + &1.436D-01,1.481D-01,1.528D-01,1.575D-01,1.624D-01, + &1.674D-01,1.725D-01,1.778D-01,1.832D-01,1.888D-01, + &1.946D-01,2.005D-01,2.066D-01,2.128D-01,2.193D-01, + &2.259D-01,2.327D-01,2.397D-01,2.469D-01,2.543D-01, + &2.619D-01,2.698D-01,2.778D-01,2.862D-01,2.947D-01, + &3.035D-01,3.125D-01,3.218D-01,3.314D-01,3.413D-01, + &3.514D-01,3.618D-01,3.726D-01,3.836D-01,3.950D-01, + &4.067D-01,4.188D-01,4.312D-01,4.440D-01,4.572D-01, + &4.708D-01,4.848D-01,4.992D-01,5.141D-01,5.294D-01, + &5.452D-01,5.615D-01,5.783D-01,5.956D-01,6.134D-01, + &6.319D-01,6.509D-01,6.706D-01,6.909D-01,7.118D-01, + &7.334D-01,7.558D-01,7.789D-01,8.029D-01,8.276D-01, + &8.532D-01,8.797D-01,9.072D-01,9.356D-01,9.650D-01, + &9.956D-01,1.027D+00,1.060D+00,1.094D+00,1.130D+00, + &1.167D+00,1.205D+00,1.245D+00,1.287D+00,1.331D+00, + &1.376D+00,1.423D+00,1.473D+00,1.525D+00,1.579D+00, + &1.636D+00,1.696D+00,1.759D+00,1.826D+00,1.895D+00/ + + DATA (FFX(K,2),K=1,200 ) / + &0.000D+00,7.266D-04,1.470D-03,2.231D-03,3.009D-03, + &3.805D-03,4.619D-03,5.450D-03,6.300D-03,7.168D-03, + &8.055D-03,8.961D-03,9.886D-03,1.083D-02,1.179D-02, + &1.278D-02,1.378D-02,1.481D-02,1.585D-02,1.692D-02, + &1.800D-02,1.911D-02,2.024D-02,2.139D-02,2.256D-02, + &2.376D-02,2.498D-02,2.622D-02,2.748D-02,2.877D-02, + &3.008D-02,3.142D-02,3.278D-02,3.416D-02,3.557D-02, + &3.701D-02,3.847D-02,3.996D-02,4.147D-02,4.301D-02, + &4.458D-02,4.617D-02,4.779D-02,4.945D-02,5.112D-02, + &5.283D-02,5.457D-02,5.634D-02,5.813D-02,5.996D-02, + &6.182D-02,6.371D-02,6.563D-02,6.759D-02,6.957D-02, + &7.159D-02,7.365D-02,7.573D-02,7.786D-02,8.001D-02, + &8.221D-02,8.443D-02,8.670D-02,8.900D-02,9.134D-02, + &9.372D-02,9.614D-02,9.860D-02,1.011D-01,1.036D-01, + &1.062D-01,1.088D-01,1.115D-01,1.142D-01,1.170D-01, + &1.197D-01,1.226D-01,1.255D-01,1.284D-01,1.314D-01, + &1.344D-01,1.375D-01,1.406D-01,1.438D-01,1.470D-01, + &1.503D-01,1.536D-01,1.570D-01,1.605D-01,1.640D-01, + &1.675D-01,1.712D-01,1.748D-01,1.786D-01,1.824D-01, + &1.862D-01,1.901D-01,1.941D-01,1.982D-01,2.023D-01, + &2.065D-01,2.107D-01,2.151D-01,2.195D-01,2.239D-01, + &2.285D-01,2.331D-01,2.378D-01,2.426D-01,2.474D-01, + &2.524D-01,2.574D-01,2.625D-01,2.677D-01,2.730D-01, + &2.784D-01,2.839D-01,2.895D-01,2.951D-01,3.009D-01, + &3.068D-01,3.128D-01,3.189D-01,3.251D-01,3.314D-01, + &3.378D-01,3.443D-01,3.510D-01,3.578D-01,3.647D-01, + &3.717D-01,3.789D-01,3.862D-01,3.937D-01,4.012D-01, + &4.090D-01,4.169D-01,4.249D-01,4.331D-01,4.415D-01, + &4.500D-01,4.587D-01,4.676D-01,4.767D-01,4.859D-01, + &4.954D-01,5.050D-01,5.148D-01,5.249D-01,5.352D-01, + &5.457D-01,5.564D-01,5.674D-01,5.786D-01,5.901D-01, + &6.019D-01,6.139D-01,6.262D-01,6.388D-01,6.517D-01, + &6.649D-01,6.785D-01,6.923D-01,7.066D-01,7.212D-01, + &7.362D-01,7.516D-01,7.673D-01,7.836D-01,8.002D-01, + &8.174D-01,8.350D-01,8.532D-01,8.718D-01,8.911D-01, + &9.109D-01,9.313D-01,9.524D-01,9.742D-01,9.966D-01, + &1.020D+00,1.044D+00,1.069D+00,1.094D+00,1.121D+00, + &1.149D+00,1.177D+00,1.207D+00,1.238D+00,1.271D+00, + &1.304D+00,1.339D+00,1.376D+00,1.414D+00,1.454D+00, + &1.496D+00,1.540D+00,1.586D+00,1.635D+00,1.686D+00/ + + DATA (FFZ(K,1),K=1,200 ) / + &1.895D+00,2.014D+00,2.137D+00,2.263D+00,2.393D+00, + &2.527D+00,2.665D+00,2.807D+00,2.953D+00,3.103D+00, + &3.257D+00,3.417D+00,3.580D+00,3.748D+00,3.921D+00, + &4.098D+00,4.281D+00,4.469D+00,4.663D+00,4.861D+00, + &5.065D+00,5.274D+00,5.489D+00,5.710D+00,5.937D+00, + &6.170D+00,6.409D+00,6.654D+00,6.906D+00,7.164D+00, + &7.430D+00,7.702D+00,7.981D+00,8.267D+00,8.561D+00, + &8.862D+00,9.171D+00,9.487D+00,9.811D+00,1.014D+01, + &1.048D+01,1.083D+01,1.119D+01,1.156D+01,1.193D+01, + &1.232D+01,1.271D+01,1.311D+01,1.352D+01,1.395D+01, + &1.438D+01,1.482D+01,1.527D+01,1.573D+01,1.621D+01, + &1.669D+01,1.718D+01,1.769D+01,1.821D+01,1.874D+01, + &1.928D+01,1.983D+01,2.040D+01,2.097D+01,2.156D+01, + &2.217D+01,2.278D+01,2.341D+01,2.406D+01,2.471D+01, + &2.539D+01,2.607D+01,2.677D+01,2.749D+01,2.822D+01, + &2.896D+01,2.973D+01,3.050D+01,3.130D+01,3.211D+01, + &3.293D+01,3.378D+01,3.464D+01,3.552D+01,3.642D+01, + &3.733D+01,3.827D+01,3.922D+01,4.020D+01,4.119D+01, + &4.220D+01,4.323D+01,4.429D+01,4.536D+01,4.646D+01, + &4.758D+01,4.872D+01,4.988D+01,5.106D+01,5.227D+01, + &5.350D+01,5.476D+01,5.604D+01,5.735D+01,5.868D+01, + &6.003D+01,6.142D+01,6.282D+01,6.426D+01,6.572D+01, + &6.721D+01,6.873D+01,7.028D+01,7.186D+01,7.346D+01, + &7.510D+01,7.677D+01,7.847D+01,8.020D+01,8.196D+01, + &8.375D+01,8.558D+01,8.744D+01,8.934D+01,9.127D+01, + &9.324D+01,9.524D+01,9.728D+01,9.936D+01,1.015D+02, + &1.036D+02,1.058D+02,1.080D+02,1.103D+02,1.126D+02, + &1.150D+02,1.174D+02,1.198D+02,1.223D+02,1.248D+02, + &1.274D+02,1.300D+02,1.327D+02,1.354D+02,1.381D+02, + &1.409D+02,1.438D+02,1.467D+02,1.496D+02,1.526D+02, + &1.557D+02,1.588D+02,1.619D+02,1.652D+02,1.684D+02, + &1.718D+02,1.751D+02,1.786D+02,1.821D+02,1.856D+02, + &1.892D+02,1.929D+02,1.967D+02,2.005D+02,2.043D+02, + &2.083D+02,2.122D+02,2.163D+02,2.204D+02,2.246D+02, + &2.289D+02,2.332D+02,2.376D+02,2.421D+02,2.467D+02, + &2.513D+02,2.560D+02,2.608D+02,2.656D+02,2.706D+02, + &2.756D+02,2.807D+02,2.859D+02,2.911D+02,2.965D+02, + &3.019D+02,3.074D+02,3.130D+02,3.187D+02,3.245D+02, + &3.304D+02,3.364D+02,3.425D+02,3.486D+02,3.549D+02, + &3.612D+02,3.677D+02,3.743D+02,3.809D+02,3.877D+02/ + + DATA (FFZ(K,2),K=1,200 ) / + &1.686D+00,1.738D+00,1.791D+00,1.844D+00,1.899D+00, + &1.955D+00,2.011D+00,2.069D+00,2.128D+00,2.188D+00, + &2.249D+00,2.311D+00,2.374D+00,2.438D+00,2.504D+00, + &2.570D+00,2.638D+00,2.708D+00,2.778D+00,2.850D+00, + &2.923D+00,2.997D+00,3.072D+00,3.149D+00,3.228D+00, + &3.307D+00,3.388D+00,3.471D+00,3.555D+00,3.640D+00, + &3.727D+00,3.815D+00,3.905D+00,3.997D+00,4.090D+00, + &4.184D+00,4.281D+00,4.378D+00,4.478D+00,4.579D+00, + &4.682D+00,4.787D+00,4.893D+00,5.002D+00,5.112D+00, + &5.224D+00,5.337D+00,5.453D+00,5.571D+00,5.690D+00, + &5.811D+00,5.935D+00,6.060D+00,6.188D+00,6.317D+00, + &6.449D+00,6.583D+00,6.719D+00,6.857D+00,6.997D+00, + &7.139D+00,7.284D+00,7.431D+00,7.580D+00,7.732D+00, + &7.886D+00,8.042D+00,8.201D+00,8.363D+00,8.526D+00, + &8.693D+00,8.862D+00,9.033D+00,9.207D+00,9.384D+00, + &9.563D+00,9.746D+00,9.930D+00,1.012D+01,1.031D+01, + &1.050D+01,1.070D+01,1.090D+01,1.110D+01,1.130D+01, + &1.151D+01,1.172D+01,1.194D+01,1.215D+01,1.237D+01, + &1.260D+01,1.283D+01,1.306D+01,1.329D+01,1.353D+01, + &1.377D+01,1.401D+01,1.426D+01,1.451D+01,1.476D+01, + &1.502D+01,1.528D+01,1.554D+01,1.581D+01,1.608D+01, + &1.636D+01,1.664D+01,1.692D+01,1.721D+01,1.750D+01, + &1.780D+01,1.810D+01,1.840D+01,1.871D+01,1.902D+01, + &1.934D+01,1.966D+01,1.998D+01,2.031D+01,2.065D+01, + &2.098D+01,2.133D+01,2.167D+01,2.203D+01,2.238D+01, + &2.274D+01,2.311D+01,2.348D+01,2.385D+01,2.423D+01, + &2.462D+01,2.501D+01,2.541D+01,2.581D+01,2.621D+01, + &2.662D+01,2.704D+01,2.746D+01,2.789D+01,2.832D+01, + &2.875D+01,2.920D+01,2.965D+01,3.010D+01,3.056D+01, + &3.103D+01,3.150D+01,3.198D+01,3.246D+01,3.295D+01, + &3.344D+01,3.395D+01,3.445D+01,3.497D+01,3.549D+01, + &3.601D+01,3.655D+01,3.709D+01,3.763D+01,3.819D+01, + &3.875D+01,3.931D+01,3.989D+01,4.047D+01,4.105D+01, + &4.165D+01,4.225D+01,4.286D+01,4.347D+01,4.410D+01, + &4.473D+01,4.537D+01,4.601D+01,4.666D+01,4.732D+01, + &4.799D+01,4.867D+01,4.935D+01,5.005D+01,5.075D+01, + &5.146D+01,5.217D+01,5.290D+01,5.363D+01,5.437D+01, + &5.512D+01,5.588D+01,5.665D+01,5.743D+01,5.821D+01, + &5.901D+01,5.981D+01,6.062D+01,6.145D+01,6.228D+01, + &6.312D+01,6.397D+01,6.483D+01,6.570D+01,6.658D+01/ + + DATA (XX(K,1),K=1,200 ) / + &8.000D-01,6.472D-01,5.944D-01,5.597D-01,5.335D-01, + &5.121D-01,4.941D-01,4.785D-01,4.647D-01,4.522D-01, + &4.409D-01,4.306D-01,4.210D-01,4.122D-01,4.039D-01, + &3.961D-01,3.887D-01,3.817D-01,3.751D-01,3.688D-01, + &3.628D-01,3.571D-01,3.516D-01,3.463D-01,3.413D-01, + &3.365D-01,3.318D-01,3.273D-01,3.230D-01,3.188D-01, + &3.147D-01,3.108D-01,3.070D-01,3.033D-01,2.998D-01, + &2.963D-01,2.929D-01,2.896D-01,2.864D-01,2.833D-01, + &2.802D-01,2.773D-01,2.744D-01,2.715D-01,2.688D-01, + &2.661D-01,2.634D-01,2.608D-01,2.583D-01,2.558D-01, + &2.534D-01,2.510D-01,2.487D-01,2.464D-01,2.442D-01, + &2.420D-01,2.398D-01,2.377D-01,2.356D-01,2.336D-01, + &2.316D-01,2.296D-01,2.277D-01,2.257D-01,2.239D-01, + &2.220D-01,2.202D-01,2.184D-01,2.167D-01,2.150D-01, + &2.132D-01,2.116D-01,2.099D-01,2.083D-01,2.067D-01, + &2.051D-01,2.036D-01,2.020D-01,2.005D-01,1.990D-01, + &1.976D-01,1.961D-01,1.947D-01,1.933D-01,1.919D-01, + &1.905D-01,1.891D-01,1.878D-01,1.865D-01,1.852D-01, + &1.839D-01,1.826D-01,1.814D-01,1.801D-01,1.789D-01, + &1.777D-01,1.765D-01,1.753D-01,1.741D-01,1.730D-01, + &1.718D-01,1.707D-01,1.696D-01,1.685D-01,1.674D-01, + &1.663D-01,1.653D-01,1.642D-01,1.632D-01,1.622D-01, + &1.611D-01,1.601D-01,1.591D-01,1.581D-01,1.572D-01, + &1.562D-01,1.552D-01,1.543D-01,1.534D-01,1.524D-01, + &1.515D-01,1.506D-01,1.497D-01,1.488D-01,1.479D-01, + &1.471D-01,1.462D-01,1.453D-01,1.445D-01,1.437D-01, + &1.428D-01,1.420D-01,1.412D-01,1.404D-01,1.396D-01, + &1.388D-01,1.380D-01,1.372D-01,1.365D-01,1.357D-01, + &1.349D-01,1.342D-01,1.335D-01,1.327D-01,1.320D-01, + &1.313D-01,1.306D-01,1.299D-01,1.292D-01,1.284D-01, + &1.278D-01,1.271D-01,1.264D-01,1.257D-01,1.251D-01, + &1.244D-01,1.237D-01,1.231D-01,1.224D-01,1.218D-01, + &1.212D-01,1.205D-01,1.199D-01,1.193D-01,1.187D-01, + &1.181D-01,1.175D-01,1.169D-01,1.163D-01,1.157D-01, + &1.151D-01,1.145D-01,1.139D-01,1.134D-01,1.128D-01, + &1.123D-01,1.117D-01,1.112D-01,1.106D-01,1.101D-01, + &1.095D-01,1.090D-01,1.085D-01,1.079D-01,1.074D-01, + &1.069D-01,1.064D-01,1.059D-01,1.054D-01,1.049D-01, + &1.044D-01,1.039D-01,1.034D-01,1.029D-01,1.024D-01, + &1.019D-01,1.014D-01,1.010D-01,1.005D-01,1.000D-01/ + + DATA (XX(K,2),K=1,200 ) / + &8.000D-01,7.632D-01,7.331D-01,7.073D-01,6.846D-01, + &6.643D-01,6.458D-01,6.289D-01,6.132D-01,5.986D-01, + &5.849D-01,5.721D-01,5.600D-01,5.485D-01,5.376D-01, + &5.272D-01,5.172D-01,5.077D-01,4.986D-01,4.899D-01, + &4.815D-01,4.734D-01,4.656D-01,4.581D-01,4.508D-01, + &4.438D-01,4.370D-01,4.304D-01,4.240D-01,4.178D-01, + &4.118D-01,4.059D-01,4.002D-01,3.947D-01,3.893D-01, + &3.840D-01,3.789D-01,3.739D-01,3.690D-01,3.643D-01, + &3.597D-01,3.551D-01,3.507D-01,3.464D-01,3.421D-01, + &3.380D-01,3.340D-01,3.300D-01,3.261D-01,3.223D-01, + &3.186D-01,3.150D-01,3.114D-01,3.079D-01,3.045D-01, + &3.011D-01,2.978D-01,2.945D-01,2.914D-01,2.883D-01, + &2.852D-01,2.822D-01,2.792D-01,2.763D-01,2.735D-01, + &2.707D-01,2.679D-01,2.652D-01,2.625D-01,2.599D-01, + &2.574D-01,2.548D-01,2.523D-01,2.499D-01,2.475D-01, + &2.451D-01,2.428D-01,2.405D-01,2.382D-01,2.360D-01, + &2.338D-01,2.316D-01,2.295D-01,2.274D-01,2.254D-01, + &2.233D-01,2.213D-01,2.193D-01,2.174D-01,2.155D-01, + &2.136D-01,2.117D-01,2.099D-01,2.081D-01,2.063D-01, + &2.045D-01,2.028D-01,2.011D-01,1.994D-01,1.977D-01, + &1.961D-01,1.944D-01,1.929D-01,1.913D-01,1.897D-01, + &1.882D-01,1.867D-01,1.851D-01,1.837D-01,1.822D-01, + &1.808D-01,1.793D-01,1.779D-01,1.765D-01,1.752D-01, + &1.738D-01,1.725D-01,1.711D-01,1.698D-01,1.686D-01, + &1.673D-01,1.660D-01,1.648D-01,1.635D-01,1.623D-01, + &1.611D-01,1.599D-01,1.588D-01,1.576D-01,1.564D-01, + &1.553D-01,1.542D-01,1.531D-01,1.520D-01,1.509D-01, + &1.498D-01,1.488D-01,1.477D-01,1.467D-01,1.457D-01, + &1.447D-01,1.437D-01,1.427D-01,1.417D-01,1.407D-01, + &1.398D-01,1.388D-01,1.379D-01,1.369D-01,1.360D-01, + &1.351D-01,1.342D-01,1.333D-01,1.324D-01,1.316D-01, + &1.307D-01,1.299D-01,1.290D-01,1.282D-01,1.273D-01, + &1.265D-01,1.257D-01,1.249D-01,1.241D-01,1.233D-01, + &1.225D-01,1.218D-01,1.210D-01,1.203D-01,1.195D-01, + &1.188D-01,1.180D-01,1.173D-01,1.166D-01,1.159D-01, + &1.152D-01,1.144D-01,1.138D-01,1.131D-01,1.124D-01, + &1.117D-01,1.110D-01,1.104D-01,1.097D-01,1.091D-01, + &1.084D-01,1.078D-01,1.072D-01,1.065D-01,1.059D-01, + &1.053D-01,1.047D-01,1.041D-01,1.035D-01,1.029D-01, + &1.023D-01,1.017D-01,1.012D-01,1.006D-01,1.000D-01/ + + DATA (ZZ(K,1),K=1,200 ) / + &-2.303D+00,-3.084D+00,-3.649D+00,-4.098D+00, + &-4.472D+00,-4.795D+00,-5.080D+00,-5.335D+00, + &-5.568D+00,-5.781D+00,-5.978D+00,-6.161D+00, + &-6.333D+00,-6.494D+00,-6.647D+00,-6.792D+00, + &-6.929D+00,-7.060D+00,-7.186D+00,-7.306D+00, + &-7.421D+00,-7.532D+00,-7.639D+00,-7.742D+00, + &-7.842D+00,-7.938D+00,-8.031D+00,-8.122D+00, + &-8.210D+00,-8.295D+00,-8.378D+00,-8.459D+00, + &-8.538D+00,-8.614D+00,-8.689D+00,-8.762D+00, + &-8.834D+00,-8.904D+00,-8.972D+00,-9.039D+00, + &-9.104D+00,-9.168D+00,-9.231D+00,-9.293D+00, + &-9.353D+00,-9.412D+00,-9.470D+00,-9.528D+00, + &-9.584D+00,-9.639D+00,-9.693D+00,-9.746D+00, + &-9.799D+00,-9.851D+00,-9.901D+00,-9.951D+00, + &-1.000D+01,-1.005D+01,-1.010D+01,-1.014D+01, + &-1.019D+01,-1.024D+01,-1.028D+01,-1.033D+01, + &-1.037D+01,-1.041D+01,-1.046D+01,-1.050D+01, + &-1.054D+01,-1.058D+01,-1.062D+01,-1.066D+01, + &-1.070D+01,-1.074D+01,-1.078D+01,-1.082D+01, + &-1.086D+01,-1.089D+01,-1.093D+01,-1.097D+01, + &-1.101D+01,-1.104D+01,-1.108D+01,-1.111D+01, + &-1.115D+01,-1.118D+01,-1.122D+01,-1.125D+01, + &-1.128D+01,-1.132D+01,-1.135D+01,-1.138D+01, + &-1.141D+01,-1.145D+01,-1.148D+01,-1.151D+01, + &-1.154D+01,-1.157D+01,-1.160D+01,-1.163D+01, + &-1.166D+01,-1.169D+01,-1.172D+01,-1.175D+01, + &-1.178D+01,-1.181D+01,-1.184D+01,-1.186D+01, + &-1.189D+01,-1.192D+01,-1.195D+01,-1.198D+01, + &-1.200D+01,-1.203D+01,-1.206D+01,-1.208D+01, + &-1.211D+01,-1.214D+01,-1.216D+01,-1.219D+01, + &-1.221D+01,-1.224D+01,-1.226D+01,-1.229D+01, + &-1.231D+01,-1.234D+01,-1.236D+01,-1.239D+01, + &-1.241D+01,-1.244D+01,-1.246D+01,-1.248D+01, + &-1.251D+01,-1.253D+01,-1.255D+01,-1.258D+01, + &-1.260D+01,-1.262D+01,-1.264D+01,-1.267D+01, + &-1.269D+01,-1.271D+01,-1.273D+01,-1.276D+01, + &-1.278D+01,-1.280D+01,-1.282D+01,-1.284D+01, + &-1.286D+01,-1.289D+01,-1.291D+01,-1.293D+01, + &-1.295D+01,-1.297D+01,-1.299D+01,-1.301D+01, + &-1.303D+01,-1.305D+01,-1.307D+01,-1.309D+01, + &-1.311D+01,-1.313D+01,-1.315D+01,-1.317D+01, + &-1.319D+01,-1.321D+01,-1.323D+01,-1.325D+01, + &-1.327D+01,-1.329D+01,-1.330D+01,-1.332D+01, + &-1.334D+01,-1.336D+01,-1.338D+01,-1.340D+01, + &-1.342D+01,-1.343D+01,-1.345D+01,-1.347D+01, + &-1.349D+01,-1.351D+01,-1.352D+01,-1.354D+01, + &-1.356D+01,-1.358D+01,-1.360D+01,-1.361D+01, + &-1.363D+01,-1.365D+01,-1.366D+01,-1.368D+01, + &-1.370D+01,-1.372D+01,-1.373D+01,-1.375D+01, + &-1.377D+01,-1.378D+01,-1.380D+01,-1.382D+01/ + + DATA (ZZ(K,2),K=1,200 ) / + &-2.303D+00,-2.512D+00,-2.700D+00,-2.871D+00, + &-3.029D+00,-3.175D+00,-3.310D+00,-3.438D+00, + &-3.557D+00,-3.670D+00,-3.778D+00,-3.880D+00, + &-3.977D+00,-4.070D+00,-4.159D+00,-4.245D+00, + &-4.328D+00,-4.407D+00,-4.484D+00,-4.558D+00, + &-4.630D+00,-4.699D+00,-4.767D+00,-4.832D+00, + &-4.896D+00,-4.958D+00,-5.019D+00,-5.078D+00, + &-5.135D+00,-5.191D+00,-5.246D+00,-5.300D+00, + &-5.352D+00,-5.403D+00,-5.453D+00,-5.503D+00, + &-5.551D+00,-5.598D+00,-5.645D+00,-5.690D+00, + &-5.735D+00,-5.779D+00,-5.822D+00,-5.864D+00, + &-5.906D+00,-5.947D+00,-5.988D+00,-6.027D+00, + &-6.067D+00,-6.105D+00,-6.143D+00,-6.181D+00, + &-6.217D+00,-6.254D+00,-6.290D+00,-6.325D+00, + &-6.360D+00,-6.394D+00,-6.428D+00,-6.462D+00, + &-6.495D+00,-6.528D+00,-6.560D+00,-6.592D+00, + &-6.624D+00,-6.655D+00,-6.686D+00,-6.716D+00, + &-6.746D+00,-6.776D+00,-6.805D+00,-6.835D+00, + &-6.863D+00,-6.892D+00,-6.920D+00,-6.948D+00, + &-6.976D+00,-7.003D+00,-7.030D+00,-7.057D+00, + &-7.084D+00,-7.110D+00,-7.136D+00,-7.162D+00, + &-7.188D+00,-7.213D+00,-7.238D+00,-7.263D+00, + &-7.288D+00,-7.312D+00,-7.336D+00,-7.360D+00, + &-7.384D+00,-7.408D+00,-7.431D+00,-7.455D+00, + &-7.478D+00,-7.501D+00,-7.523D+00,-7.546D+00, + &-7.568D+00,-7.590D+00,-7.612D+00,-7.634D+00, + &-7.656D+00,-7.677D+00,-7.698D+00,-7.720D+00, + &-7.741D+00,-7.761D+00,-7.782D+00,-7.803D+00, + &-7.823D+00,-7.843D+00,-7.863D+00,-7.883D+00, + &-7.903D+00,-7.923D+00,-7.943D+00,-7.962D+00, + &-7.981D+00,-8.001D+00,-8.020D+00,-8.039D+00, + &-8.057D+00,-8.076D+00,-8.095D+00,-8.113D+00, + &-8.132D+00,-8.150D+00,-8.168D+00,-8.186D+00, + &-8.204D+00,-8.222D+00,-8.239D+00,-8.257D+00, + &-8.274D+00,-8.292D+00,-8.309D+00,-8.326D+00, + &-8.343D+00,-8.360D+00,-8.377D+00,-8.394D+00, + &-8.411D+00,-8.427D+00,-8.444D+00,-8.460D+00, + &-8.476D+00,-8.493D+00,-8.509D+00,-8.525D+00, + &-8.541D+00,-8.557D+00,-8.572D+00,-8.588D+00, + &-8.604D+00,-8.619D+00,-8.635D+00,-8.650D+00, + &-8.666D+00,-8.681D+00,-8.696D+00,-8.711D+00, + &-8.726D+00,-8.741D+00,-8.756D+00,-8.771D+00, + &-8.786D+00,-8.800D+00,-8.815D+00,-8.829D+00, + &-8.844D+00,-8.858D+00,-8.872D+00,-8.887D+00, + &-8.901D+00,-8.915D+00,-8.929D+00,-8.943D+00, + &-8.957D+00,-8.971D+00,-8.985D+00,-8.998D+00, + &-9.012D+00,-9.026D+00,-9.039D+00,-9.053D+00, + &-9.066D+00,-9.080D+00,-9.093D+00,-9.106D+00, + &-9.119D+00,-9.133D+00,-9.146D+00,-9.159D+00, + &-9.172D+00,-9.185D+00,-9.197D+00,-9.210D+00/ + END +C======================================================================= + + DOUBLE PRECISION FUNCTION CHIDIS (KPARTin, IFL1, IFL2) + +C----------------------------------------------------------------------- +C...Generate CHI (fraction of energy of a hadron carried by +C. the valence quark, or diquark, as specified by IFL1) +C. INPUT KPART = code of particle +C. IFL1, IFL2 = codes of partons (3, 3bar of color) +C......................................................... + IMPLICIT NONE +c external types + INTEGER KPARTIN,IFL1,IFL2 +c COMMONs + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + DOUBLE PRECISION CCHIK + COMMON /S_CPSPL/ CCHIK(4,99) + + DOUBLE PRECISION STR_mass_val, STR_mass_val_hyp, STR_mass_sea + COMMON /S_CUTOFF/ STR_mass_val, STR_mass_val_hyp, STR_mass_sea +c internal types + DOUBLE PRECISION CUT,S_RNDM + INTEGER KPART,IFQ + SAVE + + kpart=IABS(kpartin) + IFQ=IABS(IFL1) + IF (IFQ.GT.10) IFQ=IABS(IFL2) + CUT=2.D0*STR_mass_val/SQS +c hyperon beam cut + IF(kpart.gt.14) CUT=2.D0*STR_mass_val_hyp/SQS +100 CHIDIS=S_RNDM(0)**2 + if (chidis.lt.cut) goto 100 + if (chidis.gt.(1.D0-cut)) goto 100 + IF((CHIDIS**2/(CHIDIS**2+CUT**2))**0.5D0 + + *(1.D0-CHIDIS)**CCHIK(IFQ,KPART).LT.S_RNDM(1)) GOTO 100 + CHIDIS = MAX(0.5D0*CUT,CHIDIS) + CHIDIS = MIN(1.D0-CUT,CHIDIS) +c diquarks or charm quarks + IF (IABS(IFL1).GT.3) CHIDIS=1.D0-CHIDIS + RETURN + END +C======================================================================= + + FUNCTION QMASS(IFL) + +C----------------------------------------------------------------------- +C...Return quark or diquark constituent masses +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + DIMENSION QMAS(4) + SAVE + DATA QMAS /0.325D0,0.325D0,0.5D0,1.5D0/ + + IFLA = IABS(IFL) + IFLA = MOD(IFLA,100) + IF (IFLA .LE. 4) THEN + QMASS = QMAS(IFLA) + ELSE + QMA = QMAS(IFLA/10) + QMB = QMAS(MOD(IFLA,10)) + QMASS = QMA+QMB + ENDIF + RETURN + END +C======================================================================= + + FUNCTION XM2DIS(XM2MIN,XM2MAX,ALPHA) + +C----------------------------------------------------------------------- +C function that samples mass**2 from (1/M**2)**alpha +C with alpha <= 1 +C INPUT: Mmin**2 : minimal mass +C Mmax**2 : maximal mass +C alpha : slope \FR'14 +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + +c reduced alpha + ALPHArdc = 2.d0*(ALPHA-1.d0) + AMIN = LOG(XM2MIN) + AMAX = LOG(XM2MAX) + ADLT = AMAX-AMIN + IF(ABS(ALPHArdc).LT.1.d-3)THEN +c alpha = 1 + XRNDM = MAX(S_RNDM(0),1.D-10) + AX = AMIN+ADLT*XRNDM + XM2DIS = EXP(AX) + ELSEIF(ALPHArdc.LT.0.D0.and.ALPHA.gt.0.D0)THEN +c 0 < alpha < 1 + XRNDM = MAX(S_RNDM(0),1.D-10) +c AX = AMAX-LOG(XRNDM)*ALPHArdc + DX = XM2MAX**(1.D0-ALPHA)*XRNDM + + + XM2MIN**(1.D0-ALPHA)*(1.D0-XRNDM) + AX = LOG(DX)/(1.D0-ALPHA) + XM2DIS = EXP(AX) + ELSEIF(ALPHArdc.GE.1.D0)THEN +c alpha >= 1 + ALPHAr = 1.D0-ALPHA + XMINA = XM2MIN**ALPHAr + XMAXA = XM2MAX**ALPHAr + XDLT = XMAXA-XMINA + XRNDM = MAX(S_RNDM(0),1.D-10) + Z = LOG(XMINA+XDLT*XRNDM)/ALPHAR + XM2DIS = EXP(Z) + ELSE + WRITE(6,*) 'M2DIS: undefined exponent in mass distribution!', + & ALPHA + XM2DIS = 0.D0 + CALL SIB_REJECT('M2DIS ') + ENDIF + END +C======================================================================= + + SUBROUTINE EXCTDEC( IDX, LBAD) + +C----------------------------------------------------------------------- +C routine to fragment an excited system with known flavor via +C resonance decay +C----------------------------------------------------------------------- + IMPLICIT NONE +c external variables + INTEGER IDX,LBAD + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT + + INTEGER LRNK + COMMON /SIB_RNK/ LRNK(8000) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + +c local variables + DOUBLE PRECISION P0,BE,PR1,PR2,PRH,GABE,P2, + & PAR2_def,PAR8_def,PAR24_def,DELTAE,PCXG, + & EMIN1,EMIN2,EMIN3,EMIN4,S_RNDM,GA,PTR,PTOT,P1TOT,PX,PY, + & COD,SID,COF,SIF,ANORF,BEP + DIMENSION P0(5),BE(3),PR1(5),PR2(5),PRH(5),GABE(4), + & P2(5) + INTEGER IPID,IR1DX,IFLR1,IR2DX,IFLR2,IRH,IRHPID,IR, + & KK,KD,IFAIL,N1,IFBAD,J,K,I + SAVE + +c LBAD = 1 + +c initial parameters + PAR2_def = PAR(2) ! ud/s rate + PAR8_def = PAR(8) ! popcorn rate + PAR24_def = PAR(24) ! c/s rate + if(ndebug.gt.1) + & WRITE(LUN,*) ' EXCTDEC: IDX,IREJ',IDX,LBAD + +c read remnant 4momentum from stack + CALL RD_PRTN_4VEC(IDX,P0,IPID,IR1DX) + CALL RD_PRTN_4VEC(IR1DX,PR1,IFLR1,IR2DX) + CALL RD_PRTN_4VEC(IR2DX,PR2,IFLR2,IRH) + CALL RD_PRTN_4VEC(IRH,PRH,IRHPID,IR) + IPFLAG = IPID + IF(IDX.ne.IR)then + write(lun,*) ' EXCTDEC: reference loop broken!',IDX,IR + CALL SIB_REJECT('EXCTDEC ') + endif + IF(NDEBUG.GT.2)THEN + WRITE(LUN,*) ' EXCTDEC: P0:' , (P0(kk),kk=1,5) + WRITE(LUN,*) ' EXCTDEC: PR1:' , (PR1(kk),kk=1,5) + WRITE(LUN,*) ' EXCTDEC: PR2:' , (PR2(kk),kk=1,5) + WRITE(LUN,*) ' EXCTDEC: PH:' , (PRH(kk),kk=1,5) + ENDIF + +C identity of remnant +c form hadron from flavors in remnant +c (not preserving spin or isospin!) +c CALL SIB_I4FLAV(iflr1,iflr2,Idm, KD ) + KD = IRHPID + +c available kinetic energy + DELTAE = P0(5)-AM(ABS(KD)) +c fallback region: 0 < DELTAE < EMIN1 + EMIN1 = PAR(76) +c resonance region: EMIN1 < DELTAE < EMIN2 + EMIN2 = PAR(77) +c phasespace decay region: EMIN2 < DELTAE < EMIN3 + EMIN3 = PAR(78) +c string decay region: EMIN3 < DELTAE < EMIN4 + EMIN4 = PAR(79) + + IF(NDEBUG.gt.2)THEN + WRITE(LUN,*) + & ' EXCTDEC: MASS,IFL1,IFL2,PID',P0(5),IFLR1,IFLR2,KD + WRITE(LUN,*) ' EXCTDEC: DELTAE,EMIN1,EMIN2,EMIN3', + & DELTAE,EMIN1,EMIN2,EMIN3 + ENDIF + +c strange quark rate + IF(IPAR(48).eq.1)THEN + PAR(2) = PAR(89) + ENDIF + +c charm quark rate + IF(IPAR(62).eq.1)THEN + PAR(24) = PAR(107) + ENDIF + +c popcorn rate in remnant + IF(IPAR(56).eq.1)THEN + PAR(8) = PAR(102) + ENDIF + + IF(DELTAE.lt.EMIN2)THEN +c beam or resonance region + IF(NDEBUG.gt.1) then + if(DELTAE.lt.EMIN1)then + WRITE(LUN,*)' EXCTDEC: fallback to beam..' + else + WRITE(LUN,*)' EXCTDEC: forming resonance..' + endif + endif + NP = NP + 1 + LLIST(NP) = KD + NPORIG(NP) = IPFLAG + LRNK(NP) = 0 + niorig(NP) = iiflag + DO kk=1,5 + P(NP,KK) = P0(KK) + ENDDO + LBAD = 0 + PAR(2) = PAR2_def + PAR(8) = PAR8_def + PAR(24) = PAR24_def + RETURN + + ELSEIF(DELTAE.lt.EMIN3)THEN +c phasespace decay region + IF(NDEBUG.gt.1) WRITE(LUN,*)' EXCTDEC: phasespace decay ..' + IPFLAG = IPID/iabs(IPID) + ISIGN(1000,IPID) +c set charge exchange probability, +c i.e. prob for p* -> n + pip + PCXG = PAR(99) + CALL FIREBALL_4FLV(KD,P0,PCXG,IFAIL) + PAR(2) = PAR2_def + PAR(8) = PAR8_def + PAR(24) = PAR24_def + IF(IFAIL.eq.1) THEN + IF(ndebug.gt.0) + & WRITE(LUN,*) ' EXCTDEC: remnant frag. rejection!' + LBAD = 1 + RETURN + ENDIF + LBAD = 0 + RETURN + +c ELSEIF(DELTAE.lt.EMIN4)THEN + ELSE +C string fragmentation region + IF(NDEBUG.gt.1) WRITE(LUN,*)' EXCTDEC: string decay ..' + N1 = NP+1 + IPFLAG = IPFLAG + ISIGN(3000,IPID) +c for meson remnant quark and anti-quark should be treated equally +c therefor switch randomly + IF(IBAR(ABS(KD)).eq.0.and.S_RNDM(KD).lt.0.5D0) + & CALL ISWTCH_LMNTS(IFLR1,IFLR2) + +c turn remnant string around + IF(IPAR(23).eq.1)THEN + IF(S_RNDM(0).gt.PAR(39)) + & CALL ISWTCH_LMNTS(IFLR1,IFLR2) + ENDIF + + CALL STRING_FRAG_4FLV + + (P0(5), IFLR2, IFLR1, 0.D0,0.D0,0.D0,0.D0,IFBAD,1) + IF (IFBAD .EQ. 1)THEN + IF(ndebug.gt.0) + & WRITE(LUN,*) ' EXCTDEC: remnant frag. rejection!' + LBAD = 1 + PAR(2) = PAR2_def + PAR(8) = PAR8_def + PAR(24) = PAR24_def + RETURN + ENDIF + DO J=1,3 + BE(J)=P0(J)/P0(4) + GABE(J)=P0(J)/P0(5) + ENDDO + GA=P0(4)/P0(5) + GABE(4)=P0(4)/P0(5) +C... rotate and boost string + IF(IPAR(38).eq.1.or.IPAR(38).eq.3)THEN +c sample additional soft pt for remnant partons + CALL PTDIS_4FLV(0,PX,PY) + PTR = SQRT(PX**2+PY**2) + PTOT = SQRT(4.D0*PTR**2+P0(5)**2)*0.5D0 +c rotation factors + COD = 0.5D0*P0(5)/PTOT + SID = PTR/PTOT +c COD= 1.D0/SQRT(1.D0+4.D0*PTR**2/P0(5)) +c SID= 2.D0*PTR/P0(5)*COD + COF=1.D0 + SIF=0.D0 + IF(PTOT*SID.GT.EPS5) THEN + COF=PX/(SID*PTOT) + SIF=PY/(SID*PTOT) + ANORF=DSQRT(COF*COF+SIF*SIF) + COF=COF/ANORF + SIF=SIF/ANORF + ENDIF + IF(ndebug.gt.3)THEN + write(lun,*)' EXCTDEC: rotation factors (cod,sid,cof,sif):', + & cod,sid,cof,sif + write(lun,*)' EXCTDEC: rotation angles (theta,phi):', + & ACOS(cod),ACOS(cof) + ENDIF +c rotate string final state + DO K=N1,NP + CALL SIB_TRANI(P(K,1),P(k,2),P(k,3),cod,sid,cof,sif + & ,P2(1),P2(2),P2(3)) + do j=1,3 + P(K,j)=P2(j) + enddo + ENDDO +c boost to hadron-hadron center-of-mass + IF(ndebug.gt.3) + & write(lun,*) ' EXCTDEC: boost to had-had (gabe,gam):', + & (gabe(j),j=1,4) + DO K=N1,NP + NPORIG(K) = IPFLAG + niorig(K) = iiflag + CALL SIB_ALTRA(gabe(4),gabe(1),gabe(2), + & gabe(3),P(k,1),p(k,2),p(k,3),p(k,4), + & P1TOT,p2(1),p2(2),p2(3),p2(4)) + do j=1,4 + P(K,j)=P2(j) + enddo + ENDDO + ELSEIF(IPAR(38).eq.2.or.IPAR(38).eq.0)THEN +C... boost string + DO I=N1,NP + NPORIG(I) = IPFLAG + niorig(I) = iiflag + BEP=BE(1)*P(I,1)+BE(2)*P(I,2)+BE(3)*P(I,3) + DO J=1,3 + P(I,J)=P(I,J)+GA*(GA*BEP/(1.D0+GA)+P(I,4))*BE(J) + ENDDO + P(I,4)=GA*(P(I,4)+BEP) + ENDDO + ENDIF + ENDIF + LBAD = 0 + PAR(2) = PAR2_def + PAR(8) = PAR8_def + PAR(24) = PAR24_def + return + END +C======================================================================= + + SUBROUTINE PTDIS_4FLV (IFL,PX,PY) + +C----------------------------------------------------------------------- +C...Generate pT +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + DOUBLE PRECISION PPT02 + COMMON /S_CQDIS2/ PPT02(44) + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + SAVE + + IF(IFL.eq.0)THEN +c quark confinement pt + PPTT = PAR(110) + XM = 0.325D0 + XM2 = XM**2 + RNDM = MAX(EPS10,S_RNDM(IFL)) + XMT = PPTT * LOG(RNDM) - XM + XMT2 = XMT**2 + PT = SQRT(XMT2-XM2) + ELSE + IFLA = IABS(IFL) + IFLA = MOD(IFLA,100) + PPTT = PPT02(IFLA) +c Gaussian distribution + PT = PPTT*SQRT(-LOG(MAX(EPS10,S_RNDM(IFL)))) + IF (IPAR(3).GE.1) THEN + IF(MOD(IFLA,10).NE.0) THEN + XM = QMASS(IFL) + ELSE + XM = 0.5D0 ! pomeron mass + IF(IPAR(3).ge.6) XM = 0.D0 + ENDIF +c exponential transverse mass + XM2 = XM**2 + RNDM = MAX(EPS10,S_RNDM(IFL)) + XMT = PPTT * LOG(RNDM) - XM + XMT2 = XMT**2 + PT = SQRT(XMT2-XM2) + ENDIF + ENDIF + PHI= TWOPI*S_RNDM(IFL) + PX=PT*COS(PHI) + PY=PT*SIN(PHI) + RETURN + END + +C======================================================================= + + SUBROUTINE PTSETUP_4FLV(ECM) + +C----------------------------------------------------------------------- +C moved from sib_ndiff to seperate subroutine +c so that changes will affect diff. /FR'13 +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + + DOUBLE PRECISION PPT02 + COMMON /S_CQDIS2/ PPT02(44) + SAVE + + SQS = ECM + +c NA22 piC retune + PTU=.3D0+.08D0*dlog10(sqs/30.D0) + PTS=.45D0+.08D0*dlog10(sqs/30.D0) + PTQQ=.6D0+.08D0*dlog10(sqs/30.D0) + PTPOM= .6D0+.08D0*dlog10(sqs/30.D0) + if ( IPAR(3).eq.1 ) then +c pt0 + ptu=.15D0+.007D0*dlog10(sqs/20.D0)**2 + pts=.3D0+.007D0*dlog10(sqs/20.D0)**2 + ptqq=.3D0+.03D0*dlog10(sqs/20.D0)**2 + ptpom= .6D0+.08D0*dlog10(sqs/30.D0) + elseif ( IPAR(3).eq.2 ) then +C pt1 + ptu=.15D0+.007D0*dlog10(sqs/20.D0)**2 + pts=.32D0+.007D0*dlog10(sqs/20.D0)**2 + ptqq=.4D0+.007D0*dlog10(sqs/20.D0)**2 + ptpom= .6D0+.08D0*dlog10(sqs/30.D0) +c pt2 + elseif ( IPAR(3).eq.3 ) then + ptu=.17D0+.007D0*dlog10(sqs/20.D0)**2 + pts=.3D0+.007D0*dlog10(sqs/20.D0)**2 + ptqq=.3D0+.03D0*dlog10(sqs/20.D0)**2 + ptpom = .6D0+.08D0*dlog10(sqs/30.D0) + elseif ( IPAR(3).eq.5 ) then + PTU=.16D0+.007D0*dlog10(sqs/20.D0)**2 + PTS=.28D0+.007D0*dlog10(sqs/20.D0)**2 + PTQQ= .3D0+.03D0*dlog10(sqs/20.D0)**2 + PTPOM = .23D0+.03D0*dlog10(sqs/20.D0)**2 + elseif ( IPAR(3).eq.6 ) then + PTU=.16D0+.007D0*dlog10(sqs/20.D0)**2 + PTS=.28D0+.007D0*dlog10(sqs/20.D0)**2 + PTQQ= .3D0+.03D0*dlog10(sqs/20.D0)**2 + PTPOM = .23D0+.03D0*dlog10(sqs/20.D0)**2 + elseif ( IPAR(3).eq.7 ) then + PTU= PAR(46) + .007D0*dlog10(sqs/20.D0)**2 + PTS= PAR(47) + .007D0*dlog10(sqs/20.D0)**2 + PTQQ= PAR(48) + .03D0*dlog10(sqs/20.D0)**2 + PTPOM = PAR(49) + .03D0*dlog10(sqs/20.D0)**2 + elseif ( IPAR(3).eq.8 ) then + ASQS = MAX(log10(SQS/PAR(109)),0.D0) + PTU= PAR(46) + PAR(68)*ASQS**2 + PTS= PAR(47) + PAR(70)*ASQS**2 + PTQQ= PAR(48) + PAR(69)*ASQS**2 + PTPOM = PAR(49) + PAR(51)*ASQS**2 + PTSEA = PAR(67) + PAR(52)*ASQS**2 + endif + PPT02 (1) = PTU + PPT02 (2) = PTU + PPT02 (3) = PTS +c valence pt + PPT02 (10) = PTPOM + DO J=11,33 + PPT02(J) = PTQQ + ENDDO +c soft minijet pt + PPT02 (20) = PTSEA +c sea quark pt + PPT02 (30) = PAR(132) +c charm pt + ASQS = MAX(log10(SQS/30.D0),0.D0) + IF(IPAR(16).eq.8)THEN + PTCHM= PAR(147) + PAR(149)*ASQS + PTCHB= PAR(148) + PAR(149)*ASQS + ELSE +c rc4a charm pt + PTCHM=0.308D0 + .165D0*ASQS + PTCHB=0.5D0 + .165D0*ASQS + ENDIF + PPT02(4) = PTCHM + PPT02(14) = PTCHB + PPT02(24) = PTCHB + DO J=34,44 + PPT02(J) = PTCHB + ENDDO + + IF(ndebug.gt.2)THEN + WRITE(LUN,*)' PTSETUP_4FLV: (sqs,(u,d),s,diq,pom,cm,cb)',sqs + + ,ppt02(1),ppt02(3),ppt02(11), ppt02(10),ppt02(4),ppt02(34) + ENDIF + + RETURN + END +C======================================================================= + + INTEGER FUNCTION IMRG2HAD(IFLB1,IFLB2) + +C----------------------------------------------------------------------- +C ----------------------------------------------------- +C function that merges two flavors into lightest hadron +C ----------------------------------------------------- + IMPLICIT NONE +c flavor merging array + INTEGER KFLV + COMMON /S_KFLV/ KFLV(4,43) + INTEGER IFLB1,IFLB2,IFLA,IFLB,IFL1,IFL2 + SAVE + + IFLA = IFLB1 + IFLB = IFLB2 +c order by flavor, meson: antiquark-quark, baryon: quark-diquark + IF(IFLB.lt.IFLA) CALL ISWTCH_LMNTS(ifla,iflb) +c if antibaryon switch again.. + IF(IFLB.lt.0) CALL ISWTCH_LMNTS(ifla,iflb) + IFL1 = IABS(IFLA) + IFL2 = IABS(IFLB) + IMRG2HAD = ISIGN(KFLV(IFL1,IFL2),IFLB) + END + +C======================================================================= + + SUBROUTINE SAMPLE_SEA_TOT + & (KRMNT,KINT,NSEA,XGAM,XJET,STR_MASS,XSJ,XX) + +C----------------------------------------------------------------------- +C input parameter: xgam,xjet,str_mass, Nsea,KINT,krmnt +c outpt parameter: xsj,xx +C----------------------------------------------------------------------- + IMPLICIT NONE + +c include COMMON blocks + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + +c input/output type definitions + DOUBLE PRECISION XGAM,XJET,STR_MASS,XSEA,XX,XSJ + DIMENSION XX(2*NW_max+2) + + INTEGER NSEA,KINT,KRMNT + +c local type definitions + DOUBLE PRECISION AC,GAMMAX,S_RNDM,XA,XREM,R,Z,Z1,Z2,XMINA + INTEGER j,jj,ilast + SAVE + DATA AC /-0.2761856692D0/ ! log(2) - gamma(Eulero) + + GAMMAX = xgam + XMINA = 2.D0*STR_mass/SQS + IF(IPAR(73).eq.1.and.KINT.gt.1) GAMMAX = PAR(119) + IF(ndebug.gt.3) THEN + WRITE(LUN,*)' IMRG2HAD: called with ', + & '(KRMNT,KINT,NSEA,XGAM,XJET,STR_MASS):', + & KRMNT,KINT,NSEA,XGAM,XJET,STR_MASS + + WRITE(LUN,*)' IMRG2HAD: XMIN,XMIN*N,XREM:', + & XMINA,NSEA*XMINA,1.D0-XJET + ENDIF +c sample total fraction for sea partons.. + Z1 = LOG(DBLE(NSEA)) + 50 Z2 = LOG(0.5D0*SQS*(1.D0-XJET)/STR_MASS-2.D0) + R = S_RNDM(0) + Z=(Z1+AC)*(1.D0+R*(((Z2+AC)/(Z1+AC))**NSEA-1.D0)) + & **(1.D0/DBLE(NSEA))-AC + XSEA = XMINA*EXP(Z) + IF(ndebug.gt.3) WRITE(LUN,*) ' total SEA fraction:' , xsea + IF ( (1.D0-XSEA)**GAMMAX .LT. S_RNDM(1)) GOTO 50 +c maximal fraction remaining for valence.. + 60 XREM = XSEA - DBLE(Nsea)*XMINA + IF(ndebug.gt.3) + & WRITE(LUN,*) ' Xsea,xval,xjet:', + & xsea,1.D0-XSEA-XJET,xjet + +C... Split the energy of sea partons among the different partons + DO j=1,Nsea-1 + jj = 2+j + IF(KRMNT.eq.0) jj = 4+j +c fraction for first parton + XA = XREM*S_RNDM(J) +c for interactions other than first decrease energy fraction +c (beam side hadron can participate in multiple binary collisions) +c IF(KINT.gt.1.and.j.gt.2*KRMNT) XA=SIGN(ABS(XA)**PAR(116),XA) + XX(jj) = XMINA + XA +c new remainder + XREM = XREM - XA + IF(ndebug.gt.3) write(lun,*)' x1,j,rem,xa',xX(jj),jj,xrem,xa + ENDDO +c last parton.. + ilast = 2+Nsea + IF(KRMNT.eq.0) ilast = 4+Nsea + XX(ILAST) = XMINA + XREM + +c break symmetry between nucleon interactions +c first interaction takes most energy + IF(KINT.gt.1.and.IPAR(71).eq.1)THEN + JJ = 3 + IF(KRMNT.eq.0) JJ = 5 + if(ndebug.gt.4) write(lun,*) ' x1+x2,p*xeq:', + & XX(JJ)+XX(JJ+1),PAR(117)*XSEA/KINT + IF(XX(JJ)+XX(JJ+1).lt.PAR(117)*XSEA/KINT) GOTO 60 + ENDIF + + XSJ = XSJ + XSEA + IF(ndebug.gt.3)THEN + write(lun,*)' x1,N,rem',xx(ilast),ilast,xrem + write(lun,*) ' xseajet',xsj + endif + + END +C----------------------------------------------------------------------- +C +C dummy subroutines, remove to link PDFLIB +C +C======================================================================= +c +c SUBROUTINE PDFSET(PARAM,VALUE) +c +c----------------------------------------------------------------------- +c IMPLICIT DOUBLE PRECISION (A-H,O-Z) +c IMPLICIT INTEGER(I-N) +c DIMENSION PARAM(20),VALUE(20) +c CHARACTER*20 PARAM +c END +c +c======================================================================= +c +c SUBROUTINE STRUCTM(XI,SCALE2,UV,DV,US,DS,SS,CS,BS,TS,GL) +c +c----------------------------------------------------------------------- +c IMPLICIT DOUBLE PRECISION (A-H,O-Z) +c IMPLICIT INTEGER(I-N) +c END +c +c======================================================================= +c +c SUBROUTINE STRUCTP(XI,SCALE2,P2,IP2,UV,DV,US,DS,SS,CS,BS,TS,GL) +c +c----------------------------------------------------------------------- +c IMPLICIT DOUBLE PRECISION (A-H,O-Z) +c IMPLICIT INTEGER(I-N) +c END +c +C----------------------------------------------------------------------- +C +C======================================================================= + + SUBROUTINE SIB_NDIFF(K_beam, NW, Ecm, Irec, IREJ) + +C----------------------------------------------------------------------- +C routine that samples and fragments a non-diffractive interaction +C +C 3 stages: 0: setup +C 1: sampling of event structure (number of parton interactions) +C (labeled as 2000) +C 2: sampling of kinematics +C (labeled as 3000) +C 3: fragmentation +C----------------------------------------------------------------------- + IMPLICIT NONE + +c external types + DOUBLE PRECISION ECM + INTEGER K_beam, NW, Irec, IREJ + +c COMMONs + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT +C The final particle output is contained in COMMON /S_PLIST/ +C NP : number of final particles +C P(1:NP, 1:5) : 4-momenta + masses of the final particles +C LLIST (1:NP) : codes of final particles + DOUBLE PRECISION P + INTEGER NP,LLIST,NP_max + PARAMETER (NP_max=8000) + COMMON /S_PLIST/ P(NP_max,5), LLIST(NP_max), NP + + INTEGER NFORIG,NPORIG,NIORIG,IPFLAG,IIFLAG,KINT + COMMON /S_PARTO/ NFORIG(NP_max),NPORIG(NP_max),NIORIG(NP_max), + &IPFLAG,IIFLAG,KINT +C parameters that represent: NW: max. number of wounded nucleons, +C NS,NH: max. number of soft and hard interactions +c PARAMETER (NW_max = 20) +C The COMMON block /S_CHIST/ contains information about the +C the structure of the generated event: +C NWD = number of wounded nucleons +C NJET = total number of hard interactions +C NSOF = total number of soft interactions +C NNSOF (1:NW) = number of soft pomeron cuts in each interaction +C NNJET (1:NW) = number of minijets produced in each interaction +C JDIF(1:NW) = diffraction code +C 0 : non-diff, +C 1 : beam-diff +C 2 : target-diff +C 3 : double-diff + INTEGER NNSOF,NNJET,JDIF,NWD,NJET,NSOF + COMMON /S_CHIST/ NNSOF(NW_max),NNJET(NW_max), + & JDIF(NW_max),NWD,NJET,NSOF + INTEGER NS_max, NH_max + PARAMETER (NS_max = 20, NH_max = 80) + + INTEGER IBMRDX,ITGRDX,IHMJDX,ISMJDX,ICSTDX,IINTDX + COMMON /S_INDX/ IBMRDX(3),ITGRDX(NW_max,3), + & IHMJDX(NW_max*NH_max),IINTDX(NW_max), + & ISMJDX(NW_max*NS_max),ICSTDX(2*NW_max,3) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + INTEGER ITRY, NREJ + COMMON /S_CNT/ ITRY(20), NREJ(20) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + +c internal type declarations + DOUBLE PRECISION X2JET,SQS_0,PZ,E2,PAWT,xnsof,xnjet,xjdif,x1jet, + & Esum,PXsum,PYsum,PZsum + DIMENSION X2JET(NW_max) + INTEGER LL,LXBAD,NP_0,NPP_0,NPP0_0,J,JJ,I,KBA,L,NPP_1,NPP0_1, + & IREFout,IREF,nj,ns,nv,II,Idm,LPID,NF,NPP,NPP0 + DIMENSION LL(99) + SAVE + DATA LL /5*0,7*2,2*1,12*0,2,6*0,6*1,19*0,2,2,10*0, + & 2,2,0,2,2,11*0,1,1,1,9*0,1/ + + +C.. setup stage + IREJ = 1 +c default return point is kinematic sampling stage + LXBAD = 3 + +c remember initial setup + NP_0 = NP + SQS_0 = SQS +c remember position on parton stack + CALL GET_NPP(NPP_0,NPP0_0) + +c set interaction properties +c IF(Irec.ne.1) CALL INI_EVENT(ECM,K_beam,Idm,Irec) + + IF(ndebug.gt.0)then + IF(Irec.eq.0)THEN + WRITE(LUN,*) + & ' SIB_NDIFF: recursive call with (ecm,kb,kt,np,jdif):', + & ecm,k_beam,kt(1),(jdif(j),j=1,NW),NP + ELSE + WRITE(LUN,*)' SIB_NDIFF: regular call with (ECM,KB,NW,KT,', + & 'JDIF,NP):',ecm,k_beam,NW,(kt(ii),ii=1,NW), + & (jdif(j),j=1,NW),NP + ENDIF + ENDIF + + 2000 CONTINUE + +c reset parton stack + CALL INI_PRTN_STCK(NPP_0,NPP0_0) + +C... sample multiple interaction configuration + KBA = IABS(K_beam) + L = LL(KBA) + DO I=1,NW + if(JDIF(I).eq.0) then + CALL CUT_PRO(L, SQS, PTmin, NNSOF(I), NNJET(I)) + else + NNSOF(I) = 1 + NNJET(I) = 0 + endif +c add incoming target particles + PZ = PAWT(SQS,AM(KBA),AM(KT(I))) + E2 = SQRT(PZ**2+AM2(KT(I))) + CALL ADD_PRTN(0.D0,0.D0,-PZ,E2,AM(KT(I)),KT(I),-2,0,IREFout) + +c add interactions + xjdif = dble(jdif(I)) + xnjet = dble(nnjet(I)) + xnsof = dble(nnsof(I)) + CALL ADD_PRTN(xnsof,xnjet,xjdif,sqs,0.D0,I,-1,IREFout,IREF) +c write parton stack index to interaction index + IINTDX(I) = IREF + ENDDO +c remember state of parton stack + CALL GET_NPP(NPP_1,NPP0_1) + +C... kinematic sampling stage + +C... sample x values + ITRY(1) = 0 + 3000 CONTINUE + ITRY(1) = ITRY(1)+1 + IF(ITRY(1).GT.NREJ(1)) THEN +c NCALL = NCALL + 1 + GOTO 2000 + ENDIF + NP = NP_0 + CALL INI_PRTN_STCK(NPP_1,NPP0_1) + + CALL SAMPLE_MINIJET(L,NW,NNJET,NNSOF,NJET,NSOF,x1jet,x2jet,lxbad) + IF(LXBAD.eq.3)THEN +c reject kinematics + GOTO 3000 + ELSEIF(LXBAD.eq.2)THEN +c reject kinematics and event structure +c NCALL = NCALL + 1 + GOTO 2000 + ELSEIF(LXBAD.eq.1)THEN +c reject entire event + if(Ndebug.gt.0) + & WRITE(LUN,*)' SIB_NDIFF: minijet rejection (Ncall):',Ncall +c restore initial state + NP = NP_0 + CALL INI_PRTN_STCK(NPP_0,NPP0_0) + SQS = SQS_0 + S = SQS*SQS + RETURN + ENDIF + +C... Prepare 2*NW valence/sea color strings and/or remnant. + +c default return point, jump back to sampling interaction structure +c LXBAD = 2 + CALl SAMPLE_RMNT(K_beam,NW,X1Jet,X2JET,Irec,LXBAD) + IF(LXBAD.eq.3)THEN +c reject kinematics + GOTO 3000 + ELSEIF(LXBAD.eq.2)THEN +c reject kinematics and event structure +c NCALL = NCALL + 1 + GOTO 2000 + ELSEIF(LXBAD.eq.1)THEN +c reject entire event + if(Ndebug.gt.0) + & WRITE(LUN,*)' SIB_NDIFF: rmnt rejection (Ncall,NW):',Ncall,NW +c restore initial state + NP = NP_0 + CALL INI_PRTN_STCK(NPP_0,NPP0_0) + SQS = SQS_0 + S = SQS*SQS + RETURN + ENDIF + +C Check parton final state.. + CALL GET_NPP(NPP,NPP0) + CALL PPSUM(1,NPP,Esum,PXsum,PYsum,PZsum,NF) + IF(ABS(Esum/(0.5D0*Ecm*DBLE(NW+1))-1.D0).GT.EPS3)THEN + WRITE(LUN,*) ' SIB_NDIFF: energy not conserved! : ',Ncall + WRITE(LUN,*) ' sqs_inp = ', Ecm, ' sqs_out = ', Esum + CALL PRNT_PRTN_STCK + WRITE(LUN,*) ' SIB_NDIFF: event rejected! ', + & 'partons do not conserve energy' + WRITE(LUN,*)' (Ncall,NW,NPP,NJET,NSOF):',Ncall,NW,NPP,NJET,NSOF +c CALL SIB_REJECT('SIB_NDIFF ') +c restore initial state + NP = NP_0 + CALL INI_PRTN_STCK(NPP_0,NPP0_0) + SQS = SQS_0 + S = SQS*SQS + RETURN + ENDIF + IF(NDEBUG.gt.0) THEN + IF(NDEBUG.gt.1) CALL PRNT_PRTN_STCK + WRITE(LUN,*) ' SIB_NDIFF: entering fragmentation stage...' + ENDIF + +C... Fragmentation stage + nj = 0 + ns = 0 + nv = 0 + II = NPP0_0+1 + DO WHILE (II.gt.0) +c default return point: reject event if fragmentation fails + LXBAD = 1 +c loop over level0 partons + CALL ITR_LVL0_PRTN(II,JJ,LPID) +c read interaction + CALL RD_INT(jj,Idm,iiflag) + +C... Fragmentation of soft/hard sea color strings + IF(LPID.eq.100)THEN + nj = nj + 1 + ipflag = 100 + KINT = nj + CALL FRAG_MINIJET(jj,LXBAD) + IF(LXBAD.ne.0) RETURN + + ELSEIF(LPID.eq.10)THEN + ns = ns + 1 + ipflag = 10 + KINT = ns + CALL FRAG_MINIJET(jj,LXBAD) + IF(LXBAD.ne.0) RETURN + +C... fragment 'valence' strings + ELSEIF(LPID.eq.1)THEN + nv = nv + 1 + KINT = nv + ipflag = 1 + CALL FRAG_VLNCE(jj,LXBAD) + IF(LXBAD.ne.0) RETURN + +C... fragment remnants + ELSEIF(IABS(LPID).eq.2)THEN + CALL EXCTDEC(JJ,LXBAD) + IF(LXBAD.ne.0) RETURN + +C... fragment incoherent diffraction + ELSEIF(LPID.eq.-10.or.LPID.eq.-20.or.LPID.eq.-30)THEN + CALL FRAG_INCHRNT_DIFF(jj,lxbad) + IF(LXBAD.ne.0) RETURN + + ENDIF + ENDDO + IREJ = 0 + + END +C======================================================================= + + SUBROUTINE SAMPLE_RMNT(Kbeam,NW,X1JET,X2JET,Irec,LBAD) + +C----------------------------------------------------------------------- +C routine to sample remnants +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER NW_max + PARAMETER (NW_max = 20) + INTEGER ITRY, NREJ + COMMON /S_CNT/ ITRY(20), NREJ(20) + +c external type declarations + DOUBLE PRECISION X1JET,X2JET + DIMENSION X2JET(NW_max) + INTEGER KBEAM,NW,IREC,LBAD + +C COMMONs + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) +C parameters that represent: NW: max. number of wounded nucleons, +C NS,NH: max. number of soft and hard interactions +c PARAMETER (NW_max = 20) +C The COMMON block /S_CHIST/ contains information about the +C the structure of the generated event: +C NWD = number of wounded nucleons +C NJET = total number of hard interactions +C NSOF = total number of soft interactions +C NNSOF (1:NW) = number of soft pomeron cuts in each interaction +C NNJET (1:NW) = number of minijets produced in each interaction +C JDIF(1:NW) = diffraction code +C 0 : non-diff, +C 1 : beam-diff +C 2 : target-diff +C 3 : double-diff + INTEGER NNSOF,NNJET,JDIF,NWD,NJET,NSOF + COMMON /S_CHIST/ NNSOF(NW_max),NNJET(NW_max), + & JDIF(NW_max),NWD,NJET,NSOF + + INTEGER IRMNT,KRB,KRT + DOUBLE PRECISION XRMASS,XRMEX + COMMON /S_RMNT/ XRMASS(2),XRMEX(2),IRMNT(NW_max),KRB,KRT(NW_max) + + INTEGER ICHP,ISTR,IBAR + COMMON /S_CHP/ ICHP(99), ISTR(99), IBAR(99) + + INTEGER IISO,ISPN + COMMON /S_SPN/ IISO(99), ISPN(99) + + INTEGER ICHM + COMMON /S_CHM/ ICHM(99) + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + +c internals + DOUBLE PRECISION PREM,PREM_NUC,R,R2,S_RNDM,FLVXCHG,ALPH + INTEGER ITGRMNT,IBMRMNT,I,j,jj,K,NPPLD,NPP0LD,IBMRMNT_OLD, + & IBAD,IKBAD,KBM + DIMENSION ITGRMNT(NW_max) + SAVE + DATA PREM /0.D0/ , PREM_NUC /0.D0/ + + IF(Ndebug.gt.1) + & WRITE(LUN,*)' SAMPLE_RMNT: called with (Kbeam,NW,X1JET,', + & 'X2JET,JDIF,Irec):',Kbeam,NW,X1JET,(X2JET(JJ),JJ=1,NW), + & (JDIF(JJ),JJ=1,NW),Irec + + IF(Irec.eq.0.and.NW.ne.1)then + WRITE(LUN,*)' SAMPLE_RMNT: recursive call inconsistent!' + CALL SIB_REJECT('SAMPLE_RMNT ') + endif + +c default return point for remnant excitation routine: +c beam and target sampling + IBAD = 1 + +c set trial counter + ITRY(2) = 0 +c remember position on parton stack + CALL GET_NPP(NPPLD,NPP0LD) + +C... sample no. of remnants +c ibmrmnt: 0,1..NW : number of excitations on beamside +C itgrmnt: 0,1 : target side excitation + +c prob. of remnant excitation + IF(IPAR(78).ne.0)THEN + PREM = PAR(23) + PREM_NUC = PAR(23) + IF(IPAR(84).eq.2.and.IBAR(IABS(KBeam)).eq.0) + & PREM = PAR(140) + ENDIF + +c define Prem as probablility for remnant survival +c switch to sampling of remnant de-excitation + IF(IPAR(79).ne.0) PREM = 1.D0-PREM + +c prob. of remnant excitation target side + IF(IPAR(79).ne.0) PREM_NUC = 1.D0-PAR(23) + IF(IPAR(63).eq.1) PREM_NUC = PREM_NUC/dble(NW) + +c turn of remnant for Nw>1 + IF(IPAR(77).eq.1)THEN +c only beamside + IF(NW.gt.1) PREM = 0 + ELSEIF(IPAR(77).eq.2)THEN +c target and beam-side + IF(NW.gt.1) then + PREM = 0.D0 + PREM_NUC = 0.D0 + endif + ELSE + CONTINUE + ENDIF + +C... remnant mass dis. exponents + XRMEX(1) = PAR(98) ! baryons + IF(IPAR(84).gt.0)THEN + XRMEX(2) = PAR(141) ! mesons + else + XRMEX(2) = PAR(98) ! mesons same as baryons + endif + + IBMRMNT = 0 + DO K=1, NW +c additionally penalize remnant survival for multiple nucleon interactions + IF(IPAR(79).eq.2.and.K.gt.1) PREM=1.D0-PAR(23)*PAR(128) +c penalize remnant survival for multiple parton interactions + IF(IPAR(80).ne.0) THEN +c multiple interaction penalty for remnant survival, individual interaction + ALPH = 1.D0+PAR(129)*DBLE(NNSOF(K)+NNJET(K)-1) + PREM = 1.D0-(1.D0-PREM)**ALPH + PREM_NUC = 1.D0-(1.D0-PREM_NUC)**ALPH + ENDIF + IF(JDIF(K).eq.0)THEN + R = S_RNDM(k) + R2 = S_RNDM(0) + IF(R.LT.PREM) IBMRMNT = IBMRMNT + 1 +c no target side excitation if recursive call (irec=0)! + IF(R2.LT.PREM_NUC*Irec) THEN + ITGRMNT(K) = 1 + ELSE + ITGRMNT(K) = 0 + ENDIF + ELSE + ITGRMNT(K) = 0 + ENDIF + IF(Ndebug.gt.1) + & WRITE(LUN,'(2X,A,1X,I2,1X,F5.3,1X,I2,1X,I2,1X,I2,1X,I2)') + & 'SAMPLE_RMNT: (JW,PREM,NS,NH,IBMRMNT,LTGRMNT):', + & K,PREM,NNSOF(k),NNJET(k),IBMRMNT,ITGRMNT(k) + ENDDO + IF(IPAR(79).ne.0)THEN +c Prem was redefined as probablility for remnant destruction +c therefore invert configuration.. + DO K=1, NW + IF(JDIF(K).eq.0)THEN + ITGRMNT(K)=IABS(ITGRMNT(K)-1) + ENDIF + ENDDO +c multiple de-excitations not possible.. + IBMRMNT=MIN(IBMRMNT,1) + IBMRMNT=IABS(IBMRMNT-1)*Irec + ENDIF + IF(Ndebug.gt.1) + & WRITE(LUN,*) + & ' SAMPLE_RMNT: remnant sampling (PREM,NW,LBMRMNT,LTGRMNT): ', + & PREM,NW,IBMRMNT,(ITGRMNT(j),j=1,NW) + + IBMRMNT_OLD = IBMRMNT + +C... Sample flavor and momentum fractions + 20 ITRY(2) = ITRY(2) + 1 +c reset parton stack + CALL INI_PRTN_STCK(NPPLD,NPP0LD) + IBMRMNT = IBMRMNT_OLD + +c retry without counting +c 22 CONTINUE + IF(ITRY(2).gt.NREJ(2))THEN + LBAD = 2 + IF(ndebug.gt.1)then + WRITE(LUN,*)' SAMPLE_RMNT: number of trials exceeded' + WRITE(LUN,*)' resample minijets...(IREJ,NW,NCALL)', + & LBAD, NW, NCALL + endif +c raise event call counter +c NCALL = NCALL + 1 + RETURN + ENDIF + + Kbm = Kbeam + +C.. sample central strings and remnant flavor + flvXchg = PAR(80) ! prob. of flv exchange between strgs and rmnt +c remnant and sea on beam side + CALL SAMPLE_BEAM(Kbm,NW,flvXchg,IBMRMNT,X1JET,IKBAD) + IF(IKBAD.eq.1)THEN +c resample minijets event + LBAD = 3 + RETURN + ELSEIF(IKBAD.eq.2)THEN +c too many partons, reject NW, i.e. entire event + LBAD = 1 + RETURN + ENDIF + +c remnants and sea on target side + CALL SAMPLE_TARGET(NW,flvXchg,ITGRMNT,X2JET,Irec,IKBAD) + IF(IKBAD.eq.1)THEN +c resample minijets event + LBAD = 3 + RETURN + ELSEIF(IKBAD.eq.2)THEN +c too many partons, reject NW, i.e. entire event + LBAD = 1 + RETURN + ENDIF + +C... sample remnant excitation masses and add to parton stack +c beam-side (one remnant, formed by several interactions) +c target-side (possibly NW remnants) + + DO I=1,NW +c default return point + IBAD = 1 + IF(IPAR(78).EQ.1)THEN +c$$$ write(lun,*) +c$$$ & ' SIB_RMNT: multiple excitation model', +c$$$ & ' not implemented yet!' +c$$$ stop +c model where beam side remnant can receive mass from multiple target nucleons + IF(IBMRMNT.gt.0)THEN +c beam side remnant excited + if(ITGRMNT(I).eq.0)then + CALL EXCT_RMNT(I,1,IBAD) + else + CALL EXCT_RMNT(I,3,IBAD) + endif + IBMRMNT = IBMRMNT - 1 + ELSE +c beam side remnant not excited + if(ITGRMNT(I).ne.0)then + CALL EXCT_RMNT(I,2,IBAD) + else + CALL EXCT_RMNT(I,0,IBAD) + endif + ENDIF + + ELSEIF(IPAR(78).eq.2)then + IF(IBMRMNT.gt.0)then +c beam side remnant excited, only once! + IF(ITGRMNT(I).eq.0)then + CALL EXCT_RMNT(I,1,IBAD) + else + CALL EXCT_RMNT(I,3,IBAD) + endif + IBMRMNT = 0 + ELSE +c beam side remnant not excited + IF(ITGRMNT(I).ne.0)then + CALL EXCT_RMNT(I,2,IBAD) + else + CALL EXCT_RMNT(I,0,IBAD) + endif + ENDIF + ELSE +c no remnant model + CALL EXCT_RMNT(I,0,IBAD) + ENDIF +c catch remant excitation exception, redo sea kinematics.. + IF(IBAD.eq.1) GOTO 20 +c catch severe exception, resample minijet kinematics.. + IF(IBAD.eq.2) THEN + LBAD = 3 + RETURN ! resample event + ENDIF + ENDDO + LBAD = 0 + + END +C======================================================================= + + SUBROUTINE SIB_HADCSL(L,ECM,SIGTOT,SIGEL,SIGINEL,SIGDIF,SLOPE,RHO) + +C----------------------------------------------------------------------- +C low-energy cross section parametrizations (target always proton) +C +C input: L beam particle: (1 - proton, +C 2 - pion, +C 3 - kaon) +C target is always proton +C ECM c.m. energy (GeV) +C +C output: SIGTOT total cross section (mb) +C SIGEL elastic cross section (mb) +C SIGDIF diffractive cross section (sd-1,sd-2,dd, mb) +C SLOPE forward elastic slope (GeV**-2) +C RHO real/imaginary part of elastic amplitude +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + DIMENSION SIGDIF(3) + + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + SAVE + +C proton-proton cross section as reference + CALL SIB_HADCS1(1,ECM,SIGTOT,SIGEL,SIGINEL,SLOPE,RHO) + +C parametrization for diffraction + Xi_min = 1.5D0/(ECM*ECM) + Xi_max = PAR(13) + SIGeff = SIGEL + CALL SIB_HADCS2(ECM,Xi_min,Xi_max,SIGeff,SIGDIF) + + if(L.eq.1) return + +C regge motivated rescaling of diffraction dissociation + sigtot_pp = SIGTOT + sigel_pp = SIGEL + slope_pp = SLOPE + CALL SIB_HADCS1(L,ECM,SIGTOT,SIGEL,SIGINEL,SLOPE,RHO) + SIGDIF(1) = slope_pp/SLOPE*SIGTOT/sigtot_pp*SIGDIF(1) + SIGDIF(2) = slope_pp/SLOPE*SIGEL/sigel_pp*SIGDIF(2) + SIGDIF(3) = SIGTOT/sigtot_pp*SIGDIF(3) + + END + +C======================================================================= + + SUBROUTINE SIB_HADCS1(L,ECM,SIGTOT,SIGEL,SIGINEL,SLOPE,RHO) + +C----------------------------------------------------------------------- +C low-energy cross section parametrizations +C +C input: L beam particle: (1 - proton, +C 2 - pion, +C 3 - kaon) +C target is always proton +C ECM c.m. energy (GeV) +C +C output: SIGTOT total cross section (mb) +C SIGEL elastic cross section (mb) +C SIGDIF diffractive cross section (sd-1,sd-2,dd, mb) +C SLOPE forward elastic slope (GeV**-2) +C RHO real/imaginary part of elastic amplitude +C +C comments: +C - low-energy data interpolation uses PDG fits from 1992 +C - slopes from ???, new fit to pp data +C - high-energy extrapolation by Donnachie-Landshoff like fit made +C by PDG 1996 +C - analytic extension of amplitude to calculate rho +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + DIMENSION TPDG92(7,2,6),TPDG96(9,6),BURQ83(3,6),XMA(6) + SAVE + + DATA TPDG92 / + & 3.D0, 2100.D0, 48.D0, 0.D0, 1.D0, 0.522D0, -4.51D0, + & 3.D0, 2100.D0, 11.9D0, 26.9D0, -1.21D0, 0.169D0, -1.85D0, + & 5.D0, 2100.D0, 38.4D0, 77.6D0, -0.64D0, 0.26D0, -1.2D0, + & 5.D0, 2100.D0, 10.2D0, 52.7D0, -1.16D0, 0.125D0, -1.28D0, + & 4.D0, 340.D0, 16.4D0, 19.3D0, -0.42D0, 0.19D0, 0.D0, + & 4.D0, 340.D0, 0.D0, 11.4D0, -0.4D0, 0.079D0, 0.D0, + & 2.5D0, 370.D0, 33.D0, 14.D0, -1.36D0, 0.456D0, -4.03D0, + & 2.5D0, 370.D0, 1.76D0, 11.2D0, -0.64D0, 0.043D0, 0.D0, + & 2.D0, 310.D0, 18.1D0, 0.D0, 1.D0, 0.26D0, -1.D0, + & 2.D0, 310.D0, 5.D0, 8.1D0, -1.8D0, 0.16D0, -1.3D0, + & 3.D0, 310.D0, 32.1D0, 0.D0, 1.D0, 0.66D0, -5.6D0, + & 3.D0, 310.D0, 7.3D0, 0.D0, 1.D0, 0.29D0, -2.4D0 / + + DATA TPDG96 / + & 50.D0, 22.D0,0.079D0,0.25D0,0.D0, + & 77.15D0,-21.05D0,0.46D0,0.9D0, + & 50.D0, 22.D0,0.079D0,0.25D0,0.D0, + & 77.15D0,21.05D0,0.46D0,0.9D0, + & 10.D0, 13.70D0,0.079D0,0.25D0,0.D0, + & 31.85D0,-4.05D0,0.45D0,0.9D0, + & 10.D0, 13.70D0,0.079D0,0.25D0,0.D0, + & 31.85D0,4.05D0,0.45D0,0.9D0, + & 10.D0, 12.20D0,0.079D0,0.25D0,0.D0, + & 17.35D0,-9.05D0,0.50D0,0.9D0, + & 10.D0, 12.20D0,0.079D0,0.25D0,0.D0, + & 17.35D0,9.05D0,0.50D0,0.9D0 / + + DATA BURQ83 / + & 8.557D0, 0.00D0, 0.574D0, + & 11.13D0, 7.23D0, 0.30D0, + & 9.11D0, -0.73D0, 0.28D0, + & 9.11D0, 0.65D0, 0.28D0, + & 8.55D0, -5.98D0, 0.28D0, + & 8.55D0, 1.60D0, 0.28D0 / + +c DATA XMA / 2*0.93956563D0, 2*0.13956995D0, 2*0.493677D0 / + DATA GEV2MB /0.389365D0/ + DATA INIT/0/ + + IF(INIT.EQ.0) THEN +c use the internal masses + XMA(1) = AM(13) ! proton + XMA(2) = AM(14) ! neutron + XMA(3) = AM(7) ! pi+ + XMA(4) = AM(8) ! pi- + XMA(5) = AM(9) ! K+ + XMA(6) = AM(10) ! K- + INIT = 1 + ENDIF + +C find index + IF (L.eq.1) THEN + K = 1 ! p p + ELSEIF(L.eq.2) THEN + K = 3 ! pi+ p +* K = 4 ! pi- p + ELSEIF(L.eq.3) THEN + K = 5 ! K+ p +* K = 6 ! K- p + ELSE + GOTO 100 + ENDIF + +C calculate lab momentum + SS = ECM**2 + E1 = (SS-XMA(1)**2-XMA(K)**2)/(2.D0*XMA(1)) + PL = dSQRT((E1-XMA(K))*(E1+XMA(K))) + PLL = dLOG(PL) + +C check against lower limit + IF(ECM.LE.XMA(1)+XMA(K)) GOTO 200 + + XP = TPDG96(2,K)*SS**TPDG96(3,K) + YP = TPDG96(6,K)/SS**TPDG96(8,K) + YM = TPDG96(7,K)/SS**TPDG96(8,K) + + PHR = dTAN(PI/2.D0*(1.D0-TPDG96(8,K))) + PHP = dTAN(PI/2.D0*(1.D0+TPDG96(3,K))) + RHO = (-YP/PHR + YM*PHR - XP/PHP)/(YP+YM+XP) + + SLOPE = BURQ83(1,K)+BURQ83(2,K)/dSQRT(PL)+BURQ83(3,K)*PLL + +C select energy range and interpolation method + IF(PL.LT.TPDG96(1,K)) THEN + SIGTOT = TPDG92(3,1,K)+TPDG92(4,1,K)*PL**TPDG92(5,1,K) + & + TPDG92(6,1,K)*PLL**2+TPDG92(7,1,K)*PLL + SIGEL = TPDG92(3,2,K)+TPDG92(4,2,K)*PL**TPDG92(5,2,K) + & + TPDG92(6,2,K)*PLL**2+TPDG92(7,2,K)*PLL + ELSE IF(PL.LT.TPDG92(2,1,K)) THEN + SIGTO1 = TPDG92(3,1,K)+TPDG92(4,1,K)*PL**TPDG92(5,1,K) + & + TPDG92(6,1,K)*PLL**2+TPDG92(7,1,K)*PLL + SIGEL1 = TPDG92(3,2,K)+TPDG92(4,2,K)*PL**TPDG92(5,2,K) + & + TPDG92(6,2,K)*PLL**2+TPDG92(7,2,K)*PLL + SIGTO2 = YP+YM+XP + SIGEL2 = SIGTO2**2/(16.D0*PI*SLOPE*GEV2MB)*(1.D0+RHO**2) + X2 = dLOG(PL/TPDG96(1,K))/dLOG(TPDG92(2,1,K)/TPDG96(1,K)) + X1 = 1.D0 - X2 + SIGTOT = SIGTO2*X2 + SIGTO1*X1 + SIGEL = SIGEL2*X2 + SIGEL1*X1 + ELSE + SIGTOT = YP+YM+XP + SIGEL = SIGTOT**2/(16.D0*PI*SLOPE*GEV2MB)*(1.D0+RHO**2) + ENDIF + SIGINEL = SIGTOT-SIGEL + + RETURN + + 100 CONTINUE + WRITE(LUN,'(1X,2A,2I7)') ' SIB_HADCS1: ', + & 'invalid beam particle: ',L + RETURN + + 200 CONTINUE + WRITE(LUN,'(1X,2A,1P,E12.4)') ' SIB_HADCS1: ', + & 'energy too small (Ecm): ',ECM + + END +C======================================================================= + + SUBROUTINE SIB_HADCS2(SQS,Xi_min,Xi_max,SIGeff,SIGDIF) + +C----------------------------------------------------------------------- +C cross section for diffraction dissociation +C +C - single diffraction dissociation: +C Goulianos' parametrization (Ref: PL B358 (1995) 379) +C - double diffration dissociation: simple scaling model using +C single diff. cross section +C +C in addition rescaling for different particles is applied using +C internal rescaling tables (not implemented yet) +C +C input: SQS c.m. energy (GeV) +C Xi_min min. diff mass (squared) = Xi_min*SQS**2 +C Xi_max max. diff mass (squared) = Xi_max*SQS**2 +C SIGeff effective cross section for DD scaling +C +C output: sig_sd1 cross section for diss. of particle 1 (mb) +C sig_sd2 cross section for diss. of particle 2 (mb) +C sig_dd cross section for diss. of both particles +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + DIMENSION SIGDIF(3) + DIMENSION Xpos1(96),Xwgh1(96),Xpos2(96),Xwgh2(96) + DOUBLE PRECISION xil,xiu,tl,tu + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + SAVE + +C model parameters + DATA delta / 0.104D0 / + DATA alphap / 0.25D0 / + DATA beta0 / 6.56D0 / + DATA gpom0 / 1.21D0 / + DATA xm_p / 0.938D0 / + DATA x_rad2 / 0.71D0 / + +C integration precision + DATA Ngau1 / 32 / + DATA Ngau2 / 32 / + + DATA GEV2MB /0.389365D0/ + + SIGDIF(1) = 0.D0 + SIGDIF(2) = 0.D0 + SIGDIF(3) = 0.D0 + + XIL = dLOG(Xi_min) + XIU = dLOG(Xi_max) + + if(XIL.ge.XIU) return + + SS = SQS*SQS + xm4_p2 = 4.D0*xm_p**2 + fac = beta0**2/(16.D0*PI) + + t1 = -5.D0 + t2 = 0.D0 + tl = x_rad2/3.D0/(1.D0-t1/x_rad2)**3 + tu = x_rad2/3.D0/(1.D0-t2/x_rad2)**3 + +C flux renormalization and cross section for pp/ppbar case + + Xnorm = 0.D0 + + xil = dlog(1.5D0/SS) + xiu = dlog(0.1D0) + + IF(xiu.LE.xil) goto 1000 + + CALL SIB_GAUSET(xil,xiu,Ngau1,xpos1,xwgh1) + CALL SIB_GAUSET(tl,tu,Ngau2,xpos2,xwgh2) + + do i1=1,Ngau1 + + xi = dexp(xpos1(i1)) + w_xi = Xwgh1(i1) + + do i2=1,Ngau2 + + tt = x_rad2-x_rad2*(x_rad2/(3.D0*xpos2(i2)))**(1.D0/3.D0) + + alpha_t = 1.D0+delta+alphap*tt + f2_t = ((xm4_p2-2.8D0*tt)/(xm4_p2-tt))**2 + + Xnorm = Xnorm + & + f2_t*xi**(2.D0-2.D0*alpha_t)*Xwgh2(i2)*w_xi + + enddo + enddo + + Xnorm = Xnorm*fac + + 1000 continue + + XIL = dLOG(Xi_min) + XIU = dLOG(Xi_max) + + T1 = -5.D0 + T2 = 0.D0 + + TL = x_rad2/3.D0/(1.D0-t1/x_rad2)**3 + TU = x_rad2/3.D0/(1.D0-t2/x_rad2)**3 + +C single diffraction diss. cross section + + CSdiff = 0.D0 + + CALL SIB_GAUSET(XIL,XIU,NGAU1,XPOS1,XWGH1) + CALL SIB_GAUSET(TL,TU,NGAU2,XPOS2,XWGH2) + + do i1=1,Ngau1 + + xi = dexp(xpos1(i1)) + w_xi = Xwgh1(i1)*beta0*gpom0*(xi*ss)**delta + + do i2=1,Ngau2 + + tt = x_rad2-x_rad2*(x_rad2/(3.D0*xpos2(i2)))**(1.D0/3.D0) + + alpha_t = 1.D0+delta+alphap*tt + f2_t = ((xm4_p2-2.8D0*tt)/(xm4_p2-tt))**2 + + CSdiff = CSdiff + & + f2_t*xi**(2.D0-2.D0*alpha_t)*Xwgh2(i2)*w_xi + + enddo + enddo + + CSdiff = CSdiff*fac*GEV2MB/MAX(1.D0,Xnorm) + +* write(LUN,'(1x,1p,4e14.3)') +* & sqrt(SS),Xnorm,2.d0*CSdiff*MAX(1.d0,Xnorm),2.d0*CSdiff + + SIGDIF(1) = CSdiff + SIGDIF(2) = CSdiff + +C double diff. dissociation from simple probability consideration +* Pdiff = 0.5d0-sqrt(0.25d0-CSdiff/SIGeff) + Pdiff = CSdiff/SIGeff + SIGDIF(3) = Pdiff*Pdiff*SIGeff + + END +C======================================================================= + + SUBROUTINE SIB_GAUSET(AX,BX,NX,Z,W) + +C----------------------------------------------------------------------- +C +C N-point gauss zeros and weights for the interval (AX,BX) are +C stored in arrays Z and W respectively. +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) +C + COMMON /GQCOM/A(273),X(273),KTAB(96) + DIMENSION Z(NX),W(NX) + SAVE + DATA INIT/0/ +C + ALPHA=0.5D0*(BX+AX) + BETA=0.5D0*(BX-AX) + N=NX +* +* the N=1 case: + IF(N.NE.1) GO TO 1 + Z(1)=ALPHA + W(1)=BX-AX + RETURN +* +* the Gauss cases: + 1 IF((N.LE.16).AND.(N.GT.1)) GO TO 2 + IF(N.EQ.20) GO TO 2 + IF(N.EQ.24) GO TO 2 + IF(N.EQ.32) GO TO 2 + IF(N.EQ.40) GO TO 2 + IF(N.EQ.48) GO TO 2 + IF(N.EQ.64) GO TO 2 + IF(N.EQ.80) GO TO 2 + IF(N.EQ.96) GO TO 2 +* +* the extended Gauss cases: + IF((N/96)*96.EQ.N) GO TO 3 +* +C jump to center of intervall intrgration: + GO TO 100 +* +C get Gauss point array +* + 2 CALL PO106BD +C -print out message +* IF(INIT.LE.20)THEN +* INIT=init+1 +* WRITE (6,*) ' initialization of Gauss int. N=',N +* ENDIF +C extract real points + K=KTAB(N) + M=N/2 + DO 21 J=1,M +C extract values from big array + JTAB=K-1+J + WTEMP=BETA*A(JTAB) + DELTA=BETA*X(JTAB) +C store them backward + Z(J)=ALPHA-DELTA + W(J)=WTEMP +C store them forward + JP=N+1-J + Z(JP)=ALPHA+DELTA + W(JP)=WTEMP + 21 CONTINUE +C store central point (odd N) + IF((N-M-M).EQ.0) RETURN + Z(M+1)=ALPHA + JMID=K+M + W(M+1)=BETA*A(JMID) + RETURN +C +C get ND96 times chained 96 Gauss point array +C + 3 CALL PO106BD +C print out message + IF(INIT.LE.20)THEN + INIT=init+1 + WRITE (6,*) ' initialization of extended Gauss int. N=',N + ENDIF +C -extract real points + K=KTAB(96) + ND96=N/96 + DO 31 J=1,48 +C extract values from big array + JTAB=K-1+J + WTEMP=BETA*A(JTAB) + DELTA=BETA*X(JTAB) + WTeMP=WTEMP/ND96 + DeLTA=DELTA/ND96 + DO 32 JD96=0,ND96-1 + ZCNTR= (ALPHA-BETA)+ BETA*DBLE(2*JD96+1)/DBLE(ND96) +C store them backward + Z(J+JD96*96)=ZCNTR-DELTA + W(J+JD96*96)=WTEMP +C store them forward + JP=96+1-J + Z(JP+JD96*96)=ZCNTR+DELTA + W(JP+JD96*96)=WTEMP + 32 CONTINUE + 31 CONTINUE + RETURN +* +C the center of intervall cases: + 100 CONTINUE +C print out message + IF(INIT.LE.20)THEN + INIT=init+1 + WRITE (6,*) ' init. of center of intervall int. N=',N + ENDIF +C put in constant weight and equally spaced central points + N=IABS(N) + DO 111 IN=1,N + WIN=(BX-AX)/DBLE(N) + Z(IN)=AX + (DBLE(IN)-.5D0)*WIN + 111 W(IN)=WIN + RETURN + END + +C======================================================================= + + SUBROUTINE PO106BD + +C----------------------------------------------------------------------- +C +C store big arrays needed for Gauss integral, CERNLIB D106BD +C (arrays A,X,ITAB copied on B,Y,LTAB) +C +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) +C + COMMON /GQCOM/ B(273),Y(273),LTAB(96) + DIMENSION A(273),X(273),KTAB(96) + SAVE +C +C-----TABLE OF INITIAL SUBSCRIPTS FOR N=2(1)16(4)96 + DATA KTAB(2)/1/ + DATA KTAB(3)/2/ + DATA KTAB(4)/4/ + DATA KTAB(5)/6/ + DATA KTAB(6)/9/ + DATA KTAB(7)/12/ + DATA KTAB(8)/16/ + DATA KTAB(9)/20/ + DATA KTAB(10)/25/ + DATA KTAB(11)/30/ + DATA KTAB(12)/36/ + DATA KTAB(13)/42/ + DATA KTAB(14)/49/ + DATA KTAB(15)/56/ + DATA KTAB(16)/64/ + DATA KTAB(20)/72/ + DATA KTAB(24)/82/ + DATA KTAB(28)/82/ + DATA KTAB(32)/94/ + DATA KTAB(36)/94/ + DATA KTAB(40)/110/ + DATA KTAB(44)/110/ + DATA KTAB(48)/130/ + DATA KTAB(52)/130/ + DATA KTAB(56)/130/ + DATA KTAB(60)/130/ + DATA KTAB(64)/154/ + DATA KTAB(68)/154/ + DATA KTAB(72)/154/ + DATA KTAB(76)/154/ + DATA KTAB(80)/186/ + DATA KTAB(84)/186/ + DATA KTAB(88)/186/ + DATA KTAB(92)/186/ + DATA KTAB(96)/226/ +C +C-----TABLE OF ABSCISSAE (X) AND WEIGHTS (A) FOR INTERVAL (-1,+1). +C +C-----N=2 + DATA X(1)/0.577350269189626D0 /, A(1)/1.000000000000000D0 / +C-----N=3 + DATA X(2)/0.774596669241483D0 /, A(2)/0.555555555555556D0 / + DATA X(3)/0.000000000000000D0 /, A(3)/0.888888888888889D0 / +C-----N=4 + DATA X(4)/0.861136311594053D0 /, A(4)/0.347854845137454D0 / + DATA X(5)/0.339981043584856D0 /, A(5)/0.652145154862546D0 / +C-----N=5 + DATA X(6)/0.906179845938664D0 /, A(6)/0.236926885056189D0 / + DATA X(7)/0.538469310105683D0 /, A(7)/0.478628670499366D0 / + DATA X(8)/0.000000000000000D0 /, A(8)/0.568888888888889D0 / +C-----N=6 + DATA X(9)/0.932469514203152D0 /, A(9)/0.171324492379170D0 / + DATA X(10)/0.661209386466265D0 /, A(10)/0.360761573048139D0 / + DATA X(11)/0.238619186083197D0 /, A(11)/0.467913934572691D0 / +C-----N=7 + DATA X(12)/0.949107912342759D0 /, A(12)/0.129484966168870D0 / + DATA X(13)/0.741531185599394D0 /, A(13)/0.279705391489277D0 / + DATA X(14)/0.405845151377397D0 /, A(14)/0.381830050505119D0 / + DATA X(15)/0.000000000000000D0 /, A(15)/0.417959183673469D0 / +C-----N=8 + DATA X(16)/0.960289856497536D0 /, A(16)/0.101228536290376D0 / + DATA X(17)/0.796666477413627D0 /, A(17)/0.222381034453374D0 / + DATA X(18)/0.525532409916329D0 /, A(18)/0.313706645877887D0 / + DATA X(19)/0.183434642495650D0 /, A(19)/0.362683783378362D0 / +C-----N=9 + DATA X(20)/0.968160239507626D0 /, A(20)/0.081274388361574D0 / + DATA X(21)/0.836031107326636D0 /, A(21)/0.180648160694857D0 / + DATA X(22)/0.613371432700590D0 /, A(22)/0.260610696402935D0 / + DATA X(23)/0.324253423403809D0 /, A(23)/0.312347077040003D0 / + DATA X(24)/0.000000000000000D0 /, A(24)/0.330239355001260D0 / +C-----N=10 + DATA X(25)/0.973906528517172D0 /, A(25)/0.066671344308688D0 / + DATA X(26)/0.865063366688985D0 /, A(26)/0.149451349150581D0 / + DATA X(27)/0.679409568299024D0 /, A(27)/0.219086362515982D0 / + DATA X(28)/0.433395394129247D0 /, A(28)/0.269266719309996D0 / + DATA X(29)/0.148874338981631D0 /, A(29)/0.295524224714753D0 / +C-----N=11 + DATA X(30)/0.978228658146057D0 /, A(30)/0.055668567116174D0 / + DATA X(31)/0.887062599768095D0 /, A(31)/0.125580369464905D0 / + DATA X(32)/0.730152005574049D0 /, A(32)/0.186290210927734D0 / + DATA X(33)/0.519096129206812D0 /, A(33)/0.233193764591990D0 / + DATA X(34)/0.269543155952345D0 /, A(34)/0.262804544510247D0 / + DATA X(35)/0.000000000000000D0 /, A(35)/0.272925086777901D0 / +C-----N=12 + DATA X(36)/0.981560634246719D0 /, A(36)/0.047175336386512D0 / + DATA X(37)/0.904117256370475D0 /, A(37)/0.106939325995318D0 / + DATA X(38)/0.769902674194305D0 /, A(38)/0.160078328543346D0 / + DATA X(39)/0.587317954286617D0 /, A(39)/0.203167426723066D0 / + DATA X(40)/0.367831498998180D0 /, A(40)/0.233492536538355D0 / + DATA X(41)/0.125233408511469D0 /, A(41)/0.249147045813403D0 / +C-----N=13 + DATA X(42)/0.984183054718588D0 /, A(42)/0.040484004765316D0 / + DATA X(43)/0.917598399222978D0 /, A(43)/0.092121499837728D0 / + DATA X(44)/0.801578090733310D0 /, A(44)/0.138873510219787D0 / + DATA X(45)/0.642349339440340D0 /, A(45)/0.178145980761946D0 / + DATA X(46)/0.448492751036447D0 /, A(46)/0.207816047536889D0 / + DATA X(47)/0.230458315955135D0 /, A(47)/0.226283180262897D0 / + DATA X(48)/0.000000000000000D0 /, A(48)/0.232551553230874D0 / +C-----N=14 + DATA X(49)/0.986283808696812D0 /, A(49)/0.035119460331752D0 / + DATA X(50)/0.928434883663574D0 /, A(50)/0.080158087159760D0 / + DATA X(51)/0.827201315069765D0 /, A(51)/0.121518570687903D0 / + DATA X(52)/0.687292904811685D0 /, A(52)/0.157203167158194D0 / + DATA X(53)/0.515248636358154D0 /, A(53)/0.185538397477938D0 / + DATA X(54)/0.319112368927890D0 /, A(54)/0.205198463721296D0 / + DATA X(55)/0.108054948707344D0 /, A(55)/0.215263853463158D0 / +C-----N=15 + DATA X(56)/0.987992518020485D0 /, A(56)/0.030753241996117D0 / + DATA X(57)/0.937273392400706D0 /, A(57)/0.070366047488108D0 / + DATA X(58)/0.848206583410427D0 /, A(58)/0.107159220467172D0 / + DATA X(59)/0.724417731360170D0 /, A(59)/0.139570677926154D0 / + DATA X(60)/0.570972172608539D0 /, A(60)/0.166269205816994D0 / + DATA X(61)/0.394151347077563D0 /, A(61)/0.186161000015562D0 / + DATA X(62)/0.201194093997435D0 /, A(62)/0.198431485327111D0 / + DATA X(63)/0.000000000000000D0 /, A(63)/0.202578241925561D0 / +C-----N=16 + DATA X(64)/0.989400934991650D0 /, A(64)/0.027152459411754D0 / + DATA X(65)/0.944575023073233D0 /, A(65)/0.062253523938648D0 / + DATA X(66)/0.865631202387832D0 /, A(66)/0.095158511682493D0 / + DATA X(67)/0.755404408355003D0 /, A(67)/0.124628971255534D0 / + DATA X(68)/0.617876244402644D0 /, A(68)/0.149595988816577D0 / + DATA X(69)/0.458016777657227D0 /, A(69)/0.169156519395003D0 / + DATA X(70)/0.281603550779259D0 /, A(70)/0.182603415044924D0 / + DATA X(71)/0.095012509837637D0 /, A(71)/0.189450610455069D0 / +C-----N=20 + DATA X(72)/0.993128599185094D0 /, A(72)/0.017614007139152D0 / + DATA X(73)/0.963971927277913D0 /, A(73)/0.040601429800386D0 / + DATA X(74)/0.912234428251325D0 /, A(74)/0.062672048334109D0 / + DATA X(75)/0.839116971822218D0 /, A(75)/0.083276741576704D0 / + DATA X(76)/0.746331906460150D0 /, A(76)/0.101930119817240D0 / + DATA X(77)/0.636053680726515D0 /, A(77)/0.118194531961518D0 / + DATA X(78)/0.510867001950827D0 /, A(78)/0.131688638449176D0 / + DATA X(79)/0.373706088715419D0 /, A(79)/0.142096109318382D0 / + DATA X(80)/0.227785851141645D0 /, A(80)/0.149172986472603D0 / + DATA X(81)/0.076526521133497D0 /, A(81)/0.152753387130725D0 / +C-----N=24 + DATA X(82)/0.995187219997021D0 /, A(82)/0.012341229799987D0 / + DATA X(83)/0.974728555971309D0 /, A(83)/0.028531388628933D0 / + DATA X(84)/0.938274552002732D0 /, A(84)/0.044277438817419D0 / + DATA X(85)/0.886415527004401D0 /, A(85)/0.059298584915436D0 / + DATA X(86)/0.820001985973902D0 /, A(86)/0.073346481411080D0 / + DATA X(87)/0.740124191578554D0 /, A(87)/0.086190161531953D0 / + DATA X(88)/0.648093651936975D0 /, A(88)/0.097618652104113D0 / + DATA X(89)/0.545421471388839D0 /, A(89)/0.107444270115965D0 / + DATA X(90)/0.433793507626045D0 /, A(90)/0.115505668053725D0 / + DATA X(91)/0.315042679696163D0 /, A(91)/0.121670472927803D0 / + DATA X(92)/0.191118867473616D0 /, A(92)/0.125837456346828D0 / + DATA X(93)/0.064056892862605D0 /, A(93)/0.127938195346752D0 / +C-----N=32 + DATA X(94)/0.997263861849481D0 /, A(94)/0.007018610009470D0 / + DATA X(95)/0.985611511545268D0 /, A(95)/0.016274394730905D0 / + DATA X(96)/0.964762255587506D0 /, A(96)/0.025392065309262D0 / + DATA X(97)/0.934906075937739D0 /, A(97)/0.034273862913021D0 / + DATA X(98)/0.896321155766052D0 /, A(98)/0.042835898022226D0 / + DATA X(99)/0.849367613732569D0 /, A(99)/0.050998059262376D0 / + DATA X(100)/0.794483795967942D0/, A(100)/0.058684093478535D0/ + DATA X(101)/0.732182118740289D0/, A(101)/0.065822222776361D0/ + DATA X(102)/0.663044266930215D0/, A(102)/0.072345794108848D0/ + DATA X(103)/0.587715757240762D0/, A(103)/0.078193895787070D0/ + DATA X(104)/0.506899908932229D0/, A(104)/0.083311924226946D0/ + DATA X(105)/0.421351276130635D0/, A(105)/0.087652093004403D0/ + DATA X(106)/0.331868602282127D0/, A(106)/0.091173878695763D0/ + DATA X(107)/0.239287362252137D0/, A(107)/0.093844399080804D0/ + DATA X(108)/0.144471961582796D0/, A(108)/0.095638720079274D0/ + DATA X(109)/0.048307665687738D0/, A(109)/0.096540088514727D0/ +C-----N=40 + DATA X(110)/0.998237709710559D0/, A(110)/0.004521277098533D0/ + DATA X(111)/0.990726238699457D0/, A(111)/0.010498284531152D0/ + DATA X(112)/0.977259949983774D0/, A(112)/0.016421058381907D0/ + DATA X(113)/0.957916819213791D0/, A(113)/0.022245849194166D0/ + DATA X(114)/0.932812808278676D0/, A(114)/0.027937006980023D0/ + DATA X(115)/0.902098806968874D0/, A(115)/0.033460195282547D0/ + DATA X(116)/0.865959503212259D0/, A(116)/0.038782167974472D0/ + DATA X(117)/0.824612230833311D0/, A(117)/0.043870908185673D0/ + DATA X(118)/0.778305651426519D0/, A(118)/0.048695807635072D0/ + DATA X(119)/0.727318255189927D0/, A(119)/0.053227846983936D0/ + DATA X(120)/0.671956684614179D0/, A(120)/0.057439769099391D0/ + DATA X(121)/0.612553889667980D0/, A(121)/0.061306242492928D0/ + DATA X(122)/0.549467125095128D0/, A(122)/0.064804013456601D0/ + DATA X(123)/0.483075801686178D0/, A(123)/0.067912045815233D0/ + DATA X(124)/0.413779204371605D0/, A(124)/0.070611647391286D0/ + DATA X(125)/0.341994090825758D0/, A(125)/0.072886582395804D0/ + DATA X(126)/0.268152185007253D0/, A(126)/0.074723169057968D0/ + DATA X(127)/0.192697580701371D0/, A(127)/0.076110361900626D0/ + DATA X(128)/0.116084070675255D0/, A(128)/0.077039818164247D0/ + DATA X(129)/0.038772417506050D0/, A(129)/0.077505947978424D0/ +C-----N=48 + DATA X(130)/0.998771007252426D0/, A(130)/0.003153346052305D0/ + DATA X(131)/0.993530172266350D0/, A(131)/0.007327553901276D0/ + DATA X(132)/0.984124583722826D0/, A(132)/0.011477234579234D0/ + DATA X(133)/0.970591592546247D0/, A(133)/0.015579315722943D0/ + DATA X(134)/0.952987703160430D0/, A(134)/0.019616160457355D0/ + DATA X(135)/0.931386690706554D0/, A(135)/0.023570760839324D0/ + DATA X(136)/0.905879136715569D0/, A(136)/0.027426509708356D0/ + DATA X(137)/0.876572020274247D0/, A(137)/0.031167227832798D0/ + DATA X(138)/0.843588261624393D0/, A(138)/0.034777222564770D0/ + DATA X(139)/0.807066204029442D0/, A(139)/0.038241351065830D0/ + DATA X(140)/0.767159032515740D0/, A(140)/0.041545082943464D0/ + DATA X(141)/0.724034130923814D0/, A(141)/0.044674560856694D0/ + DATA X(142)/0.677872379632663D0/, A(142)/0.047616658492490D0/ + DATA X(143)/0.628867396776513D0/, A(143)/0.050359035553854D0/ + DATA X(144)/0.577224726083972D0/, A(144)/0.052890189485193D0/ + DATA X(145)/0.523160974722233D0/, A(145)/0.055199503699984D0/ + DATA X(146)/0.466902904750958D0/, A(146)/0.057277292100403D0/ + DATA X(147)/0.408686481990716D0/, A(147)/0.059114839698395D0/ + DATA X(148)/0.348755886292160D0/, A(148)/0.060704439165893D0/ + DATA X(149)/0.287362487355455D0/, A(149)/0.062039423159892D0/ + DATA X(150)/0.224763790394689D0/, A(150)/0.063114192286254D0/ + DATA X(151)/0.161222356068891D0/, A(151)/0.063924238584648D0/ + DATA X(152)/0.097004699209462D0/, A(152)/0.064466164435950D0/ + DATA X(153)/0.032380170962869D0/, A(153)/0.064737696812683D0/ +C-----N=64 + DATA X(154)/0.999305041735772D0/, A(154)/0.001783280721696D0/ + DATA X(155)/0.996340116771955D0/, A(155)/0.004147033260562D0/ + DATA X(156)/0.991013371476744D0/, A(156)/0.006504457968978D0/ + DATA X(157)/0.983336253884625D0/, A(157)/0.008846759826363D0/ + DATA X(158)/0.973326827789910D0/, A(158)/0.011168139460131D0/ + DATA X(159)/0.961008799652053D0/, A(159)/0.013463047896718D0/ + DATA X(160)/0.946411374858402D0/, A(160)/0.015726030476024D0/ + DATA X(161)/0.929569172131939D0/, A(161)/0.017951715775697D0/ + DATA X(162)/0.910522137078502D0/, A(162)/0.020134823153530D0/ + DATA X(163)/0.889315445995114D0/, A(163)/0.022270173808383D0/ + DATA X(164)/0.865999398154092D0/, A(164)/0.024352702568710D0/ + DATA X(165)/0.840629296252580D0/, A(165)/0.026377469715054D0/ + DATA X(166)/0.813265315122797D0/, A(166)/0.028339672614259D0/ + DATA X(167)/0.783972358943341D0/, A(167)/0.030234657072402D0/ + DATA X(168)/0.752819907260531D0/, A(168)/0.032057928354851D0/ + DATA X(169)/0.719881850171610D0/, A(169)/0.033805161837141D0/ + DATA X(170)/0.685236313054233D0/, A(170)/0.035472213256882D0/ + DATA X(171)/0.648965471254657D0/, A(171)/0.037055128540240D0/ + DATA X(172)/0.611155355172393D0/, A(172)/0.038550153178615D0/ + DATA X(173)/0.571895646202634D0/, A(173)/0.039953741132720D0/ + DATA X(174)/0.531279464019894D0/, A(174)/0.041262563242623D0/ + DATA X(175)/0.489403145707052D0/, A(175)/0.042473515123653D0/ + DATA X(176)/0.446366017253464D0/, A(176)/0.043583724529323D0/ + DATA X(177)/0.402270157963991D0/, A(177)/0.044590558163756D0/ + DATA X(178)/0.357220158337668D0/, A(178)/0.045491627927418D0/ + DATA X(179)/0.311322871990210D0/, A(179)/0.046284796581314D0/ + DATA X(180)/0.264687162208767D0/, A(180)/0.046968182816210D0/ + DATA X(181)/0.217423643740007D0/, A(181)/0.047540165714830D0/ + DATA X(182)/0.169644420423992D0/, A(182)/0.047999388596458D0/ + DATA X(183)/0.121462819296120D0/, A(183)/0.048344762234802D0/ + DATA X(184)/0.072993121787799D0/, A(184)/0.048575467441503D0/ + DATA X(185)/0.024350292663424D0/, A(185)/0.048690957009139D0/ +C-----N=80 + DATA X(186)/0.999553822651630D0/, A(186)/0.001144950003186D0/ + DATA X(187)/0.997649864398237D0/, A(187)/0.002663533589512D0/ + DATA X(188)/0.994227540965688D0/, A(188)/0.004180313124694D0/ + DATA X(189)/0.989291302499755D0/, A(189)/0.005690922451403D0/ + DATA X(190)/0.982848572738629D0/, A(190)/0.007192904768117D0/ + DATA X(191)/0.974909140585727D0/, A(191)/0.008683945269260D0/ + DATA X(192)/0.965485089043799D0/, A(192)/0.010161766041103D0/ + DATA X(193)/0.954590766343634D0/, A(193)/0.011624114120797D0/ + DATA X(194)/0.942242761309872D0/, A(194)/0.013068761592401D0/ + DATA X(195)/0.928459877172445D0/, A(195)/0.014493508040509D0/ + DATA X(196)/0.913263102571757D0/, A(196)/0.015896183583725D0/ + DATA X(197)/0.896675579438770D0/, A(197)/0.017274652056269D0/ + DATA X(198)/0.878722567678213D0/, A(198)/0.018626814208299D0/ + DATA X(199)/0.859431406663111D0/, A(199)/0.019950610878141D0/ + DATA X(200)/0.838831473580255D0/, A(200)/0.021244026115782D0/ + DATA X(201)/0.816954138681463D0/, A(201)/0.022505090246332D0/ + DATA X(202)/0.793832717504605D0/, A(202)/0.023731882865930D0/ + DATA X(203)/0.769502420135041D0/, A(203)/0.024922535764115D0/ + DATA X(204)/0.744000297583597D0/, A(204)/0.026075235767565D0/ + DATA X(205)/0.717365185362099D0/, A(205)/0.027188227500486D0/ + DATA X(206)/0.689637644342027D0/, A(206)/0.028259816057276D0/ + DATA X(207)/0.660859898986119D0/, A(207)/0.029288369583267D0/ + DATA X(208)/0.631075773046871D0/, A(208)/0.030272321759557D0/ + DATA X(209)/0.600330622829751D0/, A(209)/0.031210174188114D0/ + DATA X(210)/0.568671268122709D0/, A(210)/0.032100498673487D0/ + DATA X(211)/0.536145920897131D0/, A(211)/0.032941939397645D0/ + DATA X(212)/0.502804111888784D0/, A(212)/0.033733214984611D0/ + DATA X(213)/0.468696615170544D0/, A(213)/0.034473120451753D0/ + DATA X(214)/0.433875370831756D0/, A(214)/0.035160529044747D0/ + DATA X(215)/0.398393405881969D0/, A(215)/0.035794393953416D0/ + DATA X(216)/0.362304753499487D0/, A(216)/0.036373749905835D0/ + DATA X(217)/0.325664370747701D0/, A(217)/0.036897714638276D0/ + DATA X(218)/0.288528054884511D0/, A(218)/0.037365490238730D0/ + DATA X(219)/0.250952358392272D0/, A(219)/0.037776364362001D0/ + DATA X(220)/0.212994502857666D0/, A(220)/0.038129711314477D0/ + DATA X(221)/0.174712291832646D0/, A(221)/0.038424993006959D0/ + DATA X(222)/0.136164022809143D0/, A(222)/0.038661759774076D0/ + DATA X(223)/0.097408398441584D0/, A(223)/0.038839651059051D0/ + DATA X(224)/0.058504437152420D0/, A(224)/0.038958395962769D0/ + DATA X(225)/0.019511383256793D0/, A(225)/0.039017813656306D0/ +C-----N=96 + DATA X(226)/0.999689503883230D0/, A(226)/0.000796792065552D0/ + DATA X(227)/0.998364375863181D0/, A(227)/0.001853960788946D0/ + DATA X(228)/0.995981842987209D0/, A(228)/0.002910731817934D0/ + DATA X(229)/0.992543900323762D0/, A(229)/0.003964554338444D0/ + DATA X(230)/0.988054126329623D0/, A(230)/0.005014202742927D0/ + DATA X(231)/0.982517263563014D0/, A(231)/0.006058545504235D0/ + DATA X(232)/0.975939174585136D0/, A(232)/0.007096470791153D0/ + DATA X(233)/0.968326828463264D0/, A(233)/0.008126876925698D0/ + DATA X(234)/0.959688291448742D0/, A(234)/0.009148671230783D0/ + DATA X(235)/0.950032717784437D0/, A(235)/0.010160770535008D0/ + DATA X(236)/0.939370339752755D0/, A(236)/0.011162102099838D0/ + DATA X(237)/0.927712456722308D0/, A(237)/0.012151604671088D0/ + DATA X(238)/0.915071423120898D0/, A(238)/0.013128229566961D0/ + DATA X(239)/0.901460635315852D0/, A(239)/0.014090941772314D0/ + DATA X(240)/0.886894517402420D0/, A(240)/0.015038721026994D0/ + DATA X(241)/0.871388505909296D0/, A(241)/0.015970562902562D0/ + DATA X(242)/0.854959033434601D0/, A(242)/0.016885479864245D0/ + DATA X(243)/0.837623511228187D0/, A(243)/0.017782502316045D0/ + DATA X(244)/0.819400310737931D0/, A(244)/0.018660679627411D0/ + DATA X(245)/0.800308744139140D0/, A(245)/0.019519081140145D0/ + DATA X(246)/0.780369043867433D0/, A(246)/0.020356797154333D0/ + DATA X(247)/0.759602341176647D0/, A(247)/0.021172939892191D0/ + DATA X(248)/0.738030643744400D0/, A(248)/0.021966644438744D0/ + DATA X(249)/0.715676812348967D0/, A(249)/0.022737069658329D0/ + DATA X(250)/0.692564536642171D0/, A(250)/0.023483399085926D0/ + DATA X(251)/0.668718310043916D0/, A(251)/0.024204841792364D0/ + DATA X(252)/0.644163403784967D0/, A(252)/0.024900633222483D0/ + DATA X(253)/0.618925840125468D0/, A(253)/0.025570036005349D0/ + DATA X(254)/0.593032364777572D0/, A(254)/0.026212340735672D0/ + DATA X(255)/0.566510418561397D0/, A(255)/0.026826866725591D0/ + DATA X(256)/0.539388108324357D0/, A(256)/0.027412962726029D0/ + DATA X(257)/0.511694177154667D0/, A(257)/0.027970007616848D0/ + DATA X(258)/0.483457973920596D0/, A(258)/0.028497411065085D0/ + DATA X(259)/0.454709422167743D0/, A(259)/0.028994614150555D0/ + DATA X(260)/0.425478988407300D0/, A(260)/0.029461089958167D0/ + DATA X(261)/0.395797649828908D0/, A(261)/0.029896344136328D0/ + DATA X(262)/0.365696861472313D0/, A(262)/0.030299915420827D0/ + DATA X(263)/0.335208522892625D0/, A(263)/0.030671376123669D0/ + DATA X(264)/0.304364944354496D0/, A(264)/0.031010332586313D0/ + DATA X(265)/0.273198812591049D0/, A(265)/0.031316425596861D0/ + DATA X(266)/0.241743156163840D0/, A(266)/0.031589330770727D0/ + DATA X(267)/0.210031310460567D0/, A(267)/0.031828758894411D0/ + DATA X(268)/0.178096882367618D0/, A(268)/0.032034456231992D0/ + DATA X(269)/0.145973714654896D0/, A(269)/0.032206204794030D0/ + DATA X(270)/0.113695850110665D0/, A(270)/0.032343822568575D0/ + DATA X(271)/0.081297495464425D0/, A(271)/0.032447163714064D0/ + DATA X(272)/0.048812985136049D0/, A(272)/0.032516118713868D0/ + DATA X(273)/0.016276744849602D0/, A(273)/0.032550614492363D0/ + DATA IBD/0/ + + IF(IBD.NE.0) RETURN + IBD=1 + DO 10 I=1,273 + B(I) = A(I) +10 Y(I) = X(I) + DO 20 I=1,96 +20 LTAB(I) = KTAB(I) + RETURN + END +C======================================================================= + + SUBROUTINE SIB_ALTRA(GA,BGX,BGY,BGZ,PCX,PCY,PCZ,EC,P,PX,PY,PZ,E) + +C----------------------------------------------------------------------- +C +C arbitrary Lorentz transformation +C +C Input: GA : gamma factor +C BG? : components of gamma * beta +C PC?,EC : components of initial 4 vector +C +C Output: P?,E : components of 4vector in final frame +C P : 3-norm in final frame, a.k.a momentum +C +C PHO_ALTRA taken from PHOJET /FR'14 +C********************************************************************* + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + DOUBLE PRECISION P,E + SAVE + +c consistency check: (gamma*beta)**2 = gamma**2 - 1 + BETGAM2 = BGX**2+BGY**2+BGZ**2 + xtst = 1.D0-BETGAM2/GA**2 - 1.D0/GA**2 + IF(abs(xtst).gt.1.D-5) THEN + WRITE(LUN,*) ' SIB_ALTRA: transf. inconsistent!' + WRITE(LUN,*) ' SIB_ALTRA: input (GA,GABE):',GA,BGX,BGY,BGZ + ENDIF + IF(GA.LT.1.D0) THEN + WRITE(LUN,*) ' SIB_ALTRA: you are joking right? GAMMA=',GA + CALL SIB_REJECT('SIB_ALTRA ') + ENDIF + EP=PCX*BGX+PCY*BGY+PCZ*BGZ + PE=EP/(GA+1.D0)+EC + PX=PCX+BGX*PE + PY=PCY+BGY*PE + PZ=PCZ+BGZ*PE + P=DSQRT(PX*PX+PY*PY+PZ*PZ) + E=GA*EC+EP + END + +C======================================================================= + + SUBROUTINE SIB_TRANS(XO,YO,ZO,CDE,SDE,CFE,SFE,X,Y,Z) + +C----------------------------------------------------------------------- +C +C rotation of coordinate frame (1) de rotation around y axis +C (2) fe rotation around z axis +C (inverse rotation to SIB_TRANI) +C +C Input: ?0 : vector components in initial frame +C C? : cosine of rotation angle +C S? : sine of rotation angle +C DE : angle of rotation around y axis +C (polar angle in spherical coord.) +C FE : angle of rotation around z axis +C (azimuthal angle in spherical coord.) +C +C Output: X,Y,Z: components of vector in rotated frame +C +C PHO_TRANS taken from PHOJET \FR'14 +C********************************************************************** + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + SAVE + + X= CDE*CFE*XO-SFE*YO+SDE*CFE*ZO + Y= CDE*SFE*XO+CFE*YO+SDE*SFE*ZO + Z=-SDE *XO +CDE *ZO + END + +C======================================================================= + + SUBROUTINE SIB_TRANI(XO,YO,ZO,CDE,SDE,CFE,SFE,X,Y,Z) + +C----------------------------------------------------------------------- +C +C rotation of coordinate frame (1) -fe rotation around z axis +C (2) -de rotation around y axis +C (inverse rotation to SIB_TRANS) +C +C Input: ?0 : vector components in initial frame +C C? : cosine of rotation angle +C S? : sine of rotation angle +C DE : angle of rotation around y axis +C (polar angle in spherical coord.) +C FE : angle of rotation around z axis +C (azimuthal angle in spherical coord.) +C +C Output: X,Y,Z: components of vector in rotated frame +C +C PHO_TRANS taken from PHOJET \FR'14 +C********************************************************************** + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + SAVE + + X= CDE*CFE*XO+CDE*SFE*YO-SDE*ZO + Y=-SFE *XO+CFE* YO + Z= SDE*CFE*XO+SDE*SFE*YO+CDE*ZO + END + +C======================================================================= + + SUBROUTINE SIROBO( NBEG, NEND, THE, PHI, DBEX, DBEY, DBEZ) + +C----------------------------------------------------------------------- +C THIS IS A SLIGHTLY ALTERED VERSION OF "LUROBO" [JETSET63.PYTHIA] * +C SET TO WORK IN THE SIBYL ENVIROMENT. THE TRANSFORMATION IS PERFORMED * +C ON PARTICLES NUMBER FROM NBEG TO NEND. COMMON BLOCKS CHANGED. * +C TSS, Oct '87 * +C modification use directly BETA in double precision in input (PL) * +C ********************************************************************** + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + COMMON /S_PLIST/ P(8000,5), LLIST(8000), NP + DIMENSION ROT(3,3),PV(3),DP(4) + SAVE + + IF(THE**2+PHI**2 .LE. 1.D-20) GO TO 131 +C...ROTATE (TYPICALLY FROM Z AXIS TO DIRECTION THETA,PHI) + ROT(1,1)=dCOS(THE)*dCOS(PHI) + ROT(1,2)=-dSIN(PHI) + ROT(1,3)=dSIN(THE)*dCOS(PHI) + ROT(2,1)=dCOS(THE)*dSIN(PHI) + ROT(2,2)=dCOS(PHI) + ROT(2,3)=dSIN(THE)*dSIN(PHI) + ROT(3,1)=-dSIN(THE) + ROT(3,2)=0.D0 + ROT(3,3)=dCOS(THE) + DO 120 I=NBEG,NEND + DO 100 J=1,3 + 100 PV(J)=P(I,J) + DO 110 J=1,3 + 110 P(I,J)=ROT(J,1)*PV(1)+ROT(J,2)*PV(2)+ROT(J,3)*PV(3) + 120 CONTINUE + 131 IF(DBEX**2+DBEY**2+DBEZ**2 .LE. 1.D-20) GO TO 151 +C...LORENTZ BOOST (TYPICALLY FROM REST TO MOMENTUM/ENERGY=BETA) + DGA=1.D0/DSQRT(1D0-DBEX**2-DBEY**2-DBEZ**2) + DO 140 I=NBEG, NEND + DO 130 J=1,4 + 130 DP(J)=P(I,J) + DBEP=DBEX*DP(1)+DBEY*DP(2)+DBEZ*DP(3) + DGABEP=DGA*(DGA*DBEP/(1.D0+DGA)+DP(4)) + P(I,1)=DP(1)+DGABEP*DBEX + P(I,2)=DP(2)+DGABEP*DBEY + P(I,3)=DP(3)+DGABEP*DBEZ + P(I,4)=DGA*(DP(4)+DBEP) + 140 CONTINUE + 151 RETURN + END + + +C======================================================================= + + SUBROUTINE ISWTCH_LMNTS(ia,ib) + +C----------------------------------------------------------------------- + IMPLICIT INTEGER(I-N) + SAVE + + itmp = ia + ia = ib + ib = itmp + end +C======================================================================= + + SUBROUTINE SWTCH_LMNTS(a,b) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + SAVE + + tmp = a + a = b + b = tmp + end +C======================================================================= + + DOUBLE PRECISION FUNCTION PAWT(A,B,C) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + SAVE + +C... c.m.s. Momentum in two particle decays + PAWT = SQRT((A**2-(B+C)**2+EPS10)*(A**2-(B-C)**2))/(2.D0*A) + END + +C======================================================================= + + SUBROUTINE HSPLI (KF,KP1,KP2) + +C----------------------------------------------------------------------- +C...This subroutine splits one hadron of code KF +C. into 2 partons of code KP1 and KP2 +C. KP1 refers to a color triplet [q or (qq)bar] +C. KP2 to a a color anti-triplet [qbar or (qq)] +C. allowed inputs: +C. KF = 6:14 pi0,pi+-,k+-,k0L,k0s, p,n +C. = -13,-14 pbar,nbar +C. = 34:39 Sig+, Sig0, Sig-, Xi0, Xi-, Lam0 +C. = 49: Omega- +C. \FR'16 +C------------------------------------------------ + IMPLICIT NONE + +c external types + INTEGER KF,KP1,KP2 + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + +c internal types + INTEGER KPP + DOUBLE PRECISION R,XBUG,S_RNDM + SAVE + + IF(IABS(KF).eq.6.or.IABS(KF).eq.27)THEN ! pi0, rho0 + R = S_RNDM(0) + XBUG = 0.D0 + IF(IPAR(19).eq.1) XBUG = 0.5D0 + IF (R.LE.XBUG) THEN + KP1 = 1 + KP2 = -1 + ELSE + KP1 = 2 + KP2 = -2 + ENDIF + + ELSEIF(IABS(KF).eq.7)THEN ! pi+ + KP1 = 1 + KP2 = -2 + + ELSEIF(IABS(KF).eq.8)THEN ! pi- + KP1 = 2 + KP2 = -1 + + ELSEIF(IABS(KF).eq.9)THEN ! K+ + KP1 = 1 + KP2 = -3 + ELSEIF(IABS(KF).eq.10)THEN ! K- + KP1 = 3 + KP2 = -1 + ELSEIF(IABS(KF).eq.11.or.IABS(KF).eq.12)THEN ! K0S/K0L + KP1 = 2 + KP2 = -3 + IF (S_RNDM(1).GT. 0.5D0) THEN + KP1 = 3 + KP2 = -2 + ENDIF + ELSEIF(IABS(KF).eq.21)THEN ! K0 + KP1 = 2 + KP2 = -3 + ELSEIF(IABS(KF).eq.22)THEN ! K0bar + KP1 = 3 + KP2 = -2 + ELSEIF(IABS(KF).eq.33)THEN ! phi + KP1 = 3 + KP2 = -3 + ELSEIF(IABS(KF).eq.13.or.IABS(KF).eq.41)THEN ! p/pbar,delta+ + R = PAR(53)*S_RNDM(KF) + IF (R .LT.3.D0) THEN + KP1 = 1 + KP2 = 12 + ELSEIF (R .LT. 4.D0) THEN + KP1 = 1 + KP2 = 21 + ELSE + KP1 = 2 + KP2 = 11 + ENDIF + ELSEIF(IABS(KF).eq.14.or.IABS(KF).eq.42)THEN ! n/nbar,delta0 + R = 6.D0*S_RNDM(0) + IF (R .LT.3.D0) THEN + KP1 = 2 + KP2 = 12 + ELSEIF (R .LT. 4.D0) THEN + KP1 = 2 + KP2 = 21 + ELSE + KP1 = 1 + KP2 = 22 + ENDIF + ELSEIF(IABS(KF).eq.40)THEN ! delta++ + KP1 = 1 + KP2 = 11 + ELSEIF(IABS(KF).eq.43)THEN ! delta- + KP1 = 2 + KP2 = 22 + ELSEIF(IABS(KF).eq.34)THEN !Sigma+ + R = 6.D0*S_RNDM(0) + IF (R .LT.3.D0) THEN + KP1 = 3 + KP2 = 11 + ELSEIF (R .LT. 4.D0) THEN + KP1 = 1 + KP2 = 31 + ELSE + KP1 = 1 + KP2 = 13 + ENDIF + ELSEIF(IABS(KF).eq.35.or.IABS(KF).eq.39)THEN !Sigma0/Lambda0 +c all configurations equally likely --> Knuth shuffle +c setup quarks: u,d,s + CALL SHFFL_QRKS(1,2,3,KP1,KP2) + + ELSEIF(IABS(KF).eq.36)THEN !Sigma- + R = 6.D0*S_RNDM(0) + IF (R .LT.3.D0) THEN + KP1 = 3 + KP2 = 22 + ELSEIF (R .LT. 4.D0) THEN + KP1 = 2 + KP2 = 32 + ELSE + KP1 = 2 + KP2 = 23 + ENDIF + ELSEIF(IABS(KF).eq.37)THEN !Xi0 + R = 6.D0*S_RNDM(0) + IF (R .LT.3.D0) THEN + KP1 = 1 + KP2 = 33 + ELSEIF (R .LT. 4.D0) THEN + KP1 = 3 + KP2 = 13 + ELSE + KP1 = 1 + KP2 = 33 + ENDIF + ELSEIF(IABS(KF).eq.38)THEN !Xi- + R = 6.D0*S_RNDM(0) + IF (R .LT.3.D0) THEN + KP1 = 2 + KP2 = 33 + ELSEIF (R .LT. 4.D0) THEN + KP1 = 3 + KP2 = 23 + ELSE + KP1 = 2 + KP2 = 33 + ENDIF + ELSEIF(IABS(KF).eq.49)THEN ! Omega- + KP1 = 3 + KP2 = 33 + + ELSEIF(IABS(KF).eq.59)THEN ! D+ + KP1 = 4 + KP2 = -2 + + ELSEIF(IABS(KF).eq.60)THEN ! D- + KP1 = 2 + KP2 = -4 + + ELSEIF(IABS(KF).eq.71)THEN ! D0 + KP1 = 4 + KP2 = -1 + + ELSEIF(IABS(KF).eq.72)THEN ! D0bar + KP1 = 1 + KP2 = -4 + + ELSEIF(IABS(KF).eq.73)THEN ! eta_c + KP1 = 4 + KP2 = -4 + + ELSEIF(IABS(KF).eq.74)THEN ! Ds+ + KP1 = 4 + KP2 = -3 + + ELSEIF(IABS(KF).eq.75)THEN ! Ds- + KP1 = 3 + KP2 = -4 + + ELSEIF(IABS(KF).eq.76)THEN ! Ds*+ + KP1 = 4 + KP2 = -3 + + ELSEIF(IABS(KF).eq.77)THEN ! Ds*- + KP1 = 3 + KP2 = -4 + + ELSEIF(IABS(KF).eq.78)THEN ! D*+ + KP1 = 4 + KP2 = -2 + + ELSEIF(IABS(KF).eq.79)THEN ! D*- + KP1 = 2 + KP2 = -4 + + ELSEIF(IABS(KF).eq.80)THEN ! D*0 + KP1 = 4 + KP2 = -1 + + ELSEIF(IABS(KF).eq.81)THEN ! D*0bar + KP1 = 1 + KP2 = -4 + + ELSEIF(IABS(KF).eq.83)THEN ! J/psi + KP1 = 4 + KP2 = -4 + + ELSEIF(IABS(KF).eq.84)THEN ! Sigma_c++ + R = 6.D0*S_RNDM(0) + IF (R .LT.3.D0) THEN + KP1 = 4 + KP2 = 11 + ELSEIF (R .LT. 4.D0) THEN + KP1 = 1 + KP2 = 41 + ELSE + KP1 = 1 + KP2 = 14 + ENDIF + + ELSEIF(IABS(KF).eq.85.or.IABS(KF).eq.89)THEN ! Sigma_c+ / Lambda_c+ +c setup quarks: u,d,c + CALL SHFFL_QRKS(1,2,4,KP1,KP2) + + ELSEIF(IABS(KF).eq.86)THEN ! Sigma_c0 + R = 6.D0*S_RNDM(0) + IF (R .LT.3.D0) THEN + KP1 = 4 + KP2 = 22 + ELSEIF (R .LT. 4.D0) THEN + KP1 = 2 + KP2 = 42 + ELSE + KP1 = 2 + KP2 = 24 + ENDIF + + ELSEIF(IABS(KF).eq.87)THEN ! Xi_c+ +c setup quarks: u,s,c + CALL SHFFL_QRKS(1,3,4,KP1,KP2) + + ELSEIF(IABS(KF).eq.88)THEN ! Xi_c0 + CALL SHFFL_QRKS(2,3,4,KP1,KP2) + + ELSEIF(IABS(KF).eq.99)THEN ! Omega_c0 + R = 6.D0*S_RNDM(0) + IF (R .LT.3.D0) THEN + KP1 = 4 + KP2 = 33 + ELSEIF (R .LT. 4.D0) THEN + KP1 = 3 + KP2 = 43 + ELSE + KP1 = 3 + KP2 = 34 + ENDIF + + ELSE +C... Test for good input + WRITE(LUN,*) + & ' HSPLI : Routine entered with illegal particle code ',KF + CALL SIB_REJECT('HSPLI ') + ENDIF + +C if anti-baryon, invert valences + IF (KF .LT. 0) THEN + KPP = KP1 + KP1 = -KP2 + KP2 = -KPP + ENDIF + RETURN + END + +C======================================================================= + + SUBROUTINE SHFFL_QRKS(IQF1,IQF2,IQF3,KF1,KF2) + +C----------------------------------------------------------------------- +c routine to shuffle 3 quark flavors +C----------------------------------------------------------------------- + IMPLICIT NONE + INTEGER IQF1,IQF2,IQF3,KF1,KF2 + INTEGER KPL,JJ,II,IFL + DOUBLE PRECISION S_RNDM + DIMENSION KPL(3) +c quark flavors to shuffle + KPL(1) = IQF1 + KPL(2) = IQF2 + KPL(3) = IQF3 +c Knuth shuffle.. + DO II=3,2,-1 + JJ=1+INT(II*S_RNDM(II)) + IFL=KPL(jj) + KPL(jj)=KPL(ii) + KPL(ii)=IFL + ENDDO + KF1=KPL(1) + KF2=KPL(2)*10+KPL(3) + END + + + SUBROUTINE TRANSFONSHELL(ECM,XM1in,XM2in,XMAX,IMOD,P1,P2,LBAD) + +C----------------------------------------------------------------------- +C samples 2 --> 2 scattering that puts a particle on its mass shell +C +C particle1 is along +z, always receives mass +C particle2 is along -z, mass only sampled if both aquire mass +C +C DEPENDS: slope-parameter in s_difmass +C +C INPUT: ECM : center-of-mass energy of scattering particles +C M1in : mass of first particle +C M2in : mass of second particle +C XMAX : maximal mass that can be obtained +C IMOD : remnant or diffraction mode +C +C OUTPUT: P1,P2 : final state 4vectors in two-particle c.m. \FR'14 +C----------------------------------------------------------------------- + IMPLICIT NONE + +c external types + DOUBLE PRECISION ECM,XM1in,XM2in,XMAX,P1,P2 + DIMENSION P1(5),P2(5) + INTEGER IMOD,LBAD + + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NIPAR_max,NPAR_max + PARAMETER (NPAR_max=200,NIPAR_max=100) + DOUBLE PRECISION PAR + INTEGER IPAR + COMMON /S_CFLAFR/ PAR(NPAR_max), IPAR(NIPAR_max) + INTEGER ITRY, NREJ + COMMON /S_CNT/ ITRY(20), NREJ(20) + DOUBLE PRECISION AM,AM2 + COMMON /S_MASS1/ AM(99), AM2(99) + +c internal types + DOUBLE PRECISION XMB2,XMT2,AXMX,S,X1,X2,ALX,SLOP0,SLOPE,DB, + & T,PTS,PZB2,PZT2,PT,PHI,XMB,XMT,S_RNDM,PTSWTCH + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + DOUBLE PRECISION SLOP0_0,ASLOP,BSLOP + INTEGER II + SAVE + DATA SLOP0_0 /6.5D0/ ! b (slope_ for Mx**2 > 5 GeV**2 + DATA ASLOP /31.10362D0/ ! fit to the slope parameter. + DATA BSLOP /-15.29012D0/ + + IF(NDEBUG.gt.3) + & WRITE(LUN,*) ' TRANSFONSHELL: called with (Ecm,M1,M2,XMAX):', + & ECM,XM1in,XM2in,XMAX + + XMB2 = XM1in**2 + XMT2 = XM2in**2 + + AXMX = LOG(XMAX) + + ITRY(6) = 0 + LBAD = 1 + +C remnant pt parameters +c distribution is: exp(-slope*t) +c slope = aslop + bslop * log(Mx**2) +c (by default same as in diff. +c scale with paramterers 90 and 91) + +c diff. pt paramters + ASLOP = PAR(133) + BSLOP = PAR(134) + SLOP0_0 = PAR(135) + + S = ECM*ECM + X1 = 1.D0-(XMT2-XMB2)/S + X2 = 2.D0-X1 + IF(X2.LT.EPS5) RETURN + + 60 ITRY(6) = ITRY(6) + 1 + IF(ITRY(6).GT.NREJ(6)) RETURN +c sample transverse momentum + ALX = LOG(MAX(XMT2,XMB2)) +c set slope of pt distribution + IF(IMOD.eq.0)THEN +c diffraction dissociation + SLOP0 = SLOP0_0*PAR(93) + SLOPE = MAX(SLOP0,ASLOP+BSLOP*ALX) + PTSWTCH = 1.D0 + + ELSEIF(IMOD.eq.1)THEN +c remnant excitation + IF(IPAR(57).eq.0)THEN + ALX = ALX-LOG(AM2(13)) + SLOP0 = PAR(92) + DB = (SLOP0-PAR(90))/AXMX + SLOPE = MAX(SLOP0,PAR(90)+DB*PAR(91)*ALX) + ELSE + ALX = ALX-LOG(AM2(13)) + SLOP0 = PAR(92) + SLOPE = MAX(SLOP0,PAR(90)+PAR(91)*ALX) + ENDIF + PTSWTCH = 1.D0 + + ELSEIF(IMOD.eq.3)THEN +c no pt + PTSWTCH = 0.D0 + SLOPE = 1.D0 + ENDIF + IF(ndebug.gt.3) + & WRITE(LUN,*) ' TRANSFONSHELL: (SLOP0,SLOPE,log(M**2)):', + & SLOP0,SLOPE,ALX + T = -DLOG(MAX(EPS10,S_RNDM(0)))/SLOPE + PTS = T*X1*PTSWTCH + PZB2 = S*0.5D0*0.5D0*X1*X1-XMB2-PTS + PZT2 = S*0.5D0*0.5D0*X2*X2-XMT2-PTS + IF(NDEBUG.gt.3) + & WRITE(LUN,*) ' TRANSFONSHELL: (PTS,PZB2,PZT2):',PTS,PZB2,PZT2 +c IF (ABS(PZB2)-PZT2.GT.EPS10) GOTO 60 + IF (PZB2.lt.0.D0.or.PZT2.LT.0.D0) GOTO 60 + PT = DSQRT(PTS) + PHI = TWOPI*S_RNDM(1) + XMB = sqrt(XMB2) + XMT = sqrt(XMT2) + P2(4) = 0.5D0*ECM*X2 + P2(3) = -DSQRT(PZT2) + P2(1) = PT*dCOS(PHI) + P2(2) = PT*dSIN(PHI) + P2(5) = XMT + + P1(4) = 0.5D0*ECM*X1 + P1(3) = DSQRT(PZB2) + do ii = 1,2 + P1(ii) = -P2(ii) + enddo + P1(5) = XMB + IF(NDEBUG.gt.3) THEN + WRITE(LUN,*) ' TRANSFONSHELL: (P1):',(p1(ii),ii=1,5) + WRITE(LUN,*) ' TRANSFONSHELL: (P2):',(p2(ii),ii=1,5) + ENDIF + LBAD = 0 + END +C======================================================================= + + SUBROUTINE SAMPLE_SEA (ALPHA,ASUP,XMASS,XMAX,X1,X2,PT) + +C----------------------------------------------------------------------- +C. Routine that samples the kinematical variables of a sea quark pair. +C. INPUT: STR_mass_min : minimal string mass ** 2 = x1 * x2 * s +C. ASUP : large x suppression exponent +C. OUTPUT: X1, X2, PT (GeV) /FR'14 +C----------------------------------------------------------------------- +Cf2py double precision, intent(in) :: ALPHA,ASUP,XMASS,XMAX +Cf2py double precision, intent(out) :: X1,X2,PT + IMPLICIT NONE + +c include COMMONs + INTEGER NCALL, NDEBUG, LUN + COMMON /S_DEBUG/ NCALL, NDEBUG, LUN + INTEGER NW_max + PARAMETER (NW_max = 20) +C-------------------------------------------------------------------- +C SIBYLL common blocks containing event information \FR'14 +C-------------------------------------------------------------------- + +C EVENT INFO COMMON +C contains overall interaction properties, like +C SQS : center-of-mass energy +C S : " " squared +C PTmin : low pt cut of QCD cross section, +C i.e. minimal pt of hard minijets +C Xmin : low-x bound for PDFs, +C i.e. minimal momentum fraction of hard partons +C Zmin : logarithm of that +C KB : PID of beam hadron +C KT() : PID of target +C IAT : mass number of target + DOUBLE PRECISION SQS,S,PTmin,XMIN,ZMIN + INTEGER KB,IAT,KT + COMMON /S_RUN/ SQS, S, PTmin, XMIN, ZMIN, KB, KT(NW_max), IAT + +C-------------------------------------------------------------------- +C SIBYLL utility common blocks containing constants \FR'14 +C-------------------------------------------------------------------- + DOUBLE PRECISION EPS3,EPS5,EPS8,EPS10 + COMMON /SIB_EPS/ EPS3,EPS5,EPS8,EPS10 + + DOUBLE PRECISION PI,TWOPI,CMBARN + COMMON /SIB_CST/ PI,TWOPI,CMBARN + + DOUBLE PRECISION FACN + DIMENSION FACN(3:10) + COMMON /SIB_FAC/ FACN + +c external type declarations + DOUBLE PRECISION ALPHA,ASUP,XMASS,XMAX,X1,X2,PT + +c internal types + DOUBLE PRECISION XMINA,XM2DIS,XR,SLOPE,S_RNDM,XRNDM + SAVE + + IF(ndebug.gt.3) + & write(lun,*) ' SAMPLE_SEA: alpha,asup,qmass,xmax', + & ALPHA,ASUP,XMASS,XMAX + +c min. momentum fraction for massive quarks +c i.e. sample from 1/(x+x_min) + XMINA = 2.D0*XMASS/SQS + IF(ndebug.gt.3) + & write(lun,*) ' SAMPLE_SEA: xmina:',XMINA +c exponent of large x suppression: (1-x)**b, b=0 or b>1 + IF(ABS(ASUP).lt.EPS3)THEN +c b = 0 , no suppression, sample bare 1/(x+xmin) + X1 = XM2DIS(XMINA,XMAX,ALPHA) ! ~(1/x)**alpha + X2 = XM2DIS(XMINA,XMAX,ALPHA) ! ~(1/x)**alpha + + ELSEIF(ASUP.ge.EPS3)THEN +c b >= 1 , sample bare (1-x)**b/(x+xmin) + SLOPE = MAX(ASUP,EPS3) +c quark + 100 X1 = XM2DIS(XMINA,XMAX,ALPHA) ! ~(1/x)**alpha + XR = LOG(1.D0-X1)-LOG(1.D0-XMINA) + XRNDM = S_RNDM(1) + IF(ndebug.gt.4) + & write(lun,*) ' X1,XR,SLOPE*XR:',X1,XR,SLOPE*XR + if(SLOPE*XR.le.LOG(max(XRNDM,eps10))) goto 100 + +c anti-quark + 200 X2 = XM2DIS(XMINA,XMAX,ALPHA) ! ~(1/x)**alpha + XR = log(1.D0-X2)-log(1.D0-XMINA) + XRNDM = S_RNDM(2) + IF(ndebug.gt.4) + & write(lun,*) ' X2,XR,SLOPE*XR,XRNDM:', + & X2,XR,SLOPE*XR,XRNDM + if(SLOPE*XR.le.log(max(XRNDM,eps10))) goto 200 + ELSE + WRITE(LUN,*) ' SAMPLE_SEA: suppression exponent out of range.' + WRITE(LUN,*) ' SAMPLE_SEA: ASUP:',ASUP + STOP + ENDIF + +c sample pt +c not yet implemented... to avoid problem with virtual partons + pt = 0.D0 + IF(ndebug.gt.3) + & write(lun,*) ' SAMPLE_SEA: X1,X2,PT:',X1,X2,PT + + END +C********************************************** +C +C contains the src for pion and proton pdf +C parametrizations according to GRV +C ( see function head for refs. ) +C +C 1 pion pdf +C 2 proton pdf GRV98LO +C +C********************************************** + +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* * +* G R V - P I O N - P A R A M E T R I Z A T I O N S * +* * +* FOR A DETAILED EXPLANATION SEE : * +* M. GLUECK, E.REYA, A.VOGT: DO-TH 91/16 * +* * +* THE PARAMETRIZATIONS ARE FITTED TO THE PARTON DISTRIBUTIONS * +* FOR Q ** 2 BETWEEN MU ** 2 (= 0.25 / 0.30 GEV ** 2 IN LO * +* / HO) AND 1.E8 GEV ** 2 AND FOR X BETWEEN 1.E-5 AND 1. * +* REGIONS, WHERE THE DISTRIBUTION UNDER CONSIDERATION IS NEG- * +* LIGIBLE, I.E. BELOW ABOUT 1.E-4, WERE EXCLUDED FROM THE FIT. * +* * +* HEAVY QUARK THRESHOLDS Q(H) = M(H) : * +* M(C) = 1.5, M(B) = 4.5, M(T) = 100 GEV * +* * +* CORRESPONDING LAMBDA(F) VALUES FOR F ACTIVE FLAVOURS : * +* LO : LAMBDA(3) = 0.232, LAMBDA(4) = 0.200, * +* LAMBDA(5) = 0.153, LAMBDA(6) = 0.082 GEV * +* HO : LAMBDA(3) = 0.248, LAMBDA(4) = 0.200, * +* LAMBDA(5) = 0.131, LAMBDA(6) = 0.053 GEV * +* * +* HO DISTRIBUTION REFER TO THE MS-BAR SCHEME OF BARDEEN ET AL. * +* * +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C======================================================================= + + SUBROUTINE DORPLO (X, Q2, VAP, GLP, QBP, CBP, BBP) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A - Z) + SAVE + + MU2 = 0.25D0 + LAM2 = 0.232D0 * 0.232D0 + S = LOG (LOG(Q2/LAM2) / LOG(MU2/LAM2)) + DS = SQRT (S) + S2 = S * S +C...X * VALENCE : + NV = 0.519D0 + 0.180D0 * S - 0.011D0 * S2 + AKV = 0.499D0 - 0.027D0 * S + AGV = 0.381D0 - 0.419D0 * S + DV = 0.367D0 + 0.563D0 * S + VAP = DORFVP (X, NV, AKV, AGV, DV) +C...X * GLUON : + ALG = 0.599D0 + BEG = 1.263D0 + AKG = 0.482D0 + 0.341D0 * DS + BKG = 0.0D0 + AGG = 0.678D0 + 0.877D0 * S - 0.175D0 * S2 + BGG = 0.338D0 - 1.597D0 * S + CG = 0.0D0 - 0.233D0 * S + 0.406D0 * S2 + DG = 0.390D0 + 1.053D0 * S + EG = 0.618D0 + 2.070D0 * S + ESG = 3.676D0 + GLP =DORFGP(X, S, ALG, BEG, AKG, BKG, AGG, BGG, CG, DG, EG, ESG) +C...X * QBAR (SU(3)-SYMMETRIC SEA) : + SL = 0.0D0 + ALS = 0.55D0 + BES = 0.56D0 + AKS = 2.538D0 - 0.763D0 * S + AGS = -0.748D0 + BS = 0.313D0 + 0.935D0 * S + DS = 3.359D0 + EST = 4.433D0 + 1.301D0 * S + ESS = 9.30D0 - 0.887D0 * S + QBP = DORFQP (X, S, SL, ALS, BES, AKS, AGS, BS, DS, EST, ESS) +C...X * CBAR = X * C : + SC = 0.888D0 + ALC = 1.02D0 + BEC = 0.39D0 + AKC = 0.0D0 + AGC = 0.0D0 + BC = 1.008D0 + DC = 1.208D0 + 0.771D0 * S + EC = 4.40D0 + 1.493D0 * S + ESC = 2.032D0 + 1.901D0 * S + CBP = DORFQP (X, S, SC, ALC, BEC, AKC, AGC, BC, DC, EC, ESC) +C...X * BBAR = X * B : + SBO = 1.351D0 + ALB = 1.03D0 + BEB = 0.39D0 + AKB = 0.0D0 + AGB = 0.0D0 + BBO = 0.0D0 + DB = 0.697D0 + 0.855D0 * S + EB = 4.51D0 + 1.490D0 * S + ESB = 3.056D0 + 1.694D0 * S + BBP = DORFQP (X, S, SBO, ALB, BEB, AKB, AGB, BBO, DB, EB, ESB) + RETURN + END +C +C======================================================================= + + SUBROUTINE DORPHO (X, Q2, VAP, GLP, QBP, CBP, BBP) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A - Z) + SAVE + + MU2 = 0.3D0 + LAM2 = 0.248D0 * 0.248D0 + S = LOG (LOG(Q2/LAM2) / LOG(MU2/LAM2)) + DS = SQRT (S) + S2 = S * S +C...X * VALENCE : + NV = 0.456D0 + 0.150D0 * DS + 0.112D0 * S - 0.019D0 * S2 + AKV = 0.505D0 - 0.033D0 * S + AGV = 0.748D0 - 0.669D0 * DS - 0.133D0 * S + DV = 0.365D0 + 0.197D0 * DS + 0.394D0 * S + VAP = DORFVP (X, NV, AKV, AGV, DV) +C...X * GLUON : + ALG = 1.096D0 + BEG = 1.371D0 + AKG = 0.437D0 - 0.689D0 * DS + BKG = -0.631D0 + AGG = 1.324D0 - 0.441D0 * DS - 0.130D0 * S + BGG = -0.955D0 + 0.259D0 * S + CG = 1.075D0 - 0.302D0 * S + DG = 1.158D0 + 1.229D0 * S + EG = 0.0D0 + 2.510D0 * S + ESG = 2.604D0 + 0.165D0 * S + GLP =DORFGP(X, S, ALG, BEG, AKG, BKG, AGG, BGG, CG, DG, EG, ESG) +C...X * QBAR (SU(3)-SYMMETRIC SEA) : + SL = 0.0D0 + ALS = 0.85D0 + BES = 0.96D0 + AKS = -0.350D0 + 0.806D0 * S + AGS = -1.663D0 + BS = 3.148D0 + DS = 2.273D0 + 1.438D0 * S + EST = 3.214D0 + 1.545D0 * S + ESS = 1.341D0 + 1.938D0 * S + QBP = DORFQP (X, S, SL, ALS, BES, AKS, AGS, BS, DS, EST, ESS) +C...X * CBAR = X * C : + SC = 0.820D0 + ALC = 0.98D0 + BEC = 0.0D0 + AKC = 0.0D0 - 0.457D0 * S + AGC = 0.0D0 + BC = -1.00D0 + 1.40 D0* S + DC = 1.318D0 + 0.584D0 * S + EC = 4.45D0 + 1.235D0 * S + ESC = 1.496D0 + 1.010D0 * S + CBP = DORFQP (X, S, SC, ALC, BEC, AKC, AGC, BC, DC, EC, ESC) +C...X * BBAR = X * B : + SBO = 1.297D0 + ALB = 0.99D0 + BEB = 0.0D0 + AKB = 0.0D0 - 0.172D0 * S + AGB = 0.0D0 + BBO = 0.0D0 + DB = 1.447D0 + 0.485D0 * S + EB = 4.79D0 + 1.164D0 * S + ESB = 1.724D0 + 2.121D0 * S + BBP = DORFQP (X, S, SBO, ALB, BEB, AKB, AGB, BBO, DB, EB, ESB) + RETURN + END +C +C======================================================================= + + FUNCTION DORFVP (X, N, AK, AG, D) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A - Z) + SAVE + + DX = SQRT (X) + DORFVP = N * X**AK * (1.D0+ AG*DX) * (1.D0- X)**D + RETURN + END +C +C======================================================================= + + FUNCTION DORFGP (X, S, AL, BE, AK, BK, AG, BG, C, D, E, ES) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A - Z) + SAVE + + DX = SQRT (X) + LX = LOG (1.D0/X) + DORFGP = (X**AK * (AG + BG*DX + C*X) * LX**BK + S**AL + 1 * EXP (-E + SQRT (ES * S**BE * LX))) * (1.D0- X)**D + RETURN + END +C +C======================================================================= + + FUNCTION DORFQP (X, S, ST, AL, BE, AK, AG, B, D, E, ES) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A - Z) + SAVE + + DX = SQRT (X) + LX = LOG (1./X) + IF (S .LE. ST) THEN + DORFQP = 0.0D0 + ELSE + DORFQP = (S-ST)**AL / LX**AK * (1.D0+AG*DX+B*X) * (1.D0- X)**D + 1 * EXP(-E + SQRT(ES * S**BE * LX)) + END IF + RETURN + END +C======================================================================= + + DOUBLE PRECISION FUNCTION SIB_DOR92FS(X,S,ST,AL,BE,AK,AG,B,D,E,ES) + +C----------------------------------------------------------------------- + IMPLICIT DOUBLE PRECISION (A - Z) + SAVE + + DX = SQRT (X) + LX = LOG (1.D0/X) + IF (S .LE. ST) THEN + SIB_DOR92FS = 0.D0 + ELSE + SIB_DOR92FS = (S-ST)**AL/LX**AK*(1.D0+AG*DX+B*X)*(1.D0-X)**D + 1 * EXP (-E + SQRT (ES * S**BE * LX)) + END IF + + END + +C======================================================================= + + DOUBLE PRECISION FUNCTION SIB_DBFINT(NARG,ARG,NA,ENT,TABLE) + +C----------------------------------------------------------------------- +C +C routine based on CERN library E104 +C +C multi-dimensional interpolation routine, needed for PHOJET +C internal cross section tables and several PDF sets (GRV98 and AGL) +C +C changed to avoid recursive function calls (R.Engel, 09/98) +C +C*********************************************************************** + IMPLICIT DOUBLE PRECISION (A-H,O-Z) + IMPLICIT INTEGER(I-N) + + INTEGER NA(NARG), INDE(32) + DOUBLE PRECISION ARG(NARG),ENT(NARG),TABLE(*),WEIGHT(32) + SAVE + + + DBFINT = 0.D0 + SIB_DBFINT = 0.D0 + IF(NARG .LT. 1 .OR. NARG .GT. 5) RETURN + + LMAX = 0 + ISTEP = 1 + KNOTS = 1 + INDE(1) = 1 + WEIGHT(1) = 1.D0 + DO 100 N = 1, NARG + X = ARG(N) + NDIM = NA(N) + LOCA = LMAX + LMIN = LMAX + 1 + LMAX = LMAX + NDIM + IF(NDIM .GT. 2) GOTO 10 + IF(NDIM .EQ. 1) GOTO 100 + H = X - ENT(LMIN) + IF(ABS(H) .LT. 0.D-8) GOTO 90 + ISHIFT = ISTEP + IF(ABS(X-ENT(LMIN+1)) .LT. 0.D-8) GOTO 21 + ISHIFT = 0 + ETA = H / (ENT(LMIN+1) - ENT(LMIN)) + GOTO 30 + 10 LOCB = LMAX + 1 + 11 LOCC = (LOCA+LOCB) / 2 + IF(X-ENT(LOCC)) 12, 20, 13 + 12 LOCB = LOCC + GOTO 14 + 13 LOCA = LOCC + 14 IF(LOCB-LOCA .GT. 1) GOTO 11 + LOCA = MIN ( MAX (LOCA,LMIN), LMAX-1 ) + ISHIFT = (LOCA - LMIN) * ISTEP + ETA = (X - ENT(LOCA)) / (ENT(LOCA+1) - ENT(LOCA)) + GOTO 30 + 20 ISHIFT = (LOCC - LMIN) * ISTEP + 21 DO 22 K = 1, KNOTS + INDE(K) = INDE(K) + ISHIFT + 22 CONTINUE + GOTO 90 + 30 DO 31 K = 1, KNOTS + INDE(K) = INDE(K) + ISHIFT + INDE(K+KNOTS) = INDE(K) + ISTEP + WEIGHT(K+KNOTS) = WEIGHT(K) * ETA + WEIGHT(K) = WEIGHT(K) - WEIGHT(K+KNOTS) + 31 CONTINUE + KNOTS = 2*KNOTS + 90 ISTEP = ISTEP * NDIM + 100 CONTINUE + DO 200 K = 1, KNOTS + I = INDE(K) + DBFINT = DBFINT + WEIGHT(K) * TABLE(I) + 200 CONTINUE + + SIB_DBFINT = DBFINT + + END + +C======================================================================= + + SUBROUTINE SIB_DOR98LO (Xinp, Q2inp, UV, DV, US, DS, SS, GL) + +C----------------------------------------------------------------------- +C*********************************************************************** +C +C GRV98 parton densities, leading order set +C +C For a detailed explanation see +C M. Glueck, E. Reya, A. Vogt : +C hep-ph/9806404 = DO-TH 98/07 = WUE-ITP-98-019 +C (To appear in Eur. Phys. J. C) +C +C interpolation routine based on the original GRV98PA routine, +C adapted to define interpolation table as DATA statements +C +C (R.Engel, 09/98) +C +C +C INPUT: X = Bjorken-x (between 1.E-9 and 1.) +C Q2 = scale in GeV**2 (between 0.8 and 1.E6) +C +C OUTPUT: UV = u - u(bar), DV = d - d(bar), US = u(bar), +C DS = d(bar), SS = s = s(bar), GL = gluon. +C Always x times the distribution is returned. +C +C******************************************************i**************** + IMPLICIT DOUBLE PRECISION (A-H, O-Z) + IMPLICIT INTEGER(I-N) + + PARAMETER (NX=68, NQ=27, NARG=2) + DIMENSION XUVF(NX,NQ), XDVF(NX,NQ), XDEF(NX,NQ), XUDF(NX,NQ), + 1 XSF(NX,NQ), XGF(NX,NQ), + 2 XT(NARG), NA(NARG), ARRF(NX+NQ) + + DIMENSION XUVF_L(NX*NQ), XDVF_L(NX*NQ), XDEF_L(NX*NQ), + & XUDF_L(NX*NQ), XSF_L(NX*NQ), XGF_L(NX*NQ) + + EQUIVALENCE (XUVF(1,1),XUVF_L(1)) + EQUIVALENCE (XDVF(1,1),XDVF_L(1)) + EQUIVALENCE (XDEF(1,1),XDEF_L(1)) + EQUIVALENCE (XUDF(1,1),XUDF_L(1)) + EQUIVALENCE (XSF(1,1),XSF_L(1)) + EQUIVALENCE (XGF(1,1),XGF_L(1)) + SAVE + + DATA (ARRF(K),K= 1, 95) / + & -2.0723D+01,-2.0135D+01,-1.9560D+01,-1.8983D+01,-1.8421D+01, + & -1.7833D+01,-1.7258D+01,-1.6680D+01,-1.6118D+01,-1.5530D+01, + & -1.4955D+01,-1.4378D+01,-1.3816D+01,-1.3479D+01,-1.3122D+01, + & -1.2717D+01,-1.2311D+01,-1.1913D+01,-1.1513D+01,-1.1176D+01, + & -1.0820D+01,-1.0414D+01,-1.0009D+01,-9.6108D+00,-9.2103D+00, + & -8.8739D+00,-8.5172D+00,-8.1117D+00,-7.7063D+00,-7.3082D+00, + & -6.9078D+00,-6.5713D+00,-6.2146D+00,-5.8091D+00,-5.4037D+00, + & -5.0056D+00,-4.6052D+00,-4.2687D+00,-3.9120D+00,-3.5066D+00, + & -3.1011D+00,-2.8134D+00,-2.5257D+00,-2.3026D+00,-2.0794D+00, + & -1.8971D+00,-1.7430D+00,-1.6094D+00,-1.4917D+00,-1.3863D+00, + & -1.2910D+00,-1.2040D+00,-1.1239D+00,-1.0498D+00,-9.8083D-01, + & -9.1629D-01,-7.9851D-01,-6.9315D-01,-5.9784D-01,-5.1083D-01, + & -4.3078D-01,-3.5667D-01,-2.8768D-01,-2.2314D-01,-1.6252D-01, + & -1.0536D-01,-5.1293D-02, 0.0000D+00,-2.2314D-01, 0.0000D+00, + & 2.6236D-01, 5.8779D-01, 9.9325D-01, 1.3863D+00, 1.8563D+00, + & 2.3026D+00, 2.7726D+00, 3.2189D+00, 3.6889D+00, 4.1589D+00, + & 4.6052D+00, 5.1930D+00, 5.7683D+00, 6.3456D+00, 6.9078D+00, + & 7.4955D+00, 8.0709D+00, 8.6482D+00, 9.2103D+00, 9.9988D+00, + & 1.0736D+01, 1.1513D+01, 1.2301D+01, 1.3039D+01, 1.3816D+01/ + DATA (XUVF_L(K),K= 1, 114) / + &2.3186D+00,2.2915D+00,2.2645D+00,2.2385D+00,2.2140D+00,2.1876D+00, + &2.1623D+00,2.1366D+00,2.1121D+00,2.0862D+00,2.0612D+00,2.0358D+00, + &2.0110D+00,1.9963D+00,1.9806D+00,1.9624D+00,1.9446D+00,1.9263D+00, + &1.9072D+00,1.8904D+00,1.8724D+00,1.8515D+00,1.8294D+00,1.8085D+00, + &1.7865D+00,1.7680D+00,1.7483D+00,1.7249D+00,1.6993D+00,1.6715D+00, + &1.6385D+00,1.6141D+00,1.5884D+00,1.5597D+00,1.5337D+00,1.5121D+00, + &1.4985D+00,1.4980D+00,1.5116D+00,1.5555D+00,1.6432D+00,1.7434D+00, + &1.8861D+00,2.0327D+00,2.2174D+00,2.4015D+00,2.5849D+00,2.7671D+00, + &2.9488D+00,3.1308D+00,3.3142D+00,3.4998D+00,3.6885D+00,3.8826D+00, + &4.0815D+00,4.2069D+00,4.5481D+00,4.8830D+00,5.2116D+00,5.5351D+00, + &5.8553D+00,6.1665D+00,6.4745D+00,6.7767D+00,7.0735D+00,7.3628D+00, + &7.6283D+00,0.0000D+00,2.3948D+00,2.3665D+00,2.3388D+00,2.3126D+00, + &2.2860D+00,2.2592D+00,2.2327D+00,2.2065D+00,2.1810D+00,2.1541D+00, + &2.1284D+00,2.1020D+00,2.0760D+00,2.0605D+00,2.0443D+00,2.0259D+00, + &2.0068D+00,1.9873D+00,1.9676D+00,1.9500D+00,1.9312D+00,1.9081D+00, + &1.8860D+00,1.8635D+00,1.8406D+00,1.8221D+00,1.8007D+00,1.7764D+00, + &1.7489D+00,1.7195D+00,1.6855D+00,1.6600D+00,1.6332D+00,1.6031D+00, + &1.5760D+00,1.5532D+00,1.5397D+00,1.5376D+00,1.5507D+00,1.5929D+00, + &1.6784D+00,1.7759D+00,1.9129D+00,2.0531D+00,2.2292D+00,2.4032D+00/ + DATA (XUVF_L(K),K= 115, 228) / + &2.5752D+00,2.7449D+00,2.9135D+00,3.0810D+00,3.2491D+00,3.4183D+00, + &3.5898D+00,3.7650D+00,3.9437D+00,4.0443D+00,4.3402D+00,4.6262D+00, + &4.9009D+00,5.1640D+00,5.4156D+00,5.6530D+00,5.8759D+00,6.0779D+00, + &6.2540D+00,6.3836D+00,6.4062D+00,0.0000D+00,2.4808D+00,2.4513D+00, + &2.4236D+00,2.3948D+00,2.3680D+00,2.3397D+00,2.3127D+00,2.2853D+00, + &2.2585D+00,2.2307D+00,2.2026D+00,2.1762D+00,2.1490D+00,2.1332D+00, + &2.1164D+00,2.0964D+00,2.0766D+00,2.0565D+00,2.0353D+00,2.0171D+00, + &1.9969D+00,1.9738D+00,1.9501D+00,1.9258D+00,1.9026D+00,1.8821D+00, + &1.8594D+00,1.8330D+00,1.8046D+00,1.7734D+00,1.7378D+00,1.7112D+00, + &1.6829D+00,1.6514D+00,1.6228D+00,1.5994D+00,1.5840D+00,1.5808D+00, + &1.5927D+00,1.6334D+00,1.7157D+00,1.8093D+00,1.9406D+00,2.0735D+00, + &2.2394D+00,2.4019D+00,2.5615D+00,2.7178D+00,2.8718D+00,3.0246D+00, + &3.1766D+00,3.3284D+00,3.4820D+00,3.6370D+00,3.7952D+00,3.8716D+00, + &4.1225D+00,4.3580D+00,4.5798D+00,4.7847D+00,4.9730D+00,5.1395D+00, + &5.2832D+00,5.3945D+00,5.4634D+00,5.4612D+00,5.2940D+00,0.0000D+00, + &2.5823D+00,2.5527D+00,2.5226D+00,2.4928D+00,2.4650D+00,2.4358D+00, + &2.4071D+00,2.3783D+00,2.3505D+00,2.3212D+00,2.2928D+00,2.2636D+00, + &2.2360D+00,2.2185D+00,2.2005D+00,2.1801D+00,2.1591D+00,2.1376D+00, + &2.1153D+00,2.0960D+00,2.0747D+00,2.0505D+00,2.0247D+00,1.9991D+00/ + DATA (XUVF_L(K),K= 229, 342) / + &1.9746D+00,1.9523D+00,1.9287D+00,1.9000D+00,1.8693D+00,1.8361D+00, + &1.7994D+00,1.7711D+00,1.7409D+00,1.7076D+00,1.6772D+00,1.6517D+00, + &1.6345D+00,1.6302D+00,1.6408D+00,1.6789D+00,1.7574D+00,1.8457D+00, + &1.9692D+00,2.0939D+00,2.2474D+00,2.3969D+00,2.5419D+00,2.6837D+00, + &2.8216D+00,2.9573D+00,3.0915D+00,3.2246D+00,3.3583D+00,3.4917D+00, + &3.6273D+00,3.6791D+00,3.8823D+00,4.0673D+00,4.2350D+00,4.3813D+00, + &4.5072D+00,4.6083D+00,4.6757D+00,4.7055D+00,4.6825D+00,4.5674D+00, + &4.2566D+00,0.0000D+00,2.7025D+00,2.6705D+00,2.6393D+00,2.6093D+00, + &2.5790D+00,2.5484D+00,2.5184D+00,2.4880D+00,2.4590D+00,2.4277D+00, + &2.3971D+00,2.3669D+00,2.3380D+00,2.3200D+00,2.3002D+00,2.2782D+00, + &2.2557D+00,2.2331D+00,2.2092D+00,2.1887D+00,2.1660D+00,2.1400D+00, + &2.1126D+00,2.0859D+00,2.0586D+00,2.0351D+00,2.0094D+00,1.9786D+00, + &1.9453D+00,1.9096D+00,1.8707D+00,1.8406D+00,1.8084D+00,1.7728D+00, + &1.7392D+00,1.7128D+00,1.6933D+00,1.6875D+00,1.6949D+00,1.7295D+00, + &1.8023D+00,1.8845D+00,1.9991D+00,2.1134D+00,2.2525D+00,2.3868D+00, + &2.5160D+00,2.6405D+00,2.7609D+00,2.8781D+00,2.9929D+00,3.1059D+00, + &3.2180D+00,3.3292D+00,3.4407D+00,3.4675D+00,3.6225D+00,3.7573D+00, + &3.8710D+00,3.9617D+00,4.0270D+00,4.0642D+00,4.0675D+00,4.0263D+00, + &3.9240D+00,3.7262D+00,3.3217D+00,0.0000D+00,2.8135D+00,2.7813D+00/ + DATA (XUVF_L(K),K= 343, 456) / + &2.7489D+00,2.7166D+00,2.6850D+00,2.6527D+00,2.6212D+00,2.5898D+00, + &2.5592D+00,2.5267D+00,2.4943D+00,2.4636D+00,2.4320D+00,2.4129D+00, + &2.3929D+00,2.3695D+00,2.3453D+00,2.3211D+00,2.2959D+00,2.2740D+00, + &2.2496D+00,2.2221D+00,2.1931D+00,2.1653D+00,2.1356D+00,2.1112D+00, + &2.0830D+00,2.0503D+00,2.0147D+00,1.9766D+00,1.9361D+00,1.9037D+00, + &1.8696D+00,1.8318D+00,1.7966D+00,1.7677D+00,1.7459D+00,1.7378D+00, + &1.7430D+00,1.7738D+00,1.8407D+00,1.9169D+00,2.0223D+00,2.1273D+00, + &2.2537D+00,2.3742D+00,2.4892D+00,2.5990D+00,2.7043D+00,2.8056D+00, + &2.9038D+00,3.0000D+00,3.0936D+00,3.1864D+00,3.2782D+00,3.2867D+00, + &3.4021D+00,3.4971D+00,3.5691D+00,3.6188D+00,3.6422D+00,3.6335D+00, + &3.5908D+00,3.5036D+00,3.3552D+00,3.1085D+00,2.6634D+00,0.0000D+00, + &2.9406D+00,2.9062D+00,2.8726D+00,2.8385D+00,2.8060D+00,2.7720D+00, + &2.7392D+00,2.7058D+00,2.6734D+00,2.6399D+00,2.6057D+00,2.5722D+00, + &2.5390D+00,2.5194D+00,2.4975D+00,2.4728D+00,2.4471D+00,2.4216D+00, + &2.3945D+00,2.3712D+00,2.3458D+00,2.3152D+00,2.2856D+00,2.2545D+00, + &2.2237D+00,2.1966D+00,2.1672D+00,2.1312D+00,2.0926D+00,2.0521D+00, + &2.0093D+00,1.9748D+00,1.9384D+00,1.8975D+00,1.8601D+00,1.8275D+00, + &1.8036D+00,1.7924D+00,1.7948D+00,1.8206D+00,1.8808D+00,1.9499D+00, + &2.0450D+00,2.1390D+00,2.2512D+00,2.3570D+00,2.4564D+00,2.5501D+00/ + DATA (XUVF_L(K),K= 457, 570) / + &2.6391D+00,2.7240D+00,2.8053D+00,2.8834D+00,2.9590D+00,3.0326D+00, + &3.1042D+00,3.0942D+00,3.1727D+00,3.2289D+00,3.2628D+00,3.2739D+00, + &3.2574D+00,3.2103D+00,3.1297D+00,3.0047D+00,2.8211D+00,2.5467D+00, + &2.0897D+00,0.0000D+00,3.0557D+00,3.0193D+00,2.9840D+00,2.9497D+00, + &2.9150D+00,2.8801D+00,2.8454D+00,2.8109D+00,2.7771D+00,2.7412D+00, + &2.7065D+00,2.6716D+00,2.6360D+00,2.6149D+00,2.5923D+00,2.5663D+00, + &2.5395D+00,2.5120D+00,2.4834D+00,2.4589D+00,2.4330D+00,2.4011D+00, + &2.3676D+00,2.3363D+00,2.3027D+00,2.2736D+00,2.2422D+00,2.2040D+00, + &2.1629D+00,2.1194D+00,2.0750D+00,2.0384D+00,1.9996D+00,1.9565D+00, + &1.9160D+00,1.8811D+00,1.8541D+00,1.8409D+00,1.8399D+00,1.8611D+00, + &1.9143D+00,1.9764D+00,2.0622D+00,2.1459D+00,2.2457D+00,2.3385D+00, + &2.4249D+00,2.5051D+00,2.5806D+00,2.6515D+00,2.7182D+00,2.7823D+00, + &2.8427D+00,2.9008D+00,2.9564D+00,2.9332D+00,2.9828D+00,3.0094D+00, + &3.0142D+00,2.9955D+00,2.9537D+00,2.8796D+00,2.7735D+00,2.6260D+00, + &2.4242D+00,2.1388D+00,1.6900D+00,0.0000D+00,3.1718D+00,3.1348D+00, + &3.0971D+00,3.0610D+00,3.0260D+00,2.9896D+00,2.9533D+00,2.9173D+00, + &2.8818D+00,2.8449D+00,2.8072D+00,2.7709D+00,2.7340D+00,2.7121D+00, + &2.6877D+00,2.6605D+00,2.6319D+00,2.6032D+00,2.5732D+00,2.5471D+00, + &2.5180D+00,2.4851D+00,2.4511D+00,2.4170D+00,2.3817D+00,2.3505D+00/ + DATA (XUVF_L(K),K= 571, 684) / + &2.3172D+00,2.2762D+00,2.2328D+00,2.1868D+00,2.1400D+00,2.1012D+00, + &2.0601D+00,2.0136D+00,1.9704D+00,1.9335D+00,1.9035D+00,1.8868D+00, + &1.8827D+00,1.8990D+00,1.9452D+00,2.0005D+00,2.0763D+00,2.1507D+00, + &2.2377D+00,2.3179D+00,2.3917D+00,2.4592D+00,2.5218D+00,2.5799D+00, + &2.6336D+00,2.6843D+00,2.7314D+00,2.7753D+00,2.8166D+00,2.7824D+00, + &2.8054D+00,2.8081D+00,2.7893D+00,2.7474D+00,2.6818D+00,2.5888D+00, + &2.4646D+00,2.3032D+00,2.0902D+00,1.8025D+00,1.3740D+00,0.0000D+00, + &3.2793D+00,3.2385D+00,3.2014D+00,3.1643D+00,3.1270D+00,3.0888D+00, + &3.0517D+00,3.0141D+00,2.9773D+00,2.9392D+00,2.9009D+00,2.8610D+00, + &2.8230D+00,2.8000D+00,2.7754D+00,2.7459D+00,2.7163D+00,2.6858D+00, + &2.6545D+00,2.6270D+00,2.5962D+00,2.5617D+00,2.5271D+00,2.4903D+00, + &2.4527D+00,2.4207D+00,2.3851D+00,2.3421D+00,2.2960D+00,2.2476D+00, + &2.1987D+00,2.1578D+00,2.1146D+00,2.0670D+00,2.0202D+00,1.9796D+00, + &1.9468D+00,1.9282D+00,1.9203D+00,1.9319D+00,1.9712D+00,2.0197D+00, + &2.0872D+00,2.1524D+00,2.2288D+00,2.2981D+00,2.3606D+00,2.4177D+00, + &2.4692D+00,2.5159D+00,2.5591D+00,2.5981D+00,2.6339D+00,2.6669D+00, + &2.6962D+00,2.6528D+00,2.6566D+00,2.6395D+00,2.6028D+00,2.5437D+00, + &2.4622D+00,2.3555D+00,2.2200D+00,2.0488D+00,1.8335D+00,1.5506D+00, + &1.1442D+00,0.0000D+00,3.3868D+00,3.3470D+00,3.3075D+00,3.2689D+00/ + DATA (XUVF_L(K),K= 685, 798) / + &3.2300D+00,3.1909D+00,3.1517D+00,3.1129D+00,3.0747D+00,3.0335D+00, + &2.9946D+00,2.9537D+00,2.9140D+00,2.8896D+00,2.8638D+00,2.8337D+00, + &2.8021D+00,2.7705D+00,2.7373D+00,2.7075D+00,2.6767D+00,2.6403D+00, + &2.6031D+00,2.5649D+00,2.5258D+00,2.4917D+00,2.4537D+00,2.4080D+00, + &2.3597D+00,2.3091D+00,2.2580D+00,2.2150D+00,2.1692D+00,2.1186D+00, + &2.0701D+00,2.0257D+00,1.9901D+00,1.9679D+00,1.9571D+00,1.9629D+00, + &1.9955D+00,2.0378D+00,2.0963D+00,2.1529D+00,2.2178D+00,2.2766D+00, + &2.3287D+00,2.3749D+00,2.4162D+00,2.4529D+00,2.4850D+00,2.5140D+00, + &2.5392D+00,2.5617D+00,2.5798D+00,2.5298D+00,2.5151D+00,2.4811D+00, + &2.4282D+00,2.3561D+00,2.2611D+00,2.1439D+00,2.0005D+00,1.8252D+00, + &1.6091D+00,1.3345D+00,9.5375D-01,0.0000D+00,3.4912D+00,3.4507D+00, + &3.4100D+00,3.3696D+00,3.3310D+00,3.2893D+00,3.2496D+00,3.2088D+00, + &3.1686D+00,3.1278D+00,3.0865D+00,3.0438D+00,3.0020D+00,2.9766D+00, + &2.9494D+00,2.9180D+00,2.8850D+00,2.8520D+00,2.8174D+00,2.7877D+00, + &2.7550D+00,2.7169D+00,2.6762D+00,2.6369D+00,2.5958D+00,2.5594D+00, + &2.5195D+00,2.4721D+00,2.4211D+00,2.3680D+00,2.3145D+00,2.2695D+00, + &2.2214D+00,2.1684D+00,2.1154D+00,2.0706D+00,2.0303D+00,2.0058D+00, + &1.9909D+00,1.9920D+00,2.0177D+00,2.0531D+00,2.1031D+00,2.1511D+00, + &2.2060D+00,2.2548D+00,2.2972D+00,2.3339D+00,2.3655D+00,2.3927D+00/ + DATA (XUVF_L(K),K= 799, 912) / + &2.4159D+00,2.4357D+00,2.4520D+00,2.4644D+00,2.4735D+00,2.4171D+00, + &2.3878D+00,2.3397D+00,2.2743D+00,2.1907D+00,2.0861D+00,1.9611D+00, + &1.8128D+00,1.6351D+00,1.4227D+00,1.1584D+00,8.0371D-01,0.0000D+00, + &3.5892D+00,3.5473D+00,3.5055D+00,3.4637D+00,3.4230D+00,3.3809D+00, + &3.3396D+00,3.2976D+00,3.2571D+00,3.2126D+00,3.1696D+00,3.1272D+00, + &3.0840D+00,3.0569D+00,3.0286D+00,2.9959D+00,2.9619D+00,2.9273D+00, + &2.8910D+00,2.8598D+00,2.8266D+00,2.7863D+00,2.7448D+00,2.7029D+00, + &2.6598D+00,2.6219D+00,2.5804D+00,2.5305D+00,2.4773D+00,2.4214D+00, + &2.3662D+00,2.3191D+00,2.2698D+00,2.2126D+00,2.1577D+00,2.1092D+00, + &2.0674D+00,2.0393D+00,2.0210D+00,2.0173D+00,2.0367D+00,2.0654D+00, + &2.1076D+00,2.1485D+00,2.1942D+00,2.2338D+00,2.2678D+00,2.2959D+00, + &2.3193D+00,2.3386D+00,2.3539D+00,2.3660D+00,2.3738D+00,2.3789D+00, + &2.3799D+00,2.3197D+00,2.2776D+00,2.2186D+00,2.1426D+00,2.0495D+00, + &1.9397D+00,1.8097D+00,1.6583D+00,1.4814D+00,1.2736D+00,1.0200D+00, + &6.8880D-01,0.0000D+00,3.7157D+00,3.6699D+00,3.6275D+00,3.5842D+00, + &3.5420D+00,3.4972D+00,3.4542D+00,3.4107D+00,3.3678D+00,3.3234D+00, + &3.2774D+00,3.2332D+00,3.1870D+00,3.1600D+00,3.1297D+00,3.0952D+00, + &3.0595D+00,3.0231D+00,2.9850D+00,2.9534D+00,2.9160D+00,2.8740D+00, + &2.8312D+00,2.7872D+00,2.7408D+00,2.7014D+00,2.6568D+00,2.6045D+00/ + DATA (XUVF_L(K),K= 913, 1026) / + &2.5481D+00,2.4895D+00,2.4315D+00,2.3817D+00,2.3283D+00,2.2697D+00, + &2.2106D+00,2.1591D+00,2.1128D+00,2.0807D+00,2.0578D+00,2.0477D+00, + &2.0583D+00,2.0796D+00,2.1122D+00,2.1433D+00,2.1777D+00,2.2069D+00, + &2.2299D+00,2.2483D+00,2.2618D+00,2.2718D+00,2.2778D+00,2.2803D+00, + &2.2797D+00,2.2749D+00,2.2668D+00,2.2019D+00,2.1468D+00,2.0761D+00, + &1.9902D+00,1.8883D+00,1.7711D+00,1.6370D+00,1.4847D+00,1.3103D+00, + &1.1091D+00,8.7047D-01,5.6856D-01,0.0000D+00,3.8327D+00,3.7877D+00, + &3.7424D+00,3.6981D+00,3.6540D+00,3.6083D+00,3.5637D+00,3.5184D+00, + &3.4753D+00,3.4271D+00,3.3800D+00,3.3325D+00,3.2860D+00,3.2564D+00, + &3.2258D+00,3.1893D+00,3.1519D+00,3.1135D+00,3.0738D+00,3.0389D+00, + &3.0010D+00,2.9580D+00,2.9118D+00,2.8654D+00,2.8178D+00,2.7758D+00, + &2.7289D+00,2.6738D+00,2.6146D+00,2.5530D+00,2.4924D+00,2.4399D+00, + &2.3845D+00,2.3213D+00,2.2605D+00,2.2040D+00,2.1540D+00,2.1186D+00, + &2.0908D+00,2.0749D+00,2.0772D+00,2.0914D+00,2.1145D+00,2.1368D+00, + &2.1613D+00,2.1804D+00,2.1941D+00,2.2037D+00,2.2088D+00,2.2101D+00, + &2.2083D+00,2.2031D+00,2.1942D+00,2.1826D+00,2.1665D+00,2.0987D+00, + &2.0321D+00,1.9516D+00,1.8571D+00,1.7497D+00,1.6281D+00,1.4923D+00, + &1.3406D+00,1.1697D+00,9.7635D-01,7.5209D-01,4.7638D-01,0.0000D+00, + &3.9497D+00,3.9009D+00,3.8555D+00,3.8080D+00,3.7630D+00,3.7163D+00/ + DATA (XUVF_L(K),K= 1027, 1140) / + &3.6699D+00,3.6231D+00,3.5765D+00,3.5285D+00,3.4807D+00,3.4305D+00, + &3.3810D+00,3.3511D+00,3.3185D+00,3.2805D+00,3.2414D+00,3.2016D+00, + &3.1598D+00,3.1244D+00,3.0837D+00,3.0383D+00,2.9908D+00,2.9424D+00, + &2.8919D+00,2.8477D+00,2.7990D+00,2.7403D+00,2.6784D+00,2.6142D+00, + &2.5507D+00,2.4960D+00,2.4362D+00,2.3710D+00,2.3058D+00,2.2463D+00, + &2.1931D+00,2.1539D+00,2.1216D+00,2.0996D+00,2.0940D+00,2.1012D+00, + &2.1154D+00,2.1294D+00,2.1444D+00,2.1543D+00,2.1597D+00,2.1610D+00, + &2.1585D+00,2.1523D+00,2.1432D+00,2.1307D+00,2.1155D+00,2.0964D+00, + &2.0742D+00,2.0035D+00,1.9273D+00,1.8396D+00,1.7387D+00,1.6273D+00, + &1.5032D+00,1.3665D+00,1.2164D+00,1.0501D+00,8.6515D-01,6.5470D-01, + &4.0284D-01,0.0000D+00,4.0572D+00,4.0093D+00,3.9616D+00,3.9140D+00, + &3.8670D+00,3.8185D+00,3.7706D+00,3.7224D+00,3.6746D+00,3.6251D+00, + &3.5744D+00,3.5233D+00,3.4720D+00,3.4406D+00,3.4062D+00,3.3671D+00, + &3.3263D+00,3.2847D+00,3.2414D+00,3.2046D+00,3.1620D+00,3.1150D+00, + &3.0653D+00,3.0145D+00,2.9619D+00,2.9153D+00,2.8641D+00,2.8032D+00, + &2.7388D+00,2.6715D+00,2.6056D+00,2.5481D+00,2.4880D+00,2.4171D+00, + &2.3496D+00,2.2862D+00,2.2282D+00,2.1865D+00,2.1502D+00,2.1217D+00, + &2.1086D+00,2.1086D+00,2.1149D+00,2.1216D+00,2.1275D+00,2.1295D+00, + &2.1273D+00,2.1212D+00,2.1119D+00,2.0992D+00,2.0837D+00,2.0653D+00/ + DATA (XUVF_L(K),K= 1141, 1254) / + &2.0442D+00,2.0194D+00,1.9912D+00,1.9193D+00,1.8359D+00,1.7412D+00, + &1.6366D+00,1.5214D+00,1.3956D+00,1.2594D+00,1.1115D+00,9.5033D-01, + &7.7356D-01,5.7585D-01,3.4506D-01,0.0000D+00,4.1710D+00,4.1201D+00, + &4.0712D+00,4.0213D+00,3.9730D+00,3.9228D+00,3.8734D+00,3.8233D+00, + &3.7726D+00,3.7217D+00,3.6699D+00,3.6160D+00,3.5640D+00,3.5311D+00, + &3.4960D+00,3.4549D+00,3.4121D+00,3.3689D+00,3.3237D+00,3.2848D+00, + &3.2425D+00,3.1917D+00,3.1399D+00,3.0866D+00,3.0319D+00,2.9838D+00, + &2.9306D+00,2.8668D+00,2.7992D+00,2.7291D+00,2.6605D+00,2.6007D+00, + &2.5375D+00,2.4631D+00,2.3919D+00,2.3261D+00,2.2643D+00,2.2183D+00, + &2.1772D+00,2.1426D+00,2.1222D+00,2.1155D+00,2.1135D+00,2.1130D+00, + &2.1102D+00,2.1039D+00,2.0941D+00,2.0815D+00,2.0652D+00,2.0466D+00, + &2.0251D+00,2.0014D+00,1.9746D+00,1.9450D+00,1.9116D+00,1.8381D+00, + &1.7481D+00,1.6484D+00,1.5404D+00,1.4225D+00,1.2963D+00,1.1611D+00, + &1.0161D+00,8.6047D-01,6.9193D-01,5.0691D-01,2.9581D-01,0.0000D+00, + &4.2754D+00,4.2238D+00,4.1737D+00,4.1233D+00,4.0740D+00,4.0219D+00, + &3.9713D+00,3.9196D+00,3.8675D+00,3.8160D+00,3.7618D+00,3.7060D+00, + &3.6510D+00,3.6173D+00,3.5808D+00,3.5380D+00,3.4941D+00,3.4493D+00, + &3.4027D+00,3.3623D+00,3.3163D+00,3.2647D+00,3.2114D+00,3.1563D+00, + &3.0989D+00,3.0489D+00,2.9929D+00,2.9263D+00,2.8563D+00,2.7837D+00/ + DATA (XUVF_L(K),K= 1255, 1368) / + &2.7122D+00,2.6501D+00,2.5825D+00,2.5073D+00,2.4327D+00,2.3623D+00, + &2.2962D+00,2.2474D+00,2.2020D+00,2.1616D+00,2.1335D+00,2.1209D+00, + &2.1113D+00,2.1034D+00,2.0929D+00,2.0795D+00,2.0634D+00,2.0439D+00, + &2.0222D+00,1.9982D+00,1.9716D+00,1.9428D+00,1.9113D+00,1.8773D+00, + &1.8394D+00,1.7649D+00,1.6692D+00,1.5658D+00,1.4547D+00,1.3360D+00, + &1.2095D+00,1.0761D+00,9.3485D-01,7.8430D-01,6.2380D-01,4.5010D-01, + &2.5625D-01,0.0000D+00,4.3798D+00,4.3275D+00,4.2762D+00,4.2239D+00, + &4.1730D+00,4.1196D+00,4.0674D+00,4.0143D+00,3.9623D+00,3.9056D+00, + &3.8502D+00,3.7935D+00,3.7370D+00,3.7018D+00,3.6642D+00,3.6200D+00, + &3.5742D+00,3.5277D+00,3.4786D+00,3.4371D+00,3.3901D+00,3.3359D+00, + &3.2800D+00,3.2235D+00,3.1639D+00,3.1115D+00,3.0537D+00,2.9847D+00, + &2.9116D+00,2.8364D+00,2.7623D+00,2.6973D+00,2.6275D+00,2.5497D+00, + &2.4705D+00,2.3972D+00,2.3281D+00,2.2747D+00,2.2253D+00,2.1793D+00, + &2.1444D+00,2.1253D+00,2.1081D+00,2.0939D+00,2.0755D+00,2.0555D+00, + &2.0332D+00,2.0081D+00,1.9814D+00,1.9522D+00,1.9205D+00,1.8875D+00, + &1.8520D+00,1.8139D+00,1.7725D+00,1.6968D+00,1.5976D+00,1.4911D+00, + &1.3772D+00,1.2577D+00,1.1320D+00,1.0005D+00,8.6242D-01,7.1750D-01, + &5.6466D-01,4.0150D-01,2.2333D-01,0.0000D+00,4.4809D+00,4.4265D+00, + &4.3735D+00,4.3193D+00,4.2670D+00,4.2128D+00,4.1585D+00,4.1039D+00/ + DATA (XUVF_L(K),K= 1369, 1482) / + &4.0509D+00,3.9928D+00,3.9351D+00,3.8769D+00,3.8180D+00,3.7821D+00, + &3.7434D+00,3.6974D+00,3.6501D+00,3.6019D+00,3.5513D+00,3.5093D+00, + &3.4594D+00,3.4035D+00,3.3456D+00,3.2870D+00,3.2250D+00,3.1715D+00, + &3.1110D+00,3.0396D+00,2.9639D+00,2.8863D+00,2.8096D+00,2.7429D+00, + &2.6702D+00,2.5884D+00,2.5068D+00,2.4296D+00,2.3560D+00,2.3003D+00, + &2.2464D+00,2.1951D+00,2.1530D+00,2.1283D+00,2.1045D+00,2.0843D+00, + &2.0591D+00,2.0328D+00,2.0047D+00,1.9749D+00,1.9429D+00,1.9096D+00, + &1.8740D+00,1.8369D+00,1.7978D+00,1.7560D+00,1.7116D+00,1.6360D+00, + &1.5322D+00,1.4233D+00,1.3084D+00,1.1885D+00,1.0637D+00,9.3449D-01, + &7.9961D-01,6.6020D-01,5.1453D-01,3.6103D-01,1.9641D-01,0.0000D+00, + &4.6169D+00,4.5608D+00,4.5060D+00,4.4504D+00,4.3960D+00,4.3395D+00, + &4.2837D+00,4.2262D+00,4.1710D+00,4.1106D+00,4.0517D+00,3.9908D+00, + &3.9300D+00,3.8920D+00,3.8509D+00,3.8030D+00,3.7538D+00,3.7035D+00, + &3.6494D+00,3.6055D+00,3.5556D+00,3.4966D+00,3.4351D+00,3.3738D+00, + &3.3090D+00,3.2518D+00,3.1888D+00,3.1141D+00,3.0348D+00,2.9533D+00, + &2.8730D+00,2.8020D+00,2.7264D+00,2.6400D+00,2.5551D+00,2.4732D+00, + &2.3941D+00,2.3329D+00,2.2742D+00,2.2147D+00,2.1644D+00,2.1317D+00, + &2.0986D+00,2.0700D+00,2.0363D+00,2.0021D+00,1.9668D+00,1.9299D+00, + &1.8922D+00,1.8532D+00,1.8125D+00,1.7704D+00,1.7270D+00,1.6809D+00/ + DATA (XUVF_L(K),K= 1483, 1596) / + &1.6327D+00,1.5570D+00,1.4497D+00,1.3373D+00,1.2215D+00,1.1020D+00, + &9.7897D-01,8.5304D-01,7.2349D-01,5.9074D-01,4.5411D-01,3.1307D-01, + &1.6547D-01,0.0000D+00,4.7403D+00,4.6834D+00,4.6262D+00,4.5696D+00, + &4.5140D+00,4.4557D+00,4.3978D+00,4.3393D+00,4.2817D+00,4.2191D+00, + &4.1578D+00,4.0941D+00,4.0310D+00,3.9917D+00,3.9492D+00,3.8995D+00, + &3.8481D+00,3.7958D+00,3.7411D+00,3.6937D+00,3.6405D+00,3.5806D+00, + &3.5171D+00,3.4520D+00,3.3840D+00,3.3254D+00,3.2596D+00,3.1812D+00, + &3.0985D+00,3.0137D+00,2.9301D+00,2.8556D+00,2.7782D+00,2.6879D+00, + &2.5974D+00,2.5119D+00,2.4281D+00,2.3629D+00,2.2982D+00,2.2324D+00, + &2.1730D+00,2.1332D+00,2.0922D+00,2.0570D+00,2.0152D+00,1.9739D+00, + &1.9323D+00,1.8902D+00,1.8474D+00,1.8039D+00,1.7589D+00,1.7129D+00, + &1.6654D+00,1.6163D+00,1.5652D+00,1.4896D+00,1.3789D+00,1.2649D+00, + &1.1487D+00,1.0300D+00,9.0896D-01,7.8619D-01,6.6149D-01,5.3498D-01, + &4.0654D-01,2.7586D-01,1.4208D-01,0.0000D+00,4.8699D+00,4.8107D+00, + &4.7518D+00,4.6928D+00,4.6350D+00,4.5750D+00,4.5152D+00,4.4524D+00, + &4.3956D+00,4.3299D+00,4.2674D+00,4.2014D+00,4.1350D+00,4.0939D+00, + &4.0503D+00,3.9982D+00,3.9448D+00,3.8905D+00,3.8328D+00,3.7846D+00, + &3.7300D+00,3.6664D+00,3.5991D+00,3.5326D+00,3.4620D+00,3.3998D+00, + &3.3311D+00,3.2494D+00,3.1632D+00,3.0752D+00,2.9881D+00,2.9120D+00/ + DATA (XUVF_L(K),K= 1597, 1710) / + &2.8299D+00,2.7339D+00,2.6398D+00,2.5493D+00,2.4611D+00,2.3911D+00, + &2.3215D+00,2.2482D+00,2.1812D+00,2.1342D+00,2.0854D+00,2.0427D+00, + &1.9932D+00,1.9453D+00,1.8978D+00,1.8504D+00,1.8030D+00,1.7545D+00, + &1.7059D+00,1.6565D+00,1.6056D+00,1.5535D+00,1.4989D+00,1.4245D+00, + &1.3108D+00,1.1959D+00,1.0798D+00,9.6219D-01,8.4358D-01,7.2422D-01, + &6.0451D-01,4.8425D-01,3.6380D-01,2.4286D-01,1.2189D-01,0.0000D+00, + &4.9964D+00,4.9356D+00,4.8755D+00,4.8147D+00,4.7550D+00,4.6935D+00, + &4.6315D+00,4.5697D+00,4.5062D+00,4.4406D+00,4.3752D+00,4.3061D+00, + &4.2380D+00,4.1962D+00,4.1500D+00,4.0963D+00,4.0405D+00,3.9832D+00, + &3.9245D+00,3.8728D+00,3.8172D+00,3.7504D+00,3.6811D+00,3.6108D+00, + &3.5381D+00,3.4734D+00,3.4018D+00,3.3164D+00,3.2269D+00,3.1352D+00, + &3.0446D+00,2.9657D+00,2.8794D+00,2.7800D+00,2.6821D+00,2.5867D+00, + &2.4930D+00,2.4184D+00,2.3433D+00,2.2634D+00,2.1877D+00,2.1342D+00, + &2.0772D+00,2.0279D+00,1.9713D+00,1.9172D+00,1.8642D+00,1.8120D+00, + &1.7600D+00,1.7076D+00,1.6553D+00,1.6027D+00,1.5491D+00,1.4938D+00, + &1.4374D+00,1.3637D+00,1.2481D+00,1.1325D+00,1.0166D+00,9.0047D-01, + &7.8428D-01,6.6889D-01,5.5381D-01,4.3953D-01,3.2652D-01,2.1461D-01, + &1.0498D-01,0.0000D+00,5.1134D+00,5.0511D+00,4.9886D+00,4.9273D+00, + &4.8660D+00,4.8016D+00,4.7382D+00,4.6744D+00,4.6106D+00,4.5420D+00/ + DATA (XUVF_L(K),K= 1711, 1824) / + &4.4742D+00,4.4028D+00,4.3320D+00,4.2892D+00,4.2413D+00,4.1858D+00, + &4.1281D+00,4.0682D+00,4.0067D+00,3.9556D+00,3.8955D+00,3.8271D+00, + &3.7556D+00,3.6829D+00,3.6071D+00,3.5401D+00,3.4662D+00,3.3777D+00, + &3.2849D+00,3.1898D+00,3.0960D+00,3.0140D+00,2.9244D+00,2.8224D+00, + &2.7183D+00,2.6191D+00,2.5219D+00,2.4431D+00,2.3628D+00,2.2767D+00, + &2.1931D+00,2.1332D+00,2.0695D+00,2.0145D+00,1.9514D+00,1.8920D+00, + &1.8340D+00,1.7775D+00,1.7215D+00,1.6664D+00,1.6108D+00,1.5553D+00, + &1.4995D+00,1.4421D+00,1.3839D+00,1.3103D+00,1.1944D+00,1.0782D+00, + &9.6271D-01,8.4822D-01,7.3481D-01,6.2240D-01,5.1184D-01,4.0291D-01, + &2.9618D-01,1.9206D-01,9.1846D-02,0.0000D+00,5.2367D+00,5.1713D+00, + &5.1071D+00,5.0425D+00,4.9800D+00,4.9141D+00,4.8489D+00,4.7833D+00, + &4.7181D+00,4.6457D+00,4.5768D+00,4.5034D+00,4.4300D+00,4.3847D+00, + &4.3353D+00,4.2782D+00,4.2182D+00,4.1570D+00,4.0921D+00,4.0385D+00, + &3.9782D+00,3.9074D+00,3.8331D+00,3.7575D+00,3.6781D+00,3.6086D+00, + &3.5313D+00,3.4401D+00,3.3439D+00,3.2455D+00,3.1483D+00,3.0623D+00, + &2.9694D+00,2.8629D+00,2.7561D+00,2.6527D+00,2.5508D+00,2.4669D+00, + &2.3816D+00,2.2887D+00,2.1979D+00,2.1317D+00,2.0613D+00,2.0002D+00, + &1.9307D+00,1.8659D+00,1.8033D+00,1.7426D+00,1.6834D+00,1.6247D+00, + &1.5668D+00,1.5085D+00,1.4504D+00,1.3916D+00,1.3311D+00,1.2591D+00/ + DATA (XUVF_L(K),K= 1825, 1836) / + &1.1415D+00,1.0256D+00,9.1107D-01,7.9840D-01,6.8736D-01,5.7902D-01, + &4.7260D-01,3.6895D-01,2.6838D-01,1.7161D-01,8.0264D-02,0.0000D+00/ + DATA (XDVF_L(K),K= 1, 114) / + &1.4230D+00,1.4064D+00,1.3903D+00,1.3749D+00,1.3590D+00,1.3424D+00, + &1.3271D+00,1.3114D+00,1.2962D+00,1.2803D+00,1.2647D+00,1.2492D+00, + &1.2340D+00,1.2246D+00,1.2155D+00,1.2044D+00,1.1927D+00,1.1814D+00, + &1.1695D+00,1.1589D+00,1.1479D+00,1.1347D+00,1.1214D+00,1.1080D+00, + &1.0944D+00,1.0824D+00,1.0700D+00,1.0544D+00,1.0371D+00,1.0188D+00, + &9.9884D-01,9.8287D-01,9.6563D-01,9.4645D-01,9.2847D-01,9.1313D-01, + &9.0246D-01,8.9955D-01,9.0461D-01,9.2737D-01,9.7648D-01,1.0343D+00, + &1.1168D+00,1.2030D+00,1.3129D+00,1.4240D+00,1.5357D+00,1.6492D+00, + &1.7643D+00,1.8818D+00,2.0016D+00,2.1253D+00,2.2535D+00,2.3853D+00, + &2.5225D+00,2.5620D+00,2.7906D+00,3.0230D+00,3.2574D+00,3.4983D+00, + &3.7459D+00,4.0062D+00,4.2803D+00,4.5790D+00,4.9150D+00,5.3263D+00, + &5.9228D+00,0.0000D+00,1.4698D+00,1.4526D+00,1.4360D+00,1.4199D+00, + &1.4030D+00,1.3864D+00,1.3702D+00,1.3542D+00,1.3386D+00,1.3221D+00, + &1.3059D+00,1.2896D+00,1.2740D+00,1.2644D+00,1.2544D+00,1.2425D+00, + &1.2309D+00,1.2185D+00,1.2061D+00,1.1953D+00,1.1836D+00,1.1697D+00, + &1.1558D+00,1.1417D+00,1.1275D+00,1.1154D+00,1.1011D+00,1.0844D+00, + &1.0663D+00,1.0471D+00,1.0261D+00,1.0092D+00,9.9133D-01,9.7103D-01, + &9.5184D-01,9.3560D-01,9.2380D-01,9.1922D-01,9.2378D-01,9.4563D-01, + &9.9235D-01,1.0474D+00,1.1262D+00,1.2078D+00,1.3110D+00,1.4146D+00/ + DATA (XDVF_L(K),K= 115, 228) / + &1.5192D+00,1.6241D+00,1.7298D+00,1.8375D+00,1.9471D+00,2.0592D+00, + &2.1741D+00,2.2925D+00,2.4144D+00,2.4425D+00,2.6407D+00,2.8375D+00, + &3.0361D+00,3.2345D+00,3.4343D+00,3.6388D+00,3.8488D+00,4.0682D+00, + &4.3043D+00,4.5737D+00,4.9280D+00,0.0000D+00,1.5226D+00,1.5047D+00, + &1.4874D+00,1.4702D+00,1.4530D+00,1.4363D+00,1.4193D+00,1.4023D+00, + &1.3860D+00,1.3690D+00,1.3520D+00,1.3351D+00,1.3190D+00,1.3083D+00, + &1.2983D+00,1.2858D+00,1.2733D+00,1.2606D+00,1.2476D+00,1.2362D+00, + &1.2237D+00,1.2092D+00,1.1943D+00,1.1795D+00,1.1645D+00,1.1509D+00, + &1.1365D+00,1.1185D+00,1.0994D+00,1.0784D+00,1.0566D+00,1.0388D+00, + &1.0195D+00,9.9801D-01,9.7765D-01,9.6019D-01,9.4712D-01,9.4158D-01, + &9.4524D-01,9.6454D-01,1.0088D+00,1.0604D+00,1.1346D+00,1.2112D+00, + &1.3076D+00,1.4038D+00,1.4995D+00,1.5957D+00,1.6918D+00,1.7888D+00, + &1.8877D+00,1.9877D+00,2.0896D+00,2.1940D+00,2.2999D+00,2.3168D+00, + &2.4844D+00,2.6497D+00,2.8098D+00,2.9678D+00,3.1219D+00,3.2743D+00, + &3.4260D+00,3.5742D+00,3.7237D+00,3.8717D+00,4.0300D+00,0.0000D+00, + &1.5849D+00,1.5662D+00,1.5482D+00,1.5298D+00,1.5130D+00,1.4944D+00, + &1.4769D+00,1.4593D+00,1.4423D+00,1.4243D+00,1.4066D+00,1.3894D+00, + &1.3720D+00,1.3607D+00,1.3499D+00,1.3366D+00,1.3237D+00,1.3101D+00, + &1.2963D+00,1.2840D+00,1.2709D+00,1.2553D+00,1.2396D+00,1.2232D+00/ + DATA (XDVF_L(K),K= 229, 342) / + &1.2075D+00,1.1932D+00,1.1776D+00,1.1584D+00,1.1377D+00,1.1152D+00, + &1.0922D+00,1.0729D+00,1.0524D+00,1.0294D+00,1.0074D+00,9.8843D-01, + &9.7377D-01,9.6751D-01,9.6901D-01,9.8606D-01,1.0264D+00,1.0745D+00, + &1.1435D+00,1.2136D+00,1.3018D+00,1.3894D+00,1.4758D+00,1.5619D+00, + &1.6474D+00,1.7332D+00,1.8194D+00,1.9063D+00,1.9941D+00,2.0832D+00, + &2.1725D+00,2.1789D+00,2.3166D+00,2.4460D+00,2.5708D+00,2.6884D+00, + &2.7987D+00,2.9025D+00,2.9974D+00,3.0823D+00,3.1538D+00,3.2013D+00, + &3.2043D+00,0.0000D+00,1.6586D+00,1.6391D+00,1.6202D+00,1.6014D+00, + &1.5830D+00,1.5638D+00,1.5457D+00,1.5267D+00,1.5087D+00,1.4899D+00, + &1.4711D+00,1.4517D+00,1.4340D+00,1.4224D+00,1.4107D+00,1.3972D+00, + &1.3827D+00,1.3684D+00,1.3535D+00,1.3404D+00,1.3263D+00,1.3096D+00, + &1.2927D+00,1.2758D+00,1.2575D+00,1.2422D+00,1.2250D+00,1.2046D+00, + &1.1821D+00,1.1579D+00,1.1331D+00,1.1127D+00,1.0905D+00,1.0655D+00, + &1.0415D+00,1.0207D+00,1.0042D+00,9.9612D-01,9.9507D-01,1.0089D+00, + &1.0451D+00,1.0887D+00,1.1514D+00,1.2146D+00,1.2936D+00,1.3711D+00, + &1.4469D+00,1.5220D+00,1.5960D+00,1.6694D+00,1.7428D+00,1.8159D+00, + &1.8894D+00,1.9620D+00,2.0344D+00,2.0313D+00,2.1357D+00,2.2333D+00, + &2.3215D+00,2.4009D+00,2.4706D+00,2.5292D+00,2.5750D+00,2.6036D+00, + &2.6096D+00,2.5783D+00,2.4673D+00,0.0000D+00,1.7269D+00,1.7065D+00/ + DATA (XDVF_L(K),K= 343, 456) / + &1.6866D+00,1.6676D+00,1.6480D+00,1.6279D+00,1.6089D+00,1.5891D+00, + &1.5701D+00,1.5502D+00,1.5307D+00,1.5113D+00,1.4910D+00,1.4799D+00, + &1.4673D+00,1.4526D+00,1.4373D+00,1.4221D+00,1.4060D+00,1.3922D+00, + &1.3771D+00,1.3596D+00,1.3414D+00,1.3234D+00,1.3045D+00,1.2879D+00, + &1.2689D+00,1.2468D+00,1.2227D+00,1.1966D+00,1.1706D+00,1.1487D+00, + &1.1248D+00,1.0980D+00,1.0724D+00,1.0495D+00,1.0310D+00,1.0212D+00, + &1.0181D+00,1.0291D+00,1.0609D+00,1.1002D+00,1.1563D+00,1.2136D+00, + &1.2840D+00,1.3528D+00,1.4201D+00,1.4854D+00,1.5492D+00,1.6125D+00, + &1.6751D+00,1.7368D+00,1.7981D+00,1.8579D+00,1.9157D+00,1.9057D+00, + &1.9875D+00,2.0577D+00,2.1190D+00,2.1700D+00,2.2094D+00,2.2370D+00, + &2.2484D+00,2.2403D+00,2.2047D+00,2.1261D+00,1.9567D+00,0.0000D+00, + &1.8047D+00,1.7833D+00,1.7626D+00,1.7418D+00,1.7220D+00,1.7009D+00, + &1.6810D+00,1.6603D+00,1.6403D+00,1.6193D+00,1.5986D+00,1.5775D+00, + &1.5570D+00,1.5441D+00,1.5309D+00,1.5156D+00,1.4991D+00,1.4828D+00, + &1.4658D+00,1.4510D+00,1.4350D+00,1.4160D+00,1.3966D+00,1.3772D+00, + &1.3565D+00,1.3386D+00,1.3184D+00,1.2942D+00,1.2680D+00,1.2404D+00, + &1.2125D+00,1.1887D+00,1.1631D+00,1.1342D+00,1.1064D+00,1.0813D+00, + &1.0608D+00,1.0480D+00,1.0426D+00,1.0500D+00,1.0774D+00,1.1111D+00, + &1.1608D+00,1.2107D+00,1.2719D+00,1.3315D+00,1.3886D+00,1.4445D+00/ + DATA (XDVF_L(K),K= 457, 570) / + &1.4984D+00,1.5505D+00,1.6020D+00,1.6524D+00,1.7009D+00,1.7480D+00, + &1.7926D+00,1.7763D+00,1.8327D+00,1.8794D+00,1.9154D+00,1.9405D+00, + &1.9531D+00,1.9537D+00,1.9362D+00,1.8986D+00,1.8325D+00,1.7203D+00, + &1.5163D+00,0.0000D+00,1.8755D+00,1.8533D+00,1.8314D+00,1.8106D+00, + &1.7890D+00,1.7672D+00,1.7464D+00,1.7248D+00,1.7038D+00,1.6817D+00, + &1.6601D+00,1.6385D+00,1.6160D+00,1.6033D+00,1.5889D+00,1.5721D+00, + &1.5552D+00,1.5380D+00,1.5199D+00,1.5042D+00,1.4871D+00,1.4670D+00, + &1.4463D+00,1.4249D+00,1.4036D+00,1.3843D+00,1.3630D+00,1.3364D+00, + &1.3086D+00,1.2791D+00,1.2500D+00,1.2245D+00,1.1971D+00,1.1662D+00, + &1.1361D+00,1.1090D+00,1.0858D+00,1.0721D+00,1.0641D+00,1.0676D+00, + &1.0898D+00,1.1195D+00,1.1627D+00,1.2069D+00,1.2603D+00,1.3118D+00, + &1.3607D+00,1.4079D+00,1.4534D+00,1.4968D+00,1.5392D+00,1.5794D+00, + &1.6181D+00,1.6552D+00,1.6888D+00,1.6690D+00,1.7073D+00,1.7353D+00, + &1.7530D+00,1.7595D+00,1.7531D+00,1.7338D+00,1.6988D+00,1.6428D+00, + &1.5583D+00,1.4293D+00,1.2136D+00,0.0000D+00,1.9470D+00,1.9238D+00, + &1.9021D+00,1.8782D+00,1.8570D+00,1.8343D+00,1.8123D+00,1.7898D+00, + &1.7680D+00,1.7449D+00,1.7222D+00,1.6994D+00,1.6760D+00,1.6624D+00, + &1.6469D+00,1.6299D+00,1.6118D+00,1.5933D+00,1.5742D+00,1.5574D+00, + &1.5392D+00,1.5179D+00,1.4955D+00,1.4738D+00,1.4506D+00,1.4300D+00/ + DATA (XDVF_L(K),K= 571, 684) / + &1.4069D+00,1.3792D+00,1.3492D+00,1.3178D+00,1.2868D+00,1.2597D+00, + &1.2307D+00,1.1976D+00,1.1654D+00,1.1363D+00,1.1108D+00,1.0945D+00, + &1.0840D+00,1.0845D+00,1.1017D+00,1.1268D+00,1.1637D+00,1.2016D+00, + &1.2473D+00,1.2910D+00,1.3324D+00,1.3719D+00,1.4090D+00,1.4450D+00, + &1.4784D+00,1.5109D+00,1.5404D+00,1.5681D+00,1.5925D+00,1.5689D+00, + &1.5916D+00,1.6043D+00,1.6067D+00,1.5981D+00,1.5779D+00,1.5449D+00, + &1.4949D+00,1.4262D+00,1.3303D+00,1.1932D+00,9.7657D-01,0.0000D+00, + &2.0122D+00,1.9881D+00,1.9640D+00,1.9418D+00,1.9190D+00,1.8954D+00, + &1.8721D+00,1.8492D+00,1.8262D+00,1.8024D+00,1.7784D+00,1.7550D+00, + &1.7300D+00,1.7157D+00,1.6999D+00,1.6818D+00,1.6627D+00,1.6435D+00, + &1.6233D+00,1.6058D+00,1.5866D+00,1.5643D+00,1.5417D+00,1.5178D+00, + &1.4926D+00,1.4705D+00,1.4465D+00,1.4174D+00,1.3856D+00,1.3527D+00, + &1.3198D+00,1.2914D+00,1.2605D+00,1.2257D+00,1.1915D+00,1.1601D+00, + &1.1326D+00,1.1142D+00,1.1016D+00,1.0982D+00,1.1114D+00,1.1321D+00, + &1.1637D+00,1.1958D+00,1.2352D+00,1.2722D+00,1.3071D+00,1.3397D+00, + &1.3704D+00,1.3995D+00,1.4267D+00,1.4516D+00,1.4736D+00,1.4942D+00, + &1.5100D+00,1.4848D+00,1.4955D+00,1.4964D+00,1.4873D+00,1.4675D+00, + &1.4366D+00,1.3933D+00,1.3349D+00,1.2585D+00,1.1565D+00,1.0171D+00, + &8.0601D-01,0.0000D+00,2.0789D+00,2.0539D+00,2.0294D+00,2.0053D+00/ + DATA (XDVF_L(K),K= 685, 798) / + &1.9820D+00,1.9581D+00,1.9336D+00,1.9096D+00,1.8860D+00,1.8609D+00, + &1.8367D+00,1.8106D+00,1.7860D+00,1.7706D+00,1.7543D+00,1.7350D+00, + &1.7150D+00,1.6945D+00,1.6735D+00,1.6550D+00,1.6349D+00,1.6112D+00, + &1.5864D+00,1.5617D+00,1.5356D+00,1.5128D+00,1.4868D+00,1.4555D+00, + &1.4224D+00,1.3876D+00,1.3532D+00,1.3231D+00,1.2904D+00,1.2536D+00, + &1.2173D+00,1.1838D+00,1.1545D+00,1.1338D+00,1.1185D+00,1.1113D+00, + &1.1199D+00,1.1362D+00,1.1627D+00,1.1895D+00,1.2222D+00,1.2529D+00, + &1.2813D+00,1.3080D+00,1.3324D+00,1.3546D+00,1.3756D+00,1.3938D+00, + &1.4103D+00,1.4232D+00,1.4319D+00,1.4055D+00,1.4052D+00,1.3959D+00, + &1.3768D+00,1.3480D+00,1.3084D+00,1.2576D+00,1.1928D+00,1.1110D+00, + &1.0066D+00,8.6804D-01,6.6615D-01,0.0000D+00,2.1434D+00,2.1178D+00, + &2.0930D+00,2.0676D+00,2.0440D+00,2.0184D+00,1.9935D+00,1.9686D+00, + &1.9439D+00,1.9179D+00,1.8915D+00,1.8663D+00,1.8400D+00,1.8239D+00, + &1.8067D+00,1.7863D+00,1.7654D+00,1.7440D+00,1.7219D+00,1.7025D+00, + &1.6814D+00,1.6565D+00,1.6311D+00,1.6045D+00,1.5766D+00,1.5526D+00, + &1.5250D+00,1.4925D+00,1.4574D+00,1.4213D+00,1.3849D+00,1.3532D+00, + &1.3191D+00,1.2800D+00,1.2418D+00,1.2062D+00,1.1743D+00,1.1517D+00, + &1.1338D+00,1.1237D+00,1.1272D+00,1.1399D+00,1.1608D+00,1.1828D+00, + &1.2092D+00,1.2341D+00,1.2570D+00,1.2774D+00,1.2962D+00,1.3135D+00/ + DATA (XDVF_L(K),K= 799, 912) / + &1.3280D+00,1.3406D+00,1.3511D+00,1.3588D+00,1.3613D+00,1.3335D+00, + &1.3246D+00,1.3067D+00,1.2801D+00,1.2441D+00,1.1985D+00,1.1418D+00, + &1.0724D+00,9.8806D-01,8.8293D-01,7.4746D-01,5.5665D-01,0.0000D+00, + &2.2035D+00,2.1769D+00,2.1514D+00,2.1259D+00,2.1000D+00,2.0743D+00, + &2.0488D+00,2.0226D+00,1.9973D+00,1.9702D+00,1.9428D+00,1.9166D+00, + &1.8890D+00,1.8729D+00,1.8548D+00,1.8337D+00,1.8116D+00,1.7895D+00, + &1.7662D+00,1.7461D+00,1.7239D+00,1.6980D+00,1.6714D+00,1.6436D+00, + &1.6146D+00,1.5889D+00,1.5604D+00,1.5266D+00,1.4895D+00,1.4515D+00, + &1.4138D+00,1.3806D+00,1.3448D+00,1.3040D+00,1.2638D+00,1.2261D+00, + &1.1920D+00,1.1669D+00,1.1469D+00,1.1341D+00,1.1335D+00,1.1420D+00, + &1.1583D+00,1.1760D+00,1.1971D+00,1.2168D+00,1.2343D+00,1.2501D+00, + &1.2640D+00,1.2762D+00,1.2866D+00,1.2942D+00,1.2996D+00,1.3020D+00, + &1.3003D+00,1.2725D+00,1.2557D+00,1.2312D+00,1.1982D+00,1.1569D+00, + &1.1068D+00,1.0465D+00,9.7460D-01,8.8884D-01,7.8459D-01,6.5333D-01, + &4.7359D-01,0.0000D+00,2.2800D+00,2.2524D+00,2.2256D+00,2.1987D+00, + &2.1730D+00,2.1459D+00,2.1192D+00,2.0922D+00,2.0656D+00,2.0374D+00, + &2.0100D+00,1.9802D+00,1.9520D+00,1.9346D+00,1.9156D+00,1.8937D+00, + &1.8706D+00,1.8475D+00,1.8228D+00,1.8017D+00,1.7783D+00,1.7509D+00, + &1.7221D+00,1.6937D+00,1.6627D+00,1.6354D+00,1.6050D+00,1.5688D+00/ + DATA (XDVF_L(K),K= 913, 1026) / + &1.5301D+00,1.4898D+00,1.4503D+00,1.4150D+00,1.3772D+00,1.3339D+00, + &1.2911D+00,1.2510D+00,1.2138D+00,1.1866D+00,1.1637D+00,1.1458D+00, + &1.1403D+00,1.1441D+00,1.1548D+00,1.1669D+00,1.1817D+00,1.1950D+00, + &1.2065D+00,1.2163D+00,1.2249D+00,1.2313D+00,1.2355D+00,1.2379D+00, + &1.2379D+00,1.2348D+00,1.2275D+00,1.1987D+00,1.1744D+00,1.1427D+00, + &1.1035D+00,1.0570D+00,1.0018D+00,9.3862D-01,8.6494D-01,7.7913D-01, + &6.7747D-01,5.5266D-01,3.8741D-01,0.0000D+00,2.3524D+00,2.3243D+00, + &2.2963D+00,2.2689D+00,2.2420D+00,2.2137D+00,2.1858D+00,2.1579D+00, + &2.1301D+00,2.1011D+00,2.0718D+00,2.0424D+00,2.0120D+00,1.9937D+00, + &1.9743D+00,1.9509D+00,1.9267D+00,1.9020D+00,1.8763D+00,1.8541D+00, + &1.8295D+00,1.8006D+00,1.7713D+00,1.7402D+00,1.7077D+00,1.6794D+00, + &1.6475D+00,1.6087D+00,1.5679D+00,1.5259D+00,1.4840D+00,1.4470D+00, + &1.4072D+00,1.3615D+00,1.3163D+00,1.2738D+00,1.2336D+00,1.2045D+00, + &1.1783D+00,1.1563D+00,1.1459D+00,1.1457D+00,1.1504D+00,1.1577D+00, + &1.1662D+00,1.1742D+00,1.1807D+00,1.1857D+00,1.1886D+00,1.1902D+00, + &1.1899D+00,1.1878D+00,1.1830D+00,1.1751D+00,1.1633D+00,1.1345D+00, + &1.1039D+00,1.0667D+00,1.0230D+00,9.7228D-01,9.1417D-01,8.4905D-01, + &7.7478D-01,6.9004D-01,5.9155D-01,4.7371D-01,3.2191D-01,0.0000D+00, + &2.4233D+00,2.3947D+00,2.3653D+00,2.3365D+00,2.3090D+00,2.2800D+00/ + DATA (XDVF_L(K),K= 1027, 1140) / + &2.2512D+00,2.2220D+00,2.1934D+00,2.1628D+00,2.1319D+00,2.1007D+00, + &2.0700D+00,2.0512D+00,2.0301D+00,2.0057D+00,1.9809D+00,1.9549D+00, + &1.9281D+00,1.9049D+00,1.8791D+00,1.8497D+00,1.8175D+00,1.7854D+00, + &1.7507D+00,1.7209D+00,1.6878D+00,1.6474D+00,1.6047D+00,1.5603D+00, + &1.5164D+00,1.4777D+00,1.4358D+00,1.3879D+00,1.3403D+00,1.2952D+00, + &1.2523D+00,1.2206D+00,1.1913D+00,1.1661D+00,1.1505D+00,1.1462D+00, + &1.1460D+00,1.1481D+00,1.1518D+00,1.1545D+00,1.1559D+00,1.1562D+00, + &1.1548D+00,1.1523D+00,1.1478D+00,1.1414D+00,1.1331D+00,1.1212D+00, + &1.1055D+00,1.0763D+00,1.0405D+00,9.9877D-01,9.5130D-01,8.9815D-01, + &8.3813D-01,7.7188D-01,6.9792D-01,6.1492D-01,5.2020D-01,4.0920D-01, + &2.7020D-01,0.0000D+00,2.4906D+00,2.4607D+00,2.4307D+00,2.4014D+00, + &2.3730D+00,2.3427D+00,2.3127D+00,2.2828D+00,2.2528D+00,2.2213D+00, + &2.1903D+00,2.1577D+00,2.1250D+00,2.1053D+00,2.0839D+00,2.0583D+00, + &2.0318D+00,2.0051D+00,1.9771D+00,1.9527D+00,1.9259D+00,1.8935D+00, + &1.8607D+00,1.8269D+00,1.7917D+00,1.7606D+00,1.7253D+00,1.6833D+00, + &1.6387D+00,1.5925D+00,1.5465D+00,1.5061D+00,1.4624D+00,1.4121D+00, + &1.3623D+00,1.3152D+00,1.2700D+00,1.2349D+00,1.2036D+00,1.1745D+00, + &1.1544D+00,1.1457D+00,1.1410D+00,1.1389D+00,1.1378D+00,1.1357D+00, + &1.1332D+00,1.1290D+00,1.1244D+00,1.1176D+00,1.1099D+00,1.0996D+00/ + DATA (XDVF_L(K),K= 1141, 1254) / + &1.0875D+00,1.0729D+00,1.0538D+00,1.0249D+00,9.8511D-01,9.3994D-01, + &8.8948D-01,8.3410D-01,7.7332D-01,7.0681D-01,6.3377D-01,5.5280D-01, + &4.6214D-01,3.5755D-01,2.2965D-01,0.0000D+00,2.5589D+00,2.5291D+00, + &2.4979D+00,2.4676D+00,2.4370D+00,2.4060D+00,2.3753D+00,2.3443D+00, + &2.3135D+00,2.2809D+00,2.2486D+00,2.2146D+00,2.1810D+00,2.1602D+00, + &2.1376D+00,2.1114D+00,2.0841D+00,2.0557D+00,2.0265D+00,2.0011D+00, + &1.9730D+00,1.9392D+00,1.9055D+00,1.8697D+00,1.8327D+00,1.8003D+00, + &1.7635D+00,1.7197D+00,1.6727D+00,1.6246D+00,1.5770D+00,1.5346D+00, + &1.4890D+00,1.4363D+00,1.3841D+00,1.3341D+00,1.2867D+00,1.2492D+00, + &1.2151D+00,1.1824D+00,1.1578D+00,1.1451D+00,1.1356D+00,1.1298D+00, + &1.1233D+00,1.1169D+00,1.1105D+00,1.1027D+00,1.0940D+00,1.0840D+00, + &1.0726D+00,1.0592D+00,1.0444D+00,1.0265D+00,1.0045D+00,9.7613D-01, + &9.3249D-01,8.8451D-01,8.3193D-01,7.7510D-01,7.1373D-01,6.4749D-01, + &5.7554D-01,4.9725D-01,4.1072D-01,3.1254D-01,1.9551D-01,0.0000D+00, + &2.6244D+00,2.5927D+00,2.5615D+00,2.5299D+00,2.4990D+00,2.4671D+00, + &2.4356D+00,2.4034D+00,2.3717D+00,2.3377D+00,2.3034D+00,2.2689D+00, + &2.2340D+00,2.2126D+00,2.1892D+00,2.1616D+00,2.1331D+00,2.1040D+00, + &2.0736D+00,2.0471D+00,2.0180D+00,1.9830D+00,1.9472D+00,1.9112D+00, + &1.8717D+00,1.8375D+00,1.7996D+00,1.7538D+00,1.7053D+00,1.6548D+00/ + DATA (XDVF_L(K),K= 1255, 1368) / + &1.6053D+00,1.5612D+00,1.5138D+00,1.4590D+00,1.4045D+00,1.3516D+00, + &1.3023D+00,1.2626D+00,1.2251D+00,1.1889D+00,1.1601D+00,1.1441D+00, + &1.1302D+00,1.1201D+00,1.1098D+00,1.0996D+00,1.0888D+00,1.0782D+00, + &1.0659D+00,1.0531D+00,1.0388D+00,1.0228D+00,1.0047D+00,9.8480D-01, + &9.6040D-01,9.3234D-01,8.8589D-01,8.3563D-01,7.8162D-01,7.2366D-01, + &6.6215D-01,5.9658D-01,5.2617D-01,4.5043D-01,3.6787D-01,2.7575D-01, + &1.6826D-01,0.0000D+00,2.6886D+00,2.6564D+00,2.6234D+00,2.5908D+00, + &2.5600D+00,2.5268D+00,2.4943D+00,2.4612D+00,2.4283D+00,2.3924D+00, + &2.3582D+00,2.3219D+00,2.2860D+00,2.2642D+00,2.2394D+00,2.2113D+00, + &2.1817D+00,2.1512D+00,2.1198D+00,2.0920D+00,2.0618D+00,2.0268D+00, + &1.9890D+00,1.9503D+00,1.9098D+00,1.8739D+00,1.8343D+00,1.7867D+00, + &1.7365D+00,1.6843D+00,1.6329D+00,1.5870D+00,1.5377D+00,1.4807D+00, + &1.4239D+00,1.3692D+00,1.3169D+00,1.2751D+00,1.2350D+00,1.1954D+00, + &1.1624D+00,1.1425D+00,1.1247D+00,1.1110D+00,1.0963D+00,1.0827D+00, + &1.0687D+00,1.0547D+00,1.0396D+00,1.0240D+00,1.0070D+00,9.8853D-01, + &9.6834D-01,9.4569D-01,9.1962D-01,8.9220D-01,8.4321D-01,7.9105D-01, + &7.3592D-01,6.7777D-01,6.1620D-01,5.5143D-01,4.8272D-01,4.0962D-01, + &3.3102D-01,2.4455D-01,1.4574D-01,0.0000D+00,2.7496D+00,2.7153D+00, + &2.6835D+00,2.6504D+00,2.6180D+00,2.5834D+00,2.5502D+00,2.5161D+00/ + DATA (XDVF_L(K),K= 1369, 1482) / + &2.4824D+00,2.4466D+00,2.4095D+00,2.3736D+00,2.3360D+00,2.3124D+00, + &2.2875D+00,2.2580D+00,2.2274D+00,2.1960D+00,2.1631D+00,2.1347D+00, + &2.1032D+00,2.0670D+00,2.0277D+00,1.9882D+00,1.9458D+00,1.9086D+00, + &1.8675D+00,1.8179D+00,1.7658D+00,1.7122D+00,1.6586D+00,1.6112D+00, + &1.5600D+00,1.5010D+00,1.4420D+00,1.3855D+00,1.3294D+00,1.2858D+00, + &1.2435D+00,1.2006D+00,1.1641D+00,1.1410D+00,1.1193D+00,1.1023D+00, + &1.0837D+00,1.0664D+00,1.0496D+00,1.0329D+00,1.0157D+00,9.9745D-01, + &9.7803D-01,9.5735D-01,9.3539D-01,9.1075D-01,8.8302D-01,8.5608D-01, + &8.0509D-01,7.5168D-01,6.9580D-01,6.3743D-01,5.7619D-01,5.1233D-01, + &4.4547D-01,3.7496D-01,2.9995D-01,2.1862D-01,1.2745D-01,0.0000D+00, + &2.8331D+00,2.7978D+00,2.7648D+00,2.7299D+00,2.6960D+00,2.6609D+00, + &2.6263D+00,2.5910D+00,2.5561D+00,2.5197D+00,2.4802D+00,2.4424D+00, + &2.4030D+00,2.3791D+00,2.3526D+00,2.3216D+00,2.2897D+00,2.2570D+00, + &2.2225D+00,2.1925D+00,2.1595D+00,2.1199D+00,2.0799D+00,2.0383D+00, + &1.9938D+00,1.9551D+00,1.9121D+00,1.8601D+00,1.8054D+00,1.7494D+00, + &1.6932D+00,1.6435D+00,1.5898D+00,1.5280D+00,1.4659D+00,1.4056D+00, + &1.3471D+00,1.3010D+00,1.2550D+00,1.2078D+00,1.1652D+00,1.1383D+00, + &1.1114D+00,1.0902D+00,1.0668D+00,1.0451D+00,1.0248D+00,1.0039D+00, + &9.8353D-01,9.6205D-01,9.4076D-01,9.1705D-01,8.9229D-01,8.6577D-01/ + DATA (XDVF_L(K),K= 1483, 1596) / + &8.3604D-01,8.0985D-01,7.5687D-01,7.0190D-01,6.4516D-01,5.8700D-01, + &5.2660D-01,4.6452D-01,3.9995D-01,3.3310D-01,2.6289D-01,1.8826D-01, + &1.0655D-01,0.0000D+00,2.9096D+00,2.8732D+00,2.8390D+00,2.8027D+00, + &2.7690D+00,2.7325D+00,2.6961D+00,2.6597D+00,2.6231D+00,2.5833D+00, + &2.5456D+00,2.5047D+00,2.4650D+00,2.4391D+00,2.4120D+00,2.3799D+00, + &2.3462D+00,2.3123D+00,2.2763D+00,2.2451D+00,2.2108D+00,2.1692D+00, + &2.1276D+00,2.0835D+00,2.0378D+00,1.9974D+00,1.9525D+00,1.8983D+00, + &1.8413D+00,1.7827D+00,1.7243D+00,1.6725D+00,1.6166D+00,1.5520D+00, + &1.4872D+00,1.4244D+00,1.3627D+00,1.3136D+00,1.2649D+00,1.2130D+00, + &1.1663D+00,1.1352D+00,1.1040D+00,1.0787D+00,1.0514D+00,1.0264D+00, + &1.0021D+00,9.7883D-01,9.5548D-01,9.3171D-01,9.0763D-01,8.8283D-01, + &8.5596D-01,8.2732D-01,7.9601D-01,7.7056D-01,7.1598D-01,6.6027D-01, + &6.0340D-01,5.4514D-01,4.8601D-01,4.2556D-01,3.6359D-01,2.9984D-01, + &2.3396D-01,1.6486D-01,9.0844D-02,0.0000D+00,2.9880D+00,2.9510D+00, + &2.9150D+00,2.8782D+00,2.8430D+00,2.8048D+00,2.7677D+00,2.7301D+00, + &2.6924D+00,2.6517D+00,2.6110D+00,2.5696D+00,2.5280D+00,2.5017D+00, + &2.4728D+00,2.4393D+00,2.4042D+00,2.3687D+00,2.3313D+00,2.2988D+00, + &2.2631D+00,2.2204D+00,2.1768D+00,2.1312D+00,2.0828D+00,2.0405D+00, + &1.9928D+00,1.9364D+00,1.8772D+00,1.8164D+00,1.7558D+00,1.7018D+00/ + DATA (XDVF_L(K),K= 1597, 1710) / + &1.6434D+00,1.5762D+00,1.5084D+00,1.4432D+00,1.3783D+00,1.3261D+00, + &1.2741D+00,1.2182D+00,1.1669D+00,1.1315D+00,1.0961D+00,1.0671D+00, + &1.0360D+00,1.0071D+00,9.7992D-01,9.5371D-01,9.2801D-01,9.0200D-01, + &8.7588D-01,8.4862D-01,8.2038D-01,7.9020D-01,7.5770D-01,7.3298D-01, + &6.7721D-01,6.2090D-01,5.6394D-01,5.0631D-01,4.4841D-01,3.8970D-01, + &3.3019D-01,2.6973D-01,2.0791D-01,1.4420D-01,7.7416D-02,0.0000D+00, + &3.0661D+00,3.0288D+00,2.9911D+00,2.9537D+00,2.9160D+00,2.8778D+00, + &2.8392D+00,2.8000D+00,2.7610D+00,2.7200D+00,2.6782D+00,2.6345D+00, + &2.5900D+00,2.5625D+00,2.5329D+00,2.4982D+00,2.4617D+00,2.4247D+00, + &2.3857D+00,2.3518D+00,2.3145D+00,2.2697D+00,2.2245D+00,2.1764D+00, + &2.1269D+00,2.0819D+00,2.0331D+00,1.9746D+00,1.9126D+00,1.8497D+00, + &1.7862D+00,1.7303D+00,1.6696D+00,1.5995D+00,1.5285D+00,1.4608D+00, + &1.3929D+00,1.3377D+00,1.2826D+00,1.2228D+00,1.1669D+00,1.1279D+00, + &1.0882D+00,1.0555D+00,1.0205D+00,9.8876D-01,9.5876D-01,9.2969D-01, + &9.0171D-01,8.7356D-01,8.4551D-01,8.1668D-01,7.8701D-01,7.5564D-01, + &7.2196D-01,6.9797D-01,6.4121D-01,5.8469D-01,5.2810D-01,4.7131D-01, + &4.1460D-01,3.5783D-01,3.0063D-01,2.4338D-01,1.8544D-01,1.2660D-01, + &6.6270D-02,0.0000D+00,3.1379D+00,3.0995D+00,3.0600D+00,3.0213D+00, + &2.9840D+00,2.9442D+00,2.9047D+00,2.8641D+00,2.8239D+00,2.7813D+00/ + DATA (XDVF_L(K),K= 1711, 1824) / + &2.7383D+00,2.6928D+00,2.6470D+00,2.6191D+00,2.5880D+00,2.5519D+00, + &2.5145D+00,2.4761D+00,2.4357D+00,2.4004D+00,2.3615D+00,2.3153D+00, + &2.2678D+00,2.2180D+00,2.1669D+00,2.1208D+00,2.0699D+00,2.0087D+00, + &1.9447D+00,1.8795D+00,1.8139D+00,1.7558D+00,1.6930D+00,1.6205D+00, + &1.5467D+00,1.4759D+00,1.4054D+00,1.3484D+00,1.2895D+00,1.2267D+00, + &1.1663D+00,1.1242D+00,1.0808D+00,1.0449D+00,1.0065D+00,9.7194D-01, + &9.3967D-01,9.0840D-01,8.7834D-01,8.4891D-01,8.1928D-01,7.8930D-01, + &7.5803D-01,7.2562D-01,6.9124D-01,6.6796D-01,6.1058D-01,5.5392D-01, + &4.9752D-01,4.4176D-01,3.8633D-01,3.3127D-01,2.7648D-01,2.2186D-01, + &1.6735D-01,1.1268D-01,5.7652D-02,0.0000D+00,3.2129D+00,3.1726D+00, + &3.1325D+00,3.0928D+00,3.0540D+00,3.0127D+00,2.9717D+00,2.9303D+00, + &2.8887D+00,2.8449D+00,2.8001D+00,2.7537D+00,2.7060D+00,2.6766D+00, + &2.6453D+00,2.6073D+00,2.5683D+00,2.5286D+00,2.4866D+00,2.4501D+00, + &2.4107D+00,2.3628D+00,2.3125D+00,2.2620D+00,2.2079D+00,2.1597D+00, + &2.1067D+00,2.0440D+00,1.9778D+00,1.9097D+00,1.8421D+00,1.7819D+00, + &1.7169D+00,1.6416D+00,1.5664D+00,1.4922D+00,1.4189D+00,1.3583D+00, + &1.2971D+00,1.2300D+00,1.1652D+00,1.1200D+00,1.0729D+00,1.0343D+00, + &9.9254D-01,9.5513D-01,9.2006D-01,8.8711D-01,8.5555D-01,8.2426D-01, + &7.9305D-01,7.6193D-01,7.2963D-01,6.9636D-01,6.6128D-01,6.3868D-01/ + DATA (XDVF_L(K),K= 1825, 1836) / + &5.8093D-01,5.2428D-01,4.6858D-01,4.1372D-01,3.5972D-01,3.0648D-01, + &2.5392D-01,2.0208D-01,1.5083D-01,1.0018D-01,5.0068D-02,0.0000D+00/ + DATA (XDEF_L(K),K= 1, 114) / + &4.3007D-01,4.2474D-01,4.1967D-01,4.1458D-01,4.0970D-01,4.0443D-01, + &3.9925D-01,3.9397D-01,3.8864D-01,3.8302D-01,3.7707D-01,3.7100D-01, + &3.6470D-01,3.6080D-01,3.5639D-01,3.5109D-01,3.4531D-01,3.3914D-01, + &3.3238D-01,3.2609D-01,3.1913D-01,3.1062D-01,3.0152D-01,2.9176D-01, + &2.8100D-01,2.7114D-01,2.5952D-01,2.4467D-01,2.2784D-01,2.0937D-01, + &1.9117D-01,1.7470D-01,1.5685D-01,1.3678D-01,1.1825D-01,1.0349D-01, + &9.4854D-02,9.5054D-02,1.0589D-01,1.3527D-01,1.8584D-01,2.3426D-01, + &2.9021D-01,3.3527D-01,3.7670D-01,4.0255D-01,4.1326D-01,4.0880D-01, + &3.8831D-01,3.5045D-01,2.9287D-01,2.1298D-01,1.0773D-01,0.0000D+00, + &0.0000D+00,2.0644D-01,1.5422D-01,1.0950D-01,7.3614D-02,4.6726D-02, + &2.7433D-02,1.4144D-02,6.5080D-03,2.4719D-03,0.0000D+00,0.0000D+00, + &0.0000D+00,0.0000D+00,4.4398D-01,4.3864D-01,4.3346D-01,4.2809D-01, + &4.2290D-01,4.1747D-01,4.1205D-01,4.0650D-01,4.0098D-01,3.9480D-01, + &3.8873D-01,3.8226D-01,3.7560D-01,3.7145D-01,3.6678D-01,3.6108D-01, + &3.5488D-01,3.4833D-01,3.4123D-01,3.3464D-01,3.2718D-01,3.1811D-01, + &3.0838D-01,2.9811D-01,2.8670D-01,2.7630D-01,2.6412D-01,2.4861D-01, + &2.3110D-01,2.1209D-01,1.9355D-01,1.7681D-01,1.5878D-01,1.3870D-01, + &1.2044D-01,1.0620D-01,9.8341D-02,9.9345D-02,1.1086D-01,1.4055D-01, + &1.9033D-01,2.3696D-01,2.8983D-01,3.3137D-01,3.6834D-01,3.8982D-01/ + DATA (XDEF_L(K),K= 115, 228) / + &3.9672D-01,3.8896D-01,3.6609D-01,3.2678D-01,2.6933D-01,1.9181D-01, + &9.1683D-02,0.0000D+00,0.0000D+00,1.8955D-01,1.4041D-01,9.8873D-02, + &6.5928D-02,4.1462D-02,2.3905D-02,1.2324D-02,5.6113D-03,2.1050D-03, + &0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,4.5980D-01,4.5420D-01, + &4.4884D-01,4.4319D-01,4.3780D-01,4.3208D-01,4.2642D-01,4.2053D-01, + &4.1457D-01,4.0824D-01,4.0181D-01,3.9484D-01,3.8780D-01,3.8328D-01, + &3.7831D-01,3.7223D-01,3.6559D-01,3.5853D-01,3.5072D-01,3.4400D-01, + &3.3590D-01,3.2633D-01,3.1598D-01,3.0508D-01,2.9301D-01,2.8197D-01, + &2.6915D-01,2.5289D-01,2.3470D-01,2.1511D-01,1.9623D-01,1.7918D-01, + &1.6098D-01,1.4092D-01,1.2294D-01,1.0928D-01,1.0224D-01,1.0401D-01, + &1.1623D-01,1.4620D-01,1.9488D-01,2.3948D-01,2.8894D-01,3.2681D-01, + &3.5905D-01,3.7613D-01,3.7908D-01,3.6817D-01,3.4299D-01,3.0266D-01, + &2.4596D-01,1.7115D-01,7.6792D-02,0.0000D+00,0.0000D+00,1.7267D-01, + &1.2670D-01,8.8446D-02,5.8458D-02,3.6380D-02,2.0551D-02,1.0608D-02, + &4.7732D-03,1.7670D-03,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00, + &4.7845D-01,4.7258D-01,4.6687D-01,4.6107D-01,4.5540D-01,4.4938D-01, + &4.4336D-01,4.3728D-01,4.3070D-01,4.2403D-01,4.1702D-01,4.0968D-01, + &4.0210D-01,3.9723D-01,3.9181D-01,3.8522D-01,3.7808D-01,3.7047D-01, + &3.6211D-01,3.5469D-01,3.4619D-01,3.3582D-01,3.2478D-01,3.1314D-01/ + DATA (XDEF_L(K),K= 229, 342) / + &3.0021D-01,2.8848D-01,2.7488D-01,2.5781D-01,2.3886D-01,2.1865D-01, + &1.9932D-01,1.8196D-01,1.6359D-01,1.4359D-01,1.2596D-01,1.1295D-01, + &1.0678D-01,1.0933D-01,1.2234D-01,1.5242D-01,1.9969D-01,2.4187D-01, + &2.8742D-01,3.2112D-01,3.4825D-01,3.6067D-01,3.5959D-01,3.4546D-01, + &3.1813D-01,2.7719D-01,2.2151D-01,1.5037D-01,6.2862D-02,0.0000D+00, + &0.0000D+00,1.5516D-01,1.1270D-01,7.7856D-02,5.0916D-02,3.1337D-02, + &1.7279D-02,8.9355D-03,3.9672D-03,1.4465D-03,0.0000D+00,0.0000D+00, + &0.0000D+00,0.0000D+00,5.0059D-01,4.9450D-01,4.8826D-01,4.8213D-01, + &4.7610D-01,4.6972D-01,4.6326D-01,4.5655D-01,4.4999D-01,4.4265D-01, + &4.3505D-01,4.2703D-01,4.1870D-01,4.1345D-01,4.0758D-01,4.0034D-01, + &3.9260D-01,3.8434D-01,3.7539D-01,3.6725D-01,3.5804D-01,3.4696D-01, + &3.3492D-01,3.2231D-01,3.0852D-01,2.9601D-01,2.8154D-01,2.6348D-01, + &2.4363D-01,2.2272D-01,2.0295D-01,1.8526D-01,1.6669D-01,1.4678D-01, + &1.2956D-01,1.1726D-01,1.1212D-01,1.1548D-01,1.2910D-01,1.5906D-01, + &2.0458D-01,2.4395D-01,2.8508D-01,3.1418D-01,3.3593D-01,3.4343D-01, + &3.3827D-01,3.2104D-01,2.9189D-01,2.5067D-01,1.9688D-01,1.3016D-01, + &5.0498D-02,0.0000D+00,0.0000D+00,1.3742D-01,9.8602D-02,6.7357D-02, + &4.3555D-02,2.6444D-02,1.4175D-02,7.3561D-03,3.2181D-03,1.1530D-03, + &0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,5.2114D-01,5.1454D-01/ + DATA (XDEF_L(K),K= 343, 456) / + &5.0806D-01,5.0160D-01,4.9520D-01,4.8843D-01,4.8165D-01,4.7456D-01, + &4.6738D-01,4.5962D-01,4.5149D-01,4.4293D-01,4.3400D-01,4.2833D-01, + &4.2194D-01,4.1420D-01,4.0580D-01,3.9678D-01,3.8741D-01,3.7848D-01, + &3.6878D-01,3.5682D-01,3.4416D-01,3.3062D-01,3.1602D-01,3.0269D-01, + &2.8749D-01,2.6857D-01,2.4798D-01,2.2641D-01,2.0626D-01,1.8828D-01, + &1.6960D-01,1.4976D-01,1.3293D-01,1.2126D-01,1.1684D-01,1.2099D-01, + &1.3505D-01,1.6471D-01,2.0841D-01,2.4521D-01,2.8248D-01,3.0770D-01, + &3.2484D-01,3.2845D-01,3.1999D-01,3.0047D-01,2.7030D-01,2.2924D-01, + &1.7739D-01,1.1482D-01,4.2174D-02,0.0000D+00,0.0000D+00,1.2330D-01, + &8.7586D-02,5.9211D-02,3.7890D-02,2.2733D-02,1.1877D-02,6.1865D-03, + &2.6713D-03,9.4247D-04,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00, + &5.4423D-01,5.3740D-01,5.3068D-01,5.2385D-01,5.1700D-01,5.0982D-01, + &5.0256D-01,4.9509D-01,4.8731D-01,4.7895D-01,4.7023D-01,4.6094D-01, + &4.5130D-01,4.4506D-01,4.3820D-01,4.2973D-01,4.2069D-01,4.1108D-01, + &4.0069D-01,3.9131D-01,3.8063D-01,3.6796D-01,3.5430D-01,3.3991D-01, + &3.2433D-01,3.1014D-01,2.9407D-01,2.7418D-01,2.5281D-01,2.3056D-01, + &2.0999D-01,1.9171D-01,1.7291D-01,1.5321D-01,1.3677D-01,1.2578D-01, + &1.2220D-01,1.2696D-01,1.4132D-01,1.7056D-01,2.1212D-01,2.4603D-01, + &2.7912D-01,3.0023D-01,3.1274D-01,3.1234D-01,3.0087D-01,2.7925D-01/ + DATA (XDEF_L(K),K= 457, 570) / + &2.4820D-01,2.0782D-01,1.5841D-01,1.0056D-01,3.5470D-02,0.0000D+00, + &0.0000D+00,1.0941D-01,7.6864D-02,5.1391D-02,3.2506D-02,1.9250D-02, + &9.7741D-03,5.1192D-03,2.1775D-03,0.0000D+00,0.0000D+00,0.0000D+00, + &0.0000D+00,0.0000D+00,5.6542D-01,5.5814D-01,5.5101D-01,5.4385D-01, + &5.3670D-01,5.2913D-01,5.2140D-01,5.1352D-01,5.0533D-01,4.9639D-01, + &4.8702D-01,4.7710D-01,4.6670D-01,4.6011D-01,4.5270D-01,4.4365D-01, + &4.3394D-01,4.2383D-01,4.1271D-01,4.0253D-01,3.9137D-01,3.7783D-01, + &3.6325D-01,3.4810D-01,3.3163D-01,3.1674D-01,2.9988D-01,2.7922D-01, + &2.5706D-01,2.3429D-01,2.1333D-01,1.9484D-01,1.7592D-01,1.5634D-01, + &1.4028D-01,1.2985D-01,1.2692D-01,1.3218D-01,1.4678D-01,1.7535D-01, + &2.1492D-01,2.4628D-01,2.7582D-01,2.9349D-01,3.0215D-01,2.9865D-01, + &2.8479D-01,2.6176D-01,2.3025D-01,1.9073D-01,1.4372D-01,9.0030D-02, + &3.1431D-02,0.0000D+00,0.0000D+00,9.8561D-02,6.8571D-02,4.5400D-02, + &2.8439D-02,1.6650D-02,8.2414D-03,4.3377D-03,1.8226D-03,0.0000D+00, + &0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,5.8660D-01,5.7912D-01, + &5.7170D-01,5.6412D-01,5.5660D-01,5.4858D-01,5.4040D-01,5.3194D-01, + &5.2336D-01,5.1383D-01,5.0381D-01,4.9326D-01,4.8220D-01,4.7515D-01, + &4.6719D-01,4.5756D-01,4.4719D-01,4.3619D-01,4.2441D-01,4.1376D-01, + &4.0188D-01,3.8750D-01,3.7220D-01,3.5617D-01,3.3884D-01,3.2317D-01/ + DATA (XDEF_L(K),K= 571, 684) / + &3.0561D-01,2.8413D-01,2.6132D-01,2.3801D-01,2.1667D-01,1.9794D-01, + &1.7898D-01,1.5951D-01,1.4381D-01,1.3395D-01,1.3154D-01,1.3722D-01, + &1.5183D-01,1.7978D-01,2.1726D-01,2.4615D-01,2.7227D-01,2.8668D-01, + &2.9185D-01,2.8560D-01,2.6981D-01,2.4566D-01,2.1405D-01,1.7560D-01, + &1.3093D-01,8.1317D-02,2.8821D-02,0.0000D+00,0.0000D+00,8.9016D-02, + &6.1335D-02,4.0241D-02,2.4960D-02,1.4451D-02,6.9787D-03,3.6912D-03, + &1.5320D-03,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00, + &6.0621D-01,5.9821D-01,5.9043D-01,5.8253D-01,5.7470D-01,5.6625D-01, + &5.5768D-01,5.4870D-01,5.3948D-01,5.2962D-01,5.1919D-01,5.0796D-01, + &4.9620D-01,4.8867D-01,4.8027D-01,4.7003D-01,4.5907D-01,4.4740D-01, + &4.3484D-01,4.2392D-01,4.1127D-01,3.9627D-01,3.8010D-01,3.6326D-01, + &3.4524D-01,3.2900D-01,3.1064D-01,2.8853D-01,2.6510D-01,2.4135D-01, + &2.1970D-01,2.0080D-01,1.8175D-01,1.6242D-01,1.4701D-01,1.3753D-01, + &1.3572D-01,1.4160D-01,1.5623D-01,1.8343D-01,2.1902D-01,2.4571D-01, + &2.6885D-01,2.8059D-01,2.8292D-01,2.7441D-01,2.5704D-01,2.3223D-01, + &2.0062D-01,1.6317D-01,1.2079D-01,7.4733D-02,2.7461D-02,0.0000D+00, + &0.0000D+00,8.1334D-02,5.5577D-02,3.6150D-02,2.2243D-02,1.2749D-02, + &6.0264D-03,3.2009D-03,1.3143D-03,0.0000D+00,0.0000D+00,0.0000D+00, + &0.0000D+00,0.0000D+00,6.2581D-01,6.1778D-01,6.0953D-01,6.0134D-01/ + DATA (XDEF_L(K),K= 685, 798) / + &5.9310D-01,5.8428D-01,5.7523D-01,5.6587D-01,5.5625D-01,5.4565D-01, + &5.3457D-01,5.2280D-01,5.1030D-01,5.0236D-01,4.9350D-01,4.8267D-01, + &4.7104D-01,4.5899D-01,4.4560D-01,4.3381D-01,4.2066D-01,4.0485D-01, + &3.8801D-01,3.7047D-01,3.5165D-01,3.3476D-01,3.1574D-01,2.9293D-01, + &2.6889D-01,2.4469D-01,2.2279D-01,2.0369D-01,1.8458D-01,1.6537D-01, + &1.5025D-01,1.4125D-01,1.3980D-01,1.4589D-01,1.6046D-01,1.8686D-01, + &2.2052D-01,2.4502D-01,2.6530D-01,2.7444D-01,2.7406D-01,2.6361D-01, + &2.4491D-01,2.1954D-01,1.8819D-01,1.5193D-01,1.1170D-01,6.9146D-02, + &2.6829D-02,0.0000D+00,0.0000D+00,7.4387D-02,5.0398D-02,3.2529D-02, + &1.9840D-02,1.1260D-02,5.2109D-03,2.7796D-03,1.1291D-03,0.0000D+00, + &0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,6.4510D-01,6.3663D-01, + &6.2809D-01,6.1948D-01,6.1090D-01,6.0165D-01,5.9256D-01,5.8263D-01, + &5.7237D-01,5.6121D-01,5.4960D-01,5.3710D-01,5.2390D-01,5.1555D-01, + &5.0615D-01,4.9474D-01,4.8273D-01,4.6980D-01,4.5603D-01,4.4343D-01, + &4.2983D-01,4.1325D-01,3.9561D-01,3.7731D-01,3.5765D-01,3.4017D-01, + &3.2063D-01,2.9709D-01,2.7258D-01,2.4795D-01,2.2572D-01,2.0647D-01, + &1.8735D-01,1.6824D-01,1.5339D-01,1.4470D-01,1.4366D-01,1.4990D-01, + &1.6437D-01,1.8986D-01,2.2169D-01,2.4408D-01,2.6175D-01,2.6863D-01, + &2.6585D-01,2.5363D-01,2.3397D-01,2.0813D-01,1.7714D-01,1.4205D-01/ + DATA (XDEF_L(K),K= 799, 912) / + &1.0396D-01,6.4602D-02,2.6785D-02,0.0000D+00,0.0000D+00,6.8343D-02, + &4.5962D-02,2.9434D-02,1.7812D-02,1.0015D-02,4.5458D-03,2.4331D-03, + &9.7866D-04,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00, + &6.6281D-01,6.5407D-01,6.4523D-01,6.3631D-01,6.2740D-01,6.1775D-01, + &6.0821D-01,5.9770D-01,5.8724D-01,5.7535D-01,5.6321D-01,5.5021D-01, + &5.3640D-01,5.2763D-01,5.1775D-01,5.0583D-01,4.9310D-01,4.7946D-01, + &4.6520D-01,4.5225D-01,4.3811D-01,4.2074D-01,4.0247D-01,3.8355D-01, + &3.6315D-01,3.4516D-01,3.2502D-01,3.0091D-01,2.7589D-01,2.5090D-01, + &2.2842D-01,2.0903D-01,1.8987D-01,1.7087D-01,1.5631D-01,1.4790D-01, + &1.4709D-01,1.5345D-01,1.6771D-01,1.9243D-01,2.2253D-01,2.4307D-01, + &2.5846D-01,2.6327D-01,2.5857D-01,2.4493D-01,2.2441D-01,1.9832D-01, + &1.6773D-01,1.3380D-01,9.7606D-02,6.1077D-02,2.7123D-02,4.1687D-04, + &0.0000D+00,6.3316D-02,4.2290D-02,2.6899D-02,1.6166D-02,9.0143D-03, + &4.0214D-03,2.1587D-03,8.6042D-04,0.0000D+00,0.0000D+00,0.0000D+00, + &0.0000D+00,0.0000D+00,6.8558D-01,6.7623D-01,6.6716D-01,6.5776D-01, + &6.4840D-01,6.3825D-01,6.2778D-01,6.1697D-01,6.0589D-01,5.9350D-01, + &5.8071D-01,5.6677D-01,5.5220D-01,5.4293D-01,5.3246D-01,5.1980D-01, + &5.0630D-01,4.9221D-01,4.7690D-01,4.6348D-01,4.4839D-01,4.3024D-01, + &4.1112D-01,3.9125D-01,3.7016D-01,3.5134D-01,3.3054D-01,3.0571D-01/ + DATA (XDEF_L(K),K= 913, 1026) / + &2.8005D-01,2.5463D-01,2.3186D-01,2.1230D-01,1.9311D-01,1.7422D-01, + &1.5985D-01,1.5187D-01,1.5138D-01,1.5783D-01,1.7178D-01,1.9543D-01, + &2.2331D-01,2.4162D-01,2.5415D-01,2.5666D-01,2.4964D-01,2.3438D-01, + &2.1293D-01,1.8681D-01,1.5680D-01,1.2430D-01,9.0488D-02,5.7352D-02, + &2.7942D-02,7.0995D-03,2.4780D-03,5.7612D-02,3.8138D-02,2.4057D-02, + &1.4329D-02,7.9111D-03,3.4566D-03,1.8603D-03,7.3347D-04,0.0000D+00, + &0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,7.0709D-01,6.9744D-01, + &6.8784D-01,6.7803D-01,6.6830D-01,6.5763D-01,6.4678D-01,6.3540D-01, + &6.2360D-01,6.1071D-01,5.9715D-01,5.8240D-01,5.6710D-01,5.5722D-01, + &5.4625D-01,5.3291D-01,5.1856D-01,5.0380D-01,4.8797D-01,4.7363D-01, + &4.5801D-01,4.3900D-01,4.1917D-01,3.9846D-01,3.7656D-01,3.5717D-01, + &3.3564D-01,3.1017D-01,2.8397D-01,2.5816D-01,2.3508D-01,2.1538D-01, + &1.9615D-01,1.7737D-01,1.6324D-01,1.5559D-01,1.5535D-01,1.6175D-01, + &1.7537D-01,1.9793D-01,2.2384D-01,2.4005D-01,2.5009D-01,2.5051D-01, + &2.4150D-01,2.2495D-01,2.0291D-01,1.7668D-01,1.4739D-01,1.1625D-01, + &8.4583D-02,5.4470D-02,2.9013D-02,1.3147D-02,1.4553D-02,5.2777D-02, + &3.4672D-02,2.1686D-02,1.2821D-02,7.0105D-03,3.0093D-03,1.6226D-03, + &6.3321D-04,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00, + &7.2796D-01,7.1795D-01,7.0799D-01,6.9776D-01,6.8760D-01,6.7649D-01/ + DATA (XDEF_L(K),K= 1027, 1140) / + &6.6523D-01,6.5299D-01,6.4099D-01,6.2720D-01,6.1289D-01,5.9763D-01, + &5.8140D-01,5.7108D-01,5.5954D-01,5.4555D-01,5.3082D-01,5.1501D-01, + &4.9841D-01,4.8352D-01,4.6718D-01,4.4758D-01,4.2678D-01,4.0543D-01, + &3.8267D-01,3.6267D-01,3.4052D-01,3.1445D-01,2.8771D-01,2.6154D-01, + &2.3817D-01,2.1835D-01,1.9910D-01,1.8043D-01,1.6662D-01,1.5905D-01, + &1.5900D-01,1.6548D-01,1.7871D-01,2.0015D-01,2.2403D-01,2.3835D-01, + &2.4610D-01,2.4469D-01,2.3394D-01,2.1634D-01,1.9372D-01,1.6761D-01, + &1.3910D-01,1.0920D-01,7.9530D-02,5.2165D-02,3.0250D-02,1.8723D-02, + &2.5275D-02,4.8575D-02,3.1676D-02,1.9677D-02,1.1540D-02,6.2533D-03, + &2.6411D-03,1.4253D-03,5.5072D-04,0.0000D+00,0.0000D+00,0.0000D+00, + &0.0000D+00,0.0000D+00,7.4788D-01,7.3751D-01,7.2708D-01,7.1644D-01, + &7.0580D-01,6.9430D-01,6.8256D-01,6.6975D-01,6.5712D-01,6.4276D-01, + &6.2791D-01,6.1180D-01,5.9490D-01,5.8409D-01,5.7199D-01,5.5739D-01, + &5.4166D-01,5.2544D-01,5.0821D-01,4.9288D-01,4.7590D-01,4.5544D-01, + &4.3393D-01,4.1178D-01,3.8837D-01,3.6775D-01,3.4513D-01,3.1844D-01, + &2.9125D-01,2.6472D-01,2.4110D-01,2.2115D-01,2.0189D-01,1.8330D-01, + &1.6955D-01,1.6237D-01,1.6243D-01,1.6875D-01,1.8164D-01,2.0201D-01, + &2.2410D-01,2.3665D-01,2.4236D-01,2.3927D-01,2.2710D-01,2.0852D-01, + &1.8563D-01,1.5962D-01,1.3170D-01,1.0314D-01,7.5292D-02,5.0347D-02/ + DATA (XDEF_L(K),K= 1141, 1254) / + &3.1513D-02,2.3688D-02,3.4520D-02,4.4988D-02,2.9140D-02,1.7975D-02, + &1.0472D-02,5.6268D-03,2.3442D-03,1.2646D-03,4.8432D-04,0.0000D+00, + &0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,7.6812D-01,7.5731D-01, + &7.4653D-01,7.3551D-01,7.2440D-01,7.1234D-01,6.9989D-01,6.8692D-01, + &6.7357D-01,6.5855D-01,6.4312D-01,6.2624D-01,6.0850D-01,5.9719D-01, + &5.8457D-01,5.6934D-01,5.5297D-01,5.3626D-01,5.1802D-01,5.0223D-01, + &4.8440D-01,4.6329D-01,4.4109D-01,4.1826D-01,3.9408D-01,3.7291D-01, + &3.4966D-01,3.2243D-01,2.9475D-01,2.6790D-01,2.4406D-01,2.2399D-01, + &2.0470D-01,1.8621D-01,1.7262D-01,1.6558D-01,1.6576D-01,1.7201D-01, + &1.8441D-01,2.0372D-01,2.2403D-01,2.3482D-01,2.3856D-01,2.3398D-01, + &2.2040D-01,2.0103D-01,1.7782D-01,1.5205D-01,1.2492D-01,9.7540D-02, + &7.1452D-02,4.8817D-02,3.2832D-02,2.8412D-02,4.3068D-02,4.1684D-02, + &2.6819D-02,1.6431D-02,9.5049D-03,5.0674D-03,2.0840D-03,1.1231D-03, + &4.2643D-04,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00, + &7.8709D-01,7.7617D-01,7.6509D-01,7.5353D-01,7.4210D-01,7.2955D-01, + &7.1666D-01,7.0326D-01,6.8906D-01,6.7364D-01,6.5743D-01,6.3988D-01, + &6.2140D-01,6.0962D-01,5.9645D-01,5.8083D-01,5.6382D-01,5.4630D-01, + &5.2750D-01,5.1079D-01,4.9267D-01,4.7078D-01,4.4780D-01,4.2425D-01, + &3.9948D-01,3.7773D-01,3.5398D-01,3.2619D-01,2.9811D-01,2.7093D-01/ + DATA (XDEF_L(K),K= 1255, 1368) / + &2.4686D-01,2.2668D-01,2.0735D-01,1.8888D-01,1.7555D-01,1.6865D-01, + &1.6887D-01,1.7500D-01,1.8693D-01,2.0522D-01,2.2377D-01,2.3300D-01, + &2.3501D-01,2.2902D-01,2.1428D-01,1.9427D-01,1.7084D-01,1.4533D-01, + &1.1889D-01,9.2655D-02,6.8174D-02,4.7575D-02,3.4123D-02,3.2605D-02, + &5.0454D-02,3.8820D-02,2.4822D-02,1.5113D-02,8.6857D-03,4.5962D-03, + &1.8704D-03,1.0050D-03,3.7856D-04,0.0000D+00,0.0000D+00,0.0000D+00, + &0.0000D+00,0.0000D+00,8.0606D-01,7.9455D-01,7.8312D-01,7.7128D-01, + &7.5940D-01,7.4610D-01,7.3287D-01,7.1917D-01,7.0456D-01,6.8825D-01, + &6.7140D-01,6.5313D-01,6.3390D-01,6.2170D-01,6.0798D-01,5.9180D-01, + &5.7419D-01,5.5596D-01,5.3636D-01,5.1934D-01,5.0050D-01,4.7790D-01, + &4.5436D-01,4.3012D-01,4.0458D-01,3.8238D-01,3.5808D-01,3.2984D-01, + &3.0133D-01,2.7388D-01,2.4957D-01,2.2930D-01,2.0996D-01,1.9168D-01, + &1.7832D-01,1.7159D-01,1.7177D-01,1.7770D-01,1.8921D-01,2.0651D-01, + &2.2344D-01,2.3117D-01,2.3152D-01,2.2426D-01,2.0844D-01,1.8790D-01, + &1.6440D-01,1.3914D-01,1.1342D-01,8.8280D-02,6.5276D-02,4.6578D-02, + &3.5360D-02,3.6411D-02,5.6986D-02,3.6256D-02,2.3040D-02,1.3948D-02, + &7.9676D-03,4.1856D-03,1.6876D-03,9.0394D-04,3.3789D-04,0.0000D+00, + &0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,8.2409D-01,8.1223D-01, + &8.0027D-01,7.8810D-01,7.7580D-01,7.6250D-01,7.4852D-01,7.3383D-01/ + DATA (XDEF_L(K),K= 1369, 1482) / + &7.1879D-01,7.0216D-01,6.8466D-01,6.6571D-01,6.4580D-01,6.3303D-01, + &6.1887D-01,6.0161D-01,5.8362D-01,5.6485D-01,5.4490D-01,5.2736D-01, + &5.0788D-01,4.8465D-01,4.6048D-01,4.3549D-01,4.0949D-01,3.8678D-01, + &3.6198D-01,3.3325D-01,3.0435D-01,2.7667D-01,2.5212D-01,2.3179D-01, + &2.1241D-01,1.9410D-01,1.8093D-01,1.7428D-01,1.7445D-01,1.8022D-01, + &1.9133D-01,2.0758D-01,2.2299D-01,2.2941D-01,2.2823D-01,2.1990D-01, + &2.0319D-01,1.8211D-01,1.5852D-01,1.3371D-01,1.0856D-01,8.4430D-02, + &6.2776D-02,4.5758D-02,3.6514D-02,3.9756D-02,6.2597D-02,3.4019D-02, + &2.1502D-02,1.2943D-02,7.3506D-03,3.8366D-03,1.5351D-03,8.1923D-04, + &3.0383D-04,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00, + &8.4844D-01,8.3627D-01,8.2378D-01,8.1114D-01,7.9820D-01,7.8411D-01, + &7.6977D-01,7.5436D-01,7.3871D-01,7.2101D-01,7.0269D-01,6.8280D-01, + &6.6180D-01,6.4849D-01,6.3365D-01,6.1605D-01,5.9682D-01,5.7721D-01, + &5.5628D-01,5.3805D-01,5.1772D-01,4.9378D-01,4.6868D-01,4.4295D-01, + &4.1599D-01,3.9262D-01,3.6722D-01,3.3788D-01,3.0847D-01,2.8040D-01, + &2.5562D-01,2.3513D-01,2.1572D-01,1.9746D-01,1.8447D-01,1.7787D-01, + &1.7810D-01,1.8358D-01,1.9394D-01,2.0894D-01,2.2227D-01,2.2689D-01, + &2.2385D-01,2.1408D-01,1.9620D-01,1.7461D-01,1.5108D-01,1.2667D-01, + &1.0243D-01,7.9635D-02,5.9715D-02,4.4804D-02,3.7997D-02,4.3894D-02/ + DATA (XDEF_L(K),K= 1483, 1596) / + &6.9391D-02,3.1240D-02,1.9603D-02,1.1712D-02,6.6036D-03,3.4150D-03, + &1.3549D-03,7.1812D-04,2.6373D-04,0.0000D+00,0.0000D+00,0.0000D+00, + &0.0000D+00,0.0000D+00,8.7089D-01,8.5819D-01,8.4535D-01,8.3207D-01, + &8.1860D-01,8.0424D-01,7.8877D-01,7.7320D-01,7.5642D-01,7.3822D-01, + &7.1895D-01,6.9816D-01,6.7640D-01,6.6244D-01,6.4701D-01,6.2817D-01, + &6.0860D-01,5.8841D-01,5.6672D-01,5.4767D-01,5.2667D-01,5.0182D-01, + &4.7599D-01,4.4955D-01,4.2190D-01,3.9787D-01,3.7196D-01,3.4199D-01, + &3.1220D-01,2.8382D-01,2.5874D-01,2.3816D-01,2.1874D-01,2.0063D-01, + &1.8770D-01,1.8107D-01,1.8121D-01,1.8638D-01,1.9622D-01,2.0994D-01, + &2.2156D-01,2.2456D-01,2.1986D-01,2.0892D-01,1.9015D-01,1.6817D-01, + &1.4465D-01,1.2070D-01,9.7309D-02,7.5665D-02,5.7234D-02,4.4095D-02, + &3.9289D-02,4.7307D-02,7.4739D-02,2.8958D-02,1.8046D-02,1.0716D-02, + &6.0010D-03,3.0801D-03,1.2145D-03,6.3833D-04,2.3251D-04,0.0000D+00, + &0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,8.9366D-01,8.8058D-01, + &8.6727D-01,8.5353D-01,8.3950D-01,8.2436D-01,8.0890D-01,7.9205D-01, + &7.7476D-01,7.5566D-01,7.3557D-01,7.1393D-01,6.9120D-01,6.7672D-01, + &6.6059D-01,6.4145D-01,6.2086D-01,5.9962D-01,5.7716D-01,5.5756D-01, + &5.3584D-01,5.1022D-01,4.8344D-01,4.5615D-01,4.2780D-01,4.0320D-01, + &3.7671D-01,3.4621D-01,3.1594D-01,2.8727D-01,2.6196D-01,2.4126D-01/ + DATA (XDEF_L(K),K= 1597, 1710) / + &2.2177D-01,2.0361D-01,1.9078D-01,1.8427D-01,1.8432D-01,1.8918D-01, + &1.9834D-01,2.1079D-01,2.2065D-01,2.2210D-01,2.1587D-01,2.0383D-01, + &1.8424D-01,1.6197D-01,1.3849D-01,1.1505D-01,9.2463D-02,7.1949D-02, + &5.4952D-02,4.3474D-02,4.0525D-02,5.0376D-02,7.9517D-02,2.6835D-02, + &1.6616D-02,9.8004D-03,5.4489D-03,2.7768D-03,1.0900D-03,5.6728D-04, + &2.0489D-04,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00, + &9.1643D-01,9.0298D-01,8.8901D-01,8.7472D-01,8.6030D-01,8.4449D-01, + &8.2790D-01,8.1090D-01,7.9278D-01,7.7287D-01,7.5201D-01,7.2942D-01, + &7.0580D-01,6.9067D-01,6.7395D-01,6.5357D-01,6.3264D-01,6.1082D-01, + &5.8728D-01,5.6718D-01,5.4478D-01,5.1825D-01,4.9075D-01,4.6263D-01, + &4.3360D-01,4.0844D-01,3.8138D-01,3.5032D-01,3.1963D-01,2.9065D-01, + &2.6511D-01,2.4428D-01,2.2479D-01,2.0678D-01,1.9385D-01,1.8735D-01, + &1.8722D-01,1.9179D-01,2.0029D-01,2.1158D-01,2.1961D-01,2.1971D-01, + &2.1194D-01,1.9894D-01,1.7862D-01,1.5609D-01,1.3279D-01,1.0972D-01, + &8.8007D-02,6.8578D-02,5.2905D-02,4.2942D-02,4.1624D-02,5.3065D-02, + &8.3506D-02,2.4920D-02,1.5334D-02,8.9876D-03,4.9653D-03,2.5112D-03, + &9.8300D-04,5.0629D-04,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00, + &0.0000D+00,0.0000D+00,9.3762D-01,9.2325D-01,9.0916D-01,8.9432D-01, + &8.7930D-01,8.6312D-01,8.4579D-01,8.2807D-01,8.0954D-01,7.8866D-01/ + DATA (XDEF_L(K),K= 1711, 1824) / + &7.6704D-01,7.4360D-01,7.1911D-01,7.0343D-01,6.8612D-01,6.6512D-01, + &6.4349D-01,6.2048D-01,5.9676D-01,5.7574D-01,5.5261D-01,5.2556D-01, + &4.9731D-01,4.6862D-01,4.3881D-01,4.1318D-01,3.8556D-01,3.5408D-01, + &3.2299D-01,2.9375D-01,2.6794D-01,2.4706D-01,2.2744D-01,2.0939D-01, + &1.9662D-01,1.9016D-01,1.8990D-01,1.9412D-01,2.0192D-01,2.1208D-01, + &2.1863D-01,2.1745D-01,2.0845D-01,1.9458D-01,1.7365D-01,1.5094D-01, + &1.2783D-01,1.0526D-01,8.4228D-02,6.5746D-02,5.1203D-02,4.2521D-02, + &4.2531D-02,5.5238D-02,8.6619D-02,2.3321D-02,1.4266D-02,8.3142D-03, + &4.5684D-03,2.2945D-03,8.9721D-04,4.5700D-04,0.0000D+00,0.0000D+00, + &0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,9.5912D-01,9.4446D-01, + &9.2967D-01,9.1446D-01,8.9890D-01,8.8176D-01,8.6424D-01,8.4567D-01, + &8.2630D-01,8.0492D-01,7.8242D-01,7.5817D-01,7.3271D-01,7.1653D-01, + &6.9849D-01,6.7725D-01,6.5433D-01,6.3091D-01,6.0625D-01,5.8456D-01, + &5.6088D-01,5.3305D-01,5.0402D-01,4.7461D-01,4.4411D-01,4.1800D-01, + &3.8988D-01,3.5790D-01,3.2644D-01,2.9690D-01,2.7087D-01,2.4987D-01, + &2.3039D-01,2.1219D-01,1.9955D-01,1.9298D-01,1.9248D-01,1.9636D-01, + &2.0355D-01,2.1258D-01,2.1752D-01,2.1512D-01,2.0490D-01,1.9021D-01, + &1.6876D-01,1.4586D-01,1.2296D-01,1.0090D-01,8.0587D-02,6.3034D-02, + &4.9591D-02,4.2122D-02,4.3355D-02,5.7203D-02,8.9336D-02,2.1802D-02/ + DATA (XDEF_L(K),K= 1825, 1836) / + &1.3258D-02,7.6843D-03,4.1967D-03,2.0952D-03,8.1932D-04,4.1202D-04, + &0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00,0.0000D+00/ + DATA (XUDF_L(K),K= 1, 114) / + &1.8987D-02,1.9947D-02,2.0980D-02,2.2068D-02,2.3225D-02,2.4540D-02, + &2.5957D-02,2.7526D-02,2.9229D-02,3.1232D-02,3.3453D-02,3.6003D-02, + &3.8855D-02,4.0763D-02,4.2980D-02,4.5778D-02,4.8895D-02,5.2320D-02, + &5.6174D-02,5.9765D-02,6.3980D-02,6.9315D-02,7.5299D-02,8.1888D-02, + &8.9292D-02,9.6162D-02,1.0414D-01,1.1410D-01,1.2505D-01,1.3674D-01, + &1.4937D-01,1.6060D-01,1.7296D-01,1.8730D-01,2.0166D-01,2.1531D-01, + &2.2821D-01,2.3833D-01,2.4848D-01,2.6049D-01,2.7586D-01,2.9166D-01, + &3.1456D-01,3.3942D-01,3.7230D-01,4.0597D-01,4.3921D-01,4.7071D-01, + &4.9846D-01,5.2057D-01,5.3433D-01,5.3610D-01,5.2141D-01,4.8433D-01, + &4.1719D-01,6.3794D-01,6.7411D-01,7.2040D-01,7.8812D-01,8.9495D-01, + &1.0702D+00,1.3629D+00,1.8763D+00,2.8399D+00,4.8968D+00,1.0506D+01, + &3.7793D+01,0.0000D+00,3.1111D-02,3.2336D-02,3.3580D-02,3.4906D-02, + &3.6247D-02,3.7773D-02,3.9337D-02,4.1056D-02,4.2876D-02,4.5001D-02, + &4.7299D-02,4.9897D-02,5.2761D-02,5.4666D-02,5.6867D-02,5.9620D-02, + &6.2679D-02,6.6018D-02,6.9775D-02,7.3275D-02,7.7353D-02,8.2522D-02, + &8.8327D-02,9.4694D-02,1.0184D-01,1.0846D-01,1.1615D-01,1.2575D-01, + &1.3628D-01,1.4752D-01,1.5964D-01,1.7036D-01,1.8215D-01,1.9580D-01, + &2.0933D-01,2.2213D-01,2.3411D-01,2.4341D-01,2.5275D-01,2.6387D-01, + &2.7831D-01,2.9333D-01,3.1510D-01,3.3876D-01,3.6995D-01,4.0170D-01/ + DATA (XUDF_L(K),K= 115, 228) / + &4.3298D-01,4.6172D-01,4.8742D-01,5.0700D-01,5.1856D-01,5.1873D-01, + &5.0352D-01,4.6746D-01,4.0418D-01,6.1801D-01,6.5339D-01,6.9923D-01, + &7.6627D-01,8.7125D-01,1.0408D+00,1.3199D+00,1.8020D+00,2.6920D+00, + &4.5574D+00,9.5310D+00,3.2877D+01,0.0000D+00,5.1176D-02,5.2640D-02, + &5.4100D-02,5.5603D-02,5.7095D-02,5.8737D-02,6.0416D-02,6.2154D-02, + &6.4016D-02,6.6046D-02,6.8273D-02,7.0765D-02,7.3444D-02,7.5182D-02, + &7.7263D-02,7.9781D-02,8.2626D-02,8.5707D-02,8.9176D-02,9.2402D-02, + &9.6182D-02,1.0098D-01,1.0635D-01,1.1227D-01,1.1893D-01,1.2513D-01, + &1.3230D-01,1.4128D-01,1.5115D-01,1.6164D-01,1.7300D-01,1.8301D-01, + &1.9397D-01,2.0660D-01,2.1907D-01,2.3072D-01,2.4154D-01,2.4985D-01, + &2.5817D-01,2.6810D-01,2.8136D-01,2.9535D-01,3.1585D-01,3.3824D-01, + &3.6743D-01,3.9701D-01,4.2565D-01,4.5205D-01,4.7460D-01,4.9184D-01, + &5.0110D-01,4.9954D-01,4.8363D-01,4.4878D-01,3.8940D-01,5.9452D-01, + &6.2820D-01,6.7181D-01,7.3612D-01,8.3598D-01,9.9560D-01,1.2543D+00, + &1.6953D+00,2.4947D+00,4.1415D+00,8.4275D+00,2.7797D+01,0.0000D+00, + &8.6266D-02,8.7847D-02,8.9380D-02,9.0869D-02,9.2337D-02,9.3826D-02, + &9.5315D-02,9.6842D-02,9.8333D-02,1.0003D-01,1.0178D-01,1.0370D-01, + &1.0575D-01,1.0710D-01,1.0872D-01,1.1075D-01,1.1295D-01,1.1538D-01, + &1.1821D-01,1.2088D-01,1.2396D-01,1.2796D-01,1.3252D-01,1.3756D-01/ + DATA (XUDF_L(K),K= 229, 342) / + &1.4331D-01,1.4870D-01,1.5500D-01,1.6291D-01,1.7166D-01,1.8100D-01, + &1.9111D-01,2.0002D-01,2.0977D-01,2.2095D-01,2.3189D-01,2.4200D-01, + &2.5123D-01,2.5821D-01,2.6512D-01,2.7351D-01,2.8514D-01,2.9789D-01, + &3.1683D-01,3.3731D-01,3.6424D-01,3.9124D-01,4.1697D-01,4.4030D-01, + &4.6002D-01,4.7419D-01,4.8085D-01,4.7740D-01,4.6086D-01,4.2728D-01, + &3.7241D-01,5.6656D-01,5.9684D-01,6.3694D-01,6.9622D-01,7.8804D-01, + &9.3343D-01,1.1653D+00,1.5545D+00,2.2504D+00,3.6537D+00,7.2124D+00, + &2.2653D+01,0.0000D+00,1.4838D-01,1.4960D-01,1.5068D-01,1.5161D-01, + &1.5242D-01,1.5316D-01,1.5373D-01,1.5426D-01,1.5470D-01,1.5511D-01, + &1.5554D-01,1.5602D-01,1.5660D-01,1.5698D-01,1.5750D-01,1.5830D-01, + &1.5923D-01,1.6034D-01,1.6181D-01,1.6324D-01,1.6509D-01,1.6746D-01, + &1.7054D-01,1.7402D-01,1.7811D-01,1.8208D-01,1.8687D-01,1.9296D-01, + &1.9986D-01,2.0734D-01,2.1554D-01,2.2281D-01,2.3075D-01,2.3983D-01, + &2.4863D-01,2.5660D-01,2.6366D-01,2.6883D-01,2.7387D-01,2.8026D-01, + &2.8982D-01,3.0088D-01,3.1780D-01,3.3626D-01,3.6021D-01,3.8399D-01, + &4.0666D-01,4.2682D-01,4.4278D-01,4.5386D-01,4.5774D-01,4.5230D-01, + &4.3509D-01,4.0314D-01,3.5321D-01,5.3325D-01,5.5916D-01,5.9448D-01, + &6.4707D-01,7.2797D-01,8.5557D-01,1.0563D+00,1.3882D+00,1.9717D+00, + &3.1223D+00,5.9601D+00,1.7750D+01,0.0000D+00,2.3139D-01,2.3138D-01/ + DATA (XUDF_L(K),K= 343, 456) / + &2.3120D-01,2.3076D-01,2.3006D-01,2.2907D-01,2.2788D-01,2.2645D-01, + &2.2489D-01,2.2308D-01,2.2120D-01,2.1929D-01,2.1743D-01,2.1630D-01, + &2.1526D-01,2.1411D-01,2.1311D-01,2.1231D-01,2.1171D-01,2.1148D-01, + &2.1150D-01,2.1182D-01,2.1271D-01,2.1412D-01,2.1601D-01,2.1822D-01, + &2.2096D-01,2.2496D-01,2.2961D-01,2.3481D-01,2.4086D-01,2.4622D-01, + &2.5214D-01,2.5891D-01,2.6537D-01,2.7104D-01,2.7588D-01,2.7922D-01, + &2.8235D-01,2.8664D-01,2.9413D-01,3.0352D-01,3.1845D-01,3.3481D-01, + &3.5617D-01,3.7737D-01,3.9689D-01,4.1403D-01,4.2736D-01,4.3558D-01, + &4.3712D-01,4.3016D-01,4.1245D-01,3.8197D-01,3.3645D-01,5.0322D-01, + &5.2507D-01,5.5559D-01,6.0172D-01,6.7286D-01,7.8413D-01,9.5797D-01, + &1.2422D+00,1.7341D+00,2.6883D+00,4.9868D+00,1.4177D+01,0.0000D+00, + &3.6389D-01,3.6098D-01,3.5780D-01,3.5400D-01,3.5016D-01,3.4553D-01, + &3.4044D-01,3.3521D-01,3.2971D-01,3.2369D-01,3.1755D-01,3.1120D-01, + &3.0494D-01,3.0120D-01,2.9724D-01,2.9287D-01,2.8855D-01,2.8449D-01, + &2.8072D-01,2.7770D-01,2.7469D-01,2.7175D-01,2.6933D-01,2.6740D-01, + &2.6613D-01,2.6556D-01,2.6563D-01,2.6631D-01,2.6763D-01,2.6975D-01, + &2.7268D-01,2.7539D-01,2.7857D-01,2.8224D-01,2.8565D-01,2.8841D-01, + &2.9040D-01,2.9139D-01,2.9220D-01,2.9395D-01,2.9888D-01,3.0633D-01, + &3.1877D-01,3.3296D-01,3.5147D-01,3.6947D-01,3.8604D-01,3.9986D-01/ + DATA (XUDF_L(K),K= 457, 570) / + &4.1008D-01,4.1548D-01,4.1467D-01,4.0620D-01,3.8830D-01,3.5965D-01, + &3.1902D-01,4.7020D-01,4.8772D-01,5.1303D-01,5.5185D-01,6.1224D-01, + &7.0699D-01,8.5323D-01,1.0903D+00,1.4950D+00,2.2640D+00,4.0723D+00, + &0.0000D+00,0.0000D+00,5.2666D-01,5.1909D-01,5.1100D-01,5.0238D-01, + &4.9333D-01,4.8312D-01,4.7293D-01,4.6180D-01,4.5066D-01,4.3890D-01, + &4.2692D-01,4.1467D-01,4.0262D-01,3.9542D-01,3.8784D-01,3.7925D-01, + &3.7080D-01,3.6267D-01,3.5482D-01,3.4841D-01,3.4190D-01,3.3492D-01, + &3.2852D-01,3.2287D-01,3.1768D-01,3.1409D-01,3.1066D-01,3.0785D-01, + &3.0564D-01,3.0446D-01,3.0380D-01,3.0388D-01,3.0402D-01,3.0458D-01, + &3.0488D-01,3.0475D-01,3.0386D-01,3.0263D-01,3.0116D-01,3.0045D-01, + &3.0296D-01,3.0852D-01,3.1888D-01,3.3085D-01,3.4677D-01,3.6222D-01, + &3.7600D-01,3.8707D-01,3.9488D-01,3.9799D-01,3.9530D-01,3.8568D-01, + &3.6791D-01,3.4080D-01,3.0424D-01,4.4195D-01,4.5570D-01,4.7648D-01, + &5.0935D-01,5.6099D-01,6.4225D-01,7.6680D-01,9.6736D-01,1.3053D+00, + &1.9393D+00,3.3976D+00,0.0000D+00,0.0000D+00,7.4015D-01,7.2498D-01, + &7.0940D-01,6.9297D-01,6.7620D-01,6.5800D-01,6.3935D-01,6.2047D-01, + &6.0114D-01,5.8076D-01,5.6065D-01,5.4030D-01,5.2035D-01,5.0839D-01, + &4.9583D-01,4.8167D-01,4.6773D-01,4.5434D-01,4.4113D-01,4.3035D-01, + &4.1922D-01,4.0719D-01,3.9582D-01,3.8536D-01,3.7557D-01,3.6805D-01/ + DATA (XUDF_L(K),K= 571, 684) / + &3.6079D-01,3.5336D-01,3.4710D-01,3.4173D-01,3.3719D-01,3.3400D-01, + &3.3124D-01,3.2819D-01,3.2494D-01,3.2158D-01,3.1765D-01,3.1400D-01, + &3.1011D-01,3.0684D-01,3.0682D-01,3.1046D-01,3.1856D-01,3.2861D-01, + &3.4189D-01,3.5475D-01,3.6597D-01,3.7463D-01,3.8003D-01,3.8108D-01, + &3.7681D-01,3.6631D-01,3.4865D-01,3.2327D-01,2.9078D-01,4.1488D-01, + &4.2529D-01,4.4193D-01,4.6945D-01,5.1322D-01,5.8236D-01,6.8846D-01, + &8.5739D-01,1.1394D+00,1.6617D+00,2.8395D+00,0.0000D+00,0.0000D+00, + &9.8501D-01,9.5975D-01,9.3420D-01,9.0757D-01,8.8092D-01,8.5237D-01, + &8.2383D-01,7.9445D-01,7.6556D-01,7.3524D-01,7.0484D-01,6.7495D-01, + &6.4547D-01,6.2798D-01,6.0969D-01,5.8904D-01,5.6882D-01,5.4932D-01, + &5.3014D-01,5.1443D-01,4.9826D-01,4.8058D-01,4.6380D-01,4.4815D-01, + &4.3330D-01,4.2167D-01,4.1020D-01,3.9827D-01,3.8748D-01,3.7784D-01, + &3.6931D-01,3.6303D-01,3.5669D-01,3.4992D-01,3.4358D-01,3.3710D-01, + &3.3025D-01,3.2429D-01,3.1817D-01,3.1242D-01,3.1001D-01,3.1195D-01, + &3.1802D-01,3.2610D-01,3.3719D-01,3.4770D-01,3.5674D-01,3.6357D-01, + &3.6695D-01,3.6631D-01,3.6075D-01,3.4960D-01,3.3214D-01,3.0855D-01, + &2.7931D-01,3.9198D-01,3.9931D-01,4.1263D-01,4.3550D-01,4.7310D-01, + &5.3259D-01,6.2375D-01,7.6876D-01,1.0087D+00,1.4464D+00,2.4185D+00, + &0.0000D+00,0.0000D+00,1.2917D+00,1.2523D+00,1.2128D+00,1.1722D+00/ + DATA (XUDF_L(K),K= 685, 798) / + &1.1321D+00,1.0894D+00,1.0473D+00,1.0044D+00,9.6262D-01,9.1838D-01, + &8.7565D-01,8.3283D-01,7.9186D-01,7.6734D-01,7.4146D-01,7.1300D-01, + &6.8484D-01,6.5787D-01,6.3134D-01,6.0963D-01,5.8730D-01,5.6294D-01, + &5.3947D-01,5.1767D-01,4.9689D-01,4.8039D-01,4.6398D-01,4.4675D-01, + &4.3087D-01,4.1650D-01,4.0371D-01,3.9342D-01,3.8361D-01,3.7293D-01, + &3.6284D-01,3.5305D-01,3.4307D-01,3.3468D-01,3.2613D-01,3.1788D-01, + &3.1306D-01,3.1309D-01,3.1715D-01,3.2346D-01,3.3232D-01,3.4066D-01, + &3.4779D-01,3.5251D-01,3.5401D-01,3.5184D-01,3.4519D-01,3.3347D-01, + &3.1650D-01,2.9433D-01,2.6872D-01,3.6968D-01,3.7446D-01,3.8477D-01, + &4.0368D-01,4.3551D-01,4.8654D-01,5.6457D-01,6.8832D-01,8.9135D-01, + &1.2583D+00,2.0601D+00,0.0000D+00,0.0000D+00,1.6499D+00,1.5928D+00, + &1.5356D+00,1.4773D+00,1.4202D+00,1.3601D+00,1.3009D+00,1.2413D+00, + &1.1836D+00,1.1235D+00,1.0650D+00,1.0076D+00,9.5212D-01,9.1919D-01, + &8.8569D-01,8.4733D-01,8.1006D-01,7.7436D-01,7.3955D-01,7.1104D-01, + &6.8173D-01,6.4966D-01,6.1893D-01,5.9026D-01,5.6287D-01,5.4114D-01, + &5.1941D-01,4.9621D-01,4.7490D-01,4.5564D-01,4.3786D-01,4.2408D-01, + &4.1024D-01,3.9562D-01,3.8175D-01,3.6853D-01,3.5541D-01,3.4455D-01, + &3.3366D-01,3.2286D-01,3.1565D-01,3.1397D-01,3.1618D-01,3.2069D-01, + &3.2744D-01,3.3383D-01,3.3911D-01,3.4194D-01,3.4194D-01,3.3844D-01/ + DATA (XUDF_L(K),K= 799, 912) / + &3.3088D-01,3.1887D-01,3.0224D-01,2.8177D-01,2.5901D-01,3.4945D-01, + &3.5200D-01,3.5959D-01,3.7518D-01,4.0212D-01,4.4590D-01,5.1305D-01, + &6.1934D-01,7.9273D-01,1.1025D+00,1.7693D+00,0.0000D+00,0.0000D+00, + &2.0413D+00,1.9626D+00,1.8840D+00,1.8053D+00,1.7284D+00,1.6480D+00, + &1.5697D+00,1.4911D+00,1.4157D+00,1.3375D+00,1.2620D+00,1.1875D+00, + &1.1168D+00,1.0751D+00,1.0321D+00,9.8410D-01,9.3682D-01,8.9196D-01, + &8.4816D-01,8.1245D-01,7.7582D-01,7.3576D-01,6.9745D-01,6.6154D-01, + &6.2742D-01,6.0036D-01,5.7319D-01,5.4409D-01,5.1721D-01,4.9291D-01, + &4.7049D-01,4.5284D-01,4.3541D-01,4.1671D-01,3.9926D-01,3.8274D-01, + &3.6660D-01,3.5348D-01,3.4035D-01,3.2727D-01,3.1788D-01,3.1459D-01, + &3.1499D-01,3.1792D-01,3.2291D-01,3.2764D-01,3.3124D-01,3.3250D-01, + &3.3120D-01,3.2663D-01,3.1834D-01,3.0608D-01,2.8998D-01,2.7085D-01, + &2.5085D-01,3.3191D-01,3.3258D-01,3.3808D-01,3.5072D-01,3.7379D-01, + &4.1182D-01,4.7005D-01,5.6257D-01,7.1233D-01,9.7788D-01,1.5412D+00, + &0.0000D+00,0.0000D+00,2.6325D+00,2.5188D+00,2.4060D+00,2.2942D+00, + &2.1863D+00,2.0740D+00,1.9650D+00,1.8571D+00,1.7537D+00,1.6473D+00, + &1.5453D+00,1.4458D+00,1.3515D+00,1.2965D+00,1.2394D+00,1.1767D+00, + &1.1150D+00,1.0560D+00,9.9927D-01,9.5301D-01,9.0565D-01,8.5400D-01, + &8.0462D-01,7.5858D-01,7.1481D-01,6.7994D-01,6.4502D-01,6.0799D-01/ + DATA (XUDF_L(K),K= 913, 1026) / + &5.7349D-01,5.4206D-01,5.1299D-01,4.9028D-01,4.6789D-01,4.4387D-01, + &4.2168D-01,4.0096D-01,3.8070D-01,3.6457D-01,3.4857D-01,3.3249D-01, + &3.2026D-01,3.1503D-01,3.1326D-01,3.1423D-01,3.1703D-01,3.1974D-01, + &3.2120D-01,3.2086D-01,3.1799D-01,3.1221D-01,3.0315D-01,2.9072D-01, + &2.7522D-01,2.5796D-01,2.4114D-01,3.1079D-01,3.0956D-01,3.1267D-01, + &3.2223D-01,3.4089D-01,3.7246D-01,4.2134D-01,4.9853D-01,6.2305D-01, + &8.4191D-01,1.2983D+00,0.0000D+00,0.0000D+00,3.2997D+00,3.1427D+00, + &2.9900D+00,2.8374D+00,2.6927D+00,2.5421D+00,2.3973D+00,2.2549D+00, + &2.1191D+00,1.9809D+00,1.8488D+00,1.7209D+00,1.6001D+00,1.5300D+00, + &1.4576D+00,1.3771D+00,1.2999D+00,1.2268D+00,1.1551D+00,1.0975D+00, + &1.0385D+00,9.7437D-01,9.1327D-01,8.5649D-01,8.0236D-01,7.5952D-01, + &7.1667D-01,6.7091D-01,6.2847D-01,5.9005D-01,5.5422D-01,5.2636D-01, + &4.9890D-01,4.6976D-01,4.4269D-01,4.1752D-01,3.9377D-01,3.7477D-01, + &3.5594D-01,3.3710D-01,3.2226D-01,3.1511D-01,3.1131D-01,3.1067D-01, + &3.1132D-01,3.1227D-01,3.1198D-01,3.1021D-01,3.0606D-01,2.9926D-01, + &2.8958D-01,2.7716D-01,2.6233D-01,2.4655D-01,2.3275D-01,2.9229D-01, + &2.8941D-01,2.9061D-01,2.9753D-01,3.1273D-01,3.3909D-01,3.8034D-01, + &4.4548D-01,5.5028D-01,7.3256D-01,1.1074D+00,0.0000D+00,0.0000D+00, + &4.0557D+00,3.8486D+00,3.6460D+00,3.4480D+00,3.2579D+00,3.0626D+00/ + DATA (XUDF_L(K),K= 1027, 1140) / + &2.8756D+00,2.6929D+00,2.5196D+00,2.3441D+00,2.1778D+00,2.0170D+00, + &1.8670D+00,1.7797D+00,1.6902D+00,1.5909D+00,1.4960D+00,1.4058D+00, + &1.3191D+00,1.2484D+00,1.1764D+00,1.0991D+00,1.0253D+00,9.5689D-01, + &8.9197D-01,8.4046D-01,7.8904D-01,7.3442D-01,6.8367D-01,6.3780D-01, + &5.9520D-01,5.6218D-01,5.2934D-01,4.9500D-01,4.6300D-01,4.3370D-01, + &4.0611D-01,3.8431D-01,3.6284D-01,3.4121D-01,3.2389D-01,3.1494D-01, + &3.0926D-01,3.0697D-01,3.0594D-01,3.0501D-01,3.0330D-01,3.0019D-01, + &2.9492D-01,2.8734D-01,2.7718D-01,2.6476D-01,2.5057D-01,2.3646D-01, + &2.2503D-01,2.7558D-01,2.7132D-01,2.7089D-01,2.7569D-01,2.8794D-01, + &3.1000D-01,3.4491D-01,4.0016D-01,4.8886D-01,6.4191D-01,9.5232D-01, + &0.0000D+00,0.0000D+00,4.8799D+00,4.6116D+00,4.3560D+00,4.1035D+00, + &3.8608D+00,3.6163D+00,3.3822D+00,3.1557D+00,2.9412D+00,2.7247D+00, + &2.5209D+00,2.3248D+00,2.1421D+00,2.0368D+00,1.9287D+00,1.8094D+00, + &1.6955D+00,1.5877D+00,1.4841D+00,1.4003D+00,1.3154D+00,1.2237D+00, + &1.1368D+00,1.0563D+00,9.8015D-01,9.2005D-01,8.5978D-01,7.9615D-01, + &7.3715D-01,6.8369D-01,6.3441D-01,5.9609D-01,5.5830D-01,5.1865D-01, + &4.8192D-01,4.4872D-01,4.1747D-01,3.9300D-01,3.6895D-01,3.4483D-01, + &3.2508D-01,3.1459D-01,3.0709D-01,3.0328D-01,3.0056D-01,2.9840D-01, + &2.9543D-01,2.9107D-01,2.8485D-01,2.7655D-01,2.6610D-01,2.5368D-01/ + DATA (XUDF_L(K),K= 1141, 1254) / + &2.4019D-01,2.2736D-01,2.1837D-01,2.6080D-01,2.5542D-01,2.5362D-01, + &2.5693D-01,2.6661D-01,2.8505D-01,3.1490D-01,3.6226D-01,4.3798D-01, + &5.6769D-01,8.2836D-01,0.0000D+00,0.0000D+00,5.8340D+00,5.4940D+00, + &5.1700D+00,4.8532D+00,4.5515D+00,4.2463D+00,3.9559D+00,3.6752D+00, + &3.4138D+00,3.1496D+00,2.9022D+00,2.6648D+00,2.4450D+00,2.3189D+00, + &2.1896D+00,2.0476D+00,1.9120D+00,1.7843D+00,1.6621D+00,1.5639D+00, + &1.4648D+00,1.3569D+00,1.2556D+00,1.1618D+00,1.0734D+00,1.0037D+00, + &9.3416D-01,8.6065D-01,7.9257D-01,7.3145D-01,6.7463D-01,6.3082D-01, + &5.8786D-01,5.4262D-01,5.0118D-01,4.6374D-01,4.2883D-01,4.0146D-01, + &3.7490D-01,3.4814D-01,3.2612D-01,3.1397D-01,3.0482D-01,2.9958D-01, + &2.9536D-01,2.9178D-01,2.8756D-01,2.8208D-01,2.7504D-01,2.6611D-01, + &2.5539D-01,2.4319D-01,2.3031D-01,2.1877D-01,2.1195D-01,2.4673D-01, + &2.4036D-01,2.3746D-01,2.3912D-01,2.4677D-01,2.6223D-01,2.8748D-01, + &3.2792D-01,3.9255D-01,5.0271D-01,7.2095D-01,0.0000D+00,0.0000D+00, + &6.8578D+00,6.4388D+00,6.0380D+00,5.6501D+00,5.2825D+00,4.9103D+00, + &4.5613D+00,4.2230D+00,3.9070D+00,3.5911D+00,3.2966D+00,3.0156D+00, + &2.7567D+00,2.6078D+00,2.4563D+00,2.2905D+00,2.1319D+00,1.9837D+00, + &1.8421D+00,1.7287D+00,1.6141D+00,1.4902D+00,1.3730D+00,1.2663D+00, + &1.1652D+00,1.0858D+00,1.0067D+00,9.2337D-01,8.4648D-01,7.7710D-01/ + DATA (XUDF_L(K),K= 1255, 1368) / + &7.1333D-01,6.6392D-01,6.1566D-01,5.6531D-01,5.1904D-01,4.7761D-01, + &4.3908D-01,4.0927D-01,3.8022D-01,3.5109D-01,3.2686D-01,3.1318D-01, + &3.0244D-01,2.9602D-01,2.9031D-01,2.8538D-01,2.8024D-01,2.7382D-01, + &2.6607D-01,2.5668D-01,2.4571D-01,2.3364D-01,2.2155D-01,2.1116D-01, + &2.0617D-01,2.3421D-01,2.2704D-01,2.2320D-01,2.2366D-01,2.2952D-01, + &2.4241D-01,2.6402D-01,2.9884D-01,3.5437D-01,4.4860D-01,6.3331D-01, + &0.0000D+00,0.0000D+00,7.9784D+00,7.4673D+00,6.9820D+00,6.5121D+00, + &6.0712D+00,5.6250D+00,5.2080D+00,4.8065D+00,4.4309D+00,4.0590D+00, + &3.7131D+00,3.3843D+00,3.0816D+00,2.9094D+00,2.7332D+00,2.5420D+00, + &2.3595D+00,2.1895D+00,2.0271D+00,1.8966D+00,1.7658D+00,1.6248D+00, + &1.4933D+00,1.3718D+00,1.2579D+00,1.1683D+00,1.0795D+00,9.8589D-01, + &8.9996D-01,8.2253D-01,7.5153D-01,6.9648D-01,6.4287D-01,5.8736D-01, + &5.3655D-01,4.9109D-01,4.4891D-01,4.1655D-01,3.8518D-01,3.5367D-01, + &3.2738D-01,3.1221D-01,3.0006D-01,2.9246D-01,2.8544D-01,2.7940D-01, + &2.7319D-01,2.6601D-01,2.5763D-01,2.4782D-01,2.3676D-01,2.2486D-01, + &2.1329D-01,2.0405D-01,2.0083D-01,2.2267D-01,2.1489D-01,2.1027D-01, + &2.0967D-01,2.1409D-01,2.2473D-01,2.4320D-01,2.7316D-01,3.2113D-01, + &4.0209D-01,5.5899D-01,0.0000D+00,0.0000D+00,9.1575D+00,8.5458D+00, + &7.9700D+00,7.4123D+00,6.8876D+00,6.3653D+00,5.8736D+00,5.4042D+00/ + DATA (XUDF_L(K),K= 1369, 1482) / + &4.9684D+00,4.5359D+00,4.1366D+00,3.7576D+00,3.4110D+00,3.2138D+00, + &3.0122D+00,2.7943D+00,2.5871D+00,2.3944D+00,2.2102D+00,2.0646D+00, + &1.9163D+00,1.7581D+00,1.6109D+00,1.4753D+00,1.3483D+00,1.2486D+00, + &1.1500D+00,1.0462D+00,9.5130D-01,8.6585D-01,7.8770D-01,7.2741D-01, + &6.6891D-01,6.0781D-01,5.5266D-01,5.0342D-01,4.5788D-01,4.2322D-01, + &3.8960D-01,3.5594D-01,3.2768D-01,3.1125D-01,2.9779D-01,2.8890D-01, + &2.8091D-01,2.7385D-01,2.6670D-01,2.5886D-01,2.4989D-01,2.3976D-01, + &2.2861D-01,2.1703D-01,2.0604D-01,1.9777D-01,1.9598D-01,2.1238D-01, + &2.0408D-01,1.9879D-01,1.9735D-01,2.0048D-01,2.0933D-01,2.2523D-01, + &2.5120D-01,2.9296D-01,3.6305D-01,4.9711D-01,0.0000D+00,0.0000D+00, + &1.0956D+01,1.0188D+01,9.4660D+00,8.7704D+00,8.1209D+00,7.4727D+00, + &6.8721D+00,6.2972D+00,5.7646D+00,5.2434D+00,4.7595D+00,4.3051D+00, + &3.8911D+00,3.6559D+00,3.4174D+00,3.1598D+00,2.9153D+00,2.6889D+00, + &2.4732D+00,2.3031D+00,2.1311D+00,1.9475D+00,1.7771D+00,1.6202D+00, + &1.4748D+00,1.3609D+00,1.2481D+00,1.1301D+00,1.0222D+00,9.2549D-01, + &8.3728D-01,7.6947D-01,7.0373D-01,6.3561D-01,5.7438D-01,5.1959D-01, + &4.6984D-01,4.3187D-01,3.9529D-01,3.5864D-01,3.2783D-01,3.0967D-01, + &2.9444D-01,2.8428D-01,2.7469D-01,2.6638D-01,2.5813D-01,2.4942D-01, + &2.3986D-01,2.2937D-01,2.1819D-01,2.0682D-01,1.9665D-01,1.8966D-01/ + DATA (XUDF_L(K),K= 1483, 1596) / + &1.8971D-01,1.9926D-01,1.9036D-01,1.8442D-01,1.8192D-01,1.8362D-01, + &1.9037D-01,2.0318D-01,2.2459D-01,2.5904D-01,3.1665D-01,4.2407D-01, + &0.0000D+00,0.0000D+00,1.2798D+01,1.1861D+01,1.0986D+01,1.0144D+01, + &9.3643D+00,8.5887D+00,7.8706D+00,7.1866D+00,6.5568D+00,5.9419D+00, + &5.3754D+00,4.8419D+00,4.3593D+00,4.0864D+00,3.8109D+00,3.5127D+00, + &3.2315D+00,2.9714D+00,2.7252D+00,2.5309D+00,2.3356D+00,2.1269D+00, + &1.9338D+00,1.7578D+00,1.5939D+00,1.4656D+00,1.3394D+00,1.2075D+00, + &1.0875D+00,9.8023D-01,8.8256D-01,8.0772D-01,7.3533D-01,6.6054D-01, + &5.9364D-01,5.3423D-01,4.8009D-01,4.3930D-01,4.0003D-01,3.6079D-01, + &3.2768D-01,3.0809D-01,2.9130D-01,2.7993D-01,2.6898D-01,2.5976D-01, + &2.5062D-01,2.4123D-01,2.3116D-01,2.2040D-01,2.0917D-01,1.9814D-01, + &1.8865D-01,1.8272D-01,1.8428D-01,1.8820D-01,1.7883D-01,1.7238D-01, + &1.6914D-01,1.6979D-01,1.7482D-01,1.8534D-01,2.0325D-01,2.3214D-01, + &2.8022D-01,3.6659D-01,0.0000D+00,0.0000D+00,1.4900D+01,1.3767D+01, + &1.2708D+01,1.1700D+01,1.0766D+01,9.8403D+00,8.9832D+00,8.1757D+00, + &7.4366D+00,6.7121D+00,6.0486D+00,5.4300D+00,4.8704D+00,4.5555D+00, + &4.2371D+00,3.8955D+00,3.5734D+00,3.2760D+00,2.9952D+00,2.7738D+00, + &2.5528D+00,2.3175D+00,2.1001D+00,1.9012D+00,1.7176D+00,1.5750D+00, + &1.4344D+00,1.2880D+00,1.1547D+00,1.0364D+00,9.2859D-01,8.4652D-01/ + DATA (XUDF_L(K),K= 1597, 1710) / + &7.6723D-01,6.8578D-01,6.1255D-01,5.4848D-01,4.9034D-01,4.4649D-01, + &4.0456D-01,3.6275D-01,3.2738D-01,3.0624D-01,2.8805D-01,2.7544D-01, + &2.6343D-01,2.5315D-01,2.4318D-01,2.3314D-01,2.2263D-01,2.1166D-01, + &2.0051D-01,1.8983D-01,1.8102D-01,1.7610D-01,1.7901D-01,1.7764D-01, + &1.6791D-01,1.6102D-01,1.5715D-01,1.5684D-01,1.6056D-01,1.6899D-01, + &1.8376D-01,2.0786D-01,2.4776D-01,3.1470D-01,0.0000D+00,0.0000D+00, + &1.7212D+01,1.5853D+01,1.4590D+01,1.3390D+01,1.2283D+01,1.1191D+01, + &1.0185D+01,9.2395D+00,8.3762D+00,7.5315D+00,6.7670D+00,6.0503D+00, + &5.4086D+00,5.0481D+00,4.6843D+00,4.2940D+00,3.9280D+00,3.5917D+00, + &3.2752D+00,3.0252D+00,2.7768D+00,2.5132D+00,2.2690D+00,2.0490D+00, + &1.8445D+00,1.6857D+00,1.5301D+00,1.3685D+00,1.2219D+00,1.0920D+00, + &9.7438D-01,8.8478D-01,7.9825D-01,7.1007D-01,6.3111D-01,5.6196D-01, + &5.0016D-01,4.5321D-01,4.0867D-01,3.6435D-01,3.2686D-01,3.0431D-01, + &2.8470D-01,2.7109D-01,2.5789D-01,2.4674D-01,2.3605D-01,2.2547D-01, + &2.1459D-01,2.0348D-01,1.9237D-01,1.8201D-01,1.7376D-01,1.6982D-01, + &1.7398D-01,1.6789D-01,1.5795D-01,1.5065D-01,1.4630D-01,1.4521D-01, + &1.4773D-01,1.5443D-01,1.6659D-01,1.8664D-01,2.1966D-01,2.6878D-01, + &0.0000D+00,0.0000D+00,1.9526D+01,1.7951D+01,1.6470D+01,1.5074D+01, + &1.3790D+01,1.2527D+01,1.1370D+01,1.0282D+01,9.2958D+00,8.3330D+00/ + DATA (XUDF_L(K),K= 1711, 1824) / + &7.4603D+00,6.6536D+00,5.9285D+00,5.5219D+00,5.1141D+00,4.6768D+00, + &4.2681D+00,3.8926D+00,3.5402D+00,3.2626D+00,2.9882D+00,2.6963D+00, + &2.4284D+00,2.1851D+00,1.9619D+00,1.7885D+00,1.6187D+00,1.4429D+00, + &1.2838D+00,1.1431D+00,1.0159D+00,9.1924D-01,8.2663D-01,7.3180D-01, + &6.4793D-01,5.7429D-01,5.0828D-01,4.5904D-01,4.1215D-01,3.6558D-01, + &3.2620D-01,3.0238D-01,2.8167D-01,2.6700D-01,2.5302D-01,2.4098D-01, + &2.2975D-01,2.1873D-01,2.0756D-01,1.9633D-01,1.8532D-01,1.7533D-01, + &1.6763D-01,1.6450D-01,1.6959D-01,1.5953D-01,1.4943D-01,1.4185D-01, + &1.3716D-01,1.3545D-01,1.3705D-01,1.4238D-01,1.5258D-01,1.6945D-01, + &1.9705D-01,2.3049D-01,0.0000D+00,0.0000D+00,2.2141D+01,2.0286D+01, + &1.8570D+01,1.6948D+01,1.5466D+01,1.4010D+01,1.2679D+01,1.1431D+01, + &1.0303D+01,9.2106D+00,8.2239D+00,7.3077D+00,6.4926D+00,6.0348D+00, + &5.5765D+00,5.0879D+00,4.6321D+00,4.2138D+00,3.8233D+00,3.5162D+00, + &3.2122D+00,2.8907D+00,2.5960D+00,2.3300D+00,2.0856D+00,1.8954D+00, + &1.7110D+00,1.5199D+00,1.3476D+00,1.1955D+00,1.0584D+00,9.5478D-01, + &8.5531D-01,7.5417D-01,6.6439D-01,5.8623D-01,5.1682D-01,4.6468D-01, + &4.1541D-01,3.6662D-01,3.2538D-01,3.0035D-01,2.7843D-01,2.6291D-01, + &2.4798D-01,2.3522D-01,2.2346D-01,2.1203D-01,2.0062D-01,1.8935D-01, + &1.7843D-01,1.6874D-01,1.6163D-01,1.5920D-01,1.6520D-01,1.5147D-01/ + DATA (XUDF_L(K),K= 1825, 1836) / + &1.4120D-01,1.3349D-01,1.2844D-01,1.2620D-01,1.2701D-01,1.3118D-01, + &1.3954D-01,1.5369D-01,1.7631D-01,1.9416D-01,0.0000D+00,0.0000D+00/ + DATA (XSF_L(K),K= 1, 114) / + &8.9277D-03,9.2838D-03,9.6380D-03,9.9960D-03,1.0349D-02,1.0719D-02, + &1.1082D-02,1.1442D-02,1.1792D-02,1.2148D-02,1.2489D-02,1.2817D-02, + &1.3124D-02,1.3295D-02,1.3474D-02,1.3661D-02,1.3835D-02,1.3985D-02, + &1.4121D-02,1.4217D-02,1.4303D-02,1.4379D-02,1.4419D-02,1.4434D-02, + &1.4412D-02,1.4366D-02,1.4286D-02,1.4158D-02,1.3991D-02,1.3790D-02, + &1.3553D-02,1.3335D-02,1.3094D-02,1.2821D-02,1.2580D-02,1.2410D-02, + &1.2357D-02,1.2459D-02,1.2790D-02,1.3571D-02,1.5018D-02,1.6665D-02, + &1.9113D-02,2.1832D-02,2.5587D-02,2.9818D-02,3.4535D-02,3.9813D-02, + &4.5737D-02,5.2358D-02,5.9765D-02,6.8021D-02,7.7185D-02,8.7258D-02, + &9.8198D-02,1.1073D-01,1.4216D-01,1.8364D-01,2.3959D-01,3.1758D-01, + &4.3050D-01,6.0203D-01,8.8214D-01,1.3845D+00,2.4294D+00,5.2463D+00, + &1.8903D+01,0.0000D+00,1.4987D-02,1.5468D-02,1.5936D-02,1.6403D-02, + &1.6855D-02,1.7319D-02,1.7760D-02,1.8194D-02,1.8600D-02,1.9008D-02, + &1.9382D-02,1.9730D-02,2.0033D-02,2.0199D-02,2.0359D-02,2.0523D-02, + &2.0654D-02,2.0760D-02,2.0831D-02,2.0870D-02,2.0886D-02,2.0858D-02, + &2.0798D-02,2.0680D-02,2.0523D-02,2.0363D-02,2.0127D-02,1.9825D-02, + &1.9464D-02,1.9060D-02,1.8607D-02,1.8200D-02,1.7750D-02,1.7240D-02, + &1.6759D-02,1.6362D-02,1.6103D-02,1.6050D-02,1.6240D-02,1.6916D-02, + &1.8336D-02,2.0030D-02,2.2586D-02,2.5447D-02,2.9418D-02,3.3874D-02/ + DATA (XSF_L(K),K= 115, 228) / + &3.8821D-02,4.4375D-02,5.0509D-02,5.7343D-02,6.4974D-02,7.3385D-02, + &8.2640D-02,9.2732D-02,1.0354D-01,1.1667D-01,1.4809D-01,1.8910D-01, + &2.4387D-01,3.1940D-01,4.2764D-01,5.9054D-01,8.5228D-01,1.3150D+00, + &2.2623D+00,4.7596D+00,1.6445D+01,0.0000D+00,2.5010D-02,2.5616D-02, + &2.6180D-02,2.6758D-02,2.7279D-02,2.7792D-02,2.8274D-02,2.8729D-02, + &2.9134D-02,2.9513D-02,2.9836D-02,3.0110D-02,3.0324D-02,3.0417D-02, + &3.0492D-02,3.0537D-02,3.0551D-02,3.0517D-02,3.0432D-02,3.0326D-02, + &3.0181D-02,2.9954D-02,2.9663D-02,2.9316D-02,2.8913D-02,2.8508D-02, + &2.8021D-02,2.7422D-02,2.6741D-02,2.5997D-02,2.5204D-02,2.4500D-02, + &2.3734D-02,2.2858D-02,2.2019D-02,2.1281D-02,2.0698D-02,2.0402D-02, + &2.0365D-02,2.0844D-02,2.2137D-02,2.3807D-02,2.6404D-02,2.9338D-02, + &3.3433D-02,3.8036D-02,4.3135D-02,4.8799D-02,5.5061D-02,6.1999D-02, + &6.9633D-02,7.8024D-02,8.7156D-02,9.6998D-02,1.0742D-01,1.2099D-01, + &1.5162D-01,1.9121D-01,2.4363D-01,3.1510D-01,4.1638D-01,5.6669D-01, + &8.0557D-01,1.2216D+00,2.0572D+00,4.2084D+00,1.3911D+01,0.0000D+00, + &4.2554D-02,4.3210D-02,4.3820D-02,4.4379D-02,4.4862D-02,4.5317D-02, + &4.5708D-02,4.6037D-02,4.6300D-02,4.6434D-02,4.6540D-02,4.6530D-02, + &4.6426D-02,4.6317D-02,4.6155D-02,4.5919D-02,4.5622D-02,4.5267D-02, + &4.4833D-02,4.4425D-02,4.3932D-02,4.3298D-02,4.2582D-02,4.1785D-02/ + DATA (XSF_L(K),K= 229, 342) / + &4.0903D-02,4.0097D-02,3.9179D-02,3.8047D-02,3.6815D-02,3.5547D-02, + &3.4199D-02,3.3020D-02,3.1748D-02,3.0298D-02,2.8905D-02,2.7644D-02, + &2.6563D-02,2.5882D-02,2.5485D-02,2.5614D-02,2.6651D-02,2.8199D-02, + &3.0731D-02,3.3652D-02,3.7768D-02,4.2390D-02,4.7530D-02,5.3188D-02, + &5.9436D-02,6.6257D-02,7.3734D-02,8.1918D-02,9.0696D-02,1.0004D-01, + &1.0978D-01,1.2357D-01,1.5274D-01,1.8999D-01,2.3888D-01,3.0452D-01, + &3.9656D-01,5.3136D-01,7.4246D-01,1.1043D+00,1.8158D+00,3.6023D+00, + &0.0000D+00,0.0000D+00,7.3602D-02,7.4085D-02,7.4460D-02,7.4729D-02, + &7.4904D-02,7.4982D-02,7.4902D-02,7.4713D-02,7.4446D-02,7.3972D-02, + &7.3397D-02,7.2626D-02,7.1803D-02,7.1200D-02,7.0479D-02,6.9610D-02, + &6.8654D-02,6.7624D-02,6.6495D-02,6.5467D-02,6.4313D-02,6.2898D-02, + &6.1380D-02,5.9788D-02,5.8079D-02,5.6557D-02,5.4876D-02,5.2866D-02, + &5.0733D-02,4.8592D-02,4.6341D-02,4.4415D-02,4.2370D-02,4.0073D-02, + &3.7825D-02,3.5778D-02,3.3956D-02,3.2702D-02,3.1749D-02,3.1334D-02, + &3.1922D-02,3.3216D-02,3.5534D-02,3.8322D-02,4.2321D-02,4.6830D-02, + &5.1816D-02,5.7335D-02,6.3369D-02,6.9947D-02,7.7109D-02,8.4752D-02, + &9.2948D-02,1.0153D-01,1.1031D-01,1.2405D-01,1.5100D-01,1.8509D-01, + &2.2905D-01,2.8761D-01,3.6847D-01,4.8537D-01,6.6543D-01,9.6831D-01, + &1.5524D+00,2.9766D+00,0.0000D+00,0.0000D+00,1.1509D-01,1.1500D-01/ + DATA (XSF_L(K),K= 343, 456) / + &1.1474D-01,1.1430D-01,1.1371D-01,1.1292D-01,1.1196D-01,1.1079D-01, + &1.0948D-01,1.0791D-01,1.0620D-01,1.0426D-01,1.0215D-01,1.0076D-01, + &9.9224D-02,9.7466D-02,9.5472D-02,9.3507D-02,9.1346D-02,8.9460D-02, + &8.7382D-02,8.4914D-02,8.2326D-02,7.9663D-02,7.6874D-02,7.4459D-02, + &7.1794D-02,6.8694D-02,6.5489D-02,6.2266D-02,5.8964D-02,5.6164D-02, + &5.3226D-02,4.9916D-02,4.6721D-02,4.3794D-02,4.1128D-02,3.9225D-02, + &3.7654D-02,3.6613D-02,3.6666D-02,3.7626D-02,3.9655D-02,4.2227D-02, + &4.6000D-02,5.0288D-02,5.5044D-02,6.0308D-02,6.6020D-02,7.2218D-02, + &7.8943D-02,8.6079D-02,9.3611D-02,1.0141D-01,1.0925D-01,1.2274D-01, + &1.4748D-01,1.7840D-01,2.1791D-01,2.6997D-01,3.4109D-01,4.4280D-01, + &5.9706D-01,8.5325D-01,1.3371D+00,2.4909D+00,0.0000D+00,0.0000D+00, + &1.8131D-01,1.7986D-01,1.7802D-01,1.7597D-01,1.7372D-01,1.7110D-01, + &1.6825D-01,1.6515D-01,1.6187D-01,1.5820D-01,1.5428D-01,1.5016D-01, + &1.4582D-01,1.4314D-01,1.4017D-01,1.3677D-01,1.3315D-01,1.2951D-01, + &1.2571D-01,1.2248D-01,1.1891D-01,1.1472D-01,1.1045D-01,1.0615D-01, + &1.0173D-01,9.7944D-02,9.3854D-02,8.9131D-02,8.4347D-02,7.9597D-02, + &7.4799D-02,7.0788D-02,6.6599D-02,6.1932D-02,5.7438D-02,5.3307D-02, + &4.9546D-02,4.6816D-02,4.4417D-02,4.2536D-02,4.1862D-02,4.2361D-02, + &4.3960D-02,4.6198D-02,4.9612D-02,5.3553D-02,5.7974D-02,6.2830D-02/ + DATA (XSF_L(K),K= 457, 570) / + &6.8141D-02,7.3865D-02,7.9970D-02,8.6422D-02,9.3160D-02,1.0006D-01, + &1.0685D-01,1.1989D-01,1.4199D-01,1.6937D-01,2.0407D-01,2.4925D-01, + &3.1029D-01,3.9635D-01,5.2529D-01,7.3579D-01,1.1263D+00,2.0347D+00, + &0.0000D+00,0.0000D+00,2.6278D-01,2.5883D-01,2.5460D-01,2.5007D-01, + &2.4526D-01,2.3995D-01,2.3437D-01,2.2848D-01,2.2242D-01,2.1578D-01, + &2.0894D-01,2.0181D-01,1.9465D-01,1.9018D-01,1.8540D-01,1.7984D-01, + &1.7415D-01,1.6846D-01,1.6261D-01,1.5768D-01,1.5234D-01,1.4615D-01, + &1.3987D-01,1.3368D-01,1.2736D-01,1.2199D-01,1.1628D-01,1.0975D-01, + &1.0321D-01,9.6788D-02,9.0380D-02,8.5059D-02,7.9532D-02,7.3436D-02, + &6.7594D-02,6.2243D-02,5.7363D-02,5.3720D-02,5.0502D-02,4.7772D-02, + &4.6346D-02,4.6358D-02,4.7497D-02,4.9377D-02,5.2401D-02,5.5965D-02, + &6.0009D-02,6.4489D-02,6.9334D-02,7.4546D-02,8.0117D-02,8.5936D-02, + &9.1972D-02,9.8056D-02,1.0398D-01,1.1644D-01,1.3628D-01,1.6068D-01, + &1.9127D-01,2.3085D-01,2.8377D-01,3.5756D-01,4.6698D-01,6.4315D-01, + &9.6485D-01,1.6969D+00,0.0000D+00,0.0000D+00,3.6944D-01,3.6187D-01, + &3.5380D-01,3.4525D-01,3.3659D-01,3.2716D-01,3.1761D-01,3.0767D-01, + &2.9759D-01,2.8675D-01,2.7586D-01,2.6462D-01,2.5339D-01,2.4660D-01, + &2.3933D-01,2.3101D-01,2.2257D-01,2.1415D-01,2.0571D-01,1.9854D-01, + &1.9083D-01,1.8216D-01,1.7338D-01,1.6480D-01,1.5613D-01,1.4885D-01/ + DATA (XSF_L(K),K= 571, 684) / + &1.4115D-01,1.3244D-01,1.2380D-01,1.1542D-01,1.0713D-01,1.0031D-01, + &9.3226D-02,8.5515D-02,7.8171D-02,7.1449D-02,6.5307D-02,6.0723D-02, + &5.6523D-02,5.2878D-02,5.0622D-02,5.0109D-02,5.0720D-02,5.2187D-02, + &5.4770D-02,5.7950D-02,6.1582D-02,6.5595D-02,6.9997D-02,7.4716D-02, + &7.9677D-02,8.4886D-02,9.0221D-02,9.5543D-02,1.0065D-01,1.1245D-01, + &1.3012D-01,1.5166D-01,1.7859D-01,2.1305D-01,2.5881D-01,3.2188D-01, + &4.1454D-01,5.6186D-01,8.2718D-01,1.4188D+00,0.0000D+00,0.0000D+00, + &4.9195D-01,4.7916D-01,4.6620D-01,4.5277D-01,4.3908D-01,4.2463D-01, + &4.0985D-01,3.9491D-01,3.7975D-01,3.6377D-01,3.4790D-01,3.3178D-01, + &3.1592D-01,3.0640D-01,2.9622D-01,2.8462D-01,2.7303D-01,2.6160D-01, + &2.5012D-01,2.4047D-01,2.3023D-01,2.1867D-01,2.0717D-01,1.9597D-01, + &1.8477D-01,1.7546D-01,1.6568D-01,1.5468D-01,1.4387D-01,1.3343D-01, + &1.2319D-01,1.1482D-01,1.0622D-01,9.6828D-02,8.7978D-02,7.9884D-02, + &7.2526D-02,6.6973D-02,6.1948D-02,5.7359D-02,5.4304D-02,5.3263D-02, + &5.3381D-02,5.4456D-02,5.6601D-02,5.9380D-02,6.2613D-02,6.6252D-02, + &7.0174D-02,7.4432D-02,7.8943D-02,8.3559D-02,8.8282D-02,9.2963D-02, + &9.7382D-02,1.0858D-01,1.2441D-01,1.4363D-01,1.6745D-01,1.9778D-01, + &2.3771D-01,2.9246D-01,3.7200D-01,4.9738D-01,7.2010D-01,1.2083D+00, + &0.0000D+00,0.0000D+00,6.4521D-01,6.2534D-01,6.0540D-01,5.8499D-01/ + DATA (XSF_L(K),K= 685, 798) / + &5.6467D-01,5.4301D-01,5.2143D-01,4.9951D-01,4.7813D-01,4.5538D-01, + &4.3325D-01,4.1083D-01,3.8899D-01,3.7591D-01,3.6210D-01,3.4648D-01, + &3.3091D-01,3.1578D-01,3.0062D-01,2.8797D-01,2.7469D-01,2.5979D-01, + &2.4501D-01,2.3066D-01,2.1649D-01,2.0481D-01,1.9252D-01,1.7884D-01, + &1.6549D-01,1.5274D-01,1.4029D-01,1.3018D-01,1.1985D-01,1.0865D-01, + &9.8135D-02,8.8550D-02,7.9829D-02,7.3318D-02,6.7269D-02,6.1748D-02, + &5.7838D-02,5.6250D-02,5.5826D-02,5.6474D-02,5.8181D-02,6.0533D-02, + &6.3373D-02,6.6563D-02,7.0085D-02,7.3865D-02,7.7842D-02,8.1937D-02, + &8.6092D-02,9.0169D-02,9.3962D-02,1.0448D-01,1.1858D-01,1.3561D-01, + &1.5663D-01,1.8318D-01,2.1803D-01,2.6529D-01,3.3349D-01,4.3985D-01, + &6.2661D-01,1.0291D+00,0.0000D+00,0.0000D+00,8.2462D-01,7.9558D-01, + &7.6680D-01,7.3764D-01,7.0860D-01,6.7834D-01,6.4822D-01,6.1798D-01, + &5.8880D-01,5.5792D-01,5.2800D-01,4.9801D-01,4.6912D-01,4.5197D-01, + &4.3393D-01,4.1360D-01,3.9348D-01,3.7394D-01,3.5462D-01,3.3856D-01, + &3.2180D-01,3.0303D-01,2.8460D-01,2.6681D-01,2.4932D-01,2.3502D-01, + &2.2005D-01,2.0359D-01,1.8747D-01,1.7224D-01,1.5746D-01,1.4551D-01, + &1.3337D-01,1.2028D-01,1.0805D-01,9.6986D-02,8.6877D-02,7.9334D-02, + &7.2326D-02,6.5799D-02,6.1060D-02,5.8911D-02,5.7957D-02,5.8189D-02, + &5.9441D-02,6.1387D-02,6.3834D-02,6.6632D-02,6.9732D-02,7.3070D-02/ + DATA (XSF_L(K),K= 799, 912) / + &7.6595D-02,8.0190D-02,8.3816D-02,8.7358D-02,9.0631D-02,1.0046D-01, + &1.1304D-01,1.2815D-01,1.4670D-01,1.7006D-01,2.0049D-01,2.4154D-01, + &3.0039D-01,3.9121D-01,5.4894D-01,8.8378D-01,0.0000D+00,0.0000D+00, + &1.0199D+00,9.8025D-01,9.4100D-01,9.0151D-01,8.6283D-01,8.2243D-01, + &7.8262D-01,7.4321D-01,7.0465D-01,6.6494D-01,6.2647D-01,5.8811D-01, + &5.5152D-01,5.2985D-01,5.0721D-01,4.8183D-01,4.5681D-01,4.3274D-01, + &4.0883D-01,3.8916D-01,3.6878D-01,3.4589D-01,3.2366D-01,3.0238D-01, + &2.8152D-01,2.6437D-01,2.4685D-01,2.2733D-01,2.0858D-01,1.9085D-01, + &1.7375D-01,1.6000D-01,1.4607D-01,1.3115D-01,1.1722D-01,1.0469D-01, + &9.3284D-02,8.4739D-02,7.6803D-02,6.9420D-02,6.3844D-02,6.1178D-02, + &5.9720D-02,5.9561D-02,6.0398D-02,6.1984D-02,6.4051D-02,6.6494D-02, + &6.9202D-02,7.2161D-02,7.5274D-02,7.8453D-02,8.1651D-02,8.4728D-02, + &8.7564D-02,9.6777D-02,1.0806D-01,1.2157D-01,1.3806D-01,1.5882D-01, + &1.8566D-01,2.2170D-01,2.7301D-01,3.5168D-01,4.8696D-01,7.7010D-01, + &0.0000D+00,0.0000D+00,1.3158D+00,1.2585D+00,1.2024D+00,1.1462D+00, + &1.0919D+00,1.0352D+00,9.8042D-01,9.2608D-01,8.7345D-01,8.1987D-01, + &7.6814D-01,7.1724D-01,6.6882D-01,6.4053D-01,6.1093D-01,5.7796D-01, + &5.4572D-01,5.1470D-01,4.8433D-01,4.5934D-01,4.3358D-01,4.0495D-01, + &3.7717D-01,3.5082D-01,3.2513D-01,3.0408D-01,2.8258D-01,2.5918D-01/ + DATA (XSF_L(K),K= 913, 1026) / + &2.3648D-01,2.1538D-01,1.9510D-01,1.7888D-01,1.6255D-01,1.4508D-01, + &1.2895D-01,1.1443D-01,1.0131D-01,9.1507D-02,8.2387D-02,7.3778D-02, + &6.7147D-02,6.3813D-02,6.1721D-02,6.1065D-02,6.1373D-02,6.2475D-02, + &6.4105D-02,6.6079D-02,6.8362D-02,7.0856D-02,7.3440D-02,7.6143D-02, + &7.8812D-02,8.1388D-02,8.3726D-02,9.2167D-02,1.0190D-01,1.1355D-01, + &1.2780D-01,1.4554D-01,1.6841D-01,1.9900D-01,2.4223D-01,3.0775D-01, + &4.1920D-01,6.4849D-01,0.0000D+00,0.0000D+00,1.6483D+00,1.5703D+00, + &1.4940D+00,1.4180D+00,1.3449D+00,1.2694D+00,1.1966D+00,1.1250D+00, + &1.0566D+00,9.8644D-01,9.1985D-01,8.5482D-01,7.9312D-01,7.5722D-01, + &7.1986D-01,6.7849D-01,6.3821D-01,5.9972D-01,5.6214D-01,5.3143D-01, + &4.9987D-01,4.6500D-01,4.3136D-01,3.9956D-01,3.6875D-01,3.4379D-01, + &3.1832D-01,2.9044D-01,2.6397D-01,2.3923D-01,2.1580D-01,1.9706D-01, + &1.7829D-01,1.5838D-01,1.3999D-01,1.2356D-01,1.0875D-01,9.7664D-02, + &8.7392D-02,7.7645D-02,7.0035D-02,6.6062D-02,6.3365D-02,6.2239D-02, + &6.2062D-02,6.2731D-02,6.3942D-02,6.5526D-02,6.7390D-02,6.9436D-02, + &7.1635D-02,7.3891D-02,7.6122D-02,7.8246D-02,8.0196D-02,8.7884D-02, + &9.6357D-02,1.0648D-01,1.1880D-01,1.3413D-01,1.5386D-01,1.7993D-01, + &2.1655D-01,2.7189D-01,3.6486D-01,5.5332D-01,0.0000D+00,0.0000D+00, + &2.0271D+00,1.9234D+00,1.8224D+00,1.7226D+00,1.6272D+00,1.5293D+00/ + DATA (XSF_L(K),K= 1027, 1140) / + &1.4356D+00,1.3438D+00,1.2568D+00,1.1682D+00,1.0841D+00,1.0026D+00, + &9.2625D-01,8.8207D-01,8.3568D-01,7.8523D-01,7.3607D-01,6.8926D-01, + &6.4385D-01,6.0685D-01,5.6892D-01,5.2730D-01,4.8731D-01,4.4961D-01, + &4.1331D-01,3.8417D-01,3.5441D-01,3.2210D-01,2.9168D-01,2.6323D-01, + &2.3631D-01,2.1500D-01,1.9374D-01,1.7129D-01,1.5067D-01,1.3231D-01, + &1.1579D-01,1.0349D-01,9.2080D-02,8.1205D-02,7.2626D-02,6.8039D-02, + &6.4761D-02,6.3188D-02,6.2549D-02,6.2795D-02,6.3617D-02,6.4835D-02, + &6.6329D-02,6.8017D-02,6.9809D-02,7.1667D-02,7.3520D-02,7.5270D-02, + &7.6864D-02,8.3899D-02,9.1206D-02,1.0002D-01,1.1070D-01,1.2399D-01, + &1.4094D-01,1.6341D-01,1.9474D-01,2.4163D-01,3.1971D-01,4.7587D-01, + &0.0000D+00,0.0000D+00,2.4392D+00,2.3049D+00,2.1760D+00,2.0502D+00, + &1.9296D+00,1.8065D+00,1.6895D+00,1.5750D+00,1.4674D+00,1.3585D+00, + &1.2554D+00,1.1565D+00,1.0638D+00,1.0103D+00,9.5527D-01,8.9449D-01, + &8.3572D-01,7.8018D-01,7.2635D-01,6.8280D-01,6.3819D-01,5.8948D-01, + &5.4299D-01,4.9923D-01,4.5740D-01,4.2371D-01,3.8978D-01,3.5296D-01, + &3.1832D-01,2.8629D-01,2.5599D-01,2.3212D-01,2.0840D-01,1.8346D-01, + &1.6065D-01,1.4043D-01,1.2229D-01,1.0880D-01,9.6294D-02,8.4335D-02, + &7.4905D-02,6.9717D-02,6.5897D-02,6.3914D-02,6.2851D-02,6.2731D-02, + &6.3183D-02,6.4075D-02,6.5225D-02,6.6597D-02,6.8048D-02,6.9577D-02/ + DATA (XSF_L(K),K= 1141, 1254) / + &7.1093D-02,7.2525D-02,7.3842D-02,8.0241D-02,8.6615D-02,9.4292D-02, + &1.0360D-01,1.1517D-01,1.2992D-01,1.4936D-01,1.7633D-01,2.1652D-01, + &2.8294D-01,4.1389D-01,0.0000D+00,0.0000D+00,2.9162D+00,2.7470D+00, + &2.5840D+00,2.4244D+00,2.2743D+00,2.1215D+00,1.9764D+00,1.8358D+00, + &1.7035D+00,1.5708D+00,1.4463D+00,1.3268D+00,1.2152D+00,1.1514D+00, + &1.0857D+00,1.0132D+00,9.4449D-01,8.7867D-01,8.1556D-01,7.6453D-01, + &7.1252D-01,6.5602D-01,6.0218D-01,5.5192D-01,5.0387D-01,4.6545D-01, + &4.2679D-01,3.8521D-01,3.4602D-01,3.1005D-01,2.7623D-01,2.4962D-01, + &2.2332D-01,1.9577D-01,1.7070D-01,1.4856D-01,1.2874D-01,1.1402D-01, + &1.0040D-01,8.7343D-02,7.6984D-02,7.1254D-02,6.6892D-02,6.4508D-02, + &6.3019D-02,6.2518D-02,6.2667D-02,6.3211D-02,6.4031D-02,6.5064D-02, + &6.6243D-02,6.7458D-02,6.8679D-02,6.9830D-02,7.0885D-02,7.6672D-02, + &8.2192D-02,8.8844D-02,9.6930D-02,1.0696D-01,1.1972D-01,1.3654D-01, + &1.5978D-01,1.9411D-01,2.5048D-01,3.6023D-01,0.0000D+00,0.0000D+00, + &3.4281D+00,3.2194D+00,3.0180D+00,2.8239D+00,2.6400D+00,2.4537D+00, + &2.2781D+00,2.1087D+00,1.9503D+00,1.7915D+00,1.6433D+00,1.5021D+00, + &1.3711D+00,1.2958D+00,1.2191D+00,1.1350D+00,1.0536D+00,9.7846D-01, + &9.0526D-01,8.4668D-01,7.8697D-01,7.2243D-01,6.6110D-01,6.0402D-01, + &5.4971D-01,5.0652D-01,4.6307D-01,4.1647D-01,3.7287D-01,3.3288D-01/ + DATA (XSF_L(K),K= 1255, 1368) / + &2.9545D-01,2.6636D-01,2.3751D-01,2.0740D-01,1.8012D-01,1.5611D-01, + &1.3467D-01,1.1881D-01,1.0414D-01,9.0105D-02,7.8839D-02,7.2563D-02, + &6.7703D-02,6.4930D-02,6.3070D-02,6.2241D-02,6.2071D-02,6.2347D-02, + &6.2882D-02,6.3645D-02,6.4526D-02,6.5473D-02,6.6427D-02,6.7333D-02, + &6.8194D-02,7.3430D-02,7.8217D-02,8.3974D-02,9.1017D-02,9.9745D-02, + &1.1088D-01,1.2552D-01,1.4563D-01,1.7528D-01,2.2351D-01,3.1636D-01, + &0.0000D+00,0.0000D+00,3.9892D+00,3.7328D+00,3.4900D+00,3.2549D+00, + &3.0344D+00,2.8108D+00,2.6014D+00,2.4001D+00,2.2123D+00,2.0253D+00, + &1.8518D+00,1.6860D+00,1.5339D+00,1.4463D+00,1.3575D+00,1.2608D+00, + &1.1678D+00,1.0809D+00,9.9767D-01,9.3087D-01,8.6314D-01,7.8996D-01, + &7.2083D-01,6.5671D-01,5.9602D-01,5.4775D-01,4.9935D-01,4.4773D-01, + &3.9951D-01,3.5571D-01,3.1467D-01,2.8272D-01,2.5135D-01,2.1871D-01, + &1.8923D-01,1.6331D-01,1.4031D-01,1.2332D-01,1.0762D-01,9.2560D-02, + &8.0473D-02,7.3714D-02,6.8385D-02,6.5246D-02,6.3019D-02,6.1878D-02, + &6.1420D-02,6.1413D-02,6.1734D-02,6.2226D-02,6.2861D-02,6.3564D-02, + &6.4288D-02,6.4985D-02,6.5657D-02,7.0367D-02,7.4522D-02,7.9506D-02, + &8.5651D-02,9.3297D-02,1.0298D-01,1.1572D-01,1.3323D-01,1.5884D-01, + &2.0039D-01,2.7925D-01,0.0000D+00,0.0000D+00,4.5788D+00,4.2729D+00, + &3.9840D+00,3.7039D+00,3.4438D+00,3.1812D+00,2.9349D+00,2.6996D+00/ + DATA (XSF_L(K),K= 1369, 1482) / + &2.4810D+00,2.2644D+00,2.0633D+00,1.8732D+00,1.6979D+00,1.5988D+00, + &1.4974D+00,1.3865D+00,1.2812D+00,1.1834D+00,1.0891D+00,1.0143D+00, + &9.3839D-01,8.5662D-01,7.7948D-01,7.0838D-01,6.4106D-01,5.8780D-01, + &5.3454D-01,4.7781D-01,4.2528D-01,3.7737D-01,3.3289D-01,2.9818D-01, + &2.6446D-01,2.2932D-01,1.9770D-01,1.7005D-01,1.4552D-01,1.2746D-01, + &1.1078D-01,9.4770D-02,8.1957D-02,7.4689D-02,6.8915D-02,6.5457D-02, + &6.2902D-02,6.1493D-02,6.0768D-02,6.0515D-02,6.0585D-02,6.0863D-02, + &6.1298D-02,6.1789D-02,6.2311D-02,6.2835D-02,6.3340D-02,6.7601D-02, + &7.1162D-02,7.5516D-02,8.0878D-02,8.7566D-02,9.6095D-02,1.0725D-01, + &1.2258D-01,1.4495D-01,1.8090D-01,2.4841D-01,0.0000D+00,0.0000D+00, + &5.4774D+00,5.0929D+00,4.7320D+00,4.3841D+00,4.0592D+00,3.7350D+00, + &3.4329D+00,3.1454D+00,2.8799D+00,2.6172D+00,2.3747D+00,2.1466D+00, + &1.9383D+00,1.8195D+00,1.6996D+00,1.5689D+00,1.4457D+00,1.3301D+00, + &1.2211D+00,1.1339D+00,1.0456D+00,9.5119D-01,8.6259D-01,7.8097D-01, + &7.0419D-01,6.4380D-01,5.8358D-01,5.1955D-01,4.6051D-01,4.0719D-01, + &3.5768D-01,3.1962D-01,2.8220D-01,2.4360D-01,2.0909D-01,1.7895D-01, + &1.5240D-01,1.3282D-01,1.1484D-01,9.7655D-02,8.3739D-02,7.5857D-02, + &6.9509D-02,6.5616D-02,6.2633D-02,6.0853D-02,5.9819D-02,5.9271D-02, + &5.9038D-02,5.9046D-02,5.9192D-02,5.9432D-02,5.9709D-02,6.0008D-02/ + DATA (XSF_L(K),K= 1483, 1596) / + &6.0340D-02,6.4032D-02,6.6851D-02,7.0446D-02,7.4870D-02,8.0457D-02, + &8.7554D-02,9.6862D-02,1.0964D-01,1.2821D-01,1.5779D-01,2.1189D-01, + &0.0000D+00,0.0000D+00,6.3982D+00,5.9307D+00,5.4920D+00,5.0710D+00, + &4.6822D+00,4.2915D+00,3.9337D+00,3.5898D+00,3.2756D+00,2.9660D+00, + &2.6817D+00,2.4150D+00,2.1724D+00,2.0348D+00,1.8961D+00,1.7457D+00, + &1.6034D+00,1.4714D+00,1.3471D+00,1.2473D+00,1.1476D+00,1.0408D+00, + &9.4083D-01,8.4932D-01,7.6350D-01,6.9606D-01,6.2897D-01,5.5833D-01, + &4.9315D-01,4.3444D-01,3.8044D-01,3.3861D-01,2.9817D-01,2.5642D-01, + &2.1917D-01,1.8685D-01,1.5838D-01,1.3752D-01,1.1831D-01,9.9987D-02, + &8.5224D-02,7.6762D-02,6.9910D-02,6.5655D-02,6.2297D-02,6.0213D-02, + &5.8897D-02,5.8096D-02,5.7624D-02,5.7400D-02,5.7322D-02,5.7351D-02, + &5.7432D-02,5.7560D-02,5.7758D-02,6.0939D-02,6.3212D-02,6.6167D-02, + &6.9884D-02,7.4560D-02,8.0552D-02,8.8432D-02,9.9242D-02,1.1491D-01, + &1.3966D-01,1.8320D-01,0.0000D+00,0.0000D+00,7.4490D+00,6.8826D+00, + &6.3540D+00,5.8477D+00,5.3805D+00,4.9187D+00,4.4884D+00,4.0843D+00, + &3.7147D+00,3.3516D+00,3.0193D+00,2.7088D+00,2.4279D+00,2.2696D+00, + &2.1091D+00,1.9368D+00,1.7739D+00,1.6237D+00,1.4821D+00,1.3692D+00, + &1.2557D+00,1.1358D+00,1.0238D+00,9.2133D-01,8.2567D-01,7.5070D-01, + &6.7656D-01,5.9850D-01,5.2688D-01,4.6263D-01,4.0371D-01,3.5842D-01/ + DATA (XSF_L(K),K= 1597, 1710) / + &3.1427D-01,2.6933D-01,2.2930D-01,1.9466D-01,1.6427D-01,1.4208D-01, + &1.2168D-01,1.0226D-01,8.6560D-02,7.7553D-02,7.0202D-02,6.5576D-02, + &6.1860D-02,5.9487D-02,5.7920D-02,5.6852D-02,5.6166D-02,5.5736D-02, + &5.5458D-02,5.5289D-02,5.5193D-02,5.5163D-02,5.5243D-02,5.7935D-02, + &5.9740D-02,6.2111D-02,6.5158D-02,6.9050D-02,7.4078D-02,8.0683D-02, + &8.9776D-02,1.0288D-01,1.2351D-01,1.5725D-01,0.0000D+00,0.0000D+00, + &8.6044D+00,7.9255D+00,7.2940D+00,6.6940D+00,6.1391D+00,5.5940D+00, + &5.0907D+00,4.6180D+00,4.1841D+00,3.7622D+00,3.3775D+00,3.0195D+00, + &2.6967D+00,2.5153D+00,2.3331D+00,2.1364D+00,1.9521D+00,1.7815D+00, + &1.6211D+00,1.4944D+00,1.3683D+00,1.2334D+00,1.1084D+00,9.9465D-01, + &8.8864D-01,8.0585D-01,7.2432D-01,6.3866D-01,5.6038D-01,4.9058D-01, + &4.2648D-01,3.7768D-01,3.3036D-01,2.8189D-01,2.3907D-01,2.0214D-01, + &1.6987D-01,1.4635D-01,1.2479D-01,1.0428D-01,8.7748D-02,7.8203D-02, + &7.0386D-02,6.5431D-02,6.1373D-02,5.8719D-02,5.6916D-02,5.5642D-02, + &5.4751D-02,5.4118D-02,5.3653D-02,5.3314D-02,5.3067D-02,5.2897D-02, + &5.2861D-02,5.5140D-02,5.6493D-02,5.8378D-02,6.0860D-02,6.4090D-02, + &6.8261D-02,7.3828D-02,8.1439D-02,9.2423D-02,1.0952D-01,1.3424D-01, + &0.0000D+00,0.0000D+00,9.7645D+00,8.9701D+00,8.2340D+00,7.5357D+00, + &6.8926D+00,6.2607D+00,5.6834D+00,5.1374D+00,4.6459D+00,4.1625D+00/ + DATA (XSF_L(K),K= 1711, 1824) / + &3.7261D+00,3.3206D+00,2.9567D+00,2.7529D+00,2.5476D+00,2.3274D+00, + &2.1217D+00,1.9320D+00,1.7541D+00,1.6131D+00,1.4740D+00,1.3257D+00, + &1.1879D+00,1.0631D+00,9.4732D-01,8.5726D-01,7.6844D-01,6.7586D-01, + &5.9131D-01,5.1597D-01,4.4748D-01,3.9504D-01,3.4470D-01,2.9317D-01, + &2.4779D-01,2.0880D-01,1.7478D-01,1.5007D-01,1.2748D-01,1.0600D-01, + &8.8713D-02,7.8704D-02,7.0472D-02,6.5220D-02,6.0885D-02,5.7993D-02, + &5.5967D-02,5.4536D-02,5.3470D-02,5.2665D-02,5.2054D-02,5.1577D-02, + &5.1203D-02,5.0930D-02,5.0809D-02,5.2731D-02,5.3716D-02,5.5192D-02, + &5.7203D-02,5.9902D-02,6.3412D-02,6.8123D-02,7.4602D-02,8.3905D-02, + &9.8185D-02,1.1515D-01,0.0000D+00,0.0000D+00,1.1069D+01,1.0141D+01, + &9.2840D+00,8.4741D+00,7.7316D+00,7.0038D+00,6.3364D+00,5.7137D+00, + &5.1475D+00,4.6031D+00,4.1059D+00,3.6477D+00,3.2381D+00,3.0086D+00, + &2.7788D+00,2.5333D+00,2.3033D+00,2.0926D+00,1.8951D+00,1.7404D+00, + &1.5854D+00,1.4229D+00,1.2715D+00,1.1352D+00,1.0089D+00,9.1089D-01, + &8.1457D-01,7.1424D-01,6.2332D-01,5.4229D-01,4.6872D-01,4.1295D-01, + &3.5903D-01,3.0454D-01,2.5654D-01,2.1539D-01,1.7965D-01,1.5373D-01, + &1.3011D-01,1.0766D-01,8.9530D-02,7.9108D-02,7.0483D-02,6.4943D-02, + &6.0331D-02,5.7203D-02,5.4990D-02,5.3395D-02,5.2144D-02,5.1206D-02, + &5.0454D-02,4.9840D-02,4.9351D-02,4.8978D-02,4.8801D-02,5.0351D-02/ + DATA (XSF_L(K),K= 1825, 1836) / + &5.1017D-02,5.2127D-02,5.3737D-02,5.5934D-02,5.8835D-02,6.2800D-02, + &6.8260D-02,7.6135D-02,8.7873D-02,0.0000D+00,0.0000D+00,0.0000D+00/ + DATA (XGF_L(K),K= 1, 114) / + &1.0646D+00,1.0934D+00,1.1214D+00,1.1484D+00,1.1741D+00,1.1999D+00, + &1.2242D+00,1.2466D+00,1.2676D+00,1.2873D+00,1.3042D+00,1.3194D+00, + &1.3313D+00,1.3376D+00,1.3430D+00,1.3472D+00,1.3502D+00,1.3504D+00, + &1.3501D+00,1.3478D+00,1.3430D+00,1.3356D+00,1.3267D+00,1.3149D+00, + &1.3003D+00,1.2857D+00,1.2680D+00,1.2451D+00,1.2189D+00,1.1899D+00, + &1.1575D+00,1.1282D+00,1.0947D+00,1.0543D+00,1.0121D+00,9.6983D-01, + &9.2809D-01,8.9556D-01,8.6663D-01,8.4606D-01,8.4971D-01,8.7714D-01, + &9.3569D-01,1.0140D+00,1.1325D+00,1.2706D+00,1.4268D+00,1.6005D+00, + &1.7918D+00,2.0014D+00,2.2301D+00,2.4791D+00,2.7490D+00,3.0404D+00, + &3.3541D+00,3.5718D+00,4.2579D+00,5.0478D+00,5.9674D+00,7.0458D+00, + &8.3375D+00,9.9284D+00,1.1949D+01,1.4650D+01,1.8560D+01,2.5096D+01, + &4.0067D+01,0.0000D+00,1.6404D+00,1.6723D+00,1.7014D+00,1.7287D+00, + &1.7533D+00,1.7768D+00,1.7973D+00,1.8152D+00,1.8297D+00,1.8417D+00, + &1.8498D+00,1.8540D+00,1.8544D+00,1.8526D+00,1.8489D+00,1.8424D+00, + &1.8335D+00,1.8221D+00,1.8091D+00,1.7949D+00,1.7784D+00,1.7555D+00, + &1.7310D+00,1.7034D+00,1.6713D+00,1.6428D+00,1.6093D+00,1.5680D+00, + &1.5230D+00,1.4754D+00,1.4241D+00,1.3785D+00,1.3278D+00,1.2681D+00, + &1.2068D+00,1.1462D+00,1.0867D+00,1.0400D+00,9.9665D-01,9.6041D-01, + &9.4923D-01,9.6563D-01,1.0117D+00,1.0781D+00,1.1816D+00,1.3028D+00/ + DATA (XGF_L(K),K= 115, 228) / + &1.4397D+00,1.5912D+00,1.7573D+00,1.9376D+00,2.1326D+00,2.3425D+00, + &2.5677D+00,2.8078D+00,3.0611D+00,3.2398D+00,3.7904D+00,4.4126D+00, + &5.1162D+00,5.9322D+00,6.8841D+00,8.0278D+00,9.4403D+00,1.1276D+01, + &1.3844D+01,1.7948D+01,2.6821D+01,0.0000D+00,2.5295D+00,2.5563D+00, + &2.5800D+00,2.5995D+00,2.6174D+00,2.6286D+00,2.6363D+00,2.6395D+00, + &2.6379D+00,2.6306D+00,2.6184D+00,2.6000D+00,2.5768D+00,2.5598D+00, + &2.5397D+00,2.5137D+00,2.4839D+00,2.4516D+00,2.4161D+00,2.3833D+00, + &2.3459D+00,2.3000D+00,2.2499D+00,2.1966D+00,2.1407D+00,2.0900D+00, + &2.0320D+00,1.9647D+00,1.8929D+00,1.8190D+00,1.7411D+00,1.6734D+00, + &1.5997D+00,1.5142D+00,1.4279D+00,1.3438D+00,1.2617D+00,1.1967D+00, + &1.1353D+00,1.0800D+00,1.0501D+00,1.0526D+00,1.0849D+00,1.1369D+00, + &1.2228D+00,1.3250D+00,1.4410D+00,1.5691D+00,1.7085D+00,1.8587D+00, + &2.0200D+00,2.1915D+00,2.3728D+00,2.5633D+00,2.7603D+00,2.9047D+00, + &3.3315D+00,3.8026D+00,4.3243D+00,4.9121D+00,5.5828D+00,6.3648D+00, + &7.3038D+00,8.4817D+00,1.0068D+01,1.2484D+01,1.7398D+01,0.0000D+00, + &3.9781D+00,3.9859D+00,3.9880D+00,3.9845D+00,3.9763D+00,3.9582D+00, + &3.9337D+00,3.9028D+00,3.8636D+00,3.8159D+00,3.7613D+00,3.6984D+00, + &3.6287D+00,3.5836D+00,3.5326D+00,3.4703D+00,3.4046D+00,3.3350D+00, + &3.2612D+00,3.1962D+00,3.1248D+00,3.0388D+00,2.9485D+00,2.8565D+00/ + DATA (XGF_L(K),K= 229, 342) / + &2.7591D+00,2.6752D+00,2.5823D+00,2.4756D+00,2.3627D+00,2.2510D+00, + &2.1352D+00,2.0365D+00,1.9308D+00,1.8097D+00,1.6896D+00,1.5737D+00, + &1.4618D+00,1.3735D+00,1.2886D+00,1.2087D+00,1.1551D+00,1.1411D+00, + &1.1545D+00,1.1903D+00,1.2550D+00,1.3356D+00,1.4282D+00,1.5306D+00, + &1.6419D+00,1.7606D+00,1.8869D+00,2.0194D+00,2.1574D+00,2.2992D+00, + &2.4432D+00,2.5568D+00,2.8674D+00,3.2008D+00,3.5626D+00,3.9572D+00, + &4.3932D+00,4.8857D+00,5.4544D+00,6.1386D+00,7.0188D+00,8.2895D+00, + &1.0709D+01,0.0000D+00,6.3697D+00,6.3265D+00,6.2740D+00,6.2091D+00, + &6.1391D+00,6.0517D+00,5.9560D+00,5.8525D+00,5.7367D+00,5.6106D+00, + &5.4709D+00,5.3235D+00,5.1695D+00,5.0724D+00,4.9662D+00,4.8411D+00, + &4.7105D+00,4.5784D+00,4.4412D+00,4.3226D+00,4.1943D+00,4.0442D+00, + &3.8903D+00,3.7360D+00,3.5773D+00,3.4420D+00,3.2967D+00,3.1301D+00, + &2.9593D+00,2.7916D+00,2.6229D+00,2.4802D+00,2.3301D+00,2.1613D+00, + &1.9957D+00,1.8382D+00,1.6875D+00,1.5691D+00,1.4545D+00,1.3433D+00, + &1.2614D+00,1.2264D+00,1.2177D+00,1.2342D+00,1.2749D+00,1.3313D+00, + &1.3987D+00,1.4740D+00,1.5559D+00,1.6431D+00,1.7346D+00,1.8295D+00, + &1.9260D+00,2.0232D+00,2.1174D+00,2.2034D+00,2.4118D+00,2.6289D+00, + &2.8563D+00,3.0948D+00,3.3486D+00,3.6231D+00,3.9250D+00,4.2677D+00, + &4.6847D+00,5.2492D+00,6.2650D+00,0.0000D+00,9.3778D+00,9.2428D+00/ + DATA (XGF_L(K),K= 343, 456) / + &9.0960D+00,8.9365D+00,8.7665D+00,8.5746D+00,8.3714D+00,8.1544D+00, + &7.9343D+00,7.6882D+00,7.4352D+00,7.1724D+00,6.9027D+00,6.7360D+00, + &6.5571D+00,6.3494D+00,6.1374D+00,5.9260D+00,5.7093D+00,5.5249D+00, + &5.3270D+00,5.0995D+00,4.8700D+00,4.6419D+00,4.4114D+00,4.2173D+00, + &4.0129D+00,3.7786D+00,3.5451D+00,3.3173D+00,3.0900D+00,2.9004D+00, + &2.7040D+00,2.4853D+00,2.2734D+00,2.0742D+00,1.8851D+00,1.7372D+00, + &1.5941D+00,1.4536D+00,1.3433D+00,1.2893D+00,1.2607D+00,1.2587D+00, + &1.2792D+00,1.3153D+00,1.3616D+00,1.4149D+00,1.4736D+00,1.5361D+00, + &1.6012D+00,1.6677D+00,1.7344D+00,1.7990D+00,1.8589D+00,1.9261D+00, + &2.0646D+00,2.2044D+00,2.3456D+00,2.4882D+00,2.6342D+00,2.7823D+00, + &2.9370D+00,3.1022D+00,3.2902D+00,3.5288D+00,3.9528D+00,0.0000D+00, + &1.3926D+01,1.3617D+01,1.3298D+01,1.2959D+01,1.2612D+01,1.2230D+01, + &1.1845D+01,1.1442D+01,1.1036D+01,1.0599D+01,1.0158D+01,9.7041D+00, + &9.2562D+00,8.9827D+00,8.6974D+00,8.3632D+00,8.0255D+00,7.6946D+00, + &7.3614D+00,7.0802D+00,6.7814D+00,6.4439D+00,6.1064D+00,5.7775D+00, + &5.4468D+00,5.1723D+00,4.8858D+00,4.5617D+00,4.2425D+00,3.9361D+00, + &3.6353D+00,3.3874D+00,3.1301D+00,2.8506D+00,2.5816D+00,2.3318D+00, + &2.0965D+00,1.9136D+00,1.7368D+00,1.5622D+00,1.4211D+00,1.3452D+00, + &1.2937D+00,1.2737D+00,1.2719D+00,1.2868D+00,1.3119D+00,1.3437D+00/ + DATA (XGF_L(K),K= 457, 570) / + &1.3799D+00,1.4189D+00,1.4596D+00,1.5003D+00,1.5401D+00,1.5761D+00, + &1.6073D+00,1.6574D+00,1.7377D+00,1.8158D+00,1.8902D+00,1.9601D+00, + &2.0263D+00,2.0884D+00,2.1452D+00,2.1990D+00,2.2512D+00,2.3118D+00, + &2.4354D+00,0.0000D+00,1.9256D+01,1.8699D+01,1.8142D+01,1.7563D+01, + &1.6980D+01,1.6355D+01,1.5725D+01,1.5081D+01,1.4443D+01,1.3769D+01, + &1.3097D+01,1.2422D+01,1.1755D+01,1.1358D+01,1.0937D+01,1.0454D+01, + &9.9818D+00,9.5167D+00,9.0465D+00,8.6570D+00,8.2473D+00,7.7870D+00, + &7.3320D+00,6.8911D+00,6.4569D+00,6.0969D+00,5.7223D+00,5.3051D+00, + &4.8992D+00,4.5131D+00,4.1351D+00,3.8285D+00,3.5148D+00,3.1749D+00, + &2.8517D+00,2.5534D+00,2.2748D+00,2.0598D+00,1.8527D+00,1.6465D+00, + &1.4780D+00,1.3832D+00,1.3129D+00,1.2758D+00,1.2566D+00,1.2544D+00, + &1.2628D+00,1.2778D+00,1.2971D+00,1.3186D+00,1.3412D+00,1.3637D+00, + &1.3845D+00,1.4021D+00,1.4142D+00,1.4518D+00,1.4945D+00,1.5327D+00, + &1.5661D+00,1.5941D+00,1.6160D+00,1.6309D+00,1.6386D+00,1.6381D+00, + &1.6291D+00,1.6176D+00,1.6271D+00,0.0000D+00,2.5945D+01,2.5063D+01, + &2.4160D+01,2.3234D+01,2.2336D+01,2.1370D+01,2.0417D+01,1.9450D+01, + &1.8508D+01,1.7517D+01,1.6548D+01,1.5580D+01,1.4645D+01,1.4085D+01, + &1.3496D+01,1.2836D+01,1.2181D+01,1.1547D+01,1.0921D+01,1.0404D+01, + &9.8614D+00,9.2547D+00,8.6616D+00,8.0926D+00,7.5352D+00,7.0774D+00/ + DATA (XGF_L(K),K= 571, 684) / + &6.6043D+00,6.0842D+00,5.5816D+00,5.1040D+00,4.6450D+00,4.2749D+00, + &3.8995D+00,3.4941D+00,3.1134D+00,2.7651D+00,2.4423D+00,2.1941D+00, + &1.9564D+00,1.7198D+00,1.5241D+00,1.4112D+00,1.3220D+00,1.2705D+00, + &1.2348D+00,1.2175D+00,1.2113D+00,1.2119D+00,1.2167D+00,1.2238D+00, + &1.2321D+00,1.2398D+00,1.2460D+00,1.2491D+00,1.2470D+00,1.2752D+00, + &1.2894D+00,1.2998D+00,1.3055D+00,1.3049D+00,1.2991D+00,1.2860D+00, + &1.2655D+00,1.2370D+00,1.1998D+00,1.1564D+00,1.1181D+00,0.0000D+00, + &3.3362D+01,3.2051D+01,3.0740D+01,2.9429D+01,2.8133D+01,2.6758D+01, + &2.5422D+01,2.4082D+01,2.2784D+01,2.1435D+01,2.0130D+01,1.8839D+01, + &1.7597D+01,1.6865D+01,1.6098D+01,1.5241D+01,1.4397D+01,1.3587D+01, + &1.2791D+01,1.2130D+01,1.1444D+01,1.0687D+01,9.9507D+00,9.2501D+00, + &8.5659D+00,8.0104D+00,7.4390D+00,6.8118D+00,6.2125D+00,5.6506D+00, + &5.1096D+00,4.6780D+00,4.2434D+00,3.7769D+00,3.3424D+00,2.9475D+00, + &2.5842D+00,2.3061D+00,2.0409D+00,1.7770D+00,1.5572D+00,1.4290D+00, + &1.3248D+00,1.2609D+00,1.2112D+00,1.1814D+00,1.1636D+00,1.1530D+00, + &1.1469D+00,1.1433D+00,1.1407D+00,1.1378D+00,1.1337D+00,1.1269D+00, + &1.1152D+00,1.1360D+00,1.1320D+00,1.1243D+00,1.1127D+00,1.0960D+00, + &1.0739D+00,1.0461D+00,1.0122D+00,9.7100D-01,9.2292D-01,8.6909D-01, + &8.1432D-01,0.0000D+00,4.2364D+01,4.0483D+01,3.8640D+01,3.6792D+01/ + DATA (XGF_L(K),K= 685, 798) / + &3.4991D+01,3.3112D+01,3.1295D+01,2.9487D+01,2.7748D+01,2.5953D+01, + &2.4235D+01,2.2543D+01,2.0935D+01,1.9990D+01,1.9011D+01,1.7921D+01, + &1.6852D+01,1.5830D+01,1.4831D+01,1.4013D+01,1.3165D+01,1.2236D+01, + &1.1337D+01,1.0485D+01,9.6616D+00,8.9943D+00,8.3137D+00,7.5711D+00, + &6.8670D+00,6.2090D+00,5.5842D+00,5.0866D+00,4.5873D+00,4.0564D+00, + &3.5646D+00,3.1234D+00,2.7185D+00,2.4107D+00,2.1172D+00,1.8273D+00, + &1.5836D+00,1.4407D+00,1.3211D+00,1.2459D+00,1.1839D+00,1.1433D+00, + &1.1153D+00,1.0949D+00,1.0794D+00,1.0667D+00,1.0555D+00,1.0443D+00, + &1.0317D+00,1.0172D+00,9.9883D-01,1.0131D+00,9.9503D-01,9.7446D-01, + &9.5064D-01,9.2316D-01,8.9156D-01,8.5528D-01,8.1439D-01,7.6837D-01, + &7.1718D-01,6.6210D-01,6.0243D-01,0.0000D+00,5.2603D+01,5.0038D+01, + &4.7540D+01,4.5053D+01,4.2652D+01,4.0175D+01,3.7784D+01,3.5407D+01, + &3.3154D+01,3.0851D+01,2.8651D+01,2.6507D+01,2.4488D+01,2.3310D+01, + &2.2084D+01,2.0735D+01,1.9418D+01,1.8166D+01,1.6951D+01,1.5960D+01, + &1.4935D+01,1.3817D+01,1.2742D+01,1.1732D+01,1.0759D+01,9.9749D+00, + &9.1794D+00,8.3186D+00,7.5044D+00,6.7510D+00,6.0386D+00,5.4762D+00, + &4.9137D+00,4.3200D+00,3.7728D+00,3.2842D+00,2.8391D+00,2.5026D+00, + &2.1835D+00,1.8677D+00,1.6033D+00,1.4461D+00,1.3138D+00,1.2277D+00, + &1.1557D+00,1.1057D+00,1.0689D+00,1.0407D+00,1.0176D+00,9.9768D-01/ + DATA (XGF_L(K),K= 799, 912) / + &9.7951D-01,9.6199D-01,9.4331D-01,9.2359D-01,9.0058D-01,9.0921D-01, + &8.8156D-01,8.5244D-01,8.2081D-01,7.8702D-01,7.5025D-01,7.1005D-01, + &6.6667D-01,6.1984D-01,5.6969D-01,5.1748D-01,4.5895D-01,0.0000D+00, + &6.3459D+01,6.0127D+01,5.6900D+01,5.3695D+01,5.0615D+01,4.7464D+01, + &4.4440D+01,4.1483D+01,3.8684D+01,3.5826D+01,3.3122D+01,3.0500D+01, + &2.8040D+01,2.6617D+01,2.5143D+01,2.3518D+01,2.1950D+01,2.0455D+01, + &1.9011D+01,1.7842D+01,1.6646D+01,1.5337D+01,1.4094D+01,1.2920D+01, + &1.1799D+01,1.0903D+01,9.9940D+00,9.0166D+00,8.0967D+00,7.2512D+00, + &6.4551D+00,5.8279D+00,5.2081D+00,4.5519D+00,3.9568D+00,3.4237D+00, + &2.9425D+00,2.5798D+00,2.2371D+00,1.8995D+00,1.6161D+00,1.4477D+00, + &1.3046D+00,1.2096D+00,1.1285D+00,1.0709D+00,1.0274D+00,9.9290D-01, + &9.6399D-01,9.3860D-01,9.1550D-01,8.9324D-01,8.7036D-01,8.4674D-01, + &8.2129D-01,8.2506D-01,7.9094D-01,7.5633D-01,7.2031D-01,6.8307D-01, + &6.4387D-01,6.0237D-01,5.5907D-01,5.1344D-01,4.6618D-01,4.1810D-01, + &3.6329D-01,0.0000D+00,7.9498D+01,7.4941D+01,7.0580D+01,6.6266D+01, + &6.2169D+01,5.8002D+01,5.4045D+01,5.0164D+01,4.6539D+01,4.2847D+01, + &3.9386D+01,3.6065D+01,3.2968D+01,3.1180D+01,2.9347D+01,2.7330D+01, + &2.5394D+01,2.3566D+01,2.1811D+01,2.0388D+01,1.8944D+01,1.7368D+01, + &1.5877D+01,1.4488D+01,1.3164D+01,1.2111D+01,1.1051D+01,9.9162D+00/ + DATA (XGF_L(K),K= 913, 1026) / + &8.8542D+00,7.8839D+00,6.9777D+00,6.2689D+00,5.5695D+00,4.8410D+00, + &4.1789D+00,3.5909D+00,3.0635D+00,2.6689D+00,2.2973D+00,1.9324D+00, + &1.6270D+00,1.4446D+00,1.2882D+00,1.1839D+00,1.0926D+00,1.0266D+00, + &9.7585D-01,9.3473D-01,8.9976D-01,8.6898D-01,8.4068D-01,8.1374D-01, + &7.8714D-01,7.6011D-01,7.3262D-01,7.3148D-01,6.9170D-01,6.5270D-01, + &6.1357D-01,5.7426D-01,5.3417D-01,4.9316D-01,4.5166D-01,4.0914D-01, + &3.6649D-01,3.2429D-01,2.7651D-01,0.0000D+00,9.7091D+01,9.1127D+01, + &8.5440D+01,7.9869D+01,7.4603D+01,6.9275D+01,6.4220D+01,5.9343D+01, + &5.4780D+01,5.0195D+01,4.5912D+01,4.1816D+01,3.8028D+01,3.5857D+01, + &3.3637D+01,3.1205D+01,2.8880D+01,2.6695D+01,2.4601D+01,2.2923D+01, + &2.1219D+01,1.9374D+01,1.7634D+01,1.6009D+01,1.4488D+01,1.3276D+01, + &1.2064D+01,1.0772D+01,9.5709D+00,8.4795D+00,7.4649D+00,6.6775D+00, + &5.9046D+00,5.1015D+00,4.3733D+00,3.7372D+00,3.1677D+00,2.7434D+00, + &2.3459D+00,1.9566D+00,1.6317D+00,1.4368D+00,1.2699D+00,1.1572D+00, + &1.0581D+00,9.8558D-01,9.2913D-01,8.8297D-01,8.4349D-01,8.0862D-01, + &7.7667D-01,7.4686D-01,7.1760D-01,6.8906D-01,6.6005D-01,6.5493D-01, + &6.1209D-01,5.7080D-01,5.3038D-01,4.9085D-01,4.5137D-01,4.1231D-01, + &3.7316D-01,3.3442D-01,2.9613D-01,2.5928D-01,2.1912D-01,0.0000D+00, + &1.1660D+02,1.0899D+02,1.0178D+02,9.4752D+01,8.8142D+01,8.1480D+01/ + DATA (XGF_L(K),K= 1027, 1140) / + &7.5219D+01,6.9198D+01,6.3578D+01,5.7986D+01,5.2800D+01,4.7867D+01, + &4.3328D+01,4.0736D+01,3.8088D+01,3.5213D+01,3.2469D+01,2.9907D+01, + &2.7451D+01,2.5501D+01,2.3516D+01,2.1392D+01,1.9391D+01,1.7546D+01, + &1.5800D+01,1.4426D+01,1.3057D+01,1.1607D+01,1.0266D+01,9.0517D+00, + &7.9294D+00,7.0617D+00,6.2165D+00,5.3397D+00,4.5572D+00,3.8687D+00, + &3.2598D+00,2.8078D+00,2.3859D+00,1.9745D+00,1.6317D+00,1.4267D+00, + &1.2497D+00,1.1305D+00,1.0247D+00,9.4657D-01,8.8556D-01,8.3542D-01, + &7.9253D-01,7.5465D-01,7.2037D-01,6.8840D-01,6.5775D-01,6.2793D-01, + &5.9852D-01,5.9015D-01,5.4553D-01,5.0339D-01,4.6306D-01,4.2411D-01, + &3.8622D-01,3.4909D-01,3.1294D-01,2.7773D-01,2.4373D-01,2.1150D-01, + &1.7848D-01,0.0000D+00,1.3738D+02,1.2796D+02,1.1904D+02,1.1042D+02, + &1.0233D+02,9.4222D+01,8.6662D+01,7.9409D+01,7.2655D+01,6.6001D+01, + &5.9833D+01,5.4007D+01,4.8672D+01,4.5642D+01,4.2552D+01,3.9214D+01, + &3.6040D+01,3.3082D+01,3.0272D+01,2.8026D+01,2.5779D+01,2.3361D+01, + &2.1093D+01,1.9009D+01,1.7062D+01,1.5526D+01,1.4003D+01,1.2396D+01, + &1.0916D+01,9.5845D+00,8.3611D+00,7.4188D+00,6.5021D+00,5.5589D+00, + &4.7169D+00,3.9865D+00,3.3389D+00,2.8617D+00,2.4178D+00,1.9872D+00, + &1.6283D+00,1.4143D+00,1.2296D+00,1.1049D+00,9.9315D-01,9.1079D-01, + &8.4623D-01,7.9317D-01,7.4768D-01,7.0802D-01,6.7178D-01,6.3836D-01/ + DATA (XGF_L(K),K= 1141, 1254) / + &6.0703D-01,5.7658D-01,5.4733D-01,5.3630D-01,4.9100D-01,4.4879D-01, + &4.0920D-01,3.7138D-01,3.3521D-01,3.0054D-01,2.6721D-01,2.3523D-01, + &2.0485D-01,1.7634D-01,1.4852D-01,0.0000D+00,1.6103D+02,1.4938D+02, + &1.3848D+02,1.2798D+02,1.1818D+02,1.0840D+02,9.9309D+01,9.0651D+01, + &8.2647D+01,7.4733D+01,6.7469D+01,6.0672D+01,5.4433D+01,5.0913D+01, + &4.7343D+01,4.3482D+01,3.9833D+01,3.6452D+01,3.3242D+01,3.0689D+01, + &2.8134D+01,2.5404D+01,2.2863D+01,2.0531D+01,1.8362D+01,1.6652D+01, + &1.4967D+01,1.3197D+01,1.1573D+01,1.0120D+01,8.7877D+00,7.7679D+00, + &6.7819D+00,5.7685D+00,4.8731D+00,4.0967D+00,3.4122D+00,2.9097D+00, + &2.4451D+00,1.9953D+00,1.6222D+00,1.3995D+00,1.2076D+00,1.0771D+00, + &9.6151D-01,8.7563D-01,8.0819D-01,7.5269D-01,7.0548D-01,6.6395D-01, + &6.2666D-01,5.9253D-01,5.6034D-01,5.3005D-01,5.0122D-01,4.8790D-01, + &4.4273D-01,4.0115D-01,3.6251D-01,3.2632D-01,2.9224D-01,2.5988D-01, + &2.2931D-01,2.0039D-01,1.7324D-01,1.4805D-01,1.2201D-01,0.0000D+00, + &1.8591D+02,1.7193D+02,1.5886D+02,1.4632D+02,1.3469D+02,1.2310D+02, + &1.1237D+02,1.0218D+02,9.2839D+01,8.3643D+01,7.5256D+01,6.7382D+01, + &6.0231D+01,5.6204D+01,5.2127D+01,4.7743D+01,4.3601D+01,3.9784D+01, + &3.6172D+01,3.3310D+01,3.0455D+01,2.7410D+01,2.4579D+01,2.2009D+01, + &1.9599D+01,1.7727D+01,1.5886D+01,1.3956D+01,1.2193D+01,1.0620D+01/ + DATA (XGF_L(K),K= 1255, 1368) / + &9.1866D+00,8.0925D+00,7.0383D+00,5.9623D+00,5.0119D+00,4.1917D+00, + &3.4750D+00,2.9503D+00,2.4663D+00,1.9999D+00,1.6141D+00,1.3840D+00, + &1.1856D+00,1.0518D+00,9.3192D-01,8.4324D-01,7.7348D-01,7.1642D-01, + &6.6779D-01,6.2531D-01,5.8732D-01,5.5231D-01,5.2039D-01,4.9037D-01, + &4.6218D-01,4.4711D-01,4.0225D-01,3.6159D-01,3.2438D-01,2.8982D-01, + &2.5765D-01,2.2765D-01,1.9954D-01,1.7331D-01,1.4889D-01,1.2621D-01, + &9.6984D-02,0.0000D+00,2.1269D+02,1.9609D+02,1.8060D+02,1.6582D+02, + &1.5214D+02,1.3863D+02,1.2613D+02,1.1431D+02,1.0351D+02,9.2957D+01, + &8.3294D+01,7.4318D+01,6.6188D+01,6.1617D+01,5.7019D+01,5.2073D+01, + &4.7428D+01,4.3153D+01,3.9122D+01,3.5941D+01,3.2764D+01,2.9404D+01, + &2.6282D+01,2.3458D+01,2.0836D+01,1.8796D+01,1.6786D+01,1.4693D+01, + &1.2792D+01,1.1101D+01,9.5678D+00,8.4010D+00,7.2773D+00,6.1402D+00, + &5.1403D+00,4.2791D+00,3.5311D+00,2.9851D+00,2.4835D+00,2.0017D+00, + &1.6039D+00,1.3677D+00,1.1646D+00,1.0265D+00,9.0375D-01,8.1271D-01, + &7.4135D-01,6.8280D-01,6.3328D-01,5.9018D-01,5.5184D-01,5.1677D-01, + &4.8494D-01,4.5537D-01,4.2797D-01,4.1146D-01,3.6736D-01,3.2788D-01, + &2.9207D-01,2.5923D-01,2.2901D-01,2.0110D-01,1.7527D-01,1.5131D-01, + &1.2926D-01,1.0839D-01,6.9776D-02,0.0000D+00,2.4043D+02,2.2104D+02, + &2.0300D+02,1.8582D+02,1.7003D+02,1.5443D+02,1.4007D+02,1.2658D+02/ + DATA (XGF_L(K),K= 1369, 1482) / + &1.1426D+02,1.0227D+02,9.1332D+01,8.1197D+01,7.2119D+01,6.6989D+01, + &6.1846D+01,5.6342D+01,5.1188D+01,4.6448D+01,4.2002D+01,3.8498D+01, + &3.5016D+01,3.1335D+01,2.7931D+01,2.4848D+01,2.2009D+01,1.9797D+01, + &1.7637D+01,1.5389D+01,1.3354D+01,1.1550D+01,9.9187D+00,8.6824D+00, + &7.4988D+00,6.3022D+00,5.2549D+00,4.3589D+00,3.5788D+00,3.0139D+00, + &2.4962D+00,2.0005D+00,1.5931D+00,1.3514D+00,1.1435D+00,1.0028D+00, + &8.7751D-01,7.8479D-01,7.1218D-01,6.5272D-01,6.0250D-01,5.5920D-01, + &5.2061D-01,4.8590D-01,4.5422D-01,4.2519D-01,3.9858D-01,3.8094D-01, + &3.3789D-01,2.9975D-01,2.6524D-01,2.3401D-01,2.0560D-01,1.7956D-01, + &1.5565D-01,1.3374D-01,1.1354D-01,9.4096D-02,3.9275D-02,0.0000D+00, + &2.8195D+02,2.5830D+02,2.3640D+02,2.1554D+02,1.9645D+02,1.7774D+02, + &1.6058D+02,1.4448D+02,1.2990D+02,1.1575D+02,1.0299D+02,9.1121D+01, + &8.0574D+01,7.4642D+01,6.8724D+01,6.2402D+01,5.6498D+01,5.1101D+01, + &4.6042D+01,4.2081D+01,3.8152D+01,3.4014D+01,3.0201D+01,2.6780D+01, + &2.3611D+01,2.1171D+01,1.8789D+01,1.6329D+01,1.4107D+01,1.2148D+01, + &1.0386D+01,9.0557D+00,7.7874D+00,6.5118D+00,5.4006D+00,4.4539D+00, + &3.6370D+00,3.0467D+00,2.5088D+00,1.9959D+00,1.5762D+00,1.3274D+00, + &1.1142D+00,9.7065D-01,8.4265D-01,7.4825D-01,6.7451D-01,6.1445D-01, + &5.6374D-01,5.2024D-01,4.8166D-01,4.4741D-01,4.1643D-01,3.8830D-01/ + DATA (XGF_L(K),K= 1483, 1596) / + &3.6282D-01,3.4411D-01,3.0249D-01,2.6607D-01,2.3369D-01,2.0474D-01, + &1.7852D-01,1.5489D-01,1.3341D-01,1.1384D-01,9.5862D-02,7.7509D-02, + &0.0000D+00,0.0000D+00,3.2379D+02,2.9556D+02,2.6960D+02,2.4513D+02, + &2.2265D+02,2.0073D+02,1.8071D+02,1.6202D+02,1.4515D+02,1.2887D+02, + &1.1419D+02,1.0071D+02,8.8650D+01,8.1931D+01,7.5233D+01,6.8140D+01, + &6.1510D+01,5.5467D+01,4.9832D+01,4.5419D+01,4.1070D+01,3.6493D+01, + &3.2295D+01,2.8536D+01,2.5086D+01,2.2426D+01,1.9846D+01,1.7175D+01, + &1.4781D+01,1.2681D+01,1.0797D+01,9.3831D+00,8.0380D+00,6.6897D+00, + &5.5221D+00,4.5337D+00,3.6831D+00,3.0714D+00,2.5159D+00,1.9884D+00, + &1.5586D+00,1.3048D+00,1.0886D+00,9.4191D-01,8.1217D-01,7.1679D-01, + &6.4238D-01,5.8194D-01,5.3136D-01,4.8766D-01,4.4965D-01,4.1594D-01, + &3.8570D-01,3.5847D-01,3.3403D-01,3.1456D-01,2.7454D-01,2.3977D-01, + &2.0922D-01,1.8216D-01,1.5795D-01,1.3622D-01,1.1669D-01,9.9012D-02, + &8.2668D-02,6.4604D-02,0.0000D+00,0.0000D+00,3.7071D+02,3.3727D+02, + &3.0660D+02,2.7790D+02,2.5169D+02,2.2608D+02,2.0283D+02,1.8123D+02, + &1.6179D+02,1.4311D+02,1.2635D+02,1.1097D+02,9.7357D+01,8.9759D+01, + &8.2263D+01,7.4239D+01,6.6821D+01,6.0073D+01,5.3813D+01,4.8927D+01, + &4.4114D+01,3.9072D+01,3.4471D+01,3.0351D+01,2.6592D+01,2.3699D+01, + &2.0903D+01,1.8031D+01,1.5459D+01,1.3211D+01,1.1204D+01,9.7024D+00/ + DATA (XGF_L(K),K= 1597, 1710) / + &8.2828D+00,6.8644D+00,5.6367D+00,4.6059D+00,3.7241D+00,3.0915D+00, + &2.5189D+00,1.9786D+00,1.5396D+00,1.2816D+00,1.0611D+00,9.1306D-01, + &7.8207D-01,6.8594D-01,6.1118D-01,5.5075D-01,5.0031D-01,4.5732D-01, + &4.1996D-01,3.8671D-01,3.5732D-01,3.3101D-01,3.0775D-01,2.8769D-01, + &2.4931D-01,2.1637D-01,1.8763D-01,1.6241D-01,1.4002D-01,1.2013D-01, + &1.0238D-01,8.6311D-02,7.1348D-02,5.2982D-02,0.0000D+00,0.0000D+00, + &4.2142D+02,3.8237D+02,3.4660D+02,3.1292D+02,2.8259D+02,2.5300D+02, + &2.2626D+02,2.0148D+02,1.7927D+02,1.5797D+02,1.3896D+02,1.2163D+02, + &1.0632D+02,9.7858D+01,8.9366D+01,8.0488D+01,7.2234D+01,6.4771D+01, + &5.7843D+01,5.2468D+01,4.7182D+01,4.1663D+01,3.6633D+01,3.2165D+01, + &2.8082D+01,2.4971D+01,2.1960D+01,1.8866D+01,1.6118D+01,1.3723D+01, + &1.1595D+01,1.0008D+01,8.5101D+00,7.0232D+00,5.7443D+00,4.6705D+00, + &3.7584D+00,3.1066D+00,2.5189D+00,1.9659D+00,1.5193D+00,1.2575D+00, + &1.0346D+00,8.8517D-01,7.5338D-01,6.5695D-01,5.8219D-01,5.2200D-01, + &4.7218D-01,4.2954D-01,3.9258D-01,3.6043D-01,3.3190D-01,3.0663D-01, + &2.8431D-01,2.6413D-01,2.2746D-01,1.9612D-01,1.6912D-01,1.4557D-01, + &1.2488D-01,1.0660D-01,9.0362D-02,7.5731D-02,6.1890D-02,4.2720D-02, + &0.0000D+00,0.0000D+00,4.7166D+02,4.2676D+02,3.8580D+02,3.4749D+02, + &3.1273D+02,2.7927D+02,2.4899D+02,2.2108D+02,1.9611D+02,1.7230D+02/ + DATA (XGF_L(K),K= 1711, 1824) / + &1.5107D+02,1.3178D+02,1.1483D+02,1.0548D+02,9.6179D+01,8.6383D+01, + &7.7331D+01,6.9156D+01,6.1613D+01,5.5763D+01,5.0019D+01,4.4056D+01, + &3.8633D+01,3.3819D+01,2.9446D+01,2.6108D+01,2.2889D+01,1.9617D+01, + &1.6706D+01,1.4179D+01,1.1938D+01,1.0276D+01,8.7112D+00,7.1630D+00, + &5.8345D+00,4.7275D+00,3.7856D+00,3.1171D+00,2.5164D+00,1.9532D+00, + &1.4997D+00,1.2350D+00,1.0108D+00,8.6027D-01,7.2804D-01,6.3166D-01, + &5.5726D-01,4.9745D-01,4.4802D-01,4.0623D-01,3.7002D-01,3.3850D-01, + &3.1081D-01,2.8644D-01,2.6509D-01,2.4476D-01,2.0951D-01,1.7979D-01, + &1.5426D-01,1.3217D-01,1.1290D-01,9.5951D-02,8.0975D-02,6.7483D-02, + &5.4483D-02,3.4309D-02,0.0000D+00,0.0000D+00,5.2745D+02,4.7595D+02, + &4.2900D+02,3.8543D+02,3.4589D+02,3.0795D+02,2.7377D+02,2.4235D+02, + &2.1434D+02,1.8771D+02,1.6408D+02,1.4266D+02,1.2392D+02,1.1358D+02, + &1.0335D+02,9.2593D+01,8.2702D+01,7.3780D+01,6.5553D+01,5.9207D+01, + &5.2983D+01,4.6535D+01,4.0700D+01,3.5531D+01,3.0842D+01,2.7278D+01, + &2.3855D+01,2.0386D+01,1.7301D+01,1.4635D+01,1.2282D+01,1.0538D+01, + &8.9065D+00,7.2932D+00,5.9178D+00,4.7769D+00,3.8086D+00,3.1240D+00, + &2.5114D+00,1.9387D+00,1.4794D+00,1.2125D+00,9.8604D-01,8.3538D-01, + &7.0309D-01,6.0683D-01,5.3289D-01,4.7378D-01,4.2493D-01,3.8387D-01, + &3.4846D-01,3.1778D-01,2.9097D-01,2.6744D-01,2.4699D-01,2.2688D-01/ + DATA (XGF_L(K),K= 1825, 1836) / + &1.9308D-01,1.6489D-01,1.4079D-01,1.2009D-01,1.0214D-01,8.6447D-02, + &7.2603D-02,6.0131D-02,4.7893D-02,2.6613D-02,0.0000D+00,0.0000D+00/ + +* + X = Xinp +*...CHECK OF X AND Q2 VALUES : + IF ( (X.LT.0.99D-9) .OR. (X.GT.1.D0) ) THEN +* WRITE(6,91) X +* 91 FORMAT (2X,'PHO_DOR98LO: x out of range',1p,E12.4) + X = 0.99D-9 +* STOP + ENDIF + + Q2 = Q2inp + IF ( (Q2.LT.0.799D0) .OR. (Q2.GT.1.E6) ) THEN +* WRITE(6,92) Q2 +* 92 FORMAT (2X,'PHO_DOR98LO: Q2 out of range',1p,E12.4) + Q2 = 0.99D6 +* STOP + ENDIF + +* +*...INTERPOLATION : + NA(1) = NX + NA(2) = NQ + XT(1) = DLOG(X) + XT(2) = DLOG(Q2) + X1 = 1.D0- X + XV = X**0.5D0 + XS = X**(-0.2D0) + UV = SIB_DBFINT(NARG,XT,NA,ARRF,XUVF) * X1**3 * XV + DV = SIB_DBFINT(NARG,XT,NA,ARRF,XDVF) * X1**4 * XV + DE = SIB_DBFINT(NARG,XT,NA,ARRF,XDEF) * X1**7 * XV + UD = SIB_DBFINT(NARG,XT,NA,ARRF,XUDF) * X1**7 * XS + US = 0.5D0 * (UD - DE) + DS = 0.5D0 * (UD + DE) + SS = SIB_DBFINT(NARG,XT,NA,ARRF,XSF) * X1**7 * XS + GL = SIB_DBFINT(NARG,XT,NA,ARRF,XGF) * X1**5 * XS + + END diff --git a/dependencies/sibyll/sibyll2.3d.hpp b/dependencies/sibyll/sibyll2.3d.hpp new file mode 100644 index 000000000..9d6b1942c --- /dev/null +++ b/dependencies/sibyll/sibyll2.3d.hpp @@ -0,0 +1,120 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +/** + * \function sibyll::rndm_interface + * + * this is the random number hook to external packages. + * + * CORSIKA8, for example, has to provide an implementation of this. + **/ +namespace sibyll { + extern double rndm_interface(); +} + +//---------------------------------------------- +// C++ interface for the SIBYLL event generator +//---------------------------------------------- +// wrapper + +extern "C" { + +typedef char s_name[6]; + + /** + \struct s_plist_ + + SIBYLL particle stack (FORTRAN COMMON) + variables are: np : numer of particles on stack + p : 4momentum + mass of particles on stack + llist : id of particles on stack + **/ +extern struct { + double p[5][8000]; + int llist[8000]; + int np; +} s_plist_; + +// additional information about interactions. +// number of wounded nucleons, number of hard and soft scatterings etc. +extern struct { int nnsof[20], nnjet[20], jdif[20], nwd, njet, nsof; } s_chist_; + +extern struct { + double cbr[223 + 16 + 12 + 8]; + int kdec[1338 + 6 * (16 + 12 + 8)]; + int lbarp[99]; + int idb[99]; +} s_csydec_; + +// additional particle stack for the mother particles of unstable particles +// stable particles have entry zero +extern struct { int llist1[8000]; } s_plist1_; + +// tables with particle properties +// charge, strangeness and baryon number +extern struct { + int ichp[99]; + int istr[99]; + int ibar[99]; +} s_chp_; + +// tables with particle properties +// mass and mass squared +extern struct { + double am[99]; + double am2[99]; +} s_mass1_; + +// table with particle names +extern struct { char namp[6][99]; } s_cnam_; + +// debug info +extern struct { + int ncall; + int ndebug; + int lun; +} s_debug_; + +// lund random generator setup +// extern struct {int mrlu[6]; float rrlu[100]; }ludatr_; + +// sibyll main subroutine +void sibyll_(const int&, const int&, const double&); + +// subroutine to initiate sibyll +void sibyll_ini_(); + +// subroutine to SET DECAYS +void dec_ini_(); + +// subroutine to initiate random number generator +// void rnd_ini_(); + +// print event +void sib_list_(int&); + +// decay routine +void decsib_(); + +// interaction length +// double fpni_(double&, int&); + +void sib_sigma_hnuc_(const int&, const int&, const double&, double&, double&, double&); +void sib_sigma_hp_(const int&, const double&, double&, double&, double&, double*, double&, + double&); + +double s_rndm_(int&); + +int get_nwounded(); +double get_sibyll_mass2(int&); + +// phojet random generator setup +void pho_rndin_(int&, int&, int&, int&); +} diff --git a/Processes/Sibyll/signuc.f b/dependencies/sibyll/signuc.f similarity index 100% rename from Processes/Sibyll/signuc.f rename to dependencies/sibyll/signuc.f diff --git a/do-copyright.py b/do-copyright.py index adc278d11..ec10db429 100755 --- a/do-copyright.py +++ b/do-copyright.py @@ -21,8 +21,8 @@ Debug settings are 0: nothing, 1: checking, 2: filesystem """ Debug = 0 -excludeDirs = ["modules", "git", "build", "install", "externals"] -excludeFiles = ['PhysicalConstants.h','CorsikaFenvOSX.cc', 'sgn.h', 'quartic.h'] +excludeDirs = ["ThirdParty", "externals", "dependencies", "git"] +excludeFiles = ['PhysicalConstants.h','CorsikaFenvOSX.cc', 'sgn.h'] extensions = [".cpp", ".hpp"] diff --git a/Documentation/Doxygen/Doxyfile.in b/documentation/Doxyfile.in similarity index 96% rename from Documentation/Doxygen/Doxyfile.in rename to documentation/Doxyfile.in index b733d0925..355d1903b 100644 --- a/Documentation/Doxygen/Doxyfile.in +++ b/documentation/Doxyfile.in @@ -1,4 +1,4 @@ -PROJECT_NAME = CORSIKA 8 +ePROJECT_NAME = CORSIKA 8 PROJECT_NUMBER = 0.0.0 GENERATE_HTML = YES diff --git a/Documentation/Examples/CMakeLists.txt b/examples/CMakeLists.txt similarity index 100% rename from Documentation/Examples/CMakeLists.txt rename to examples/CMakeLists.txt diff --git a/Documentation/Examples/boundary_example.cc b/examples/boundary_example.cc similarity index 81% rename from Documentation/Examples/boundary_example.cc rename to examples/boundary_example.cc index ed9d7bd43..addd6f4a9 100644 --- a/Documentation/Examples/boundary_example.cc +++ b/examples/boundary_example.cc @@ -6,18 +6,15 @@ * the license. */ -#include <corsika/cascade/Cascade.h> -#include <corsika/process/ProcessSequence.h> +#include <corsika/framework/core/Cascade.hpp> +#include <corsika/framework/sequence/ProcessSequence.hpp> +#include <corsika/process/tracking_line/TrackingLine.hpp> -#include <corsika/setup/SetupEnvironment.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> +#include <corsika/media/Environment.hpp> +#include <corsika/media/HomogeneousMedium.hpp> +#include <corsika/media/NuclearComposition.hpp> -#include <corsika/environment/Environment.h> -#include <corsika/environment/HomogeneousMedium.h> -#include <corsika/environment/NuclearComposition.h> - -#include <corsika/geometry/Sphere.h> +#include <corsika/framework/geometry/Sphere.hpp> #include <corsika/process/sibyll/Decay.h> #include <corsika/process/sibyll/Interaction.h> @@ -25,13 +22,13 @@ #include <corsika/process/track_writer/TrackWriter.h> -#include <corsika/process/particle_cut/ParticleCut.h> +#include <corsika/process/particle_cut/ParticleCut.hpp> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> -#include <corsika/random/RNGManager.h> +#include <corsika/framework/random/RNGManager.hpp> -#include <corsika/utl/CorsikaFenv.h> +#include <corsika/framework/utility/CorsikaFenv.hpp> #include <corsika/logging/Logging.h> @@ -39,12 +36,17 @@ #include <limits> #include <typeinfo> +#include "../../corsika/setup/SetupEnvironment.hpp" +#include "../../corsika/setup/SetupStack.hpp" +#include "../../corsika/setup/SetupTrajectory.hpp" + +using namespace corsika; using namespace corsika; -using namespace corsika::process; using namespace corsika::units; -using namespace corsika::particles; -using namespace corsika::random; -using namespace corsika::geometry; +using namespace corsika; +using namespace corsika; +using namespace corsika; +using namespace corsika; using namespace corsika::environment; using namespace std; @@ -161,17 +163,14 @@ int main() { }; auto const [px, py, pz] = momentumComponents(theta / 180. * M_PI, phi / 180. * M_PI, P0); - auto plab = corsika::stack::MomentumVector(rootCS, {px, py, pz}); - C8LOG_INFO( - "input particle: {} " - "input angles: theta={} phi={}" - "input momentum: {} GeV", - beamCode, theta, phi, plab.GetComponents() / 1_GeV); - // shoot particles from inside target out + auto plab = corsika::MomentumVector(rootCS, {px, py, pz}); + cout << "input particle: " << beamCode << endl; + cout << "input angles: theta=" << theta << " phi=" << phi << endl; + cout << "input momentum: " << plab.GetComponents() / 1_GeV << endl; Point pos(rootCS, 0_m, 0_m, 0_m); stack.AddParticle( std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ + corsika::MomentumVector, geometry::Point, units::si::TimeType>{ beamCode, E0, plab, pos, 0_ns}); } diff --git a/Documentation/Examples/cascade_example.cc b/examples/cascade_example.cc similarity index 82% rename from Documentation/Examples/cascade_example.cc rename to examples/cascade_example.cc index 8b9b5b8ad..1915125f1 100644 --- a/Documentation/Examples/cascade_example.cc +++ b/examples/cascade_example.cc @@ -6,45 +6,46 @@ * the license. */ -#include <corsika/cascade/Cascade.h> -#include <corsika/process/ProcessSequence.h> -#include <corsika/process/energy_loss/EnergyLoss.h> -#include <corsika/process/stack_inspector/StackInspector.h> -#include <corsika/setup/SetupEnvironment.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> +#include <corsika/framework/core/Cascade.hpp> +#include <corsika/framework/sequence/ProcessSequence.hpp> +#include <corsika/process/energy_loss/EnergyLoss.h> +#include <corsika/process/stack_inspector/StackInspector.hpp> +#include <corsika/process/tracking_line/TrackingLine.hpp> -#include <corsika/environment/Environment.h> -#include <corsika/environment/HomogeneousMedium.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/environment/ShowerAxis.h> +#include <corsika/media/Environment.hpp> +#include <corsika/media/HomogeneousMedium.hpp> +#include <corsika/media/NuclearComposition.hpp> -#include <corsika/geometry/Sphere.h> +#include <corsika/framework/geometry/Sphere.hpp> #include <corsika/process/sibyll/Decay.h> #include <corsika/process/sibyll/Interaction.h> #include <corsika/process/sibyll/NuclearInteraction.h> -#include <corsika/process/particle_cut/ParticleCut.h> +#include <corsika/process/particle_cut/ParticleCut.hpp> #include <corsika/process/track_writer/TrackWriter.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> -#include <corsika/random/RNGManager.h> +#include <corsika/framework/random/RNGManager.hpp> -#include <corsika/utl/CorsikaFenv.h> -#include <corsika/logging/Logging.h> +#include <corsika/framework/utility/CorsikaFenv.hpp> #include <iostream> #include <limits> +#include "../../corsika/setup/SetupEnvironment.hpp" +#include "../../corsika/setup/SetupStack.hpp" +#include "../../corsika/setup/SetupTrajectory.hpp" + +using namespace corsika; using namespace corsika; -using namespace corsika::process; using namespace corsika::units; -using namespace corsika::particles; -using namespace corsika::random; -using namespace corsika::geometry; +using namespace corsika; +using namespace corsika; +using namespace corsika; +using namespace corsika; using namespace corsika::environment; using namespace std; @@ -125,13 +126,13 @@ int main() { }; auto const [px, py, pz] = momentumComponents(theta / 180. * M_PI, phi / 180. * M_PI, P0); - auto plab = corsika::stack::MomentumVector(rootCS, {px, py, pz}); + auto plab = corsika::MomentumVector(rootCS, {px, py, pz}); cout << "input particle: " << beamCode << endl; cout << "input angles: theta=" << theta << " phi=" << phi << endl; cout << "input momentum: " << plab.GetComponents() / 1_GeV << endl; stack.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, - units::si::TimeType, unsigned short, unsigned short>{ + corsika::MomentumVector, geometry::Point, + units::si::TimeType, unsigned short, unsigned short>{ beamCode, E0, plab, injectionPos, 0_ns, nuclA, nuclZ}); } diff --git a/Documentation/Examples/cascade_proton_example.cc b/examples/cascade_proton_example.cc similarity index 80% rename from Documentation/Examples/cascade_proton_example.cc rename to examples/cascade_proton_example.cc index b36239219..3512cac6a 100644 --- a/Documentation/Examples/cascade_proton_example.cc +++ b/examples/cascade_proton_example.cc @@ -6,21 +6,17 @@ * the license. */ -#include <corsika/cascade/Cascade.h> -#include <corsika/process/ProcessSequence.h> +#include <corsika/framework/core/Cascade.hpp> +#include <corsika/framework/sequence/ProcessSequence.hpp> #include <corsika/process/hadronic_elastic_model/HadronicElasticModel.h> -#include <corsika/process/stack_inspector/StackInspector.h> -#include <corsika/process/energy_loss/EnergyLoss.h> +#include <corsika/process/stack_inspector/StackInspector.hpp> +#include <corsika/process/tracking_line/TrackingLine.hpp> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> +#include <corsika/media/Environment.hpp> +#include <corsika/media/HomogeneousMedium.hpp> +#include <corsika/media/NuclearComposition.hpp> -#include <corsika/environment/Environment.h> -#include <corsika/environment/HomogeneousMedium.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/environment/ShowerAxis.h> - -#include <corsika/geometry/Sphere.h> +#include <corsika/framework/geometry/Sphere.hpp> #include <corsika/process/sibyll/Decay.h> #include <corsika/process/sibyll/Interaction.h> @@ -31,26 +27,31 @@ #include <corsika/process/track_writer/TrackWriter.h> -#include <corsika/process/particle_cut/ParticleCut.h> +#include <corsika/process/particle_cut/ParticleCut.hpp> + +#include <corsika/framework/core/PhysicalUnits.hpp> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/random/RNGManager.hpp> -#include <corsika/random/RNGManager.h> +#include <corsika/framework/utility/CorsikaFenv.hpp> -#include <corsika/utl/CorsikaFenv.h> +#include <boost/type_index.hpp> -#include <corsika/logging/Logging.h> +#include "../../corsika/setup/SetupStack.hpp" +#include "../../corsika/setup/SetupTrajectory.hpp" +using boost::typeindex::type_id_with_cvr; #include <iostream> #include <limits> #include <typeinfo> using namespace corsika; -using namespace corsika::process; +using namespace corsika; using namespace corsika::units; -using namespace corsika::particles; -using namespace corsika::random; -using namespace corsika::geometry; +using namespace corsika; +using namespace corsika; +using namespace corsika; +using namespace corsika; using namespace corsika::environment; using namespace std; @@ -111,14 +112,14 @@ int main() { }; auto const [px, py, pz] = momentumComponents(theta / 180. * M_PI, phi / 180. * M_PI, P0); - auto plab = corsika::stack::MomentumVector(rootCS, {px, py, pz}); + auto plab = corsika::MomentumVector(rootCS, {px, py, pz}); cout << "input particle: " << beamCode << endl; cout << "input angles: theta=" << theta << " phi=" << phi << endl; cout << "input momentum: " << plab.GetComponents() / 1_GeV << endl; stack.AddParticle( std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ - beamCode, E0, plab, injectionPos, 0_ns}); + corsika::MomentumVector, geometry::Point, units::si::TimeType>{ + beamCode, E0, plab, pos, 0_ns}); } // setup processes, decays and interactions diff --git a/Documentation/Examples/geometry_example.cc b/examples/geometry_example.cpp similarity index 90% rename from Documentation/Examples/geometry_example.cc rename to examples/geometry_example.cpp index da23d81e0..751ac316e 100644 --- a/Documentation/Examples/geometry_example.cc +++ b/examples/geometry_example.cpp @@ -6,18 +6,18 @@ * the license. */ -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Sphere.h> -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Sphere.hpp> +#include <corsika/framework/geometry/Vector.hpp> #include <cstdlib> #include <iostream> #include <typeinfo> using namespace corsika; -using namespace corsika::geometry; +using namespace corsika; using namespace corsika::units::si; int main() { diff --git a/Documentation/Examples/helix_example.cc b/examples/helix_example.cpp similarity index 83% rename from Documentation/Examples/helix_example.cc rename to examples/helix_example.cpp index 9f3eba67e..b45252574 100644 --- a/Documentation/Examples/helix_example.cc +++ b/examples/helix_example.cpp @@ -6,17 +6,17 @@ * the license. */ -#include <corsika/geometry/Helix.h> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> #include <array> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Helix.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> #include <cstdlib> #include <iostream> using namespace corsika; -using namespace corsika::geometry; +using namespace corsika; using namespace corsika::units::si; int main() { diff --git a/examples/stack_example.cpp b/examples/stack_example.cpp new file mode 100644 index 000000000..f4966c283 --- /dev/null +++ b/examples/stack_example.cpp @@ -0,0 +1,55 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/stack/super_stupid/SuperStupidStack.h> +#include <corsika/framework/core/ParticleProperties.hpp> + +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> + +#include <cassert> +#include <iomanip> +#include <iostream> + +using namespace corsika; +using namespace corsika::units::si; +using namespace corsika; +using namespace corsika; +using namespace std; + +void fill(corsika::super_stupid::SuperStupidStack& s) { + const geometry::CoordinateSystem& rootCS = + geometry::RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + for (int i = 0; i < 11; ++i) { + s.AddParticle(std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + geometry::Point, units::si::TimeType>{ + Code::Electron, 1.5_GeV * i, + corsika::MomentumVector(rootCS, {0_GeV, 0_GeV, 1_GeV}), + geometry::Point(rootCS, 0_m, 0_m, 0_m), 0_ns}); + } +} + +void read(corsika::super_stupid::SuperStupidStack& s) { + assert(s.GetSize() == 11); // stack has 11 particles + + HEPEnergyType total_energy; + int i = 0; + for (auto& p : s) { + total_energy += p.GetEnergy(); + // particles are electrons with 1.5 GeV energy times i + assert(p.GetPID() == Code::Electron); + assert(p.GetEnergy() == 1.5_GeV * (i++)); + } +} + +int main() { + corsika::super_stupid::SuperStupidStack s; + fill(s); + read(s); + return 0; +} diff --git a/Documentation/Examples/staticsequence_example.cc b/examples/staticsequence_example.cpp similarity index 90% rename from Documentation/Examples/staticsequence_example.cc rename to examples/staticsequence_example.cpp index 659a3d6c2..ffeed210c 100644 --- a/Documentation/Examples/staticsequence_example.cc +++ b/examples/staticsequence_example.cpp @@ -10,15 +10,15 @@ #include <iomanip> #include <iostream> -#include <corsika/process/ProcessSequence.h> +#include <corsika/framework/sequence/ProcessSequence.hpp> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> using namespace corsika; using namespace corsika::units::si; -using namespace corsika::process; +using namespace corsika; using namespace std; const int nData = 10; diff --git a/Documentation/Examples/stopping_power.cc b/examples/stopping_power.cc similarity index 81% rename from Documentation/Examples/stopping_power.cc rename to examples/stopping_power.cc index 100594f6a..d6d5bb89e 100644 --- a/Documentation/Examples/stopping_power.cc +++ b/examples/stopping_power.cc @@ -6,24 +6,21 @@ * the license. */ -#include <corsika/environment/Environment.h> -#include <corsika/environment/HomogeneousMedium.h> -#include <corsika/environment/IMediumModel.h> -#include <corsika/environment/ShowerAxis.h> -#include <corsika/geometry/Sphere.h> +#include <corsika/media/Environment.hpp> +#include <corsika/framework/geometry/Sphere.hpp> #include <corsika/process/energy_loss/EnergyLoss.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/units/PhysicalUnits.h> -#include <corsika/utl/CorsikaFenv.h> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/utility/CorsikaFenv.hpp> #include <fstream> #include <iostream> #include <limits> +#include "../../corsika/setup/SetupStack.hpp" using namespace corsika; -using namespace corsika::process; -using namespace corsika::particles; -using namespace corsika::geometry; +using namespace corsika; +using namespace corsika; +using namespace corsika; using namespace corsika::environment; using namespace std; @@ -76,14 +73,14 @@ int main() { }; auto const [px, py, pz] = momentumComponents(theta / 180. * M_PI, phi / 180. * M_PI, P0); - auto plab = corsika::stack::MomentumVector(rootCS, {px, py, pz}); + auto plab = corsika::MomentumVector(rootCS, {px, py, pz}); cout << "input particle: " << beamCode << endl; cout << "input angles: theta=" << theta << " phi=" << phi << endl; cout << "input momentum: " << plab.GetComponents() / 1_GeV << endl; stack.AddParticle( std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ + corsika::MomentumVector, geometry::Point, units::si::TimeType>{ beamCode, E0, plab, injectionPos, 0_ns}); auto const p = stack.GetNextParticle(); diff --git a/Documentation/Examples/vertical_EAS.cc b/examples/vertical_EAS.cc similarity index 81% rename from Documentation/Examples/vertical_EAS.cc rename to examples/vertical_EAS.cc index 6fbed4a73..50071a8f8 100644 --- a/Documentation/Examples/vertical_EAS.cc +++ b/examples/vertical_EAS.cc @@ -6,59 +6,53 @@ * the license. */ -/* clang-format off */ -// InteractionCounter used boost/histogram, which -// fails if boost/type_traits have been included before. Thus, we have -// to include it first... -#include <corsika/process/interaction_counter/InteractionCounter.hpp> -/* clang-format on */ -#include <corsika/cascade/Cascade.h> -#include <corsika/environment/Environment.h> -#include <corsika/environment/FlatExponential.h> -#include <corsika/environment/HomogeneousMedium.h> -#include <corsika/environment/IMagneticFieldModel.h> -#include <corsika/environment/LayeredSphericalAtmosphereBuilder.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/environment/ShowerAxis.h> -#include <corsika/environment/SlidingPlanarExponential.h> -#include <corsika/environment/UniformMagneticField.h> -#include <corsika/geometry/Plane.h> -#include <corsika/geometry/Sphere.h> -#include <corsika/logging/Logging.h> -#include <corsika/process/ProcessSequence.h> -#include <corsika/process/SwitchProcessSequence.h> +#include <corsika/framework/core/Cascade.hpp> +#include <corsika/framework/sequence/ProcessSequence.hpp> #include <corsika/process/StackProcess.h> #include <corsika/process/energy_loss/EnergyLoss.h> -#include <corsika/process/longitudinal_profile/LongitudinalProfile.h> -#include <corsika/process/observation_plane/ObservationPlane.h> -#include <corsika/process/on_shell_check/OnShellCheck.h> -#include <corsika/process/particle_cut/ParticleCut.h> -#include <corsika/process/track_writer/TrackWriter.h> -#include <corsika/process/proposal/ContinuousProcess.h> -#include <corsika/process/proposal/Interaction.h> -#include <corsika/process/pythia/Decay.h> +#include <corsika/process/observation_plane/ObservationPlane.hpp> +#include <corsika/process/particle_cut/ParticleCut.hpp> +#include <corsika/process/switch_process/SwitchProcess.hpp> +#include <corsika/process/tracking_line/TrackingLine.hpp> + +#include <corsika/media/LayeredSphericalAtmosphereBuilder.hpp> +#include <corsika/media/Environment.hpp> +#include <corsika/media/FlatExponential.hpp> +#include <corsika/media/NuclearComposition.hpp> + +#include <corsika/framework/geometry/Plane.hpp> +#include <corsika/framework/geometry/Sphere.hpp> + #include <corsika/process/sibyll/Decay.h> #include <corsika/process/stack_inspector/StackInspector.h> #include <corsika/process/sibyll/Interaction.h> #include <corsika/process/sibyll/NuclearInteraction.h> #include <corsika/process/urqmd/UrQMD.h> -#include <corsika/random/RNGManager.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> -#include <corsika/units/PhysicalUnits.h> -#include <corsika/utl/CorsikaFenv.h> + +#include <corsika/process/particle_cut/ParticleCut.hpp> +#include <corsika/process/track_writer/TrackWriter.h> + +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <corsika/framework/random/RNGManager.hpp> + +#include <corsika/framework/utility/CorsikaFenv.hpp> #include <iomanip> #include <iostream> #include <limits> #include <string> +#include "../../corsika/setup/SetupStack.hpp" +#include "../../corsika/setup/SetupTrajectory.hpp" + +using namespace corsika; using namespace corsika; -using namespace corsika::process; using namespace corsika::units; -using namespace corsika::particles; -using namespace corsika::random; -using namespace corsika::geometry; +using namespace corsika; +using namespace corsika; +using namespace corsika; +using namespace corsika; using namespace corsika::environment; using namespace std; @@ -140,9 +134,9 @@ int main(int argc, char** argv) { auto momentumComponents = [](double thetaRad, HEPMomentumType ptot) { return std::make_tuple(ptot * sin(thetaRad), 0_eV, -ptot * cos(thetaRad)); }; - - auto const [px, py, pz] = momentumComponents(thetaRad, P0); - auto plab = corsika::stack::MomentumVector(rootCS, {px, py, pz}); + auto const [px, py, pz] = + momentumComponents(theta / 180. * M_PI, phi / 180. * M_PI, P0); + auto plab = corsika::MomentumVector(rootCS, {px, py, pz}); cout << "input particle: " << beamCode << endl; cout << "input angles: theta=" << theta << endl; cout << "input momentum: " << plab.GetComponents() / 1_GeV << ", norm = " << plab.norm() @@ -191,10 +185,11 @@ int main(int argc, char** argv) { // setup processes, decays and interactions - process::particle_cut::ParticleCut cut{60_GeV, false, true}; - process::proposal::Interaction proposal(env, cut.GetECut()); - process::proposal::ContinuousProcess em_continuous(env, cut.GetECut()); - process::interaction_counter::InteractionCounter proposalCounted(proposal); + stack.AddParticle( + std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, units::si::TimeType>{ + beamCode, E0, plab, injectionPos, 0_ns}); + // } process::sibyll::Interaction sibyll; process::interaction_counter::InteractionCounter sibyllCounted(sibyll); diff --git a/ThirdParty/catch2/catch.hpp b/externals/catch2/catch2/catch.hpp similarity index 78% rename from ThirdParty/catch2/catch.hpp rename to externals/catch2/catch2/catch.hpp index 02302b8d3..506cfe44d 100644 --- a/ThirdParty/catch2/catch.hpp +++ b/externals/catch2/catch2/catch.hpp @@ -1,9 +1,9 @@ /* - * Catch v2.8.0 - * Generated: 2019-05-26 21:29:22.235281 + * Catch v2.13.2 + * Generated: 2020-10-07 11:32:53.302017 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly - * Copyright (c) 2019 Two Blue Cubes Ltd. All rights reserved. + * Copyright (c) 2020 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -14,8 +14,8 @@ #define CATCH_VERSION_MAJOR 2 -#define CATCH_VERSION_MINOR 8 -#define CATCH_VERSION_PATCH 0 +#define CATCH_VERSION_MINOR 13 +#define CATCH_VERSION_PATCH 2 #ifdef __clang__ # pragma clang system_header @@ -132,36 +132,51 @@ namespace Catch { #endif -#if defined(CATCH_CPP17_OR_GREATER) -# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +// We have to avoid both ICC and Clang, because they try to mask themselves +// as gcc, and we want only GCC in this block +#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" ) + +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) + #endif -#ifdef __clang__ +#if defined(__clang__) + +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" ) + +// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug +// which results in calls to destructors being emitted for each temporary, +// without a matching initialization. In practice, this can result in something +// like `std::string::~string` being called on an uninitialized value. +// +// For example, this code will likely segfault under IBM XL: +// ``` +// REQUIRE(std::string("12") + "34" == "1234") +// ``` +// +// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented. +# if !defined(__ibmxl__) && !defined(__CUDACC__) +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */ +# endif + +# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ + _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") + +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) -# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ - _Pragma( "clang diagnostic push" ) \ - _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ - _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") -# define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ - _Pragma( "clang diagnostic pop" ) - -# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ - _Pragma( "clang diagnostic push" ) \ - _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) -# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ - _Pragma( "clang diagnostic pop" ) - -# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ - _Pragma( "clang diagnostic push" ) \ - _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) -# define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS \ - _Pragma( "clang diagnostic pop" ) - -# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ - _Pragma( "clang diagnostic push" ) \ - _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" ) -# define CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \ - _Pragma( "clang diagnostic pop" ) +# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) + +# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" ) + +# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wunused-template\"" ) #endif // __clang__ @@ -186,6 +201,7 @@ namespace Catch { // Android somehow still does not support std::to_string #if defined(__ANDROID__) # define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING +# define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE #endif //////////////////////////////////////////////////////////////////////////////// @@ -210,20 +226,19 @@ namespace Catch { // some versions of cygwin (most) do not support std::to_string. Use the libstd check. // https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813 # if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \ - && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) + && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) -# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING +# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING # endif #endif // __CYGWIN__ //////////////////////////////////////////////////////////////////////////////// // Visual C++ -#ifdef _MSC_VER +#if defined(_MSC_VER) -# if _MSC_VER >= 1900 // Visual Studio 2015 or newer -# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -# endif +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) // Universal Windows platform does not support SEH // Or console colours (or console at all...) @@ -236,10 +251,17 @@ namespace Catch { // MSVC traditional preprocessor needs some workaround for __VA_ARGS__ // _MSVC_TRADITIONAL == 0 means new conformant preprocessor // _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor -# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) -# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR -# endif +# if !defined(__clang__) // Handle Clang masquerading for msvc +# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) +# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +# endif // MSVC_TRADITIONAL +# endif // __clang__ + +#endif // _MSC_VER +#if defined(_REENTRANT) || defined(_MSC_VER) +// Enable async processing, as -pthread is specified or no additional linking is required +# define CATCH_INTERNAL_CONFIG_USE_ASYNC #endif // _MSC_VER //////////////////////////////////////////////////////////////////////////////// @@ -272,40 +294,56 @@ namespace Catch { #endif //////////////////////////////////////////////////////////////////////////////// -// Check if string_view is available and usable -// The check is split apart to work around v140 (VS2015) preprocessor issue... -#if defined(__has_include) -#if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER) -# define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW -#endif + +// RTX is a special version of Windows that is real time. +// This means that it is detected as Windows, but does not provide +// the same set of capabilities as real Windows does. +#if defined(UNDER_RTSS) || defined(RTX64_BUILD) + #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH + #define CATCH_INTERNAL_CONFIG_NO_ASYNC + #define CATCH_CONFIG_COLOUR_NONE #endif -//////////////////////////////////////////////////////////////////////////////// -// Check if optional is available and usable -#if defined(__has_include) -# if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) -# define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL -# endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) -#endif // __has_include +#if !defined(_GLIBCXX_USE_C99_MATH_TR1) +#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER +#endif -//////////////////////////////////////////////////////////////////////////////// -// Check if variant is available and usable +// Various stdlib support checks that require __has_include #if defined(__has_include) -# if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) -# if defined(__clang__) && (__clang_major__ < 8) - // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 - // fix should be in clang 8, workaround in libstdc++ 8.2 -# include <ciso646> -# if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) -# define CATCH_CONFIG_NO_CPP17_VARIANT -# else -# define CATCH_INTERNAL_CONFIG_CPP17_VARIANT -# endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) -# else -# define CATCH_INTERNAL_CONFIG_CPP17_VARIANT -# endif // defined(__clang__) && (__clang_major__ < 8) -# endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) -#endif // __has_include + // Check if string_view is available and usable + #if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER) + # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW + #endif + + // Check if optional is available and usable + # if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) + # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL + # endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) + + // Check if byte is available and usable + # if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) + # include <cstddef> + # if __cpp_lib_byte > 0 + # define CATCH_INTERNAL_CONFIG_CPP17_BYTE + # endif + # endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) + + // Check if variant is available and usable + # if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) + # if defined(__clang__) && (__clang_major__ < 8) + // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 + // fix should be in clang 8, workaround in libstdc++ 8.2 + # include <ciso646> + # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) + # define CATCH_CONFIG_NO_CPP17_VARIANT + # else + # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT + # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) + # else + # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT + # endif // defined(__clang__) && (__clang_major__ < 8) + # endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) +#endif // defined(__has_include) #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) # define CATCH_CONFIG_COUNTER @@ -330,10 +368,6 @@ namespace Catch { # define CATCH_CONFIG_CPP17_OPTIONAL #endif -#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) -# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS -#endif - #if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) # define CATCH_CONFIG_CPP17_STRING_VIEW #endif @@ -342,6 +376,10 @@ namespace Catch { # define CATCH_CONFIG_CPP17_VARIANT #endif +#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE) +# define CATCH_CONFIG_CPP17_BYTE +#endif + #if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) # define CATCH_INTERNAL_CONFIG_NEW_CAPTURE #endif @@ -358,21 +396,53 @@ namespace Catch { # define CATCH_CONFIG_POLYFILL_ISNAN #endif +#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC) +# define CATCH_CONFIG_USE_ASYNC +#endif + +#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE) +# define CATCH_CONFIG_ANDROID_LOGWRITE +#endif + +#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) +# define CATCH_CONFIG_GLOBAL_NEXTAFTER +#endif + +// Even if we do not think the compiler has that warning, we still have +// to provide a macro that can be used by the code. +#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION) +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION +#endif +#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION +#endif #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS -# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS #endif #if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS -# define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS #endif #if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS -# define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS #endif #if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS -# define CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS +#endif + +// The goal of this macro is to avoid evaluation of the arguments, but +// still have the compiler warn on problems inside... +#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN) +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) +#endif + +#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10) +# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#elif defined(__clang__) && (__clang_major__ < 5) +# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#endif + +#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS #endif #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) @@ -437,7 +507,7 @@ namespace Catch { SourceLineInfo( SourceLineInfo&& ) noexcept = default; SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default; - bool empty() const noexcept; + bool empty() const noexcept { return file[0] == '\0'; } bool operator == ( SourceLineInfo const& other ) const noexcept; bool operator < ( SourceLineInfo const& other ) const noexcept; @@ -478,9 +548,10 @@ namespace Catch { } // end namespace Catch #define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION // end catch_tag_alias_autoregistrar.h // start catch_test_registry.h @@ -507,6 +578,7 @@ namespace Catch { virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const = 0; }; + bool isThrowSafe( TestCase const& testCase, IConfig const& config ); bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ); std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ); @@ -519,53 +591,30 @@ namespace Catch { #include <cstddef> #include <string> #include <iosfwd> +#include <cassert> namespace Catch { /// A non-owning string class (similar to the forthcoming std::string_view) /// Note that, because a StringRef may be a substring of another string, - /// it may not be null terminated. c_str() must return a null terminated - /// string, however, and so the StringRef will internally take ownership - /// (taking a copy), if necessary. In theory this ownership is not externally - /// visible - but it does mean (substring) StringRefs should not be shared between - /// threads. + /// it may not be null terminated. class StringRef { public: using size_type = std::size_t; + using const_iterator = const char*; private: - friend struct StringRefTestAccess; - - char const* m_start; - size_type m_size; - - char* m_data = nullptr; - - void takeOwnership(); - static constexpr char const* const s_empty = ""; - public: // construction/ assignment - StringRef() noexcept - : StringRef( s_empty, 0 ) - {} - - StringRef( StringRef const& other ) noexcept - : m_start( other.m_start ), - m_size( other.m_size ) - {} + char const* m_start = s_empty; + size_type m_size = 0; - StringRef( StringRef&& other ) noexcept - : m_start( other.m_start ), - m_size( other.m_size ), - m_data( other.m_data ) - { - other.m_data = nullptr; - } + public: // construction + constexpr StringRef() noexcept = default; StringRef( char const* rawChars ) noexcept; - StringRef( char const* rawChars, size_type size ) noexcept + constexpr StringRef( char const* rawChars, size_type size ) noexcept : m_start( rawChars ), m_size( size ) {} @@ -575,101 +624,64 @@ namespace Catch { m_size( stdString.size() ) {} - ~StringRef() noexcept { - delete[] m_data; + explicit operator std::string() const { + return std::string(m_start, m_size); } - auto operator = ( StringRef const &other ) noexcept -> StringRef& { - delete[] m_data; - m_data = nullptr; - m_start = other.m_start; - m_size = other.m_size; - return *this; - } - - operator std::string() const; - - void swap( StringRef& other ) noexcept; - public: // operators auto operator == ( StringRef const& other ) const noexcept -> bool; - auto operator != ( StringRef const& other ) const noexcept -> bool; + auto operator != (StringRef const& other) const noexcept -> bool { + return !(*this == other); + } - auto operator[] ( size_type index ) const noexcept -> char; + auto operator[] ( size_type index ) const noexcept -> char { + assert(index < m_size); + return m_start[index]; + } public: // named queries - auto empty() const noexcept -> bool { + constexpr auto empty() const noexcept -> bool { return m_size == 0; } - auto size() const noexcept -> size_type { + constexpr auto size() const noexcept -> size_type { return m_size; } - auto numberOfCharacters() const noexcept -> size_type; + // Returns the current start pointer. If the StringRef is not + // null-terminated, throws std::domain_exception auto c_str() const -> char const*; public: // substrings and searches - auto substr( size_type start, size_type size ) const noexcept -> StringRef; + // Returns a substring of [start, start + length). + // If start + length > size(), then the substring is [start, size()). + // If start > size(), then the substring is empty. + auto substr( size_type start, size_type length ) const noexcept -> StringRef; - // Returns the current start pointer. - // Note that the pointer can change when if the StringRef is a substring - auto currentData() const noexcept -> char const*; + // Returns the current start pointer. May not be null-terminated. + auto data() const noexcept -> char const*; - private: // ownership queries - may not be consistent between calls - auto isOwned() const noexcept -> bool; - auto isSubstring() const noexcept -> bool; - }; + constexpr auto isNullTerminated() const noexcept -> bool { + return m_start[m_size] == '\0'; + } - auto operator + ( StringRef const& lhs, StringRef const& rhs ) -> std::string; - auto operator + ( StringRef const& lhs, char const* rhs ) -> std::string; - auto operator + ( char const* lhs, StringRef const& rhs ) -> std::string; + public: // iterators + constexpr const_iterator begin() const { return m_start; } + constexpr const_iterator end() const { return m_start + m_size; } + }; auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&; auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&; - inline auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { + constexpr auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { return StringRef( rawChars, size ); } - } // namespace Catch -inline auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef { +constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef { return Catch::StringRef( rawChars, size ); } // end catch_stringref.h -// start catch_type_traits.hpp - - -#include <type_traits> - -namespace Catch{ - -#ifdef CATCH_CPP17_OR_GREATER - template <typename...> - inline constexpr auto is_unique = std::true_type{}; - - template <typename T, typename... Rest> - inline constexpr auto is_unique<T, Rest...> = std::bool_constant< - (!std::is_same_v<T, Rest> && ...) && is_unique<Rest...> - >{}; -#else - -template <typename...> -struct is_unique : std::true_type{}; - -template <typename T0, typename T1, typename... Rest> -struct is_unique<T0, T1, Rest...> : std::integral_constant -<bool, - !std::is_same<T0, T1>::value - && is_unique<T0, Rest...>::value - && is_unique<T1, Rest...>::value ->{}; - -#endif -} - -// end catch_type_traits.hpp // start catch_preprocessor.hpp @@ -754,7 +766,7 @@ struct is_unique<T0, T1, Rest...> : std::integral_constant #define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3) #define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4) #define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5) -#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _4, _5, _6) +#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6) #define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7) #define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8) #define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9) @@ -766,31 +778,49 @@ struct is_unique<T0, T1, Rest...> : std::integral_constant template<typename...> struct TypeList {};\ template<typename...Ts>\ constexpr auto get_wrapper() noexcept -> TypeList<Ts...> { return {}; }\ + template<template<typename...> class...> struct TemplateTypeList{};\ + template<template<typename...> class...Cs>\ + constexpr auto get_wrapper() noexcept -> TemplateTypeList<Cs...> { return {}; }\ + template<typename...>\ + struct append;\ + template<typename...>\ + struct rewrap;\ + template<template<typename...> class, typename...>\ + struct create;\ + template<template<typename...> class, typename>\ + struct convert;\ \ - template<template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2> \ - constexpr auto append(L1<E1...>, L2<E2...>) noexcept -> L1<E1...,E2...> { return {}; }\ + template<typename T> \ + struct append<T> { using type = T; };\ template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\ - constexpr auto append(L1<E1...>, L2<E2...>, Rest...) noexcept -> decltype(append(L1<E1...,E2...>{}, Rest{}...)) { return {}; }\ + struct append<L1<E1...>, L2<E2...>, Rest...> { using type = typename append<L1<E1...,E2...>, Rest...>::type; };\ + template< template<typename...> class L1, typename...E1, typename...Rest>\ + struct append<L1<E1...>, TypeList<mpl_::na>, Rest...> { using type = L1<E1...>; };\ \ template< template<typename...> class Container, template<typename...> class List, typename...elems>\ - constexpr auto rewrap(List<elems...>) noexcept -> TypeList<Container<elems...>> { return {}; }\ + struct rewrap<TemplateTypeList<Container>, List<elems...>> { using type = TypeList<Container<elems...>>; };\ template< template<typename...> class Container, template<typename...> class List, class...Elems, typename...Elements>\ - constexpr auto rewrap(List<Elems...>,Elements...) noexcept -> decltype(append(TypeList<Container<Elems...>>{}, rewrap<Container>(Elements{}...))) { return {}; }\ + struct rewrap<TemplateTypeList<Container>, List<Elems...>, Elements...> { using type = typename append<TypeList<Container<Elems...>>, typename rewrap<TemplateTypeList<Container>, Elements...>::type>::type; };\ \ template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\ - constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; } + struct create<Final, TemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<TemplateTypeList<Containers>, Types...>::type...>::type; };\ + template<template <typename...> class Final, template <typename...> class List, typename...Ts>\ + struct convert<Final, List<Ts...>> { using type = typename append<Final<>,TypeList<Ts>...>::type; }; #define INTERNAL_CATCH_NTTP_1(signature, ...)\ template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\ template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ constexpr auto get_wrapper() noexcept -> Nttp<__VA_ARGS__> { return {}; } \ + template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...> struct NttpTemplateTypeList{};\ + template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Cs>\ + constexpr auto get_wrapper() noexcept -> NttpTemplateTypeList<Cs...> { return {}; } \ \ template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature)>\ - constexpr auto rewrap(List<__VA_ARGS__>) noexcept -> TypeList<Container<__VA_ARGS__>> { return {}; }\ + struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>> { using type = TypeList<Container<__VA_ARGS__>>; };\ template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature), typename...Elements>\ - constexpr auto rewrap(List<__VA_ARGS__>,Elements...elems) noexcept -> decltype(append(TypeList<Container<__VA_ARGS__>>{}, rewrap<Container>(elems...))) { return {}; }\ + struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>, Elements...> { using type = typename append<TypeList<Container<__VA_ARGS__>>, typename rewrap<NttpTemplateTypeList<Container>, Elements...>::type>::type; };\ template<template <typename...> class Final, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Containers, typename...Types>\ - constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; } + struct create<Final, NttpTemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<NttpTemplateTypeList<Containers>, Types...>::type...>::type; }; #define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName) #define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)\ @@ -888,8 +918,38 @@ struct is_unique<T0, T1, Rest...> : std::integral_constant namespace Catch { template<typename T> struct always_false : std::false_type {}; + + template <typename> struct true_given : std::true_type {}; + struct is_callable_tester { + template <typename Fun, typename... Args> + true_given<decltype(std::declval<Fun>()(std::declval<Args>()...))> static test(int); + template <typename...> + std::false_type static test(...); + }; + + template <typename T> + struct is_callable; + + template <typename Fun, typename... Args> + struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {}; + +#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703 + // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is + // replaced with std::invoke_result here. + template <typename Func, typename... U> + using FunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U...>>>; +#else + // Keep ::type here because we still support C++11 + template <typename Func, typename... U> + using FunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U...)>::type>::type>::type; +#endif + } // namespace Catch +namespace mpl_{ + struct na; +} + // end catch_meta.hpp namespace Catch { @@ -981,21 +1041,24 @@ struct AutoReg : NonCopyable { /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ static void TestName(); \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ static void TestName() #define INTERNAL_CATCH_TESTCASE( ... ) \ INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &QualifiedMethod ), CATCH_INTERNAL_LINEINFO, "&" #QualifiedMethod, Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ \ struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \ @@ -1003,21 +1066,24 @@ struct AutoReg : NonCopyable { }; \ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ } \ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ void TestName::test() #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ... )\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ INTERNAL_CATCH_DECLARE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature));\ namespace {\ namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\ @@ -1030,7 +1096,7 @@ struct AutoReg : NonCopyable { int index = 0; \ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ using expander = int[];\ - (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \ + (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \ }\ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ @@ -1039,8 +1105,7 @@ struct AutoReg : NonCopyable { }();\ }\ }\ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ - CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature)) #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR @@ -1060,8 +1125,10 @@ struct AutoReg : NonCopyable { #endif #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ template<typename TestType> static void TestFuncName(); \ namespace {\ namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \ @@ -1075,19 +1142,18 @@ struct AutoReg : NonCopyable { constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ - (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... };/* NOLINT */\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */\ } \ }; \ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ - using TestInit = decltype(create<TestName, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>(TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>{})); \ + using TestInit = typename create<TestName, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type; \ TestInit t; \ t.reg_tests(); \ return 0; \ }(); \ } \ } \ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ - CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ template<typename TestType> \ static void TestFuncName() @@ -1107,9 +1173,41 @@ struct AutoReg : NonCopyable { INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) #endif + #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + template<typename TestType> static void TestFunc(); \ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\ + INTERNAL_CATCH_TYPE_GEN\ + template<typename... Types> \ + struct TestName { \ + void reg_tests() { \ + int index = 0; \ + using expander = int[]; \ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */\ + } \ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ + using TestInit = typename convert<TestName, TmplList>::type; \ + TestInit t; \ + t.reg_tests(); \ + return 0; \ + }(); \ + }}\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + template<typename TestType> \ + static void TestFunc() + + #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \ + INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, TmplList ) + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ namespace {\ namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \ INTERNAL_CATCH_TYPE_GEN\ @@ -1122,7 +1220,7 @@ struct AutoReg : NonCopyable { int index = 0; \ constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ using expander = int[];\ - (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \ + (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \ }\ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ @@ -1131,8 +1229,7 @@ struct AutoReg : NonCopyable { }();\ }\ }\ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS\ - CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature)) #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR @@ -1152,8 +1249,10 @@ struct AutoReg : NonCopyable { #endif #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ template<typename TestType> \ struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \ void test();\ @@ -1170,19 +1269,18 @@ struct AutoReg : NonCopyable { constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ - (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... };/* NOLINT */ \ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */ \ }\ };\ static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ - using TestInit = decltype(create<TestNameClass, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>(TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>{}));\ + using TestInit = typename create<TestNameClass, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;\ TestInit t;\ t.reg_tests();\ return 0;\ }(); \ }\ }\ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ - CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ template<typename TestType> \ void TestName<TestType>::test() @@ -1202,6 +1300,39 @@ struct AutoReg : NonCopyable { INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature,__VA_ARGS__ ) ) #endif + #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + template<typename TestType> \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \ + void test();\ + };\ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \ + INTERNAL_CATCH_TYPE_GEN\ + template<typename...Types>\ + struct TestNameClass{\ + void reg_tests(){\ + int index = 0;\ + using expander = int[];\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */ \ + }\ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ + using TestInit = typename convert<TestNameClass, TmplList>::type;\ + TestInit t;\ + t.reg_tests();\ + return 0;\ + }(); \ + }}\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + template<typename TestType> \ + void TestName<TestType>::test() + +#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList) \ + INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, TmplList ) + // end catch_test_registry.h // start catch_capture.hpp @@ -1301,7 +1432,7 @@ namespace Catch { auto makeStream( StringRef const &filename ) -> IStream const*; - class ReusableStringStream { + class ReusableStringStream : NonCopyable { std::size_t m_index; std::ostream* m_oss; public: @@ -1329,7 +1460,7 @@ namespace Catch { namespace Detail { struct EnumInfo { StringRef m_name; - std::vector<std::pair<int, std::string>> m_values; + std::vector<std::pair<int, StringRef>> m_values; ~EnumInfo(); @@ -1344,6 +1475,7 @@ namespace Catch { template<typename E> Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::initializer_list<E> values ) { + static_assert(sizeof(int) >= sizeof(E), "Cannot serialize enum to int"); std::vector<int> intValues; intValues.reserve( values.size() ); for( auto enumValue : values ) @@ -1425,9 +1557,9 @@ namespace Catch { template<typename T> class IsStreamInsertable { - template<typename SS, typename TT> + template<typename Stream, typename U> static auto test(int) - -> decltype(std::declval<SS&>() << std::declval<TT>(), std::true_type()); + -> decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type()); template<typename, typename> static auto test(...)->std::false_type; @@ -1589,6 +1721,12 @@ namespace Catch { } }; +#if defined(CATCH_CONFIG_CPP17_BYTE) + template<> + struct StringMaker<std::byte> { + static std::string convert(std::byte value); + }; +#endif // defined(CATCH_CONFIG_CPP17_BYTE) template<> struct StringMaker<int> { static std::string convert(int value); @@ -1682,8 +1820,8 @@ namespace Catch { #endif namespace Detail { - template<typename InputIterator> - std::string rangeToString(InputIterator first, InputIterator last) { + template<typename InputIterator, typename Sentinel = InputIterator> + std::string rangeToString(InputIterator first, Sentinel last) { ReusableStringStream rss; rss << "{ "; if (first != last) { @@ -1841,20 +1979,27 @@ namespace Catch { #endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER namespace Catch { - struct not_this_one {}; // Tag type for detecting which begin/ end are being selected - - // Import begin/ end from std here so they are considered alongside the fallback (...) overloads in this namespace + // Import begin/ end from std here using std::begin; using std::end; - not_this_one begin( ... ); - not_this_one end( ... ); + namespace detail { + template <typename...> + struct void_type { + using type = void; + }; + + template <typename T, typename = void> + struct is_range_impl : std::false_type { + }; + + template <typename T> + struct is_range_impl<T, typename void_type<decltype(begin(std::declval<T>()))>::type> : std::true_type { + }; + } // namespace detail template <typename T> - struct is_range { - static const bool value = - !std::is_same<decltype(begin(std::declval<T>())), not_this_one>::value && - !std::is_same<decltype(end(std::declval<T>())), not_this_one>::value; + struct is_range : detail::is_range_impl<T> { }; #if defined(_MANAGED) // Managed types are never ranges @@ -2024,7 +2169,7 @@ namespace Catch { \ template<> struct StringMaker<enumName> { \ static std::string convert( enumName value ) { \ static const auto& enumInfo = ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum( #enumName, #__VA_ARGS__, { __VA_ARGS__ } ); \ - return enumInfo.lookup( static_cast<int>( value ) ); \ + return static_cast<std::string>(enumInfo.lookup( static_cast<int>( value ) )); \ } \ }; \ } @@ -2222,6 +2367,18 @@ namespace Catch { auto operator <= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { return { static_cast<bool>(m_lhs <= rhs), m_lhs, "<=", rhs }; } + template <typename RhsT> + auto operator | (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs | rhs), m_lhs, "|", rhs }; + } + template <typename RhsT> + auto operator & (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs & rhs), m_lhs, "&", rhs }; + } + template <typename RhsT> + auto operator ^ (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs ^ rhs), m_lhs, "^", rhs }; + } template<typename RhsT> auto operator && ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const { @@ -2270,6 +2427,7 @@ namespace Catch { // start catch_interfaces_capture.h #include <string> +#include <chrono> namespace Catch { @@ -2280,14 +2438,18 @@ namespace Catch { struct MessageInfo; struct MessageBuilder; struct Counts; - struct BenchmarkInfo; - struct BenchmarkStats; struct AssertionReaction; struct SourceLineInfo; struct ITransientExpression; struct IGeneratorTracker; +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + struct BenchmarkInfo; + template <typename Duration = std::chrono::duration<double, std::nano>> + struct BenchmarkStats; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + struct IResultCapture { virtual ~IResultCapture(); @@ -2297,10 +2459,14 @@ namespace Catch { virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; - virtual auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0; + virtual auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0; +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + virtual void benchmarkPreparing( std::string const& name ) = 0; virtual void benchmarkStarting( BenchmarkInfo const& info ) = 0; - virtual void benchmarkEnded( BenchmarkStats const& stats ) = 0; + virtual void benchmarkEnded( BenchmarkStats<> const& stats ) = 0; + virtual void benchmarkFailed( std::string const& error ) = 0; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING virtual void pushScopedMessage( MessageInfo const& message ) = 0; virtual void popScopedMessage( MessageInfo const& message ) = 0; @@ -2531,15 +2697,16 @@ namespace Catch { /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \ do { \ + CATCH_INTERNAL_IGNORE_BUT_WARN(__VA_ARGS__); \ Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \ INTERNAL_CATCH_TRY { \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \ - CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \ INTERNAL_CATCH_REACT( catchAssertionHandler ) \ - } while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) ) // the expression here is never evaluated at runtime but it forces the compiler to give it a look - // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. + } while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \ @@ -2756,62 +2923,18 @@ namespace Catch { } // end namespace Catch #define INTERNAL_CATCH_SECTION( ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \ - CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION #define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, (Catch::ReusableStringStream() << __VA_ARGS__).str() ) ) \ - CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION // end catch_section.h -// start catch_benchmark.h - -#include <cstdint> -#include <string> - -namespace Catch { - - class BenchmarkLooper { - - std::string m_name; - std::size_t m_count = 0; - std::size_t m_iterationsToRun = 1; - uint64_t m_resolution; - Timer m_timer; - - static auto getResolution() -> uint64_t; - public: - // Keep most of this inline as it's on the code path that is being timed - BenchmarkLooper( StringRef name ) - : m_name( name ), - m_resolution( getResolution() ) - { - reportStart(); - m_timer.start(); - } - - explicit operator bool() { - if( m_count < m_iterationsToRun ) - return true; - return needsMoreIterations(); - } - - void increment() { - ++m_count; - } - - void reportStart(); - auto needsMoreIterations() -> bool; - }; - -} // end namespace Catch - -#define BENCHMARK( name ) \ - for( Catch::BenchmarkLooper looper( name ); looper; looper.increment() ) - -// end catch_benchmark.h // start catch_interfaces_exception.h // start catch_interfaces_registry_hub.h @@ -2900,6 +3023,9 @@ namespace Catch { {} std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const override { +#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + return ""; +#else try { if( it == itEnd ) std::rethrow_exception(std::current_exception()); @@ -2909,6 +3035,7 @@ namespace Catch { catch( T& ex ) { return m_translateFunction( ex ); } +#endif } protected: @@ -2927,9 +3054,10 @@ namespace Catch { /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ static std::string translatorName( signature ); \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ static std::string translatorName( signature ) #define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) @@ -3071,7 +3199,10 @@ namespace Catch { bool contains( std::string const& s, std::string const& infix ); void toLowerInPlace( std::string& s ); std::string toLower( std::string const& s ); + //! Returns a new string without whitespace at the start/end std::string trim( std::string const& str ); + //! Returns a substring of the original ref without whitespace. Beware lifetimes! + StringRef trim(StringRef ref); // !!! Be aware, returns refs into original string - make sure original string outlives them std::vector<StringRef> splitStringRef( StringRef str, char delimiter ); @@ -3127,6 +3258,15 @@ namespace Matchers { virtual bool match( ObjectT const& arg ) const = 0; }; +#if defined(__OBJC__) + // Hack to fix Catch GH issue #1661. Could use id for generic Object support. + // use of const for Object pointers is very uncommon and under ARC it causes some kind of signature mismatch that breaks compilation + template<> + struct MatcherMethod<NSString*> { + virtual bool match( NSString* arg ) const = 0; + }; +#endif + #ifdef __clang__ # pragma clang diagnostic pop #endif @@ -3164,9 +3304,10 @@ namespace Matchers { return description; } - MatchAllOf<ArgT>& operator && ( MatcherBase<ArgT> const& other ) { - m_matchers.push_back( &other ); - return *this; + MatchAllOf<ArgT> operator && ( MatcherBase<ArgT> const& other ) { + auto copy(*this); + copy.m_matchers.push_back( &other ); + return copy; } std::vector<MatcherBase<ArgT> const*> m_matchers; @@ -3197,9 +3338,10 @@ namespace Matchers { return description; } - MatchAnyOf<ArgT>& operator || ( MatcherBase<ArgT> const& other ) { - m_matchers.push_back( &other ); - return *this; + MatchAnyOf<ArgT> operator || ( MatcherBase<ArgT> const& other ) { + auto copy(*this); + copy.m_matchers.push_back( &other ); + return copy; } std::vector<MatcherBase<ArgT> const*> m_matchers; @@ -3243,10 +3385,34 @@ using Matchers::Impl::MatcherBase; } // namespace Catch // end catch_matchers.h -// start catch_matchers_floating.h +// start catch_matchers_exception.hpp -#include <type_traits> -#include <cmath> +namespace Catch { +namespace Matchers { +namespace Exception { + +class ExceptionMessageMatcher : public MatcherBase<std::exception> { + std::string m_message; +public: + + ExceptionMessageMatcher(std::string const& message): + m_message(message) + {} + + bool match(std::exception const& ex) const override; + + std::string describe() const override; +}; + +} // namespace Exception + +Exception::ExceptionMessageMatcher Message(std::string const& message); + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_exception.hpp +// start catch_matchers_floating.h namespace Catch { namespace Matchers { @@ -3265,22 +3431,43 @@ namespace Matchers { }; struct WithinUlpsMatcher : MatcherBase<double> { - WithinUlpsMatcher(double target, int ulps, FloatingPointKind baseType); + WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType); bool match(double const& matchee) const override; std::string describe() const override; private: double m_target; - int m_ulps; + uint64_t m_ulps; FloatingPointKind m_type; }; + // Given IEEE-754 format for floats and doubles, we can assume + // that float -> double promotion is lossless. Given this, we can + // assume that if we do the standard relative comparison of + // |lhs - rhs| <= epsilon * max(fabs(lhs), fabs(rhs)), then we get + // the same result if we do this for floats, as if we do this for + // doubles that were promoted from floats. + struct WithinRelMatcher : MatcherBase<double> { + WithinRelMatcher(double target, double epsilon); + bool match(double const& matchee) const override; + std::string describe() const override; + private: + double m_target; + double m_epsilon; + }; + } // namespace Floating // The following functions create the actual matcher objects. // This allows the types to be inferred - Floating::WithinUlpsMatcher WithinULP(double target, int maxUlpDiff); - Floating::WithinUlpsMatcher WithinULP(float target, int maxUlpDiff); + Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff); + Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff); Floating::WithinAbsMatcher WithinAbs(double target, double margin); + Floating::WithinRelMatcher WithinRel(double target, double eps); + // defaults epsilon to 100*numeric_limits<double>::epsilon() + Floating::WithinRelMatcher WithinRel(double target); + Floating::WithinRelMatcher WithinRel(float target, float eps); + // defaults epsilon to 100*numeric_limits<float>::epsilon() + Floating::WithinRelMatcher WithinRel(float target); } // namespace Matchers } // namespace Catch @@ -3411,12 +3598,12 @@ namespace Catch { namespace Matchers { namespace Vector { - template<typename T> - struct ContainsElementMatcher : MatcherBase<std::vector<T>> { + template<typename T, typename Alloc> + struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> { ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {} - bool match(std::vector<T> const &v) const override { + bool match(std::vector<T, Alloc> const &v) const override { for (auto const& el : v) { if (el == m_comparator) { return true; @@ -3432,12 +3619,12 @@ namespace Matchers { T const& m_comparator; }; - template<typename T> - struct ContainsMatcher : MatcherBase<std::vector<T>> { + template<typename T, typename AllocComp, typename AllocMatch> + struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> { - ContainsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {} + ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {} - bool match(std::vector<T> const &v) const override { + bool match(std::vector<T, AllocMatch> const &v) const override { // !TBD: see note in EqualsMatcher if (m_comparator.size() > v.size()) return false; @@ -3459,18 +3646,18 @@ namespace Matchers { return "Contains: " + ::Catch::Detail::stringify( m_comparator ); } - std::vector<T> const& m_comparator; + std::vector<T, AllocComp> const& m_comparator; }; - template<typename T> - struct EqualsMatcher : MatcherBase<std::vector<T>> { + template<typename T, typename AllocComp, typename AllocMatch> + struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> { - EqualsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {} + EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {} - bool match(std::vector<T> const &v) const override { + bool match(std::vector<T, AllocMatch> const &v) const override { // !TBD: This currently works if all elements can be compared using != // - a more general approach would be via a compare template that defaults - // to using !=. but could be specialised for, e.g. std::vector<T> etc + // to using !=. but could be specialised for, e.g. std::vector<T, Alloc> etc // - then just call that directly if (m_comparator.size() != v.size()) return false; @@ -3482,15 +3669,15 @@ namespace Matchers { std::string describe() const override { return "Equals: " + ::Catch::Detail::stringify( m_comparator ); } - std::vector<T> const& m_comparator; + std::vector<T, AllocComp> const& m_comparator; }; - template<typename T> - struct ApproxMatcher : MatcherBase<std::vector<T>> { + template<typename T, typename AllocComp, typename AllocMatch> + struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> { - ApproxMatcher(std::vector<T> const& comparator) : m_comparator( comparator ) {} + ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_comparator( comparator ) {} - bool match(std::vector<T> const &v) const override { + bool match(std::vector<T, AllocMatch> const &v) const override { if (m_comparator.size() != v.size()) return false; for (std::size_t i = 0; i < v.size(); ++i) @@ -3517,16 +3704,14 @@ namespace Matchers { return *this; } - std::vector<T> const& m_comparator; + std::vector<T, AllocComp> const& m_comparator; mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom(); }; - template<typename T> - struct UnorderedEqualsMatcher : MatcherBase<std::vector<T>> { - UnorderedEqualsMatcher(std::vector<T> const& target) : m_target(target) {} - bool match(std::vector<T> const& vec) const override { - // Note: This is a reimplementation of std::is_permutation, - // because I don't want to include <algorithm> inside the common path + template<typename T, typename AllocComp, typename AllocMatch> + struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> { + UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) : m_target(target) {} + bool match(std::vector<T, AllocMatch> const& vec) const override { if (m_target.size() != vec.size()) { return false; } @@ -3537,7 +3722,7 @@ namespace Matchers { return "UnorderedEquals: " + ::Catch::Detail::stringify(m_target); } private: - std::vector<T> const& m_target; + std::vector<T, AllocComp> const& m_target; }; } // namespace Vector @@ -3545,29 +3730,29 @@ namespace Matchers { // The following functions create the actual matcher objects. // This allows the types to be inferred - template<typename T> - Vector::ContainsMatcher<T> Contains( std::vector<T> const& comparator ) { - return Vector::ContainsMatcher<T>( comparator ); + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vector<T, AllocComp> const& comparator ) { + return Vector::ContainsMatcher<T, AllocComp, AllocMatch>( comparator ); } - template<typename T> - Vector::ContainsElementMatcher<T> VectorContains( T const& comparator ) { - return Vector::ContainsElementMatcher<T>( comparator ); + template<typename T, typename Alloc = std::allocator<T>> + Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& comparator ) { + return Vector::ContainsElementMatcher<T, Alloc>( comparator ); } - template<typename T> - Vector::EqualsMatcher<T> Equals( std::vector<T> const& comparator ) { - return Vector::EqualsMatcher<T>( comparator ); + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<T, AllocComp> const& comparator ) { + return Vector::EqualsMatcher<T, AllocComp, AllocMatch>( comparator ); } - template<typename T> - Vector::ApproxMatcher<T> Approx( std::vector<T> const& comparator ) { - return Vector::ApproxMatcher<T>( comparator ); + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<T, AllocComp> const& comparator ) { + return Vector::ApproxMatcher<T, AllocComp, AllocMatch>( comparator ); } - template<typename T> - Vector::UnorderedEqualsMatcher<T> UnorderedEquals(std::vector<T> const& target) { - return Vector::UnorderedEqualsMatcher<T>(target); + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEquals(std::vector<T, AllocComp> const& target) { + return Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch>( target ); } } // namespace Matchers @@ -3678,7 +3863,7 @@ namespace Catch { // end catch_interfaces_generatortracker.h // start catch_enforce.h -#include <stdexcept> +#include <exception> namespace Catch { #if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) @@ -3691,18 +3876,30 @@ namespace Catch { [[noreturn]] void throw_exception(std::exception const& e); #endif + + [[noreturn]] + void throw_logic_error(std::string const& msg); + [[noreturn]] + void throw_domain_error(std::string const& msg); + [[noreturn]] + void throw_runtime_error(std::string const& msg); + } // namespace Catch; -#define CATCH_PREPARE_EXCEPTION( type, msg ) \ - type( ( Catch::ReusableStringStream() << msg ).str() ) -#define CATCH_INTERNAL_ERROR( msg ) \ - Catch::throw_exception(CATCH_PREPARE_EXCEPTION( std::logic_error, CATCH_INTERNAL_LINEINFO << ": Internal Catch error: " << msg)) -#define CATCH_ERROR( msg ) \ - Catch::throw_exception(CATCH_PREPARE_EXCEPTION( std::domain_error, msg )) -#define CATCH_RUNTIME_ERROR( msg ) \ - Catch::throw_exception(CATCH_PREPARE_EXCEPTION( std::runtime_error, msg )) -#define CATCH_ENFORCE( condition, msg ) \ - do{ if( !(condition) ) CATCH_ERROR( msg ); } while(false) +#define CATCH_MAKE_MSG(...) \ + (Catch::ReusableStringStream() << __VA_ARGS__).str() + +#define CATCH_INTERNAL_ERROR(...) \ + Catch::throw_logic_error(CATCH_MAKE_MSG( CATCH_INTERNAL_LINEINFO << ": Internal Catch2 error: " << __VA_ARGS__)) + +#define CATCH_ERROR(...) \ + Catch::throw_domain_error(CATCH_MAKE_MSG( __VA_ARGS__ )) + +#define CATCH_RUNTIME_ERROR(...) \ + Catch::throw_runtime_error(CATCH_MAKE_MSG( __VA_ARGS__ )) + +#define CATCH_ENFORCE( condition, ... ) \ + do{ if( !(condition) ) CATCH_ERROR( __VA_ARGS__ ); } while(false) // end catch_enforce.h #include <memory> @@ -3751,7 +3948,6 @@ namespace Generators { class SingleValueGenerator final : public IGenerator<T> { T m_value; public: - SingleValueGenerator(T const& value) : m_value( value ) {} SingleValueGenerator(T&& value) : m_value(std::move(value)) {} T const& get() const override { @@ -3764,6 +3960,9 @@ namespace Generators { template<typename T> class FixedValuesGenerator final : public IGenerator<T> { + static_assert(!std::is_same<T, bool>::value, + "FixedValuesGenerator does not support bools because of std::vector<bool>" + "specialization, use SingleValue Generator instead."); std::vector<T> m_values; size_t m_idx = 0; public: @@ -3811,21 +4010,21 @@ namespace Generators { m_generators.emplace_back(std::move(generator)); } void populate(T&& val) { - m_generators.emplace_back(value(std::move(val))); + m_generators.emplace_back(value(std::forward<T>(val))); } template<typename U> void populate(U&& val) { - populate(T(std::move(val))); + populate(T(std::forward<U>(val))); } template<typename U, typename... Gs> - void populate(U&& valueOrGenerator, Gs... moreGenerators) { + void populate(U&& valueOrGenerator, Gs &&... moreGenerators) { populate(std::forward<U>(valueOrGenerator)); populate(std::forward<Gs>(moreGenerators)...); } public: template <typename... Gs> - Generators(Gs... moreGenerators) { + Generators(Gs &&... moreGenerators) { m_generators.reserve(sizeof...(Gs)); populate(std::forward<Gs>(moreGenerators)...); } @@ -3856,7 +4055,7 @@ namespace Generators { struct as {}; template<typename T, typename... Gs> - auto makeGenerators( GeneratorWrapper<T>&& generator, Gs... moreGenerators ) -> Generators<T> { + auto makeGenerators( GeneratorWrapper<T>&& generator, Gs &&... moreGenerators ) -> Generators<T> { return Generators<T>(std::move(generator), std::forward<Gs>(moreGenerators)...); } template<typename T> @@ -3864,24 +4063,24 @@ namespace Generators { return Generators<T>(std::move(generator)); } template<typename T, typename... Gs> - auto makeGenerators( T&& val, Gs... moreGenerators ) -> Generators<T> { + auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generators<T> { return makeGenerators( value( std::forward<T>( val ) ), std::forward<Gs>( moreGenerators )... ); } template<typename T, typename U, typename... Gs> - auto makeGenerators( as<T>, U&& val, Gs... moreGenerators ) -> Generators<T> { + auto makeGenerators( as<T>, U&& val, Gs &&... moreGenerators ) -> Generators<T> { return makeGenerators( value( T( std::forward<U>( val ) ) ), std::forward<Gs>( moreGenerators )... ); } - auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker&; + auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker&; template<typename L> // Note: The type after -> is weird, because VS2015 cannot parse // the expression used in the typedef inside, when it is in // return type. Yeah. - auto generate( SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval<decltype(generatorExpression())>().get()) { + auto generate( StringRef generatorName, SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval<decltype(generatorExpression())>().get()) { using UnderlyingType = typename decltype(generatorExpression())::type; - IGeneratorTracker& tracker = acquireGeneratorTracker( lineInfo ); + IGeneratorTracker& tracker = acquireGeneratorTracker( generatorName, lineInfo ); if (!tracker.hasGenerator()) { tracker.setGenerator(pf::make_unique<Generators<UnderlyingType>>(generatorExpression())); } @@ -3894,11 +4093,17 @@ namespace Generators { } // namespace Catch #define GENERATE( ... ) \ - Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) + Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ + CATCH_INTERNAL_LINEINFO, \ + [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) #define GENERATE_COPY( ... ) \ - Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) + Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ + CATCH_INTERNAL_LINEINFO, \ + [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) #define GENERATE_REF( ... ) \ - Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) + Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ + CATCH_INTERNAL_LINEINFO, \ + [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) // end catch_generators.hpp // start catch_generators_generic.hpp @@ -3983,6 +4188,9 @@ namespace Generators { template <typename T> class RepeatGenerator : public IGenerator<T> { + static_assert(!std::is_same<T, bool>::value, + "RepeatGenerator currently does not support bools" + "because of std::vector<bool> specialization"); GeneratorWrapper<T> m_generator; mutable std::vector<T> m_returned; size_t m_target_repeats; @@ -4061,18 +4269,7 @@ namespace Generators { } }; -#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703 - // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is - // replaced with std::invoke_result here. Also *_t format is preferred over - // typename *::type format. - template <typename Func, typename U> - using MapFunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U>>>; -#else - template <typename Func, typename U> - using MapFunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U)>::type>::type>::type; -#endif - - template <typename Func, typename U, typename T = MapFunctionReturnType<Func, U>> + template <typename Func, typename U, typename T = FunctionReturnType<Func, U>> GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) { return GeneratorWrapper<T>( pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator)) @@ -4097,12 +4294,14 @@ namespace Generators { m_chunk_size(size), m_generator(std::move(generator)) { m_chunk.reserve(m_chunk_size); - m_chunk.push_back(m_generator.get()); - for (size_t i = 1; i < m_chunk_size; ++i) { - if (!m_generator.next()) { - Catch::throw_exception(GeneratorException("Not enough values to initialize the first chunk")); - } + if (m_chunk_size != 0) { m_chunk.push_back(m_generator.get()); + for (size_t i = 1; i < m_chunk_size; ++i) { + if (!m_generator.next()) { + Catch::throw_exception(GeneratorException("Not enough values to initialize the first chunk")); + } + m_chunk.push_back(m_generator.get()); + } } } std::vector<T> const& get() const override { @@ -4173,6 +4372,7 @@ namespace Catch { { if( !IMutableContext::currentContext ) IMutableContext::createContext(); + // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn) return *IMutableContext::currentContext; } @@ -4182,25 +4382,94 @@ namespace Catch { } void cleanUpContext(); + + class SimplePcg32; + SimplePcg32& rng(); } // end catch_context.h // start catch_interfaces_config.h -#include <iosfwd> -#include <string> -#include <vector> -#include <memory> +// start catch_option.hpp namespace Catch { - enum class Verbosity { - Quiet = 0, - Normal, - High - }; + // An optional type + template<typename T> + class Option { + public: + Option() : nullableValue( nullptr ) {} + Option( T const& _value ) + : nullableValue( new( storage ) T( _value ) ) + {} + Option( Option const& _other ) + : nullableValue( _other ? new( storage ) T( *_other ) : nullptr ) + {} - struct WarnAbout { enum What { + ~Option() { + reset(); + } + + Option& operator= ( Option const& _other ) { + if( &_other != this ) { + reset(); + if( _other ) + nullableValue = new( storage ) T( *_other ); + } + return *this; + } + Option& operator = ( T const& _value ) { + reset(); + nullableValue = new( storage ) T( _value ); + return *this; + } + + void reset() { + if( nullableValue ) + nullableValue->~T(); + nullableValue = nullptr; + } + + T& operator*() { return *nullableValue; } + T const& operator*() const { return *nullableValue; } + T* operator->() { return nullableValue; } + const T* operator->() const { return nullableValue; } + + T valueOr( T const& defaultValue ) const { + return nullableValue ? *nullableValue : defaultValue; + } + + bool some() const { return nullableValue != nullptr; } + bool none() const { return nullableValue == nullptr; } + + bool operator !() const { return nullableValue == nullptr; } + explicit operator bool() const { + return some(); + } + + private: + T *nullableValue; + alignas(alignof(T)) char storage[sizeof(T)]; + }; + +} // end namespace Catch + +// end catch_option.hpp +#include <chrono> +#include <iosfwd> +#include <string> +#include <vector> +#include <memory> + +namespace Catch { + + enum class Verbosity { + Quiet = 0, + Normal, + High + }; + + struct WarnAbout { enum What { Nothing = 0x00, NoAssertions = 0x01, NoTests = 0x02 @@ -4244,21 +4513,77 @@ namespace Catch { virtual int abortAfter() const = 0; virtual bool showInvisibles() const = 0; virtual ShowDurations::OrNot showDurations() const = 0; + virtual double minDuration() const = 0; virtual TestSpec const& testSpec() const = 0; virtual bool hasTestFilters() const = 0; virtual std::vector<std::string> const& getTestsOrTags() const = 0; virtual RunTests::InWhatOrder runOrder() const = 0; virtual unsigned int rngSeed() const = 0; - virtual int benchmarkResolutionMultiple() const = 0; virtual UseColour::YesOrNo useColour() const = 0; virtual std::vector<std::string> const& getSectionsToRun() const = 0; virtual Verbosity verbosity() const = 0; + + virtual bool benchmarkNoAnalysis() const = 0; + virtual int benchmarkSamples() const = 0; + virtual double benchmarkConfidenceInterval() const = 0; + virtual unsigned int benchmarkResamples() const = 0; + virtual std::chrono::milliseconds benchmarkWarmupTime() const = 0; }; using IConfigPtr = std::shared_ptr<IConfig const>; } // end catch_interfaces_config.h +// start catch_random_number_generator.h + +#include <cstdint> + +namespace Catch { + + // This is a simple implementation of C++11 Uniform Random Number + // Generator. It does not provide all operators, because Catch2 + // does not use it, but it should behave as expected inside stdlib's + // distributions. + // The implementation is based on the PCG family (http://pcg-random.org) + class SimplePcg32 { + using state_type = std::uint64_t; + public: + using result_type = std::uint32_t; + static constexpr result_type (min)() { + return 0; + } + static constexpr result_type (max)() { + return static_cast<result_type>(-1); + } + + // Provide some default initial state for the default constructor + SimplePcg32():SimplePcg32(0xed743cc4U) {} + + explicit SimplePcg32(result_type seed_); + + void seed(result_type seed_); + void discard(uint64_t skip); + + result_type operator()(); + + private: + friend bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs); + friend bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs); + + // In theory we also need operator<< and operator>> + // In practice we do not use them, so we will skip them for now + + std::uint64_t m_state; + // This part of the state determines which "stream" of the numbers + // is chosen -- we take it as a constant for Catch2, so we only + // need to deal with seeding the main state. + // Picked by reading 8 bytes from `/dev/random` :-) + static const std::uint64_t s_inc = (0x13ed0cc53f939476ULL << 1ULL) | 1ULL; + }; + +} // end namespace Catch + +// end catch_random_number_generator.h #include <random> namespace Catch { @@ -4266,14 +4591,13 @@ namespace Generators { template <typename Float> class RandomFloatingGenerator final : public IGenerator<Float> { - // FIXME: What is the right seed? - std::minstd_rand m_rand; + Catch::SimplePcg32& m_rng; std::uniform_real_distribution<Float> m_dist; Float m_current_number; public: RandomFloatingGenerator(Float a, Float b): - m_rand(getCurrentContext().getConfig()->rngSeed()), + m_rng(rng()), m_dist(a, b) { static_cast<void>(next()); } @@ -4282,20 +4606,20 @@ public: return m_current_number; } bool next() override { - m_current_number = m_dist(m_rand); + m_current_number = m_dist(m_rng); return true; } }; template <typename Integer> class RandomIntegerGenerator final : public IGenerator<Integer> { - std::minstd_rand m_rand; + Catch::SimplePcg32& m_rng; std::uniform_int_distribution<Integer> m_dist; Integer m_current_number; public: RandomIntegerGenerator(Integer a, Integer b): - m_rand(getCurrentContext().getConfig()->rngSeed()), + m_rng(rng()), m_dist(a, b) { static_cast<void>(next()); } @@ -4304,7 +4628,7 @@ public: return m_current_number; } bool next() override { - m_current_number = m_dist(m_rand); + m_current_number = m_dist(m_rng); return true; } }; @@ -4364,7 +4688,7 @@ public: template <typename T> GeneratorWrapper<T> range(T const& start, T const& end, T const& step) { - static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value, "Type must be an integer"); + static_assert(std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, "Type must be numeric"); return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end, step)); } @@ -4374,6 +4698,45 @@ GeneratorWrapper<T> range(T const& start, T const& end) { return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end)); } +template <typename T> +class IteratorGenerator final : public IGenerator<T> { + static_assert(!std::is_same<T, bool>::value, + "IteratorGenerator currently does not support bools" + "because of std::vector<bool> specialization"); + + std::vector<T> m_elems; + size_t m_current = 0; +public: + template <typename InputIterator, typename InputSentinel> + IteratorGenerator(InputIterator first, InputSentinel last):m_elems(first, last) { + if (m_elems.empty()) { + Catch::throw_exception(GeneratorException("IteratorGenerator received no valid values")); + } + } + + T const& get() const override { + return m_elems[m_current]; + } + + bool next() override { + ++m_current; + return m_current != m_elems.size(); + } +}; + +template <typename InputIterator, + typename InputSentinel, + typename ResultType = typename std::iterator_traits<InputIterator>::value_type> +GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) { + return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(from, to)); +} + +template <typename Container, + typename ResultType = typename Container::value_type> +GeneratorWrapper<ResultType> from_range(Container const& cnt) { + return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(cnt.begin(), cnt.end())); +} + } // namespace Generators } // namespace Catch @@ -4577,7 +4940,7 @@ namespace Catch { arcSafeRelease( m_substr ); } - bool match( NSString* const& str ) const override { + bool match( NSString* str ) const override { return false; } @@ -4587,7 +4950,7 @@ namespace Catch { struct Equals : StringHolder { Equals( NSString* substr ) : StringHolder( substr ){} - bool match( NSString* const& str ) const override { + bool match( NSString* str ) const override { return (str != nil || m_substr == nil ) && [str isEqualToString:m_substr]; } @@ -4600,7 +4963,7 @@ namespace Catch { struct Contains : StringHolder { Contains( NSString* substr ) : StringHolder( substr ){} - bool match( NSString* const& str ) const override { + bool match( NSString* str ) const override { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location != NSNotFound; } @@ -4613,7 +4976,7 @@ namespace Catch { struct StartsWith : StringHolder { StartsWith( NSString* substr ) : StringHolder( substr ){} - bool match( NSString* const& str ) const override { + bool match( NSString* str ) const override { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == 0; } @@ -4625,7 +4988,7 @@ namespace Catch { struct EndsWith : StringHolder { EndsWith( NSString* substr ) : StringHolder( substr ){} - bool match( NSString* const& str ) const override { + bool match( NSString* str ) const override { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == [str length] - [m_substr length]; } @@ -4676,7 +5039,8 @@ return @ desc; \ // end catch_objc.hpp #endif -#ifdef CATCH_CONFIG_EXTERNAL_INTERFACES +// Benchmarking needs the externally-facing parts of reporters to work +#if defined(CATCH_CONFIG_EXTERNAL_INTERFACES) || defined(CATCH_CONFIG_ENABLE_BENCHMARKING) // start catch_external_interfaces.h // start catch_reporter_bases.hpp @@ -4718,7 +5082,7 @@ namespace Catch virtual bool matches( std::string const& str ) const; private: - std::string adjustCase( std::string const& str ) const; + std::string normaliseString( std::string const& str ) const; CaseSensitive::Choice m_caseSensitivity; WildcardPosition m_wildcard = NoWildcard; std::string m_pattern; @@ -4732,17 +5096,23 @@ namespace Catch namespace Catch { + struct IConfig; + class TestSpec { - struct Pattern { + class Pattern { + public: + explicit Pattern( std::string const& name ); virtual ~Pattern(); virtual bool matches( TestCaseInfo const& testCase ) const = 0; + std::string const& name() const; + private: + std::string const m_name; }; using PatternPtr = std::shared_ptr<Pattern>; class NamePattern : public Pattern { public: - NamePattern( std::string const& name ); - virtual ~NamePattern(); + explicit NamePattern( std::string const& name, std::string const& filterString ); bool matches( TestCaseInfo const& testCase ) const override; private: WildcardPattern m_wildcardPattern; @@ -4750,8 +5120,7 @@ namespace Catch { class TagPattern : public Pattern { public: - TagPattern( std::string const& tag ); - virtual ~TagPattern(); + explicit TagPattern( std::string const& tag, std::string const& filterString ); bool matches( TestCaseInfo const& testCase ) const override; private: std::string m_tag; @@ -4759,8 +5128,7 @@ namespace Catch { class ExcludedPattern : public Pattern { public: - ExcludedPattern( PatternPtr const& underlyingPattern ); - virtual ~ExcludedPattern(); + explicit ExcludedPattern( PatternPtr const& underlyingPattern ); bool matches( TestCaseInfo const& testCase ) const override; private: PatternPtr m_underlyingPattern; @@ -4770,15 +5138,25 @@ namespace Catch { std::vector<PatternPtr> m_patterns; bool matches( TestCaseInfo const& testCase ) const; + std::string name() const; }; public: + struct FilterMatch { + std::string name; + std::vector<TestCase const*> tests; + }; + using Matches = std::vector<FilterMatch>; + using vectorStrings = std::vector<std::string>; + bool hasFilters() const; bool matches( TestCaseInfo const& testCase ) const; + Matches matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const; + const vectorStrings & getInvalidArgs() const; private: std::vector<Filter> m_filters; - + std::vector<std::string> m_invalidArgs; friend class TestSpecParser; }; } @@ -4813,9 +5191,13 @@ namespace Catch { class TestSpecParser { enum Mode{ None, Name, QuotedName, Tag, EscapedName }; Mode m_mode = None; + Mode lastMode = None; bool m_exclusion = false; - std::size_t m_start = std::string::npos, m_pos = 0; + std::size_t m_pos = 0; + std::size_t m_realPatternPos = 0; std::string m_arg; + std::string m_substring; + std::string m_patternName; std::vector<std::size_t> m_escapeChars; TestSpec::Filter m_currentFilter; TestSpec m_testSpec; @@ -4828,32 +5210,32 @@ namespace Catch { TestSpec testSpec(); private: - void visitChar( char c ); - void startNewMode( Mode mode, std::size_t start ); + bool visitChar( char c ); + void startNewMode( Mode mode ); + bool processNoneChar( char c ); + void processNameChar( char c ); + bool processOtherChar( char c ); + void endMode(); void escape(); - std::string subString() const; + bool isControlChar( char c ) const; + void saveLastMode(); + void revertBackToLastMode(); + void addFilter(); + bool separate(); - template<typename T> - void addPattern() { - std::string token = subString(); - for( std::size_t i = 0; i < m_escapeChars.size(); ++i ) - token = token.substr( 0, m_escapeChars[i]-m_start-i ) + token.substr( m_escapeChars[i]-m_start-i+1 ); - m_escapeChars.clear(); - if( startsWith( token, "exclude:" ) ) { - m_exclusion = true; - token = token.substr( 8 ); - } - if( !token.empty() ) { - TestSpec::PatternPtr pattern = std::make_shared<T>( token ); - if( m_exclusion ) - pattern = std::make_shared<TestSpec::ExcludedPattern>( pattern ); - m_currentFilter.m_patterns.push_back( pattern ); - } - m_exclusion = false; - m_mode = None; + // Handles common preprocessing of the pattern for name/tag patterns + std::string preprocessPattern(); + // Adds the current pattern as a test name + void addNamePattern(); + // Adds the current pattern as a tag + void addTagPattern(); + + inline void addCharToPattern(char c) { + m_substring += c; + m_patternName += c; + m_realPatternPos++; } - void addFilter(); }; TestSpec parseTestSpec( std::string const& arg ); @@ -4894,11 +5276,17 @@ namespace Catch { int abortAfter = -1; unsigned int rngSeed = 0; - int benchmarkResolutionMultiple = 100; + + bool benchmarkNoAnalysis = false; + unsigned int benchmarkSamples = 100; + double benchmarkConfidenceInterval = 0.95; + unsigned int benchmarkResamples = 100000; + std::chrono::milliseconds::rep benchmarkWarmupTime = 100; Verbosity verbosity = Verbosity::Normal; WarnAbout::What warnings = WarnAbout::Nothing; ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter; + double minDuration = -1; RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder; UseColour::YesOrNo useColour = UseColour::Auto; WaitForKeypress::When waitForKeypress = WaitForKeypress::Never; @@ -4949,14 +5337,19 @@ namespace Catch { bool warnAboutMissingAssertions() const override; bool warnAboutNoTests() const override; ShowDurations::OrNot showDurations() const override; + double minDuration() const override; RunTests::InWhatOrder runOrder() const override; unsigned int rngSeed() const override; - int benchmarkResolutionMultiple() const override; UseColour::YesOrNo useColour() const override; bool shouldDebugBreak() const override; int abortAfter() const override; bool showInvisibles() const override; Verbosity verbosity() const override; + bool benchmarkNoAnalysis() const override; + int benchmarkSamples() const override; + double benchmarkConfidenceInterval() const override; + unsigned int benchmarkResamples() const override; + std::chrono::milliseconds benchmarkWarmupTime() const override; private: @@ -5017,76 +5410,59 @@ namespace Catch { } // end namespace Catch // end catch_assertionresult.h -// start catch_option.hpp +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +// start catch_estimate.hpp -namespace Catch { - - // An optional type - template<typename T> - class Option { - public: - Option() : nullableValue( nullptr ) {} - Option( T const& _value ) - : nullableValue( new( storage ) T( _value ) ) - {} - Option( Option const& _other ) - : nullableValue( _other ? new( storage ) T( *_other ) : nullptr ) - {} + // Statistics estimates - ~Option() { - reset(); - } - Option& operator= ( Option const& _other ) { - if( &_other != this ) { - reset(); - if( _other ) - nullableValue = new( storage ) T( *_other ); +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct Estimate { + Duration point; + Duration lower_bound; + Duration upper_bound; + double confidence_interval; + + template <typename Duration2> + operator Estimate<Duration2>() const { + return { point, lower_bound, upper_bound, confidence_interval }; } - return *this; - } - Option& operator = ( T const& _value ) { - reset(); - nullableValue = new( storage ) T( _value ); - return *this; - } - - void reset() { - if( nullableValue ) - nullableValue->~T(); - nullableValue = nullptr; - } - - T& operator*() { return *nullableValue; } - T const& operator*() const { return *nullableValue; } - T* operator->() { return nullableValue; } - const T* operator->() const { return nullableValue; } - - T valueOr( T const& defaultValue ) const { - return nullableValue ? *nullableValue : defaultValue; - } + }; + } // namespace Benchmark +} // namespace Catch - bool some() const { return nullableValue != nullptr; } - bool none() const { return nullableValue == nullptr; } +// end catch_estimate.hpp +// start catch_outlier_classification.hpp - bool operator !() const { return nullableValue == nullptr; } - explicit operator bool() const { - return some(); - } +// Outlier information - private: - T *nullableValue; - alignas(alignof(T)) char storage[sizeof(T)]; - }; +namespace Catch { + namespace Benchmark { + struct OutlierClassification { + int samples_seen = 0; + int low_severe = 0; // more than 3 times IQR below Q1 + int low_mild = 0; // 1.5 to 3 times IQR below Q1 + int high_mild = 0; // 1.5 to 3 times IQR above Q3 + int high_severe = 0; // more than 3 times IQR above Q3 + + int total() const { + return low_severe + low_mild + high_mild + high_severe; + } + }; + } // namespace Benchmark +} // namespace Catch -} // end namespace Catch +// end catch_outlier_classification.hpp +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING -// end catch_option.hpp #include <string> #include <iosfwd> #include <map> #include <set> #include <memory> +#include <algorithm> namespace Catch { @@ -5222,14 +5598,43 @@ namespace Catch { bool aborting; }; +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) struct BenchmarkInfo { std::string name; + double estimatedDuration; + int iterations; + int samples; + unsigned int resamples; + double clockResolution; + double clockCost; }; + + template <class Duration> struct BenchmarkStats { BenchmarkInfo info; - std::size_t iterations; - uint64_t elapsedTimeInNanoseconds; + + std::vector<Duration> samples; + Benchmark::Estimate<Duration> mean; + Benchmark::Estimate<Duration> standardDeviation; + Benchmark::OutlierClassification outliers; + double outlierVariance; + + template <typename Duration2> + operator BenchmarkStats<Duration2>() const { + std::vector<Duration2> samples2; + samples2.reserve(samples.size()); + std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); }); + return { + info, + std::move(samples2), + mean, + standardDeviation, + outliers, + outlierVariance, + }; + } }; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING struct IStreamingReporter { virtual ~IStreamingReporter() = default; @@ -5242,23 +5647,26 @@ namespace Catch { virtual void noMatchingTestCases( std::string const& spec ) = 0; + virtual void reportInvalidArguments(std::string const&) {} + virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; - // *** experimental *** +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + virtual void benchmarkPreparing( std::string const& ) {} virtual void benchmarkStarting( BenchmarkInfo const& ) {} + virtual void benchmarkEnded( BenchmarkStats<> const& ) {} + virtual void benchmarkFailed( std::string const& ) {} +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; // The return value indicates if the messages buffer should be cleared: virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; - // *** experimental *** - virtual void benchmarkEnded( BenchmarkStats const& ) {} - virtual void sectionEnded( SectionStats const& sectionStats ) = 0; virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; @@ -5307,6 +5715,9 @@ namespace Catch { // Returns double formatted as %.3f (format expected on output) std::string getFormattedDuration( double duration ); + //! Should the reporter show + bool shouldShowDuration( IConfig const& config, double duration ); + std::string serializeFilters( std::vector<std::string> const& container ); template<typename DerivedT> @@ -5333,6 +5744,8 @@ namespace Catch { void noMatchingTestCases(std::string const&) override {} + void reportInvalidArguments(std::string const&) override {} + void testRunStarting(TestRunInfo const& _testRunInfo) override { currentTestRunInfo = _testRunInfo; } @@ -5667,14 +6080,16 @@ namespace Catch { #if !defined(CATCH_CONFIG_DISABLE) #define CATCH_REGISTER_REPORTER( name, reporterType ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } \ - CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION #define CATCH_REGISTER_LISTENER( listenerType ) \ - CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ - namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } \ - CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION #else // CATCH_CONFIG_DISABLE #define CATCH_REGISTER_REPORTER(name, reporterType) @@ -5696,8 +6111,6 @@ namespace Catch { static std::string getDescription(); - ReporterPreferences getPreferences() const override; - void noMatchingTestCases(std::string const& spec) override; void assertionStarting(AssertionInfo const&) override; @@ -5736,6 +6149,8 @@ namespace Catch { void noMatchingTestCases(std::string const& spec) override; + void reportInvalidArguments(std::string const&arg) override; + void assertionStarting(AssertionInfo const&) override; bool assertionEnded(AssertionStats const& _assertionStats) override; @@ -5743,8 +6158,12 @@ namespace Catch { void sectionStarting(SectionInfo const& _sectionInfo) override; void sectionEnded(SectionStats const& _sectionStats) override; +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing(std::string const& name) override; void benchmarkStarting(BenchmarkInfo const& info) override; - void benchmarkEnded(BenchmarkStats const& stats) override; + void benchmarkEnded(BenchmarkStats<> const& stats) override; + void benchmarkFailed(std::string const& error) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING void testCaseEnded(TestCaseStats const& _testCaseStats) override; void testGroupEnded(TestGroupStats const& _testGroupStats) override; @@ -5791,6 +6210,14 @@ namespace Catch { #include <vector> namespace Catch { + enum class XmlFormatting { + None = 0x00, + Indent = 0x01, + Newline = 0x02, + }; + + XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs); + XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs); class XmlEncode { public: @@ -5812,14 +6239,14 @@ namespace Catch { class ScopedElement { public: - ScopedElement( XmlWriter* writer ); + ScopedElement( XmlWriter* writer, XmlFormatting fmt ); ScopedElement( ScopedElement&& other ) noexcept; ScopedElement& operator=( ScopedElement&& other ) noexcept; ~ScopedElement(); - ScopedElement& writeText( std::string const& text, bool indent = true ); + ScopedElement& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent ); template<typename T> ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { @@ -5827,156 +6254,1189 @@ namespace Catch { return *this; } - private: - mutable XmlWriter* m_writer = nullptr; - }; + private: + mutable XmlWriter* m_writer = nullptr; + XmlFormatting m_fmt; + }; + + XmlWriter( std::ostream& os = Catch::cout() ); + ~XmlWriter(); + + XmlWriter( XmlWriter const& ) = delete; + XmlWriter& operator=( XmlWriter const& ) = delete; + + XmlWriter& startElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + ScopedElement scopedElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + XmlWriter& endElement(XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ); + + XmlWriter& writeAttribute( std::string const& name, bool attribute ); + + template<typename T> + XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { + ReusableStringStream rss; + rss << attribute; + return writeAttribute( name, rss.str() ); + } + + XmlWriter& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + XmlWriter& writeComment(std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + void writeStylesheetRef( std::string const& url ); + + XmlWriter& writeBlankLine(); + + void ensureTagClosed(); + + private: + + void applyFormatting(XmlFormatting fmt); + + void writeDeclaration(); + + void newlineIfNecessary(); + + bool m_tagIsOpen = false; + bool m_needsNewline = false; + std::vector<std::string> m_tags; + std::string m_indent; + std::ostream& m_os; + }; + +} + +// end catch_xmlwriter.h +namespace Catch { + + class JunitReporter : public CumulativeReporterBase<JunitReporter> { + public: + JunitReporter(ReporterConfig const& _config); + + ~JunitReporter() override; + + static std::string getDescription(); + + void noMatchingTestCases(std::string const& /*spec*/) override; + + void testRunStarting(TestRunInfo const& runInfo) override; + + void testGroupStarting(GroupInfo const& groupInfo) override; + + void testCaseStarting(TestCaseInfo const& testCaseInfo) override; + bool assertionEnded(AssertionStats const& assertionStats) override; + + void testCaseEnded(TestCaseStats const& testCaseStats) override; + + void testGroupEnded(TestGroupStats const& testGroupStats) override; + + void testRunEndedCumulative() override; + + void writeGroup(TestGroupNode const& groupNode, double suiteTime); + + void writeTestCase(TestCaseNode const& testCaseNode); + + void writeSection(std::string const& className, + std::string const& rootName, + SectionNode const& sectionNode); + + void writeAssertions(SectionNode const& sectionNode); + void writeAssertion(AssertionStats const& stats); + + XmlWriter xml; + Timer suiteTimer; + std::string stdOutForSuite; + std::string stdErrForSuite; + unsigned int unexpectedExceptions = 0; + bool m_okToFail = false; + }; + +} // end namespace Catch + +// end catch_reporter_junit.h +// start catch_reporter_xml.h + +namespace Catch { + class XmlReporter : public StreamingReporterBase<XmlReporter> { + public: + XmlReporter(ReporterConfig const& _config); + + ~XmlReporter() override; + + static std::string getDescription(); + + virtual std::string getStylesheetRef() const; + + void writeSourceInfo(SourceLineInfo const& sourceInfo); + + public: // StreamingReporterBase + + void noMatchingTestCases(std::string const& s) override; + + void testRunStarting(TestRunInfo const& testInfo) override; + + void testGroupStarting(GroupInfo const& groupInfo) override; + + void testCaseStarting(TestCaseInfo const& testInfo) override; + + void sectionStarting(SectionInfo const& sectionInfo) override; + + void assertionStarting(AssertionInfo const&) override; + + bool assertionEnded(AssertionStats const& assertionStats) override; + + void sectionEnded(SectionStats const& sectionStats) override; + + void testCaseEnded(TestCaseStats const& testCaseStats) override; + + void testGroupEnded(TestGroupStats const& testGroupStats) override; + + void testRunEnded(TestRunStats const& testRunStats) override; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing(std::string const& name) override; + void benchmarkStarting(BenchmarkInfo const&) override; + void benchmarkEnded(BenchmarkStats<> const&) override; + void benchmarkFailed(std::string const&) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + private: + Timer m_testCaseTimer; + XmlWriter m_xml; + int m_sectionDepth = 0; + }; + +} // end namespace Catch + +// end catch_reporter_xml.h + +// end catch_external_interfaces.h +#endif + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +// start catch_benchmarking_all.hpp + +// A proxy header that includes all of the benchmarking headers to allow +// concise include of the benchmarking features. You should prefer the +// individual includes in standard use. + +// start catch_benchmark.hpp + + // Benchmark + +// start catch_chronometer.hpp + +// User-facing chronometer + + +// start catch_clock.hpp + +// Clocks + + +#include <chrono> +#include <ratio> + +namespace Catch { + namespace Benchmark { + template <typename Clock> + using ClockDuration = typename Clock::duration; + template <typename Clock> + using FloatDuration = std::chrono::duration<double, typename Clock::period>; + + template <typename Clock> + using TimePoint = typename Clock::time_point; + + using default_clock = std::chrono::steady_clock; + + template <typename Clock> + struct now { + TimePoint<Clock> operator()() const { + return Clock::now(); + } + }; + + using fp_seconds = std::chrono::duration<double, std::ratio<1>>; + } // namespace Benchmark +} // namespace Catch + +// end catch_clock.hpp +// start catch_optimizer.hpp + + // Hinting the optimizer + + +#if defined(_MSC_VER) +# include <atomic> // atomic_thread_fence +#endif + +namespace Catch { + namespace Benchmark { +#if defined(__GNUC__) || defined(__clang__) + template <typename T> + inline void keep_memory(T* p) { + asm volatile("" : : "g"(p) : "memory"); + } + inline void keep_memory() { + asm volatile("" : : : "memory"); + } + + namespace Detail { + inline void optimizer_barrier() { keep_memory(); } + } // namespace Detail +#elif defined(_MSC_VER) + +#pragma optimize("", off) + template <typename T> + inline void keep_memory(T* p) { + // thanks @milleniumbug + *reinterpret_cast<char volatile*>(p) = *reinterpret_cast<char const volatile*>(p); + } + // TODO equivalent keep_memory() +#pragma optimize("", on) + + namespace Detail { + inline void optimizer_barrier() { + std::atomic_thread_fence(std::memory_order_seq_cst); + } + } // namespace Detail + +#endif + + template <typename T> + inline void deoptimize_value(T&& x) { + keep_memory(&x); + } + + template <typename Fn, typename... Args> + inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<!std::is_same<void, decltype(fn(args...))>::value>::type { + deoptimize_value(std::forward<Fn>(fn) (std::forward<Args...>(args...))); + } + + template <typename Fn, typename... Args> + inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<std::is_same<void, decltype(fn(args...))>::value>::type { + std::forward<Fn>(fn) (std::forward<Args...>(args...)); + } + } // namespace Benchmark +} // namespace Catch + +// end catch_optimizer.hpp +// start catch_complete_invoke.hpp + +// Invoke with a special case for void + + +#include <type_traits> +#include <utility> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename T> + struct CompleteType { using type = T; }; + template <> + struct CompleteType<void> { struct type {}; }; + + template <typename T> + using CompleteType_t = typename CompleteType<T>::type; + + template <typename Result> + struct CompleteInvoker { + template <typename Fun, typename... Args> + static Result invoke(Fun&& fun, Args&&... args) { + return std::forward<Fun>(fun)(std::forward<Args>(args)...); + } + }; + template <> + struct CompleteInvoker<void> { + template <typename Fun, typename... Args> + static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) { + std::forward<Fun>(fun)(std::forward<Args>(args)...); + return {}; + } + }; + + // invoke and not return void :( + template <typename Fun, typename... Args> + CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(Fun&& fun, Args&&... args) { + return CompleteInvoker<FunctionReturnType<Fun, Args...>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...); + } + + const std::string benchmarkErrorMsg = "a benchmark failed to run successfully"; + } // namespace Detail + + template <typename Fun> + Detail::CompleteType_t<FunctionReturnType<Fun>> user_code(Fun&& fun) { + CATCH_TRY{ + return Detail::complete_invoke(std::forward<Fun>(fun)); + } CATCH_CATCH_ALL{ + getResultCapture().benchmarkFailed(translateActiveException()); + CATCH_RUNTIME_ERROR(Detail::benchmarkErrorMsg); + } + } + } // namespace Benchmark +} // namespace Catch + +// end catch_complete_invoke.hpp +namespace Catch { + namespace Benchmark { + namespace Detail { + struct ChronometerConcept { + virtual void start() = 0; + virtual void finish() = 0; + virtual ~ChronometerConcept() = default; + }; + template <typename Clock> + struct ChronometerModel final : public ChronometerConcept { + void start() override { started = Clock::now(); } + void finish() override { finished = Clock::now(); } + + ClockDuration<Clock> elapsed() const { return finished - started; } + + TimePoint<Clock> started; + TimePoint<Clock> finished; + }; + } // namespace Detail + + struct Chronometer { + public: + template <typename Fun> + void measure(Fun&& fun) { measure(std::forward<Fun>(fun), is_callable<Fun(int)>()); } + + int runs() const { return k; } + + Chronometer(Detail::ChronometerConcept& meter, int k) + : impl(&meter) + , k(k) {} + + private: + template <typename Fun> + void measure(Fun&& fun, std::false_type) { + measure([&fun](int) { return fun(); }, std::true_type()); + } + + template <typename Fun> + void measure(Fun&& fun, std::true_type) { + Detail::optimizer_barrier(); + impl->start(); + for (int i = 0; i < k; ++i) invoke_deoptimized(fun, i); + impl->finish(); + Detail::optimizer_barrier(); + } + + Detail::ChronometerConcept* impl; + int k; + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_chronometer.hpp +// start catch_environment.hpp + +// Environment information + + +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct EnvironmentEstimate { + Duration mean; + OutlierClassification outliers; + + template <typename Duration2> + operator EnvironmentEstimate<Duration2>() const { + return { mean, outliers }; + } + }; + template <typename Clock> + struct Environment { + using clock_type = Clock; + EnvironmentEstimate<FloatDuration<Clock>> clock_resolution; + EnvironmentEstimate<FloatDuration<Clock>> clock_cost; + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_environment.hpp +// start catch_execution_plan.hpp + + // Execution plan + + +// start catch_benchmark_function.hpp + + // Dumb std::function implementation for consistent call overhead + + +#include <cassert> +#include <type_traits> +#include <utility> +#include <memory> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename T> + using Decay = typename std::decay<T>::type; + template <typename T, typename U> + struct is_related + : std::is_same<Decay<T>, Decay<U>> {}; + + /// We need to reinvent std::function because every piece of code that might add overhead + /// in a measurement context needs to have consistent performance characteristics so that we + /// can account for it in the measurement. + /// Implementations of std::function with optimizations that aren't always applicable, like + /// small buffer optimizations, are not uncommon. + /// This is effectively an implementation of std::function without any such optimizations; + /// it may be slow, but it is consistently slow. + struct BenchmarkFunction { + private: + struct callable { + virtual void call(Chronometer meter) const = 0; + virtual callable* clone() const = 0; + virtual ~callable() = default; + }; + template <typename Fun> + struct model : public callable { + model(Fun&& fun) : fun(std::move(fun)) {} + model(Fun const& fun) : fun(fun) {} + + model<Fun>* clone() const override { return new model<Fun>(*this); } + + void call(Chronometer meter) const override { + call(meter, is_callable<Fun(Chronometer)>()); + } + void call(Chronometer meter, std::true_type) const { + fun(meter); + } + void call(Chronometer meter, std::false_type) const { + meter.measure(fun); + } + + Fun fun; + }; + + struct do_nothing { void operator()() const {} }; + + template <typename T> + BenchmarkFunction(model<T>* c) : f(c) {} + + public: + BenchmarkFunction() + : f(new model<do_nothing>{ {} }) {} + + template <typename Fun, + typename std::enable_if<!is_related<Fun, BenchmarkFunction>::value, int>::type = 0> + BenchmarkFunction(Fun&& fun) + : f(new model<typename std::decay<Fun>::type>(std::forward<Fun>(fun))) {} + + BenchmarkFunction(BenchmarkFunction&& that) + : f(std::move(that.f)) {} + + BenchmarkFunction(BenchmarkFunction const& that) + : f(that.f->clone()) {} + + BenchmarkFunction& operator=(BenchmarkFunction&& that) { + f = std::move(that.f); + return *this; + } + + BenchmarkFunction& operator=(BenchmarkFunction const& that) { + f.reset(that.f->clone()); + return *this; + } + + void operator()(Chronometer meter) const { f->call(meter); } + + private: + std::unique_ptr<callable> f; + }; + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_benchmark_function.hpp +// start catch_repeat.hpp + +// repeat algorithm + + +#include <type_traits> +#include <utility> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Fun> + struct repeater { + void operator()(int k) const { + for (int i = 0; i < k; ++i) { + fun(); + } + } + Fun fun; + }; + template <typename Fun> + repeater<typename std::decay<Fun>::type> repeat(Fun&& fun) { + return { std::forward<Fun>(fun) }; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_repeat.hpp +// start catch_run_for_at_least.hpp + +// Run a function for a minimum amount of time + + +// start catch_measure.hpp + +// Measure + + +// start catch_timing.hpp + +// Timing + + +#include <tuple> +#include <type_traits> + +namespace Catch { + namespace Benchmark { + template <typename Duration, typename Result> + struct Timing { + Duration elapsed; + Result result; + int iterations; + }; + template <typename Clock, typename Func, typename... Args> + using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<FunctionReturnType<Func, Args...>>>; + } // namespace Benchmark +} // namespace Catch + +// end catch_timing.hpp +#include <utility> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Clock, typename Fun, typename... Args> + TimingOf<Clock, Fun, Args...> measure(Fun&& fun, Args&&... args) { + auto start = Clock::now(); + auto&& r = Detail::complete_invoke(fun, std::forward<Args>(args)...); + auto end = Clock::now(); + auto delta = end - start; + return { delta, std::forward<decltype(r)>(r), 1 }; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_measure.hpp +#include <utility> +#include <type_traits> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Clock, typename Fun> + TimingOf<Clock, Fun, int> measure_one(Fun&& fun, int iters, std::false_type) { + return Detail::measure<Clock>(fun, iters); + } + template <typename Clock, typename Fun> + TimingOf<Clock, Fun, Chronometer> measure_one(Fun&& fun, int iters, std::true_type) { + Detail::ChronometerModel<Clock> meter; + auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters)); + + return { meter.elapsed(), std::move(result), iters }; + } + + template <typename Clock, typename Fun> + using run_for_at_least_argument_t = typename std::conditional<is_callable<Fun(Chronometer)>::value, Chronometer, int>::type; + + struct optimized_away_error : std::exception { + const char* what() const noexcept override { + return "could not measure benchmark, maybe it was optimized away"; + } + }; + + template <typename Clock, typename Fun> + TimingOf<Clock, Fun, run_for_at_least_argument_t<Clock, Fun>> run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) { + auto iters = seed; + while (iters < (1 << 30)) { + auto&& Timing = measure_one<Clock>(fun, iters, is_callable<Fun(Chronometer)>()); + + if (Timing.elapsed >= how_long) { + return { Timing.elapsed, std::move(Timing.result), iters }; + } + iters *= 2; + } + throw optimized_away_error{}; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_run_for_at_least.hpp +#include <algorithm> + +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct ExecutionPlan { + int iterations_per_sample; + Duration estimated_duration; + Detail::BenchmarkFunction benchmark; + Duration warmup_time; + int warmup_iterations; + + template <typename Duration2> + operator ExecutionPlan<Duration2>() const { + return { iterations_per_sample, estimated_duration, benchmark, warmup_time, warmup_iterations }; + } + + template <typename Clock> + std::vector<FloatDuration<Clock>> run(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const { + // warmup a bit + Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_iterations, Detail::repeat(now<Clock>{})); + + std::vector<FloatDuration<Clock>> times; + times.reserve(cfg.benchmarkSamples()); + std::generate_n(std::back_inserter(times), cfg.benchmarkSamples(), [this, env] { + Detail::ChronometerModel<Clock> model; + this->benchmark(Chronometer(model, iterations_per_sample)); + auto sample_time = model.elapsed() - env.clock_cost.mean; + if (sample_time < FloatDuration<Clock>::zero()) sample_time = FloatDuration<Clock>::zero(); + return sample_time / iterations_per_sample; + }); + return times; + } + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_execution_plan.hpp +// start catch_estimate_clock.hpp + + // Environment measurement + + +// start catch_stats.hpp + +// Statistical analysis tools + + +#include <algorithm> +#include <functional> +#include <vector> +#include <iterator> +#include <numeric> +#include <tuple> +#include <cmath> +#include <utility> +#include <cstddef> +#include <random> + +namespace Catch { + namespace Benchmark { + namespace Detail { + using sample = std::vector<double>; + + double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last); + + template <typename Iterator> + OutlierClassification classify_outliers(Iterator first, Iterator last) { + std::vector<double> copy(first, last); + + auto q1 = weighted_average_quantile(1, 4, copy.begin(), copy.end()); + auto q3 = weighted_average_quantile(3, 4, copy.begin(), copy.end()); + auto iqr = q3 - q1; + auto los = q1 - (iqr * 3.); + auto lom = q1 - (iqr * 1.5); + auto him = q3 + (iqr * 1.5); + auto his = q3 + (iqr * 3.); + + OutlierClassification o; + for (; first != last; ++first) { + auto&& t = *first; + if (t < los) ++o.low_severe; + else if (t < lom) ++o.low_mild; + else if (t > his) ++o.high_severe; + else if (t > him) ++o.high_mild; + ++o.samples_seen; + } + return o; + } + + template <typename Iterator> + double mean(Iterator first, Iterator last) { + auto count = last - first; + double sum = std::accumulate(first, last, 0.); + return sum / count; + } + + template <typename URng, typename Iterator, typename Estimator> + sample resample(URng& rng, int resamples, Iterator first, Iterator last, Estimator& estimator) { + auto n = last - first; + std::uniform_int_distribution<decltype(n)> dist(0, n - 1); + + sample out; + out.reserve(resamples); + std::generate_n(std::back_inserter(out), resamples, [n, first, &estimator, &dist, &rng] { + std::vector<double> resampled; + resampled.reserve(n); + std::generate_n(std::back_inserter(resampled), n, [first, &dist, &rng] { return first[dist(rng)]; }); + return estimator(resampled.begin(), resampled.end()); + }); + std::sort(out.begin(), out.end()); + return out; + } + + template <typename Estimator, typename Iterator> + sample jackknife(Estimator&& estimator, Iterator first, Iterator last) { + auto n = last - first; + auto second = std::next(first); + sample results; + results.reserve(n); - XmlWriter( std::ostream& os = Catch::cout() ); - ~XmlWriter(); + for (auto it = first; it != last; ++it) { + std::iter_swap(it, first); + results.push_back(estimator(second, last)); + } - XmlWriter( XmlWriter const& ) = delete; - XmlWriter& operator=( XmlWriter const& ) = delete; + return results; + } - XmlWriter& startElement( std::string const& name ); + inline double normal_cdf(double x) { + return std::erfc(-x / std::sqrt(2.0)) / 2.0; + } - ScopedElement scopedElement( std::string const& name ); + double erfc_inv(double x); + + double normal_quantile(double p); + + template <typename Iterator, typename Estimator> + Estimate<double> bootstrap(double confidence_level, Iterator first, Iterator last, sample const& resample, Estimator&& estimator) { + auto n_samples = last - first; + + double point = estimator(first, last); + // Degenerate case with a single sample + if (n_samples == 1) return { point, point, point, confidence_level }; + + sample jack = jackknife(estimator, first, last); + double jack_mean = mean(jack.begin(), jack.end()); + double sum_squares, sum_cubes; + std::tie(sum_squares, sum_cubes) = std::accumulate(jack.begin(), jack.end(), std::make_pair(0., 0.), [jack_mean](std::pair<double, double> sqcb, double x) -> std::pair<double, double> { + auto d = jack_mean - x; + auto d2 = d * d; + auto d3 = d2 * d; + return { sqcb.first + d2, sqcb.second + d3 }; + }); + + double accel = sum_cubes / (6 * std::pow(sum_squares, 1.5)); + int n = static_cast<int>(resample.size()); + double prob_n = std::count_if(resample.begin(), resample.end(), [point](double x) { return x < point; }) / (double)n; + // degenerate case with uniform samples + if (prob_n == 0) return { point, point, point, confidence_level }; + + double bias = normal_quantile(prob_n); + double z1 = normal_quantile((1. - confidence_level) / 2.); + + auto cumn = [n](double x) -> int { + return std::lround(normal_cdf(x) * n); }; + auto a = [bias, accel](double b) { return bias + b / (1. - accel * b); }; + double b1 = bias + z1; + double b2 = bias - z1; + double a1 = a(b1); + double a2 = a(b2); + auto lo = std::max(cumn(a1), 0); + auto hi = std::min(cumn(a2), n - 1); + + return { point, resample[lo], resample[hi], confidence_level }; + } - XmlWriter& endElement(); + double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n); - XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ); + struct bootstrap_analysis { + Estimate<double> mean; + Estimate<double> standard_deviation; + double outlier_variance; + }; - XmlWriter& writeAttribute( std::string const& name, bool attribute ); + bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last); + } // namespace Detail + } // namespace Benchmark +} // namespace Catch - template<typename T> - XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { - ReusableStringStream rss; - rss << attribute; - return writeAttribute( name, rss.str() ); - } +// end catch_stats.hpp +#include <algorithm> +#include <iterator> +#include <tuple> +#include <vector> +#include <cmath> - XmlWriter& writeText( std::string const& text, bool indent = true ); +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Clock> + std::vector<double> resolution(int k) { + std::vector<TimePoint<Clock>> times; + times.reserve(k + 1); + std::generate_n(std::back_inserter(times), k + 1, now<Clock>{}); + + std::vector<double> deltas; + deltas.reserve(k); + std::transform(std::next(times.begin()), times.end(), times.begin(), + std::back_inserter(deltas), + [](TimePoint<Clock> a, TimePoint<Clock> b) { return static_cast<double>((a - b).count()); }); + + return deltas; + } - XmlWriter& writeComment( std::string const& text ); + const auto warmup_iterations = 10000; + const auto warmup_time = std::chrono::milliseconds(100); + const auto minimum_ticks = 1000; + const auto warmup_seed = 10000; + const auto clock_resolution_estimation_time = std::chrono::milliseconds(500); + const auto clock_cost_estimation_time_limit = std::chrono::seconds(1); + const auto clock_cost_estimation_tick_limit = 100000; + const auto clock_cost_estimation_time = std::chrono::milliseconds(10); + const auto clock_cost_estimation_iterations = 10000; + + template <typename Clock> + int warmup() { + return run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_seed, &resolution<Clock>) + .iterations; + } + template <typename Clock> + EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_resolution(int iterations) { + auto r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_resolution_estimation_time), iterations, &resolution<Clock>) + .result; + return { + FloatDuration<Clock>(mean(r.begin(), r.end())), + classify_outliers(r.begin(), r.end()), + }; + } + template <typename Clock> + EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_cost(FloatDuration<Clock> resolution) { + auto time_limit = std::min(resolution * clock_cost_estimation_tick_limit, FloatDuration<Clock>(clock_cost_estimation_time_limit)); + auto time_clock = [](int k) { + return Detail::measure<Clock>([k] { + for (int i = 0; i < k; ++i) { + volatile auto ignored = Clock::now(); + (void)ignored; + } + }).elapsed; + }; + time_clock(1); + int iters = clock_cost_estimation_iterations; + auto&& r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_cost_estimation_time), iters, time_clock); + std::vector<double> times; + int nsamples = static_cast<int>(std::ceil(time_limit / r.elapsed)); + times.reserve(nsamples); + std::generate_n(std::back_inserter(times), nsamples, [time_clock, &r] { + return static_cast<double>((time_clock(r.iterations) / r.iterations).count()); + }); + return { + FloatDuration<Clock>(mean(times.begin(), times.end())), + classify_outliers(times.begin(), times.end()), + }; + } - void writeStylesheetRef( std::string const& url ); + template <typename Clock> + Environment<FloatDuration<Clock>> measure_environment() { + static Environment<FloatDuration<Clock>>* env = nullptr; + if (env) { + return *env; + } - XmlWriter& writeBlankLine(); + auto iters = Detail::warmup<Clock>(); + auto resolution = Detail::estimate_clock_resolution<Clock>(iters); + auto cost = Detail::estimate_clock_cost<Clock>(resolution.mean); - void ensureTagClosed(); + env = new Environment<FloatDuration<Clock>>{ resolution, cost }; + return *env; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch - private: +// end catch_estimate_clock.hpp +// start catch_analyse.hpp - void writeDeclaration(); + // Run and analyse one benchmark - void newlineIfNecessary(); - bool m_tagIsOpen = false; - bool m_needsNewline = false; - std::vector<std::string> m_tags; - std::string m_indent; - std::ostream& m_os; - }; +// start catch_sample_analysis.hpp -} +// Benchmark results -// end catch_xmlwriter.h -namespace Catch { - class JunitReporter : public CumulativeReporterBase<JunitReporter> { - public: - JunitReporter(ReporterConfig const& _config); +#include <algorithm> +#include <vector> +#include <string> +#include <iterator> - ~JunitReporter() override; +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct SampleAnalysis { + std::vector<Duration> samples; + Estimate<Duration> mean; + Estimate<Duration> standard_deviation; + OutlierClassification outliers; + double outlier_variance; + + template <typename Duration2> + operator SampleAnalysis<Duration2>() const { + std::vector<Duration2> samples2; + samples2.reserve(samples.size()); + std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); }); + return { + std::move(samples2), + mean, + standard_deviation, + outliers, + outlier_variance, + }; + } + }; + } // namespace Benchmark +} // namespace Catch - static std::string getDescription(); +// end catch_sample_analysis.hpp +#include <algorithm> +#include <iterator> +#include <vector> - void noMatchingTestCases(std::string const& /*spec*/) override; +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Duration, typename Iterator> + SampleAnalysis<Duration> analyse(const IConfig &cfg, Environment<Duration>, Iterator first, Iterator last) { + if (!cfg.benchmarkNoAnalysis()) { + std::vector<double> samples; + samples.reserve(last - first); + std::transform(first, last, std::back_inserter(samples), [](Duration d) { return d.count(); }); + + auto analysis = Catch::Benchmark::Detail::analyse_samples(cfg.benchmarkConfidenceInterval(), cfg.benchmarkResamples(), samples.begin(), samples.end()); + auto outliers = Catch::Benchmark::Detail::classify_outliers(samples.begin(), samples.end()); + + auto wrap_estimate = [](Estimate<double> e) { + return Estimate<Duration> { + Duration(e.point), + Duration(e.lower_bound), + Duration(e.upper_bound), + e.confidence_interval, + }; + }; + std::vector<Duration> samples2; + samples2.reserve(samples.size()); + std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](double d) { return Duration(d); }); + return { + std::move(samples2), + wrap_estimate(analysis.mean), + wrap_estimate(analysis.standard_deviation), + outliers, + analysis.outlier_variance, + }; + } else { + std::vector<Duration> samples; + samples.reserve(last - first); + + Duration mean = Duration(0); + int i = 0; + for (auto it = first; it < last; ++it, ++i) { + samples.push_back(Duration(*it)); + mean += Duration(*it); + } + mean /= i; + + return { + std::move(samples), + Estimate<Duration>{mean, mean, mean, 0.0}, + Estimate<Duration>{Duration(0), Duration(0), Duration(0), 0.0}, + OutlierClassification{}, + 0.0 + }; + } + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch - void testRunStarting(TestRunInfo const& runInfo) override; +// end catch_analyse.hpp +#include <algorithm> +#include <functional> +#include <string> +#include <vector> +#include <cmath> - void testGroupStarting(GroupInfo const& groupInfo) override; +namespace Catch { + namespace Benchmark { + struct Benchmark { + Benchmark(std::string &&name) + : name(std::move(name)) {} + + template <class FUN> + Benchmark(std::string &&name, FUN &&func) + : fun(std::move(func)), name(std::move(name)) {} + + template <typename Clock> + ExecutionPlan<FloatDuration<Clock>> prepare(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const { + auto min_time = env.clock_resolution.mean * Detail::minimum_ticks; + auto run_time = std::max(min_time, std::chrono::duration_cast<decltype(min_time)>(cfg.benchmarkWarmupTime())); + auto&& test = Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(run_time), 1, fun); + int new_iters = static_cast<int>(std::ceil(min_time * test.iterations / test.elapsed)); + return { new_iters, test.elapsed / test.iterations * new_iters * cfg.benchmarkSamples(), fun, std::chrono::duration_cast<FloatDuration<Clock>>(cfg.benchmarkWarmupTime()), Detail::warmup_iterations }; + } - void testCaseStarting(TestCaseInfo const& testCaseInfo) override; - bool assertionEnded(AssertionStats const& assertionStats) override; + template <typename Clock = default_clock> + void run() { + IConfigPtr cfg = getCurrentContext().getConfig(); - void testCaseEnded(TestCaseStats const& testCaseStats) override; + auto env = Detail::measure_environment<Clock>(); - void testGroupEnded(TestGroupStats const& testGroupStats) override; + getResultCapture().benchmarkPreparing(name); + CATCH_TRY{ + auto plan = user_code([&] { + return prepare<Clock>(*cfg, env); + }); - void testRunEndedCumulative() override; + BenchmarkInfo info { + name, + plan.estimated_duration.count(), + plan.iterations_per_sample, + cfg->benchmarkSamples(), + cfg->benchmarkResamples(), + env.clock_resolution.mean.count(), + env.clock_cost.mean.count() + }; - void writeGroup(TestGroupNode const& groupNode, double suiteTime); + getResultCapture().benchmarkStarting(info); - void writeTestCase(TestCaseNode const& testCaseNode); + auto samples = user_code([&] { + return plan.template run<Clock>(*cfg, env); + }); - void writeSection(std::string const& className, - std::string const& rootName, - SectionNode const& sectionNode); + auto analysis = Detail::analyse(*cfg, env, samples.begin(), samples.end()); + BenchmarkStats<FloatDuration<Clock>> stats{ info, analysis.samples, analysis.mean, analysis.standard_deviation, analysis.outliers, analysis.outlier_variance }; + getResultCapture().benchmarkEnded(stats); - void writeAssertions(SectionNode const& sectionNode); - void writeAssertion(AssertionStats const& stats); + } CATCH_CATCH_ALL{ + if (translateActiveException() != Detail::benchmarkErrorMsg) // benchmark errors have been reported, otherwise rethrow. + std::rethrow_exception(std::current_exception()); + } + } - XmlWriter xml; - Timer suiteTimer; - std::string stdOutForSuite; - std::string stdErrForSuite; - unsigned int unexpectedExceptions = 0; - bool m_okToFail = false; - }; + // sets lambda to be used in fun *and* executes benchmark! + template <typename Fun, + typename std::enable_if<!Detail::is_related<Fun, Benchmark>::value, int>::type = 0> + Benchmark & operator=(Fun func) { + fun = Detail::BenchmarkFunction(func); + run(); + return *this; + } -} // end namespace Catch + explicit operator bool() { + return true; + } -// end catch_reporter_junit.h -// start catch_reporter_xml.h + private: + Detail::BenchmarkFunction fun; + std::string name; + }; + } +} // namespace Catch -namespace Catch { - class XmlReporter : public StreamingReporterBase<XmlReporter> { - public: - XmlReporter(ReporterConfig const& _config); +#define INTERNAL_CATCH_GET_1_ARG(arg1, arg2, ...) arg1 +#define INTERNAL_CATCH_GET_2_ARG(arg1, arg2, ...) arg2 - ~XmlReporter() override; +#define INTERNAL_CATCH_BENCHMARK(BenchmarkName, name, benchmarkIndex)\ + if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \ + BenchmarkName = [&](int benchmarkIndex) - static std::string getDescription(); +#define INTERNAL_CATCH_BENCHMARK_ADVANCED(BenchmarkName, name)\ + if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \ + BenchmarkName = [&] - virtual std::string getStylesheetRef() const; +// end catch_benchmark.hpp +// start catch_constructor.hpp - void writeSourceInfo(SourceLineInfo const& sourceInfo); +// Constructor and destructor helpers - public: // StreamingReporterBase - void noMatchingTestCases(std::string const& s) override; +#include <type_traits> - void testRunStarting(TestRunInfo const& testInfo) override; +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename T, bool Destruct> + struct ObjectStorage + { + using TStorage = typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type; - void testGroupStarting(GroupInfo const& groupInfo) override; + ObjectStorage() : data() {} - void testCaseStarting(TestCaseInfo const& testInfo) override; + ObjectStorage(const ObjectStorage& other) + { + new(&data) T(other.stored_object()); + } - void sectionStarting(SectionInfo const& sectionInfo) override; + ObjectStorage(ObjectStorage&& other) + { + new(&data) T(std::move(other.stored_object())); + } - void assertionStarting(AssertionInfo const&) override; + ~ObjectStorage() { destruct_on_exit<T>(); } - bool assertionEnded(AssertionStats const& assertionStats) override; + template <typename... Args> + void construct(Args&&... args) + { + new (&data) T(std::forward<Args>(args)...); + } - void sectionEnded(SectionStats const& sectionStats) override; + template <bool AllowManualDestruction = !Destruct> + typename std::enable_if<AllowManualDestruction>::type destruct() + { + stored_object().~T(); + } - void testCaseEnded(TestCaseStats const& testCaseStats) override; + private: + // If this is a constructor benchmark, destruct the underlying object + template <typename U> + void destruct_on_exit(typename std::enable_if<Destruct, U>::type* = 0) { destruct<true>(); } + // Otherwise, don't + template <typename U> + void destruct_on_exit(typename std::enable_if<!Destruct, U>::type* = 0) { } - void testGroupEnded(TestGroupStats const& testGroupStats) override; + T& stored_object() { + return *static_cast<T*>(static_cast<void*>(&data)); + } - void testRunEnded(TestRunStats const& testRunStats) override; + T const& stored_object() const { + return *static_cast<T*>(static_cast<void*>(&data)); + } - private: - Timer m_testCaseTimer; - XmlWriter m_xml; - int m_sectionDepth = 0; - }; + TStorage data; + }; + } -} // end namespace Catch + template <typename T> + using storage_for = Detail::ObjectStorage<T, true>; -// end catch_reporter_xml.h + template <typename T> + using destructable_object = Detail::ObjectStorage<T, false>; + } +} -// end catch_external_interfaces.h +// end catch_constructor.hpp +// end catch_benchmarking_all.hpp #endif #endif // ! CATCH_CONFIG_IMPL_ONLY @@ -6004,23 +7464,37 @@ namespace TestCaseTracking { SourceLineInfo location; NameAndLocation( std::string const& _name, SourceLineInfo const& _location ); + friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) { + return lhs.name == rhs.name + && lhs.location == rhs.location; + } }; - struct ITracker; + class ITracker; using ITrackerPtr = std::shared_ptr<ITracker>; - struct ITracker { - virtual ~ITracker(); + class ITracker { + NameAndLocation m_nameAndLocation; + + public: + ITracker(NameAndLocation const& nameAndLoc) : + m_nameAndLocation(nameAndLoc) + {} // static queries - virtual NameAndLocation const& nameAndLocation() const = 0; + NameAndLocation const& nameAndLocation() const { + return m_nameAndLocation; + } + + virtual ~ITracker(); // dynamic queries virtual bool isComplete() const = 0; // Successfully completed or failed virtual bool isSuccessfullyCompleted() const = 0; virtual bool isOpen() const = 0; // Started but not complete virtual bool hasChildren() const = 0; + virtual bool hasStarted() const = 0; virtual ITracker& parent() = 0; @@ -6075,7 +7549,6 @@ namespace TestCaseTracking { }; using Children = std::vector<ITrackerPtr>; - NameAndLocation m_nameAndLocation; TrackerContext& m_ctx; ITracker* m_parent; Children m_children; @@ -6084,11 +7557,13 @@ namespace TestCaseTracking { public: TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); - NameAndLocation const& nameAndLocation() const override; bool isComplete() const override; bool isSuccessfullyCompleted() const override; bool isOpen() const override; bool hasChildren() const override; + bool hasStarted() const override { + return m_runState != NotStarted; + } void addChild( ITrackerPtr const& child ) override; @@ -6113,6 +7588,7 @@ namespace TestCaseTracking { class SectionTracker : public TrackerBase { std::vector<std::string> m_filters; + std::string m_trimmed_name; public: SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); @@ -6150,6 +7626,217 @@ namespace Catch { } // end catch_leak_detector.h // Cpp files will be included in the single-header file here +// start catch_stats.cpp + +// Statistical analysis tools + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + +#include <cassert> +#include <random> + +#if defined(CATCH_CONFIG_USE_ASYNC) +#include <future> +#endif + +namespace { + double erf_inv(double x) { + // Code accompanying the article "Approximating the erfinv function" in GPU Computing Gems, Volume 2 + double w, p; + + w = -log((1.0 - x) * (1.0 + x)); + + if (w < 6.250000) { + w = w - 3.125000; + p = -3.6444120640178196996e-21; + p = -1.685059138182016589e-19 + p * w; + p = 1.2858480715256400167e-18 + p * w; + p = 1.115787767802518096e-17 + p * w; + p = -1.333171662854620906e-16 + p * w; + p = 2.0972767875968561637e-17 + p * w; + p = 6.6376381343583238325e-15 + p * w; + p = -4.0545662729752068639e-14 + p * w; + p = -8.1519341976054721522e-14 + p * w; + p = 2.6335093153082322977e-12 + p * w; + p = -1.2975133253453532498e-11 + p * w; + p = -5.4154120542946279317e-11 + p * w; + p = 1.051212273321532285e-09 + p * w; + p = -4.1126339803469836976e-09 + p * w; + p = -2.9070369957882005086e-08 + p * w; + p = 4.2347877827932403518e-07 + p * w; + p = -1.3654692000834678645e-06 + p * w; + p = -1.3882523362786468719e-05 + p * w; + p = 0.0001867342080340571352 + p * w; + p = -0.00074070253416626697512 + p * w; + p = -0.0060336708714301490533 + p * w; + p = 0.24015818242558961693 + p * w; + p = 1.6536545626831027356 + p * w; + } else if (w < 16.000000) { + w = sqrt(w) - 3.250000; + p = 2.2137376921775787049e-09; + p = 9.0756561938885390979e-08 + p * w; + p = -2.7517406297064545428e-07 + p * w; + p = 1.8239629214389227755e-08 + p * w; + p = 1.5027403968909827627e-06 + p * w; + p = -4.013867526981545969e-06 + p * w; + p = 2.9234449089955446044e-06 + p * w; + p = 1.2475304481671778723e-05 + p * w; + p = -4.7318229009055733981e-05 + p * w; + p = 6.8284851459573175448e-05 + p * w; + p = 2.4031110387097893999e-05 + p * w; + p = -0.0003550375203628474796 + p * w; + p = 0.00095328937973738049703 + p * w; + p = -0.0016882755560235047313 + p * w; + p = 0.0024914420961078508066 + p * w; + p = -0.0037512085075692412107 + p * w; + p = 0.005370914553590063617 + p * w; + p = 1.0052589676941592334 + p * w; + p = 3.0838856104922207635 + p * w; + } else { + w = sqrt(w) - 5.000000; + p = -2.7109920616438573243e-11; + p = -2.5556418169965252055e-10 + p * w; + p = 1.5076572693500548083e-09 + p * w; + p = -3.7894654401267369937e-09 + p * w; + p = 7.6157012080783393804e-09 + p * w; + p = -1.4960026627149240478e-08 + p * w; + p = 2.9147953450901080826e-08 + p * w; + p = -6.7711997758452339498e-08 + p * w; + p = 2.2900482228026654717e-07 + p * w; + p = -9.9298272942317002539e-07 + p * w; + p = 4.5260625972231537039e-06 + p * w; + p = -1.9681778105531670567e-05 + p * w; + p = 7.5995277030017761139e-05 + p * w; + p = -0.00021503011930044477347 + p * w; + p = -0.00013871931833623122026 + p * w; + p = 1.0103004648645343977 + p * w; + p = 4.8499064014085844221 + p * w; + } + return p * x; + } + + double standard_deviation(std::vector<double>::iterator first, std::vector<double>::iterator last) { + auto m = Catch::Benchmark::Detail::mean(first, last); + double variance = std::accumulate(first, last, 0., [m](double a, double b) { + double diff = b - m; + return a + diff * diff; + }) / (last - first); + return std::sqrt(variance); + } + +} + +namespace Catch { + namespace Benchmark { + namespace Detail { + + double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last) { + auto count = last - first; + double idx = (count - 1) * k / static_cast<double>(q); + int j = static_cast<int>(idx); + double g = idx - j; + std::nth_element(first, first + j, last); + auto xj = first[j]; + if (g == 0) return xj; + + auto xj1 = *std::min_element(first + (j + 1), last); + return xj + g * (xj1 - xj); + } + + double erfc_inv(double x) { + return erf_inv(1.0 - x); + } + + double normal_quantile(double p) { + static const double ROOT_TWO = std::sqrt(2.0); + + double result = 0.0; + assert(p >= 0 && p <= 1); + if (p < 0 || p > 1) { + return result; + } + + result = -erfc_inv(2.0 * p); + // result *= normal distribution standard deviation (1.0) * sqrt(2) + result *= /*sd * */ ROOT_TWO; + // result += normal disttribution mean (0) + return result; + } + + double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n) { + double sb = stddev.point; + double mn = mean.point / n; + double mg_min = mn / 2.; + double sg = std::min(mg_min / 4., sb / std::sqrt(n)); + double sg2 = sg * sg; + double sb2 = sb * sb; + + auto c_max = [n, mn, sb2, sg2](double x) -> double { + double k = mn - x; + double d = k * k; + double nd = n * d; + double k0 = -n * nd; + double k1 = sb2 - n * sg2 + nd; + double det = k1 * k1 - 4 * sg2 * k0; + return (int)(-2. * k0 / (k1 + std::sqrt(det))); + }; + + auto var_out = [n, sb2, sg2](double c) { + double nc = n - c; + return (nc / n) * (sb2 - nc * sg2); + }; + + return std::min(var_out(1), var_out(std::min(c_max(0.), c_max(mg_min)))) / sb2; + } + + bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last) { + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS + static std::random_device entropy; + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + + auto n = static_cast<int>(last - first); // seriously, one can't use integral types without hell in C++ + + auto mean = &Detail::mean<std::vector<double>::iterator>; + auto stddev = &standard_deviation; + +#if defined(CATCH_CONFIG_USE_ASYNC) + auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) { + auto seed = entropy(); + return std::async(std::launch::async, [=] { + std::mt19937 rng(seed); + auto resampled = resample(rng, n_resamples, first, last, f); + return bootstrap(confidence_level, first, last, resampled, f); + }); + }; + + auto mean_future = Estimate(mean); + auto stddev_future = Estimate(stddev); + + auto mean_estimate = mean_future.get(); + auto stddev_estimate = stddev_future.get(); +#else + auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) { + auto seed = entropy(); + std::mt19937 rng(seed); + auto resampled = resample(rng, n_resamples, first, last, f); + return bootstrap(confidence_level, first, last, resampled, f); + }; + + auto mean_estimate = Estimate(mean); + auto stddev_estimate = Estimate(stddev); +#endif // CATCH_USE_ASYNC + + double outlier_variance = Detail::outlier_variance(mean_estimate, stddev_estimate, n); + + return { mean_estimate, stddev_estimate, outlier_variance }; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING +// end catch_stats.cpp // start catch_approx.cpp #include <cmath> @@ -6194,7 +7881,8 @@ namespace Detail { bool Approx::equalityComparisonImpl(const double other) const { // First try with fixed margin, then compute margin based on epsilon, scale and Approx's value // Thanks to Richard Harris for his help refining the scaled margin value - return marginComparison(m_value, other, m_margin) || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(m_value))); + return marginComparison(m_value, other, m_margin) + || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(std::isinf(m_value)? 0 : m_value))); } void Approx::setMargin(double newMargin) { @@ -6238,7 +7926,24 @@ namespace Catch { #ifdef CATCH_PLATFORM_MAC - #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */ + #if defined(__i386__) || defined(__x86_64__) + #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */ + #elif defined(__aarch64__) + #define CATCH_TRAP() __asm__(".inst 0xd4200000") + #endif + +#elif defined(CATCH_PLATFORM_IPHONE) + + // use inline assembler + #if defined(__i386__) || defined(__x86_64__) + #define CATCH_TRAP() __asm__("int $3") + #elif defined(__aarch64__) + #define CATCH_TRAP() __asm__(".inst 0xd4200000") + #elif defined(__arm__) && !defined(__thumb__) + #define CATCH_TRAP() __asm__(".inst 0xe7f001f0") + #elif defined(__arm__) && defined(__thumb__) + #define CATCH_TRAP() __asm__(".inst 0xde01") + #endif #elif defined(CATCH_PLATFORM_LINUX) // If we can use inline assembler, do it because this allows us to break @@ -6258,10 +7963,12 @@ namespace Catch { #define CATCH_TRAP() DebugBreak() #endif -#ifdef CATCH_TRAP - #define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }() -#else - #define CATCH_BREAK_INTO_DEBUGGER() []{}() +#ifndef CATCH_BREAK_INTO_DEBUGGER + #ifdef CATCH_TRAP + #define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }() + #else + #define CATCH_BREAK_INTO_DEBUGGER() []{}() + #endif #endif // end catch_debugger.h @@ -6408,10 +8115,14 @@ namespace Catch { void sectionEnded( SectionEndInfo const& endInfo ) override; void sectionEndedEarly( SectionEndInfo const& endInfo ) override; - auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override; + auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override; +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing( std::string const& name ) override; void benchmarkStarting( BenchmarkInfo const& info ) override; - void benchmarkEnded( BenchmarkStats const& stats ) override; + void benchmarkEnded( BenchmarkStats<> const& stats ) override; + void benchmarkFailed( std::string const& error ) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING void pushScopedMessage( MessageInfo const& message ) override; void popScopedMessage( MessageInfo const& message ) override; @@ -6475,6 +8186,8 @@ namespace Catch { bool m_includeSuccessfulResults; }; + void seedRng(IConfig const& config); + unsigned int rngSeed(); } // end namespace Catch // end catch_run_context.h @@ -6621,7 +8334,7 @@ namespace Catch { } bool AssertionResult::hasExpression() const { - return m_info.capturedExpression[0] != 0; + return !m_info.capturedExpression.empty(); } bool AssertionResult::hasMessage() const { @@ -6629,16 +8342,22 @@ namespace Catch { } std::string AssertionResult::getExpression() const { - if( isFalseTest( m_info.resultDisposition ) ) - return "!(" + m_info.capturedExpression + ")"; - else - return m_info.capturedExpression; + // Possibly overallocating by 3 characters should be basically free + std::string expr; expr.reserve(m_info.capturedExpression.size() + 3); + if (isFalseTest(m_info.resultDisposition)) { + expr += "!("; + } + expr += m_info.capturedExpression; + if (isFalseTest(m_info.resultDisposition)) { + expr += ')'; + } + return expr; } std::string AssertionResult::getExpressionInMacro() const { std::string expr; - if( m_info.macroName[0] == 0 ) - expr = m_info.capturedExpression; + if( m_info.macroName.empty() ) + expr = static_cast<std::string>(m_info.capturedExpression); else { expr.reserve( m_info.macroName.size() + m_info.capturedExpression.size() + 4 ); expr += m_info.macroName; @@ -6673,32 +8392,6 @@ namespace Catch { } // end namespace Catch // end catch_assertionresult.cpp -// start catch_benchmark.cpp - -namespace Catch { - - auto BenchmarkLooper::getResolution() -> uint64_t { - return getEstimatedClockResolution() * getCurrentContext().getConfig()->benchmarkResolutionMultiple(); - } - - void BenchmarkLooper::reportStart() { - getResultCapture().benchmarkStarting( { m_name } ); - } - auto BenchmarkLooper::needsMoreIterations() -> bool { - auto elapsed = m_timer.getElapsedNanoseconds(); - - // Exponentially increasing iterations until we're confident in our timer resolution - if( elapsed < m_resolution ) { - m_iterationsToRun *= 10; - return true; - } - - getResultCapture().benchmarkEnded( { { m_name }, m_count, elapsed } ); - return false; - } - -} // end namespace Catch -// end catch_benchmark.cpp // start catch_capture_matchers.cpp namespace Catch { @@ -7398,7 +9091,7 @@ namespace detail { } inline auto convertInto( std::string const &source, bool &target ) -> ParserResult { std::string srcLC = source; - std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( char c ) { return static_cast<char>( std::tolower(c) ); } ); + std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( unsigned char c ) { return static_cast<char>( std::tolower(c) ); } ); if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" || srcLC == "on") target = true; else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" || srcLC == "off") @@ -8046,9 +9739,14 @@ namespace Catch { if( !line.empty() && !startsWith( line, '#' ) ) { if( !startsWith( line, '"' ) ) line = '"' + line + '"'; - config.testsOrTags.push_back( line + ',' ); + config.testsOrTags.push_back( line ); + config.testsOrTags.emplace_back( "," ); } } + //Remove comma in the end + if(!config.testsOrTags.empty()) + config.testsOrTags.erase( config.testsOrTags.end()-1 ); + return ParserResult::ok( ParseResultType::Matched ); }; auto const setTestOrder = [&]( std::string const& order ) { @@ -8083,14 +9781,16 @@ namespace Catch { }; auto const setWaitForKeypress = [&]( std::string const& keypress ) { auto keypressLc = toLower( keypress ); - if( keypressLc == "start" ) + if (keypressLc == "never") + config.waitForKeypress = WaitForKeypress::Never; + else if( keypressLc == "start" ) config.waitForKeypress = WaitForKeypress::BeforeStart; else if( keypressLc == "exit" ) config.waitForKeypress = WaitForKeypress::BeforeExit; else if( keypressLc == "both" ) config.waitForKeypress = WaitForKeypress::BeforeStartAndExit; else - return ParserResult::runtimeError( "keypress argument must be one of: start, exit or both. '" + keypress + "' not recognised" ); + return ParserResult::runtimeError( "keypress argument must be one of: never, start, exit or both. '" + keypress + "' not recognised" ); return ParserResult::ok( ParseResultType::Matched ); }; auto const setVerbosity = [&]( std::string const& verbosity ) { @@ -8160,6 +9860,9 @@ namespace Catch { | Opt( [&]( bool flag ) { config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never; }, "yes|no" ) ["-d"]["--durations"] ( "show test durations" ) + | Opt( config.minDuration, "seconds" ) + ["-D"]["--min-duration"] + ( "show test durations for tests taking at least the given number of seconds" ) | Opt( loadTestNamesFromFile, "filename" ) ["-f"]["--input-file"] ( "load test names to run from a file" ) @@ -8190,13 +9893,24 @@ namespace Catch { | Opt( config.libIdentify ) ["--libidentify"] ( "report name and version according to libidentify standard" ) - | Opt( setWaitForKeypress, "start|exit|both" ) + | Opt( setWaitForKeypress, "never|start|exit|both" ) ["--wait-for-keypress"] ( "waits for a keypress before exiting" ) - | Opt( config.benchmarkResolutionMultiple, "multiplier" ) - ["--benchmark-resolution-multiple"] - ( "multiple of clock resolution to run benchmarks" ) - + | Opt( config.benchmarkSamples, "samples" ) + ["--benchmark-samples"] + ( "number of samples to collect (default: 100)" ) + | Opt( config.benchmarkResamples, "resamples" ) + ["--benchmark-resamples"] + ( "number of resamples for the bootstrap (default: 100000)" ) + | Opt( config.benchmarkConfidenceInterval, "confidence interval" ) + ["--benchmark-confidence-interval"] + ( "confidence interval for the bootstrap (between 0 and 1, default: 0.95)" ) + | Opt( config.benchmarkNoAnalysis ) + ["--benchmark-no-analysis"] + ( "perform only measurements; do not perform any analysis" ) + | Opt( config.benchmarkWarmupTime, "benchmarkWarmupTime" ) + ["--benchmark-warmup-time"] + ( "amount of time in milliseconds spent on warming up each test (default: 100)" ) | Arg( config.testsOrTags, "test name|pattern|tags" ) ( "which test or tests to use" ); @@ -8212,9 +9926,6 @@ namespace Catch { namespace Catch { - bool SourceLineInfo::empty() const noexcept { - return file[0] == '\0'; - } bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const noexcept { return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0); } @@ -8250,11 +9961,23 @@ namespace Catch { : m_data( data ), m_stream( openStream() ) { + // We need to trim filter specs to avoid trouble with superfluous + // whitespace (esp. important for bdd macros, as those are manually + // aligned with whitespace). + + for (auto& elem : m_data.testsOrTags) { + elem = trim(elem); + } + for (auto& elem : m_data.sectionsToRun) { + elem = trim(elem); + } + TestSpecParser parser(ITagAliasRegistry::get()); - if (!data.testsOrTags.empty()) { + if (!m_data.testsOrTags.empty()) { m_hasTestFilters = true; - for( auto const& testOrTags : data.testsOrTags ) - parser.parse( testOrTags ); + for (auto const& testOrTags : m_data.testsOrTags) { + parser.parse(testOrTags); + } } m_testSpec = parser.testSpec(); } @@ -8287,15 +10010,21 @@ namespace Catch { bool Config::warnAboutMissingAssertions() const { return !!(m_data.warnings & WarnAbout::NoAssertions); } bool Config::warnAboutNoTests() const { return !!(m_data.warnings & WarnAbout::NoTests); } ShowDurations::OrNot Config::showDurations() const { return m_data.showDurations; } + double Config::minDuration() const { return m_data.minDuration; } RunTests::InWhatOrder Config::runOrder() const { return m_data.runOrder; } unsigned int Config::rngSeed() const { return m_data.rngSeed; } - int Config::benchmarkResolutionMultiple() const { return m_data.benchmarkResolutionMultiple; } UseColour::YesOrNo Config::useColour() const { return m_data.useColour; } bool Config::shouldDebugBreak() const { return m_data.shouldDebugBreak; } int Config::abortAfter() const { return m_data.abortAfter; } bool Config::showInvisibles() const { return m_data.showInvisibles; } Verbosity Config::verbosity() const { return m_data.verbosity; } + bool Config::benchmarkNoAnalysis() const { return m_data.benchmarkNoAnalysis; } + int Config::benchmarkSamples() const { return m_data.benchmarkSamples; } + double Config::benchmarkConfidenceInterval() const { return m_data.benchmarkConfidenceInterval; } + unsigned int Config::benchmarkResamples() const { return m_data.benchmarkResamples; } + std::chrono::milliseconds Config::benchmarkWarmupTime() const { return std::chrono::milliseconds(m_data.benchmarkWarmupTime); } + IStream const* Config::openStream() { return Catch::makeStream(m_data.outputFilename); } @@ -8335,7 +10064,7 @@ namespace Catch { }; struct NoColourImpl : IColourImpl { - void use( Colour::Code ) {} + void use( Colour::Code ) override {} static IColourImpl* instance() { static NoColourImpl s_instance; @@ -8467,7 +10196,7 @@ namespace { bool useColourOnPlatform() { return -#ifdef CATCH_PLATFORM_MAC +#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE) !isDebuggerActive() && #endif #if !(defined(__DJGPP__) && defined(__STRICT_ANSI__)) @@ -8508,13 +10237,13 @@ namespace Catch { namespace Catch { Colour::Colour( Code _colourCode ) { use( _colourCode ); } - Colour::Colour( Colour&& rhs ) noexcept { - m_moved = rhs.m_moved; - rhs.m_moved = true; + Colour::Colour( Colour&& other ) noexcept { + m_moved = other.m_moved; + other.m_moved = true; } - Colour& Colour::operator=( Colour&& rhs ) noexcept { - m_moved = rhs.m_moved; - rhs.m_moved = true; + Colour& Colour::operator=( Colour&& other ) noexcept { + m_moved = other.m_moved; + other.m_moved = true; return *this; } @@ -8522,7 +10251,13 @@ namespace Catch { void Colour::use( Code _colourCode ) { static IColourImpl* impl = platformColourInstance(); - impl->use( _colourCode ); + // Strictly speaking, this cannot possibly happen. + // However, under some conditions it does happen (see #1626), + // and this change is small enough that we can let practicality + // triumph over purity in this case. + if (impl != nullptr) { + impl->use( _colourCode ); + } } std::ostream& operator << ( std::ostream& os, Colour const& ) { @@ -8589,6 +10324,12 @@ namespace Catch { IContext::~IContext() = default; IMutableContext::~IMutableContext() = default; Context::~Context() = default; + + SimplePcg32& rng() { + static SimplePcg32 s_rng; + return s_rng; + } + } // end catch_context.cpp // start catch_debug_console.cpp @@ -8602,7 +10343,16 @@ namespace Catch { } // end catch_debug_console.h -#ifdef CATCH_PLATFORM_WINDOWS +#if defined(CATCH_CONFIG_ANDROID_LOGWRITE) +#include <android/log.h> + + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + __android_log_write( ANDROID_LOG_DEBUG, "Catch", text.c_str() ); + } + } + +#elif defined(CATCH_PLATFORM_WINDOWS) namespace Catch { void writeToDebugConsole( std::string const& text ) { @@ -8623,10 +10373,9 @@ namespace Catch { // end catch_debug_console.cpp // start catch_debugger.cpp -#ifdef CATCH_PLATFORM_MAC +#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE) -# include <assert.h> -# include <stdbool.h> +# include <cassert> # include <sys/types.h> # include <unistd.h> # include <cstddef> @@ -8751,6 +10500,8 @@ namespace Catch { // end catch_decomposer.cpp // start catch_enforce.cpp +#include <stdexcept> + namespace Catch { #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER) [[noreturn]] @@ -8760,6 +10511,22 @@ namespace Catch { std::terminate(); } #endif + + [[noreturn]] + void throw_logic_error(std::string const& msg) { + throw_exception(std::logic_error(msg)); + } + + [[noreturn]] + void throw_domain_error(std::string const& msg) { + throw_exception(std::domain_error(msg)); + } + + [[noreturn]] + void throw_runtime_error(std::string const& msg) { + throw_exception(std::runtime_error(msg)); + } + } // namespace Catch; // end catch_enforce.cpp // start catch_enum_values_registry.cpp @@ -8781,7 +10548,7 @@ namespace Catch { EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values) override; }; - std::vector<std::string> parseEnums( StringRef enums ); + std::vector<StringRef> parseEnums( StringRef enums ); } // Detail @@ -8798,13 +10565,25 @@ namespace Catch { namespace Detail { - std::vector<std::string> parseEnums( StringRef enums ) { + namespace { + // Extracts the actual name part of an enum instance + // In other words, it returns the Blue part of Bikeshed::Colour::Blue + StringRef extractInstanceName(StringRef enumInstance) { + // Find last occurence of ":" + size_t name_start = enumInstance.size(); + while (name_start > 0 && enumInstance[name_start - 1] != ':') { + --name_start; + } + return enumInstance.substr(name_start, enumInstance.size() - name_start); + } + } + + std::vector<StringRef> parseEnums( StringRef enums ) { auto enumValues = splitStringRef( enums, ',' ); - std::vector<std::string> parsed; + std::vector<StringRef> parsed; parsed.reserve( enumValues.size() ); for( auto const& enumValue : enumValues ) { - auto identifiers = splitStringRef( enumValue, ':' ); - parsed.push_back( Catch::trim( identifiers.back() ) ); + parsed.push_back(trim(extractInstanceName(enumValue))); } return parsed; } @@ -8816,7 +10595,7 @@ namespace Catch { if( valueToName.first == value ) return valueToName.second; } - return "{** unexpected enum value **}"; + return "{** unexpected enum value **}"_sr; } std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) { @@ -8828,16 +10607,14 @@ namespace Catch { assert( valueNames.size() == values.size() ); std::size_t i = 0; for( auto value : values ) - enumInfo->m_values.push_back({ value, valueNames[i++] }); + enumInfo->m_values.emplace_back(value, valueNames[i++]); return enumInfo; } EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) { - auto enumInfo = makeEnumInfo( enumName, allValueNames, values ); - EnumInfo* raw = enumInfo.get(); - m_enumInfos.push_back( std::move( enumInfo ) ); - return *raw; + m_enumInfos.push_back(makeEnumInfo(enumName, allValueNames, values)); + return *m_enumInfos.back(); } } // Detail @@ -9038,7 +10815,7 @@ namespace Catch { // 32kb for the alternate stack seems to be sufficient. However, this value // is experimentally determined, so that's not guaranteed. - constexpr static std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ; + static constexpr std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ; static SignalDefs signalDefs[] = { { SIGINT, "SIGINT - Terminal interrupt signal" }, @@ -9115,22 +10892,6 @@ namespace Catch { // end catch_fatal_condition.cpp // start catch_generators.cpp -// start catch_random_number_generator.h - -#include <algorithm> -#include <random> - -namespace Catch { - - struct IConfig; - - std::mt19937& rng(); - void seedRng( IConfig const& config ); - unsigned int rngSeed(); - -} - -// end catch_random_number_generator.h #include <limits> #include <set> @@ -9146,8 +10907,8 @@ namespace Generators { GeneratorUntypedBase::~GeneratorUntypedBase() {} - auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { - return getResultCapture().acquireGeneratorTracker( lineInfo ); + auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { + return getResultCapture().acquireGeneratorTracker( generatorName, lineInfo ); } } // namespace Generators @@ -9203,10 +10964,16 @@ namespace Catch { void noMatchingTestCases( std::string const& spec ) override; + void reportInvalidArguments(std::string const&arg) override; + static std::set<Verbosity> getSupportedVerbosities(); +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing(std::string const& name) override; void benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) override; - void benchmarkEnded( BenchmarkStats const& benchmarkStats ) override; + void benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) override; + void benchmarkFailed(std::string const&) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING void testRunStarting( TestRunInfo const& testRunInfo ) override; void testGroupStarting( GroupInfo const& groupInfo ) override; @@ -9416,7 +11183,7 @@ namespace Catch { namespace Catch { std::size_t listTests( Config const& config ) { - TestSpec testSpec = config.testSpec(); + TestSpec const& testSpec = config.testSpec(); if( config.hasTestFilters() ) Catch::cout() << "Matching test cases:\n"; else { @@ -9450,7 +11217,7 @@ namespace Catch { } std::size_t listTestsNamesOnly( Config const& config ) { - TestSpec testSpec = config.testSpec(); + TestSpec const& testSpec = config.testSpec(); std::size_t matchedTests = 0; std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); for( auto const& testCaseInfo : matchedTestCases ) { @@ -9472,14 +11239,23 @@ namespace Catch { } std::string TagInfo::all() const { - std::string out; - for( auto const& spelling : spellings ) - out += "[" + spelling + "]"; + size_t size = 0; + for (auto const& spelling : spellings) { + // Add 2 for the brackes + size += spelling.size() + 2; + } + + std::string out; out.reserve(size); + for (auto const& spelling : spellings) { + out += '['; + out += spelling; + out += ']'; + } return out; } std::size_t listTags( Config const& config ) { - TestSpec testSpec = config.testSpec(); + TestSpec const& testSpec = config.testSpec(); if( config.hasTestFilters() ) Catch::cout() << "Tags for matching test cases:\n"; else { @@ -9573,6 +11349,29 @@ using Matchers::Impl::MatcherBase; } // namespace Catch // end catch_matchers.cpp +// start catch_matchers_exception.cpp + +namespace Catch { +namespace Matchers { +namespace Exception { + +bool ExceptionMessageMatcher::match(std::exception const& ex) const { + return ex.what() == m_message; +} + +std::string ExceptionMessageMatcher::describe() const { + return "exception message matches \"" + m_message + "\""; +} + +} +Exception::ExceptionMessageMatcher Message(std::string const& message) { + return Exception::ExceptionMessageMatcher(message); +} + +// namespace Exception +} // namespace Matchers +} // namespace Catch +// end catch_matchers_exception.cpp // start catch_matchers_floating.cpp // start catch_polyfills.hpp @@ -9601,74 +11400,100 @@ namespace Catch { } // end namespace Catch // end catch_to_string.hpp +#include <algorithm> +#include <cmath> #include <cstdlib> #include <cstdint> #include <cstring> +#include <sstream> +#include <type_traits> +#include <iomanip> +#include <limits> namespace Catch { -namespace Matchers { -namespace Floating { -enum class FloatingPointKind : uint8_t { - Float, - Double -}; -} -} -} - namespace { -template <typename T> -struct Converter; - -template <> -struct Converter<float> { - static_assert(sizeof(float) == sizeof(int32_t), "Important ULP matcher assumption violated"); - Converter(float f) { + int32_t convert(float f) { + static_assert(sizeof(float) == sizeof(int32_t), "Important ULP matcher assumption violated"); + int32_t i; std::memcpy(&i, &f, sizeof(f)); + return i; } - int32_t i; -}; -template <> -struct Converter<double> { - static_assert(sizeof(double) == sizeof(int64_t), "Important ULP matcher assumption violated"); - Converter(double d) { + int64_t convert(double d) { + static_assert(sizeof(double) == sizeof(int64_t), "Important ULP matcher assumption violated"); + int64_t i; std::memcpy(&i, &d, sizeof(d)); + return i; } - int64_t i; -}; -template <typename T> -auto convert(T t) -> Converter<T> { - return Converter<T>(t); -} + template <typename FP> + bool almostEqualUlps(FP lhs, FP rhs, uint64_t maxUlpDiff) { + // Comparison with NaN should always be false. + // This way we can rule it out before getting into the ugly details + if (Catch::isnan(lhs) || Catch::isnan(rhs)) { + return false; + } -template <typename FP> -bool almostEqualUlps(FP lhs, FP rhs, int maxUlpDiff) { - // Comparison with NaN should always be false. - // This way we can rule it out before getting into the ugly details - if (Catch::isnan(lhs) || Catch::isnan(rhs)) { - return false; + auto lc = convert(lhs); + auto rc = convert(rhs); + + if ((lc < 0) != (rc < 0)) { + // Potentially we can have +0 and -0 + return lhs == rhs; + } + + auto ulpDiff = std::abs(lc - rc); + return static_cast<uint64_t>(ulpDiff) <= maxUlpDiff; + } + +#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) + + float nextafter(float x, float y) { + return ::nextafterf(x, y); + } + + double nextafter(double x, double y) { + return ::nextafter(x, y); } - auto lc = convert(lhs); - auto rc = convert(rhs); +#endif // ^^^ CATCH_CONFIG_GLOBAL_NEXTAFTER ^^^ - if ((lc.i < 0) != (rc.i < 0)) { - // Potentially we can have +0 and -0 - return lhs == rhs; +template <typename FP> +FP step(FP start, FP direction, uint64_t steps) { + for (uint64_t i = 0; i < steps; ++i) { +#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) + start = Catch::nextafter(start, direction); +#else + start = std::nextafter(start, direction); +#endif } + return start; +} - auto ulpDiff = std::abs(lc.i - rc.i); - return ulpDiff <= maxUlpDiff; +// Performs equivalent check of std::fabs(lhs - rhs) <= margin +// But without the subtraction to allow for INFINITY in comparison +bool marginComparison(double lhs, double rhs, double margin) { + return (lhs + margin >= rhs) && (rhs + margin >= lhs); } +template <typename FloatingPoint> +void write(std::ostream& out, FloatingPoint num) { + out << std::scientific + << std::setprecision(std::numeric_limits<FloatingPoint>::max_digits10 - 1) + << num; } -namespace Catch { +} // end anonymous namespace + namespace Matchers { namespace Floating { + + enum class FloatingPointKind : uint8_t { + Float, + Double + }; + WithinAbsMatcher::WithinAbsMatcher(double target, double margin) :m_target{ target }, m_margin{ margin } { CATCH_ENFORCE(margin >= 0, "Invalid margin: " << margin << '.' @@ -9685,10 +11510,11 @@ namespace Floating { return "is within " + ::Catch::Detail::stringify(m_margin) + " of " + ::Catch::Detail::stringify(m_target); } - WithinUlpsMatcher::WithinUlpsMatcher(double target, int ulps, FloatingPointKind baseType) + WithinUlpsMatcher::WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType) :m_target{ target }, m_ulps{ ulps }, m_type{ baseType } { - CATCH_ENFORCE(ulps >= 0, "Invalid ULP setting: " << ulps << '.' - << " ULPs have to be non-negative."); + CATCH_ENFORCE(m_type == FloatingPointKind::Double + || m_ulps < (std::numeric_limits<uint32_t>::max)(), + "Provided ULP is impossibly large for a float comparison."); } #if defined(__clang__) @@ -9713,16 +11539,59 @@ namespace Floating { #endif std::string WithinUlpsMatcher::describe() const { - return "is within " + Catch::to_string(m_ulps) + " ULPs of " + ::Catch::Detail::stringify(m_target) + ((m_type == FloatingPointKind::Float)? "f" : ""); + std::stringstream ret; + + ret << "is within " << m_ulps << " ULPs of "; + + if (m_type == FloatingPointKind::Float) { + write(ret, static_cast<float>(m_target)); + ret << 'f'; + } else { + write(ret, m_target); + } + + ret << " (["; + if (m_type == FloatingPointKind::Double) { + write(ret, step(m_target, static_cast<double>(-INFINITY), m_ulps)); + ret << ", "; + write(ret, step(m_target, static_cast<double>( INFINITY), m_ulps)); + } else { + // We have to cast INFINITY to float because of MinGW, see #1782 + write(ret, step(static_cast<float>(m_target), static_cast<float>(-INFINITY), m_ulps)); + ret << ", "; + write(ret, step(static_cast<float>(m_target), static_cast<float>( INFINITY), m_ulps)); + } + ret << "])"; + + return ret.str(); + } + + WithinRelMatcher::WithinRelMatcher(double target, double epsilon): + m_target(target), + m_epsilon(epsilon){ + CATCH_ENFORCE(m_epsilon >= 0., "Relative comparison with epsilon < 0 does not make sense."); + CATCH_ENFORCE(m_epsilon < 1., "Relative comparison with epsilon >= 1 does not make sense."); + } + + bool WithinRelMatcher::match(double const& matchee) const { + const auto relMargin = m_epsilon * (std::max)(std::fabs(matchee), std::fabs(m_target)); + return marginComparison(matchee, m_target, + std::isinf(relMargin)? 0 : relMargin); + } + + std::string WithinRelMatcher::describe() const { + Catch::ReusableStringStream sstr; + sstr << "and " << m_target << " are within " << m_epsilon * 100. << "% of each other"; + return sstr.str(); } }// namespace Floating -Floating::WithinUlpsMatcher WithinULP(double target, int maxUlpDiff) { +Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff) { return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Double); } -Floating::WithinUlpsMatcher WithinULP(float target, int maxUlpDiff) { +Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff) { return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Float); } @@ -9730,6 +11599,22 @@ Floating::WithinAbsMatcher WithinAbs(double target, double margin) { return Floating::WithinAbsMatcher(target, margin); } +Floating::WithinRelMatcher WithinRel(double target, double eps) { + return Floating::WithinRelMatcher(target, eps); +} + +Floating::WithinRelMatcher WithinRel(double target) { + return Floating::WithinRelMatcher(target, std::numeric_limits<double>::epsilon() * 100); +} + +Floating::WithinRelMatcher WithinRel(float target, float eps) { + return Floating::WithinRelMatcher(target, eps); +} + +Floating::WithinRelMatcher WithinRel(float target) { + return Floating::WithinRelMatcher(target, std::numeric_limits<float>::epsilon() * 100); +} + } // namespace Matchers } // namespace Catch @@ -9910,10 +11795,10 @@ namespace Catch { Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) { auto trimmed = [&] (size_t start, size_t end) { - while (names[start] == ',' || isspace(names[start])) { + while (names[start] == ',' || isspace(static_cast<unsigned char>(names[start]))) { ++start; } - while (names[end] == ',' || isspace(names[end])) { + while (names[end] == ',' || isspace(static_cast<unsigned char>(names[end]))) { --end; } return names.substr(start, end - start + 1); @@ -9952,17 +11837,17 @@ namespace Catch { pos = skipq(pos, c); break; case ',': - if (start != pos && openings.size() == 0) { + if (start != pos && openings.empty()) { m_messages.emplace_back(macroName, lineInfo, resultType); - m_messages.back().message = trimmed(start, pos); + m_messages.back().message = static_cast<std::string>(trimmed(start, pos)); m_messages.back().message += " := "; start = pos; } } } - assert(openings.size() == 0 && "Mismatched openings"); + assert(openings.empty() && "Mismatched openings"); m_messages.emplace_back(macroName, lineInfo, resultType); - m_messages.back().message = trimmed(start, names.size() - 1); + m_messages.back().message = static_cast<std::string>(trimmed(start, names.size() - 1)); m_messages.back().message += " := "; } Capturer::~Capturer() { @@ -10148,7 +12033,7 @@ namespace Catch { if (tmpnam_s(m_buffer)) { CATCH_RUNTIME_ERROR("Could not get a temp filename"); } - if (fopen_s(&m_file, m_buffer, "w")) { + if (fopen_s(&m_file, m_buffer, "w+")) { char buffer[100]; if (strerror_s(buffer, errno)) { CATCH_RUNTIME_ERROR("Could not translate errno to a string"); @@ -10256,20 +12141,61 @@ namespace Catch { namespace Catch { - std::mt19937& rng() { - static std::mt19937 s_rng; - return s_rng; +namespace { + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4146) // we negate uint32 during the rotate +#endif + // Safe rotr implementation thanks to John Regehr + uint32_t rotate_right(uint32_t val, uint32_t count) { + const uint32_t mask = 31; + count &= mask; + return (val >> count) | (val << (-count & mask)); + } + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +} + + SimplePcg32::SimplePcg32(result_type seed_) { + seed(seed_); + } + + void SimplePcg32::seed(result_type seed_) { + m_state = 0; + (*this)(); + m_state += seed_; + (*this)(); } - void seedRng( IConfig const& config ) { - if( config.rngSeed() != 0 ) { - std::srand( config.rngSeed() ); - rng().seed( config.rngSeed() ); + void SimplePcg32::discard(uint64_t skip) { + // We could implement this to run in O(log n) steps, but this + // should suffice for our use case. + for (uint64_t s = 0; s < skip; ++s) { + static_cast<void>((*this)()); } } - unsigned int rngSeed() { - return getCurrentContext().getConfig()->rngSeed(); + SimplePcg32::result_type SimplePcg32::operator()() { + // prepare the output value + const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u); + const auto output = rotate_right(xorshifted, m_state >> 59u); + + // advance state + m_state = m_state * 6364136223846793005ULL + s_inc; + + return output; + } + + bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs) { + return lhs.m_state == rhs.m_state; + } + + bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs) { + return lhs.m_state != rhs.m_state; } } // end catch_random_number_generator.cpp @@ -10288,6 +12214,8 @@ namespace Catch { struct IConfig; std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ); + + bool isThrowSafe( TestCase const& testCase, IConfig const& config ); bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ); @@ -10400,11 +12328,13 @@ namespace Catch { namespace Catch { class StartupExceptionRegistry { +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) public: void add(std::exception_ptr const& exception) noexcept; std::vector<std::exception_ptr> const& getExceptions() const noexcept; private: std::vector<std::exception_ptr> m_exceptions; +#endif }; } // end namespace Catch @@ -10487,7 +12417,11 @@ namespace Catch { m_tagAliasRegistry.add( alias, tag, lineInfo ); } void registerStartupException() noexcept override { +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) m_exceptionRegistry.add(std::current_exception()); +#else + CATCH_INTERNAL_ERROR("Attempted to register active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!"); +#endif } IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override { return m_enumValuesRegistry; @@ -10591,17 +12525,32 @@ namespace Catch { std::shared_ptr<GeneratorTracker> tracker; ITracker& currentTracker = ctx.currentTracker(); - if( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { + // Under specific circumstances, the generator we want + // to acquire is also the current tracker. If this is + // the case, we have to avoid looking through current + // tracker's children, and instead return the current + // tracker. + // A case where this check is important is e.g. + // for (int i = 0; i < 5; ++i) { + // int n = GENERATE(1, 2); + // } + // + // without it, the code above creates 5 nested generators. + if (currentTracker.nameAndLocation() == nameAndLocation) { + auto thisTracker = currentTracker.parent().findChild(nameAndLocation); + assert(thisTracker); + assert(thisTracker->isGeneratorTracker()); + tracker = std::static_pointer_cast<GeneratorTracker>(thisTracker); + } else if ( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { assert( childTracker ); assert( childTracker->isGeneratorTracker() ); tracker = std::static_pointer_cast<GeneratorTracker>( childTracker ); - } - else { + } else { tracker = std::make_shared<GeneratorTracker>( nameAndLocation, ctx, ¤tTracker ); currentTracker.addChild( tracker ); } - if( !ctx.completedCycle() && !tracker->isComplete() ) { + if( !tracker->isComplete() ) { tracker->open(); } @@ -10615,8 +12564,28 @@ namespace Catch { } void close() override { TrackerBase::close(); - // Generator interface only finds out if it has another item on atual move - if (m_runState == CompletedSuccessfully && m_generator->next()) { + // If a generator has a child (it is followed by a section) + // and none of its children have started, then we must wait + // until later to start consuming its values. + // This catches cases where `GENERATE` is placed between two + // `SECTION`s. + // **The check for m_children.empty cannot be removed**. + // doing so would break `GENERATE` _not_ followed by `SECTION`s. + const bool should_wait_for_child = + !m_children.empty() && + std::find_if( m_children.begin(), + m_children.end(), + []( TestCaseTracking::ITrackerPtr tracker ) { + return tracker->hasStarted(); + } ) == m_children.end(); + + // This check is a bit tricky, because m_generator->next() + // has a side-effect, where it consumes generator's current + // value, but we do not want to invoke the side-effect if + // this generator is still waiting for any child to start. + if ( should_wait_for_child || + ( m_runState == CompletedSuccessfully && + m_generator->next() ) ) { m_children.clear(); m_runState = Executing; } @@ -10752,10 +12721,10 @@ namespace Catch { return true; } - auto RunContext::acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { + auto RunContext::acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { using namespace Generators; - GeneratorTracker& tracker = GeneratorTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( "generator", lineInfo ) ); - assert( tracker.isOpen() ); + GeneratorTracker& tracker = GeneratorTracker::acquire(m_trackerContext, + TestCaseTracking::NameAndLocation( static_cast<std::string>(generatorName), lineInfo ) ); m_lastAssertionInfo.lineInfo = lineInfo; return tracker; } @@ -10795,12 +12764,21 @@ namespace Catch { m_unfinishedSections.push_back(endInfo); } + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void RunContext::benchmarkPreparing(std::string const& name) { + m_reporter->benchmarkPreparing(name); + } void RunContext::benchmarkStarting( BenchmarkInfo const& info ) { m_reporter->benchmarkStarting( info ); } - void RunContext::benchmarkEnded( BenchmarkStats const& stats ) { + void RunContext::benchmarkEnded( BenchmarkStats<> const& stats ) { m_reporter->benchmarkEnded( stats ); } + void RunContext::benchmarkFailed(std::string const & error) { + m_reporter->benchmarkFailed(error); + } +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING void RunContext::pushScopedMessage(MessageInfo const & message) { m_messages.push_back(message); @@ -10835,7 +12813,7 @@ namespace Catch { // Don't rebuild the result -- the stringification itself can cause more fatal errors // Instead, fake a result data. AssertionResultData tempResult( ResultWas::FatalErrorCondition, { false } ); - tempResult.message = message; + tempResult.message = static_cast<std::string>(message); AssertionResult result(m_lastAssertionInfo, tempResult); assertionEnded(result); @@ -10998,7 +12976,7 @@ namespace Catch { m_lastAssertionInfo = info; AssertionResultData data( resultType, LazyExpression( false ) ); - data.message = message; + data.message = static_cast<std::string>(message); AssertionResult assertionResult{ m_lastAssertionInfo, data }; assertionEnded( assertionResult ); if( !assertionResult.isOk() ) @@ -11061,6 +13039,18 @@ namespace Catch { else CATCH_INTERNAL_ERROR("No result capture instance"); } + + void seedRng(IConfig const& config) { + if (config.rngSeed() != 0) { + std::srand(config.rngSeed()); + rng().seed(config.rngSeed()); + } + } + + unsigned int rngSeed() { + return getCurrentContext().getConfig()->rngSeed(); + } + } // end catch_run_context.cpp // start catch_section.cpp @@ -11122,7 +13112,7 @@ namespace Catch { void libIdentify(); int applyCommandLine( int argc, char const * const * argv ); - #if defined(CATCH_CONFIG_WCHAR) && defined(WIN32) && defined(UNICODE) + #if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE) int applyCommandLine( int argc, wchar_t const * const * argv ); #endif @@ -11189,6 +13179,8 @@ namespace Catch { // end catch_version.h #include <cstdlib> #include <iomanip> +#include <set> +#include <iterator> namespace Catch { @@ -11222,45 +13214,61 @@ namespace Catch { return ret; } - Catch::Totals runTests(std::shared_ptr<Config> const& config) { - auto reporter = makeReporter(config); - - RunContext context(config, std::move(reporter)); - - Totals totals; - - context.testGroupStarting(config->name(), 1, 1); - - TestSpec testSpec = config->testSpec(); - - auto const& allTestCases = getAllTestCasesSorted(*config); - for (auto const& testCase : allTestCases) { - bool matching = (!testSpec.hasFilters() && !testCase.isHidden()) || - (testSpec.hasFilters() && matchTest(testCase, testSpec, *config)); - - if (!context.aborting() && matching) - totals += context.runTest(testCase); - else - context.reporter().skipTest(testCase); + class TestGroup { + public: + explicit TestGroup(std::shared_ptr<Config> const& config) + : m_config{config} + , m_context{config, makeReporter(config)} + { + auto const& allTestCases = getAllTestCasesSorted(*m_config); + m_matches = m_config->testSpec().matchesByFilter(allTestCases, *m_config); + auto const& invalidArgs = m_config->testSpec().getInvalidArgs(); + + if (m_matches.empty() && invalidArgs.empty()) { + for (auto const& test : allTestCases) + if (!test.isHidden()) + m_tests.emplace(&test); + } else { + for (auto const& match : m_matches) + m_tests.insert(match.tests.begin(), match.tests.end()); + } } - if (config->warnAboutNoTests() && totals.testCases.total() == 0) { - ReusableStringStream testConfig; + Totals execute() { + auto const& invalidArgs = m_config->testSpec().getInvalidArgs(); + Totals totals; + m_context.testGroupStarting(m_config->name(), 1, 1); + for (auto const& testCase : m_tests) { + if (!m_context.aborting()) + totals += m_context.runTest(*testCase); + else + m_context.reporter().skipTest(*testCase); + } - bool first = true; - for (const auto& input : config->getTestsOrTags()) { - if (!first) { testConfig << ' '; } - first = false; - testConfig << input; + for (auto const& match : m_matches) { + if (match.tests.empty()) { + m_context.reporter().noMatchingTestCases(match.name); + totals.error = -1; + } + } + + if (!invalidArgs.empty()) { + for (auto const& invalidArg: invalidArgs) + m_context.reporter().reportInvalidArguments(invalidArg); } - context.reporter().noMatchingTestCases(testConfig.str()); - totals.error = -1; + m_context.testGroupEnded(m_config->name(), totals, 1, 1); + return totals; } - context.testGroupEnded(config->name(), totals, 1, 1); - return totals; - } + private: + using Tests = std::set<TestCase const*>; + + std::shared_ptr<Config> m_config; + RunContext m_context; + Tests m_tests; + TestSpec::Matches m_matches; + }; void applyFilenamesAsTags(Catch::IConfig const& config) { auto& tests = const_cast<std::vector<TestCase>&>(getAllTestCasesSorted(config)); @@ -11329,7 +13337,7 @@ namespace Catch { } void Session::libIdentify() { Catch::cout() - << std::left << std::setw(16) << "description: " << "A Catch test executable\n" + << std::left << std::setw(16) << "description: " << "A Catch2 test executable\n" << std::left << std::setw(16) << "category: " << "testframework\n" << std::left << std::setw(16) << "framework: " << "Catch Test\n" << std::left << std::setw(16) << "version: " << libraryVersion() << std::endl; @@ -11360,17 +13368,17 @@ namespace Catch { return 0; } -#if defined(CATCH_CONFIG_WCHAR) && defined(WIN32) && defined(UNICODE) +#if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE) int Session::applyCommandLine( int argc, wchar_t const * const * argv ) { char **utf8Argv = new char *[ argc ]; for ( int i = 0; i < argc; ++i ) { - int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, NULL, 0, NULL, NULL ); + int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, nullptr, 0, nullptr, nullptr ); utf8Argv[ i ] = new char[ bufSize ]; - WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, NULL, NULL ); + WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, nullptr, nullptr ); } int returnCode = applyCommandLine( argc, utf8Argv ); @@ -11437,7 +13445,12 @@ namespace Catch { if( Option<std::size_t> listed = list( m_config ) ) return static_cast<int>( *listed ); - auto totals = runTests( m_config ); + TestGroup tests { m_config }; + auto const totals = tests.execute(); + + if( m_config->warnAboutNoTests() && totals.error == -1 ) + return 2; + // Note that on unices only the lower 8 bits are usually used, clamping // the return value to 255 prevents false negative when some multiple // of 256 tests has failed @@ -11485,6 +13498,7 @@ namespace Catch { // end catch_singletons.cpp // start catch_startup_exception_registry.cpp +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) namespace Catch { void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept { CATCH_TRY { @@ -11500,6 +13514,7 @@ void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexce } } // end namespace Catch +#endif // end catch_startup_exception_registry.cpp // start catch_stream.cpp @@ -11514,7 +13529,7 @@ namespace Catch { Catch::IStream::~IStream() = default; - namespace detail { namespace { + namespace Detail { namespace { template<typename WriterF, std::size_t bufferSize=256> class StreamBufImpl : public std::streambuf { char data[bufferSize]; @@ -11613,15 +13628,15 @@ namespace Catch { auto makeStream( StringRef const &filename ) -> IStream const* { if( filename.empty() ) - return new detail::CoutStream(); + return new Detail::CoutStream(); else if( filename[0] == '%' ) { if( filename == "%debug" ) - return new detail::DebugOutStream(); + return new Detail::DebugOutStream(); else CATCH_ERROR( "Unrecognised stream: '" << filename << "'" ); } else - return new detail::FileStream( filename ); + return new Detail::FileStream( filename ); } // This class encapsulates the idea of a pool of ostringstreams that can be reused. @@ -11684,7 +13699,7 @@ namespace Catch { namespace { char toLowerCh(char c) { - return static_cast<char>( std::tolower( c ) ); + return static_cast<char>( std::tolower( static_cast<unsigned char>(c) ) ); } } @@ -11719,6 +13734,18 @@ namespace Catch { return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string(); } + StringRef trim(StringRef ref) { + const auto is_ws = [](char c) { + return c == ' ' || c == '\t' || c == '\n' || c == '\r'; + }; + size_t real_begin = 0; + while (real_begin < ref.size() && is_ws(ref[real_begin])) { ++real_begin; } + size_t real_end = ref.size(); + while (real_end > real_begin && is_ws(ref[real_end - 1])) { --real_end; } + + return ref.substr(real_begin, real_end - real_begin); + } + bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { bool replaced = false; std::size_t i = str.find( replaceThis ); @@ -11764,124 +13791,46 @@ namespace Catch { // end catch_string_manip.cpp // start catch_stringref.cpp -#if defined(__clang__) -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wexit-time-destructors" -#endif - +#include <algorithm> #include <ostream> #include <cstring> #include <cstdint> -namespace { - const uint32_t byte_2_lead = 0xC0; - const uint32_t byte_3_lead = 0xE0; - const uint32_t byte_4_lead = 0xF0; -} - namespace Catch { StringRef::StringRef( char const* rawChars ) noexcept : StringRef( rawChars, static_cast<StringRef::size_type>(std::strlen(rawChars) ) ) {} - StringRef::operator std::string() const { - return std::string( m_start, m_size ); - } - - void StringRef::swap( StringRef& other ) noexcept { - std::swap( m_start, other.m_start ); - std::swap( m_size, other.m_size ); - std::swap( m_data, other.m_data ); - } - auto StringRef::c_str() const -> char const* { - if( !isSubstring() ) - return m_start; - - const_cast<StringRef *>( this )->takeOwnership(); - return m_data; - } - auto StringRef::currentData() const noexcept -> char const* { + CATCH_ENFORCE(isNullTerminated(), "Called StringRef::c_str() on a non-null-terminated instance"); return m_start; } - - auto StringRef::isOwned() const noexcept -> bool { - return m_data != nullptr; - } - auto StringRef::isSubstring() const noexcept -> bool { - return m_start[m_size] != '\0'; + auto StringRef::data() const noexcept -> char const* { + return m_start; } - void StringRef::takeOwnership() { - if( !isOwned() ) { - m_data = new char[m_size+1]; - memcpy( m_data, m_start, m_size ); - m_data[m_size] = '\0'; - } - } auto StringRef::substr( size_type start, size_type size ) const noexcept -> StringRef { - if( start < m_size ) - return StringRef( m_start+start, size ); - else + if (start < m_size) { + return StringRef(m_start + start, (std::min)(m_size - start, size)); + } else { return StringRef(); - } - auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool { - return - size() == other.size() && - (std::strncmp( m_start, other.m_start, size() ) == 0); - } - auto StringRef::operator != ( StringRef const& other ) const noexcept -> bool { - return !operator==( other ); - } - - auto StringRef::operator[](size_type index) const noexcept -> char { - return m_start[index]; - } - - auto StringRef::numberOfCharacters() const noexcept -> size_type { - size_type noChars = m_size; - // Make adjustments for uft encodings - for( size_type i=0; i < m_size; ++i ) { - char c = m_start[i]; - if( ( c & byte_2_lead ) == byte_2_lead ) { - noChars--; - if (( c & byte_3_lead ) == byte_3_lead ) - noChars--; - if( ( c & byte_4_lead ) == byte_4_lead ) - noChars--; - } } - return noChars; - } - - auto operator + ( StringRef const& lhs, StringRef const& rhs ) -> std::string { - std::string str; - str.reserve( lhs.size() + rhs.size() ); - str += lhs; - str += rhs; - return str; } - auto operator + ( StringRef const& lhs, const char* rhs ) -> std::string { - return std::string( lhs ) + std::string( rhs ); - } - auto operator + ( char const* lhs, StringRef const& rhs ) -> std::string { - return std::string( lhs ) + std::string( rhs ); + auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool { + return m_size == other.m_size + && (std::memcmp( m_start, other.m_start, m_size ) == 0); } auto operator << ( std::ostream& os, StringRef const& str ) -> std::ostream& { - return os.write(str.currentData(), str.size()); + return os.write(str.data(), str.size()); } auto operator+=( std::string& lhs, StringRef const& rhs ) -> std::string& { - lhs.append(rhs.currentData(), rhs.size()); + lhs.append(rhs.data(), rhs.size()); return lhs; } } // namespace Catch - -#if defined(__clang__) -# pragma clang diagnostic pop -#endif // end catch_stringref.cpp // start catch_tag_alias.cpp @@ -12000,8 +13949,7 @@ namespace Catch { std::vector<std::string> tags; std::string desc, tag; bool inTag = false; - std::string _descOrTags = nameAndTags.tags; - for (char c : _descOrTags) { + for (char c : nameAndTags.tags) { if( !inTag ) { if( c == '[' ) inTag = true; @@ -12031,10 +13979,11 @@ namespace Catch { } } if( isHidden ) { - tags.push_back( "." ); + // Add all "hidden" tags to make them behave identically + tags.insert( tags.end(), { ".", "!hide" } ); } - TestCaseInfo info( nameAndTags.name, _className, desc, tags, _lineInfo ); + TestCaseInfo info( static_cast<std::string>(nameAndTags.name), _className, desc, tags, _lineInfo ); return TestCase( _testCase, std::move(info) ); } @@ -12122,34 +14071,89 @@ namespace Catch { return *this; } -} // end namespace Catch -// end catch_test_case_info.cpp -// start catch_test_case_registry_impl.cpp +} // end namespace Catch +// end catch_test_case_info.cpp +// start catch_test_case_registry_impl.cpp + +#include <algorithm> +#include <sstream> + +namespace Catch { + + namespace { + struct TestHasher { + explicit TestHasher(Catch::SimplePcg32& rng_instance) { + basis = rng_instance(); + basis <<= 32; + basis |= rng_instance(); + } + + uint64_t basis; + + uint64_t operator()(TestCase const& t) const { + // Modified FNV-1a hash + static constexpr uint64_t prime = 1099511628211; + uint64_t hash = basis; + for (const char c : t.name) { + hash ^= c; + hash *= prime; + } + return hash; + } + }; + } // end unnamed namespace + + std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) { + switch( config.runOrder() ) { + case RunTests::InDeclarationOrder: + // already in declaration order + break; + + case RunTests::InLexicographicalOrder: { + std::vector<TestCase> sorted = unsortedTestCases; + std::sort( sorted.begin(), sorted.end() ); + return sorted; + } + + case RunTests::InRandomOrder: { + seedRng( config ); + TestHasher h( rng() ); -#include <sstream> + using hashedTest = std::pair<uint64_t, TestCase const*>; + std::vector<hashedTest> indexed_tests; + indexed_tests.reserve( unsortedTestCases.size() ); -namespace Catch { + for (auto const& testCase : unsortedTestCases) { + indexed_tests.emplace_back(h(testCase), &testCase); + } - std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) { + std::sort(indexed_tests.begin(), indexed_tests.end(), + [](hashedTest const& lhs, hashedTest const& rhs) { + if (lhs.first == rhs.first) { + return lhs.second->name < rhs.second->name; + } + return lhs.first < rhs.first; + }); - std::vector<TestCase> sorted = unsortedTestCases; + std::vector<TestCase> sorted; + sorted.reserve( indexed_tests.size() ); - switch( config.runOrder() ) { - case RunTests::InLexicographicalOrder: - std::sort( sorted.begin(), sorted.end() ); - break; - case RunTests::InRandomOrder: - seedRng( config ); - std::shuffle( sorted.begin(), sorted.end(), rng() ); - break; - case RunTests::InDeclarationOrder: - // already in declaration order - break; + for (auto const& hashed : indexed_tests) { + sorted.emplace_back(*hashed.second); + } + + return sorted; + } } - return sorted; + return unsortedTestCases; + } + + bool isThrowSafe( TestCase const& testCase, IConfig const& config ) { + return !testCase.throws() || config.allowThrows(); } + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { - return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() ); + return testSpec.matches( testCase ) && isThrowSafe( testCase, config ); } void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ) { @@ -12210,7 +14214,7 @@ namespace Catch { } std::string extractClassName( StringRef const& classOrQualifiedMethodName ) { - std::string className = classOrQualifiedMethodName; + std::string className(classOrQualifiedMethodName); if( startsWith( className, '&' ) ) { std::size_t lastColons = className.rfind( "::" ); @@ -12278,15 +14282,12 @@ namespace TestCaseTracking { m_currentTracker = tracker; } - TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) - : m_nameAndLocation( nameAndLocation ), + TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ): + ITracker(nameAndLocation), m_ctx( ctx ), m_parent( parent ) {} - NameAndLocation const& TrackerBase::nameAndLocation() const { - return m_nameAndLocation; - } bool TrackerBase::isComplete() const { return m_runState == CompletedSuccessfully || m_runState == Failed; } @@ -12352,7 +14353,7 @@ namespace TestCaseTracking { m_runState = CompletedSuccessfully; break; case ExecutingChildren: - if( m_children.empty() || m_children.back()->isComplete() ) + if( std::all_of(m_children.begin(), m_children.end(), [](ITrackerPtr const& t){ return t->isComplete(); }) ) m_runState = CompletedSuccessfully; break; @@ -12387,7 +14388,8 @@ namespace TestCaseTracking { } SectionTracker::SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) - : TrackerBase( nameAndLocation, ctx, parent ) + : TrackerBase( nameAndLocation, ctx, parent ), + m_trimmed_name(trim(nameAndLocation.name)) { if( parent ) { while( !parent->isSectionTracker() ) @@ -12401,12 +14403,12 @@ namespace TestCaseTracking { bool SectionTracker::isComplete() const { bool complete = true; - if ((m_filters.empty() || m_filters[0] == "") || - std::find(m_filters.begin(), m_filters.end(), - m_nameAndLocation.name) != m_filters.end()) + if (m_filters.empty() + || m_filters[0] == "" + || std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end()) { complete = TrackerBase::isComplete(); + } return complete; - } bool SectionTracker::isSectionTracker() const { return true; } @@ -12430,20 +14432,21 @@ namespace TestCaseTracking { } void SectionTracker::tryOpen() { - if( !isComplete() && (m_filters.empty() || m_filters[0].empty() || m_filters[0] == m_nameAndLocation.name ) ) + if( !isComplete() ) open(); } void SectionTracker::addInitialFilters( std::vector<std::string> const& filters ) { if( !filters.empty() ) { - m_filters.push_back(""); // Root - should never be consulted - m_filters.push_back(""); // Test Case - not a section filter + m_filters.reserve( m_filters.size() + filters.size() + 2 ); + m_filters.emplace_back(""); // Root - should never be consulted + m_filters.emplace_back(""); // Test Case - not a section filter m_filters.insert( m_filters.end(), filters.begin(), filters.end() ); } } void SectionTracker::addNextFilters( std::vector<std::string> const& filters ) { if( filters.size() > 1 ) - m_filters.insert( m_filters.end(), ++filters.begin(), filters.end() ); + m_filters.insert( m_filters.end(), filters.begin()+1, filters.end() ); } } // namespace TestCaseTracking @@ -12495,47 +14498,81 @@ namespace Catch { namespace Catch { + TestSpec::Pattern::Pattern( std::string const& name ) + : m_name( name ) + {} + TestSpec::Pattern::~Pattern() = default; - TestSpec::NamePattern::~NamePattern() = default; - TestSpec::TagPattern::~TagPattern() = default; - TestSpec::ExcludedPattern::~ExcludedPattern() = default; - TestSpec::NamePattern::NamePattern( std::string const& name ) - : m_wildcardPattern( toLower( name ), CaseSensitive::No ) + std::string const& TestSpec::Pattern::name() const { + return m_name; + } + + TestSpec::NamePattern::NamePattern( std::string const& name, std::string const& filterString ) + : Pattern( filterString ) + , m_wildcardPattern( toLower( name ), CaseSensitive::No ) {} + bool TestSpec::NamePattern::matches( TestCaseInfo const& testCase ) const { - return m_wildcardPattern.matches( toLower( testCase.name ) ); + return m_wildcardPattern.matches( testCase.name ); } - TestSpec::TagPattern::TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} + TestSpec::TagPattern::TagPattern( std::string const& tag, std::string const& filterString ) + : Pattern( filterString ) + , m_tag( toLower( tag ) ) + {} + bool TestSpec::TagPattern::matches( TestCaseInfo const& testCase ) const { return std::find(begin(testCase.lcaseTags), end(testCase.lcaseTags), m_tag) != end(testCase.lcaseTags); } - TestSpec::ExcludedPattern::ExcludedPattern( PatternPtr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} - bool TestSpec::ExcludedPattern::matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } + TestSpec::ExcludedPattern::ExcludedPattern( PatternPtr const& underlyingPattern ) + : Pattern( underlyingPattern->name() ) + , m_underlyingPattern( underlyingPattern ) + {} + + bool TestSpec::ExcludedPattern::matches( TestCaseInfo const& testCase ) const { + return !m_underlyingPattern->matches( testCase ); + } bool TestSpec::Filter::matches( TestCaseInfo const& testCase ) const { - // All patterns in a filter must match for the filter to be a match - for( auto const& pattern : m_patterns ) { - if( !pattern->matches( testCase ) ) - return false; - } - return true; + return std::all_of( m_patterns.begin(), m_patterns.end(), [&]( PatternPtr const& p ){ return p->matches( testCase ); } ); + } + + std::string TestSpec::Filter::name() const { + std::string name; + for( auto const& p : m_patterns ) + name += p->name(); + return name; } bool TestSpec::hasFilters() const { return !m_filters.empty(); } + bool TestSpec::matches( TestCaseInfo const& testCase ) const { - // A TestSpec matches if any filter matches - for( auto const& filter : m_filters ) - if( filter.matches( testCase ) ) - return true; - return false; + return std::any_of( m_filters.begin(), m_filters.end(), [&]( Filter const& f ){ return f.matches( testCase ); } ); + } + + TestSpec::Matches TestSpec::matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const + { + Matches matches( m_filters.size() ); + std::transform( m_filters.begin(), m_filters.end(), matches.begin(), [&]( Filter const& filter ){ + std::vector<TestCase const*> currentMatches; + for( auto const& test : testCases ) + if( isThrowSafe( test, config ) && filter.matches( test ) ) + currentMatches.emplace_back( &test ); + return FilterMatch{ filter.name(), currentMatches }; + } ); + return matches; + } + + const TestSpec::vectorStrings& TestSpec::getInvalidArgs() const{ + return (m_invalidArgs); } + } // end catch_test_spec.cpp // start catch_test_spec_parser.cpp @@ -12547,64 +14584,136 @@ namespace Catch { TestSpecParser& TestSpecParser::parse( std::string const& arg ) { m_mode = None; m_exclusion = false; - m_start = std::string::npos; m_arg = m_tagAliases->expandAliases( arg ); m_escapeChars.clear(); + m_substring.reserve(m_arg.size()); + m_patternName.reserve(m_arg.size()); + m_realPatternPos = 0; + for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) - visitChar( m_arg[m_pos] ); - if( m_mode == Name ) - addPattern<TestSpec::NamePattern>(); + //if visitChar fails + if( !visitChar( m_arg[m_pos] ) ){ + m_testSpec.m_invalidArgs.push_back(arg); + break; + } + endMode(); return *this; } TestSpec TestSpecParser::testSpec() { addFilter(); return m_testSpec; } + bool TestSpecParser::visitChar( char c ) { + if( (m_mode != EscapedName) && (c == '\\') ) { + escape(); + addCharToPattern(c); + return true; + }else if((m_mode != EscapedName) && (c == ',') ) { + return separate(); + } - void TestSpecParser::visitChar( char c ) { - if( m_mode == None ) { - switch( c ) { - case ' ': return; - case '~': m_exclusion = true; return; - case '[': return startNewMode( Tag, ++m_pos ); - case '"': return startNewMode( QuotedName, ++m_pos ); - case '\\': return escape(); - default: startNewMode( Name, m_pos ); break; - } + switch( m_mode ) { + case None: + if( processNoneChar( c ) ) + return true; + break; + case Name: + processNameChar( c ); + break; + case EscapedName: + endMode(); + addCharToPattern(c); + return true; + default: + case Tag: + case QuotedName: + if( processOtherChar( c ) ) + return true; + break; } - if( m_mode == Name ) { - if( c == ',' ) { - addPattern<TestSpec::NamePattern>(); - addFilter(); - } - else if( c == '[' ) { - if( subString() == "exclude:" ) - m_exclusion = true; - else - addPattern<TestSpec::NamePattern>(); - startNewMode( Tag, ++m_pos ); - } - else if( c == '\\' ) - escape(); + + m_substring += c; + if( !isControlChar( c ) ) { + m_patternName += c; + m_realPatternPos++; + } + return true; + } + // Two of the processing methods return true to signal the caller to return + // without adding the given character to the current pattern strings + bool TestSpecParser::processNoneChar( char c ) { + switch( c ) { + case ' ': + return true; + case '~': + m_exclusion = true; + return false; + case '[': + startNewMode( Tag ); + return false; + case '"': + startNewMode( QuotedName ); + return false; + default: + startNewMode( Name ); + return false; + } + } + void TestSpecParser::processNameChar( char c ) { + if( c == '[' ) { + if( m_substring == "exclude:" ) + m_exclusion = true; + else + endMode(); + startNewMode( Tag ); } - else if( m_mode == EscapedName ) - m_mode = Name; - else if( m_mode == QuotedName && c == '"' ) - addPattern<TestSpec::NamePattern>(); - else if( m_mode == Tag && c == ']' ) - addPattern<TestSpec::TagPattern>(); } - void TestSpecParser::startNewMode( Mode mode, std::size_t start ) { + bool TestSpecParser::processOtherChar( char c ) { + if( !isControlChar( c ) ) + return false; + m_substring += c; + endMode(); + return true; + } + void TestSpecParser::startNewMode( Mode mode ) { m_mode = mode; - m_start = start; + } + void TestSpecParser::endMode() { + switch( m_mode ) { + case Name: + case QuotedName: + return addNamePattern(); + case Tag: + return addTagPattern(); + case EscapedName: + revertBackToLastMode(); + return; + case None: + default: + return startNewMode( None ); + } } void TestSpecParser::escape() { - if( m_mode == None ) - m_start = m_pos; + saveLastMode(); m_mode = EscapedName; - m_escapeChars.push_back( m_pos ); + m_escapeChars.push_back(m_realPatternPos); + } + bool TestSpecParser::isControlChar( char c ) const { + switch( m_mode ) { + default: + return false; + case None: + return c == '~'; + case Name: + return c == '['; + case EscapedName: + return true; + case QuotedName: + return c == '"'; + case Tag: + return c == '[' || c == ']'; + } } - std::string TestSpecParser::subString() const { return m_arg.substr( m_start, m_pos - m_start ); } void TestSpecParser::addFilter() { if( !m_currentFilter.m_patterns.empty() ) { @@ -12613,6 +14722,86 @@ namespace Catch { } } + void TestSpecParser::saveLastMode() { + lastMode = m_mode; + } + + void TestSpecParser::revertBackToLastMode() { + m_mode = lastMode; + } + + bool TestSpecParser::separate() { + if( (m_mode==QuotedName) || (m_mode==Tag) ){ + //invalid argument, signal failure to previous scope. + m_mode = None; + m_pos = m_arg.size(); + m_substring.clear(); + m_patternName.clear(); + m_realPatternPos = 0; + return false; + } + endMode(); + addFilter(); + return true; //success + } + + std::string TestSpecParser::preprocessPattern() { + std::string token = m_patternName; + for (std::size_t i = 0; i < m_escapeChars.size(); ++i) + token = token.substr(0, m_escapeChars[i] - i) + token.substr(m_escapeChars[i] - i + 1); + m_escapeChars.clear(); + if (startsWith(token, "exclude:")) { + m_exclusion = true; + token = token.substr(8); + } + + m_patternName.clear(); + m_realPatternPos = 0; + + return token; + } + + void TestSpecParser::addNamePattern() { + auto token = preprocessPattern(); + + if (!token.empty()) { + TestSpec::PatternPtr pattern = std::make_shared<TestSpec::NamePattern>(token, m_substring); + if (m_exclusion) + pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern); + m_currentFilter.m_patterns.push_back(pattern); + } + m_substring.clear(); + m_exclusion = false; + m_mode = None; + } + + void TestSpecParser::addTagPattern() { + auto token = preprocessPattern(); + + if (!token.empty()) { + // If the tag pattern is the "hide and tag" shorthand (e.g. [.foo]) + // we have to create a separate hide tag and shorten the real one + if (token.size() > 1 && token[0] == '.') { + token.erase(token.begin()); + TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(".", m_substring); + if (m_exclusion) { + pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern); + } + m_currentFilter.m_patterns.push_back(pattern); + } + + TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(token, m_substring); + + if (m_exclusion) { + pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern); + } + m_currentFilter.m_patterns.push_back(pattern); + } + m_substring.clear(); + m_exclusion = false; + m_mode = None; + } + TestSpec parseTestSpec( std::string const& arg ) { return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); } @@ -12714,13 +14903,11 @@ namespace Detail { enum Arch { Big, Little }; static Arch which() { - union _{ - int asInt; - char asChar[sizeof (int)]; - } u; - - u.asInt = 1; - return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; + int one = 1; + // If the lowest byte we read is non-zero, we can assume + // that little endian format is used. + auto value = *reinterpret_cast<char*>(&one); + return value ? Little : Big; } }; } @@ -12844,6 +15031,13 @@ std::string StringMaker<wchar_t *>::convert(wchar_t * str) { } #endif +#if defined(CATCH_CONFIG_CPP17_BYTE) +#include <cstddef> +std::string StringMaker<std::byte>::convert(std::byte value) { + return ::Catch::Detail::stringify(std::to_integer<unsigned long long>(value)); +} +#endif // defined(CATCH_CONFIG_CPP17_BYTE) + std::string StringMaker<int>::convert(int value) { return ::Catch::Detail::stringify(static_cast<long long>(value)); } @@ -12989,11 +15183,48 @@ namespace Catch { // end catch_totals.cpp // start catch_uncaught_exceptions.cpp +// start catch_config_uncaught_exceptions.hpp + +// Copyright Catch2 Authors +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// https://www.boost.org/LICENSE_1_0.txt) + +// SPDX-License-Identifier: BSL-1.0 + +#ifndef CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP +#define CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP + +#if defined(_MSC_VER) +# if _MSC_VER >= 1900 // Visual Studio 2015 or newer +# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +# endif +#endif + +#include <exception> + +#if defined(__cpp_lib_uncaught_exceptions) \ + && !defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) + +# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +#endif // __cpp_lib_uncaught_exceptions + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) \ + && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) \ + && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) + +# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +#endif + +#endif // CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP +// end catch_config_uncaught_exceptions.hpp #include <exception> namespace Catch { bool uncaught_exceptions() { -#if defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) +#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + return false; +#elif defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) return std::uncaught_exceptions() > 0; #else return std::uncaught_exception(); @@ -13033,7 +15264,7 @@ namespace Catch { } Version const& libraryVersion() { - static Version version( 2, 8, 0, "", 0 ); + static Version version( 2, 13, 2, "", 0 ); return version; } @@ -13041,14 +15272,12 @@ namespace Catch { // end catch_version.cpp // start catch_wildcard_pattern.cpp -#include <sstream> - namespace Catch { WildcardPattern::WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ) : m_caseSensitivity( caseSensitivity ), - m_pattern( adjustCase( pattern ) ) + m_pattern( normaliseString( pattern ) ) { if( startsWith( m_pattern, '*' ) ) { m_pattern = m_pattern.substr( 1 ); @@ -13063,28 +15292,27 @@ namespace Catch { bool WildcardPattern::matches( std::string const& str ) const { switch( m_wildcard ) { case NoWildcard: - return m_pattern == adjustCase( str ); + return m_pattern == normaliseString( str ); case WildcardAtStart: - return endsWith( adjustCase( str ), m_pattern ); + return endsWith( normaliseString( str ), m_pattern ); case WildcardAtEnd: - return startsWith( adjustCase( str ), m_pattern ); + return startsWith( normaliseString( str ), m_pattern ); case WildcardAtBothEnds: - return contains( adjustCase( str ), m_pattern ); + return contains( normaliseString( str ), m_pattern ); default: CATCH_INTERNAL_ERROR( "Unknown enum" ); } } - std::string WildcardPattern::adjustCase( std::string const& str ) const { - return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; + std::string WildcardPattern::normaliseString( std::string const& str ) const { + return trim( m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str ); } } // end catch_wildcard_pattern.cpp // start catch_xmlwriter.cpp #include <iomanip> - -using uchar = unsigned char; +#include <type_traits> namespace Catch { @@ -13124,8 +15352,30 @@ namespace { os.flags(f); } + bool shouldNewline(XmlFormatting fmt) { + return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Newline)); + } + + bool shouldIndent(XmlFormatting fmt) { + return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Indent)); + } + } // anonymous namespace + XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs) { + return static_cast<XmlFormatting>( + static_cast<std::underlying_type<XmlFormatting>::type>(lhs) | + static_cast<std::underlying_type<XmlFormatting>::type>(rhs) + ); + } + + XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs) { + return static_cast<XmlFormatting>( + static_cast<std::underlying_type<XmlFormatting>::type>(lhs) & + static_cast<std::underlying_type<XmlFormatting>::type>(rhs) + ); + } + XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat ) : m_str( str ), m_forWhat( forWhat ) @@ -13136,7 +15386,7 @@ namespace { // (see: http://www.w3.org/TR/xml/#syntax) for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) { - uchar c = m_str[idx]; + unsigned char c = m_str[idx]; switch (c) { case '<': os << "<"; break; case '&': os << "&"; break; @@ -13196,7 +15446,7 @@ namespace { bool valid = true; uint32_t value = headerValue(c); for (std::size_t n = 1; n < encBytes; ++n) { - uchar nc = m_str[idx + n]; + unsigned char nc = m_str[idx + n]; valid &= ((nc & 0xC0) == 0x80); value = (value << 6) | (nc & 0x3F); } @@ -13230,13 +15480,17 @@ namespace { return os; } - XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer ) - : m_writer( writer ) + XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer, XmlFormatting fmt ) + : m_writer( writer ), + m_fmt(fmt) {} XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) noexcept - : m_writer( other.m_writer ){ + : m_writer( other.m_writer ), + m_fmt(other.m_fmt) + { other.m_writer = nullptr; + other.m_fmt = XmlFormatting::None; } XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) noexcept { if ( m_writer ) { @@ -13244,16 +15498,19 @@ namespace { } m_writer = other.m_writer; other.m_writer = nullptr; + m_fmt = other.m_fmt; + other.m_fmt = XmlFormatting::None; return *this; } XmlWriter::ScopedElement::~ScopedElement() { - if( m_writer ) - m_writer->endElement(); + if (m_writer) { + m_writer->endElement(m_fmt); + } } - XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, bool indent ) { - m_writer->writeText( text, indent ); + XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, XmlFormatting fmt ) { + m_writer->writeText( text, fmt ); return *this; } @@ -13263,37 +15520,47 @@ namespace { } XmlWriter::~XmlWriter() { - while( !m_tags.empty() ) + while (!m_tags.empty()) { endElement(); + } + newlineIfNecessary(); } - XmlWriter& XmlWriter::startElement( std::string const& name ) { + XmlWriter& XmlWriter::startElement( std::string const& name, XmlFormatting fmt ) { ensureTagClosed(); newlineIfNecessary(); - m_os << m_indent << '<' << name; + if (shouldIndent(fmt)) { + m_os << m_indent; + m_indent += " "; + } + m_os << '<' << name; m_tags.push_back( name ); - m_indent += " "; m_tagIsOpen = true; + applyFormatting(fmt); return *this; } - XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name ) { - ScopedElement scoped( this ); - startElement( name ); + XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name, XmlFormatting fmt ) { + ScopedElement scoped( this, fmt ); + startElement( name, fmt ); return scoped; } - XmlWriter& XmlWriter::endElement() { - newlineIfNecessary(); - m_indent = m_indent.substr( 0, m_indent.size()-2 ); + XmlWriter& XmlWriter::endElement(XmlFormatting fmt) { + m_indent = m_indent.substr(0, m_indent.size() - 2); + if( m_tagIsOpen ) { m_os << "/>"; m_tagIsOpen = false; + } else { + newlineIfNecessary(); + if (shouldIndent(fmt)) { + m_os << m_indent; + } + m_os << "</" << m_tags.back() << ">"; } - else { - m_os << m_indent << "</" << m_tags.back() << ">"; - } - m_os << std::endl; + m_os << std::flush; + applyFormatting(fmt); m_tags.pop_back(); return *this; } @@ -13309,22 +15576,26 @@ namespace { return *this; } - XmlWriter& XmlWriter::writeText( std::string const& text, bool indent ) { + XmlWriter& XmlWriter::writeText( std::string const& text, XmlFormatting fmt) { if( !text.empty() ){ bool tagWasOpen = m_tagIsOpen; ensureTagClosed(); - if( tagWasOpen && indent ) + if (tagWasOpen && shouldIndent(fmt)) { m_os << m_indent; + } m_os << XmlEncode( text ); - m_needsNewline = true; + applyFormatting(fmt); } return *this; } - XmlWriter& XmlWriter::writeComment( std::string const& text ) { + XmlWriter& XmlWriter::writeComment( std::string const& text, XmlFormatting fmt) { ensureTagClosed(); - m_os << m_indent << "<!--" << text << "-->"; - m_needsNewline = true; + if (shouldIndent(fmt)) { + m_os << m_indent; + } + m_os << "<!--" << text << "-->"; + applyFormatting(fmt); return *this; } @@ -13340,11 +15611,16 @@ namespace { void XmlWriter::ensureTagClosed() { if( m_tagIsOpen ) { - m_os << ">" << std::endl; + m_os << '>' << std::flush; + newlineIfNecessary(); m_tagIsOpen = false; } } + void XmlWriter::applyFormatting(XmlFormatting fmt) { + m_needsNewline = shouldNewline(fmt); + } + void XmlWriter::writeDeclaration() { m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; } @@ -13390,6 +15666,17 @@ namespace Catch { return std::string(buffer); } + bool shouldShowDuration( IConfig const& config, double duration ) { + if ( config.showDurations() == ShowDurations::Always ) { + return true; + } + if ( config.showDurations() == ShowDurations::Never ) { + return false; + } + const double min = config.minDuration(); + return min >= 0 && duration >= min; + } + std::string serializeFilters( std::vector<std::string> const& container ) { ReusableStringStream oss; bool first = true; @@ -13620,24 +15907,25 @@ private: if (itMessage == messages.end()) return; - // using messages.end() directly yields (or auto) compilation error: - std::vector<MessageInfo>::const_iterator itEnd = messages.end(); - const std::size_t N = static_cast<std::size_t>(std::distance(itMessage, itEnd)); + const auto itEnd = messages.cend(); + const auto N = static_cast<std::size_t>(std::distance(itMessage, itEnd)); { Colour colourGuard(colour); stream << " with " << pluralise(N, "message") << ':'; } - for (; itMessage != itEnd; ) { + while (itMessage != itEnd) { // If this assertion is a warning ignore any INFO messages if (printInfoMessages || itMessage->type != ResultWas::Info) { - stream << " '" << itMessage->message << '\''; - if (++itMessage != itEnd) { + printMessage(); + if (itMessage != itEnd) { Colour colourGuard(dimColour()); stream << " and"; } + continue; } + ++itMessage; } } @@ -13655,10 +15943,6 @@ private: return "Reports test results on a single line, suitable for IDEs"; } - ReporterPreferences CompactReporter::getPreferences() const { - return m_reporterPrefs; - } - void CompactReporter::noMatchingTestCases( std::string const& spec ) { stream << "No test cases matched '" << spec << '\'' << std::endl; } @@ -13685,8 +15969,9 @@ private: } void CompactReporter::sectionEnded(SectionStats const& _sectionStats) { - if (m_config->showDurations() == ShowDurations::Always) { - stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; + double dur = _sectionStats.durationInSeconds; + if ( shouldShowDuration( *m_config, dur ) ) { + stream << getFormattedDuration( dur ) << " s: " << _sectionStats.sectionInfo.name << std::endl; } } @@ -13710,8 +15995,13 @@ private: #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch - // Note that 4062 (not all labels are handled - // and default is missing) is enabled + // Note that 4062 (not all labels are handled and default is missing) is enabled +#endif + +#if defined(__clang__) +# pragma clang diagnostic push +// For simplicity, benchmarking-only helpers are always enabled +# pragma clang diagnostic ignored "-Wunused-function" #endif namespace Catch { @@ -13893,11 +16183,11 @@ class Duration { static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond; static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond; - uint64_t m_inNanoseconds; + double m_inNanoseconds; Unit m_units; public: - explicit Duration(uint64_t inNanoseconds, Unit units = Unit::Auto) + explicit Duration(double inNanoseconds, Unit units = Unit::Auto) : m_inNanoseconds(inNanoseconds), m_units(units) { if (m_units == Unit::Auto) { @@ -13926,7 +16216,7 @@ public: case Unit::Minutes: return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMinute); default: - return static_cast<double>(m_inNanoseconds); + return m_inNanoseconds; } } auto unitsAsString() const -> std::string { @@ -13947,7 +16237,7 @@ public: } friend auto operator << (std::ostream& os, Duration const& duration) -> std::ostream& { - return os << duration.value() << " " << duration.unitsAsString(); + return os << duration.value() << ' ' << duration.unitsAsString(); } }; } // end anon namespace @@ -13972,10 +16262,16 @@ public: if (!m_isOpen) { m_isOpen = true; *this << RowBreak(); - for (auto const& info : m_columnInfos) - *this << info.name << ColumnBreak(); - *this << RowBreak(); - m_os << Catch::getLineOfChars<'-'>() << "\n"; + + Columns headerCols; + Spacer spacer(2); + for (auto const& info : m_columnInfos) { + headerCols += Column(info.name).width(static_cast<std::size_t>(info.width - 2)); + headerCols += spacer; + } + m_os << headerCols << '\n'; + + m_os << Catch::getLineOfChars<'-'>() << '\n'; } } void close() { @@ -13994,30 +16290,29 @@ public: friend TablePrinter& operator << (TablePrinter& tp, ColumnBreak) { auto colStr = tp.m_oss.str(); - // This takes account of utf8 encodings - auto strSize = Catch::StringRef(colStr).numberOfCharacters(); + const auto strSize = colStr.size(); tp.m_oss.str(""); tp.open(); if (tp.m_currentColumn == static_cast<int>(tp.m_columnInfos.size() - 1)) { tp.m_currentColumn = -1; - tp.m_os << "\n"; + tp.m_os << '\n'; } tp.m_currentColumn++; auto colInfo = tp.m_columnInfos[tp.m_currentColumn]; - auto padding = (strSize + 2 < static_cast<std::size_t>(colInfo.width)) - ? std::string(colInfo.width - (strSize + 2), ' ') + auto padding = (strSize + 1 < static_cast<std::size_t>(colInfo.width)) + ? std::string(colInfo.width - (strSize + 1), ' ') : std::string(); if (colInfo.justification == ColumnInfo::Left) - tp.m_os << colStr << padding << " "; + tp.m_os << colStr << padding << ' '; else - tp.m_os << padding << colStr << " "; + tp.m_os << padding << colStr << ' '; return tp; } friend TablePrinter& operator << (TablePrinter& tp, RowBreak) { if (tp.m_currentColumn > 0) { - tp.m_os << "\n"; + tp.m_os << '\n'; tp.m_currentColumn = -1; } return tp; @@ -14027,12 +16322,26 @@ public: ConsoleReporter::ConsoleReporter(ReporterConfig const& config) : StreamingReporterBase(config), m_tablePrinter(new TablePrinter(config.stream(), - { - { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 32, ColumnInfo::Left }, - { "iters", 8, ColumnInfo::Right }, - { "elapsed ns", 14, ColumnInfo::Right }, - { "average", 14, ColumnInfo::Right } - })) {} + [&config]() -> std::vector<ColumnInfo> { + if (config.fullConfig()->benchmarkNoAnalysis()) + { + return{ + { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left }, + { " samples", 14, ColumnInfo::Right }, + { " iterations", 14, ColumnInfo::Right }, + { " mean", 14, ColumnInfo::Right } + }; + } + else + { + return{ + { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left }, + { "samples mean std dev", 14, ColumnInfo::Right }, + { "iterations low mean low std dev", 14, ColumnInfo::Right }, + { "estimated high mean high std dev", 14, ColumnInfo::Right } + }; + } + }())) {} ConsoleReporter::~ConsoleReporter() = default; std::string ConsoleReporter::getDescription() { @@ -14043,6 +16352,10 @@ void ConsoleReporter::noMatchingTestCases(std::string const& spec) { stream << "No test cases matched '" << spec << '\'' << std::endl; } +void ConsoleReporter::reportInvalidArguments(std::string const&arg){ + stream << "Invalid Filter: " << arg << std::endl; +} + void ConsoleReporter::assertionStarting(AssertionInfo const&) {} bool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) { @@ -14063,6 +16376,7 @@ bool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) { } void ConsoleReporter::sectionStarting(SectionInfo const& _sectionInfo) { + m_tablePrinter->close(); m_headerPrinted = false; StreamingReporterBase::sectionStarting(_sectionInfo); } @@ -14077,8 +16391,9 @@ void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) { stream << "\nNo assertions in test case"; stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; } - if (m_config->showDurations() == ShowDurations::Always) { - stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; + double dur = _sectionStats.durationInSeconds; + if (shouldShowDuration(*m_config, dur)) { + stream << getFormattedDuration(dur) << " s: " << _sectionStats.sectionInfo.name << std::endl; } if (m_headerPrinted) { m_headerPrinted = false; @@ -14086,28 +16401,53 @@ void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) { StreamingReporterBase::sectionEnded(_sectionStats); } -void ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) { - lazyPrintWithoutClosingBenchmarkTable(); +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +void ConsoleReporter::benchmarkPreparing(std::string const& name) { + lazyPrintWithoutClosingBenchmarkTable(); - auto nameCol = Column( info.name ).width( static_cast<std::size_t>( m_tablePrinter->columnInfos()[0].width - 2 ) ); + auto nameCol = Column(name).width(static_cast<std::size_t>(m_tablePrinter->columnInfos()[0].width - 2)); - bool firstLine = true; - for (auto line : nameCol) { - if (!firstLine) - (*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak(); - else - firstLine = false; + bool firstLine = true; + for (auto line : nameCol) { + if (!firstLine) + (*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak(); + else + firstLine = false; + + (*m_tablePrinter) << line << ColumnBreak(); + } +} - (*m_tablePrinter) << line << ColumnBreak(); +void ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) { + (*m_tablePrinter) << info.samples << ColumnBreak() + << info.iterations << ColumnBreak(); + if (!m_config->benchmarkNoAnalysis()) + (*m_tablePrinter) << Duration(info.estimatedDuration) << ColumnBreak(); +} +void ConsoleReporter::benchmarkEnded(BenchmarkStats<> const& stats) { + if (m_config->benchmarkNoAnalysis()) + { + (*m_tablePrinter) << Duration(stats.mean.point.count()) << ColumnBreak(); + } + else + { + (*m_tablePrinter) << ColumnBreak() + << Duration(stats.mean.point.count()) << ColumnBreak() + << Duration(stats.mean.lower_bound.count()) << ColumnBreak() + << Duration(stats.mean.upper_bound.count()) << ColumnBreak() << ColumnBreak() + << Duration(stats.standardDeviation.point.count()) << ColumnBreak() + << Duration(stats.standardDeviation.lower_bound.count()) << ColumnBreak() + << Duration(stats.standardDeviation.upper_bound.count()) << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak(); } } -void ConsoleReporter::benchmarkEnded(BenchmarkStats const& stats) { - Duration average(stats.elapsedTimeInNanoseconds / stats.iterations); + +void ConsoleReporter::benchmarkFailed(std::string const& error) { + Colour colour(Colour::Red); (*m_tablePrinter) - << stats.iterations << ColumnBreak() - << stats.elapsedTimeInNanoseconds << ColumnBreak() - << average << ColumnBreak(); + << "Benchmark failed (" << error << ')' + << ColumnBreak() << RowBreak(); } +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING void ConsoleReporter::testCaseEnded(TestCaseStats const& _testCaseStats) { m_tablePrinter->close(); @@ -14186,11 +16526,9 @@ void ConsoleReporter::printTestCaseAndSectionHeader() { SourceLineInfo lineInfo = m_sectionStack.back().lineInfo; - if (!lineInfo.empty()) { - stream << getLineOfChars<'-'>() << '\n'; - Colour colourGuard(Colour::FileName); - stream << lineInfo << '\n'; - } + stream << getLineOfChars<'-'>() << '\n'; + Colour colourGuard(Colour::FileName); + stream << lineInfo << '\n'; stream << getLineOfChars<'.'>() << '\n' << std::endl; } @@ -14315,8 +16653,10 @@ void ConsoleReporter::printSummaryDivider() { } void ConsoleReporter::printTestFilters() { - if (m_config->testSpec().hasFilters()) - stream << Colour(Colour::BrightYellow) << "Filters: " << serializeFilters( m_config->getTestsOrTags() ) << '\n'; + if (m_config->testSpec().hasFilters()) { + Colour guard(Colour::BrightYellow); + stream << "Filters: " << serializeFilters(m_config->getTestsOrTags()) << '\n'; + } } CATCH_REGISTER_REPORTER("console", ConsoleReporter) @@ -14326,6 +16666,10 @@ CATCH_REGISTER_REPORTER("console", ConsoleReporter) #if defined(_MSC_VER) #pragma warning(pop) #endif + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif // end catch_reporter_console.cpp // start catch_reporter_junit.cpp @@ -14462,8 +16806,8 @@ namespace Catch { for( auto const& child : groupNode.children ) writeTestCase( *child ); - xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite ), false ); - xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite ), false ); + xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite ), XmlFormatting::Newline ); + xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite ), XmlFormatting::Newline ); } void JunitReporter::writeTestCase( TestCaseNode const& testCaseNode ) { @@ -14508,13 +16852,18 @@ namespace Catch { xml.writeAttribute( "name", name ); } xml.writeAttribute( "time", ::Catch::Detail::stringify( sectionNode.stats.durationInSeconds ) ); + // This is not ideal, but it should be enough to mimic gtest's + // junit output. + // Ideally the JUnit reporter would also handle `skipTest` + // events and write those out appropriately. + xml.writeAttribute( "status", "run" ); writeAssertions( sectionNode ); if( !sectionNode.stdOut.empty() ) - xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); + xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), XmlFormatting::Newline ); if( !sectionNode.stdErr.empty() ) - xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); + xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), XmlFormatting::Newline ); } for( auto const& childNode : sectionNode.childSections ) if( className.empty() ) @@ -14538,11 +16887,7 @@ namespace Catch { elementName = "error"; break; case ResultWas::ExplicitFailure: - elementName = "failure"; - break; case ResultWas::ExpressionFailed: - elementName = "failure"; - break; case ResultWas::DidntThrowException: elementName = "failure"; break; @@ -14560,10 +16905,25 @@ namespace Catch { XmlWriter::ScopedElement e = xml.scopedElement( elementName ); - xml.writeAttribute( "message", result.getExpandedExpression() ); + xml.writeAttribute( "message", result.getExpression() ); xml.writeAttribute( "type", result.getTestMacroName() ); ReusableStringStream rss; + if (stats.totals.assertions.total() > 0) { + rss << "FAILED" << ":\n"; + if (result.hasExpression()) { + rss << " "; + rss << result.getExpressionInMacro(); + rss << '\n'; + } + if (result.hasExpandedExpression()) { + rss << "with expansion:\n"; + rss << Column(result.getExpandedExpression()).indent(2) << '\n'; + } + } else { + rss << '\n'; + } + if( !result.getMessage().empty() ) rss << result.getMessage() << '\n'; for( auto const& msg : stats.infoMessages ) @@ -14571,7 +16931,7 @@ namespace Catch { rss << msg.message << '\n'; rss << "at " << result.getSourceInfo(); - xml.writeText( rss.str(), false ); + xml.writeText( rss.str(), XmlFormatting::Newline ); } } @@ -14615,19 +16975,41 @@ namespace Catch { m_reporter->noMatchingTestCases( spec ); } + void ListeningReporter::reportInvalidArguments(std::string const&arg){ + for ( auto const& listener : m_listeners ) { + listener->reportInvalidArguments( arg ); + } + m_reporter->reportInvalidArguments( arg ); + } + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void ListeningReporter::benchmarkPreparing( std::string const& name ) { + for (auto const& listener : m_listeners) { + listener->benchmarkPreparing(name); + } + m_reporter->benchmarkPreparing(name); + } void ListeningReporter::benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) { for ( auto const& listener : m_listeners ) { listener->benchmarkStarting( benchmarkInfo ); } m_reporter->benchmarkStarting( benchmarkInfo ); } - void ListeningReporter::benchmarkEnded( BenchmarkStats const& benchmarkStats ) { + void ListeningReporter::benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) { for ( auto const& listener : m_listeners ) { listener->benchmarkEnded( benchmarkStats ); } m_reporter->benchmarkEnded( benchmarkStats ); } + void ListeningReporter::benchmarkFailed( std::string const& error ) { + for (auto const& listener : m_listeners) { + listener->benchmarkFailed(error); + } + m_reporter->benchmarkFailed(error); + } +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + void ListeningReporter::testRunStarting( TestRunInfo const& testRunInfo ) { for ( auto const& listener : m_listeners ) { listener->testRunStarting( testRunInfo ); @@ -14895,9 +17277,9 @@ namespace Catch { e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); if( !testCaseStats.stdOut.empty() ) - m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), false ); + m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), XmlFormatting::Newline ); if( !testCaseStats.stdErr.empty() ) - m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), false ); + m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), XmlFormatting::Newline ); m_xml.endElement(); } @@ -14909,6 +17291,10 @@ namespace Catch { .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); + m_xml.scopedElement( "OverallResultsCases") + .writeAttribute( "successes", testGroupStats.totals.testCases.passed ) + .writeAttribute( "failures", testGroupStats.totals.testCases.failed ) + .writeAttribute( "expectedFailures", testGroupStats.totals.testCases.failedButOk ); m_xml.endElement(); } @@ -14918,8 +17304,57 @@ namespace Catch { .writeAttribute( "successes", testRunStats.totals.assertions.passed ) .writeAttribute( "failures", testRunStats.totals.assertions.failed ) .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); + m_xml.scopedElement( "OverallResultsCases") + .writeAttribute( "successes", testRunStats.totals.testCases.passed ) + .writeAttribute( "failures", testRunStats.totals.testCases.failed ) + .writeAttribute( "expectedFailures", testRunStats.totals.testCases.failedButOk ); + m_xml.endElement(); + } + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void XmlReporter::benchmarkPreparing(std::string const& name) { + m_xml.startElement("BenchmarkResults") + .writeAttribute("name", name); + } + + void XmlReporter::benchmarkStarting(BenchmarkInfo const &info) { + m_xml.writeAttribute("samples", info.samples) + .writeAttribute("resamples", info.resamples) + .writeAttribute("iterations", info.iterations) + .writeAttribute("clockResolution", info.clockResolution) + .writeAttribute("estimatedDuration", info.estimatedDuration) + .writeComment("All values in nano seconds"); + } + + void XmlReporter::benchmarkEnded(BenchmarkStats<> const& benchmarkStats) { + m_xml.startElement("mean") + .writeAttribute("value", benchmarkStats.mean.point.count()) + .writeAttribute("lowerBound", benchmarkStats.mean.lower_bound.count()) + .writeAttribute("upperBound", benchmarkStats.mean.upper_bound.count()) + .writeAttribute("ci", benchmarkStats.mean.confidence_interval); + m_xml.endElement(); + m_xml.startElement("standardDeviation") + .writeAttribute("value", benchmarkStats.standardDeviation.point.count()) + .writeAttribute("lowerBound", benchmarkStats.standardDeviation.lower_bound.count()) + .writeAttribute("upperBound", benchmarkStats.standardDeviation.upper_bound.count()) + .writeAttribute("ci", benchmarkStats.standardDeviation.confidence_interval); + m_xml.endElement(); + m_xml.startElement("outliers") + .writeAttribute("variance", benchmarkStats.outlierVariance) + .writeAttribute("lowMild", benchmarkStats.outliers.low_mild) + .writeAttribute("lowSevere", benchmarkStats.outliers.low_severe) + .writeAttribute("highMild", benchmarkStats.outliers.high_mild) + .writeAttribute("highSevere", benchmarkStats.outliers.high_severe); + m_xml.endElement(); + m_xml.endElement(); + } + + void XmlReporter::benchmarkFailed(std::string const &error) { + m_xml.scopedElement("failed"). + writeAttribute("message", error); m_xml.endElement(); } +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING CATCH_REGISTER_REPORTER( "xml", XmlReporter ) @@ -14946,7 +17381,7 @@ namespace Catch { #ifndef __OBJC__ -#if defined(CATCH_CONFIG_WCHAR) && defined(WIN32) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN) +#if defined(CATCH_CONFIG_WCHAR) && defined(CATCH_PLATFORM_WINDOWS) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN) // Standard C/C++ Win32 Unicode wmain entry point extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) { #else @@ -15077,6 +17512,13 @@ int main (int argc, char * const argv[]) { #define CATCH_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc ) #define CATCH_AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc ) +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +#define CATCH_BENCHMARK(...) \ + INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,)) +#define CATCH_BENCHMARK_ADVANCED(name) \ + INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name) +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + // If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required #else @@ -15136,6 +17578,8 @@ int main (int argc, char * const argv[]) { #define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) #define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) #define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) +#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__) +#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) #else #define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) ) #define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) ) @@ -15145,6 +17589,8 @@ int main (int argc, char * const argv[]) { #define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) ) #define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) #define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) ) +#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE( __VA_ARGS__ ) ) +#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) #endif #if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE) @@ -15170,6 +17616,13 @@ int main (int argc, char * const argv[]) { #define THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc ) #define AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc ) +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +#define BENCHMARK(...) \ + INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,)) +#define BENCHMARK_ADVANCED(name) \ + INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name) +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + using Catch::Detail::Approx; #else // CATCH_CONFIG_DISABLE diff --git a/externals/catch2/catch2/catch_reporter_automake.hpp b/externals/catch2/catch2/catch_reporter_automake.hpp new file mode 100644 index 000000000..dbebe9751 --- /dev/null +++ b/externals/catch2/catch2/catch_reporter_automake.hpp @@ -0,0 +1,62 @@ +/* + * Created by Justin R. Wilson on 2/19/2017. + * Copyright 2017 Justin R. Wilson. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +#ifndef TWOBLUECUBES_CATCH_REPORTER_AUTOMAKE_HPP_INCLUDED +#define TWOBLUECUBES_CATCH_REPORTER_AUTOMAKE_HPP_INCLUDED + +// Don't #include any Catch headers here - we can assume they are already +// included before this header. +// This is not good practice in general but is necessary in this case so this +// file can be distributed as a single header that works with the main +// Catch single header. + +namespace Catch { + + struct AutomakeReporter : StreamingReporterBase<AutomakeReporter> { + AutomakeReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ) + {} + + ~AutomakeReporter() override; + + static std::string getDescription() { + return "Reports test results in the format of Automake .trs files"; + } + + void assertionStarting( AssertionInfo const& ) override {} + + bool assertionEnded( AssertionStats const& /*_assertionStats*/ ) override { return true; } + + void testCaseEnded( TestCaseStats const& _testCaseStats ) override { + // Possible values to emit are PASS, XFAIL, SKIP, FAIL, XPASS and ERROR. + stream << ":test-result: "; + if (_testCaseStats.totals.assertions.allPassed()) { + stream << "PASS"; + } else if (_testCaseStats.totals.assertions.allOk()) { + stream << "XFAIL"; + } else { + stream << "FAIL"; + } + stream << ' ' << _testCaseStats.testInfo.name << '\n'; + StreamingReporterBase::testCaseEnded( _testCaseStats ); + } + + void skipTest( TestCaseInfo const& testInfo ) override { + stream << ":test-result: SKIP " << testInfo.name << '\n'; + } + + }; + +#ifdef CATCH_IMPL + AutomakeReporter::~AutomakeReporter() {} +#endif + + CATCH_REGISTER_REPORTER( "automake", AutomakeReporter) + +} // end namespace Catch + +#endif // TWOBLUECUBES_CATCH_REPORTER_AUTOMAKE_HPP_INCLUDED diff --git a/externals/catch2/catch2/catch_reporter_sonarqube.hpp b/externals/catch2/catch2/catch_reporter_sonarqube.hpp new file mode 100644 index 000000000..bf7d9299a --- /dev/null +++ b/externals/catch2/catch2/catch_reporter_sonarqube.hpp @@ -0,0 +1,181 @@ +/* + * Created by Daniel Garcia on 2018-12-04. + * Copyright Social Point SL. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +#ifndef CATCH_REPORTER_SONARQUBE_HPP_INCLUDED +#define CATCH_REPORTER_SONARQUBE_HPP_INCLUDED + + +// Don't #include any Catch headers here - we can assume they are already +// included before this header. +// This is not good practice in general but is necessary in this case so this +// file can be distributed as a single header that works with the main +// Catch single header. + +#include <map> + +namespace Catch { + + struct SonarQubeReporter : CumulativeReporterBase<SonarQubeReporter> { + + SonarQubeReporter(ReporterConfig const& config) + : CumulativeReporterBase(config) + , xml(config.stream()) { + m_reporterPrefs.shouldRedirectStdOut = true; + m_reporterPrefs.shouldReportAllAssertions = true; + } + + ~SonarQubeReporter() override; + + static std::string getDescription() { + return "Reports test results in the Generic Test Data SonarQube XML format"; + } + + static std::set<Verbosity> getSupportedVerbosities() { + return { Verbosity::Normal }; + } + + void noMatchingTestCases(std::string const& /*spec*/) override {} + + void testRunStarting(TestRunInfo const& testRunInfo) override { + CumulativeReporterBase::testRunStarting(testRunInfo); + xml.startElement("testExecutions"); + xml.writeAttribute("version", "1"); + } + + void testGroupEnded(TestGroupStats const& testGroupStats) override { + CumulativeReporterBase::testGroupEnded(testGroupStats); + writeGroup(*m_testGroups.back()); + } + + void testRunEndedCumulative() override { + xml.endElement(); + } + + void writeGroup(TestGroupNode const& groupNode) { + std::map<std::string, TestGroupNode::ChildNodes> testsPerFile; + for(auto const& child : groupNode.children) + testsPerFile[child->value.testInfo.lineInfo.file].push_back(child); + + for(auto const& kv : testsPerFile) + writeTestFile(kv.first.c_str(), kv.second); + } + + void writeTestFile(const char* filename, TestGroupNode::ChildNodes const& testCaseNodes) { + XmlWriter::ScopedElement e = xml.scopedElement("file"); + xml.writeAttribute("path", filename); + + for(auto const& child : testCaseNodes) + writeTestCase(*child); + } + + void writeTestCase(TestCaseNode const& testCaseNode) { + // All test cases have exactly one section - which represents the + // test case itself. That section may have 0-n nested sections + assert(testCaseNode.children.size() == 1); + SectionNode const& rootSection = *testCaseNode.children.front(); + writeSection("", rootSection, testCaseNode.value.testInfo.okToFail()); + } + + void writeSection(std::string const& rootName, SectionNode const& sectionNode, bool okToFail) { + std::string name = trim(sectionNode.stats.sectionInfo.name); + if(!rootName.empty()) + name = rootName + '/' + name; + + if(!sectionNode.assertions.empty() || !sectionNode.stdOut.empty() || !sectionNode.stdErr.empty()) { + XmlWriter::ScopedElement e = xml.scopedElement("testCase"); + xml.writeAttribute("name", name); + xml.writeAttribute("duration", static_cast<long>(sectionNode.stats.durationInSeconds * 1000)); + + writeAssertions(sectionNode, okToFail); + } + + for(auto const& childNode : sectionNode.childSections) + writeSection(name, *childNode, okToFail); + } + + void writeAssertions(SectionNode const& sectionNode, bool okToFail) { + for(auto const& assertion : sectionNode.assertions) + writeAssertion( assertion, okToFail); + } + + void writeAssertion(AssertionStats const& stats, bool okToFail) { + AssertionResult const& result = stats.assertionResult; + if(!result.isOk()) { + std::string elementName; + if(okToFail) { + elementName = "skipped"; + } + else { + switch(result.getResultType()) { + case ResultWas::ThrewException: + case ResultWas::FatalErrorCondition: + elementName = "error"; + break; + case ResultWas::ExplicitFailure: + elementName = "failure"; + break; + case ResultWas::ExpressionFailed: + elementName = "failure"; + break; + case ResultWas::DidntThrowException: + elementName = "failure"; + break; + + // We should never see these here: + case ResultWas::Info: + case ResultWas::Warning: + case ResultWas::Ok: + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + elementName = "internalError"; + break; + } + } + + XmlWriter::ScopedElement e = xml.scopedElement(elementName); + + ReusableStringStream messageRss; + messageRss << result.getTestMacroName() << "(" << result.getExpression() << ")"; + xml.writeAttribute("message", messageRss.str()); + + ReusableStringStream textRss; + if (stats.totals.assertions.total() > 0) { + textRss << "FAILED:\n"; + if (result.hasExpression()) { + textRss << "\t" << result.getExpressionInMacro() << "\n"; + } + if (result.hasExpandedExpression()) { + textRss << "with expansion:\n\t" << result.getExpandedExpression() << "\n"; + } + } + + if(!result.getMessage().empty()) + textRss << result.getMessage() << "\n"; + + for(auto const& msg : stats.infoMessages) + if(msg.type == ResultWas::Info) + textRss << msg.message << "\n"; + + textRss << "at " << result.getSourceInfo(); + xml.writeText(textRss.str(), XmlFormatting::Newline); + } + } + + private: + XmlWriter xml; + }; + +#ifdef CATCH_IMPL + SonarQubeReporter::~SonarQubeReporter() {} +#endif + + CATCH_REGISTER_REPORTER( "sonarqube", SonarQubeReporter ) + +} // end namespace Catch + +#endif // CATCH_REPORTER_SONARQUBE_HPP_INCLUDED \ No newline at end of file diff --git a/externals/catch2/catch2/catch_reporter_tap.hpp b/externals/catch2/catch2/catch_reporter_tap.hpp new file mode 100644 index 000000000..5ac8524ce --- /dev/null +++ b/externals/catch2/catch2/catch_reporter_tap.hpp @@ -0,0 +1,254 @@ +/* + * Created by Colton Wolkins on 2015-08-15. + * Copyright 2015 Martin Moene. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +#ifndef TWOBLUECUBES_CATCH_REPORTER_TAP_HPP_INCLUDED +#define TWOBLUECUBES_CATCH_REPORTER_TAP_HPP_INCLUDED + + +// Don't #include any Catch headers here - we can assume they are already +// included before this header. +// This is not good practice in general but is necessary in this case so this +// file can be distributed as a single header that works with the main +// Catch single header. + +#include <algorithm> + +namespace Catch { + + struct TAPReporter : StreamingReporterBase<TAPReporter> { + + using StreamingReporterBase::StreamingReporterBase; + + TAPReporter( ReporterConfig const& config ): + StreamingReporterBase( config ) { + m_reporterPrefs.shouldReportAllAssertions = true; + } + + ~TAPReporter() override; + + static std::string getDescription() { + return "Reports test results in TAP format, suitable for test harnesses"; + } + + void noMatchingTestCases( std::string const& spec ) override { + stream << "# No test cases matched '" << spec << "'" << std::endl; + } + + void assertionStarting( AssertionInfo const& ) override {} + + bool assertionEnded( AssertionStats const& _assertionStats ) override { + ++counter; + + stream << "# " << currentTestCaseInfo->name << std::endl; + AssertionPrinter printer( stream, _assertionStats, counter ); + printer.print(); + + stream << std::endl; + return true; + } + + void testRunEnded( TestRunStats const& _testRunStats ) override { + printTotals( _testRunStats.totals ); + stream << "\n" << std::endl; + StreamingReporterBase::testRunEnded( _testRunStats ); + } + + private: + std::size_t counter = 0; + class AssertionPrinter { + public: + AssertionPrinter& operator= ( AssertionPrinter const& ) = delete; + AssertionPrinter( AssertionPrinter const& ) = delete; + AssertionPrinter( std::ostream& _stream, AssertionStats const& _stats, std::size_t _counter ) + : stream( _stream ) + , result( _stats.assertionResult ) + , messages( _stats.infoMessages ) + , itMessage( _stats.infoMessages.begin() ) + , printInfoMessages( true ) + , counter(_counter) + {} + + void print() { + itMessage = messages.begin(); + + switch( result.getResultType() ) { + case ResultWas::Ok: + printResultType( passedString() ); + printOriginalExpression(); + printReconstructedExpression(); + if ( ! result.hasExpression() ) + printRemainingMessages( Colour::None ); + else + printRemainingMessages(); + break; + case ResultWas::ExpressionFailed: + if (result.isOk()) { + printResultType(passedString()); + } else { + printResultType(failedString()); + } + printOriginalExpression(); + printReconstructedExpression(); + if (result.isOk()) { + printIssue(" # TODO"); + } + printRemainingMessages(); + break; + case ResultWas::ThrewException: + printResultType( failedString() ); + printIssue( "unexpected exception with message:" ); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::FatalErrorCondition: + printResultType( failedString() ); + printIssue( "fatal error condition with message:" ); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::DidntThrowException: + printResultType( failedString() ); + printIssue( "expected exception, got none" ); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::Info: + printResultType( "info" ); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::Warning: + printResultType( "warning" ); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::ExplicitFailure: + printResultType( failedString() ); + printIssue( "explicitly" ); + printRemainingMessages( Colour::None ); + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + printResultType( "** internal error **" ); + break; + } + } + + private: + static Colour::Code dimColour() { return Colour::FileName; } + + static const char* failedString() { return "not ok"; } + static const char* passedString() { return "ok"; } + + void printSourceInfo() const { + Colour colourGuard( dimColour() ); + stream << result.getSourceInfo() << ":"; + } + + void printResultType( std::string const& passOrFail ) const { + if( !passOrFail.empty() ) { + stream << passOrFail << ' ' << counter << " -"; + } + } + + void printIssue( std::string const& issue ) const { + stream << " " << issue; + } + + void printExpressionWas() { + if( result.hasExpression() ) { + stream << ";"; + { + Colour colour( dimColour() ); + stream << " expression was:"; + } + printOriginalExpression(); + } + } + + void printOriginalExpression() const { + if( result.hasExpression() ) { + stream << " " << result.getExpression(); + } + } + + void printReconstructedExpression() const { + if( result.hasExpandedExpression() ) { + { + Colour colour( dimColour() ); + stream << " for: "; + } + std::string expr = result.getExpandedExpression(); + std::replace( expr.begin(), expr.end(), '\n', ' '); + stream << expr; + } + } + + void printMessage() { + if ( itMessage != messages.end() ) { + stream << " '" << itMessage->message << "'"; + ++itMessage; + } + } + + void printRemainingMessages( Colour::Code colour = dimColour() ) { + if (itMessage == messages.end()) { + return; + } + + const auto itEnd = messages.cend(); + const auto N = static_cast<std::size_t>( std::distance( itMessage, itEnd ) ); + + { + Colour colourGuard( colour ); + stream << " with " << pluralise( N, "message" ) << ":"; + } + + while( itMessage != itEnd ) { + // If this assertion is a warning ignore any INFO messages + if( printInfoMessages || itMessage->type != ResultWas::Info ) { + stream << " '" << itMessage->message << "'"; + if ( ++itMessage != itEnd ) { + Colour colourGuard( dimColour() ); + stream << " and"; + } + continue; + } + ++itMessage; + } + } + + private: + std::ostream& stream; + AssertionResult const& result; + std::vector<MessageInfo> messages; + std::vector<MessageInfo>::const_iterator itMessage; + bool printInfoMessages; + std::size_t counter; + }; + + void printTotals( const Totals& totals ) const { + stream << "1.." << totals.assertions.total(); + if( totals.testCases.total() == 0 ) { + stream << " # Skipped: No tests ran."; + } + } + }; + +#ifdef CATCH_IMPL + TAPReporter::~TAPReporter() {} +#endif + + CATCH_REGISTER_REPORTER( "tap", TAPReporter ) + +} // end namespace Catch + +#endif // TWOBLUECUBES_CATCH_REPORTER_TAP_HPP_INCLUDED diff --git a/externals/catch2/catch2/catch_reporter_teamcity.hpp b/externals/catch2/catch2/catch_reporter_teamcity.hpp new file mode 100644 index 000000000..47b7e4aac --- /dev/null +++ b/externals/catch2/catch2/catch_reporter_teamcity.hpp @@ -0,0 +1,219 @@ +/* + * Created by Phil Nash on 19th December 2014 + * Copyright 2014 Two Blue Cubes Ltd. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +#ifndef TWOBLUECUBES_CATCH_REPORTER_TEAMCITY_HPP_INCLUDED +#define TWOBLUECUBES_CATCH_REPORTER_TEAMCITY_HPP_INCLUDED + +// Don't #include any Catch headers here - we can assume they are already +// included before this header. +// This is not good practice in general but is necessary in this case so this +// file can be distributed as a single header that works with the main +// Catch single header. + +#include <cstring> + +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wpadded" +#endif + +namespace Catch { + + struct TeamCityReporter : StreamingReporterBase<TeamCityReporter> { + TeamCityReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ) + { + m_reporterPrefs.shouldRedirectStdOut = true; + } + + static std::string escape( std::string const& str ) { + std::string escaped = str; + replaceInPlace( escaped, "|", "||" ); + replaceInPlace( escaped, "'", "|'" ); + replaceInPlace( escaped, "\n", "|n" ); + replaceInPlace( escaped, "\r", "|r" ); + replaceInPlace( escaped, "[", "|[" ); + replaceInPlace( escaped, "]", "|]" ); + return escaped; + } + ~TeamCityReporter() override; + + static std::string getDescription() { + return "Reports test results as TeamCity service messages"; + } + + void skipTest( TestCaseInfo const& /* testInfo */ ) override { + } + + void noMatchingTestCases( std::string const& /* spec */ ) override {} + + void testGroupStarting( GroupInfo const& groupInfo ) override { + StreamingReporterBase::testGroupStarting( groupInfo ); + stream << "##teamcity[testSuiteStarted name='" + << escape( groupInfo.name ) << "']\n"; + } + void testGroupEnded( TestGroupStats const& testGroupStats ) override { + StreamingReporterBase::testGroupEnded( testGroupStats ); + stream << "##teamcity[testSuiteFinished name='" + << escape( testGroupStats.groupInfo.name ) << "']\n"; + } + + + void assertionStarting( AssertionInfo const& ) override {} + + bool assertionEnded( AssertionStats const& assertionStats ) override { + AssertionResult const& result = assertionStats.assertionResult; + if( !result.isOk() ) { + + ReusableStringStream msg; + if( !m_headerPrintedForThisSection ) + printSectionHeader( msg.get() ); + m_headerPrintedForThisSection = true; + + msg << result.getSourceInfo() << "\n"; + + switch( result.getResultType() ) { + case ResultWas::ExpressionFailed: + msg << "expression failed"; + break; + case ResultWas::ThrewException: + msg << "unexpected exception"; + break; + case ResultWas::FatalErrorCondition: + msg << "fatal error condition"; + break; + case ResultWas::DidntThrowException: + msg << "no exception was thrown where one was expected"; + break; + case ResultWas::ExplicitFailure: + msg << "explicit failure"; + break; + + // We shouldn't get here because of the isOk() test + case ResultWas::Ok: + case ResultWas::Info: + case ResultWas::Warning: + CATCH_ERROR( "Internal error in TeamCity reporter" ); + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + CATCH_ERROR( "Not implemented" ); + } + if( assertionStats.infoMessages.size() == 1 ) + msg << " with message:"; + if( assertionStats.infoMessages.size() > 1 ) + msg << " with messages:"; + for( auto const& messageInfo : assertionStats.infoMessages ) + msg << "\n \"" << messageInfo.message << "\""; + + + if( result.hasExpression() ) { + msg << + "\n " << result.getExpressionInMacro() << "\n" + "with expansion:\n" << + " " << result.getExpandedExpression() << "\n"; + } + + if( currentTestCaseInfo->okToFail() ) { + msg << "- failure ignore as test marked as 'ok to fail'\n"; + stream << "##teamcity[testIgnored" + << " name='" << escape( currentTestCaseInfo->name )<< "'" + << " message='" << escape( msg.str() ) << "'" + << "]\n"; + } + else { + stream << "##teamcity[testFailed" + << " name='" << escape( currentTestCaseInfo->name )<< "'" + << " message='" << escape( msg.str() ) << "'" + << "]\n"; + } + } + stream.flush(); + return true; + } + + void sectionStarting( SectionInfo const& sectionInfo ) override { + m_headerPrintedForThisSection = false; + StreamingReporterBase::sectionStarting( sectionInfo ); + } + + void testCaseStarting( TestCaseInfo const& testInfo ) override { + m_testTimer.start(); + StreamingReporterBase::testCaseStarting( testInfo ); + stream << "##teamcity[testStarted name='" + << escape( testInfo.name ) << "']\n"; + stream.flush(); + } + + void testCaseEnded( TestCaseStats const& testCaseStats ) override { + StreamingReporterBase::testCaseEnded( testCaseStats ); + if( !testCaseStats.stdOut.empty() ) + stream << "##teamcity[testStdOut name='" + << escape( testCaseStats.testInfo.name ) + << "' out='" << escape( testCaseStats.stdOut ) << "']\n"; + if( !testCaseStats.stdErr.empty() ) + stream << "##teamcity[testStdErr name='" + << escape( testCaseStats.testInfo.name ) + << "' out='" << escape( testCaseStats.stdErr ) << "']\n"; + stream << "##teamcity[testFinished name='" + << escape( testCaseStats.testInfo.name ) << "' duration='" + << m_testTimer.getElapsedMilliseconds() << "']\n"; + stream.flush(); + } + + private: + void printSectionHeader( std::ostream& os ) { + assert( !m_sectionStack.empty() ); + + if( m_sectionStack.size() > 1 ) { + os << getLineOfChars<'-'>() << "\n"; + + std::vector<SectionInfo>::const_iterator + it = m_sectionStack.begin()+1, // Skip first section (test case) + itEnd = m_sectionStack.end(); + for( ; it != itEnd; ++it ) + printHeaderString( os, it->name ); + os << getLineOfChars<'-'>() << "\n"; + } + + SourceLineInfo lineInfo = m_sectionStack.front().lineInfo; + + os << lineInfo << "\n"; + os << getLineOfChars<'.'>() << "\n\n"; + } + + // if string has a : in first line will set indent to follow it on + // subsequent lines + static void printHeaderString( std::ostream& os, std::string const& _string, std::size_t indent = 0 ) { + std::size_t i = _string.find( ": " ); + if( i != std::string::npos ) + i+=2; + else + i = 0; + os << Column( _string ) + .indent( indent+i) + .initialIndent( indent ) << "\n"; + } + private: + bool m_headerPrintedForThisSection = false; + Timer m_testTimer; + }; + +#ifdef CATCH_IMPL + TeamCityReporter::~TeamCityReporter() {} +#endif + + CATCH_REGISTER_REPORTER( "teamcity", TeamCityReporter ) + +} // end namespace Catch + +#ifdef __clang__ +# pragma clang diagnostic pop +#endif + +#endif // TWOBLUECUBES_CATCH_REPORTER_TEAMCITY_HPP_INCLUDED diff --git a/ThirdParty/phys/units/io.hpp b/externals/phys_units/phys/units/io.hpp similarity index 100% rename from ThirdParty/phys/units/io.hpp rename to externals/phys_units/phys/units/io.hpp diff --git a/ThirdParty/phys/units/io_output.hpp b/externals/phys_units/phys/units/io_output.hpp similarity index 100% rename from ThirdParty/phys/units/io_output.hpp rename to externals/phys_units/phys/units/io_output.hpp diff --git a/ThirdParty/phys/units/io_output_eng.hpp b/externals/phys_units/phys/units/io_output_eng.hpp similarity index 100% rename from ThirdParty/phys/units/io_output_eng.hpp rename to externals/phys_units/phys/units/io_output_eng.hpp diff --git a/ThirdParty/phys/units/io_symbols.hpp b/externals/phys_units/phys/units/io_symbols.hpp similarity index 100% rename from ThirdParty/phys/units/io_symbols.hpp rename to externals/phys_units/phys/units/io_symbols.hpp diff --git a/ThirdParty/phys/units/other_units.hpp b/externals/phys_units/phys/units/other_units.hpp similarity index 100% rename from ThirdParty/phys/units/other_units.hpp rename to externals/phys_units/phys/units/other_units.hpp diff --git a/ThirdParty/phys/units/physical_constants.hpp b/externals/phys_units/phys/units/physical_constants.hpp similarity index 100% rename from ThirdParty/phys/units/physical_constants.hpp rename to externals/phys_units/phys/units/physical_constants.hpp diff --git a/ThirdParty/phys/units/quantity.hpp b/externals/phys_units/phys/units/quantity.hpp similarity index 99% rename from ThirdParty/phys/units/quantity.hpp rename to externals/phys_units/phys/units/quantity.hpp index 0751923b0..970773d59 100644 --- a/ThirdParty/phys/units/quantity.hpp +++ b/externals/phys_units/phys/units/quantity.hpp @@ -31,7 +31,6 @@ #include <cmath> #include <cstdlib> #include <utility> // std::declval -#include <type_traits> // std::enable_if /// namespace phys. @@ -359,10 +358,6 @@ namespace phys { static constexpr quantity zero() { return quantity{value_type(0.0)}; } // static constexpr quantity zero = quantity{ value_type( 0.0 ) }; - // RU, added conversion to T (often: double) for dimensionless_d - template <typename DIM=Dims, std::enable_if_t<std::is_same_v<DIM, dimensionless_d>, int> = 0> - operator T() { return m_value; } - private: /** * private initializing constructor. diff --git a/ThirdParty/phys/units/quantity_io.hpp b/externals/phys_units/phys/units/quantity_io.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io.hpp rename to externals/phys_units/phys/units/quantity_io.hpp diff --git a/ThirdParty/phys/units/quantity_io_ampere.hpp b/externals/phys_units/phys/units/quantity_io_ampere.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_ampere.hpp rename to externals/phys_units/phys/units/quantity_io_ampere.hpp diff --git a/ThirdParty/phys/units/quantity_io_becquerel.hpp b/externals/phys_units/phys/units/quantity_io_becquerel.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_becquerel.hpp rename to externals/phys_units/phys/units/quantity_io_becquerel.hpp diff --git a/ThirdParty/phys/units/quantity_io_candela.hpp b/externals/phys_units/phys/units/quantity_io_candela.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_candela.hpp rename to externals/phys_units/phys/units/quantity_io_candela.hpp diff --git a/ThirdParty/phys/units/quantity_io_celsius.hpp b/externals/phys_units/phys/units/quantity_io_celsius.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_celsius.hpp rename to externals/phys_units/phys/units/quantity_io_celsius.hpp diff --git a/ThirdParty/phys/units/quantity_io_coulomb.hpp b/externals/phys_units/phys/units/quantity_io_coulomb.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_coulomb.hpp rename to externals/phys_units/phys/units/quantity_io_coulomb.hpp diff --git a/ThirdParty/phys/units/quantity_io_dimensionless.hpp b/externals/phys_units/phys/units/quantity_io_dimensionless.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_dimensionless.hpp rename to externals/phys_units/phys/units/quantity_io_dimensionless.hpp diff --git a/ThirdParty/phys/units/quantity_io_engineering.hpp b/externals/phys_units/phys/units/quantity_io_engineering.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_engineering.hpp rename to externals/phys_units/phys/units/quantity_io_engineering.hpp diff --git a/ThirdParty/phys/units/quantity_io_farad.hpp b/externals/phys_units/phys/units/quantity_io_farad.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_farad.hpp rename to externals/phys_units/phys/units/quantity_io_farad.hpp diff --git a/ThirdParty/phys/units/quantity_io_gray.hpp b/externals/phys_units/phys/units/quantity_io_gray.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_gray.hpp rename to externals/phys_units/phys/units/quantity_io_gray.hpp diff --git a/ThirdParty/phys/units/quantity_io_henry.hpp b/externals/phys_units/phys/units/quantity_io_henry.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_henry.hpp rename to externals/phys_units/phys/units/quantity_io_henry.hpp diff --git a/ThirdParty/phys/units/quantity_io_hertz.hpp b/externals/phys_units/phys/units/quantity_io_hertz.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_hertz.hpp rename to externals/phys_units/phys/units/quantity_io_hertz.hpp diff --git a/ThirdParty/phys/units/quantity_io_joule.hpp b/externals/phys_units/phys/units/quantity_io_joule.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_joule.hpp rename to externals/phys_units/phys/units/quantity_io_joule.hpp diff --git a/ThirdParty/phys/units/quantity_io_kelvin.hpp b/externals/phys_units/phys/units/quantity_io_kelvin.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_kelvin.hpp rename to externals/phys_units/phys/units/quantity_io_kelvin.hpp diff --git a/ThirdParty/phys/units/quantity_io_kilogram.hpp b/externals/phys_units/phys/units/quantity_io_kilogram.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_kilogram.hpp rename to externals/phys_units/phys/units/quantity_io_kilogram.hpp diff --git a/ThirdParty/phys/units/quantity_io_lumen.hpp b/externals/phys_units/phys/units/quantity_io_lumen.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_lumen.hpp rename to externals/phys_units/phys/units/quantity_io_lumen.hpp diff --git a/ThirdParty/phys/units/quantity_io_lux.hpp b/externals/phys_units/phys/units/quantity_io_lux.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_lux.hpp rename to externals/phys_units/phys/units/quantity_io_lux.hpp diff --git a/ThirdParty/phys/units/quantity_io_meter.hpp b/externals/phys_units/phys/units/quantity_io_meter.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_meter.hpp rename to externals/phys_units/phys/units/quantity_io_meter.hpp diff --git a/ThirdParty/phys/units/quantity_io_mole.hpp b/externals/phys_units/phys/units/quantity_io_mole.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_mole.hpp rename to externals/phys_units/phys/units/quantity_io_mole.hpp diff --git a/ThirdParty/phys/units/quantity_io_newton.hpp b/externals/phys_units/phys/units/quantity_io_newton.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_newton.hpp rename to externals/phys_units/phys/units/quantity_io_newton.hpp diff --git a/ThirdParty/phys/units/quantity_io_ohm.hpp b/externals/phys_units/phys/units/quantity_io_ohm.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_ohm.hpp rename to externals/phys_units/phys/units/quantity_io_ohm.hpp diff --git a/ThirdParty/phys/units/quantity_io_pascal.hpp b/externals/phys_units/phys/units/quantity_io_pascal.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_pascal.hpp rename to externals/phys_units/phys/units/quantity_io_pascal.hpp diff --git a/ThirdParty/phys/units/quantity_io_radian.hpp b/externals/phys_units/phys/units/quantity_io_radian.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_radian.hpp rename to externals/phys_units/phys/units/quantity_io_radian.hpp diff --git a/ThirdParty/phys/units/quantity_io_second.hpp b/externals/phys_units/phys/units/quantity_io_second.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_second.hpp rename to externals/phys_units/phys/units/quantity_io_second.hpp diff --git a/ThirdParty/phys/units/quantity_io_siemens.hpp b/externals/phys_units/phys/units/quantity_io_siemens.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_siemens.hpp rename to externals/phys_units/phys/units/quantity_io_siemens.hpp diff --git a/ThirdParty/phys/units/quantity_io_sievert.hpp b/externals/phys_units/phys/units/quantity_io_sievert.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_sievert.hpp rename to externals/phys_units/phys/units/quantity_io_sievert.hpp diff --git a/ThirdParty/phys/units/quantity_io_speed.hpp b/externals/phys_units/phys/units/quantity_io_speed.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_speed.hpp rename to externals/phys_units/phys/units/quantity_io_speed.hpp diff --git a/ThirdParty/phys/units/quantity_io_steradian.hpp b/externals/phys_units/phys/units/quantity_io_steradian.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_steradian.hpp rename to externals/phys_units/phys/units/quantity_io_steradian.hpp diff --git a/ThirdParty/phys/units/quantity_io_symbols.hpp b/externals/phys_units/phys/units/quantity_io_symbols.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_symbols.hpp rename to externals/phys_units/phys/units/quantity_io_symbols.hpp diff --git a/ThirdParty/phys/units/quantity_io_tesla.hpp b/externals/phys_units/phys/units/quantity_io_tesla.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_tesla.hpp rename to externals/phys_units/phys/units/quantity_io_tesla.hpp diff --git a/ThirdParty/phys/units/quantity_io_volt.hpp b/externals/phys_units/phys/units/quantity_io_volt.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_volt.hpp rename to externals/phys_units/phys/units/quantity_io_volt.hpp diff --git a/ThirdParty/phys/units/quantity_io_watt.hpp b/externals/phys_units/phys/units/quantity_io_watt.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_watt.hpp rename to externals/phys_units/phys/units/quantity_io_watt.hpp diff --git a/ThirdParty/phys/units/quantity_io_weber.hpp b/externals/phys_units/phys/units/quantity_io_weber.hpp similarity index 100% rename from ThirdParty/phys/units/quantity_io_weber.hpp rename to externals/phys_units/phys/units/quantity_io_weber.hpp diff --git a/Main/CMakeLists.txt b/src/Main/CMakeLists.txt similarity index 100% rename from Main/CMakeLists.txt rename to src/Main/CMakeLists.txt diff --git a/Main/shower.cc b/src/Main/shower.cpp similarity index 100% rename from Main/shower.cc rename to src/Main/shower.cpp diff --git a/tests/framework/CMakeLists.txt b/tests/framework/CMakeLists.txt new file mode 100644 index 000000000..d62ee295f --- /dev/null +++ b/tests/framework/CMakeLists.txt @@ -0,0 +1,38 @@ + +set (sources + # testCascade.cpp this is most important, but whole content of former Processes folder missing yet + testCombinedStack.cpp + testCOMBoost.cpp + #testCorsikaFenv.cpp # does not work because of use of exceptions in catch2 + testFourVector.cpp + testGeometry.cpp + #testLogging.cpp # irrelevant -> not used back in March + TestMain.cpp + testParticles.cpp + testProcessSequence.cpp + testRandom.cpp + testSecondaryView.cpp + testStackInterface.cpp + testUnits.cpp + ) + + +add_executable (testFramework ${sources}) + +target_link_libraries (testFramework CORSIKA8 Catch2) + +target_compile_options (testFramework PRIVATE -g) # do not skip asserts + +target_include_directories (testFramework PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +file (MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/test_outputs/) + +if (CORSIKA_SANITIZERS_ENABLED) + # -O1 is suggested in clang docs to get reasonable performance + target_compile_options (${name} PRIVATE -O1 -fno-omit-frame-pointer -fsanitize=${sanitize} -fno-sanitize-recover=all) + set_target_properties (${name} PROPERTIES LINK_FLAGS "-fsanitize=${sanitize}") +endif () + +add_test ( + NAME testFramework + COMMAND testFramework -o ${PROJECT_BINARY_DIR}/test_outputs/junit-${name}.xml -s -r junit) diff --git a/Framework/Testing/TestMain.cc b/tests/framework/TestMain.cpp similarity index 100% rename from Framework/Testing/TestMain.cc rename to tests/framework/TestMain.cpp diff --git a/Framework/Utilities/testCOMBoost.cc b/tests/framework/testCOMBoost.cpp similarity index 96% rename from Framework/Utilities/testCOMBoost.cc rename to tests/framework/testCOMBoost.cpp index b6b677d23..58beafd52 100644 --- a/Framework/Utilities/testCOMBoost.cc +++ b/tests/framework/testCOMBoost.cpp @@ -8,16 +8,16 @@ #include <catch2/catch.hpp> -#include <corsika/geometry/FourVector.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> -#include <corsika/utl/COMBoost.h> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/framework/utility/COMBoost.hpp> #include <iostream> -using namespace corsika::geometry; -using namespace corsika::utl; +using namespace corsika; +using namespace corsika; using namespace corsika::units::si; using corsika::units::constants::c; using corsika::units::constants::cSquared; diff --git a/Framework/Cascade/testCascade.cc b/tests/framework/testCascade.cpp similarity index 68% rename from Framework/Cascade/testCascade.cc rename to tests/framework/testCascade.cpp index a4863d65e..3caaf7484 100644 --- a/Framework/Cascade/testCascade.cc +++ b/tests/framework/testCascade.cpp @@ -6,30 +6,31 @@ * the license. */ -#include <corsika/cascade/testCascade.h> +#include <testCascade.h> -#include <corsika/cascade/Cascade.h> +#include <corsika/framework/core/Cascade.hpp> -#include <corsika/process/ProcessSequence.h> -#include <corsika/process/NullModel.h> -#include <corsika/process/stack_inspector/StackInspector.h> +#include <corsika/framework/sequence/ProcessSequence.hpp> +#include <corsika/process/NullModel.hpp> +#include <corsika/process/StackInspector.hpp> +#include <corsika/process/TrackingLine.hpp> -#include <corsika/particles/ParticleProperties.h> +#include <corsika/framework/core/ParticleProperties.hpp> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> -#include <corsika/environment/HomogeneousMedium.h> -#include <corsika/environment/NuclearComposition.h> +#include <corsika/media/HomogeneousMedium.hpp> +#include <corsika/media/NuclearComposition.hpp> #include <catch2/catch.hpp> using namespace corsika; -using namespace corsika::process; +using namespace corsika; using namespace corsika::units; using namespace corsika::units::si; -using namespace corsika::geometry; +using namespace corsika; #include <limits> using namespace std; @@ -52,8 +53,11 @@ auto MakeDummyEnv() { Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, 1_m * std::numeric_limits<double>::infinity()); - using MyEmptyModel = environment::Empty<environment::IEmpty>; - world->SetModelProperties<MyEmptyModel>(); + using MyHomogeneousModel = environment::HomogeneousMedium<environment::IMediumModel>; + theMedium->SetModelProperties<MyHomogeneousModel>( + 1_g / (1_cm * 1_cm * 1_cm), + environment::NuclearComposition(std::vector<Code>{Code::Proton}, + std::vector<float>{1.})); universe.AddChild(std::move(world)); @@ -96,17 +100,16 @@ public: return 0_g / square(1_cm); } - template <typename TSecondaryView> - corsika::process::EProcessReturn DoInteraction(TSecondaryView& view) { + template <typename TProjectile> + corsika::EProcessReturn DoInteraction(TProjectile& vP) { fCalls++; - auto const projectile = view.GetProjectile(); - const HEPEnergyType E = projectile.GetEnergy(); - view.AddSecondary(std::make_tuple(projectile.GetPID(), E / 2, - projectile.GetMomentum(), projectile.GetPosition(), - projectile.GetTime())); - view.AddSecondary(std::make_tuple(projectile.GetPID(), E / 2, - projectile.GetMomentum(), projectile.GetPosition(), - projectile.GetTime())); + const HEPEnergyType E = vP.GetEnergy(); + vP.AddSecondary(std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + geometry::Point, units::si::TimeType>{ + vP.GetPID(), E / 2, vP.GetMomentum(), vP.GetPosition(), vP.GetTime()}); + vP.AddSecondary(std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + geometry::Point, units::si::TimeType>{ + vP.GetPID(), E / 2, vP.GetMomentum(), vP.GetPosition(), vP.GetTime()}); return EProcessReturn::eInteracted; } @@ -165,16 +168,12 @@ TEST_CASE("Cascade", "[Cascade]") { auto sequence = process::sequence(nullModel, stackInspect, split, cut); TestCascadeStack stack; stack.Clear(); - stack.AddParticle(std::make_tuple( - particles::Code::Electron, E0, - corsika::stack::MomentumVector( - rootCS, {0_GeV, 0_GeV, - -sqrt(E0 * E0 - units::static_pow<2>( - particles::GetMass(particles::Code::Electron)))}), - Point(rootCS, {0_m, 0_m, 10_km}), 0_ns)); - - DummyTracking tracking; - cascade::Cascade<DummyTracking, decltype(sequence), TestCascadeStack, + stack.AddParticle(std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + geometry::Point, units::si::TimeType>{ + Code::Electron, E0, corsika::MomentumVector(rootCS, {0_GeV, 0_GeV, -1_GeV}), + Point(rootCS, {0_m, 0_m, 10_km}), 0_ns}); + + cascade::Cascade<tracking_line::TrackingLine, decltype(sequence), TestCascadeStack, TestCascadeStackView> EAS(env, tracking, sequence, stack); diff --git a/tests/framework/testCascade.h b/tests/framework/testCascade.h new file mode 100644 index 000000000..715012b9b --- /dev/null +++ b/tests/framework/testCascade.h @@ -0,0 +1,40 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/Environment.hpp> + +#include <corsika/setup/SetupStack.hpp> + +using TestEnvironmentInterface = corsika::environment::IEmpty; +using TestEnvironmentType = corsika::environment::Environment<TestEnvironmentInterface>; + +template <typename T> +using SetupGeometryDataInterface = + corsika::stack::node::GeometryDataInterface<T, TestEnvironmentType>; + +// combine particle data stack with geometry information for tracking +template <typename StackIter> +using StackWithGeometryInterface = + corsika::CombinedParticleInterface<corsika::detail::ParticleDataStack::PIType, + SetupGeometryDataInterface, StackIter>; + +using TestCascadeStack = + corsika::CombinedStack<typename corsika::detail::ParticleDataStack::StackImpl, + GeometryData<TestEnvironmentType>, StackWithGeometryInterface>; + +/* + See also Issue 161 +*/ +#if defined(__clang__) +using TestCascadeStackView = corsika::SecondaryView<typename TestCascadeStack::StackImpl, + StackWithGeometryInterface>; +#elif defined(__GNUC__) || defined(__GNUG__) +using TestCascadeStackView = corsika::MakeView<TestCascadeStack>::type; +#endif diff --git a/Framework/StackInterface/testCombinedStack.cc b/tests/framework/testCombinedStack.cpp similarity index 92% rename from Framework/StackInterface/testCombinedStack.cc rename to tests/framework/testCombinedStack.cpp index 9e4d9274f..43da9a9e7 100644 --- a/Framework/StackInterface/testCombinedStack.cc +++ b/tests/framework/testCombinedStack.cpp @@ -6,14 +6,15 @@ * the license. */ -#define protected public // to also test the internal state of objects +#include <corsika/framework/stack/CombinedStack.hpp> +#include <corsika/framework/stack/SecondaryView.hpp> +#include <corsika/framework/stack/Stack.hpp> -#include <corsika/stack/CombinedStack.h> -#include <corsika/stack/SecondaryView.h> -#include <corsika/stack/Stack.h> +#include <boost/type_index.hpp> +#include <type_traits> -#include <testTestStack.h> // for testing: simple stack. This is a -// test-build, and inluce file is obtained from CMAKE_CURRENT_SOURCE_DIR +#include <tests/framework/testTestStack.h> // for testing: simple stack. This is a +using boost::typeindex::type_id_with_cvr; #include <iomanip> #include <vector> @@ -21,7 +22,7 @@ #include <catch2/catch.hpp> using namespace corsika; -using namespace corsika::stack; +using namespace corsika; using namespace std; //////////////////////////////////////////////////////////// @@ -81,8 +82,8 @@ public: // combined stack: StackTest = (TestStackData + TestStackData2) template <typename StackIter> using CombinedTestInterfaceType = - corsika::stack::CombinedParticleInterface<TestParticleInterface, - TestParticleInterface2, StackIter>; + corsika::CombinedParticleInterface<TestParticleInterface, TestParticleInterface2, + StackIter>; using StackTest = CombinedStack<TestStackData, TestStackData2, CombinedTestInterfaceType>; @@ -276,8 +277,8 @@ public: // combined stack template <typename StackIter> using CombinedTestInterfaceType2 = - corsika::stack::CombinedParticleInterface<StackTest::MPIType, TestParticleInterface3, - StackIter>; + corsika::CombinedParticleInterface<StackTest::PIType, TestParticleInterface3, + StackIter>; using StackTest2 = CombinedStack<typename StackTest::StackImpl, TestStackData3, CombinedTestInterfaceType2>; @@ -362,8 +363,8 @@ TEST_CASE("Combined Stack - multi", "[stack]") { */ template <typename StackIter> using CombinedTestInterfaceType2 = - corsika::stack::CombinedParticleInterface<StackTest::MPIType, TestParticleInterface3, - StackIter>; + corsika::CombinedParticleInterface<StackTest::PIType, TestParticleInterface3, + StackIter>; using StackTest2 = CombinedStack<typename StackTest::StackImpl, TestStackData3, CombinedTestInterfaceType2>; @@ -372,7 +373,7 @@ using StackTest2 = CombinedStack<typename StackTest::StackImpl, TestStackData3, using StackTestView = SecondaryView<typename StackTest2::StackImpl, CombinedTestInterfaceType2>; #elif defined(__GNUC__) || defined(__GNUG__) -using StackTestView = corsika::stack::MakeView<StackTest2>::type; +using StackTestView = corsika::MakeView<StackTest2>::type; #endif using Particle2 = typename StackTest2::ParticleType; diff --git a/Framework/Utilities/testCorsikaFenv.cc b/tests/framework/testCorsikaFenv.cpp similarity index 52% rename from Framework/Utilities/testCorsikaFenv.cc rename to tests/framework/testCorsikaFenv.cpp index ebfde1043..323c0fa18 100644 --- a/Framework/Utilities/testCorsikaFenv.cc +++ b/tests/framework/testCorsikaFenv.cpp @@ -6,21 +6,28 @@ * the license. */ -#include <corsika/utl/CorsikaFenv.h> +#include <catch2/catch.hpp> +#include <corsika/framework/utility/CorsikaFenv.hpp> #include <cmath> #include <csignal> #include <iostream> +int gRESULT = 1; + extern "C" { -static void handle_fpe(int /*signo*/) { exit(0); } +static void handle_fpe(int /*signo*/) { gRESULT = 0; } } -int main() { +TEST_CASE("CorsikaFenv", "[fenv]") { + feenableexcept(FE_ALL_EXCEPT); signal(SIGFPE, handle_fpe); - std::cout << std::log(0.) << std::endl; + SECTION("exception") { - exit(1); -} \ No newline at end of file + [[maybe_unused]] auto trigger = std::log(0.); + std::cout << "trigger: " << trigger << std::endl; + CHECK(gRESULT == 0); + } +} diff --git a/Framework/Geometry/testFourVector.cc b/tests/framework/testFourVector.cpp similarity index 93% rename from Framework/Geometry/testFourVector.cc rename to tests/framework/testFourVector.cpp index 4c1692582..6623eb7ca 100644 --- a/Framework/Geometry/testFourVector.cc +++ b/tests/framework/testFourVector.cpp @@ -8,14 +8,17 @@ #include <catch2/catch.hpp> -#include <corsika/geometry/CoordinateSystem.h> -#include <corsika/geometry/FourVector.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> #include <cmath> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/CoordinateSystem.hpp> +#include <corsika/framework/geometry/FourVector.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> -using namespace corsika::geometry; +#include <boost/type_index.hpp> +using boost::typeindex::type_id_with_cvr; + +using namespace corsika; using namespace corsika::units::si; TEST_CASE("four vectors") { diff --git a/Framework/Geometry/testGeometry.cc b/tests/framework/testGeometry.cpp similarity index 93% rename from Framework/Geometry/testGeometry.cc rename to tests/framework/testGeometry.cpp index b528bf1bf..c6b0b68e3 100644 --- a/Framework/Geometry/testGeometry.cc +++ b/tests/framework/testGeometry.cpp @@ -8,17 +8,17 @@ #include <catch2/catch.hpp> -#include <corsika/geometry/CoordinateSystem.h> -#include <corsika/geometry/Helix.h> -#include <corsika/geometry/Line.h> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Sphere.h> -#include <corsika/geometry/Trajectory.h> -#include <corsika/units/PhysicalUnits.h> #include <cmath> - -using namespace corsika::geometry; +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/CoordinateSystem.hpp> +#include <corsika/framework/geometry/Helix.hpp> +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Sphere.hpp> +#include <corsika/framework/geometry/Trajectory.hpp> + +using namespace corsika; using namespace corsika::units::si; double constexpr absMargin = 1.0e-8; @@ -27,8 +27,7 @@ TEST_CASE("transformations between CoordinateSystems") { CoordinateSystem& rootCS = RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); - REQUIRE(CoordinateSystem::GetTransformation(rootCS, rootCS) - .isApprox(EigenTransform::Identity())); + REQUIRE(getTransformation(rootCS, rootCS).isApprox(EigenTransform::Identity())); QuantityVector<length_d> const coordinates{0_m, 0_m, 0_m}; Point p1(rootCS, coordinates); @@ -79,9 +78,9 @@ TEST_CASE("transformations between CoordinateSystems") { REQUIRE(cs4.GetReference()->GetReference() == &rootCS); - REQUIRE(CoordinateSystem::GetTransformation(cs3, cs2).isApprox( + REQUIRE(getTransformation(cs3, cs2).isApprox( rootCS.translate({3_m, -5_m, 0_m}).GetTransform())); - REQUIRE(CoordinateSystem::GetTransformation(cs2, cs3).isApprox( + REQUIRE(getTransformation(cs2, cs3).isApprox( rootCS.translate({-3_m, +5_m, 0_m}).GetTransform())); } diff --git a/Framework/Logging/testLogging.cc b/tests/framework/testLogging.cpp similarity index 98% rename from Framework/Logging/testLogging.cc rename to tests/framework/testLogging.cpp index bf9190580..505c96c24 100644 --- a/Framework/Logging/testLogging.cc +++ b/tests/framework/testLogging.cpp @@ -6,7 +6,7 @@ * the license. */ -#include <corsika/logging/Logging.h> +#include <corsika/framework/logging/Logger.h> #include <catch2/catch.hpp> diff --git a/Framework/Particles/testParticles.cc b/tests/framework/testParticles.cpp similarity index 97% rename from Framework/Particles/testParticles.cc rename to tests/framework/testParticles.cpp index 8b3f7184c..9d13c2cac 100644 --- a/Framework/Particles/testParticles.cc +++ b/tests/framework/testParticles.cpp @@ -6,14 +6,14 @@ * the license. */ -#include <corsika/particles/ParticleProperties.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <catch2/catch.hpp> using namespace corsika::units; using namespace corsika::units::si; -using namespace corsika::particles; +using namespace corsika; TEST_CASE("ParticleProperties", "[Particles]") { diff --git a/Framework/ProcessSequence/testProcessSequence.cc b/tests/framework/testProcessSequence.cpp similarity index 72% rename from Framework/ProcessSequence/testProcessSequence.cc rename to tests/framework/testProcessSequence.cpp index 875cbc582..f506d5701 100644 --- a/Framework/ProcessSequence/testProcessSequence.cc +++ b/tests/framework/testProcessSequence.cpp @@ -13,13 +13,12 @@ #include <iostream> #include <typeinfo> -#include <corsika/process/ProcessSequence.h> -#include <corsika/process/SwitchProcessSequence.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/sequence/ProcessSequence.hpp> +//#include <corsika/process/SwitchProcess.hpp> using namespace corsika; using namespace corsika::units::si; -using namespace corsika::process; +using namespace corsika; using namespace std; static const int nData = 10; @@ -373,107 +372,14 @@ TEST_CASE("Process Sequence", "[Process Sequence]") { } } -TEST_CASE("Switch Process Sequence", "[Process Sequence]") { - - SECTION("Check construction") { - - struct TestSelect { - corsika::process::SwitchResult operator()(const DummyData& p) const { - std::cout << "TestSelect data=" << p.data_[0] << std::endl; - if (p.data_[0] > 0) return corsika::process::SwitchResult::First; - return corsika::process::SwitchResult::Second; - } - }; - TestSelect select; - - auto sequence1 = process::sequence(Process1(0), ContinuousProcess2(0), Decay1(0)); - auto sequence2 = process::sequence(ContinuousProcess3(0), Process2(0), Decay2(0)); - - auto sequence = - process::sequence(ContinuousProcess1(0), Process3(0), - SwitchProcessSequence(sequence1, sequence2, select)); - - auto sequence_alt = process::sequence( - ContinuousProcess1(0), Process3(0), - process::select(process::sequence(Process1(0), ContinuousProcess2(0), Decay1(0)), - process::sequence(ContinuousProcess3(0), Process2(0), Decay2(0)), - select)); - - // check that same process sequence can be build in different ways - CHECK(typeid(sequence) == typeid(sequence_alt)); - CHECK(is_process_sequence_v<decltype(sequence)> == true); - CHECK(is_process_sequence_v<decltype( - SwitchProcessSequence(sequence1, sequence2, select))> == true); - - DummyData particle; - DummyTrajectory track; - DummyView view(particle); - - checkDecay = 0; - checkInteract = 0; - checkSec = 0; - checkCont = 0; - particle.data_[0] = 100; // data positive - sequence.DoContinuous(particle, track); - CHECK(checkInteract == 0); - CHECK(checkDecay == 0); - CHECK(checkCont == 0b011); - CHECK(checkSec == 0); - - checkDecay = 0; - checkInteract = 0; - checkSec = 0; - checkCont = 0; - particle.data_[0] = -100; // data negative - sequence_alt.DoContinuous(particle, track); - CHECK(checkInteract == 0); - CHECK(checkDecay == 0); - CHECK(checkCont == 0b101); - CHECK(checkSec == 0); - - // 1/(30g/cm2) is Process3 - corsika::units::si::InverseGrammageType lambda_select = .9 / 30. * square(1_cm) / 1_g; - corsika::units::si::InverseTimeType time_select = 0.1 / second; - - checkDecay = 0; - checkInteract = 0; - checkSec = 0; - checkCont = 0; - particle.data_[0] = 100; // data positive - sequence.SelectInteraction(view, lambda_select); - sequence.SelectDecay(view, time_select); - CHECK(checkInteract == 0b100); // this is Process3 - CHECK(checkDecay == 0b001); // this is Decay1 - CHECK(checkCont == 0); - CHECK(checkSec == 0); - lambda_select = 1.01 / 30. * square(1_cm) / 1_g; - checkInteract = 0; - sequence.SelectInteraction(view, lambda_select); - CHECK(checkInteract == 0b001); // this is Process1 - - checkDecay = 0; - checkInteract = 0; - checkSec = 0; - checkCont = 0; - particle.data_[0] = -100; // data negative - sequence.SelectInteraction(view, lambda_select); - sequence.SelectDecay(view, time_select); - CHECK(checkInteract == 0b010); // this is Process2 - CHECK(checkDecay == 0b010); // this is Decay2 - CHECK(checkCont == 0); - CHECK(checkSec == 0); - - checkDecay = 0; - checkInteract = 0; - checkSec = 0; - checkCont = 0; - particle.data_[0] = -100; // data negative - sequence.DoSecondaries(view); - Stack1 stack(0); - sequence.DoStack(stack); - CHECK(checkInteract == 0); - CHECK(checkDecay == 0); - CHECK(checkCont == 0); - CHECK(checkSec == 0); - } -} +/* + Note: there is a fine-grained dedicated test-suite for SwitchProcess + in Processes/SwitchProcess/testSwtichProcess + */ +/* +TEST_CASE("SwitchProcess") { + Process1 p1(0); + Process2 p2(0); + switch_process::SwitchProcess s(p1, p2, 10_GeV); + REQUIRE(is_switch_process_v<decltype(s)>); + }*/ diff --git a/Framework/Random/testRandom.cc b/tests/framework/testRandom.cpp similarity index 57% rename from Framework/Random/testRandom.cc rename to tests/framework/testRandom.cpp index d9053f74d..5a8bcb0f5 100644 --- a/Framework/Random/testRandom.cc +++ b/tests/framework/testRandom.cpp @@ -1,6 +1,8 @@ /* * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu * + * See file AUTHORS for a list of contributors. + * * This software is distributed under the terms of the GNU General Public * Licence version 3 (GPL Version 3). See file LICENSE for a full version of * the license. @@ -8,46 +10,33 @@ #include <catch2/catch.hpp> -#include <corsika/random/ExponentialDistribution.h> -#include <corsika/random/RNGManager.h> -#include <corsika/random/UniformRealDistribution.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/random/ExponentialDistribution.hpp> +#include <corsika/framework/random/RNGManager.hpp> +#include <corsika/framework/random/UniformRealDistribution.hpp> #include <iostream> #include <limits> #include <random> +#include <type_traits> -using namespace corsika::random; +using namespace corsika; SCENARIO("random-number streams can be registered and retrieved") { GIVEN("a RNGManager") { RNGManager& rngManager = RNGManager::GetInstance(); - WHEN("the sequence name is not registered") { - REQUIRE(rngManager.IsRegistered("stream_A") == false); - - THEN("a sequence is registered by name") { - rngManager.RegisterRandomStream("stream_A"); - - THEN("the sequence can be retrieved") { - REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A")); - - THEN("we can check that the sequence exists") { - REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A")); + WHEN("a sequence is registered by name") { + rngManager.RegisterRandomStream("stream_A"); - THEN("an unknown sequence cannot be retrieved") { - REQUIRE(rngManager.IsRegistered("stream_A") == true); - - THEN("an unknown sequence cannot be retrieved") { - REQUIRE_THROWS(rngManager.GetRandomStream("stream_UNKNOWN")); + THEN("the sequence can be retrieved") { + REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A")); + } - THEN("an unknown sequence is not registered") { - REQUIRE(rngManager.IsRegistered("stream_UNKNOWN") == false); - } - } - } - } - } + THEN("an unknown sequence cannot be retrieved") { + REQUIRE_THROWS(rngManager.GetRandomStream("stream_UNKNOWN")); } + + // seeding not covered yet } } } @@ -56,10 +45,10 @@ TEST_CASE("UniformRealDistribution") { using namespace corsika::units::si; std::mt19937 rng; - corsika::random::UniformRealDistribution<LengthType> dist(1_m, 2_m); + corsika::UniformRealDistribution<LengthType> dist(1_m, 2_m); SECTION("range") { - corsika::random::UniformRealDistribution<LengthType> dist(1_m, 2_m); + corsika::UniformRealDistribution<LengthType> dist(1_m, 2_m); LengthType min = +1_m * std::numeric_limits<typename LengthType::value_type>::infinity(); @@ -77,7 +66,7 @@ TEST_CASE("UniformRealDistribution") { } SECTION("range") { - corsika::random::UniformRealDistribution<LengthType> dist(18_cm); + corsika::UniformRealDistribution<LengthType> dist(18_cm); LengthType min = +1_m * std::numeric_limits<typename LengthType::value_type>::infinity(); @@ -101,7 +90,7 @@ TEST_CASE("ExponentialDistribution") { auto const beta = 15_m; - corsika::random::ExponentialDistribution dist(beta); + corsika::ExponentialDistribution dist(beta); SECTION("mean") { std::remove_const<decltype(beta)>::type mean = beta * 0; diff --git a/Framework/StackInterface/testSecondaryView.cc b/tests/framework/testSecondaryView.cpp similarity index 95% rename from Framework/StackInterface/testSecondaryView.cc rename to tests/framework/testSecondaryView.cpp index 9cd1e4666..ab8f1a85d 100644 --- a/Framework/StackInterface/testSecondaryView.cc +++ b/tests/framework/testSecondaryView.cpp @@ -6,13 +6,14 @@ * the license. */ -#define protected public // to also test the internal state of objects +#include <corsika/framework/stack/SecondaryView.hpp> +#include <corsika/framework/stack/Stack.hpp> -#include <corsika/stack/SecondaryView.h> -#include <corsika/stack/Stack.h> +#include <boost/type_index.hpp> +#include <type_traits> -#include <testTestStack.h> // for testing: simple stack. This is a -// test-build, and inluce file is obtained from CMAKE_CURRENT_SOURCE_DIR +#include <tests/framework/testTestStack.h> // for testing: simple stack. This is a +using boost::typeindex::type_id_with_cvr; #include <iomanip> #include <vector> @@ -20,7 +21,7 @@ #include <catch2/catch.hpp> using namespace corsika; -using namespace corsika::stack; +using namespace corsika; using namespace std; typedef Stack<TestStackData, TestParticleInterface> StackTest; diff --git a/Framework/StackInterface/testStackInterface.cc b/tests/framework/testStackInterface.cpp similarity index 94% rename from Framework/StackInterface/testStackInterface.cc rename to tests/framework/testStackInterface.cpp index af1f217ad..5e34a0560 100644 --- a/Framework/StackInterface/testStackInterface.cc +++ b/tests/framework/testStackInterface.cpp @@ -6,13 +6,13 @@ * the license. */ -#define protected public // to also test the internal state of objects +#include <corsika/framework/stack/Stack.hpp> -#include <corsika/stack/Stack.h> +#include <boost/type_index.hpp> +#include <type_traits> -#include <testTestStack.h> // simple test-stack for testing. This is - // for testing only: include from - // CMAKE_CURRENT_SOURCE_DIR +#include <tests/framework/testTestStack.h> // simple test-stack for testing. This is +using boost::typeindex::type_id_with_cvr; #include <iomanip> #include <tuple> @@ -21,7 +21,7 @@ #include <catch2/catch.hpp> using namespace corsika; -using namespace corsika::stack; +using namespace corsika; using namespace std; typedef Stack<TestStackData, TestParticleInterface> StackTest; diff --git a/Framework/StackInterface/testTestStack.h b/tests/framework/testTestStack.h similarity index 89% rename from Framework/StackInterface/testTestStack.h rename to tests/framework/testTestStack.h index 9765dda8b..9aaa63320 100644 --- a/Framework/StackInterface/testTestStack.h +++ b/tests/framework/testTestStack.h @@ -1,4 +1,4 @@ -/* +n/* * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu * * This software is distributed under the terms of the GNU General Public @@ -8,7 +8,7 @@ #pragma once -#include <corsika/stack/Stack.h> +#include <corsika/framework/stack/Stack.hpp> #include <tuple> #include <vector> @@ -59,12 +59,11 @@ private: * */ template <typename StackIteratorInterface> -class TestParticleInterface - : public corsika::stack::ParticleBase<StackIteratorInterface> { +class TestParticleInterface : public corsika::ParticleBase<StackIteratorInterface> { public: - using corsika::stack::ParticleBase<StackIteratorInterface>::GetStackData; - using corsika::stack::ParticleBase<StackIteratorInterface>::GetIndex; + using corsika::ParticleBase<StackIteratorInterface>::GetStackData; + using corsika::ParticleBase<StackIteratorInterface>::GetIndex; /* The SetParticleData methods are called for creating new entries diff --git a/Framework/Units/testUnits.cc b/tests/framework/testUnits.cpp similarity index 98% rename from Framework/Units/testUnits.cc rename to tests/framework/testUnits.cpp index bae1ce1d7..1bd307bde 100644 --- a/Framework/Units/testUnits.cc +++ b/tests/framework/testUnits.cpp @@ -8,7 +8,7 @@ #include <catch2/catch.hpp> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <array> #include <sstream> diff --git a/tests/media/CMakeLists.txt b/tests/media/CMakeLists.txt new file mode 100644 index 000000000..25e0d35d3 --- /dev/null +++ b/tests/media/CMakeLists.txt @@ -0,0 +1,26 @@ + +set (sources + TestMain.cpp + testEnvironment.cpp + ) + + +add_executable (testEnvironment ${sources}) + +target_link_libraries (testEnvironment CORSIKA8 Catch2) + +target_compile_options (testEnvironment PRIVATE -g) # do not skip asserts + +target_include_directories (testEnvironment PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +file (MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/test_outputs/) + +if (CORSIKA_SANITIZERS_ENABLED) + # -O1 is suggested in clang docs to get reasonable performance + target_compile_options (${name} PRIVATE -O1 -fno-omit-frame-pointer -fsanitize=${sanitize} -fno-sanitize-recover=all) + set_target_properties (${name} PROPERTIES LINK_FLAGS "-fsanitize=${sanitize}") +endif () + +add_test ( + NAME testEnvironment + COMMAND testEnvironment -o ${PROJECT_BINARY_DIR}/test_outputs/junit-media.xml -s -r junit) diff --git a/tests/media/TestMain.cpp b/tests/media/TestMain.cpp new file mode 100644 index 000000000..da6f2c3f1 --- /dev/null +++ b/tests/media/TestMain.cpp @@ -0,0 +1,13 @@ +/* + * (c) Copyright 2019 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one + // cpp file +#include <catch2/catch.hpp> diff --git a/Environment/testEnvironment.cc b/tests/media/testEnvironment.cpp similarity index 91% rename from Environment/testEnvironment.cc rename to tests/media/testEnvironment.cpp index eecae6292..bce84c881 100644 --- a/Environment/testEnvironment.cc +++ b/tests/media/testEnvironment.cpp @@ -6,37 +6,28 @@ * the license. */ -#include <corsika/environment/DensityFunction.h> -#include <corsika/environment/FlatExponential.h> -#include <corsika/environment/HomogeneousMedium.h> -#include <corsika/environment/IMagneticFieldModel.h> -#include <corsika/environment/IMediumModel.h> -#include <corsika/environment/IMediumPropertyModel.h> -#include <corsika/environment/IRefractiveIndexModel.h> -#include <corsika/environment/InhomogeneousMedium.h> -#include <corsika/environment/LayeredSphericalAtmosphereBuilder.h> -#include <corsika/environment/LinearApproximationIntegrator.h> -#include <corsika/environment/MediumPropertyModel.h> -#include <corsika/environment/NuclearComposition.h> -#include <corsika/environment/SlidingPlanarExponential.h> -#include <corsika/environment/UniformMagneticField.h> -#include <corsika/environment/UniformRefractiveIndex.h> -#include <corsika/environment/VolumeTreeNode.h> -#include <corsika/geometry/Line.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Line.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/media/DensityFunction.hpp> +#include <corsika/media/FlatExponential.hpp> +#include <corsika/media/HomogeneousMedium.hpp> +#include <corsika/media/IMediumModel.hpp> +#include <corsika/media/InhomogeneousMedium.hpp> +#include <corsika/media/LayeredSphericalAtmosphereBuilder.hpp> +#include <corsika/media/LinearApproximationIntegrator.hpp> +#include <corsika/media/NuclearComposition.hpp> +#include <corsika/media/SlidingPlanarExponential.hpp> +#include <corsika/media/VolumeTreeNode.hpp> #include <corsika/setup/SetupTrajectory.h> #include <catch2/catch.hpp> -using namespace corsika::geometry; -using namespace corsika::environment; -using namespace corsika::particles; -using namespace corsika::units::si; using namespace corsika; +using namespace corsika::units::si; CoordinateSystem const& gCS = RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); @@ -142,7 +133,7 @@ TEST_CASE("SlidingPlanarExponential") { auto constexpr rho0 = 1_kg / 1_m / 1_m / 1_m; struct Exponential { - auto operator()(corsika::geometry::Point const& p) const { + auto operator()(corsika::Point const& p) const { return exp(p.GetCoordinates()[0] / 1_m) * rho0; } @@ -203,13 +194,8 @@ TEST_CASE("InhomogeneousMedium") { } TEST_CASE("LayeredSphericalAtmosphereBuilder") { - - LayeredSphericalAtmosphereBuilder builder = - environment::make_layered_spherical_atmosphere_builder<>::create( - gOrigin, units::constants::EarthRadius::Mean); - - builder.setNuclearComposition( - {{{particles::Code::Nitrogen, particles::Code::Oxygen}}, {{.6, .4}}}); + LayeredSphericalAtmosphereBuilder builder(gOrigin); + builder.setNuclearComposition({{{Code::Nitrogen, Code::Oxygen}}, {{.6, .4}}}); builder.addLinearLayer(1_km, 10_km); builder.addLinearLayer(2_km, 20_km); diff --git a/tests/modules/CMakeLists.txt b/tests/modules/CMakeLists.txt new file mode 100644 index 000000000..f4c2fea50 --- /dev/null +++ b/tests/modules/CMakeLists.txt @@ -0,0 +1,26 @@ + +set (test_modules_sources + TestMain.cpp + testSibyll.cpp + ) + + +add_executable (testModules ${test_modules_sources}) + +target_link_libraries (testModules CORSIKA8 Sibyll_static Catch2) + +target_compile_options (testModules PRIVATE -g) # do not skip asserts + +target_include_directories (testModules PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +file (MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/test_outputs/) + +if (CORSIKA_SANITIZERS_ENABLED) + # -O1 is suggested in clang docs to get reasonable performance + target_compile_options (${name} PRIVATE -O1 -fno-omit-frame-pointer -fsanitize=${sanitize} -fno-sanitize-recover=all) + set_target_properties (${name} PROPERTIES LINK_FLAGS "-fsanitize=${sanitize}") +endif () + +add_test ( + NAME testModules + COMMAND testModules -o ${PROJECT_BINARY_DIR}/test_outputs/junit-modules.xml -s -r junit) diff --git a/tests/modules/TestMain.cpp b/tests/modules/TestMain.cpp new file mode 100644 index 000000000..da6f2c3f1 --- /dev/null +++ b/tests/modules/TestMain.cpp @@ -0,0 +1,13 @@ +/* + * (c) Copyright 2019 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one + // cpp file +#include <catch2/catch.hpp> diff --git a/tests/modules/testSibyll.cpp b/tests/modules/testSibyll.cpp new file mode 100644 index 000000000..0fbb7dffd --- /dev/null +++ b/tests/modules/testSibyll.cpp @@ -0,0 +1,191 @@ +/* + * (c) Copyright 2019 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/modules/sibyll/Decay.hpp> +#include <corsika/modules/sibyll/Interaction.hpp> +#include <corsika/modules/sibyll/NuclearInteraction.hpp> +#include <corsika/modules/sibyll/ParticleConversion.hpp> +#include <corsika/modules/sibyll/Random.hpp> + +#include <corsika/framework/random/RNGManager.hpp> + +#include <corsika/framework/core/ParticleProperties.hpp> + +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/Point.hpp> + +#include <catch2/catch.hpp> +#include <tuple> + +using namespace corsika; +using namespace corsika::sibyll; + +TEST_CASE("Sibyll", "[processes]") { + + SECTION("Sibyll -> Corsika") { + REQUIRE(Electron::GetCode() == + corsika::sibyll::ConvertFromSibyll(corsika::sibyll::SibyllCode::Electron)); + } + + SECTION("Corsika -> Sibyll") { + REQUIRE(corsika::sibyll::ConvertToSibyll(Electron::GetCode()) == + corsika::sibyll::SibyllCode::Electron); + REQUIRE(corsika::sibyll::ConvertToSibyllRaw(Proton::GetCode()) == 13); + } + + SECTION("canInteractInSibyll") { + + REQUIRE(corsika::sibyll::CanInteract(Proton::GetCode())); + REQUIRE(corsika::sibyll::CanInteract(Code::XiCPlus)); + + REQUIRE_FALSE(corsika::sibyll::CanInteract(Electron::GetCode())); + REQUIRE_FALSE(corsika::sibyll::CanInteract(SigmaC0::GetCode())); + + REQUIRE_FALSE(corsika::sibyll::CanInteract(Nucleus::GetCode())); + REQUIRE_FALSE(corsika::sibyll::CanInteract(Helium::GetCode())); + } + + SECTION("cross-section type") { + + REQUIRE(corsika::sibyll::GetSibyllXSCode(Code::Electron) == 0); + REQUIRE(corsika::sibyll::GetSibyllXSCode(Code::K0Long) == 3); + REQUIRE(corsika::sibyll::GetSibyllXSCode(Code::SigmaPlus) == 1); + REQUIRE(corsika::sibyll::GetSibyllXSCode(Code::PiMinus) == 2); + } +} + +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> + +#include <corsika/framework/core/PhysicalUnits.hpp> + +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> + +#include <corsika/media/Environment.hpp> +#include <corsika/media/HomogeneousMedium.hpp> +#include <corsika/media/NuclearComposition.hpp> + +#include <sibyll2.3d.hpp> + +using namespace corsika::units::si; +using namespace corsika::units; + +TEST_CASE("SibyllInterface", "[processes]") { + + // setup environment, geometry + corsika::Environment<corsika::IMediumModel> env; + auto& universe = *(env.GetUniverse()); + + auto theMedium = + corsika::Environment<corsika::IMediumModel>::CreateNode<corsika::Sphere>( + corsika::Point{env.GetCoordinateSystem(), 0_m, 0_m, 0_m}, + 1_km * std::numeric_limits<double>::infinity()); + + using MyHomogeneousModel = corsika::HomogeneousMedium<corsika::IMediumModel>; + theMedium->SetModelProperties<MyHomogeneousModel>( + 1_kg / (1_m * 1_m * 1_m), + corsika::NuclearComposition(std::vector<Code>{Code::Oxygen}, + std::vector<float>{1.})); + + auto const* nodePtr = theMedium.get(); + universe.AddChild(std::move(theMedium)); + + const corsika::CoordinateSystem& cs = env.GetCoordinateSystem(); + + corsika::RNGManager::GetInstance().RegisterRandomStream("s_rndm"); + + SECTION("InteractionInterface") { + + corsika::setup::Stack stack; + const HEPEnergyType E0 = 100_GeV; + HEPMomentumType P0 = sqrt(E0 * E0 - Proton::GetMass() * Proton::GetMass()); + auto plab = corsika::MomentumVector(cs, {0_GeV, 0_GeV, -P0}); + corsika::Point pos(cs, 0_m, 0_m, 0_m); + auto particle = stack.AddParticle( + std::tuple<Code, corsika::units::si::HEPEnergyType, corsika::MomentumVector, + corsika::Point, corsika::units::si::TimeType>{Code::Proton, E0, plab, + pos, 0_ns}); + particle.SetNode(nodePtr); + corsika::SecondaryView view(particle); + auto projectile = view.GetProjectile(); + + Interaction model; + + model.Init(); + [[maybe_unused]] const corsika::EProcessReturn ret = model.DoInteraction(projectile); + [[maybe_unused]] const GrammageType length = model.GetInteractionLength(particle); + } + + SECTION("NuclearInteractionInterface") { + + setup::Stack stack; + const HEPEnergyType E0 = 400_GeV; + HEPMomentumType P0 = sqrt(E0 * E0 - Proton::GetMass() * Proton::GetMass()); + auto plab = corsika::MomentumVector(cs, {0_GeV, 0_GeV, -P0}); + corsika::Point pos(cs, 0_m, 0_m, 0_m); + + auto particle = stack.AddParticle( + std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + corsika::Point, units::si::TimeType, unsigned short, unsigned short>{ + Code::Nucleus, E0, plab, pos, 0_ns, 4, 2}); + particle.SetNode(nodePtr); + corsika::SecondaryView view(particle); + auto projectile = view.GetProjectile(); + + Interaction hmodel; + NuclearInteraction model(hmodel, env); + + model.Init(); + [[maybe_unused]] const corsika::EProcessReturn ret = model.DoInteraction(projectile); + [[maybe_unused]] const GrammageType length = model.GetInteractionLength(particle); + } + + SECTION("DecayInterface") { + + setup::Stack stack; + const HEPEnergyType E0 = 10_GeV; + HEPMomentumType P0 = sqrt(E0 * E0 - Proton::GetMass() * Proton::GetMass()); + auto plab = corsika::MomentumVector(cs, {0_GeV, 0_GeV, -P0}); + corsika::Point pos(cs, 0_m, 0_m, 0_m); + auto particle = stack.AddParticle( + std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + corsika::Point, units::si::TimeType>{Code::Lambda0, E0, plab, pos, + 0_ns}); + corsika::SecondaryView view(particle); + auto projectile = view.GetProjectile(); + + Decay model; + + model.Init(); + /*[[maybe_unused]] const corsika::EProcessReturn ret =*/model.DoDecay(projectile); + // run checks + [[maybe_unused]] const TimeType time = model.GetLifetime(particle); + } + + SECTION("DecayConfiguration") { + + Decay model; + + const std::vector<Code> particleTestList = {Code::PiPlus, Code::PiMinus, + Code::KPlus, Code::Lambda0Bar, + Code::NuE, Code::D0Bar}; + + for (auto& pCode : particleTestList) { + model.SetUnstable(pCode); + // get state of sibyll internal config + REQUIRE(0 <= s_csydec_.idb[abs(corsika::sibyll::ConvertToSibyllRaw(pCode)) - 1]); + + model.SetStable(pCode); + // get state of sibyll internal config + REQUIRE(0 >= s_csydec_.idb[abs(corsika::sibyll::ConvertToSibyllRaw(pCode)) - 1]); + } + } +} diff --git a/tests/processes/TrackingLine/testTrackingLineStack.h b/tests/processes/TrackingLine/testTrackingLineStack.h new file mode 100644 index 000000000..96998fe6e --- /dev/null +++ b/tests/processes/TrackingLine/testTrackingLineStack.h @@ -0,0 +1,34 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#pragma once + +#include <corsika/media/Environment.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/setup/SetupStack.hpp> + +using TestEnvironmentType = + corsika::environment::Environment<corsika::environment::Empty>; + +template <typename T> +using SetupGeometryDataInterface = + corsika::stack::node::GeometryDataInterface<T, TestEnvironmentType>; + +// combine particle data stack with geometry information for tracking +template <typename StackIter> +using StackWithGeometryInterface = corsika::CombinedParticleInterface< + corsika::detail::ParticleDataStack::PIType, SetupGeometryDataInterface, + StackIter>; +using TestTrackingLineStack = corsika::CombinedStack< + typename corsika::detail::ParticleDataStack::StackImpl, + GeometryData<TestEnvironmentType>, StackWithGeometryInterface>; + + diff --git a/Processes/NullModel/testNullModel.cc b/tests/processes/testNullModel.cc similarity index 64% rename from Processes/NullModel/testNullModel.cc rename to tests/processes/testNullModel.cc index cc142637f..853361352 100644 --- a/Processes/NullModel/testNullModel.cc +++ b/tests/processes/testNullModel.cc @@ -8,19 +8,19 @@ #include <catch2/catch.hpp> -#include <corsika/process/null_model/NullModel.h> +#include <corsika/process/NullModel.hpp> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/PhysicalUnits.hpp> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> using namespace corsika::units::si; -using namespace corsika::process::null_model; +using namespace corsika::null_model; using namespace corsika; TEST_CASE("NullModel", "[processes]") { @@ -41,6 +41,13 @@ TEST_CASE("NullModel", "[processes]") { geometry::Line line(origin, v); geometry::Trajectory<geometry::Line> track(line, 10_s); + setup::Stack stack; + setup::Stack::ParticleType particle = stack.AddParticle( + std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, units::si::TimeType>{ + particles::Code::Electron, 100_GeV, + corsika::MomentumVector(dummyCS, {0_GeV, 0_GeV, -1_GeV}), + geometry::Point(dummyCS, {0_m, 0_m, 10_km}), 0_ns}); SECTION("interface") { NullModel model(10_m); diff --git a/Processes/ObservationPlane/testObservationPlane.cc b/tests/processes/testObservationPlane.cc similarity index 70% rename from Processes/ObservationPlane/testObservationPlane.cc rename to tests/processes/testObservationPlane.cc index ddaaaad96..243d091ce 100644 --- a/Processes/ObservationPlane/testObservationPlane.cc +++ b/tests/processes/testObservationPlane.cc @@ -10,23 +10,23 @@ // cpp file #include <catch2/catch.hpp> -#include <corsika/process/observation_plane/ObservationPlane.h> +#include <corsika/process/ObservationPlane.hpp> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <corsika/setup/SetupStack.h> #include <corsika/setup/SetupTrajectory.h> using namespace corsika::units::si; -using namespace corsika::process::observation_plane; +using namespace corsika::observation_plane; +using namespace corsika; +using namespace corsika; using namespace corsika; -using namespace corsika::geometry; -using namespace corsika::particles; TEST_CASE("ContinuousProcess interface", "[proccesses][observation_plane]") { @@ -50,10 +50,24 @@ TEST_CASE("ContinuousProcess interface", "[proccesses][observation_plane]") { Vector<units::si::SpeedType::dimension_type> vec(cs, 0_m / second, 0_m / second, -units::constants::c); Line line(start, vec); - setup::Trajectory track = - setup::testing::make_track<setup::Trajectory>(line, 12_m / units::constants::c); - - particle.SetPosition(Point(cs, {1_m, 1_m, 10_m})); // moving already along -z + Trajectory<Line> track(line, 12_m / units::constants::c); + + // setup particle stack, and add primary particle + setup::Stack stack; + stack.Clear(); + { + auto elab2plab = [](HEPEnergyType Elab, HEPMassType m) { + return sqrt((Elab - m) * (Elab + m)); + }; + stack.AddParticle( + std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, Point, + units::si::TimeType>{ + Code::NuMu, 1_GeV, + corsika::MomentumVector( + rootCS, {0_GeV, 0_GeV, -elab2plab(1_GeV, NuMu::GetMass())}), + Point(rootCS, {1_m, 1_m, 10_m}), 0_ns}); + } + auto particle = stack.GetNextParticle(); SECTION("horizontal plane") { diff --git a/Processes/ParticleCut/testParticleCut.cc b/tests/processes/testParticleCut.cc similarity index 75% rename from Processes/ParticleCut/testParticleCut.cc rename to tests/processes/testParticleCut.cc index c2343f763..7385a82b5 100644 --- a/Processes/ParticleCut/testParticleCut.cc +++ b/tests/processes/testParticleCut.cc @@ -6,22 +6,20 @@ * the license. */ -#include <corsika/process/particle_cut/ParticleCut.h> +#include <corsika/process/ParticleCut.hpp> -#include <corsika/environment/Environment.h> -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> -#include <corsika/units/PhysicalUnits.h> -#include <corsika/utl/CorsikaFenv.h> - -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> +#include <corsika/media/Environment.hpp> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/utility/CorsikaFenv.hpp> #include <catch2/catch.hpp> +#include <corsika/setup/SetupStack.hpp> using namespace corsika; -using namespace corsika::process::particle_cut; +using namespace corsika::particle_cut; using namespace corsika::units; using namespace corsika::units::si; @@ -56,24 +54,23 @@ TEST_CASE("ParticleCut", "[processes]") { // add primary particle to stack auto particle = stack.AddParticle( std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ + corsika::MomentumVector, geometry::Point, units::si::TimeType>{ particles::Code::Proton, Eabove, - corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}), point0, 0_ns}); + corsika::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}), + geometry::Point(rootCS, 0_m, 0_m, 0_m), 0_ns}); // view on secondary particles - setup::StackView view(particle); + corsika::SecondaryView view(particle); // ref. to primary particle through the secondary view. // only this way the secondary view is populated auto projectile = view.GetProjectile(); // add secondaries, all with energies above the threshold // only cut is by species for (auto proType : particleList) - projectile.AddSecondary(std::make_tuple( - proType, Eabove, corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}), - point0, 0_ns)); - CHECK(view.getEntries() == 11); - CHECK(stack.getEntries() == 12); - - cut.DoSecondaries(view); + projectile.AddSecondary(std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, + units::si::TimeType>{ + proType, Eabove, corsika::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}), + geometry::Point(rootCS, 0_m, 0_m, 0_m), 0_ns}); CHECK(view.getEntries() == 9); CHECK(cut.GetNumberInvParticles() == 2); @@ -111,30 +108,25 @@ TEST_CASE("ParticleCut", "[processes]") { ParticleCut cut(20_GeV, true, true); // add primary particle to stack - auto particle = stack.AddParticle(std::make_tuple( - particles::Code::Proton, Eabove, - corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}), point0, 0_ns)); + auto particle = stack.AddParticle( + std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, units::si::TimeType>{ + particles::Code::Proton, Eabove, + corsika::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}), + geometry::Point(rootCS, 0_m, 0_m, 0_m), 0_ns}); // view on secondary particles - setup::StackView view{particle}; + corsika::SecondaryView view(particle); // ref. to primary particle through the secondary view. // only this way the secondary view is populated auto projectile = view.GetProjectile(); // add secondaries, all with energies below the threshold // only cut is by species for (auto proType : particleList) - projectile.AddSecondary(std::make_tuple( - proType, Ebelow, corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}), - point0, 0_ns)); - unsigned short A = 18; - unsigned short Z = 8; - projectile.AddSecondary( - std::make_tuple(particles::Code::Nucleus, Eabove * A, - corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}), - point0, 0_ns, A, Z)); - projectile.AddSecondary( - std::make_tuple(particles::Code::Nucleus, Ebelow * A, - corsika::stack::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}), - point0, 0_ns, A, Z)); + projectile.AddSecondary(std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, + units::si::TimeType>{ + proType, Ebelow, corsika::MomentumVector(rootCS, {0_GeV, 0_GeV, 0_GeV}), + geometry::Point(rootCS, 0_m, 0_m, 0_m), 0_ns}); cut.DoSecondaries(view); diff --git a/Processes/QGSJetII/testQGSJetII.cc b/tests/processes/testQGSJetII.cc similarity index 63% rename from Processes/QGSJetII/testQGSJetII.cc rename to tests/processes/testQGSJetII.cc index 84dad94cf..ca203d3f9 100644 --- a/Processes/QGSJetII/testQGSJetII.cc +++ b/tests/processes/testQGSJetII.cc @@ -6,15 +6,14 @@ * the license. */ -#include <corsika/process/qgsjetII/Interaction.h> -#include <corsika/process/qgsjetII/ParticleConversion.h> +#include <corsika/process/QGSJetII.hpp> -#include <corsika/random/RNGManager.h> +#include <corsika/framework/random/RNGManager.hpp> -#include <corsika/particles/ParticleProperties.h> +#include <corsika/framework/core/ParticleProperties.hpp> -#include <corsika/geometry/Point.h> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/core/PhysicalUnits.hpp> #include <catch2/catch.hpp> @@ -23,42 +22,7 @@ #include <iostream> using namespace corsika; -using namespace corsika::process::qgsjetII; -using namespace corsika::units::si; - -template <typename TStackView> -auto sumCharge(TStackView const& view) { - int totalCharge = 0; - - for (auto const& p : view) { totalCharge += particles::GetChargeNumber(p.GetPID()); } - - return totalCharge; -} - -template <typename TStackView> -auto sumMomentum(TStackView const& view, geometry::CoordinateSystem const& vCS) { - geometry::Vector<hepenergy_d> sum{vCS, 0_eV, 0_eV, 0_eV}; - - for (auto const& p : view) { sum += p.GetMomentum(); } - - return sum; -} - -TEST_CASE("CORSIKA_DATA", "[processes]") { - - SECTION("check CORSIKA_DATA") { - - const char* data = std::getenv("CORSIKA_DATA"); - // these REQUIRES are needed: - REQUIRE(data != 0); - REQUIRE(std::experimental::filesystem::is_directory( - std::experimental::filesystem::path(std::string(data) + "/QGSJetII"))); - std::cout << "data: " << data << " isDir: " - << std::experimental::filesystem::is_directory(std::string(data) + - "/QGSJetII") - << std::endl; - } -} +using namespace corsika::qgsjetII; TEST_CASE("QgsjetII", "[processes]") { @@ -103,16 +67,19 @@ TEST_CASE("QgsjetII", "[processes]") { } } -#include <corsika/geometry/Point.h> -#include <corsika/geometry/RootCoordinateSystem.h> -#include <corsika/geometry/Vector.h> +#include <corsika/framework/geometry/Point.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> +#include <corsika/framework/geometry/Vector.hpp> + +#include <corsika/framework/core/PhysicalUnits.hpp> -#include <corsika/units/PhysicalUnits.h> +#include <corsika/framework/core/ParticleProperties.hpp> +#include <corsika/setup/SetupStack.hpp> +#include <corsika/setup/SetupTrajectory.hpp> -#include <corsika/particles/ParticleProperties.h> -#include <corsika/setup/SetupEnvironment.h> -#include <corsika/setup/SetupStack.h> -#include <corsika/setup/SetupTrajectory.h> +#include <corsika/media/Environment.hpp> +#include <corsika/media/HomogeneousMedium.hpp> +#include <corsika/media/NuclearComposition.hpp> using namespace corsika::units::si; using namespace corsika::units; @@ -128,12 +95,23 @@ TEST_CASE("QgsjetIIInterface", "[processes]") { SECTION("InteractionInterface") { - auto [stackPtr, secViewPtr] = setup::testing::setupStack(particles::Code::Proton, 0, - 0, 110_GeV, nodePtr, *csPtr); - setup::StackView& view = *(secViewPtr.get()); - auto particle = stackPtr->first(); - auto projectile = secViewPtr->GetProjectile(); - auto const projectileMomentum = projectile.GetMomentum(); + setup::Stack stack; + const HEPEnergyType E0 = 100_GeV; + HEPMomentumType P0 = + sqrt(E0 * E0 - particles::Proton::GetMass() * particles::Proton::GetMass()); + auto plab = corsika::MomentumVector(cs, {0_GeV, 0_GeV, -P0}); + geometry::Point pos(cs, 0_m, 0_m, 0_m); + auto particle = + stack.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType, + corsika::MomentumVector, geometry::Point, + units::si::TimeType, unsigned int, unsigned int>{ + particles::Code::Nucleus, E0, plab, pos, 0_ns, 16, 8}); + // corsika::MomentumVector, geometry::Point, units::si::TimeType>{ + // particles::Code::PiPlus, E0, plab, pos, 0_ns}); + + particle.SetNode(nodePtr); + corsika::SecondaryView view(particle); + auto projectile = view.GetProjectile(); Interaction model; diff --git a/tests/stack/CMakeLists.txt b/tests/stack/CMakeLists.txt new file mode 100644 index 000000000..70045765c --- /dev/null +++ b/tests/stack/CMakeLists.txt @@ -0,0 +1,28 @@ + +set (sources + TestMain.cpp + testSuperStupidStack.cpp + testNuclearStackExtension.cpp + ) + + +add_executable (testStack ${sources}) + +target_link_libraries (testStack CORSIKA8 Catch2) + +target_compile_options (testStack PRIVATE -g) # do not skip asserts + +target_include_directories (testStack PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + +file (MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/test_outputs/) + +if (CORSIKA_SANITIZERS_ENABLED) + # -O1 is suggested in clang docs to get reasonable performance + target_compile_options (${name} PRIVATE -O1 -fno-omit-frame-pointer -fsanitize=${sanitize} -fno-sanitize-recover=all) + set_target_properties (${name} PROPERTIES LINK_FLAGS "-fsanitize=${sanitize}") +endif () + +add_test ( + NAME testStack + COMMAND testStack -o ${PROJECT_BINARY_DIR}/test_outputs/junit-${name}.xml -s -r junit + ) diff --git a/tests/stack/TestMain.cpp b/tests/stack/TestMain.cpp new file mode 100644 index 000000000..da6f2c3f1 --- /dev/null +++ b/tests/stack/TestMain.cpp @@ -0,0 +1,13 @@ +/* + * (c) Copyright 2019 CORSIKA Project, corsika-project@lists.kit.edu + * + * See file AUTHORS for a list of contributors. + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one + // cpp file +#include <catch2/catch.hpp> diff --git a/tests/stack/testNuclearStackExtension.cpp b/tests/stack/testNuclearStackExtension.cpp new file mode 100644 index 000000000..ba09fded0 --- /dev/null +++ b/tests/stack/testNuclearStackExtension.cpp @@ -0,0 +1,262 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/stack/NuclearStackExtension.h> +#include <corsika/stack/SuperStupidStack.h> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> + +using namespace corsika; +using namespace corsika::nuclear_extension; +using namespace corsika; +using namespace corsika::units::si; + +#include <catch2/catch.hpp> + +// this is an auxiliary help typedef, which I don't know how to put +// into NuclearStackExtension.h where it belongs... +template <typename StackIter> +using ExtendedParticleInterfaceType = + corsika::nuclear_extension::NuclearParticleInterface< + corsika::super_stupid::SuperStupidStack::template PIType, StackIter>; + +using ExtStack = NuclearStackExtension<corsika::super_stupid::SuperStupidStack, + ExtendedParticleInterfaceType>; + +#include <iostream> +using namespace std; + +TEST_CASE("NuclearStackExtension", "[stack]") { + + CoordinateSystem& dummyCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + + SECTION("write non nucleus") { + NuclearStackExtension<corsika::super_stupid::SuperStupidStack, + ExtendedParticleInterfaceType> + s; + s.AddParticle(std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + Point, units::si::TimeType>{ + Code::Electron, 1.5_GeV, corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); + REQUIRE(s.GetSize() == 1); + } + + SECTION("write nucleus") { + NuclearStackExtension<corsika::super_stupid::SuperStupidStack, + ExtendedParticleInterfaceType> + s; + s.AddParticle(std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + Point, units::si::TimeType, unsigned short, unsigned short>{ + Code::Nucleus, 1.5_GeV, corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 10, 10}); + REQUIRE(s.GetSize() == 1); + } + + SECTION("write invalid nucleus") { + ExtStack s; + REQUIRE_THROWS(s.AddParticle( + std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, Point, + units::si::TimeType, unsigned short, unsigned short>{ + Code::Nucleus, 1.5_GeV, + corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 0, 0})); + } + + SECTION("read non nucleus") { + ExtStack s; + s.AddParticle(std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + Point, units::si::TimeType>{ + Code::Electron, 1.5_GeV, corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); + const auto pout = s.GetNextParticle(); + REQUIRE(pout.GetPID() == Code::Electron); + REQUIRE(pout.GetEnergy() == 1.5_GeV); + REQUIRE(pout.GetTime() == 100_s); + } + + SECTION("read nucleus") { + ExtStack s; + s.AddParticle(std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + Point, units::si::TimeType, unsigned short, unsigned short>{ + Code::Nucleus, 1.5_GeV, corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 10, 9}); + const auto pout = s.GetNextParticle(); + REQUIRE(pout.GetPID() == Code::Nucleus); + REQUIRE(pout.GetEnergy() == 1.5_GeV); + REQUIRE(pout.GetTime() == 100_s); + REQUIRE(pout.GetNuclearA() == 10); + REQUIRE(pout.GetNuclearZ() == 9); + } + + SECTION("read invalid nucleus") { + ExtStack s; + s.AddParticle(std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + Point, units::si::TimeType>{ + Code::Electron, 1.5_GeV, corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); + const auto pout = s.GetNextParticle(); + CHECK_THROWS(pout.GetNuclearA()); + CHECK_THROWS(pout.GetNuclearZ()); + } + + SECTION("stack fill and cleanup") { + + ParticleDataStack s; + // add 99 particles, each 10th particle is a nucleus with A=i and Z=A/2! + for (int i = 0; i < 99; ++i) { + if ((i + 1) % 10 == 0) { + s.AddParticle( + std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, Point, + units::si::TimeType, unsigned short, unsigned short>{ + Code::Nucleus, 1.5_GeV, + corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, i, i / 2}); + } else { + s.AddParticle(std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + Point, units::si::TimeType>{ + Code::Electron, 1.5_GeV, + corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); + } + } + + CHECK(s.getEntries() == 99); + for (int i = 0; i < 99; ++i) s.GetNextParticle().Delete(); + CHECK(s.getEntries() == 0); + } + + SECTION("stack operations") { + + ParticleDataStack s; + // add 99 particles, each 10th particle is a nucleus with A=i and Z=A/2! + // i=9, 19, 29, etc. are nuclei + for (int i = 0; i < 99; ++i) { + if ((i + 1) % 10 == 0) { + s.AddParticle( + std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, Point, + units::si::TimeType, unsigned short, unsigned short>{ + Code::Nucleus, i * 15_GeV, + corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, i, i / 2}); + } else { + s.AddParticle(std::tuple<Code, units::si::HEPEnergyType, corsika::MomentumVector, + Point, units::si::TimeType>{ + Code::Electron, i * 1.5_GeV, + corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); + } + } + + // copy + { + s.Copy(s.begin() + 9, s.begin() + 10); // nuclei to non-nuclei + const auto& p9 = s.cbegin() + 9; + const auto& p10 = s.cbegin() + 10; + + REQUIRE(p9.GetPID() == Code::Nucleus); + REQUIRE(p9.GetEnergy() == 9 * 15_GeV); + REQUIRE(p9.GetTime() == 100_s); + REQUIRE(p9.GetNuclearA() == 9); + REQUIRE(p9.GetNuclearZ() == 9 / 2); + + REQUIRE(p10.GetPID() == Code::Nucleus); + REQUIRE(p10.GetEnergy() == 9 * 15_GeV); + REQUIRE(p10.GetTime() == 100_s); + REQUIRE(p10.GetNuclearA() == 9); + REQUIRE(p10.GetNuclearZ() == 9 / 2); + } + + // copy + { + s.Copy(s.begin() + 93, s.begin() + 9); // non-nuclei to nuclei + const auto& p93 = s.cbegin() + 93; + const auto& p9 = s.cbegin() + 9; + + REQUIRE(p9.GetPID() == Code::Electron); + REQUIRE(p9.GetEnergy() == 93 * 1.5_GeV); + REQUIRE(p9.GetTime() == 100_s); + + REQUIRE(p93.GetPID() == Code::Electron); + REQUIRE(p93.GetEnergy() == 93 * 1.5_GeV); + REQUIRE(p93.GetTime() == 100_s); + } + + // swap + { + s.Swap(s.begin() + 11, s.begin() + 10); + const auto& p11 = s.cbegin() + 11; // now: nucleus + const auto& p10 = s.cbegin() + 10; // now: electron + + REQUIRE(p11.GetPID() == Code::Nucleus); + REQUIRE(p11.GetEnergy() == 9 * 15_GeV); + REQUIRE(p11.GetTime() == 100_s); + REQUIRE(p11.GetNuclearA() == 9); + REQUIRE(p11.GetNuclearZ() == 9 / 2); + + REQUIRE(p10.GetPID() == Code::Electron); + REQUIRE(p10.GetEnergy() == 11 * 1.5_GeV); + REQUIRE(p10.GetTime() == 100_s); + } + + // swap two nuclei + { + s.Swap(s.begin() + 29, s.begin() + 59); + const auto& p29 = s.cbegin() + 29; + const auto& p59 = s.cbegin() + 59; + + REQUIRE(p29.GetPID() == Code::Nucleus); + REQUIRE(p29.GetEnergy() == 59 * 15_GeV); + REQUIRE(p29.GetTime() == 100_s); + REQUIRE(p29.GetNuclearA() == 59); + REQUIRE(p29.GetNuclearZ() == 59 / 2); + + REQUIRE(p59.GetPID() == Code::Nucleus); + REQUIRE(p59.GetEnergy() == 29 * 15_GeV); + REQUIRE(p59.GetTime() == 100_s); + REQUIRE(p59.GetNuclearA() == 29); + REQUIRE(p59.GetNuclearZ() == 29 / 2); + } + + for (int i = 0; i < 99; ++i) s.last().Delete(); + CHECK(s.getEntries() == 0); + } + + SECTION("not allowed") { + NuclearStackExtension<corsika::stack::super_stupid::SuperStupidStack, + ExtendedParticleInterfaceType> + s; + + // not valid: + CHECK_THROWS(s.AddParticle(std::make_tuple( + particles::Code::Oxygen, 1.5_GeV, + corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 16, 8))); + + // valid + auto particle = s.AddParticle( + std::make_tuple(particles::Code::Nucleus, 1.5_GeV, + corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 10, 9)); + + // not valid + CHECK_THROWS(particle.AddSecondary(std::make_tuple( + particles::Code::Oxygen, 1.5_GeV, + corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 16, 8))); + + // add a another nucleus, so there are two now + s.AddParticle( + std::make_tuple(particles::Code::Nucleus, 1.5_GeV, + corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 10, 9)); + + // not valid, since end() is not a valid entry + CHECK_THROWS(s.Swap(s.begin(), s.end())); + } +} diff --git a/tests/stack/testSuperStupidStack.cpp b/tests/stack/testSuperStupidStack.cpp new file mode 100644 index 000000000..b566d952e --- /dev/null +++ b/tests/stack/testSuperStupidStack.cpp @@ -0,0 +1,68 @@ +/* + * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * + * This software is distributed under the terms of the GNU General Public + * Licence version 3 (GPL Version 3). See file LICENSE for a full version of + * the license. + */ + +#include <corsika/stack/SuperStupidStack.h> +#include <corsika/framework/core/PhysicalUnits.hpp> +#include <corsika/framework/geometry/RootCoordinateSystem.hpp> + +using namespace corsika; +using namespace corsika::units::si; + +#include <catch2/catch.hpp> + +using namespace corsika; +using namespace corsika::super_stupid; + +using namespace std; + +TEST_CASE("SuperStupidStack", "[stack]") { + + CoordinateSystem& dummyCS = + RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); + + SECTION("read+write") { + + SuperStupidStack s; + s.AddParticle( + std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + corsika::MomentumVector, corsika::Point, corsika::units::si::TimeType>{ + Code::Electron, 1.5_GeV, + corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); + + // read + CHECK(s.getEntries() == 1); + CHECK(s.getSize() == 1); + auto pout = s.GetNextParticle(); + REQUIRE(pout.GetPID() == Code::Electron); + REQUIRE(pout.GetEnergy() == 1.5_GeV); + // REQUIRE(pout.GetMomentum() == stack::MomentumVector(dummyCS, {1_GeV, + // 1_GeV, 1_GeV})); REQUIRE(pout.GetPosition() == Point(dummyCS, {1 * meter, 1 * + // meter, 1 * meter})); + REQUIRE(pout.GetTime() == 100_s); + } + + SECTION("write+delete") { + + SuperStupidStack s; + for (int i = 0; i < 99; ++i) + s.AddParticle(std::tuple<corsika::Code, corsika::units::si::HEPEnergyType, + corsika::MomentumVector, corsika::Point, + corsika::units::si::TimeType>{ + Code::Electron, 1.5_GeV, + corsika::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), + Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); + + CHECK(s.getSize() == 99); + + for (int i = 0; i < 99; ++i) s.GetNextParticle().Delete(); + + CHECK(s.getEntries() == 0); + CHECK(s.getSize() == 1); + } +} diff --git a/Tools/plot_crossings.sh b/tools/plot_crossings.sh similarity index 100% rename from Tools/plot_crossings.sh rename to tools/plot_crossings.sh diff --git a/Tools/plot_tracks.sh b/tools/plot_tracks.sh similarity index 100% rename from Tools/plot_tracks.sh rename to tools/plot_tracks.sh -- GitLab