Пример #1
0
def get_brightest_sources(sra,sdec,rad,fl_tres,fglfile):

    
    names = []
    ras = []
    decs = []

    if not os.path.exists(fglfile):
#        print "Specified FGL file ",fglfile
#        print "does not exitst. Exit."
        return [],[],[]

    fglf = pyfits.open(fglfile)
    source = fglf[1].data.field('Source_name')
    assoc1 = fglf[1].data.field('ASSOC1')
    ra = fglf[1].data.field('RAJ2000')
    dec = fglf[1].data.field('DEJ2000')
    sdis = [sdist(ra[i],dec[i],sra,sdec) for i in range(len(source))]
    inds = [ i for i in range(len(source)) if sdist(ra[i],dec[i],sra,sdec)<rad]
    flux = fglf[1].data.field('Flux1000')
#    print len(sdis),len(inds)



    dists = [sdis[i] for i in inds if flux[i] > fl_tres ]
    snames = [source[i] for i in inds if flux[i] > fl_tres  ]
    names = [assoc1[i] for i in inds if flux[i] > fl_tres  ]
    for i in range(len(names)): 
        if names[i] == '': names[i] = snames[i]
    ras = [ra[i] for i in inds if flux[i] > fl_tres and sdis[i]<rad ]
    decs = [dec[i] for i in inds if flux[i] > fl_tres and sdis[i]<rad ]
#    print sdis,ras,decs
    fglf.close()
    return names,ras,decs
Пример #2
0
def get_brightest_sources(sra, sdec, rad, fl_tres, fglfile):

    names = []
    ras = []
    decs = []

    if not os.path.exists(fglfile):
        #        print "Specified FGL file ",fglfile
        #        print "does not exitst. Exit."
        return [], [], []

    fglf = pyfits.open(fglfile)
    source = fglf[1].data.field('Source_name')
    assoc1 = fglf[1].data.field('ASSOC1')
    ra = fglf[1].data.field('RAJ2000')
    dec = fglf[1].data.field('DEJ2000')
    sdis = [sdist(ra[i], dec[i], sra, sdec) for i in range(len(source))]
    inds = [
        i for i in range(len(source)) if sdist(ra[i], dec[i], sra, sdec) < rad
    ]
    flux = fglf[1].data.field('Flux1000')
    #    print len(sdis),len(inds)

    dists = [sdis[i] for i in inds if flux[i] > fl_tres]
    snames = [source[i] for i in inds if flux[i] > fl_tres]
    names = [assoc1[i] for i in inds if flux[i] > fl_tres]
    for i in range(len(names)):
        if names[i] == '': names[i] = snames[i]
    ras = [ra[i] for i in inds if flux[i] > fl_tres and sdis[i] < rad]
    decs = [dec[i] for i in inds if flux[i] > fl_tres and sdis[i] < rad]
    #    print sdis,ras,decs
    fglf.close()
    return names, ras, decs
Пример #3
0
def spc(sname, radius, fglfile):
    #    Calculates the source proximity coefficient according
    #    to 2FGL fluxes.
    sigma = 1.0 * 1.0

    try:
        fglf = pyfits.open(fglfile)
    except ():
        return 0.0, -1, "Failed to open catalog file"

    source = fglf[1].data.field('Source_name')
    ra = fglf[1].data.field('RAJ2000')
    dec = fglf[1].data.field('DEJ2000')
    flux = fglf[1].data.field('Flux1000')
    sra, sdec, sind = get_fgl_source_coords(sname, fglfile)
    if sind == -1:
        print "Failed to querry 2FGL file ", fglfile, " for the coordinates of ", sname
        return 0.0, -1

#    indexes = [ i for i in range(len(source)) if sdist(ra[i],dec[i],sra,sdec) < radius and source[i] != sname ]

    spcx = 0.0
    for i in range(len(source)):
        dist = sdist(ra[i], dec[i], sra, sdec)
        if dist < radius and i != sind:
            spcx += flux[i] / (2.0 + dist * dist)

    spcx = spcx / flux[sind]
    print "Source proximity coefficient for ", sname, ":", spcx
    return spcx, 1
