# Pomocník

## Tenmon pomocník

Tenmon slúži primárne na zobrazenie astronomických fotiek a obrázkov. Dokáže otvoriť nasledovné formáty:

- FITS 8, 16, 32 bitové celočíselné 32 a 64 bitové s plávajúcou čiarkou
- XISF 8, 16, 32 bitové celočíselné 32 a 64 bitové s plávajúcou čiarkou
- JPEG, PNG, BMP, GIF, PBM, PGM, PPM a SVG obrázky
- CR2, CR3, NEF, DNG raw obrázky

### Hlavné okno

V hlavnom okne sa zobrazujú načítané obrázky. Naľavo sú potom Informácie o obrázku kde sa zobrazujú podrobné informácie o aktuálnom obrázku a Zoznam súborov kde sú všetky obrázky z adresára kde je aktuálne zobrazený obrázok. Hore je hlavné menu a pod ním je Panel úrovní. Všetky panely sa dajú zavrieť a presúvať. Zatvorený panel sa dá znova zobraziť v menu Dokovacie panely.

Na spodnom okraji okna je lišta v ktorej sa ukazuje aktuálna hodnota pixelu pod kurzorom a ak má obrázok WCS dátá aj aktuálne celestiálne koordináty.

### Otváranie a ukladanie obrázkov

Otvoriť obrázok je možné v menu Súbor->Otvoriť. Po vybraní súboru ktorý sa má otvoriť je tento zobrazený v hlavnom okne. Taktiež sú v panely Súborový systém zobrazené ďalšie obrázky v adresári kde sa nachádza zobrazený obrázok.

Aktuálne zobrazený obrázok je možné uložiť v inom formáte cez voľbu Súbor->Ulož ako. Dá sa vybrať formát JPEG, PNG, FITS a XISF. V prípade JPEG alebo PNG sa aplikuje funkcia na úpravu úrovní. Pri FITS a XISF sa dáta skonvertujú bez zmeny úrovní.

### Zobrazenie

Menu Zobrazenie ovplyvňuje veľkosť a škálu zobrazovaných obrázkov. Priblížiť/Oddialiť zväčší a zmenší obrázok. Na toto tiež slúži aj kolečko myši. Najlepšia veľkosť zobrazí obrázok tak aby bol zobrazený na celú plochu. 100% zobrazí obrázok v pomere 1:1. Celá obrazovka zobrazí hlavné okno na celú obrazovku. Náhľady zobrazí malé náhľady pre všetky obrázky z aktuálneho adresára.

### Panel úrovní

Tento panel umožňuje upraviť spôsob ako sa zobrazujú obrazové dáta. Ako prvá je na tomto panely posuvná škála na ktorej sa dajú nastaviť tri body.

- čierny bod - všetky pixeli s hodnotou menšou ako nastavená budú zobrazené ako čierne
- stredný bod - pixeli s touto hodnotou budú zobrazené ako 50% šedá
- biely bod - pixeli nad touto hodnotou budú zobrazené ako biele

Nasleduje 8 tlačidiel pre nastavenie zobrazenie obrázka:

- Prepojené kanály prepína medzi nataihnutím jasových urovní pre každý RGB kanál zvlášť alebo jednotné pre všetky kanály.
- Automatické natiahnutie automaticky nastavý čierny, šedý a biely bod pre optimálne zobrazenie..
- Resetuj funkciu prevodu na obrazovku nastavý hodnoty čierneho, šedého a bieleho bodu na východzie hodnoty.
- Invertuj farby invertuje zobrazené farby a zobrazý obrázok ako negatív.
- Falošné farby pre zobrazenie čiernobielych obrázkov sa použije farebná paleta.
- Preved CFA na farbu Demosaicing black and white image from CFA sensor to color one.
- Aplikuj automatické natiahnutie pri načítaní pri zapnutí
- Vykresli equatoriálnu mriežku zapína zobrazenie equatoriálnej mriežky. Je poitrebné aby súbor obsahoval WCS dáta.

Prvé tlačidlo prepína prepojenie nastavenia čierneho, stretdného a bieleho bodu. Po prepnutí sa dá každý farebný kanál nastaviť samostatne. Nasleduje tlačidlo ktoré nastaví hodnoty čierneho a stredného bodu tak aby bol obrázok zobrazený optimálnym jasom. Druhé tlačidlo resetuje hodnoty pre čierny, stredný a biely bod na východzie hodnoty. Invertovanie farieb zobrazí obrázok ako negatív. Falošné farby zobraí čiernobiele obrázky vo farebnej škále. Prevoď CFA na farbu prevedie demozaikovanie čiernobieleho obrázku na farebný. Posledné tlačidlo zapína a vypína nastavovanie optimálnych hodnôt úrovní pre každý obrázok zvlášť.

