OfflineMuon_24

Overview

The OfflineMuon filter (previously known as the MuonL3) is an offline filter designed to select high-quality track-like events induced by muons passing through the detector volume. These will include both muons created in cosmic ray interactions in the atmosphere, as well as muons generated by charged-current muon-neutrino interatctions in the ice and surrounding rock. This filter targets an ~1Hz rate, which can then be used to build more stringent event selections that target specifically astrophysical neutrinos.

Technical Documentation

Input Triggers and Filters

The OfflineMuon filter runs on the outputs of the MuonFilter_23, HighQFilter_23, and OnlineL2_23 online filters. MuonFilter_23 runs on all events that pass the SMT8 hardware trigger, but only sends events north for events that also pass the SoftwareSMT12Filt_23 filter. To recover potential low-energy events that could be eliminated by the SMT12 filter, we also use events that pass the OnlineL2_23 filter, which must pass MuonFilter_23 plus some additional cuts, but do not need to pass SoftwareSMT12Filt_23. We also consider all events that pass HighQFilter_23 and SoftwareSMT12Filt_23, in order to retain any extremely high-energy events.

Input Streams

The OfflineMuon filter creates it’s own IceHive stream.

Tray Segment Inputs

The OfflineMuon_24 tray segment takes no inputs besides the name of the segment.

Running the Segment

The MuonOfflineFilter segment can be added to a standard I3Tray without any additional options. It will create everything needed for filtering as long as the frames pass the online MuonFilter_23, OnlineL2Filter_23, or online HighQFilter_23 filters.

Filter Tray Segment Overview

