def get_effs_per_track_and_p_station(tracks, data, event_ids, stations='12'):

    tracks_eff_before = pandas.DataFrame(columns=['Eff', 'Momentum'])

    for event_id in event_ids:

        if stations == '12':

            labels = tracks[event_id]['labels12']

            event = data[data.EventID == event_id]
            event = event[(event.StatNb == 1) + (event.StatNb == 2)]

        elif stations == '34':

            labels = tracks[event_id]['labels34']

            event = data[data.EventID == event_id]
            event = event[(event.StatNb == 3) + (event.StatNb == 4)]

        true_labels = event.Label.values

        trm = TracksReconstractionMetrics(0.2)
        trm.fit(labels, event)

        eff = trm.efficiencies_

        for num, lab in enumerate(numpy.unique(labels[labels != -1])):

            valid_labs = true_labels[labels == lab]
            unique, counts = numpy.unique(valid_labs[valid_labs != -1],
                                          return_counts=True)

            if len(unique) == 0:
                continue

            true_lab = unique[counts == counts.max()][0]

            track = event[true_labels == true_lab]
            p_one = numpy.sqrt(track.Px.values**2 + track.Py.values**2 +
                               track.Pz.values**2).mean()

            eff_one = eff[num]

            tracks_eff_before.loc[len(tracks_eff_before)] = [eff_one, p_one]

    return tracks_eff_before
def get_effs_per_track_and_p_station(tracks, data, event_ids, stations='12'):

    tracks_eff_before = pandas.DataFrame(columns=['Eff', 'Momentum'])

    for event_id in event_ids:

        if stations == '12':

            labels = tracks[event_id]['labels12']

            event = data[data.EventID == event_id]
            event = event[(event.StatNb == 1) + (event.StatNb == 2)]

        elif stations == '34':

            labels = tracks[event_id]['labels34']

            event = data[data.EventID == event_id]
            event = event[(event.StatNb == 3) + (event.StatNb == 4)]

        true_labels = event.Label.values

        trm = TracksReconstractionMetrics(0.2)
        trm.fit(labels, event)

        eff = trm.efficiencies_


        for num, lab in enumerate(numpy.unique(labels[labels != -1])):

            valid_labs = true_labels[labels == lab]
            unique, counts = numpy.unique(valid_labs[valid_labs!=-1], return_counts=True)

            if len(unique) == 0:
                continue

            true_lab = unique[counts == counts.max()][0]

            track = event[true_labels == true_lab]
            p_one = numpy.sqrt(track.Px.values**2+track.Py.values**2+track.Pz.values**2).mean()

            eff_one = eff[num]

            tracks_eff_before.loc[len(tracks_eff_before)] = [eff_one, p_one]

    return tracks_eff_before
def get_eff_value(params):

    event_id, data, tracks, clf = params

    # Get an event
    event = data[data.EventID == event_id]
    event12 = event[(event.StatNb == 1) + (event.StatNb == 2)]
    event34 = event[(event.StatNb == 3) + (event.StatNb == 4)]

    labels12 = tracks[event_id]['labels12']
    tracks_params12 = tracks[event_id]['params12']
    labels34 = tracks[event_id]['labels34']
    tracks_params34 = tracks[event_id]['params34']

    # Quality metrics of the reconstruction
    trm12 = TracksReconstractionMetrics(0.2, n_tracks=2)
    trm12.fit(labels12, event12)

    # Quality metrics of the reconstruction
    trm34 = TracksReconstractionMetrics(0.2, n_tracks=2)
    trm34.fit(labels34, event34)

    # Combination of the tracks before and after the magnet
    if clf == None:
        comb = Combinator()
    else:
        comb = SuperCombinator(classifier=clf)
    comb.combine(tracks_params12, tracks_params34)

    # Quality of the combination
    cq = CombinatorQuality()
    cq.fit(labels12, labels34, comb.tracks_combinations_, comb.charges_,
           comb.inv_momentums_, event12, event34)

    # Overall quality
    line = numpy.array([
        1, (trm12.recognition_efficiency_y_ == 1) * 1,
        (trm12.recognition_efficiency_stereo_ >= 1.) * 1,
        (trm12.recognition_efficiency_ == 1) * 1,
        (trm34.recognition_efficiency_y_ == 1) * 1,
        (trm34.recognition_efficiency_stereo_ >= 1.) * 1,
        (trm34.recognition_efficiency_ == 1) * 1, (cq.n_combined_ >= 2) * 1,
        (cq.reco_eff_ == 1) * 1
    ]).cumprod()

    return line[-1]
def get_eff_value(params):

    event_id, data, tracks, clf = params

    # Get an event
    event = data[data.EventID == event_id]
    event12 = event[(event.StatNb == 1) + (event.StatNb == 2)]
    event34 = event[(event.StatNb == 3) + (event.StatNb == 4)]


    labels12 = tracks[event_id]['labels12']
    tracks_params12 = tracks[event_id]['params12']
    labels34 = tracks[event_id]['labels34']
    tracks_params34 = tracks[event_id]['params34']


    # Quality metrics of the reconstruction
    trm12 = TracksReconstractionMetrics(0.2, n_tracks=2)
    trm12.fit(labels12, event12)


    # Quality metrics of the reconstruction
    trm34 = TracksReconstractionMetrics(0.2, n_tracks=2)
    trm34.fit(labels34, event34)


    # Combination of the tracks before and after the magnet
    if clf == None:
        comb = Combinator()
    else:
        comb = SuperCombinator(classifier=clf)
    comb.combine(tracks_params12, tracks_params34)


    # Quality of the combination
    cq = CombinatorQuality()
    cq.fit(labels12, labels34, comb.tracks_combinations_, comb.charges_, comb.inv_momentums_, event12, event34)


    # Overall quality
    line = numpy.array([1,
                         (trm12.recognition_efficiency_y_ == 1)*1,
                         (trm12.recognition_efficiency_stereo_ >= 1.)*1,
                         (trm12.recognition_efficiency_ == 1)*1,
                         (trm34.recognition_efficiency_y_ == 1)*1,
                         (trm34.recognition_efficiency_stereo_ >= 1.)*1,
                         (trm34.recognition_efficiency_ == 1)*1,
                         (cq.n_combined_ >= 2)*1,
                         (cq.reco_eff_ == 1)*1]).cumprod()

    return line[-1]