00001
00002
00003
00004 #include "gismo/SageDecayer.h"
00005 #include "Random.h"
00006
00007 #include "gismo/GParticle.h"
00008 #include <strstream>
00009 #include "facilities/error.h"
00010
00011 typedef long int integer;
00012 typedef float real;
00013
00014 #define GOGEN gogen_
00015 #define SAGEXX sagexx_
00016 #define SAGERR sagerr_
00017 #define RAND rand_
00018 #define SAGEWT sagewt_
00019
00020
00021
00022 SageDecayer::SageDecayer(const char *) : Decayer("Sage")
00023 {
00024 }
00025
00026 extern "C"{
00027
00028 void RAND(real r[], integer* n);
00029 void SAGERR(char what[4], integer* code);
00030 extern void GOGEN(real*, real[], integer[], real[], real[], real[][4]);
00031 extern struct sagexx_1_ {
00032 real hend, hhlab, hcm, fac1[51];
00033 } SAGEXX;
00034 extern struct sagewt_1_{
00035 real swt[2], wsq, w[2];
00036 } SAGEWT;
00037 }
00038
00039 void RAND(real r[], integer* n)
00040 {
00041 int i;
00042 for(i=0;i<*n;i++)
00043 r[i]=Random::flat();
00044 }
00045 void SAGERR(char what[4], integer* code)
00046 {
00047 std::ostrstream serr;
00048 serr << "Sage Error from "<<what << *code <<'\n';
00049 WARNING(serr.str());
00050 }
00051
00052
00053
00054
00055 int SageDecayer::decay(GParticle* parent)const
00056 {
00057
00058 int i,n = parent->numChildren();
00059
00060
00061
00062 real U0, P0[4], M[30], U[30], P[30][4];
00063 U0 = parent->mass();
00064 P0[0] = SAGEXX.hcm;
00065 integer NP[]={n,1};
00066 for(i=0; i<n; i++)
00067 {
00068 M[i] = parent->child(i)->mass();
00069
00070 }
00071 SAGEWT.w[0] = -1.;
00072 GOGEN(&U0, P0, NP, M, U, P);
00073
00074
00075
00076 weight = SAGEWT.w[0]*sqrt(SAGEWT.wsq)*SAGEWT.swt[0];;
00077 for(i=0; i<n; i++)
00078 {
00079 parent->child(i)->setMomentum(Vector(P[i][0],P[i][1],P[i][2]));
00080 }
00081 return 1;
00082 }
00083