コード例 #1
0
def create_virtual_plane_dict(file_reader, virtual_plane_dict):
    """
    Matches up scifitrackpoints to virtual planes to make a lookup dictionary 
  """
    #  virtual_plane_dict = {}
    for num in range(-15, 0, 1):
        virtual_plane_dict[num] = (-1, (ALIGNMENT_TOLERANCE * 100.0))
    for num in range(1, 16, 1):
        virtual_plane_dict[num] = (-1, (ALIGNMENT_TOLERANCE * 100.0))

    while file_reader.next_event():
        scifi_event = file_reader.get_event('scifi')
        mc_event = file_reader.get_event('mc')

        tracks = scifi_event.scifitracks()
        for track in tracks:
            trackpoints = track.scifitrackpoints()
            for trkpt in trackpoints:
                z_pos = trkpt.pos().z()
                plane_id = tools.calculate_plane_id(trkpt.tracker(), trkpt.station(), \
                                                                      trkpt.plane() )

                for vhit_num in xrange(mc_event.GetVirtualHitsSize()):
                    vhit = mc_event.GetAVirtualHit(vhit_num)
                    diff = math.fabs(vhit.GetPosition().z() - z_pos)

                    if diff < virtual_plane_dict[plane_id][1]:
                        virtual_plane_dict[plane_id] = (vhit.GetStationId(),
                                                        diff)


#            print plane_id, vhit.GetStationId(), diff

        done = True
        num_found = 0
        for plane in virtual_plane_dict:
            if virtual_plane_dict[plane][1] > ALIGNMENT_TOLERANCE:
                #        print plane, virtual_plane_dict[plane]
                done = False
            else:
                num_found += 1
        sys.stdout.write(
            "- Finding Virtual Planes : Running ({0} of {1})\r".format(
                num_found, 30))
        sys.stdout.flush()
        if done:
            break
    else:
        if REQUIRE_ALL_VIRTUALS:
            raise ValueError("Could not locate all virtuals planes")

    file_reader.reset()
    return virtual_plane_dict
コード例 #2
0
def make_spacepoint_mc_pairs(plot_dict, data_dict, virtual_plane_dict, \
                                                        scif_event, mc_event) :
    """
    Make pairs of SciFiSpacepoints and MC VirtualHits
  """
    paired_hits = []

    spacepoints = scifi_event.spacepoints()

    # Find a reference spacepoint
    for spacepoint in spacepoints:
        for plane in range(3):

            pl_id = tools.calculate_plane_id(spacepoint.get_tracker(),
                                             spacepoint.get_station(), plane)

            expected_virtual_plane = virtual_plane_dict[pl_id][0]

            # Find the virtual hit
            for vhit_num in xrange(mc_event.GetVirtualHitsSize()):
                vhit = mc_event.GetAVirtualHit(vhit_num)
                if vhit.GetStationId() == expected_virtual_plane and \
                                                abs(vhit.GetParticleId()) == MUON_PID :
                    virtual_hit = vhit
                    break
            else:
                data_dict['counters']['missing_virtual_hits'] += 1
                continue


# Add to list
            new_spacepoint = { 'pos' : [], 'mom' : [0.0, 0.0, 200.0], 'grad' : [0.0, 0.0], 'id' : pl_id, 'pull' : 0.0, \
              'pos_err' : [-1.0, -1.0, -1.0], 'mom_err' : [-1.0, -1.0, -1.0], 'grad_err' : [-1.0, -1.0] }

            new_spacepoint['pos'].append(spacepoint.get_global_position().x())
            new_spacepoint['pos'].append(spacepoint.get_global_position().y())
            new_spacepoint['pos'].append(spacepoint.get_global_position().z())
            paired_hits.append((new_spacepoint, virtual_hit))
            data_dict['counters']['found_pairs'] += 1

    found_up = 0
    found_down = 0

    for scifi_hit, virt_hit in paired_hits:
        if scifi_hit['id'] < 0:
            found_up += 1
        else:
            found_down += 1

    data_dict['counters']['found_tracks_up'] += found_up
    data_dict['counters']['found_tracks_down'] += found_down

    return paired_hits
コード例 #3
0
ファイル: kalman_validation.py プロジェクト: ajdobbs/maus
def make_spacepoint_mc_pairs(plot_dict, data_dict, virtual_plane_dict, \
                                                        scif_event, mc_event) :
  """
    Make pairs of SciFiSpacepoints and MC VirtualHits
  """
  paired_hits = []

  spacepoints = scifi_event.spacepoints()

# Find a reference spacepoint
  for spacepoint in spacepoints :
    for plane in range( 3 ) :

      pl_id = tools.calculate_plane_id(spacepoint.get_tracker(), spacepoint.get_station(), plane)

      expected_virtual_plane = virtual_plane_dict[pl_id][0]

# Find the virtual hit
      for vhit_num in xrange(mc_event.GetVirtualHitsSize()) :
        vhit = mc_event.GetAVirtualHit(vhit_num)
        if vhit.GetStationId() == expected_virtual_plane and \
                                        abs(vhit.GetParticleId()) == MUON_PID :
          virtual_hit = vhit
          break
      else :
        data_dict['counters']['missing_virtual_hits'] += 1
        continue

# Add to list
      new_spacepoint = { 'pos' : [], 'mom' : [0.0, 0.0, 200.0], 'grad' : [0.0, 0.0], 'id' : pl_id, 'pull' : 0.0, \
        'pos_err' : [-1.0, -1.0, -1.0], 'mom_err' : [-1.0, -1.0, -1.0], 'grad_err' : [-1.0, -1.0] }

      new_spacepoint['pos'].append(spacepoint.get_global_position().x())
      new_spacepoint['pos'].append(spacepoint.get_global_position().y())
      new_spacepoint['pos'].append(spacepoint.get_global_position().z())
      paired_hits.append((new_spacepoint, virtual_hit))
      data_dict['counters']['found_pairs'] += 1

  found_up = 0
  found_down = 0

  for scifi_hit, virt_hit in paired_hits :
    if scifi_hit['id'] < 0 :
      found_up += 1
    else :
      found_down += 1
    
  data_dict['counters']['found_tracks_up'] += found_up
  data_dict['counters']['found_tracks_down'] += found_down

  return paired_hits
