concS.updateChannelsBounds(true);SequenceUtil.concatZ()concS.updateChannelsBounds(true);
    Splitter (ArrayList<Sequence> acquiredSeqs, File transfoFile) throws InterruptedException{
        System.out.println("started S1");
        rois = new ArrayList<ROI>();
        cropImages = new ArrayList<IcyBufferedImage>();
        seqBundleList = new ArrayList<>();
        concSeqList = new ArrayList<Sequence>();
        fuck = false;
        SU1 = null;
        doneSU = false;
        init = true;
        ArrayList<Sequence>    seqBundle = null;
        System.out.println("splitter checkpoint 1");
        for (int r = 0; r < rois.size(); r++) {
            rois.get(r).setName(rois.get(r).getName() + " Channel#" + Integer.toString(r));
            rois.get(r).setShowName(true);
        }
        
        for (Sequence acquiredSeq : acquiredSeqs) {            
        // get current position
        String pos = ExtractPos(acquiredSeq);        
        
        // get image type
        dataType = acquiredSeq.getDataType_();
        
        // get contours for splitting
        rois = acquiredSeqs.get(0).getROIs();
        possibilities = new String[rois.size()];
        
        //Create image per ROI
        seqBundle = new ArrayList<Sequence>();
            for(int r = 0; r < rois.size(); r++)
            {
                ROI roi = rois.get(r);
                Rectangle5D bnd = roi.getBounds5D();
                IcyBufferedImage img = new IcyBufferedImage((int)Math.round(bnd.getSizeX()), (int) Math.round(bnd.getSizeY()), 1, dataType);
             
                //TODO: Before each crop, apply transform. After each crop, reset base image
                //change bnd to after-transform corners
                IcyBufferedImage copyImg = acquiredSeq.getLastImage();
                
                // store image
                cropImages.add(r, img);
             
                // create sequence
                Sequence s = new Sequence(img);
                
                // change sequence name
                s.setName(roi.getName());
                
                // show it
//                Icy.getMainInterface().addSequence(s);
                
                // ready ROI options
                possibilities[r] = s.getName();
                
                // create bundle of split images from single sequence(position)
                seqBundle.add(s);
            }
            // pair bundles with their pos name
            seqBundleList.add(new BPpair(seqBundle, pos));
        //Concatenate split images
        if (!MultiFretIcy.PS.offlineBool) {
            Sequence[] seqBundle2 = new Sequence[seqBundle.size()];
            seqBundle2 = seqBundle.toArray(seqBundle2);
            
            // create sequence 
            Sequence concS = new Sequence();
            concS.beginUpdate();
            concS = SequenceUtil.concatZ(seqBundle2, false, false, true);
            concS.endUpdate();
            
            // set sequence name
            concS.setName(pos);
            
            // set channel names
            for(int r = 0; r < rois.size(); r++)  {
                concS.setChannelName(r, rois.get(r).getName());
            } 
            
            // show it
            concS.updateChannelsBounds(true);
            Icy.getMainInterface().addSequence(concS);
            
            // List
            concSeqList.add(concS);
            System.out.println("made thing");
            System.out.println("Triggered split");    
            
            // Initial split so SU has something to work with
            Split(new AcquiredObject(acquiredSeq.getLastImage(),System.nanoTime(),pos),transfoFile,false);             
        }
    }
    public void Split(AcquiredObject acqObj, File transfoFile,boolean x) {
        // Update images
        IcyBufferedImage newImage = null;
        try {
            newImage = acqObj.acqImg;
        } catch (Exception e) {
            MessageDialog.showDialog("ERROR ACQUIRING IMAGE");
            e.printStackTrace();
        }
        
        for(int q = 0; q < seqBundleList.size(); q++) {
            if(seqBundleList.get(q).Pos.equals(acqObj.position)) {
                ArrayList<Sequence> seqBundle = seqBundleList.get(q).Bundle;
                for(int r = 0; r < rois.size(); r++)  {             
                    seqBundle.get(r).beginUpdate();
                    
                    ROI roi = rois.get(r);
                    Rectangle bnd = roi.getBounds5D().toRectangle2D().getBounds();
                    IcyBufferedImage img = cropImages.get(r);
                    img.copyData(newImage, bnd, null);
                    
                    seqBundle.get(r).removeAllImages();
                    seqBundle.get(r).addImage(img);
                    
                    Sequence concS = null;
                    for (Sequence s : concSeqList) {
                        if (s.getName().equals(acqObj.position)) {
                            concS = s;
                        }
                    }
                    
                    if (concS == null) {System.out.println("No Matching concS");}
                   
                    concS.beginUpdate();                  
                    concS.setImage(0, r, IcyBufferedImageUtil.scale(img, concS.getWidth(), concS.getHeight())); init = false;
                    concS.endUpdate();
                    concS.updateChannelsBounds(true);                   
                    // x is true after the initial split
                    if (x==true) {
                        String roiN = rois.get(r).getName();
                        System.out.println("Split made: " + roiN);
                        if (roiN != base && MultiFretIcy.PS.transformEnabled == true) { 
                        Transform(seqBundle.get(r), transfoFile, roiN);
                        } 
                    }
                    seqBundle.get(r).endUpdate();      
                }
            }
        }
Apologies if it's a bit messy, please ask for any clarification needed.