Esempio n. 1
0
    def create(self, frame, group):
        mcTree = frame[list(self.keys())[1]]
        referenceTrack = dataclasses.get_most_energetic_muon(mcTree)
        if referenceTrack is None:
            referenceTrack = dataclasses.get_most_energetic_cascade(mcTree)
        elif mcTree.depth(referenceTrack) > 1:
            referenceTrack = dataclasses.get_most_energetic_cascade(mcTree)
        else:
            # change the shape for tracks so that
            # phys_services.I3Calculator.time_residual
            # does not become confused
            referenceTrack.shape = dataclasses.I3Particle.InfiniteTrack

        photonSeriesMap = frame[list(self.keys())[0]]

        for key, photonSeries in photonSeriesMap:
            for photon in photonSeries:
                self.add_one_photon(photon, referenceTrack, group)
Esempio n. 2
0
def handle_I3MCTree(mctree):
    # Interaction
    beam_particle = get_most_energetic_primary2(mctree)
    if beam_particle:
        if beam_particle.is_neutrino:
            ptypes = [p.type for p in mctree.primaries]
            if len(ptypes) == 2:
                interaction = "{} + {}".format(*ptypes)
            elif len(ptypes) == 1:
                interaction = "{}".format(ptypes[0])
            else:
                interaction = "{} primaries, wtf!?".format(len(ptypes))
            daughters = mctree.get_daughters(beam_particle)
            if daughters:
                interaction += " -> "
                dtypes = [str(d.type) for d in daughters]
            interaction += " + ".join(dtypes)
        elif beam_particle.type == I3Particle.Gamma:
            interaction = "Gamma event"
        else:
            interaction = "Cosmic ray event"
        out = 'Interaction:\n  {0:s}\n'.format(interaction)
    else:
        out = 'No beam particle\n'

    # Primaries
    for p in mctree.primaries:
        out += ('Primary\n'+\
                '  Type  : {0!s}\n'+\
                '  Energy: {1:.2e}GeV\n').format(p.type, p.energy)
    # Muons
    p = get_most_energetic_muon(mctree)
    if p:
        out += ('Muon\n'+\
                '  Type  : {0!s}\n'+\
                '  Energy: {1:.2e}GeV\n').format(p.type, p.energy)
    # Cascades
    p = get_most_energetic_cascade(mctree)
    if p:
        out += ('Cascade\n'+\
                '  Type  : {0!s}\n'+\
                '  Energy: {1:.2e}GeV\n').format(p.type, p.energy)
    return out
Esempio n. 3
0
    def DAQ(self, frame):

        if self.frame_key not in frame:
            return

        mctree = frame[self.frame_key]

        try:
            mem = mctree.most_energetic_muon
        except AttributeError:
            from icecube.dataclasses import get_most_energetic_muon
            mem = get_most_energetic_muon(mctree)

        if mem and mem.energy > 0:
            self.histograms["LogMostEnergeticMuon"].fill(
                log10(mem.energy / I3Units.GeV))

        for p in mctree:
            if p.is_cascade and p.energy > 0:
                self.histograms["CascadeEnergy"].fill(log10(p.energy))

            if (p.type == dataclasses.I3Particle.MuMinus
                    or p.type == dataclasses.I3Particle.MuPlus):
                self.histograms["NMu"].fill(1)
                self.histograms["MuonLength"].fill(p.length / I3Units.m)

            if (p.type == dataclasses.I3Particle.TauMinus
                    or p.type == dataclasses.I3Particle.TauPlus):
                self.histograms["TauLength"].fill(p.length / I3Units.m)

            if mctree.depth(p) > 0:
                self.histograms["SecondaryZenith"].fill(p.dir.zenith /
                                                        I3Units.degree)
                self.histograms["SecondaryCosZenith"].fill(cos(p.dir.zenith))
                if p.energy > 0:
                    self.histograms["SecondaryEnergy"].fill(
                        log10(p.energy / I3Units.MeV))
                int_type = type_to_int_dict[p.type] \
                           if p.type in type_to_int_dict else 29
                self.histograms["SecondaryType"].fill(int_type)