コード例 #4
0
ファイル: kalman_validation.py プロジェクト: ajdobbs/maus
def create_virtual_plane_dict(file_reader, virtual_plane_dict) :
  """
    Matches up scifitrackpoints to virtual planes to make a lookup dictionary 
  """
#  virtual_plane_dict = {}
  for num in range( -15, 0, 1 ) :
    virtual_plane_dict[ num ] = ( -1, (ALIGNMENT_TOLERANCE * 100.0) )
  for num in range( 1, 16, 1 ) :
    virtual_plane_dict[ num ] = ( -1, (ALIGNMENT_TOLERANCE * 100.0) )

  while file_reader.next_event() :
    scifi_event = file_reader.get_event( 'scifi' )
    mc_event = file_reader.get_event( 'mc' )

    tracks = scifi_event.scifitracks()
    for track in tracks :
      trackpoints = track.scifitrackpoints()
      for trkpt in trackpoints :
        z_pos = trkpt.pos().z()
        plane_id = tools.calculate_plane_id(trkpt.tracker(), trkpt.station(), \
                                                              trkpt.plane() )

        for vhit_num in xrange(mc_event.GetVirtualHitsSize()) :
          vhit = mc_event.GetAVirtualHit(vhit_num)
          diff = math.fabs(vhit.GetPosition().z() - z_pos)

          if diff < virtual_plane_dict[ plane_id ][1] :
            virtual_plane_dict[ plane_id ] = ( vhit.GetStationId(), diff )
#            print plane_id, vhit.GetStationId(), diff

    done = True
    num_found = 0
    for plane in virtual_plane_dict :
      if virtual_plane_dict[plane][1] > ALIGNMENT_TOLERANCE :
#        print plane, virtual_plane_dict[plane]
        done = False
      else :
        num_found += 1
    sys.stdout.write( "- Finding Virtual Planes : Running ({0} of {1})\r".format(num_found, 30) )
    sys.stdout.flush()
    if done :
      break
  else :
    if REQUIRE_ALL_VIRTUALS :
      raise ValueError("Could not locate all virtuals planes")

  file_reader.reset()
  return virtual_plane_dict
コード例 #5
0
ファイル: data_tracker_verify.py プロジェクト: ajdobbs/maus
def cut_scifi_event( plot_dict, event ) :
  """
    Examine a SciFi Event to see if it should be vetoed
  """
  digits = event.digits()
  tracks = event.scifitracks()
  saturation_counter = 0

  for digit in digits :
    if digit.get_adc() == 255 :
      saturation_counter += 1

  if saturation_counter > 1000 :
    return True

  upstream_tracks = 0
  downstream_tracks = 0
  for track in tracks :
    if track.P_value() < P_VALUE_CUT : 
      return True

    if track.tracker() == 0 :
      upstream_tracks += 1
    else :
      downstream_tracks += 1

    trackpoints = track.scifitrackpoints()
    count_trackpoints = 0
    for tp in trackpoints :
      if tp.has_data() :
        count_trackpoints += 1
      elif tools.calculate_plane_id( tp.tracker(), tp.station(), tp.plane()) \
                                                             in IGNORE_PLANES :
        count_trackpoints += 1
    if count_trackpoints < MIN_NUM_TRACKPOINTS :
      return True

  if (upstream_tracks != 1) or (downstream_tracks != 1) :
    return True

  return False
コード例 #6
0
def cut_scifi_event(plot_dict, event):
    """
    Examine a SciFi Event to see if it should be vetoed
  """
    digits = event.digits()
    tracks = event.scifitracks()
    saturation_counter = 0

    for digit in digits:
        if digit.get_adc() == 255:
            saturation_counter += 1

    if saturation_counter > 1000:
        return True

    upstream_tracks = 0
    downstream_tracks = 0
    for track in tracks:
        if track.P_value() < P_VALUE_CUT:
            return True

        if track.tracker() == 0:
            upstream_tracks += 1
        else:
            downstream_tracks += 1

        trackpoints = track.scifitrackpoints()
        count_trackpoints = 0
        for tp in trackpoints:
            if tp.has_data():
                count_trackpoints += 1
            elif tools.calculate_plane_id( tp.tracker(), tp.station(), tp.plane()) \
                                                                   in IGNORE_PLANES :
                count_trackpoints += 1
        if count_trackpoints < MIN_NUM_TRACKPOINTS:
            return True

    if (upstream_tracks != 1) or (downstream_tracks != 1):
        return True

    return False
コード例 #7
0
ファイル: data_tracker_verify.py プロジェクト: ajdobbs/maus
def fill_plots_tracks(plot_dict, data_dict, tracks) :
  """
    Fill the track specific plots
  """
  track_plots = plot_dict['track_plots']
  reco_plots = plot_dict['recon_plots']
#  comp_plots = plot_dict['comparison_plots']

  track_plots['tracks_event'].Fill( len(tracks) )
  upstream_good = 0
  downstream_good = 0
  straight_counter = 0
  helical_counter = 0

  for track in tracks :
    trackpoints = track.scifitrackpoints()

    if track.P_value() < P_VALUE_CUT : 
      continue

    count_trackpoints = 0
    for tp in trackpoints :
      if tp.has_data() :
        count_trackpoints += 1
      elif tools.calculate_plane_id( tp.tracker(), tp.station(), tp.plane()) \
                                                             in IGNORE_PLANES :
        count_trackpoints += 1
    if count_trackpoints < MIN_NUM_TRACKPOINTS :
      continue

    tracker = track.tracker()
    track_plots['tracks_tracker'].Fill( track.tracker() )

    shape = track.GetAlgorithmUsed()
    shape_plots = None
