package cquest.preprocessing; import cquest.quantitation.Svd; import cquest.Data; import cquest.rwfile.fileMru; import java.text.DecimalFormat; import java.io.*; import java.util.Vector; import cquest.utils.MrsiTxtReader; import cquest.rwfile.FileManagementWrite; /** class WaterSuppCmdLine. * class to suppress the water peak from command line. * * @author Michael Sdika, Helene Ratiney */ public class SVDSuppCmdLine { /** Save the new water-suppressed File */ public void saveResults(Data data, String basename) { // save the Signal with watre Suppresion double[][][] newSigs = new double[data.getSignalsNb()][][]; for (int i = 0; i data.getOriginalLength() - 3)) { // -> FIDs (-1) or invalid echoes if (data.areEchoes) System.out.println ("Warning: Invalid Echoes... Quantifying as FIDs"); for (int iSignal = 0; iSignal < data.getSignalsNb(); iSignal++) { System.out.println ("Signal "+(iSignal+1) +" out of "+data.getSignalsNb()+" is being processed"); double[][] signalTemp = data.getSignal(iSignal); Data dataTemp = new Data(); dataWaterSupp.setStepTime(data.stepTime); dataWaterSupp.B0=data.B0; dataWaterSupp.setTransmitterFrequency(data.getTransmitterFrequency()); dataWaterSupp.nucleus =data.nucleus; dataWaterSupp.setErfrequency(data.getErfrequency()); dataTemp.setStepTime(data.stepTime); dataWaterSupp.addSignal(signalTemp); dataTemp.addSignal(signalTemp); dataTemp.findResult(); int dataWidth=1; int dataHeight=1; if (mrsiSelectionArray!=null) { dataWidth = data.dataWidthForMrsi; dataHeight= data.dataHeightForMrsi; } if (mrsiSelectionArray!=null&&!mrsiSelectionArray[iSignal % dataWidth][iSignal / dataWidth]) { dataTemp.result.addFID(0, data.stepTime); dataTemp.result.setResultAt(0, new double[k], new double[k], (double[]) null, new double[k], new double[k]); dataTemp.result.setSingularValuesAt(0, new double[k]); } else { new Svd(Svd.HLSVD,dataTemp,data.getOriginalLength()/2,k,data.getOriginalLength(),true,false,null, 0); int[] numToRemove = new int[dataTemp.result.getNBPeakOfFIDAt(0)]; int nbOfComp = 0; int indice = 0; double[] amplSVD = new double[dataTemp.result.getNBPeakOfFIDAt(0)]; double[] dampSVD = new double[dataTemp.result.getNBPeakOfFIDAt(0)]; double[] dampRSVD = new double[dataTemp.result.getNBPeakOfFIDAt(0)]; double[] freqSVD = new double[dataTemp.result.getNBPeakOfFIDAt(0)]; double[] phasSVD = new double[dataTemp.result.getNBPeakOfFIDAt(0)]; double[] dampSVDcramer = new double[dataTemp.result.getNBPeakOfFIDAt(0)]; double[] freqSVDcramer = new double[dataTemp.result.getNBPeakOfFIDAt(0)]; double[] phasSVDcramer = new double[dataTemp.result.getNBPeakOfFIDAt(0)]; Vector tempF = dataTemp.result.getFrequencyAt(0); Vector tempA = dataTemp.result.getAmplitudeAt(0); Vector tempD = dataTemp.result.getDampingAt(0); Vector tempP = dataTemp.result.getPhaseAt(0); Vector tempAe = dataTemp.result.getAmplitudeErrorAt(0); Vector tempDe = dataTemp.result.getDampingErrorAt(0); Vector tempFe = dataTemp.result.getFrequencyErrorAt(0); Vector tempPe = dataTemp.result.getPhaseErrorAt(0); for (int iComponent = 0; iComponent < amplSVD.length; iComponent++) { amplSVD[iComponent] = ((Double) tempA.elementAt(iComponent)).doubleValue(); dampSVD[iComponent] = ((Double) tempD.elementAt(iComponent)).doubleValue() * 1000 / data.stepTime; dampRSVD[iComponent] = 0.0; freqSVD[iComponent] = ((Double) tempF.elementAt(iComponent)).doubleValue() * 1000 / data.stepTime; phasSVD[iComponent] = ((Double) tempP.elementAt(iComponent)).doubleValue() * 180 / Math.PI; numToRemove[iComponent] = 0; for (int l=0;l= bounds[l] && freqSVD[iComponent] <= bounds[l+1]) { numToRemove[iComponent] = 1; nbOfComp ++; } } } if (nbOfComp > 0) { for (int iComponent = 0; iComponent < numToRemove.length; iComponent++) { if (numToRemove[iComponent] == 1) { double[][] daComponent = dataTemp.result.getSignalComponent(0)[iComponent]; for (int iDataPoint = 0; iDataPoint < dataTemp.getOriginalLength(); iDataPoint++) { signalTemp[0][iDataPoint] -= daComponent[0][iDataPoint]; signalTemp[1][iDataPoint] -= daComponent[1][iDataPoint]; } } } dataWaterSupp.setDataOfSignal(iSignal, signalTemp); } }//end if selected }//end for all signal } else {//**************** The echo case remain to be treated**************************************// System.out.println ("The signal is considered as an echo; for th moment nothing is done in this case !!!"); } return (dataWaterSupp); } /** main function : to run the HLSVD water suppression from the command line. */ public static void main(String[] args) { SVDSuppCmdLine svdscl = new SVDSuppCmdLine(); if (args.length==0) { svdscl.printUsage(); System.exit(1); } String mrsiFile = null; int k=25; Vector vectBounds = new Vector(); //vectBounds.addElement( new Double(-20)); //vectBounds.addElement( new Double(20)); int next = 0; boolean optiongiven = false; while (next=args.length) { System.out.println ("frequency bounds not given"); svdscl.printUsage(); System.exit(1); } double arg0= new Double((args[next+1])).doubleValue(); double arg1= new Double((args[next+2])).doubleValue(); vectBounds.addElement(new Double(arg0)); vectBounds.addElement(new Double(arg1)); if (arg0>=arg1) { System.out.println ("frequency bounds not given in the good order b1