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); }
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 ) ); }