56int main(
int argc, 
char* argv[])
 
   67    JParser<> zap(
"Example program to histogram radiation cross sections, shower energy, range and b(E).");
 
   71    zap[
'O'] = 
make_field(option)          = LENGTH, ENERGY, RANGE, ELOSS;
 
   76  catch(
const exception &error) {
 
   77    FATAL(error.what() << endl);
 
   88  if (option == LENGTH)  {
 
   89    h0 = 
new TH1D(
"total", NULL, 160, 2.0, 10.0);                               
 
   92  if (option == ENERGY) {
 
   93    h0 = 
new TH1D(
"total", NULL,  24, 2.0, 10.0);                               
 
   96  NOTICE(
"Setting up radiation tables... " << flush);
 
  103  const JRadiation hydrogen ( 1.0,  1.0, 40, 0.01, 0.1, 0.1);
 
  104  const JRadiation oxygen   ( 8.0, 16.0, 40, 0.01, 0.1, 0.1);
 
  105  const JRadiation chlorine (17.0, 35.0, 40, 0.01, 0.1, 0.1);
 
  106  const JRadiation sodium   (11.0, 23.0, 40, 0.01, 0.1, 0.1);
 
  113  radiation.push_back(tuple(
new JRadiationSource(11, Oxygen,   DENSITY_SEA_WATER * JSeaWater::O(),  EErad_t), clone(h0, 
"[eerad O]" )));
 
  114  radiation.push_back(tuple(
new JRadiationSource(12, Chlorine, DENSITY_SEA_WATER * JSeaWater::Cl(), EErad_t), clone(h0, 
"[eerad Cl]")));
 
  115  radiation.push_back(tuple(
new JRadiationSource(13, Hydrogen, DENSITY_SEA_WATER * JSeaWater::H(),  EErad_t), clone(h0, 
"[eerad H]" )));
 
  116  radiation.push_back(tuple(
new JRadiationSource(14, Sodium,   DENSITY_SEA_WATER * JSeaWater::Na(), EErad_t), clone(h0, 
"[eerad Na]" )));
 
  118  radiation.push_back(tuple(
new JRadiationSource(21, Oxygen,   DENSITY_SEA_WATER * JSeaWater::O(),  Brems_t), clone(h0, 
"[Brems O]" )));
 
  119  radiation.push_back(tuple(
new JRadiationSource(22, Chlorine, DENSITY_SEA_WATER * JSeaWater::Cl(), Brems_t), clone(h0, 
"[Brems Cl]")));
 
  120  radiation.push_back(tuple(
new JRadiationSource(23, Hydrogen, DENSITY_SEA_WATER * JSeaWater::H(),  Brems_t), clone(h0, 
"[Brems H]" )));
 
  121  radiation.push_back(tuple(
new JRadiationSource(24, Sodium,   DENSITY_SEA_WATER * JSeaWater::Na(), Brems_t), clone(h0, 
"[Brems Na]" )));
 
  123  radiation.push_back(tuple(
new JRadiationSource(31, Oxygen,   DENSITY_SEA_WATER * JSeaWater::O(),  GNrad_t), clone(h0, 
"[gnrad O]" )));
 
  124  radiation.push_back(tuple(
new JRadiationSource(32, Chlorine, DENSITY_SEA_WATER * JSeaWater::Cl(), GNrad_t), clone(h0, 
"[gnrad Cl]")));
 
  125  radiation.push_back(tuple(
new JRadiationSource(33, Hydrogen, DENSITY_SEA_WATER * JSeaWater::H(),  GNrad_t), clone(h0, 
"[gnrad H]" )));
 
  126  radiation.push_back(tuple(
new JRadiationSource(34, Sodium,   DENSITY_SEA_WATER * JSeaWater::Na(), GNrad_t), clone(h0, 
"[gnrad Na]" )));
 
  131  if (option == LENGTH) {
 
  133    for (
int i = 1; i <= h0->GetNbinsX(); ++i) {
 
  135      const double x = h0->GetBinCenter(i);
 
  136      const double E = pow(10.0, x); 
 
  140      for (ntuple::iterator p = radiation.begin(); p != radiation.end(); ++p) {
 
  142        const double li = p->first->getInverseInteractionLength(E);
 
  144        p->second->Fill(x, 1.0/li);
 
  151  if (option == ENERGY) {
 
  153    for (
int i = 1; i <= h0->GetNbinsX(); ++i) {
 
  155      const double x = h0->GetBinCenter(i);
 
  156      const double E = pow(10.0, x); 
 
  160      for (ntuple::iterator p = radiation.begin(); p != radiation.end(); ++p) {
 
  165          Q.
put(p->first->getEnergyOfShower(E));
 
  168        p->second->SetBinContent(i, Q.
getMean());
 
  176  if (option == RANGE) {
 
  178    TH1D* Ra = 
new TH1D(
"R[analytical]", NULL, 12, 2.0, 8.0);                                            
 
  179    TH1D* Rb = 
new TH1D(
"R[numerical]",  NULL, 12, 2.0, 8.0);                                            
 
  181    for (
int i = 1; i <= Ra->GetNbinsX(); ++i) {
 
  183      const double x  = Ra->GetBinCenter(i);
 
  184      const double E0 = pow(10.0, x); 
 
  185      const double Z  = gWater(E0);
 
  187      Ra->SetBinContent(i, Z*1e-3);
 
  190    for (
int j = 1; j <= Rb->GetNbinsX(); ++j) {
 
  192      const double x  = Rb->GetBinCenter(j);
 
  193      const double E0 = pow(10.0, x); 
 
  206          const int N = radiation.size();
 
  211          for (
int i = 0; i != N; ++i) {
 
  212            ls += li[i] = radiation[i].first->getInverseInteractionLength(E);
 
  215          double dz = min(gRandom->Exp(1.0) / 
ls, gWater(E));
 
  217          E -= gWater.getA() * dz;
 
  220          double y  = gRandom->Uniform(
ls);
 
  222          for (
int i = 0; i != N; ++i) {
 
  227              Es = radiation[i].first->getEnergyOfShower(E);          
 
  239      Rb->SetBinContent(j, Q.
getMean() * 1e-3);
 
  246  if (option == ELOSS) {
 
  248    TH1D* hb = 
new TH1D(
"hb", NULL, 12, 2.0, 8.0);                                            
 
  250    for (
int j = 1; j <= hb->GetNbinsX(); ++j) {
 
  252      const double x  = hb->GetBinCenter(j);
 
  253      const double E  = pow(10.0, x); 
 
  259      const int N = radiation.size();
 
  264      for (
int i = 0; i != N; ++i) {
 
  265        ls += li[i] = radiation[i].first->getInverseInteractionLength(E);
 
  271        double y  = gRandom->Uniform(
ls);
 
  273        for (
int i = 0; i != N; ++i) {
 
  278            Es = radiation[i].first->getEnergyOfShower(E);          
 
  286      hb->SetBinContent(j, Q.
getMean());