Esempio n. 4
0
def Primary(frame, FitName, GenieOrCorsika="Genie"):
    if frame.Has(FitName):
        fit = copy.deepcopy(frame[FitName])
        if not fit.fit_status == dataclasses.I3Particle.OK:
            print "Bad Primary Seed"
            return False

        if frame.Has("I3MCTree"):
            if GenieOrCorsika == "Genie":
                prim = dataclasses.get_most_energetic_neutrino(
                    frame['I3MCTree'])
            elif GenieOrCorsika == "Corsika":
                prim = dataclasses.get_most_energetic_muon(frame['I3MCTree'])
            else:
                print "Specify if neutrino or muons"
                return False
            fit.pos = prim.pos
            fit.dir = prim.dir
            fit.time = prim.time
            frame['Primary'] = fit
            return True

    print "No Primary"
    return False
from icecube.dataclasses import get_most_energetic_nucleus

primary = dc.I3Particle()
primary.energy = 10 * I3Units.TeV
tree = dc.I3MCTree()
tree.add_primary(primary)


mep = get_most_energetic_primary(tree)
I3Test.ENSURE(mep.id == primary.id, "got the wrong particle.")

I3Test.ENSURE(not get_most_energetic_cascade(tree), "got a particle, but shouldn't.")
I3Test.ENSURE(not get_most_energetic_inice(tree), "got a particle, but shouldn't.")
I3Test.ENSURE(not get_most_energetic_track(tree), "got a particle, but shouldn't.")
I3Test.ENSURE(not get_most_energetic_neutrino(tree), "got a particle, but shouldn't.")
I3Test.ENSURE(not get_most_energetic_muon(tree), "got a particle, but shouldn't.")
I3Test.ENSURE(not get_most_energetic_nucleus(tree), "got a particle, but shouldn't.")


primary2 = dc.I3Particle()
primary2.energy = 9 * I3Units.TeV

cascade = dc.I3Particle()
cascade.type = dc.I3Particle.EMinus

inice = dc.I3Particle()
inice.location_type = dc.I3Particle.InIce