### Označovanie obrázkov

Obrázky je možné si označiť cez menu Výber. Zoznam takto označených obrázkov sa dá zobraziť cez Výber->Ukázať označené. V tomto dialógu sa dá tiež tento zoznam upraviť. Okrem toho sa pri označených obrázkoch zobrazuje znak * v záhlaví hlavného okna. Takto označené obrázky je potom možné skopírovať alebo presunúť do vybraného adresára pomocou Súbor->Skopírovať/Presunúť označené súbory. Po skopírovaní alebo presunutú sa zoznam označených obrázkov vymaže. Program si tento zoznam pamätá aj po svojom ukončení.

Ďalší spôsob ako označiť obrázky je cez databázu FITS/XISF kde je možné vybrať jednotlivé riadky. Potom stačí vybrať označit alebo odznačiť v kontextovom menu. Označené súbory budú zobrazené tučným textom. Tretí spôsob na označenie obrázkov je možné cez náhľady. Držaním Shift a následne kliknutím ľavým tlačítkom myši sa daný obrázok označí. Pre odznačenie je treba držať Ctrl

### Databáza FITS/XISF súborov

Program vie prehľadať adresár a indexovať meta údaje z FIST a XISF obrázkov do internej databázy v ktorej sa dá následne vyhľadávať. Najprv je treba indexovať adresár s FIST/XISF obrázkami Súbor->Indexovať adresár. Vybraný adresár je prehľadaný a meta údaje z FIST a XISF obrázkov sú uložené do databázy. Na kontrolu a obnovu datábazy je možné spustiť re-indexáciu Súbor->Reindex. Toto obnoví zmenené údaje a odstráni záznamy o už neexistujúcich súboroch. Pre indexovanie nových súborov je treba znova pustiť indexáciu.

Pre zobrazenie databázy je treba zobraziť jej panel cez Dokovacie panely->Databáza FITS/XISF súborov. Databáza je zobrazená vo forme tabuľky kde sú jednotlivé stĺpcoch zobrazené vybrané vlastnosti. V spodnej časti panelu je tlačidlo ktoré zobrazí dialóg na výber zobrazovaných sĺpcov. Nasledujú tri výberové a textové polia. Tieto slúžia na vyhľadávanie v databáze. Výberové pole určuje stĺpec v ktorom sa má vyhľadávať a do textového poľa sa zadáva hodnota na vyhľadanie.

Zastupné znaky:

- % (percent) je zastupný znak reprezentujúci žiadný alebo hocikoľko znakov.
- _ (underscore) je zastupný znak nahrádzajúci presne jeden znak.
- Bez zástupných znako sa hľadá presná zhoda.

V nasledovnom príklade sa vyhľadajú súbory ktoré majú v mene súboru "Bias", OBJECT je M_42 a DATE začína reťazcom 2022. Znak % sa berie ako zástupný znak za hocijaký reťazec znakov aj žiadny. Znak _ je tiež zástupný znak zastupujúci práve jeden znak. Bez použitia zástupných znakov sa vyhľadá iba presný výskyt.

### Database tree

This is another view that show indexed database as tree. You can add or remove tree grouping that construct a tree structure from FITS keywords. Each level of tree will be based on this grouping. You can specify one keywords multiple times. When adding a grouping you can also specify aggregation function that is applied to last level. SUM will add up all numbers in that group usefull for example for EXPTIME. COUNT will show how many files are in that group. AVG will show average value, MIN,MAX,MEDIAN will calculate minimum, maximum and media value in that group. So if you select CCD-TEMP as last with AVG it will calculate average temperature. Double click on file in tree view will open that file.

### Plate Solving

Tento modul umožnuje vyriešiť obrázok a určiť RA, DEC koordináty a aktualizovať FITS a XISF súbory s WCS dátami. Profil toto nastavuje rôzne parametre ovplivňujúce extrahovanie hviezd a hľadanie koordinátov. Štartovný bod program sa pokúsi automaticky určiť bod začiatku hľadania koordinátov pre zrýchlenie hľadania. Možete nechať jednu alebo obydve voľbi nezaškrtnuté kedy sa bude hľadať riešenie naslepo. Ak je pozícia alebo škála nesprávna hľadanie môže zlyhať. Riešenie táto časť obsahuje výsledné riešenie hľadania ako sú RA,DEC koordináty stredu obrázku, veľkosť zorného poľa, uhol natočenia v stupňoch, škála obrázku v arcsekundách na pixel, počet nájdených hviezd a veľkosť hviezd HFR a excentricita. Potom je tu ešte okno so záznamom z riešenia.

