From dfb1b8faeca8b03a7130deafefaadbca8911b613 Mon Sep 17 00:00:00 2001 From: xxiang4 Date: Tue, 24 Mar 2020 16:47:06 -0400 Subject: [PATCH 01/18] update to the most recent NEST, which is default to LUX Run3 Detector. --- src/nestpy/LUX_Run03.hh | 204 ++++++++++ src/nestpy/NEST.cpp | 750 +++++++++++++++++++++++-------------- src/nestpy/NEST.hh | 58 ++- src/nestpy/RandomGen.cpp | 2 +- src/nestpy/TestSpectra.cpp | 70 ++-- src/nestpy/TestSpectra.hh | 6 +- src/nestpy/VDetector.cpp | 49 --- src/nestpy/VDetector.hh | 88 ++++- src/nestpy/analysis.hh | 31 +- src/nestpy/bindings.cpp | 68 +++- src/nestpy/testNEST.cpp | 164 +++++--- src/nestpy/testNEST.hh | 8 +- 12 files changed, 1020 insertions(+), 478 deletions(-) create mode 100644 src/nestpy/LUX_Run03.hh diff --git a/src/nestpy/LUX_Run03.hh b/src/nestpy/LUX_Run03.hh new file mode 100644 index 0000000..a459d58 --- /dev/null +++ b/src/nestpy/LUX_Run03.hh @@ -0,0 +1,204 @@ + +#ifndef DetectorExample_LUX_RUN03_hh +#define DetectorExample_LUX_RUN03_hh 1 + +#include "VDetector.hh" +using namespace std; + +class DetectorExample_LUX_RUN03: public VDetector { + +public: + + DetectorExample_LUX_RUN03() { + cerr << "*** Detector definition message ***" << endl; + cerr << "You are currently using the LUX Run03 template detector." << endl << endl; + + // Call the initialization of all the parameters + Initialization(); + }; + virtual ~DetectorExample_LUX_RUN03() {}; + + // Do here the initialization of all the parameters that are not varying as a function of time + virtual void Initialization() { + + // Primary Scintillation (S1) parameters + g1 = 0.1180; //0.117+/-0.003 WS,0.115+/-0.005 D-D,0.115+/-0.005 CH3T,0.119+/-0.001 LUXSim + sPEres = 0.37; //arXiv:1910.04211 + sPEthr = (0.3*1.173)/0.915; //arXiv:1910.04211 + sPEeff = 1.00; //arXiv:1910.04211 + noiseB[0] =-0.01; //arXiv:1910.04211 + noiseB[1] = 0.08; //arXiv:1910.04211 + noiseB[2] = 0.; + noiseB[3] = 0.; + P_dphe = 0.173; //arXiv:1910.04211 + + coinWind= 100;// 1310.8214 + coinLevel=2; //1512.03506 + numPMTs = 119;// 122 minus 3 off + + extraPhot =false; //default + noiseL[0]=1.4e-2; //1910.04211 p.12, to match 1610.02076 Fig. 8 + noiseL[1]=1.3e-2; //1910.04211 p.12, to match 1610.02076 Fig. 8 + + // Ionization and Secondary Scintillation (S2) parameters + g1_gas = 0.1022; //0.1 in 1910.04211 + s2Fano = 3.4; //3.7 in 1910.04211; this matches 1608.05381 better + s2_thr = 128.;//(150.*1.173)/0.915; //65-194 pe in 1608.05381 + E_gas = 6.25; //6.55 in 1910.04211 + eLife_us = 650.; //p.44 of James Verbus PhD thesis Brown + + // Thermodynamic Properties + inGas = false; //duh + T_Kelvin = 173.; //1910.04211 + p_bar = 1.57; //1910.04211 + + // Data Analysis Parameters and Geometry + dtCntr = 160.; //p.61 Dobi thesis UMD, 159 in 1708.02566 + dt_min = 80.; //1608.05381 + dt_max = 130.; //1608.05381 + + radius = 200.; //1512.03506 + radmax = 235.; //1910.04211 + + TopDrift = 544.95; //544.95 in 1910.04211 + anode = 549.2; //1910.04211 and 549 in 1708.02566 + gate = 539.2; //1910.04211 and 539 in 1708.02566 + cathode = 55.90; //55.9-56 in 1910.04211,1708.02566 + + // 2-D (X & Y) Position Reconstruction + PosResExp = 0.015; //arXiv:1710.02752 indirectly + PosResBase = 70.8364; //1710.02752 indirectly + } + + // S1 PDE custom fit for function of xyz + // 1712.05696 indirectly, 1708.02566 Figure 10 color map + virtual double FitS1 ( double xPos_mm, double yPos_mm, double zPos_mm ) { + + double radius = sqrt(pow(xPos_mm,2.)+pow(yPos_mm,2.)); + double amplitude = 307.9-0.3071*zPos_mm+0.0002257*pow(zPos_mm,2.); + double shape = 1.1525e-7*sqrt(fabs(zPos_mm-318.84)); + return -shape * pow ( radius, 3. ) + amplitude; + + } + + // Drift electric field as function of Z in mm + // 1709.00095, 1904.08979, 1708.02566 Fig. 13 + virtual double FitEF ( double xPos_mm, double yPos_mm, double zPos_mm ) { // in V/cm + + return 158.92 + -0.2209000 *pow(zPos_mm,1.) + +0.0024485 *pow(zPos_mm,2.) + -8.7098e-6 *pow(zPos_mm,3.) + +1.5049e-8 *pow(zPos_mm,4.) + -1.0110e-11*pow(zPos_mm,5.); + + } + + // S2 PDE custom fit for function of r + // 1712.05696 & 1710.02752 indirectly. Fig. 13 1708.02566 + virtual double FitS2 ( double xPos_mm, double yPos_mm ) { + + double radius = sqrt(pow(xPos_mm,2.)+pow(yPos_mm,2.)); + + return // unitless, 1.000 at detector center + 9156.3 + +6.22750*pow(radius,1.) + +0.38126*pow(radius,2.) + -0.017144*pow(radius,3.)+ + 0.0002474*pow(radius,4.)- + 1.6953e-6*pow(radius,5.)+ + 5.6513e-9*pow(radius,6.) + -7.3989e-12*pow(radius,7.); + + } + + virtual vector FitTBA(double xPos_mm, double yPos_mm, + double zPos_mm) { + vector BotTotRat(2); + + BotTotRat[0] = 0.650; // 1712.05696 + BotTotRat[1] = 0.449; // 1712.05696 and 1710.02752 + // position recon (1-this) + + return BotTotRat; + } + + virtual double OptTrans ( double xPos_mm, double yPos_mm, double zPos_mm ) { + + double phoTravT, approxCenter = ( TopDrift + cathode ) / 2., relativeZ = zPos_mm - approxCenter; + + double A = 0.048467 - 7.6386e-6 * relativeZ + 1.2016e-6 * pow ( relativeZ, 2. ) - 6.0833e-9 * pow ( relativeZ, 3. ); + if ( A < 0. ) A = 0.; //cannot have negative probability + double B_a =0.99373 + 0.0010309 * relativeZ - 2.5788e-6 * pow ( relativeZ, 2. ) - 1.2000e-8 * pow ( relativeZ, 3. ); + double B_b = 1. - B_a; + double tau_a = 11.15; //all times in nanoseconds + double tau_b = 4.5093 + 0.03437 * relativeZ -0.00018406 * pow ( relativeZ, 2. ) - 1.6383e-6 * pow ( relativeZ, 3. ); + if ( tau_b < 0. ) tau_b = 0.; //cannot have negative time + + A = 0.0574; B_a = 1.062; tau_a = 11.1; tau_b = 2.70; B_b = 1.0 - B_a; //LUX D-D conditions + + if ( RandomGen::rndm()->rand_uniform() < A ) + phoTravT = 0.; //direct travel time to PMTs (low) + else { //using P0(t) = A*delta(t)+(1-A)*[(B_a/tau_a)e^(-t/tau_a)+(B_b/tau_b)e^(-t/tau_b)] LUX PSD paper, but should apply to all detectors w/ diff #'s + if ( RandomGen::rndm()->rand_uniform() < B_a ) + phoTravT = -tau_a * log ( RandomGen::rndm()->rand_uniform() ); + else + phoTravT = -tau_b * log ( RandomGen::rndm()->rand_uniform() ); + } + + double sig= RandomGen::rndm()->rand_gauss(3.84,.09); //includes stat unc but not syst + phoTravT += RandomGen::rndm()->rand_gauss(0.00,sig); //the overall width added to photon time spectra by the effects in the electronics and the data reduction pipeline + + if ( phoTravT > DBL_MAX ) phoTravT = tau_a; + if ( phoTravT <-DBL_MAX ) phoTravT = 0.000; + + return phoTravT; //this function follows LUX (arXiv:1802.06162) + } + + virtual vector SinglePEWaveForm ( double area, double t0 ) { + + vector PEperBin; + + double threshold = PULSEHEIGHT; //photo-electrons + double sigma = PULSE_WIDTH; //ns + area *= 10. * ( 1. + threshold ); + double amplitude = area / ( sigma * sqrt ( 2. * M_PI ) ), signal; //assumes perfect Gaussian + + double tStep1 = SAMPLE_SIZE/1e2; //ns, make sure much smaller than sample size; used to generate MC-true pulses essentially + double tStep2 = SAMPLE_SIZE; //ns; 1 over digitization rate, 100 MHz assumed here + + double time = -5.*sigma; + bool digitizeMe = false; + while ( true ) { + signal = amplitude * exp(-pow(time,2.)/(2.*sigma*sigma)); + if ( signal < threshold ) { + if ( digitizeMe ) break; + else ; //do nothing - goes down to advancing time block + } + else { + if ( digitizeMe ) + PEperBin.push_back(signal); + else { + if ( RandomGen::rndm()->rand_uniform() < 2.*(tStep1/tStep2) ) { + PEperBin.push_back(time+t0); + PEperBin.push_back(signal); + digitizeMe = true; + } + else {} + } + } + if ( digitizeMe ) time += tStep2; + else time += tStep1; + if ( time > 5.*sigma ) break; + } + + return PEperBin; + + } + + // Vary VDetector parameters through custom functions + virtual void ExampleFunction() { set_g1(0.1167); } + virtual void ExampleFunction2() { set_molarMass(131.); } +}; + +#endif diff --git a/src/nestpy/NEST.cpp b/src/nestpy/NEST.cpp index 772e639..dfe066b 100644 --- a/src/nestpy/NEST.cpp +++ b/src/nestpy/NEST.cpp @@ -1,10 +1,13 @@ #include "NEST.hh" +#define InfraredER 1.35 +#define InfraredNR 7.00 + using namespace std; using namespace NEST; -const std::vector NESTcalc::default_NuisParam = {11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.}; +const std::vector NESTcalc::default_NuisParam = {11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.}; const std::vector NESTcalc::default_FreeParam = {1.,1.,0.1,0.5,0.07}; long NESTcalc::BinomFluct(long N0, double prob) { @@ -15,7 +18,8 @@ long NESTcalc::BinomFluct(long N0, double prob) { if (prob <= 0.00) return N1; if (prob >= 1.00) return N0; - if (N0 < 10) { + if ( N0 < 5 || fabs(1.-2.*prob)/sqrt(N0*prob*(1.-prob)) > (1./3.) ) { + //https://en.wikipedia.org/wiki/Binomial_distribution#Normal_approximation for (int i = 0; i < N0; i++) { if (RandomGen::rndm()->rand_uniform() < prob) N1++; } @@ -32,7 +36,7 @@ long NESTcalc::BinomFluct(long N0, double prob) { NESTresult NESTcalc::FullCalculation(INTERACTION_TYPE species, double energy, double density, double dfield, double A, double Z, - vector NuisParam /*={11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.}*/, + vector NuisParam /*={11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.}*/, vector FreeParam /*={1.,1.,0.1,0.5,0.07}*/, bool do_times /*=true*/) { NESTresult result; @@ -49,7 +53,7 @@ NESTresult NESTcalc::FullCalculation(INTERACTION_TYPE species, double energy, double NESTcalc::PhotonTime(INTERACTION_TYPE species, bool exciton, double dfield, double energy) { double time_ns = 0., SingTripRatio, tauR = 0., tau3 = 23.97, - tau1 = 3.27; // arXiv:1802.06162 + tau1 = 3.27; //arXiv:1802.06162. NR may need tauR ~0.5-1ns instead of 0 if (fdetector->get_inGas() || energy < W_DEFAULT * 0.001) { // from G4S1Light.cc in old NEST tau1 = 5.18; // uncertainty of 1.55 ns from G4S2Light @@ -59,7 +63,7 @@ double NESTcalc::PhotonTime(INTERACTION_TYPE species, bool exciton, // Here assuming same as in liquid if (species <= Cf) // NR - SingTripRatio = 0.15 * pow(energy, 0.15); // arXiv:1802.06162 + SingTripRatio = (0.21-0.0001*dfield) * pow(energy, 0.21-0.0001*dfield ); //arXiv:1803.07935. LUX:0.15*E^0.15 else if (species == ion) // e.g., alphas SingTripRatio = 0.065 * @@ -67,19 +71,19 @@ double NESTcalc::PhotonTime(INTERACTION_TYPE species, bool exciton, 0.416); // spans 2.3 (alpha) and 7.8 (Cf in Xe) from NEST v1 else { // ER if (!exciton) { - tauR = 0.5 * exp(-0.00900 * dfield) * - (7.3138 + 3.8431 * log10(energy)); // arXiv:1310.1117 - SingTripRatio = 0.069 * pow(energy, -0.12); // see comment below + tauR = exp(-0.00900 * dfield) * + (7.3138 + 3.8431 * log10(energy)); // arXiv:1310.1117 + if ( tauR < 3.5 && species == gammaRay ) tauR = 3.5; + if ( dfield > 8e2 ) dfield = 8e2; //to match Kubota's 4,000 V/cm + SingTripRatio = 1.00 * pow(energy, -0.45+0.0005*dfield); // see comment below; also, dfield may need to be fixed at ~100-200 V/cm (for NR too) } else - SingTripRatio = - 0.015 * - pow(energy, -0.12); // mixing arXiv:1802.06162 with Kubota 1979 + SingTripRatio = 0.20 * pow(energy, -0.45+0.0005*dfield); // mixing arXiv:1807.07121 with Kubota 1979 } - + if (fdetector->get_inGas() || energy < W_DEFAULT * 0.001) { SingTripRatio = 0.1; tauR = 0.; - } + } if ( tauR < 0. ) tauR = 0.; //in case varied with Gaussian earlier // the recombination time is non-exponential, but approximates // to exp at long timescales (see Kubota '79) @@ -119,38 +123,75 @@ photonstream NESTcalc::GetPhotonTimes(INTERACTION_TYPE species, return return_photons; } +double NESTcalc::RecombOmegaNR(double elecFrac,vector FreeParam/*={1.,1.,0.1,0.5,0.07}*/) +{ + double omega = FreeParam[2] * exp(-pow(elecFrac - FreeParam[3], 2.) / FreeParam[4]); + if ( omega < 0. ) + omega = 0; + return omega; +} + +double NESTcalc::RecombOmegaER(double efield, double elecFrac) +{ + double cc = 0.14+(0.043-0.14)/(1.+pow(efield/1210.,1.25)); + if ( cc < 0. ) + cc = 0.; + double aa = 0.205; + double bb = 0.41; + double omega = cc*0.988*exp(-0.5*pow(elecFrac-bb,2.)/(aa*aa))*(1.+erf(-0.2*(elecFrac-bb)/(aa*sqrt(2.)))); + if ( omega < 0. ) + omega = 0; + return omega; +} + +double NESTcalc::FanoER(double density, double Nq_mean,double efield) +{ + double Fano = 0.12707 - 0.029623 * density - // Fano factor is << 1 + 0.0057042 * + pow(density, + 2.) + //~0.1 for GXe w/ formula from Bolotnikov et al. 1995 + 0.0015957 * + pow(density, + 3.); // to get it to be ~0.03 for LXe (E Dahl Ph.D. thesis) + if (!fdetector->get_inGas()) + Fano += 0.0015 * sqrt(Nq_mean) * pow(efield, 0.5); + return Fano; +} + + QuantaResult NESTcalc::GetQuanta(YieldResult yields, double density, vector FreeParam/*={1.,1.,0.1,0.5,0.07}*/) { QuantaResult result; bool HighE; int Nq_actual, Ne, Nph, Ni, Nex; - - double NexONi = yields.ExcitonRatio, Fano = 1.; + + if ( FreeParam.size() < 5 ) { + cerr << "\nERROR: You need a minimum of 5 free parameters for the resolution model.\n"; + exit(EXIT_FAILURE); + } + + double excitonRatio = yields.ExcitonRatio; double Nq_mean = yields.PhotonYield + yields.ElectronYield; double elecFrac = yields.ElectronYield / Nq_mean; if (elecFrac > 1.) elecFrac = 1.; if (elecFrac < 0.) elecFrac = 0.; - if (NexONi < 0.) { - NexONi = 0.; + if (excitonRatio < 0.) { + excitonRatio = 0.; HighE = true; - } else + } else{ HighE = false; - double alf = 1. / (1. + NexONi); - double recombProb = 1. - (NexONi + 1.) * elecFrac; - if (recombProb < 0.) NexONi = 1. / elecFrac - 1.; + } + + double alf = 1. / (1. + excitonRatio); + double recombProb = 1. - (excitonRatio + 1.) * elecFrac; + if (recombProb < 0.){ + excitonRatio = 1. / elecFrac - 1.; + } if (yields.Lindhard == 1.) { - Fano = 0.12707 - 0.029623 * density - // Fano factor is << 1 - 0.0057042 * - pow(density, - 2.) + //~0.1 for GXe w/ formula from Bolotnikov et al. 1995 - 0.0015957 * - pow(density, - 3.); // to get it to be ~0.03 for LXe (E Dahl Ph.D. thesis) - if (!fdetector->get_inGas()) - Fano += 0.0015 * sqrt(Nq_mean) * pow(yields.ElectricField, 0.5); + double Fano = FanoER(density,Nq_mean,yields.ElectricField); Nq_actual = int(floor( RandomGen::rndm()->rand_gauss(Nq_mean, sqrt(Fano * Nq_mean)) + 0.5)); if (Nq_actual < 0 || Nq_mean == 0.) Nq_actual = 0; @@ -161,7 +202,7 @@ QuantaResult NESTcalc::GetQuanta(YieldResult yields, double density, } else { - Fano = FreeParam[0]; + double Fano = FreeParam[0]; Ni = int(floor(RandomGen::rndm()->rand_gauss(Nq_mean * alf, sqrt(Fano * Nq_mean * alf)) + 0.5)); @@ -169,7 +210,7 @@ QuantaResult NESTcalc::GetQuanta(YieldResult yields, double density, Fano = FreeParam[1]; Nex = int( floor(RandomGen::rndm()->rand_gauss( - Nq_mean * NexONi * alf, sqrt(Fano * Nq_mean * NexONi * alf)) + + Nq_mean * excitonRatio * alf, sqrt(Fano * Nq_mean * excitonRatio * alf)) + 0.5)); if (Nex < 0) Nex = 0; Nq_actual = Nex + Ni; @@ -180,6 +221,8 @@ QuantaResult NESTcalc::GetQuanta(YieldResult yields, double density, result.excitons = 0; result.photons = 0; result.electrons = 0; + result.Variance=0; + result.recombProb=0; return result; } @@ -191,30 +234,29 @@ QuantaResult NESTcalc::GetQuanta(YieldResult yields, double density, result.ions = Ni; result.excitons = Nex; - if (Nex <= 0 && HighE) recombProb = yields.PhotonYield / double(Ni); + if (Nex <= 0 && HighE) + recombProb = yields.PhotonYield / double(Ni); if (recombProb < 0.) recombProb = 0.; if (recombProb > 1.) recombProb = 1.; if (std::isnan(recombProb) || std::isnan(elecFrac) || Ni == 0 || - recombProb == 0.0) { - recombProb = 0.0; - elecFrac = 1.0; + recombProb == 0.0) { + if ( fdetector->get_extraPhot() ) + { + if ( yields.Lindhard != 1. ) + Nph = int(floor(double(Nph)*InfraredNR + 0.5)); //IR photons for NR + else + Nph = int(floor(double(Nph)*InfraredER + 0.5)); //EXO + } result.photons = Nex; - result.electrons = Ni; + result.electrons =Ni; + elecFrac= 1.0; + result.recombProb=0.; + result.Variance = 0.; return result; } - double ef = yields.ElectricField; - double cc = - 0.075351 + - (0.050461 - 0.075351) / pow(1. + pow(ef / 30057., 3.0008), 2.9832e5); - if (cc < 0.) cc = 0.; - double bb = 0.54; - double aa = cc / pow(1. - bb, 2.); - double omega = -aa * pow(recombProb - bb, 2.) + cc; - if (omega < 0.0) omega = 0.0; - - if (yields.Lindhard < 1.) - omega = FreeParam[2] * exp(-pow(elecFrac - FreeParam[3], 2.) / FreeParam[4]); + //set omega (non-binomial recombination fluctuations parameter) according to whether the Lindhard <1, i.e. this is an NR. + double omega = yields.Lindhard <1 ? RecombOmegaNR(elecFrac, FreeParam) : RecombOmegaER(yields.ElectricField, elecFrac); double Variance = recombProb * (1. - recombProb) * Ni + omega * omega * Ni * Ni; Ne = int(floor( @@ -229,29 +271,253 @@ QuantaResult NESTcalc::GetQuanta(YieldResult yields, double density, if ((Nph + Ne) != (Nex + Ni)) { cerr << "\nERROR: Quanta not conserved. Tell Matthew Immediately!\n"; - exit(1); + exit(EXIT_FAILURE); } - + + if ( fdetector->get_extraPhot() ) { + if ( yields.Lindhard != 1. ) + Nph = int(floor(double(Nph)*InfraredNR+0.5)); //IR photons for NR + else + Nph = int(floor(double(Nph)*InfraredER+0.5)); //EXO + } + result.Variance=Variance; + result.recombProb=recombProb; result.photons = Nph; result.electrons = Ne; return result; // quanta returned with recomb fluctuations } +YieldResult NESTcalc::GetYieldGamma(double energy, double density, double dfield) +{ + Wvalue wvalue = WorkFunction(density); + double Wq_eV = wvalue.Wq_eV; + double alpha = wvalue.alpha; + constexpr double m3 = 2., m4 = 2., m6 = 0.; + + const double m1 = + 33.951 + (3.3284 - 33.951) / (1. + pow(dfield / 165.34, .72665)); + double m2 = 1000 / Wq_eV; + double m5 = + 23.156 + (10.737 - 23.156) / (1. + pow(dfield / 34.195, .87459)); + double densCorr = 240720. / pow(density, 8.2076); + double m7 = + 66.825 + (829.25 - 66.825) / (1. + pow(dfield / densCorr, .83344)); + + double Nq = energy * 1000. / Wq_eV; + double m8 = 2.; + if (fdetector->get_inGas()) m8 = -2.; + double Qy = m1 + (m2 - m1) / (1. + pow(energy / m3, m4)) + m5 + + (m6 - m5) / (1. + pow(energy / m7, m8)); + double Ly = Nq / energy - Qy; + + YieldResult result; + result.PhotonYield = Ly * energy; + result.ElectronYield = Qy * energy; + result.ExcitonRatio = NexONi(energy,density); + result.Lindhard = 1; + result.ElectricField = dfield; + result.DeltaT_Scint = -999; + return YieldResultValidity(result,energy,Wq_eV); // everything needed to calculate fluctuations +} + +YieldResult NESTcalc::GetYieldNR(double energy, double density, double dfield, double massNum, vector NuisParam/*{11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.}*/) +{ + + if ( NuisParam.size() < 12 ) + { + cerr << "\nERROR: You need a minimum of 12 nuisance parameters for the mean yields.\n"; + exit(EXIT_FAILURE); + } + int massNumber; + double ScaleFactor[2] ={1., 1.}; + if ( massNum == 0. ) + massNumber = RandomGen::rndm()->SelectRanXeAtom(); + else + massNumber = int(massNum); + ScaleFactor[0] = sqrt(fdetector->get_molarMass() / (double) massNumber); + ScaleFactor[1] = ScaleFactor[0]; + double Nq = NuisParam[0] * pow(energy, NuisParam[1]); + double ThomasImel = + NuisParam[2] * pow(dfield, NuisParam[3]) * pow(density / DENSITY, 0.3); + double Qy = 1. / (ThomasImel * pow(energy + NuisParam[4], NuisParam[9])); + Qy *= 1. - 1. / pow(1. + pow((energy / NuisParam[5]), NuisParam[6]), NuisParam[10]); + double Ly = Nq / energy - Qy; + if (Qy < 0.0) Qy = 0.0; + if (Ly < 0.0) Ly = 0.0; + double Ne = Qy * energy * ScaleFactor[1]; + double Nph = Ly * energy * ScaleFactor[0] * + (1. - 1. / pow(1. + pow((energy / NuisParam[7]), NuisParam[8]), NuisParam[11])); + Nq = Nph + Ne; + double Ni = (4. / ThomasImel) * (exp(Ne * ThomasImel / 4.) - 1.); + double Nex = (-1. / ThomasImel) * (4. * exp(Ne * ThomasImel / 4.) - + (Ne + Nph) * ThomasImel - 4.); + if (fabs(Nex + Ni -Nq) > PHE_MIN) + { + cerr << "\nERROR: Quanta not conserved. Tell Matthew Immediately!\n"; + exit(EXIT_FAILURE); + } + double NexONi = Nex / Ni; + + Wvalue wvalue = WorkFunction(density); + double Wq_eV = wvalue.Wq_eV; + double L = (Nq / energy) * Wq_eV * 1e-3; + + YieldResult result; + result.PhotonYield = Nph; + result.ElectronYield = Ne; + result.ExcitonRatio = NexONi; + result.Lindhard = L; + result.ElectricField = dfield; + result.DeltaT_Scint = -999; + return YieldResultValidity(result,energy,Wq_eV); // everything needed to calculate fluctuations +} + +YieldResult NESTcalc::GetYieldIon(double energy, double density, double dfield, double massNum, double atomNum, vector NuisParam/*{11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.}*/) +{ //simply uses the original Lindhard model, but as cited by Hitachi in: https://indico.cern.ch/event/573069/sessions/230063/attachments/1439101/2214448/Hitachi_XeSAT2017_DM.pdf + double A1 = massNum, A2 = RandomGen::rndm()->SelectRanXeAtom(); + double Z1 = atomNum, Z2 = ATOM_NUM; + double Z_mean = pow(pow(Z1, (2. / 3.)) + pow(Z2, (2. / 3.)), 1.5); + double E1c = pow(A1, 3.) * pow(A1 + A2, -2.) * pow(Z_mean, (4. / 3.)) * + pow(Z1, (-1. / 3.)) * 500.; + double E2c = pow(A1 + A2, 2.) * pow(A1, -1.) * Z2 * 125.; + double gamma = 4. * A1 * A2 / pow(A1 + A2, 2.); + double Ec_eV = gamma * E2c; + double Constant = + (2. / 3.) * (1. / sqrt(E1c) + 0.5 * sqrt(gamma / Ec_eV)); + double L = Constant * sqrt(energy * 1e3); + double L_max = 0.96446 / (1. + pow(massNum * massNum / 19227., 0.99199)); + if (atomNum == 2. && massNum == 4.) L = 0.56136 * pow(energy, 0.056972); + if (L > L_max) L = L_max; + double densDep = pow(density / 0.2679, -2.3245); + double massDep = + 0.02966094 * exp(0.17687876 * (massNum / 4. - 1.)) + 1. - 0.02966094; + double fieldDep = pow(1. + pow(dfield / 95., 8.7), 0.0592); + if (fdetector->get_inGas()) fieldDep = sqrt(dfield); + double ThomasImel = 0.00625 * massDep / (1. + densDep) / fieldDep; + if ( A1 == 206. && Z1 == 82. ) + ThomasImel = 40. * pow ( dfield, -0.75 ); + const double logden = log10(density); + double Wq_eV = 28.259 + 25.667 * logden - 33.611 * pow(logden, 2.) - + 123.73 * pow(logden, 3.) - 136.47 * pow(logden, 4.) - + 74.194 * pow(logden, 5.) - 20.276 * pow(logden, 6.) - + 2.2352 * pow(logden, 7.); + double alpha = 0.64 / pow(1. + pow(density / 10., 2.), 449.61); + double NexONi = alpha + 0.00178 * pow(atomNum, 1.587); + double Nq = 1e3 * L * energy / Wq_eV; + double Ni = Nq / (1. + NexONi); + double recombProb; + if (Ni > 0. && ThomasImel > 0.) + recombProb = + 1. - log(1. + (ThomasImel / 4.) * Ni) / ((ThomasImel / 4.) * Ni); + else + recombProb = 0.0; + double Nph = Nq * NexONi / (1. + NexONi) + recombProb * Ni; + double Ne = Nq - Nph; + + YieldResult result; + result.PhotonYield = Nph; + result.ElectronYield = Ne; + result.ExcitonRatio = NexONi; + result.Lindhard = L; + result.ElectricField = dfield; + result.DeltaT_Scint = -999; + return YieldResultValidity(result,energy,Wq_eV); // everything needed to calculate fluctuations +} + +YieldResult NESTcalc::GetYieldKr83m(double energy, double density, double dfield) +{ + double Nq = -999; + double Nph = -999; + + Wvalue wvalue = WorkFunction(density); + double Wq_eV = wvalue.Wq_eV; + double alpha = wvalue.alpha; + double deltaT_ns = -999; + constexpr double deltaT_ns_halflife = 154.4; + if (energy == 9.4) + { + deltaT_ns = RandomGen::rndm()->rand_exponential(deltaT_ns_halflife); + Nq = energy * (1e3 / Wq_eV + 6.5); + double medTlevel = + 47.8 + (69.201 - 47.8) / pow(1. + pow(dfield / 250.13, 0.9), 1.); + double highTrise = + 1.15 + (1. - 1.15) / (1. + pow(deltaT_ns / 1200., 18.)); + double lowTdrop = 14. * pow(dfield, 0.19277); + Nph = energy * highTrise * + (5.1e4 * pow(2. * deltaT_ns + 10., -1.5) + medTlevel) / + (1. + pow(deltaT_ns / lowTdrop, -3.)); + alpha = 0.; + } else + { + Nq = energy * 1000. / Wq_eV; + Nph = + energy * + (6. + (69.742 - 6.) / pow(1. + pow(dfield / 9.515, 1.9), 0.063032)); + } + double Ne = Nq - Nph; + + + YieldResult result; + result.PhotonYield = Nph; + result.ElectronYield = Ne; + result.ExcitonRatio = NexONi(energy,density); + result.Lindhard = 1; + result.ElectricField = dfield; + result.DeltaT_Scint = deltaT_ns; + return YieldResultValidity(result,energy,Wq_eV); // everything needed to calculate fluctuations +} + +YieldResult NESTcalc::GetYieldBeta(double energy, double density, double dfield) +{ + Wvalue wvalue = WorkFunction(density); + double Wq_eV = wvalue.Wq_eV; + double alpha = wvalue.alpha; + + double QyLvllowE = + 1e3 / Wq_eV + 6.5 * (1. - 1. / (1. + pow(dfield / 47.408, 1.9851))); + double HiFieldQy = + 1. + 0.4607 / pow(1. + pow(dfield / 621.74, -2.2717), 53.502); + double QyLvlmedE = + 32.988 - + 32.988 / + (1. + pow(dfield / (0.026715 * exp(density / 0.33926)), 0.6705)); + QyLvlmedE *= HiFieldQy; + double DokeBirks = + 1652.264 + + (1.415935e10 - 1652.264) / (1. + pow(dfield / 0.02673144, 1.564691)); + double Nq = energy * 1e3 / + Wq_eV; //( Wq_eV+(12.578-Wq_eV)/(1.+pow(energy/1.6,3.5)) ); + double LET_power = -2.; + if (fdetector->get_inGas()) LET_power = 2.; + double QyLvlhighE = 28.; + if (density > 3.100) QyLvlhighE = 49.; //SXe effect from Yoo. + double Qy = QyLvlmedE + + (QyLvllowE - QyLvlmedE) / + pow(1. + 1.304 * pow(energy, 2.1393), 0.35535) + + QyLvlhighE / (1. + DokeBirks * pow(energy, LET_power)); + if (Qy > QyLvllowE && energy > 1. && dfield > 1e4) Qy = QyLvllowE; + double Ly = Nq / energy - Qy; + double Ne = Qy * energy; + double Nph = Ly * energy; + + + YieldResult result; + result.PhotonYield = Nph; + result.ElectronYield = Ne; + result.ExcitonRatio = NexONi(energy,density); + result.Lindhard = 1; + result.ElectricField = dfield; + result.DeltaT_Scint = -999; + return YieldResultValidity(result,energy,Wq_eV); // everything needed to calculate fluctuations; +} + + + YieldResult NESTcalc::GetYields(INTERACTION_TYPE species, double energy, double density, double dfield, double massNum, double atomNum, vector NuisParam - /*={11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.}*/) { - // For temporary variables for storing results - double Ne = -999; - double Nph = -999; - double NexONi = -999, deltaT_ns = -999; - double m8 = 2., L = 1.; - const double deltaT_ns_halflife = 154.4; - - double Wq_eV = - 1.9896 + (20.8 - 1.9896) / (1. + pow(density / 4.0434, 1.4407)); - double alpha = 0.067366 + density * 0.039693; + /*={11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.}*/) { switch (species) { case NR: case WIMP: @@ -262,181 +528,48 @@ YieldResult NESTcalc::GetYields(INTERACTION_TYPE species, double energy, // statement. Same intrinsic yields, but different energy spectra // (TestSpectra) { - int massNumber; - double ScaleFactor[2] = {1., 1.}; - if (massNum != 0.) - massNumber = int(massNum); - else - massNumber = RandomGen::rndm()->SelectRanXeAtom(); - ScaleFactor[0] = sqrt(MOLAR_MASS / (double)massNumber); - ScaleFactor[1] = ScaleFactor[0]; - double Nq = NuisParam[0] * pow(energy, NuisParam[1]); - double ThomasImel = - NuisParam[2] * pow(dfield, NuisParam[3]) * pow(density / DENSITY, 0.3); - double Qy = 1. / (ThomasImel*pow(energy+NuisParam[4],NuisParam[9])); - Qy *= 1. - 1. / pow(1. + pow((energy / NuisParam[5]), NuisParam[6]),NuisParam[10]); - double Ly = Nq / energy - Qy; - if (Qy < 0.0) Qy = 0.0; - if (Ly < 0.0) Ly = 0.0; - Ne = Qy * energy * ScaleFactor[1]; - Nph = Ly * energy * ScaleFactor[0] * - (1. - 1. / (1. + pow((energy / NuisParam[7]), NuisParam[8]))); - Nq = Nph + Ne; - double Ni = (4. / ThomasImel) * (exp(Ne * ThomasImel / 4.) - 1.); - double Nex = (-1. / ThomasImel) * (4. * exp(Ne * ThomasImel / 4.) - - (Ne + Nph) * ThomasImel - 4.); - if (fabs(Nex - (Nq - Ni)) > PHE_MIN || - fabs(Ni - (Nq - Nex)) > PHE_MIN) { - cerr << "\nERROR: Quanta not conserved. Tell Matthew Immediately!\n"; - exit(1); - } - NexONi = Nex / Ni; - L = (Nq / energy) * Wq_eV * 1e-3; + return GetYieldNR(energy, density, dfield, massNum,NuisParam); } break; case ion: { - double A1 = massNum, A2 = RandomGen::rndm()->SelectRanXeAtom(); - double Z1 = atomNum, Z2 = ATOM_NUM; - double Z_mean = pow(pow(Z1, (2. / 3.)) + pow(Z2, (2. / 3.)), 1.5); - double E1c = pow(A1, 3.) * pow(A1 + A2, -2.) * pow(Z_mean, (4. / 3.)) * - pow(Z1, (-1. / 3.)) * 500.; - double E2c = pow(A1 + A2, 2.) * pow(A1, -1.) * Z2 * 125.; - double gamma = 4. * A1 * A2 / pow(A1 + A2, 2.); - double Ec_eV = gamma * E2c; - double Constant = - (2. / 3.) * (1. / sqrt(E1c) + 0.5 * sqrt(gamma / Ec_eV)); - L = Constant * sqrt(energy * 1e3); - double L_max = 0.96446 / (1. + pow(massNum * massNum / 19227., 0.99199)); - if (atomNum == 2. && massNum == 4.) L = 0.56136 * pow(energy, 0.056972); - if (L > L_max) L = L_max; - double densDep = pow(density / 0.2679, -2.3245); - double massDep = - 0.02966094 * exp(0.17687876 * (massNum / 4. - 1.)) + 1. - 0.02966094; - double fieldDep = pow(1. + pow(dfield / 95., 8.7), 0.0592); - if (fdetector->get_inGas()) fieldDep = sqrt(dfield); - double ThomasImel = 0.00625 * massDep / (1. + densDep) / fieldDep; - const double logden = log10(density); - Wq_eV = 28.259 + 25.667 * logden - 33.611 * pow(logden, 2.) - - 123.73 * pow(logden, 3.) - 136.47 * pow(logden, 4.) - - 74.194 * pow(logden, 5.) - 20.276 * pow(logden, 6.) - - 2.2352 * pow(logden, 7.); - alpha = 0.64 / pow(1. + pow(density / 10., 2.), 449.61); - NexONi = alpha + 0.00178 * pow(atomNum, 1.587); - double Nq = 1e3 * L * energy / Wq_eV; - double Ni = Nq / (1. + NexONi); - double recombProb; - if (Ni > 0. && ThomasImel > 0.) - recombProb = - 1. - log(1. + (ThomasImel / 4.) * Ni) / ((ThomasImel / 4.) * Ni); - else - recombProb = 0.0; - Nph = Nq * NexONi / (1. + NexONi) + recombProb * Ni; - Ne = Nq - Nph; + return GetYieldIon(energy,density,dfield,massNum,atomNum,NuisParam); } break; case gammaRay: { - const double m3 = 2., m4 = 2., m6 = 0.; - double m1 = - 33.951 + (3.3284 - 33.951) / (1. + pow(dfield / 165.34, .72665)); - double m2 = 1000 / Wq_eV; - double m5 = - 23.156 + (10.737 - 23.156) / (1. + pow(dfield / 34.195, .87459)); - double densCorr = 240720. / pow(density, 8.2076); - double m7 = - 66.825 + (829.25 - 66.825) / (1. + pow(dfield / densCorr, .83344)); - double Nq = energy * 1000. / Wq_eV; - if (fdetector->get_inGas()) m8 = -2.; - double Qy = m1 + (m2 - m1) / (1. + pow(energy / m3, m4)) + m5 + - (m6 - m5) / (1. + pow(energy / m7, m8)); - double Ly = Nq / energy - Qy; - Ne = Qy * energy; - Nph = Ly * energy; - NexONi = alpha * erf(0.05 * energy); + return GetYieldGamma(energy,density,dfield); } break; case Kr83m: { - double Nq = 0.; - if (energy == 9.4) { - deltaT_ns = RandomGen::rndm()->rand_exponential(deltaT_ns_halflife); - Nq = energy * (1e3 / Wq_eV + 6.5); - double medTlevel = - 47.8 + (69.201 - 47.8) / pow(1. + pow(dfield / 250.13, 0.9), 1.); - double highTrise = - 1.15 + (1. - 1.15) / (1. + pow(deltaT_ns / 1200., 18.)); - double lowTdrop = 14. * pow(dfield, 0.19277); - Nph = energy * highTrise * - (5.1e4 * pow(2. * deltaT_ns + 10., -1.5) + medTlevel) / - (1. + pow(deltaT_ns / lowTdrop, -3.)); - alpha = 0.; - } else { - Nq = energy * 1000. / Wq_eV; - Nph = - energy * - (6. + (69.742 - 6.) / pow(1. + pow(dfield / 9.515, 1.9), 0.063032)); - } - Ne = Nq - Nph; - NexONi = alpha * erf(0.05 * energy); + return GetYieldKr83m(energy,density,dfield); } break; default: // beta, CH3T { - double QyLvllowE = - 1e3 / Wq_eV + 6.5 * (1. - 1. / (1. + pow(dfield / 47.408, 1.9851))); - double HiFieldQy = - 1. + 0.4607 / pow(1. + pow(dfield / 621.74, -2.2717), 53.502); - double QyLvlmedE = - 32.988 - - 32.988 / - (1. + pow(dfield / (0.026715 * exp(density / 0.33926)), 0.6705)); - QyLvlmedE *= HiFieldQy; - double DokeBirks = - 1652.264 + - (1.415935e10 - 1652.264) / (1. + pow(dfield / 0.02673144, 1.564691)); - double Nq = energy * 1e3 / - Wq_eV; //( Wq_eV+(12.578-Wq_eV)/(1.+pow(energy/1.6,3.5)) ); - double LET_power = -2.; - if (fdetector->get_inGas()) LET_power = 2.; - double QyLvlhighE = 28.; - // if (density > 3.) QyLvlhighE = 49.; Solid Xe effect from Yoo. But, - // beware of enabling this line: enriched liquid Xe for neutrinoless - // double beta decay has density higher than 3g/cc; - double Qy = QyLvlmedE + - (QyLvllowE - QyLvlmedE) / - pow(1. + 1.304 * pow(energy, 2.1393), 0.35535) + - QyLvlhighE / (1. + DokeBirks * pow(energy, LET_power)); - if (Qy > QyLvllowE && energy > 1. && dfield > 1e4) Qy = QyLvllowE; - double Ly = Nq / energy - Qy; - Ne = Qy * energy; - Nph = Ly * energy; - NexONi = alpha * erf(0.05 * energy); + return GetYieldBeta(energy,density,dfield); } break; } - assert(Ne != -999 && Nph != -999 && NexONi != -999); - if (Nph > energy / W_SCINT) - Nph = energy / W_SCINT; // yields can never exceed 1 / [ W ~ few eV ] - if (Ne > energy / W_SCINT) Ne = energy / W_SCINT; - if (Nph < 0.) Nph = 0.; - if (Ne < 0.) Ne = 0.; - // if (NexONi < 0.) NexONi = 0.; - if (L < 0.) L = 0.; - if (L > 1.) L = 1.; // Lindhard Factor - if (energy < 0.001 * Wq_eV / L) { - Nph = 0.; - Ne = 0.; - } - YieldResult result; - result.PhotonYield = Nph; - result.ElectronYield = Ne; - result.ExcitonRatio = NexONi; - result.Lindhard = L; - result.ElectricField = dfield; - result.DeltaT_Scint = deltaT_ns; - return result; // everything needed to calculate fluctuations } -NESTcalc::NESTcalc() { fdetector = NULL; } +YieldResult NESTcalc::YieldResultValidity(YieldResult& res, const double energy, const double Wq_eV) +{ + assert(res.ElectronYield != -999 && res.PhotonYield != -999 && res.ExcitonRatio != -999); + if (res.PhotonYield > energy / W_SCINT) + res.PhotonYield = energy / W_SCINT; // yields can never exceed 1 / [ W ~ few eV ] + if (res.ElectronYield > energy / W_SCINT) res.ElectronYield = energy / W_SCINT; + if (res.PhotonYield < 0.) res.PhotonYield = 0.; + if (res.ElectronYield < 0.) res.ElectronYield = 0.; + if (res.Lindhard < 0.) res.Lindhard = 0.; + if (res.Lindhard > 1.) res.Lindhard = 1.; // Lindhard Factor + if (energy < 0.001 * Wq_eV / res.Lindhard) + { + res.PhotonYield = 0.; + res.ElectronYield = 0.; + } + return res; +} + NESTcalc::NESTcalc(VDetector* detector) { - NESTcalc(); + assert(detector); fdetector = detector; } @@ -474,29 +607,32 @@ vector NESTcalc::GetS1(QuantaResult quanta, double truthPos[3], // generate a number of PMT hits drawn from a binomial distribution. // Initialize number of photo-electrons int nHits = BinomFluct(Nph, fdetector->get_g1() * posDep), Nphe = 0; - + + double eff = fdetector->get_sPEeff(); + if ( eff < 1. ) + eff += ((1.-eff)/(2.*double(fdetector->get_numPMTs())))*double(nHits); + if ( eff > 1. ) eff = 1.; + if ( eff < 0. ) eff = 0.; + // Initialize the pulse area and spike count variables double pulseArea = 0., spike = 0., prob; // If single photo-electron efficiency is under 1 and the threshold is above 0 // (some phe will be below threshold) - if (useTiming || - (fdetector->get_sPEthr() > 0. && - nHits < fdetector->get_numPMTs())) { // digital nHits eventually becomes - // spikes (spike++) based upon - // threshold + if ( useTiming != -1 ) { // digital nHits eventually becomes spikes (spike++) based upon threshold + // Step through the pmt hits for (int i = 0; i < nHits; i++) { // generate photo electron, integer count and area double phe1 = RandomGen::rndm()->rand_gauss(1., fdetector->get_sPEres()) + - RandomGen::rndm()->rand_gauss(fdetector->get_noise()[0], - fdetector->get_noise()[1]); + RandomGen::rndm()->rand_gauss(fdetector->get_noiseB()[0], + fdetector->get_noiseB()[1]); Nphe++; if (phe1 > DBL_MAX) phe1 = 1.; if (phe1 < -DBL_MAX) phe1 = 0.; prob = RandomGen::rndm()->rand_uniform(); // zero the area if random draw determines it wouldn't have been observed. - if (prob > fdetector->get_sPEeff()) { + if (prob > eff) { phe1 = 0.; } // add an else with Nphe++ if not doing mc truth // Generate a double photo electron if random draw allows it @@ -504,14 +640,14 @@ vector NESTcalc::GetS1(QuantaResult quanta, double truthPos[3], if (RandomGen::rndm()->rand_uniform() < fdetector->get_P_dphe()) { // generate area and increment the photo-electron counter phe2 = RandomGen::rndm()->rand_gauss(1., fdetector->get_sPEres()) + - RandomGen::rndm()->rand_gauss(fdetector->get_noise()[0], - fdetector->get_noise()[1]); + RandomGen::rndm()->rand_gauss(fdetector->get_noiseB()[0], + fdetector->get_noiseB()[1]); Nphe++; if (phe2 > DBL_MAX) phe2 = 1.; if (phe2 < -DBL_MAX) phe2 = 0.; // zero the area if phe wouldn't have been observed - if (RandomGen::rndm()->rand_uniform() > fdetector->get_sPEeff() && - prob > fdetector->get_sPEeff()) { + if (RandomGen::rndm()->rand_uniform() > eff && + prob > eff) { phe2 = 0.; } // add an else with Nphe++ if not doing mc truth // The dphe occurs simultaneously to the first one from the same source @@ -519,7 +655,7 @@ vector NESTcalc::GetS1(QuantaResult quanta, double truthPos[3], } // Save the phe area and increment the spike count (very perfect spike // count) if area is above threshold - if (useTiming) { + if ( useTiming >= 1 ) { if ((phe1 + phe2) > fdetector->get_sPEthr()) { pulseArea += phe1 + phe2; spike++; @@ -540,15 +676,13 @@ vector NESTcalc::GetS1(QuantaResult quanta, double truthPos[3], } else { // apply just an empirical efficiency by itself, without direct area // threshold Nphe = nHits + BinomFluct(nHits, fdetector->get_P_dphe()); - double eff = fdetector->get_sPEeff(); - if (nHits >= fdetector->get_numPMTs()) eff = 1.; pulseArea = RandomGen::rndm()->rand_gauss( BinomFluct(Nphe, 1. - (1. - eff) / (1. + fdetector->get_P_dphe())), fdetector->get_sPEres() * sqrt(Nphe)); spike = (double)nHits; } - if (useTiming) { + if ( useTiming >= 1 ) { vector PEperBin, AreaTable[2], TimeTable[2]; int numPts = 1100 - 100 * SAMPLE_SIZE; AreaTable[0].resize(numPts, 0.); @@ -602,6 +736,7 @@ vector NESTcalc::GetS1(QuantaResult quanta, double truthPos[3], // TimeTable[0].push_back(-999.); // TimeTable[1].push_back(photon_areas[0][ii]+photon_areas[1][ii]); } + double tRandOffset = (PULSE_WIDTH/2.)*(2.*RandomGen::rndm()->rand_uniform()-1.); //-16,20 was good for LUX, but made weird skew in fP for (ii = 0; ii < numPts; ++ii) { if ((AreaTable[0][ii] + AreaTable[1][ii]) <= PULSEHEIGHT) continue; @@ -610,8 +745,8 @@ vector NESTcalc::GetS1(QuantaResult quanta, double truthPos[3], if (outputTiming) { char line[80]; - sprintf(line, "%lu\t%ld\t%.2f\t%.2f", evtNum, wf_time.back(), - AreaTable[0][ii], AreaTable[1][ii]); + sprintf(line, "%lu\t%ld\t%.3f\t%.3f", evtNum, wf_time.back() + (long)tRandOffset, + AreaTable[0][ii], AreaTable[1][ii]); pulseFile << line << flush; } @@ -628,12 +763,12 @@ vector NESTcalc::GetS1(QuantaResult quanta, double truthPos[3], nHits <= fdetector->get_coinLevel()) --spike; // char line[80]; sprintf ( line, "%lu\t%.1f\t%.2f", evtNum, - // TimeTable[0][ii], TimeTable[1][ii] ); pulseFile << line << endl; + // TimeTable[0][ii]+24., TimeTable[1][ii] ); pulseFile << line << endl; } } pulseArea = RandomGen::rndm()->rand_gauss( - pulseArea, fdetector->get_noise()[2] * pulseArea); + pulseArea, fdetector->get_noiseL()[0] * pulseArea); if (pulseArea < fdetector->get_sPEthr()) pulseArea = 0.; if (spike < 0) spike = 0; double pulseAreaC = pulseArea / posDepSm; @@ -758,15 +893,14 @@ vector NESTcalc::GetS2(int Ne, double truthPos[3], double smearPos[3], posDep /= fdetector->FitS2(0., 0.); posDepSm /= fdetector->FitS2(0., 0.); double dz = fdetector->get_TopDrift() - dt * driftVelocity; - - int Nee = BinomFluct( - Ne, ExtEff * exp(-dt / fdetector->get_eLife_us())); // MAKE this 1 for - // SINGLE e- - // DEBUGGING + + int Nee = BinomFluct(Ne, ExtEff * exp(-dt / fdetector->get_eLife_us())); + //MAKE this 1 for SINGLE e- DEBUG + long Nph = 0, nHits = 0, Nphe = 0; double pulseArea = 0.; - - if (useTiming) { + + if ( useTiming >= 1 ) { long k; int stopPoint; double tau1, tau2, E_liq, amp2; @@ -801,9 +935,9 @@ vector NESTcalc::GetS2(int Ne, double truthPos[3], double smearPos[3], 1e-6); // sqrt of cm^2/s * s = cm; times 10 for mm. double sigmaDT = 10. * sqrt(2. * Diff_Tran * dt * 1e-6); double rho = fdetector->get_p_bar() * 1e5 / - (fdetector->get_T_Kelvin() * 8.314) * MOLAR_MASS * 1e-6; + (fdetector->get_T_Kelvin() * 8.314) * fdetector->get_molarMass() * 1e-6; double driftVelocity_gas = - SetDriftVelocity_MagBoltz(rho, fdetector->get_E_gas() * 1000.); + GetDriftVelocity_MagBoltz(rho, fdetector->get_E_gas() * 1000.); double dt_gas = gasGap / driftVelocity_gas; double sigmaDLg = 10. * sqrt(2. * Diff_Long_Gas * dt_gas * 1e-6); double sigmaDTg = 10. * sqrt(2. * Diff_Tran_Gas * dt_gas * 1e-6); @@ -844,8 +978,8 @@ vector NESTcalc::GetS2(int Ne, double truthPos[3], double smearPos[3], quanta.electrons = 0; quanta.ions = 0; quanta.excitons = int(floor(0.0566 * SE + 0.5)); - photonstream photon_emission_times = GetPhotonTimes( - INTERACTION_TYPE::beta, quanta.photons, quanta.excitons, dfield, KE); + photonstream photon_emission_times = GetPhotonTimes(NEST::beta, quanta.photons, + quanta.excitons, dfield, KE); photonstream photon_times = AddPhotonTransportTime(photon_emission_times, newX, newY, origin); SE += (double)BinomFluct(long(SE), fdetector->get_P_dphe()); @@ -931,8 +1065,8 @@ vector NESTcalc::GetS2(int Ne, double truthPos[3], double smearPos[3], if (outputTiming) { char line[80]; - sprintf(line, "%lu\t%ld\t%.2f\t%.2f", evtNum, wf_time.back(), - AreaTableBot[1][k], AreaTableTop[1][k]); + sprintf(line, "%lu\t%ld\t%.3f\t%.3f", evtNum, wf_time.back(), + AreaTableBot[1][k], AreaTableTop[1][k]); pulseFile << line << endl; } } @@ -948,7 +1082,7 @@ vector NESTcalc::GetS2(int Ne, double truthPos[3], double smearPos[3], } pulseArea = RandomGen::rndm()->rand_gauss( - pulseArea, fdetector->get_noise()[3] * pulseArea); + pulseArea, fdetector->get_noiseL()[1] * pulseArea); double pulseAreaC = pulseArea / exp(-dt / fdetector->get_eLife_us()) / posDepSm; double Nphd = pulseArea / (1. + fdetector->get_P_dphe()); @@ -1032,13 +1166,17 @@ vector NESTcalc::CalculateG2(bool verbosity) { ->get_TopDrift(); // EL gap in mm -> cm, affecting S2 size linearly if (gasGap <= 0. && E_liq > 0.) { cerr << "\tERR: The gas gap in the S2 calculation broke!!!!" << endl; - exit(1); + exit(EXIT_FAILURE); } // Calculate EL yield based on gas gap, extraction field, and pressure double elYield = (alpha * fdetector->get_E_gas() * 1e3 - beta * fdetector->get_p_bar() - gamma) * gasGap * 0.1; // arXiv:1207.2292 (HA, Vitaly C.) + double rho = fdetector->get_p_bar() * 1e5 / + (fdetector->get_T_Kelvin() * 8.314) * fdetector->get_molarMass() * 1e-6; + elYield = (0.137*fdetector->get_E_gas()*1e3-4.70e-18*(NEST_AVO*rho/fdetector->get_molarMass())) * gasGap * 0.1; + // replaced with more accurate version also from 1207.2292, but works for room temperature gas if (elYield <= 0.0 && E_liq != 0.) { cerr << "\tWARNING, the field in gas must be at least " << 1e-3 * (beta * fdetector->get_p_bar() + gamma) / alpha @@ -1054,10 +1192,24 @@ vector NESTcalc::CalculateG2(bool verbosity) { if (fdetector->get_s2_thr() < 0) SE *= fdetector->FitTBA(0., 0., fdetector->get_TopDrift() / 2.)[1]; double g2 = ExtEff * SE; - double StdDev = sqrt((1. - fdetector->get_g1_gas()) * SE + - fdetector->get_s2Fano() * fdetector->get_s2Fano() + - fdetector->get_sPEres()); - + double StdDev = 0., Nphe, pulseArea, pulseAreaC, NphdC, phi, posDep, r,x,y; int Nph, nHits; + + for ( int i = 0; i < 10000; i++ ) { // calculate properly the width (1-sigma std dev) in the SE size + Nph = int(floor(RandomGen::rndm()->rand_gauss(elYield,sqrt(fdetector->get_s2Fano()*elYield))+0.5)); + phi = 2.*M_PI*RandomGen::rndm()->rand_uniform(); + r = fdetector->get_radius()*sqrt(RandomGen::rndm()->rand_uniform()); + x = r * cos(phi); + y = r * sin(phi); + posDep = fdetector->FitS2(x,y) / fdetector->FitS2(0.,0.); //future upgrade: smeared pos + nHits = BinomFluct ( Nph, fdetector->get_g1_gas() * posDep ); + Nphe = nHits+BinomFluct(nHits,fdetector->get_P_dphe()); + pulseArea = RandomGen::rndm()->rand_gauss(Nphe,fdetector->get_sPEres()*sqrt(Nphe)); + pulseArea = RandomGen::rndm()->rand_gauss(pulseArea,fdetector->get_noiseL()[1]*pulseArea); + pulseAreaC = pulseArea / posDep; + NphdC = pulseAreaC/(1.+fdetector->get_P_dphe()); + StdDev += (SE-NphdC)*(SE-NphdC); + } StdDev = sqrt(StdDev)/sqrt(9999.); // N-1 from above (10,000) + if (verbosity) { cout << endl << "g1 = " << fdetector->get_g1() << " phd per photon\tg2 = " << g2 @@ -1105,14 +1257,26 @@ vector NESTcalc::GetSpike(int Nph, double dx, double dy, double dz, } double NESTcalc::SetDensity(double Kelvin, - double bara) { // currently only for fixed pressure + double bara) { + bool inGas = false; + double density = GetDensity(Kelvin, bara, inGas); + fdetector->set_inGas(inGas); + + return density; +} + +double NESTcalc::GetDensity(double Kelvin, + double bara, bool &inGas, double molarMass) { // currently only for fixed pressure // (saturated vapor pressure); will // add pressure dependence later - + + //if (MOLAR_MASS > 134.5) //enrichment for 0vBB expt (~0.8 Xe-136) + //return 3.0305; // ±0.0077 g/cm^3, EXO-200 @167K: arXiv:1908.04128 + if (Kelvin < 161.40) { // solid Xenon cerr << "\nWARNING: SOLID PHASE. IS THAT WHAT YOU WANTED?\n"; return 3.41; // from Yoo at 157K - // other sources say 3.100 (Wikipedia, 'maximum') and 3.64g/mL at an unknown + // other sources say 3.1 (Wikipedia, 'minimum') and 3.640g/mL at an unknown // temperature } @@ -1124,9 +1288,9 @@ double NESTcalc::SetDensity(double Kelvin, if (bara < VaporP_bar) { double density = bara * 1e5 / (Kelvin * 8.314); // ideal gas law approximation, mol/m^3 - density *= MOLAR_MASS * 1e-6; + density *= molarMass * 1e-6; cerr << "\nWARNING: GAS PHASE. IS THAT WHAT YOU WANTED?\n"; - fdetector->set_inGas(true); + inGas = true; return density; // in g/cm^3 } @@ -1144,11 +1308,18 @@ double NESTcalc::SetDensity(double Kelvin, // zunzun fit to NIST data; will add gas later } -double NESTcalc::SetDriftVelocity(double Kelvin, double Density, - double eField) { // for liquid and solid only +double NESTcalc::SetDriftVelocity(double Kelvin, double Density, double eField){ + return GetDriftVelocity(Kelvin, Density, eField, fdetector->get_inGas()); +} - if (fdetector->get_inGas()) return SetDriftVelocity_MagBoltz(Density, eField); +double NESTcalc::GetDriftVelocity(double Kelvin, double Density, double eField, bool inGas){ + if (inGas) return GetDriftVelocity_MagBoltz(Density, eField); + else return GetDriftVelocity_Liquid(Kelvin, Density, eField); +} +double NESTcalc::GetDriftVelocity_Liquid(double Kelvin, double Density, + double eField) { // for liquid and solid only + double speed = 0.0; // returns drift speed in mm/usec. based on Fig. 14 arXiv:1712.08607 int i, j; @@ -1171,7 +1342,14 @@ double NESTcalc::SetDriftVelocity(double Kelvin, double Density, double Temperatures[11] = {100., 120., 140., 155., 157., 163., 165., 167., 184., 200., 230.}; - + + if ( Kelvin < 100. || Kelvin > 230. ) { + cerr << "\nWARNING: TEMPERATURE OUT OF RANGE (100-230 K) for vD\n"; + if ( Kelvin < 100. ) Kelvin = 100.; + if ( Kelvin > 230. ) Kelvin = 230.; + cerr << "Using value at closest temp for a drift speed estimate\n"; + } + if (Kelvin >= Temperatures[0] && Kelvin < Temperatures[1]) i = 0; else if (Kelvin >= Temperatures[1] && Kelvin < Temperatures[2]) @@ -1194,7 +1372,7 @@ double NESTcalc::SetDriftVelocity(double Kelvin, double Density, i = 9; else { cerr << "\nERROR: TEMPERATURE OUT OF RANGE (100-230 K)\n"; - exit(1); + exit(EXIT_FAILURE); } j = i + 1; @@ -1226,20 +1404,20 @@ double NESTcalc::SetDriftVelocity(double Kelvin, double Density, if (speed <= 0.) { if (eField < 1e2 && eField >= FIELD_MIN) { cerr << "\nERROR: DRIFT SPEED NON-POSITIVE -- FIELD TOO LOW\n"; - exit(1); + exit(EXIT_FAILURE); } if (eField > 1e4) { cerr << "\nERROR: DRIFT SPEED NON-POSITIVE -- FIELD TOO HIGH\n"; - exit(1); + exit(EXIT_FAILURE); } } return speed; } -double NESTcalc::SetDriftVelocity_MagBoltz( - double density, double efieldinput) // Nichole Barry UCD 2011 +double NESTcalc::GetDriftVelocity_MagBoltz( + double density, double efieldinput, double molarMass) // Nichole Barry UCD 2011 { - density *= NEST_AVO / MOLAR_MASS; + density *= NEST_AVO / molarMass; // Gas equation one coefficients (E/N of 1.2E-19 to 3.5E-19) double gas1a = 395.50266631436, gas1b = -357384143.004642, gas1c = 0.518110447340587; @@ -1281,7 +1459,7 @@ vector NESTcalc::SetDriftVelocity_NonUniform(double rho, double zStep, fdetector->get_E_gas() / (EPS_LIQ / EPS_GAS) * 1e3); else // if gate == TopDrift properly set, shouldn't happen - driftTime += zStep / SetDriftVelocity_MagBoltz( + driftTime += zStep / GetDriftVelocity_MagBoltz( rho, fdetector->get_E_gas() * 1e3); } else driftTime += @@ -1370,3 +1548,25 @@ double NESTcalc::CalcElectronLET(double E) { return LET; } + +NESTcalc::Wvalue NESTcalc::WorkFunction(double density) { + double xi_se = 9./(1.+pow(density/2.,2.)); + double alpha = 0.067366 + density * 0.039693; + double I_ion = 9.+(12.13-9.)/(1.+pow(density/2.953,65.)); + double I_exc = I_ion / 1.46; + double Wq_eV = I_exc*(alpha/(1.+alpha))+I_ion/(1.+alpha) + +xi_se/(1.+alpha); + double eDensity = (density/fdetector->get_molarMass())*NEST_AVO*ATOM_NUM; + Wq_eV = 20.7 - 1.01e-23 * eDensity; + + + + return Wvalue{.Wq_eV=Wq_eV,.alpha=alpha}; //W and Nex/Ni together +} + +double NESTcalc::NexONi(double energy, double density) +{ + Wvalue wvalue = WorkFunction(density); + double alpha = wvalue.alpha; + return alpha * erf(0.05 * energy); +} diff --git a/src/nestpy/NEST.hh b/src/nestpy/NEST.hh index 0bc9c6b..d20a8ae 100644 --- a/src/nestpy/NEST.hh +++ b/src/nestpy/NEST.hh @@ -74,11 +74,11 @@ #include #include -#define W_DEFAULT 13.7 // default work function, in eV +#define W_DEFAULT 13.4 // default work func, in eV. arXiv:1611.10322. +/- 0.35 #define W_SCINT 8.5e-3 // the *max* possible energy of 1 scint phot, keV #define NEST_AVO 6.0221409e+23 #define ATOM_NUM 54. // period to make float -#define MOLAR_MASS 131.293 // grams per mole + #define PHE_MIN 1e-6 // area #define ELEC_MASS 9.109e-31 // kg #define FIELD_MIN 1. // min elec field to make S2 (in V/cm) @@ -93,7 +93,7 @@ #define PULSE_WIDTH 10 // nano-seconds #define PULSEHEIGHT \ 0.005 // threshold height, in PE, for writing to photon_times -#define SPIKES_MAXM 70 // above this switch to pulse area +#define SPIKES_MAXM 120 // above this switch to pulse area (70 phd in 1 array) namespace NEST { @@ -131,6 +131,8 @@ struct QuantaResult { int electrons; int ions; int excitons; + double recombProb; + double Variance; }; typedef std::vector photonstream; @@ -151,20 +153,21 @@ class NESTcalc { double nCr(double n, double r); public: - NESTcalc(); + NESTcalc(const NESTcalc&) = delete; + NESTcalc& operator=(const NESTcalc&) = delete; NESTcalc(VDetector* detector); ~NESTcalc(); long BinomFluct(long, double); - static const std::vector default_NuisParam; /* = {11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.}*/ + static const std::vector default_NuisParam; /* = {11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.}*/ static const std::vector default_FreeParam; /* = {1.,1.,0.1,0.5,0.07} */ // basic binomial fluctuation, which switches to Gaussian for large numbers of // quanta, this is called repeatedly, and built upon to produce greater, // non-binomial fluctuations NESTresult FullCalculation(INTERACTION_TYPE species, double energy, double density, double dfield, double A, double Z, - std::vector NuisParam = default_NuisParam, /* = {11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.}*/ + std::vector NuisParam = default_NuisParam, /* = {11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.}*/ std::vector FreeParam = default_FreeParam, /* = {1.,1.,0.1,0.5,0.07} */ bool do_times = true); // the so-called full NEST calculation puts together all the individual @@ -184,15 +187,34 @@ class NESTcalc { // photons in a loop YieldResult GetYields(INTERACTION_TYPE species, double energy, double density, double dfield, double A, double Z, - std::vector NuisParam={11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.}); + std::vector NuisParam={11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.}); // the innermost heart of NEST, this provides floating-point average values // for photons and electrons per keV. Nuis(ance)Param included for varying the // NR Ly & Qy up and down - QuantaResult GetQuanta(YieldResult yields, double density, std::vector FreeParam={1.,1.,0.1,0.5,0.07}); + virtual YieldResult GetYieldGamma(double energy, double density, double dfield); + // Called by GetYields in the Gamma/x-ray/Photoabsorption Case + virtual YieldResult GetYieldNR(double energy, double density, double dfield, double massNum, + std::vector NuisParam={11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.}); + // Called by GetYields in the NR (and related) cases + virtual YieldResult GetYieldIon(double energy, double density, double dfield, double massNum, double atomNum, vector NuisParam={11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.}); + // Called by GetYields in the ion case + virtual YieldResult GetYieldKr83m(double energy, double density, double dfield); + // Called by GetYields in the K383m case + virtual YieldResult GetYieldBeta(double energy, double density, double dfield); + // Called by GetYields in the Beta/Compton/etc.(IC,Auger,EC) Case + virtual YieldResult YieldResultValidity(YieldResult& res, const double energy, const double Wq_eV); + // Confirms and sometimes adjusts YieldResult to make physical sense + virtual QuantaResult GetQuanta(YieldResult yields, double density, std::vector FreeParam={1.,1.,0.1,0.5,0.07}); // GetQuanta takes the yields from above and fluctuates them, both the total // quanta (photons+electrons) with a Fano-like factor, and the "slosh" between // photons and electrons // Namely, the recombination fluctuations + virtual double RecombOmegaNR(double elecFrac,vector FreeParam/*={1.,1.,0.1,0.5,0.07}*/); + //Calculates the Omega parameter governing non-binomial recombination fluctuations for nuclear recoils and ions (Lindhard<1) + virtual double RecombOmegaER(double efield, double elecFrac); + //Calculates the Omega parameter governing non-binomial recombination fluctuations for gammas and betas (Lindhard==1) + virtual double FanoER(double density, double Nq_mean,double efield); + //Fano-factor (and Fano-like additional energy resolution model) for gammas and betas (Lindhard==1) std::vector GetS1(QuantaResult quanta, double truthPos[3], double smearPos[3], double driftSpeed, double dS_mid, INTERACTION_TYPE species, @@ -225,7 +247,15 @@ class NESTcalc { // Gives one the drift velocity as a function of temperature and electric // field in liquid or solid. If density implies gas, kicks calculation down to // the next function below - double SetDriftVelocity_MagBoltz(double D, double F); + static double GetDriftVelocity(double T, double D, double F, bool inGas); + // Gives one the drift velocity as a function of temperature and electric + // field in liquid or solid. If density implies gas, kicks calculation down to + // the next function below + static double GetDriftVelocity_Liquid(double T, double D, double F); + // Gives one the drift velocity as a function of temperature and electric + // field in liquid or solid. If density implies gas, kicks calculation down to + // the next function below + static double GetDriftVelocity_MagBoltz(double D, double F, double molarMass=131.293); // Gas electron drift speed for S2 gas gap in 2-phase TPCs or the whole // detector for all gas. Based on simple fits to complicated MagBoltz software // output. @@ -237,12 +267,15 @@ class NESTcalc { double SetDensity(double T, double P); // A simple, approximate but good, density is returned for solid, liquid, or // gaseous xenon, as a function of temperature and pressure + static double GetDensity(double T, double P, bool &inGas, double molarMass=131.293); + // A simple, approximate but good, density is returned for solid, liquid, or + // gaseous xenon, as a function of temperature and pressure std::vector xyResolution(double xPos_mm, double yPos_mm, double A_top); // Utilizing a dependence on radius and the size of the S2 signal, takes MC // truth X and Y and outputs smeared values as if you did position // reconstruction like in real data - double PhotonEnergy(bool s2Flag, bool state, double tempK); + virtual double PhotonEnergy(bool s2Flag, bool state, double tempK); // Determines the birth energies in electron-Volts of scintillation photons, // for either S1 or S2, including fluctuations in them, so that you can apply // proper QE in G4 for ex. @@ -250,6 +283,11 @@ class NESTcalc { // Linear Energy Transfer in units of MeV*cm^2/gram which when combined with // density can provide the dE/dx, as a function of energy in keV. Will be more // useful in the future + struct Wvalue {double Wq_eV; double alpha;}; + virtual Wvalue WorkFunction(double rho); + //the W-value as a func of density in g/cm^3 + virtual double NexONi(double energy, double density); + //calculate exciton/ion VDetector* GetDetector() { return fdetector; } }; } diff --git a/src/nestpy/RandomGen.cpp b/src/nestpy/RandomGen.cpp index 6993ea8..c84a332 100644 --- a/src/nestpy/RandomGen.cpp +++ b/src/nestpy/RandomGen.cpp @@ -69,7 +69,7 @@ vector RandomGen::VonNeumann(double xMin, double xMax, double yMin, // time } -int RandomGen::SelectRanXeAtom() { +int RandomGen::SelectRanXeAtom() { // to determine the isotope of Xe int A; double isotope = rand_uniform() * 100.; diff --git a/src/nestpy/TestSpectra.cpp b/src/nestpy/TestSpectra.cpp index 374b8a1..12b9185 100644 --- a/src/nestpy/TestSpectra.cpp +++ b/src/nestpy/TestSpectra.cpp @@ -161,31 +161,15 @@ double TestSpectra::Cf_spectrum(double xMin, double xMax) { double TestSpectra::DD_spectrum( double xMin, double xMax) { // JV LUX, most closely like JENDL-4. See // arXiv:1608.05381. Lower than G4/LUXSim - + if (xMax > 80.) xMax = 80.; if (xMin < 0.000) xMin = 0.000; - double yMax = 1.1694e+6; + double yMax = 1.1; vector xyTry = { - xMin + (xMax - xMin) * RandomGen::rndm()->rand_uniform(), - yMax * RandomGen::rndm()->rand_uniform(), 1.}; + xMin + (xMax - xMin) * RandomGen::rndm()->rand_uniform(), + yMax * RandomGen::rndm()->rand_uniform(), 1.}; while (xyTry[2] > 0.) { - double FuncValue = // 1.*exp(-0.15*xyTry[0])+2e-3*exp(0.05*xyTry[0]); - // //LUXSim version (Carmen) - 1.1694e+6 * pow(xyTry[0], 0.) - 1.4733e+5 * pow(xyTry[0], 1.) + - 8507.0 * pow(xyTry[0], 2.) - 273.59 * pow(xyTry[0], 3.) + - 4.3216 * pow(xyTry[0], 4.) + 0.0097428 * pow(xyTry[0], 5.) - - 0.0017966 * pow(xyTry[0], 6.) + 3.4069e-5 * pow(xyTry[0], 7.) - - 2.918e-7 * pow(xyTry[0], 8.) + 9.973e-10 * pow(xyTry[0], 9.); - FuncValue /= 1. + - 0.85 * (-.016698 / pow(xyTry[0] - 75., 1.) + - 8.04540 / pow(xyTry[0] - 75., 2.) + - 105.000 / pow(xyTry[0] - 75., 3.) + - 582.400 / pow(xyTry[0] - 75., 4.) + - 1218.50 / pow(xyTry[0] - 75., 5.) + - 1250.90 / pow(xyTry[0] - 75., 6.) + - 659.680 / pow(xyTry[0] - 75., 7.) + - 161.110 / pow(xyTry[0] - 75., 8.) + - 11.7710 / pow(xyTry[0] - 75., 9.)); + double FuncValue = exp(-xyTry[0]/10.) + 0.1*exp(-pow((xyTry[0]-60.)/25.,2.)); xyTry = RandomGen::rndm()->VonNeumann(xMin, xMax, 0., yMax, xyTry[0], xyTry[1], FuncValue); } @@ -212,9 +196,9 @@ double TestSpectra::WIMP_dRate(double ER, double mWimp) { double SqrtPi = pow(M_PI, 0.5); double root2 = sqrt(2.); // Convert all velocities from km/s into cm/s - double v_0 = V_WIMP * cmPerkm; - double v_esc = V_ESCAPE * cmPerkm; - double v_e = V_EARTH * cmPerkm; + double v_0 = V_WIMP * cmPerkm; // peak WIMP velocity + double v_esc = V_ESCAPE * cmPerkm; // escape velocity + double v_e = V_EARTH * cmPerkm; // the Earth's velocity // Define the detector Z and A and the mass of the target nucleus double Z = ATOM_NUM; @@ -296,7 +280,7 @@ double TestSpectra::WIMP_dRate(double ER, double mWimp) { break; default: cerr << "\tThe velocity integral in the WIMP generator broke!!!" << endl; - exit(1); + exit(EXIT_FAILURE); } double a = 0.52; // in fm @@ -334,14 +318,12 @@ double TestSpectra::WIMP_dRate(double ER, double mWimp) { TestSpectra::WIMP_spectrum_prep TestSpectra::WIMP_prep_spectrum(double mass, double eStep) { WIMP_spectrum_prep spectrum; - double EnergySpec[10001] = {0}, divisor, x1, x2; + double divisor, x1, x2; + vector EnergySpec; int numberPoints; - if (mass < 2.0) { // GeV/c^2 - divisor = 100 / eStep; - if ((eStep * 0.01) > 0.01) - cerr << "WARNING, <= 0.01 keV step size recommended" << endl; - numberPoints = int(10000. / eStep); + divisor = 10. / eStep; + numberPoints = int(1000. / eStep); } else if (mass < 10.) { divisor = 10. / eStep; numberPoints = int(1000. / eStep); @@ -349,30 +331,40 @@ TestSpectra::WIMP_spectrum_prep TestSpectra::WIMP_prep_spectrum(double mass, divisor = 1.0 / eStep; numberPoints = int(100. / eStep); } - + int nZeros = 0; //keep track of the number of zeros in a row for (int i = 0; i < (numberPoints + 1); i++) { - EnergySpec[i] = WIMP_dRate(double(i) / divisor, mass); + EnergySpec.push_back( WIMP_dRate(double(i) / divisor, mass) ); + if ( EnergySpec[i] == 0. ) nZeros++; + else nZeros = 0; //reset the count if EnergySpec[i] != zero + if ( nZeros == 100 ) break; //quit the for-loop once we're sure we're only getting zeros } for (long i = 0; i < 1000000; i++) { spectrum.integral += WIMP_dRate(double(i) / 1e4, mass) / 1e4; } - - for (int i = 0; i < numberPoints; i++) { + spectrum.xMax = ( (double) EnergySpec.size() - 1. )/divisor; + //defualt value -- will be overwritten if + //xMax is acutally smaller + for (int i = 0; i < (int) EnergySpec.size() - 1; i++) { x1 = double(i) / divisor; x2 = double(i + 1) / divisor; spectrum.base[i] = EnergySpec[i + 1] * pow(EnergySpec[i + 1] / EnergySpec[i], x2 / (x1 - x2)); spectrum.exponent[i] = log(EnergySpec[i + 1] / EnergySpec[i]) / (x1 - x2); if (spectrum.base[i] > 0. && spectrum.base[i] < DBL_MAX && - spectrum.exponent[i] > 0. && spectrum.exponent[i] < DBL_MAX) + spectrum.exponent[i] > 0. && spectrum.exponent[i] < DBL_MAX ) ; // spectrum.integral+=spectrum.base[i]/spectrum.exponent[i]*(exp(-spectrum.exponent[i]*x1)-exp(-spectrum.exponent[i]*x2)); else { + if ( EnergySpec[i+1] > 10. ) { //i.e. the calculation stopped before event rate was low + cerr << "ERROR: WIMP E_step is too small (or large)! Increase(decrease) it slightly to avoid noise in the calculation." << endl; + exit(EXIT_FAILURE); + } spectrum.xMax = double(i - 1) / divisor; if (spectrum.xMax <= 0.0) { - cerr << "ERROR: The maximum possible WIMP recoil is negative, which " - "usually means your E_step is too small." << endl; - exit(1); + cerr << "ERROR: The maximum possible WIMP recoil is not +-ive, which " + "usually means your E_step is too small (OR it is too large)." + << endl; + exit(EXIT_FAILURE); } break; } diff --git a/src/nestpy/TestSpectra.hh b/src/nestpy/TestSpectra.hh index 9cc7899..c43c669 100644 --- a/src/nestpy/TestSpectra.hh +++ b/src/nestpy/TestSpectra.hh @@ -17,11 +17,13 @@ #include "RandomGen.hh" -#define NEST_AVO 6.0221409e+23 // good to keep in sync w/ NEST.hh, can't define twice +#define NEST_AVO \ + 6.0221409e+23 // good to keep in sync w/ NEST.hh, can't define twice #define ATOM_NUM 54. // ibid. #define RHO_NAUGHT 0.3 // local DM halo density in [GeV/cm^3] -#define V_EARTH 245. // for LUX Run03; if you want Run04 use 230 km/s (arXiv:1705.03380) +#define V_EARTH \ + 245. // for LUX Run03; if you want Run04 use 230 km/s (arXiv:1705.03380) #define V_WIMP 220. #define V_ESCAPE 544. diff --git a/src/nestpy/VDetector.cpp b/src/nestpy/VDetector.cpp index 1094ef1..7b1ecc2 100644 --- a/src/nestpy/VDetector.cpp +++ b/src/nestpy/VDetector.cpp @@ -17,53 +17,4 @@ VDetector::VDetector() { Initialization(); } VDetector::~VDetector() {} void VDetector::Initialization() { - // Primary Scintillation (S1) parameters - g1 = 0.0760; // phd per S1 phot at dtCntr (not phe). Divide out 2-PE effect - sPEres = 0.58; // single phe resolution (Gaussian assumed) - sPEthr = 0.35; // POD threshold in phe, usually used IN PLACE of sPEeff - sPEeff = 1.00; // actual efficiency, can be used in lieu of POD threshold - noise[0] = 0.0; // baseline noise mean and width in PE (Gaussian) - noise[1] = 0.0; // baseline noise mean and width in PE (Gaussian) - P_dphe = 0.2; // chance 1 photon makes 2 phe instead of 1 in Hamamatsu PMT - - coinWind = 100; // S1 coincidence window in ns - coinLevel = 2; // how many PMTs have to fire for an S1 to count - numPMTs = 89; // For coincidence calculation - - // Ionization and Secondary Scintillation (S2) parameters - g1_gas = 0.06; // phd per S2 photon in gas, used to get SE size - s2Fano = 3.61; // Fano-like fudge factor for SE width - s2_thr = 300.; // the S2 threshold in phe or PE, *not* phd. Affects NR most - E_gas = 12.; // field in kV/cm between liquid/gas border and anode - eLife_us = 2200.; // the drift electron mean lifetime in micro-seconds - - // Thermodynamic Properties - inGas = false; - T_Kelvin = 177.; // for liquid drift speed calculation - p_bar = 2.14; // gas pressure in units of bars, it controls S2 size - // if you are getting warnings about being in gas, lower T and/or raise p - - // Data Analysis Parameters and Geometry - dtCntr = 40.; // center of detector for S1 corrections, in usec. - dt_min = 20.; // minimum. Top of detector fiducial volume - dt_max = 60.; // maximum. Bottom of detector fiducial volume - - radius = 50.; // millimeters - radmax = 50.; - - TopDrift = 150.; // mm not cm or us (but, this *is* where dt=0) - // a z-axis value of 0 means the bottom of the detector (cathode OR bottom - // PMTs) - // In 2-phase, TopDrift=liquid/gas border. In gas detector it's GATE, not - // anode! - anode = 152.5; // the level of the anode grid-wire plane in mm - // In a gas TPC, this is not TopDrift (top of drift region), but a few mm - // above it - gate = 147.5; // mm. This is where the E-field changes (higher) - // in gas detectors, the gate is still the gate, but it's where S2 starts - cathode = 1.00; // mm. Defines point below which events are gamma-X - - // 2-D (X & Y) Position Reconstruction - PosResExp = 0.015; // exp increase in pos recon res at hi r, 1/mm - PosResBase = 70.8364; // baseline unc in mm, see NEST.cpp for usage } diff --git a/src/nestpy/VDetector.hh b/src/nestpy/VDetector.hh index ea50995..e57a378 100644 --- a/src/nestpy/VDetector.hh +++ b/src/nestpy/VDetector.hh @@ -25,9 +25,11 @@ class VDetector { double get_sPEres() { return sPEres; } double get_sPEthr() { return sPEthr; } double get_sPEeff() { return sPEeff; } - double* get_noise() { return &noise[0]; } + double* get_noiseB() { return &noiseB[0]; } + double* get_noiseL() { return &noiseL[0]; } double get_P_dphe() { return P_dphe; } - + + bool get_extraPhot(){ return extraPhot; } double get_coinWind() { return coinWind; } int get_coinLevel() { return coinLevel; } int get_numPMTs() { return numPMTs; } @@ -58,6 +60,9 @@ class VDetector { // 2-D (X & Y) Position Reconstruction double get_PosResExp() { return PosResExp; } double get_PosResBase() { return PosResBase; } + + // Xenon properties + double get_molarMass() {return molarMass;} // "Set Functions" // Primary Scintillation (S1) parameters @@ -65,14 +70,19 @@ class VDetector { void set_sPEres(double param) { sPEres = param; } void set_sPEthr(double param) { sPEthr = param; } void set_sPEeff(double param) { sPEeff = param; } - void set_noise(double p1, double p2, double p3, double p4) { - noise[0] = p1; - noise[1] = p2; - noise[2] = p3; - noise[3] = p4; + void set_noiseB(double p1, double p2, double p3, double p4) { + noiseB[0] = p1; + noiseB[1] = p2; + noiseB[2] = p3; + noiseB[3] = p4; + } + void set_noiseL(double p1, double p2) { + noiseL[0] = p1; + noiseL[1] = p2; } void set_P_dphe(double param) { P_dphe = param; } + void set_extraPhot(bool param){ extraPhot = param;} void set_coinWind(double param) { coinWind = param; } void set_coinLevel(int param) { coinLevel = param; } void set_numPMTs(int param) { numPMTs = param; } @@ -103,6 +113,9 @@ class VDetector { // 2-D (X & Y) Position Reconstruction void set_PosResExp(double param) { PosResExp = param; } void set_PosResBase(double param) { PosResBase = param; } + + //Xenon properties + void set_molarMass(double param) {molarMass = param;} // S1 PDE custom fit for function of z // s1polA + s1polB*z[mm] + s1polC*z^2+... (QE included, for binom dist) e.g. @@ -134,24 +147,65 @@ class VDetector { return PEperBin; } - protected: +protected: // Primary Scintillation (S1) parameters - int coinLevel, numPMTs; - double g1, sPEres, sPEthr, sPEeff, P_dphe, coinWind; - double noise[4]; + double g1 = 0.0760; // phd per S1 phot at dtCntr (not phe). Divide out 2-PE effect + double sPEres = 0.58; // single phe resolution (Gaussian assumed) + double sPEthr = 0.35; // POD threshold in phe, usually used IN PLACE of sPEeff + double sPEeff = 1.00; // actual efficiency, can be used in lieu of POD threshold + double noiseB[4] = {0.0, // baseline noise mean and width in PE (Gaussian) + 0.0, // baseline noise mean and width in PE (Gaussian) + 0.0, //EXO noise mean + 0.0 //EXO noise width + }; + + double P_dphe = 0.2; // chance 1 photon makes 2 phe instead of 1 in Hamamatsu PMT + + double coinWind = 100; // S1 coincidence window in ns + int coinLevel = 2; // how many PMTs have to fire for an S1 to count + int numPMTs = 89; // For coincidence calculation + + bool extraPhot=false; // for matching EXO-200's W measurement + //"Linear noise" terms as defined in Dahl thesis and by D. McK + double noiseL[2] = {3e-2,3e-2}; // S1->S1 Gaussian-smeared w/ noiseL[0]*S1. Ditto S2 // Ionization and Secondary Scintillation (S2) parameters - double g1_gas, s2Fano, s2_thr, E_gas, eLife_us; + double g1_gas = 0.06; // phd per S2 photon in gas, used to get SE size + double s2Fano = 3.61; // Fano-like fudge factor for SE width + double s2_thr = 300.; // the S2 threshold in phe or PE, *not* phd. Affects NR most + double E_gas = 12.; // field in kV/cm between liquid/gas border and anode + double eLife_us = 2200.; // the drift electron mean lifetime in micro-seconds // Thermodynamic Properties - bool inGas; - double T_Kelvin, p_bar; + bool inGas = false; + double T_Kelvin = 177.; // for liquid drift speed calculation + double p_bar = 2.14; // gas pressure in units of bars, it controls S2 size + // if you are getting warnings about being in gas, lower T and/or raise p // Data Analysis Parameters and Geometry - double dtCntr, dt_min, dt_max, radius, radmax, TopDrift, anode, cathode, gate; + double dtCntr = 40.; // center of detector for S1 corrections, in usec. + double dt_min = 20.; // minimum. Top of detector fiducial volume + double dt_max = 60.; // maximum. Bottom of detector fiducial volume + + double radius = 50.; // millimeters + double radmax = 50.; + + double TopDrift = 150.; // mm not cm or us (but, this *is* where dt=0) + // a z-axis value of 0 means the bottom of the detector (cathode OR bottom + // PMTs) + // In 2-phase, TopDrift=liquid/gas border. In gas detector it's GATE, not + // anode! + double anode = 152.5; // the level of the anode grid-wire plane in mm + // In a gas TPC, this is not TopDrift (top of drift region), but a few mm + // above it + double gate = 147.5; // mm. This is where the E-field changes (higher) + // in gas detectors, the gate is still the gate, but it's where S2 starts + double cathode = 1.00; // mm. Defines point below which events are gamma-X // 2-D (X & Y) Position Reconstruction - double PosResExp, PosResBase; + double PosResExp = 0.015; // exp increase in pos recon res at hi r, 1/mm + double PosResBase = 70.8364; // baseline unc in mm, see NEST.cpp for usage + + double molarMass = 131.293; //molar mass, g/mol }; - #endif diff --git a/src/nestpy/analysis.hh b/src/nestpy/analysis.hh index 9e4b9f4..aeeb19e 100644 --- a/src/nestpy/analysis.hh +++ b/src/nestpy/analysis.hh @@ -2,28 +2,29 @@ // Verbosity flag (for limiting output to yields; no timing) bool verbosity = true; -// General parameters of importance changing global behavior -bool MCtruthE = true; // false means reconstructed energy -bool MCtruthPos = true; // false means reconstructed position +// General parameters of importance changing the global behavior +bool MCtruthE = false; // false means reconstructed energy +bool MCtruthPos = false; // false means reconstructed position int useTiming = 0; // photon arrival times + pulse shapes (2=eTrains) // if 1 or 2 but verb off, then timing only saved as vectors +// if -1 it means a special extra-fast mode for higher energies // 0 means PE, 1 means phd (PE/~1.2), 2 means spike count -int usePD = 0; +int usePD = 2; // band style: log(S2) with 1, while 0 means log(S2/S1) int useS2 = 0; // xtra feature: 2 means S2 x-axis energy scale -double minS1 = 0.; // units are controlled by the usePE flag +double minS1 = 1.7; //units are controlled by the usePE flag // this is separate from S1 thresholds controlled by detector -double maxS1 = 165.; -int numBins = 33; +double maxS1 = 110.6; +int numBins = 99; // for efficiency calculation // minS2 need not match S2 threshold in detector.hh // you can treat as trigger vs. analysis thresholds -double minS2 = 0.0; -double maxS2 = 1e9; +double minS2 = 42.; +double maxS2 = 5e3; // log(S2/S1) or log(S2) admitted into analysis incl. limit double logMax = 3.6; @@ -31,7 +32,11 @@ double logMin = 0.6; // some numbers for fine-tuning the speed vs. the accuracy double z_step = 0.1; // mm, for integrating non-uniform field -double E_step = 2.0; // keV, for integrating WIMP spectrum - -// Number of free parameters, for calculating DOF, for chi^2 -int freeParam = 2; +double E_step = 5.0; // keV, for integrating WIMP spectrum + +// Set the rootNEST options +int freeParam = 2; // #free param for calculating DoF in X^2 +int mode = 1; +//0 default is to provide the ER BG discrimination & leakage frac +//1 outputs the goodness of fit for one band (Gaussian centroids of histogram in S1 slices) +//2 outputs wimp masses and cross-sections for given efficiency diff --git a/src/nestpy/bindings.cpp b/src/nestpy/bindings.cpp index 0e15634..6ca05bb 100644 --- a/src/nestpy/bindings.cpp +++ b/src/nestpy/bindings.cpp @@ -2,7 +2,9 @@ #include "NEST.hh" #include "VDetector.hh" #include "testNEST.hh" -#include "DetectorExample_XENON10.hh" +//#include "DetectorExample_XENON10.hh" +#include "LUX_Run03.hh" + #include #include #include @@ -37,7 +39,7 @@ PYBIND11_MODULE(nestpy, m) { .def_readwrite("yields", &NEST::NESTresult::yields) .def_readwrite("quanta", &NEST::NESTresult::quanta) .def_readwrite("photon_times", &NEST::NESTresult::photon_times); - + // Binding for the enumeration INTERACTION_TYPE py::enum_(m, "INTERACTION_TYPE", py::arithmetic()) .value("NR", NEST::INTERACTION_TYPE::NR) @@ -64,10 +66,11 @@ PYBIND11_MODULE(nestpy, m) { .def("get_sPEres", &VDetector::get_sPEres) .def("get_sPEthr", &VDetector::get_sPEthr) .def("get_sPEeff", &VDetector::get_sPEeff) - .def("get_noise", &VDetector::get_noise) - .def("get_P_dphe", &VDetector::get_P_dphe) - - .def("get_coinWind", &VDetector::get_coinWind) + .def("get_noiseB", &VDetector::get_noiseB) //XX: edit + .def("get_noiseL", &VDetector::get_noiseL) //XX: edit + .def("get_P_dphe", &VDetector::get_P_dphe) + .def("get_P_dphe", &VDetector::get_P_dphe) + .def("get_extraPhot", &VDetector::get_extraPhot) //XX: added .def("get_coinLevel", &VDetector::get_coinLevel) .def("get_numPMTs", &VDetector::get_numPMTs) @@ -86,6 +89,7 @@ PYBIND11_MODULE(nestpy, m) { .def("get_dt_min", &VDetector::get_dt_min) .def("get_dt_max", &VDetector::get_dt_max) .def("get_radius", &VDetector::get_radius) + .def("get_radmax", &VDetector::get_radmax) //XX: added .def("get_TopDrift", &VDetector::get_TopDrift) .def("get_anode", &VDetector::get_anode) .def("get_cathode", &VDetector::get_cathode) @@ -93,14 +97,17 @@ PYBIND11_MODULE(nestpy, m) { .def("get_PosResExp", &VDetector::get_PosResExp) .def("get_PosResBase", &VDetector::get_PosResBase) + .def("get_molarMass", &VDetector::get_molarMass) //XX: added .def("set_g1", &VDetector::set_g1) .def("set_sPEres", &VDetector::set_sPEres) .def("set_sPEthr", &VDetector::set_sPEthr) .def("set_sPEeff", &VDetector::set_sPEeff) - .def("set_noise", &VDetector::set_noise) + .def("set_noiseB", &VDetector::set_noiseB) //XX: edit + .def("set_noiseL", &VDetector::set_noiseL) //XX: edit .def("set_P_dphe", &VDetector::set_P_dphe) + .def("set_extraPhot", &VDetector::set_extraPhot) //XX: added .def("set_coinWind", &VDetector::set_coinWind) .def("set_coinLevel", &VDetector::set_coinLevel) .def("set_numPMTs", &VDetector::set_numPMTs) @@ -120,6 +127,7 @@ PYBIND11_MODULE(nestpy, m) { .def("set_dt_min", &VDetector::set_dt_min) .def("set_dt_max", &VDetector::set_dt_max) .def("set_radius", &VDetector::set_radius) + .def("set_radmax", &VDetector::set_radmax) //XX: added .def("set_TopDrift", &VDetector::set_TopDrift) .def("set_anode", &VDetector::set_anode) .def("set_cathode", &VDetector::set_cathode) @@ -128,6 +136,9 @@ PYBIND11_MODULE(nestpy, m) { .def("set_PosResExp", &VDetector::set_PosResExp) .def("set_PosResBase", &VDetector::set_PosResBase) + .def("set_molarMass", &VDetector::set_molarMass) + + .def("FitS1", &VDetector::FitS1) .def("FitEF", &VDetector::FitEF) .def("FitS2", &VDetector::FitS2) @@ -135,7 +146,9 @@ PYBIND11_MODULE(nestpy, m) { .def("OptTrans", &VDetector::OptTrans) .def("SinglePEWaveForm", &VDetector::SinglePEWaveForm); - + + + /* // Binding for example XENONnT py::class_>(m, "DetectorExample_XENON10") .def(py::init<>()) @@ -143,14 +156,37 @@ PYBIND11_MODULE(nestpy, m) { .def("FitTBA", &DetectorExample_XENON10::FitTBA) .def("OptTrans", &DetectorExample_XENON10::OptTrans) .def("SinglePEWaveForm", &DetectorExample_XENON10::SinglePEWaveForm); + */ + + + py::class_>(m, "DetectorExample_LUX_RUN03") + .def(py::init<>()) + .def("Initialization", &DetectorExample_LUX_RUN03::Initialization) + .def("FitTBA", &DetectorExample_LUX_RUN03::FitTBA) + .def("OptTrans", &DetectorExample_LUX_RUN03::OptTrans) + .def("SinglePEWaveForm", &DetectorExample_LUX_RUN03::SinglePEWaveForm); + // Binding for the NESTcalc class py::class_(m, "NESTcalc") - .def(py::init<>()) + // .def(py::init<>()) .def(py::init()) .def("BinomFluct", &NEST::NESTcalc::BinomFluct) - .def("FullCalculation", &NEST::NESTcalc::FullCalculation, - "Perform the full yield calculation with smearings") + // .def("FullCalculation", &NEST::NESTcalc::FullCalculation, + // "Perform the full yield calculation with smearings") + + // XX: default input arguments + .def("FullCalculation", &NEST::NESTcalc::FullCalculation, + "Perform the full yield calculation with smearings", + py::arg("interaction") = NEST::INTERACTION_TYPE::NR, + py::arg("energy") = 100, + py::arg("density") = 2.9, + py::arg("drift_field") = 124, + py::arg("A") = 131.293, + py::arg("Z") = 54, + py::arg("nuisance_parameters") = std::vector({ 11., 1.1, 0.0480, -0.0533, 12.6, 0.3, 2., 0.3, 2., 0.5, 1., 1.}), + py::arg("free_parameters") = std::vector({1.,1.,0.1,0.5,0.07}), + py::arg("do_times") = false) .def("PhotonTime", &NEST::NESTcalc::PhotonTime) .def("AddPhotonTransportTime", &NEST::NESTcalc::AddPhotonTransportTime) .def("GetPhotonTimes", &NEST::NESTcalc::GetPhotonTimes) @@ -173,18 +209,18 @@ PYBIND11_MODULE(nestpy, m) { //.def("GetS2", &NEST::NESTcalc::GetS2) Currently not working because of VDetector.FitTBA() .def("CalculateG2", &NEST::NESTcalc::CalculateG2) .def("SetDriftVelocity", &NEST::NESTcalc::SetDriftVelocity) - .def("SetDriftVelocity_MagBoltz", &NEST::NESTcalc::SetDriftVelocity_MagBoltz) + // .def("SetDriftVelocity_MagBoltz", &NEST::NESTcalc::SetDriftVelocity_MagBoltz) .def("SetDriftVelocity_NonUniform", &NEST::NESTcalc::SetDriftVelocity_NonUniform) .def("SetDensity", &NEST::NESTcalc::SetDensity) - //.def("xyResolution", &NEST::NESTcalc::xyResolution) Currently not working because of VDetector.FitTBA() + //.def("xyResolution", &NEST::NESTcalc::xyResolution) Currently not working because of VDetector.FitTBA() .def("PhotonEnergy", &NEST::NESTcalc::PhotonEnergy) .def("CalcElectronLET", &NEST::NESTcalc::CalcElectronLET) + .def("GetDensity", &NEST::NESTcalc::GetDensity) .def("GetDetector", &NEST::NESTcalc::GetDetector); - + // testNEST function m.def("testNEST", &testNEST); m.def("GetEnergyRes", &GetEnergyRes); m.def("GetBand", &GetBand); - -} +} diff --git a/src/nestpy/testNEST.cpp b/src/nestpy/testNEST.cpp index 0ea6e3c..2bf0b6e 100644 --- a/src/nestpy/testNEST.cpp +++ b/src/nestpy/testNEST.cpp @@ -16,18 +16,18 @@ #include "analysis.hh" #include "testNEST.hh" -#include "DetectorExample_XENON10.hh" +#include "LUX_Run03.hh" using namespace std; using namespace NEST; -double band[NUMBINS_MAX][6]; +double band[NUMBINS_MAX][7]; double energies[3]; int main(int argc, char** argv) { // Instantiate your own VDetector class here, then load into NEST class // constructor - DetectorExample_XENON10* detector = new DetectorExample_XENON10(); + DetectorExample_LUX_RUN03* detector = new DetectorExample_LUX_RUN03(); // Custom parameter modification functions // detector->ExampleFunction(); @@ -51,8 +51,12 @@ int main(int argc, char** argv) { << endl; return 1; } - - unsigned long int numEvts = atoi(argv[1]); + + unsigned long int numEvts = (unsigned long)atof(argv[1]); + if ( numEvts <= 0 ) { + cerr << "ERROR, you must simulate at least 1 event" << endl; + return 1; + } string type = argv[2]; double eMin = atof(argv[3]); double eMax = atof(argv[4]); @@ -61,12 +65,12 @@ int main(int argc, char** argv) { string posiMuon = argv[4]; double fPos = atof(argv[6]); - int seed; + int seed = 0; //if not given->0 bool no_seed; if (argc == 8) { seed = atoi(argv[7]); } else { - seed = 0; + RandomGen::rndm()->SetSeed(0); no_seed = true; } @@ -88,17 +92,18 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, } vector signal1, signal2, signalE, vTable, - NuisParam = {11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.}, + NuisParam = {11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1., 1.}, // alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota for NR model - // last 2 are the secret extra parameters for additional flexibility + // last 3 are the secret extra parameters for additional flexibility FreeParam = {1.,1.,0.1,0.5,0.07}; // Fi, Fex, and 3 non-binomial recombination fluctuation parameters string delimiter, token; size_t loc; int index; double g2, pos_x, pos_y, pos_z, r, phi, driftTime, field, vD, - vD_middle = 0., atomNum = 0, massNum = 0, keVee = 0.0; - YieldResult yieldsMax; + vD_middle = 0., atomNum = 0, keVee = 0.0; + double massNum = detector->get_molarMass(); + YieldResult yieldsMax; //for warnings about S1 range if (no_seed != true) { if (seed == -1) { @@ -163,7 +168,7 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, type_num = Kr83m; else if (type == "CH3T" || type == "tritium") type_num = CH3T; - else if (type == "C14" || type == "Carbon14" || type == "14C") + else if (type == "C14" || type == "Carbon14" || type == "14C" || type == "C-14" || type == "Carbon-14") type_num = C14; else if (type == "beta" || type == "ER" || type == "Compton" || type == "compton" || type == "electron" || type == "e-" || @@ -184,12 +189,12 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, cerr << "x-ray or xray or xRay or X-ray or Xray or XRay," << endl; cerr << "Kr83m or 83mKr or Kr83," << endl; cerr << "CH3T or tritium," << endl; - cerr << "Carbon14 or 14C or C14," << endl; + cerr << "Carbon14 or 14C or C14 or C-14 or Carbon-14," << endl; cerr << "beta or ER or Compton or compton or electron or e-, and" << endl; cerr << "muon or MIP or LIP or mu or mu-" << endl; return 1; } - + if (type_num == Kr83m) { if (eMin == 9.4 && eMax == 9.4) { } else if (eMin == 32.1 && eMax == 32.1) { @@ -214,12 +219,13 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, return 1; } if (rho < 1.75) detector->set_inGas(true); - double Wq_eV = - 1.9896 + - (20.8 - 1.9896) / - (1. + pow(rho / 4.0434, - 1.4407)); // out-of-sync danger: copied from NEST.cpp + double Wq_eV = n.WorkFunction(rho).Wq_eV; + //if ( rho > 3. ) detector->set_extraPhot(true); //solid OR enriched. Units of g/mL + if ( detector->get_extraPhot() ) + Wq_eV = 11.5; //11.5±0.5(syst.)±0.1(stat.) from EXO + + // Calculate and print g1, g2 parameters (once per detector) vector g2_params = n.CalculateG2(verbosity); g2 = fabs(g2_params[3]); @@ -230,12 +236,13 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, 2.; // fid vol def usually shave more off the top, because of gas // interactions (100->10cm) double centralField = detector->FitEF(0.0, 0.0, centralZ); + if ( inField != -1. ) centralField = inField; if (type_num == WIMP) { - yieldsMax = n.GetYields(NR, 25.0, rho, centralField, double(massNum), + yieldsMax = n.GetYields(NR, 25.0, rho, centralField, detector->get_molarMass(), double(atomNum), NuisParam); } else if (type_num == B8) { - yieldsMax = n.GetYields(NR, 4.00, rho, centralField, double(massNum), + yieldsMax = n.GetYields(NR, 4.00, rho, centralField, detector->get_molarMass(), double(atomNum), NuisParam); } else { double energyMaximum; @@ -256,7 +263,9 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, if ((g1 * yieldsMax.PhotonYield) > (2. * maxS1) && eMin != eMax) cerr << "\nWARNING: Your energy maximum may be too high given your maxS1.\n"; - + + if ( type_num < 6 ) massNum = 0; + double keV = -999.; for (unsigned long int j = 0; j < numEvts; j++) { if (eMin == eMax && eMin >= 0. && eMax > 0.) { @@ -305,7 +314,16 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, if (keV > eMax) keV = eMax; if (keV < eMin) keV = eMin; } - + + if ( keV < 0. ) { + cerr << "ERROR: Get ready for time travel or FTL--negative energy!" << endl; + return 1; + } + if( keV == 0. ) { + cerr << "WARNING: Zero energy has occurred, and this is not normal" << endl; + } + + double FudgeFactor[2] = { 1., 1. }; Z_NEW: if (fPos == -1.) { // -1 means default, random location mode pos_z = 0. + @@ -415,17 +433,18 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, } // The following should never happen: this is simply a just-in-case - // code-block dealing with user error + // code-block dealing with user error (rounding another possible culprit) if (pos_z <= 0.) { - cerr << "ERROR: unphysically low Z coordinate (vertical axis of " - "detector) of " << pos_z << " mm" << endl; - return 1; + cerr << "WARNING: unphysically low Z coordinate (vertical axis of " + "detector) of " << pos_z << " mm" << endl; //warn user on screen + pos_z = z_step; } if ((pos_z > (detector->get_TopDrift() + z_step) || driftTime < 0.0) && field >= FIELD_MIN) { - cerr << "ERROR: unphysically big Z coordinate (vertical axis of " - "detector) of " << pos_z << " mm" << endl; - return 1; + cerr << "WARNING: unphysically big Z coordinate (vertical axis of " + "detector) of " << pos_z << " mm" << endl; // give the specifics + driftTime = 0.0; + pos_z = detector->get_TopDrift() - z_step; //just fix it and move on } YieldResult yields; @@ -501,11 +520,11 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, } else { if (keV > .001 * Wq_eV) { if ( type == "ER" ) { - YieldResult yieldsB = n.GetYields(INTERACTION_TYPE::beta, keV, rho, field, + YieldResult yieldsB = n.GetYields(NEST::beta, keV, rho, field, double(massNum), double(atomNum), NuisParam); YieldResult yieldsG = n.GetYields(gammaRay, keV, rho, field, double(massNum), double(atomNum), NuisParam); - double weightG = 0.5 + 0.5 * erf ( 1.0 * ( log ( keV ) - 5.0 ) ); + double weightG = 0.82 + 0.43 * erf ( -2.7 * ( log ( keV ) - 1.3 ) ); double weightB = 1. - weightG; yields.PhotonYield = weightG * yieldsG.PhotonYield + weightB * yieldsB.PhotonYield; yields.ElectronYield = weightG * yieldsG.ElectronYield + weightB * yieldsB.ElectronYield; @@ -513,10 +532,14 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, yields.Lindhard = weightG * yieldsG.Lindhard + weightB * yieldsB.Lindhard; yields.ElectricField = weightG * yieldsG.ElectricField + weightB * yieldsB.ElectricField; yields.DeltaT_Scint = weightG * yieldsG.DeltaT_Scint + weightB * yieldsB.DeltaT_Scint; + FudgeFactor[0] = 1.02; + FudgeFactor[1] = 1.05; + yields.PhotonYield *= FudgeFactor[0]; + yields.ElectronYield*=FudgeFactor[1]; + detector->set_noiseL(5.5e-2, 2.2e-2); } else - yields = n.GetYields(type_num, keV, rho, field, double(massNum), - double(atomNum), NuisParam); + yields = n.GetYields(type_num, keV, rho, field, double(massNum), double(atomNum), NuisParam); quanta = n.GetQuanta(yields, rho, FreeParam); } else { yields.PhotonYield = 0.; @@ -531,7 +554,11 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, quanta.excitons = 0; } } - + + if ( detector->get_noiseB()[2] != 0. || detector->get_noiseB()[3] != 0. ) + quanta.electrons += int(floor(RandomGen::rndm()->rand_gauss( + detector->get_noiseB()[2],detector->get_noiseB()[3])+0.5)); + // If we want the smeared positions (non-MC truth), then implement // resolution function double truthPos[3] = {pos_x, pos_y, pos_z}; @@ -550,6 +577,11 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, vector scint = n.GetS1(quanta, truthPos, smearPos, vD, vD_middle, type_num, j, field, keV, useTiming, verbosity, wf_time, wf_amp); + if (truthPos[2] < detector->get_cathode()) quanta.electrons = 0; + vector scint2 = + n.GetS2(quanta.electrons, truthPos, smearPos, driftTime, vD, j, field, + useTiming, verbosity, wf_time, wf_amp, g2_params); + NEW_RANGES: if (usePD == 0 && fabs(scint[3]) > minS1 && scint[3] < maxS1) signal1.push_back(scint[3]); else if (usePD == 1 && fabs(scint[5]) > minS1 && scint[5] < maxS1) @@ -558,17 +590,20 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, signal1.push_back(scint[7]); else signal1.push_back(-999.); - - if (truthPos[2] < detector->get_cathode()) quanta.electrons = 0; - vector scint2 = - n.GetS2(quanta.electrons, truthPos, smearPos, driftTime, vD, j, field, - useTiming, verbosity, wf_time, wf_amp, g2_params); + if (usePD == 0 && fabs(scint2[5]) > minS2 && scint2[5] < maxS2) signal2.push_back(scint2[5]); else if (usePD >= 1 && fabs(scint2[7]) > minS2 && scint2[7] < maxS2) signal2.push_back(scint2[7]); // no spike option for S2 else signal2.push_back(-999.); + + if ( eMin == eMax ) { + if ( scint[3] > maxS1 || scint[5] > maxS1 || scint[7] > maxS1 ) + cerr << "WARNING: Some S1 pulse areas are greater than maxS1" << endl; + if ( scint2[5] > maxS2 || scint2[7] > maxS2 ) + cerr << "WARNING: Some S2 pulse areas are greater than maxS2" << endl; + } if (!MCtruthE) { double Nph, Ne; @@ -585,7 +620,9 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, if (signal1.back() <= 0.) Nph = 0.; if (signal2.back() <= 0.) Ne = 0.; if (yields.Lindhard > DBL_MIN && Nph > 0. && Ne > 0.) { - keV = (Nph + Ne) * Wq_eV * 1e-3 / yields.Lindhard; + if ( detector->get_extraPhot() ) yields.Lindhard = 1.; + keV = (Nph/FudgeFactor[0] + Ne/FudgeFactor[1]) * + Wq_eV * 1e-3 / yields.Lindhard; keVee += (Nph + Ne) * Wq_eV * 1e-3; // as alternative, use W_DEFAULT in // both places, but won't account // for density dependence @@ -596,7 +633,21 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, signalE.push_back(0.); else signalE.push_back(keV); - + + if ( keVee == 0.00 && eMin == eMax ) { //efficiency is zero + minS1 = -999.; + minS2 = -999.; + maxS1 = 1e9; + maxS2 = 1e11; + cerr << endl << "CAUTION: Efficiency was zero, so trying again with full S1 and S2 ranges." << endl; + numBins = 1; + MCtruthE = false; + signal1.clear(); + signal2.clear(); + signalE.clear(); + goto NEW_RANGES; + } + // Possible outputs from "scint" vector // scint[0] = nHits; // MC-true integer hits in same OR different PMTs, NO // double phe effect @@ -637,9 +688,9 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, // including bottom PMTs, NO XYZ correction // scint2[5] = S2bc; // floating real# smeared pulse areas in phe ONLY // including bottom PMTs, WITH XYZ correction - // scint2[6] = S2b / (1.+fdetector->get_P_dphe()); // same as S2b, but + // scint2[6] = S2b / (1.+detector->get_P_dphe()); // same as S2b, but // adjusted for 2-PE effect (LUX phd units) - // scint2[7] = S2bc / (1.+fdetector->get_P_dphe()); // same as S2bc, but + // scint2[7] = S2bc / (1.+detector->get_P_dphe()); // same as S2bc, but // adjusted for 2-PE effect (LUX phd units) // scint2[8] = g2; // g2 = ExtEff * SE, light collection efficiency of EL in // gas gap (from CalculateG2) @@ -656,8 +707,8 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, driftTime, smearPos[0], smearPos[1], smearPos[2], quanta.photons, quanta.electrons); // comment this out when below line in // printf("%.6f\t%.6f\t%.6f\t%.0f, %.0f,%.0f\t%lf\t%lf\t",keV,field,driftTime,smearPos[0],smearPos[1],smearPos[2],yields.PhotonYield,yields.ElectronYield); - // //for when you want means - if (truthPos[2] < detector->get_cathode() && verbosity) printf("g-X "); + //for when you want means + // if (truthPos[2] < detector->get_cathode() && verbosity) printf("g-X "); if (keV > 1000. || scint[5] > maxS1 || scint2[7] > maxS2 || // switch to exponential notation to make output more readable, if // energy is too high (>1 MeV) @@ -687,10 +738,10 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, GetBand(signal1, signal2, false); fprintf(stderr, "Bin Center\tBin Actual\tHist Mean\tMean Error\tHist " - "Sigma\t\tEff[%%>thr]\n"); + "Sigma\tSkewness\t\tEff[%%>thr]\n"); for (int j = 0; j < numBins; j++) { - fprintf(stderr, "%lf\t%lf\t%lf\t%lf\t%lf\t\t%lf\n", band[j][0], - band[j][1], band[j][2], band[j][4], band[j][3], + fprintf(stderr,"%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t\t%lf\n", band[j][0], + band[j][1], band[j][2], band[j][4], band[j][3], band[j][6], band[j][5] * 100.); if (band[j][0] <= 0.0 || band[j][1] <= 0.0 || band[j][2] <= 0.0 || band[j][3] <= 0.0 || band[j][4] <= 0.0 || band[j][5] <= 0.0 || @@ -714,7 +765,7 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, } else { GetBand(signal1, signal2, true); GetEnergyRes(signalE); - if (type_num == NR) { + if (type_num == NR || type_num == WIMP || type_num == B8 || type_num == DD || type_num == AmBe || type_num == Cf || type_num == ion) { fprintf(stderr, "S1 Mean\t\tS1 Res [%%]\tS2 Mean\t\tS2 Res [%%]\tEc " "[keVnr]\tEc Res[%%]\tEff[%%>thr]\tEc [keVee]\n"); @@ -729,7 +780,7 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, band[j][1] / band[j][0] * 100., band[j][2], band[j][3] / band[j][2] * 100., energies[0], energies[1] / energies[0] * 100., energies[2] * 100.); - if (type_num == NR) + if (type_num < 7) //0-6=NR/related (WIMPs,etc.) fprintf(stderr, "%lf\n", keVee / energies[2]); else fprintf(stderr, "\n"); @@ -759,6 +810,12 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, vector> GetBand(vector S1s, vector S2s, bool resol) { + + if ( numBins > NUMBINS_MAX ) { + cerr << "ERROR: Too many bins. Decrease numBins (analysis.hh) or increase NUMBINS_MAX (TestSpectra.hh)" << endl; + exit ( EXIT_FAILURE ); + } + vector> signals; signals.resize(numBins, vector(1, -999.)); double binWidth, border; @@ -848,6 +905,11 @@ vector> GetBand(vector S1s, vector S2s, } band[j][4] = band[j][3] / sqrt(numPts); band[j][5] = numPts / (numPts + double(reject[j])); + for ( i = 0; i < (int)numPts; i++ ) { + if ( signals[j][i] != -999. ) + band[j][6] += pow ( ( signals[j][i] - band[j][2] ) / band[j][3], 3. ); // skew calc + } + band[j][6] /= ( numPts - 1. ); } return signals; diff --git a/src/nestpy/testNEST.hh b/src/nestpy/testNEST.hh index 35d52bc..fbe7e4d 100644 --- a/src/nestpy/testNEST.hh +++ b/src/nestpy/testNEST.hh @@ -1,7 +1,5 @@ -#ifndef TESTNEST_HH -#define TESTNEST_HH - -#include "TestSpectra.hh" +#ifndef __TESTNEST_H__ +#define __TESTNEST_H__ 1 using namespace std; using namespace NEST; @@ -15,4 +13,4 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, double eMin, double eMax, double inField, string position, string posiMuon, double fPos, int seed, bool no_seed); -#endif /* TESTNEST_HH */ +#endif From 86d75610ffc72752c69ec64231a8768089933d22 Mon Sep 17 00:00:00 2001 From: xxiang4 Date: Wed, 25 Mar 2020 01:44:27 -0400 Subject: [PATCH 02/18] Minor comments --- README.md | 2 ++ src/nestpy/bindings.cpp | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7bd2465..3fefbf5 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) [![Python Versions](https://img.shields.io/pypi/pyversions/nestpy.svg)](https://pypi.python.org/pypi/nestpy) +This package is forked from [nestpy](https://github.com/NESTCollaboration/nestpy) and updated to LUX Run3 Detector template. + These are the Python bindings for the [NEST library](https://github.com/NESTCollaboration/nest), which provides a direct wrapping of functionality. The library is not Pythonic at this point but just uses the existing naming conventions from the C++ library. You do *not* have to have NEST already installed to use this package. diff --git a/src/nestpy/bindings.cpp b/src/nestpy/bindings.cpp index 6ca05bb..f8f1af6 100644 --- a/src/nestpy/bindings.cpp +++ b/src/nestpy/bindings.cpp @@ -172,10 +172,8 @@ PYBIND11_MODULE(nestpy, m) { // .def(py::init<>()) .def(py::init()) .def("BinomFluct", &NEST::NESTcalc::BinomFluct) - // .def("FullCalculation", &NEST::NESTcalc::FullCalculation, - // "Perform the full yield calculation with smearings") - // XX: default input arguments + // XX: add default input arguments .def("FullCalculation", &NEST::NESTcalc::FullCalculation, "Perform the full yield calculation with smearings", py::arg("interaction") = NEST::INTERACTION_TYPE::NR, From 83c7aff5d009ad83172363f0073cebc068ae3c50 Mon Sep 17 00:00:00 2001 From: xxiang4 Date: Wed, 25 Mar 2020 13:36:21 -0400 Subject: [PATCH 03/18] Add a function to generate (S1, S2) from a single energy deposition --- src/nestpy/analysis.hh | 5 ++ src/nestpy/bindings.cpp | 5 +- src/nestpy/testNEST.cpp | 135 +++++++++++++++++++++++++++++++++++----- src/nestpy/testNEST.hh | 14 +++++ 4 files changed, 143 insertions(+), 16 deletions(-) diff --git a/src/nestpy/analysis.hh b/src/nestpy/analysis.hh index aeeb19e..30079f9 100644 --- a/src/nestpy/analysis.hh +++ b/src/nestpy/analysis.hh @@ -1,3 +1,6 @@ +#ifndef __ANALYSIS_H__ +#define __ANALYSIS_H__ 1 + // Verbosity flag (for limiting output to yields; no timing) bool verbosity = true; @@ -40,3 +43,5 @@ int mode = 1; //0 default is to provide the ER BG discrimination & leakage frac //1 outputs the goodness of fit for one band (Gaussian centroids of histogram in S1 slices) //2 outputs wimp masses and cross-sections for given efficiency + +#endif diff --git a/src/nestpy/bindings.cpp b/src/nestpy/bindings.cpp index f8f1af6..fcdeca5 100644 --- a/src/nestpy/bindings.cpp +++ b/src/nestpy/bindings.cpp @@ -216,9 +216,12 @@ PYBIND11_MODULE(nestpy, m) { .def("GetDensity", &NEST::NESTcalc::GetDensity) .def("GetDetector", &NEST::NESTcalc::GetDetector); - // testNEST function + // testNEST functions m.def("testNEST", &testNEST); m.def("GetEnergyRes", &GetEnergyRes); m.def("GetBand", &GetBand); + // XX: added + m.def("runNEST", &runNEST, "Generate (S1, S2) for a single recoil"); + } diff --git a/src/nestpy/testNEST.cpp b/src/nestpy/testNEST.cpp index 2bf0b6e..b53b07d 100644 --- a/src/nestpy/testNEST.cpp +++ b/src/nestpy/testNEST.cpp @@ -51,7 +51,7 @@ int main(int argc, char** argv) { << endl; return 1; } - + unsigned long int numEvts = (unsigned long)atof(argv[1]); if ( numEvts <= 0 ) { cerr << "ERROR, you must simulate at least 1 event" << endl; @@ -194,7 +194,7 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, cerr << "muon or MIP or LIP or mu or mu-" << endl; return 1; } - + if (type_num == Kr83m) { if (eMin == 9.4 && eMax == 9.4) { } else if (eMin == 32.1 && eMax == 32.1) { @@ -225,7 +225,7 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, if ( detector->get_extraPhot() ) Wq_eV = 11.5; //11.5±0.5(syst.)±0.1(stat.) from EXO - + // Calculate and print g1, g2 parameters (once per detector) vector g2_params = n.CalculateG2(verbosity); g2 = fabs(g2_params[3]); @@ -263,9 +263,9 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, if ((g1 * yieldsMax.PhotonYield) > (2. * maxS1) && eMin != eMax) cerr << "\nWARNING: Your energy maximum may be too high given your maxS1.\n"; - + if ( type_num < 6 ) massNum = 0; - + double keV = -999.; for (unsigned long int j = 0; j < numEvts; j++) { if (eMin == eMax && eMin >= 0. && eMax > 0.) { @@ -314,7 +314,7 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, if (keV > eMax) keV = eMax; if (keV < eMin) keV = eMin; } - + if ( keV < 0. ) { cerr << "ERROR: Get ready for time travel or FTL--negative energy!" << endl; return 1; @@ -322,7 +322,7 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, if( keV == 0. ) { cerr << "WARNING: Zero energy has occurred, and this is not normal" << endl; } - + double FudgeFactor[2] = { 1., 1. }; Z_NEW: if (fPos == -1.) { // -1 means default, random location mode @@ -554,11 +554,11 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, quanta.excitons = 0; } } - + if ( detector->get_noiseB()[2] != 0. || detector->get_noiseB()[3] != 0. ) quanta.electrons += int(floor(RandomGen::rndm()->rand_gauss( detector->get_noiseB()[2],detector->get_noiseB()[3])+0.5)); - + // If we want the smeared positions (non-MC truth), then implement // resolution function double truthPos[3] = {pos_x, pos_y, pos_z}; @@ -590,14 +590,14 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, signal1.push_back(scint[7]); else signal1.push_back(-999.); - + if (usePD == 0 && fabs(scint2[5]) > minS2 && scint2[5] < maxS2) signal2.push_back(scint2[5]); else if (usePD >= 1 && fabs(scint2[7]) > minS2 && scint2[7] < maxS2) signal2.push_back(scint2[7]); // no spike option for S2 else signal2.push_back(-999.); - + if ( eMin == eMax ) { if ( scint[3] > maxS1 || scint[5] > maxS1 || scint[7] > maxS1 ) cerr << "WARNING: Some S1 pulse areas are greater than maxS1" << endl; @@ -633,7 +633,7 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, signalE.push_back(0.); else signalE.push_back(keV); - + if ( keVee == 0.00 && eMin == eMax ) { //efficiency is zero minS1 = -999.; minS2 = -999.; @@ -647,7 +647,7 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, signalE.clear(); goto NEW_RANGES; } - + // Possible outputs from "scint" vector // scint[0] = nHits; // MC-true integer hits in same OR different PMTs, NO // double phe effect @@ -810,12 +810,12 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, vector> GetBand(vector S1s, vector S2s, bool resol) { - + if ( numBins > NUMBINS_MAX ) { cerr << "ERROR: Too many bins. Decrease numBins (analysis.hh) or increase NUMBINS_MAX (TestSpectra.hh)" << endl; exit ( EXIT_FAILURE ); } - + vector> signals; signals.resize(numBins, vector(1, -999.)); double binWidth, border; @@ -938,3 +938,108 @@ void GetEnergyRes(vector Es) { energies[2] = numerator / double(numPts); return; } + + + + +//XX: added +int runNEST(VDetector* detector, double keV, INTERACTION_TYPE type_num, double inField, double pos_x, double pos_y, double pos_z, int seed){ + + // Construct NEST class using detector object + NEST::NESTcalc n(detector); + + // Set random seed of RandomGen class + RandomGen::rndm()->SetSeed(seed); + + // Calculate noble density based on temperature and pressure. + // Use this to determine whether we are in gas phase + double rho = n.SetDensity(detector->get_T_Kelvin(),detector->get_p_bar()); + if (rho < 1.) detector->set_inGas(true); + + // Calculate and print g1, g2 parameters (once per detector) + vector g2_params = n.CalculateG2(); + double g2 = g2_params.back(); + + // Calculate a drift velocity table for non-uniform fields, + // and calculate the drift velocity at detector center for normalization + // purposes + vector vTable = n.SetDriftVelocity_NonUniform(rho, z_step, pos_x, pos_y); + double vD_middle = vTable[int(floor(.5 * (detector->get_gate() - 100. + detector->get_cathode() + 1.5) /z_step +0.5))]; + + // Calculate field map, and drift time + double field = detector->FitEF(pos_x, pos_y, pos_z); + int index = int(floor(pos_z / z_step + 0.5)); + double vD = vTable[index]; + double driftTime = (detector->get_TopDrift() - pos_z) / vD; + + // check position is within TPC active region + double r = pos_x*pos_x+pos_y*pos_y; + if (r > detector->get_radmax() + || driftTime < detector->get_dt_min() + || driftTime > detector->get_dt_max() + || pos_z <= 0 + || pos_z > detector->get_TopDrift()){ + cout<<"ERROR: position [" << pos_x<<" "<get_molarMass(); + } + + // best fit parameters for NEST 2.0.1 yield + vector NuisParam = {11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1., 1.}; + + // Get yields from NEST calculator, along with number of quanta + YieldResult yields = n.GetYields(type_num, keV, rho, field, double(massNum), + double(atomNum), NuisParam); + QuantaResult quanta = n.GetQuanta(yields, rho); + + // Calculate S2 photons using electron lifetime correction + double Nphd_S2 = g2 * quanta.electrons * exp(-driftTime / detector->get_eLife_us()); + + // Vectors for saving times and amplitudes of waveforms (with useTiming and + // verbosity boolean flags both set to true in analysis.hh) + vector wf_amp; + vector wf_time; + + double truthPos[3] = {pos_x, pos_y, pos_z}; + double smearPos[3] = {pos_x, pos_y, pos_z}; + + // Calculate the S1 based on the quanta generated + vector scint1 = n.GetS1(quanta, truthPos, smearPos, vD, vD_middle, + type_num, 0, field, keV, useTiming, verbosity, wf_time, wf_amp); + + // Take care of gamma-X case for positions below cathode + if (truthPos[2] < detector->get_cathode()) quanta.electrons = 0; + + // Calcualte the S2 based on electrons + vector scint2 = n.GetS2(quanta.electrons, truthPos, smearPos, driftTime, vD, 0, field, useTiming, verbosity, wf_time, wf_amp, g2_params); + + for(int i=0; i keV, INTERACTION_TYPE type_num, double inField, vector pos_x, vector pos_y, vector pos_z, int seed){ +// +// // Construct NEST class using detector object +// NEST::NESTcalc n(detector); +// +// // Set random seed of RandomGen class +// RandomGen::rndm()->SetSeed(seed); +// +// // Calculate noble density based on temperature and pressure. +// // Use this to determine whether we are in gas phase +// double rho = n.SetDensity(detector->get_T_Kelvin(),detector->get_p_bar()); +// if (rho < 1.) detector->set_inGas(true); +// +// // Calculate and print g1, g2 parameters (once per detector) +// vector g2_params = n.CalculateG2(); +// double g2 = g2_params.back(); +// +// +// } diff --git a/src/nestpy/testNEST.hh b/src/nestpy/testNEST.hh index fbe7e4d..4b3666e 100644 --- a/src/nestpy/testNEST.hh +++ b/src/nestpy/testNEST.hh @@ -13,4 +13,18 @@ int testNEST(VDetector* detector, unsigned long int numEvts, string type, double eMin, double eMax, double inField, string position, string posiMuon, double fPos, int seed, bool no_seed); +int runNEST(VDetector* detector, + double keV, + INTERACTION_TYPE type_num, + double inField, + double pos_x, double pos_y, double pos_z, + int seed); + +// int runNEST_vec(VDetector* detector, +// vector keV, +// INTERACTION_TYPE type_num, +// double inField, +// vector pos_x, vector pos_y, vector pos_z, +// int seed) + #endif From c65767b8334d2a7474a4d4e83b34e8f9d19a73dd Mon Sep 17 00:00:00 2001 From: xxiang4 Date: Wed, 25 Mar 2020 15:46:24 -0400 Subject: [PATCH 04/18] add a vectorized function allowing a list of energies as argument; it's slow though. We will have to find a way to move field dependence vTable outside --- src/nestpy/bindings.cpp | 14 ++++- src/nestpy/testNEST.cpp | 124 ++++++++++++++++++++++++++++++++-------- src/nestpy/testNEST.hh | 12 ++-- 3 files changed, 120 insertions(+), 30 deletions(-) diff --git a/src/nestpy/bindings.cpp b/src/nestpy/bindings.cpp index fcdeca5..6da7e90 100644 --- a/src/nestpy/bindings.cpp +++ b/src/nestpy/bindings.cpp @@ -222,6 +222,18 @@ PYBIND11_MODULE(nestpy, m) { m.def("GetBand", &GetBand); // XX: added - m.def("runNEST", &runNEST, "Generate (S1, S2) for a single recoil"); + m.def("runNEST", &runNEST, + "Generate (S1, S2) for a single recoil", + py::arg("detector"), + py::arg("keV") = 10., + py::arg("interaction") = NEST::INTERACTION_TYPE::NR, + py::arg("inField") = 180, + py::arg("pos_x") = 0., + py::arg("pos_y") = 0., + py::arg("pos_z") = 0., + py::arg("seed") = 0.); + + m.def("runNEST_vec", &runNEST_vec, + "Generate (S1, S2) for a vectorized recoil energies"); } diff --git a/src/nestpy/testNEST.cpp b/src/nestpy/testNEST.cpp index b53b07d..9026333 100644 --- a/src/nestpy/testNEST.cpp +++ b/src/nestpy/testNEST.cpp @@ -973,13 +973,13 @@ int runNEST(VDetector* detector, double keV, INTERACTION_TYPE type_num, double i double driftTime = (detector->get_TopDrift() - pos_z) / vD; // check position is within TPC active region - double r = pos_x*pos_x+pos_y*pos_y; + double r = sqrt(pos_x*pos_x+pos_y*pos_y); if (r > detector->get_radmax() - || driftTime < detector->get_dt_min() - || driftTime > detector->get_dt_max() || pos_z <= 0 || pos_z > detector->get_TopDrift()){ cout<<"ERROR: position [" << pos_x<<" "< keV, INTERACTION_TYPE type_num, double inField, vector pos_x, vector pos_y, vector pos_z, int seed){ -// -// // Construct NEST class using detector object -// NEST::NESTcalc n(detector); -// -// // Set random seed of RandomGen class -// RandomGen::rndm()->SetSeed(seed); -// -// // Calculate noble density based on temperature and pressure. -// // Use this to determine whether we are in gas phase -// double rho = n.SetDensity(detector->get_T_Kelvin(),detector->get_p_bar()); -// if (rho < 1.) detector->set_inGas(true); -// -// // Calculate and print g1, g2 parameters (once per detector) -// vector g2_params = n.CalculateG2(); -// double g2 = g2_params.back(); -// -// -// } +// XX: Added +int runNEST_vec(VDetector* detector, vector keV_vec, INTERACTION_TYPE type_num, double inField, vector pos_x_vec, vector pos_y_vec, vector pos_z_vec, int seed){ + + // Construct NEST class using detector object + NEST::NESTcalc n(detector); + + // Set random seed of RandomGen class + RandomGen::rndm()->SetSeed(seed); + + // Calculate noble density based on temperature and pressure. + // Use this to determine whether we are in gas phase + double rho = n.SetDensity(detector->get_T_Kelvin(),detector->get_p_bar()); + if (rho < 1.) detector->set_inGas(true); + + // Calculate and print g1, g2 parameters (once per detector) + vector g2_params = n.CalculateG2(); + double g2 = g2_params.back(); + + //check vector size match + int n_events = (int) keV_vec.size(); + if (pos_x_vec.size()!=n_events || pos_y_vec.size()!=n_events || pos_y_vec.size()!=n_events) { + cout<<"ERROR: array length mismatch detected. \n"; + return 1; + } + + + //////////////////////////////// + // calculation at event by event basis + //////////////////////////////// + for (int i=0; i vTable = n.SetDriftVelocity_NonUniform(rho, z_step, pos_x, pos_y); + double vD_middle = vTable[int(floor(.5 * (detector->get_gate() - 100. + detector->get_cathode() + 1.5) /z_step +0.5))]; + + // Calculate field map, and drift time + double field = detector->FitEF(pos_x, pos_y, pos_z); + int index = int(floor(pos_z / z_step + 0.5)); + double vD = vTable[index]; + double driftTime = (detector->get_TopDrift() - pos_z) / vD; + + // check position is within TPC active region + double r = sqrt(pos_x*pos_x+pos_y*pos_y); + if (r > detector->get_radmax() + || pos_z <= 0 + || pos_z > detector->get_TopDrift()){ + cout<<"ERROR: position [" << pos_x<<" "<get_molarMass(); + } + + // best fit parameters for NEST 2.0.1 yield + vector NuisParam = {11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1., 1.}; + + // Get yields from NEST calculator, along with number of quanta + YieldResult yields = n.GetYields(type_num, keV, rho, field, double(massNum), + double(atomNum), NuisParam); + QuantaResult quanta = n.GetQuanta(yields, rho); + + // Calculate S2 photons using electron lifetime correction + double Nphd_S2 = g2 * quanta.electrons * exp(-driftTime / detector->get_eLife_us()); + + // Vectors for saving times and amplitudes of waveforms (with useTiming and + // verbosity boolean flags both set to true in analysis.hh) + vector wf_amp; + vector wf_time; + + double truthPos[3] = {pos_x, pos_y, pos_z}; + double smearPos[3] = {pos_x, pos_y, pos_z}; + + // Calculate the S1 based on the quanta generated + vector scint1 = n.GetS1(quanta, truthPos, smearPos, vD, vD_middle, + type_num, 0, field, keV, useTiming, verbosity, wf_time, wf_amp); + + // Take care of gamma-X case for positions below cathode + if (truthPos[2] < detector->get_cathode()) quanta.electrons = 0; + + // Calcualte the S2 based on electrons + vector scint2 = n.GetS2(quanta.electrons, truthPos, smearPos, driftTime, vD, 0, field, useTiming, verbosity, wf_time, wf_amp, g2_params); + + cout<<"keV="< keV, -// INTERACTION_TYPE type_num, -// double inField, -// vector pos_x, vector pos_y, vector pos_z, -// int seed) +int runNEST_vec(VDetector* detector, + vector keV_vec, + INTERACTION_TYPE type_num, + double inField, + vector pos_x_vec, vector pos_y_vec, vector pos_z_vec, + int seed); #endif From 55294dfeeeef14ee4d3f384db10966f48c4124fd Mon Sep 17 00:00:00 2001 From: Xin Xiang <42788528+xxiang4@users.noreply.github.com> Date: Wed, 25 Mar 2020 15:54:29 -0400 Subject: [PATCH 05/18] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3fefbf5..56240bc 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,11 @@ [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) [![Python Versions](https://img.shields.io/pypi/pyversions/nestpy.svg)](https://pypi.python.org/pypi/nestpy) -This package is forked from [nestpy](https://github.com/NESTCollaboration/nestpy) and updated to LUX Run3 Detector template. +## Note from Xin: +This package is forked from [nestpy](https://github.com/NESTCollaboration/nestpy) and updated to LUX Run3 Detector template. In addition, two functions are added to `testNEST.cpp`. +1. A function that produce (S1, S2) observables +2. A vectorized function that accept energy in a list as input. +Please see `example/demo_v0.ipynb` for the usage of the two functions. These are the Python bindings for the [NEST library](https://github.com/NESTCollaboration/nest), which provides a direct wrapping of functionality. The library is not Pythonic at this point but just uses the existing naming conventions from the C++ library. From 786ba915d21c86c014fe20cb7b66391b7e7ae9b7 Mon Sep 17 00:00:00 2001 From: Xin Xiang <42788528+xxiang4@users.noreply.github.com> Date: Wed, 25 Mar 2020 15:55:19 -0400 Subject: [PATCH 06/18] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 56240bc..d953731 100644 --- a/README.md +++ b/README.md @@ -7,16 +7,16 @@ [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) [![Python Versions](https://img.shields.io/pypi/pyversions/nestpy.svg)](https://pypi.python.org/pypi/nestpy) +These are the Python bindings for the [NEST library](https://github.com/NESTCollaboration/nest), which provides a direct wrapping of functionality. The library is not Pythonic at this point but just uses the existing naming conventions from the C++ library. + +You do *not* have to have NEST already installed to use this package. + ## Note from Xin: This package is forked from [nestpy](https://github.com/NESTCollaboration/nestpy) and updated to LUX Run3 Detector template. In addition, two functions are added to `testNEST.cpp`. 1. A function that produce (S1, S2) observables 2. A vectorized function that accept energy in a list as input. Please see `example/demo_v0.ipynb` for the usage of the two functions. -These are the Python bindings for the [NEST library](https://github.com/NESTCollaboration/nest), which provides a direct wrapping of functionality. The library is not Pythonic at this point but just uses the existing naming conventions from the C++ library. - -You do *not* have to have NEST already installed to use this package. - ## Installing from PyPI For 64-bit Linux or Mac systems, instally 'nestpy' should just require running: From befd7c3fbb99ad5bbd2887a31247da868997358b Mon Sep 17 00:00:00 2001 From: xxiang4 Date: Wed, 25 Mar 2020 18:51:53 -0400 Subject: [PATCH 07/18] debug done. Now vectorized function RunNEST_vec works --- examples/demo_v0.ipynb | 150 ++++++++++++++++++++++++++++++++++++++++ src/nestpy/bindings.cpp | 28 ++++++++ src/nestpy/testNEST.cpp | 48 ++++++++++--- src/nestpy/testNEST.hh | 76 ++++++++++++++++---- 4 files changed, 279 insertions(+), 23 deletions(-) create mode 100644 examples/demo_v0.ipynb diff --git a/examples/demo_v0.ipynb b/examples/demo_v0.ipynb new file mode 100644 index 0000000..4812e63 --- /dev/null +++ b/examples/demo_v0.ipynb @@ -0,0 +1,150 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import nestpy\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import time" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "544.95 200.0 80.0 130.0\n" + ] + } + ], + "source": [ + "\n", + "#create detector\n", + "detector = nestpy.DetectorExample_LUX_RUN03()\n", + "\n", + "z_max = detector.get_TopDrift()\n", + "r_max = detector.get_radius() # fid radius??\n", + "dt_min = detector.get_dt_min() # analysis min dt\n", + "dt_max = detector.get_dt_max() # analysis max dt\n", + "print(z_max, r_max, dt_min, dt_max)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# run a single recoil\n", + "keV=10\n", + "type_num = nestpy.INTERACTION_TYPE(0) # NR\n", + "pos_x, pos_y, pos_z = 0., 0., z_max/2.\n", + "inField=180\n", + "\n", + "obs = nestpy.runNEST(detector, keV, type_num, inField, pos_x, pos_y, pos_z, seed=0)\n", + "\n", + "s1c_phd = obs.s1c_phd\n", + "s2c_phd = obs.s2c_phd\n", + "print(s1c_phd, s2c_phd)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# run many recoils with vectorized arguments\n", + "\n", + "\n", + "n_events=100\n", + "keV=np.linspace(0, 100, n_events)\n", + "type_num = nestpy.INTERACTION_TYPE(0) # NR\n", + "\n", + "r = np.random.uniform(low=0, high=r_max, size=n_events)\n", + "phi = np.random.uniform(low=0, high=2*np.pi, size=n_events)\n", + "pos_x = r * np.cos(phi);\n", + "pos_y = r * np.sin(phi);\n", + "pos_z = np.random.uniform(low=0, high=z_max, size=n_events)\n", + "\n", + "\n", + "inField=180\n", + "obs_arr = nestpy.runNEST_vec(detector, keV.tolist(), type_num, inField, pos_x.tolist(), pos_y.tolist(), pos_z.tolist(), 0)\n", + "s1 = obs_arr.s1c_phd\n", + "s2 = obs_arr.s2c_phd\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/xinxiang/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in log10\n", + " \"\"\"Entry point for launching an IPython kernel.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(s1, np.log10(s2))\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/nestpy/bindings.cpp b/src/nestpy/bindings.cpp index 6da7e90..39faec6 100644 --- a/src/nestpy/bindings.cpp +++ b/src/nestpy/bindings.cpp @@ -222,6 +222,34 @@ PYBIND11_MODULE(nestpy, m) { m.def("GetBand", &GetBand); // XX: added + py::class_(m, "NESTObservable", py::dynamic_attr()) + .def(py::init<>()) + .def_readwrite("s1_nhits_phd", &NESTObservable::s1_nhits_phd) + .def_readwrite("s1_nhits_phe", &NESTObservable::s1_nhits_phe) + .def_readwrite("s1r_phe", &NESTObservable::s1r_phe) + .def_readwrite("s1c_phe", &NESTObservable::s1c_phe) + .def_readwrite("s1r_phd", &NESTObservable::s1r_phd) + .def_readwrite("s1c_phd", &NESTObservable::s1c_phd) + .def_readwrite("Nee", &NESTObservable::Nee) + .def_readwrite("s2r_phe", &NESTObservable::s2r_phe) + .def_readwrite("s2c_phe", &NESTObservable::s2c_phe) + .def_readwrite("s2r_phd", &NESTObservable::s2r_phd) + .def_readwrite("s2c_phd", &NESTObservable::s2c_phd); + + py::class_(m, "NESTObservableArray", py::dynamic_attr()) + .def(py::init<>()) + .def_readwrite("s1_nhits_phd", &NESTObservableArray::s1_nhits_phd) + .def_readwrite("s1_nhits_phe", &NESTObservableArray::s1_nhits_phe) + .def_readwrite("s1r_phe", &NESTObservableArray::s1r_phe) + .def_readwrite("s1c_phe", &NESTObservableArray::s1c_phe) + .def_readwrite("s1r_phd", &NESTObservableArray::s1r_phd) + .def_readwrite("s1c_phd", &NESTObservableArray::s1c_phd) + .def_readwrite("Nee", &NESTObservableArray::Nee) + .def_readwrite("s2r_phe", &NESTObservableArray::s2r_phe) + .def_readwrite("s2c_phe", &NESTObservableArray::s2c_phe) + .def_readwrite("s2r_phd", &NESTObservableArray::s2r_phd) + .def_readwrite("s2c_phd", &NESTObservableArray::s2c_phd); + m.def("runNEST", &runNEST, "Generate (S1, S2) for a single recoil", py::arg("detector"), diff --git a/src/nestpy/testNEST.cpp b/src/nestpy/testNEST.cpp index 9026333..094fd24 100644 --- a/src/nestpy/testNEST.cpp +++ b/src/nestpy/testNEST.cpp @@ -943,7 +943,7 @@ void GetEnergyRes(vector Es) { //XX: added -int runNEST(VDetector* detector, double keV, INTERACTION_TYPE type_num, double inField, double pos_x, double pos_y, double pos_z, int seed){ +NESTObservable runNEST(VDetector* detector, double keV, INTERACTION_TYPE type_num, double inField, double pos_x, double pos_y, double pos_z, int seed){ // Construct NEST class using detector object NEST::NESTcalc n(detector); @@ -979,7 +979,7 @@ int runNEST(VDetector* detector, double keV, INTERACTION_TYPE type_num, double i || pos_z > detector->get_TopDrift()){ cout<<"ERROR: position [" << pos_x<<" "< scint2 = n.GetS2(quanta.electrons, truthPos, smearPos, driftTime, vD, 0, field, useTiming, verbosity, wf_time, wf_amp, g2_params); - for(int i=0; i keV_vec, INTERACTION_TYPE type_num, double inField, vector pos_x_vec, vector pos_y_vec, vector pos_z_vec, int seed){ +NESTObservableArray runNEST_vec(VDetector* detector, vector keV_vec, INTERACTION_TYPE type_num, double inField, vector pos_x_vec, vector pos_y_vec, vector pos_z_vec, int seed){ // Construct NEST class using detector object NEST::NESTcalc n(detector); @@ -1045,13 +1058,15 @@ int runNEST_vec(VDetector* detector, vector keV_vec, INTERACTION_TYPE ty int n_events = (int) keV_vec.size(); if (pos_x_vec.size()!=n_events || pos_y_vec.size()!=n_events || pos_y_vec.size()!=n_events) { cout<<"ERROR: array length mismatch detected. \n"; - return 1; + exit(1); } //////////////////////////////// // calculation at event by event basis //////////////////////////////// + + NESTObservableArray obs; for (int i=0; i keV_vec, INTERACTION_TYPE ty || pos_z > detector->get_TopDrift()){ cout<<"ERROR: position [" << pos_x<<" "< keV_vec, INTERACTION_TYPE ty // Calcualte the S2 based on electrons vector scint2 = n.GetS2(quanta.electrons, truthPos, smearPos, driftTime, vD, 0, field, useTiming, verbosity, wf_time, wf_amp, g2_params); - cout<<"keV="< keV_vec, - INTERACTION_TYPE type_num, - double inField, - vector pos_x_vec, vector pos_y_vec, vector pos_z_vec, - int seed); + +struct NESTObservable{ + int s1_nhits_phd; + int s1_nhits_phe; + double s1r_phe; + double s1c_phe; + double s1r_phd; + double s1c_phd; + + int Nee; + double s2r_phe; + double s2c_phe; + double s2r_phd; + double s2c_phd; +}; + +struct NESTObservableArray{ + + vector s1_nhits_phd; + vector s1_nhits_phe; + vector s1r_phe; + vector s1c_phe; + vector s1r_phd; + vector s1c_phd; + + vector Nee; + vector s2r_phe; + vector s2c_phe; + vector s2r_phd; + vector s2c_phd; + + // NESTObservable(int n_events){ + // s1_nhits_phd.reserve(n_events); + // s1_nhits_phe.reserve(n_events); + // s1r_phe.reserve(n_events); + // s1c_phe.reserve(n_events); + // s1r_phd.reserve(n_events); + // s1c_phd.reserve(n_events); + // + // Nee.reserve(n_events); + // s2r_phe.reserve(n_events); + // s2c_phe.reserve(n_events); + // s2r_phd.reserve(n_events); + // s2c_phd.reserve(n_events); + // } +}; + + +NESTObservable runNEST( + VDetector* detector, + double keV, + INTERACTION_TYPE type_num, + double inField, + double pos_x, double pos_y, double pos_z, + int seed); + +NESTObservableArray runNEST_vec( + VDetector* detector, + vector keV_vec, + INTERACTION_TYPE type_num, + double inField, + vector pos_x_vec, vector pos_y_vec, vector pos_z_vec, + int seed); #endif From ad785f9f4565e1111ac7703635fc1da3d319190a Mon Sep 17 00:00:00 2001 From: xxiang4 Date: Wed, 25 Mar 2020 19:12:50 -0400 Subject: [PATCH 08/18] default to uniform field; make non-uniform field optional --- examples/demo_v0.ipynb | 16 +++++++++--- src/nestpy/testNEST.cpp | 55 +++++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/examples/demo_v0.ipynb b/examples/demo_v0.ipynb index 4812e63..1e45f33 100644 --- a/examples/demo_v0.ipynb +++ b/examples/demo_v0.ipynb @@ -39,9 +39,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6.532790408546776 590.173217059425\n" + ] + } + ], "source": [ "# run a single recoil\n", "keV=10\n", @@ -65,7 +73,7 @@ "# run many recoils with vectorized arguments\n", "\n", "\n", - "n_events=100\n", + "n_events=1000\n", "keV=np.linspace(0, 100, n_events)\n", "type_num = nestpy.INTERACTION_TYPE(0) # NR\n", "\n", @@ -97,7 +105,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3X+QHGd5J/Dvs6OWPCs7Xhk2iT1okY+AHIyQFi9YV8pdsEJZDg5mYwOKYxOS407FFbnCxlFFJj5jOU5ZOR3YuQKO08U5INY5Mkhs/CM52RfJRRAnmV3vSkKWlADGMmNXvCCtwdZYmt197o+ZHvX09tv99kzPznTP91O1pd3Zntl3W7PPvPP08z6vqCqIiChbeto9ACIiSh6DOxFRBjG4ExFlEIM7EVEGMbgTEWUQgzsRUQYxuBMRZRCDOxFRBjG4ExFl0IJ2/eA3vvGNumzZsnb9eCKiVBobG/uJqvZHHde24L5s2TKMjo6268cTEaWSiDxvcxzTMkREGcTgTkSUQQzuREQZxOBORJRBDO5ERBnE4E5ElEEM7kREGdS2Onciat7IeBFbdx/Hi1MlXNKXx8Z1yzE8WGj3sKgDRM7cReQ8EXlaRA6KyBER2Ww47iMi8mz1mP+d/FCJyGtkvIjbdx1GcaoEBVCcKuH2XYcxMl5s99CoA9ikZc4AWKuqKwGsAnCNiKz2HiAibwVwO4A1qno5gFsSHykR1dm6+zhK5Zm620rlGWzdfbxNI6JOEpmWUVUF8Gr1S6f6ob7D/gOAL6rqqep9Xk5ykERZk0Q65cWpUqzb04qpp8ZYXVAVkZyITAB4GcCTqnrAd8jbALxNRPaJyH4RuSbpgRJlRVLplEv68rFuTyOmnhpndUFVVWcArBKRPgDfFJF3qOr3fI/zVgDvBfAmAP9YPWbK+zgisgHABgAYGBhIYPhE6ROWTnFnpDaz1Y3rluP2XYfrHivv5LBx3XLrsbRiVtzoYwbdz+ZcUbBY1TKqOiUiTwG4BoA3uP8YwH5VLQN4TkSOoxLsv+u7/zYA2wBgaGjIn9oh6gpR6RR3tuoGNXe2CqAuoLmfb370CE6dLgMAFi2wr262/TlxNPqYpvv5A7vLew6ZtglmUy3TX52xQ0TyAN4H4JjvsBEAV1WPeSMqaZofJjtUomyISqeYZqu3PXwQl256HGu27KlLS7xenq19PlUqW6ctTD9n86NHrH8X28eMushrup+Je66YtjGzmblfDOCrIpJD5cXgYVV9TETuBjCqqo8A2A3gahF5FsAMgI2q+tOWjZoohdwZZnGqBEF9VYI3nWKa2c9o5R7e2XAzaQvTzzl1uozBu5/A1Omy9UzY+7vF+Vm23/fyniumbcxsqmUOARgMuP1Oz+cK4NPVDyLy8acdFKgF+IIvgF7SlzcGSZcbwBqtmBkZL6JHpPaC4eemeYpTJdy6YwK37JiYM07T7xZEAazZssf4QhH1O/cIoIo5LzbdUjHUCLYfIJoHQTNMN7Dv27S2LuBtXLcceScX+ZhujjlIWMWMG4xNgd3PPcoN9HeMHK57rNsePhga2F1hKZOo33lWgfvWr6qdq5HxItZs2TOnJtvVIxKYwuombD9ANA/izDDdQO/OzE0zbHcWa1Mxc8fIYTx04AXrgG6iAB7cfwKPHXwJU6XynPRSFFPKxP36tocPGsfo3s/mnUJQCss2TdPKC7TzefGXwZ3IpxV/gKa0g/fCoP9n7tu0tvY9UwD3vxAEjfeOkcN4cP+JpsbvN1WqpG0aeakoTpWwbNPj6Ms7uOu6y2tjdf+9ZcdE4P3cF8Kgd0GuXMALYVQO3nvuL8w7eO3sNMozjb84mLSiOikM0zJEHrbVF25awPatf1DawQ3QUT9zeLCAe69fgUJfHoJKKufe61cAqOSxb60Gw5tWV9aO3LpjojamkfFi4oE9KVOlMjZ+/WDduRseLKAv7wQe774Qmt4FCWCc9Zvu4z/3U6VyLbC7kmrpMN/tIkSbfJvWqKGhIR0dHW3Lz6Zsa2bmvWbLnsAZtpsbdx8/aCZ9wxUF7D02OefneitJ3JlloS+Pqy7rx95jk8YLiX15B4sXLQj8PWxSE2lS8J2voPN77/UrMDxYMP4fLV6Yw+mzM4HvJrz/f16mx/ITAM9tuTbOrzTHpZseDxxb3McWkTFVHYo6jmkZypSot75Rgd8mN26agW3ff6Lu4uPtuw5j9PmT2DlWrB0/o4q8k8NVl/XX3R5kqlSupT/8v0dYaiJJTg/gKaNvmaAUhen/aeO65dj4jYNzZtivnQ0+H1K9TxDbqpokWjpEpeaSxpk7ZUrYzNt08dGdEQLAqs1P1AKqX97pwZnpWcwm8CcTlBu21Zd3jGNMO9MM2y/s/ynIjwwzY5uZu/850qiodyS2OHOnVDPNsP0Xv8ozs7UZW1jQe3GqFLryE6jMGEXMYyolOIVtpmqlkwN73ulp6jzZzqRfiXEO8o750mLQC77TIzj/vAWxFnHZsLn4nSQGd0pEWLojbg7clFrxpzj8QS4s6F3Slw9d+emmBKZOd27gTINmXwCjFju5bBZ6uc5Mm8c03wF3eLAwbytnmZahpoW93QQQ+62o6a2ybSojaGn/vdevCF0eD1RSAgCsgwa1jmn1rivuBWVTWiaNmJaheRNV4hX2vaAZU1RvlShuUAiaiUV1Grxv/SrcumOiofptquf+HzRyLr0Xpjd+41zaDDj3TrBUnqm94Ie98OfCcm0ZxuBOTWukv4e/pau3WqKv16n1NvGynbmbLsoNDxYw+vxJY933JX15DA8WjItoKJ59m9YmsoCqPKPY/OgRDA8WcMfI4bqqJPf5EPa8uPHKpU39/LRicKemRZV4mVIspnazr74+HfhzZlQjl7s7PTKn7C2qYyEAOLlz9yvEyOdSsCW9DkbGi9ie0AKqU6fLtceL804g7/TgnuEViYwhbRjcqWG2LWyDcu6m1EjQjN3L202xz1ctAwCLF9U/pW1zs9Ozilt3TGDr7uPoXciF2816+8UXYPOjR6wCcV/ewZnp2cj/o627j8cK7ALg3uvfGeMe2cJnMTXEu2wbOBd0gXPL490c6XmeUrS+vFNbSt8oN6c+8dmr8We/vaJuWb9/swrbxT6qqC39/+eXX2t4bFTx/354MvKFGqi80N913eWRz4m+vBO7ja+iNT1b0oLVMtSQwbufCPzj9ea7/flR4FwN8anTczsK5p0cFi3osa7jvnn1QGinw2YWClHrBVXCjIwXsfHrB1H2rBRzegRbP7wyMrUW9Pg2C6LSxrZaxmabvfNE5GkROSgiR0Rkc8ixHxIRFZHIH0zpNTJeNM7K3D8+U360PKu1+wbN9n9r5cWwrW14cP+J0ODNwN653JYAW3cfr2u+NjxYwNYPr6xrkrb1wysxPFiw7nMPVAJbnI3Csyhy5i4iAmCxqr4qIg6AbwP4lKru9x13AYDHASwE8IeqGjot58y9c3h7fQuA3moDJreMEKgvWTx9dtoY3AWVTRXizLLcGVbWmmFl1eKFOZRnZnF2pvEXzyW9Dl4vz82zL+l18NkPXG5MpwQ1YVu8MDenr0yuR3DBogV4pZTsKtNOYDtzj5WWEZFeVIL7f1TVA77v3Q/g/wL4IwB/xODe+SrB9FDoqkKnRwDBnCZNSYtKsVD72XSytBGVfovbb8WmP4yg0hI5C5UziaVlqg+WE5EJAC8DeDIgsA8CWKqqjzU0Wpp352bJ4cvFy7Pa8sAORKdYkmD7lr6TmHqbz6e8k8P961dh47rl2DlWjBXY3QVE7r9u+i2sN0zcHuc241EA2/ef6Kot96xKIVV1BsAqEekD8E0ReYeqfg8ARKQHwH0Afj/qcURkA4ANADAwMNDomKlB3h4vYZsjZ1FOxKoFQSdxdyra/OgRq8qTJOWdHrxenq1LaazZsid2yuyC8xbU7bbkivp/sK2MGRkvWm/1pzi3VV83iFUKqapTAJ4CcI3n5gsAvAPAUyLyIwCrATwSdFFVVbep6pCqDvX39zc8aIrPv+NMs4G91+nBkt72zyptzajWdiy6efVAx8/iewD81sqLcfuuw/Me2AXA0T/9TTy35dpatYntphZ+/tJUV9TFUdse53Fr3+OWU6aZTbVMf3XGDhHJA3gfgGPu91X1FVV9o6ouU9VlAPYDuC4q507zK+nNHRYuyGH8zqtx//pVTdWszye3jn3nWBE3XFFAb0gr2HYSAX539QD2Hptsy8XlCz2pIP96hjB5wwt+UJrF3TowKO0UtMG3Sdxg3aqNMTqRzbP7YgB7ReQQgO+iknN/TETuFpHrWjs8SkrSMxY3Zzo8WMC+TWtx//pVcHLpaNBUKs/gwf0ncHo+thhqgCpi57aT5O2zFW9SIMZ3GUHPv+HBAiY+e26C4N0f1jZ1YgrWeadnTkltnBeNLIjMuavqIQCDAbffaTj+vc0Pi7ya2RPUFaf/tQ1FZU9I73jueuRIR28kkSbejofzzdvTPs6kIGzMYTPmZnqch+2uBcxfn/ZOxN4yHS5qT9Co+3p3LXJyUlf5EndFqJ+b5nDHE2d3HIrWbGAPqiX39kk3rVfwBuK4kwJ3j1h/sG3VjDlqs41uCuZ+bD/QYfyzdNMfYNTS6qgFQe5iEQCJtLjNieA8p8e4STHFV+jL4+RrZ0LLVU0zZXcxGWAOfDZ7epqOEWhgWsttKdDNM+ZW42YdKRQ0SzeJersclSt93fOH2SNoetPnGVUG9gR5Z7umF9+cCG68cmnd1oPAuQU7QHhawjTrBSrVMe5tN1xRwN5jk7Wvr7qsHzuefmHOeNy2yfO5lRyZMbh3kDgXr6Ku+kcFf3dj6G6qdW8ld8YbteLXlnf2PPr8ycA+PTOq2DlWxLsGLsT+H56q7Uh045VLMfTmi6zSef5AHDTB2DlWrBvPmi176hp7uRYvXMCg3kE6sxasS9levDLlMEfGi1izZQ8u3fQ4eiy2FmNgb563wgOo9IVvVqG6I5TrnuEVuG/9qsDt4krlGXznByfrdiTaOVbE5kePhG5vaBK1ZSJgfp7ymktn4cy9g5guXvXlHYh4N7KobDt2646JurfS3lapDNyt57/usWbLHqtWDU5OAEXg7BcAXjszXeuQ6BoeLNQWYfn5H6VUngndJzaMzZaJUTtvUWfgzL2DmFbtlWdm67aeK5Vncep0ua5a5fZdh4zBghpT6MuH9nYpTpVqrWqB8MBZ18L2QytrbW2B+rpywLyqM4ngGfUYpu9f0pevvTN0d97y6rYa8jRgtUyCkqhHHxkvsl68A7gXJYfefNGczSP83Hy7qV9KVGVT2NJ+74YWQZUrpr4qQVvX2XRbNFXH3HBFIfDCrVtWyYqY+ZNoV0iK5u/dUpwq4dYdE7hj5HDgsW5u3DvzAypvv/37gJI9i0sNVhSVVaIAsP49S0M3EHFz0kHvvGxmtGEzfvedmZumcbejc98F3BTQJ8e/dV2clZ9BP+Pe61cEtkJwA/u+TWsZ2DsQZ+4JiWqsVPDkxqNqiy/d9HisZkhZ1iOVXifz3TzL5aZObPqFP7fl2jkLx0QqKz7D3snZNOUKm/0n8Y4xiuk56f7eNH9Y5z7Poi5UuTOwRQt6jNUI7h9k0q0C0uzzH6ksxDGlCtz661a1MLatYHJz1W5pYZyVxVdd1o8H959oeBzzUVfOi6jpw7RMQmye5KXyjDGX7v3j3bhueWqacLWaW4IXlCq4Z3gF9m1ai+e2XIvZFr0DvaQvH/l/G5R6sSkpdO09Nmk1jnZqNOVE7cOZe0I2rluOW3dMNJxOUQBvuf3vMKOKvrwzL7sfpYE74733+hWhFyXjvNux3dzBG7xMFzJNFxNtSgqjjg0aR7tE9XChzsPgnpDhwYJxJaGXaWNg4FxtOitl6vnTVkHCXlyX9DroXbigLihFvRC7Ozd5f2acwBYnjRH2wtRJlShsK5AuDO4Jumd4BYbefFGtJM4/Q8w7uVqzrnZsnZZmUbNb04ure879S+zDcvRBJYNxA5upFW3QDDysbS2DKTWKwT0BpmqFsCqGrbuPM7jH0CMyZ9Wmn//FNSdSl+f2Xug0BXa3W2azQTVOGoMpD2oFlkIa2JaX2bRNDcJyx3OW9NqVOtrOZsP+T0wLjXIi+NxHVjKgUsdLrBRSRM4D8C0Ai6rHf0NVP+s75tMA/j2AaQCTAP6dqj7fyMA7gU0Zmxv8gwKFN0dceaz6ToGLF+baGth7AHTKBnOLF1bSJmG95102uXcgvFLFlN6ZVWVgp0yxKYU8A2Ctqq4EsArANSKy2nfMOIAhVX0ngG8A+C/JDnN+RZWx2WwaXJwqYWS8iE/vmJjTArbdfc//9Vsu6phNrU+fnQlcFWliUxETVqkS1juFKEts9lBVAK9Wv3SqH+o7Zq/ny/0Abk5qgPPBn4IxBRA3aNj2Xb/rkSMdM0P22veDkwDsSwJbyb/4x2VatSlAZO49rFIlzoVOojSzWsQkIjkRmQDwMoAnVfVAyOEfB/D3hsfZICKjIjI6ORm9cGM+BPWEMS0fcgOR7arFTi9pVCC0Z0qrhQXVjeuWB45NgcCFQF5XXdZvvN3UO4UpGcoaq2oZVZ0BsEpE+gB8U0Teoarf8x8nIjcDGALw64bH2QZgG1C5oNrwqBMUNAt3g56/pM4NRFlqD6CoXEz8hfyC0Iuaa95yEb7zg5OJzfSD6si9hgcLxu3lol5cTSs+3dtZr03dIFb7AVWdAvAUgGv83xOR9wH4EwDXqeqZREY3D0yBwl19GDS7M/VdT6sZVbz6+nRoy4Mf/bQUGtgXL8xVNhVBpd1sVPsEmwuYptx7o1sM2r7jIsoCm2qZfgBlVZ0SkTyA9wH4c98xgwD+B4BrVPXlloy0RUyzcH8XPrdNr3fT4KhmT2lSnq20PVi8aEGto+FrZ6drbRDC3qn05R1MfPbqutvCqomA+gBtKjttND/OJldEdjP3iwHsFZFDAL6LSs79MRG5W0Suqx6zFcD5AL4uIhMi8kiLxtuQsP7pNg2RgvLyWQrsrqlSGcVqh8Wz0zPW/W2CeqgPDxawb9Na3L9+Vej5DTq3Yf3LbfLjbHJF1AWLmGwWGUUtWLLpt93Nonp6h51f07mN2r0oynz0OCdqB/ZzrzLVrN/28MG6DabDNkLo5MDeyIKksOZljYhKd4RdwGxVfpwXTanbZb6fuylIzKjOSQP43TFy2LjjfKfIxez7LgBOnS7jPKendgHUlpMTOD3192g23cFFRUStkfmZu03Zonf1qXeLtE6vUwdglRfPVTsgess7T50uI+/kcNPqAeP1AxHgkgvzdakNINkGV1xURNQaXZlzN8k7ucRSFZ3C7Qce1jDL1CHx5tUDuGd4RauHiDtGDuOhAy9gRhU5Edx45dJ5+blEaWSbc898WsZfcZELKu2o6uTA3iPBVSlR3LST6d1L2L6j8xFgR8aL2DlWrI1jRhU7x4qBaTIispf54A6cK8t7bsu1+NxHVrZkAVIjgddWrkeQE0Gjb7LCXrRML3bz1Vgszl6jRGSvK4K7l3cmnxQnJ7jpyoHEHs9vdlZRno2O7O67E1t5J4cbr1za1ppwriYlao2uC+7AuZl8lB7LSFmeUew9NombVw/EbsTV60T/F8TZzDmqyiQnUrcg6J7hFW1tpMVqGaLWyHy1jMnIeDG05a17obEv70AEmDpdDq28KU6V6rZ5e3GqhN6Fucje7QsX5KCQyNRJWG7cu4ly1Cbds6pzFhy1syac1TJErdG1wX3r7uPmwN4jmKmmQaZK5dqLwGtnpo2P5+au3SB51yNHrEopo47JOznccEXBGLC9Kzndi5NhM/1OmxFz/1Ci1uja4B6W053x5bfdr8ICsTuzHhkvYuPXD1rlyKMUfIHOX4/u9EjdDDdqE5FOnRFzNSlR8jIV3OP0E0m6J7ugsul1T0QKxZa/t8rQmy/Cju++UL9oyZfgD3vB8r9QEFG2ZSa422xq7RWU622GG3LjBHYRBJY3SnV83heroBeN8ozWbRhtesFa0us01YSLiNInM9Uyceul3ZJI24qYpOWdnLFu3b3Z2wrX9KLhDeYb1y0P3CTj1denuSiIqMtkJrjHqZd2+7vfsmMCCaTGY8tJpTombAGR7Sbc3kcYHixg8cK5b8bKs8pFQURdJjNpGVNK4sK8U7eD0lWX9WPnWNE6HePuTpRkft671N7Pvehp241SgdrGFgDwiuGiLxcFEXWXyJm7iJwnIk+LyEEROSIimwOOWSQiO0Tk+yJyQESWtWKwYUz7mv78zHTdLj/b95+wDux5J4e7rru85Xum+hcWDQ8WYpUsemflXBRERIBdWuYMgLWquhLAKgDXiMhq3zEfB3BKVX8FwH3w7bE6H4YHC7jhisKcFaKmskYb7xq4EMODBWx+9EhLm4q5C4v2bVrb0CbcL/ry7txijogig7tWvFr90ql++GPkBwF8tfr5NwD8hkgrW2kF23tsMlbwjvKdH5zEHSOHcep0a/u6B82q/d0sbe/f6L6jRJQtVjl3EckBGAPwKwC+qKoHfIcUALwAAKo6LSKvAHgDgJ/4HmcDgA0AMDCQfKOtpPPKCuChAy8k+ph+QZtxB9Xqm/YadcsmvbgoiIisqmVUdUZVVwF4E4D3iMg7fIcETS7nTKJVdZuqDqnqUH9/f/zRRmhFXjmJBUkm/lm1W6vvvUbgbgFoStOc5/Tg1h0TWLNlD8sdiagmVimkqk4BeArANb5v/RjAUgAQkQUALgRwMoHxxRIUAJ0ewZJeJ3KjjvnmrkD1zrDDavX96ZYlvQ6cHkGpPBu5FywRdR+bapl+Eemrfp4H8D4Ax3yHPQLgY9XPPwRgj7Zh/76gfPPWD6/E+J1X47kt1+LGK5fGbsnbCqYLnFG1+t5NR3oXLpjTv4abXBCRyybnfjGAr1bz7j0AHlbVx0TkbgCjqvoIgAcA/LWIfB+VGfvvtGzEEUz5ZpuOia0gAPp6HahWatDDet6YavWD0k3c5IKIwkQGd1U9BGAw4PY7PZ+/DuDDyQ4tGe4FyiQXIdkSAPetX2V9cTNOb/M4LwRE1H0ys0I1iL+Z2HxTVPrDjD5/EnuPTUZ2q4zT25ybXBBRGGlDahwAMDQ0pKOjoy39GabywVZwG5AF9arx7/jk9AjOP29BbXenRlvxxmlxTETZICJjqjoUdVymZ+7zmX/OiRg36PDfWp7V2sKoqNbEYVjPTkQmmekK6eV2fYzznsTpETRTKVme1YZLLVnlQkRJy1xw9y4EilLwXHwsz6qxv7qtGdU5dfa24Z5VLkSUpMwFd9s+6IW+PJa9IfnKkkULemqLpgp9edy0esCqARirXIgoSZnLudvMgJ2cYNkb8tj3g8YX0fovkrqmSmXknVxdCeTQmy+qXfi8MO/gtbPTdXuhssqFiJKWueBus/H1zKw2FdjdzaZN9fPelgHA3AufrHIholbLXHDfuG45bonYxaiZrfWcnNSC8fBgAZduejxwBh/2DoJVLkTUapnLuQ8PFtCXd1ry2CLA+ncvrQvMUTsfuZU7l256nJ0biWjeZC64A8Bd110Opyf5FmGqwM6xYl2ADtv5KKyFL1AJ/Ks2P4Flmx7Hsk2PY/DuJxj8iSgRmUvLAOcWA931yBFMGTaMNjFdKHUF5dOB4JYBa7bsMbbwBYCNXz9Yt/Dp1OkyNn7jYN3jEhE1IpPBHajPa4+MFyPz8C5FdIB/capkdVE0rHPj1t3HA1e0lme07sWDiKgRmUzL+MXNwysqm2EUDPn0C/NOaLrFFZaPD7vgygVNRNSsrgjuAPBbKy+Odfyp02VcdVl/YD5dBKHpFldYPj5s0RIXNBFRszIf3N2Llg/uPxH7vnuPTc7Z2ene61fUmn75+Wveg3aGcvdM3bhueeBFX7fUkoioGZE5dxFZCuBrAH4ZwCyAbar6F75jLgTwIICB6mP+V1X9X8kPN55m+7kXp0qBNem3PXwwcOPsoMZhppr2oIu+S3odfPYDlzPfTkRNs7mgOg3gNlV9RkQuADAmIk+q6rOeYz4J4FlV/YCI9AM4LiLbVfVsKwZty7bPjImpy2NQYA+73YSLmYioVSLTMqr6kqo+U/385wCOAvBHJAVwgYgIgPNR2Ud1OuGxxtbshUlTsDZdaDXdTkQ032Ll3EVkGSr7qR7wfesLAH4VwIsADgP4lKrOBtx/g4iMisjo5ORkQwOO4l0R2mPZXz3sqKBVpWEXSomIOoF1cBeR8wHsBHCLqv7M9+11ACYAXAJgFYAviMgv+B9DVbep6pCqDvX39zcx7GD+FaG2aRIFkDOsaA0qcwy7UEpE1AmsFjGJiINKYN+uqrsCDvkDAFu0siHr90XkOQCXAXg6sZFaaCbHPjOrWNLrBFbC+FelAsyXE1Fni5y5V/PoDwA4qqqfNxx2AsBvVI//JQDLAfwwqUHaajbH3rtwgTFFw4VFRJQmNjP3NQA+CuCwiLhr+D+DStkjVPXLAP4UwFdE5DAqKew/VtWftGC8oWx6uYcpTpWQEwlM53BhERGlSWRwV9VvI2IrUFV9EcDVSQ2qURvXLW+qrh0IztPzYikRpU2qG4eNjBfnLAK64YoC9h6brDX0amYmD1Rq3W+4gvl1IkqX1LYfGBkvYuPXD9a19D11uoyHnn4Br505V2K/pLe5jTtmVOf0cCci6nSpDe6mlrkzs4qpUrnWrdHUByaOoKZgRESdLLXBfb6rV1gtQ0RpktrgPt/VK6yWIaI0SW1wN7XMbYbp0VgtQ0Rpk9rgPjxYwNYPr4y1w1IYAXDT6oFa8y+3IyRbCxBRGqW6FNJtAdBs33ag0l/mnuEVyQ2OiKiNUjtz9wpq5HX/+lW4efWA9WOwXS8RZUmqZ+5eQY28hgcLePzQS5HlkMypE1HWpDK4j4wXsXX38doq1I3rlgfmxEfGi1Z17t6cuu1jExF1stQFd39+3e23Pvr8Sew9NlnX/Mu0TZ5XoS9fF9iDHhsAAzwRpUrqcu5BPdtL5Rls33+i1kfGbf4VtVmHPx1jemyuTiWitEndzN20UjTe1tSVGbs/5WJqMsbVqUSUNqkL7n2G3ZJs5Z1cYN36yHgRguAXCa5OJaK0SV1wf/X1+IE9J4JZ1cALpO4F1LDWwFddlvzyHFQ8AAAMqUlEQVR+r0RErRQZ3EVkKYCvAfhlALMAtqnqXwQc914A9wNwAPxEVX892aFWAnF5Nt59/DP1kfEi1mzZgxenSrgw7+C1s9Moz4QndfYem2x0yEREbWEzc58GcJuqPiMiFwAYE5EnVfVZ9wAR6QPwJQDXqOoJEfnFVgy2kQubr0/P4JYdE9i6+ziuuqwfO8eKtYum3l7wYZhzJ6K0iayWUdWXVPWZ6uc/B3AUgL8u8HcB7FLVE9XjXk56oEBjQdYtmClOlbB9/4mGWhQw505EaROrFFJElgEYBHDA9623AVgiIk+JyJiI/F4yw6sXFmRv9jT9MolbUQNw9SoRpZN1cBeR8wHsBHCLqv7M9+0FAK4AcC2AdQD+s4i8LeAxNojIqIiMTk7Gz2NvXLcceSdX/5ioBPZ7hldg36a14Tt5W1rS69R61LAjJBGlkVW1jIg4qAT27aq6K+CQH6NyEfU1AK+JyLcArATwT96DVHUbgG0AMDQ0FHsi7QbZsPYAUZtim8odvcbvvDru0IiIOkrkzF1EBMADAI6q6ucNh/0tgH8jIgtEpBfAlajk5hM3PFjAvk1rcd/6VQCAW3dMYM2WPbUNrMM28XBygrwT/iuzOyQRZYHNzH0NgI8COCwiE9XbPgNgAABU9cuqelRE/g+AQ6iUS/6lqn6vFQMGgDtGDmP7/hO1Gbi3BwyAwC2VFi/M4ez0LE6H1FIyv05EWREZ3FX12zDvQOc9biuArUkMKszIeLEusLu8PWCC6tZfL88G9poJW+BERJRWqVuhunX3cWPOPKxU0tREbFYVz225NoGRERF1jtR1hQwL4Jf05Y3lkqb2v6xhJ6IsSl1wNwVjQeVialC5ZN7J4cYrlwbezhw7EWVR6oK7qdb9ptUDta32/Pup3nv9CtwzvCLwdubYiSiLUpdzD6t193Z4zInUcvOjz5+sO/6+9asY1Iko00QjditqlaGhIR0dHU3s8fxb5IUx9XQnIup0IjKmqkNRx6UuLWMStEWeCbfOI6Ksy0xwj9sxkm18iSjLUpdz93Jz7C9OldAjErkhthdLIIkoy1Ib3P059jiBnSWQRJR1qQ3ucXLsixb0IO/k8EqpzDYDRNQVUhvc4+TMz0zP4sz0LPryDgM7EXWF1F5QbSRnPlUq4/Zdh2vtgYmIsiq1wT1opaoNlkESUTdIbXB32wz05Z3Y92UZJBFlXSpz7v4SyLhYBklEWWezzd5SEdkrIkdF5IiIfCrk2HeLyIyIfCjZYZ7jlkAWp0pQxCuBBFgGSUTdwWbmPg3gNlV9RkQuADAmIk+q6rPeg0QkB+DPAexuwThr4pRA+hVYBklEXcJmm72XALxU/fznInIUQAHAs75D/xOAnQDenfQgvRrJl7NRGBF1m1gXVEVkGYBBAAd8txcA/DaALyc1MJO4+fIlvQ4DOxF1HevgLiLnozIzv0VVf+b79v0A/lhVQ/MlIrJBREZFZHRycjL+aIHY+fLehQsY2Imo61gFdxFxUAns21V1V8AhQwD+RkR+BOBDAL4kIsP+g1R1m6oOqepQf39/QwMeHizEKn8sTpVwx8jhhn4WEVFaRebcRUQAPADgqKp+PugYVb3Uc/xXADymqiNJDdLllkBOlcoQALZ1Mg/uPwEAuGd4RdJDIiLqSDYz9zUAPgpgrYhMVD/eLyKfEJFPtHh8Nd4SSKAS2N0K9yW9DvJO+K/y0IEXWjtAIqIOYlMt822ci6ORVPX3mxmQSVAJpKJS3rhv01oAwB0jh2uzdL+49fBERGmWmvYDphJI7+17j5kv0uYaWMlKRJRWqQnuphJI7+1hNfA3Xrk08TEREXWq1AT3oC6Q/lYCpheAvNPDi6lE1FVSE9zdLpCFvjwElVy7f3GS6QXg3uvfOc+jJSJqr1R1hRweLIQuSHK/53aM5JZ6RNStUhXcbUS9ABARdYPUpGWIiMheJmbu3s07mIohIspAcB8ZL+LTOyYwW/26OFXCp3dMAAADPBF1rVSnZUbGi7jFE9hdswBu33WoHUMiIuoIqQ3ubq8Zk1LZH/KJiLpHaoN7M9vtERFlXSqD+8h4sdYd0oSdZIiom6UuuEelY1xSPZaIqBulLrjbpmNmq8cSEXWj1AX3sM6PzRxLRJQlkcFdRJaKyF4ROSoiR0TkUwHH3CQih6of3xGRla0ZrrnzY7PHEhFlic3MfRrAbar6qwBWA/ikiLzdd8xzAH5dVd8J4E8BbEt2mOcEdX50egROrv4Sqr8d8Mh4EWu27MGlmx7Hmi17mI8nokyz2WbvJQAvVT//uYgcBVAA8KznmO947rIfwJsSHmeNqfMjAGx+9AhOnS4DABYtOPe65V6EdXP1xalS7aIsV7ESURbFaj8gIssADAI4EHLYxwH8feNDihbU+XFkvIjXPQuXpkrlWgAPughbKs9g6+7jDO5ElEnWwV1EzgewE8AtqvozwzFXoRLcf83w/Q0ANgDAwMBA7MGGCQvgNvuvEhFliVW1jIg4qAT27aq6y3DMOwH8JYAPqupPg45R1W2qOqSqQ/39/Y2OOVBYALfZf5WIKEtsqmUEwAMAjqrq5w3HDADYBeCjqvpPyQ7RTlgAt9l/lYgoS2xm7msAfBTAWhGZqH68X0Q+ISKfqB5zJ4A3APhS9fujrRqwSVgAt9l/lYgoS0RV2/KDh4aGdHQ02dcAbtpBRFknImOqOhR1XOo36/Di/qlERBWpaz9ARETRGNyJiDKIwZ2IKIMY3ImIMojBnYgogxjciYgyiMGdiCiDUlvnzgVLRERmqQzu7M9ORBQulWmZsPa+RESU0uDO/uxEROFSGdzZn52IKFwqgzv7sxMRhUvlBVXTJtm8mEpEVJHK4A6wvS8RURibbfaWisheETkqIkdE5FMBx4iI/DcR+b6IHBKRd7VmuEREZMNm5j4N4DZVfUZELgAwJiJPquqznmN+E8Bbqx9XAvjv1X+JiKgNImfuqvqSqj5T/fznAI4C8OdDPgjga1qxH0CfiFyc+GiJiMhKrGoZEVkGYBDAAd+3CgBe8Hz9Y8x9ASAionliHdxF5HwAOwHcoqo/83874C5zdt4WkQ0iMioio5OTk/FGSkRE1qyCu4g4qAT27aq6K+CQHwNY6vn6TQBe9B+kqttUdUhVh/r7+xsZLxERWbCplhEADwA4qqqfNxz2CIDfq1bNrAbwiqq+lOA4iYgoBlGdkz2pP0Dk1wD8I4DDAGarN38GwAAAqOqXqy8AXwBwDYDTAP5AVUcjHncSwPNNjf6cNwL4SUKPlTU8N+F4fsLx/IRrx/l5s6pGpj4ig3saiMioqg61exydiOcmHM9POJ6fcJ18flLZW4aIiMIxuBMRZVBWgvu2dg+gg/HchOP5CcfzE65jz08mcu5ERFQvKzN3IiLySHVwF5FrROR4tRvlpnaPpxOIyI9E5LCITIjIaPW2i0TkSRH55+q/S9o9zvkiIn8lIi+LyPc8twWej27rbmo4N3eJSLH6/JkQkfd7vnd79dwcF5F17Rn1/DF1xE3L8ye1wV1EcgC+iEpHyrcDuFFE3t7eUXWMq1R1ladEaxOAf1DVtwL4h+rX3eIrqKy/8DKdD2930w2odDfNsq9g7rkBgPuqz59Vqvp3AFD92/odAJdX7/Ol6t9glrkdcX8VwGoAn6yeh1Q8f1Ib3AG8B8D3VfWHqnoWwN+g0p2S5voggK9WP/8qgOE2jmVeqeq3AJz03Ww6H13V3dRwbkw+COBvVPWMqj4H4Puo/A1mVkhH3FQ8f9Ic3NmJMpgCeEJExkRkQ/W2X3LbQVT//cW2ja4zmM4Hn1MVf1hNK/yVJ4XX1efG1xE3Fc+fNAd3q06UXWiNqr4LlbeInxSRf9vuAaUIn1OVVMJbAKwC8BKAz1Vv79pzE9ERt+7QgNvado7SHNytOlF2G1V9sfrvywC+icpb539x3x5W/325fSPsCKbz0fXPKVX9F1WdUdVZAP8T51IvXXluDB1xU/H8SXNw/y6At4rIpSKyEJWLPY+0eUxtJSKLq1shQkQWA7gawPdQOS8fqx72MQB/254RdgzT+ej67qa+HPFvo/L8ASrn5ndEZJGIXIrKRcOn53t88ymkI246nj+qmtoPAO8H8E8AfgDgT9o9nnZ/APhXAA5WP4645wTAG1C5qv/P1X8vavdY5/GcPIRKeqGMyszq46bzgcrb6i9Wn0+HAQy1e/xtODd/Xf3dD6ESrC72HP8n1XNzHMBvtnv883B+fg2VtMohABPVj/en5fnDFapERBmU5rQMEREZMLgTEWUQgzsRUQYxuBMRZRCDOxFRBjG4ExFlEIM7EVEGMbgTEWXQ/wc6YTFRtJGwWAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] diff --git a/src/nestpy/testNEST.cpp b/src/nestpy/testNEST.cpp index 094fd24..2ea8a76 100644 --- a/src/nestpy/testNEST.cpp +++ b/src/nestpy/testNEST.cpp @@ -960,16 +960,25 @@ NESTObservable runNEST(VDetector* detector, double keV, INTERACTION_TYPE type_nu vector g2_params = n.CalculateG2(); double g2 = g2_params.back(); - // Calculate a drift velocity table for non-uniform fields, - // and calculate the drift velocity at detector center for normalization - // purposes - vector vTable = n.SetDriftVelocity_NonUniform(rho, z_step, pos_x, pos_y); - double vD_middle = vTable[int(floor(.5 * (detector->get_gate() - 100. + detector->get_cathode() + 1.5) /z_step +0.5))]; - - // Calculate field map, and drift time - double field = detector->FitEF(pos_x, pos_y, pos_z); - int index = int(floor(pos_z / z_step + 0.5)); - double vD = vTable[index]; + // Calculate a drift velocity + double vD_middle, vD, field; + if (inField<0){ + // Calculate field map, and drift time for non-uniform field in z + // and calculate the drift velocity at detector center for normalization + // purposes + vector vTable = n.SetDriftVelocity_NonUniform(rho, z_step, pos_x, pos_y); + vD_middle = vTable[int(floor(.5 * (detector->get_gate() - 100. + detector->get_cathode() + 1.5) /z_step +0.5))]; + field = detector->FitEF(pos_x, pos_y, pos_z); + int index = int(floor(pos_z / z_step + 0.5)); + vD = vTable[index]; + } else { + //otherwise assume constant field + field = inField; + vD_middle = n.SetDriftVelocity(detector->get_T_Kelvin(), rho, field); + vD = vD_middle; + } + + // Calculate drift time double driftTime = (detector->get_TopDrift() - pos_z) / vD; // check position is within TPC active region @@ -1074,16 +1083,24 @@ NESTObservableArray runNEST_vec(VDetector* detector, vector keV_vec, INT double pos_y = pos_y_vec[i]; double pos_z = pos_z_vec[i]; - // Calculate a drift velocity table for non-uniform fields, - // and calculate the drift velocity at detector center for normalization - // purposes - vector vTable = n.SetDriftVelocity_NonUniform(rho, z_step, pos_x, pos_y); - double vD_middle = vTable[int(floor(.5 * (detector->get_gate() - 100. + detector->get_cathode() + 1.5) /z_step +0.5))]; + // Calculate a drift velocity + double vD_middle, vD, field; + if (inField<0){ + // Calculate field map, and drift time for non-uniform field in z + // and calculate the drift velocity at detector center for normalization + // purposes + vector vTable = n.SetDriftVelocity_NonUniform(rho, z_step, pos_x, pos_y); + vD_middle = vTable[int(floor(.5 * (detector->get_gate() - 100. + detector->get_cathode() + 1.5) /z_step +0.5))]; + field = detector->FitEF(pos_x, pos_y, pos_z); + int index = int(floor(pos_z / z_step + 0.5)); + vD = vTable[index]; + } else { + //otherwise assume constant field + field = inField; + vD_middle = n.SetDriftVelocity(detector->get_T_Kelvin(), rho, field); + vD = vD_middle; + } - // Calculate field map, and drift time - double field = detector->FitEF(pos_x, pos_y, pos_z); - int index = int(floor(pos_z / z_step + 0.5)); - double vD = vTable[index]; double driftTime = (detector->get_TopDrift() - pos_z) / vD; // check position is within TPC active region From f659563c98b7cf3cdd60cc15660901a4a0983fd7 Mon Sep 17 00:00:00 2001 From: Xin Xiang <42788528+xxiang4@users.noreply.github.com> Date: Wed, 25 Mar 2020 19:31:23 -0400 Subject: [PATCH 09/18] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d953731..c660c1e 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ You do *not* have to have NEST already installed to use this package. This package is forked from [nestpy](https://github.com/NESTCollaboration/nestpy) and updated to LUX Run3 Detector template. In addition, two functions are added to `testNEST.cpp`. 1. A function that produce (S1, S2) observables 2. A vectorized function that accept energy in a list as input. + Please see `example/demo_v0.ipynb` for the usage of the two functions. ## Installing from PyPI From c7f55ef48227e3885a280f054f0189b32531ce1b Mon Sep 17 00:00:00 2001 From: xxiang4 Date: Wed, 25 Mar 2020 19:52:24 -0400 Subject: [PATCH 10/18] fix bug that crash notebook --- examples/demo_v0.ipynb | 53 +++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/examples/demo_v0.ipynb b/examples/demo_v0.ipynb index 1e45f33..d7b06f0 100644 --- a/examples/demo_v0.ipynb +++ b/examples/demo_v0.ipynb @@ -21,7 +21,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "544.95 200.0 80.0 130.0\n" + "T_Kelvin: 173.0\n", + "radius: 200.0\n", + "dt_min: 80.0\n", + "dt_max: 130.0\n", + "anode: 549.2\n", + "cathode: 55.9\n", + "T_Kelvin: 173.0\n", + "p_bar: 1.57\n" ] } ], @@ -30,11 +37,25 @@ "#create detector\n", "detector = nestpy.DetectorExample_LUX_RUN03()\n", "\n", - "z_max = detector.get_TopDrift()\n", - "r_max = detector.get_radius() # fid radius??\n", - "dt_min = detector.get_dt_min() # analysis min dt\n", - "dt_max = detector.get_dt_max() # analysis max dt\n", - "print(z_max, r_max, dt_min, dt_max)" + "# inspect detector parameters\n", + "# # feel free to inspect more\n", + "z_max = detector.get_TopDrift() \n", + "radius = detector.get_radius() # right fid radius?? TBD\n", + "dt_min = detector.get_dt_min() # right min dt?? TBD\n", + "dt_max = detector.get_dt_max() # right max dt?? TBD\n", + "anode = detector.get_anode()\n", + "cathode = detector.get_cathode()\n", + "T_Kelvin = detector.get_T_Kelvin() \n", + "p_bar = detector.get_p_bar() \n", + "\n", + "print('T_Kelvin:', T_Kelvin)\n", + "print('radius:', radius)\n", + "print('dt_min:', dt_min)\n", + "print('dt_max:', dt_max)\n", + "print('anode:', anode)\n", + "print('cathode:', cathode)\n", + "print('T_Kelvin:', T_Kelvin)\n", + "print('p_bar:', p_bar)" ] }, { @@ -58,7 +79,6 @@ "inField=180\n", "\n", "obs = nestpy.runNEST(detector, keV, type_num, inField, pos_x, pos_y, pos_z, seed=0)\n", - "\n", "s1c_phd = obs.s1c_phd\n", "s2c_phd = obs.s2c_phd\n", "print(s1c_phd, s2c_phd)" @@ -66,24 +86,26 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# run many recoils with vectorized arguments\n", "\n", + "# somehow detector is deleted once runNEST is finished\n", + "# just declare it again here\n", + "detector = nestpy.DetectorExample_LUX_RUN03()\n", "\n", "n_events=1000\n", "keV=np.linspace(0, 100, n_events)\n", "type_num = nestpy.INTERACTION_TYPE(0) # NR\n", "\n", - "r = np.random.uniform(low=0, high=r_max, size=n_events)\n", + "r = np.random.uniform(low=0, high=radius, size=n_events)\n", "phi = np.random.uniform(low=0, high=2*np.pi, size=n_events)\n", "pos_x = r * np.cos(phi);\n", "pos_y = r * np.sin(phi);\n", "pos_z = np.random.uniform(low=0, high=z_max, size=n_events)\n", "\n", - "\n", "inField=180\n", "obs_arr = nestpy.runNEST_vec(detector, keV.tolist(), type_num, inField, pos_x.tolist(), pos_y.tolist(), pos_z.tolist(), 0)\n", "s1 = obs_arr.s1c_phd\n", @@ -92,7 +114,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -105,7 +127,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -119,13 +141,6 @@ "plt.show()" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": null, From e1eef6f83b546fe500a26ec56dd3b3f083cd77a0 Mon Sep 17 00:00:00 2001 From: Xin Xiang <42788528+xxiang4@users.noreply.github.com> Date: Thu, 26 Mar 2020 15:34:39 -0400 Subject: [PATCH 11/18] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c660c1e..122b86c 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,12 @@ Requirements: You must have CMake>=2.8.12 and a C++11 compatible compiler (GCC>= First, you must check out this repository then simply run the installer: ``` -git checkout https://github.com/NESTCollaboration/nestpy +git clone https://github.com/xxiang4/nestpy.git cd nestpy python setup.py install ``` + ## Usage Python bindings to the NEST library: From 111715e88eb738c362568b9ea57dbe8359a0b195 Mon Sep 17 00:00:00 2001 From: Xin Xiang <42788528+xxiang4@users.noreply.github.com> Date: Thu, 26 Mar 2020 15:35:56 -0400 Subject: [PATCH 12/18] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 122b86c..5a7bdbd 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ This package is forked from [nestpy](https://github.com/NESTCollaboration/nestpy Please see `example/demo_v0.ipynb` for the usage of the two functions. -## Installing from PyPI +## Installing from PyPI (not for this repo) For 64-bit Linux or Mac systems, instally 'nestpy' should just require running: From 1c80b8ec92962cf5266cb0441a202a0b978b1f1a Mon Sep 17 00:00:00 2001 From: xxiang4 Date: Thu, 26 Mar 2020 18:12:51 -0400 Subject: [PATCH 13/18] debug NESTCalc.GetYields functions default input --- src/nestpy/bindings.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/nestpy/bindings.cpp b/src/nestpy/bindings.cpp index 39faec6..273941f 100644 --- a/src/nestpy/bindings.cpp +++ b/src/nestpy/bindings.cpp @@ -4,6 +4,7 @@ #include "testNEST.hh" //#include "DetectorExample_XENON10.hh" #include "LUX_Run03.hh" +// #include "TestSpectra.hh" // XX: Added #include #include @@ -169,7 +170,7 @@ PYBIND11_MODULE(nestpy, m) { // Binding for the NESTcalc class py::class_(m, "NESTcalc") - // .def(py::init<>()) + // .def(py::init<>()) //XX: remove .def(py::init()) .def("BinomFluct", &NEST::NESTcalc::BinomFluct) @@ -196,7 +197,7 @@ PYBIND11_MODULE(nestpy, m) { py::arg("drift_field") = 124, py::arg("A") = 131.293, py::arg("Z") = 54, - py::arg("nuisance_parameters") = std::vector({ 11., 1.1, 0.0480, -0.0533, 12.6, 0.3, 2., 0.3, 2., 0.5, 1.}) + py::arg("nuisance_parameters") = std::vector({ 11., 1.1, 0.0480, -0.0533, 12.6, 0.3, 2., 0.3, 2., 0.5, 1., 1.}) ) .def("GetQuanta", &NEST::NESTcalc::GetQuanta, py::arg("yields"), @@ -264,4 +265,15 @@ PYBIND11_MODULE(nestpy, m) { m.def("runNEST_vec", &runNEST_vec, "Generate (S1, S2) for a vectorized recoil energies"); + // py::class_(m, "TestSpectra", py::dynamic_attr()) + // .def(py::init<>()) + // .def("WIMP_dRate", &TestSpectra::WIMP_dRate, "SI WIMP at 1e-36 cm2", py::arg("Er")=10., py::arg("mass")=10.) + // .def("CH3T_spectrum", &TestSpectra::CH3T_spectrum, py::arg("emin"), py::arg("emax")) + // .def("C14_spectrum", &TestSpectra::C14_spectrum, py::arg("emin"), py::arg("emax")) + // .def("B8_spectrum", &TestSpectra::B8_spectrum, py::arg("emin"), py::arg("emax")) + // .def("AmBe_spectrum", &TestSpectra::AmBe_spectrum, py::arg("emin"), py::arg("emax")) + // .def("Cf_spectrum", &TestSpectra::Cf_spectrum, py::arg("emin"), py::arg("emax")) + // .def("DD_spectrum", &TestSpectra::DD_spectrum, py::arg("emin"), py::arg("emax")); + + } From a2e08881a30c138cf6a487e09772c819434d0d65 Mon Sep 17 00:00:00 2001 From: xxiang4 Date: Sat, 28 Mar 2020 00:00:08 -0400 Subject: [PATCH 14/18] add WIMP_dRate to binding --- examples/demo_v0.ipynb | 136 ++++++++++++++++++++++++++++++++++++++-- src/nestpy/bindings.cpp | 22 +++---- 2 files changed, 141 insertions(+), 17 deletions(-) diff --git a/examples/demo_v0.ipynb b/examples/demo_v0.ipynb index d7b06f0..3e9442e 100644 --- a/examples/demo_v0.ipynb +++ b/examples/demo_v0.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -14,7 +14,90 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# NEST 2.0.1\n", + "def NESTv2p01_LyQy(energy, dfield, density, nuis=[1,0,1,0], fp=[50, 0.01]):\n", + " density0 = 2.90 \n", + " Param = [11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.]\n", + " Nq = Param[0] * np.power(energy, Param[1])\n", + " ThomasImel = Param[2] * np.power(dfield, Param[3]) * np.power(density / density0, 0.3)\n", + " Qy = 1. / (ThomasImel*np.power(energy+Param[4],Param[9]))\n", + " Qy *= 1. - 1. / np.power(1. + np.power((energy / Param[5]), Param[6]),Param[10])\n", + " Ly = Nq / energy - Qy\n", + " Qy[Qy<0]=0\n", + " Ly[Ly<0]=0 \n", + " Ly = Ly*(1. - 1. / np.power(1. + np.power((energy / Param[7]), Param[8]),Param[11]));\n", + " Ly = Ly*(nuis[0]+ nuis[1]*(energy-2))\n", + " #Qy = Qy*(nuis[2]+ nuis[3]/energy)\n", + " Qy = Qy*(nuis[2]+ nuis[3]*(energy-1))\n", + "\n", + " return Ly, Qy\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Xy/R83/P0KFD2b59O1988QX//Oc/z8p6ww03MG3atOIr9QDTpk3j4MGDtGzZ8lfjsevUqcPBg+7XX/LzC5j/3n+IWzgSXy84PnIOzQdOVLF2b2uBSMdxwh3H8QOuBb6ynElExCV59JXrklxhLkuDBg3ivvvuY+nSpaSlpRVv/73i9tBDDzFgwADmzp1Lp06dWLRo0XmPUbly5V/td8yYMWcV26+++uqcxdAYw2effUbz5s1/tf2HH37A39+/+HNvb2/y8/PPm+VnN9xwA5MmTSIqqmTvv7+/P/3796d///7UrVuXL774onjoyvlUqlTprHmfx40bR2RkJBMmTCjeFhoayv79+wkNDSU/P5+MjIziXzJSUlIYOnQo77//fvEV5dDQ0OIhJT8/5+fhI3Xr1i0ezpKamkqdOnXOytW9e3d27tzJsWPHqFWrFidPnmTAgAE88cQTdOrU6azne3t7M3LkSJ555hnGjh0LFM3ZXqlSpRK9D67i2PHjJLxxC32zFpFYrSONb/mQgCANBXAnjuN8DFwO1HIcJwV4zBjztuM4dwHzAW/gHWPMVosxRURclq5cl6GbbrqJRx99tHg89M+6d+/Ohx9+CBSNm65VqxbVqlVj586dtG7dmgcffJB27dqxfft2qlatyqlTp0p0vF69ejFr1qziYQrp6ens3buXzp07891337F79+7i7QB9+/blpZdeKi77GzduPO8xfH19ycvLO+9zJk6cyOTJk8+7vw0bNhRfnS0sLGTz5s00btz4vK/7WcuWLX81BOUf//gHGRkZZx170KBBvPfee0DRLCY9e/bEcRxOnDjBgAEDmDRpEl27di1+fkhICFWrVuX777/HGMP7779fPLb7l/t67733ircnJycXv5cbNmwgNzeX4OBgcnNzGTp0KKNHj2b48OHFxzDGFGc3xjBnzhxatGhR/HhSUhLR0dElfi9s274tnvQpPeh2ZjFbm4+n+cR5KtZuyBgzyhgTYozxNcaEGmPe/mn7XGNMs5/GVz9pO6eIiKtymXLtiSt9hYaGFo/5/aV//etfrFu3jpiYGB566KHiojZ58mSio6OJjY2lUqVK9O/fn5iYGHx8fIiNjT3rhsbfatWqFU888QR9+vQhJiaG3r17Fw+beOONNxg2bBixsbGMHDkSgH/+85/k5eURExNDdHT0WcMYzmXcuHHExMT87g2NP7v55pvPuto9c+bMX03Ft2rVKo4cOcLAgQOJjo4u/lrvuuuu8+b42YABA1i6dClQdHX5ySefJCEhgbZt2xIXF8dbb71VnCctLY2IiAief/55nnrqKaBoyrvk5GQef/zx4lw//3Ly6quvcssttxAREUHTpk3p378/UHRj58KFC4mMjGThwoXFU/599tlnREdHExcXx/jx45k5cyaO4/DJJ5+wbNky3n333eJjbNq0qfgvDa1bt6Z169akpqby6KOPFn9tK1euLB4D7+qWL/iMujP6EWIOs6//u0SN+g94uczpRUREpNw45xqiUGo7d5x3gKuAI8aY6F9s7we8SNGfF98yxjz1i8dmGWOuKcn+27VrZ9atW/erbdu2baNly5alEV/cQFZWFj169GDlypV4e3vbjlNqNm7cyPPPP88HH3xw1mOu9D2en1/A4vcep9e+FznkG0rlMZ9Qo6FrZHN1juOsN8a0s52jPJ3rnC0i4i5Ket4u60tL76KVvqQMVapUif/7v/8rnsnDUxw7dozHH3/cdow/dDzjJKueH0nf/S+QXL0rde9drmItIiIVXpne0GiMWeY4TthvNhev9AXgOM7PK30llGSfjuOMo2hRAho1alRqWcV99e3b13aEUte7d2/bEf7Qjh2J5H38F7oXJhPf7E6ir31Sw0BERESwM+a6AbD/F5+nAA0cxwl2HOc1oI3jOA//3ou1IIGIXauXfE316b1pXJjCrl6vE/2XSSrWIiIiP7ExFd/vrvQF3F7eYUSkZAoLDQunP02Pnf/lmE9dsq+fQ5PwWNuxREREXIqNcq2VvkTczJnsHFa/ejt9M2aTWLUjYbd9jH/VYNuxxE04jjMQGBgREWE7iohImbPxt1yt9CXiRg4fOUrCc/3plTGb+IbX0WziXBVruSDGmDnGmHFBQUG2o4iIlLkyLdc/rfS1GmjuOE6K4zg3G2PygZ9X+toGfOJpK305jsPf/va34s+fffZZ/vWvfwFFc1w3aNDgV/M9nzhxgjNnznDdddfRunVroqOj6datG3v37i1+Tr169X71utzc3OL9nzlzhgEDBtCiRQuioqKK510+l0mTJhEREUHz5s2ZP3/+OZ/z8ssvExERgeM4HDt2rHTeFHFL27dtIfPVHsTmbmJ7u38TffMrON4evbCriIjIRSnr2UJG/c72ucDcsjy2Tf7+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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# This is same as C++ NEST with naming\n", + "# ** NEED TO ADD LINK WITH HELP FOR VARIOUS CALLS\n", + "detector = nestpy.DetectorExample_LUX_RUN03()\n", + "nc = nestpy.NESTcalc(detector)\n", + "\n", + "interaction = nestpy.INTERACTION_TYPE(0) # NR\n", + "\n", + "Er = np.linspace(0.1, 100, 1000)\n", + "Ly = np.zeros(len(Er))\n", + "Qy = np.zeros(len(Er))\n", + "for i in range(len(Er)):\n", + " y = nc.GetYields(interaction, Er[i], density=2.9, drift_field=180)\n", + " Ly[i] = y.PhotonYield/Er[i]\n", + " Qy[i] = y.ElectronYield/Er[i]\n", + " \n", + "mLy, mQy = NESTv2p01_LyQy(Er, dfield=180, density=2.9)\n", + "\n", + "\n", + "plt.figure(figsize=[12,5])\n", + "plt.subplot(121)\n", + "plt.plot(Er, Ly, label='Most recent NEST (20200323)')\n", + "plt.plot(Er, mLy, label='NEST 2.0.1')\n", + "plt.legend()\n", + "plt.xlabel('Energy [keVnr]')\n", + "plt.ylabel('Ly')\n", + "plt.xscale('log')\n", + "plt.yscale('log')\n", + "plt.ylim([1, 12])\n", + "plt.subplot(122)\n", + "plt.plot(Er, Qy)\n", + "plt.plot(Er, mQy)\n", + "\n", + "plt.ylabel('Qy')\n", + "plt.xscale('log')\n", + "plt.xlabel('Energy [keVnr]')\n", + "plt.yscale('log')\n", + "plt.ylim([1, 11])\n", + "plt.show()\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -60,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -86,7 +169,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -114,7 +197,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -127,7 +210,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -141,6 +224,47 @@ "plt.show()" ] }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEaCAYAAAA7YdFPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xd4VGX2wPHvSSMVAoQUCJBQpITelSJIVwREBKMoKMrasf4sa6+4rtjFtWOlCQqKgIA06SBI7y20JLQkJJB2fn/cSQghCSmTzEzyfp5nHu995869J2x2Tt4uqophGIZhFJebowMwDMMwXJtJJIZhGEaJmERiGIZhlIhJJIZhGEaJmERiGIZhlIhJJIZhGEaJmERiGIZhlIhJJIbhREQkRESWi8hiEVkoImE53usuIgtE5E8RuaGU47hSRFbY4vhRRDxL83mGaxMzIdEwnIeIuAOqqpkiMgoIV9VXRcQbmArcqKqpZRBHTeCUqqaIyGvA36o6rbSfa7gmUyMxDCeiqhmqmmk7DQC22I6vAlKAWSIyQ0RCSzmOI6qaYjtNBzILut6o2EwiMYxiEpEHRGStiJwXka9zvVfN9oV/VkQOiMgtRbhvKxFZBTwArLcVhwANgOuBz4AX7fJDXD6WSKA/8GtZPM9wTR6ODsAwXNgR4FWgL+CT672PgFSsBNAK+E1ENqrqFlttIq9moqGqekxVNwAdRWQY8DRwD3Aa+EtVU0VkAfBU6fxIF4hIZWAicFtZNKcZrsvUSIxyT0Q8ReQ1EdkvImkiorbXxpLcV1Wnq+rPwIlcz/MDbgSeU9UkVV0GzARus33umKp2yeN1TEQq5bjVGSDZdrwaaCIigpWY9uTzs9YWkekiEiciJ0Tkwxzv7ReRJ0TkH1tN6Qtb5/7vIpIoIvNFpKrtWg/gR+BFVd1Rkn8no/wzicSoCF4FegJdgUBgATADyB75JCK/isjpfF5Fbda5AshQ1Z05yjYCUYX4bBsRWSIifwIPA28BqOoJW8yLgTeBV3J/0NZR/ytwAIgAagGTcl12I9DbFuP1wO/AM0AQ1vfBQ7brooGOwPMiskhEhhcidqOCMk1bRrkmIgFYX44tVPWQrewnYLiq7s26TlUH2PGx/li1iZzOYHWeF0hVVwDd8nnvI6wms/x0AGoCT6hquq1sWa5rPlDV4wAishSIVdW/beczsBIuqvot8O3l4jUMMDUSo/zrBuxV1V05yqoCx0rxmUlA5VxllYHEUnwmQG3gQI4kkpfjOY5T8jj3L43AjPLNJBKjvKsBnMo6sfUx3ECuUUi2foKkfF6/F/GZOwEPEWmYo6wlF4bylpZDQB1b/4ZhlBmTSIzybjNWv0MrEfEB3gAUmJzzIlXtr6r++bz653VjEfGwTRR0B9xFxFtEPFT1LDAdeFlE/ESkMzCI0m8qWg0cBcbZnutte7ZhlCqTSIxyTVXXAq8Bs4G9QChwraqm2eH2z2I1Bz0FjLAdP2t77z6sIcGxWKOf7lXVUq2RqGoGVgd6A+AgEAOYTnKj1JklUgzDMIwSMTUSwzAMo0RMIjEMwzBKxCQSwzAMo0RMIjEMwzBKxCQSwzAMo0QqxMSloKAgjYiIcHQYhmEYLmXdunXxqlrjcteV60QiItcD1zdo0IC1a9c6OhzDMAyXIiIHCnNduW7aUtVZqjqmSpUqjg7FMAyj3CrXiURErheRT8+cyb0Qq2EYhmEv5TqRmBqJYRhG6aswfSSGYVRsaWlpxMTEcO7cOUeH4nS8vb0JDw/H09OzWJ+vEGtttWvXTk1nu2FUbPv27SMgIIDq1atj7SZgAKgqJ06cIDExkcjIyIveE5F1qtrucvco101bhmEYWc6dO2eSSB5EhOrVq5eoplauE4npbDcMIyeTRPJW0n+Xcp1IStrZfiY5jZdnbeXU2VQ7R2YYhlF+lOtEUlKHT6fwzYr9vPrbNkeHYhiGizt37hwdOnSgZcuWREVF8cILL+R77fjx42ncuDHNmzenZcuWPProo6Sl5b8X24svvsjTTz99UdmGDRto0qSJ3eIviEkkBWhaszJjutXjp/UxbIoxzWOGYRRfpUqVWLhwIRs3bmTDhg3MmTOHlStXXnLdJ598wrx581i5ciWbNm1izZo1BAcHk5KSku+9o6OjmTz5ot2jmTRpErfccovdf468lOtEYo8+knu716eytwfvLdhpx8gMw6hoRAR/f3/AGoqclpaWZ9/Ea6+9xoQJEwgMDATAy8uLp556isqVKwMwb948rrzyStq0acNNN91EUlISjRo1IjAwkFWrVmXfZ8qUKdx8881l8JOV83kkqjoLmNWuXbu7i3uPAG9P7ulen//M2cHsTUe5tnmYHSM0DMMRXpq1ha1HEux6z6Y1K/PC9VEFXpORkUHbtm3ZvXs3999/Px07drzo/cTERJKSki4ZhpslPj6eV199lfnz5+Pn58ebb77J+PHjef7554mOjmbSpEl07NiRlStXUr16dRo2bGi3n68g5bpGYi9jutbjihB/Jiza4+hQDMNwYe7u7mzYsIGYmBhWr17N5s2bL3pfVS+qpcydO5dWrVoRERHB8uXLWblyJVu3bqVz5860atWKiRMncuCAta7izTffzLRp08jMzGTSpElER0eX2c9Vrmsk9uLh7kZ0hzq8NGsr248l0Di0sqNDMgyjBC5XcyhtgYGBdO/enTlz5tCsWbPs8sqVK+Pn58e+ffuIjIykb9++9O3blwEDBpCamoqq0rt3b3788cdL7lm7dm0iIiJYvHgxP/30EytWrCizn8clayQi0kREPhGRaSJyb1k8c1CrWni6C1PXxpTF4wzDKGfi4uI4ffo0ACkpKcyfP5/GjRtfct3TTz/Nvffem32tqmZPFuzUqRN//fUXu3fvBiA5OZmdOy/030ZHR/PII49Qv359wsPDS/tHylbmiUREvhSRWBHZnKu8n4jsEJHdIvJUQfdQ1W2qeg8wDLjs9H17qObnRa8mIfz892HSMjLL4pGGYZQjR48epUePHrRo0YL27dvTu3dvBgwYcMl19957L7169aJjx460aNGCzp0707p1a1q3bk2NGjX4+uuviY6OpkWLFnTq1Int27dnf/amm25iy5YtZdbJnqXM19oSkW5AEvCNqjazlbkDO4HeQAywBogG3IE3ct3iTlWNFZGBwFPAh6r6Q0HPLPZaW5kZ8Ne70Pp28K/Bwu3HufPrtfzvtrb0jQot+v0Mw3CYbdu2ldm8CleU17+P0661papLgJO5ijsAu1V1r6qmApOAQaq6SVUH5HrF2u4zU1WvAm7N6zkiMkZE1orI2ri4uOIFG7MGFr4K/20ArwTTffd/aOafyNQ1B4t3P8MwjHLIWTrbawGHcpzHAB3zuRYR6Q4MASoBs/O6RlU/FZGjwPVeXl5tixVVnU5w/2rY+jPsXYzb2s/5lc/Zta8WJw5MpXpdx3bYGYZhOANnSSR5rRiWb5ubqi4CFpVWMBcJagjdnoAuj8L6icSdTqTa0rfw+7Yf3Po9RHYrkzAMwzCclbOM2ooBauc4DweOlPSmdt0h0c0d2t1JjV5j+XfQuxzLrIJ+ewPMew4y0kt+f8MwDBflLIlkDdBQRCJFxAu4GZhZ0pvaY4mUvAYjdOvQgeuTX+Bkgxth+fswvglsnJzHpw3DMMo/Rwz//RFYATQSkRgRGa2q6cADwFxgGzBFVbeUdWy5xafEc8tvt9D/p/5cP+N6Fh1aRKZm0qdZddI8/Rnv8yDc+AUEhMKMf8H3w+Cv9yDdLDtvGEbF4YhRW9GqGqaqnqoarqpf2Mpnq+oVqlpfVV+z07NK1LSVcD6B2JRYYpJiSE5L5sGFD3LVj1fR66fORDSazcyNhzjX+Aa4cy60vwuO/QN/PA8/3QmZZq6JYRgXO336NEOHDqVx48Y0adIk39nn3333HS1atCAqKoqWLVty1113ZU9QzEvW3JKc4uPjqVGjBufPn7frz5AXZ+lsLxUicj1wfYMGDYr1+XqB9Zg+cDrbTm6jbUhbft79MxtiNwAwc89MtM5Krp/+P/rW60q7FgPwazuciB0LOLL8bep/3BH/poOh+1NW/4phGBXe2LFj6devH9OmTSM1NZXk5ORLrpkzZw7vvPMOv//+O7Vq1SIjI4OJEydy/Pjx7BWBcxsyZAiPP/44ycnJ+Pr6AjBt2jQGDhxIpUqVSvVnAgdMSHSEYk9ILMCSQ0t4+Nfv8PZOIMV9B+l6cYe7vwpvHT9O8zrdSevyMNXDO5GhGbiLu9nu0zAcwNETEhMSEmjZsiV79+4t8Duga9euvPzyy/To0SPP99etW8ejjz5KUlISQUFBfP3114SFhTFkyBCGDx/O8OHDAejevTvPPvssvXr1KlR8JZmQaGokxdStdjduaxDK+wt38fsj7TjHUXad3kVSahLhAeG8vfZt7hWF1K2wcAyVxJ3zmkEt/1pcG3ktHcI60CCwAUE+QXaPzTCMy/j9KTi2yb73DG0O/cfl+/bevXupUaMGd9xxBxs3bqRt27a89957+Pn5XXTdli1baNOmTZ73SEtL48EHH+SXX36hRo0aTJ48mX//+998+eWXREdH88MPPzB8+HCOHDnCzp07801G9lauE4k99iMpyNC24by3YBd/bErgwZ6taBXcKvu99iHtWXZkGadO7iZjx+98fe4Q4Z5+HE05yWebPuOzTZ8BUM27GtdGXsvYNmPx9vAujTANw3AC6enprF+/ng8++ICOHTsyduxYxo0bxyuvvJLvZzZt2sRtt91GYmIir7/+OlFRUWzevJnevXsD1v4mYWHWHkkDBgzgvvvuIyEhgSlTpjB06FDc3cumWb1cJ5LSVruaL1fWq87UdTHc36MBbm4XqquB3oEMqDcA6gFtHuLWJW/isfxD9rm78U+LgcQGN+LbXVM5ee4k3237ju+2fUeQTxD9IvpxNu0szYKacdMVN5lmMMMoDQXUHEpLeHg44eHh2ZtZDR06lHHjLo0jKiqK9evX06NHD5o3b86GDRt44IEHSElJQVWJiorKs5Pex8eHfv36MWPGDCZNmsQ777xT6j9TFmeZR1Iq7DGP5HJuahfOwZPJrN6fe/mwHNzc8Oz+NHLfSurVbM/gVd8xZslnzOn6DtMHTufjnh/TqkYrGlVtxKQdk5i7fy6vrHyFF1e8yKqjq0hJz3+vZsMwXENoaCi1a9dmx44dACxYsICmTZtect3TTz/N448/TkzMhS0rsvZrb9SoEXFxcdmJJC0tjS1bLsyUiI6OZvz48Rw/fpxOnTqV5o9zEdPZXkIpqRm0f20+faNCeXtYy8J96OBKmDoKziVA54eg2/+Bm5XT0zPTcRd3Xlv1GlN2TEFRPMSDqKAoWge3xtPNkyCfIG684kYquZf+aAzDKC8c3dkOsGHDBu666y5SU1OpV68eX331FVWrVr3kuokTJ/Lf//6XjIwMAgMDadasGS+99BJhYWFs2LCBhx56iDNnzpCens7DDz/M3Xdbrffp6emEhYUxevToPGs7BSlJZ7tJJHbw1E//8MuGI6x5thf+lQrZWphwFH5/ArbNguY3wYB3oFLARZckpiayIXYD646vY93xdWw+sZlMzSRTM/Hx8KFVjVZ0De9Kh9AO1PSvSYBXQD4PMwzDGRKJMzOjthxsaNtwJq05xPytxxnculbhPlQ5DIZ9C0vfhj9fs5asv+FTqHNh0eMArwC6hnela3hXADIyM3ATN9YeX8v8A/NZfWw1/1nzHwA8xIM+EX2o6l2VHrV70DEs38WTDcMw7KpcJ5LSHP6bU5s6VQmt7M3sTUcLn0gARKDb4xDRFabfDV/1g66PwdVPgrvnJZe72yY2tg9tT/vQ9gCsP76ew0mH+Tv2bxYcXEBKegrfb/ueelXqEVE5guY1mnNd5HWE+IXgJuW6S8wwDAcxTVt28uLMLfyw+iDrn+td+OatnM4lwJynYcN3ULMNDPkMgoqeAM9nnGfqjqmsPLqSAwkH2J+wH4AqlarQMbQj3Wt355o61+Dr4WtGhBkVimnaKphp2nIC1zYP4+vl+1m4PZaBLWsW/QbelWHwR9CwN/z6MPyvK/R9DdreYdVcCqmSeyVGNB3BiKYjADiUeIj5B+az89RO1hxbw7wD8wCo6VeTa+pcQ886PakdUJvqPtXxcDO/DoZhFJ355rCTtnWrUiOgErP/OVq8RJIlajDU7gA/3we/PgJ7/oTBE6CSf7FuVzugNnc0uwOATM1k3fF1bIjdwMa4jUzeMZnvtn0HQETlCAbWH0ijao24MuxKPPNoWjMMw8iLyyYSEfEDlgAvqOqvjo7H3U24rnkYP6w+yJnkNKr4luCLuHJNGDEdVnwI81+Az3dao7rqXlWiGN3E7aL+lbNpZ1l2eBkxiTHM2T+H9/9+HwBBaB3cmj4RfehTtw81fGuU6LmGYZRvjtiP5EsRiRWRzbnK+4nIDhHZLSJPFeJWTwJTSifK4rmxTTip6Zn8tuloyW/m5mbNMRnxE5xPgq+vgxUfgx37tPw8/egb0ZfRzUczZcAUlt28jLevfpvRzUeTmJbIuNXj6Dm1J0NnDuXZZc8yZ98c4lPi7fZ8w6ho7rzzToKDg2nWrNlF5SdPnqR37940bNiQ3r17c+rUqTw/v3r1arp3707Dhg1p06YN1113HZs25b9m2P79+wkPDycz17YWrVq1YvXq1SX/gWwcMYzna6BfzgIRcQc+AvoDTYFoEWkqIs1F5Ndcr2AR6QVsBY6XdfAFaVarMnWr+/LH1mP2u2n9a+CB1dD4Opj7NMwaWyobZ4kIVSpVoU9EH8a2Gcv0gdP5ZdAv3NfqPoJ8gph/cD5PLHmCXlN7ce/8e/l+2/fsP7M/zx0kDcPI26hRo5gzZ84l5ePGjaNnz57s2rWLnj175jmZ8Pjx4wwbNozXX3+dXbt2sX79ep5++mn27NmT7/MiIiKoXbs2S5cuzS7bvn07iYmJdOjQwT4/FA5o2lLVJSISkau4A7BbVfcCiMgkYJCqvgEMyH0PEekB+GElnRQRma2qmbmuGQOMAahTp469f4w8iQg9GgXz4+qDnEvLwNvTTgumefnBTd/An69a805O7oWhX4F/6TY51Qusxz2B9wCQnJbMvoR9zNs/jz8O/MGyw8sAq9O+Q1gHOoR2oHOtzlTzrlaqMRmGK+vWrRv79++/pPyXX35h0aJFAIwcOZLu3bvz5ptvXnTNhx9+yMiRI7nqqgtN3F26dMk+jouL45577uHgwYMAvPvuu3Tu3Jno6GgmTZrE1VdfDcCkSZMu2QSrpJylj6QWcCjHeQyQ74w6Vf03gIiMAuJzJxHbNZ+KyFHgei8vr7b2DTd/PRoH8/Xy/azYe4IejYLtd2M3N+j5PAQ1gpkPwNuNoOdz0OUR+z2jAL6evkRVjyKqehSPtH2EQ4mHWH54OSuOrmDhwYX8vPtnBKFFjRZcHX41XcO70qhqIzPE2HBKb65+k+0nt9v1no2rNebJDk8W67PHjx/PXsU3LCyM2NjYS67ZsmULI0eOzPceY8eO5ZFHHqFLly4cPHiQvn37sm3bNoYNG0br1q354IMP8PDwYPLkyUydOrVYcebHWRJJXt82l20zUdWvL/N+qS4jn5eOkdXw8XRn0fZY+yaSLC2HW/seLHod5r8Ipw5A/zfBo2zX3aodUJvhjYczvPFwMjWTbSe2sThmMYsOLeL9v9/n/b/fJ9gnmC7hXehaqyudwjrh71W8kWeGYVyqY8eOJCQk0KdPH9577z3mz5/P1q1bs99PSEggMTGR0NBQoqKiWLBgASEhIXh6el7SR1NSzpJIYoDaOc7DgSMlvWlZzWzPydvTnc4NqvPnjjheVC2dv8hDmsJNE2HBy/DXu1ZT14if8pwNXxbcxI2ooCiigqK4r9V9xKfEs+zwMpbGLGXe/nlM3zUdD/GgTUgbutaylnypV6Weqa0YDlPcmkNpCQkJ4ejRo4SFhXH06FGCgy/9IzRreflBgwYBsGrVKqZNm8avv1qDVjMzM1mxYgU+Pj6XfDareSskJMTuzVpQQCIRkUcL8fmzqvo/O8SxBmgoIpHAYeBm4BY73NchujcKZv62WHbHJtEwpJQWUnRzh94vQfUGVlPXO82s5Vba31WkCYylIcgniMENBjO4wWDSMtPYGLuRpYeXsvTwUt5e9zZvr3ubWv616FKrC93Cu9E+tD0+Hpf+8htGRTFw4EAmTpzIU089xcSJE7OTRU73338/HTt2pG/fvtn9JDn3fO/Tpw8ffvghTzzxBGCtNNyqlbXZ3o033sgzzzyDr68vCxcutHv8+S6RYutfmEDezU5ZblXVK4r0QJEfge5AENaoqxdU9QsRuRZ4F3AHvlTV14py33yelVUjuXvXrl0lvV2hHT2TwpVvLOTJfo25t3v90n/gtlmw+lPYtwSufAD6vOrwZJKfY2ePWUklZikrj64kJT2FSu6VaB/aPru2Ujug9uVvZBhF5AxLpERHR7No0SLi4+MJCQnhpZdeYvTo0Zw4cYJhw4Zx8OBB6tSpw9SpU6lW7dKBKytXruTJJ5/k8OHDBAcHExQUxPPPP0+7du2Ij4/n/vvvZ9u2baSnp9OtWzc++eST7M8OGjSI48ePs3LlyjxjK5Vl5EXkP6r6fwV+uBDXOIOyWGsrt+veX4qXhxsz7utcNg9Uhd+fhNX/sxZ97PFM2Ty3BFIzUll7fC1LY6zayoGEAwBEVonMTiptg9uaWfaGXThDInFmZj+SfDiqRgLw6ZI9vD57O/Me6cYVpdW8lZsq/HI/bPgBmg2x1umK7Fo2z7aDAwkHspPKmmNrSMtMw9fDl05hnegW3o0utboQ4hfi6DANF2USScFKNZGISDugK1ATSAE2A/NVtYC9ZZ2LI2okJ5LOc+UbC7n9yro8O+DS7TRLTepZmPtv2DbTWlF46BfQ+PrsHRhdRXJaMquPrWZJzBKWHl7KsbPWJM8m1ZrwQOsH6Fyzc/ay+oZRGCaRFKy0mrZGAQ8B+4B1QCzgDVwBdMZKKM+p6sGSBF+aHFkjARj55WoOnkzmz8e7l/mzST4Jn/eCk3ug0bVww/+sFYZdkKqy+/Rulh5eyvRd0zmQcCB7PbCu4V25vt71pqZiXNa2bdto3LixGS2YB1Vl+/btpZJI7sfq9E7J5/1WQHVVXVD0sMuWI2okABOX7+eFmVtY+NjV1KvhgDkUaedg7Rcw7zkIagjRP0K1emUfhx2dSz/Hn4f+ZPvJ7Sw9vJRdp3bhLu50rdWVqKAomlRrQudanc2S+MYl9u3bR0BAANWrVzfJJAdV5cSJEyQmJhIZGXnRe/ZIJO1Utey/fUuBoxLJgRNnufqtRbw8KIrbr4wo8+dn27sYpo4EL38Y/Ye1zW85cSjhENN2TWP2vtnZzV+RVSJpG9KW+lXqM6ThEHw9fR0cpeEM0tLSiImJ4dy5c44Oxel4e3sTHh6Op+fFA1vskUj+BvyBH4FJqro1zwudmKObtlSVK99YSLuIqnx4S5syf/5FjmyAr66F6vXg9pngW/7WxDqXfo55B+YxbtU4RISE1ASCfYK5uvbV9I/sT7OgZma+imEUgV0620WkEdbkwOFAKheSygF7BVoWHFUjAXjgh/Ws2X+SlU/3dHx1etd8mBQNlWtZW/nWbu/YeEpJpmbiJm4sP7ycp5c9zclzF8aF1K9Sn2c7PUvL4JZ4uplhxYZRELsP/xWRllhJZRhwTFXLaIJEyTkykXyzYj/P/7KFpf/Xg9rVnKCJ5eBKmH43nI23FnzsdF+xd190BarKiXMn+OPAH0zYMIFT5619Hqp7Vye6cTS+nr6E+4fTvXZ3xyd6w3Aydt2zXUTcgGAgBGv59riShVdxtI+wmpBW7zvpHImkTie4cx78eDP8+RrsmA13zi3zRR/LiogQ5BNEdONohl0xjIOJB/l598/8Hfs3H274MPu6qOpR3NLkFq6NvBZ3cTdJxTCK4HJNW12BaGAw1nDfScBPqnqmbMIrGUf3kQBkZiqtXp7HdS3CeGNIC4fEkK8tM2DqKJeZCW9vZ85bv8aLYxbzycZPOJRo7WTgLu4MbjCYu5rfha+nr9ljxaiw7NHZfgg4iJU8pqiqU+1GWBSObNoCuPPrNeyPP8tCR8wnuZyf7oZNU2DQR9B6hKOjcRhV5Y8Df/B37N+cTTvLjN0zAKhaqSrDGg3jxoY3EuZffka7GUZh2KNpq0vOTnUR8VPVs3aJroLp2jCIhdtjOXDiLHWr+zk6nIsN/hhOH7SWVklNhja3wan9EHSFtcJwBSEi9InoQ5+IPgDUq1KPxTGLOZ9xns82fcZnmz6jdXBr/D39GdNiDC1qOFnt0jAcqDBLpFwJfAH4q2odW6f7v1T1vrII0B4cXSPJmk/ywvVNuaNz5OU/UNb2LoZvBl5cNuhjaH2rY+JxMkeSjjB913QWxyxm96ndAPSJ6EPbkLa0C2lHvUDXnuRpGPmx51pbq4ChwExVbW0r26yq9t1iqwhEpDvwCrAFazjyooKud3QiAejx30VEBvnx5SgnHXJ7+iAc32I1daUmQuMBcPP3jo7K6cSnxDNi9ggOJx3OLmsf2p6brriJLrW6cPrcaWpXNsvgG+WDXUdtqeqhXKNYMkoQ2JfAACA2ZzISkX7Ae1j7kXyuquMKCglIwlr7K6a4sZSlTvWq8es/R8nIVNzdnHBEUGAd6/XoFpj7DPz9HSz+D1zt9LsElKkgnyC+v/Z7ktOTSctI48MNH/LHgT9Yc2wNbuKWvQZYdONoetftbUZ/GRVCYWok04DxwIdAJ6yFHNup6s3FeqBIN6wk8E1WIhERd2An0BsrMazBGi3mDryR6xZ3AvGqmikiIcB4VS2wDcYZaiQz/o7hkckb+e2hLkTVrOLQWC4rZi183tM6fnR7uVpSpTSkZqTyycZP2HFqB/6e/qw6uooT504QUTmCupXr0rhaY0Y3H21m1Rsux55NW0FYNYVeWLslzgPGquqJEgQXAfyaI5FcCbyoqn1t508DqGruJJL7Pl7AD6o6NI/3xgBjAOrUqdP2wAHHTsY/cjqFq8YtdN5+ktzid8OHbSHyahj4AVSt6+iIXEZqRio/7/6ZufvnEpcSx/4qATPgAAAgAElEQVQz+1GUbuHdeKvbWySnJxPkE+ToMA3jsgqbSAqzSUWmqt6qqiGqGqyqIwB7r0deCziU4zzGVpYnERkiIv8DvsWqKV1CVT8FXgLWe3l52THU4qkZ6EN4VR9W73ORbVyCGkC7O+HAcphwFZxxiRZEp+Dl7sWwRsP4ou8XzBw8k1c6v0KIbwhLYpbQeVJnek3txRebviAxNdHRoRqGXRQmkcwSkezEISJNgFl2jiOvhuR8q0qqOl1V/6WqwwvqaFfVWao6pkoV52hK6hBZjdX7TuIyu1IOeAfuWQqpSbB5Ouxbau1zYhTJoAaDmH/TfD7p9Qk3NLiB+oH1eXf9u1w/43ombJzAoYRDl7+JYTixwnS2v46VTK4DGgHfAPYeFxoD5BzqEg4cKelNc8xsL+mt7KJjZDWmrz/M3viz1HfE/iTFEdwEaraGP56zzn2DYMRPULOVY+NyQZ1rdaZzrc6oKpviN/H+3+8zYcMEPt7wMcMbDadbeDdaBLUg0DvQ0aEaRpFcNpGo6m8i4onVNxIADFZVe683sgZoKCKRwGGsxSFvsfMzHK5FuPUFsfnwGddJJABXPgA/jbaO01Lgy74wZpGVZIwiExFa1GjB530+59jZY7y3/j0m75jM5B2T8RAPRjQdgYiQmZlJdJNoQnxDzEZdhlMraImUD7i4eekaYC+wH0BVHyrWA0V+BLoDQcBx4AVV/UJErgXexRqp9aWqvlac++fFGUZtAaRlZBL1wlxGXRXBM9e62Jfw9tngV8MaIjzhKqgWaW2SZYa3llhyWjL/WfMfWge3ZsHBBfx56M+L3r+n5T3c3+p+MjIzzD71Rpmyx1pbIwv6oKpOLGZsZcYZFm3MbeCHy/Cv5MEPd3dydCjFt+5rmDUWoidDo36OjqZcSUxN5NFFjzKowSCCfIK4e97dALSq0YqjZ4/SILABver2YkjDIbhJYbo4DaP47L4fie2mbVR1fYkiK0POmEie+ukf5mw5xobn+zg6lOLLSIP321i1kzt+c3Q05dqCAwt4eNHDeb53d/O7eahNsRoGDKNQ7Dn8N6fPixmPQzjbqC2ABsH+nE5O4+TZVEeHUnzuntDhLjiwDPb8aS2vYpSKa+pcw7f9v2VEkxEMrD+QVzq/QsfQjgB8tukzrp1+LY8vfpwz58+w5/Qe1xkRaJQrRe3BMw3iJZTVyb4nLolqfi68z0Xr2+CP5+HbwSDu0HYk9H4ZKgU4OrJyRURoFdyKVsEXRskNqj+I8xnnmbBxAjGJMczdP5e5++cC0C+iHy9c+QL+Xi40mMNweUVNJC+VShSlxNmG/8KFRLI3Lil790SX5FsNmg6GrT9D00GwbiLE74Jbp4Gnt6OjK9dEBG8Pbx5p+wgAS2OWsjl+M3EpcUzfNZ2/jvzF6GajCawUSKhfKJ1rucyu2IaLKqizvU1BH3SlvhJnGbUFkJGpNHl+DndcFcHTrjZyK7e0FIjdBrXawD9TrL3gmw+DGz9zdGQV1ub4zXzw9wcsP7I8u8xDPHj/mvfpGt7VgZEZrsgeo7ayxiB6A+2AjVhNWy2AVaraxU6xlhpn7GwHuOHjv9h9PIkfx3SiWS3n6b8psQUvw9K34f41UOMKR0dTYWVqJhvjNnLm/BmeWfoMiWmJ+Hr4MqrZKHac3MG/WvyL8IBwArxMM6RRMHsu2jgJeE1VN9nOmwGPq+ooewRaFpypRgIQcyqZrv/5kwevacijvcvRF25SHLwTBVGDoftTUM1s+ORoCakJJKcl89DCh9h2clt2eYhvCL8M/gU/TyfbsdNwKvYctdU4K4kAqOpmwKyPUQLhVX0JCfDm8KkUR4diX/41oMPd8M9keL81nDZrSDlaZa/KhPqF8v113/Nxz495rO1jABxPPs7YhWM5dvZY9rWqyvmM844K1XBhhUkk20TkcxHpLiJXi8hnwLbLfsooUM1Ab46cLmeJBKDbExBoW3L+2D+OjcXI5unmSdfwroxqNopNIzfxZPsn2RS/id7TenPP/HvYemIr9y64l34/9ePM+TOODtdwMYVJJHdgbWk7FngY2GorM0qgVlVfDpfHROITCPf+ZR3Hmr83nNWIpiN4o6u13c9fh/9i+K/D+evwX8SnxHPPH/dw7/x7OZRoapRG4Vw2kajqOVV9R1VvAF6xHZ8rg9hKTESuF5FPz5xxvr+wagX6cPRMCpmZ5XACWaUAqFLHJBInd02da1g3Yl32+a83/MrIpiPZfGIzyw4v47317wGQlpnGgQTHbgxnOLeiziP5HChwWLAzUdVZwKx27drd7ehYcqsV6E1ahhKXdJ6QyuVw3kVwEzi6ATIzAQWz2KBT8nL3YvYNs/Hx9CHIJ4jH2j1GVFAUyw4vY+aemew5vYdg32CWH1nOl32/pH1oe0eHbDihoi6RYma220l4VV8ADp5MdnAkpSTqBjixG34YBq+FwoTO8Nf7jo7KyEPtyrWzt/4VEfpH9ufZTs8SUTmC3ad3Z89JeWLxE3y1+SvOnD/DhA0T+O+a/5KSXg6bZ40ic8mZ7SLiBryCteXvWldYiTi3yCBr2OW+uLOuPcM9Py1vhj0LYNNU6/z4ZlgRB1c9aJaedwE+Hj582/9bPvj7A6bsnEKb4DYcSDjA+HXjGb9ufPZ1Xu5edK/dneZBzRHzv2uFddlEkmuG+0Hb+RnggKqmF/WBIvIlMACIVdVmOcr7Ae9h7UfyuaqOK+A2g7D2dD+Jtbuiywmv6oOnu7AnPsnRoZQOERjwrtVf0m40HFkPMx+EuO1mQywXEegdyIOtH+TEuRM80f4JavjU4K/Df/HKylfwcvciOS2ZzzZ9xmebPqNvRF9GRY2iWVCzy9/YKHcKMyFxJVa/yD9YTVvNbMfVgXtUdV6RHijSDUgCvslKJCLiDuwEemMlhjVANFZSeSPXLe60vU6p6v9EZJqqDi3omc42ITFLr/GLiQzy47PbLzvfx/WdibEmK4a3hxHTwbuyoyMyiiktM430zHSeXPLkJZtwDb1iKKG+oYxoOgIvNy883T0dFKVhD/ackLgfaK2q7VS1LdAa2Az0Av5T1MBUdQlWTSKnDsBuVd2rqqnAJGCQqm5S1QG5XrFYyeaU7bMZeT1HRMaIyFoRWRsXF1fUMMtEvSA/9saV0xpJblXCrRpKzBrY/qujozFKwNPNEx8PH3w9rX6+sW3GMrD+QACm7ZzGhxs+pNMPnWjzXRuS08ppH6BxkcLObN+SdaKqW7ESy147xlELyDloPcZWlp/pQF/bdsBL8rpAVT+1Jb92NWrUsF+kdlQ/2J+DJ5NJz8h0dChlo81I8A2y9jCZOBDWfunoiIwSuOmKmwBr6frXuryG2MbiZHXcA2w5sYVMzSQm0SVboI1CKkwi2SEiE2yz2q8WkY+BnSJSCUizUxx59dLl2+amqsmqOlpVH1TVj/K9qRPPIwGrRpKWoRwqb0ul5MfNDep1h22zYN9i+PURiNvp6KiMYmob0pZNIzcRHhAOwPju4+lSqwuf9v4UHw8fAD7951M+2vAR/af354XlLzgyXKMUFSaRjAJ2Y81qfwTYaytLA3rYKY4YoHaO83DgiJ3u7bTqZW1yFVtBmrcA6veAnENGt8xwXCyGXfWq24sJvSbQsGpDVt+6Gh8PH1YeXcmn/3wKwG97fyM9s8jjcwwXUJhE0lRV31bVG1R1sKr+F+ipqpmqaq9vwDVAQxGJFBEv4GZgpp3u7bTq17CGAO8tryO38lKvu/VfNw8IbQGLXod1XzswIKO0vHDlC/h6WP0oYX5hnM84z7jV49gSv4XE1EReWfEKv+z+xWwPXA4UZtTWemBkjmXkbwYeUdWOxXqgyI9AdyAIOA68oKpfiMi1wLtYI7W+VNXXinP/vDjrqC2ANq/8QZ+mIYy7sYWjQyk7H7QDD29oFQ1zn7HKXjht5peUQ2mZaUzfOZ2GVRsycs7I7HJfD1+S062O+He6v0Ovur0cFaJRgMKO2irMhMShwDQRuRXoAtwO9CluYKoanU/5bGB2ce+bF2fcaje3utV9y+/s9vzc8D/rvzVbwfkkq1Zyaj9Ui3RoWIb9ebp5MrzxcFIzUrPLHmr9EHvO7GFQ/UG8vup1xq8bT2ClQCKqRLD1xFa6hXdzYMRGcVw2kajqXlst5GeskVV9VLWC9A6Xvhr+lThwooIlkvC2F44b9bMSyeF1JpGUY17uXtze9HYaVWuUPVQY4LlOz/Hk0ie5Y+6FBcW7h3fn7hZ306JGBaqlu7h8+0hEZJOI/CMi/wDTgGpABLDKVub0VHWWqo6pUsV5t7Ot7l+JE2cr8GZCwVHg6Qfbf3N0JEYpe6L9ExclEYAOYR34fcjv9K7bO7tsUcwiJmycAEB6ZjqZWkGGx7uwgmokA8osigqsup8XJ8+mkpmpuLlVwD4Cdw+48j5Y8pZVI7nmOdNXUsF4e3jzepfX6V23N6rKk0ufJCYxBlWl97TedK3VlZc7v+zoMI0CFJRITlxuVJaI+Ntx5JbduUIfSXV/LzIVTqekUc3Py9HhOEbXxyB+Fyx9Gxr2gTqdHB2RUca8PbzpH9kfgCNnj/De+vfYGLeR+JR4ZuyewWPtHmPLiS2E+oVSr0o9B0dr5FbQ8N9fRORtEekmIn5ZhSJST0RGi8hcoF/ph1h8rtK0BXAiqQI3b3n6wKAPrZFcm39ydDSGgzUPag7Ac389l102ZOYQ/vXHvxi7cKyjwjIKkG8iUdWewALgX8AWETkjIieA74BQrCHB08omzPKruq0WcuJs6mWuLOcqBUCj/vDPZEjOvRSbUZG0D23P6GajiUmKoW7luoyKGkVsciwA+xP2s/3kds5nnGfZ4WWcTTvr4GgNKGAeiYh4FGeZeGeSo2nr7l27djk6nDxtP5ZAv3eX8tEtbbiuRZijw3Gs41vgky7Q6T7oa7dpRIaLOpp0lEwyCfUNZe+ZvSSkJjBqzigAvN29OZdxjlC/UJ7q8BQ96/R0bLDllD3mkawUkRhgDjBHVffbK7iy4sxb7WbJ6hc5WZFHbmUJiYJWt8KqT6yk4lEJbv7BbNNbQYX5X/jDqmHVhmRqJv/X/v+ITY4lMTURN3Fj6s6pPPznwywevhiAat7lcJM4F5BvIlHVdiJSF+gPvCsitYBlwO/AYlU133x2UM3XCy8PN/bEmSo6AD3+Dbvnw17bPhcbf4TWIxwbk+EU3MSN25reln2eqZlEVI7grbVv8dxfz7EkZglvXf0WrWu0JsQvxIGRVjwFrrWlqgdU9RNVHQxcBczC2odkqYiYgf924OHuRpcGQczfdtysOQRQOQweXA93LYRq9a2Vgg0jD27ixq1NbsXTzZMlMdZuEk8sfoLe03qz4OACB0dXsRRm0UYAVDUN+Bv4TlU7AGNKLSo7cfZl5LP0aRpCzKkUdhxPdHQozsHL15r9Xq0eJB5zdDSGE3N3c+fRto8ypOEQ2oVYTfmKMnXnVAdHVrEUZs/2RcBA27UbgDgRWayqj5ZybCXmCn0kAE1rWtvOxpxMoXGo2YI2W0AIHFgOi8ZZc03Mtq1GHkY0tZo+z5w/w46TO5h3YB4z98wkLTMNTzfzO1MWClMjqaKqCcAQ4CvbdrtmqU47CvSxOtxPp9hrn7Bywj8U0s7Cojdg6y+OjsZwclUqVaFDWAc6hHYgJT2F3/f9DsDaY2sZ9PMgTp07dZk7GMVVmNV/PUQkDBgG/LuU4ykUEekK3IoVf1NVvcrBIZVIoJ/1V9Pp5Ao+lyS3gNALx+dNs59ROF1qdaFJtSb8e9m/WXV0FeuOr+Nw0mHm7Z/H8MbDHR1euVSYGslLwFxgt6quEZF6QLEnZYjIlyISKyKbc5X3E5EdIrJbRJ4q6B6qulRV7wF+BSYWNxZnEVDJA3c34XSyqZFcxD/HyJutP8Oxzflfaxg2vp6+fH/t94xpMYbf9v7G4aTDACw8tNDBkZVfhUkkR1W1hareB9ay8sD4Ejzza3ItrSIi7sBHWEONmwLRItJURJqLyK+5XsE5PnoL8GMJYnEKIkIVH09Op5gayUVy1kj2LoJPOjssFMO1eLp78mDrB/nu2u/oWacnnWt1Zu2xtXy39TvikuMA2BC7gfiUeAdHWj4UJpF8UMiyQlHVJUDuNTA6YNV49qpqKjAJGKSqm1R1QK5XLICI1AHO2PpvXF6gr6epkeTmF3RpmRkibRRBs6BmvNvjXQY3GExqZipvrnmTPtP6MGPXDG7//XaG/DKERYcWOTpMl1fQfiRXishjQA0ReTTH60Ws7XDtqRbWpllZYmxlBRkNfJXfmyIyRkTWisjauLg4O4RYugJ9TCK5RGAEdLzXWswxS1Ksw8IxXFfWQpAA6ZrO88ufR1GqVKrCI38+kt38ZRRPQTUSL8Afq0M7IMcrAWv7XXvKawOKAv/0VNUXVHV5Ae9/itW/s97Ly/mXZw/09TJNW7m5uUH/cfDAWrjyAats7Zcw8yFTMzGKpKZfzezju5tfmA3wWZ/PQGDiFpfvanWogpZIWQwsFpGvVfVAKccRA9TOcR4OHCnlZzqVQF9PdpoJiXkLrA1XPQgrPoTF46yyzmOhen3HxmW4DBHhm/7fUKVSFepVqUfdynUJ8Aog1C+UzjU7s/roagA2x28mPiWe7rW7OzZgF1OY4b+VRORTrG12s69X1WvsGMcaoKGIRAKHgZuxOtIrjEAfL9O0VRD/EKjeAE7sts5j1phEYhRJ6+DW2ceDGgzKPo6sEsmKIytIy0zj8cWPczjpMDc2vJF7W97LuYxz1K1c1xHhupTCdLZPxVoa5VngiRyvYhGRH4EVQCMRiRGR0bbl6h/AGma8DZiiqluK+4wsrrCxVZaqvp4knU8nNd3sT50nEWu/kiw755jmLcMuagfUJjUzlcnbJ3M46TBda3Xlp10/0WtaLwbMGMC59HOODtHpFaZGkq6qE+z1QFWNzqd8NjDbXs8B19hqN0vWToknz6YSWsX7MldXUFc/BZUqw8GVsGUG1O4Ene5xdFSGi8uqcXy79VuqVKrC+9e8zzVTruHUeWsm/Mw9MxnWaJgjQ3R6hamRzBKR+0QkTESqZb1KPTI7cKUaSXV/a0BAfEXecvdyKvnD1f8HN31tncdtd2g4RvmQlUiOnD1C2+C2eLh50C70wl5Ob6x6g79j/3ZUeC6hMIlkJFZT1nJgne21tjSDshdXWf0XIMhWI4kzieTyvCtD0BWQYrbkNUou2DcYDzercSYrgXSu2RkPNw9mDJyBm7gx/8B8R4bo9C6bSFQ1Mo9XvbIIrqRcqUZSw5ZI4hNNIikUn2pmb3fDLtzEjUnXTaJfRD/6RViLbtzQ8AZ+u+E3GlRtQLOgZmyI3cCzy57lk42fODha51SYZeRvz6tcVb+xfzj25Up9JEEBVtPWibNmLkmh+FaD04cuf51hFEKjao146+q3ss/dxI2a/tbck1bBrfhy85f8E/8PQT5BKMpdze7C02xrkK0wTVvtc7y6Ai9i7U/i9FypRuLr5YGPp7upkRSWTzXTtGWUifah7bOP41Pi+XjDxyw/ku9c6ArpsjUSVX0w57mIVAG+LbWIKrCgAC/T2V5YvlUh4TB8Mwhu/QncCzMA0TCKrmNYx0vKYlPMUj05FXqr3RySgYb2DqQ0uFJnO1gd7vFJpmmrUHxsAwf3LoLEow4NxSjfPN086R/ZHze58HV5MOGgAyNyPpdNJCIyS0Rm2l6/ATsAl9iuzpWatgCCAypxPMFMfioUn6oXjs+ddlwcRoXwRpc3WHvrWtbftp76VepzIKG0V41yLYVpD/hvjuN04ICqxpRSPBVaWBUf/tp9wtFhuAbfHFOZks2/mVG63N3ccbctel6nch0OJZqBHjkVZvjvYmA71sq/VQHT9lJKagZ6k3Q+nYRzZs2ty0rP8WtohgEbZahu5bocTDhISnoKP27/kbNpZzmfcZ7XVr7GyXMV83exME1bw4DVwE1Y+7avEhF7LyNfKlytjySsig8AR0+b5q3LuqIP1GxjHZvRW0YZqh9Yn9TMVGbsmsHrq15n6MyhLIlZwqQdk3hrzVuXv0E5VJjO9n8D7VV1pKrejrWb4XOlG5Z9uFofSZhtja2jZ1IcHIkL8K4Cd861jpNPOTYWo0JpGGiNNVp1dBUAMUkx2Qs7Hkw8yKlzpyrcQo+FSSRuWdvb2pwo5OeMIgoLtNVIzlSsX8Ji8/ACrwDTR2KUqcgqkQjC6mOrs8v2nN4DwLGzx+g2uRuj5412VHgOUZiEMEdE5orIKBEZBfwG/F66YRVMROrYRpF9KSJPOTIWewoJqISbwNHTpkZSaL5VTdOWUaZ8PX0JDwgnKS0pu2zX6V0AxCZbf3P/E/cPc/bNcUh8jlCYzvYngP8BLYCWwKeq+n/FfaDtyz9WRDbnKu8nIjtEZHchksMVwG+qeifQtLixOBsPdzd8PN1JTs1wdCiuw6y5ZThAvSrWcoOV3K018nae2nnJNU8seYJdp3aVaVyOUpjO9khgtqo+qqqPYNVQIkrwzK+Bfrme4Q58BPTHSgzRItJURJqLyK+5XsFYG23dLCILgT9LEIvT8XB3Iz3TbNhUaL7VTNOWUeaylp6vV6Ue3u7eHDt7LM/rYhIrxkyJwu6QmHPbvgxbWbGo6hIg95+QHYDdqrpXVVOBScAgVd2kqgNyvWKBO4AXbNv9XlfcWJyRh5uQnml2SSy0qpEQvwsyTS3OKDtZiSQtM41Qv9B8rzuYWDFmwBcmkXjYvtwBsB172TmOWkDOGT4xtrL8zAEeEpFPgP15XSAiY0RkrYisjYuLs1ugpc3dTcgwNZLCq90BUhPNJldGmYqoHAFAYmpi9irBedmfsL9sAnKwwiSSOBHJXu1XRAYB8XaOQ/Ioy/fbVFU3q+pQVb1HVR/P55pPgZeA9V5e9s57pcfT3Y30DJNICq12B+u/h1YXfJ1h2FGdynUASE5PJswvDOCimsmk6ybRokaLCrMmV2ESyT3AMyJyUEQOAk8CY+wcRwxQO8d5OHDEzs9wCe5uYvpIiqJqpDWn5Pjmy19rGHYS4hvCoPqD+OCaD7JrJMG+wdnvR1aJpE5AnQrTR1KYZeT3AJ1ExB8QVU0shTjWAA1tHfuHgZuBW0rhOU7Pw90kkiIRgUqVIc0MmTbKjojwapdXATiSZP3NG+AZkP2+j4cPAV4BnE0/65D4ylq+NRIRGZDzXFWTcieR3NcUhoj8CKwAGolIjIiMVtV04AFgLrANmKKqW4p679xcbWY72DrbM0xne5F4VIIKNpPYcB5ZTVt+nn7ZZSKCr4cvyWnJ2WVnzp+56Lw8KahG8paIHCbv/ossrwO/FuWBqhqdT/lsYHZR7nU5rrTVbhZ3NzP8t8g8vCH1LJzYA9XrOzoao4LJatry9/JnYP2B7DuzD7AmLqZlppGWYS3C2mVSF9qFtOOrfl85LNbSUlAiOQ6Mv8znnXq2jarOAma1a9fubkfHUlie7qZGUmQelWDnHOt1/2qo0cjRERkVSLBvMB5uHlT2qsxj7R7LLvf18AVgys4p2WtvrT2+1iExlrZ8E4mqdi/DOEqFa9ZITB9JkXl4XziOWWsSiVGmPNw8eL/H+zSsevHGsb6eViIZt3rcReV3zLmD/179X6r7VC+zGEtbuV580RX7SDzd3Mw8kqLyqHTh+ORex8VhVFhdw7teMjExK5Hktvb4Wn7e/XNZhFVmynUicbX9SMBWIzHzSIomZ43khFO3thoVSFbTVl4SU0tj8KvjlOtE4oo1Emv4r+kjKZKcNZLYbbD4P5BQIachGU6koESy+/TuMoyk9BU0/Pf/chzflOu910szqIrMw/SRFF3OGkn8TvjzNZj5kOPiMQwubdqq5X9h1acdp3ageuH/55mayZQdU0hJd835UAXVSG7Ocfx0rvf64QJcs2nLLJFSZDlrJIbhJHLXSLKWnheEY2eP8deRv7LfW3NsDa+sfIU3V79ZpjHaS0GJRPI5zuvcKbli05anadoqOg+fS8u8Xed/c6N8yl0jqeFbgz+G/sGqW1dR068m3279Nvs9TzdPALacKPE8bIcoKJFoPsd5nRt2Yob/FkNeNRKfwLKPwzByyF0j8fXwJdQvFB8PH9qFtruonyRDrW0QDiceLtMY7aWgCYktRSQBq/bhYzvGdu6d/8eMkvAwy8gXnUcev46mRmI4mE+umnLOJVQiKkcwc89MktOSWR+7nvkH5gOQmOaao7kKmpDoXpaBlAZXnJDoYZaRL7qsGol7Jcg4bx17+TsuHsMA3N0u/grNmUiylqE/mHiQe+ffe9F1aZlp2U1drqKgUVvVCnqVZZDF5Yp9JGaHxGLIqpH45pgprObf0HAuOZu6sjbGOpBw4JLr4pPtvd1T6SuoaWsdVl+IAHWAU7bjQOAgEFnq0VVAHu5mQmKRZdVI/KpDom3+iEkkhpPJ2fleO8Dafmnria2XXJeQmkAYYWUWlz3kWyNR1UhVrYe1tPv1qhqkqtWBAcD0sgowLyLSVESmiMgEERnqyFjszcOs/lt0WTUS7xwd7GYPd8MJzB4ymxFNRgAXN235evrSKawTk3dMvuQzZ867znSFLIWZ2d7etsQ7AKr6O3B1cR8oIl+KSKyIbM5V3k9EdojIbhF56jK36Q98oKr3ArcXNxZnZPZsL4asGonk+HXOTHdMLIaRQ+2A2oQHhAOXDgeObhzN2bRLN746k1o+E0m8iDwrIhEiUldE/g2cKMEzvybXhEYRcQc+wkoQTYFoW62juYj8musVDHwL3CwibwHlZwlNrKatNLOMfNFk1UjEDSJtf+OoqZEYziGrb8TPw++i8qvDr87eFCun0+dPM2vPrDyTjLMqTCKJBmoAM2yvGrayYlHVJcDJXMUdgN2quldVU4FJwCBV3aSqA3K9Ym2v+4GnANfrmSqAGf5bDDlrJCNnWonFNG0ZTqJeYD18PHwI8784abi7uXNHszsuuStJHpwAAA+fSURBVH5L/BaeWfYM8/bPK6sQSyzfznYReRqYo6p/A2NLOY5awKEc5zFAxwJiiwCeAfyAt/K5ZgwwBqBOnTp2CrP0ZfWRqCoiLrGAgONlrVmU1bQl7qaz3XAaLWu0ZPWtq/N8L6t567317wHg5eZFTFIMYHW6u4qCRm3tA8aKSEtgI/A7ME9VT5VCHHl9Y+b7Z7mq7seWJAq45lMROQpc7+Xl1bZk4ZUdDzfrnyIjU/FwN4mkULKSRlbidfMwNRLDZeQcFhxYKZAjSdbIw3KRSFR1ElYTEyLSGqtfY7qtP2M+Vm0l7zRbdDFA7Rzn4UCFXAfc3ZY80jMVD5efElpGshOJrUbi5mb6SAyX8f/t3X2MXOV1x/Hvb2Z2bWOwwdjQYBNsFDB1iVywS0kpURPqCCc4TijlJW1FkRuEVFqS0FaA1BcU0aQojZpUFASBQGhqQl2aGuoCVpoGUAi1MUTGuKgWgXiDUy/QUtcY22tO/7gzu3fHO+Pdnbl7Z+78PtJqZ56dmXtG+3L2Oc/btPLIFj+zps0aPvO9m84sGdd5JBHxXER8ISI+RDL9dxvwO22MYxNwmqRFkvpJdh5e38bX7xp9peRb4inAEzD39OTz4o8mn1X2rC3rGtNSe8XNnjZ7eN+twiWSOr8IXBMRTUtLjUhaCzwNLJY0IGlNRAwB15KsWdkOPBgRLW+D2Y0r28u10pYXJY7f3PfBDTvh7OpM8FI5KW0d3AdD+/ONzewIppdH9oqb3T/yt2rPgT28+MaL7Nyzc6yndZRmg+0fBu4ATgK+Dfw58A2S8YxbJnvBiBhzxld1rcqGsb42Wd2411ZftbR10NukTMz0WSO3VU5KW7f8DBy3EK77YW5hmR1Jf7l/+PZx048bvr3nwB4ue+QyALZeuXXK45qIZj2SvyQZ0D4eWAf8ALg/IpZFRK4r28erO3skybfEU4BbUCpDLRH/9yu5hmJ2JOkeyZzpI9sYdtNOwE3PI4mIf4uI/RHxbWAwIr4yVYG1QzeekFibteVFiS0olT3Ybl0jPUZy/IyR9dXdNEbSbPrvsZIuTt1X+n439Eoi4mHg4eXLl38671jGqzbl1z2SFqjs6b/WNdKztro1kTTrkXwPWJX6SN+/KPvQWteNPZLaYLtnbbWgVDdrywPu1sFGJZLpI4kkvUXKV7d8lYPvHpzSuCai2TqSw9fud5lu7JH0lavTfz1ra/JUV9ra+zrMnp9fPGZNpMdI0okk7a6td3HGnDP4yMKPTFVYE9Js1tbnmj0xIr7c/nBspEfiMZJJK5Vh6MDI/b2DTiTWsdKzttKlrXr1Jy52kmZjJMdUPy8GfoGRBYKrgCeyDKpdunH6b22w3T2SFqgEB1I7p+4t1L6eVjDTKyM9kln9sxo+bkZ5RsOv5a3ZwVY3R8TNwFzg7Ii4PiKuB5aRbGHS8bpx+m+l7JXtLStV4MD/jdzvwqNLrXekx0iabdTayT2S8axsfy+QqhNwAFiYSTSW6pG4tDVppXJdImnl+ByzbFVKowtDT13+FPevvP+wxw118LY/zUpbNfcD/y7pH0l25P0kcF+mUfWw9O6/Nkkqjy5teUt56wLvOzYpwc+eNpt5R8077OtdnUgi4hZJ/wKcX226qnpGScfryjGSsqf/tqxUhgNv5x2F2bit/8T6UQPtx/Qfc9hjujqRAETEFmBLxrG0XTdO/y0P7/7r/6InTaXRpS2zDrdo9qJR9+uP5QU6eh3JZHb/tQyVVStt5RxIN/MWKdblyqUyR/cdParNiaQFkk6VdLekdam2mZLuk3SXpN/IM7528+m6bVAaV0fbrKPVl7c6ubSVaSKRdI+k3ZJeqGu/UNJLknZIuqHZa0TEyxGxpq75YmBdRHwa+Hibw7Zup86dJmk2XoclkujRRALcS3JE77DqUb23ASuBJcAVkpZIer+kR+o+TmjwuguA2mkvrmHYaB08395svOoTycFDSWkrvQdXp8g0kUTEE8Cbdc3nADuqPY0DJOfCr46IrRFxUd3H7gYvPcDIosiOL8/ZFJN/JKz7jVXaenLgSc79u3PZ/NPNOUU1tjx+4+Yz0puAJCk03AhJ0vGS7gDOknRjtfkh4Nck3Q483OB5V0vaLGnz4OBgm0K3ruAeiRXArP5ZzJk+h2c+9QyQlLa+/9r3Adj2RssnkbdVHqOSYw0nN1w0ERFvANfUte0Fmu5OHBF3StoFrOrv7182mUCtS3mMxArg0sWXsvzE5fSV+oCkR/LOoXcAmFHprH238kgkA8DJqfsLgNdyiMOKyrO2rACWzlvK0nlLiUj+zx56d4j91bN10vtzdYI8SlubgNMkLZLUD1zOyM7CZq1zacsKRBIVVTj47sHhHkn6eN5OkPX037XA08BiSQOS1kTEEHAt8BiwHXgwIjIp+HXj7r/WBrXSlktcVhCVUiUpbQ0liSR9GFYnyLQGEBFXNGjfAGzI8trQnXttWRtUt5mhb4a3SrFCqCWS/YeS0lb6DJNOUOh5ku6R9KhaT6TDftnMJqtSGl3aqqizxgELnUgkrZJ051tvvZV3KDaVamMkfZ01s8VssvpKfaMG23ft3cXAnoGcoxpR6ETiHkmPqs3a6rABSbPJqu+R3PTUTax8aGXOUY0odCJxj6RHDZe23COxYqgfbO80hU4k7pH0qOHBdo+RWDHUD7Z3mkInEutRHmy3ghkeI3EimXoubfUoD7ZbwdTGSPYN7cs7lDEVOpG4tNWjhgfb3SOxYqiUKjz5kyfzDqOhQicS61EubVnBdNq6kXpOJFY8Hmy3gqntANypCp1IPEbSozz91wqm0uE7Whc6kXiMpEcND7a7R2LF0KmztWoKnUisR7lHYgXTiee0p3V8IpF0qqS7Ja1r1mY2zFukWMH0dCKRdI+k3ZJeqGu/UNJLknZIuqHZa0TEyxGx5khtZsO8jsQKpqcTCXAvcGG6QVIZuA1YCSwBrpC0RNL7JT1S93FCxvFZEan6Y+3pv1YQbw+9DcCKU1bkHMnYsj7Y6glJC+uazwF2RMTLAJIeAFZHxBeAi7KMx3qEeyRWMLUV7Re89wI2vrox52gOl8cYyXxgZ+r+QLVtTJKOl3QHcJakGxu1jfG8qyVtlrR5cHCwjeFbx/OCRCuoWf2z8g5hTHlMTtYYbdHowRHxBnDNkdrGeN6dknYBq/r7+5dNJlDrUu6RWMGsOGUFG1/dSF+5Mxcm5pFIBoCTU/cXAK/lEIcVlWdtWcHc+sFb2X9oP1tf35p3KGPKo7S1CThN0iJJ/cDlwPosLuQFiT2q5HUkViyVUoWZfTPzDqOhrKf/rgWeBhZLGpC0JiKGgGuBx4DtwIMRsS2j63uLlF506ofgvM/AvNPzjsSsJ2Q9a+uKBu0bgA1ZXtt62FFzYMXNsH9P3pGY9YSOX9neCpe2zMyyV+hE4tKWmVn2Cp1I3CMxM8teoROJeyRmZtkrdCJxj8TMLHuFTiRmZpa9QicSl7bMzLJX6ETi0pYBEA23cjOzNlD0wC+ZpEHg1Uk+fS7wehvD6QZ+z73B77k3tPKeT4mIeUd6UE8kklZI2hwRy/OOYyr5PfcGv+feMBXvudClLTMzy54TiZmZtcSJ5MjuzDuAHPg99wa/596Q+Xv2GImZmbXEPRIzM2uJE0kTki6U9JKkHZJuyDuerEk6WdJ3JW2XtE3SdXnHNBUklSU9J+mRvGOZKpKOlbRO0n9Uv98fyDumLEn6bPVn+gVJayVNzzumLEi6R9JuSS+k2uZI2ijpP6ufj2v3dZ1IGpBUBm4DVgJLgCskLck3qswNAddHxM8C5wK/2wPvGeA6ktM6e8lXgEcj4gxgKQV+/5LmA78PLI+IM4EyyRHfRXQvcGFd2w3AdyLiNOA71ftt5UTS2DnAjoh4OSIOAA8Aq3OOKVMRsSsitlRv7yH54zI/36iyJWkB8DHga3nHMlUkzQI+CNwNEBEHIuJ/8o0qcxVghqQKcBTwWs7xZCIingDerGteDdxXvX0f8Il2X9eJpLH5wM7U/QEK/kc1TdJC4CzgmXwjydxfAX8EvJt3IFPoVGAQ+Hq1pPc1STPzDiorEfET4EvAj4FdwFsR8Xi+UU2pEyNiFyT/LAIntPsCTiSNaYy2npjiJulo4B+Az0TE/+YdT1YkXQTsjohn845lilWAs4HbI+IsYC8ZlDs6RXVMYDWwCDgJmCnpN/ONqlicSBobAE5O3V9AQbvDaZL6SJLINyPiobzjydh5wMclvUJSuvywpL/NN6QpMQAMREStt7mOJLEU1a8CP4qIwYg4CDwE/FLOMU2l/5L0HoDq593tvoATSWObgNMkLZLUTzI4tz7nmDIlSSR18+0R8eW848laRNwYEQsiYiHJ9/dfI6Lw/6lGxE+BnZIWV5suAF7MMaSs/Rg4V9JR1Z/xCyjw5IIxrAeurN6+Evindl+g0u4XLIqIGJJ0LfAYySyPeyJiW85hZe084LeArZKer7bdFBEbcozJsvF7wDer/yS9DFyVczyZiYhnJK0DtpDMTHyOgq5wl7QW+BVgrqQB4E+BLwIPSlpDklR/ve3X9cp2MzNrhUtbZmbWEicSMzNriROJmZm1xInEzMxa4kRiZmYtcSIxM7OWOJGYNSHpkKTnUx9H3EpE0r2SfiTpmtT9S8Z5vd+urgVIt82VNChp2gTiPl/Si+ntxM2y4gWJZs3ti4ifb/YASeWIOFTX/IcRsW4S13sI+JKkoyLi7WrbJcD6iNg/nheQVImIJyV9FOiZM1YsP+6RmE2CpFck/Ymkp5jASmFJn6/2UEqSlkn6nqRnJT0m6T3VTTKfAFalnnY5sDZ13ZslbZG0VdIZ1fY/k3SnpMeBb7TvnZodmROJWXMz6kpbl6W+9k5E/HJEPDCeF5J0K8kW3leRbLvz18AlEbEMuAe4pfrQtVQPXpJ0EnA68N3US70eEWcDtwN/kGpfBqyOiE9N+F2atcClLbPmmpW2vjWB1/lj4JmIuBqgumHimcDGZB9ByiRnZUBSjvqb6gFUlwLr6kpntV2ZnwUuTrWvj4h9E4jJrC2cSMwmb+8EHrsJWCZpTkS8SXLezbaIOOys9IjYJ+lR4JMkPZPP1j2kNlZyiNG/wxOJx6xtXNoymxqPkuzC+s+SjgFeAuZJ+gAk58BI+rnU49cCnwNOBH4w1cGaTYQTiVlz9WMkX5zsC0XE3wN3kZwPUSaZjfUXkn4IPM/ow5YeJznN71vhLbqtw3kbebM2k3Qv8Mgkp/+2M46F1TjOzDMOKz73SMza7y3g87UFiXmQdD7wMPB6XjFY73CPxMzMWuIeiZmZtcSJxMzMWuJEYmZmLXEiMTOzljiRmJlZS/4fRRrxL7eHMZQAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# NEST WIMP spectrum comes from: \n", + "# Phys. Rev. D 82 (2010) 023530 (McCabe)\n", + "\n", + "Er = np.linspace(0.01, 10, 400)\n", + "\n", + "spec = nestpy.TestSpectra()\n", + "WIMP_dRate_vec = np.vectorize(spec.WIMP_dRate)\n", + "\n", + "\n", + "dR_3GeV = WIMP_dRate_vec(Er, m_GeV=3)\n", + "dR_6GeV = WIMP_dRate_vec(Er, m_GeV=6)\n", + "dR_10GeV = WIMP_dRate_vec(Er, m_GeV=10)\n", + "\n", + "plt.plot(Er, dR_3GeV, label='3 GeV')\n", + "plt.plot(Er, dR_6GeV, label='6 GeV')\n", + "plt.plot(Er, dR_10GeV, label='10 GeV')\n", + "plt.legend()\n", + "plt.yscale('log')\n", + "plt.title('$\\sigma=10^{-36}$ cm$^2$')\n", + "plt.xlabel('Er [keVnr]')\n", + "plt.ylabel('dR/dE [counts/(kg-d-keV)]')\n", + "plt.show()\n" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/src/nestpy/bindings.cpp b/src/nestpy/bindings.cpp index 273941f..af435bf 100644 --- a/src/nestpy/bindings.cpp +++ b/src/nestpy/bindings.cpp @@ -4,7 +4,7 @@ #include "testNEST.hh" //#include "DetectorExample_XENON10.hh" #include "LUX_Run03.hh" -// #include "TestSpectra.hh" // XX: Added +#include "TestSpectra.hh" // XX: Added #include #include @@ -194,7 +194,7 @@ PYBIND11_MODULE(nestpy, m) { py::arg("interaction") = NEST::INTERACTION_TYPE::NR, py::arg("energy") = 100, py::arg("density") = 2.9, - py::arg("drift_field") = 124, + py::arg("drift_field") = 180, py::arg("A") = 131.293, py::arg("Z") = 54, py::arg("nuisance_parameters") = std::vector({ 11., 1.1, 0.0480, -0.0533, 12.6, 0.3, 2., 0.3, 2., 0.5, 1., 1.}) @@ -265,15 +265,15 @@ PYBIND11_MODULE(nestpy, m) { m.def("runNEST_vec", &runNEST_vec, "Generate (S1, S2) for a vectorized recoil energies"); - // py::class_(m, "TestSpectra", py::dynamic_attr()) - // .def(py::init<>()) - // .def("WIMP_dRate", &TestSpectra::WIMP_dRate, "SI WIMP at 1e-36 cm2", py::arg("Er")=10., py::arg("mass")=10.) - // .def("CH3T_spectrum", &TestSpectra::CH3T_spectrum, py::arg("emin"), py::arg("emax")) - // .def("C14_spectrum", &TestSpectra::C14_spectrum, py::arg("emin"), py::arg("emax")) - // .def("B8_spectrum", &TestSpectra::B8_spectrum, py::arg("emin"), py::arg("emax")) - // .def("AmBe_spectrum", &TestSpectra::AmBe_spectrum, py::arg("emin"), py::arg("emax")) - // .def("Cf_spectrum", &TestSpectra::Cf_spectrum, py::arg("emin"), py::arg("emax")) - // .def("DD_spectrum", &TestSpectra::DD_spectrum, py::arg("emin"), py::arg("emax")); + py::class_(m, "TestSpectra", py::dynamic_attr()) + .def(py::init<>()) + .def("WIMP_dRate", &TestSpectra::WIMP_dRate, "SI WIMP at 1e-36 cm2", py::arg("Er_keV")=10., py::arg("m_GeV")=10.) + .def("CH3T_spectrum", &TestSpectra::CH3T_spectrum, py::arg("emin"), py::arg("emax")) + .def("C14_spectrum", &TestSpectra::C14_spectrum, py::arg("emin"), py::arg("emax")) + .def("B8_spectrum", &TestSpectra::B8_spectrum, py::arg("emin"), py::arg("emax")) + .def("AmBe_spectrum", &TestSpectra::AmBe_spectrum, py::arg("emin"), py::arg("emax")) + .def("Cf_spectrum", &TestSpectra::Cf_spectrum, py::arg("emin"), py::arg("emax")) + .def("DD_spectrum", &TestSpectra::DD_spectrum, py::arg("emin"), py::arg("emax")); } From 313de2d7756168ff8a424559c7a39e2cf4eb79e5 Mon Sep 17 00:00:00 2001 From: xxiang4 Date: Sat, 28 Mar 2020 00:14:28 -0400 Subject: [PATCH 15/18] update notebook --- examples/demo_v0.ipynb | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/examples/demo_v0.ipynb b/examples/demo_v0.ipynb index 3e9442e..5c9ce14 100644 --- a/examples/demo_v0.ipynb +++ b/examples/demo_v0.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 18, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -97,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -143,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -169,7 +169,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -197,7 +197,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -210,7 +210,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -224,14 +224,21 @@ "plt.show()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# example of using NEST recoil generators" + ] + }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] From 5c1272f0b7495100facfe99d351700144486cd41 Mon Sep 17 00:00:00 2001 From: Xin Xiang <42788528+xxiang4@users.noreply.github.com> Date: Thu, 9 Apr 2020 21:18:23 -0400 Subject: [PATCH 16/18] Update README.md --- README.md | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 5a7bdbd..bbda808 100644 --- a/README.md +++ b/README.md @@ -15,18 +15,9 @@ You do *not* have to have NEST already installed to use this package. This package is forked from [nestpy](https://github.com/NESTCollaboration/nestpy) and updated to LUX Run3 Detector template. In addition, two functions are added to `testNEST.cpp`. 1. A function that produce (S1, S2) observables 2. A vectorized function that accept energy in a list as input. +3. NEST built-in spectrum are binded. -Please see `example/demo_v0.ipynb` for the usage of the two functions. - -## Installing from PyPI (not for this repo) - -For 64-bit Linux or Mac systems, instally 'nestpy' should just require running: - -``` -pip install nestpy -``` - -You can then test that it works by running the example above. +Please see `example/demo_v0.ipynb` for the usage. ## Installing from source From e59859b994b880fa767b38d42e7c2bfdb1bb6b81 Mon Sep 17 00:00:00 2001 From: Xin Xiang <42788528+xxiang4@users.noreply.github.com> Date: Fri, 22 May 2020 13:47:33 -0400 Subject: [PATCH 17/18] Update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bbda808..979d119 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,10 @@ You do *not* have to have NEST already installed to use this package. ## Note from Xin: This package is forked from [nestpy](https://github.com/NESTCollaboration/nestpy) and updated to LUX Run3 Detector template. In addition, two functions are added to `testNEST.cpp`. -1. A function that produce (S1, S2) observables -2. A vectorized function that accept energy in a list as input. -3. NEST built-in spectrum are binded. +1. runNEST() --- A function that takes in an energy and a position as the inputs, and output (S1, S2) observables +2. runNEST_vec() --- A vectorized function that takes in a list of energies and positions as the inputs, and outputs a list of s1, s2 variables. + +Additionally, all NEST built-in spectrum are binded as well. User has direct access to the various spectra. Please see `example/demo_v0.ipynb` for the usage. From 05ffcaf62937a6eaae89f8e31fe2fd82ee9c0a24 Mon Sep 17 00:00:00 2001 From: xxiang4 Date: Fri, 22 May 2020 14:42:12 -0400 Subject: [PATCH 18/18] update the demo_v0.ipynb with more comments --- examples/demo_v0.ipynb | 164 +++++++++++------------------------------ 1 file changed, 43 insertions(+), 121 deletions(-) diff --git a/examples/demo_v0.ipynb b/examples/demo_v0.ipynb index 5c9ce14..ce981ea 100644 --- a/examples/demo_v0.ipynb +++ b/examples/demo_v0.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -12,93 +12,10 @@ "import time" ] }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# NEST 2.0.1\n", - "def NESTv2p01_LyQy(energy, dfield, density, nuis=[1,0,1,0], fp=[50, 0.01]):\n", - " density0 = 2.90 \n", - " Param = [11.,1.1,0.0480,-0.0533,12.6,0.3,2.,0.3,2.,0.5,1.,1.]\n", - " Nq = Param[0] * np.power(energy, Param[1])\n", - " ThomasImel = Param[2] * np.power(dfield, Param[3]) * np.power(density / density0, 0.3)\n", - " Qy = 1. / (ThomasImel*np.power(energy+Param[4],Param[9]))\n", - " Qy *= 1. - 1. / np.power(1. + np.power((energy / Param[5]), Param[6]),Param[10])\n", - " Ly = Nq / energy - Qy\n", - " Qy[Qy<0]=0\n", - " Ly[Ly<0]=0 \n", - " Ly = Ly*(1. - 1. / np.power(1. + np.power((energy / Param[7]), Param[8]),Param[11]));\n", - " Ly = Ly*(nuis[0]+ nuis[1]*(energy-2))\n", - " #Qy = Qy*(nuis[2]+ nuis[3]/energy)\n", - " Qy = Qy*(nuis[2]+ nuis[3]*(energy-1))\n", - "\n", - " return Ly, Qy\n" - ] - }, { "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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Xy/R83/P0KFD2b59O1988QX//Oc/z8p6ww03MG3atOIr9QDTpk3j4MGDtGzZ8lfjsevUqcPBg+7XX/LzC5j/3n+IWzgSXy84PnIOzQdOVLF2b2uBSMdxwh3H8QOuBb6ynElExCV59JXrklxhLkuDBg3ivvvuY+nSpaSlpRVv/73i9tBDDzFgwADmzp1Lp06dWLRo0XmPUbly5V/td8yYMWcV26+++uqcxdAYw2effUbz5s1/tf2HH37A39+/+HNvb2/y8/PPm+VnN9xwA5MmTSIqqmTvv7+/P/3796d///7UrVuXL774onjoyvlUqlTprHmfx40bR2RkJBMmTCjeFhoayv79+wkNDSU/P5+MjIziXzJSUlIYOnQo77//fvEV5dDQ0OIhJT8/5+fhI3Xr1i0ezpKamkqdOnXOytW9e3d27tzJsWPHqFWrFidPnmTAgAE88cQTdOrU6azne3t7M3LkSJ555hnGjh0LFM3ZXqlSpRK9D67i2PHjJLxxC32zFpFYrSONb/mQgCANBXAnjuN8DFwO1HIcJwV4zBjztuM4dwHzAW/gHWPMVosxRURclq5cl6GbbrqJRx99tHg89M+6d+/Ohx9+CBSNm65VqxbVqlVj586dtG7dmgcffJB27dqxfft2qlatyqlTp0p0vF69ejFr1qziYQrp6ens3buXzp07891337F79+7i7QB9+/blpZdeKi77GzduPO8xfH19ycvLO+9zJk6cyOTJk8+7vw0bNhRfnS0sLGTz5s00btz4vK/7WcuWLX81BOUf//gHGRkZZx170KBBvPfee0DRLCY9e/bEcRxOnDjBgAEDmDRpEl27di1+fkhICFWrVuX777/HGMP7779fPLb7l/t67733ircnJycXv5cbNmwgNzeX4OBgcnNzGTp0KKNHj2b48OHFxzDGFGc3xjBnzhxatGhR/HhSUhLR0dElfi9s274tnvQpPeh2ZjFbm4+n+cR5KtZuyBgzyhgTYozxNcaEGmPe/mn7XGNMs5/GVz9pO6eIiKtymXLtiSt9hYaGFo/5/aV//etfrFu3jpiYGB566KHiojZ58mSio6OJjY2lUqVK9O/fn5iYGHx8fIiNjT3rhsbfatWqFU888QR9+vQhJiaG3r17Fw+beOONNxg2bBixsbGMHDkSgH/+85/k5eURExNDdHT0WcMYzmXcuHHExMT87g2NP7v55pvPuto9c+bMX03Ft2rVKo4cOcLAgQOJjo4u/lrvuuuu8+b42YABA1i6dClQdHX5ySefJCEhgbZt2xIXF8dbb71VnCctLY2IiAief/55nnrqKaBoyrvk5GQef/zx4lw//3Ly6quvcssttxAREUHTpk3p378/UHRj58KFC4mMjGThwoXFU/599tlnREdHExcXx/jx45k5cyaO4/DJJ5+wbNky3n333eJjbNq0qfgvDa1bt6Z169akpqby6KOPFn9tK1euLB4D7+qWL/iMujP6EWIOs6//u0SN+g94uczpRUREpNw45xqiUGo7d5x3gKuAI8aY6F9s7we8SNGfF98yxjz1i8dmGWOuKcn+27VrZ9atW/erbdu2baNly5alEV/cQFZWFj169GDlypV4e3vbjlNqNm7cyPPPP88HH3xw1mOu9D2en1/A4vcep9e+FznkG0rlMZ9Qo6FrZHN1juOsN8a0s52jPJ3rnC0i4i5Ket4u60tL76KVvqQMVapUif/7v/8rnsnDUxw7dozHH3/cdow/dDzjJKueH0nf/S+QXL0rde9drmItIiIVXpne0GiMWeY4TthvNhev9AXgOM7PK30llGSfjuOMo2hRAho1alRqWcV99e3b13aEUte7d2/bEf7Qjh2J5H38F7oXJhPf7E6ir31Sw0BERESwM+a6AbD/F5+nAA0cxwl2HOc1oI3jOA//3ou1IIGIXauXfE316b1pXJjCrl6vE/2XSSrWIiIiP7ExFd/vrvQF3F7eYUSkZAoLDQunP02Pnf/lmE9dsq+fQ5PwWNuxREREXIqNcq2VvkTczJnsHFa/ejt9M2aTWLUjYbd9jH/VYNuxxE04jjMQGBgREWE7iohImbPxt1yt9CXiRg4fOUrCc/3plTGb+IbX0WziXBVruSDGmDnGmHFBQUG2o4iIlLkyLdc/rfS1GmjuOE6K4zg3G2PygZ9X+toGfOJpK305jsPf/va34s+fffZZ/vWvfwFFc1w3aNDgV/M9nzhxgjNnznDdddfRunVroqOj6datG3v37i1+Tr169X71utzc3OL9nzlzhgEDBtCiRQuioqKK510+l0mTJhEREUHz5s2ZP3/+OZ/z8ssvExERgeM4HDt2rHTeFHFL27dtIfPVHsTmbmJ7u38TffMrON4evbCriIjIRSnr2UJG/c72ucDcsjy2Tf7+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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# This is same as C++ NEST with naming\n", - "# ** NEED TO ADD LINK WITH HELP FOR VARIOUS CALLS\n", - "detector = nestpy.DetectorExample_LUX_RUN03()\n", - "nc = nestpy.NESTcalc(detector)\n", - "\n", - "interaction = nestpy.INTERACTION_TYPE(0) # NR\n", - "\n", - "Er = np.linspace(0.1, 100, 1000)\n", - "Ly = np.zeros(len(Er))\n", - "Qy = np.zeros(len(Er))\n", - "for i in range(len(Er)):\n", - " y = nc.GetYields(interaction, Er[i], density=2.9, drift_field=180)\n", - " Ly[i] = y.PhotonYield/Er[i]\n", - " Qy[i] = y.ElectronYield/Er[i]\n", - " \n", - "mLy, mQy = NESTv2p01_LyQy(Er, dfield=180, density=2.9)\n", - "\n", - "\n", - "plt.figure(figsize=[12,5])\n", - "plt.subplot(121)\n", - "plt.plot(Er, Ly, label='Most recent NEST (20200323)')\n", - "plt.plot(Er, mLy, label='NEST 2.0.1')\n", - "plt.legend()\n", - "plt.xlabel('Energy [keVnr]')\n", - "plt.ylabel('Ly')\n", - "plt.xscale('log')\n", - "plt.yscale('log')\n", - "plt.ylim([1, 12])\n", - "plt.subplot(122)\n", - "plt.plot(Er, Qy)\n", - "plt.plot(Er, mQy)\n", - "\n", - "plt.ylabel('Qy')\n", - "plt.xscale('log')\n", - "plt.xlabel('Energy [keVnr]')\n", - "plt.yscale('log')\n", - "plt.ylim([1, 11])\n", - "plt.show()\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, "outputs": [ { "name": "stdout", @@ -121,7 +38,6 @@ "detector = nestpy.DetectorExample_LUX_RUN03()\n", "\n", "# inspect detector parameters\n", - "# # feel free to inspect more\n", "z_max = detector.get_TopDrift() \n", "radius = detector.get_radius() # right fid radius?? TBD\n", "dt_min = detector.get_dt_min() # right min dt?? TBD\n", @@ -131,6 +47,7 @@ "T_Kelvin = detector.get_T_Kelvin() \n", "p_bar = detector.get_p_bar() \n", "\n", + "# print detector parameters (satisfied with the setting?)\n", "print('T_Kelvin:', T_Kelvin)\n", "print('radius:', radius)\n", "print('dt_min:', dt_min)\n", @@ -143,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -161,7 +78,17 @@ "pos_x, pos_y, pos_z = 0., 0., z_max/2.\n", "inField=180\n", "\n", - "obs = nestpy.runNEST(detector, keV, type_num, inField, pos_x, pos_y, pos_z, seed=0)\n", + "obs = nestpy.runNEST(\n", + " detector, \n", + " keV, \n", + " type_num, \n", + " inField, \n", + " pos_x, \n", + " pos_y, \n", + " pos_z, \n", + " seed=0\n", + " )\n", + "\n", "s1c_phd = obs.s1c_phd\n", "s2c_phd = obs.s2c_phd\n", "print(s1c_phd, s2c_phd)" @@ -169,48 +96,50 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# run many recoils with vectorized arguments\n", "\n", "# somehow detector is deleted once runNEST is finished\n", - "# just declare it again here\n", - "detector = nestpy.DetectorExample_LUX_RUN03()\n", "\n", - "n_events=1000\n", + "n_events=100\n", "keV=np.linspace(0, 100, n_events)\n", "type_num = nestpy.INTERACTION_TYPE(0) # NR\n", "\n", - "r = np.random.uniform(low=0, high=radius, size=n_events)\n", + "# uniformly sample (x,y,z) in cylindar colume\n", + "r2 = np.random.uniform(low=0, high=radius*radius, size=n_events)\n", + "r = np.sqrt(r2)\n", "phi = np.random.uniform(low=0, high=2*np.pi, size=n_events)\n", "pos_x = r * np.cos(phi);\n", "pos_y = r * np.sin(phi);\n", "pos_z = np.random.uniform(low=0, high=z_max, size=n_events)\n", "\n", "inField=180\n", - "obs_arr = nestpy.runNEST_vec(detector, keV.tolist(), type_num, inField, pos_x.tolist(), pos_y.tolist(), pos_z.tolist(), 0)\n", - "s1 = obs_arr.s1c_phd\n", - "s2 = obs_arr.s2c_phd\n" + "obs_arr = nestpy.runNEST_vec(\n", + " nestpy.DetectorExample_LUX_RUN03(), \n", + " keV.tolist(), \n", + " type_num, \n", + " inField, \n", + " pos_x.tolist(), \n", + " pos_y.tolist(), \n", + " pos_z.tolist(), \n", + " 0\n", + " )\n", + "\n", + "s1 = np.array(obs_arr.s1c_phd)\n", + "s2 =np.array(obs_arr.s2c_phd)\n" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/xinxiang/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in log10\n", - " \"\"\"Entry point for launching an IPython kernel.\n" - ] - }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJztnX+UHNV15z93WgX0AFELM0lgrEEytsUGY0lmHLSrZNdSfCwMRlbAmDjgOIkTHZ/N7hqb6ETErJG8Pgc5Wv/YPeusl41zkqxZB4xgAlYc4Kzk2CZHsiVGQghJ8Q8MuFGMbDTYSIPUGt39o7tG1dX1qqq7q6e7eu7nHMFM9evqO9Xd3/fqvvu+T1QVwzAMo78Y6HYAhmEYRvaYuBuGYfQhJu6GYRh9iIm7YRhGH2LibhiG0YeYuBuGYfQhJu6GYRh9iIm7YRhGH2LibhiG0YfM6dYLX3jhhbpgwYJuvbxhGEYu2b17909UdSipXdfEfcGCBezatatbL28YhpFLROTZNO0sLWMYhtGHmLgbhmH0ISbuhmEYfYiJu2EYRh9i4m4YhtGHmLgbhmH0ISbuhmEYfUhinbuInAN8Azi71v5+Vb0zot17gQ2AAntV9bezDdUwjG4wNl5m8yOHeGFikotLRdatWsSapcPdDstIIM0iphPASlV9RUQ84Fsi8jVV3eE3EJE3ALcDy1X1qIj8YofiNQxjBhkbL3P7A/uYrEwBUJ6Y5PYH9gF0ROCtI8mORHHX6g7ar9R+9Wr/wrtq/yHweVU9WnvOi1kGaRhGd9j8yKFpYfeZrEyx+ZFDmYtulh2JdRIp7QdEpADsBl5PVcR3hpq8sdbucaAAbFDVf4g4z1pgLcDIyEgbYRuGMROUJyadx8fGy5kKZrsdiS/o5YlJhDMj0E7fbfQqqcRdVaeAJSJSAh4UkTep6lOh87wBeBvwWuCbtTYTofPcDdwNMDo6Gh79G4bRYxREmNLor2pQMIMj5dKghyq8PFlJPWoeGy87O5IXHMfDzw+O+sMRd+puo5dpyjhMVSdE5OvA1UBQ3H8E7FDVCvCMiByiKvbfySpQwzBmHpewwxnBBOqE9ejxynSbNKPmO8b28aUdzzlf5+JSMTHOqFF/mDSdRD+RWAopIkO1ETsiUgTeDhwMNRsDVtTaXEg1TfODbEM1DGOmGU4Q1hcmJhOFNdgJhBkbL8cKe9ErsG7VosQ40wh3mk6in0hT534RsF1EnqQ6En9MVb8qIp8QkdW1No8APxWRp4HtwDpV/WlnQjaM7jA2Xmb5pm0sXL+V5Zu2MTZe7nZIHWfdqkUUvYLz8YtLxVTC6kq5uETf567rr0iVSkkS7rSdRD+RplrmSWBpxPGPB35W4KO1f4bRd8x0SWBWtFI1En7ODVcOs/XJw3XpFjgjmP4kZhxSO2/4tZtJlcT9LetWLap7f/zXVKp3H7OxWkY0JqfWSUZHR9U26zDywvJN2yIFbLhU5PH1K7sQkRtX1QhUBTluNBzuxILPASLFNeo5UURdK9d1DVIqerxr8UVs2V2OjMv/W2ZL+aOI7FbV0cR2Ju5GXpnJL/PC9VsbKjCgOjp8ZtO1HXnNVkgjtHEdUqudWPC9cClK1LUaGy9z6717nOcNPjfqvL3YuXaatOLetW32DKMdOpEmiessLi4VI0Uv60m6sfEyGx/eP50CKRU9Nqy+PPXflKZqpDwxyfJN2yI7Q1eaxH/OCxOTzC16nDw1xfHKaQDmDXrced3l0yLr6iAUuPT2v2dKtS5VkkbcXR3GbKuAaQYTdyOXZL1yMqmziMrpZj1JNzZeZt39e6lMnZGyickKH713Dxsf3s/E8eS68bRi5+oMXZ2YcGZSdGKyPvd+9HiFdffvnT5X1LXy8Usrg6/fDmk613bu8NI+txdTQibuRi5xiVirI7mkzsL/ooa/wMD0iDZ4rJUv+uZHDtUJu89pztSOh0Ux+DorLhtiIGbRUZhgiaJ/nrlFjwGB06FTJJ2xMqWR1younz5ZmUo1ao9jxWVDsY9HddofuXcPu559iU+uuaLp50Z1iM3cRc5kJ2A5dyOXZD3B2UpO3ZXfHqAqyD5Jk5hJMUQxb9Dj1crpxBRMGopeIZPzQGNlSjN/UyuUih577nxH5GNj42U+et+eho4Kqu/rZ29aEvueJH3GghPXUYQ/i3GT1c0IfNqcu/m5G5nQbA14uzXjUfXX7aRJXLf3cbf9rvz26dDvcYt40r5WmKPHK5kJclbngTMj4zvGqiPXVuYkhktFzipIqrbhFJGPn+KKEnao3olsfHh/7Lnj7g59oY67Mwk/P+7usBOYuBttE/ygK2duS12C3Wz7KNYsHeau669guFREqArCDVcOs/mRQyxcv5UlGx9l6SceTd15tNJZNJMC8ick4+JYt2oRXkpR62UU+NKO51iy8dHEMscoyhOTnIxITzWDK8UV5OjxSuz74eqYSoMet923N7FTDD8/61RiEibuRts0OyJpZwRzx9g+Lr3971mwfiu33beXFZcN8cyma1m3ahFbdpenO4yJyQpHj1emO49b793Dko2POr/MUZ1F0u1ys6PSpE5szdJhbnrr/KbO2cu4RtVZMm/QizyeVjDjPnNRHb5XEF559VTivIY/AR3s0Fu5O2wHm1A12ibp9jU8gdTqCCZsMDWlOv379oNHEkdSE5OV2Mm04GRgGtatWtT0hGBcRc/YeJktu/vf0iArvIJw7ZsvapjQXrN02Fn1E6Y8MckdY/vYfvBIwzmiJtGPnTiV2Gm57IZnouKqLg6bUDXaxTXxFDXp51qMAsmToX6NdJiCCKdVU0/cpZlMiyPNgp2k149azPOR+/bQpa9j7hiuVQe5Vq3uevalWEOyOOImOeMmiItegbPnDESKf3gStp1qGVvEZMwYrhGJauNkXdwXI2kE47oVnlKlVPRSpwEUMquHb4Xwbbg/+WfCno55gx6Pr1/J8k3bItN7H3twH8dPtv7+xN1due4ICiLccOWws0Px70qbvTtsB8u5G23jyle/nFJso/LbUdU0BXFPNv78xKmmYm5lEmtsvJxqIi2OqE4szeSfcYYTtevveg+PnZxqu/zSdW7XxPv7rpofm1Lrht2wpWWMjpHGFArglmUjdTlwVz3wW0bm8vj3X8oktnmDHoNnzXHeHodvnwfPGuC7Lx5r+zWjdihasH5ru3/OrENq/+mUfMWl7qJSK3H17q3UssfGZsZhRrdJm8IIf5HiFo+suGyo5VxqkPAqzOAX8I6xfdyz47lMF9+ce1aBY6FUQWFAOP/sOTNSVWI0zwAwd9BLZfsQl4v/XBvzO1HYIiaj6/jpmrh0CpzJgfvEmVfds+M5BjIoBQ8vbvHzrGPj5cyFHWgQdoCp02rCnjEJH7XG9oDnUEHf9iHNWgxX2mW4VOyax0yabfbOEZFvi8heEdkvIhtj2r5HRFREEnsVY3awZukwn37v4tjdfKBe0OPyk0qjMGeFXw/f6ukLIhRdSmHMCM0mIhSohJcUO4hbi5H1iuksSFMtcwJYqaqviIgHfEtEvqaqO4KNROR84D8BOzsQpzHDNFuyFdfe/3/QyjbM3OKZxSjrVi1qcEfMA1OqTFbyFXOeKKQwRRsuFTl+8pTzc9Yurry6y1ium86QabbZU+CV2q9e7V/UFf4vwJ8Bf5xZdEZHcAmxawcff0S74aH9kd7iaVzx/BKwyz/+D5Epiobb6ZxrpDeQfkRoJJNmvkVgeqS87it7qaS8xZs36PHKiVOpBhNxKcaZLHNMQ6o6dxEpALuB1wOfV9WdoceXAvNrG2ebuPcwLiHe9exLdQtCoj7mE5OVSCvTZrzVXfXHR49XplcaNmNb26vkRdgFuHnZCF/e+XzPXnNftJPsKZT6z+WGh/ZPz2nMG/S49s3RW/Xded3lQPydpU+vXqMoUom7qk4BS0SkBDwoIm9S1acARGQA+Czwu0nnEZG1wFqAkZGRVmOeVWTt/+wS4rRf7snKFBsf3l8XQ9wEaPBvSCqL9B/P0xcoz/jC/sk1V3BPBhVIncCPMc2OTcOlYsP3JXynOXrJBYnpQ4iv2MoLTZdCisidwDFV/a+13+cC3+dM6uaXgZeA1arqrHW0UshksvJ/DpKVv7a/tdqapcPOL4L/xQyPloze4JZlI9Ni14p7Y6fwc+vDoZRhnLgXvQI3XDmcuIl2Wjrx3cuKzEohRWSoNmJHRIrA24GD/uOq+rKqXqiqC1R1AbCDBGE30tEJ/2dXJUpSuWKYo8cr06Vh61YtIurZCnx55/Mm7D3KV/ceTvQk7wZTqtOVJr6wJ23Jd9f1V0Sax7X6fWnFJbTXSFO3dRGwXUSeBL4DPFbLrX9CRFZ3NrzZTSf8n10lW8teN6/pcwXz6q67AUux9C4Tk8kbfoQ7bW9AnDa7WRLeAjAuTr+WPOvvy5qlwzy+fiXPbLqWx9evzJWwQ7pqmSeBpRHHP+5o/7b2wzLAbVLUjk9FVMnWisuG+PLO51s6X7lm6zuc0mLVmFn8HHGr7024az7vnDnT6bhwfjvuNVrZys8X5ThxDtaSd+L7kmfMFbJHGRsvcyzCDCuLhRHBki3/lredEfa6+/dy01vnc+93ns9dbXo/428YUSp6eAWpe2+KXoFzvIGm68H9dBw0lv7FTULG+a+46td9UY5zYgymSmbaL73XMXHvQVyeLMFJzKzY+PD+2BFVQYT3XTWfr+497FwqX5lSHnyinPva9G4zXCrywsQkIu2vwg2uU/Dft3PPKnD85NR0lQjQkn1xVJlr0mAkrgbcNXk5XbPuEO1wDrwXFxJ1ExP3HsSVYxw8a04mH9S0pYkA77tqPqOXXMD2g0difVCiFiYZ6QluVNKOZ3zchhHHT041OB3uevallrx0/HRccMKz1cFIkig3I9q9tpCom5i49yDtTgwFxTtcVgbNjda+tOO5TFwYe50B4Bea2PAjjlLR49iJU6lXSAJ1qYOwmKU9i/8ef8RRMhi1Scn2g0davuHy0zNZDEaSRNlEu3lM3LtA0sKkdiaGwqMoP5fpr0QVlMm8LJ+cQU7TvKNgFN6A8K7FF3Hvd5qboI7zkk+6wwqnKOLuysL72raT/fHTM52o6jLaxyzsZhhffMu1L1aUlWg7DnNxZWOTlSmOm7A7ycJsqnJa2frk4aYnlv33P+rzEdfnRNVfu9YdQNWgLXj+dvE7oChma5VKr2Aj9xkmjQ9LOxNDNlrqPq10Ehseqlo6RH0+lMaNxeNWS65ZOhyZSy96BUQa97V1IQIXzy3G+v34n81Wq1SCdxFzix4ipNocw0jGxH2GSXsLmybHGJVbT2OLavQefq7f9flQzlTTpBG+T665ItJHxZWPj3xNJXaSN1gJA80PRsLnDM53RDmLGs1h4j7DtJJPj8rRA5G5dRP27lMqepw4dbqlahfX5yNYTZOWqAFCMz4yQZOsNBUtzYpw0spTl7OokQ4T9xnGdQu74rKhacvbsMd6lEXvOd5AYn16v47kfZOouNr7brJhddVCNqpiaeL4yciyUX9Jf6cX4kSd3xsQEBoWOYVfM+uKlTQpREszto6Je0qyst51Lf8PutkFb0ldOfqkUeGUKgL8QnEOJ/poIrVU9KZtXJNq77tFlIWsz9h4uWGXKa8g057inV6I4zp/J1/TRZpKIJuUbZ2mLX+zIk+Wv3H2n9D+l8K1bLsfR93tEpxIzMq+uBXmDXqRE6dp0idZe/TnlaTFWr1isdtrpLX8tZF7Clyj5w0P7a/LrbY6CeS69YwT9tm6jVswD5tm5BdFuPLEhatzLRWrKy9bTZ90ckFOnjqO8F2EVctki4l7ClziG5USaGUSqFmR8gakqdWP/Yb/fvjVH81cCX8vzjQmZ76veFjAg7v79JKQptnLttewlaedw8Q9Bc2Kb7OTQFGTXC46vbt7t0g7moYzeVhXPXcU4XRJmsnYoJthVhUinaSZvWyN/sfEPYDrltZVweCyTG12Esj/4iVt0OsL1ML1W5s6f7coegOJVgfBCdIFKf6ucOrDr+cOboac9ByAlxOEXYAVlw31nIDHYTYARhAT9xppbml94S8NeqhWVyJGrRyMyrumyYW+GiOE/g7w0PydRLc4xysAEntHcuJUcxMHN1xZL7b+dX15skKplrM9erwSuQ9nkKRrqMCW3WVGL7kgN+Jum1UYQRKrZUTkHOAbwNlUO4P7VfXOUJuPAn8AnAKOAL+vqs/GnbfXqmXiNhoI3s5HzfD7Au8SkjvG9kWmDs6eMzAtbmnSEnnc7ehzNy2Z7tRcS9j9a7z0E48mppuCFRTtbGKc1la3lcVDnSRukNDLmzob2ZHZBtnACWClqi4GlgBXi8iyUJtxYFRV3wzcD/xZswF3m7S3tC7vD18Ewl+isfGyMyccHLWmyTfnTdgHpH4fytOOgYR/je+87nK8Qrw1Y9LemsHHx8bLLN+0jYXrt7J807Y6c7bwBsgueimlkWQ61w+bOhvZkWYPVQVeqf3q1f5pqM32wK87gFuyCnCmSHtL22xec/Mjh2btBkXhgh7XNR4QYeH6rVxcKnLTW+ez/eCR2I4saW9N39Y2Kc0WzKe77hpKM7AZdFrSms6ZmBuQ0vJXRAoisgd4EXhMVXfGNP8g8LUsgusUUSO6JJtd/zkuoXblNXtp5Ndtoq4xVEsO/ZHolt3V9+KHm66t8zYJEtxb0/V40qg+jCs72UtryGzC1GiGVOKuqlOqugR4LfCrIvKmqHYicgswCmx2PL5WRHaJyK4jR460GnNbuG5tAectbfA5UURNoiZ1Bt0gKeWRNaVi/ag3nDYoROyOERTgpA437nHXe+U67qqeSaqqmUnMN91ohqY261DVCeDrwNXhx0Tk7cDHgNWqesLx/LtVdVRVR4eGhloIt32Sbm39/HAwfx7nXheV1xwbL7PuK3t7KkdeEGHzexY7R8Od4F2LL2o41kwOPimHHPd4VMcB0R0K5EM429nExZh9JObcRWQIqKjqhIgUgbcDnwq1WQr8L+BqVX2xI5FmRCu3tq7HBBoqKcbGy3zkvj09dTsPZ6wMmlkw1S7bD8bfnaWZ52h1b02XdYPreKfdGLOgF1fFGr1Lmjr3i4C/FpEC1ZH+far6VRH5BLBLVR+imoY5D/iKVEdGz6nq6k4F3Q6t1AKnfY6r5LFXuPXePRS9AW648rWJk5YumllJmnT+Tgqqq2zUdeeSF+G0CVMjLbPOFbIVh8c09cNj4+WmfU66yS3LRvjyzuc76jpZEOH7d10T26ZTRldW8230K+YK6SDOzzrNClV/84XgxJ+/92VehB1o+Q5jQBpLHF2k6Tg6NRLNy0jcMDrFrBD3qNFhOFe+fNO22IlWXxRcHUDeytGUFv3itVp1E3RUdKVqZnLyNgpLYRizmaaqZfJI0qo+n6SJ1rHxMrfdt9fZAfRSVUVa/N2aXEQ9dho496w5dRUqNy8bsSoOw+gx+n7kntYGNW7S1O8gXKPcFyYm+exNS2asCgWqNeTtbjHne5t/acdzDY/Feca/PFlhz53vqDs2eskFlgIxjB6i70fuaUsf42qIk3ZpH6jVTt9w5XDsSDgrhktF9tz5julNlVulPDHJ9oNHuGXZSN25SkWPzTe6a+Kj7lJcawQMw+gOfT9yT1vGGOWpfvacat+XlE+fUuXWe/dkEW4qyjXvlFdePZXJubbsLkdWkex69qXIUf2Ky7qzAM0wjPT0vbg3W0sd9FSfmKxw+wP7KDk2Q+4WBRE2P3Ios632JitTbHx4f0NaxbUIKWlxkmEY3afv0zLN2KBufHh/ZH5elUjDq3Y496wCyy+9wLkcPo4p1cytDY4erzRMOrteI2+VQYYxG+n7kTs0lsT5pl7hOnfX6PzlyQqfTbHpRDO8WjnNPX/4rwFSbS8XZLhU5F9efrWjC5AmK1POUsk8VgYZxmxjVoh7kCif71vv3RM7ETq36NUtYMpCVIPnOPesAsdOpquy8VNKzeT4herf4G9Bl9ZCYEqVolfoab8VwzCimXXi7qp8iRO7YydPTZcdZjVa9tMxY+NlTjaxj6ifUvI7mySitokLL+o6duJUZFmlv22glTgaRv6YdeLeSr44uBozK9531XyApiZGh0vFaWFN6+4YVdkSlaZyTTrbKk/DyCd9P6Eaptv5YqFq2vXJNVWjsrSdTTgdkmbjC4Cv7j2ceG7be9Mw+g9zhUwgqxy7AP/m0gv44U8n61IcadMryy+9YHoCNoqF67c6U0ufu2mJCbVh9AlpXSFnnbhD1Xc9anFOFMsvvYB/+v5LbTs+3rJshC27yw2pjxuuHG447mLeoMfE8UpdhU+aCp6ovHsUnbLfNQwjO8zyN4ZmFuHsf+HnFL0BjlfST3qGKYiw/eCRyBr67QePcNf1V0yLalwn4pdqlicmWfeVvSBn5gPi7i7SpH6iqojClseGYeSHvhT3pBFoM5Oq7ZpzQVV44zxugpOWyzdtS5WmaWZ1app5hrQGa4Zh5IPECVUROUdEvi0ie0Vkv4hsjGhztojcKyLfE5GdIrKgE8GmIY3FbzcmVV1SHI5l3apFmZqPpa1Lb2VvWcMwepc01TIngJWquhhYAlwtIstCbT4IHFXV1wOfJbSB9kwSNwL1WXHZ0Iy4NyYRFF5/1exH7t3DOV7rRUzzBr2Wql5cHV63q4sMw2iNxLSMVmdcX6n96tX+hQei7wY21H6+H/gfIiLahdnaNJtubNld7okt8XzXyXC+ezJFft8bkLqcO1Q7izuvu7ylNEonN6s2DGPmSZVzF5ECsBt4PfB5Vd0ZajIMPA+gqqdE5GXgNcBPMow1FUkWv0ne7DOJ7zp59pyBpmIqiHDTr87PdIMM23PUMPqLVOKuqlPAEhEpAQ+KyJtU9alAk6gsR8PgWETWAmsBRkZGWgg3magRqHBmpWav5ZAnK1NNdzZTqmzZXWb0kgsSSxybKW+01aiG0T80ldxV1Qng68DVoYd+BMwHEJE5wFzgpYjn362qo6o6OjTUmQ0f1iwdbtgRSYEtu8uMjZdzlUMuFT3nbkjheYQo0u4faxhG/5GmWmaoNmJHRIrA24GDoWYPAR+o/fweYFs38u0+2w8eabht8MVw3apFeIXOTacWW5gMnTfoRfrFi8RXzyTdhaSZXDYMoz9Jo0QXAdtF5EngO8BjqvpVEfmEiKyutfki8BoR+R7wUWB9Z8JNR2JZXwe6HaG6mvWCc89u+rl3Xnc5d11/BaVi/Z6oR49XWHf/XuYWo/dKTboLsfJGw5i9pKmWeRJYGnH844GfXwVuzDa01ombVM1ye7ogCrE2BS4P9VLRq9u/NUxlSqlMnW7JVz3t/rGGYfQffekKuW7VooY0hz+p2slRq0vYh0tFbl420hBT0SuwYfXl0zXurp2gjp2casm1Meo6WHmjYcwO+tJ+YM3SYXY9+xL37HhuWnD9SdW5Ra9lS4G0OxiFn+NXtESVLgKpXCpbqWSx8kbDmL30pbiDe1L1HG8Ab0BaSs20kswJpkCiBHr5pm2pSiHHxsstibKVNxrG7KQv0zLgnjQ8erwSXZXfAdKkQNKmiazCxTCMZug7cffz165RdkGkpW3zhkvFhmqWpPZp8uJpJzetwsUwjGboK3EPLtqJougVWtpVySsI61YtYsPqy6ueLgkE9x9NImrSMwqrcDEMoxn6StzjfGMEeMvIXOdeoy7mDXpsfs/i6dz15hsXO1eN+jSzUCi8f2mp6DUssrIKF8MwmqWvJlTjUhdJdehhXFvT+SKftBdrM2mU8KSnbXdnGEa79JW4uxbt+DSTkEkSZ19sb7tvb2Sqp500ilW4GIbRLn2Vlkmbv07D3KLH8k3bWLh+K8s3bYs021qzdJhPv3exLRQyDKPn6IuRezCNMbfoMSDVVZ2tMgAcO3lqerFT3GbRtlDIMIxeJPcj97Ct7cRkhZOnTpOiqMXJaWgol3RNklp+3DCMXiT3I/eoCplOGINBYx4+PKkaN8I3DMOYSXI/cp/JxT3hSVLzSzcMo1fJvbjP1OKeqElS80s3DKNXyWVaJpjnLg16LRuBNUPQSsB/fdcr2mpSwzC6Te7EPZznPnq8glcQit4Ak5XTdW1bseiNYrhUrBP2uMVLVgZpGEYvkGYP1fkisl1EDojIfhH5cESbuSLysIjsrbX5vc6E65hAnVJOnmqUcaUqzEl2AXEI1Il1nMVBWrMwwzCMTpMm534KuE1V/xWwDPgjEfmVUJs/Ap5W1cXA24BPi8hZmUZaw5XPdhmCvTAxmXpxU7h6UoCbl43UiXVcPj3LMkjf3TJuEZVhGIaLNHuoHgYO137+uYgcAIaBp4PNgPNFRIDzgJeodgqZ47IYKIhECnxp0JsebbvaeAPC5hsXA8mLkeIsDrIqg7QSS8Mw2kW0CQtcEVkAfAN4k6r+LHD8fOAh4DLgfOAmVd0ad67R0VHdtWtX0wFH5byLXoEbrhxmy+5y3XGvIKD1de9+2+0Hj7S08Cgp5+4yHEvL2HjZ6VfT7rkNw8g/IrJbVUeT2qWeUBWR84AtwK1BYa+xCtgDrAQuBR4TkW+G24nIWmAtwMjISNqXriNuuX94j9Kjx05wPDTJOlmZYvvBI7EiGbfq1P//rffuiXxuO2WQfscRl2IyDMNIQypxFxGPqrDfo6oPRDT5PWCTVm8Dviciz1AdxX872EhV7wbuhurIvdWgo1wTw4K84rIhvrTjucjnx4lkmpTImqXDbH7kUGR6pp0yyLjJ2nbPbRjG7CJR3Gt59C8CB1T1M45mzwG/AXxTRH4JWAT8ILMoA0SNqoEGQb7HIexwRiSjzhW36jTYoaxbtSgyPZS2DDLqteM6HSuxNAyjGRJz7iLya8A3gX1UPbUA/hQYAVDVL4jIxcBfARdRLTLZpKpfijtvKzl3V779HG+guvF1E5SKHsdOnqozCCt6hdidnJ7ZdG1DPK2Yhrn+jrPnDEw7UQYpiPDp9y62yVTDMLLLuavqt2isEgy3eQF4R/rwWsM1qo5LZbiIEtFmUyKtbqrh+jvO8QYaOpiiV7DaecMwmiZX3jLdmlDMOiXi+jsmjlfq9lO1RVGGYbRKruwHXDXmUdYDWTHcAY92199xcc3mwMTcMIx2ydXIPWqlqTd+LzmRAAAPXUlEQVQgnOqgadjj61dmLrZRf4dNmBqGkSW5GrlH1bgfP3mq6cnUIPMGvbae38qkqm3NZxhGp8mVuEPjJObC9bELYZ34vjGfXHMFSzY+GjnBWip6sedoxybA0i+GYXSSXKVlomhlYc9wqchnb1rCJ9dcAcCG1ZfjhTZd9QaEDasvjz2P7cRkGEavkntxX7dqUXydZgjfnyU4al6zdJjNNy6uq1LZfGNyXbntxGQYRq+Su7RMmDVLh50+L2HiJi1bSZPEVb0YhmF0k1yKe3gSM82kaFxJY5QvTRrXyHYtCAzDMDpF7sQ9ahLTGxC8gtRZCfgMAJ+5aYlzVB51vqDhWNwkqVW9GIbRq+RO3CO32Tut05Ut4aqXQqExIx8cqQ84NvAIEmUc5mNVL4Zh9CK5m1B1TVa+PFnh3LMb+6rKlNZVr/gj9fLEJIp7e760r2sYhtGL5E7cXZOVCs7t74LCnOSZ3uzrGoZh9CK5E/e0m13XIdXFTks2PursAOKwSVLDMPJG7sR9zdJh7rr+CuYNxq8eDaJaHdlHrUL1KYhM17jfsmzEnBkNw8g1uZtQHRsvs/Hh/W35wYQJe6aPjZfZfvBIZuc3DMOYaXIl7lE7GGVBWNhb9YsxDMPoFRLTMiIyX0S2i8gBEdkvIh92tHubiOyptfnH7ENtfTI0juGah3rca5hfjGEYeSPNyP0UcJuqPiEi5wO7ReQxVX3abyAiJeDPgatV9TkR+cVOBNuJcsTwRKn5xRiG0Q8kjtxV9bCqPlH7+efAASCcn/ht4AFVfa7W7sWsA4XsyxFLRa8h1eJ6DSuFNAwjTzRVLSMiC4ClwM7QQ28E5onI10Vkt4j8Tjbh1dOsA2QcRa8QaelruyQZhtEPpBZ3ETkP2ALcqqo/Cz08B7gSuBZYBfxnEXljxDnWisguEdl15Ejz1Shrlg7TyoZ6paKXurzRL7W0UkjDMPJMqmoZEfGoCvs9qvpARJMfAT9R1WPAMRH5BrAY+OdgI1W9G7gbYHR0tKWNT4cdNrtx7LnzHU21N78YwzDyTppqGQG+CBxQ1c84mv0d8OsiMkdEBoGrqObmM6fZ9Mi5ZzW5mtUwDKMPSJOWWQ68H1hZK3XcIyLXiMiHRORDAKp6APgH4Eng28BfqOpTnQi42RH16ZTGYIZhGP1EYlpGVb8FyfOYqroZ2JxFUEkUUtj0+kxWTnc4GsMwjN4jd94yAO+7an63QzAMw+hpcifuzfq+NGMwZhiG0S/k3ltGILY88s7rGmvZDcMw+p1cjdyjfF/ihH35pRew+ZFDLFy/leWbtjE2Xu5sgIZhGD1Crkbuzfi7DHoDPPHcy+buaBjGrCRX4n6xYwFTODVT9Aqc7Q00eL6HN7oOe8OXih4bVl9u4m8YRu7JVVrG5ftyc4S1wIRjMw9/9D82Xmbd/XvrOoCJyQrrvrLX0jeGYeSeXIl70PcFqvXuk5Uptj55mGMnTtW1TXJ33PzIISpTjRn7ymk173bDMHJPrsQdqgLvj+D9hUxHj1eYmKygnMmtr7hsKNbdMS5/b97thmHkndyJOyTvyDRZmWL7wSNOd8ex8TID4l50a97thmHknVxNqPqkGVm/MDEZ6e7o18q77Au8ATHvdsMwck8uR+5pRtauNnGj/lLRY/ONi61axjCM3JNLcY+qmgkSt3OSa9QvVH3fTdgNw+gHcpmW8QV48yOHeGFiktKghyq8PFnh4lKRdasWTefW/Tb+cVetvOXZDcPoJ0S75Hc+Ojqqu3btyvScQTEvDXq88uopKqfP/H1Fr8ANVw6zZXe5LjVT9Aq2lZ5hGLlARHar6mhSu1ymZaLwJ0rLE5Mo1fLIoLBDchWNYRhGv5DLtExUuiWpPNLHVUVjGIbRTySKu4jMB/4G+GXgNHC3qv43R9u3AjuAm1T1/iwDhaqob3hoPxOTZywD/EVLaYQdLLduGMbsIM3I/RRwm6o+ISLnA7tF5DFVfTrYSEQKwKeARzoQZ6SXu89kZSrV1nt+FU3UyN9G8oZh9BOJOXdVPayqT9R+/jlwAIhSwv8IbAFezDTCGklplynVhvJIryCUil5dbh2oy837I38zCzMMo59oKucuIguApcDO0PFh4DeBlcBbM4qtjqRVqQUR7rr+isQR+fJN2xo6ibAVsGEYRt5JLe4ich7Vkfmtqvqz0MOfA/5EVackxrNFRNYCawFGRkaaCtRVn+4zpZpqotTVSZhZmGEY/USqUkgR8agK+z2q+kBEk1Hgb0Xkh8B7gD8XkTXhRqp6t6qOquro0NBQU4EmrUoVSJVaSbICNgzD6AcSxV2qQ/EvAgdU9TNRbVR1oaouUNUFwP3Av1fVsSwD9b3c5w16kY8rpPJhd234YWZhhmH0E2nSMsuB9wP7RGRP7difAiMAqvqFDsXWgJ92WbB+a+TjaVIrYesCq5YxDKMfSRR3Vf0W1axHKlT1d9sJKA2loldX6+4ztxg9qg9ji5gMw+h3cmk/4Jqz/dmrFStpNAzDIKfi7tr8+rRiNeuGYRjkVNzjKlv8mnXDMIzZTC7FfcVlQ7GTAFazbhjGbCd3rpBj42W27C4T5yJzcalo/jGGYcxqcifuSR4zRa/AisuG6kzGfP8YwATeMIxZQe7SMnEpF98cbPvBI07/GMMwjNlA7sQ9jU2A+ccYhjHbyZ24x3nM+OkX12Im848xDGO2kDtx9z1mhh1CPVmZQgTzjzEMY1aTO3GHqsA/vn6lsxxy4njFNsE2DGNWk7tqmSAuj/eLS0XzjzEMY1aTy5G7j9n3GoZhRJPrkbvZ9xqGYUSTa3EHs+81DMOIItdpGcMwDCMaE3fDMIw+JM0eqvNFZLuIHBCR/SLy4Yg2N4vIk7V//yQiizsTrmEYhpGGNDn3U8BtqvqEiJwP7BaRx1T16UCbZ4B/p6pHReSdwN3AVR2I1zAMw0hBmj1UDwOHaz//XEQOAMPA04E2/xR4yg7gtRnH2YBZ+hqGYbhpqlpGRBYAS4GdMc0+CHzN8fy1wFqAkZGRZl66jrHxsln6GoZhxJB6QlVEzgO2ALeq6s8cbVZQFfc/iXpcVe9W1VFVHR0aGmolXiDa090sfQ3DMM6QauQuIh5VYb9HVR9wtHkz8BfAO1X1p9mF2IhZ+hqGYcSTplpGgC8CB1T1M442I8ADwPtV9Z+zDbERl3WvWfoahmFUSZOWWQ68H1gpIntq/64RkQ+JyIdqbT4OvAb489rjuzoVMJinjGEYRhJpqmW+BU53Xb/NHwB/kFVQSZinjGEYRjy59ZYxTxnDMAw3Zj9gGIbRh5i4G4Zh9CG5TMvY6lTDMIx4cifud4zt454dz6G13211qmEYRiO5SsuMjZfrhN3HVqcahmHUkytx3/zIoQZh97HVqYZhGGfIlbjHCbitTjUMwzhDrsTdJeACtjrVMAwjQK7EPcp2QICbl43YZKphGEaAXFXLmO2AYRhGOnIl7mC2A4ZhGGnIVVrGMAzDSIeJu2EYRh9i4m4YhtGHmLgbhmH0ISbuhmEYfYiJu2EYRh9i4m4YhtGHiKrLiqvDLyxyBHg2g1NdCPwkg/N0gl6NrVfjgt6NrVfjgt6NrVfjgt6NLU1cl6jqUNKJuibuWSEiu1R1tNtxRNGrsfVqXNC7sfVqXNC7sfVqXNC7sWUZl6VlDMMw+hATd8MwjD6kH8T97m4HEEOvxtarcUHvxtarcUHvxtarcUHvxpZZXLnPuRuGYRiN9MPI3TAMwwiRa3EXkatF5JCIfE9E1ncxjvkisl1EDojIfhH5cO34BhEpi8ie2r9ruhTfD0VkXy2GXbVjF4jIYyLy3dr/581wTIsC12WPiPxMRG7t1jUTkb8UkRdF5KnAschrJFX+e+1z96SIvGWG49osIgdrr/2giJRqxxeIyGTg2n2hU3HFxOZ8/0Tk9to1OyQiq2Y4rnsDMf1QRPbUjs/0NXNpRfafNVXN5T+gAHwfeB1wFrAX+JUuxXIR8Jbaz+cD/wz8CrAB+OMeuFY/BC4MHfszYH3t5/XAp7r8Xv4LcEm3rhnwb4G3AE8lXSPgGuBrVDcCWwbsnOG43gHMqf38qUBcC4LtunTNIt+/2vdhL3A2sLD23S3MVFyhxz8NfLxL18ylFZl/1vI8cv9V4Huq+gNVPQn8LfDubgSiqodV9Ynazz8HDgC9vqPIu4G/rv3818CaLsbyG8D3VTWLRW0toarfAF4KHXZdo3cDf6NVdgAlEblopuJS1UdV9VTt1x3Aazvx2kk4rpmLdwN/q6onVPUZ4HtUv8MzGpeICPBe4MudeO0kYrQi889ansV9GHg+8PuP6AFBFZEFwFJgZ+3Qf6jdTv3lTKc+AijwqIjsFpG1tWO/pKqHofqBA36xS7EB/Bb1X7ZeuGbgvka99Nn7faojO5+FIjIuIv8oIr/epZii3r9euWa/DvxYVb8bONaVaxbSisw/a3kWd4k41tXSHxE5D9gC3KqqPwP+J3ApsAQ4TPV2sBssV9W3AO8E/khE/m2X4mhARM4CVgNfqR3qlWsWR0989kTkY8Ap4J7aocPAiKouBT4K/F8R+YUZDsv1/vXENQPeR/1AoivXLEIrnE0jjqW6bnkW9x8B8wO/vxZ4oUuxICIe1TfrHlV9AEBVf6yqU6p6GvjfdOg2NAlVfaH2/xeBB2tx/Ni/vav9/8VuxEa1w3lCVX9ci7EnrlkN1zXq+mdPRD4AvAu4WWvJ2VrK46e1n3dTzWu/cSbjinn/euGazQGuB+71j3XjmkVpBR34rOVZ3L8DvEFEFtZGf78FPNSNQGp5vC8CB1T1M4HjwdzYbwJPhZ87A7GdKyLn+z9TnYx7iuq1+kCt2QeAv5vp2GrUjaR64ZoFcF2jh4DfqVUyLANe9m+pZwIRuRr4E2C1qh4PHB8SkULt59cBbwB+MFNx1V7X9f49BPyWiJwtIgtrsX17JmMD3g4cVNUf+Qdm+pq5tIJOfNZmapa4QzPP11Cdbf4+8LEuxvFrVG+VngT21P5dA/wfYF/t+EPARV2I7XVUqxT2Avv96wS8Bvh/wHdr/7+gC7ENAj8F5gaOdeWaUe1gDgMVqqOlD7quEdVb5c/XPnf7gNEZjut7VPOw/mftC7W2N9Te473AE8B1XbhmzvcP+Fjtmh0C3jmTcdWO/xXwoVDbmb5mLq3I/LNmK1QNwzD6kDynZQzDMAwHJu6GYRh9iIm7YRhGH2LibhiG0YeYuBuGYfQhJu6GYRh9iIm7YRhGH2LibhiG0Yf8f8ItCDLDbRs/AAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -220,7 +149,11 @@ } ], "source": [ - "plt.scatter(s1, np.log10(s2))\n", + "# apply a detector cut and plot it\n", + "cut_mask = np.logical_and(s2>0, s1>0)\n", + "plt.scatter(s1[cut_mask], np.log10(s2[cut_mask]))\n", + "plt.xlabel('s1 [phd]')\n", + "plt.ylabel('log10(s2 [phd])')\n", "plt.show()" ] }, @@ -233,25 +166,14 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# NEST WIMP spectrum comes from: \n", "# Phys. Rev. D 82 (2010) 023530 (McCabe)\n", "\n", - "Er = np.linspace(0.01, 10, 400)\n", + "Er = np.linspace(0.01, 3, 400)\n", "\n", "spec = nestpy.TestSpectra()\n", "WIMP_dRate_vec = np.vectorize(spec.WIMP_dRate)\n", @@ -263,7 +185,7 @@ "\n", "plt.plot(Er, dR_3GeV, label='3 GeV')\n", "plt.plot(Er, dR_6GeV, label='6 GeV')\n", - "plt.plot(Er, dR_10GeV, label='10 GeV')\n", + "# plt.plot(Er, dR_10GeV, label='10 GeV')\n", "plt.legend()\n", "plt.yscale('log')\n", "plt.title('$\\sigma=10^{-36}$ cm$^2$')\n",