def test_calcAnglularDistance(self): src1 = Source(ra = 0.0 , dec = 0.0) src2 = Source(ra = 0.0 , dec = 0.0) sc = SourceConflicts() d = sc.calcAngularDistance(src1, src2) self.assertAlmostEqual(0.0, d, 3) # from Carl's report For GBT12B-364: # source NGC 1266 src1.ra = 0.85526951111895499 src1.dec = -0.042364958710075701 # source NGC1266, GBT10A-014 src2.ra = 0.85526223891373798 #sexHrs2rad('03:16:00.0') src2.dec = -0.0423630194553513 #sexDeg2rad('-02:25:37.0') d = sc.calcAngularDistance(src1, src2) self.assertAlmostEqual(0.0258519896867, rad2arcMin(d), 5) #print "deltaRa: ", rad2arcMin(abs(src2.ra - src1.ra)) #print "deltaDec: ", rad2arcMin(abs(src2.dec - src1.dec)) # source NGC 3665 src1.ra = 2.9876837023847602 src1.dec = 0.67653858425479396 # source SDSS J112346 ...; GBT08A-033 src2.ra = 2.9835247282213602 #sexHrs2rad('11:23:46') src2.dec = 0.67338971939598802 #sexDeg2rad('38:34:56') d = sc.calcAngularDistance(src1, src2) self.assertAlmostEqual(15.549314042, rad2arcMin(d), 5)
def test_findConflicts(self): s = self.proposal.session_set.all()[0] src0 = self.proposal.source_set.all()[0] tpcode = self.proposal.pcode # create a new proposal w/ sessions and sources newP = createProposal() newS = self.createSession(newP) newS.grade = SessionGrade.objects.get(grade = 'A') newS.receivers.add(Receiver.objects.get(abbreviation = 'Q')) newS.receivers.add(Receiver.objects.get(abbreviation = '800')) newS.save() # make conflict src1 = self.createSrc(newP) src1.target_name = src0.target_name src1.ra = src0.ra src1.dec = src0.dec src1.save() # make another conflict src2 = self.createSrc(newP) src2.target_name = src0.target_name + "!" src2.ra = src0.ra + (src0.ra*0.0002) src2.dec = src0.dec - (src0.dec*0.0002) src2.save() # turn the crank sc = SourceConflicts() sc.findConflicts() cf = sc.conflicts # check the results self.assertEqual(2, len(cf)) self.assertEqual(['GBT10A-009','GBT12A-002'], sorted(cf.keys())) # we've already tested these results below in the other test scf1 = cf['GBT12A-002']['conflicts'] self.assertEqual(2, len(scf1)) # but not for conflicts for this newly created proposal c = cf['GBT10A-009'] self.assertEqual('GBT10A-009', c['proposal'].pcode) self.assertEqual('800', c['lowestRx'].abbreviation) self.assertAlmostEqual(0.0090175344, c['searchRadius'], 5) # the conflicts are the mirror of eachother scf2 = c['conflicts'] self.assertAlmostEqual(2, len(scf2)) for i in range(2): self.assertEqual(scf1[i]['targetSrc'] , scf2[i]['searchedSrc']) self.assertEqual(scf2[i]['targetSrc'] , scf1[i]['searchedSrc']) self.assertAlmostEqual(scf1[i]['distance'] , scf2[i]['distance'], 5)
def test_getLowestRcvr(self): # test the simplest case of one sess w/ one rcvr sc = SourceConflicts() lr = sc.getLowestRcvr(self.proposal) r = self.session.receivers.all()[0] self.assertEqual(r, lr) # now add another sess w/ more then one rcvr s = self.createSession(self.proposal) s.receivers.add(Receiver.objects.get(abbreviation = 'Q')) s.receivers.add(Receiver.objects.get(abbreviation = '800')) s.save() lr = sc.getLowestRcvr(self.proposal) self.assertEqual('800', lr.abbreviation)
def test_findConflicts(self): s = self.proposal.session_set.all()[0] src0 = self.proposal.source_set.all()[0] tpcode = self.proposal.pcode # create a new proposal w/ sessions and sources newP = createProposal() newP.pi = Author.objects.all()[0] newP.save() newS = self.createSession(newP) newS.grade = SessionGrade.objects.get(grade = 'A') newS.receivers.add(Receiver.objects.get(abbreviation = 'Q')) newS.receivers.add(Receiver.objects.get(abbreviation = '800')) newS.save() # second session isn't graded newS2 = self.createSession(newP) newS2.grade = None newS2.receivers.add(Receiver.objects.get(abbreviation = 'Q')) newS2.receivers.add(Receiver.objects.get(abbreviation = '800')) newS2.save() # make conflict src1 = self.createSrc(newP) src1.target_name = src0.target_name src1.ra = src0.ra src1.dec = src0.dec src1.save() # make another conflict src2 = self.createSrc(newP) src2.target_name = src0.target_name + "!" src2.ra = src0.ra + (src0.ra*0.0002) src2.dec = src0.dec - (src0.dec*0.0002) src2.save() # turn the crank sc = SourceConflicts() sc.findConflicts() cf = sc.conflicts # now create the report ps = Proposal.objects.all() filename = '12A' scr = SourceConflictsReport('sourceConflictsReport-%s-all.pdf' % filename) sc.filterConflicts(0) scr.report(sc.filteredConflicts, semester = '12A', level = 0)
def test_withinProprietaryDate(self): s = self.proposal.session_set.all()[0] src0 = self.proposal.source_set.all()[0] tpcode = self.proposal.pcode # Need a DSS Project for this export = DssExport() project = export.exportProposal(tpcode) proposal = Proposal.objects.get(pcode = tpcode) period = dss.Period.objects.create(session = project.sesshun_set.all()[0] , start = datetime(2012, 6, 10) , duration = 8 , state = dss.Period_State.objects.get(name = 'Scheduled') ) # turn the crank sc = SourceConflicts() _, result = sc.withinProprietaryDate(proposal, now = datetime(2012, 6, 12)) self.assertTrue(result) _, result = sc.withinProprietaryDate(proposal, now = datetime(2013, 6, 12)) self.assertTrue(not result)
def test_getAnglularDistance(self): src1 = self.createSrc(self.proposal) src2 = self.createSrc(self.proposal) sc = SourceConflicts() self.assertEqual(0, len(sc.distances)) # calculate it and stick it in the cache! d = sc.getAngularDistance(src1, src2) self.assertAlmostEqual(0.0, d, 3) self.assertEqual(1, len(sc.distances)) key = (src1.id, src2.id) self.assertAlmostEqual(0.0, sc.distances[key], 3) # make sure we use the cache when switching sources around d = sc.getAngularDistance(src2, src1) self.assertAlmostEqual(0.0, d, 3) self.assertEqual(1, len(sc.distances)) key = (src1.id, src2.id) self.assertAlmostEqual(0.0, sc.distances[key], 3)
def test_findConflictsBetweenProposals(self): s = self.proposal.session_set.all()[0] src0 = self.proposal.source_set.all()[0] tpcode = self.proposal.pcode # create a new proposal w/ sessions and sources newP = createProposal() newS = self.createSession(newP) newS.receivers.add(Receiver.objects.get(abbreviation = 'Q')) newS.receivers.add(Receiver.objects.get(abbreviation = '800')) newS.save() src1 = self.createSrc(newP) src2 = self.createSrc(newP) # Look for conflicts - there should be none sc = SourceConflicts() sc.findConflictsBetweenProposals(self.proposal, newP) self.assertEqual(1, len(sc.conflicts.keys())) self.assertEqual(tpcode, sc.conflicts[tpcode]['proposal'].pcode) self.assertEqual('Rcvr4_6', sc.conflicts[tpcode]['lowestRx'].name) self.assertAlmostEqual(0.0014544410433286077 , sc.conflicts[tpcode]['searchRadius'] , 6) self.assertEqual(0, len(sc.conflicts[tpcode]['conflicts'])) # now make a conflict src1.target_name = src0.target_name src1.ra = src0.ra src1.dec = src0.dec src1.save() # make sure we detect it sc.conflicts = {} sc.distances = {} sc.findConflictsBetweenProposals(self.proposal, newP) self.assertEqual(1, len(sc.conflicts[tpcode]['conflicts'])) # check out the only conflict cf = sc.conflicts[tpcode]['conflicts'][0] self.assertEqual(src0.id, cf['targetSrc'].id) self.assertEqual(src1.id, cf['searchedSrc'].id) self.assertEqual('GBT10A-009', cf['searchedProp'].pcode) self.assertEqual(0, cf['level']) self.assertAlmostEqual(0.00000, cf['distance'], 5) # make another conflict - a little more subtle src2.target_name = src0.target_name + "!" src2.ra = src0.ra + (src0.ra*0.0002) src2.dec = src0.dec - (src0.dec*0.0002) src2.save() # make sure we detect both sc.conflicts = {} sc.distances = {} sc.findConflictsBetweenProposals(self.proposal, newP) # check out the new conflict self.assertEqual(2, len(sc.conflicts[tpcode]['conflicts'])) cf = sc.conflicts[tpcode]['conflicts'][1] self.assertEqual(src0.id, cf['targetSrc'].id) self.assertEqual(src2.id, cf['searchedSrc'].id) self.assertEqual('GBT10A-009', cf['searchedProp'].pcode) self.assertEqual(0, cf['level']) self.assertAlmostEqual(0.0009417, cf['distance'], 5)
def test_calcSearchRadiusForRcvr(self): # a silly test really - they ALL get calculated in the __init__ sc = SourceConflicts() r = Receiver.objects.get(name = 'Rcvr4_6') rad = sc.calcSearchRadiusForRcvr('C') self.assertAlmostEquals(0.0014544, rad, 7)
def getDateStr(self): dt = datetime.now() days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] return '%s, %s' % (days[dt.weekday()], dt.strftime('%B %d, %Y')) if __name__ == '__main__': import argparse parser = argparse.ArgumentParser(description='Command line tool for running GB PHT Source Conflict Reports. Specify at least a semester or pcode.') parser.add_argument('-s','--semester', dest="semester", help='Semester of the proposals you wish to check for source conflicts.') parser.add_argument('-p','--pcode', dest="pcode", help='Run source conflicts for a given pcode (Ex. GBT12B-100)') parser.add_argument('-l','--level', dest="level", type = int, default = -1, help='Level of conflicts to check. Options are "0", "1", "2" (defaults to all).') args = parser.parse_args() sc = SourceConflicts(semester = args.semester) if args.pcode is not None: sc.findConflicts(proposals = Proposal.objects.filter(pcode = args.pcode)) filename = args.pcode else: sc.findConflicts( # Uncomment for testing. #proposals = Proposal.objects.filter(semester__semester = args.semester)[:5] ) filename = args.semester levelMap = ['all', 'sameReceiver', 'sameReceiver-proprietaryPeriod'] if args.level == -1: sc.filterConflicts(0) scr = SourceConflictsReport('sourceConflictsReport-%s-all.pdf' % filename) scr.report(sc.filteredConflicts, semester = args.semester, pcode = args.pcode, level = 0)
def test_passesInclusionCheck(self): """ Examples: (assume today is March 21, 2013) Grade A, last observed date January 1, 2012 ignore since more than one year ago Grade B, last observed date January 1, 2012 ignore since more than one year ago Grade C, last observed date January 1, 2012 ignore since more than one year ago Grade N ignore since never approved Grade N* ignore since never approved Grade W ignore since never approved Grade A, last observed date June 1, 2012 conflict possible Grade B, last observed date June 1, 2012 conflict possible Grade C, last observed date June 1, 2012 conflict possible Grade A, last observed date is blank conflict possible Grade B, last observed date is blank, project is open conflict possible Grade C, last observed date is blank, project is open conflict possible Grade B, last observed date is blank, project is complete/closed ignore - never observed Grade C, last observed date is blank, project is complete/closed ignore - never observed """ now = datetime(2013, 3, 21) sc = SourceConflicts(now = now) # create a new proposal w/ sessions and sources newP = createProposal() newS = self.createSession(newP) newS.receivers.add(Receiver.objects.get(abbreviation = 'Q')) newS.receivers.add(Receiver.objects.get(abbreviation = '800')) newS.save() src1 = self.createSrc(newP) src2 = self.createSrc(newP) for g in ['N', 'N*', 'W']: newS.grade = SessionGrade.objects.get(grade = g) newS.save() self.assertEqual(False, sc.passesInclusionCheck(newP, now = now)) # now see how it works for other grades; this depends on dss project: project = dss.Project.objects.order_by('pcode').all()[0] project.complete = False project.save() newP.dss_project = project newP.save() for g in ['A', 'B', 'C']: newS.grade = SessionGrade.objects.get(grade = g) newS.save() # clear the cache sc.includeProposals = {} self.assertEqual(True, sc.passesInclusionCheck(newP, now = now)) project.complete = True project.save() for g in ['B', 'C']: newS.grade = SessionGrade.objects.get(grade = g) newS.save() # clear the cache sc.includeProposals = {} self.assertEqual(False, sc.passesInclusionCheck(newP, now = now)) # now some tests using the last observed date. s = create_sesshun() s.project = newP.dss_project s.save() start = now - timedelta(days = 365 + 10) # more then a year ago dur = 1 pa = dss.Period_Accounting(scheduled = dur) pa.save() state = dss.Period_State.objects.get(abbreviation = 'S') p = dss.Period(session = s , start = start , duration = dur , state = state , accounting = pa ) p.save() for g in ['A', 'B', 'C']: newS.grade = SessionGrade.objects.get(grade = g) newS.save() # clear the cache sc.includeProposals = {} self.assertEqual(False, sc.passesInclusionCheck(newP, now = now)) start = now - timedelta(days = 365 - 10) # less then a year ago p.start = start p.save() for g in ['A', 'B', 'C']: newS.grade = SessionGrade.objects.get(grade = g) newS.save() # clear the cache sc.includeProposals = {} self.assertEqual(True, sc.passesInclusionCheck(newP, now = now))