The OfflineMu_24 tray segment is made of the following sub-segments:

  • SplitAndRecoIceHive:
    • This subsegment runs the IceHive splitting algorithm on the remaining events, resplitting them into a new sub_event_stream, OfflineMu24IceHive

    • Only events passing the online MuonFilter_23, OnlineL2Filter_23, or HighQFilter_23 filters are split and processed.

    • Once this split stream is created, the newly split frames are tested to see whether they’re likely to be erroneously split. * If needed, candidate streams are recombined

    • Next, event splits with less than 1 HLC hit are also discarded

    • On all remaining events, two pulse series are created:
      • SRTHVInIcePulses, which applies I3SeededRTCleaning_RecoPulseMask_Module to the individual pulse series output by IceHive

      • TWSRTHVInIcePulses, which additionally applies StaticDOMTimeWindowCleaning

    • Next, any events where SRTHVInIcePulses has less than 6 hit DOMs are also discarded

    • LineFit, SPEFitSingle, SPEFit2, and MPEFit track reconstructions are then run on each of these two pulse series for the remaining events

  • GetBestTrack:
    • The first track to return an OK fit_status, in the following order: MPEFit, SPEFit2, SPEFitSingle, LineFit

    • If no track returns an OK fit_status, LineFit is used, but subsequent variables are set to 0 to ensure event fails cuts

  • CalcChargeCuts:
    • Calculate qtot with and without DeepCore and calculate AvgDistQ without DeepCore.

    • Outputs three variables to the frame:
      • AvgDistQ: The average charge-weighted distance from the best track to the non-DeepCore hits.

      • Qtot: The total charge across all pulses, excluding hits on the DeepCore strings

      • QtotWithDC: The total charge across all pulses including hits on the DeepCore strings

  • CalculateCutValues:
    • This subsegment computes the CommonVariables values necessary for performing the cuts using the SRTHVInIcePulses pulse series:
      • OfflineMu_24__HitMultiplicityValues: Used to calculate nchannel for the hit series

      • OfflineMu_24__BestTrackDirectHits: Find “direct pulses” (ie, within [-15, +250] ns of the geometric travel time from particle to DOM.

      • HitMultiplicityValues and HitStatisticsValues for the chosen pulse series

      • OfflineMu_24__HitStatisticsValues: Seemingly unused

      • OfflineMu_24__BestTrackCharacteristics: Seemingly unused

  • DoCuts:
    • This subsegment checks the variables to determine whether the event passes the filter or not.

    • Here we define “Northern sky” as zenith < 85 degrees.

    • We define a “charge cut”:
      • The event passes the charge cut if BestTrack_AvgDistQ < 90 PE*m or SRTHVInIcePulses_Qtot > 100 PE

    • We also define a “quality cut”
      • Variable definitions:
        • NDir: the number of direct hit DOMs from BestTrackDirectHitsE

        • LDir: the direct track length from BestTrackDirectHitsE

        • Rlogl: the rlogl value of the BestTrack, unless BestTrack was LineFit, in which case Rlogl=1000

        • Nch: the number of hit DOMs from HitMultiplicityValues

        • SRTHVInIcePulses_Qtot and SRTHVInIcePulses_QtotWithDC

        • Plogl: Rlogl*(Nch-5)/(Nch-3) if Nch > 5, else 1000

        • DirectEllipse: (LDir/180)**2+(NDir//10)**2

      • Events where one of the following is true have passed the quality cut:
        • DirectEllipse > 2 and NDir > 6

        • Plogl < 7.5

        • Rlogl < 9.0

    • For Southern sky events, we define a “zenith vs total charge” cut as well:
      • Event must have SRTHVInIcePulses_QtotWithDC > 0

      • If zenith <= 60 degrees, event passes if log10(SRTHVInIcePulses_QtotWithDC) >= (0.6*(cos(zenith)-0.5)+2.6)

      • If zenith > 60 degrees and zenith <= 78.5 degrees, event passes if log10(SRTHVInIcePulses_QtotWithDC) >= (3.9*(cos(zenith)-0.5)+2.6)

      • If zenith > 78.5 and zenith < 85 degrees, apply no additional constraints

    • Additionally, for Southern sky events with less than 10000 PE, we add a second “zenith vs total non-DeepCore charge” cut:
      • log10(SRTHVInIcePulses_Qtot) >= 0.155847026166 + 13.9060109867 * cos(Zenith) - 28.1169390193 * cos(zenith)**2 + 26.4767509931 * cos(Zenith)**3 - 9.34974616578 * cos(Zenith)**4

    • There are four ways to pass the cuts:
      • If charge is greater than 1000 PE
        • Northern sky: the event passes

        • Southern sky: must pass a 2d zenith vs total charge cut

      • Otherwise:
        • Northern sky: must pass charge and quality cuts

        • Southern sky: must pass charge, quality, 2d cuts in (zenith vs total charge) and in (zenith vs total non-DeepCore charge)

    • The outcome of these cuts is stored in the frame as an I3Boolean named “OfflineMu_24”

Reconstruction Tray Segment Overview

A second tray segment is available for running more advanced reconstructions once the filter decision is made. This can be accessed as MuonTraySegment.OfflineMuonReconstructions. The OfflineMuonReconstructions segment is a wrapper around two sub-segments and one Delete module.

  • DoReconstructions:
    • This sub-segment performs the following reconstructions using the TWSRTHVInIcePulses pulse series on all events that pass the offline muon filter:
      • muex, with the following settings:
        • Pulses = “TWSRTHVInIcePulses”

        • rectrk = “”

        • result = “MuEXAngular4”

        • lcspan = 0

        • repeat = 4

        • usempe = True

        • detail = False

        • energy = False

        • icedir = os.path.expandvars(“$I3_BUILD/mue/resources/ice/sp3”)

      • Paraboloid, using I3ParaboloidFitter, with the following settings:
        • SeedService and GridpointVertexCorrection given by I3BasicSeedServiceFactory, with the following settings:
          • InputReadout = “TWSRTHVInIcePulses”

          • FirstGuesses = [“BestTrack”]

          • TimeShiftType = “TFirst”

          • NChEnergyGuessPolynomial=[0.9789139, 1.173308, 0.3895591]

        • LogLikelihood given by I3RecoLLHFactory, with the following settings:
          • InputReadout = “TWSRTHVInIcePulses”

          • EventType = “InfiniteMuon”

          • Likelihood = “MPE”

          • PEProb = “GaussianConvolutedFastApproximation”

          • JitterTime = 4.0*I3Units.ns

          • NoiseProbability = 10*I3Units.hertz

        • Minimizer given by I3GulliverMinuitFactory, with the following settings (referred to hereafter as “Minuit”):
          • Algorithm = “SIMPLEX”

          • MaxIterations = 1000

          • Tolerance = 0.01

        • MaxMissingGridPoints = 1

        • VertexStepSize = 5.0*I3Units.m

        • ZenithReach = 2.0*I3Units.degree

        • AzimuthReach = 2.0*I3Units.degree

        • NumberOfSamplingPoints = 8

        • NumberOfSteps = 3

        • MCTruthName = “”

        • OutputName = “MPEFitParabaloid”

      • SplineMPE, using I3SimpleFitter, with the following settings:
        • SeedService given by I3BasicSeedServiceFactory, with the following settings:
          • FirstGuesses = [“MuEXAngular4”]

          • Parametrization given by I3SimpleParametrizationFactory, with the following settings (referred to hereafter as “SimpleTrack”):
            • StepX = 20*I3Units.m

            • StepY = 20*I3Units.m

            • StepZ = 20*I3Units.m

            • StepZenith = 0.1*I3Units.radian

            • StepAzimuth= 0.2*I3Units.radian

            • BoundsX = [-2000*I3Units.m, 2000*I3Units.m]

            • BoundsY = [-2000*I3Units.m, 2000*I3Units.m]

            • BoundsZ = [-2000*I3Units.m, 2000*I3Units.m]

          • LogLikelihood given by I3SplineRecoLikelihoodFactory, with the following settings:
            • SphotonicsService = photonics_service.I3PhotoSplineService(infmuonampsplinepath, infmuonprobsplinepath, timingSigma=4)

            • Pulses = “TWSRTHVInIcePulses”

            • Likelihood = “MPE”

            • NoiseRate = 10*I3Units.hertz

          • Minimizer = “Minuit”

          • OutputName = “SplineMPE”

      • muex again, with the following settings:
        • Pulses = “TWSRTHVInIcePulses”

        • rectrk = “SplineMPE”

        • result = “SplineMPEMuEXDifferential”

        • detail = True

        • energy = True

        • lcspan = 0

        • icedir = os.path.expandvars(“$I3_BUILD/mue/resources/ice/mie”)

      • TruncatedEnergy, using I3TruncatedEnergy, with the following settings:
        • RecoPulsesName = “TWSRTHVInIcePulses”

        • RecoParticleName = “SplineMPE”

        • ResultParticleName = “SplineMPETruncatedEnergy_SPICEMie”

        • I3PhotonicsServiceName given by I3PhotonicsServiceFactory, with the following settings:
          • PhotonicsTopLevelDirectory = photonicsdir

          • DriverFileDirector = photonicsdriverdir

          • PhotonicsLevel2Directory = photonicsdriverfile

          • PhotonicsTableSelection = 2

          • ServiceName = “PhotonicsServiceMu_SpiceMie”

        • UseRDE = True

      • MuMillipede, unfolds losses along the SplineMPE direction, but using the FTP cascade model with the following settings:
        • MuonPhotonicsService = None

        • CascadePhotonicsService = photonics_service.I3PhotoSplineService(cascadeampsplinepath, cascadeprobsplinepath, cascadeeffdsplinepath, cascadeeffdprobsplinepath, cascadeeffdtmodsplinepath, tiltdir, timingSigma=0, quantileEpsilon=1.)
          • Additionally, efficiency is set based on spice_ftp-v1/cfg.txt with photonics_service.I3PhotoSplineService.SetEfficiencies(1.014)

        • PhotonsPerBin = 15

        • MuonSpacing = 0

        • ShowerSpacing = 10

        • ShowerRegularization = 1e-9

        • MuonRegularization = 0

        • SeedTrack = “SplineMPE”

        • Output = “SplineMPE_MillipedeHighEnergy”

        • ReadoutWindow = “MillipedeHVSplitPulsesReadoutWindow”

        • ExcludedDOMs given by millipede.HighEnergyExclusions, with the following settings:
          • ExcludeDeepCore = “DeepCoreDOMs”

          • ExcludeSaturatedDOMs = False

          • ExcludeBrightDOMS = “BrightDOMs”

          • BrightDOMThreshold = 10

          • SaturationWindows = “SaturationWindows”

          • BadDomsList = “BadDomsList”

          • CalibrationErrata = “CallibrationErrata”

          • “MullipedeHVSplitPulsesExcludedTimeRange” also appended

        • Pulses = “MillipedeHVSplitPulses”

    • The following additional reconstructions are run on all events with either the BestTrack or SplineMPE zenith angle is > 78.5 degrees (called upgoing events):
      • BayesianFit, using I3IterativeFitter, with the following settings:
        • RandomService = “SOBOL”

        • NIterations = 2

        • SeedService given by I3BasicSeedFactory, with the following settings:
          • InitialReadout = “TWSRTHVInIcePulses”

          • FirstGuesses = [“BestTrack”]

          • TimeShiftType = “TFirst”

        • Parametrization = “SimpleTrack”

        • LogLikelihood given by I3EventLogLikelihoodCombinerFactory, with the following settings:
          • InputLogLikelihoods = [“BayesSPEPandel2”, “ZenithWeight”]

          • Multiplicity = “Max”

          • RealtiveWeights = []

          • BayesSPEPandel2 is given by I3RecoLLHFactory, with the following settings:
            • InputReadout = “TWSRTHVInIcePulses”

            • Likelihood = “SPE1st”

            • PEProb = “GaussConvoluted”

            • NoiseProbability = 10*I3Units.hertz

            • JitterTime = 15.0*I3Units.ns

          • ZenithWeight is given by I3PowExpZenithWeightServiceFactory, with the following settings:
            • Amplitude = 2.49655e-07

            • CosZenithRange = [-1, 1]

            • DefaultWeight = 1.383896526736738e-87

            • ExponentFactor = 0.778393

            • FlipTrack = False

            • PenaltySlope = -1000

            • PenaltyValue = -200

            • Power = 1.67721

        • CosZenithRange = [0, 1]

        • Minimizer = Minuit

        • OutputName = SPEFit2Bayesian

      • SplitFits, which works by the following procedure:
        • Create a geo split using I3ResponseMapSplitter, with the following settings:
          • InputPulseMap = “TWSRTHVInIcePulses”

          • InputTrackName = “BestTrack”

          • MinimumNch = 2

          • DoTRes = False

          • MinTRes = 0.0

          • MaxTRes = 1000.0

          • DoBrightSt = False

          • MaxDBrightSt = 150.0

        • For this split, do two iterations of the following:
          • Perform I3TimeWindowCleaning<I3RecoPulse> to clean the split with the following settings:
            • TimeWindow = 6000*I3Units.ns

          • Run linefit.simple on the resulting pulse series with the following settings:
            • fitName = “LineFit”

          • Run I3SinglePandelFitter with the following settings:
            • fitname = “SPEFitSingle”

            • domllh = “SPE1st”

            • seeds = [“LineFit”]

          • Run I3IterativePandelFitter with the following settings:
            • fitname = “SPEFit2”

            • seeds = [SPEFitSingle]

            • n_iterations = 2

    • Finally, for all upgoing events, calculate the IceTop veto variables, if applicable, by performing the following:
      • Use I3ShieldDataCollector to compute ShieldHLC and ShieldSLC values for “SplineMPE” track
        • InputRecoPulses use OfflineIceTopHLCVEMPulses and OfflineIceTopSLCVEMPulses, respectively for ShieldHLC and ShieldSLC

      • Determine veto hits for HLC and SLC as the number of ShieldHLC or ShieldSLC pulses that fall between tmin and tmax

      • Compute the veto hits the following choices of tmin, tmax for “SplineMPE”:
        • On time hits: tmin = -50, tmax = 500

        • Off time hits: tmin = -1550, tmax = -1000

  • CharacterizeHits:
    • This is a relatively simple segment that just runs some CommonVariables values that are useful for the analyzers.

    • We create a non-DeepCore hit series, OfflineMu_24__TWSRTHVInIcePulsesIC

    • We then calculate the HitStatistics (OfflineMu_24__HitStatisticsValuesIC) and HitMultiplicity (OfflineMu_24__HitMultiplicityValuesIC)

    • Using the SplineMPE reconstruction, we calculate the TrackCharacteristics (OfflineMu_24__SplineMPECharacteristicsIC), a collection of measures of consistency between the track and hits

    • We also add a DirectHits calculation (OfflineMu_24__SplineMPEDirectHitsIC) to look for direct hits
      • We use two definitions of “direct hits” here:
        • “D”: Pulses within [-15, +125] ns of the direct geometric light-travel time from track to DOM

        • “E”: Pulses within [-15, +250] ns of the direct geometric light-travel time from track to DOM