|
|
#1 (permalink) |
|
Administrator
Join Date: Jul 2008
Posts: 3,074
|
Report Building 101
Elements of the Report File Reports in Holdem Manager are all stored in the \holdem manager\reports folder with a .REPORT file extension. Opening the file with Notepad you can see that it is simply an XML document with 3 distinct sections. The top section might look something like this: <Report Name="By Stakes" Version="1.1"> This tells Holdem Manager what to put in the Report Drop down list and identifies it as a version 1.1 report which is what all reports should be at the moment. There may also be some orderby or filterby items in here but the OrderBy will be changing very soon and we will discuss FilterBy later in this document. The next section is the critical part of any report and is what makes it a report. <Groupings> <Grouping FieldExpression="GT.GameTypeDescription" ColumnName="GameTypeDescription" ColumnHeader="Game Type Description" ColumnFormat="" ColumnWidth="100" ToolTip="Stakes / Games this player has played" /> </Groupings> This tells Holdem Manager how to organize the data into Rows. When you look at a Stakes report you expect to see all of the different stakes you played. That first line does just that. It uses "GT" to identify the GameTypes table and the value it wants to display is the GameTypeDescription field of that table. The ColumnHeader should say "Game Type Description" and it also identifies the tooltip text. With this information Holdem Manager will automatically organize all the results by the Game Type Description and what you get is the Stakes Report. This grouping system can be very complex and most of the document will be spent looking in this area. The third section tells Holdem Manager which stats to use <Stats> <Stat StatName="Net Amount Won" /> <Stat StatName="Big Blinds per 100" /> <Stat StatName="VPIP" /> <Stat StatName="PFR" /> <Stat StatName="3Bet" /> <Stat StatName="Went To Showdown" /> <Stat StatName="Won Showdown" /> <Stat StatName="Postflop Aggression" /> <Stat StatName="Postflop Aggression Pct" /> </Stats> When building new reports you would often just add the <Stat StatName="Net Amount Won" /> and then pick the remaining stats using the HM stat picker. Sometimes the stats need to be customized for the report but generally most of the work will go into the grouping section. Grouping Techniques There are two ways to name grouped values. You can either take the value right from the applicable database field, for example GameTypeDescription since it has what we want right in the field or, more commonly, we create custom names to identify one or more values from one of the grouped fields. Let's take an example, I want to build a report that groups stats by the players position (pretend that this report does not exist) so I create a new Grouping element like shown above with the FieldExpression PH.PositionType_ID. And great, I now have a report that shows stats broken down by position but unfortunately the positions look like "0", "1", "2", "3", "4" and "5" which is not useful. What we do here is create a named range like this: <Grouping FieldExpression="PH.PositionType_ID" ColumnName="PositionType_ID" ColumnHeader="Position" ColumnWidth="120"> <Ranges> <Range MinValue="0" MaxValue="0" RangeName="1) Small Blind" /> <Range MinValue="1" MaxValue="1" RangeName="2) Big Blind" /> <Range MinValue="2" MaxValue="2" RangeName="3) Early" /> <Range MinValue="3" MaxValue="3" RangeName="4) Middle" /> <Range MinValue="4" MaxValue="4" RangeName="5) Cutoff" /> <Range MinValue="5" MaxValue="5" RangeName="6) Button" /> </Ranges> </Grouping> So now we are telling Holdem Manager to look for certain values and assign the value to a name. So if the PH.PositionType_ID = 3 the report will show "4) Middle". Now, why did I make it "4) Middle" instead of just "Middle"? This is done for sorting - so when the user clicks on the column header it will be able to sort the positions properly instead of alphabetically. So this example shows how you can take numeric values and make them into something more redable by people using the report. Of couese you still need to understand what the integer values mean but that is coming as well. Now this seems pretty useful but it is still limited and you see a MinValue and MaxValue attribute in the example. This is used to create ranges of values, all of which group together into that Row. So let's look at the grouping for the "By Stack Size" report for an example of this: <Grouping FieldExpression="PHMISC.StackSize / GT.BigBlind" ColumnName="Stack Size"> <Ranges> <Range MinValue="0" MaxValue="50" RangeName="1) Short Stack 0-50 bb" /> <Range MinValue="50" MaxValue="85" RangeName="2) Small Stack 50-85 bb" /> <Range MinValue="85" MaxValue="115" RangeName="3) Medium Stack 85-115 bb" /> <Range MinValue="115" MaxValue="150" RangeName="4) Large Stack 115-150 bb" /> <Range MinValue="150" MaxValue="250" RangeName="5) Big Stack 150-250 bb" /> <Range MinValue="250" MaxValue="*" RangeName="6) Huge Stack 250+ bb" /> </Ranges> </Grouping> This introduces a couple of new things. First of all you see how the ranges are being used and you also see a * value which essentially means infinity. Probably more interesting is the FieldExpression since this shows that you can use formulas combining multiple fields into the equation. Here we are dividing the Stack Size by the Big Blind to get the actual stack size in big blinds. You can get extremely creative in the field expression area once you understand how it works. Now something I have just glossed over so far are the prefixes that are being used. These prefixes tell Holdem Manager which tables to find the data and then Holdem Manager will automatically figure out the database query and joins for you. The tables and associated Prefixes are listed here: PH PlayerHandsCash(or Tourney)KeyColumns PHMISC PlayerHandsCash(or Tourney)Miss GT GameType PKH PokerHands FLOP PlayerHandsFlop TURN PlayerHandsTurn RIVER PlayerHandsRiver TABLES Tables HOLECARDS HoleCards EV AllInSituations Each of these tables provides plenty of data about the hand so combinations can be used to create some very interesting results. There is another grouping technique which uses "In" to identify exact values to add to a group. An example of this is in the new "Plugging Leaks 03 - Flop Hand Strength" report. <Grouping FieldExpression="FLOP.MadeHandValue" ColumnName="FlopMadeHandValue" ColumnHeader="Flop Made Hand Value"> <Ranges> <Range In="20" RangeName="Overpair" /> <Range In="40,41,42,60,61,62,63,64,65,66,67,68,80,81,82,83,10 0,101,102,103,104,120,121,122,123,124,125,140,141, 160,161" RangeName="2 Pair+" /> <Range In="23,24" RangeName="Top Pair Q+ Kicker" /> <Range In="0,10,11,21,22,25,26,27,28,29,30,31,32,43,44,45,46, 47,48,49,69,84,105,106,107,108,126,142,162" RangeName="Top Pair Weak Kicker or Worse" /> <Range In="-1" RangeName="Unknown" /> </Ranges> </Grouping> Here I am identifying actual hand value ID's and assigning them into one of 4 groups. Again this is a case where you need to know what the ID's represent but this will all be documented. |
|
|
|
|
#2 (permalink) |
|
Administrator
Join Date: Jul 2008
Posts: 3,074
|
Grouping by more than one group
To get really powerful reports it will often be necessary to create multiple groups in a single report. It uses the exact same format and Holdem Manager handles all the details. The Winnings report is an example of that: <Groupings> <Grouping FieldExpression="GT.GameTypeDescription" ColumnName="GameTypeDescription" ColumnHeader="Game Type Description" ColumnFormat="" ColumnWidth="100" ToolTip="Stakes / Games this player has played" /> <Grouping FieldExpression="PH.NumberOfPlayers" ColumnName="Size" > <Ranges> <Range MinValue="1" MaxValue="2" RangeName="HU" /> <Range MinValue="3" MaxValue="6" RangeName="6 Max" /> <Range MinValue="7" MaxValue="10" RangeName="Full" /> </Ranges> </Grouping> </Groupings> Here we are grouping by the game type description (or stakes) and a second grouping by the number of players at the table. There is no limit to the number of groupings you can have but you need to be wary of using too many. For example, you could do something like this: <Groupings> <Grouping FieldExpression="GT.GameTypeDescription" ColumnName="GameTypeDescription" ColumnHeader="Game Type Description" ColumnFormat="" ColumnWidth="100" ToolTip="Stakes / Games this player has played" /> <Grouping FieldExpression="PH.NumberOfPlayers" ColumnName="Size" > <Ranges> <Range MinValue="1" MaxValue="2" RangeName="HU" /> <Range MinValue="3" MaxValue="6" RangeName="6 Max" /> <Range MinValue="7" MaxValue="10" RangeName="Full" /> </Ranges> </Grouping> <Grouping FieldExpression="PH.PositionType_ID" ColumnName="PositionType_ID" ColumnHeader="Position" ColumnWidth="120"> <Ranges> <Range MinValue="0" MaxValue="0" RangeName="1) Small Blind" /> <Range MinValue="1" MaxValue="1" RangeName="2) Big Blind" /> <Range MinValue="2" MaxValue="2" RangeName="3) Early" /> <Range MinValue="3" MaxValue="3" RangeName="4) Middle" /> <Range MinValue="4" MaxValue="4" RangeName="5) Cutoff" /> <Range MinValue="5" MaxValue="5" RangeName="6) Button" /> </Ranges> </Grouping> <Grouping FieldExpression="FLOP.MadeHandValue" ColumnName="FlopMadeHandValue" ColumnHeader="Flop Made Hand Value"> <Ranges> <Range In="20" RangeName="Overpair" /> <Range In="40,41,42,60,61,62,63,64,65,66,67,68,80,81,82,83,10 0,101,102,103,104,120,121,122,123,124,125,140,141, 160,161" RangeName="2 Pair+" /> <Range In="23,24" RangeName="Top Pair Q+ Kicker" /> <Range In="0,10,11,21,22,25,26,27,28,29,30,31,32,43,44,45,46, 47,48,49,69,84,105,106,107,108,126,142,162" RangeName="Top Pair Weak Kicker or Worse" /> <Range In="-1" RangeName="Unknown" /> </Ranges> </Grouping> </Groupings> This will be a report breaking stats down by stakes, number of players, position and flop hand value. The problem with this report is you will have hundreds of rows making the results somewhat useless. Think about the data you want and how you want the rows to be grouped together and the layout of your report will start to take shape. You can then layer on the stats you want and potential filters to complete the report but the grouping strategy is what's key. Examples So now we can try applying some of this and create some specialized reports. When I create a new report I generally start with this template <Report Name="NewName" Version="1.1"> <Groupings> </Groupings> <Stats> <Stat StatName="Net Amount Won" /> </Stats></Report> For the first report, how about a report that identifies how often we take down a flop continuation bet based on the high card on the flop. How do we think this report will be grouped? Well this one is pretty simple so something like: 1) Ace 2) King 3) Queen 4) Jack 5) Ten 6) Nine or lower So now we update the template to look like this <Report Name="Flop High Card" Version="1.1"> <Groupings> <Grouping FieldExpression="PKH.FlopHighCardValue" ColumnName="HighCardValue" ColumnHeader="High Card on Flop" ColumnWidth="120"> <Ranges> <Range MinValue="14" MaxValue="14" RangeName="1) Ace" /> <Range MinValue="13" MaxValue="13" RangeName="2) King" /> <Range MinValue="12" MaxValue="12" RangeName="3) Queen" /> <Range MinValue="11" MaxValue="11" RangeName="4) Jack" /> <Range MinValue="10" MaxValue="10" RangeName="5) Ten" /> <Range MinValue="2" MaxValue="9" RangeName="6) Nine or Lower" /> </Ranges> </Grouping> </Groupings> <Stats> <Stat StatName="Net Amount Won" /> </Stats></Report> A couple more things to note. First of all, the name is Flop High Card. Why not name this "Flop CBet Success Based on High Card"? The reason is because this grouping structure has much more going for it than simply one report. You can use this grouping to see how often people Bet by flop high card, you can see how your KK does overall based on flop high card by using filters etc. So try not to type cast your report into one specific thing especially something like this where there could be many more uses of the data. Next you will notice that cards are numbered 2 to 14 with 14 being Ace, 13 King and so on. Using the Report So now save this as FlopHighCard.Report and relaunch HM and you should see it in the report list. Try selecting the report and you'll see something starting to take form. You will also notice a blank entry - this includes hands that never saw a flop so the value is not in the range list above. Next step, let's make this report do something useful. Go into Filters and add the "Flop Continuation Bet = True" filter. Next let's add some stats by clicking on the "+" in the stat selector Add the Flop CBet%, the Flop CBet Success% and the Flop CBet Succes vs 1,2 and 3 stats. You can now see how often you CBet flops of varying high cards and how often that cbet works (and broken down by # opponents). You have taken a very basic report grouping, applied 1 simple filter and added a few stats and now have an unprecedented view into your flop CBetting. If your results are anything like mine you will see that Q+ high flops are perfect for cbetting while Jacks and lower perform much worse. This ends part 1 of the Report Building document. Much more coming and a future update of HM will simplify all of this by having a report wizard. Roy |
|
|
![]() |
| Thread Tools | |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Article 3 - The Fuzz Rule (Part 2) | Rvg72 | Pluggin Leaks | 5 | 07-06-2009 07:51 AM |
| Stats report | Rodolphe2005 | HUD Bugs | 1 | 09-09-2008 09:48 AM |
| 1.06.03 with hud update (part III) | Mike chops | Releases | 33 | 09-09-2008 08:34 AM |
| Can I make this report in HM? | ffrllc | Manager General | 1 | 08-16-2008 12:03 PM |
| help creating a report | structure | Manager General | 3 | 08-09-2008 10:42 PM |