Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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) 
Exemplo n.º 4
0
    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)
Exemplo n.º 5
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)
Exemplo n.º 6
0
    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)
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
 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)
Exemplo n.º 9
0
    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)
Exemplo n.º 10
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))