Pod tým je tlačidlo pre nastavenie cesty k indexovým súborom a ich stiahnutie. Je možné buď stiahnuť indexové súbory alebo použiť už existujúce súbory. Tlačidlo Extrahovať nájde hviezdy a zobrazý ich počet veľkosť HFR a excentricitu. Na toto nie sú potrebné indexové súbory. Tlačidlo Vyriešiť sa pokúsi nájsť koordináty obrázka. Zrušiť preruší hľadanie riešenia. Aktualizovať FITS hlavičku zapíše najdené riešenie do súboru.

In settings dialog you can set path to index files which is by default custom internal one. It also try to locate commonly used path from other programs like KStars for astrometry.net index files.

### File Manager

This is simple double panel file manager. It can show columns with selected FITS keywords. Each panel have tabs where it easily switch between multiple directories. You can copy or move files and directories either inside one panel or between two panels by selecting and then dragging. By default files are copies. To move then press Shift key before start dragging. Double click on file will open it in main window if it is image or other file it will open default program that is associated with it this file type. You can also drag file to other programs like from default file explorer programs that are in system or from file explorer to this program.

In menu you can select which FITS keywords will be showed. Temporarilly disable loading FITS header or copy file paths of selected files as text.

### Command line options

Tenmon can be executed from command line. It support these command line options.

- --thumb, --thumbnail <path> Generate thumbnail and save it to path. It generate it from first file provided as argument.
- -s, --size <size> size of generated thumbnail. Aspect ratio of input image is preserved.
- --script <script> execute a script from file path same manner as executed from GUI.
- --scriptarg <arg>>; pass this string as variable scriptarg to a running script.
- --outdir <dir> output dir for script execution. By default current working directory is used.
- --noexit by default application exit when execution of script specified with --script ends. This prefent that.
- -h, --help show help end exit.
Any other arguments are taken as input paths. If only one file path is specified then that image is open and image list is populated by directory containing that image. If directory is specified then it is same as selecting that directory in "Open directory recusivelly". If multiple files are specified then image list will contain just these speicified images. When exuecting script with --script then these paths are used as input files and directories as in "Batch processing"

### Hromadné spracovanie

Tento modul umožnuje písanie skriptov v JavaScripte ktoré spracujú súbory obrázkov. Okno Hromadného spracovanie pozostáva z troch častí. Navrchu je zoznam vstupných súborov a adresárov. Do zoznamu môžete pridať adresáre alebo jednotlivé súbory. Adresáre sú rekurzívne prehľadané na všetky súbory. Zoznam súborov je potom predaný do skriptu ako pole nazvané files. V skripte potom cez toto pole iteruje nasledovne.

    for(file in files)
    {
        if(file.suffix() == "fits")
        {
            core.log(file.fileName());
            file.convert(file.relativeFilePath(), "XISF");
        }
    }

Pod týmto zoznamom je výstupný adresár. Všetky relatívne cesty predané do metod ako sú copy(), move() alebo convert() budú relatívne voči tomuto adresáru. Ak je ako argument použitá absolútna cesta tak je tento vystupný adresár ignorovaný.

Nasleduje logovacie okno kde sú zapisováné všetký výpisy z behu scriptu. Hlavne volania z `core.log()` Na spodu je konzola kde je možné vkladať jednoduché príkazy a nakoniec ešte tlačítka ktoré spúštať alebo zastavovať vybraný skript.

#### core

V skripte je dostupný globálny objekt nazvaný core ktorý má nasledovné metódy.