track = dc.I3Particle()
track.energy = 10 * I3Units.TeV
track.type = dc.I3Particle.TauMinus
Esempio n. 6
0
    def do_things(frame):
        """Retrieve and calculate frames from an i3 file.
        Args:
            frame (i3 frame): i3 frame from i3 file.
        Returns:
            i3 object: i3 object with requested frames.
        """
        cond1 = frame['I3EventHeader'].sub_event_stream != 'InIceSplit'
        cond2 = 'LineFit' not in frame or 'ToI' not in frame
        cond3 = 'SRTInIcePulses' not in frame
        cond4 = not frame['L5_oscNext_bool']
        final_cond = cond1 or cond2 or cond3 or cond4
        if final_cond:
            return False
        else:
            linefit_result = frame['LineFit']
            linefit_fit_status = linefit_result.fit_status
            toi_result = frame['ToI']
            toi_fit_status = toi_result.fit_status
            try:
                retro_crs_prefit_result = frame[
                    'retro_crs_prefit__median__neutrino'
                ]
                retro_crs_prefit_status = frame[
                    'retro_crs_prefit__fit_status'
                ][0]
            except Exception:
                return False
            if linefit_fit_status != 0:
                return False
            elif toi_fit_status != 0:
                return False
            elif retro_crs_prefit_status != 0:
                return False

        hit_stats = frame['HitStatisticsValues']
        hit_mult = frame['HitMultiplicityValues']
        data['dom_n_hit_multiple_doms'].append(
            hit_mult.n_hit_doms - hit_mult.n_hit_doms_one_pulse
        )
        time_char = frame['TimeCharacteristicsValues']

        data['dom_timelength_fwhm'].append(time_char.timelength_fwhm)

        # TODO Could we maybe do this in a smarter, programmatic way?
        # Get the true muon particle
        # Note that the muon is really produced in the atmosphere, but for the
        # simulation it is generated at the surface of a cylinder
        # surrounding IceCube
        # <icecube.dataclasses.I3Particle>
        true_primary = dataclasses.get_most_energetic_primary(
            frame['I3MCTree']
        )
        true_muon = dataclasses.get_most_energetic_muon(frame['I3MCTree'])
        if true_muon == None:
            data['secondary_track_length'].append(np.nan)
        else:
            data['secondary_track_length'].append(true_muon.length)
        # Add the muon energy (defined at the generation cylinder) to the
        # data dicitonary
        data['true_primary_energy'].append(np.log10(true_primary.energy))

        # Direction of the muon
        # <icecube.dataclasses.I3Particle>
        true_primary_direction = true_primary.dir
        # Add the muon direction to the data dictionary
        data['true_primary_direction_x'].append(true_primary_direction.x)
        data['true_primary_direction_y'].append(true_primary_direction.y)
        data['true_primary_direction_z'].append(true_primary_direction.z)

        data['true_primary_time'].append(true_primary.time)
        data['true_primary_speed'].append(true_primary.speed)

        # Point on the generation cylinder at which the muon is produced
        # <icecube.dataclasses.I3Particle>
        true_primary_entry_position = true_primary.pos
        # Add the entry position to the data dictionary
        data['true_primary_position_x'].append(
            true_primary_entry_position.x
        )
        data['true_primary_position_y'].append(
            true_primary_entry_position.y
        )
        data['true_primary_position_z'].append(
            true_primary_entry_position.z
        )

        # Get the uncleaned pulses
        # <icecube.dataclasses.I3RecoPulseSeriesMap>
        uncleaned_pulses = frame['SplitInIcePulses'].apply(frame)
        cleaned_pulses = frame['SRTInIcePulses'].apply(frame)

        dom_geom = frame['I3Geometry'].omgeo

        # Create empty lists for holding the pulse information
        temp = np.empty((0, 11))
        dom_key_temp = []
        # dom_x_temp = np.empty(0)
        # dom_y_temp = np.empty(0)
        # dom_z_temp = np.empty(0)
        # dom_time_temp = np.empty(0)
        # dom_charge_temp = np.empty(0)
        # dom_lc_temp = np.empty(0)
        # dom_atwd_temp = np.empty(0)
        # dom_fadc_temp = np.empty(0)
        # dom_pulse_width_temp = np.empty(0)

        # Go through all pulses, get OM key and pair with time and charge info
        for entry in uncleaned_pulses.items():
            cleaned_time_list = []
            this_om_key = entry[0]
            if this_om_key in cleaned_pulses.keys():
                cleaned_temp = cleaned_pulses[this_om_key]
                for cleaned_entry in cleaned_temp:
                    cleaned_time_list.append(cleaned_entry.time)
            # This grabs you an object containing the geometry for this
            # particular OM
            this_om_geom = dom_geom[this_om_key]
            # This has x,y,z members
            this_om_position = this_om_geom.position
            for i, pulse in enumerate(entry[1]):
                if pulse.time in cleaned_time_list:
                    cleaned_mask = 1
                else:
                    cleaned_mask = 0
                # dom_x_temp = np.append(dom_x_temp, this_om_position.x)
                # dom_y_temp = np.append(dom_y_temp, this_om_position.y)
                # dom_z_temp = np.append(dom_z_temp, this_om_position.z)
                # dom_time_temp = np.append(dom_time_temp, pulse.time)
                # dom_charge_temp = np.append(dom_charge_temp, pulse.charge)
                # dom_lc_temp = np.append(dom_lc_temp, (pulse.flags & 0x1) >> 0)
                # dom_atwd_temp = np.append(
                #     dom_atwd_temp,
                #     (pulse.flags & 0x2) >> 1
                # )
                # dom_fadc_temp = np.append(
                #     dom_fadc_temp,
                #     (pulse.flags & 0x4) >> 2
                # )
                # dom_pulse_width_temp = np.append(
                #     dom_pulse_width_temp,
                #     pulse.width
                # )
                dom_key = str(this_om_key[0]) + '_' + str(this_om_key[1]) + '_' + str(this_om_key[2])
                pulses = np.array(
                    [
                        this_om_position.x,
                        this_om_position.y,
                        this_om_position.z,
                        pulse.time,
                        pulse.charge,
                        (pulse.flags & 0x1) >> 0,
                        (pulse.flags & 0x2) >> 1,
                        (pulse.flags & 0x4) >> 2,
                        pulse.width,
                        1,
                        cleaned_mask
                    ],
                    ndmin=2
                )
                temp = np.append(
                    temp,
                    pulses,
                    axis=0
                )
                dom_key_temp.append(dom_key)

        # Add Numpy arrays to data dictionary
        # data['dom_x'].append(dom_x_temp)
        # data['dom_y'].append(dom_y_temp)
        # data['dom_z'].append(dom_z_temp)
        # data['dom_time'].append(dom_time_temp)
        # data['dom_charge'].append(dom_charge_temp)
        # data['dom_lc'].append(dom_lc_temp)
        # data['dom_atwd'].append(dom_atwd_temp)
        # data['dom_fadc'].append(dom_fadc_temp)
        # data['dom_pulse_width'].append(dom_pulse_width_temp)
        # data['dom_key'].append(np.array(dom_key_temp))
        dom_key_temp = np.array(dom_key_temp)
        dom_key_temp = dom_key_temp[temp[:, 3].argsort()]
        data['dom_key'].append(dom_key_temp)
        temp = temp[temp[:, 3].argsort()]
        data['dom_x'].append(temp[:, 0])
        data['dom_y'].append(temp[:, 1])
        data['dom_z'].append(temp[:, 2])
        data['dom_time'].append(temp[:, 3])
        data['dom_charge'].append(temp[:, 4])
        data['dom_lc'].append(temp[:, 5])
        data['dom_atwd'].append(temp[:, 6])
        data['dom_fadc'].append(temp[:, 7])
        data['dom_pulse_width'].append(temp[:, 8])

        flatten = lambda l: [item for sublist in l for item in sublist]
        split_indices = np.argwhere(temp[:, 9])
        split_indices = np.array(flatten(split_indices))
        srt_indices = np.array(np.argwhere(temp[:, 10]))
        srt_indices = np.array(flatten(srt_indices))
        masks['SplitInIcePulses'].append(split_indices)
        masks['SRTInIcePulses'].append(srt_indices)

        # Get the cleaned pulses (if available)
        # <icecube.dataclasses.I3RecoPulseSeriesMap>
        # cleaned_pulses = frame['SRTInIcePulses'].apply(frame)

        # Get the LineFit reconstruction
        # The direction of the straight line
        # <icecube.dataclasses.I3Particle>
        linefit_direction = linefit_result.dir
        # Add the direction of the linefit to the data dictionary
        data['linefit_direction_x'].append(linefit_direction.x)
        data['linefit_direction_y'].append(linefit_direction.y)
        data['linefit_direction_z'].append(linefit_direction.z)

        # An arbitrary point along the line
        # <icecube.dataclasses.I3Particle>
        linefit_point_on_line = linefit_result.pos
        # Add the arbitrary point along the line to the data dictionary
        data['linefit_point_on_line_x'].append(linefit_point_on_line.x)
        data['linefit_point_on_line_y'].append(linefit_point_on_line.y)
        data['linefit_point_on_line_z'].append(linefit_point_on_line.z)

        # Some additional params
        # <icecube.recclasses.I3LineFitParams>
        # linefit_params = frame['LineFitParams']

        # Get the tensor of inertia
        # The direction of the ToI
        # <icecube.dataclasses.I3Particle>
        toi_direction = toi_result.dir
        # Add the direction to the data dictionary
        data['toi_direction_x'].append(toi_direction.x)
        data['toi_direction_y'].append(toi_direction.y)
        data['toi_direction_z'].append(toi_direction.z)

        # An arbitrary point along the line
        # <icecube.dataclasses.I3Particle>
        toi_point_on_line = toi_result.pos
        # Add arbitrary point along the line to data dictionary
        data['toi_point_on_line_x'].append(toi_point_on_line.x)
        data['toi_point_on_line_y'].append(toi_point_on_line.y)
        data['toi_point_on_line_z'].append(toi_point_on_line.z)

        # Some additional params
        # <icecube.recclasses.I3TensorOfInertiaFitParams>
        toi_params = frame['ToIParams']
        # This is the ratio of the smallest component of the ToI to the sum of
        # them all. A value close to 0. means a track-like event.
        # Addd it to the data dictionary
        data['toi_evalratio'].append(toi_params.evalratio)

        retro_crs_prefit_position = retro_crs_prefit_result.pos
        retro_crs_prefit_direction = retro_crs_prefit_result.dir

        data['retro_crs_prefit_x'].append(retro_crs_prefit_position.x)
        data['retro_crs_prefit_y'].append(retro_crs_prefit_position.y)
        data['retro_crs_prefit_z'].append(retro_crs_prefit_position.z)
        data['retro_crs_prefit_azimuth'].append(retro_crs_prefit_direction.azimuth)
        data['retro_crs_prefit_zenith'].append(retro_crs_prefit_direction.zenith)
        data['retro_crs_prefit_energy'].append(retro_crs_prefit_result.energy)
        data['retro_crs_prefit_time'].append(retro_crs_prefit_result.time)
