Rambler's Top100Astronet    
  po tekstam   po klyuchevym slovam   v glossarii   po saitam   perevod   po katalogu
 

Na pervuyu stranicu << 2. Programmnoe obespechenie katalogov | Oglavlenie | 4. Postroenie raspredeleniya zvezd >>

Razdely


3. Rabota s ASCII versiei kataloga Hipparcos

3.1. Chtenie polnoi versii kataloga

Nesmotrya na bol'shie vozmozhnosti programmy Celestia 2000, sushestvuet bol'shoe chislo zadach, kotorye ne mogut byt' resheny s ee pomosh'yu. Naprimer, sbor razlichnyh statisticheskih harakteristik: raspredelenie po rasstoyaniyam, absolyutnoi zvezdnoi velichine i t. p.; postroenie diagrammy Gercshprunga-Ressela dlya razlichnyh vyborok zvezd; izuchenie raspredeleniya zvezd v prostranstve i raznoobraznye zvezdno-kinematicheskie issledovaniya. Dlya provedeniya takogo roda issledovanii pridetsya pribegnut' k programmirovaniyu na universal'nyh yazykah vysokogo urovnya (C/C++, Fortran, Pascal/Delphi i t. p.) s ispol'zovaniem polnyh versii katalogov.

Polnaya elektronnaya versiya katalogov vklyuchaet 6 kompakt-diskov. Glavnyi iz nih - pervyi, on soderzhit sobstvenno katalogi Hipparcos i Tycho ob'emom 53 i 373 Mbait sootvetstvenno. Ostal'nye kompakt-diski soderzhat informaciyu o dvoinyh i kratnyh zvezdah, krivye bleska peremennyh zvezd, fotometricheskie prilozheniya k Hipparcos i Tycho, vremena prohozhdeniya zvezd cherez reshetku apparata, a takzhe polnuyu dokumentaciyu. Eti diski postupili v biblioteku Astronomicheskogo instituta SPbGU, tak kak sotrudniki instituta prinimali uchastie v rabote nad proektom Hipparcos, i kopii ih dostupny vsem zhelayushim. Podrobno soderzhanie etih diskov izlozheno v [The Hipparcos/Tycho ASCII CDROMs and Access Software (H. Schrijver)].

Vmesto polnyh versii katalogov v kachestve ishodnyh dannyh programmy mogut figurirovat' i tekstovye faily, sozdavaemye programmoi Celestia 2000. Odnako etot put', veroyatno, ne ochen' udoben, poskol'ku format vyhodnyh failov Celestia zavisit ot polei, kotorye vyberet pol'zovatel', krome togo, pri provedenii bol'shogo chisla razlichnyh eksperimentov diskovaya sistema komp'yutera budet bystro zapolnena dostatochno bol'shimi failami s dannymi.

Mozhno predlozhit' kompromiss - v kachestve osnovnogo istochnika dannyh vse-taki ispol'zovat' polnuyu versiyu Hipparcos s pervogo ASCII CD-ROM (ee bez truda mozhno perenesti na lokal'nyi disk komp'yutera dlya bolee bystrogo dostupa), a dlya vybora zvezd, udovletvoryayushih kakomu-libo kriteriyu, ispol'zovat' fail s nomerami zvezd, sformirovannyi programmoi Celestia, kotoryi ves'ma kompakten po razmeru. S pomosh'yu programmy, napisannoi na lyubom yazyke vysokogo urovnya, kazhdyi pol'zovatel' smozhet sam vybrat' neobhodimye emu polya iz osnovnogo kataloga Hipparcos. Interpretaciya polnoi versii kataloga ne slozhnee, chem sintaksicheskii razbor failov, formiruemyh programmoi Celestia. Na nash vzglyad, samaya bol'shaya slozhnost' pri takom analize - uchet pustyh polei v zapisi zvezdy (v sluchae otsutstviya dannyh v pole pomeshayutsya probely - ris. 3.1), chto delaet nevozmozhnym pryamoe primenenie operatorov formatnogo vvoda, kotorye est' prakticheski v lyubom yazyke programmirovaniya, poskol'ku eto mozhet privesti k iskazhennym rezul'tatam (naprimer, v yazyke Fortran pole, sostoyashee celikom iz probelov, mozhet ponimat'sya kak imeyushee nulevoe znachenie). Nam sleduet dlya kazhdogo (ili pochti kazhdogo) polya zadat' kakoi-libo sposob, kotoryi pozvolil by ponyat', imeyutsya li v kataloge dannye dlya nego ili net.

3.2. Postanovka zadachi