Пример #4
0
def spc(sname,radius,fglfile):
#    Calculates the source proximity coefficient according
#    to 2FGL fluxes.
    sigma = 1.0*1.0

    try:
        fglf = pyfits.open(fglfile)
    except():
        return 0.0, -1, "Failed to open catalog file"
    
    source = fglf[1].data.field('Source_name')
    ra = fglf[1].data.field('RAJ2000')
    dec = fglf[1].data.field('DEJ2000')
    flux = fglf[1].data.field('Flux1000')
    sra,sdec,sind = get_fgl_source_coords(sname,fglfile)
    if sind == -1:
        print "Failed to querry 2FGL file ",fglfile," for the coordinates of ",sname
        return 0.0,-1

#    indexes = [ i for i in range(len(source)) if sdist(ra[i],dec[i],sra,sdec) < radius and source[i] != sname ]

    spcx = 0.0
    for i in range(len(source)):
        dist = sdist(ra[i],dec[i],sra,sdec)
        if dist < radius and  i != sind:
            spcx += flux[i]/(2.0+dist*dist)


    spcx = spcx/flux[sind]
    print "Source proximity coefficient for ",sname,":",spcx
    return spcx, 1
Пример #5
0
def get_closest_fgl_asssource(sra, sdec, fglfile):
    if not os.path.exists(fglfile):
        #        print "Specified FGL file ",fglfile
        #        print "does not exitst. Exit."
        return -1.0, -1.0, -1, 0
    fglf = pyfits.open(fglfile)
    source1 = fglf[1].data.field('Source_name')
    source = fglf[1].data.field('ASSOC1')
    ra = fglf[1].data.field('RAJ2000')
    dec = fglf[1].data.field('DEJ2000')
    sdis = [sdist(ra[i], dec[i], sra, sdec) for i in range(len(source))]
    ind = sdis.index(min(sdis))
    fglf.close()

    snm = source[ind]
    if snm == "": snm = source1[ind]
    return source1[ind], sdis[ind], snm, 0
Пример #6
0
def get_closest_fgl_asssource(sra,sdec,fglfile):
    if not os.path.exists(fglfile):
#        print "Specified FGL file ",fglfile
#        print "does not exitst. Exit."
        return -1.0,-1.0,-1,0
    fglf = pyfits.open(fglfile)
    source1 = fglf[1].data.field('Source_name')
    source = fglf[1].data.field('ASSOC1')
    ra = fglf[1].data.field('RAJ2000')
    dec = fglf[1].data.field('DEJ2000')
    sdis = [sdist(ra[i],dec[i],sra,sdec) for i in range(len(source))]
    ind = sdis.index(min(sdis))
    fglf.close()

    snm = source[ind]
    if snm == "": snm = source1[ind]
    return source1[ind],sdis[ind],snm,0
