Main Page   Compound List   File List   Compound Members   File Members  

ReactorEvent Class Reference

ReactorEvent handles all of the event generation in the ReactorFsim simulation. More...

#include <ReactorEvent.hh>

List of all members.

Public Methods

 ReactorEvent (int newNevents, double newRmaxgen=RMAXGEN, double newEmin=Emin, double newEmax=Emax, int newXCorder=XCorder)
 ReactorEvent constructor. More...

 ~ReactorEvent ()
 ReactorEvent destructor.

 ReactorEvent (const ReactorEvent &Event)
 ReactorEvent copy constructor.

ReactorEvent & operator= (const ReactorEvent &rhs)
 ReactorEvent overloaded = operator.

double XCReweight ()
double XCReweight (double Enu)
double XCReweight (ReactorEvent &Event)
std::string GetPmtRad () const
 Returns the PMT radiation state: ON/OFF.

int GetNevent () const
 Returns the number of events.

int GetNumNubar () const
 Returns the number of anti-neutrinos.

int GetNumPositron () const
 Returns the number of positrons.

int GetNumElectron () const
 Returns the number of electrons.

int GetNumNeutron () const
 Returns the number of neutrons.

int GetNumGamma () const
 Returns the number of gammas.

double GetXCWeight () const
double GetFluxWeight () const
double GetEnu (int &n) const
 Returns the energy of each anti-neutrino produced in the event. More...

double GetNubarParentProcess (int &n) const
 Returns the parent process used to generate each anti-neutrino in the event. More...

double GetElectronKE (int &n) const
 Returns the energy of each electron produced in the event. More...

double GetElectronCosTheta (int &n) const
double GetElectronPhi (int &n) const
double GetElectronParentProcess (int &n) const
 Returns the parent process used to generate each electron in the event. More...

double *const GetElectronPxyz ()
double GetPositronKE (int &n) const
 Returns the energy of each positron produced in the event. More...

double GetPositronCosTheta (int &n) const
double GetPositronPhi (int &n) const
double GetPositronParentProcess (int &n) const
 Returns the parent process used to generate each positron in the event. More...

double *const GetPositronPxyz ()
double GetNeutronKE (int &n) const
 Returns the energy of each neutron produced in the event. More...

double GetNeutronCosTheta (int &n) const
double GetNeutronPhi (int &n) const
double GetNeutronParentProcess (int &n) const
 Returns the parent process used to generate each neutron in the event. More...

double *const GetNeutronPxyz ()
double GetGammaKE (int &n) const
 Returns the energy of each photon produced in the event. More...

double GetGammaParentProcess (int &n) const
 Returns the parent process used to generate each photon in the event. More...

double GetNubarTime (int &n) const
double GetElectronTime (int &n) const
double GetPositronTime (int &n) const
double GetNeutronTime (int &n) const
double GetGammaTime (int &n) const
double GetNubarVertexR (int &n) const
double GetNubarVertexCosTheta (int &n) const
double GetNubarVertexPhi (int &n) const
double *const GetNubarVertexXYZ ()
double GetElectronVertexR (int &n) const
double GetElectronVertexCosTheta (int &n) const
double GetElectronVertexPhi (int &n) const
double *const GetElectronVertexXYZ ()
double GetPositronVertexR (int &n) const
double GetPositronVertexCosTheta (int &n) const
double GetPositronVertexPhi (int &n) const
double *const GetPositronVertexXYZ ()
double GetNeutronVertexR (int &n) const
double GetNeutronVertexCosTheta (int &n) const
double GetNeutronVertexPhi (int &n) const
double *const GetNeutronVertexXYZ ()
double GetGammaVertexR (int &n) const
double GetGammaVertexCosTheta (int &n) const
double GetGammaVertexPhi (int &n) const
double *const GetGammaVertexXYZ ()
double GetGeneratedElectronTime (int &n) const
double GetGeneratedElectronVertexR (int &n) const
double GetGeneratedElectronVertexCosTheta (int &n) const
double GetGeneratedElectronVertexPhi (int &n) const
double *const GetGeneratedElectronVertexXYZ ()
double GetGeneratedPositronTime (int &n) const
double GetGeneratedPositronVertexR (int &n) const
double GetGeneratedPositronVertexCosTheta (int &n) const
double GetGeneratedPositronVertexPhi (int &n) const
double *const GetGeneratedPositronVertexXYZ ()
double GetGeneratedNeutronTime (int &n) const
double GetGeneratedNeutronVertexR (int &n) const
double GetGeneratedNeutronVertexCosTheta (int &n) const
double GetGeneratedNeutronVertexPhi (int &n) const
double *const GetGeneratedNeutronVertexXYZ ()
void SetPositronVertex (int &n, double *rpos)
void SetNeutronVertex (int &n, double *rneu)

Public Attributes

std::string eventType
std::string pmtRad
int Pdim
int Rdim


Detailed Description

ReactorEvent handles all of the event generation in the ReactorFsim simulation.

It first sets up the event by reading in the type of event from event_setup.txt, the event setup file. The three types of event currently supported are "reactor," "cf252," and "all." For more on event_setup.txt, see event_readme.txt.

The "reactor" setting generates an anti-neutrino, positron, neutron from the inverse-beta decay reaction: nubar + proton -> positron + neutron. The "cf252" setting generates a neutron from a Cf252 decay. The "all" setting mixes both types of event.

Definition at line 26 of file ReactorEvent.hh.


Constructor & Destructor Documentation

ReactorEvent::ReactorEvent int    newNevents,
double    newRmaxgen = RMAXGEN,
double    newEmin = Emin,
double    newEmax = Emax,
int    newXCorder = XCorder
 

ReactorEvent constructor.

Called with the number of generated events set in ReactorFsim.cpp, the maximum allowed radius for generating particles in the simulation, Rmaxgen (default = 200 cm), and the minimum and maximum allowed energies, respectively, for the generated nubar in the inverse-beta decay reaction. The default minimum energy is 1.85; the maximum is 8.15, set in ReactorConstants.hh.

Definition at line 21 of file ReactorEvent.cpp.

References MyCfSource::GetCfGammaEnergy, MyCfSource::GetCfGammaTime, MyCfSource::GetCfNeutronEnergy, MyCfSource::GetCfNeutronTime, MyCfSource::GetCfVertexCosTheta, MyCfSource::GetCfVertexPhi, MyCfSource::GetCfVertexR, MuonPropagator::GetElectronKE, MuonPropagator::GetElectronTime, MuonPropagator::GetElectronVertexXYZ, MuonPropagator::GetGammaKE, MuonPropagator::GetGammaTime, MuonPropagator::GetGammaVertexXYZ, MuonPropagator::GetNeutronKE, MuonPropagator::GetNeutronTime, MuonPropagator::GetNeutronVertexXYZ, MyCfSource::GetNumCfSources, MuonPropagator::GetNumElectron, MuonPropagator::GetNumGamma, MyCfSource::GetNumGamma, MuonPropagator::GetNumNeutron, MyCfSource::GetNumNeutron, and MuonPropagator::GetWeight.