#    pr_track = None

    if shape == 0 :
      shape_plots = track_plots['straight']
#      pr_track = track.pr_track_pointer_straight()
      straight_counter += 1
    elif shape == 1 :
      shape_plots = track_plots['helical']
#      pr_track = track.pr_track_pointer_helical()
      helical_counter += 1

    data_dict['counters']['N_tracks'] += 1 

    shape_plots['tracks_tracker'].Fill( track.tracker() )
    shape_plots['chi_squared'].Fill( track.chi2() )
    shape_plots['chi_squared_ndf'].Fill( track.chi2() / track.ndf() )
    shape_plots['p_value'].Fill( track.P_value() )
    shape_plots['ndf'].Fill( track.ndf() )

    if tracker == 0 :
      shape_plots['chi_squared_up'].Fill( track.chi2() )
      shape_plots['chi_squared_ndf_up'].Fill( track.chi2() / track.ndf() )
      shape_plots['p_value_up'].Fill( track.P_value() )
      shape_plots['ndf_up'].Fill( track.ndf() )
      data_dict['counters']['N_tracks_up'] += 1 
      upstream_good += 1
    elif tracker == 1 :
      shape_plots['chi_squared_down'].Fill( track.chi2() )
      shape_plots['chi_squared_ndf_down'].Fill( track.chi2() / track.ndf() )
      shape_plots['p_value_down'].Fill( track.P_value() )
      shape_plots['ndf_down'].Fill( track.ndf() )
      data_dict['counters']['N_tracks_down'] += 1 
      downstream_good += 1
    
#    pr_track = None

#    if track.GetAlgorithmUsed() == 0 :
#      pr_track = track.pr_track_pointer_straight()
#    elif track.GetAlgorithmUsed() == 1 :
#      pr_track = track.pr_track_pointer_helical()

    for tp in trackpoints :

      station = tp.station()
      plane = tp.plane()
      dir_name = str(tracker) + "." + str(station) + "." + str(plane)
      plane_plots = plot_dict['plane_plots']

      plane_id = ( 1 + plane + ( station - 1) * 3 ) * \
                                              ( -1.0 if tracker == 0 else 1.0 )
      reco_plots['plane_hits'].Fill( plane_id )

      if tp.has_data() :
        pull = tp.pull()
        residual = tp.residual()
        s_residual = tp.smoothed_residual()
        shape_plots['plane_pulls'].Fill( plane_id, pull )
        shape_plots['plane_residuals'].Fill( plane_id, residual )
        shape_plots['plane_s_residuals'].Fill( plane_id, s_residual )

        plane_plots[dir_name]['pull'].Fill( pull )
        plane_plots[dir_name]['s_residual'].Fill( s_residual )

      pos = tp.pos()
      mom = tp.mom()
      plane_plots[dir_name]['xy'].Fill( pos.x(), pos.y() )
      plane_plots[dir_name]['pxpy'].Fill( mom.x(), mom.y() )
      plane_plots[dir_name]['xpx'].Fill( pos.x(), mom.x() )
      plane_plots[dir_name]['ypy'].Fill( pos.y(), mom.y() )
      plane_plots[dir_name]['mxmy'].Fill( mom.x() / mom.z(), mom.y() / mom.z() )
      plane_plots[dir_name]['xmx'].Fill( pos.x(), mom.x() / mom.z() )
      plane_plots[dir_name]['ymy'].Fill( pos.y(), mom.y() / mom.z() )

#      if station == REFERENCE_STATION and plane == REFERENCE_PLANE :
#        prefix = ""
#        if tracker == 0 :
#          prefix = 'up_'
#        elif tracker == 1 :
#          prefix = 'down_'
#        pr_pos = pr_track.get_reference_position()
#        pr_mom = pr_track.get_reference_momentum()
#
#        diff_pos = [ pos.x() - pr_pos.x(), pos.y() - pr_pos.y() ]
#        diff_mom = [ mom.x() - pr_mom.x(), mom.y() - pr_mom.y() ]
# 
#        comp_plots[prefix+'patrec_kalman_xy'].Fill( \
#                                                     diff_pos[0], diff_pos[1] )
#        comp_plots[prefix+'patrec_kalman_mxmy'].Fill( \
#                                 diff_mom[0] / mom.z(), diff_mom[1] / mom.z() )
#        comp_plots[prefix+'patrec_kalman_pxpy'].Fill( \
#                                                     diff_mom[0], diff_mom[1] )


    if upstream_good == 1 and downstream_good == 1 :
      data_dict['counters']['N_track_pairs'] += 1
    track_plots['trackpoints_track'].Fill( count_trackpoints )
    shape_plots['trackpoints_track'].Fill( count_trackpoints )

  track_plots['straight']['tracks_event'].Fill(straight_counter)
  track_plots['helical']['tracks_event'].Fill(helical_counter)
コード例 #8
0
def make_patrec_mc_pairs(plot_dict, data_dict, virtual_plane_dict, \
                                                        scif_event, mc_event) :
    """
    Make pairs of Pattern Recognition Tracks and MC VirtualHits
  """
    paired_hits = []

    if TRACK_ALGORITHM == 0:
        tracks = scifi_event.straightprtracks()
    elif TRACK_ALGORITHM == 1:
        tracks = scifi_event.helicalprtracks()

# Find a reference spacepoint
    for track in tracks:

        pl_id = tools.calculate_plane_id(track.get_tracker(), 1,
                                         0)  # Only examine ref plane atm

        expected_virtual_plane = virtual_plane_dict[pl_id][0]

        # Find the virtual hit
        for vhit_num in xrange(mc_event.GetVirtualHitsSize()):
            vhit = mc_event.GetAVirtualHit(vhit_num)
            if vhit.GetStationId() == expected_virtual_plane and \
                                            abs(vhit.GetParticleId()) == MUON_PID :
                virtual_hit = vhit
                break
        else:
            data_dict['counters']['missing_virtual_hits'] += 1
            continue