Пример #7
0
    def write_xml_model(self):

        dist = []
        dtp = [('dist',float),('name','S20')]
        for k in self.SourceList:
            s = self.SourceList[k]
            dist.append((sdist(s.ra,s.dec,self.ra,self.dec),k))
        
        darr = array(dist,dtype=dtp)
        sort(darr,order='dist')
        xmlf = open(self.model_file,'w')
	xmlf.write('<?xml version="1.0" ?>\n')
        xmlf.write('<source_library title="source library">\n')
	xmlf.write('\n<!-- Point Sources -->\n')
        diff_src = []
        for s in sort(darr,order='dist'):

            src = self.SourceList[s['name']]
            sn = src.name
            st = src.type

            if st != "SkyDirFunction":
                diff_src.append(s['name'])
                continue

            smodel = src.model
            xmlf.write('<source name="%s" type="PointSource">\n' %(sn))
            xmlf.write('\t<!-- Source is %s degrees away from ROI center -->\n' %s['dist'])
            xmlf.write('\t<spectrum type="%s">\n'%smodel)
            for par in src.pars:
                p = src.pars[par]
                fr = "0"
                if p.fixed: fr = "1"

                xmlf.write('\t\t<parameter free="%s" max="%e" min="%e" name="%s" scale="%d" value="%2.4f"/>\n'%(fr,p.max,p.min,p.name,p.scale,p.value))

            xmlf.write('\t</spectrum>\n')
            xmlf.write('\t<spatialModel type="SkyDirFunction">\n')
            xmlf.write('\t\t<parameter free="0" max="360.0" min="-360.0" name="RA" scale="1.0" value="%s"/>\n' %src.ra)
            xmlf.write('\t\t<parameter free="0" max="90" min="-90" name="DEC" scale="1.0" value="%s"/>\n' %src.dec)
            xmlf.write('\t</spatialModel>\n')
            xmlf.write('</source>\n')


	xmlf.write('\n<!-- Extended Sources -->\n')
        for n in diff_src:

            src = self.SourceList[n]
            sn = src.name
            st = src.type
            smodel = src.model
            xmlf.write('<source name="%s" type="DiffuseSource">\n' %(sn))
            xmlf.write('\t<!-- Source is %s degrees away from ROI center -->\n' %s['dist'])
            addfile1 = ""
            addfile2 = 'file="%s/%s"'%(self.templates_path,src.template)        
            if smodel == "FileFunction": 
                addfile1 = 'file="%s/%s"'%(self.templates_path,src.template)
                addfile2 = ""
            xmlf.write('\t<spectrum type="%s" %s>\n'%(smodel,addfile1))
            for par in src.pars:
                p = src.pars[par]
                fr = "1"
                if p.fixed: fr = "0"

                xmlf.write('\t\t<parameter free="%s" max="%e" min="%e" name="%s" scale="%d" value="%2.4f"/>\n'%
                           (fr,p.max,p.min,p.name,p.scale,p.value))


            xmlf.write('\t</spectrum>\n')
            xmlf.write('\t<spatialModel %s type="%s">\n'%(addfile2,src.type))
            if src.type == "SpatialMap": 
                xmlf.write('\t\t<parameter free="0" max="1000.0" min="0.001" name="Prefactor" scale="1.0" value="1.0"/>\n' %s)
            if src.type == "MapCubeFunction": 
                xmlf.write('\t\t<parameter free="0" max="1000.0" min="0.001" name="Normalization" scale="1.0" value="1.0"/>\n' %s)
            if src.type == "ConstantValue": 
                xmlf.write('\t\t<parameter free="0" max="10.0" min="0.0" name="Value" scale="1.0" value="1.0"/>\n' %s)
            xmlf.write('\t</spatialModel>\n')
            xmlf.write('</source>\n')
            

        xmlf.write('</source_library>\n')
        
        xmlf.close()
Пример #8
0
    def initsources(self):
        
        from fgltools import sdist
        import pyfits
        
        
        errors = []
#        self.SourceList[:] = []
        
        if self.haveCatalog == True:

#       Getting list of templates

            templates = []
            for (dirpath, dirnames, filenames) in os.walk(self.templates_path):
                templates.extend(filenames)
#----------------------------------------------------                

            fglf = pyfits.open(self.catalog)
            source = fglf[1].data.field('Source_name')
            assoc1 = fglf[1].data.field('ASSOC1')
            ra = fglf[1].data.field('RAJ2000')
            dec = fglf[1].data.field('DEJ2000')
            model = fglf[1].data.field('SpectrumType')
            flux = fglf[1].data.field('Flux1000')
            pl_index =  fglf[1].data.field('Spectral_Index')
            beta =  fglf[1].data.field('beta')
            cutoff =  fglf[1].data.field('Cutoff')
            eb =  fglf[1].data.field('Pivot_Energy')
            
#            inds = [ i for i in range(len(source)) if \
#                         sdist(ra[i],dec[i],self.ra,self.dec)>0.0 \
#                         and sdist(ra[i],dec[i],self.ra,self.dec)<self.all_deg \
#                         and flux[i]>self.all_flux and flux[i]<1.0]
            inds = [ i for i in range(len(source)) if \
                         sdist(ra[i],dec[i],self.ra,self.dec)<self.none_deg and source[i] not in self.SourceList ]



            ext_sn =  fglf[1].data.field('Extended_Source_Name')
            ext_sn4 =  fglf[4].data.field('Source_Name')
            ext_file  =  fglf[4].data.field('Spatial_Filename')

            for i in inds:
                dist = sdist(ra[i],dec[i],self.ra,self.dec)
                mod = model[i]
                pars = self.default_pars(mod,index=pl_index[i],
                                         eb=eb[i],beta=beta[i],cut=cutoff[i],f=flux[i])
                source_type = "SkyDirFunction"
                sn = source[i]
                if assoc1[i].strip() != "": sn = assoc1[i].strip()
                mfil = "" 
                if ext_sn[i].strip() != "":
                    source_type = "SpatialMap"
                    sn = ext_sn[i]
                    for j in range(len(ext_sn4)):
                        if ext_sn[i] == ext_sn4[j]:
                            mfil = ext_file[j]
                            if mfil not in templates: errors.append("Template file %s is not in templates."%mfil)
                            break
                    
                sss = LatSource(sn,ra[i],dec[i],source_type,mod,pars,
                                mfil,flux[i],assoc1[i])

                self.SourceList[source[i]] = sss
                


            dels = []

