use of cbit.vcell.export.gloworm.atoms.UserDataEntry in project vcell by virtualcell.
the class PDEDataViewer method makeSurfaceMovie.
private void makeSurfaceMovie(final SurfaceCanvas surfaceCanvas, final int varTotalNumIndices, final String movieDataVarName, final DisplayAdapterService movieDAS, final VCDataIdentifier movieVCDataIdentifier) {
final SurfaceMovieSettingsPanel smsp = new SurfaceMovieSettingsPanel();
final double[] timePoints = getPdeDataContext().getTimePoints();
final int surfaceWidth = surfaceCanvas.getWidth();
final int surfaceHeight = surfaceCanvas.getHeight();
smsp.init(surfaceWidth, surfaceHeight, timePoints);
while (true) {
if (PopupGenerator.showComponentOKCancelDialog(this, smsp, "Movie Settings for var " + movieDataVarName) != JOptionPane.OK_OPTION) {
return;
}
long movieSize = (smsp.getTotalFrames() * surfaceWidth * surfaceHeight * 3);
// raw data size;
long rawDataSize = (smsp.getTotalFrames() * varTotalNumIndices * 8);
if (movieSize + rawDataSize > 50000000) {
final String YES_RESULT = "Yes";
String result = PopupGenerator.showWarningDialog(this, "Movie processing will require at least " + (movieSize + rawDataSize) / 1000000 + " mega-bytes of memory.\nMovie size will be " + (movieSize >= 1000000 ? movieSize / 1000000 + " mega-bytes." : movieSize / 1000.0 + " kilo-bytes.") + " Continue?", new String[] { YES_RESULT, "No" }, YES_RESULT);
if (result != null && result.equals(YES_RESULT)) {
break;
}
} else {
break;
}
}
final int beginTimeIndex = smsp.getBeginTimeIndex();
final int endTimeIndex = smsp.getEndTimeIndex();
final int step = smsp.getSkipParameter() + 1;
final String[] varNames = new String[] { movieDataVarName };
int[] allIndices = new int[varTotalNumIndices];
for (int i = 0; i < allIndices.length; i++) {
allIndices[i] = i;
}
final TimeSeriesJobSpec timeSeriesJobSpec = new TimeSeriesJobSpec(varNames, new int[][] { allIndices }, null, timePoints[beginTimeIndex], step, timePoints[endTimeIndex], VCDataJobID.createVCDataJobID(getDataViewerManager().getUser(), true));
Hashtable<String, Object> hash = new Hashtable<String, Object>();
hash.put(StringKey_timeSeriesJobSpec, timeSeriesJobSpec);
AsynchClientTask task1 = new TimeSeriesDataRetrievalTask("Retrieving data for variable '" + movieDataVarName + "'", PDEDataViewer.this, getPdeDataContext());
AsynchClientTask task2 = new AsynchClientTask("select a file", AsynchClientTask.TASKTYPE_SWING_BLOCKING) {
@Override
public void run(Hashtable<String, Object> hashTable) throws Exception {
VCFileChooser fileChooser = new VCFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
fileChooser.setMultiSelectionEnabled(false);
fileChooser.addChoosableFileFilter(FileFilters.FILE_FILTER_MOV);
// Set the default file filter...
fileChooser.setFileFilter(FileFilters.FILE_FILTER_MOV);
// remove all selector
fileChooser.removeChoosableFileFilter(fileChooser.getAcceptAllFileFilter());
fileChooser.setDialogTitle("Saving surface movie");
File selectedFile = null;
while (true) {
if (fileChooser.showSaveDialog(PDEDataViewer.this) != JFileChooser.APPROVE_OPTION) {
return;
}
selectedFile = fileChooser.getSelectedFile();
if (!selectedFile.getName().endsWith(".mov")) {
selectedFile = new File(selectedFile.getAbsolutePath() + ".mov");
}
if (selectedFile.exists()) {
final String YES_RESULT = "Yes";
String result = PopupGenerator.showWarningDialog(PDEDataViewer.this, "Overwrite exisitng file:\n" + selectedFile.getAbsolutePath() + "?", new String[] { YES_RESULT, "No" }, YES_RESULT);
if (result != null && result.equals(YES_RESULT)) {
break;
}
} else {
break;
}
}
hashTable.put("selectedFile", selectedFile);
}
};
AsynchClientTask task3 = new AsynchClientTask("create movie", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {
@Override
public void run(Hashtable<String, Object> hashTable) throws Exception {
File selectedFile = (File) hashTable.get("selectedFile");
if (selectedFile == null) {
return;
}
TSJobResultsNoStats tsJobResultsNoStats = (TSJobResultsNoStats) hashTable.get(StringKey_timeSeriesJobResults);
double[][] timeSeries = tsJobResultsNoStats.getTimesAndValuesForVariable(movieDataVarName);
int[] singleFrame = new int[surfaceWidth * surfaceHeight];
BufferedImage bufferedImage = new BufferedImage(surfaceWidth, surfaceHeight, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g2D = bufferedImage.createGraphics();
VideoMediaChunk[] chunks = new VideoMediaChunk[tsJobResultsNoStats.getTimes().length];
VideoMediaSample sample;
int sampleDuration = 0;
int timeScale = smsp.getFramesPerSecond();
int bitsPerPixel = 32;
DisplayAdapterService das = new DisplayAdapterService(movieDAS);
int[][] origSurfacesColors = surfaceCanvas.getSurfacesColors();
DataInfoProvider dataInfoProvider = getPDEDataContextPanel1().getDataInfoProvider();
FileDataContainerManager fileDataContainerManager = new FileDataContainerManager();
try {
try {
for (int t = 0; t < tsJobResultsNoStats.getTimes().length; t++) {
getClientTaskStatusSupport().setMessage("Creating Movie... Progress " + NumberUtils.formatNumber(100.0 * ((double) t / (double) tsJobResultsNoStats.getTimes().length), 3) + "%");
double min = Double.POSITIVE_INFINITY;
double max = Double.NEGATIVE_INFINITY;
for (int index = 1; index < timeSeries.length; index++) {
double v = timeSeries[index][t];
if ((dataInfoProvider == null || dataInfoProvider.isDefined(index - 1)) && !Double.isNaN(v) && !Double.isInfinite(v)) {
min = Math.min(min, v);
max = Math.max(max, v);
}
}
das.setValueDomain(new Range(min, max));
if (das.getAutoScale()) {
das.setActiveScaleRange(new Range(min, max));
}
int[][] surfacesColors = new int[surfaceCanvas.getSurfaceCollection().getSurfaceCount()][];
for (int i = 0; i < surfaceCanvas.getSurfaceCollection().getSurfaceCount(); i += 1) {
Surface surface = surfaceCanvas.getSurfaceCollection().getSurfaces(i);
surfacesColors[i] = new int[surface.getPolygonCount()];
for (int j = 0; j < surface.getPolygonCount(); j += 1) {
int membIndex = meshRegionSurfaces.getMembraneIndexForPolygon(i, j);
surfacesColors[i][j] = das.getColorFromValue(timeSeries[membIndex + 1][t]);
}
}
surfaceCanvas.setSurfacesColors(surfacesColors);
surfaceCanvas.paintImmediately(0, 0, surfaceWidth, surfaceHeight);
surfaceCanvas.paint(g2D);
bufferedImage.getRGB(0, 0, surfaceWidth, surfaceHeight, singleFrame, 0, surfaceWidth);
sampleDuration = 1;
sample = FormatSpecificSpecs.getVideoMediaSample(surfaceWidth, surfaceHeight * varNames.length, sampleDuration, false, FormatSpecificSpecs.CODEC_JPEG, 1.0f, singleFrame);
chunks[t] = new VideoMediaChunk(sample, fileDataContainerManager);
}
} finally {
surfaceCanvas.setSurfacesColors(origSurfacesColors);
surfaceCanvas.paintImmediately(0, 0, surfaceWidth, surfaceHeight);
}
MediaTrack videoTrack = new MediaTrack(chunks);
MediaMovie newMovie = new MediaMovie(videoTrack, videoTrack.getDuration(), timeScale);
newMovie.addUserDataEntry(new UserDataEntry("cpy", "\u00A9" + (new GregorianCalendar()).get(Calendar.YEAR) + ", UCHC"));
newMovie.addUserDataEntry(new UserDataEntry("des", "Dataset name: " + movieVCDataIdentifier.getID()));
newMovie.addUserDataEntry(new UserDataEntry("cmt", "Time range: " + timePoints[beginTimeIndex] + " - " + timePoints[endTimeIndex]));
for (int k = 0; k < varNames.length; k++) {
// pad with 0 if k < 10
String entryType = "v" + (k < 10 ? "0" : "") + k;
UserDataEntry entry = new UserDataEntry(entryType, "Variable name: " + varNames[k] + " min: " + das.getValueDomain().getMin() + " max: " + das.getValueDomain().getMax());
newMovie.addUserDataEntry(entry);
}
getClientTaskStatusSupport().setMessage("Writing Movie to disk...");
FileOutputStream fos = new FileOutputStream(selectedFile);
DataOutputStream movieOutput = new DataOutputStream(new BufferedOutputStream(fos));
MediaMethods.writeMovie(movieOutput, newMovie);
movieOutput.close();
fos.close();
} finally {
fileDataContainerManager.closeAllAndDelete();
}
}
};
ClientTaskDispatcher.dispatch(this, hash, new AsynchClientTask[] { task1, task2, task3 }, true, true, null);
}
use of cbit.vcell.export.gloworm.atoms.UserDataEntry in project vcell by virtualcell.
the class VRMediaMovie method createVRMediaMovie.
/**
* Insert the method's description here.
* Creation date: (11/9/2005 4:13:47 AM)
* @return VRMediaMovie
* @param qtvrTrack MediaTrack
* @param objectTrack MediaTrack
* @param otherTracks MediaTrack[]
* @param duration int
* @param timescale int
*/
public static VRMediaMovie createVRMediaMovie(MediaTrack qtvrTrack, MediaTrack objectTrack, MediaTrack imageTrack, MediaTrack[] otherTracks, int duration, int timescale) {
if (otherTracks == null)
otherTracks = new MediaTrack[0];
MediaTrack[] allTracks = new MediaTrack[otherTracks.length + 3];
allTracks[0] = qtvrTrack;
allTracks[1] = objectTrack;
allTracks[2] = imageTrack;
for (int i = 0; i < otherTracks.length; i++) {
allTracks[i + 3] = otherTracks[i];
}
VRMediaMovie vrMovie = new VRMediaMovie(allTracks, duration, timescale);
// the f...ing undocumented piece of shit required
vrMovie.addUserDataEntry(new UserDataEntry("ctyp", "qtvr", false));
return vrMovie;
}
use of cbit.vcell.export.gloworm.atoms.UserDataEntry in project vcell by virtualcell.
the class IMGExporter method createMedia.
private static void createMedia(Vector<ExportOutput> exportOutputV, VCDataIdentifier vcdID, String dataID, ExportSpecs exportSpecs, boolean bEndVars, boolean bEndSlice, boolean bBeginTime, boolean bEndTime, boolean bSingleTimePoint, String[] varNameArr, DisplayPreferences[] displayPreferencesArr, MovieHolder movieHolder, int[] pixels, int mirrorWidth, int mirrorHeight, FileDataContainerManager fileDataContainerManager) throws Exception {
boolean isGrayScale = true;
for (int i = 0; i < displayPreferencesArr.length; i++) {
if (!displayPreferencesArr[i].isGrayScale()) {
isGrayScale = false;
break;
}
}
FormatSpecificSpecs formatSpecificSpecs = exportSpecs.getFormatSpecificSpecs();
if (exportSpecs.getFormat() == ExportFormat.GIF && formatSpecificSpecs instanceof ImageSpecs) /* && ((ImageSpecs)formatSpecificSpecs).getFormat() == ExportConstants.GIF*/
{
ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
GIFOutputStream gifOut = new GIFOutputStream(bytesOut);
GIFImage gifImage = new GIFUtils.GIFImage(pixels, mirrorWidth);
gifImage.write(gifOut);
gifOut.close();
byte[] data = bytesOut.toByteArray();
ExportOutput exportOutput = new ExportOutput(true, ".gif", vcdID.getID(), dataID, fileDataContainerManager);
fileDataContainerManager.append(exportOutput.getFileDataContainerID(), data);
exportOutputV.add(exportOutput);
} else if (exportSpecs.getFormat() == ExportFormat.FORMAT_JPEG && formatSpecificSpecs instanceof ImageSpecs) /* && ((ImageSpecs)formatSpecificSpecs).getFormat() == ExportConstants.JPEG*/
{
VideoMediaSample jpegEncodedVideoMediaSample = FormatSpecificSpecs.getVideoMediaSample(mirrorWidth, mirrorHeight, 1, isGrayScale, FormatSpecificSpecs.CODEC_JPEG, ((ImageSpecs) formatSpecificSpecs).getcompressionQuality(), pixels);
ExportOutput exportOutput = new ExportOutput(true, ".jpg", vcdID.getID(), dataID, fileDataContainerManager);
fileDataContainerManager.append(exportOutput.getFileDataContainerID(), jpegEncodedVideoMediaSample.getDataBytes());
exportOutputV.add(exportOutput);
} else if (exportSpecs.getFormat() == ExportFormat.ANIMATED_GIF && formatSpecificSpecs instanceof ImageSpecs) /* && ((ImageSpecs)formatSpecificSpecs).getFormat() == ExportConstants.ANIMATED_GIF*/
{
// 1/100's of a second
int imageDuration = (int) Math.ceil((movieHolder.getSampleDurationSeconds() * 100));
if (bEndTime && (((ImageSpecs) formatSpecificSpecs).getLoopingMode() != 0 || bSingleTimePoint)) {
imageDuration = 0;
}
if (bBeginTime) {
movieHolder.setGifImage(new GIFUtils.GIFImage(pixels, mirrorWidth));
movieHolder.getGifImage().setDelay(imageDuration);
} else {
movieHolder.getGifImage().addImage(pixels, mirrorWidth, true);
movieHolder.getGifImage().setDelay(movieHolder.getGifImage().countImages() - 1, imageDuration);
}
if (bEndTime) {
movieHolder.getGifImage().setIterationCount(((ImageSpecs) formatSpecificSpecs).getLoopingMode());
ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
GIFOutputStream gifOut = new GIFOutputStream(bytesOut);
movieHolder.getGifImage().write(gifOut);
gifOut.close();
byte[] data = bytesOut.toByteArray();
ExportOutput exportOutput = new ExportOutput(true, ".gif", vcdID.getID(), dataID, fileDataContainerManager);
fileDataContainerManager.append(exportOutput.getFileDataContainerID(), data);
exportOutputV.add(exportOutput);
}
} else if (exportSpecs.getFormat() == ExportFormat.QUICKTIME && formatSpecificSpecs instanceof MovieSpecs) {
String VIDEOMEDIACHUNKID = (varNameArr.length == 1 ? varNameArr[0] : "OVERLAY");
// number of units per second in movie
final int TIMESCALE = 1000;
boolean bQTVR = ((MovieSpecs) exportSpecs.getFormatSpecificSpecs()).isQTVR();
int sampleDuration = (bQTVR ? TIMESCALE : (int) (TIMESCALE * movieHolder.getSampleDurationSeconds()));
VideoMediaSample videoMediaSample = FormatSpecificSpecs.getVideoMediaSample(mirrorWidth, mirrorHeight, sampleDuration, isGrayScale, FormatSpecificSpecs.CODEC_JPEG, ((MovieSpecs) formatSpecificSpecs).getcompressionQuality(), pixels);
if (bBeginTime && (!bQTVR || movieHolder.getVarNameVideoMediaChunkHash().get(VIDEOMEDIACHUNKID) == null)) {
movieHolder.getVarNameVideoMediaChunkHash().put(VIDEOMEDIACHUNKID, new Vector<VideoMediaChunk>());
movieHolder.getVarNameDataIDHash().put(VIDEOMEDIACHUNKID, dataID);
}
movieHolder.getVarNameVideoMediaChunkHash().get(VIDEOMEDIACHUNKID).add(new VideoMediaChunk(videoMediaSample, fileDataContainerManager));
if (bEndTime && !bQTVR) {
String simID = exportSpecs.getVCDataIdentifier().getID();
double[] allTimes = exportSpecs.getTimeSpecs().getAllTimes();
int beginTimeIndex = exportSpecs.getTimeSpecs().getBeginTimeIndex();
int endTimeIndex = exportSpecs.getTimeSpecs().getEndTimeIndex();
VideoMediaChunk[] videoMediaChunkArr = movieHolder.getVarNameVideoMediaChunkHash().get(VIDEOMEDIACHUNKID).toArray(new VideoMediaChunk[0]);
MediaTrack videoTrack = new MediaTrack(videoMediaChunkArr);
MediaMovie newMovie = new MediaMovie(videoTrack, videoTrack.getDuration(), TIMESCALE);
newMovie.addUserDataEntry(new UserDataEntry("cpy", "�" + (new GregorianCalendar()).get(Calendar.YEAR) + ", UCHC"));
newMovie.addUserDataEntry(new UserDataEntry("des", "Dataset name: " + simID));
newMovie.addUserDataEntry(new UserDataEntry("cmt", "Time range: " + allTimes[beginTimeIndex] + " - " + allTimes[endTimeIndex]));
for (int i = 0; varNameArr != null && i < varNameArr.length; i++) {
newMovie.addUserDataEntry(new UserDataEntry("v" + (i < 10 ? "0" : "") + i, "Variable name: " + varNameArr[i] + "\nmin: " + (displayPreferencesArr == null || displayPreferencesArr[i].getScaleSettings() == null ? "default" : displayPreferencesArr[i].getScaleSettings().getMin()) + "\nmax: " + (displayPreferencesArr == null || displayPreferencesArr[i].getScaleSettings() == null ? "default" : displayPreferencesArr[i].getScaleSettings().getMax())));
}
FileOutputStream fos = null;
BufferedOutputStream bos = null;
DataOutputStream movieos = null;
try {
ExportOutput exportOutput = new ExportOutput(true, ".mov", simID, dataID, fileDataContainerManager);
File tempMovieFile = File.createTempFile("Movie", "temp");
fileDataContainerManager.manageExistingTempFile(exportOutput.getFileDataContainerID(), tempMovieFile);
fos = new FileOutputStream(tempMovieFile);
bos = new BufferedOutputStream(fos);
movieos = new DataOutputStream(bos);
MediaMethods.writeMovie(movieos, newMovie);
movieos.close();
exportOutputV.add(exportOutput);
movieHolder.getVarNameVideoMediaChunkHash().clear();
movieHolder.getVarNameDataIDHash().clear();
} finally {
if (movieos != null) {
try {
movieos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
} else if (bEndVars && bEndTime && bEndSlice && bQTVR) {
String simID = exportSpecs.getVCDataIdentifier().getID();
Enumeration<String> allStoredVarNamesEnum = movieHolder.getVarNameVideoMediaChunkHash().keys();
while (allStoredVarNamesEnum.hasMoreElements()) {
String varName = allStoredVarNamesEnum.nextElement();
String storedDataID = movieHolder.getVarNameDataIDHash().get(varName);
VideoMediaChunk[] videoMediaChunkArr = movieHolder.getVarNameVideoMediaChunkHash().get(varName).toArray(new VideoMediaChunk[0]);
int beginTimeIndex = exportSpecs.getTimeSpecs().getBeginTimeIndex();
int endTimeIndex = exportSpecs.getTimeSpecs().getEndTimeIndex();
int numTimes = endTimeIndex - beginTimeIndex + 1;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
DataOutputStream movieos = null;
try {
ExportOutput exportOutput = new ExportOutput(true, ".mov", simID, storedDataID, fileDataContainerManager);
File tempMovieFile = File.createTempFile("Movie", "temp");
fileDataContainerManager.manageExistingTempFile(exportOutput.getFileDataContainerID(), tempMovieFile);
fos = new FileOutputStream(tempMovieFile);
bos = new BufferedOutputStream(fos);
movieos = new DataOutputStream(bos);
writeQTVRWorker(movieos, videoMediaChunkArr, numTimes, videoMediaChunkArr.length / numTimes, mirrorWidth, mirrorHeight);
movieos.close();
exportOutputV.add(exportOutput);
} finally {
if (movieos != null) {
try {
movieos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
movieHolder.getVarNameVideoMediaChunkHash().clear();
movieHolder.getVarNameDataIDHash().clear();
}
}
}
Aggregations