# Add to list
        new_pr_point = { 'pos' : [], 'mom' : [], 'grad' : [], 'id' : pl_id, 'pull' : 0.0, \
            'pos_err' : [-1.0, -1.0, -1.0], 'mom_err' : [-1.0, -1.0, -1.0], grad_err : [-1.0, -1.0] }

        new_pr_point['pos'].append(track.get_reference_position().x())
        new_pr_point['pos'].append(track.get_reference_position().y())
        new_pr_point['pos'].append(track.get_reference_position().z())
        new_pr_point['mom'].append(track.get_reference_momentum().x())
        new_pr_point['mom'].append(track.get_reference_momentum().y())
        new_pr_point['mom'].append(track.get_reference_momentum().z())
        new_pr_point['grad'].append(track.get_reference_momentum().x() /
                                    track.get_reference_momentum.z())
        new_pr_point['grad'].append(track.get_reference_momentum().y() /
                                    track.get_reference_momentum.z())
        paired_hits.append((new_pr_point, virtual_hit))
        data_dict['counters']['found_pairs'] += 1

        if track.get_tracker() == 0:
            plot_dict['statistics']['up_p_value'].Fill(
                ROOT.TMath.Prob(track.get_chi_squared(), track.get_ndf()))
            plot_dict['statistics']['up_chi_sq'].Fill(track.get_chi_squared())
            plot_dict['statistics']['up_chi_sq_df'].Fill(
                track.get_chi_squared() / track.get_ndf())
            plot_dict['statistics']['up_ndf'].Fill(track.get_ndf())
        else:
            plot_dict['statistics']['down_p_value'].Fill(
                ROOT.TMath.Prob(track.get_chi_squared(), track.get_ndf()))
            plot_dict['statistics']['down_chi_sq'].Fill(
                track.get_chi_squared())
            plot_dict['statistics']['down_chi_sq_df'].Fill(
                track.get_chi_squared() / track.get_ndf())
            plot_dict['statistics']['down_ndf'].Fill(track.get_ndf())

    found_up = 0
    found_down = 0

    for scifi_hit, virt_hit in paired_hits:
        if scifi_hit['id'] < 0:
            found_up += 1
        else:
            found_down += 1

    data_dict['counters']['found_tracks_up'] += found_up
    data_dict['counters']['found_tracks_down'] += found_down

    return paired_hits
コード例 #9
0
def make_scifi_mc_pairs(plot_dict, data_dict, virtual_plane_dict, \
                                                        scif_event, mc_event) :
    """
    Make pairs of SciFiTrackpoints and MC VirtualHits
  """
    paired_hits = []

    tracks = scifi_event.scifitracks()
    for track in tracks:
        if track.GetAlgorithmUsed() != TRACK_ALGORITHM:
            continue
        if track.tracker() == 0:
            plot_dict['statistics']['up_p_value'].Fill(track.P_value())
            plot_dict['statistics']['up_chi_sq'].Fill(track.chi2())
            plot_dict['statistics']['up_chi_sq_df'].Fill(track.chi2() /
                                                         track.ndf())
            plot_dict['statistics']['up_ndf'].Fill(track.ndf())
        else:
            plot_dict['statistics']['down_p_value'].Fill(track.P_value())
            plot_dict['statistics']['down_chi_sq'].Fill(track.chi2())
            plot_dict['statistics']['down_chi_sq_df'].Fill(track.chi2() /
                                                           track.ndf())
            plot_dict['statistics']['down_ndf'].Fill(track.ndf())

        trackpoints = track.scifitrackpoints()
        trackpoint = None

        # Find a reference trackpoint
        for trackpoint in trackpoints:
            if trackpoint.station() == REFERENCE_STATION and trackpoint.plane(
            ) == REFERENCE_PLANE:
                pt = math.sqrt(trackpoint.mom().x()**2 +
                               trackpoint.mom().y()**2)
                pz = trackpoint.mom().z()
                if track.tracker() == 0:
                    plot_dict['statistics']['up_p_value_pt'].Fill(
                        track.P_value(), pt)
                    plot_dict['statistics']['up_p_value_pz'].Fill(
                        track.P_value(), math.fabs(pz))
                else:
                    plot_dict['statistics']['down_p_value_pt'].Fill(
                        track.P_value(), pt)
                    plot_dict['statistics']['down_p_value_pz'].Fill(
                        track.P_value(), math.fabs(pz))

# If no data then give up!
            if REQUIRE_DATA and not trackpoint.has_data():
                data_dict['counters']['missing_reference_hits'] += 1
                continue

            expected_virtual_plane = virtual_plane_dict[tools.calculate_plane_id( \
                  trackpoint.tracker(), trackpoint.station(), trackpoint.plane())][0]

            # Find the virtual hit
            for vhit_num in xrange(mc_event.GetVirtualHitsSize()):
                vhit = mc_event.GetAVirtualHit(vhit_num)
                if vhit.GetStationId() == expected_virtual_plane and \
                                                abs(vhit.GetParticleId()) == MUON_PID :
                    virtual_hit = vhit
                    break
            else:
                data_dict['counters']['missing_virtual_hits'] += 1
                continue

            momentum = math.sqrt(vhit.GetMomentum().x()**2 +
                                 vhit.GetMomentum().y()**2 +
                                 vhit.GetMomentum().z()**2)
            if momentum < MOMENTUM_WINDOW[0] or momentum > MOMENTUM_WINDOW[1]:
                continue