Napishem programmnyi modul' (podprogrammu), chitayushuyu iz osnovnogo kataloga Hipparcos tol'ko te polya, kotorye naibolee chasto ispol'zuyutsya v zvezdno-kinematicheskih issledovaniyah (tabl. 3.1), i tol'ko dlya teh nomerov zvezd, kotorye hranyatsya v faile, sgenerirovannom programmoi Celestia 2000 pri ukazanii tol'ko pervogo flaga dlya sohranyaemoi informacii (ris. 3.2).


Ris. 3.1. Fragment polnoi versii kataloga Hipparcos. Obratite vnimanie na pustye polya u nekotoryh zvezd.

Ris. 3.2. Ustanovlennye flagi pri sohranenii vyborki zvezd.

Fail nomerov zvezd (ris. 3.3) predvaryaetsya neskol'kimi strokami sluzhebnoi informacii, a dalee idut sobstvenno dannye v tri kolonki:

H0 - katalog H ili T;

H1 - nomer po Hipparcos;

H2 - Proximity flag - est' li blizhe 10? drugie ob'ekty.


Ris. 3.3. Fail nomerov zvezd, udovletvoryayushih zadannomu kriteriyu, sformirovannyi programmoi Celestia 2000.

Hranit' prochitannye iz polnoi versii kataloga Hipparcos dannye o zvezde my budem v strukture. Takoi sposob organizacii dannyh est' vo vseh sovremennyh yazykah programmirovaniya (vklyuchaya Fortran-77, 90). Eto pozvolit manipulirovat' prochitannoi zapis'yu o zvezde kak edinym celym. Dlya ucheta pustyh polei primenim standartnyi podhod - bitovuyu masku - celochislennuyu peremennuyu, ustanovka otdel'nyh bitov kotoroi oboznachaet nalichie teh ili inyh dannyh. S pomosh'yu logicheskoi operacii AND i nabora konstant budet legko osushestvit' kontrol' prochitannoi informacii. Zabegaya vpered, skazhem, chto "polnocennyh" zvezd, dlya kotoryh zapolneno bol'shinstvo polei v Hipparcos - 117955, dlya 263 zvezd net tochnoi astrometricheskoi informacii (sobstvennyh dvizhenii, parallaksa) i mnogih drugih parametrov. Eto v osnovnom slabye zvezdy, ispol'zovavshiesya dlya privyazki kataloga k sisteme kvazarov.

Osnovnoe izlozhenie provedem na yazyke Pascal, kak naibolee abstraktnom algoritmicheskom yazyke. V Prilozheniyah D i E dany teksty na yazykah Fortran-90 i ANSI C.

Rassmotrim ustroistvo modulya, realizuyushego proceduru chteniya polnoi versii kataloga Hipparcos (listing 3.1).

