Skip to main content

The PerformanceEntity Object

The PerformanceEntity object is used to represent a single score from the database. It follows a consistent schema outlined here.

Example​

{
"_id": "61f9d73563d97502208221b4",
"rank": 1,
"abrank": 1,
"team": {
"num": "18305",
"name": "Singularity",
"details": "https://ftc-events.firstinspires.org/2021/team/18305"
},
"oprs": {
"opr": 216.7,
"normalized": 216.7,
"non_penalty": 216.7,
"auto": 59.2,
"teleop": 97.5,
"endgame": 60
},
"np": 216.7,
"average": 216.7,
"max_np": 241,
"details": {
"auto": {
"freight": 5
},
"teleop": {
"high": 15,
"mid": 0,
"shared": 0
},
"endgame": {
"ducks": 8,
"shared": 0,
"cap": 0
}
},
"event": {
"name": "Virginia VA Remote Event 1 01/09/22",
"state": "Virginia"
},
"quals_rank": 1,
"avg_rp": 216.7,
"avg_opp": null,
"matches_played": 6,
"event_type": "remote",
"record": {
"w": null,
"l": null,
"t": null
}
}

Explanation​

FieldTypeDescription
_idstringThe MongoDB ObjectID of the score entry. This is the unique identifier of this entry and can be used to differentiate between different entries. It is not preserved between data updates. This means it is fine to use this field for analysis when using the same update, but not between different updates, as the same entry will have a different _id.
ranknumberThe official rank of the team. If the team is tied with another team, both will have the same rank
abranknumberThe unofficial rank of the team based on normal rank and alphabetization. This means no teams will have the same rank, if 2 teams are tied, the team that alphabetically comes first will get the better rank. Error will compound in this field. Because ties are not skipped, the difference between the official rank and this field will grow.

This is helpful in determining percentiles or how many teams are ahead of an entry.
teamobjectThe team object. This is an object with the following fields:
    team.numstringThe team number.
    team.namestringThe team name.
    team.detailsstringThe URL to the team's details page on FIRST's official page.
oprsobjectThe OPRs for the match. This is an object with the following fields:
    oprs.oprnumberThe OPRopr for the match.
    oprs.normalizednumberThe normalized OPRnorm-opr for the match.
    oprs.non_penaltynumberThe non-penalty OPRcoprc for the match.
    oprs.autonumberThe auto OPRcoprc for the match.
    oprs.teleopnumberThe teleop OPRcoprc for the match.
    oprs.endgamenumberThe endgame OPRcoprc for the match.
npnumberThe non-penalty average score for the event.
averagenumberThe average average score for the event (with penalties).
max_npnumberThe maximum non-penalty score for the event.
detailsobjectThe details on the teams performance in the match. This is an object with the following fields:
    details.autoobjectThe auto details for the match. This is an object with the following fields:
        details.auto.freightnumberThe average number of times the team delivered a freight element in auto.
    details.teleopobjectThe teleop details for the match. This is an object with the following fields:
        details.teleop.highnumberThe average number of times the team delivered a freight element in the high tier in teleop.
        details.teleop.midnumberThe average number of times the team delivered a freight element in the low tier in teleop.
        details.teleop.sharednumberThe average number of times the team delivered a freight element in the shared shipping hub in teleop.
    details.endgameobjectThe endgame details for the match. This is an object with the following fields:
        details.endgame.ducksnumberThe average number of times the team delivered a duck in endgame.
        details.endgame.capnumberThe average number of times the team delivered a cap in endgame.
        details.endgame.sharednumberThe average number of times the shared shipping hub was tipped towards the team in endgame.
eventobjectThe event object. This is an object with the following fields:
    event.namestringThe name of the event
    event.statestringThe state of the event. Note some states (i.e. California) are broken up
quals_ranknumberThe rank of the team in the event.
avg_rpnumberThe average RPrp for the team.
avg_oppnumber || nullThe average opponent's score for the team. This will be null if the it was a remote tournament.
matches_playednumberThe number of matches played by the team.
event_typestringThe type of event. This can either local or remote
recordobjectThe record for the team. If this is a remote tournament, each of these will be null. This is an object with the following fields:
    record.wnumber || nullThe number of wins.
    record.lnumber || nullThe number of losses.
    record.tnumber || nullThe number of ties.

  1. RP (Ranking Points): Ranking Points/Total Ranking Points - The first basis for ranking Teams. In remote events, For a single Team competing remotely, the Team's final score for a Match is used as their Ranking Points. In traditional events: For Teams that compete at a traditional Tournament, each Team receives their alliance's final score for a Match as Ranking Points. Total Ranking Points is the sum of the Ranking Points of all non-Surrogate Matches that a Team plays in a Tournament. Please see section 5.0 for further explanation for how this is used to determine a Team's ranking.↩
  2. Similar to OPR but we are instead minimizing the Ax-b linear equation rather than solving for Ax=b in order to apply constraints such as ensuring scores >= 0 and imposing upper bounds on game-specific performance.↩
  3. Normalized/Non-penalty OPR/OPRc: If available, this is the OPR/OPRc when all penalties are removed from matches. For 2021-2022 Freight Frenzy, Normalized OPR includes subtracted penalties.↩
  4. OPR (Offensive Power Rating): A fairly common way to compute team offense in FRC. How OPRs work↩