# Add to list
            pl_id = tools.calculate_plane_id(trackpoint.tracker(),
                                             trackpoint.station(),
                                             trackpoint.plane())
            if trackpoint.has_data():
                new_trackpoint = {
                    'pos': [],
                    'mom': [],
                    'grad': [],
                    'id': pl_id,
                    'pull': trackpoint.pull(),
                    'pos_err': [],
                    'mom_err': [],
                    'grad_err': []
                }
            else:
                new_trackpoint = {
                    'pos': [],
                    'mom': [],
                    'grad': [],
                    'id': pl_id,
                    'pull': None,
                    'pos_err': [],
                    'mom_err': [],
                    'grad_err': []
                }

            new_trackpoint['pos'].append(trackpoint.pos().x())
            new_trackpoint['pos'].append(trackpoint.pos().y())
            new_trackpoint['pos'].append(trackpoint.pos().z())
            new_trackpoint['mom'].append(trackpoint.mom().x())
            new_trackpoint['mom'].append(trackpoint.mom().y())
            new_trackpoint['mom'].append(trackpoint.mom().z())
            new_trackpoint['grad'].append(trackpoint.gradient().x())
            new_trackpoint['grad'].append(trackpoint.gradient().y())
            new_trackpoint['pos_err'].append(trackpoint.pos_error().x())
            new_trackpoint['pos_err'].append(trackpoint.pos_error().y())
            new_trackpoint['pos_err'].append(trackpoint.pos_error().z())
            new_trackpoint['mom_err'].append(trackpoint.mom_error().x())
            new_trackpoint['mom_err'].append(trackpoint.mom_error().y())
            new_trackpoint['mom_err'].append(trackpoint.mom_error().z())
            new_trackpoint['grad_err'].append(trackpoint.gradient_error().x())
            new_trackpoint['grad_err'].append(trackpoint.gradient_error().y())
            paired_hits.append((new_trackpoint, virtual_hit))
            data_dict['counters']['found_pairs'] += 1

    found_up = 0
    found_down = 0

    for scifi_hit, virt_hit in paired_hits:
        #    if scifi_hit.tracker() == 0 :
        if new_trackpoint['id'] < 0:
            found_up += 1
        else:
            found_down += 1

    for track in tracks:
        if track.GetAlgorithmUsed() != TRACK_ALGORITHM:
            continue

    data_dict['counters']['found_tracks_up'] += found_up
    data_dict['counters']['found_tracks_down'] += found_down

    return paired_hits
コード例 #10
0
ファイル: hit_types.py プロジェクト: durgarajaram/maus
    def __init__( self, x = 0.0, y = 0.0, z = 0.0, \
                        px = 0.0, py = 0.0, pz = 0.0, station = 0, \
                        time = 0.0, mass = 105.6583715, p_value = 1.0, pid = 13, \
                        weight = 1.0, \
                        scifi_track_point = None, virtual_track_point = None ) :
        """
      Initialise the object. this can be done in three ways:
      1. Specify all components by hand
      2. Build from a sci-fr trackpoint
      3. Build from a virtual trackpoint
    """
        if scifi_track_point is None and virtual_track_point is None:
            self.__x = x
            self.__y = y
            self.__z = z
            self.__px = px
            self.__py = py
            self.__pz = pz
            self.__time = time
            self.__mass = mass
            self.__p_value = p_value
            self.__pid = pid
            self.__station = station
            self.__weight = weight
#      self.__reference = reference

        elif scifi_track_point is not None and virtual_track_point is None:
            self.__x = scifi_track_point.pos().x()
            self.__y = scifi_track_point.pos().y()
            self.__z = scifi_track_point.pos().z()
            self.__px = scifi_track_point.mom().x()
            self.__py = scifi_track_point.mom().y()
            self.__pz = scifi_track_point.mom().z()
            self.__time = time
            self.__mass = mass
            self.__p_value = p_value
            self.__pid = pid
            self.__station = tools.calculate_plane_id(scifi_track_point.tracker(), \
                scifi_track_point.station(), scifi_track_point.plane())
            self.__weight = weight
#      if reference is None :
#        self.__reference = str(scifi_track_point.tracker())+"."+\
#            str(scifi_track_point.station())+"."+str(scifi_track_point.plane())
#      else :
#        self.__reference = reference

        elif scifi_track_point is None and virtual_track_point is not None:
            self.__x = virtual_track_point.GetPosition().x()
            self.__y = virtual_track_point.GetPosition().y()
            self.__z = virtual_track_point.GetPosition().z()
            self.__px = virtual_track_point.GetMomentum().x()
            self.__py = virtual_track_point.GetMomentum().y()
            self.__pz = virtual_track_point.GetMomentum().z()
            self.__time = virtual_track_point.GetTime()
            self.__mass = mass
            self.__p_value = 1.0
            self.__pid = virtual_track_point.GetParticleId()
            self.__station = virtual_track_point.GetStationId()
            self.__weight = weight
#      self.__reference = reference
#      if reference is None :
#        self.__reference = virtual_track_point.GetStationId()
#      else :
#        self.__reference = reference

        else:
            print "WTF!"
            raise ValueError( 'Please supply precisely one of "virtual_track_point"'+\
                       ' or "scifi_track_point", or specify all values explicitly.' )

#    if math.isnan(self.__x) or math.isnan(self.__px) or math.isnan(self.__y) or math.isnan(self.__py) :
        if math.isnan(self.__x) or math.isnan(self.__px) or math.isinf(
                self.__x) or math.isinf(self.__px):
            raise ValueError("NaN Values Received from Scifi Track Point")