# delete source outside outer radius limit (self.none_deg)
            for s in self.SourceList:

                src = self.SourceList[s]
                if sdist(src.ra,src.dec,self.ra,self.dec)>self.none_deg: dels.append(s)

            for s in dels:  del self.SourceList[s]


            for s in self.SourceList:

                src = self.SourceList[s]
                d = sdist(src.ra,src.dec,self.ra,self.dec)                

                for p in src.pars:
                    src.pars[p].fixed = 0

                if (d<self.norm_deg):
                    try:
                        src.pars["Prefactor"].fixed = 1
                    except:
                        pass


                if (d<self.all_deg):

                    for p in src.pars:
                        src.pars[p].fixed = 1
                



            reselect = False

            try:
                if sdist(self.ra,self.dec,
                     self.SourceList[self.selected_source].ra,
                     self.SourceList[self.selected_source].dec)>self.none_deg: reselect = True
            except:
               pass     

#            for i in range(len(source)):

#                d = sdist(ra[i],dec[i],self.ra,self.dec)
                        


            if reselect: 
#                print "reselct"
                self.selected_source = self.SourceList.keys()[0] 
                self.selected_ra = self.SourceList[self.selected_source].ra
                self.selected_dec = self.SourceList[self.selected_source].dec

# adding Galactic Diffuse Emission
            
            xxx = [templates[i] for i in  xrange(len(templates)) if templates[i][:3] == "gll"]
            if len(xxx): 
                gd_template = xxx[0]
            else:
                gd_template = ""
                errors.append("Failed to file template for Galactic Diffusion.")

            pars = self.default_pars("PowerLaw",index=0.0)
            source_type = "MapCubeFunction"
            sss = LatSource('GalacticDiffuse',0.0,0.0,source_type,"PowerLaw",pars,gd_template)
            sss.pars["Prefactor"] = Param("Prefactor",1.0,10.0,1.0,1.0,1,0.0)
            sss.pars["Index"] = Param("Index",0.0,1.0,-1.0,1.0,0,0.0)
            sss.pars["Scale"] = Param("Scale",1.0e2,2.0e2,5.0e1,1.0,0,0.0)
            if sss.name not in self.SourceList: self.SourceList[sss.name] = sss


# adding Extragalactic Diffuse Background Emission
            
            xxx = [templates[i] for i in  xrange(len(templates)) if templates[i][:3] == "iso"]
            if len(xxx): 
                gd_template = xxx[0]
            else:
                gd_template = ""
                errors.append("Failed to file template for ExtraGalactic Diffusion.")

            pars = self.default_pars("FileFunction")
            source_type = "ConstantValue"
            sss = LatSource('ExtragalacticDiffBkg',0.0,0.0,source_type,"FileFunction",pars,gd_template)
            if sss.name not in self.SourceList: self.SourceList[sss.name] = sss
