Ejemplo n.º 1
0
  const double rms_beam_size(ParticleState const &ps, unsigned axis)
  {
    if (ps.particle_count == 0)
      return 0;

    double result = 0;
    for (particle_number pn = 0; pn < ps.particle_count; pn++)
      result += square(ps.positions[pn*ps.xdim() + axis]);

    return sqrt(result/ps.particle_count);
  }
Ejemplo n.º 2
0
  const double rms_beam_emittance(ParticleState const &ps, unsigned axis, unsigned beam_axis)
  {
    if (ps.particle_count == 0)
      return 0;

    double mean_x = 0;
    double mean_xp = 0;
    double mean_x_squared = 0;
    double mean_xp_squared = 0;
    double mean_xxp = 0;

    // see doc/notes.tm
    for (particle_number pn = 0; pn < ps.particle_count; pn++)
    {
      const double x = ps.positions[pn*ps.xdim() + axis];

      mean_x += x;
      mean_x_squared += square(x);

      const double px = ps.momenta[pn*ps.vdim() + axis];
      const double pz = ps.momenta[pn*ps.vdim() + beam_axis];

      const double xprime = pz ? px/pz : 0;

      mean_xp += xprime;
      mean_xp_squared += square(xprime);

      mean_xxp += x*xprime;
    }

    mean_x /= ps.particle_count;
    mean_xp /= ps.particle_count;

    mean_x_squared /= ps.particle_count;
    mean_xp_squared /= ps.particle_count;

    mean_xxp /= ps.particle_count;

    return sqrt(
        mean_x_squared*mean_xp_squared
        - square(mean_x)*mean_xp_squared
        - mean_x_squared*square(mean_xp)
        - (
          square(mean_xxp)
          -2*mean_xxp*mean_x*mean_xp
          )
        );
  }