Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

SageDecayer.cxx

Go to the documentation of this file.
00001 //  $Header: /nfs/slac/g/glast/ground/cvs/gismo/src/SageDecayer.cxx,v 1.1 2000/01/18 00:33:35 burnett Exp $
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 // Constructor //
00022 SageDecayer::SageDecayer(const char *) : Decayer("Sage")
00023 {
00024 }
00025 // This is an interface routine for sage
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 // Member function
00053 
00054 
00055 int SageDecayer::decay(GParticle* parent)const
00056 {
00057 
00058         int i,n = parent->numChildren();
00059         // uses the sage decay MC to calculate the four vectors of the decay
00060         //   products (given by 'pl') of particle p
00061 
00062         real U0, P0[4], M[30], U[30], P[30][4];           // 'FORTRAN' vectors
00063         U0    = parent->mass();
00064         P0[0] = SAGEXX.hcm;     // set CM flag so Sage knows not to boost
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   //          WSQ=SQRT(WSQ)
00074   //    A1(1)=ABS(W(1))*WSQ*SWT(1)
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 

Generated at Mon Nov 26 18:18:34 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000