package IBA_J.ConvertListFiles.ActionsC; import IBA_J.ConvertListFiles.FrameC.FrameC; import IBA_J.ConvertListFiles.ADC.ADC; import IBA_J.ConvertListFiles.MPA3.MPA3; import IBA_J.ConvertListFiles.listFiles.listFiles; import IBA_J.Prefs.PrefsManager; import javax.swing.JFileChooser; import java.io.File; import java.util.ArrayList; import ij.gui.Plot; import ij.*; import ij.io.FileSaver; import ij.plugin.ContrastEnhancer; import ij.process.ImageProcessor; import ij.process.ShortProcessor; import java.awt.Component; import java.awt.HeadlessException; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import javax.swing.JRadioButton; import javax.swing.JPanel; public class ActionsC{ private final Integer sizeMapX=256; private final Integer sizeMapY=256; ArrayList <listFiles> listFilesArray=new ArrayList <>(); int [] flags=new int[28]; ArrayList <double []> pixe_stack=new ArrayList <>(); ImageStack stimStack=new ImageStack(sizeMapX-2,sizeMapY-1); /** * Constructor for ActionsC class with default initialization of flags and pixe_stack */ public ActionsC(){ initFlags(); init_pixe_stack(); } /** * Gets ADC index for scanning X direction * @return the index for adc corresponding the X position of the beam */ public int getAdcIndexScanX(){ int indexOfAdc=0; for (int i=0;i<16;i++){ if (flags[i]==4) indexOfAdc=i; } return indexOfAdc; } /** * Gets ADC index for scanning Y direction * @return the index for adc corresponding the Y position of the beam */ public int getAdcIndexScanY(){ int indexOfAdc=0; for (int i=0;i<16;i++){ if (flags[i]==5) indexOfAdc=i; } return indexOfAdc; } /** * Displays a dialog box for user to select files to be processed (multiple selection possible) * Is used to modify the ArrayList listFilesArray */ public void selectFiles(){ try{ listFilesArray.clear(); PrefsManager prefs=new PrefsManager(); prefs.setPreference(); JFileChooser jF = new JFileChooser(); // a new filechosser is created File myDir=new File(prefs.getLastUsedDirectory()); jF.setCurrentDirectory(myDir); jF.setApproveButtonText("OK"); // button title jF.setMultiSelectionEnabled(true); jF.showOpenDialog(null); // displays the dialog box File [] selectedFiles = jF.getSelectedFiles(); for (File f : selectedFiles){ listFiles lf=new listFiles(f.getAbsolutePath(),getAdcIndexScanX(),getAdcIndexScanY()); listFilesArray.add(lf); prefs.saveDirectory(f.getAbsolutePath()); } } catch (HeadlessException e){ } } //Working with flags /** * Initializes flags to 1 except for Tomo projection sum and pixe map */ // flags[0] to flags[15] corresponds to ADC status (1 is on) // flags[16] - saving XYE listfile // flags[17] - save gupix spectra for each ADC separately // flags[18] - save gupix spectra for the sum of pixe adc // flags[19] - save 'channel-counts' 2 columns text file (ie used for rbs) // flags[20] - save stim spectra as a text file // flags[21] - save stim maps separately as a text image readable using imageJ // flags[22] - plot spectra // flags[23] - save stim stack as TIFF // flags[24] - process pixe stack // flags[25] - display stim stack // flags[26] - calculate pixe map // flags[27] - save XYE listfile compatible with supavisio private void initFlags(){ for (int i=0;i<flags.length;i++) setFlags(i,0); for (int i =16;i<19;i++) setFlags(i,1);//TODO remove this part of function to FrameC } /** * Resets all flags for ADC to 0. */ private void resetJbuttonFlags(){ for (int i=0;i<16;i++) flags[i]=0; } /** * Initializes arraylist containing the pixe sum spectra for all selected list files. */ private void init_pixe_stack(){ for (int i=0; i<9;i++){ pixe_stack.add(new double[4096]); } } /** * Clears the arraylist containing projection sum spectra and initializes a new stack. */ private void reset_pixe_stack(){ //Default number of adc is 8 for AIFIRA. The 9th corresponds to pixe sum adc pixe_stack.clear(); for (int i=0; i<9;i++){ pixe_stack.add(new double[4096]); } } /** * Sets value to selected flag @param n index of the flag @param value value of the flag * */ public void setFlags(int n, int value){ flags[n]=value; } /** * Sets values to flags after checking ADC status * flags 0 to 15 corresponding to ADC 1 to 16 * @param f the frame containing components to be checked */ public void setFlags(FrameC f){ resetJbuttonFlags(); int nPanel=-1; //first panel found corresponding to adc will get index 0 //check for jRadioButton Component[] C1 = (f.jPanelB).getComponents(); for (Component C2 : C1){ if (C2 instanceof JPanel){ nPanel+=1; int nButton=0; Component[] C3 = ((JPanel)C2).getComponents(); for (Component C4 : C3) { if (C4 instanceof JRadioButton){ nButton+=1; if (((JRadioButton)C4).isSelected()) flags[nPanel]=nButton; } } } } } //processing data /** * Plots a spectra in ImageJ * @param Yvalues double [4096] array containing values to be plotted * @param title Name of the plot window */ private void plotSpectra(double [] Yvalues, String title){ double [] xValues = new double [4096]; for (int i=0;i<4096;i++) xValues[i]=i; Plot p=new Plot(title,"x","y",xValues,Yvalues); p.show(); } /** * Actions performed when ADC corresponding to RBS is detected according to flags * @param rbs ADC corresponding to RBS * @param lF name of processed list file * @param indexOfADC Index of RBS adc in MPA */ private void processRBS(ADC rbs, listFiles lF, int indexOfADC){ if (flags[19]==1) rbs.saveChannelCountsSpectra(lF.setExtension("asc.dat")); if (flags[27]==1) rbs.saveXYEListFile(lF.setExtension("RBS"), (short)1); else if (flags[16]==1) rbs.saveXYEListFile(lF.setExtension("ADC"+Integer.toString(indexOfADC+1)+".rbs2")); if (flags[22]==1){ String title=lF.getPath()+" ADC: "+String.valueOf(indexOfADC+1)+": RBS - N counts = " +String.valueOf(rbs.getNEvents()); plotSpectra(rbs.getSpectra(),title); } java.lang.System.gc(); } /** * Actions performed when ADC corresponding to PIXE is detected according to flags * @param pixe ADC corresponding to PIXE * @param lF name of processed list file * @param indexOfADC index of PIXE adc in MPA */ private void processPIXE(ADC pixe, listFiles lF, int indexOfADC){ //saving spectra if (flags[17]==1) pixe.saveGupixSpectra(lF.setExtension("ADC"+Integer.toString(indexOfADC+1)+".gup")); if (flags[18]==1){ if (indexOfADC==16) pixe.saveGupixSpectra(lF.setExtension("ADC"+Integer.toString(indexOfADC+1)+".gup")); } if (flags[27]==1) pixe.saveXYEListFile(lF.setExtension("ADC"+Integer.toString(indexOfADC+1)+".PIXE"),(short)0); else if (flags[16]==1) pixe.saveXYEListFile(lF.setExtension("ADC"+Integer.toString(indexOfADC+1)+".pixe2")); //displays spectra if (flags[22]==1){ if (flags[18]==1){ if (indexOfADC==16){ String title=lF.getPath()+" ADC: "+String.valueOf(indexOfADC+1)+": PIXE - N counts = " +String.valueOf(pixe.getNEvents()); plotSpectra(pixe.getSpectra(),title); } } else if (flags[17]==1){ String title=lF.getPath()+" ADC: "+String.valueOf(indexOfADC+1)+": PIXE - N counts = " +String.valueOf(pixe.getNEvents()); plotSpectra(pixe.getSpectra(),title); } } if (flags[24]==1){ double [] t=pixe.getSpectra(); for (int i=0;i<4096;i++){ pixe_stack.get(indexOfADC)[i]+=t[i]; } } java.lang.System.gc(); } /** * Actions performed when ADC corresponding to STIM is detected according to flags * @param adc ADC corresponding to STIM * @param lF name of processed list file * @param indexOfADC index of PIXE adc in MPA */ private void processSTIM(ADC adc, listFiles lF, int indexOfADC){ if((flags[21]==1)||(flags[25]==1)) adc.medianSort(); //map calculation if (flags[21]==1) adc.saveMedianTextImage(lF.setExtension("medMap.txt")); //saving map //if (flags[21]==1) adc.saveMedianImage(lF.setExtension("medMap.txt")); //saving map if (flags[25]==1) fillStack(adc,lF); //displaying map if (flags[20]==1) adc.saveCountsSpectra(lF.setExtension("stim.asc")); // save spectra //save XYE list file if (flags[27]==1) adc.saveXYEListFile(lF.setExtension("STIM"),(short)2); // save stim else if (flags[16]==1) adc.saveXYEListFile(lF.setExtension("stim2")); //Output: display spectra if (flags[22]==1){ String title=lF.getPath()+" ADC: "+String.valueOf(indexOfADC+1)+": STIM - N counts = " +String.valueOf(adc.getNEvents()); plotSpectra(adc.getSpectra(),title); } //Prefs ijPrefs=new Prefs(); //ijPrefs.set(".convertListFiles.lastUsedFile", lf.getPath()); java.lang.System.gc(); } /** * This method adds median map to stim stack using * @param adc ADC to be added * @param lF name of the file */ private void fillStack(ADC adc,listFiles lF){ ImageProcessor ip = new ShortProcessor(sizeMapX-2, sizeMapY-1); String title = lF.setExtension(""); for (int x=2;x<sizeMapX;x++){ for (int y=1;y<sizeMapY;y++){ ip.set(x-2,y-1,adc.getMedianValue(x, y)); } } stimStack.addSlice(title, ip); } /** * Processes all files in listFilesArray according to their type (RBS, STIM or PIXE) */ public void process(){ reset_pixe_stack(); reset_stim_stack(); for (int indexOfFile=0;indexOfFile<listFilesArray.size();indexOfFile++){ processFile(indexOfFile); } if (flags[24]==1){ for (int i=0;i<16;i++){ if (flags[i]==3) writePixeStack(listFilesArray.get(0).setExtension("sum"+Integer.toString(i+1)),pixe_stack.get(i)); } if (flags[18]==1) writePixeStack(listFilesArray.get(0).setExtension("sum"+"9"),pixe_stack.get(16)); } if (flags[25]==1){ try { ImagePlus imp = new ImagePlus("Median maps", stimStack); ContrastEnhancer ce=new ContrastEnhancer(); ce.stretchHistogram(imp, (double)0.35); imp.show(); if (flags[23]==1) { FileSaver fs = new FileSaver( imp) ; Date d= new Date(); fs.saveAsTiff(); } } catch (Exception e){ } } java.lang.System.gc(); IJ.showStatus("done"); } /** * Processes selected file in listFilesArray * @param indexOfFile Index of file in listFilesArray */ public void processFile(int indexOfFile){ MPA3 mpa=listFilesArray.get(indexOfFile).readListFile(getActiveADCs()); boolean debug = true; IJ.log("Reading file: "+ listFilesArray.get(indexOfFile).getPath()); if (debug){ int activeADCs[]=getActiveADCs(); for (int i=0;i<activeADCs.length;i++){ int indexOfAdc = activeADCs[i]; int totPeriods= mpa.getADC(indexOfAdc).getNActivationPeriods(); int inactivePeriodsCounter=0; for (int j=0;j<totPeriods;j++){ if (mpa.getADC(indexOfAdc).getActivationPeriod(j)==0) inactivePeriodsCounter++; } float inactivePeriodsCounterfl=inactivePeriodsCounter; float tempsMort=100*inactivePeriodsCounterfl/totPeriods; if (indexOfAdc>7) IJ.log("Dead Time - ADC "+(indexOfAdc+1) +" = "+tempsMort +"%"); } } for (int indexOfAdc=0;indexOfAdc<16;indexOfAdc++){ switch (flags[indexOfAdc]){ case 1: //RBS processRBS(mpa.getADC(indexOfAdc),listFilesArray.get(indexOfFile), indexOfAdc); break; case 2: //STIM processSTIM(mpa.getADC(indexOfAdc),listFilesArray.get(indexOfFile), indexOfAdc); break; case 3: //PIXE if ((flags[17]==1)||(flags[16]==1)||(flags[22]==1)||(flags[24]==1)) processPIXE(mpa.getADC(indexOfAdc),listFilesArray.get(indexOfFile), indexOfAdc); if (flags[18]==1) { mpa.addToSum(indexOfAdc,16); int lastPixeADCIndex=15; while (flags[lastPixeADCIndex]!=3) lastPixeADCIndex-=1; if (indexOfAdc==lastPixeADCIndex) processPIXE(mpa.getADC(16),listFilesArray.get(indexOfFile),16); } break; default: //other cases break; } } IJ.log("Processing files is done."); java.lang.System.gc(); } /** * Resets listFilesArray, list of files to be processed */ public void reset(){ listFilesArray.clear(); } /** * Resets STIM image stack */ private void reset_stim_stack(){ for (int i=0;i<stimStack.getSize()+1;i++) stimStack.deleteLastSlice(); } /** * Gets an arraylist containing the active ADCs * @return arrayActivatedADCs arraylist containing the active ADCs */ public int[] getActiveADCs(){ ArrayList<Integer> listActivatedADCs = new ArrayList<>(); for (int i=0;i<16;i++){ if (flags[i]!=6) listActivatedADCs.add(i); } int[] arrayActivatedADCs = new int[listActivatedADCs.size()]; for (int i=0;i<listActivatedADCs.size();i++){ arrayActivatedADCs[i]=listActivatedADCs.get(i); } return arrayActivatedADCs; } /** * Writes a pixe spectra stack * @param path * @param stack */ public void writePixeStack (String path, double [] stack){ try{ PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(path))); out.println("4096 0"); for (int i=0;i<4096;i++) { out.println(String.valueOf((int)stack[i])); } out.close(); } catch (IOException e){ } } }