00025                                           {
00026 
00027   Pdim = 7; 
00028   Rdim = 7;
00029 
00030   Nevents = newNevents;
00031   Rmaxgen_RE = newRmaxgen;
00032   Emin_RE = newEmin;
00033   Emax_RE = newEmax;
00034   XCorder_RE = newXCorder;
00035 
00036   /*
00037   cout << "ReactorEvent::ReactorEvent(" << Nevents << "," 
00038        << Rmaxgen_RE << "," << Emin << "," << Emax << "," 
00039        << XCorder_RE << ")" << endl;
00040   */
00041 
00042   int nmax = Ndim;
00043   int nnu  = 0;
00044   int npos = 0;
00045   int nele = 0;
00046   int nneu = 0;
00047   int ngam = 0;
00048 
00049   static double FracDone;
00050   static double FracDisplay;
00051   static double FracLastDisplay;
00052   static double NeventLastDisplay;
00053   static bool display;
00054 
00055   double* pnubar = new double[nmax*Pdim];
00056   double* pelectron = new double[nmax*Pdim];
00057   double* ppositron = new double[nmax*Pdim];
00058   double* pneutron = new double[nmax*Pdim];
00059   double* pgamma = new double[nmax*Pdim];
00060 
00061   double* pnu  = pnubar;
00062   double* pele = pelectron;
00063   double* ppos = ppositron;
00064   double* pneu = pneutron;
00065   double* pgam = pgamma;
00066 
00067   double* rnubar = new double[nmax*Rdim];
00068   double* relectron = new double[nmax*Rdim];
00069   double* rgenele = new double[nmax*Rdim];
00070   double* rpositron = new double[nmax*Rdim];
00071   double* rgenpos = new double[nmax*Rdim];
00072   double* rneutron = new double[nmax*Rdim];
00073   double* rgenneu = new double[nmax*Rdim];
00074   double* rgamma = new double[nmax*Rdim];
00075 
00076   double* rnu  = rnubar;
00077   double* rele = relectron;
00078   double* rge  = rgenele;
00079   double* rpos = rpositron;
00080   double* rgp  = rgenpos;
00081   double* rneu = rneutron;
00082   double* rgn  = rgenneu;
00083   double* rgam = rgamma;
00084 
00085   double Enu,z,phi;
00086   double R,zR,phiR;
00087 
00088   // setup the event
00089   fstream fin("src/event_setup.txt", ios::in);
00090   //cout << "setup file: src/event_setup.txt" << endl;
00091 
00092   char paramLine[256];
00093   std::string dummy;
00094   bool done = false;
00095   bool set = false;
00096   std::string static eventtype;
00097   std::string static pmtrad;
00098   double static Depth;
00099   bool static first = true;
00100 
00101   if(first){
00102     while(!done){
00103 
00104       // '#' specifies a comment line -- ignore it
00105       if(fin.peek() == '#'){
00106 
00107         fin.getline(paramLine, 256);
00108         continue;
00109       }
00110 
00111       // 'E'ND or 'e'nd specifies end of file -- set done flag to true
00112       if(fin.peek() == 'e' || fin.peek() == 'E'){
00113 
00114         done = true;
00115         continue;
00116       }
00117 
00118       // 'K'IND or 'k'ind specifies the event type
00119       if(fin.peek() == 'k' || fin.peek() == 'K'){
00120         
00121         if(set){
00122 
00123           fin.getline( paramLine, 256 );
00124           continue;
00125         }
00126         fin >> dummy;
00127         while(fin.peek() == ' ' || fin.peek() == '=') 
00128           fin.ignore(1);
00129 
00130         fin >> eventtype;
00131 
00132         if(eventtype == "reactor" || eventtype == "cf252" || 
00133            eventtype == "pmtrad"  || eventtype == "muon" || 
00134            eventtype == "all"     || eventtype == "veto"){
00135           set = true;
00136         }
00137         else{
00138           cout << "SETUP ERROR: unrecognized event type" << eventtype << endl;
00139         }
00140 
00141         continue;
00142       }
00143 
00144       // 'P'MTRAD or 'p'mtrad turns on/off radioactive decays in the PMTs
00145       if(fin.peek() == 'p' || fin.peek() == 'P'){
00146 
00147         fin >> dummy;
00148         while(fin.peek() == ' ' || fin.peek() == '=') 
00149           fin.ignore(1);
00150 
00151         fin >> pmtrad;
00152         continue;
00153       }
00154 
00155       // 'D'EPTH or 'd'epth sets the detector depth in mwe
00156       if(fin.peek() == 'd' || fin.peek() == 'D'){
00157 
00158         fin >> dummy;
00159         while(fin.peek() == ' ' || fin.peek() == '=') 
00160           fin.ignore(1);
00161 
00162         fin >> Depth;
00163         continue;
00164       }
00165 
00166       // skip n, o, r, t, a, b, m, and f
00167       if(fin.peek() == 'N' || fin.peek() == 'n' ||
00168          fin.peek() == 'O' || fin.peek() == 'o' ||
00169          fin.peek() == 'R' || fin.peek() == 'r' ||
00170          fin.peek() == 'T' || fin.peek() == 't' ||
00171          fin.peek() == 'A' || fin.peek() == 'a' ||
00172          fin.peek() == 'B' || fin.peek() == 'b' ||
00173          fin.peek() == 'M' || fin.peek() == 'm' ||
00174          fin.peek() == 'F' || fin.peek() == 'f'){
00175 
00176         fin.getline(paramLine, 256);
00177         continue;
00178       }
00179 
00180       // ignore extra whitespace
00181       if(fin.peek() == ' ' || fin.peek() == '\n'){
00182 
00183         fin.ignore(1);
00184         continue;
00185       }
00186     }
00187 
00188     // log file printout
00189     cout << "===============================" << endl;
00190     cout << "  " << eventtype << " type of events" << endl;
00191     cout << "  PMT radioactivity is " << pmtrad << endl;
00192     cout << "  Detector depth is " << Depth << " mwe" << endl;
00193     cout << "===============================" << endl;
00194 
00195     // zero the event counter
00196     Nevent = 0;
00197 
00198     first = false;
00199   }
00200   eventType = eventtype;
00201   pmtRad = pmtrad;
00202 
00203   // report fraction of processed events
00204   display = 0;
00205   if (Nevent==0) {
00206     // Set up fractions for progress checking
00207     FracDisplay = 0.01;
00208     NeventLastDisplay = 0.;
00209     FracLastDisplay = 0.;
00210     FracDone = 0.;
00211     display = 1;
00212   }
00213   //
00214   // report every 1% of processed events
00215   //
00216   FracDone = (double) Nevent / (double) Nevents;
00217   if (FracDone >= 0.){
00218     if (display || (FracDone-FracLastDisplay) >= FracDisplay){
00219       cout << Nevent << " events (" << 100.*FracDone 
00220            << "%) processed" << endl;
00221       FracLastDisplay += FracDisplay;
00222     }
00223   }
00224   else {
00225     if (display || Nevent-NeventLastDisplay >= FracDisplay*NeventLastDisplay){
00226       cout << Nevent << " events processed" << endl;
00227     }
00228   }
00229   //
00230   // count the event
00231   //
00232   Nevent++;
00233 
00234   //  if(Nevent%1000 == 0) cout << Nevent << " events processed" << endl;
00235   //
00236   // if all events are requested, mix the 'reactor' and 'cf252' 
00237   // events together with 90/10% Cf252/reactor events
00238   //
00239   if(eventType == "all"){
00240     const int len = 1;
00241     float r[len];
00242     ranlux_(r,len);
00243 
00244     if(r[0] < 0.90){
00245       eventType = "cf252";
00246     }
00247     else{
00248       eventType = "reactor";
00249     }
00250   }
00251   //cout << eventType << " type of events" << endl;
00252   //cout << "PMT radiation " << pmtRad << endl;
00253 
00254   if(eventType == "reactor"){
00255 
00256     XCWeight = 1;
00257 
00258     // inverse beta decay reaction
00259     double XCmax = InverseBeta(Emax_RE,-1);
00260     double FluxMax = RMPflux(Emin_RE);
00261 
00262     bool passed=0;
00263 
00264     while(!passed){
00265       const int len = 7;
00266       float r[len];
00267       ranlux_(r,len);
00268       Enu = Emin_RE+(Emax_RE-Emin_RE)*r[0];
00269       z = -1+2*r[1];
00270       phi = 2*PI*r[2];
00271 
00272       R = Rmaxgen_RE*exp(log(r[3])/3);
00273       zR = -1+2*r[4];
00274       phiR = 2*PI*r[5];
00275       //      cout << R << " " << Rmaxgen_RE << " " << r[3] << endl;
00276 
00277       float XCtest = XCmax*FluxMax*r[6];
00278       XCWeight = InverseBeta(Enu,z);
00279       FluxWeight=RMPflux(Enu);
00280       passed= XCWeight*FluxWeight>XCtest;
00281     }
00282     //      cout << "passed " << R << " " << Rmaxgen_RE << " "<< endl;
00283 
00284   
00285     double E0 = Enu - DELTA;
00286     double p0 = sqrt(E0*E0-MELECTRON*MELECTRON);
00287     double v0 = p0/E0;
00288     double Ysquared = (DELTA*DELTA-MELECTRON*MELECTRON)/2;
00289     double E1 = E0*(1-Enu/MPROTON*(1-v0*z))-Ysquared/MPROTON;
00290     double p1 = sqrt(E1*E1-MELECTRON*MELECTRON);
00291 
00292     *pnu = Enu; pnu++;
00293     *pnu = 0; pnu++;
00294     *pnu = 0; pnu++;
00295     *pnu = Enu; pnu++;
00296     *pnu = Enu; pnu++;
00297     *pnu = Enu; pnu++;
00298     *pnu = 1.; pnu++; // inverse beta decay process Id = 1
00299 
00300     *ppos = E1; ppos++;
00301     *ppos = p1*sqrt(1-z*z)*cos(phi); ppos++;
00302     *ppos = p1*sqrt(1-z*z)*sin(phi); ppos++;
00303     *ppos = p1*z; ppos++;
00304     *ppos = E1-MELECTRON; ppos++;
00305     *ppos = p1; ppos++;
00306     *ppos = 1.; ppos++;
00307 
00308     *pneu = Enu+MPROTON-E1; pneu++;
00309     *pneu = -p1*sqrt(1-z*z)*cos(phi); pneu++;
00310     *pneu = -p1*sqrt(1-z*z)*sin(phi); pneu++;
00311     *pneu = Enu-p1*z; pneu++;
00312     *pneu = Enu-E1-DELTA; pneu++;
00313     *pneu = sqrt((Enu+MPROTON-E1)*(Enu+MPROTON-E1)-
00314                          (MPROTON+DELTA)*(MPROTON+DELTA)); pneu++;
00315     *pneu = 1.; pneu++;
00316 
00317     *rnu = 0; rnu++;
00318     *rnu = R*sqrt(1-zR*zR)*cos(phiR); rnu++;
00319     *rnu = R*sqrt(1-zR*zR)*sin(phiR); rnu++;
00320     *rnu = R*zR; rnu++;
00321     *rnu = R; rnu++;
00322     *rnu = zR; rnu++;
00323     *rnu = phiR; rnu++;
00324 
00325     *rpos = 0; rpos++;
00326     *rpos = R*sqrt(1-zR*zR)*cos(phiR); rpos++;
00327     *rpos = R*sqrt(1-zR*zR)*sin(phiR); rpos++;
00328     *rpos = R*zR; rpos++;
00329     *rpos = R; rpos++;
00330     *rpos = zR; rpos++;
00331     *rpos = phiR; rpos++;
00332 
00333     *rgp = 0; rgp++;
00334     *rgp = R*sqrt(1-zR*zR)*cos(phiR); rgp++;
00335     *rgp = R*sqrt(1-zR*zR)*sin(phiR); rgp++;
00336     *rgp = R*zR; rgp++;
00337     *rgp = R; rgp++;
00338     *rgp = zR; rgp++;
00339     *rgp = phiR; rgp++;
00340 
00341     *rneu = 0; rneu++;
00342     *rneu = R*sqrt(1-zR*zR)*cos(phiR); rneu++;
00343     *rneu = R*sqrt(1-zR*zR)*sin(phiR); rneu++;
00344     *rneu = R*zR; rneu++;
00345     *rneu = R; rneu++;
00346     *rneu = zR; rneu++; 
00347     *rneu = phiR; rneu++;
00348 
00349     *rgn = 0; rgn++;
00350     *rgn = R*sqrt(1-zR*zR)*cos(phiR); rgn++;
00351     *rgn = R*sqrt(1-zR*zR)*sin(phiR); rgn++;
00352     *rgn = R*zR; rgn++;
00353     *rgn = R; rgn++;
00354     *rgn = zR; rgn++;
00355     *rgn = phiR; rgn++;
00356 
00357     // count the nubar, positron, and neutron
00358     nnu++;
00359     npos++;
00360     nneu++;
00361 
00362   } // done with reactor neutrino inverse-beta reaction
00363 
00364   // Cf source reaction
00365   else if(eventType == "cf252"){
00366     XCWeight = 1;
00367     FluxWeight = 1;
00368 
00369     int Isotope = 252;
00370     MyCfSource CfSource(Isotope,RMAXGEN);
00371 
00372     int Nsources = CfSource.GetNumCfSources();
00373     //cout << "Number of Cf252 sources = " << Nsources << endl;
00374 
00375     for(int n=0;n<Nsources;n++){
00376 
00377       R = CfSource.GetCfVertexR(n);
00378       zR = CfSource.GetCfVertexCosTheta(n);
00379       phiR = CfSource.GetCfVertexPhi(n);
00380 
00381       // loop over the neutrons
00382       for(int nn=0;nn<CfSource.GetNumNeutron(n);nn++){
00383 
00384         double neutronKE = CfSource.GetCfNeutronEnergy(n,nn);
00385         //cout << "   Cf252 source " << n << ", neutron " << nn 
00386         //     << " energy = " << neutronKE << endl;
00387 
00388         double Tneu = CfSource.GetCfNeutronTime(n,nn);
00389         double Mneutron = MPROTON+DELTA;
00390         double neutronE = neutronKE+Mneutron;
00391 
00392         // pick a direction for neutron momentum
00393         const int len = 2;
00394         float r[len];
00395         ranlux_(r,len);
00396         z = -1+2*r[0];
00397         phi = 2*PI*r[1];
00398         double x = sqrt(1-z*z)*cos(phi);
00399         double y = sqrt(1-z*z)*sin(phi);
00400 
00401         *pneu = neutronE; pneu++;
00402         *pneu = sqrt((neutronE*neutronE)-(Mneutron*Mneutron))*x; pneu++;
00403         *pneu = sqrt((neutronE*neutronE)-(Mneutron*Mneutron))*y; pneu++;
00404         *pneu = sqrt((neutronE*neutronE)-(Mneutron*Mneutron))*z; pneu++;
00405         *pneu = neutronKE; pneu++;
00406         *pneu = sqrt(neutronE*neutronE-Mneutron*Mneutron); pneu++;
00407         *pneu = 2.; pneu++; // cf252 source process Id = 2
00408 
00409         *rneu = Tneu; rneu++;
00410         *rneu = R*sqrt(1-zR*zR)*cos(phiR); rneu++;
00411         *rneu = R*sqrt(1-zR*zR)*sin(phiR); rneu++;
00412         *rneu = R*zR; rneu++;
00413         *rneu = R; rneu++;
00414         *rneu = zR; rneu++;
00415         *rneu = phiR; rneu++;
00416 
00417         *rgn = Tneu; rgn++;
00418         *rgn = R*sqrt(1-zR*zR)*cos(phiR); rgn++;
00419         *rgn = R*sqrt(1-zR*zR)*sin(phiR); rgn++;
00420         *rgn = R*zR; rgn++;
00421         *rgn = R; rgn++;
00422         *rgn = zR; rgn++;
00423         *rgn = phiR; rgn++;
00424       }
00425       // count the neutrons
00426       nneu += CfSource.GetNumNeutron(n);      
00427 
00428       // loop over the prompt gammas (these are real photons and 
00429       // need to be compton scattered in the scint)
00430       //
00431       for(int nn=0;nn<CfSource.GetNumGamma(n);nn++){
00432 
00433         double gammaKE = CfSource.GetCfGammaEnergy(n,nn);
00434         //cout << "   Cf252 source " << n << ", gamma " << nn 
00435         //     << " energy = " << gammaKE << endl;
00436 
00437         double Tgam = CfSource.GetCfGammaTime(n,nn);
00438 
00439         // compton scatter the gammas
00440         //
00441         const int len = 5;
00442         float rv[len];
00443         ranlux_(rv,len);
00444         double cosg = -1+2*rv[0];
00445         double phig = 2*PI*rv[1];
00446         double t[3];
00447         t[0] = cos(phig)*sqrt(1-cosg*cosg);
00448         t[1] = sin(phig)*sqrt(1-cosg*cosg);
00449         t[2] = cosg;
00450         //for(int i=0;i<3;i++) cout << "t["<<i<<"] " << t[i] << " ";
00451         //cout << endl;
00452 
00453         double range;
00454         std::string material;
00455         if(R < Rmaxgen_RE)
00456           material = "scintillator";
00457         else
00458           material = "oil";
00459         range = GammaComptonRange(material,gammaKE);
00460         range*=log(1/rv[2]);
00461         //cout << "range " << range << endl;
00462         //
00463         // get the new x,y,z positions from source R,zR,phiR
00464         //
00465         double xpos = R*sqrt(1-zR*zR)*cos(phiR) + range*t[0];
00466         double ypos = R*sqrt(1-zR*zR)*sin(phiR) + range*t[1];
00467         double zpos = R*zR + range*t[2];
00468         //
00469         // now convert back to R,zR,phiR
00470         //
00471         R = sqrt(xpos*xpos + ypos*ypos + zpos*zpos);
00472         zR = zpos/R;
00473         phiR = atan2(ypos,xpos);
00474         if(phiR < 0) phiR += 2*PI;
00475         //
00476         // pick a direction for gamma momentum
00477         //
00478         float r[len];
00479         ranlux_(r,len);
00480         z = -1+2*rv[3];
00481         phi = 2*PI*rv[4];
00482         double x = sqrt(1-z*z)*cos(phi);
00483         double y = sqrt(1-z*z)*sin(phi);
00484 
00485         *pgam = gammaKE; pgam++;
00486         *pgam = gammaKE*x; pgam++;
00487         *pgam = gammaKE*y; pgam++;
00488         *pgam = gammaKE*z; pgam++;
00489         *pgam = gammaKE; pgam++;
00490         *pgam = gammaKE; pgam++;
00491         *pgam = 2.; pgam++; // cf252 source process Id = 2
00492 
00493         *rgam = Tgam; rgam++;
00494         *rgam = xpos; rgam++;
00495         *rgam = ypos; rgam++;
00496         *rgam = zpos; rgam++;
00497         *rgam = R; rgam++;
00498         *rgam = zR; rgam++;
00499         *rgam = phiR; rgam++;
00500       }
00501       //
00502       ngam += CfSource.GetNumGamma(n);
00503 
00504     } // done looping over sources
00505 
00506   } // done with cf source neutron production
00507 
00508   // PMT radiation
00509   else if(eventType == "pmtrad"){
00510 
00511     XCWeight = 1;
00512     FluxWeight = 1;
00513 
00514     // nothing happens in these events but photons, generated in 
00515     // ReactorDetector::GenerateGammas with pmtRad on
00516     if(pmtRad == "off"){
00517       cout << "SETUP ERROR: PMT radiation set " << pmtRad << " in a " 
00518            << eventType << " type event" << endl;
00519       pmtRad = "on";
00520       cout << "Forcing PMT radiation " << pmtRad << endl;
00521     }
00522   }
00523 
00524   // muons
00525   else if(eventType == "muon"){
00526 
00527     //cout << eventType << endl;
00528 
00529     // create the energy and cosine of zenith angle (theta) arrays
00530     bool static first = true;
00531     double static Energy[Mdim],CosTheta[Mdim];
00532     double dummy;
00533 
00534     if(first){
00535 
00536       // read in the muon energy in GeV and angle
00537       if(Depth == 300.){
00538         fstream fin("data/Totb300a.dat", ios::in);
00539         cout << "setup file: data/Totb300a.dat" << endl;
00540 
00541         for(int i=0;i<Mdim;i++){
00542           fin >> dummy >> Energy[i] >> dummy >> dummy >> dummy >> CosTheta[i];
00543           //cout << i << "  " << Energy[i] << "  " << CosTheta[i] << endl;
00544         }
00545         printf("Read %d input records\n",Mdim);
00546       }
00547       else if(Depth == 450.){
00548         fstream fin("data/Totb450a.dat", ios::in);
00549         cout << "setup file: data/Totb450a.dat" << endl;
00550 
00551         for(int i=0;i<Mdim;i++){
00552           fin >> dummy >> Energy[i] >> dummy >> dummy >> dummy >> CosTheta[i];
00553           //cout << i << "  " << Energy[i] << "  " << CosTheta[i] << endl;
00554         }
00555         printf("Read %d input records\n",Mdim);
00556       }
00557       else if(Depth == 500.){
00558         fstream fin("data/Totb500a.dat", ios::in);
00559         cout << "setup file: data/Totb500a.dat" << endl;
00560 
00561         for(int i=0;i<Mdim;i++){
00562           fin >> dummy >> Energy[i] >> dummy >> dummy >> dummy >> CosTheta[i];
00563           //cout << i << "  " << Energy[i] << "  " << CosTheta[i] << endl;
00564         }
00565         printf("Read %d input records\n",Mdim);
00566       }
00567       else{
00568         cout << "ERROR: no muon data for depth of " 
00569              << Depth << " mwe" << endl;
00570         return;
00571       }
00572   
00573       first = false;
00574     }
00575 
00576     /* get the muon energy and cosine of the zenith angle
00577        the spectra in the Tot dat files are random so start 
00578        with the first entry and cycle through the file
00579     */
00580     static int index = 0;
00581     double energy = 0.;
00582     double cosg = 0.;
00583     //
00584     if(index < Mdim){
00585       //
00586       // muon energy in MeV
00587       energy = Energy[index]*1000.;
00588       cosg = CosTheta[index];
00589       //cout << " muon energy " << energy 
00590       //   << " MeV, cos(theta) " << cosg << endl;
00591       index++;
00592     }
00593     else{
00594       cout << "  WARNING: end of muon input file reached at index " << index 
00595            << ".  Starting over." << endl;
00596       index = 0;
00597     }
00598     //
00599     // call the propagator, which returns particle information
00600     //
00601     MuonPropagator Muon(RMAXGEN,Depth,energy,cosg);
00602 
00603     XCWeight = Muon.GetWeight();
00604     FluxWeight = 1;
00605     //
00606     // loop over neutrons
00607     //
00608     nneu = Muon.GetNumNeutron();
00609     for(int n=0;n<nneu;n++){
00610 
00611       float neutronKE = Muon.GetNeutronKE(n);
00612       //cout << "  neutron " << n << " energy = " << neutronKE << endl;
00613 
00614       float Mneutron = MPROTON+DELTA;
00615       float neutronE = neutronKE+Mneutron;
00616 
00617       // pick a direction for neutron momentum
00618       const int len = 2;
00619       float rv[len];
00620       ranlux_(rv,len);
00621       z = -1+2*rv[0];
00622       phi = 2*PI*rv[1];
00623       double x = sqrt(1-z*z)*cos(phi);
00624       double y = sqrt(1-z*z)*sin(phi);
00625 
00626       *pneu = neutronE; pneu++;
00627       *pneu = sqrt((neutronE*neutronE)-(Mneutron*Mneutron))*x; pneu++;
00628       *pneu = sqrt((neutronE*neutronE)-(Mneutron*Mneutron))*y; pneu++;
00629       *pneu = sqrt((neutronE*neutronE)-(Mneutron*Mneutron))*z; pneu++;
00630       *pneu = neutronKE; pneu++;
00631       *pneu = sqrt(neutronE*neutronE-Mneutron*Mneutron); pneu++;
00632       *pneu = 3.; pneu++; // muon process Id = 3
00633 
00634       double neuxyz[3];
00635       for(int i=0;i<3;i++){
00636         neuxyz[i] = *(Muon.GetNeutronVertexXYZ()+(i+n));
00637         //cout << "  neuxyz[" << i << "] " << neuxyz[i] << endl;
00638       }
00639       double rr = sqrt(neuxyz[0]*neuxyz[0] + 
00640                        neuxyz[1]*neuxyz[1] + 
00641                        neuxyz[2]*neuxyz[2]);
00642       double rphi = atan2(neuxyz[1],neuxyz[0]);
00643       if(rphi<0) rphi += 2*PI;
00644 
00645       double time = Muon.GetNeutronTime(n);
00646       //cout << " n time " << time << endl;
00647 
00648       *rneu = time; rneu++;
00649       *rneu = neuxyz[0]; rneu++;
00650       *rneu = neuxyz[1]; rneu++;
00651       *rneu = neuxyz[2]; rneu++;
00652       *rneu = rr; rneu++;
00653       *rneu = neuxyz[2]/rr; rneu++;
00654       *rneu = rphi; rneu++;
00655 
00656       *rgn = time; rgn++;
00657       *rgn = neuxyz[0]; rgn++;
00658       *rgn = neuxyz[1]; rgn++;
00659       *rgn = neuxyz[2]; rgn++;
00660       *rgn = rr; rgn++;
00661       *rgn = neuxyz[2]/rr; rgn++;
00662       *rgn = rphi; rgn++;
00663     }
00664     //
00665     // loop over electrons
00666     //
00667     nele = Muon.GetNumElectron();
00668     for(int n=0;n<nele;n++){
00669 
00670       float electronKE = Muon.GetElectronKE(n);
00671       //cout << "  electron " << n << " KE = " << electronKE << endl;
00672 
00673       float electronE = electronKE+MELECTRON;
00674       //cout << "  electron " << n << " energy = " << electronE << endl;
00675 
00676       // pick a direction for electron momentum
00677       const int len = 2;
00678       float r[len];
00679       ranlux_(r,len);
00680       z = -1+2*r[0];
00681       phi = 2*PI*r[1];
00682       double x = sqrt(1-z*z)*cos(phi);
00683       double y = sqrt(1-z*z)*sin(phi);
00684 
00685       *pele = electronE; pele++;
00686       *pele = sqrt((electronE*electronE)-(MELECTRON*MELECTRON))*x; pele++;
00687       *pele = sqrt((electronE*electronE)-(MELECTRON*MELECTRON))*y; pele++;
00688       *pele = sqrt((electronE*electronE)-(MELECTRON*MELECTRON))*z; pele++;
00689       *pele = electronKE; pele++;
00690       *pele = sqrt(electronE*electronE-MELECTRON*MELECTRON); pele++;
00691       *pele = 3.; pele++; // muon process Id = 3
00692 
00693       double elexyz[3];
00694       for(int i=0;i<3;i++){
00695         elexyz[i] = *(Muon.GetElectronVertexXYZ()+(i+3*n));
00696         //cout << "  elexyz[" << i << "] " << elexyz[i] << endl;
00697       }
00698       double rr = sqrt(elexyz[0]*elexyz[0] + 
00699                        elexyz[1]*elexyz[1] + 
00700                        elexyz[2]*elexyz[2]);
00701       double rphi = atan2(elexyz[1],elexyz[0]);
00702       if(rphi<0) rphi += 2*PI;
00703 
00704       double time = Muon.GetElectronTime(n);
00705       //cout << " e time " << time << endl;
00706 
00707       *rele = time; rele++;
00708       *rele = elexyz[0]; rele++;
00709       *rele = elexyz[1]; rele++;
00710       *rele = elexyz[2]; rele++;
00711       *rele = rr; rele++;
00712       *rele = elexyz[2]/rr; rele++;
00713       *rele = rphi; rele++;
00714 
00715       *rge = time; rge++;
00716       *rge = elexyz[0]; rge++;
00717       *rge = elexyz[1]; rge++;
00718       *rge = elexyz[2]; rge++;
00719       *rge = rr; rge++;
00720       *rge = elexyz[2]/rr; rge++;
00721       *rge = rphi; rge++;
00722     }
00723     //
00724     // loop over photons (these are 'virtual' to contain the energy
00725     // loss of the muon and therefore are not compton scattered)
00726     //
00727     ngam = Muon.GetNumGamma();
00728     for(int n=0;n<ngam;n++){
00729 
00730       float gammaKE = Muon.GetGammaKE(n);
00731       //cout << "  gamma " << n << " energy = " << gammaKE << endl;
00732 
00733       // pick a direction for gamma momentum
00734       const int len = 2;
00735       float r[len];
00736       ranlux_(r,len);
00737       z = -1+2*r[0];
00738       phi = 2*PI*r[1];
00739       double x = sqrt(1-z*z)*cos(phi);
00740       double y = sqrt(1-z*z)*sin(phi);
00741 
00742       *pgam = gammaKE; pgam++;
00743       *pgam = gammaKE*x; pgam++;
00744       *pgam = gammaKE*y; pgam++;
00745       *pgam = gammaKE*z; pgam++;
00746       *pgam = gammaKE; pgam++;
00747       *pgam = gammaKE; pgam++;
00748       *pgam = 3.; pgam++; // muon process Id = 3
00749 
00750       double gamxyz[3];
00751       for(int i=0;i<3;i++){
00752         gamxyz[i] = *(Muon.GetGammaVertexXYZ()+(i+3*n));
00753         //cout << "  gamxyz[" << i << "] " << gamxyz[i] << endl;
00754       }
00755       double rr = sqrt(gamxyz[0]*gamxyz[0] + 
00756                        gamxyz[1]*gamxyz[1] + 
00757                        gamxyz[2]*gamxyz[2]);
00758       double rphi = atan2(gamxyz[1],gamxyz[0]);
00759       if(rphi<0) rphi += 2*PI;
00760 
00761       double time = Muon.GetGammaTime(n);
00762 
00763       *rgam = time; rgam++;
00764       *rgam = gamxyz[0]; rgam++;
00765       *rgam = gamxyz[1]; rgam++;
00766       *rgam = gamxyz[2]; rgam++;
00767       *rgam = rr; rgam++;
00768       *rgam = gamxyz[2]/rr; rgam++;
00769       *rgam = rphi; rgam++;
00770     }
00771   }
00772 
00773   // veto
00774   else if(eventType == "veto"){
00775 
00776     //cout << eventType << endl;
00777 
00778     // read in the veto file
00779     fstream fveto("data/testveto.ascii", ios::in);
00780     //cout << "setup file: data/testveto.ascii" << endl;
00781 
00782     // convert the event number to a character string
00783     int localeventsize = 0;
00784     if(Nevent < 10)
00785       localeventsize = 1;
00786     else if(Nevent > 9 && Nevent < 100)
00787       localeventsize = 2;
00788     else if(Nevent > 99 && Nevent < 1000)
00789       localeventsize = 3;
00790     else if(Nevent > 999 && Nevent < 10000)
00791       localeventsize = 4;
00792     else if(Nevent > 9999 && Nevent < 100000)
00793       localeventsize = 5;
00794     else if(Nevent > 99999 && Nevent < 1000000)
00795       localeventsize = 6;
00796     else if(Nevent > 999999 && Nevent < 10000000)
00797       localeventsize = 7;
00798     else 
00799       localeventsize = 0;
00800 
00801     char *localevent = new char[localeventsize];
00802 //    char localevent[localeventsize];
00803     sprintf(localevent,"%i",Nevent);
00804     //cout << "localevent " << localevent << endl;
00805 
00806     // counter
00807     int Npart = 0;
00808     // number of variables per particle from veto: id,x,y,z,vx,vy,vz,ke
00809     int Vdim = 8;
00810 
00811     double* VetoData = new double[Ndim*Vdim];
00812 
00813     bool edone = false;
00814     while(!edone){
00815       //
00816       // get the veto event with the matching event number
00817       //
00818       std::string vetoevent;
00819       getline(fveto,vetoevent);
00820       //cout << " vetoevent " << vetoevent << endl;
00821       //
00822       if(vetoevent == localevent){
00823 
00824         bool pdone = false;
00825         while(!pdone){
00826           //
00827           // get the particle(s) information
00828           //
00829           if(fveto.peek() == '0'){
00830             //
00831             // end of particle list
00832             //
00833             edone = true;
00834             pdone = true;
00835           }
00836           else if(fveto.peek() == ' '){
00837             //
00838             // a particle, info is: id,x,y,z,vx,vy,vz,ke
00839             //
00840             for(int i=0;i<Vdim;i++) fveto >> VetoData[i+Vdim*Npart];
00841             //
00842             // close out any remaining whitespace
00843             //
00844             std::string dummy;
00845             getline(fveto,dummy);
00846             //
00847             Npart++;
00848           }
00849         } // close loop over particles in veto event
00850       }
00851     } // close loop over veto events
00852 
00853     /*
00854     cout << Npart << " veto particle(s)" << endl;
00855     for(int n=0;n<Npart*Vdim;n++){
00856       cout << " VetoData[" << n << "] " << VetoData[n] << endl;
00857     }
00858     */
00859 
00860     //
00861     // sort particles into R and P arrays
00862     //
00863     for(int n=0;n<Npart;n++){
00864       //
00865       // PID follows the PDG Monte Carlo numbering scheme
00866       //
00867       int particleid = int(VetoData[n*Vdim]);
00868       //
00869       if(particleid == 11){
00870         //
00871         // electron
00872         //
00873         nele++;
00874 
00875         // electron KE and total E in MeV
00876         double electronKE = VetoData[n*Vdim+7]*1000.;
00877         double electronE = electronKE+MELECTRON;
00878 
00879         *pele = electronE; pele++;
00880         *pele = VetoData[n*Vdim+4]*1000.; pele++;
00881         *pele = VetoData[n*Vdim+5]*1000.; pele++;
00882         *pele = VetoData[n*Vdim+6]*1000.; pele++;
00883         *pele = electronKE; pele++;
00884         *pele = sqrt(electronE*electronE-MELECTRON*MELECTRON); pele++;
00885         *pele = 4.; pele++; // veto process Id = 4
00886 
00887         double elexyz[3];
00888         for(int i=0;i<3;i++){
00889           elexyz[i] = VetoData[n*Vdim+(i+1)];
00890           //cout << "  elexyz[" << i << "] " << elexyz[i] << endl;
00891         }
00892         double rr = sqrt(elexyz[0]*elexyz[0] + 
00893                          elexyz[1]*elexyz[1] + 
00894                          elexyz[2]*elexyz[2]);
00895         double rphi = atan2(elexyz[1],elexyz[0]);
00896         if(rphi<0) rphi += 2*PI;
00897         
00898         double time = 0.;
00899 
00900         *rele = time; rele++;
00901         *rele = elexyz[0]; rele++;
00902         *rele = elexyz[1]; rele++;
00903         *rele = elexyz[2]; rele++;
00904         *rele = rr; rele++;
00905         *rele = elexyz[2]/rr; rele++;
00906         *rele = rphi; rele++;
00907 
00908         *rge = time; rge++;
00909         *rge = elexyz[0]; rge++;
00910         *rge = elexyz[1]; rge++;
00911         *rge = elexyz[2]; rge++;
00912         *rge = rr; rge++;
00913         *rge = elexyz[2]/rr; rge++;
00914         *rge = rphi; rge++;
00915       }
00916       else if(particleid == -11){
00917         //
00918         // positron
00919         //
00920         npos++;
00921 
00922         // positron KE and total E in MeV
00923         double positronKE = VetoData[n*Vdim+7]*1000.;
00924         double positronE = positronKE+MELECTRON;
00925 
00926         *ppos = positronE; ppos++;
00927         *ppos = VetoData[n*Vdim+4]*1000.; ppos++;
00928         *ppos = VetoData[n*Vdim+5]*1000.; ppos++;
00929         *ppos = VetoData[n*Vdim+6]*1000.; ppos++;
00930         *ppos = positronKE; ppos++;
00931         *ppos = sqrt(positronE*positronE-MELECTRON*MELECTRON); ppos++;
00932         *ppos = 4.; ppos++; // veto process Id = 4
00933 
00934         double posxyz[3];
00935         for(int i=0;i<3;i++){
00936           posxyz[i] = VetoData[n*Vdim+(i+1)];
00937           //cout << "  posxyz[" << i << "] " << posxyz[i] << endl;
00938         }
00939         double rr = sqrt(posxyz[0]*posxyz[0] + 
00940                          posxyz[1]*posxyz[1] + 
00941                          posxyz[2]*posxyz[2]);
00942         double rphi = atan2(posxyz[1],posxyz[0]);
00943         if(rphi<0) rphi += 2*PI;
00944         
00945         double time = 0.;
00946 
00947         *rpos = time; rpos++;
00948         *rpos = posxyz[0]; rpos++;
00949         *rpos = posxyz[1]; rpos++;
00950         *rpos = posxyz[2]; rpos++;
00951         *rpos = rr; rpos++;
00952         *rpos = posxyz[2]/rr; rpos++;
00953         *rpos = rphi; rpos++;
00954 
00955         *rgp = time; rgp++;
00956         *rgp = posxyz[0]; rgp++;
00957         *rgp = posxyz[1]; rgp++;
00958         *rgp = posxyz[2]; rgp++;
00959         *rgp = rr; rgp++;
00960         *rgp = posxyz[2]/rr; rgp++;
00961         *rgp = rphi; rgp++;
00962       }
00963       else if(particleid == 13){
00964         //
00965         // muon
00966         //
00967 
00968         // muon KE in MeV
00969         double muonKE = VetoData[n*Vdim+7]*1000.;
00970         double x = VetoData[n*Vdim+1];
00971         double y = VetoData[n*Vdim+2];
00972         double z = VetoData[n*Vdim+3];
00973         double px = VetoData[n*Vdim+4];
00974         double py = VetoData[n*Vdim+5];
00975         double pz = VetoData[n*Vdim+6];
00976 
00977         MuonPropagator Muon(0,Rmaxgen_RE,muonKE,x,y,z,px,py,pz);
00978 
00979         // loop over photons (these are 'virtual' to contain the energy
00980         // loss of the muon and therefore are not compton scattered)
00981         //
00982         ngam = Muon.GetNumGamma();
00983         for(int n=0;n<ngam;n++){
00984 
00985           float gammaKE = Muon.GetGammaKE(n);
00986           //cout << "  gamma " << n << " energy = " << gammaKE << endl;
00987 
00988           // pick a direction for gamma momentum
00989           const int len = 2;
00990           float r[len];
00991           ranlux_(r,len);
00992           z = -1+2*r[0];
00993           phi = 2*PI*r[1];
00994           double x = sqrt(1-z*z)*cos(phi);
00995           double y = sqrt(1-z*z)*sin(phi);
00996 
00997           *pgam = gammaKE; pgam++;
00998           *pgam = gammaKE*x; pgam++;
00999           *pgam = gammaKE*y; pgam++;
01000           *pgam = gammaKE*z; pgam++;
01001           *pgam = gammaKE; pgam++;
01002           *pgam = gammaKE; pgam++;
01003           *pgam = 4.; pgam++; // veto process Id = 4
01004 
01005           double gamxyz[3];
01006           for(int i=0;i<3;i++){
01007             gamxyz[i] = *(Muon.GetGammaVertexXYZ()+(i+3*n));
01008             //cout << "  gamxyz[" << i << "] " << gamxyz[i] << endl;
01009           }
01010           double rr = sqrt(gamxyz[0]*gamxyz[0] + 
01011                            gamxyz[1]*gamxyz[1] + 
01012                            gamxyz[2]*gamxyz[2]);
01013           double rphi = atan2(gamxyz[1],gamxyz[0]);
01014           if(rphi<0) rphi += 2*PI;
01015 
01016           double time = Muon.GetGammaTime(n);
01017 
01018           *rgam = time; rgam++;
01019           *rgam = gamxyz[0]; rgam++;
01020           *rgam = gamxyz[1]; rgam++;
01021           *rgam = gamxyz[2]; rgam++;
01022           *rgam = rr; rgam++;
01023           *rgam = gamxyz[2]/rr; rgam++;
01024           *rgam = rphi; rgam++;
01025         }
01026       }
01027       else if(particleid == 2112){
01028         //
01029         // neutron
01030         //
01031         nneu++;
01032 
01033         // neutron KE and total E in MeV
01034         double neutronKE = VetoData[n*Vdim+7]*1000.;
01035         double Mneutron = MPROTON+DELTA;
01036         double neutronE = neutronKE+Mneutron;
01037 
01038         *pneu = neutronE; pneu++;
01039         *pneu = VetoData[n*Vdim+4]*1000.; pneu++;
01040         *pneu = VetoData[n*Vdim+5]*1000.; pneu++;
01041         *pneu = VetoData[n*Vdim+6]*1000.; pneu++;
01042         *pneu = neutronKE; pneu++;
01043         *pneu = sqrt(neutronE*neutronE-Mneutron*Mneutron); pneu++;
01044         *pneu = 4.; pneu++; // veto process Id = 4
01045 
01046         double neuxyz[3];
01047         for(int i=0;i<3;i++){
01048           neuxyz[i] = VetoData[n*Vdim+(i+1)];
01049           //cout << "  neuxyz[" << i << "] " << neuxyz[i] << endl;
01050         }
01051         double rr = sqrt(neuxyz[0]*neuxyz[0] + 
01052                          neuxyz[1]*neuxyz[1] + 
01053                          neuxyz[2]*neuxyz[2]);
01054         double rphi = atan2(neuxyz[1],neuxyz[0]);
01055         if(rphi<0) rphi += 2*PI;
01056         
01057         double time = 0.;
01058 
01059         *rneu = time; rneu++;
01060         *rneu = neuxyz[0]; rneu++;
01061         *rneu = neuxyz[1]; rneu++;
01062         *rneu = neuxyz[2]; rneu++;
01063         *rneu = rr; rneu++;
01064         *rneu = neuxyz[2]/rr; rneu++;
01065         *rneu = rphi; rneu++;
01066 
01067         *rgn = time; rgn++;
01068         *rgn = neuxyz[0]; rgn++;
01069         *rgn = neuxyz[1]; rgn++;
01070         *rgn = neuxyz[2]; rgn++;
01071         *rgn = rr; rgn++;
01072         *rgn = neuxyz[2]/rr; rgn++;
01073         *rgn = rphi; rgn++;
01074       }
01075       else{
01076         cout << "ERROR: unknown particle ID from veto: " << particleid << endl;
01077       }
01078     } // end loop over particles
01079     delete[] localevent;
01080   }
01081   else{
01082     cout << "ERROR: unknown event type: " << eventType << endl;
01083   }
01084   //
01085   // transfer temp data to storage
01086   //
01087   Nnubar    = nnu;
01088   Nelectron = nele;
01089   Npositron = npos;
01090   Nneutron  = nneu;
01091   Ngamma    = ngam;
01092 
01093   Pnubar    = new double[Pdim*nnu];
01094   Pelectron = new double[Pdim*nele];
01095   Ppositron = new double[Pdim*npos];
01096   Pneutron  = new double[Pdim*nneu];
01097   Pgamma    = new double[Pdim*ngam];
01098 
01099   Rnubar    = new double[Rdim*nnu];
01100   Relectron = new double[Rdim*nele];
01101   Rgenele   = new double[Rdim*nele];
01102   Rpositron = new double[Rdim*npos];
01103   Rgenpos   = new double[Rdim*npos];
01104   Rneutron  = new double[Rdim*nneu];
01105   Rgenneu   = new double[Rdim*nneu];
01106   Rgamma    = new double[Rdim*ngam];
01107 
01108   double* ptr;
01109 
01110   ptr = Pnubar+Pdim*Nnubar;
01111   while(ptr>Pnubar)*--ptr=*--pnu;
01112 
01113   ptr = Pelectron+Pdim*Nelectron;
01114   while(ptr>Pelectron)*--ptr=*--pele;
01115 
01116   ptr = Ppositron+Pdim*Npositron;
01117   while(ptr>Ppositron)*--ptr=*--ppos;
01118 
01119   ptr = Pneutron+Pdim*Nneutron;
01120   while(ptr>Pneutron)*--ptr=*--pneu;
01121 
01122   ptr = Pgamma+Pdim*Ngamma;
01123   while(ptr>Pgamma)*--ptr=*--pgam;
01124 
01125   ptr = Rnubar+Rdim*Nnubar;
01126   while(ptr>Rnubar)*--ptr=*--rnu;
01127 
01128   ptr = Relectron+Rdim*Nelectron;
01129   while(ptr>Relectron)*--ptr=*--rele;
01130 
01131   ptr = Rgenele+Rdim*Nelectron;
01132   while(ptr>Rgenele)*--ptr=*--rge;
01133 
01134   ptr = Rpositron+Rdim*Npositron;
01135   while(ptr>Rpositron)*--ptr=*--rpos;
01136 
01137   ptr = Rgenpos+Rdim*Npositron;
01138   while(ptr>Rgenpos)*--ptr=*--rgp;
01139 
01140   ptr = Rneutron+Rdim*Nneutron;
01141   while(ptr>Rneutron)*--ptr=*--rneu;
01142 
01143   ptr = Rgenneu+Rdim*Nneutron;
01144   while(ptr>Rgenneu)*--ptr=*--rgn;
01145 
01146   ptr = Rgamma+Rdim*Ngamma;
01147   while(ptr>Rgamma)*--ptr=*--rgam;
01148 
01149   /*
01150   cout << Nnubar << " nubar(s):" << endl;
01151   for(int i=0;i<Nnubar*Pdim;i++){
01152     cout << " Pnubar[" << i << "] " << Pnubar[i] << endl;
01153   }
01154   for(int i=0;i<Nnubar*Rdim;i++){
01155     cout << "  Rnubar[" << i << "] " << Rnubar[i] << endl;
01156   }
01157 
01158   cout << Nelectron << " electron(s):" << endl;
01159   for(int i=0;i<Nelectron*Pdim;i++){
01160     cout << " Pelectron[" << i << "] " << Pelectron[i] << endl;
01161   }
01162   for(int i=0;i<Nelectron*Rdim;i++){
01163     cout << "  Relectron[" << i << "] " << Relectron[i] << endl;
01164   }
01165   for(int i=0;i<Nelectron*Rdim;i++){
01166     cout << "  Rgenele[" << i << "] " << Rgenele[i] << endl;
01167   }
01168 
01169   cout << Npositron << " positron(s):" << endl;
01170   for(int i=0;i<Npositron*Pdim;i++){
01171     cout << " Ppositron[" << i << "] " << Ppositron[i] << endl;
01172   }
01173   for(int i=0;i<Npositron*Rdim;i++){
01174     cout << "  Rpositron[" << i << "] " << Rpositron[i] << endl;
01175   }
01176   for(int i=0;i<Npositron*Rdim;i++){
01177     cout << "  Rgenpos[" << i << "] " << Rgenpos[i] << endl;
01178   }
01179 
01180   cout << Nneutron << " neutron(s):" << endl;
01181   for(int i=0;i<Nneutron*Pdim;i++){
01182     cout << " Pneutron[" << i << "] " << Pneutron[i] << endl;
01183   }
01184   for(int i=0;i<Nneutron*Rdim;i++){
01185     cout << "  Rneutron[" << i << "] " << Rneutron[i] << endl;
01186   }
01187   for(int i=0;i<Nneutron*Rdim;i++){
01188     cout << "  Rgenneu[" << i << "] " << Rgenneu[i] << endl;
01189   }
01190 
01191   cout << Ngamma << " photon(s):" << endl;
01192   for(int i=0;i<Ngamma*Pdim;i++){
01193     cout << " Pgamma[" << i << "] " << Pgamma[i] << endl;
01194   }
01195   for(int i=0;i<Ngamma*Rdim;i++){
01196     cout << "  Rgamma[" << i << "] " << Rgamma[i] << endl;
01197   }
01198   */
01199 
01200   // clean up
01201   delete[] pnubar;
01202   delete[] pelectron;
01203   delete[] ppositron;
01204   delete[] pneutron;
01205   delete[] pgamma;
01206   delete[] rnubar;
01207   delete[] relectron;
01208   delete[] rgenele;
01209   delete[] rpositron;
01210   delete[] rgenpos;
01211   delete[] rneutron;
01212   delete[] rgenneu;
01213   delete[] rgamma;
01214 }