V nachale modulya opredeleny konstanty, opredelyayushie mestopolozhenie kataloga i kolichestvo zvezd v nem. Dalee idut bitovye konstanty, kotorye budut ispol'zovat'sya v uslovnyh operatorah dlya vyyasneniya nalichiya ili otsutstviya dannyh o tochnyh koordinatah, zvezdnoi velichine, sobstvennyh dvizheniyah. Nizhe privoditsya opisanie struktury (v terminah Pascal - zapisi) THipparcos. Ee polya: nomer zvezdy, koordinaty, parallaks, sobstvennye dvizheniya, flag dlya kratnyh sistem, zvezdnaya velichina i pokazatel' cveta, dannye o spektral'nom klasse, a takzhe podstruktura sigma, soderzhashaya znacheniya oshibok sootvetstvuyushih velichin. Pole info - celochislennaya peremennaya, ustanovka otdel'nyh bitov kotoroi svidetel'stvuet ob otsutstvii v zapisi u zvezdy opredelennyh dannyh.
Modul' eksportiruet tri funkcii: OpenHipparcosMain otkryvaet katalog, CloseHipparcosMain zakryvaet, ReadHipparosName chitaet odnu zapis' iz kataloga, zapolnyaya strukturu tipa THipparcos.
Izuchim ustroistvo funkcii ReadHipparcosMain. Funkciya vozvrashaet True v sluchae uspeshnogo chteniya i False pri dostizhenii konca faila. Takoi sposob pozvolyaet ispol'zovat' ee neposredstvenno v uslovii operatora cikla While. Operator read schityvaet odnu zapis' kataloga (vklyuchaya simvoly konca stroki) v bufer hs.
Osnovnaya chast' teksta sostoit iz operatorov, interpretiruyushih otdel'nye kolonki v zapisi zvezdy. Rassmotrim podrobnee eti fragmenty koda na primere chteniya zvezdnoi velichiny.
Val(StrLCopy(st,@hs[42],5),VMag,code);
if code<>0 then info := info or NoVMag;
V dannom primere funkciya StrLCopy kopiruet v bufer st 5 baitov, nachinaya s 42-go baita stroki hs. Funkciya vozvrashaet rezul'tat - adres pervogo parametra, poetomu ona mozhet ispol'zovat'sya v kachestve argumenta funkcii Val, kotoraya preobrazovyvaet tekst v svoem pervom argumente v chislovoe znachenie peremennoi, kotoraya zadaetsya vtorym parametrom. Tretii parametr - kod oshibki konvertacii. On ravnyaetsya nulyu v sluchae otsutstviya oshibok i otlichen ot nulya, esli perevod simvol'noi stroki v chislovoe znachenie nevozmozhen. V poslednem sluchae my s pomosh'yu logicheskoi operacii or ustanavlivaem sootvetstvuyushii bit v pole info.
Listing 3.1. Modul' chteniya kataloga Hipparcos
Unit HipMain; { Chtenie kataloga Hipparcos }
Interface { Interfeisnaya chast' modulya }
{ Raspolozhenie polnoi versii kataloga Hipparcos }
Const HipparcosName = 'D:/CATALOGS/HIPARCOS/hip_main.dat';
HipNumOfStars = 118218;
{ Bitovye konstanty flaga o nalichii informacii }
Const NoRaDe = 1; { Net dannyh o tochnyh koordinatah }
NoPlx = 2; { Net dannyh o parallakse }
Nopm = 4; { Net dannyh o sobstvennyh dvizheniyah }
NoVMag = 8; { Net dannyh o zvezdnoi velichine }
NoB_V = 16; { Net dannyh o pokazatele cveta }
Type THipparcos=record
{ Identifikatory }
HIP : longint; { Nomer zvezdy po Hipparcos }
{ Astrometricheskaya informaciya }
RAdeg,DEdeg : double; { Ekvatorial'nye koordinaty v gradusah }
Plx : double; { Trigonometricheskii parallaks v mas }
pmRa,pmDE : double; { Sobstv. dvizh. ma*cos(d) i md mas/god }
AstroRef : char; { Flag dlya kratnyh sistem }
{ Fotometricheskaya infomaciya }
VMag : single; { Zvezdnaya vel. po shkale Dzhonsona }
B_V : single; { Pokazatel' cveta B-V po shkale Dzhonsona }
sigma : record { oshibki sootv. velichin }
RAdeg,DEdeg : double;
Plx : double;
pmRa,pmDE : double;
end;
Sp : array [0..9] of char; { Razvernutyi spektral'nyi klass }
Info : integer; { Bitovyi flag otsutstviya informacii }
end;
Procedure OpenHipparcosMain; { Otkrytie faila kataloga }
Procedure CloseHipparcosMain; { Zakrytie faila kataloga }
{ Chtenie odnoi strochki kataloga:Rezul'tat pomeshaetsya v s,
vozvrashaet false pri dostizhenii konca faila
}
Function ReadHipparcosMain(var s : THipparcos):boolean;
Implementation { Ispolnitel'naya chast' modulya }
Uses Strings;
Type THipStr=array[1..452] of char; { Tip strochki kataloga }
Var f : file of THipStr; { Failovaya peremennaya kataloga }
{ Otkrytie faila kataloga v rezhime "tol'ko chtenie" }
Procedure OpenHipparcosMain;
begin
FileMode:=0; { Read only }
assign(f,HipparcosName); reset(f);
end;
{ Zakrytie faila kataloga }
Procedure CloseHipparcosMain;
begin
close(f);
end;
{ Chtenie odnoi zapisi }
Function ReadHipparcosMain(var s : THipparcos):boolean;
{ Lokal'nye peremennye funkcii }
var hs : THipStr; { Strochka kataloga }
st : array [0..15] ofchar; { vspomogatel'nyi bufer }
code : integer; { kod oshibki pri preobrazovanii v chislo }
i : integer; { vspomogatel'naya peremennaya }
begin
{ Esli dostignut konec faila, to vozvrashaem False }
ifeof(f) then ReadHipparcosMain:=falseelse
begin
ReadHipparcosMain:=true; { Rezul'tat funkcii - true }
read(f,hs); { Chtenie odnoi strochki kataloga }
with s do { Operacii s polyami struktury s }
begin
info:=0; { Obnulenie vseh bitov flaga }
{ + Operaciya @ oboznachaet adres.
+ Procedura Val preobrazuet tekstovuyu stroku v chislo,
code otlichaetsya ot nulya v sluchae oshibki preobrazovaniya.
+ Funkciya StrLCopy kopiruet podstroku s ukazaniem
startovoi pozicii i kolichestva bait.
}
{ Interpretaciya 12 bait, nachinaya s 3-go - eto nomer HIP. }
Val(StrLCopy(st,@hs[3],12),hip,code);
{ Chtenie koordinat: po 12 bait s 52 i s 65 pozicii. }
Val(StrLCopy(st,@hs[52],12),RAdeg,code);
if code<>0 then info := NoRaDe;
Val(StrLCopy(st,@hs[65],12),DEdeg,code);
if code<>0 then info := NoRaDe;
{ Chtenie parallaksa - 7 bait s 80-i pozicii }
Val(StrLCopy(st,@hs[80],7),Plx,code);
if code<>0 then info := info or NoPlx;
{ Chteniesobstvennyh dvizhenii: po 8 bait s 88 i s 97 pozicii }
Val(StrLCopy(st,@hs[88],8),pmRA,code);
if code<>0 then info := info or Nopm;
Val(StrLCopy(st,@hs[97],8),pmDE,code);
if code<>0 then info := info or Nopm;
s.AstroRef:=hs[78]; { Flag kratnoi zvezdy }
{ Chtenie zv.velichiny i pokazatelya cveta B-V po shkale Dzhonsona }
Val(StrLCopy(st,@hs[42],5),VMag,code);
if code<>0 then info := info or NoVMag;
Val(StrLCopy(st,@hs[246],6),B_V,code);
if code<>0 then info := info or NoB_V;
{ Chtenie oshibok sootv. velichin }
with sigma dobegin
if (info and NoRADE) = 0 then
begin
{ Dannye ob oshibkah vsegda prisutstvuyut, }
{ esli prisutstvuyut i sami koordinaty. }
Val(StrLCopy(st,@hs[106],6),RAdeg,code);
Val(StrLCopy(st,@hs[113],6),DEdeg,code);
end;
if (info and NoPlx) = 0 then
begin
Val(StrLCopy(st,@hs[120],6),Plx ,code);
end;
if (info and Nopm) = 0 then
begin
Val(StrLCopy(st,@hs[127],6),pmRA,code);
Val(StrLCopy(st,@hs[134],6),pmDE,code);
end;
end; { with sigma }
{ Chtenie dannyh o spektral'nom klasse }
for i:=0 to 9 do Sp[i]:=hs[436+i];
end; { with s }
end; { if eof(f) }
end; { Function }
end.

Funkciya ReadHipparcosMain chitaet daleko ne vse polya kataloga, odnako net nikakih trudnostei v dopolnenii zapisi THipparcos drugimi polyami i po privedennomu obrazcu prochitat' ih znacheniya iz tekstovogo bufera hs.

Listing 3.2 predstavlyaet primer ispol'zovaniya dannogo modulya. Programma TestHip podschityvaet: skol'ko zvezd v kataloge Hipparcos ne imeyut dannyh o tochnyh koordinatah, sobstvennyh dvizheniyah i parallaksah. Na ris. 3.4 mozhno videt' rezul'taty.

Listing 3.2. Podschet zvezd bez dannyh o koordinatah, sobstvennyh dvizheniyah i parallaksah
Program TestHip;
Uses HipMain; { Podklyuchenie modulya raboty s katalogom }
var s : THipparcos; { Struktura dannyh o zvezde }
NoCoord : longint; {Schetchik zvezd bez tochnyh koordinat }
NoProp : longint; {Schetchik zvezd bez sobstv. dvizhenii }
NoPar : longint; {Schetchik zvezd bez parallaksov }
begin
NoCoord:=0; NoProp:=0; NoPar:=0; { Obnulenie schetchikov }
OpenHipparcosMain; { Otkrytie kataloga }
while ReadHipparcosMain(s) do { Cikl chteniya kataloga }
begin
{ Sravnenie bitov v maske s konstantami }
if (s.info and NoRADE)<>0 then inc(NoCoord);
if (s.info and Nopm) <>0 then inc(NoProp);
if (s.info and NoPlx) <>0 then inc(NoPar);
end;
CloseHipparcosMain; { Zakrytie kataloga }
{ Vyvod rezul'tatov }
writeln('Zvezd bez tochnyh koordinat ',NoCoord);
writeln('Zvezd bez sobstvennyh dvizhenii ',NoProp);
writeln('Zvezd bez parallaksov ', NoPar);
end.


Ris. 3.4. Rezul'tat raboty programmy TestHip.

Kak my vidim, zvezd bez tochnyh astrometricheskih dannyh - 263. Putem nebol'shogo uslozhneniya programmy (sdelaite samostoyatel'no) mozhno pokazat', chto esli u zvezdy net dannyh o tochnyh koordinatah, to net dannyh ni o parallakse, ni o sobstvennyh dvizheniyah.

3.3. Ispol'zovanie sobstvennyh kriteriev otbora zvezd

Neslozhnye kriterii otbora zvezd legko mozhno realizovat' samostoyatel'no v programme, ne pribegaya k pomoshi Celestia. Naprimer, napishem programmu, kotoraya postroila by raspredelenie zvezd Hipparcos po absolyutnoi zvezdnoi velichine s shagom v odnu velichinu dlya zvezd, otnositel'naya tochnost' opredeleniya parallaksov kotoryh luchshe, chem 50% (sleduet otmetit', chto dazhe otbor zvezd po takomu kriteriyu ne vozmozhen v Celestia).

Programma na listinge 3.3 reshaet postavlennuyu zadachu.

Listing 3.3. Vychislenie raspredeleniya zvezd po absolyutnoi zvezdnoi velichine
Program AbsMagDistrib;
Uses HipMain;
{ Realizaciya funkcii vychisleniya desyatichnogo logarifma }
function log(x:double):double;
begin
log:=ln(x)/ln(10.0);
end;
var s : THipparcos;
a : array [-12..+12] of longint; { statistika }
i : integer; { vspomogatel'nayaperemennaya }
r : double; { rasstoyanie }
m : double; { absolyutnayazvezdnayavelichina }
begin
for i:=low(a) to high(a) do a[i]:=0; {obnuleniestatistiki }
OpenHipparcosMain;
while ReadHipparcosMain(s) do
begin
if (s.info and NoPlx)<>0 thencontinue;{net dannyh o parall.}
if s.plx<=0.0 thencontinue; { nepolozhitel'nyi parallaks }
if s.sigma.plx/s.plx>0.5 thencontinue; {tochnost' huzhe 50%}
r:=1000.0/s.plx; { Vychislenie rasstoyaniya v pk }
m:=S.VMag-5.0*log(r)+5.0; {Vychisl. absolyutnoi zvezd. velichiny }
i:=round(m); { Opredelenie indeksa yacheiki massiva }
if (i>=low(a)) and (i<=high(a)) then inc(a[i]);{uv.na 1}
end;
CloseHipparcosMain;
for i:=low(a) to high(a) do writeln(i:3,a[i]:7);
end.


Ris. 3.5. Raspredelenie zvezd Hipparcos po absolyutnoi zvezdnoi velichine.

Razberem strukturu programmy. Massiv sluzhit dlya nakopleniya statistiki raspredeleniya zvezd po absolyutnym zvezdnym velichinam. Element s indeksom soderzhit kolichestvo zvezd, popadayushih v diapazon zvezdnyh velichin ot  - 0.5 do + 0.5. Naprimer, element s indeksom -3 soderzhit kolichestvo zvezd, u kotoryh zvezdnaya velichina v diapazone ot -3.5 do -2.5.

V cikle chteniya zvezd snachala my otbrasyvaem zvezdy, u kotoryh net dannyh o parallakse (operator continue privodit k propusku ostavshihsya operatorov tela cikla i nachinaet sleduyushuyu iteraciyu). Sleduyushii uslovnyi operator otbrasyvaet zvezdy s otricatel'nym i nulevym znacheniem parallaksa. Takih zvezd otnositel'no nemnogo - 4245, nepolozhitel'noe znachenie parallaksa svidetel'stvuet o tom, chto oshibka opredeleniya parallaksa okazalas' bol'she samoi velichiny, a reshenie dlya konkretnoi zvezdy dalo formal'noe znachenie velichiny.

Tretii uslovnyi operator propuskaet zvezdy, dlya kotoryh otnositel'naya tochnost' opredeleniya parallaksa okazalas' huzhe, chem 0.5 (50%).

Sleduyushie dva operatora vychislyayut rasstoyanie i absolyutnuyu zvezdnuyu velichinu.

Sleduyushaya stroka soderzhit operator, opredelyayushii indeks elementa massiva [], v kotoryi "popadaet" zvezda. Eto delaetsya s pomosh'yu vstroennoi funkcii okrugleniya veshestvennogo chisla do blizhaishego celogo round. Esli indeks nahoditsya v dopustimom diapazone, to sootvetstvuyushii element massiva uvelichivaetsya na edinicu oper