コード例 #1
0
ファイル: specpars.py プロジェクト: jamesesdaile/q2
def solve_all(Data, SolveParsInit, output_file, reference_star=None,
              PlotPars=object):
    print '------------------------------------------------------'
    print 'Initializing ...'
    start_time = datetime.datetime.now()
    print '- Date and time: '+start_time.strftime('%d-%b-%Y, %H:%M:%S')
    print '- Model atmospheres: '+SolveParsInit.grid
    print '- Star data: '+Data.star_data_fname
    print '- Line list: '+Data.lines_fname
    print '------------------------------------------------------'
    if reference_star:
        Ref = Star(reference_star)
        Ref.get_data_from(Data)
    else:
        Ref = None
    fout = open(output_file, 'wb')
    if SolveParsInit.errors:
        fout.write('id,teff,logg,feh_model,vt,feh,err_feh_,'+
                   'feh1,err_feh1,nfe1,feh2,err_feh2,nfe2,'
                   'slope_ep,err_slope_ep,slope_rew,err_slope_rew,'
                   'stop_iter,converged,'
                   'err_teff,err_logg,err_feh,err_vt\n')
    else:
        fout.write('id,teff,logg,feh_model,vt,feh,err_feh,'+
                   'feh1,err_feh1,nfe1,feh2,err_feh2,nfe2,'
                   'slope_ep,err_slope_ep,slope_rew,err_slope_rew,'
                   'stop_iter,converged,'
                   'err_teff,err_logg,err_feh_,err_vt\n')
    for star_id in Data.star_data['id']:
        print ''
        print '*'*len(star_id)
        print star_id
        print '*'*len(star_id)
        s = Star(star_id)
        try:
            s.get_data_from(Data)
        except:
            logger.warning('No data found for '+s.name+\
                        '. Excluded from output file.')
            print 'Data not found.'
            #fout.write("{0},,,,,,,,,,"\
            #           ",,,,,,,,,,,,\n".\
            #           format(s.name))
            continue
        if ma.count(Data.lines[star_id]) == 0:
            print 'Line data not found.'
            continue
        sp = SolvePars()
        sp.__dict__ = SolveParsInit.__dict__.copy()
        if reference_star:
            if s.name == Ref.name:
                sp.niter = 0
                print 'Reference star. No calculations needed.'
                #continue
        if hasattr(s, 'converged') and sp.check_converged:
            if s.converged == 'True':
                print 'Already converged.'
                continue
                #sp.niter = 0
                #s.converged = True
        if s.name in sp.ignore:
            print 'Asked to ignore.'
            continue

        solve_one(s, sp, Ref, PlotPars=PlotPars)

        if sp.niter == 0:
            s.converged = ''

        fout.write("{0},{1:4d},{2:5.3f},{3},{4:4.2f},{5},{6:5.3f},"\
                   "{7},{8:5.3f},{9},"\
                   "{10},{11:5.3f},{12},{13:.6f},{14:.6f},"\
                   "{15:.6f},{16:.6f},{17},{18},"\
                   "{19:3d},{20:5.3f},{21:5.3f},{22:4.2f}\n".\
                   format(s.name, s.teff, s.logg, str(round(s.feh,3)), s.vt,
                          str(round(s.iron_stats['afe'],3)),
                          s.iron_stats['err_afe'],
                          str(round(s.iron_stats['afe1'],3)),
                          s.iron_stats['err_afe1'],
                          s.iron_stats['nfe1'],
                          str(round(s.iron_stats['afe2'],3)),
                          s.iron_stats['err_afe2'],
                          s.iron_stats['nfe2'],
                          s.iron_stats['slope_ep'],
                          s.iron_stats['err_slope_ep'],
                          s.iron_stats['slope_rew'],
                          s.iron_stats['err_slope_rew'],
                          s.stop_iter,
                          s.converged,
                          s.sp_err['teff'], s.sp_err['logg'],
                          s.sp_err['afe'], s.sp_err['vt']
                          ))
    fout.close()

    print ''
    print '------------------------------------------------------'
    end_time = datetime.datetime.now()
    print '- Date and time: '+end_time.strftime('%d-%b-%Y, %H:%M:%S')
    delta_t = (end_time - start_time).seconds
    hours, remainder = divmod(delta_t, 3600)
    minutes, seconds = divmod(remainder, 60)
    print '- Time elapsed: %sH %sM %sS' % (hours, minutes, seconds)
    print 'Done!'
    print '------------------------------------------------------'
    print ''