use of org.apache.commons.rng.UniformRandomProvider in project zm-mailbox by Zimbra.
the class ZimbraJWToken method getEncoded.
@Override
public String getEncoded() throws AuthTokenException {
if (properties.getEncoded() == null) {
try {
ZimbraLog.account.debug("auth: generating jwt token for account id: %s", properties.getAccountId());
UniformRandomProvider rng = RandomSource.create(RandomSource.MWC_256);
RandomStringGenerator generator = new RandomStringGenerator.Builder().withinRange('a', 'z').usingRandom(rng::nextInt).build();
salt = generator.generate(SALT_LENGTH);
AuthTokenKey key = AuthTokenUtil.getCurrentKey();
byte[] finalKey = Bytes.concat(key.getKey(), salt.getBytes());
String jwt = JWTUtil.generateJWT(finalKey, salt, issuedAt, properties, key.getVersion());
properties.setEncoded(jwt);
} catch (ServiceException e) {
throw new AuthTokenException("unable to generate jwt", e);
}
}
return properties.getEncoded();
}
use of org.apache.commons.rng.UniformRandomProvider in project GDSC-SMLM by aherbert.
the class CreateData method validateCameraOptions.
private void validateCameraOptions() {
final CameraType cameraType = settings.getCameraType();
final boolean isCcd = CalibrationProtosHelper.isCcdCameraType(cameraType);
if (isCcd) {
if (cameraType == CameraType.EMCCD) {
ParameterUtils.isPositive("EM gain", settings.getEmGain());
}
ParameterUtils.isPositive("Camera gain", settings.getCameraGain());
ParameterUtils.isPositive("Read noise", settings.getReadNoise());
final double noiseRange = settings.getReadNoise() * settings.getCameraGain() * 4;
ParameterUtils.isEqualOrAbove("Bias must prevent clipping the read noise (@ +/- 4 StdDev) so ", settings.getBias(), noiseRange);
cameraModel = createCcdCameraModel();
} else if (cameraType == CameraType.SCMOS) {
// Load the model
cameraModel = CameraModelManager.load(settings.getCameraModelName());
if (cameraModel == null) {
throw new IllegalArgumentException("Unknown camera model for name: " + settings.getCameraModelName());
}
// Check the width is above the selected size
Rectangle modelBounds = cameraModel.getBounds();
final int size = settings.getSize();
if (modelBounds.width < size || modelBounds.height < size) {
throw new IllegalArgumentException(String.format("Camera model bounds [x=%d,y=%d,width=%d,height=%d] are smaller than " + "simulation size [%d]", modelBounds.x, modelBounds.y, modelBounds.width, modelBounds.height, size));
}
// Ask for a crop
if (modelBounds.width > size || modelBounds.height > size) {
final GenericDialog gd = new GenericDialog(TITLE);
// @formatter:off
ImageJUtils.addMessage(gd, "WARNING:\n \nCamera model bounds\n[x=%d,y=%d,width=%d,height=%d]\n" + "are larger than the simulation size [=%d].\n \nCrop the model?", modelBounds.x, modelBounds.y, modelBounds.width, modelBounds.height, size);
// @formatter:on
gd.addCheckbox("Random_crop", settings.getRandomCrop());
final int upperx = modelBounds.x + modelBounds.width - size;
final int uppery = modelBounds.y + modelBounds.height - size;
gd.addSlider("Origin_x", modelBounds.x, upperx, MathUtils.clip(modelBounds.x, upperx, settings.getOriginX()));
gd.addSlider("Origin_y", modelBounds.y, uppery, MathUtils.clip(modelBounds.y, uppery, settings.getOriginY()));
gd.addHelp(HelpUrls.getUrl(helpKey));
gd.showDialog();
if (gd.wasCanceled()) {
throw new IllegalArgumentException("Unknown camera model crop");
}
settings.setRandomCrop(gd.getNextBoolean());
settings.setOriginX((int) gd.getNextNumber());
settings.setOriginY((int) gd.getNextNumber());
SettingsManager.writeSettings(settings.build());
int ox;
int oy;
if (settings.getRandomCrop()) {
final UniformRandomProvider rng = createRandomGenerator();
ox = new DiscreteUniformSampler(rng, modelBounds.x, upperx).sample();
oy = new DiscreteUniformSampler(rng, modelBounds.y, uppery).sample();
} else {
ox = settings.getOriginX();
oy = settings.getOriginY();
}
final Rectangle bounds = new Rectangle(ox, oy, size, size);
cameraModel = cameraModel.crop(bounds, false);
modelBounds = cameraModel.getBounds();
if (modelBounds.width != size || modelBounds.height != size) {
throw new IllegalArgumentException("Failed to crop camera model to bounds: " + bounds);
}
}
} else {
throw new IllegalArgumentException("Unsupported camera type: " + CalibrationProtosHelper.getName(cameraType));
}
}
use of org.apache.commons.rng.UniformRandomProvider in project GDSC-SMLM by aherbert.
the class CreateData method run.
@Override
public void run(String arg) {
SmlmUsageTracker.recordPlugin(this.getClass(), arg);
extraOptions = ImageJUtils.isExtraOptions();
simpleMode = (arg != null && arg.contains("simple"));
benchmarkMode = (arg != null && arg.contains("benchmark"));
spotMode = (arg != null && arg.contains("spot"));
trackMode = (arg != null && arg.contains("track"));
if ("load".equals(arg)) {
loadBenchmarkData();
return;
}
// Each localisation set is a collection of localisations that represent all localisations
// with the same ID that are on in the same image time frame (Note: the simulation
// can create many localisations per fluorophore per time frame which is useful when
// modelling moving particles)
List<LocalisationModelSet> localisationSets = null;
// Each fluorophore contains the on and off times when light was emitted
List<? extends FluorophoreSequenceModel> fluorophores = null;
if (simpleMode || benchmarkMode || spotMode) {
if (!showSimpleDialog()) {
return;
}
resetMemory();
// 1 second frames
settings.setExposureTime(1000);
areaInUm = settings.getSize() * settings.getPixelPitch() * settings.getSize() * settings.getPixelPitch() / 1e6;
// Number of spots per frame
int count = 0;
int[] nextN = null;
SpatialDistribution dist;
if (benchmarkMode) {
// --------------------
// BENCHMARK SIMULATION
// --------------------
// Draw the same point on the image repeatedly
count = 1;
dist = createFixedDistribution();
try {
reportAndSaveFittingLimits(dist);
} catch (final Exception ex) {
// This will be from the computation of the CRLB
IJ.error(TITLE, ex.getMessage());
return;
}
} else if (spotMode) {
// ---------------
// SPOT SIMULATION
// ---------------
// The spot simulation draws 0 or 1 random point per frame.
// Ensure we have 50% of the frames with a spot.
nextN = new int[settings.getParticles() * 2];
Arrays.fill(nextN, 0, settings.getParticles(), 1);
RandomUtils.shuffle(nextN, UniformRandomProviders.create());
// Only put spots in the central part of the image
final double border = settings.getSize() / 4.0;
dist = createUniformDistribution(border);
} else {
// -----------------
// SIMPLE SIMULATION
// -----------------
// The simple simulation draws n random points per frame to achieve a specified density.
// No points will appear in multiple frames.
// Each point has a random number of photons sampled from a range.
// We can optionally use a mask. Create his first as it updates the areaInUm
dist = createDistribution();
// Randomly sample (i.e. not uniform density in all frames)
if (settings.getSamplePerFrame()) {
final double mean = areaInUm * settings.getDensity();
ImageJUtils.log("Mean samples = %f", mean);
if (mean < 0.5) {
final GenericDialog gd = new GenericDialog(TITLE);
gd.addMessage("The mean samples per frame is low: " + MathUtils.rounded(mean) + "\n \nContinue?");
gd.enableYesNoCancel();
gd.hideCancelButton();
gd.showDialog();
if (!gd.wasOKed()) {
return;
}
}
final PoissonSampler poisson = new PoissonSampler(createRandomGenerator(), mean);
final StoredDataStatistics samples = new StoredDataStatistics(settings.getParticles());
while (samples.getSum() < settings.getParticles()) {
samples.add(poisson.sample());
}
nextN = new int[samples.getN()];
for (int i = 0; i < nextN.length; i++) {
nextN[i] = (int) samples.getValue(i);
}
} else {
// Use the density to get the number per frame
count = (int) Math.max(1, Math.round(areaInUm * settings.getDensity()));
}
}
UniformRandomProvider rng = null;
localisationSets = new ArrayList<>(settings.getParticles());
final int minPhotons = (int) settings.getPhotonsPerSecond();
final int range = (int) settings.getPhotonsPerSecondMaximum() - minPhotons + 1;
if (range > 1) {
rng = createRandomGenerator();
}
// Add frames at the specified density until the number of particles has been reached
int id = 0;
int time = 0;
while (id < settings.getParticles()) {
// Allow the number per frame to be specified
if (nextN != null) {
if (time >= nextN.length) {
break;
}
count = nextN[time];
}
// Simulate random positions in the frame for the specified density
time++;
for (int j = 0; j < count; j++) {
final double[] xyz = dist.next();
// Ignore within border. We do not want to draw things we cannot fit.
// if (!distBorder.isWithinXy(xyz))
// continue;
// Simulate random photons
final int intensity = minPhotons + ((rng != null) ? rng.nextInt(range) : 0);
final LocalisationModel m = new LocalisationModel(id, time, xyz, intensity, LocalisationModel.CONTINUOUS);
// Each localisation can be a separate localisation set
final LocalisationModelSet set = new LocalisationModelSet(id, time);
set.add(m);
localisationSets.add(set);
id++;
}
}
} else {
if (!showDialog()) {
return;
}
resetMemory();
areaInUm = settings.getSize() * settings.getPixelPitch() * settings.getSize() * settings.getPixelPitch() / 1e6;
int totalSteps;
double correlation = 0;
ImageModel imageModel;
if (trackMode) {
// ----------------
// TRACK SIMULATION
// ----------------
// In track mode we create fixed lifetime fluorophores that do not overlap in time.
// This is the simplest simulation to test moving molecules.
settings.setSeconds((int) Math.ceil(settings.getParticles() * (settings.getExposureTime() + settings.getTOn()) / 1000));
totalSteps = 0;
final double simulationStepsPerFrame = (settings.getStepsPerSecond() * settings.getExposureTime()) / 1000.0;
imageModel = new FixedLifetimeImageModel(settings.getStepsPerSecond() * settings.getTOn() / 1000.0, simulationStepsPerFrame, createRandomGenerator());
} else {
// ---------------
// FULL SIMULATION
// ---------------
// The full simulation draws n random points in space.
// The same molecule may appear in multiple frames, move and blink.
//
// Points are modelled as fluorophores that must be activated and then will
// blink and photo-bleach. The molecules may diffuse and this can be simulated
// with many steps per image frame. All steps from a frame are collected
// into a localisation set which can be drawn on the output image.
final SpatialIllumination activationIllumination = createIllumination(settings.getPulseRatio(), settings.getPulseInterval());
// Generate additional frames so that each frame has the set number of simulation steps
totalSteps = (int) Math.ceil(settings.getSeconds() * settings.getStepsPerSecond());
// Since we have an exponential decay of activations
// ensure half of the particles have activated by 30% of the frames.
final double eAct = totalSteps * 0.3 * activationIllumination.getAveragePhotons();
// Q. Does tOn/tOff change depending on the illumination strength?
imageModel = new ActivationEnergyImageModel(eAct, activationIllumination, settings.getStepsPerSecond() * settings.getTOn() / 1000.0, settings.getStepsPerSecond() * settings.getTOffShort() / 1000.0, settings.getStepsPerSecond() * settings.getTOffLong() / 1000.0, settings.getNBlinksShort(), settings.getNBlinksLong(), createRandomGenerator());
imageModel.setUseGeometricDistribution(settings.getNBlinksGeometricDistribution());
// Only use the correlation if selected for the distribution
if (PHOTON_DISTRIBUTION[PHOTON_CORRELATED].equals(settings.getPhotonDistribution())) {
correlation = settings.getCorrelation();
}
}
imageModel.setPhotonBudgetPerFrame(true);
imageModel.setDiffusion2D(settings.getDiffuse2D());
imageModel.setRotation2D(settings.getRotate2D());
IJ.showStatus("Creating molecules ...");
final SpatialDistribution distribution = createDistribution();
final List<CompoundMoleculeModel> compounds = createCompoundMolecules();
if (compounds == null) {
return;
}
final List<CompoundMoleculeModel> molecules = imageModel.createMolecules(compounds, settings.getParticles(), distribution, settings.getRotateInitialOrientation());
// Activate fluorophores
IJ.showStatus("Creating fluorophores ...");
// Note: molecules list will be converted to compounds containing fluorophores
fluorophores = imageModel.createFluorophores(molecules, totalSteps);
if (fluorophores.isEmpty()) {
IJ.error(TITLE, "No fluorophores created");
return;
}
// Map the fluorophore ID to the compound for mixtures
if (compounds.size() > 1) {
idToCompound = new TIntIntHashMap(fluorophores.size());
for (final FluorophoreSequenceModel l : fluorophores) {
idToCompound.put(l.getId(), l.getLabel());
}
}
IJ.showStatus("Creating localisations ...");
// TODO - Output a molecule Id for each fluorophore if using compound molecules. This allows
// analysis
// of the ratio of trimers, dimers, monomers, etc that could be detected.
totalSteps = checkTotalSteps(totalSteps, fluorophores);
if (totalSteps == 0) {
return;
}
imageModel.setPhotonDistribution(createPhotonDistribution());
try {
imageModel.setConfinementDistribution(createConfinementDistribution());
} catch (final ConfigurationException ex) {
// We asked the user if it was OK to continue and they said no
return;
}
// This should be optimised
imageModel.setConfinementAttempts(10);
final List<LocalisationModel> localisations = imageModel.createImage(molecules, settings.getFixedFraction(), totalSteps, settings.getPhotonsPerSecond() / settings.getStepsPerSecond(), correlation, settings.getRotateDuringSimulation());
// Re-adjust the fluorophores to the correct time
if (settings.getStepsPerSecond() != 1) {
final double scale = 1.0 / settings.getStepsPerSecond();
for (final FluorophoreSequenceModel f : fluorophores) {
f.adjustTime(scale);
}
}
// Integrate the frames
localisationSets = combineSimulationSteps(localisations);
localisationSets = filterToImageBounds(localisationSets);
}
datasetNumber.getAndIncrement();
final List<LocalisationModel> localisations = drawImage(localisationSets);
if (localisations == null || localisations.isEmpty()) {
IJ.error(TITLE, "No localisations created");
return;
}
fluorophores = removeFilteredFluorophores(fluorophores, localisations);
final double signalPerFrame = showSummary(fluorophores, localisations);
if (!benchmarkMode) {
final boolean fullSimulation = (!(simpleMode || spotMode));
saveSimulationParameters(localisations.size(), fullSimulation, signalPerFrame);
}
IJ.showStatus("Saving data ...");
saveFluorophores(fluorophores);
saveImageResults(results);
saveLocalisations(localisations);
// The settings for the filenames may have changed
SettingsManager.writeSettings(settings.build());
IJ.showStatus("Done");
}
use of org.apache.commons.rng.UniformRandomProvider in project GDSC-SMLM by aherbert.
the class JTransformsTest method jtransforms2DDhtIsFasterThanFht2.
@SpeedTag
@SeededTest
void jtransforms2DDhtIsFasterThanFht2(RandomSeed seed) {
Assumptions.assumeTrue(TestSettings.allow(TestComplexity.MEDIUM));
// Test the forward DHT of data. and reverse transform or the pre-computed correlation.
final int size = 256;
final int w = size / 4;
final UniformRandomProvider r = RngUtils.create(seed.getSeed());
// Blob in the centre
FloatProcessor fp = createProcessor(size, size / 2 - w / 2, size / 2 - w / 2, w, w, null);
final Fht fht2 = new Fht((float[]) fp.getPixels(), size, false);
fht2.transform();
fht2.initialiseFastMultiply();
// Random blobs, original and correlated
final int N = 40;
final float[][] data = new float[N * 2][];
final int lower = w;
final int upper = size - w;
final int range = upper - lower;
for (int i = 0, j = 0; i < N; i++) {
final int x = lower + r.nextInt(range);
final int y = lower + r.nextInt(range);
fp = createProcessor(size, x, y, w, w, r);
final float[] pixels = (float[]) fp.getPixels();
data[j++] = pixels.clone();
final Fht fht1 = new Fht(pixels, size, false);
fht1.copyTables(fht2);
fht2.transform();
final float[] pixels2 = new float[pixels.length];
fht2.conjugateMultiply(fht2, pixels2);
data[j++] = pixels2;
}
// CommonUtils.setThreadsBeginN_1D_FFT_2Threads(Long.MAX_VALUE);
// CommonUtils.setThreadsBeginN_1D_FFT_4Threads(Long.MAX_VALUE);
CommonUtils.setThreadsBeginN_2D(Long.MAX_VALUE);
final TimingService ts = new TimingService();
ts.execute(new ImageJFhtSpeedTask(size, data));
ts.execute(new ImageJFht2SpeedTask(size, data));
ts.execute(new JTransformsDhtSpeedTask(size, data));
ts.repeat();
if (logger.isLoggable(Level.INFO)) {
logger.info(ts.getReport());
}
// Assertions.assertTrue(ts.get(-1).getMean() < ts.get(-2).getMean());
final TimingResult slow = ts.get(-2);
final TimingResult fast = ts.get(-1);
logger.log(TestLogUtils.getTimingRecord(slow, fast));
}
use of org.apache.commons.rng.UniformRandomProvider in project GDSC-SMLM by aherbert.
the class ConfigurationTemplateTest method canLoadTemplateImageFromFile.
@SeededTest
void canLoadTemplateImageFromFile(RandomSeed seed) throws IOException {
ConfigurationTemplate.clearTemplates();
Assertions.assertEquals(0, ConfigurationTemplate.getTemplateNamesWithImage().length);
// Create a dummy image
final int size = 20;
final float[] pixels = new float[size * size];
final UniformRandomProvider r = RngUtils.create(seed.getSeed());
for (int i = pixels.length; i-- > 0; ) {
pixels[i] = r.nextFloat();
}
final ImagePlus imp = new ImagePlus("test", new FloatProcessor(size, size, pixels));
final File tmpFile = File.createTempFile("tmp", ".tif");
tmpFile.deleteOnExit();
IJ.save(imp, tmpFile.getPath());
final String name = "canLoadTemplateImageFromFile";
final File file = new File(FileUtils.replaceExtension(tmpFile.getPath(), ".xml"));
ConfigurationTemplate.saveTemplate(name, TemplateSettings.getDefaultInstance(), file);
Assertions.assertEquals(1, ConfigurationTemplate.getTemplateNamesWithImage().length);
final ImagePlus imp2 = ConfigurationTemplate.getTemplateImage(name);
Assertions.assertNotNull(imp2);
final float[] data = (float[]) imp2.getProcessor().toFloat(0, null).getPixels();
Assertions.assertArrayEquals(pixels, data);
}
Aggregations