Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 20 additions & 9 deletions src/ajaxrequests.py
Original file line number Diff line number Diff line change
Expand Up @@ -312,18 +312,29 @@ def ajax_event_galaxies():
for glist in galLists:
markers = []
entries = [x for x in galEntries if x.listid == glist.id]
name_list = []
ra_list = []
dec_list = []
rank_list = []
info_list = []

for e in entries:
ra, dec = function.sanatize_pointing(e.position)
markers.append({
"name":e.name,
"ra": ra,
"dec": dec,
"info":function.sanatize_gal_info(e, glist)
})
name_list.append(e.name)
ra_list.append(ra)
dec_list.append(dec)
rank_list.append(int(e.rank))
info_list.append(function.sanatize_gal_info(e, glist))

df = pd.DataFrame({'name': name_list, 'ra':ra_list, 'dec':dec_list, 'rank':rank_list, 'info':info_list})
df.sort_values(by=['rank'], inplace=True, ignore_index=True)
df.drop(columns = 'rank')

markers = df.to_dict('records')
event_galaxies.append({
"name":glist.groupname,
"color":"",
"markers":markers
"name": glist.groupname,
"color": "",
"markers": markers
})

return(jsonify(event_galaxies))
Expand Down
15 changes: 10 additions & 5 deletions src/function.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,16 +151,21 @@ def sanatize_XRT_source_info(info):
def sanatize_gal_info(entry, glist):
ra, dec = sanatize_pointing(entry.position)
ret = "<p>"
ret = "<b> RA DEC: </b>"+str(round(ra,4))+" "+str(round(dec,4))+"<br>"
ret += "<b>Score: </b>"+str(entry.score)+"<br>"
ret += "<b> RA: </b>" +f"{ra:.4f}" + "<br>"
ret += "<b> DEC: </b>" + f"{dec:.4f}" + "<br>"
ret += "<b>Score: </b>"+ f"{entry.score:.4E}"+"<br>"
ret += "<b>Rank: </b>"+str(entry.rank)+"<br>"
if glist.reference:
ret+= f"<a href={glist.reference}>Reference</a> <br>"
ret += f"<a href={glist.reference}>Reference</a> <br>"
if glist.doi_url:
ret+= f"<a href={glist.doi_url}>DOI</a> <br>"
ret += f"<a href={glist.doi_url}>DOI</a> <br>"
ret += f"<a href=https://ned.ipac.caltech.edu/byname?objname={entry.name.replace(' ', '')}&hconst=67.8&omegam=0.308&omegav=0.692&wmap=4&corr_z=1>NED</a> <br>"
ret+="</p><b>Other Information:</b><br><p>"
for key in entry.info.keys():
ret += "<b>"+str(key)+":</b> "+str(entry.info[key]).split('\n')[0]+"<br>"
if 'Dist' in str(key):
ret += "<b>"+str(key)+":</b> "+ "{:.2f}".format(float(str(entry.info[key]).split('\n')[0])) +"<br>"
else:
ret += "<b>"+str(key)+":</b> "+ "{:.2E}".format(float(str(entry.info[key]).split('\n')[0])) +"<br>"
ret += "</p>"
return ret

Expand Down
274 changes: 237 additions & 37 deletions src/templates/alert_info.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
.slidecontainer {
width: 100%;
}

