diff --git a/api/views.py b/api/views.py index 17e20b4..c9dd565 100644 --- a/api/views.py +++ b/api/views.py @@ -177,8 +177,9 @@ def get_audio_feature_data(request, audio_feature, user_secret): # get_genre_data {{{ # + def get_genre_data(request, user_secret): - """Return genre data needed to create the graph user. + """Return genre data needed to create the graph TODO """ user = User.objects.get(secret=user_secret) diff --git a/graphs/static/graphs/scripts/audio_feat_graph.js b/graphs/static/graphs/scripts/audio_feat_graph.js index 1fab293..5be85fb 100644 --- a/graphs/static/graphs/scripts/audio_feat_graph.js +++ b/graphs/static/graphs/scripts/audio_feat_graph.js @@ -3,10 +3,10 @@ * a designated parent element * * @param audioFeature: the name of the audio feature (string) - * @param intervalEndPoints: a sorted array of 5 real numbers defining the intervals (categories) of values, + * @param intervalEndPoints: a object defining the intervals (categories) of values, * for example: - * [0, 0.25, 0.5, 0.75, 1.0] for instrumentalness would define ranges - * (0-0.25), (0.25-0.5), (0.5-0.75), (0.75-1.0) + * {begin: 0, end: 1.0, step: 0.25} for instrumentalness would define ranges + * [0-0.25), [0.25-0.5), [0.5-0.75), [0.75-1.0] * @param parentElem: the DOM element to append the graph to (a selector string) * @param userSecret: the user secret string for identification * @return None @@ -18,11 +18,20 @@ function drawAudioFeatGraph(audioFeature, intervalEndPoints, parentElem, userSec height = 270 - margin.top - margin.bottom; let featureData = {}; + let currentEndPoint = intervalEndPoints.begin; // start at beginning // Create the keys first in order - for (let index = 0; index < intervalEndPoints.length - 1; index++) { - let key = `${intervalEndPoints[index]} ~ ${intervalEndPoints[index + 1]}`; + while (currentEndPoint < intervalEndPoints.end) { + let startOfRange = currentEndPoint; + let endOfRange = precise(startOfRange + intervalEndPoints.step); + + let key = `${startOfRange} ~ ${endOfRange}`; featureData[key] = 0; + currentEndPoint = endOfRange; } + // for (let index = 0; index < intervalEndPoints.length - 1; index++) { + // let key = `${intervalEndPoints[index]} ~ ${intervalEndPoints[index + 1]}`; + // featureData[key] = 0; + // } // define the vertical scaling function let vScale = d3.scaleLinear().range([height, 0]); @@ -31,12 +40,15 @@ function drawAudioFeatGraph(audioFeature, intervalEndPoints, parentElem, userSec // categorize the data points for (let dataPoint of response.data_points) { dataPoint = parseFloat(dataPoint); - let index = intervalEndPoints.length - 2; + let currLowerBound = precise(intervalEndPoints.end - intervalEndPoints.step); + let stepSize = intervalEndPoints.step; // find the index of the first element greater than dataPoint - while (dataPoint < intervalEndPoints[index]) { - index -= 1; + while (dataPoint < currLowerBound && currLowerBound >= intervalEndPoints.begin) { + currLowerBound = precise(currLowerBound - stepSize); } - let key = `${intervalEndPoints[index]} ~ ${intervalEndPoints[index + 1]}`; + let upperBound = precise(currLowerBound + stepSize); + currLowerBound = precise(currLowerBound); + let key = `${currLowerBound} ~ ${upperBound}`; featureData[key] += 1; } @@ -102,4 +114,13 @@ function drawAudioFeatGraph(audioFeature, intervalEndPoints, parentElem, userSec */ function capFeatureStr(audioFeature) { return audioFeature.charAt(0).toUpperCase() + audioFeature.slice(1); +} + +/** + * Converts a number to a floating point value with 2 significant figures + * @param number: the number to be converted + * @returns the input converted to two significant digits + */ +function precise(number) { + return Number.parseFloat(number.toPrecision(2)); } \ No newline at end of file diff --git a/graphs/templates/graphs/features_graphs.html b/graphs/templates/graphs/features_graphs.html index ea01793..cf8f01a 100644 --- a/graphs/templates/graphs/features_graphs.html +++ b/graphs/templates/graphs/features_graphs.html @@ -24,14 +24,14 @@ diff --git a/reset_db.sh b/reset_db.sh index b833b8a..b4805d6 100755 --- a/reset_db.sh +++ b/reset_db.sh @@ -1,15 +1,15 @@ # check if in virtual environment # https://stackoverflow.com/questions/15454174/how-can-a-shell-function-know-if-it-is-running-within-a-virtualenv/15454916 -# python -c 'import sys; print(sys.real_prefix)' 2>/dev/null && INVENV=1 || INVENV=0 +python -c 'import sys; print(sys.real_prefix)' 2>/dev/null && INVENV=1 || INVENV=0 # INVENV=$(python -c 'import sys; print ("1" if hasattr(sys, "real_prefix") else "0")') # if $INVENV is 1, then in virtualenv # echo $INVENV -# if [ $INVENV -eq 1 ]; then -rm login/migrations/0* api/migrations/0* -sudo -u postgres psql -f reset_db.sql -python manage.py makemigrations -python manage.py migrate -python manage.py runserver -# fi +if [ $INVENV -eq 1 ]; then + rm login/migrations/0* api/migrations/0* + sudo -u postgres psql -f reset_db.sql + python manage.py makemigrations login api + python manage.py migrate + python manage.py runserver +fi