Difference between revisions of "CCD data reduction"

From AOB Wiki
Jump to navigation Jump to search
(Created page with "== Creation of lists == filter="L" ls bias*[0-9].fit > bias.list ls dark600s-00*fit > dark600s.list ls dark*5sec*fit > dark5s.list ls flat*${filter}.fit > flat${filt...")
 
 
(29 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Creation of lists ==
+
== Basic data reduction using IRAF ==
  filter="L"
 
  ls bias*[0-9].fit > bias.list
 
  ls dark600s-00*fit > dark600s.list
 
  ls dark*5sec*fit > dark5s.list
 
  ls flat*${filter}.fit > flat${filter}.list
 
  sed s/^/b/g flat${filter}.list > bflat${filter}.list
 
  sed s/^/bd/g flat${filter}.list > bdflat${filter}.list
 
  ls ngc*${filter}.fit > ${filter}.list
 
  sed s/^/b/g ${filter}.list > b${filter}.list
 
  sed s/^/bd/g ${filter}.list > bd${filter}.list
 
  sed s/^/bdf/g ${filter}.list > bdf${filter}.list
 
  sed s/^/objbdf/g ${filter}.list | sed s/fit/pl/g > objbdf${filter}.list
 
  
== Basic data reduction ==
+
Below is a bash script that creates lists of all images: biases, flats, darks and targets.
  # cat reduce.cl
+
Special case of dark frames of 600sec that Milankovic generates is used
  imcombine @bias.list master_bias comb=med  
+
Last lines create ascii files with median values in flat frames that will be used
  imarith @dark600s.list - master_bias b@dark600s.list
+
for their normalization.
  imarith @dark5s.list - master_bias b@dark5s.list
+
 
  imcombine b@dark5s.list dc_5s comb=med
+
<pre style="color: red">
  imcombine b@dark600s.list master_dark_600s comb=med  
+
The script creates reduce.cl IRAF script that should be run from iraf:
  imarith master_dark_600s * 0.5 dc_300s
+
cl < reduce.cl
  imarith @flatFILTER.list - master_bias @bflatFILTER.list
+
</pre>
  imarith @bflatFILTER.list - dc_5s @bdflatFILTER.list
+
 
  imstat @bdflatFILTER.list fields="image,midpt" > normFILTER.txt
+
<pre>
# sed 's/FILTER/'${filter}'/g'  reduce.cl > do.cl
+
#!/bin/bash
  cl < do.cl
+
 
  # while read line; do echo $line | awk '! /^#/{print "imarith "$1" / "$2,"n"$1}'; done < norm${filter}.txt > doflatnorm.cl
+
rm *list
  cl < doflatnorm.cl
+
for frame in $(ls *fit); do
  # echo "imcomb n@bdflat${filter}.list master_flat_${filter} comb=med" > do.cl
+
filterType=$(gethead filter $frame)
  cl < do.cl
+
imageType=$(gethead imagetyp $frame)
# cat img.cl
+
outFileName=$(echo $imageType | tr '[:upper:]' '[:lower:]')
imarith @FILTER.list - master_bias @bFILTER.list
+
# test if DARK
imarith @bFILTER.list - dc_300s @bdFILTER.list
+
if [ ${imageType} = "DARK" ]; then
imarith @bdFILTER.list / master_flat_FILTER @bdfFILTER.list
+
exptime=$(gethead exptime $frame | cut -d. -f1)
# sed 's/FILTER/'${filter}'/g' img.cl > doimg.cl
+
ls $frame >> ${outFileName}${exptime}"s".list
cl < doimg.cl
+
echo "b"$frame >> "b"${outFileName}${exptime}"s".list
 +
else ls $frame >> ${outFileName}${filterType}.list
 +
fi
 +
# test if LIGHT and create additional lists
 +
if [ ${imageType} = "LIGHT" ]; then
 +
exptime=$(gethead exptime $frame | cut -d. -f1)
 +
echo $exptime >> exptime${filterType}.list
 +
echo "b"$frame >> "b"${outFileName}${filterType}.list
 +
echo "bd"$frame >> "bd"${outFileName}${filterType}.list
 +
echo "bdf"$frame >> "bdf"${outFileName}${filterType}.list
 +
else if [ ${imageType} = "FLAT" ]; then
 +
                echo "b"$frame >> "b"${outFileName}${filterType}.list
 +
                echo "bd"$frame >> "bd"${outFileName}${filterType}.list
 +
echo "nbd"$frame >> "nbd"${outFileName}${filterType}.list
 +
      fi
 +
fi
 +
done
 +
 
 +
# Create dark current corresponding to each light frame using exposure time
 +
for exptime in $(ls exptime*.list); do
 +
filter=$(echo $exptime | sed -e s/exptime//g -e s/\.list//g);
 +
awk -v filter=${filter} '{print "dc"NR"_"filter".fits"}' exptime${filter}.list  > dc${filter}.list
 +
done
 +
 
 +
if [ -e reduce.cl ]; then rm reduce.cl; fi
 +
echo "imdelete master_bias,dc_600s,dc_5s,dc_1s" >> reduce.cl
 +
echo "imcombine @bias.list master_bias comb=med" >> reduce.cl
 +
echo "imarith @dark600s.list - master_bias @bdark600s.list" >> reduce.cl
 +
echo "imarith @dark5s.list - master_bias @bdark5s.list" >> reduce.cl
 +
echo "imcombine @bdark5s.list dc_5s comb=med" >> reduce.cl
 +
echo "imcombine @bdark600s.list dc_600s comb=med" >> reduce.cl
 +
echo "imarith dc_600s / 600 dc_1s" >> reduce.cl
 +
 
 +
for flats in $(ls flat*list); do
 +
        filterType=$(echo $flats | sed s/flat//g | cut -d. -f1)
 +
        #echo $filterType
 +
echo "imarith @flat${filterType}.list - master_bias @bflat${filterType}.list" >> reduce.cl
 +
echo "imarith @bflat${filterType}.list - dc_5s @bdflat${filterType}.list" >> reduce.cl
 +
echo "imstat @bdflat${filterType}.list fields=\"image,midpt\" format- > norm${filterType}.txt" >> reduce.cl
 +
done
 +
</pre>
 +
 
 +
== Flat field normalization ==
 +
 
 +
From terminal (bash):
 +
<pre> 
 +
for norm in $(ls norm*txt); do while read line; do echo $line | awk '! /^#/{print "imarith "$1" / "$2,"n"$1}'; done < $norm ; done > doflatnorm.cl
 +
</pre>
 +
 
 +
From terminal (IRAF):
 +
<pre>
 +
cl < doflatnorm.cl
 +
</pre>
 +
 
 +
 
 +
== Calibration of science frames ==
 +
 
 +
<pre>
 +
#!/bin/bash/
 +
 
 +
if [ -e reduce_images.cl ]; then rm reduce_images.cl; fi
 +
 
 +
for flat_list in $(ls nbdflat*list); do
 +
        filter=$(echo ${flat_list} | sed -e s/nbdflat//g -e s/\.list//g);
 +
        if [ -e light${filter}.list ]; then
 +
                echo "imcomb @nbdflat${filter}.list master_flat_${filter} comb=med" >> reduce_images.cl
 +
                echo "imarith @light${filter}.list - master_bias @blight${filter}.list" >> reduce_images.cl
 +
                echo "imarith dc_1s * @exptime${filter}.list @dc${filter}.list" >> reduce_images.cl
 +
                echo "imarith @blight${filter}.list - @dc${filter}.list @bdlight${filter}.list" >> reduce_images.cl
 +
                echo "imarith @bdlight${filter}.list / master_flat_${filter} @bdflight${filter}.list" >> reduce_images.cl
 +
        fi
 +
done
 +
 
 +
 
 +
</pre>
 +
 
 +
 
 +
This script creates IRAF's script reduce_images.cl that should be started from IRAF's terminal.
 +
 
 +
<pre style="color: red">
 +
AFTER the script is run from IRAF terminal, clean up the junk (from bash terminal):
 +
</pre>
 +
<pre>
 +
cat blight*list bdlight*list bflat*list bdflat*list nbdflat*list bdark*list dc*.list > tmp_files.list
 +
rm $(<tmp_files.list)
 +
</pre>
  
 
==  BPM & object mask creation ==
 
==  BPM & object mask creation ==
  # cat bpmask.cl
+
<pre>
  imstat dc_300s field="image,mean,stddev" for- > hot.txt
+
# cat bpmask.cl
  imstat master_flat_FILTER fields="image,mean" for- > cold.txt
+
imstat dc_600s field="image,mean,stddev" for- > hot.txt
  cl < bpmask.cl
+
imstat master_flat_FILTER fields="image,mean" for- > cold.txt
  # awk -v filter="L" '{print "imexpr \"((a > b) ? 1 : 0)\" hot"filter".pl a="$1" b="($2+3.*$3)*0.75}' hot.txt > hot.cl
+
cl < bpmask.cl
  # awk -v filter="L" '{print "imexpr \"((a < b) ? 1 : 0)\" cold"filter".pl a="$1" b="$2*0.9}' cold.txt > cold.cl
+
# awk -v filter="L" '{print "imexpr \"((a > b) ? 1 : 0)\" hot"filter".pl a="$1" b="($2+3.*$3)*0.75}' hot.txt > hot.cl
  cl < hot.cl
+
# awk -v filter="L" '{print "imexpr \"((a < b) ? 1 : 0)\" cold"filter".pl a="$1" b="$2*0.9}' cold.txt > cold.cl
  cl < cold.cl
+
cl < hot.cl
  # cat bpm.cl
+
cl < cold.cl
  imexpr "max(a,b)" bpmFILTER.pl a=hotFILTER.pl b=coldFILTER.pl
+
# cat bpm.cl
  hedit @bdfFILTER.list BPM bpmFILTER.pl add+ ver-  
+
imexpr "max(a,b)" bpmFILTER.pl a=hotFILTER.pl b=coldFILTER.pl
  # sed 's/FILTER/'${filter}'/g'  bpm.cl > dobpm.cl
+
hedit @bdfFILTER.list BPM bpmFILTER.pl add+ ver-  
  cl < dobpm.cl
+
# sed 's/FILTER/'${filter}'/g'  bpm.cl > dobpm.cl
 +
cl < dobpm.cl
 
    
 
    
  # Object masks creation
+
# Object masks creation
  nproto
+
nproto
  objmask @bdfFILTER.list @objbdfFILTER.list masks="!BPM" hsig=2 lsig=2
+
objmask @bdfFILTER.list @objbdfFILTER.list masks="!BPM" hsig=2 lsig=2
 +
</pre>
  
 
== Astrometry ==
 
== Astrometry ==
# cat astrometry.sh
 
gethead OBJCTRA @bdfFILTER.list > name_ra.txt
 
gethead OBJCTDEC @bdfFILTER.list | awk '{print $2,$3,$4}' > dec.txt
 
paste -d" " name_ra.txt dec.txt | awk '{print $1,($2+$3/60+$4/3600)*15,$5+$6/60+$7/3600}' > astrometryFILTER.txt
 
# sed s/FILTER/${filter}/g astrometry.sh  > astrometry${filter}.sh
 
 
sh astrometry${filter}.sh
 
  
  # This could be used:
+
<pre>
  # cat komanda.sh
+
#!/bin/sh/
  solve-field img --ra imagera --dec imagedec --radius 0.2 --scale-units arcsecperpix --scale-low 0.38 --scale-high 0.40 --crpix-center --wcs img.wcs
+
 
  ### The next command creates new files instead of just wcs binaries that can later be added to the header. It's a stand-alone command. And should be ignored.
+
for list in $(ls bdflight*list); do
  ### solve-field img --ra imagera --dec imagedec --radius 0.2 --scale-units arcsecperpix --scale-low 0.38 --scale-high 0.40 --crpix-center -p -N wcsimg.fit  \
+
while read frame; do  
  ###  -O -I noneI.fits -M none.fits -R none.fits -B none.fits -P none -k none -U none -y -S none --axy noneaxy
+
ra=$(gethead OBJCTRA $frame | awk '{print $1":"$2":"$3}')
  #while read line; do img=$(echo $line | awk '{print $1}'); imagera=$(echo $line | awk '{print $2}'); imagedec=$(echo $line | awk '{print $3}'); sed -e 's/img/'$img'/g' \
+
dec=$(gethead OBJCTDEC $frame | awk '{print $1":"$2":"$3}')
-e 's/imagera/'${imagera}'/g' -e 's/imagedec/'${imagedec}'/g' komanda.sh; done < astrometry${filter}.txt > doAstrometry.sh
+
solve-field "$frame" --ra "$ra" --dec "$dec" --radius 0.2 --scale-units arcsecperpix --scale-low 0.38 --scale-high 0.40 --crpix-center -p -N wcs"$frame" -O -I noneI.fits -M none.fits -R none.fits -B none.fits -P none -k none -U none -y -S none --axy noneaxy --wcs bla.wcs
# Or this:
+
done < $list
  awk '{print "solve-field "$1" --ra "$2" --dec "$3" --radius 0.2 --scale-units arcsecperpix --scale-low 0.38 --scale-high 0.40 --crpix-center -p -N wcs"$1" \
+
done
  -O -I noneI.fits -M none.fits -R none.fits -B none.fits -P none -k none -U none -y -S none --axy noneaxy --wcs bla.wcs"}' astrometry${filter}.txt > doAstrometry.sh
+
</pre>
  
# /bin/bash doAstrometry.sh
+
<pre>
  #ls *wcs > wcs${filter}.list
+
# Clear up the rest of the junk after running the previous script:
  # echo "wcscopy @bdf${filter}.list @wcs${filter}.list ver-" > dowcs.cl
+
rm norm*txt master_*fits none* bla.wcs dc*fits *.list
cl < dowcs.cl
+
</pre>
  
 
== Supersky flat ==
 
== Supersky flat ==

Latest revision as of 22:28, 3 January 2024

Basic data reduction using IRAF

Below is a bash script that creates lists of all images: biases, flats, darks and targets. Special case of dark frames of 600sec that Milankovic generates is used Last lines create ascii files with median values in flat frames that will be used for their normalization.

The script creates reduce.cl IRAF script that should be run from iraf:
cl < reduce.cl
 #!/bin/bash

rm *list
for frame in $(ls *fit); do
	filterType=$(gethead filter $frame)
	imageType=$(gethead imagetyp $frame)
	outFileName=$(echo $imageType | tr '[:upper:]' '[:lower:]')
	# test if DARK
	if [ ${imageType} = "DARK" ]; then
 		exptime=$(gethead exptime $frame | cut -d. -f1) 
 		ls $frame >> ${outFileName}${exptime}"s".list 
		echo "b"$frame >> "b"${outFileName}${exptime}"s".list
	else ls $frame >> ${outFileName}${filterType}.list
	fi
	# test if LIGHT and create additional lists
	if [ ${imageType} = "LIGHT" ]; then
	 	exptime=$(gethead exptime $frame | cut -d. -f1)
		echo $exptime >> exptime${filterType}.list
		echo "b"$frame >> "b"${outFileName}${filterType}.list
		echo "bd"$frame >> "bd"${outFileName}${filterType}.list
		echo "bdf"$frame >> "bdf"${outFileName}${filterType}.list
	 else if [ ${imageType} = "FLAT" ]; then
                echo "b"$frame >> "b"${outFileName}${filterType}.list
                echo "bd"$frame >> "bd"${outFileName}${filterType}.list
		echo "nbd"$frame >> "nbd"${outFileName}${filterType}.list
	      fi
	 fi
done

# Create dark current corresponding to each light frame using exposure time
for exptime in $(ls exptime*.list); do 
	filter=$(echo $exptime | sed -e s/exptime//g -e s/\.list//g);
	awk -v filter=${filter} '{print "dc"NR"_"filter".fits"}' exptime${filter}.list  > dc${filter}.list
done

if [ -e reduce.cl ]; then rm reduce.cl; fi
echo "imdelete master_bias,dc_600s,dc_5s,dc_1s" >> reduce.cl
echo "imcombine @bias.list master_bias comb=med" >> reduce.cl
echo "imarith @dark600s.list - master_bias @bdark600s.list" >> reduce.cl
echo "imarith @dark5s.list - master_bias @bdark5s.list" >> reduce.cl
echo "imcombine @bdark5s.list dc_5s comb=med" >> reduce.cl
echo "imcombine @bdark600s.list dc_600s comb=med" >> reduce.cl 
echo "imarith dc_600s / 600 dc_1s" >> reduce.cl

for flats in $(ls flat*list); do
        filterType=$(echo $flats | sed s/flat//g | cut -d. -f1)
        #echo $filterType
	echo "imarith @flat${filterType}.list - master_bias @bflat${filterType}.list" >> reduce.cl
	echo "imarith @bflat${filterType}.list - dc_5s @bdflat${filterType}.list" >> reduce.cl
	echo "imstat @bdflat${filterType}.list fields=\"image,midpt\" format- > norm${filterType}.txt" >> reduce.cl
done

Flat field normalization

From terminal (bash):

  
for norm in $(ls norm*txt); do while read line; do echo $line | awk '! /^#/{print "imarith "$1" / "$2,"n"$1}'; done < $norm ; done > doflatnorm.cl

From terminal (IRAF):

cl < doflatnorm.cl


Calibration of science frames

#!/bin/bash/

if [ -e reduce_images.cl ]; then rm reduce_images.cl; fi

for flat_list in $(ls nbdflat*list); do
        filter=$(echo ${flat_list} | sed -e s/nbdflat//g -e s/\.list//g);
        if [ -e light${filter}.list ]; then
                echo "imcomb @nbdflat${filter}.list master_flat_${filter} comb=med" >> reduce_images.cl
                echo "imarith @light${filter}.list - master_bias @blight${filter}.list" >> reduce_images.cl
                echo "imarith dc_1s * @exptime${filter}.list @dc${filter}.list" >> reduce_images.cl
                echo "imarith @blight${filter}.list - @dc${filter}.list @bdlight${filter}.list" >> reduce_images.cl
                echo "imarith @bdlight${filter}.list / master_flat_${filter} @bdflight${filter}.list" >> reduce_images.cl
        fi
done



This script creates IRAF's script reduce_images.cl that should be started from IRAF's terminal.

AFTER the script is run from IRAF terminal, clean up the junk (from bash terminal):
cat blight*list bdlight*list bflat*list bdflat*list nbdflat*list bdark*list dc*.list > tmp_files.list
rm $(<tmp_files.list)

BPM & object mask creation

# cat bpmask.cl
imstat dc_600s field="image,mean,stddev" for- > hot.txt
imstat master_flat_FILTER fields="image,mean" for- > cold.txt
cl < bpmask.cl
# awk -v filter="L" '{print "imexpr \"((a > b) ? 1 : 0)\" hot"filter".pl a="$1" b="($2+3.*$3)*0.75}' hot.txt > hot.cl
# awk -v filter="L" '{print "imexpr \"((a < b) ? 1 : 0)\" cold"filter".pl a="$1" b="$2*0.9}' cold.txt > cold.cl
cl < hot.cl
cl < cold.cl
# cat bpm.cl
imexpr "max(a,b)" bpmFILTER.pl a=hotFILTER.pl b=coldFILTER.pl
hedit @bdfFILTER.list BPM bpmFILTER.pl add+ ver- 
# sed 's/FILTER/'${filter}'/g'  bpm.cl > dobpm.cl
cl < dobpm.cl
  
# Object masks creation
nproto
objmask @bdfFILTER.list @objbdfFILTER.list masks="!BPM" hsig=2 lsig=2

Astrometry

#!/bin/sh/

for list in $(ls bdflight*list); do
	while read frame; do 
	ra=$(gethead OBJCTRA $frame | awk '{print $1":"$2":"$3}')
	dec=$(gethead OBJCTDEC $frame | awk '{print $1":"$2":"$3}')
	solve-field "$frame" --ra "$ra" --dec "$dec" --radius 0.2 --scale-units arcsecperpix --scale-low 0.38 --scale-high 0.40 --crpix-center -p -N wcs"$frame" -O -I noneI.fits -M none.fits -R none.fits -B none.fits -P none -k none -U none -y -S none --axy noneaxy --wcs bla.wcs
	done < $list
done
# Clear up the rest of the junk after running the previous script:
rm norm*txt master_*fits none* bla.wcs dc*fits *.list

Supersky flat

# Creation of super sky flat, normalization to each individual image median background and final stacking
# cat stat.cl
real mini
real sky
imstat("img",fields="min",lower=INDEF,upper=INDEF,for-) | scanf("%g", mini)
imcalc(input="img,msk",output="skyimage",equals="if(im2==0.) then im1 else "//mini-0.001,ver-)
imstat("skyimage",fields="midpt",lower=mini-0.001,upper=INDEF,for-) | scanf("%g", sky)
print("img"," ",sky)
imarith("img","/",sky,"norm")
imdelete("skyimage",yes)
# while read line; do img=$(echo $line | awk '{print $1}'); msk="obj"${img%.*}.pl; rsky="norm"${img}; cat stat.cl | sed -e 's/img/'${img}'/g' \
-e 's/msk/'${msk}'/g'  -e 's/norm/'${rsky}'/g'; done < bdf${filter}.list >  bla.cl
cl < bla.cl > med_values.txt
# ls normbdf*fit > norm.list
imcomb @norm.list norm.fits comb=med masktype="!OBJMASK" maskval=0
# awk '{print "imarith norm.fits * "$2," n"$1}' med_values.txt > donorm.cl
cl < donorm.cl
# awk '{print "imarith",$1,"-","n"$1,"s"$1}' med_values.txt > do.cl
cl < do.cl
   
imcomb s@bdfFILTER.list final.fits comb=med offset="wcs"

Surface brightness limit

1. Calibrate the image taking non-saturated stars and not too faint stars: intercept and slope (TOPCAT with SDSS DR12 from Vizier)
2. Calculate statistics inside at least 20 (empty, i.e. without objects) boxes of the size of 10" (for example if 1pix=0.396" than 10"~25 pix so boxes = 25 pix × 25 pix)
3. Take the mean value of the standard deviation inside boxes and it's standard deviation
4. Calculate SBmin and SBmax as: 
   SBmax =-2.5*log10(<σ>-stdev(<σ>))*slope+intercept 
   SBmin =-2.5*log10(<σ>+stdev(<σ>))*slope+intercept 
where <σ> is the average standard deviation inside boxes and stdev(<σ>) its standard deviation.
5. Finally, 1 sigma surface brightness limit (SBlim) is given as:
   SBlim = (SBmin+SBmax)/2 +/- (SBmax-SBmin)/2