2023-09-16: APP 2.0.0-beta23 has been released !
Improved performance again, CMD-A now works in macOS File Chooser, big improvement for bad column cosmetic correction, solved several bugs
We are very close now to releasing APP 2.0.0 stable with a complete printable manual...
Astro Pixel Processor Windows 64-bit
Astro Pixel Processor macOS Intel 64-bit
Astro Pixel Processor macOS Apple M Silicon 64-bit
Astro Pixel Processor Linux DEB 64-bit
Astro Pixel Processor Linux RPM 64-bit
RFCs - Request for changes
4
Posts
3
Users
4
Likes
890
Views
Topic starter
February 11, 2022 20:08
Hey!
It would be realy nice if all Fits Headers will be kept in saved calibrated frames.
Currently some worthfull informations like Rotation Angle and Coords are lost :'(
Thanks
Philip
Mabula-Admin reacted
February 11, 2022 21:55
@pmneo Thanks for the request. I asked Mabula to reply.
Mabula-Admin reacted
February 12, 2022 13:04
Hi @pmneo,
Thank you very much for your suggestion. It is on our ToDo list to keep as much info as possible in the Fits headers 😉
Mabula
Topic starter
February 13, 2022 11:07
Thanks @mabula-admin
Until then, i have wrote a simple Java helper to copy all not present FITS Headers:
package sandbox; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import nom.tam.fits.Fits; import nom.tam.fits.FitsException; import nom.tam.fits.Header; import nom.tam.fits.HeaderCard; import nom.tam.util.Cursor; public class CopyFitsHeaders { public static void main(String[] args) throws IOException, FitsException { File root = new File("C:\\ASI1600\\Nikkor"); for( File base : root.listFiles() ) { if( base.isDirectory() == false ) { continue; } System.out.println( "Processing " + base ); LinkedList lights = collectFits( new File( base, "Light" ) ); LinkedList calibratedLights = collectFits( base ); calibratedLights.removeAll( lights ); for( File light : lights ) { final LinkedList matchingCalibratedLights = new LinkedList<>(); for( File c : calibratedLights ) { if( c.getName().startsWith( light.getName().substring(0, light.getName().length() - ".fits".length() ) ) ) { matchingCalibratedLights.add( c ); break; } } if( matchingCalibratedLights.size() == 0 ) { System.err.println( "No calbirated light found for " + light ); continue; } Fits f = new Fits( light ); try { for( File calibratedLight : matchingCalibratedLights ) { Fits t = new Fits( calibratedLight ); try { Header header = f.getHDU(0).getHeader(); Header targetHeader = t.getHDU(0).getHeader(); Map<String, HeaderCard> targetHeaders = new HashMap<>(); Cursor<String, HeaderCard> ti = targetHeader.iterator(); while( ti.hasNext() ) { HeaderCard h = ti.next(); targetHeaders.put( h.getKey(), h ); } int written = 0; Cursor<String, HeaderCard> i = header.iterator(); while( i.hasNext() ) { HeaderCard h = i.next(); if( targetHeaders.get( h.getKey() ) == null ) { //System.err.println( h ); //System.err.flush(); ti.add( h.copy() ); written++; } } if( written > 0 ) { System.out.println( "Updating " + written + " FITS headers to " + calibratedLight ); t.write( calibratedLight ); } } finally { t.close(); } } } finally { f.close(); } } } System.out.println( "Finished" ); } private static LinkedList collectFits(File lights) { LinkedList allLights = new LinkedList( listFilesAsList(lights) ); LinkedList allFits = new LinkedList( ); while( allLights.size() > 0 ) { File light = allLights.removeFirst(); if( light.isDirectory() ) { allLights.addAll( listFilesAsList(light) ); } else if( light.getName().endsWith( ".fits" ) ) { allFits.add( light ); } } return allFits; } private static List listFilesAsList(File lights) { File files[] = lights.listFiles(); if( files == null ) { return Collections.emptyList(); } else { return Arrays.asList( files ); } } }
CS
Wouter van Reeven and Vincent-Moderator reacted