コード例 #11
0
def fill_plots_tracks(plot_dict, data_dict, tracks):
    """
    Fill the track specific plots
  """
    track_plots = plot_dict['track_plots']
    reco_plots = plot_dict['recon_plots']
    #  comp_plots = plot_dict['comparison_plots']

    track_plots['tracks_event'].Fill(len(tracks))
    upstream_good = 0
    downstream_good = 0
    straight_counter = 0
    helical_counter = 0

    for track in tracks:
        trackpoints = track.scifitrackpoints()

        if track.P_value() < P_VALUE_CUT:
            continue

        count_trackpoints = 0
        for tp in trackpoints:
            if tp.has_data():
                count_trackpoints += 1
            elif tools.calculate_plane_id( tp.tracker(), tp.station(), tp.plane()) \
                                                                   in IGNORE_PLANES :
                count_trackpoints += 1
        if count_trackpoints < MIN_NUM_TRACKPOINTS:
            continue

        tracker = track.tracker()
        track_plots['tracks_tracker'].Fill(track.tracker())

        shape = track.GetAlgorithmUsed()
        shape_plots = None
        #    pr_track = None

        if shape == 0:
            shape_plots = track_plots['straight']
            #      pr_track = track.pr_track_pointer_straight()
            straight_counter += 1
        elif shape == 1:
            shape_plots = track_plots['helical']
            #      pr_track = track.pr_track_pointer_helical()
            helical_counter += 1

        data_dict['counters']['N_tracks'] += 1

        shape_plots['tracks_tracker'].Fill(track.tracker())
        shape_plots['chi_squared'].Fill(track.chi2())
        shape_plots['chi_squared_ndf'].Fill(track.chi2() / track.ndf())
        shape_plots['p_value'].Fill(track.P_value())
        shape_plots['ndf'].Fill(track.ndf())

        if tracker == 0:
            shape_plots['chi_squared_up'].Fill(track.chi2())
            shape_plots['chi_squared_ndf_up'].Fill(track.chi2() / track.ndf())
            shape_plots['p_value_up'].Fill(track.P_value())
            shape_plots['ndf_up'].Fill(track.ndf())
            data_dict['counters']['N_tracks_up'] += 1
            upstream_good += 1
        elif tracker == 1:
            shape_plots['chi_squared_down'].Fill(track.chi2())
            shape_plots['chi_squared_ndf_down'].Fill(track.chi2() /
                                                     track.ndf())
            shape_plots['p_value_down'].Fill(track.P_value())
            shape_plots['ndf_down'].Fill(track.ndf())
            data_dict['counters']['N_tracks_down'] += 1
            downstream_good += 1

#    pr_track = None

#    if track.GetAlgorithmUsed() == 0 :
#      pr_track = track.pr_track_pointer_straight()
#    elif track.GetAlgorithmUsed() == 1 :
#      pr_track = track.pr_track_pointer_helical()

        for tp in trackpoints:

            station = tp.station()
            plane = tp.plane()
            dir_name = str(tracker) + "." + str(station) + "." + str(plane)
            plane_plots = plot_dict['plane_plots']

            plane_id = ( 1 + plane + ( station - 1) * 3 ) * \
                                                    ( -1.0 if tracker == 0 else 1.0 )
            reco_plots['plane_hits'].Fill(plane_id)

            if tp.has_data():
                pull = tp.pull()
                residual = tp.residual()
                s_residual = tp.smoothed_residual()
                shape_plots['plane_pulls'].Fill(plane_id, pull)
                shape_plots['plane_residuals'].Fill(plane_id, residual)
                shape_plots['plane_s_residuals'].Fill(plane_id, s_residual)

                plane_plots[dir_name]['pull'].Fill(pull)
                plane_plots[dir_name]['s_residual'].Fill(s_residual)

            pos = tp.pos()
            mom = tp.mom()
            plane_plots[dir_name]['xy'].Fill(pos.x(), pos.y())
            plane_plots[dir_name]['pxpy'].Fill(mom.x(), mom.y())
            plane_plots[dir_name]['xpx'].Fill(pos.x(), mom.x())
            plane_plots[dir_name]['ypy'].Fill(pos.y(), mom.y())
            plane_plots[dir_name]['mxmy'].Fill(mom.x() / mom.z(),
                                               mom.y() / mom.z())
            plane_plots[dir_name]['xmx'].Fill(pos.x(), mom.x() / mom.z())
            plane_plots[dir_name]['ymy'].Fill(pos.y(), mom.y() / mom.z())


#      if station == REFERENCE_STATION and plane == REFERENCE_PLANE :
#        prefix = ""
#        if tracker == 0 :
#          prefix = 'up_'
#        elif tracker == 1 :
#          prefix = 'down_'
#        pr_pos = pr_track.get_reference_position()
#        pr_mom = pr_track.get_reference_momentum()
#
#        diff_pos = [ pos.x() - pr_pos.x(), pos.y() - pr_pos.y() ]
#        diff_mom = [ mom.x() - pr_mom.x(), mom.y() - pr_mom.y() ]
#
#        comp_plots[prefix+'patrec_kalman_xy'].Fill( \
#                                                     diff_pos[0], diff_pos[1] )
#        comp_plots[prefix+'patrec_kalman_mxmy'].Fill( \
#                                 diff_mom[0] / mom.z(), diff_mom[1] / mom.z() )
#        comp_plots[prefix+'patrec_kalman_pxpy'].Fill( \
#                                                     diff_mom[0], diff_mom[1] )

        if upstream_good == 1 and downstream_good == 1:
            data_dict['counters']['N_track_pairs'] += 1
        track_plots['trackpoints_track'].Fill(count_trackpoints)
        shape_plots['trackpoints_track'].Fill(count_trackpoints)

    track_plots['straight']['tracks_event'].Fill(straight_counter)
    track_plots['helical']['tracks_event'].Fill(helical_counter)
コード例 #12
0
ファイル: kalman_validation.py プロジェクト: ajdobbs/maus
def make_patrec_mc_pairs(plot_dict, data_dict, virtual_plane_dict, \
                                                        scif_event, mc_event) :
  """
    Make pairs of Pattern Recognition Tracks and MC VirtualHits
  """
  paired_hits = []

  if TRACK_ALGORITHM == 0 :
    tracks = scifi_event.straightprtracks()
  elif TRACK_ALGORITHM == 1 :
    tracks = scifi_event.helicalprtracks()