Member Function Documentation

double ReactorEvent::GetElectronKE int &    n const [inline]
 

Returns the energy of each electron produced in the event.

Called with the integer index for each electron in the Pelectron array, from 0 to the total number of electrons.

Definition at line 101 of file ReactorEvent.hh.

00101 {return Pelectron[4+n*Pdim];}

double ReactorEvent::GetElectronParentProcess int &    n const [inline]
 

Returns the parent process used to generate each electron in the event.

Called with the integer index for each electron in the Pelectron array, from 0 to the total number of electrons.

Definition at line 108 of file ReactorEvent.hh.

00108 {return Pelectron[6+n*Pdim];}

double ReactorEvent::GetEnu int &    n const [inline]
 

Returns the energy of each anti-neutrino produced in the event.

Called with the integer index for each anti-neutrino in the Pnubar array, from 0 to the total number of anti-neutrinos.

Definition at line 90 of file ReactorEvent.hh.

00090 {return Pnubar[0+n*Pdim];}

double ReactorEvent::GetGammaKE int &    n const [inline]
 

Returns the energy of each photon produced in the event.

Called with the integer index for each photon in the Pgamma array, from 0 to the total number of photons.

Definition at line 143 of file ReactorEvent.hh.

00143 {return Pgamma[0+n*Pdim];}