- log(message) vypíše message do okna záznamu.
- mark(file) označí súbor rovnako ako cez GUI. Parameter je objekt typu File.
- unmark(file) odznačí súbor rovnako ako cez GUI. Parameter je objekt typu File.
- isMarked(file) overenie či je súbor označený. Parameter je objekt typu File.
- setMaxThread(maxthread) nastavý maximálny počet paralelných vlákien pri vykonávaní asynchrónnych úloh.
- sync() počká kým sa dokončia všetky asynchrónne úlohy.
- getString(label = "", text = "") ukáže dialóg pre získanie textovej hodnoty od používateľa. Prvý parameter je textový popis. Druhý parameter je východzia hodnota. Obydva parametre sú voliteľné takže aj volanie getString() je valdiné. Metoda vracia textový retazec alebo Undefined ak bolo stlačené tlačidlo zrušiť.
- getInt(label = "", value = 0) ukáže diálog pre získanie celočíselnej hodnoty. Prvý parameter je textový popis. Druhý parameter je východzia hodnota. Obydva parametre sú voliteľné. Vracia zadané číslo alebo ak je stlačené tlačidlo zrušiť vráti Undefined.
- getFloat(label = "", value = 0, decimals = 3) ukáže diálog pre získanie reálneho čísla. Prvý parameter je textový popis. Druhý parameter je východzia hodnota. Tretí parameter je počet desatinných miest. Obydva parametre sú voliteľné. Vracia zadané číslo alebo ak je stlačené tlačidlo zrušiť vráti Undefined.
- getItem(items) ukáže dialog pre výber jednej hodnoty z poľa hodnôt. Vracia vybranú hodnotu ako String alebo ak je stlačené tlačidlo zrušiť vráti Undefined.
- setStartingSolution(solution) with this you can set starting point and image scale. It accepth object with attributes "ra", "dec", "pixscale". Same object as returned by File.solve() method. You can also call it without paramer in which case it will clear any previously set values.
- getSolverProfile() return solver profile as Object.

      var profile = core.getSolverProfile();
      core.log(JSON.stringify(profile));

- setSolverProfile(index) set solver profile by index. Valid values are from 1 to 8 as in GUI.
- setSolverProfile(profile) set solver profile. Parameter is same as object returned by getSolverProfile() method
- question(question, buttons, title = "") show dialog with question. First argument question is string. Second argument buttons is array of following strings. "ok", "yes", "no", "yesall", "noall", "abort", "retry", "ignore", "cancel", "discard", "apply", "reset" Third argument title is optional string that show in title bar. It return button that was clicked as a string.

      var button = core.question("Apply to all files?", ["yes", "no"]);

- plot(graph) this method show graph defined by JS object.

      var chart = {
          "title": "Chart title", // Title that will show on top of chart
          "legend":
          {
              "visible": true,// default is true
              "align": "left" // allowed values are "top", "right", "bottom", "left". default is "top"
          },
          "series":[ // array of data series
              {
                  "title": "HFR",
                  "type": "bar", // type of the serie. Can be one of "line", "points", "linePoints", "bar"
                  "y":[2.5,3.1,2.6,2.2] // array of values
              },
              {
                  "title": "Ecc",
                  "y":[0.37, 0.4, 0.35, 0.25],
                  "color": "red" // color of serie. It can be name of color like "green" or RGB hex value "#ccddff"
              },
              {
                  "title": "Stars",
                  "type": "points", // type of serie. can be "line", "points", "linePoints" and "bar". Default is "line"
                  "shape": "star", // shape of markers. valid only for points
                  "x":[1, 2.5, 3.5, 6],// line, points and linePoints can also have "x" values. Otherwise it assume sequence 0,1,2 ...
                  "y":[523,412,487,510],
                  "y2": true, // if set to true this serie will use secondary Y axis
                  "bestFit": true, // show best fit line
                  "color": "#0000ff"
              }
          ]
      };

      core.plot(chart);

#### File

V poli files sú inštancie objektu typu File ktorý ma nasledovné metódy.

