/*- * Copyright 2015 Diamond Light Source Ltd. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package uk.ac.diamond.scisoft.analysis.peakfinding; import java.util.Collection; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import org.eclipse.dawnsci.analysis.api.peakfinding.IPeakFinderParameter; import org.eclipse.january.dataset.IDataset; public class PeakFindingData implements IPeakFindingData { /* * These variables determine how the PeakFindingData object interacts with * the PeakFindingService */ private final IPeakFindingService peakFindServ; private Set<String> activePeakFinders = new TreeSet<String>(); private Map<String, Map<String, IPeakFinderParameter>> pfParamsStore = new TreeMap<String, Map<String, IPeakFinderParameter>>(); private Integer nPeaks; private IDataset[] searchData = new IDataset[2]; /* * These variables are populated only after peak finding has been done */ private Map<String, Map<Integer, Double>> allIdentifiedPeakPosns = new TreeMap<String, Map<Integer, Double>>(); public PeakFindingData(IPeakFindingService serv) { this.peakFindServ = serv; } /** * Returns a reference to the peak finding service which this * IPeakFindingData object is associated with * @return */ public IPeakFindingService getPFService() { return peakFindServ; } @Override public void activatePeakFinder(String id) { if (!peakFindServ.getRegisteredPeakFinders().contains(id)) { throw new NullPointerException(id+" not registered with peak finding service"); } else if (activePeakFinders.contains(id)) { throw new IllegalArgumentException(id+" already set active"); } else { activePeakFinders.add(id); //Add the peak finder parameters to the store iff it's not there already if (!pfParamsStore.containsKey(id)) { pfParamsStore.put(id, peakFindServ.getPeakFinderParameters(id)); } } } @Override public void deactivatePeakFinder(String id) { if (activePeakFinders.contains(id)) { activePeakFinders.remove(id); } else { throw new IllegalArgumentException(id+" not set active"); } } @Override public Collection<String> getActivePeakFinders() { return activePeakFinders; } @Override public boolean hasActivePeakFinders() { return !activePeakFinders.isEmpty(); } @Override public void setPFParametersByPeakFinder(String pfID, Map<String, IPeakFinderParameter> newPFParams) { //Get Peak Finder parameter set Map<String, IPeakFinderParameter> currPFParams = getPFParametersByPeakFinder(pfID); for (Map.Entry<String, IPeakFinderParameter> pfParam : newPFParams.entrySet()) { //Check parameter names in new param set match checkParamNameMatch(pfParam.getKey(), newPFParams); //Set values setParameterInParamSet(pfParam.getKey(), pfParam.getValue().getValue(), currPFParams); } //Put parameter set back to store pfParamsStore.put(pfID, currPFParams); } @Override public void setPFParameterByName(String pfID, String paramName, Number paramValue) { //Get Peak Finder parameter set Map<String, IPeakFinderParameter> currPFParams = getPFParametersByPeakFinder(pfID); //Set parameter & put set back to store setParameterInParamSet(paramName, paramValue, currPFParams); pfParamsStore.put(pfID, currPFParams); } private void setParameterInParamSet(String pName, Number pNewValue, Map<String, IPeakFinderParameter> pfParams) { //Check the parameter is already in the keyset checkParamNameMatch(pName, pfParams); //Set the parameter value pfParams.get(pName).setValue(pNewValue); } @Override public Map<String, Map<String, IPeakFinderParameter>> getAllPFParameters() { return pfParamsStore; } @Override public Map<String, IPeakFinderParameter> getPFParametersByPeakFinder(String pfID) { checkPFParamsStored(pfID); return pfParamsStore.get(pfID); } @Override public IPeakFinderParameter getPFParameterByName(String pfID, String paramName) { Map<String, IPeakFinderParameter> pfParams = getPFParametersByPeakFinder(pfID); checkParamInPFSet(paramName, pfParams); return pfParams.get(paramName); } @Override public Number getPFParameterValueByName(String pfID, String paramName) { IPeakFinderParameter pfParam = getPFParameterByName(pfID, paramName); return pfParam.getValue(); } @Override public Boolean getPFParameterIsIntByName(String pfID, String paramName) { IPeakFinderParameter pfParam = getPFParameterByName(pfID, paramName); return pfParam.isInt(); } @Override public Set<String> getPFParameterNamesByPeakFinder(String pfID) { checkPFParamsStored(pfID); Map<String, IPeakFinderParameter> pfParams = pfParamsStore.get(pfID); for (Map.Entry<String, IPeakFinderParameter> entry : pfParams.entrySet()) { checkParamNameMatch(entry.getKey(), pfParams); } return pfParams.keySet(); } /** * Checks whether the specified peak finder ID is in the set * @param pfID ID (FQCN) string of peak finder * @param keyset Set (keyset) which should contain this pfID * @throws NullPointerException When peak finder is not in * the keyset; i.e. never activated */ private void checkPFParamsStored(String pfID) { if (pfParamsStore.containsKey(pfID)) return; throw new NullPointerException("Peak finder "+pfID+" has never been activated"); } /** * Checks whether the specified parameter name is in the set * @param paramName String name of parameter * @param paramset Map which should contain this name * @throws NullPointerException When peak finder is not in * the keyset; i.e. never activated */ private void checkParamInPFSet(String paramName, Map<String, IPeakFinderParameter> paramSet) { if (paramSet.containsKey(paramName)) { checkParamNameMatch(paramName, paramSet); return; } throw new NullPointerException("No parameter name "+paramName+" found"); } /** * Check that the parameter name in the keyset of the map is the same as * the name given in the parameter object * @param paramName paramName String name of parameter * @param paramset Map which should contain this name * @throws IllegalArgumentException If the names do not match */ private void checkParamNameMatch(String paramName, Map<String, IPeakFinderParameter> paramSet) { if (paramSet.get(paramName).getName().equals(paramName)) return; throw new IllegalArgumentException("Peak finder parameter name mismatch; expecting: "+paramName+" was: "+paramSet.get(paramName).getName()); } @Override public void setData(IDataset xData, IDataset yData, Integer nPeaks) { if(xData != null) this.searchData[0] = xData; if(yData != null) this.searchData[1] = yData; if(nPeaks != null) this.nPeaks = nPeaks; } @Override public void setData(IDataset xData, IDataset yData) { setData(xData, yData, null); } @Override public void setXData(IDataset xData) { setData(xData, null, null); } @Override public void setYData(IDataset yData) { setData(null, yData, null); } @Override public IDataset[] getData() { return searchData; } @Override public boolean hasData() { if ((searchData[0] == null) || (searchData[1] == null) || (searchData[0].getSize() == 0) || (searchData[1].getSize() == 0)) { return false; } return true; } @Override public void setNPeaks(Integer nPeaks) { setData(null, null, nPeaks); } @Override public Integer getNPeaks() { return nPeaks; } @Override public void setPeaks(Map<String, Map<Integer, Double>> newFoundPeaks) { this.allIdentifiedPeakPosns = newFoundPeaks; } @Override public Map<String, Map<Integer, Double>> getPeaks() { if (allIdentifiedPeakPosns == null || allIdentifiedPeakPosns.isEmpty()) throw new NullPointerException("No peaks found. Need to run findPeaks()"); return allIdentifiedPeakPosns; } @Override public Map<Integer, Double> getPeaks(String id) { if (allIdentifiedPeakPosns == null || allIdentifiedPeakPosns.isEmpty()) throw new NullPointerException("No peaks found. Need to run findPeaks(...)"); if (!allIdentifiedPeakPosns.keySet().contains(id)) throw new IllegalArgumentException(id+" was not active when findPeaks() was called"); return allIdentifiedPeakPosns.get(id); } }