/// <summary>Calculates the metric stats for this team.</summary> /// <param name="tsopp">The opposing team stats.</param> /// <param name="playoffs"> /// if set to <c>true</c>, the metrics will be calculated based on the team's playoff performances. /// </param> public void CalcMetrics(TeamStats tsopp, bool playoffs = false) { var tempMetricsOwn = new Dictionary<string, double>(); var tempTotalsOwn = new double[Totals.Length]; for (var i = 0; i < Totals.Length; i++) { if (!playoffs) { tempTotalsOwn[i] = Totals[i]; } else { tempTotalsOwn[i] = PlTotals[i]; } } var tempTotalsOpp = new double[tsopp.Totals.Length]; if ((!playoffs && (GetGames() != tsopp.GetGames())) || (playoffs && (GetPlayoffGames() != tsopp.GetPlayoffGames()))) { for (var i = 0; i < tsopp.Totals.Length; i++) { tempTotalsOpp[i] = double.NaN; } } else { for (var i = 0; i < tsopp.Totals.Length; i++) { if (!playoffs) { tempTotalsOpp[i] = tsopp.Totals[i]; } else { tempTotalsOpp[i] = tsopp.PlTotals[i]; } } } var games = (!playoffs) ? GetGames() : GetPlayoffGames(); var poss = calcPossMetric(tempTotalsOwn, tempTotalsOpp); tempMetricsOwn.Add("Poss", poss); tempMetricsOwn.Add("PossPG", poss / games); var tempMetricsOpp = (!playoffs) ? tsopp.Metrics : tsopp.PlMetrics; try { tempMetricsOpp.Add("Poss", poss); } catch (ArgumentException) { tempMetricsOpp["Poss"] = poss; } catch { Console.WriteLine("Possessions metric couldn't be calculated for team " + ID); } var pace = MainWindow.GameLength * ((tempMetricsOwn["Poss"] + tempMetricsOpp["Poss"]) / (2 * (tempTotalsOwn[TAbbrT.MINS]))); tempMetricsOwn.Add("Pace", pace); var ortg = (tempTotalsOwn[TAbbrT.PF] / tempMetricsOwn["Poss"]) * 100; tempMetricsOwn.Add("ORTG", ortg); var drtg = (tempTotalsOwn[TAbbrT.PA] / tempMetricsOwn["Poss"]) * 100; tempMetricsOwn.Add("DRTG", drtg); var astP = (tempTotalsOwn[TAbbrT.AST]) / (tempTotalsOwn[TAbbrT.FGA] + tempTotalsOwn[TAbbrT.FTA] * 0.44 + tempTotalsOwn[TAbbrT.AST] + tempTotalsOwn[TAbbrT.TOS]); tempMetricsOwn.Add("AST%", astP); var drebP = tempTotalsOwn[TAbbrT.DREB] / (tempTotalsOwn[TAbbrT.DREB] + tempTotalsOpp[TAbbrT.OREB]); tempMetricsOwn.Add("DREB%", drebP); var efgP = (tempTotalsOwn[TAbbrT.FGM] + tempTotalsOwn[TAbbrT.TPM] * 0.5) / tempTotalsOwn[TAbbrT.FGA]; tempMetricsOwn.Add("EFG%", efgP); var effD = ortg - drtg; tempMetricsOwn.Add("EFFd", effD); var tor = tempTotalsOwn[TAbbrT.TOS] / (tempTotalsOwn[TAbbrT.FGA] + 0.44 * tempTotalsOwn[TAbbrT.FTA] + tempTotalsOwn[TAbbrT.TOS]); tempMetricsOwn.Add("TOR", tor); var orebP = tempTotalsOwn[TAbbrT.OREB] / (tempTotalsOwn[TAbbrT.OREB] + tempTotalsOpp[TAbbrT.DREB]); tempMetricsOwn.Add("OREB%", orebP); var ftr = tempTotalsOwn[TAbbrT.FTM] / tempTotalsOwn[TAbbrT.FGA]; tempMetricsOwn.Add("FTR", ftr); var tempPerGame = (!playoffs) ? PerGame : PlPerGame; var pwP = (((tempPerGame[TAbbrPG.PPG] - tempPerGame[TAbbrPG.PAPG]) * 2.7) + ((double) MainWindow.SeasonLength / 2)) / MainWindow.SeasonLength; tempMetricsOwn.Add("PW%", pwP); var tsP = tempTotalsOwn[TAbbrT.PF] / (2 * (tempTotalsOwn[TAbbrT.FGA] + 0.44 * tempTotalsOwn[TAbbrT.FTA])); tempMetricsOwn.Add("TS%", tsP); var tpr = tempTotalsOwn[TAbbrT.TPA] / tempTotalsOwn[TAbbrT.FGA]; tempMetricsOwn.Add("3PR", tpr); var pythW = MainWindow.SeasonLength * (Math.Pow(tempTotalsOwn[TAbbrT.PF], 16.5)) / (Math.Pow(tempTotalsOwn[TAbbrT.PF], 16.5) + Math.Pow(tempTotalsOwn[TAbbrT.PA], 16.5)); tempMetricsOwn.Add("PythW", pythW); var pythL = MainWindow.SeasonLength - pythW; tempMetricsOwn.Add("PythL", pythL); var gmsc = tempTotalsOwn[TAbbrT.PF] + 0.4 * tempTotalsOwn[TAbbrT.FGM] - 0.7 * tempTotalsOwn[TAbbrT.FGA] - 0.4 * (tempTotalsOwn[TAbbrT.FTA] - tempTotalsOwn[TAbbrT.FTM]) + 0.7 * tempTotalsOwn[TAbbrT.OREB] + 0.3 * tempTotalsOwn[TAbbrT.DREB] + tempTotalsOwn[TAbbrT.STL] + 0.7 * tempTotalsOwn[TAbbrT.AST] + 0.7 * tempTotalsOwn[TAbbrT.BLK] - 0.4 * tempTotalsOwn[TAbbrT.FOUL] - tempTotalsOwn[TAbbrT.TOS]; tempMetricsOwn.Add("GmSc", gmsc / games); if (!playoffs) { Metrics = new Dictionary<string, double>(tempMetricsOwn); } else { PlMetrics = new Dictionary<string, double>(tempMetricsOwn); } }
/// <summary>Updates the Overview tab and loads the appropriate box scores depending on the timeframe.</summary> private void updateOverviewAndBoxScores() { var id = _curTeam; _curts = _tst[id]; _curtsopp = _tstOpp[id]; _tbsList = new List<TeamBoxScore>(); #region Prepare Team Overview _bseList = MainWindow.BSHist.Where(bse => bse.BS.Team1ID == _curTeam || bse.BS.Team2ID == _curTeam).ToList(); _bseListSea = _bseList.Where(bse => bse.BS.IsPlayoff == false).ToList(); _bseListPl = _bseList.Where(bse => bse.BS.IsPlayoff).ToList(); foreach (var r in _bseList) { var bsr = r.BS.CustomClone(); bsr.PrepareForDisplay(_tst, _curTeam); _tbsList.Add(bsr); } #region Regular Season var dr = _dtOv.NewRow(); dr["Type"] = "Stats"; dr["Games"] = _curts.GetGames(); dr["Wins (W%)"] = _curts.Record[0].ToString(); dr["Losses (Weff)"] = _curts.Record[1].ToString(); dr["PF"] = _curts.Totals[TAbbrT.PF].ToString(); dr["PA"] = _curts.Totals[TAbbrT.PA].ToString(); dr["PD"] = " "; dr["FG"] = _curts.Totals[TAbbrT.FGM].ToString() + "-" + _curts.Totals[TAbbrT.FGA].ToString(); dr["3PT"] = _curts.Totals[TAbbrT.TPM].ToString() + "-" + _curts.Totals[TAbbrT.TPA].ToString(); dr["FT"] = _curts.Totals[TAbbrT.FTM].ToString() + "-" + _curts.Totals[TAbbrT.FTA].ToString(); dr["REB"] = (_curts.Totals[TAbbrT.DREB] + _curts.Totals[TAbbrT.OREB]).ToString(); dr["OREB"] = _curts.Totals[TAbbrT.OREB].ToString(); dr["DREB"] = _curts.Totals[TAbbrT.DREB].ToString(); dr["AST"] = _curts.Totals[TAbbrT.AST].ToString(); dr["TO"] = _curts.Totals[TAbbrT.TOS].ToString(); dr["STL"] = _curts.Totals[TAbbrT.STL].ToString(); dr["BLK"] = _curts.Totals[TAbbrT.BLK].ToString(); dr["FOUL"] = _curts.Totals[TAbbrT.FOUL].ToString(); dr["MINS"] = _curts.Totals[TAbbrT.MINS].ToString(); _dtOv.Rows.Add(dr); dr = _dtOv.NewRow(); _curts.CalcAvg(); // Just to be sure... dr["Type"] = "Averages"; //dr["Games"] = curts.getGames(); dr["Wins (W%)"] = String.Format("{0:F3}", _curts.PerGame[TAbbrPG.Wp]); dr["Losses (Weff)"] = String.Format("{0:F2}", _curts.PerGame[TAbbrPG.Weff]); dr["PF"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.PPG]); dr["PA"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.PAPG]); dr["PD"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.PD]); dr["FG"] = String.Format("{0:F3}", _curts.PerGame[TAbbrPG.FGp]); dr["FGeff"] = String.Format("{0:F2}", _curts.PerGame[TAbbrPG.FGeff]); dr["3PT"] = String.Format("{0:F3}", _curts.PerGame[TAbbrPG.TPp]); dr["3Peff"] = String.Format("{0:F2}", _curts.PerGame[TAbbrPG.TPeff]); dr["FT"] = String.Format("{0:F3}", _curts.PerGame[TAbbrPG.FTp]); dr["FTeff"] = String.Format("{0:F2}", _curts.PerGame[TAbbrPG.FTeff]); dr["REB"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.RPG]); dr["OREB"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.ORPG]); dr["DREB"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.DRPG]); dr["AST"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.APG]); dr["TO"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.TPG]); dr["STL"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.SPG]); dr["BLK"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.BPG]); dr["FOUL"] = String.Format("{0:F1}", _curts.PerGame[TAbbrPG.FPG]); _dtOv.Rows.Add(dr); // Rankings can only be shown based on total stats // ...for now var dr2 = _dtOv.NewRow(); dr2["Type"] = "Rankings"; dr2["Wins (W%)"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.Wp]; dr2["Losses (Weff)"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.Weff]; dr2["PF"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.PPG]; dr2["PA"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.PAPG]; dr2["PD"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.PD]; dr2["FG"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.FGp]; dr2["FGeff"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.FGeff]; dr2["3PT"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.TPp]; dr2["3Peff"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.TPeff]; dr2["FT"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.FTp]; dr2["FTeff"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.FTeff]; dr2["REB"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.RPG]; dr2["OREB"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.ORPG]; dr2["DREB"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.DRPG]; dr2["AST"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.APG]; dr2["TO"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.TPG]; dr2["STL"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.SPG]; dr2["BLK"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.BPG]; dr2["FOUL"] = _seasonRankings.RankingsPerGame[id][TAbbrPG.FPG]; _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Stats"; dr2["Games"] = _curtsopp.GetGames(); dr2["Wins (W%)"] = _curtsopp.Record[0].ToString(); dr2["Losses (Weff)"] = _curtsopp.Record[1].ToString(); dr2["PF"] = _curtsopp.Totals[TAbbrT.PF].ToString(); dr2["PA"] = _curtsopp.Totals[TAbbrT.PA].ToString(); dr2["PD"] = " "; dr2["FG"] = _curtsopp.Totals[TAbbrT.FGM].ToString() + "-" + _curtsopp.Totals[TAbbrT.FGA].ToString(); dr2["3PT"] = _curtsopp.Totals[TAbbrT.TPM].ToString() + "-" + _curtsopp.Totals[TAbbrT.TPA].ToString(); dr2["FT"] = _curtsopp.Totals[TAbbrT.FTM].ToString() + "-" + _curtsopp.Totals[TAbbrT.FTA].ToString(); dr2["REB"] = (_curtsopp.Totals[TAbbrT.DREB] + _curtsopp.Totals[TAbbrT.OREB]).ToString(); dr2["OREB"] = _curtsopp.Totals[TAbbrT.OREB].ToString(); dr2["DREB"] = _curtsopp.Totals[TAbbrT.DREB].ToString(); dr2["AST"] = _curtsopp.Totals[TAbbrT.AST].ToString(); dr2["TO"] = _curtsopp.Totals[TAbbrT.TOS].ToString(); dr2["STL"] = _curtsopp.Totals[TAbbrT.STL].ToString(); dr2["BLK"] = _curtsopp.Totals[TAbbrT.BLK].ToString(); dr2["FOUL"] = _curtsopp.Totals[TAbbrT.FOUL].ToString(); dr2["MINS"] = _curtsopp.Totals[TAbbrT.MINS].ToString(); _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Avg"; dr2["Wins (W%)"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbrPG.Wp]); dr2["Losses (Weff)"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbrPG.Weff]); dr2["PF"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.PPG]); dr2["PA"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.PAPG]); dr2["PD"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.PD]); dr2["FG"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbrPG.FGp]); dr2["FGeff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbrPG.FGeff]); dr2["3PT"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbrPG.TPp]); dr2["3Peff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbrPG.TPeff]); dr2["FT"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbrPG.FTp]); dr2["FTeff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbrPG.FTeff]); dr2["REB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.RPG]); dr2["OREB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.ORPG]); dr2["DREB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.DRPG]); dr2["AST"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.APG]); dr2["TO"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.TPG]); dr2["STL"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.SPG]); dr2["BLK"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.BPG]); dr2["FOUL"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbrPG.FPG]); _dtOv.Rows.Add(dr2); #endregion #region Playoffs _dtOv.Rows.Add(_dtOv.NewRow()); dr = _dtOv.NewRow(); dr["Type"] = "Playoffs"; dr["Games"] = _curts.GetPlayoffGames(); dr["Wins (W%)"] = _curts.PlRecord[0].ToString(); dr["Losses (Weff)"] = _curts.PlRecord[1].ToString(); dr["PF"] = _curts.PlTotals[TAbbrT.PF].ToString(); dr["PA"] = _curts.PlTotals[TAbbrT.PA].ToString(); dr["PD"] = " "; dr["FG"] = _curts.PlTotals[TAbbrT.FGM].ToString() + "-" + _curts.PlTotals[TAbbrT.FGA].ToString(); dr["3PT"] = _curts.PlTotals[TAbbrT.TPM].ToString() + "-" + _curts.PlTotals[TAbbrT.TPA].ToString(); dr["FT"] = _curts.PlTotals[TAbbrT.FTM].ToString() + "-" + _curts.PlTotals[TAbbrT.FTA].ToString(); dr["REB"] = (_curts.PlTotals[TAbbrT.DREB] + _curts.PlTotals[TAbbrT.OREB]).ToString(); dr["OREB"] = _curts.PlTotals[TAbbrT.OREB].ToString(); dr["DREB"] = _curts.PlTotals[TAbbrT.DREB].ToString(); dr["AST"] = _curts.PlTotals[TAbbrT.AST].ToString(); dr["TO"] = _curts.PlTotals[TAbbrT.TOS].ToString(); dr["STL"] = _curts.PlTotals[TAbbrT.STL].ToString(); dr["BLK"] = _curts.PlTotals[TAbbrT.BLK].ToString(); dr["FOUL"] = _curts.PlTotals[TAbbrT.FOUL].ToString(); dr["MINS"] = _curts.PlTotals[TAbbrT.MINS].ToString(); _dtOv.Rows.Add(dr); dr = _dtOv.NewRow(); dr["Type"] = "Pl Avg"; dr["Wins (W%)"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbrPG.Wp]); dr["Losses (Weff)"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbrPG.Weff]); dr["PF"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.PPG]); dr["PA"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.PAPG]); dr["PD"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.PD]); dr["FG"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbrPG.FGp]); dr["FGeff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbrPG.FGeff]); dr["3PT"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbrPG.TPp]); dr["3Peff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbrPG.TPeff]); dr["FT"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbrPG.FTp]); dr["FTeff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbrPG.FTeff]); dr["REB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.RPG]); dr["OREB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.ORPG]); dr["DREB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.DRPG]); dr["AST"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.APG]); dr["TO"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.TPG]); dr["STL"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.SPG]); dr["BLK"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.BPG]); dr["FOUL"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbrPG.FPG]); _dtOv.Rows.Add(dr); dr2 = _dtOv.NewRow(); var count = _tst.Count(z => z.Value.GetPlayoffGames() > 0); dr2["Type"] = "Pl Rank"; dr2["Wins (W%)"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.Wp]; dr2["Losses (Weff)"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.Weff]; dr2["PF"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.PPG]; dr2["PA"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.PAPG]; dr2["PD"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.PD]; dr2["FG"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.FGp]; dr2["FGeff"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.FGeff]; dr2["3PT"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.TPp]; dr2["3Peff"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.TPeff]; dr2["FT"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.FTp]; dr2["FTeff"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.FTeff]; dr2["REB"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.RPG]; dr2["OREB"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.ORPG]; dr2["DREB"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.DRPG]; dr2["AST"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.APG]; dr2["TO"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.TPG]; dr2["STL"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.SPG]; dr2["BLK"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.BPG]; dr2["FOUL"] = _playoffRankings.RankingsPerGame[id][TAbbrPG.FPG]; _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Pl Stats"; dr2["Games"] = _curtsopp.GetPlayoffGames(); dr2["Wins (W%)"] = _curtsopp.PlRecord[0].ToString(); dr2["Losses (Weff)"] = _curtsopp.PlRecord[1].ToString(); dr2["PF"] = _curtsopp.PlTotals[TAbbrT.PF].ToString(); dr2["PA"] = _curtsopp.PlTotals[TAbbrT.PA].ToString(); dr2["PD"] = " "; dr2["FG"] = _curtsopp.PlTotals[TAbbrT.FGM].ToString() + "-" + _curtsopp.PlTotals[TAbbrT.FGA].ToString(); dr2["3PT"] = _curtsopp.PlTotals[TAbbrT.TPM].ToString() + "-" + _curtsopp.PlTotals[TAbbrT.TPA].ToString(); dr2["FT"] = _curtsopp.PlTotals[TAbbrT.FTM].ToString() + "-" + _curtsopp.PlTotals[TAbbrT.FTA].ToString(); dr2["REB"] = (_curtsopp.PlTotals[TAbbrT.DREB] + _curtsopp.PlTotals[TAbbrT.OREB]).ToString(); dr2["OREB"] = _curtsopp.PlTotals[TAbbrT.OREB].ToString(); dr2["DREB"] = _curtsopp.PlTotals[TAbbrT.DREB].ToString(); dr2["AST"] = _curtsopp.PlTotals[TAbbrT.AST].ToString(); dr2["TO"] = _curtsopp.PlTotals[TAbbrT.TOS].ToString(); dr2["STL"] = _curtsopp.PlTotals[TAbbrT.STL].ToString(); dr2["BLK"] = _curtsopp.PlTotals[TAbbrT.BLK].ToString(); dr2["FOUL"] = _curtsopp.PlTotals[TAbbrT.FOUL].ToString(); dr2["MINS"] = _curtsopp.PlTotals[TAbbrT.MINS].ToString(); _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Pl Avg"; dr2["Wins (W%)"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbrPG.Wp]); dr2["Losses (Weff)"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbrPG.Weff]); dr2["PF"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.PPG]); dr2["PA"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.PAPG]); dr2["PD"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.PD]); dr2["FG"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbrPG.FGp]); dr2["FGeff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbrPG.FGeff]); dr2["3PT"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbrPG.TPp]); dr2["3Peff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbrPG.TPeff]); dr2["FT"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbrPG.FTp]); dr2["FTeff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbrPG.FTeff]); dr2["REB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.RPG]); dr2["OREB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.ORPG]); dr2["DREB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.DRPG]); dr2["AST"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.APG]); dr2["TO"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.TPG]); dr2["STL"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.SPG]); dr2["BLK"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.BPG]); dr2["FOUL"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbrPG.FPG]); _dtOv.Rows.Add(dr2); #endregion createViewAndUpdateOverview(); dgvBoxScores.ItemsSource = _tbsList; #endregion _curTSR = new TeamStatsRow(_curts); dgMetrics.ItemsSource = new List<TeamStatsRow> { _curTSR }; updatePBPStats(); }
private void calculate2KRatings(bool playoffs = false) { string gpPctSetting = MainWindow.RatingsGPPctSetting; double gpPCTreq = MainWindow.RatingsGPPctRequired; string mpgSetting = MainWindow.RatingsMPGSetting; float MPGreq = MainWindow.RatingsMPGRequired; uint pGP = GP; var team = new TeamStats(); uint tGP = 0; try { team = MainWindow.TST.Single(ts => ts.Value.ID == TeamF).Value; tGP = playoffs ? team.GetPlayoffGames() : team.GetGames(); } catch (InvalidOperationException) { gpPctSetting = "-1"; } if ((gpPctSetting != "-1" && (double) (pGP*100)/tGP < gpPCTreq) || (mpgSetting != "-1" && MPG < MPGreq)) { reRFT = -1; reRPass = -1; reRBlock = -1; reRSteal = -1; reROffRbd = -1; reRDefRbd = -1; reTShotTnd = -1; reTDrawFoul = -1; reTTouch = -1; reTCommitFl = -1; return; } try { reRFT = Convert.ToInt32(100*FTp); if (reRFT > 99) { reRFT = 99; } } catch { reRFT = -1; } try { double ASTp100 = ASTp*100; reRPass = Convert.ToInt32(31.1901795687457 + 1.36501096444891*ASTp100 + 4.34894327991171/(-0.702541953738967 - ASTp100)); if (reRPass > 99) { reRPass = 99; } } catch { reRPass = -1; } try { double BLKp100 = BLKp*100; reRBlock = Convert.ToInt32(25.76 + 17.03*BLKp100 + 0.8376*Math.Pow(BLKp100, 3) - 3.195*Math.Pow(BLKp100, 2) - 0.07319*Math.Pow(BLKp100, 4)); if (reRBlock > 99) { reRBlock = 99; } } catch { reRBlock = -1; } try { double STLp100 = STLp*100; reRSteal = Convert.ToInt32(29.92 + 14.57*STLp100 - 0.1509*Math.Pow(STLp100, 2)); if (reRSteal > 99) { reRSteal = 99; } } catch { reRSteal = -1; } try { double OREBp100 = OREBp*100; reROffRbd = Convert.ToInt32(24.67 + 3.864*OREBp100 + 0.3523*Math.Pow(OREBp100, 2) + 0.0007358*Math.Pow(OREBp100, 4) - 0.02796*Math.Pow(OREBp100, 3)); if (reROffRbd > 99) { reROffRbd = 99; } } catch { reROffRbd = -1; } try { double DREBp100 = DREBp*100; reRDefRbd = Convert.ToInt32(25 + 2.5*DREBp100); if (reRDefRbd > 99) { reRDefRbd = 99; } } catch { reRDefRbd = -1; } try { reTShotTnd = Convert.ToInt32(2 + 4*FGAPG); if (reTShotTnd > 90) { reTShotTnd = 90; } } catch { reTShotTnd = -1; } try { reTDrawFoul = Convert.ToInt32(FTAR*10); if (reTDrawFoul > 99) { reTDrawFoul = 99; } } catch { reTDrawFoul = -1; } try { double FGAR = (double) FGA/MINS*36; int touchTotal = Convert.ToInt32(FGAR + FTAR + TOR + ASTR); reTTouch = Convert.ToInt32(3.141*Math.Pow(touchTotal, 2)/(1.178 + touchTotal)); if (reTTouch > 99) { reTTouch = 99; } } catch { reTTouch = -1; } try { reTCommitFl = Convert.ToInt32((double) FOUL/MINS*36*10); if (reTCommitFl > 99) { reTCommitFl = 99; } } catch { reTCommitFl = -1; } }
/// <summary>Creates a data row from a TeamStats instance.</summary> /// <param name="ts">The TeamStats instance.</param> /// <param name="dr">The data row to be edited.</param> /// <param name="title">The title for the row's Type or Name column.</param> /// <param name="playoffs"> /// if set to <c>true</c>, the row will present the team's playoff stats; otherwise, the regular season's. /// </param> private static void createDataRowFromTeamStats(TeamStats ts, ref DataRow dr, string title, bool playoffs = false) { try { dr["Type"] = title; } catch { dr["Name"] = title; } float[] PerGame; if (!playoffs) { PerGame = ts.PerGame; dr["Games"] = ts.GetGames(); dr["Wins"] = ts.Record[0].ToString(); dr["Losses"] = ts.Record[1].ToString(); } else { PerGame = ts.PlPerGame; dr["Games"] = ts.GetPlayoffGames(); dr["Wins"] = ts.PlRecord[0].ToString(); dr["Losses"] = ts.PlRecord[1].ToString(); } dr["W%"] = String.Format("{0:F3}", PerGame[TAbbrPG.Wp]); dr["Weff"] = String.Format("{0:F2}", PerGame[TAbbrPG.Weff]); dr["PF"] = String.Format("{0:F1}", PerGame[TAbbrPG.PPG]); dr["PA"] = String.Format("{0:F1}", PerGame[TAbbrPG.PAPG]); dr["PD"] = String.Format("{0:F1}", PerGame[TAbbrPG.PD]); dr["FG"] = String.Format("{0:F3}", PerGame[TAbbrPG.FGp]); dr["FGeff"] = String.Format("{0:F2}", PerGame[TAbbrPG.FGeff]); dr["3PT"] = String.Format("{0:F3}", PerGame[TAbbrPG.TPp]); dr["3Peff"] = String.Format("{0:F2}", PerGame[TAbbrPG.TPeff]); dr["FT"] = String.Format("{0:F3}", PerGame[TAbbrPG.FTp]); dr["FTeff"] = String.Format("{0:F2}", PerGame[TAbbrPG.FTeff]); dr["REB"] = String.Format("{0:F1}", PerGame[TAbbrPG.RPG]); dr["OREB"] = String.Format("{0:F1}", PerGame[TAbbrPG.ORPG]); dr["DREB"] = String.Format("{0:F1}", PerGame[TAbbrPG.DRPG]); dr["AST"] = String.Format("{0:F1}", PerGame[TAbbrPG.APG]); dr["TO"] = String.Format("{0:F1}", PerGame[TAbbrPG.TPG]); dr["STL"] = String.Format("{0:F1}", PerGame[TAbbrPG.SPG]); dr["BLK"] = String.Format("{0:F1}", PerGame[TAbbrPG.BPG]); dr["FOUL"] = String.Format("{0:F1}", PerGame[TAbbrPG.FPG]); dr["MINS"] = String.Format("{0:F1}", PerGame[TAbbrPG.MPG]); }
/// <summary> /// Updates the Overview tab and loads the appropriate box scores depending on the timeframe. /// </summary> private void updateOverviewAndBoxScores() { int id = _curTeam; _curts = _tst[id]; _curtsopp = _tstOpp[id]; _bsrList = new List<TeamBoxScore>(); #region Prepare Team Overview IEnumerable<BoxScoreEntry> boxScoreEntries = MainWindow.BSHist.Where(bse => bse.BS.Team1ID == _curTeam || bse.BS.Team2ID == _curTeam); foreach (BoxScoreEntry r in boxScoreEntries) { TeamBoxScore bsr = r.BS.DeepClone(); bsr.PrepareForDisplay(_tst, _curTeam); _bsrList.Add(bsr); } #region Regular Season DataRow dr = _dtOv.NewRow(); dr["Type"] = "Stats"; dr["Games"] = _curts.GetGames(); dr["Wins (W%)"] = _curts.Record[0].ToString(); dr["Losses (Weff)"] = _curts.Record[1].ToString(); dr["PF"] = _curts.Totals[TAbbr.PF].ToString(); dr["PA"] = _curts.Totals[TAbbr.PA].ToString(); dr["PD"] = " "; dr["FG"] = _curts.Totals[TAbbr.FGM].ToString() + "-" + _curts.Totals[TAbbr.FGA].ToString(); dr["3PT"] = _curts.Totals[TAbbr.TPM].ToString() + "-" + _curts.Totals[TAbbr.TPA].ToString(); dr["FT"] = _curts.Totals[TAbbr.FTM].ToString() + "-" + _curts.Totals[TAbbr.FTA].ToString(); dr["REB"] = (_curts.Totals[TAbbr.DREB] + _curts.Totals[TAbbr.OREB]).ToString(); dr["OREB"] = _curts.Totals[TAbbr.OREB].ToString(); dr["DREB"] = _curts.Totals[TAbbr.DREB].ToString(); dr["AST"] = _curts.Totals[TAbbr.AST].ToString(); dr["TO"] = _curts.Totals[TAbbr.TOS].ToString(); dr["STL"] = _curts.Totals[TAbbr.STL].ToString(); dr["BLK"] = _curts.Totals[TAbbr.BLK].ToString(); dr["FOUL"] = _curts.Totals[TAbbr.FOUL].ToString(); dr["MINS"] = _curts.Totals[TAbbr.MINS].ToString(); _dtOv.Rows.Add(dr); dr = _dtOv.NewRow(); _curts.CalcAvg(); // Just to be sure... dr["Type"] = "Averages"; //dr["Games"] = curts.getGames(); dr["Wins (W%)"] = String.Format("{0:F3}", _curts.PerGame[TAbbr.Wp]); dr["Losses (Weff)"] = String.Format("{0:F2}", _curts.PerGame[TAbbr.Weff]); dr["PF"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.PPG]); dr["PA"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.PAPG]); dr["PD"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.PD]); dr["FG"] = String.Format("{0:F3}", _curts.PerGame[TAbbr.FGp]); dr["FGeff"] = String.Format("{0:F2}", _curts.PerGame[TAbbr.FGeff]); dr["3PT"] = String.Format("{0:F3}", _curts.PerGame[TAbbr.TPp]); dr["3Peff"] = String.Format("{0:F2}", _curts.PerGame[TAbbr.TPeff]); dr["FT"] = String.Format("{0:F3}", _curts.PerGame[TAbbr.FTp]); dr["FTeff"] = String.Format("{0:F2}", _curts.PerGame[TAbbr.FTeff]); dr["REB"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.RPG]); dr["OREB"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.ORPG]); dr["DREB"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.DRPG]); dr["AST"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.APG]); dr["TO"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.TPG]); dr["STL"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.SPG]); dr["BLK"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.BPG]); dr["FOUL"] = String.Format("{0:F1}", _curts.PerGame[TAbbr.FPG]); _dtOv.Rows.Add(dr); // Rankings can only be shown based on total stats // ...for now DataRow dr2; dr2 = _dtOv.NewRow(); dr2["Type"] = "Rankings"; dr2["Wins (W%)"] = _seasonRankings.RankingsPerGame[id][TAbbr.Wp]; dr2["Losses (Weff)"] = _seasonRankings.RankingsPerGame[id][TAbbr.Weff]; dr2["PF"] = _seasonRankings.RankingsPerGame[id][TAbbr.PPG]; dr2["PA"] = cmbTeam.Items.Count + 1 - _seasonRankings.RankingsPerGame[id][TAbbr.PAPG]; dr2["PD"] = _seasonRankings.RankingsPerGame[id][TAbbr.PD]; dr2["FG"] = _seasonRankings.RankingsPerGame[id][TAbbr.FGp]; dr2["FGeff"] = _seasonRankings.RankingsPerGame[id][TAbbr.FGeff]; dr2["3PT"] = _seasonRankings.RankingsPerGame[id][TAbbr.TPp]; dr2["3Peff"] = _seasonRankings.RankingsPerGame[id][TAbbr.TPeff]; dr2["FT"] = _seasonRankings.RankingsPerGame[id][TAbbr.FTp]; dr2["FTeff"] = _seasonRankings.RankingsPerGame[id][TAbbr.FTeff]; dr2["REB"] = _seasonRankings.RankingsPerGame[id][TAbbr.RPG]; dr2["OREB"] = _seasonRankings.RankingsPerGame[id][TAbbr.ORPG]; dr2["DREB"] = _seasonRankings.RankingsPerGame[id][TAbbr.DRPG]; dr2["AST"] = _seasonRankings.RankingsPerGame[id][TAbbr.APG]; dr2["TO"] = cmbTeam.Items.Count + 1 - _seasonRankings.RankingsPerGame[id][TAbbr.TPG]; dr2["STL"] = _seasonRankings.RankingsPerGame[id][TAbbr.SPG]; dr2["BLK"] = _seasonRankings.RankingsPerGame[id][TAbbr.BPG]; dr2["FOUL"] = cmbTeam.Items.Count + 1 - _seasonRankings.RankingsPerGame[id][TAbbr.FPG]; _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Stats"; dr2["Games"] = _curtsopp.GetGames(); dr2["Wins (W%)"] = _curtsopp.Record[0].ToString(); dr2["Losses (Weff)"] = _curtsopp.Record[1].ToString(); dr2["PF"] = _curtsopp.Totals[TAbbr.PF].ToString(); dr2["PA"] = _curtsopp.Totals[TAbbr.PA].ToString(); dr2["PD"] = " "; dr2["FG"] = _curtsopp.Totals[TAbbr.FGM].ToString() + "-" + _curtsopp.Totals[TAbbr.FGA].ToString(); dr2["3PT"] = _curtsopp.Totals[TAbbr.TPM].ToString() + "-" + _curtsopp.Totals[TAbbr.TPA].ToString(); dr2["FT"] = _curtsopp.Totals[TAbbr.FTM].ToString() + "-" + _curtsopp.Totals[TAbbr.FTA].ToString(); dr2["REB"] = (_curtsopp.Totals[TAbbr.DREB] + _curtsopp.Totals[TAbbr.OREB]).ToString(); dr2["OREB"] = _curtsopp.Totals[TAbbr.OREB].ToString(); dr2["DREB"] = _curtsopp.Totals[TAbbr.DREB].ToString(); dr2["AST"] = _curtsopp.Totals[TAbbr.AST].ToString(); dr2["TO"] = _curtsopp.Totals[TAbbr.TOS].ToString(); dr2["STL"] = _curtsopp.Totals[TAbbr.STL].ToString(); dr2["BLK"] = _curtsopp.Totals[TAbbr.BLK].ToString(); dr2["FOUL"] = _curtsopp.Totals[TAbbr.FOUL].ToString(); dr2["MINS"] = _curtsopp.Totals[TAbbr.MINS].ToString(); _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Avg"; dr2["Wins (W%)"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbr.Wp]); dr2["Losses (Weff)"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbr.Weff]); dr2["PF"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.PPG]); dr2["PA"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.PAPG]); dr2["PD"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.PD]); dr2["FG"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbr.FGp]); dr2["FGeff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbr.FGeff]); dr2["3PT"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbr.TPp]); dr2["3Peff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbr.TPeff]); dr2["FT"] = String.Format("{0:F3}", _curtsopp.PerGame[TAbbr.FTp]); dr2["FTeff"] = String.Format("{0:F2}", _curtsopp.PerGame[TAbbr.FTeff]); dr2["REB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.RPG]); dr2["OREB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.ORPG]); dr2["DREB"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.DRPG]); dr2["AST"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.APG]); dr2["TO"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.TPG]); dr2["STL"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.SPG]); dr2["BLK"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.BPG]); dr2["FOUL"] = String.Format("{0:F1}", _curtsopp.PerGame[TAbbr.FPG]); _dtOv.Rows.Add(dr2); #endregion #region Playoffs _dtOv.Rows.Add(_dtOv.NewRow()); dr = _dtOv.NewRow(); dr["Type"] = "Playoffs"; dr["Games"] = _curts.GetPlayoffGames(); dr["Wins (W%)"] = _curts.PlRecord[0].ToString(); dr["Losses (Weff)"] = _curts.PlRecord[1].ToString(); dr["PF"] = _curts.PlTotals[TAbbr.PF].ToString(); dr["PA"] = _curts.PlTotals[TAbbr.PA].ToString(); dr["PD"] = " "; dr["FG"] = _curts.PlTotals[TAbbr.FGM].ToString() + "-" + _curts.PlTotals[TAbbr.FGA].ToString(); dr["3PT"] = _curts.PlTotals[TAbbr.TPM].ToString() + "-" + _curts.PlTotals[TAbbr.TPA].ToString(); dr["FT"] = _curts.PlTotals[TAbbr.FTM].ToString() + "-" + _curts.PlTotals[TAbbr.FTA].ToString(); dr["REB"] = (_curts.PlTotals[TAbbr.DREB] + _curts.PlTotals[TAbbr.OREB]).ToString(); dr["OREB"] = _curts.PlTotals[TAbbr.OREB].ToString(); dr["DREB"] = _curts.PlTotals[TAbbr.DREB].ToString(); dr["AST"] = _curts.PlTotals[TAbbr.AST].ToString(); dr["TO"] = _curts.PlTotals[TAbbr.TOS].ToString(); dr["STL"] = _curts.PlTotals[TAbbr.STL].ToString(); dr["BLK"] = _curts.PlTotals[TAbbr.BLK].ToString(); dr["FOUL"] = _curts.PlTotals[TAbbr.FOUL].ToString(); dr["MINS"] = _curts.PlTotals[TAbbr.MINS].ToString(); _dtOv.Rows.Add(dr); dr = _dtOv.NewRow(); dr["Type"] = "Pl Avg"; dr["Wins (W%)"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbr.Wp]); dr["Losses (Weff)"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbr.Weff]); dr["PF"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.PPG]); dr["PA"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.PAPG]); dr["PD"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.PD]); dr["FG"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbr.FGp]); dr["FGeff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbr.FGeff]); dr["3PT"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbr.TPp]); dr["3Peff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbr.TPeff]); dr["FT"] = String.Format("{0:F3}", _curts.PlPerGame[TAbbr.FTp]); dr["FTeff"] = String.Format("{0:F2}", _curts.PlPerGame[TAbbr.FTeff]); dr["REB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.RPG]); dr["OREB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.ORPG]); dr["DREB"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.DRPG]); dr["AST"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.APG]); dr["TO"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.TPG]); dr["STL"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.SPG]); dr["BLK"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.BPG]); dr["FOUL"] = String.Format("{0:F1}", _curts.PlPerGame[TAbbr.FPG]); _dtOv.Rows.Add(dr); dr2 = _dtOv.NewRow(); int count = _tst.Count(z => z.Value.GetPlayoffGames() > 0); dr2["Type"] = "Pl Rank"; dr2["Wins (W%)"] = _playoffRankings.RankingsPerGame[id][TAbbr.Wp]; dr2["Losses (Weff)"] = _playoffRankings.RankingsPerGame[id][TAbbr.Weff]; dr2["PF"] = _playoffRankings.RankingsPerGame[id][TAbbr.PPG]; dr2["PA"] = count + 1 - _playoffRankings.RankingsPerGame[id][TAbbr.PAPG]; dr2["PD"] = _playoffRankings.RankingsPerGame[id][TAbbr.PD]; dr2["FG"] = _playoffRankings.RankingsPerGame[id][TAbbr.FGp]; dr2["FGeff"] = _playoffRankings.RankingsPerGame[id][TAbbr.FGeff]; dr2["3PT"] = _playoffRankings.RankingsPerGame[id][TAbbr.TPp]; dr2["3Peff"] = _playoffRankings.RankingsPerGame[id][TAbbr.TPeff]; dr2["FT"] = _playoffRankings.RankingsPerGame[id][TAbbr.FTp]; dr2["FTeff"] = _playoffRankings.RankingsPerGame[id][TAbbr.FTeff]; dr2["REB"] = _playoffRankings.RankingsPerGame[id][TAbbr.RPG]; dr2["OREB"] = _playoffRankings.RankingsPerGame[id][TAbbr.ORPG]; dr2["DREB"] = _playoffRankings.RankingsPerGame[id][TAbbr.DRPG]; dr2["AST"] = _playoffRankings.RankingsPerGame[id][TAbbr.APG]; dr2["TO"] = count + 1 - _playoffRankings.RankingsPerGame[id][TAbbr.TPG]; dr2["STL"] = _playoffRankings.RankingsPerGame[id][TAbbr.SPG]; dr2["BLK"] = _playoffRankings.RankingsPerGame[id][TAbbr.BPG]; dr2["FOUL"] = count + 1 - _playoffRankings.RankingsPerGame[id][TAbbr.FPG]; _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Pl Stats"; dr2["Games"] = _curtsopp.GetPlayoffGames(); dr2["Wins (W%)"] = _curtsopp.PlRecord[0].ToString(); dr2["Losses (Weff)"] = _curtsopp.PlRecord[1].ToString(); dr2["PF"] = _curtsopp.PlTotals[TAbbr.PF].ToString(); dr2["PA"] = _curtsopp.PlTotals[TAbbr.PA].ToString(); dr2["PD"] = " "; dr2["FG"] = _curtsopp.PlTotals[TAbbr.FGM].ToString() + "-" + _curtsopp.PlTotals[TAbbr.FGA].ToString(); dr2["3PT"] = _curtsopp.PlTotals[TAbbr.TPM].ToString() + "-" + _curtsopp.PlTotals[TAbbr.TPA].ToString(); dr2["FT"] = _curtsopp.PlTotals[TAbbr.FTM].ToString() + "-" + _curtsopp.PlTotals[TAbbr.FTA].ToString(); dr2["REB"] = (_curtsopp.PlTotals[TAbbr.DREB] + _curtsopp.PlTotals[TAbbr.OREB]).ToString(); dr2["OREB"] = _curtsopp.PlTotals[TAbbr.OREB].ToString(); dr2["DREB"] = _curtsopp.PlTotals[TAbbr.DREB].ToString(); dr2["AST"] = _curtsopp.PlTotals[TAbbr.AST].ToString(); dr2["TO"] = _curtsopp.PlTotals[TAbbr.TOS].ToString(); dr2["STL"] = _curtsopp.PlTotals[TAbbr.STL].ToString(); dr2["BLK"] = _curtsopp.PlTotals[TAbbr.BLK].ToString(); dr2["FOUL"] = _curtsopp.PlTotals[TAbbr.FOUL].ToString(); dr2["MINS"] = _curtsopp.PlTotals[TAbbr.MINS].ToString(); _dtOv.Rows.Add(dr2); dr2 = _dtOv.NewRow(); dr2["Type"] = "Opp Pl Avg"; dr2["Wins (W%)"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbr.Wp]); dr2["Losses (Weff)"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbr.Weff]); dr2["PF"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.PPG]); dr2["PA"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.PAPG]); dr2["PD"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.PD]); dr2["FG"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbr.FGp]); dr2["FGeff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbr.FGeff]); dr2["3PT"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbr.TPp]); dr2["3Peff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbr.TPeff]); dr2["FT"] = String.Format("{0:F3}", _curtsopp.PlPerGame[TAbbr.FTp]); dr2["FTeff"] = String.Format("{0:F2}", _curtsopp.PlPerGame[TAbbr.FTeff]); dr2["REB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.RPG]); dr2["OREB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.ORPG]); dr2["DREB"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.DRPG]); dr2["AST"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.APG]); dr2["TO"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.TPG]); dr2["STL"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.SPG]); dr2["BLK"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.BPG]); dr2["FOUL"] = String.Format("{0:F1}", _curtsopp.PlPerGame[TAbbr.FPG]); _dtOv.Rows.Add(dr2); #endregion createViewAndUpdateOverview(); dgvBoxScores.ItemsSource = _bsrList; #endregion }
/// <summary>Calculates the Metric Stats for this Player</summary> /// <param name="ts">The player's team's stats</param> /// <param name="tsopp">The player's team's opponents' stats</param> /// <param name="ls">The total league stats</param> /// <param name="leagueOv">Whether CalcMetrics is being called from the League Overview screen</param> /// <param name="GmScOnly">Whether to only calculate the GmSc metric.</param> /// <param name="playoffs">Whether to calculate the metrics based on the playoffs stats.</param> public void CalcMetrics( TeamStats ts, TeamStats tsopp, TeamStats ls, bool leagueOv = false, bool GmScOnly = false, bool playoffs = false) { var pstats = new double[Totals.Length]; for (var i = 0; i < Totals.Length; i++) { if (!playoffs) { pstats[i] = Totals[i]; } else { pstats[i] = PlTotals[i]; } } var tstats = new double[ts.Totals.Length]; for (var i = 0; i < ts.Totals.Length; i++) { if (!playoffs) { tstats[i] = ts.Totals[i]; } else { tstats[i] = ts.PlTotals[i]; } } var toppstats = new double[tsopp.Totals.Length]; for (var i = 0; i < tsopp.Totals.Length; i++) { if (!playoffs) { toppstats[i] = tsopp.Totals[i]; } else { toppstats[i] = tsopp.PlTotals[i]; } } var lstats = new double[ls.Totals.Length]; for (var i = 0; i < ls.Totals.Length; i++) { if (!playoffs) { lstats[i] = ls.Totals[i]; } else { lstats[i] = ls.PlTotals[i]; } } var pREB = pstats[PAbbrT.OREB] + pstats[PAbbrT.DREB]; var tREB = tstats[TAbbrT.OREB] + tstats[TAbbrT.DREB]; var tempTeamMetricsOwn = !playoffs ? ts.Metrics : ts.PlMetrics; var tempMetrics = new Dictionary<string, double>(PlayerStatsHelper.MetricsDict); var gmSc = pstats[PAbbrT.PTS] + 0.4 * pstats[PAbbrT.FGM] - 0.7 * pstats[PAbbrT.FGA] - 0.4 * (pstats[PAbbrT.FTA] - pstats[PAbbrT.FTM]) + 0.7 * pstats[PAbbrT.OREB] + 0.3 * pstats[PAbbrT.DREB] + pstats[PAbbrT.STL] + 0.7 * pstats[PAbbrT.AST] + 0.7 * pstats[PAbbrT.BLK] - 0.4 * pstats[PAbbrT.FOUL] - pstats[PAbbrT.TOS]; tempMetrics["GmSc"] = gmSc / pstats[PAbbrT.GP]; var gmScE = 36 * (1 / pstats[PAbbrT.MINS]) * gmSc; tempMetrics["GmScE"] = gmScE; if (!GmScOnly) { #region Metrics that do not require Opponent Stats var ASTp = pstats[PAbbrT.AST] / (((pstats[PAbbrT.MINS] / (tstats[TAbbrT.MINS])) * tstats[TAbbrT.FGM]) - pstats[PAbbrT.FGM]); tempMetrics["AST%"] = ASTp; var EFGp = (pstats[PAbbrT.FGM] + 0.5 * pstats[PAbbrT.TPM]) / pstats[PAbbrT.FGA]; tempMetrics["EFG%"] = EFGp; var tempTeamMetricsOpp = !playoffs ? tsopp.Metrics : tsopp.PlMetrics; var STLp = (pstats[PAbbrT.STL] * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * tempTeamMetricsOpp["Poss"]); tempMetrics["STL%"] = STLp; var TOp = pstats[PAbbrT.TOS] / (pstats[PAbbrT.FGA] + 0.44 * pstats[PAbbrT.FTA] + pstats[PAbbrT.TOS]); tempMetrics["TO%"] = TOp; var TSp = pstats[PAbbrT.PTS] / (2 * (pstats[PAbbrT.FGA] + 0.44 * pstats[PAbbrT.FTA])); tempMetrics["TS%"] = TSp; var USGp = ((pstats[PAbbrT.FGA] + 0.44 * pstats[PAbbrT.FTA] + pstats[PAbbrT.TOS]) * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * (tstats[TAbbrT.FGA] + 0.44 * tstats[TAbbrT.FTA] + tstats[TAbbrT.TOS])); tempMetrics["USG%"] = USGp; calculateRates(pstats, ref tempMetrics); // PER preparations var lREB = lstats[TAbbrT.OREB] + lstats[TAbbrT.DREB]; var factor = (2 / 3) - (0.5 * (lstats[TAbbrT.AST] / lstats[TAbbrT.FGM])) / (2 * (lstats[TAbbrT.FGM] / lstats[TAbbrT.FTM])); var VOP = lstats[TAbbrT.PF] / (lstats[TAbbrT.FGA] - lstats[TAbbrT.OREB] + lstats[TAbbrT.TOS] + 0.44 * lstats[TAbbrT.FTA]); var lDRBp = lstats[TAbbrT.DREB] / lREB; var uPER = (1 / pstats[PAbbrT.MINS]) * (pstats[PAbbrT.TPM] + (2 / 3) * pstats[PAbbrT.AST] + (2 - factor * (tstats[TAbbrT.AST] / tstats[TAbbrT.FGM])) * pstats[PAbbrT.FGM] + (pstats[PAbbrT.FTM] * 0.5 * (1 + (1 - (tstats[TAbbrT.AST] / tstats[TAbbrT.FGM])) + (2 / 3) * (tstats[TAbbrT.AST] / tstats[TAbbrT.FGM]))) - VOP * pstats[PAbbrT.TOS] - VOP * lDRBp * (pstats[PAbbrT.FGA] - pstats[PAbbrT.FGM]) - VOP * 0.44 * (0.44 + (0.56 * lDRBp)) * (pstats[PAbbrT.FTA] - pstats[PAbbrT.FTM]) + VOP * (1 - lDRBp) * (pREB - pstats[PAbbrT.OREB]) + VOP * lDRBp * pstats[PAbbrT.OREB] + VOP * pstats[PAbbrT.STL] + VOP * lDRBp * pstats[PAbbrT.BLK] - pstats[PAbbrT.FOUL] * ((lstats[TAbbrT.FTM] / lstats[TAbbrT.FOUL]) - 0.44 * (lstats[TAbbrT.FTA] / lstats[TAbbrT.FOUL]) * VOP)); tempMetrics["EFF"] = uPER * 100; #endregion #region Metrics that require Opponents stats if (ts.GetGames() == tsopp.GetGames()) { var BLKp = (pstats[PAbbrT.BLK] * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * (toppstats[TAbbrT.FGA] - toppstats[TAbbrT.TPA])); var DRBp = (pstats[PAbbrT.DREB] * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * (tstats[TAbbrT.DREB] + toppstats[TAbbrT.OREB])); var ORBp = (pstats[PAbbrT.OREB] * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * (tstats[TAbbrT.OREB] + toppstats[TAbbrT.DREB])); var toppREB = toppstats[TAbbrT.OREB] + toppstats[TAbbrT.DREB]; var REBp = (pREB * (tstats[TAbbrT.MINS])) / (pstats[PAbbrT.MINS] * (tREB + toppREB)); #region Metrics that require league stats double aPER; double PPR; if (ls.Name != "$$Empty") { //double paceAdj = ls.temp_metrics["Pace"]/ts.temp_metrics["Pace"]; double estPaceAdj; if (!playoffs) { estPaceAdj = 2 * ls.PerGame[TAbbrPG.PPG] / (ts.PerGame[TAbbrPG.PPG] + tsopp.PerGame[TAbbrPG.PPG]); } else { estPaceAdj = 2 * ls.PlPerGame[TAbbrPG.PPG] / (ts.PlPerGame[TAbbrPG.PPG] + tsopp.PlPerGame[TAbbrPG.PPG]); } aPER = estPaceAdj * uPER; PPR = 100 * estPaceAdj * (((pstats[PAbbrT.AST] * 2 / 3) - pstats[PAbbrT.TOS]) / pstats[PAbbrT.MINS]); } else { aPER = Double.NaN; PPR = Double.NaN; } #endregion tempMetrics["aPER"] = aPER; tempMetrics["BLK%"] = BLKp; tempMetrics["DREB%"] = DRBp; tempMetrics["OREB%"] = ORBp; tempMetrics["REB%"] = REBp; tempMetrics["PPR"] = PPR; #region Offensive Rating var qAST = ((pstats[PAbbrT.MINS] / (tstats[TAbbrT.MINS] / 5)) * (1.14 * ((tstats[TAbbrT.AST] - pstats[PAbbrT.AST]) / tstats[TAbbrT.FGM]))) + ((((tstats[TAbbrT.AST] / tstats[TAbbrT.MINS]) * pstats[PAbbrT.MINS] * 5 - pstats[PAbbrT.AST]) / ((tstats[TAbbrT.FGM] / tstats[TAbbrT.MINS]) * pstats[PAbbrT.MINS] * 5 - pstats[PAbbrT.FGM])) * (1 - (pstats[PAbbrT.MINS] / (tstats[TAbbrT.MINS] / 5)))); var fgPart = pstats[PAbbrT.FGM] * (1 - 0.5 * ((pstats[PAbbrT.PTS] - pstats[PAbbrT.FTM]) / (2 * pstats[PAbbrT.FGA])) * qAST); var astPart = 0.5 * (((tstats[TAbbrT.PF] - tstats[TAbbrT.FTM]) - (pstats[PAbbrT.PTS] - pstats[PAbbrT.FTM])) / (2 * (tstats[TAbbrT.FGA] - pstats[PAbbrT.FGA]))) * pstats[PAbbrT.AST]; var pFTp = pstats[PAbbrT.FTM] / pstats[PAbbrT.FTA]; if (double.IsNaN(pFTp)) { pFTp = 0; } var ftPart = (1 - Math.Pow(1 - pFTp, 2)) * 0.4 * pstats[PAbbrT.FTA]; var tFTp = tstats[TAbbrT.FTM] / tstats[TAbbrT.FTA]; if (double.IsNaN(tFTp)) { tFTp = 0; } var teamScPoss = tstats[TAbbrT.FGM] + (1 - Math.Pow(1 - tFTp, 2)) * tstats[TAbbrT.FTA] * 0.4; var teamOREBPct = tstats[TAbbrT.OREB] / (tstats[TAbbrT.OREB] + toppstats[TAbbrT.DREB]); var teamPlayPct = teamScPoss / (tstats[TAbbrT.FGA] + tstats[TAbbrT.FTA] * 0.4 + tstats[TAbbrT.TOS]); var teamOREBWeight = ((1 - teamOREBPct) * teamPlayPct) / ((1 - teamOREBPct) * teamPlayPct + teamOREBPct * (1 - teamPlayPct)); var orebPart = pstats[PAbbrT.OREB] * teamOREBWeight * teamPlayPct; var scPoss = (fgPart + astPart + ftPart) * (1 - (tstats[TAbbrT.OREB] / teamScPoss) * teamOREBWeight * teamPlayPct) + orebPart; var fgxPoss = (pstats[PAbbrT.FGA] - pstats[PAbbrT.FGM]) * (1 - 1.07 * teamOREBPct); var ftxPoss = Math.Pow(1 - pFTp, 2) * 0.4 * pstats[PAbbrT.FTA]; var totPoss = scPoss + fgxPoss + ftxPoss + pstats[PAbbrT.TOS]; var pprodFGPart = 2 * (pstats[PAbbrT.FGM] + 0.5 * pstats[PAbbrT.TPM]) * (1 - 0.5 * ((pstats[PAbbrT.PTS] - pstats[PAbbrT.FTM]) / (2 * pstats[PAbbrT.FGA])) * qAST); var pprodASTPart = 2 * ((tstats[TAbbrT.FGM] - pstats[PAbbrT.FGM] + 0.5 * (tstats[TAbbrT.TPM] - pstats[PAbbrT.TPM])) / (tstats[TAbbrT.FGM] - pstats[PAbbrT.FGM])) * 0.5 * (((tstats[TAbbrT.PF] - tstats[TAbbrT.FTM]) - (pstats[PAbbrT.PTS] - pstats[PAbbrT.FTM])) / (2 * (tstats[TAbbrT.FGA] - pstats[PAbbrT.FGA]))) * pstats[PAbbrT.AST]; var pprodOREBPart = pstats[PAbbrT.OREB] * teamOREBWeight * teamPlayPct * (tstats[TAbbrT.PF] / (tstats[TAbbrT.FGM] + (1 - Math.Pow(1 - tFTp, 2)) * 0.4 * tstats[TAbbrT.FTA])); var pProd = (pprodFGPart + pprodASTPart + pstats[PAbbrT.FTM]) * (1 - (tstats[TAbbrT.OREB] / teamScPoss) * teamOREBWeight * teamPlayPct) + pprodOREBPart; var ortg = 100 * (pProd / totPoss); var floorPct = scPoss / totPoss; tempMetrics["ORTG"] = ortg; tempMetrics["Floor%"] = floorPct; #endregion #region Defensive Rating var dorPct = toppstats[TAbbrT.OREB] / (toppstats[TAbbrT.OREB] + tstats[TAbbrT.DREB]); var dfgPct = toppstats[TAbbrT.FGM] / toppstats[TAbbrT.FGA]; var fmWt = (dfgPct * (1 - dorPct)) / (dfgPct * (1 - dorPct) + (1 - dfgPct) * dorPct); var stops1 = pstats[PAbbrT.STL] + pstats[PAbbrT.BLK] * fmWt * (1 - 1.07 * dorPct) + pstats[PAbbrT.DREB] * (1 - fmWt); var stops2 = (((toppstats[TAbbrT.FGA] - toppstats[TAbbrT.FGM] - tstats[TAbbrT.BLK]) / tstats[TAbbrT.MINS]) * fmWt * (1 - 1.07 * dorPct) + ((toppstats[TAbbrT.TOS] - tstats[TAbbrT.STL]) / tstats[TAbbrT.MINS])) * pstats[PAbbrT.MINS] + (pstats[PAbbrT.PTS] / tstats[TAbbrT.PF]) * 0.4 * toppstats[TAbbrT.FTA] * Math.Pow(1 - (toppstats[TAbbrT.FTM] / toppstats[TAbbrT.FTA]), 2); var stops = stops1 + stops2; var stopPct = (stops * toppstats[TAbbrT.MINS]) / (tempTeamMetricsOwn["Poss"] * pstats[PAbbrT.MINS]); var dPtsPerScPoss = toppstats[TAbbrT.PF] / (toppstats[TAbbrT.FGM] + (1 - Math.Pow(1 - (toppstats[TAbbrT.FTM] / toppstats[TAbbrT.FTA]), 2)) * toppstats[TAbbrT.FTA] * 0.4); var drtg = tempTeamMetricsOwn["DRTG"] + 0.2 * (100 * dPtsPerScPoss * (1 - stopPct) - tempTeamMetricsOwn["DRTG"]); var rtgd = ortg - drtg; tempMetrics["DRTG"] = drtg; tempMetrics["RTGd"] = rtgd; #endregion } else { tempMetrics["aPER"] = Double.NaN; tempMetrics["BLK%"] = Double.NaN; tempMetrics["DREB%"] = Double.NaN; tempMetrics["OREB%"] = Double.NaN; tempMetrics["REB%"] = Double.NaN; tempMetrics["PPR"] = Double.NaN; tempMetrics["ORTG"] = Double.NaN; tempMetrics["Floor%"] = Double.NaN; tempMetrics["DRTG"] = Double.NaN; tempMetrics["RTGd"] = Double.NaN; } #endregion } var games = (!playoffs) ? ts.GetGames() : ts.GetPlayoffGames(); var gamesRequired = (int) Math.Ceiling(0.8522 * games); if (leagueOv) { if (pstats[PAbbrT.GP] < gamesRequired) { foreach (var name in tempMetrics.Keys.ToList()) { tempMetrics[name] = Double.NaN; } } } if (!playoffs) { Metrics = new Dictionary<string, double>(tempMetrics); } else { PlMetrics = new Dictionary<string, double>(tempMetrics); } }
public TeamStatsRow(TeamStats ts, bool playoffs = false) { ID = ts.ID; Name = ts.Name; DisplayName = ts.DisplayName; IsHidden = ts.IsHidden; if (!playoffs) { Games = ts.GetGames(); Wins = ts.Record[0]; Losses = ts.Record[1]; MINS = ts.Totals[TAbbr.MINS]; PF = ts.Totals[TAbbr.PF]; PA = ts.Totals[TAbbr.PA]; FGM = ts.Totals[TAbbr.FGM]; FGMPG = ((float) FGM/Games); FGA = ts.Totals[TAbbr.FGA]; FGAPG = ((float) FGA/Games); TPM = ts.Totals[TAbbr.TPM]; TPMPG = ((float) TPM/Games); TPA = ts.Totals[TAbbr.TPA]; TPAPG = ((float) TPA/Games); FTM = ts.Totals[TAbbr.FTM]; FTMPG = ((float) FTM/Games); FTA = ts.Totals[TAbbr.FTA]; FTAPG = ((float) FTA/Games); OREB = ts.Totals[TAbbr.OREB]; DREB = ts.Totals[TAbbr.DREB]; REB = (UInt16) (OREB + DREB); STL = ts.Totals[TAbbr.STL]; TOS = ts.Totals[TAbbr.TOS]; BLK = ts.Totals[TAbbr.BLK]; AST = ts.Totals[TAbbr.AST]; FOUL = ts.Totals[TAbbr.FOUL]; Wp = ts.PerGame[TAbbr.Wp]; Weff = ts.PerGame[TAbbr.Weff]; MPG = ts.PerGame[TAbbr.MPG]; PPG = ts.PerGame[TAbbr.PPG]; PAPG = ts.PerGame[TAbbr.PAPG]; FGp = ts.PerGame[TAbbr.FGp]; FGeff = ts.PerGame[TAbbr.FGeff]; TPp = ts.PerGame[TAbbr.TPp]; TPeff = ts.PerGame[TAbbr.TPeff]; FTp = ts.PerGame[TAbbr.FTp]; FTeff = ts.PerGame[TAbbr.FTeff]; RPG = ts.PerGame[TAbbr.RPG]; ORPG = ts.PerGame[TAbbr.ORPG]; DRPG = ts.PerGame[TAbbr.DRPG]; SPG = ts.PerGame[TAbbr.SPG]; TPG = ts.PerGame[TAbbr.TPG]; BPG = ts.PerGame[TAbbr.BPG]; APG = ts.PerGame[TAbbr.APG]; FPG = ts.PerGame[TAbbr.FPG]; Poss = ts.Metrics["PossPG"]; Pace = ts.Metrics["Pace"]; ORTG = ts.Metrics["ORTG"]; DRTG = ts.Metrics["DRTG"]; ASTp = ts.Metrics["AST%"]; DREBp = ts.Metrics["DREB%"]; EFGp = ts.Metrics["EFG%"]; EFFd = ts.Metrics["EFFd"]; TOR = ts.Metrics["TOR"]; OREBp = ts.Metrics["OREB%"]; FTR = ts.Metrics["FTR"]; PWp = ts.Metrics["PW%"]; TSp = ts.Metrics["TS%"]; TPR = ts.Metrics["3PR"]; PythW = ts.Metrics["PythW"]; PythL = ts.Metrics["PythL"]; } else { Games = ts.GetPlayoffGames(); Wins = ts.PlRecord[0]; Losses = ts.PlRecord[1]; MINS = ts.PlTotals[TAbbr.MINS]; PF = ts.PlTotals[TAbbr.PF]; PA = ts.PlTotals[TAbbr.PA]; FGM = ts.PlTotals[TAbbr.FGM]; FGMPG = ((float) FGM/Games); FGA = ts.PlTotals[TAbbr.FGA]; FGAPG = ((float) FGA/Games); TPM = ts.PlTotals[TAbbr.TPM]; TPMPG = ((float) TPM/Games); TPA = ts.PlTotals[TAbbr.TPA]; TPAPG = ((float) TPA/Games); FTM = ts.PlTotals[TAbbr.FTM]; FTMPG = ((float) FTM/Games); FTA = ts.PlTotals[TAbbr.FTA]; FTAPG = ((float) FTA/Games); OREB = ts.PlTotals[TAbbr.OREB]; DREB = ts.PlTotals[TAbbr.DREB]; REB = (UInt16) (OREB + DREB); STL = ts.PlTotals[TAbbr.STL]; TOS = ts.PlTotals[TAbbr.TOS]; BLK = ts.PlTotals[TAbbr.BLK]; AST = ts.PlTotals[TAbbr.AST]; FOUL = ts.PlTotals[TAbbr.FOUL]; Wp = ts.PlPerGame[TAbbr.Wp]; Weff = ts.PlPerGame[TAbbr.Weff]; PPG = ts.PlPerGame[TAbbr.PPG]; PAPG = ts.PlPerGame[TAbbr.PAPG]; FGp = ts.PlPerGame[TAbbr.FGp]; FGeff = ts.PlPerGame[TAbbr.FGeff]; TPp = ts.PlPerGame[TAbbr.TPp]; TPeff = ts.PlPerGame[TAbbr.TPeff]; FTp = ts.PlPerGame[TAbbr.FTp]; FTeff = ts.PlPerGame[TAbbr.FTeff]; RPG = ts.PlPerGame[TAbbr.RPG]; ORPG = ts.PlPerGame[TAbbr.ORPG]; DRPG = ts.PlPerGame[TAbbr.DRPG]; SPG = ts.PlPerGame[TAbbr.SPG]; TPG = ts.PlPerGame[TAbbr.TPG]; BPG = ts.PlPerGame[TAbbr.BPG]; APG = ts.PlPerGame[TAbbr.APG]; FPG = ts.PlPerGame[TAbbr.FPG]; Poss = ts.PlMetrics["PossPG"]; Pace = ts.PlMetrics["Pace"]; ORTG = ts.PlMetrics["ORTG"]; DRTG = ts.PlMetrics["DRTG"]; ASTp = ts.PlMetrics["AST%"]; DREBp = ts.PlMetrics["DREB%"]; EFGp = ts.PlMetrics["EFG%"]; EFFd = ts.PlMetrics["EFFd"]; TOR = ts.PlMetrics["TOR"]; OREBp = ts.PlMetrics["OREB%"]; FTR = ts.PlMetrics["FTR"]; PWp = ts.PlMetrics["PW%"]; TSp = ts.PlMetrics["TS%"]; TPR = ts.PlMetrics["3PR"]; PythW = ts.PlMetrics["PythW"]; PythL = ts.PlMetrics["PythL"]; } CurStreak = ts.CurStreak; }
/// <summary> /// Calculates the Metric Stats for this Player /// </summary> /// <param name="ts">The player's team's stats</param> /// <param name="tsopp">The player's team's opponents' stats</param> /// <param name="ls">The total league stats</param> /// <param name="leagueOv">Whether CalcMetrics is being called from the League Overview screen</param> public void CalcMetrics(TeamStats ts, TeamStats tsopp, TeamStats ls, bool leagueOv = false, bool GmScOnly = false, bool playoffs = false) { var pstats = new double[Totals.Length]; for (int i = 0; i < Totals.Length; i++) { if (!playoffs) { pstats[i] = Totals[i]; } else { pstats[i] = PlTotals[i]; } } var tstats = new double[ts.Totals.Length]; for (int i = 0; i < ts.Totals.Length; i++) { if (!playoffs) { tstats[i] = ts.Totals[i]; } else { tstats[i] = ts.PlTotals[i]; } } var toppstats = new double[tsopp.Totals.Length]; for (int i = 0; i < tsopp.Totals.Length; i++) { if (!playoffs) { toppstats[i] = tsopp.Totals[i]; } else { toppstats[i] = tsopp.PlTotals[i]; } } var lstats = new double[ls.Totals.Length]; for (int i = 0; i < ls.Totals.Length; i++) { if (!playoffs) { lstats[i] = ls.Totals[i]; } else { lstats[i] = ls.PlTotals[i]; } } double pREB = pstats[PAbbr.OREB] + pstats[PAbbr.DREB]; double tREB = tstats[TAbbr.OREB] + tstats[TAbbr.DREB]; var tempMetrics = new Dictionary<string, double>(); double gmSc = pstats[PAbbr.PTS] + 0.4*pstats[PAbbr.FGM] - 0.7*pstats[PAbbr.FGA] - 0.4*(pstats[PAbbr.FTA] - pstats[PAbbr.FTM]) + 0.7*pstats[PAbbr.OREB] + 0.3*pstats[PAbbr.DREB] + pstats[PAbbr.STL] + 0.7*pstats[PAbbr.AST] + 0.7*pstats[PAbbr.BLK] - 0.4*pstats[PAbbr.FOUL] - pstats[PAbbr.TOS]; tempMetrics.Add("GmSc", gmSc/pstats[PAbbr.GP]); double gmScE = 36*(1/pstats[PAbbr.MINS])*gmSc; tempMetrics.Add("GmScE", gmScE); if (!GmScOnly) { #region temp_metrics that do not require Opponent Stats double ASTp = pstats[PAbbr.AST]/(((pstats[PAbbr.MINS]/(tstats[TAbbr.MINS]))*tstats[TAbbr.FGM]) - pstats[PAbbr.FGM]); tempMetrics.Add("AST%", ASTp); double EFGp = (pstats[PAbbr.FGM] + 0.5*pstats[PAbbr.TPM])/pstats[PAbbr.FGA]; tempMetrics.Add("EFG%", EFGp); Dictionary<string, double> tempOppMetrics = !playoffs ? tsopp.Metrics : tsopp.PlMetrics; double STLp = (pstats[PAbbr.STL]*(tstats[TAbbr.MINS]))/(pstats[PAbbr.MINS]*tempOppMetrics["Poss"]); tempMetrics.Add("STL%", STLp); double TOp = pstats[PAbbr.TOS]/(pstats[PAbbr.FGA] + 0.44*pstats[PAbbr.FTA] + pstats[PAbbr.TOS]); tempMetrics.Add("TO%", TOp); double TSp = pstats[PAbbr.PTS]/(2*(pstats[PAbbr.FGA] + 0.44*pstats[PAbbr.FTA])); tempMetrics.Add("TS%", TSp); double USGp = ((pstats[PAbbr.FGA] + 0.44*pstats[PAbbr.FTA] + pstats[PAbbr.TOS])*(tstats[TAbbr.MINS]))/ (pstats[PAbbr.MINS]*(tstats[TAbbr.FGA] + 0.44*tstats[TAbbr.FTA] + tstats[TAbbr.TOS])); tempMetrics.Add("USG%", USGp); CalculateRates(pstats, ref tempMetrics); // PER preparations double lREB = lstats[TAbbr.OREB] + lstats[TAbbr.DREB]; double factor = (2/3) - (0.5*(lstats[TAbbr.AST]/lstats[TAbbr.FGM]))/(2*(lstats[TAbbr.FGM]/lstats[TAbbr.FTM])); double VOP = lstats[TAbbr.PF]/(lstats[TAbbr.FGA] - lstats[TAbbr.OREB] + lstats[TAbbr.TOS] + 0.44*lstats[TAbbr.FTA]); double lDRBp = lstats[TAbbr.DREB]/lREB; double uPER = (1/pstats[PAbbr.MINS])* (pstats[PAbbr.TPM] + (2/3)*pstats[PAbbr.AST] + (2 - factor*(tstats[TAbbr.AST]/tstats[TAbbr.FGM]))*pstats[PAbbr.FGM] + (pstats[PAbbr.FTM]*0.5* (1 + (1 - (tstats[TAbbr.AST]/tstats[TAbbr.FGM])) + (2/3)*(tstats[TAbbr.AST]/tstats[TAbbr.FGM]))) - VOP*pstats[PAbbr.TOS] - VOP*lDRBp*(pstats[PAbbr.FGA] - pstats[PAbbr.FGM]) - VOP*0.44*(0.44 + (0.56*lDRBp))*(pstats[PAbbr.FTA] - pstats[PAbbr.FTM]) + VOP*(1 - lDRBp)*(pREB - pstats[PAbbr.OREB]) + VOP*lDRBp*pstats[PAbbr.OREB] + VOP*pstats[PAbbr.STL] + VOP*lDRBp*pstats[PAbbr.BLK] - pstats[PAbbr.FOUL]* ((lstats[TAbbr.FTM]/lstats[TAbbr.FOUL]) - 0.44*(lstats[TAbbr.FTA]/lstats[TAbbr.FOUL])*VOP)); tempMetrics.Add("EFF", uPER*100); #endregion #region temp_metrics that require Opponents stats if (ts.GetGames() == tsopp.GetGames()) { double BLKp = (pstats[PAbbr.BLK]*(tstats[TAbbr.MINS]))/ (pstats[PAbbr.MINS]*(toppstats[TAbbr.FGA] - toppstats[TAbbr.TPA])); double DRBp = (pstats[PAbbr.DREB]*(tstats[TAbbr.MINS]))/ (pstats[PAbbr.MINS]*(tstats[TAbbr.DREB] + toppstats[TAbbr.OREB])); double ORBp = (pstats[PAbbr.OREB]*(tstats[TAbbr.MINS]))/ (pstats[PAbbr.MINS]*(tstats[TAbbr.OREB] + toppstats[TAbbr.DREB])); double toppREB = toppstats[TAbbr.OREB] + toppstats[TAbbr.DREB]; double REBp = (pREB*(tstats[TAbbr.MINS]))/(pstats[PAbbr.MINS]*(tREB + toppREB)); #region temp_metrics that require league stats double aPER; double PPR; if (ls.Name != "$$Empty") { //double paceAdj = ls.temp_metrics["Pace"]/ts.temp_metrics["Pace"]; double estPaceAdj; if (!playoffs) { estPaceAdj = 2*ls.PerGame[TAbbr.PPG]/(ts.PerGame[TAbbr.PPG] + tsopp.PerGame[TAbbr.PPG]); } else { estPaceAdj = 2*ls.PlPerGame[TAbbr.PPG]/(ts.PlPerGame[TAbbr.PPG] + tsopp.PlPerGame[TAbbr.PPG]); } aPER = estPaceAdj*uPER; PPR = 100*estPaceAdj*(((pstats[PAbbr.AST]*2/3) - pstats[PAbbr.TOS])/pstats[PAbbr.MINS]); } else { aPER = Double.NaN; PPR = Double.NaN; } #endregion tempMetrics.Add("aPER", aPER); tempMetrics.Add("BLK%", BLKp); tempMetrics.Add("DREB%", DRBp); tempMetrics.Add("OREB%", ORBp); tempMetrics.Add("REB%", REBp); tempMetrics.Add("PPR", PPR); } else { tempMetrics.Add("aPER", Double.NaN); tempMetrics.Add("BLK%", Double.NaN); tempMetrics.Add("DREB%", Double.NaN); tempMetrics.Add("OREB%", Double.NaN); tempMetrics.Add("REB%", Double.NaN); tempMetrics.Add("PPR", Double.NaN); } #endregion } uint games = (!playoffs) ? ts.GetGames() : ts.GetPlayoffGames(); var gamesRequired = (int) Math.Ceiling(0.8522*games); if (leagueOv) { if (pstats[PAbbr.GP] < gamesRequired) { foreach (string name in tempMetrics.Keys.ToList()) { tempMetrics[name] = Double.NaN; } } } if (!playoffs) { Metrics = new Dictionary<string, double>(tempMetrics); } else { PlMetrics = new Dictionary<string, double>(tempMetrics); } }