#max_rank {
width: 5em;
}
.slider {
width: 100%;
height: 25px;
Expand Down Expand Up @@ -169,13 +171,36 @@ <h3> Sources </h3>
</div>
<!-- Galaxies block buttons and div -->
<div class="btn-group">
<button id='alert_gal_coll' onclick='changeCollapseButtonText(this.id)' type="button" class="btn btn-primary btn-sm alert_coll down-triangle my-1" data-toggle='collapse' data-target='#alert_gal_div'></button>
<button id='alert_gal_coll' onclick='changeCollapseButtonText(this.id)' type="button" class="btn btn-primary btn-sm alert_coll down-triangle my-1" data-toggle='collapse' data-target='#alert_gal_form, #alert_gal_div'></button>
<button type="button" id="alert_event_galaxies" class="btn btn-primary btn-sm my-1">Get</button>
<h4 style="display: inline-block;">Galaxies</h4>
</div>

<div class="column">
<div class="collapse in gal_coll" id="alert_gal_form">
<form id="max_rank_form">
<div class="rank_inputGroup">
<label for="max_rank">Number of galaxies to show (optional):</label>
<input
id="max_rank"
type="number"
name="max_rank"
min="1"
placeholder="Maximum Rank"
value = "100"
/>
<span class="validity"></span>
</div>
</form>
<div class ="alert_gal_div"></div>
</div>
</div>
<div class="row">
<div class="collapse in gal_coll" id='alert_gal_div'></div>
</div>



<!-- XRT sources block buttons and div -->
<!-- <div class="btn-group">
<button id='alert_xrt_coll' onclick='changeCollapseButtonText(this.id)' type="button" class="btn btn-primary btn-sm alert_coll down-triangle my-1" data-toggle='collapse' data-target='#alert_scimmadiv'></button>
Expand Down Expand Up @@ -648,7 +673,6 @@ <h4 style="display: inline-block;">Candidates</h4>
var instoverlaylist = {}
var set_aladin_markerlist = {}


//This asynchronously queries for the instrument footprints
//Page load time saver.
window.onload = function(){
Expand Down Expand Up @@ -1171,46 +1195,222 @@ <h4 style="display: inline-block;">Candidates</h4>
});
});

