forum

Ultimate osu! Analyzer

posted
Total Posts
11
Topic Starter
abraker
While developing formula PP and SR I made a tool that allows analysis of maps and replays. It is far from being feature complete and has bugs, but since you can do a lot with this, I figured to let people know that it exists.

The project repo can be can be found here. Tested with Python 3.7.3 and 3.8.2. Currently supports osu!std and osu!mania.





Rundown of features:
  1. Allows viewing of maps and replays
  2. Allows creation of various layers in map view for visualization
  3. Mass downloading replays and maps
  4. Graphing metrics like cursor velocity, acceleration, and more
  5. View multiple replay stats at once
  6. Extremely powerful embedded console - allows advance analysis via coding, and supports on-the-fly modification of algorithm and formulas without restarting the app
  7. Basically anything else you can imagine would help with pp and sr dev. It's made to be the ultimate swiss army knife for pp dev!

Please read this:
I got some tutorials to get you started in the tutorials section: https://github.com/abraker95/ultimate_osu_analyzer/wiki/Tutorials.

Documentation: https://ultimate-osu-analyzer.readthedocs.io/en/latest/py-modindex.html

If you find a bug, report it here: https://github.com/abraker95/ultimate_osu_analyzer/issues
Feature requests are accepted, but generally low priority.

I am aware that stuff is lacking documentation, and that you might need help setting things up and using the app. Go ahead and post in this thread if you have issues and I'll reply as soon as I can. I will fill in documentation whenever I have time to.
McBliss
The program crashes upon loading a beatmap, both from adding it manually and using drag and drop. Personal files and built-in both do this. Any ideas as to why? Would also suggest adding "requests" to requirements.txt.
Additional information:
Running python 3.7.1
test.py runs fine.
Under problem signature it says:
Problem Event Name: BEX64
Fault Module Name: Qt5Core.dll
Fault Module Version: 5.13.2.0
Topic Starter
abraker
I pushed a fix, try again.
McBliss
Great. That works now.

Another problem occoured though. When pressing the + sign under the analysis the app crashes again. This is what the command prompt displays:
Traceback (most recent call last):
File "C:\...\gui\widgets\analysis_controls.py", line 132, in __add_metric_event
self.refresh_allowable_graph_types()
File "C:\...\gui\widgets\analysis_controls.py", line 152, in refresh_allowable_graph_types
self.graph_type_selection.set_dropdown(graph_types.get_names())
NameError: name 'graph_types' is not defined
Topic Starter
abraker
Yea, the stuff in the analysis tab is unfinished and unstable. You can use console to do stuff you would do in analysis instead.
DarkProjector
It's any possiable/feature that this program could calculate timestamps where miss was occured from .osr file?
Topic Starter
abraker

DarkProjector wrote:

It's any possiable/feature that this program could calculate timestamps where miss was occured from .osr file?
First a disclaimer: the score implementation is custom, so there might be some discrepancies.

To detect misses:
1) Load map and replay
2) go into the embedded console (last tab)
3) Put in this code:

map_data    = StdMapData.get_aimpoint_data(get_beatmap().hitobjects)

replay_data = get_replays()[0]

score_data  = StdScoreData.get_score_data(replay_data, map_data)



# (in ms) Changes this to the appropriate value for the map's OD

ms_miss = 139.5



hitoffset_data = score_data[:, 2]

timing_data    = score_data[:, 0]

miss_timings   = timing_data[hitoffset_data > ms_miss]

4) Your timestamps will be in miss_timings variable
Topic Starter
abraker
Hey all! I finished documenting a lot of the built-in standard gamemode analysis functions. You can check out the documentation here: https://ultimate-osu-analyzer.readthedocs.io/en/latest/source/analysis/analysis.osu.std.html
Topic Starter
abraker
New update fixes various bugs and adds new features. You can now create scripts and load them in the embedded console. As a start, I provided a few scripts but the 2 that might interest you are: One that allow you to download map and top 50 no mod replays, and another that takes all those replays and saves player hit timing data into *.csv files.

I also finally got around making "The Dynamic Environment" tutorial, which shows how you can take full advantage of the analyzer to create difficulty algorithms, data collection and aggregation, and more.
Topic Starter
abraker
I have updated the hit_offset.py script to show better and improved visualizations!



Just load a map and replay in the analyzer and enter the following commands in the embedded console

CmdUtils.run_script('scripts/hit_offsets.py', globals(), locals())

_ = HitOffsets().run()


If you got multiple plays loaded you can put in which play you want to see the hits for. So if I want to see hits for the 17th play listed I would do
_ = HitOffsets().run(17)

This applies to however the plays are sorted. So 17th play is whatever play is listed as you see it.

I realize it's tedious to count plays when you have a bunch of them loaded, so I also added enumeration to the replay list as the first column. I sort by that when I know which play I want to put in.



If you want to have multiple graphs open, then simply do:
graphs1 = HitOffsets().run(1)

graphs2 = HitOffsets().run(2)

...

Cause it would overwrite the variable you assign it to every time you run it otherwise, which causes the previous graphs to be deleted.
Topic Starter
abraker
I pushed an update fixing python 3.8 compatibility
Please sign in to reply.

New reply