1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import cds.aladin.AladinData;
import cds.aladin.AladinPlugin;
import cds.aladin.Ligne;
import cds.aladin.Obj;
import cds.aladin.RepereSpectrum;
import cds.aladin.SourceStat;
import cds.tools.VOApp;
import cds.tools.VOObserver;
public class PhotControlPlug extends AladinPlugin implements VOObserver,VOApp {
static String planeName = "PhotTool";
AladinData ad=null;
public String menu() { return "Photometry tool manipulation"; }
public String description() {
return "PLUGIN TUTORIAL:\n" +
"This plugin is an example for photometry tools manipulation.\n" +
"This plugin extracts the spectrum at the mouse position.";
}
public String version() { return "1.1 - Octobre 2021 - - required Aladin >= v11.069"; }
public String author() { return "Pierre Fernique [CDS]"; }
public String url() { return "http://aladin.u-strasbg.fr/java/Plugins/PhotControlPlug.java"; }
public void exec() {
// Register this plugin as a VOObserver (see execCommand() method)
aladin.addObserver(this,VOApp.MEASURE | VOApp.STACKEVENT | VOApp.MOUSEEVENT );
// Set the list of stat metrics
String statList = aladin.setStatMask("-median,-pixels");
System.out.println("Statistics: "+statList);
// get or create a dedicated tool plane
try {
ad = getOrCreateToolPlane();
System.out.println("The phot tools must be stored in \""+ad.getLabel()+"\" tool plane");
} catch( Exception e ) { e.printStackTrace(); }
}
// Find or create a tool plane
private AladinData getOrCreateToolPlane() throws Exception {
// Is there already a Tool Plane in the Aladin stack ?
String [] planeID = aladin.getAladinStack();
for( int i=0; i<planeID.length; i++ ) {
AladinData sd = aladin.getAladinData(planeID[i]);
if( sd.getPlaneType().indexOf("Tool")>=0 ) return sd;
}
// otherwise, create one
return aladin.createAladinTool(planeName);
}
// Call by Aladin when the stack is modified, or an event on phot tools occured
public String execCommand(String cmd) {
System.out.println("Aladin event: => "+cmd);
rescanPhotTool();
return "";
}
HashMap<Obj,Integer> alreadyScanned = new HashMap<>();
// Scanning the dedicated Tool plane generated by the Plugin
// and display the statistics associated to each Phot objects (Cicle, Polygon)
private void rescanPhotTool() {
try {
// Get the plane in background
AladinData adbg = aladin.getAladinImage();
String planeType = adbg.getPlaneType();
System.out.println("Phot stats from "+adbg.getLabel()+" plane ("+planeType+")...");
boolean isCube = planeType.indexOf("Blink")>=0 || planeType.indexOf("Cube")>=0;
HashMap<Obj,Integer> scanned = new HashMap<>();
// Scanning of the Tool objects in the dedicated tool plane
Iterator<Obj> it = ad.iteratorObj();
while( it.hasNext() ) {
Obj o = it.next();
if( !o.hasPhot() || !o.isVisible() ) continue;
// Manage the list of objects already scanned
int cle = o.getStatsHashcode(adbg);
scanned.put(o,cle);
Integer lastCle = alreadyScanned.get(o);
if( lastCle!=null && lastCle==cle ) {
System.out.println("Obj "+o.hashCode()+ " stats already known");
continue;
}
double stats [] = o.getStatistics(adbg);
if( stats==null ) continue;
String type = o instanceof Ligne ? "polygon"
: o instanceof SourceStat ? "circle"
: o instanceof RepereSpectrum ? "point"
: "Other??";
System.out.println("Obj "+type+" hash="+o.hashCode()
+"=> cnt="+stats[0]+",sum="+stats[1]+",sigma="+stats[2]+",surf="+stats[3]+",min="+stats[4]+",max="+stats[5]);
// For a cube, also compute stats for the middle frame and the last frame of the cube
if( isCube ) {
int z = adbg.getDepth();
stats = o.getStatistics(adbg, z/2 );
System.out.println(" middle frame ("+(z/2)+"): "
+"=> cnt="+stats[0]+",sum="+stats[1]+",sigma="+stats[2]+",surf="+stats[3]+",min="+stats[4]+",max="+stats[5]);
stats = o.getStatistics(adbg, z-1 );
System.out.println(" last frame ("+(z-1)+") : "
+"=> cnt="+stats[0]+",sum="+stats[1]+",sigma="+stats[2]+",surf="+stats[3]+",min="+stats[4]+",max="+stats[5]);
// Calcul des perfs
long cnt=0L;
long t = System.currentTimeMillis();
for( int i=0; i<z; i++ ) {
stats = o.getStatistics(adbg, i );
if( i%100==0 ) System.out.println("stat "+i+"...");
cnt+=stats[0];
}
long t1 = System.currentTimeMillis();
System.out.println("Extract statistics for "+cnt+" pixels through "+z+" frames ("+cnt/z+" per frame) in "
+(t1-t)+"ms => "+((t1-t)/(double)z)+"ms per frame");
}
// Pixels access (by triplet array) - display 2 values here
double [] raDecVal = o.getStatisticsRaDecPix(adbg,0);
if( raDecVal.length>0 ) {
int i=0;
System.out.println("First pixel "+(i/3)+" (frame 0) ra="+raDecVal[i]+" dec="+raDecVal[i+1]+" pix="+raDecVal[i+2]);
i = raDecVal.length-3;
System.out.println("Last pixel "+(i/3)+" (frame 0) ra="+raDecVal[i]+" dec="+raDecVal[i+1]+" pix="+raDecVal[i+2]);
}
}
// update the list of known scanned objects
for( Obj o : alreadyScanned.keySet() ) {
if( !scanned.containsKey( o ) ) System.out.println("Obj "+o.hashCode()+ " has been removed in Aladin");
}
alreadyScanned = scanned;
} catch( Exception e ) { e.printStackTrace(); }
}
// VOApp & VOObserver methods (not used here)
public String putVOTable(InputStream in, String label) { return null; }
public String putVOTable(VOApp app, InputStream in, String label) { return null; }
public InputStream getVOTable(String dataID) { return null; }
public String putFITS(InputStream in, String label) { return null; }
public InputStream getFITS(String dataID) { return null; }
public void showVOTableObject(String[] oid) { }
public void selectVOTableObject(String[] oid) { }
public void setVisible(boolean flag) { }
public void addObserver(VOObserver app, int eventMasq) { }
public void pixel(double pixValue) { }
public void position(double raJ2000, double deJ2000) { }
}
|