00001
00002 #include "Rivet/Tools/Logging.hh"
00003 #include "Rivet/Projections/FoxWolframMoments.hh"
00004 #include "Rivet/Cmp.hh"
00005
00006 namespace Rivet {
00007
00008 int FoxWolframMoments::compare(const Projection& p) const {
00009 return mkNamedPCmp(p, "FS");
00010 }
00011
00012
00013 void FoxWolframMoments::project(const Event& e) {
00014 Log log = getLog();
00015
00016
00017 const FinalState& fs = applyProjection<FinalState>(e, "VFS");
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 double sumEnergy = 0.0;
00041 for (ParticleVector::const_iterator pi = fs.particles().begin(); pi != fs.particles().end(); ++pi)
00042
00043 {
00044 sumEnergy += pi->momentum().E();
00045
00046 const FourMomentum pi_4 = pi->momentum();
00047
00048 for (ParticleVector::const_iterator pj = pi+1; pj != fs.particles().end(); ++pj)
00049
00050 {
00051 if ( pi == pj ) continue;
00052
00053 const FourMomentum pj_4 = pj->momentum();
00054
00055
00056 double x_ij = 1.0;
00057 if ( pi != pj ) {
00058 double denom = pi_4.vector3().mod() * pj_4.vector3().mod();
00059 x_ij = pi_4.vector3().dot( pj_4.vector3() ) / denom;
00060 }
00061
00062
00063
00064
00065 const double core = pi_4.vector3().mod() * pi_4.vector3().mod();
00066
00067 for ( int order = 0; order < MAXMOMENT ; ++order ) {
00068
00069 _fwmoments[order] += 2.0 * core * gsl_sf_legendre_Pl( order, x_ij ) ;
00070 }
00071 }
00072
00073
00074
00075
00076 for ( int order = 0; order < MAXMOMENT ; ++order ) {
00077 _fwmoments[order] += fabs( pi_4 * pi_4 );
00078 }
00079 }
00080
00081
00082 log << Log::DEBUG << "sumEnergy = " << sumEnergy << endl;
00083
00084 for ( int order = 0; order < MAXMOMENT ; ++order ) {
00085 _fwmoments[order] /= (sumEnergy*sumEnergy);
00086 }
00087
00088
00089 for ( int order = 1; order < MAXMOMENT ; ++order ) {
00090 _fwmoments[order] /= _fwmoments[0];
00091 }
00092 }
00093
00094 }