Esempio n. 7
0
def Make_Image(frame):
    global data 
    global geometry
    global st_info

    #Log id info 
    id = np.zeros(1,dtype = id_dtype)
    H = frame["I3EventHeader"]
    id[["run_id","sub_run_id","event_id","sub_event_id"]] = (H.run_id,H.sub_run_id,H.event_id,H.sub_event_id)
    
    #Log Weight info
    weight = np.zeros(1,dtype = weight_dtype)
    if data_type in ['genie', 'corsika']:
	w = dict(frame[WEIGHT_KEY])
	weight[list(w.keys())] = tuple(w.values())
    
    #Log MCTree info 
    primary = np.zeros(1,dtype = particle_dtype)
    prim_daughter = np.zeros(1,dtype = particle_dtype)
    if not data_type == 'data':
    #find primary particle
	mctree = frame[MCTREE_KEY]
	daughter = None
	if data_type == 'genie':
            prim = dataclasses.get_most_energetic_neutrino(mctree)
	    
	    max_energy = 0
	    for part in mctree.children(prim.id):
	        if part.energy > max_energy:
		    max_enegy = part.energy
		    daughter = part
	else:
	    prim = dataclasses.get_most_energetic_primary(mctree)
            daughter = dataclasses.get_most_energetic_muon(mctree)
           
        
	#if no children, then daughter is a duplicate of primary
	if  daughter is None:
            print("MCTree has no primary children")
            primary[["tree_id","pdg","energy","position","direction","time","length"]] =\
            ([prim.id.majorID, prim.id.minorID], prim.pdg_encoding, prim.energy,\
             [prim.pos.x,prim.pos.y,prim.pos.z],\
             [prim.dir.zenith,prim.dir.azimuth],prim.time, prim.length)

            prim_daughter[["tree_id","pdg","energy","position","direction","time","length"]] =\
            ([prim.id.majorID, prim.id.minorID], prim.pdg_encoding, prim.energy,\
             [prim.pos.x,prim.pos.y,prim.pos.z],\
             [prim.dir.zenith,prim.dir.azimuth], prim.time, prim.length)

	 #if there are children, daughter is the child with highest energy
	else:
            primary[["tree_id","pdg","energy","position","direction","time","length"]] =\
            ([prim.id.majorID, prim.id.minorID], prim.pdg_encoding, prim.energy,\
             [prim.pos.x,prim.pos.y,prim.pos.z],\
             [prim.dir.zenith,prim.dir.azimuth],prim.time, prim.length)
        
            prim_daughter[["tree_id","pdg","energy","position","direction","time","length"]] =\
            ([daughter.id.majorID, daughter.id.minorID], daughter.pdg_encoding,daughter.energy,\
             [daughter.pos.x,daughter.pos.y,daughter.pos.z],\
             [daughter.dir.zenith,daughter.dir.azimuth],daughter.time,daughter.length)
    
    #Log HESE veto perameters 
    hese = np.zeros(1,dtype = hese_dtype)
    hese_vheselfveto = True
    hese_pos =[-9999,-9999,-9999]
    hese_time = -999
    if frame.Has("HESE3_VHESelfVeto"):
        hese_vheselfveto = frame["HESE3_VHESelfVeto"].value
        hese_pos = [frame["HESE3_VHESelfVetoVertexPos"].x,frame["HESE3_VHESelfVetoVertexPos"].y,frame["HESE3_VHESelfVetoVertexPos"].z]
        hese_time = frame["HESE3_VHESelfVetoVertexTime"].value
    hese[["vheselfveto","vheselfvetovertexpos","vheselfvetovertextime"]][0] =\
    (hese_vheselfveto,hese_pos,hese_time) 
   
    #Log logan's veto parameters
    veto = np.zeros(1,dtype = veto_dtype)
    veto_cas_rlogl = -999
    veto_spe_rlogl = 999
    veto_cas_rlogl_ndc = -999
    veto_spe_rlogl_ndc = 999
    veto_fh_z = -999
    veto_svv_z = -999
    veto_ldp = -999
    
    if frame.Has('HESE3_VHESelfVetoVertexPos') and frame.Has('SPEFit32_DPFitParams') and frame.Has('CascadeLlhVertexFit_DPParams')\
    and frame.Has('SPEFit32_noDC_DPFitParams') and frame.Has('CascadeLlhVertexFit_noDC_DPParams') and frame.Has('depthFirstHit')\
    and frame.Has("LeastDistanceToPolygon_Veto"):
         
        veto_cas_rlogl = frame['CascadeLlhVertexFit_DPParams'].ReducedLlh
        veto_spe_rlogl = frame['SPEFit32_DPFitParams'].rlogl
        veto_cas_rlogl_ndc = frame['CascadeLlhVertexFit_noDC_DPParams'].ReducedLlh
        veto_spe_rlogl_ndc = frame['SPEFit32_noDC_DPFitParams'].rlogl
        veto_fh_z = frame['depthFirstHit'].value
        veto_svv_z = frame['HESE3_VHESelfVetoVertexPos'].z
        veto_ldp = frame["LeastDistanceToPolygon_Veto"].value
        trck = frame['CascadeLlhVertexFit_DP']
        cscd = frame['SPEFit32_DP']
    
    veto[["SPE_rlogl","Cascade_rlogl","SPE_rlogl_noDC", "Cascade_rlogl_noDC","FirstHitZ","VHESelfVetoVertexPosZ","LeastDistanceToPolygon_Veto"]] =\
    (veto_spe_rlogl,veto_cas_rlogl,veto_spe_rlogl_ndc,veto_cas_rlogl_ndc,veto_fh_z,veto_svv_z,veto_ldp)                     
    pulses= dataclasses.I3RecoPulseSeriesMap.from_frame(frame, PULSES_KEY)
    wf_map = frame["CalibratedWaveformsHLCATWD"]   


    #make image from raw waveforms 
    wfms = []
    wf_times = [] #storage for waveforms starting times
    wf_widths = [] #storage for waveform bin widths
    
    for img_ch, (q, stnum, dist) in enumerate(st_info):
        for omkey in wf_map.keys():
            if (omkey.string == stnum):
                for wf in wf_map.get(omkey, []):
                    if wf.status == 0 and wf.source_index == 0:
			wf_times.append(wf.time)
                        wf_widths.append(wf.bin_width)
                        wfms.append({
                                'wfm': wf.waveform,
                                'time': wf.time,  
                                'width': wf.bin_width,
                                'dom_idx': omkey.om - 1,
                                'img_ch': img_ch,
                                'om_pos': [geometry[omkey].position.x,geometry[omkey].position.y,geometry[omkey].position.z]
                                })


    im = np.zeros(shape=(N_X_BINS, N_Y_BINS, N_CHANNELS))
    wf_times_arr = np.zeros(shape=(N_Y_BINS, N_CHANNELS))
    wf_pos_arr = np.zeros(shape=(3,N_Y_BINS, N_CHANNELS))
    

    if len(wfms) <= 4:
        print("FAILED only %d WF" %len(wfms) )
        return False
    
    #we neeed to prevent early noise hits from shifting the actual
    #interaction from the image time frame
    #first work out when the first waveforn starts
    wf_times = np.array(wf_times)
    wf_times = wf_times[wf_times.argsort()]

    #find the biggest differnece between starting times
    diff_times = np.diff(wf_times[:N_NOISE_HITS])
    max_diff_pos = np.argmax(diff_times)
    
    #check if the images needs to be shifted and work out the shift
    if diff_times[max_diff_pos] > MAX_TIME_SHIFT:
        min_time = wf_times[max_diff_pos+1]
    else:
        min_time = wf_times[0]

    

    #make images
    for wfm in wfms:
        wf_shift = 0
        start_ind = min(N_X_BINS, int((wfm['time'] - min_time) / wfm['width']))
        if start_ind >= 0:
            end_ind = min(N_X_BINS, start_ind + len(wfm['wfm']))
            wfm_vals = wfm['wfm'][0:end_ind-start_ind]
        else: 
            wf_shift = abs(start_ind)
            start_ind = 0
            end_ind = min(N_X_BINS, len(wfm['wfm'])-wf_shift)
            if end_ind <0:
                end_ind = 0
            wfm_vals = wfm['wfm'][wf_shift:len(wfm['wfm'])]

        im[start_ind:end_ind, wfm['dom_idx'], wfm['img_ch']] = wfm_vals
        wf_times_arr[wfm['dom_idx'], wfm['img_ch']] = wfm['time']
        wf_pos_arr[0:3,wfm['dom_idx'], wfm['img_ch']] = wfm['om_pos']
        
        
        if wf_shift > 0:
            print("the images were shifted by {0:.3f}".format(wf_shift))
                
    im = np.true_divide(im, 10**(-8))
    im = im.astype(np.float32)
    
    if np.sum(im[:,:,0])==0:
        print("FAILED no image 0")
        return False
    if np.sum(im[:,:,1])==0:
        print("FAILED no image 1")
        return False
    if np.sum(im[:,:,2])==0:
        print("FAILED no image 2")
        return False
    
    #Log all the event info    
    event = np.zeros(1,dtype = info_dtype)    
    event[["id","image","qtot","qst","primary","prim_daughter","logan_veto","hese","weight_dict"]]=\
           (id[0], im, qtot, st_info, primary[0], prim_daughter[0], veto[0],hese[0], weight[0])
    data.append(event)
            if not frame["L4BDT"]["BDTScore"] > 0.04: continue
            
            # Lets just weight to H3a for now
            w = frame["GaisserH3aWeight"].value
            if "9036" in filename: w /= 100000.0
            elif "9255" in filename: w /= 95000.0
            elif "10282" in filename w /= 11200.0
            elif "10309" in filename w /= 12200.0
            elif "10369" in filename w /= 400.0
            elif "11905" in filename w /= 90000.0
            elif "12268" in filename w /= 96000.0
            elif "12332" in filename w /= 99000.0

            # Now, we want the primary. Let's get it
            primary = dataclasses.get_most_energetic_primary(frame["I3MCTree"])
            muon = dataclasses.get_most_energetic_muon(frame["I3MCTree"])


            # Propagate the muons muons to the MuonGun generating surface
            outSurface = Cylinder(1600*I3Units.m, 800*I3Units.m)
            partVec = MuonGun.muons_at_surface(frame, outSurface)

            muongun_energy = 1e-9
            for p in partVec:
                if p.energy > muongun_energy:
                    muongun_energy = p.energy                    

            weights.append(w)
            energy_of_primary.append(primary.energy)
            energy_at_depth.append(muongun_energy)
            coszens.append(numpy.cos(muon.dir.zenith))