Пример #9
0
    def write_xml_model(self):

        dist = []
        dtp = [('dist', float), ('name', 'S20')]
        for k in self.SourceList:
            s = self.SourceList[k]
            dist.append((sdist(s.ra, s.dec, self.ra, self.dec), k))

        darr = array(dist, dtype=dtp)
        sort(darr, order='dist')
        xmlf = open(self.model_file, 'w')
        xmlf.write('<?xml version="1.0" ?>\n')
        xmlf.write('<source_library title="source library">\n')
        xmlf.write('\n<!-- Point Sources -->\n')
        diff_src = []
        for s in sort(darr, order='dist'):

            src = self.SourceList[s['name']]
            sn = src.name
            st = src.type

            if st != "SkyDirFunction":
                diff_src.append(s['name'])
                continue

            smodel = src.model
            xmlf.write('<source name="%s" type="PointSource">\n' % (sn))
            xmlf.write(
                '\t<!-- Source is %s degrees away from ROI center -->\n' %
                s['dist'])
            xmlf.write('\t<spectrum type="%s">\n' % smodel)
            for par in src.pars:
                p = src.pars[par]
                fr = "0"
                if p.fixed: fr = "1"

                xmlf.write(
                    '\t\t<parameter free="%s" max="%e" min="%e" name="%s" scale="%d" value="%2.4f"/>\n'
                    % (fr, p.max, p.min, p.name, p.scale, p.value))

            xmlf.write('\t</spectrum>\n')
            xmlf.write('\t<spatialModel type="SkyDirFunction">\n')
            xmlf.write(
                '\t\t<parameter free="0" max="360.0" min="-360.0" name="RA" scale="1.0" value="%s"/>\n'
                % src.ra)
            xmlf.write(
                '\t\t<parameter free="0" max="90" min="-90" name="DEC" scale="1.0" value="%s"/>\n'
                % src.dec)
            xmlf.write('\t</spatialModel>\n')
            xmlf.write('</source>\n')

        xmlf.write('\n<!-- Extended Sources -->\n')
        for n in diff_src:

            src = self.SourceList[n]
            sn = src.name
            st = src.type
            smodel = src.model
            xmlf.write('<source name="%s" type="DiffuseSource">\n' % (sn))
            xmlf.write(
                '\t<!-- Source is %s degrees away from ROI center -->\n' %
                s['dist'])
            addfile1 = ""
            addfile2 = 'file="%s/%s"' % (self.templates_path, src.template)
            if smodel == "FileFunction":
                addfile1 = 'file="%s/%s"' % (self.templates_path, src.template)
                addfile2 = ""
            xmlf.write('\t<spectrum type="%s" %s>\n' % (smodel, addfile1))
            for par in src.pars:
                p = src.pars[par]
                fr = "1"
                if p.fixed: fr = "0"

                xmlf.write(
                    '\t\t<parameter free="%s" max="%e" min="%e" name="%s" scale="%d" value="%2.4f"/>\n'
                    % (fr, p.max, p.min, p.name, p.scale, p.value))

            xmlf.write('\t</spectrum>\n')
            xmlf.write('\t<spatialModel %s type="%s">\n' %
                       (addfile2, src.type))
            if src.type == "SpatialMap":
                xmlf.write(
                    '\t\t<parameter free="0" max="1000.0" min="0.001" name="Prefactor" scale="1.0" value="1.0"/>\n'
                    % s)
            if src.type == "MapCubeFunction":
                xmlf.write(
                    '\t\t<parameter free="0" max="1000.0" min="0.001" name="Normalization" scale="1.0" value="1.0"/>\n'
                    % s)
            if src.type == "ConstantValue":
                xmlf.write(
                    '\t\t<parameter free="0" max="10.0" min="0.0" name="Value" scale="1.0" value="1.0"/>\n'
                    % s)
            xmlf.write('\t</spatialModel>\n')
            xmlf.write('</source>\n')

        xmlf.write('</source_library>\n')

        xmlf.close()
Пример #10
0
    def initsources(self):

        from fgltools import sdist
        import pyfits

        errors = []
        #        self.SourceList[:] = []

        if self.haveCatalog == True:

            #       Getting list of templates

            templates = []
            for (dirpath, dirnames, filenames) in os.walk(self.templates_path):
                templates.extend(filenames)