double ReactorEvent::GetGammaParentProcess int &    n const [inline]
 

Returns the parent process used to generate each photon in the event.

Called with the integer index for each photon in the Pgamma array, from 0 to the total number of photons.

Definition at line 148 of file ReactorEvent.hh.

00148 {return Pgamma[6+n*Pdim];}

double ReactorEvent::GetNeutronKE int &    n const [inline]
 

Returns the energy of each neutron produced in the event.

Called with the integer index for each neutron in the Pneutron array, from 0 to the total number of neutrons.

Definition at line 129 of file ReactorEvent.hh.

00129 {return Pneutron[4+n*Pdim];}

double ReactorEvent::GetNeutronParentProcess int &    n const [inline]
 

Returns the parent process used to generate each neutron in the event.

Called with the integer index for each neutron in the Pneutron array, from 0 to the total number of neutrons.

Definition at line 136 of file ReactorEvent.hh.

00136 {return Pneutron[6+n*Pdim];}

double ReactorEvent::GetNubarParentProcess int &    n const [inline]
 

Returns the parent process used to generate each anti-neutrino in the event.

Called with the integer index for each anti-neutrino in the Pnubar array, from 0 to the total number of anti-neutrinos.

Definition at line 95 of file ReactorEvent.hh.

00095 {return Pnubar[6+n*Pdim];}

double ReactorEvent::GetPositronKE int &    n const [inline]
 

Returns the energy of each positron produced in the event.

Called with the integer index for each positron in the Ppositron array, from 0 to the total number of positrons.

Definition at line 115 of file ReactorEvent.hh.

00115 {return Ppositron[4+n*Pdim];}

double ReactorEvent::GetPositronParentProcess int &    n const [inline]
 

Returns the parent process used to generate each positron in the event.

Called with the integer index for each positron in the Ppositron array, from 0 to the total number of positrons.

Definition at line 122 of file ReactorEvent.hh.

00122 {return Ppositron[6+n*Pdim];}


The documentation for this class was generated from the following files:
Generated on Mon Feb 21 16:11:20 2005 for ReactorFsim by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002