NuGen III K.Hoshina May. 10 2013 IceCube spring collaboration meeting in Madison History of neutrino simulation • • • NUSIM (Gary) • Gary’s fast neutrino simulation for AMANDA ANIS (Marek) • • Next generation of AMANDA neutrino simulation Cross section tables, final interaction tables are provided (used in NuGen too) NeutrinoGenerator (Aya) • originally it was I3 version of ANIS, but renamed when Aya implemented neutrino re-generation in NuTau CC channel Now NuGen is the third generation ! • • • Before release V00-06-01 ( NuGen 1) • • Used up to IC40 standard production Contains bugs in weight calculation From V00-06-01 to now ( NuGen II) • • • Weight bug fixed, added weighted calculation for propagation inside the Earth Code maintainer is changed from Aya to Kotoyo Will be included in the first release of IceSim V4 Coming soon ! (NuGen III) Older versions are still available with new IceSim, and will be maintained as long as I’m the maintainer... Why NuGen III ? I want to use Genie at detector! I want to compare effect of In-Earth propagation with various EarthModel or neutrino cross section, while keeping neardetector simulation unchanged! Well... yes, I can implement them, but future NuGen maintainers will cry... :( (NuGen is complicated enough already!) I want to use CORSIKA as neutrino source and want to simulate muon - neutrino coincidence events! I need only neardetector simulation because I use my own (oscillation) calculation for in Earth propagation ! How structures of code is changed? v3 internal classes are in namespace “nugen” (some of them are renamed from v2) v1, v2 classes are in “legacy” directory Source modules put one primary neutrino into frame with the name of “NuGPrimary” NuGen III consist of three modules Source module put a primary neutrino Propagator module propagates the neutrino up to detection volume VTXGenerator module makes secondaries within detection volume You may skip Propagator if you want NuGen Sources • Three modules exist now and easy to add more • • • I3NuGDiffuseSource I3NuGPointSource I3NuGSourceSelector • • • selects a neutrino from I3MCTree (use Nathan’s Corsika-reader) Currently select a neutrino randomly from all candidate Stores “NuGPrimary” and generation weight as Added new option for Injection area • • • Current setting of Injection Radius : 1200m for straight downgoing (upgoing) tracks, more than 80% of injection area is outside of the detector Some tracks are even out of range of photonics table (radius 680m) NUSIM style injection area • • Define cylindrical detector area outside of IceCube Inject neutrinos which pass through the detector area the injection area varies with injection zenith angle Injection area (r14 in Nusim) is recorded in MCWeightDict OneWeight will compensate the effect • • • Propagation inside the Earth • I3NuGPropagator • • • • Take a primary neutrino “NuGPrimary” from frame Propagate it up to near by the detector Store one final-candidate neutrino in frame as “NuGInIceNeutrino” and add propagation weight to I3MCWeightDict Will support table output in near future (Similar as JULIeT table but contains only neutrinos) Vertex Generator Module • • • Take a particle “NuGInIceNeutrino”(if the neutrino does not exist take NuGPrimary instead) and calculate detection volume Then make interaction vertex inside the detection volume Three interaction modes will be available • • • using NuGen’s final interaction tables using Genie’s cross sections and vertex generator Hybrid (use Genie for low energy, NuGen for high energy) Coding is not finished yet, but first integration of Genie to NuGen is done! Genie Integration to NuGen Good bye genie::GMCJDriver ! • • GMCJDriver is a large program • Not easy to understand, IceCube-type experiment is not supposed by developers, thus may contain problematic change in any update All we need is 1. Cross Section and 2. Functions to make Final State Particles Such core codes will be relatively stable, then we don’t have to worry about version dependence of Genie too much (hopefully). Step 1 : Genie Stand-alone test • Make an stand-alone genie program that follows exactly same procedure as NuGen 1. Define detection cylinder volume, and inject a neutrino from the forward cap of the cylinder 2. Calculate total cross section for the injected neutrino and volume material 3. Calculate survival probability Psurv then get interaction probability Pint = 1.0 - Psurv 4. Select a vertex randomly, and calculate position weight 5. Make a vertex and generate secondaries • Then compare it to standard Genie! 100000 events simulation results (no weight applied) Blue : GMCJDriver with weight opt (ice) Green : GMCJDriver default (ice) Red : Genie-NuG driver (ice) Violet : Genie-NuG driver (ice + rock)Low statistics at Low E 100000 events simulation results (no weight applied) • Secondary = secondary lepton (Muon for CC, Neutrino for NC) 100000 events simulation results (weighted) 100000 events simulation results (weighted) Step 2 : I3NuGGenie (interaction module) 1. Port stand-alone Genie-NuG program to nugen as an interaction module (I3NuGGenie) • • with correct geometry (Ice + Rock) PrimarySource : I3NuGDiffuseSource • • Energy range : 1GeV ~ 200GeV Zenith range : 0deg ~ 180deg 2. Compare the result with current NuGen II simulation (with InjectOnCylinder option) Comparison : NuGen and NuGGenie Step 3 : Make a unified module • Thinking about Hybrid option, a unified VertexGenerator will be easier to manage • Core functions like genie::GetXsec (get cross section) and genie::GenerateEvent (making secondary particles) could be implemented as a service in genie-icetray project But for now, we may use I3NuGGenie (with Ice + Bedrock) as a substitute of genie-icetray, especially for HE muon background study Plan towards next release • • • • • Send request to genie-icetray maintainer (Ken? Claudio?) to move following headers to public directory • • ConvertToGST.h ConvertPDGEncodingToI3ParticleType.h If LowEnergy group want to use or check I3NuGGenie very soon, make new release as NuGen 2.5 after cleaning source codes Add table writer for propagator Add unified vertex generator Then release NuGen 3 ! Backup Benchmark mode • New event class dedicated for generating benchmark dataset • • • may be useful to get muon / cascade effective area skips InEarth propagation, interaction weight is always 1.0 currently three options are supported 1. generate charged lepton at front edge of the detector area, with primary’s energy and direction 2. generate charged lepton inside the detector area, with primary’s energy and direction 3. generate charged leptons (and hadron cascades) inside the detector area with standard process (energy of secondary particles are smaller than Benchmark Mode gevgen_simpledriver RandomGen * rnd = RandomGen::Instance(); while (ievent < gOptNevents) { // 1. get neutrino energy, direction and position Particle injected_nu = InjectANeutrino(particles, rnd); // 2. calculate total column depth, surviving probability etc. and fill stepping info CalcSteppingInfo(injected_nu, gevg_drivers, matratiomap, stepmap) // 3. find interaction position in uniform distribution double cdep = total_cdep * rnd->RndGen().Rndm(); // 4. select target material at the column depth and get proper GEVGDriver SteppingMap::iterator iter1= stepmap.lower_bound(cdep); StepInfo theStep = iter1->second; // choose a target! double total_nsigma = theStep.fTotalNsigma_; double nsigma = total_nsigma * rnd>RndGen().Rndm(); map<double, GEVGDriver*>::iterator iter2 = theStep.fDriverMap_.lower_bound(random2 * nsigma); GEVGDriver * driver = iter2->second; // 5. Generate an event! TLorentzVector nup4 = injected_nu.GetMomentum(); EventRecord * event = driver->GenerateEvent(nup4); gevgen_i3 • Basically same as gevgen (with GMCJDriver) : • • • • Primary flux is always E-1 Interaction vertex is uniformly distributed in detection volume (no position weight) Should perform exactly same as genie-icetray Weighted option is available (Word “Weight” used in Genie is a little different from what we usually use : it’s the interaction weight but doesn’t mean 1 - Psurv.) Weight difference • • IntWeight : 1 - exp (- n*X*sigma) IntWeight_lowE : n*X*sigma IceOnly IceRock Vertex positions (weighted)