#----------------------------------------------------

            fglf = pyfits.open(self.catalog)
            source = fglf[1].data.field('Source_name')
            assoc1 = fglf[1].data.field('ASSOC1')
            ra = fglf[1].data.field('RAJ2000')
            dec = fglf[1].data.field('DEJ2000')
            model = fglf[1].data.field('SpectrumType')
            flux = fglf[1].data.field('Flux1000')
            pl_index = fglf[1].data.field('Spectral_Index')
            beta = fglf[1].data.field('beta')
            cutoff = fglf[1].data.field('Cutoff')
            eb = fglf[1].data.field('Pivot_Energy')

            #            inds = [ i for i in range(len(source)) if \
            #                         sdist(ra[i],dec[i],self.ra,self.dec)>0.0 \
            #                         and sdist(ra[i],dec[i],self.ra,self.dec)<self.all_deg \
            #                         and flux[i]>self.all_flux and flux[i]<1.0]
            inds = [ i for i in range(len(source)) if \
                         sdist(ra[i],dec[i],self.ra,self.dec)<self.none_deg and source[i] not in self.SourceList ]

            ext_sn = fglf[1].data.field('Extended_Source_Name')
            ext_sn4 = fglf[4].data.field('Source_Name')
            ext_file = fglf[4].data.field('Spatial_Filename')

            for i in inds:
                dist = sdist(ra[i], dec[i], self.ra, self.dec)
                mod = model[i]
                pars = self.default_pars(mod,
                                         index=pl_index[i],
                                         eb=eb[i],
                                         beta=beta[i],
                                         cut=cutoff[i],
                                         f=flux[i])
                source_type = "SkyDirFunction"
                sn = source[i]
                if assoc1[i].strip() != "": sn = assoc1[i].strip()
                mfil = ""
                if ext_sn[i].strip() != "":
                    source_type = "SpatialMap"
                    sn = ext_sn[i]
                    for j in range(len(ext_sn4)):
                        if ext_sn[i] == ext_sn4[j]:
                            mfil = ext_file[j]
                            if mfil not in templates:
                                errors.append(
                                    "Template file %s is not in templates." %
                                    mfil)
                            break

                sss = LatSource(sn, ra[i], dec[i], source_type, mod, pars,
                                mfil, flux[i], assoc1[i])

                self.SourceList[source[i]] = sss

            dels = []

            # delete source outside outer radius limit (self.none_deg)
            for s in self.SourceList:

                src = self.SourceList[s]
                if sdist(src.ra, src.dec, self.ra, self.dec) > self.none_deg:
                    dels.append(s)

            for s in dels:
                del self.SourceList[s]

            for s in self.SourceList:

                src = self.SourceList[s]
                d = sdist(src.ra, src.dec, self.ra, self.dec)

                for p in src.pars:
                    src.pars[p].fixed = 0

                if (d < self.norm_deg):
                    try:
                        src.pars["Prefactor"].fixed = 1
                    except:
                        pass

                if (d < self.all_deg):

                    for p in src.pars:
                        src.pars[p].fixed = 1

            reselect = False

            try:
                if sdist(self.ra, self.dec,
                         self.SourceList[self.selected_source].ra, self.
                         SourceList[self.selected_source].dec) > self.none_deg:
                    reselect = True
            except:
                pass

#            for i in range(len(source)):

#                d = sdist(ra[i],dec[i],self.ra,self.dec)

            if reselect:
                #                print "reselct"
                self.selected_source = self.SourceList.keys()[0]
                self.selected_ra = self.SourceList[self.selected_source].ra
                self.selected_dec = self.SourceList[self.selected_source].dec

# adding Galactic Diffuse Emission

            xxx = [
                templates[i] for i in xrange(len(templates))
                if templates[i][:3] == "gll"
            ]
            if len(xxx):
                gd_template = xxx[0]
            else:
                gd_template = ""
                errors.append(
                    "Failed to file template for Galactic Diffusion.")

            pars = self.default_pars("PowerLaw", index=0.0)
            source_type = "MapCubeFunction"
            sss = LatSource('GalacticDiffuse', 0.0, 0.0, source_type,
                            "PowerLaw", pars, gd_template)
            sss.pars["Prefactor"] = Param("Prefactor", 1.0, 10.0, 1.0, 1.0, 1,
                                          0.0)
            sss.pars["Index"] = Param("Index", 0.0, 1.0, -1.0, 1.0, 0, 0.0)
            sss.pars["Scale"] = Param("Scale", 1.0e2, 2.0e2, 5.0e1, 1.0, 0,
                                      0.0)
            if sss.name not in self.SourceList: self.SourceList[sss.name] = sss

            # adding Extragalactic Diffuse Background Emission

            xxx = [
                templates[i] for i in xrange(len(templates))
                if templates[i][:3] == "iso"
            ]
            if len(xxx):
                gd_template = xxx[0]
            else:
                gd_template = ""
                errors.append(
                    "Failed to file template for ExtraGalactic Diffusion.")

            pars = self.default_pars("FileFunction")
            source_type = "ConstantValue"
            sss = LatSource('ExtragalacticDiffBkg', 0.0, 0.0, source_type,
                            "FileFunction", pars, gd_template)
            if sss.name not in self.SourceList: self.SourceList[sss.name] = sss