//getting the alert event galaxies
$(document).ready( function() {
$('#alert_event_galaxies').click(function() {
var button = document.getElementById('alert_event_galaxies');
var alertid = document.getElementById('hidden_alertid').value;
if (button.innerHTML == 'Get') {
$('#alert_event_galaxies').prop('disabled', true)
$.ajax(
{
url: '/ajax_event_galaxies',
data: 'alertid='+alertid
// ----------------------------
// Global galaxy list accessible across files
// ----------------------------
window.CURRENT_GALAXY_LIST = null;

//Function that generates/refreshes the galaxy visualization
$(document).ready(function () {

$('#alert_event_galaxies').click(function (e) {
e.preventDefault();

const button = document.getElementById('alert_event_galaxies');
const alertid = document.getElementById('hidden_alertid').value;
const maxRankInput = document.querySelector('#max_rank');

// function to limit markers in all groups
function limitAllGroups(galaxies, limit) {
return galaxies.map(group => ({
...group,
markers: group.markers.slice(0, limit)
}));
}

// function to parse max-rank
function getMaxRank(input, maxAvailable) {
if (!input) return null;

// distinguish blank vs invalid string
if (input.validity.badInput) return undefined;

const raw = input.value.trim();

// blank → explicitly blank
if (raw === '') return null;

const value = input.valueAsNumber;

if (Number.isNaN(value)) return undefined;
if (!Number.isInteger(value)) return undefined;
if (value < 1 || value > maxAvailable) return undefined;

return value;
}

// function to refresh markers in place
function refreshGalaxyMarkersInCatalog(galaxySets, galaxies) {
if (!galaxySets) return;

for (let i = 0; i < galaxySets.length; i++) {
const set = galaxySets[i];
const markers = galaxies[i].markers;

// clear catalog markers
set.markerlayer.clear();

// clear overlay graphics
if (set.has_overlay && set.overlaylayer) {
set.overlaylayer.removeAll();
}

// rebuild markers
for (let j = 0; j < markers.length; j++) {
const m = markers[j];

const marker = A.marker(m.ra, m.dec, {
popupTitle: m.name,
popupDesc: m.info
});

set.markerlayer.addSources([marker]);

if (set.has_overlay) {
set.overlaylayer.add(
A.circle(m.ra, m.dec, m.radius, {
color: set.markerlayer.color
})
);
}
}
}
).done(function (event_galaxies) {
$('#alert_event_galaxies').prop('disabled', false)
if (event_galaxies.length > 0) {
marker_list['alert_gal'] = event_galaxies
gal_markerlist = aladin_setMarkers(aladin, event_galaxies)
aladin_setMarkerHtml(event_galaxies, 'alert_gal_div')
button.innerHTML = 'Hide'
set_aladin_markerlist['alert_gal'] = gal_markerlist
} else {
var html = "<p>No Results</p>"
$('#alert_gal_div').html(html);
}


// get galaxies
if (button.innerHTML === 'Get') {

$('#alert_event_galaxies').prop('disabled', true);

$.ajax({
url: '/ajax_event_galaxies',
data: 'alertid=' + alertid
})
.done(function (event_galaxies) {

try {
if (!event_galaxies || !event_galaxies.length) {
$('#alert_gal_div').html('<p>No Results</p>');
$('#alert_event_galaxies').prop('disabled', false);
return;
}

const firstGroupMarkers = event_galaxies[0].markers;

// configure bounds
if (maxRankInput) {
maxRankInput.min = 1;
maxRankInput.max = firstGroupMarkers.length;
}

// Initial render
let max_rank = getMaxRank(maxRankInput, firstGroupMarkers.length);

if (max_rank === null) {
max_rank = firstGroupMarkers.length;
}

const limited_galaxies = limitAllGroups(event_galaxies, max_rank);

window.CURRENT_GALAXY_LIST = limited_galaxies;

const galaxySets = aladin_setMarkers(aladin, limited_galaxies);

set_aladin_markerlist['alert_gal'] = galaxySets;
marker_list['alert_gal'] = limited_galaxies;

aladin_setMarkerHtml(limited_galaxies, 'alert_gal_div');

// Max-rank change handler
if (maxRankInput) {

if (maxRankInput._onMaxRankChange) {
maxRankInput.removeEventListener(
'change',
maxRankInput._onMaxRankChange
);
}

maxRankInput._onMaxRankChange = function () {
const maxAvailable = firstGroupMarkers.length;
const result = getMaxRank(maxRankInput, maxAvailable);

// invalid input → show error
if (result === undefined) {
maxRankInput.setCustomValidity(
`Enter a whole number between 1 and ${maxAvailable}, or leave blank`
);
maxRankInput.reportValidity();
return;
}

// clear any previous error
maxRankInput.setCustomValidity('');

// blank → show all
const max_rank =
result === null ? maxAvailable : result;

const new_limited_galaxies =
limitAllGroups(event_galaxies, max_rank);
window.CURRENT_GALAXY_LIST = new_limited_galaxies;

refreshGalaxyMarkersInCatalog(
set_aladin_markerlist['alert_gal'],
new_limited_galaxies
);

marker_list['alert_gal'] = new_limited_galaxies;
aladin_setMarkerHtml(new_limited_galaxies, 'alert_gal_div');
};

maxRankInput.addEventListener(
'change',
maxRankInput._onMaxRankChange
);
}

button.innerHTML = 'Hide';
$('#alert_event_galaxies').prop('disabled', false);

} catch (err) {
console.error('Error processing event_galaxies', err);
$('#alert_gal_div').html('<p>Error :(</p>');
$('#alert_event_galaxies').prop('disabled', false);
}
})
.fail(function () {
$('#alert_event_galaxies').prop('disabled', false);
$('#alert_gal_div').html(
'<i><font color="red">Error fetching galaxies</font></i>'
);
});

return;
}
else if (button.innerHTML == 'Hide') {
toShow = button.innerHTML == 'Show'
aladin_markerToggleAll(set_aladin_markerlist['alert_gal'], toShow)
button.innerHTML = 'Show'
$('.gal_coll input:checkbox').prop('checked', toShow)
}
else if (button.innerHTML == 'Show') {
toShow = button.innerHTML == 'Show'
aladin_markerToggleAll(set_aladin_markerlist['alert_gal'], toShow)
button.innerHTML = 'Hide'
$('.gal_coll input:checkbox').prop('checked', toShow)

// HIDE / SHOW TOGGLE
if (button.innerHTML === 'Hide') {
aladin_markerToggleAll(
set_aladin_markerlist['alert_gal'],
false
);
button.innerHTML = 'Show';
$('.gal_coll input:checkbox').prop('checked', false);

} else if (button.innerHTML === 'Show') {
aladin_markerToggleAll(
set_aladin_markerlist['alert_gal'],
true
);
button.innerHTML = 'Hide';
$('.gal_coll input:checkbox').prop('checked', true);
}

});
});
});


//Function that calls the XRT sources and populates them
// on the aladin viz. Encorporates hide/show
Expand Down