# Find a reference spacepoint
  for track in tracks :

    pl_id = tools.calculate_plane_id(track.get_tracker(), 1, 0) # Only examine ref plane atm

    expected_virtual_plane = virtual_plane_dict[pl_id][0]

# Find the virtual hit
    for vhit_num in xrange(mc_event.GetVirtualHitsSize()) :
      vhit = mc_event.GetAVirtualHit(vhit_num)
      if vhit.GetStationId() == expected_virtual_plane and \
                                      abs(vhit.GetParticleId()) == MUON_PID :
        virtual_hit = vhit
        break
    else :
      data_dict['counters']['missing_virtual_hits'] += 1
      continue

# Add to list
    new_pr_point = { 'pos' : [], 'mom' : [], 'grad' : [], 'id' : pl_id, 'pull' : 0.0, \
        'pos_err' : [-1.0, -1.0, -1.0], 'mom_err' : [-1.0, -1.0, -1.0], grad_err : [-1.0, -1.0] }

    new_pr_point['pos'].append(track.get_reference_position().x())
    new_pr_point['pos'].append(track.get_reference_position().y())
    new_pr_point['pos'].append(track.get_reference_position().z())
    new_pr_point['mom'].append(track.get_reference_momentum().x())
    new_pr_point['mom'].append(track.get_reference_momentum().y())
    new_pr_point['mom'].append(track.get_reference_momentum().z())
    new_pr_point['grad'].append(track.get_reference_momentum().x()/track.get_reference_momentum.z())
    new_pr_point['grad'].append(track.get_reference_momentum().y()/track.get_reference_momentum.z())
    paired_hits.append((new_pr_point, virtual_hit))
    data_dict['counters']['found_pairs'] += 1

    if track.get_tracker() == 0 :
      plot_dict['statistics']['up_p_value'].Fill(ROOT.TMath.Prob(track.get_chi_squared(), track.get_ndf()))
      plot_dict['statistics']['up_chi_sq'].Fill(track.get_chi_squared())
      plot_dict['statistics']['up_chi_sq_df'].Fill(track.get_chi_squared()/track.get_ndf())
      plot_dict['statistics']['up_ndf'].Fill(track.get_ndf())
    else :
      plot_dict['statistics']['down_p_value'].Fill(ROOT.TMath.Prob(track.get_chi_squared(), track.get_ndf()))
      plot_dict['statistics']['down_chi_sq'].Fill(track.get_chi_squared())
      plot_dict['statistics']['down_chi_sq_df'].Fill(track.get_chi_squared()/track.get_ndf())
      plot_dict['statistics']['down_ndf'].Fill(track.get_ndf())

  found_up = 0
  found_down = 0

  for scifi_hit, virt_hit in paired_hits :
    if scifi_hit['id'] < 0 :
      found_up += 1
    else :
      found_down += 1
    
  data_dict['counters']['found_tracks_up'] += found_up
  data_dict['counters']['found_tracks_down'] += found_down

  return paired_hits
コード例 #13
0
ファイル: kalman_validation.py プロジェクト: ajdobbs/maus
def make_scifi_mc_pairs(plot_dict, data_dict, virtual_plane_dict, \
                                                        scif_event, mc_event) :
  """
    Make pairs of SciFiTrackpoints and MC VirtualHits
  """
  paired_hits = []

  tracks = scifi_event.scifitracks()
  for track in tracks :
    if track.GetAlgorithmUsed() != TRACK_ALGORITHM :
      continue
    if track.tracker() == 0 :
      plot_dict['statistics']['up_p_value'].Fill(track.P_value())
      plot_dict['statistics']['up_chi_sq'].Fill(track.chi2())
      plot_dict['statistics']['up_chi_sq_df'].Fill(track.chi2()/track.ndf())
      plot_dict['statistics']['up_ndf'].Fill(track.ndf())
    else :
      plot_dict['statistics']['down_p_value'].Fill(track.P_value())
      plot_dict['statistics']['down_chi_sq'].Fill(track.chi2())
      plot_dict['statistics']['down_chi_sq_df'].Fill(track.chi2()/track.ndf())
      plot_dict['statistics']['down_ndf'].Fill(track.ndf())

    trackpoints = track.scifitrackpoints()
    trackpoint = None

# Find a reference trackpoint
    for trackpoint in trackpoints :
      if trackpoint.station() == REFERENCE_STATION and trackpoint.plane() == REFERENCE_PLANE :
        pt = math.sqrt( trackpoint.mom().x()**2 + trackpoint.mom().y()**2 )
        pz = trackpoint.mom().z()
        if track.tracker() == 0 :
          plot_dict['statistics']['up_p_value_pt'].Fill(track.P_value(), pt)
          plot_dict['statistics']['up_p_value_pz'].Fill(track.P_value(), math.fabs(pz))
        else :
          plot_dict['statistics']['down_p_value_pt'].Fill(track.P_value(), pt)
          plot_dict['statistics']['down_p_value_pz'].Fill(track.P_value(), math.fabs(pz))

# If no data then give up!
      if REQUIRE_DATA and not trackpoint.has_data() :
        data_dict['counters']['missing_reference_hits'] += 1
        continue

      expected_virtual_plane = virtual_plane_dict[tools.calculate_plane_id( \
            trackpoint.tracker(), trackpoint.station(), trackpoint.plane())][0]


# Find the virtual hit
      for vhit_num in xrange(mc_event.GetVirtualHitsSize()) :
        vhit = mc_event.GetAVirtualHit(vhit_num)
        if vhit.GetStationId() == expected_virtual_plane and \
                                        abs(vhit.GetParticleId()) == MUON_PID :
          virtual_hit = vhit
          break
      else :
        data_dict['counters']['missing_virtual_hits'] += 1
        continue

      momentum = math.sqrt( vhit.GetMomentum().x()**2 + vhit.GetMomentum().y()**2 + vhit.GetMomentum().z()**2 )
      if momentum < MOMENTUM_WINDOW[0] or momentum > MOMENTUM_WINDOW[1] :
        continue