Esempio n. 9
0
 def DAQ(self, frame):
     if frame.Has("I3MCTree"):
         MCprimary = dataclasses.get_most_energetic_primary(
             frame["I3MCTree"])
         MCmuon = dataclasses.get_most_energetic_muon(frame["I3MCTree"])
         histo_MCPrimary_x.Fill(MCprimary.pos.x)
         histo_MCPrimary_y.Fill(MCprimary.pos.y)
         histo_MCPrimary_z.Fill(MCprimary.pos.z)
         histo_MCPrimary_xy.Fill(MCprimary.pos.x, MCprimary.pos.y)
         histo_MCPrimary_xz.Fill(MCprimary.pos.x, MCprimary.pos.z)
         histo_MCPrimary_yz.Fill(MCprimary.pos.y, MCprimary.pos.z)
         histo_MC_angle.Fill(
             phys_services.I3Calculator.angle(MCprimary, MCmuon))
         histo_MC_energy_angle.Fill(
             numpy.log10(MCprimary.energy),
             phys_services.I3Calculator.angle(MCprimary, MCmuon))
     if frame.Has("WIMP_params"):
         wimp_params = frame["WIMP_params"]
         histo_wimp_params_nu_weight.Fill(wimp_params.nu_weight)
         histo_wimp_params_lep_weight.Fill(
             numpy.log10(wimp_params.lep_weight))
         histo_wimp_params_had_weight.Fill(
             numpy.log10(wimp_params.had_weight))
         histo_wimp_params_vgen.Fill(wimp_params.vgen)
         histo_wimp_params_time.Fill(
             float(wimp_params.time.mod_julian_day_double))
     if frame.Has("WIMP_params") and frame.Has("I3MCTree"):
         histo_wimp_params_time_nuweight.Fill(
             float(wimp_params.time.mod_julian_day_double),
             wimp_params.nu_weight)
         histo_MCPrimary_zenith_nuweight.Fill(MCprimary.dir.zenith,
                                              wimp_params.nu_weight)
         histo_MCPrimary_azimuth_nuweight.Fill(MCprimary.dir.azimuth,
                                               wimp_params.nu_weight)
         histo_MCPrimary_energy_nuweight.Fill(
             numpy.log10(MCprimary.energy), wimp_params.nu_weight)
         histo_MCMuon_zenith_nuweight.Fill(MCmuon.dir.zenith,
                                           wimp_params.nu_weight)
         histo_MCMuon_azimuth_nuweight.Fill(MCmuon.dir.azimuth,
                                            wimp_params.nu_weight)
         histo_MCMuon_energy_nuweight.Fill(numpy.log10(MCmuon.energy),
                                           wimp_params.nu_weight)
         histo_MC_angle_lepweight.Fill(
             phys_services.I3Calculator.angle(MCprimary, MCmuon),
             wimp_params.lep_weight)
         histo_MC_nuenergy_angle_lepweight.Fill(
             numpy.log10(MCprimary.energy),
             phys_services.I3Calculator.angle(MCprimary, MCmuon),
             wimp_params.lep_weight)
         histo_MC_muenergy_angle_lepweight.Fill(
             numpy.log10(MCmuon.energy),
             phys_services.I3Calculator.angle(MCprimary, MCmuon),
             wimp_params.lep_weight)
         histo_nuenergy_lepweight.Fill(
             numpy.log10(MCprimary.energy),
             numpy.log10(wimp_params.lep_weight))
         histo_nuenergy_lepweight_lepweight.Fill(
             numpy.log10(MCprimary.energy),
             numpy.log10(wimp_params.lep_weight),
             wimp_params.lep_weight)
     self.PushFrame(frame)
     return
primary.energy = 10 * I3Units.TeV
tree = dc.I3MCTree()
tree.add_primary(primary)

mep = get_most_energetic_primary(tree)
I3Test.ENSURE(mep.id == primary.id, "got the wrong particle.")

I3Test.ENSURE(not get_most_energetic_cascade(tree),
              "got a particle, but shouldn't.")
I3Test.ENSURE(not get_most_energetic_inice(tree),
              "got a particle, but shouldn't.")
I3Test.ENSURE(not get_most_energetic_track(tree),
              "got a particle, but shouldn't.")
I3Test.ENSURE(not get_most_energetic_neutrino(tree),
              "got a particle, but shouldn't.")
I3Test.ENSURE(not get_most_energetic_muon(tree),
              "got a particle, but shouldn't.")
I3Test.ENSURE(not get_most_energetic_nucleus(tree),
              "got a particle, but shouldn't.")

primary2 = dc.I3Particle()
primary2.energy = 9 * I3Units.TeV

cascade = dc.I3Particle()
cascade.type = dc.I3Particle.EMinus

inice = dc.I3Particle()
inice.location_type = dc.I3Particle.InIce

track = dc.I3Particle()
track.energy = 10 * I3Units.TeV