We have implemented filters that each science program can customize. In data science, this is called "in-situ beamline triggers" (just learned this term at a talk this morning by Alex Szalay). We will be listening to the entire AVRO stream from ZTF but only candidates that pass at least one of the filters of the science programs get saved to the database and listed on the scanning page. Candidates are only saved for 5 days. A member of your science working group has to save a candidate as a source if they want to follow it up. You are welcome to use the Calendar functionality to set up a Scanners schedule.
Another option is that sources can be added manually from the "Add Source" page. This is to facilitate that sources from any survey could be of interest for follow-up for the Science Program.
This is a follow-up marshal i.e. when you save a candidate as a source, you are expressing interest in following it up. If you have added zero follow-up data to your source in ~100 days, your sources will be deleted (with a warning message of course). You are encouraged to fine-tune your filters to match your follow-up appetite.
Example of a marshal filter
This filter selects transient candidates which are astrophysical (based on rbscore) + not asteroids (two detections) + not stars (no known point source underneath). Once you form a Science Program, you will need to write a custom filter to select candidates that meet your specific science goals. This filter is only an example. Currently, you can write a filter based on any of the information available to you in the P48 avro packet. (Additional parameters from external databases may also become available in the near future, stay tuned)
--
bright = False;
noPointUnderneath = False;
mover = True;
real = False;
slope = 0.0;
t_slope = 0.0;
rb = 0.0;
prevCandidates = observation["prv_candidates"];
m_now = observation["candidate"]["magpsf"];
t_now = observation["candidate"]["jd"];
fid_now = observation["candidate"]["fid"];
sgscore = observation["candidate"]["sgscore"];
rbscore = observation["candidate"]["rb"];
bright = m_now < 99.0;
if (rbscore and rbscore > 0.5) {
real = True;
}
if (sgscore and sgscore < 0.6) {
noPointUnderneath = True;
}
for candidate in prevCandidates{
if (candidate["jd"] and candidate["magpsf"] and candidate["fid"]) {
dt = t_now - candidate["jd"];
if (dt > 0.02 and candidate["magpsf"] < 99) {
mover = False;
}
if (dt != 0.0 and candidate["magpsf"] < 99){
if (candidate["jd"] > t_slope and candidate["fid"] == fid_now) {
t_slope = candidate["jd"];
slope = (m_now - candidate["magpsf"]) / dt;
}
}
}
}
annotate "magnitude" m_now;
annotate "sgscore" sgscore;
annotate "slope" slope;
annotate "rbscore" rbscore;
filteron bright and noPointUnderneath and not mover and real;
|