# Add to list
      pl_id = tools.calculate_plane_id( trackpoint.tracker(), trackpoint.station(), trackpoint.plane() )
      if trackpoint.has_data() :
        new_trackpoint = { 'pos' : [], 'mom' : [], 'grad': [], 'id' : pl_id, 'pull' : trackpoint.pull(), 'pos_err' : [], 'mom_err' : [], 'grad_err' : [] }
      else :
        new_trackpoint = { 'pos' : [], 'mom' : [], 'grad': [], 'id' : pl_id, 'pull' : None, 'pos_err' : [], 'mom_err' : [], 'grad_err' : [] }

      new_trackpoint['pos'].append(trackpoint.pos().x())
      new_trackpoint['pos'].append(trackpoint.pos().y())
      new_trackpoint['pos'].append(trackpoint.pos().z())
      new_trackpoint['mom'].append(trackpoint.mom().x())
      new_trackpoint['mom'].append(trackpoint.mom().y())
      new_trackpoint['mom'].append(trackpoint.mom().z())
      new_trackpoint['grad'].append(trackpoint.gradient().x())
      new_trackpoint['grad'].append(trackpoint.gradient().y())
      new_trackpoint['pos_err'].append(trackpoint.pos_error().x())
      new_trackpoint['pos_err'].append(trackpoint.pos_error().y())
      new_trackpoint['pos_err'].append(trackpoint.pos_error().z())
      new_trackpoint['mom_err'].append(trackpoint.mom_error().x())
      new_trackpoint['mom_err'].append(trackpoint.mom_error().y())
      new_trackpoint['mom_err'].append(trackpoint.mom_error().z())
      new_trackpoint['grad_err'].append(trackpoint.gradient_error().x())
      new_trackpoint['grad_err'].append(trackpoint.gradient_error().y())
      paired_hits.append((new_trackpoint, virtual_hit))
      data_dict['counters']['found_pairs'] += 1

  found_up = 0
  found_down = 0

  for scifi_hit, virt_hit in paired_hits :
#    if scifi_hit.tracker() == 0 :
    if new_trackpoint['id'] < 0 :
      found_up += 1
    else :
      found_down += 1


  for track in tracks :
    if track.GetAlgorithmUsed() != TRACK_ALGORITHM :
      continue


    
  data_dict['counters']['found_tracks_up'] += found_up
  data_dict['counters']['found_tracks_down'] += found_down

  return paired_hits
コード例 #14
0
ファイル: hit_types.py プロジェクト: mice-software/maus
  def __init__( self, x = 0.0, y = 0.0, z = 0.0, \
                      px = 0.0, py = 0.0, pz = 0.0, station = 0, \
                      time = 0.0, mass = 105.6583715, p_value = 1.0, pid = 13, \
                      weight = 1.0, \
                      scifi_track_point = None, virtual_track_point = None ) :
    """
      Initialise the object. this can be done in three ways:
      1. Specify all components by hand
      2. Build from a sci-fr trackpoint
      3. Build from a virtual trackpoint
    """
    if scifi_track_point is None and virtual_track_point is None :
      self.__x = x
      self.__y = y
      self.__z = z
      self.__px = px
      self.__py = py
      self.__pz = pz
      self.__time = time
      self.__mass = mass
      self.__p_value = p_value
      self.__pid = pid
      self.__station = station
      self.__weight = weight
#      self.__reference = reference

    elif scifi_track_point is not None and virtual_track_point is None :
      self.__x = scifi_track_point.pos().x()
      self.__y = scifi_track_point.pos().y()
      self.__z = scifi_track_point.pos().z()
      self.__px = scifi_track_point.mom().x()
      self.__py = scifi_track_point.mom().y()
      self.__pz = scifi_track_point.mom().z()
      self.__time = time
      self.__mass = mass
      self.__p_value = p_value
      self.__pid = pid
      self.__station = tools.calculate_plane_id(scifi_track_point.tracker(), \
          scifi_track_point.station(), scifi_track_point.plane())
      self.__weight = weight
#      if reference is None :
#        self.__reference = str(scifi_track_point.tracker())+"."+\
#            str(scifi_track_point.station())+"."+str(scifi_track_point.plane())
#      else :
#        self.__reference = reference

    elif scifi_track_point is None and virtual_track_point is not None :
      self.__x = virtual_track_point.GetPosition().x()
      self.__y = virtual_track_point.GetPosition().y()
      self.__z = virtual_track_point.GetPosition().z()
      self.__px = virtual_track_point.GetMomentum().x()
      self.__py = virtual_track_point.GetMomentum().y()
      self.__pz = virtual_track_point.GetMomentum().z()
      self.__time = virtual_track_point.GetTime()
      self.__mass = mass
      self.__p_value = 1.0
      self.__pid = virtual_track_point.GetParticleId()
      self.__station = virtual_track_point.GetStationId()
      self.__weight = weight
#      self.__reference = reference
#      if reference is None :
#        self.__reference = virtual_track_point.GetStationId()
#      else :
#        self.__reference = reference

    else :
      print "WTF!"
      raise ValueError( 'Please supply precisely one of "virtual_track_point"'+\
                 ' or "scifi_track_point", or specify all values explicitly.' )

#    if math.isnan(self.__x) or math.isnan(self.__px) or math.isnan(self.__y) or math.isnan(self.__py) :
    if math.isnan(self.__x) or math.isnan(self.__px) or math.isinf(self.__x) or math.isinf(self.__px) :
      raise ValueError("NaN Values Received from Scifi Track Point")