- fileName() returns the name of the file, excluding the path.
- absoluteFilePath() returns an absolute path including the file name.
- absolutePath() returns an absolute path without the file name
- relativeFilePath() return relative path including file name relative to directory that was in list of directories to be scanned. For example you add C:/images as input directory. In this directory there is file C:/images/lights/red/M42_001.fits then this method will return lights/red/M42_001.fits
- relativePath() return same path as previous method just without file name. lights/red
- baseName() return file name up to the first dot. For example for some.file.name.fits it will return some
- completeBaseName() return file name up to the last dot. For example for some.file.name.fits it will return some.file.name
- suffix() return string after last dot in file name. For example fits
- size() return size of file in bytes.
- fitsKeywords() return array of strings with every keyword that is in header. SIMPLE,BITPIX,NAXIS,NAXIS1,NAXIS2,EXTEND,COMMENT
- fitsValue(key) return value for keyword. In case that there is multiple occurrences it return last one.
- fitsValues(key) return array of values for keyword.
- fitsRecords() return array of objects with properties key, value and comment
- modifyFITSRecords(FITSRecordModify) modify FITS header by adding, removing or updating FITS record. Return true on success. Refer to FITSRecordModify
- isMarked() return true if file is marked.
- copy(newpath) copy file to new location. It return instance of new File object that represent this copied file. This path can be relative or absolute. In case that newpath parameter is relative path then it "Output directory" from GUI windows is used as base directory. Parameter newpath can absolute path. File is then copied to this path. In case that copy fail it return null.
- move(newpath) move file to new location. It return false if move failed. This can happend if destination is not writable but also if destination file already exist. This functions does not overwrite existing file. This path can be relative or absolute. In case that newpath parameter is relative path then it "Output directory" from GUI windows is used as base directory. Parameter newpath can be absolute path. File is then moved to this path.
- convert(outpath, format, params) convert image file from any format that program is able to open into FITS, XISF, JPEG, PNG, BMP. Parameters are: outputpath path where converted image will be saved. It automatically replace suffix according to format. format one of "FITS" "XISF", "JPG", "PNG", "TIFF" or "BMP". params object with attributes "compressionType" and "compressionLevel". Valid values for compressionType are be "gzip" or "rice" when converting to FITS. When converting to XISF compressionType can be "zlib", "lz4", "lz4hc", "zstd", "zlib+sh", "lz4+sh", "lz4hc+sh", "zstd+sh". It is recommended to use "+sh" variants of compression. XISF format also accept "compressionLevel" in range 0-100 where zero is fastest compression and 100 slowest. If you omit this attribute or set it to -1 then default compression level will be used. It return new instance of File that point to converted file.

      file.convert("converted_file.xisf", "xisf", {"compressionType": "zstd+sh", "compressionLevel": 70});
      file.convert("converted_file.fits", "fits", {"compressionType": "rice"});
      file.convert("converted_file.jpg", "png");

- convertAsync(outpath, format, params) same as previous method but it does conversion in separated thread asynchronously and in parallel. Before calling any method on object returned by this method you must call `core.sync();` to ensure that conversion is done and destination file exists.

      let compression = {"compressionType": "zstd+sh"};
      let convertedFiles = [];
      for(file of files)
      {
          if(file.suffix() == "fits")
              convertedFiles.push(file.convertAsync("xisf/" + file.fileName(), "XISF", compression));
      }
      core.sync(); // ensure that files exist
      for(file of convertedFiles)// now we can iterate over the files
      {
          core.log(file.fileName() + " " + file.size()); // let print compressed file sizes
      }

- stats() calculate basic images statistics and return them as object with attributes "mean", "stddev", "median", "min", "max" and "mad".

      let s = file.stats();
      core.log("Median value is " + s.median);

- solve(updateHeader) this method will run plate solving on this image and will return solution in form of object with these attributes "ra" and "dec" which are center coordinates of image "fieldWidth" and "fieldHeight" which is FOV of image in arcseconds, "orientation" is degrees east of north, "pixscale" scale of image in arcseconds per pixel, "parity" true false value if the image was flipped in vertical direction, "raError" and "decError" deviation from starting point. When updateHeader is set to true it update FITS header for file with this solution. Default value is false.
- extractStars(hfr) extract stars will run extraction of stars. When parameter hfr is set to true it will fit HFR on every star. It return array of objects representing extracted stars. Each object in array will have these attributes "x" and "y" pixel coordinates of center of star, "mag" relative magnitude of star, "flux" total flux, "peak" peak value of star, "HFR" half flux radius of star, "a" and "b" semi major and minor axis of star, "theta" angle of orientation of the star, "ra" and "dec" coordinates of star, "numPixels" number of pixel occupied by the star in image.

#### FITSRecordModify

This class is used to define modify operation FITS header in FITS and XISF files. It can remove update and add records. Order of operation is also remove then update and last add. The keyword names may be up to 8 characters long and can only contain uppercase letters, the digits 0-9, the hyphen, and the underscore character.

    let modify = new FITSRecordModify();
    modify.updateKeyword("OBJECT", "M42");
    modify.updateKeyword("MYTILE", "PART1", "adding custom keyword so WBPP can group it");
    modify.removeKeyword("OBJECT");
    // doesn't matter that it is specified as last. This will first remove
    // existing OBJECT record and then add again OBJECT=M42
    for(file in files)
    {
        file.modifyFITSRecords(modify);
    }

- new FITSRecordModify() create new instance of object.
- removeKeyword(key); specify removing of record with key as keyword.
- updateKeyword(key, value, comment = "") specify updating existing keyword with value and comment. Comment is optional parameter. If record with keyword doesn't exist then it will add new one. Unless you want to have multiple records with same keyword (for example HISTORY) always use this method and not addKeyword.
- addKeyword(key, value, comment = "") specify adding new keyword

PS: Kanji v ikone programu znamená "astronomia" v Japončine