Ejemplo n.º 1
0
    def __init__(self, app, parent = None):
        QtGui.QMainWindow.__init__(self,parent)
        self.app = app
        self.ui = Ui_Fenster()
        self.ui.setupUi(self)
        self.homePath = QtCore.QDir.currentPath()
        self.myFileList = []
        self.currentImageIndex = 0
        self.removeList = []
        self.removeListEver = []
        self.anatomicalImageDict = {}
        self.myProcessList = []
        self.showDebugOutput = False
        self.ui.le_directory.setText(self.homePath)
        self.output_dir=self.homePath        
        self.flag_atlas_on = True
        self.script = None #Don't do this at home. children!

        self.statusBar().showMessage("Welcome!")
        self.templateDict = {"T1 MNI 1mm fullbrain": "/usr/share/lipsia/mni.v",
                             "EPI 2mm": "/usr/share/lipsia/epi_template_2mm.v",
                             "EPI 3mm":"/usr/share/lipsia/epi_template_3mm.v",         
                             "EPI 1.5mm":"/usr/share/lipsia/epi_template_1.5mm.v"
                            }
        for template, path in self.templateDict.iteritems():
            if(os.path.isfile(path)):
                self.ui.comboBox_template.addItem(template)
        self.ui.comboBox_template.setCurrentIndex(2) 
        self.helpDict = {"Lipsia help": "/usr/share/doc/lipsia/html/index.html" }
        for help, path in self.helpDict.iteritems():
            if(os.path.isfile(path)):
                self.ui.comboBox_help.addItem(help)
        self.show_help()
        self.interpolators = ["Linear", "BSpline", "NearestNeighbor"]
        for inter in self.interpolators:
            self.ui.comboBox_interpol_func.addItem(inter) 

        #list connections
        QtCore.QObject.connect(self.ui.b_add_image_file, QtCore.SIGNAL("clicked()"), self.add_data_to_list )
        QtCore.QObject.connect(self.ui.b_add_image_directory, QtCore.SIGNAL("clicked()"), self.add_dir_to_list )
        QtCore.QObject.connect(self.ui.b_remove_file, QtCore.SIGNAL("clicked()"), self.remove_from_list )
        QtCore.QObject.connect(self.ui.b_start_proc, QtCore.SIGNAL("clicked()"), self.start_processing )
        QtCore.QObject.connect(self.ui.b_output_directory, QtCore.SIGNAL("clicked()"), self.open_output_dir )
        QtCore.QObject.connect(self.ui.b_add_anatomical_image, QtCore.SIGNAL("clicked()"), self.add_anatomical_image )
        QtCore.QObject.connect(self.ui.b_view, QtCore.SIGNAL("clicked()"), self.view_template_image )
        QtCore.QObject.connect(self.ui.b_remove_anatomical_image, QtCore.SIGNAL("clicked()"), self.remove_anatomical_image )
        QtCore.QObject.connect(self.ui.b_save_settings, QtCore.SIGNAL("clicked()"), self.save_settings_to_file )
        QtCore.QObject.connect(self.ui.b_load_settings, QtCore.SIGNAL("clicked()"), self.load_settings )
        QtCore.QObject.connect(self.ui.comboBox_help, QtCore.SIGNAL("currentIndexChanged(int)"), self.show_help )
        QtCore.QObject.connect(self.ui.cb_atlas_registration, QtCore.SIGNAL("clicked()"), self.change_atlas_reg)
        QtCore.QObject.connect(self.ui.le_directory, QtCore.SIGNAL("editingFinishes()"), self.change_output_directory)
        QtCore.QObject.connect(self.ui.b_exit, QtCore.SIGNAL("clicked()"), self.exit_program)
Ejemplo n.º 2
0
class PreProc(QtGui.QMainWindow):
    def __init__(self, app, parent = None):
        QtGui.QMainWindow.__init__(self,parent)
        self.app = app
        self.ui = Ui_Fenster()
        self.ui.setupUi(self)
        self.homePath = QtCore.QDir.currentPath()
        self.myFileList = []
        self.currentImageIndex = 0
        self.removeList = []
        self.removeListEver = []
        self.anatomicalImageDict = {}
        self.myProcessList = []
        self.showDebugOutput = False
        self.ui.le_directory.setText(self.homePath)
        self.output_dir=self.homePath        
        self.flag_atlas_on = True
        self.script = None #Don't do this at home. children!

        self.statusBar().showMessage("Welcome!")
        self.templateDict = {"T1 MNI 1mm fullbrain": "/usr/share/lipsia/mni.v",
                             "EPI 2mm": "/usr/share/lipsia/epi_template_2mm.v",
                             "EPI 3mm":"/usr/share/lipsia/epi_template_3mm.v",         
                             "EPI 1.5mm":"/usr/share/lipsia/epi_template_1.5mm.v"
                            }
        for template, path in self.templateDict.iteritems():
            if(os.path.isfile(path)):
                self.ui.comboBox_template.addItem(template)
        self.ui.comboBox_template.setCurrentIndex(2) 
        self.helpDict = {"Lipsia help": "/usr/share/doc/lipsia/html/index.html" }
        for help, path in self.helpDict.iteritems():
            if(os.path.isfile(path)):
                self.ui.comboBox_help.addItem(help)
        self.show_help()
        self.interpolators = ["Linear", "BSpline", "NearestNeighbor"]
        for inter in self.interpolators:
            self.ui.comboBox_interpol_func.addItem(inter) 

        #list connections
        QtCore.QObject.connect(self.ui.b_add_image_file, QtCore.SIGNAL("clicked()"), self.add_data_to_list )
        QtCore.QObject.connect(self.ui.b_add_image_directory, QtCore.SIGNAL("clicked()"), self.add_dir_to_list )
        QtCore.QObject.connect(self.ui.b_remove_file, QtCore.SIGNAL("clicked()"), self.remove_from_list )
        QtCore.QObject.connect(self.ui.b_start_proc, QtCore.SIGNAL("clicked()"), self.start_processing )
        QtCore.QObject.connect(self.ui.b_output_directory, QtCore.SIGNAL("clicked()"), self.open_output_dir )
        QtCore.QObject.connect(self.ui.b_add_anatomical_image, QtCore.SIGNAL("clicked()"), self.add_anatomical_image )
        QtCore.QObject.connect(self.ui.b_view, QtCore.SIGNAL("clicked()"), self.view_template_image )
        QtCore.QObject.connect(self.ui.b_remove_anatomical_image, QtCore.SIGNAL("clicked()"), self.remove_anatomical_image )
        QtCore.QObject.connect(self.ui.b_save_settings, QtCore.SIGNAL("clicked()"), self.save_settings_to_file )
        QtCore.QObject.connect(self.ui.b_load_settings, QtCore.SIGNAL("clicked()"), self.load_settings )
        QtCore.QObject.connect(self.ui.comboBox_help, QtCore.SIGNAL("currentIndexChanged(int)"), self.show_help )
        QtCore.QObject.connect(self.ui.cb_atlas_registration, QtCore.SIGNAL("clicked()"), self.change_atlas_reg)
        QtCore.QObject.connect(self.ui.le_directory, QtCore.SIGNAL("editingFinishes()"), self.change_output_directory)
        QtCore.QObject.connect(self.ui.b_exit, QtCore.SIGNAL("clicked()"), self.exit_program)

#Einzelnes File hinzufuegen
    def add_data_to_list(self):
        dataList=QtGui.QFileDialog.getOpenFileNames(self, "Select images", self.homePath, ("Images (*.nii *.v)"))
        if(len(dataList)):
            for fileName in dataList:
                self.ui.lw_input_files.addItem(fileName)
                self.ui.lw_functional_anatomical_image.addItem(fileName + " -> ")
                self.myFileList.append(str(fileName))

#Verzeichnis hinzufuegen
    def add_dir_to_list(self):
        dataDir=QtGui.QFileDialog.getExistingDirectory(self, "Data directory", self.homePath)
        if(len(dataDir)):
            self.ui.lw_input_files.addItem(dataDir)
            self.ui.lw_functional_anatomical_image.addItem(dataDir + " -> ")
            self.myFileList.append(dataDir)

#Aus Liste entfernen
    def remove_from_list(self):
        numberSelect = self.ui.lw_input_files.currentRow()
        self.myFileList.remove(self.ui.lw_input_files.item(numberSelect).text())
        try:
            del self.anatomicalImageDict[str(self.ui.lw_input_files.item(numberSelect).text())]
        except:
            pass
        self.ui.lw_input_files.takeItem(numberSelect)
        self.ui.lw_functional_anatomical_image.takeItem(numberSelect)


#Ausgabeverzeichnis waehlen
    def open_output_dir(self):
        self.output_dir=QtGui.QFileDialog.getExistingDirectory(self, "Ouput directory", self.homePath)
        self.ui.le_directory.setText(self.output_dir)

#Anatomisches Bild hinzufuegen
    def add_anatomical_image(self):
        row = self.ui.lw_functional_anatomical_image.currentRow()
        if (not row == -1):
            anaImage=QtGui.QFileDialog.getOpenFileName(self, "Select anatomical image", self.homePath, ("Image (*.nii *.v)"))
            if(len(anaImage)):
                funcFile = (str(self.ui.lw_functional_anatomical_image.item(row).text()).split(" -> "))[0]
                self.anatomicalImageDict[funcFile] = anaImage    
                listString = funcFile + " -> " + anaImage
                self.ui.lw_functional_anatomical_image.takeItem(row)
                self.ui.lw_functional_anatomical_image.insertItem(row, listString)
                self.ui.comboBox_template.setCurrentIndex(0)

#Zeigt ausgewaehltes Templateimage an
    def view_template_image(self):
        imageToShow = self.templateDict[str(self.ui.comboBox_template.currentText())]
        os.system("vlv -in " +  imageToShow + " 2> tmpOut")
        os.remove("tmpOut")

#Anatomisches Bild entfernen
    def remove_anatomical_image(self):
        row = self.ui.lw_functional_anatomical_image.currentRow()
        if (not row == -1):
            listString = str(self.ui.lw_functional_anatomical_image.item(row).text())
            funcImage = listString.split(" -> ")[0] + " -> "
            self.ui.lw_functional_anatomical_image.takeItem(row)
            self.ui.lw_functional_anatomical_image.insertItem(row, funcImage)
            del self.anatomicalImageDict[funcImage.rstrip(" -> ")]
            if(not len(self.anatomicalImageDict) ):
                self.ui.comboBox_template.setCurrentIndex(3)

#ConfigParser zum Speichern
    def save_settings_to_file(self):
        
        config = ConfigParser.RawConfigParser()
        config.add_section('Preprocessing Steps')
        config.set('Preprocessing Steps', 'atlas_registration', self.ui.cb_atlas_registration.isChecked())
        config.set('Preprocessing Steps', 'create_mask', self.ui.cb_create_mask.isChecked())
        config.set('Preprocessing Steps', 'debug_output', self.ui.cb_debug_output.isChecked())
        config.set('Preprocessing Steps', 'fieldmap_correction', self.ui.cb_fieldmap_correction.isChecked())
        config.set('Preprocessing Steps', 'high_pass', self.ui.cb_high_pass.isChecked())
        config.set('Preprocessing Steps', 'low_pass', self.ui.cb_low_pass.isChecked())
        config.set('Preprocessing Steps', 'movement_correction', self.ui.cb_movement_correction.isChecked())
        config.set('Preprocessing Steps', 'set_repetition', self.ui.cb_set_repetition.isChecked())
        config.set('Preprocessing Steps', 'show_mask', self.ui.cb_show_mask.isChecked())
        config.set('Preprocessing Steps', 'show_registration_results', self.ui.cb_show_registration_results.isChecked())
        config.set('Preprocessing Steps', 'slicetime_correction', self.ui.cb_slicetime_correction.isChecked())
        config.set('Preprocessing Steps', 'spatial_filtering', self.ui.cb_spatial_filtering.isChecked())
        config.set('Preprocessing Steps', 'temporal_filtering', self.ui.cb_temporal_filtering.isChecked())
        config.set('Preprocessing Steps', 'write_logfile', self.ui.cb_write_logfile.isChecked())
        config.set('Preprocessing Steps', 'FWHM in mm', self.ui.sb_fwhm.value())
        config.set('Preprocessing Steps', 'High Pass Filter Cutoff in s', self.ui.sb_hp_cutoff.value())
        config.set('Preprocessing Steps', 'Low Pass Filter Cutoff in s', self.ui.sb_lp_cutoff.value())
        config.set('Preprocessing Steps', 'Maximum number of voxel', self.ui.sb_max_num_voxel.value())
        config.set('Preprocessing Steps', 'create_average_mask', self.ui.rb_create_average_mask.isChecked())
        config.set('Preprocessing Steps', 'create_mask_subject', self.ui.rb_create_mask_subject.isChecked())
        config.set('Preprocessing Steps', 'repetition_time', self.ui.dsb_repetition_time.value())
        config.set('Preprocessing Steps', 'output_directory', self.ui.le_directory.text())
        config.set('Preprocessing Steps', 'prefix', self.ui.le_prefix.text())

        config.add_section('Registration Settings')
        config.set('Registration Settings', 'Atlas Template number', self.ui.comboBox_template.currentIndex())
        config.set('Registration Settings', 'Atlas Template text', self.ui.comboBox_template.currentText())
        config.set('Registration Settings', 'ridid_registration', self.ui.cb_rigid_registration.isChecked())
        config.set('Registration Settings', 'max_iterations_p1', self.ui.sb_max_iterations_p1.value())
        config.set('Registration Settings', 'prealing_images', self.ui.cb_prealign_images.isChecked())
        config.set('Registration Settings', 'affine_registration', self.ui.cb_affine_registration.isChecked())
        config.set('Registration Settings', 'max_iterations_p2', self.ui.sb_max_iterations_p2.value())
        config.set('Registration Settings', 'deformable_registration', self.ui.cb_deformable_registration.isChecked())
        config.set('Registration Settings', 'max_iterations_p3', self.ui.sb_max_iterations_p3.value())
        config.set('Registration Settings', 'max_deformation in mm', self.ui.sb_max_deformation.value())
        config.set('Registration Settings', 'Interpolator function', self.ui.comboBox_interpol_func.currentIndex())
        config.set('Registration Settings', 'Output resolution', self.ui.le_output_resolution.text())

        config.add_section('Files')
        config.set('Files', 'Number', len(self.myFileList))
        for i in range(0,len(self.myFileList),1):
            config.set('Files','File ' + str(i), self.myFileList[i])

        configFileName = QtGui.QFileDialog.getSaveFileName(self, "Save settings to file", self.homePath, ("*.lpp"))
        regExp = QtCore.QRegExp(QtCore.QString("*.lpp"))
        regExp.setPatternSyntax(QtCore.QRegExp.Wildcard)
        if(not configFileName.isEmpty()):
            if not regExp.exactMatch(configFileName):
                configFileName.append('.lpp')
            with open(configFileName, 'w') as configfile:
                config.write(configfile)
        else:
           self.throwError("Please specify a filename")
        
#...und laden der Einstellungen
    def load_settings(self):
        config = ConfigParser.RawConfigParser()
        configFileName = QtGui.QFileDialog.getOpenFileName(self, "Load settings from file", self.homePath, ("*.lpp"))
        if(not configFileName.isEmpty()):
            config.readfp(open(configFileName))
        else:
            self.throwError("Please specify a filename")
        self.ui.cb_atlas_registration.setChecked(config.getboolean('Preprocessing Steps', 'atlas_registration'))
        self.change_atlas_reg()
        self.ui.cb_create_mask.setChecked(config.getboolean('Preprocessing Steps', 'create_mask'))
        self.ui.cb_debug_output.setChecked(config.getboolean('Preprocessing Steps', 'debug_output'))
        self.ui.cb_fieldmap_correction.setChecked(config.getboolean('Preprocessing Steps', 'fieldmap_correction'))
        self.ui.cb_high_pass.setChecked(config.getboolean('Preprocessing Steps', 'high_pass'))
        self.ui.cb_low_pass.setChecked(config.getboolean('Preprocessing Steps', 'low_pass'))
        self.ui.cb_movement_correction.setChecked(config.getboolean('Preprocessing Steps', 'movement_correction'))
        self.ui.cb_set_repetition.setChecked(config.getboolean('Preprocessing Steps', 'set_repetition'))
        self.ui.cb_show_mask.setEnabled(self.ui.cb_create_mask.isChecked())
        self.ui.cb_show_mask.setChecked(config.getboolean('Preprocessing Steps', 'show_mask'))
        self.ui.cb_show_registration_results.setEnabled(self.ui.cb_atlas_registration.isChecked())
        if self.flag_atlas_on:
            self.ui.cb_show_registration_results.setChecked(config.getboolean('Preprocessing Steps', 'show_registration_results'))
        self.ui.cb_slicetime_correction.setChecked(config.getboolean('Preprocessing Steps', 'slicetime_correction'))
        self.ui.cb_spatial_filtering.setChecked(config.getboolean('Preprocessing Steps', 'spatial_filtering'))
        self.ui.cb_temporal_filtering.setChecked(config.getboolean('Preprocessing Steps', 'temporal_filtering'))
        self.ui.cb_write_logfile.setChecked(config.getboolean('Preprocessing Steps', 'write_logfile'))
        self.ui.sb_fwhm.setValue(config.getint('Preprocessing Steps', 'FWHM in mm'))
        self.ui.sb_hp_cutoff.setEnabled(self.ui.cb_high_pass.isChecked())
        self.ui.sb_hp_cutoff.setValue(config.getint('Preprocessing Steps', 'High Pass Filter Cutoff in s'))
        self.ui.sb_lp_cutoff.setEnabled(self.ui.cb_low_pass.isChecked())
        self.ui.sb_lp_cutoff.setValue(config.getint('Preprocessing Steps', 'Low Pass Filter Cutoff in s'))
        self.ui.sb_max_num_voxel.setValue(config.getint('Preprocessing Steps', 'Maximum number of voxel'))
        self.ui.rb_create_average_mask.setChecked(config.getboolean('Preprocessing Steps', 'create_average_mask'))
        self.ui.rb_create_mask_subject.setChecked(config.getboolean('Preprocessing Steps', 'create_mask_subject'))
        self.ui.dsb_repetition_time.setEnabled(self.ui.cb_set_repetition.isChecked())
        self.ui.dsb_repetition_time.setValue(config.getfloat('Preprocessing Steps', 'repetition_time'))
        self.ui.le_directory.setText(config.get('Preprocessing Steps', 'output_directory'))
        self.change_output_directory()
        self.ui.le_prefix.setText(config.get('Preprocessing Steps', 'prefix'))
        numberOfFiles = config.getint('Files','Number')
        self.ui.lw_input_files.clear()
        self.ui.lw_functional_anatomical_image.clear()
        self.myFileList = []
        for i in range(0,numberOfFiles,1):
            filepath = config.get('Files','File ' + str(i))
            self.myFileList.append(filepath)
            self.ui.lw_input_files.addItem(filepath)
            self.ui.lw_functional_anatomical_image.addItem(filepath + " -> ")
  
        template_number = config.getint('Registration Settings', 'Atlas Template number')
        if self.ui.comboBox_template.itemText(config.getint('Registration Settings', 'Atlas Template number')) == config.get('Registration Settings', 'Atlas Template text'):
            self.ui.comboBox_template.setCurrentIndex(template_number)
        else:
           self.throwError("Saved template not available")
        self.ui.cb_rigid_registration.setChecked(config.getboolean('Registration Settings', 'ridid_registration'))
        self.ui.sb_max_iterations_p1.setEnabled(self.ui.cb_rigid_registration.isChecked())
        self.ui.sb_max_iterations_p1.setValue(config.getint('Registration Settings', 'max_iterations_p1'))
        self.ui.cb_prealign_images.setEnabled(self.ui.cb_rigid_registration.isChecked())
        self.ui.cb_prealign_images.setChecked(config.getboolean('Registration Settings', 'prealing_images'))
        self.ui.cb_affine_registration.setChecked(config.getboolean('Registration Settings', 'affine_registration'))
        self.ui.sb_max_iterations_p2.setEnabled(self.ui.cb_affine_registration.isChecked())
        self.ui.sb_max_iterations_p2.setValue(config.getint('Registration Settings', 'max_iterations_p2'))
        self.ui.cb_deformable_registration.setChecked(config.getboolean('Registration Settings', 'deformable_registration'))
        self.ui.sb_max_iterations_p3.setEnabled(self.ui.cb_deformable_registration.isChecked())
        self.ui.sb_max_iterations_p3.setValue(config.getint('Registration Settings', 'max_iterations_p3'))
        self.ui.sb_max_deformation.setEnabled(self.ui.cb_deformable_registration.isChecked())
        self.ui.sb_max_deformation.setValue(config.getint('Registration Settings', 'max_deformation in mm'))
        self.ui.comboBox_interpol_func.setCurrentIndex(config.getint('Registration Settings', 'Interpolator function'))
        self.ui.le_output_resolution.setText(config.get('Registration Settings', 'Output resolution'))

#help fehlt
    def show_help(self):
        if( self.ui.comboBox_help.currentText() != "" ):
            self.ui.web_help.setUrl(QtCore.QUrl(self.helpDict[str(self.ui.comboBox_help.currentText())]))

# Template auswahlcheck - wenn die nicht vorhanden sind (lipsia-paket), dann fehler schmeissen und wieder ausschalten
    def change_atlas_reg(self):
        if(self.ui.cb_atlas_registration.isChecked()):
            if(not self.ui.comboBox_template.count()):
                self.throwError("No template image was found. Please make sure you have installed the lipsia-sandbox package!")
                self.ui.cb_atlas_registration.setChecked(False)
                self.ui.cb_show_registration_results.setChecked(False)
                self.ui.cb_show_registration_results.setEnabled(False)
                self.flag_atlas_on = False
            else:
                self.flag_atlas_on = True

#Sicherstellen, dass die output_dir - variable mit dem uebereinstimmt was im Textfeld steht
    def change_output_directory(self):
        self.output_dir = self.ui.le_directory.text()

##################################################################################################################################

#Verarbeitung starten
    def start_processing(self):
        if(len(self.myFileList)):
            self.calculateProgressBar()
            self.ui.progressBar.setValue(0)
            self.ui.b_start_proc.setEnabled(False)
            if (self.ui.cb_script.isChecked()):
                self.generateScript()
            for myFile in self.myFileList:
                if (self.convertAndCheck(str(myFile))):
                    checked = True
                else:
                    checked = False
                    break
            if (checked):
                finalList=[]
                for file in self.myProcessList:
                    origName = file
                    if(self.ui.cb_slicetime_correction.isChecked()):   
                        file = self.doSliceTimeCorrection(file)
                    if(self.ui.cb_movement_correction.isChecked()):
                        file = self.doMovementCorrection(file)
                    if(self.ui.cb_atlas_registration.isChecked()):
                        file = self.doRegistration(file)
                    if(self.ui.cb_spatial_filtering.isChecked()):
                        file = self.doSpatialFiltering(file)
                    if(self.ui.cb_temporal_filtering.isChecked()):
                        file = self.doTemporalFiltering(file)
                    if(self.ui.cb_create_mask.isChecked() and self.ui.rb_create_mask_subject.isChecked()):
                        self.doCreateMaskFromFile(file, origName)
                    finalList.append(file)
                    outFile = str(self.output_dir).rstrip("/") + "/" + self.ui.le_prefix.text() + origName.split("/")[len(origName.split("/"))-1]
                    self.applyCommand("cp " + file + " " + outFile)
                if(self.ui.cb_create_mask.isChecked() and self.ui.rb_create_average_mask.isChecked()):
                    self.doCreateMaskAverage(finalList)
                        
                self.currentImageIndex += 1
            else:
                print "Processing stopped!"
            self.progress()
            self.ui.progressBar.setValue(0)            
            self.currentImageIndex = 0
            self.debugOutput("Done!", True)
            if self.script != None :
                self.script.close()
                self.script = None
            self.ui.b_start_proc.setEnabled(True)        

    def convertAndCheck(self, myFile):
        myFile = self.convertFiles(myFile)
        if(self.checkAll(myFile)):
            self.myProcessList.append(myFile)
            return True
        else:
            return False

    def convertFiles(self, myFile):
        self.progress()
        readFormat=""
        if( string.find(myFile, ".v") == -1 and string.find(myFile, ".nii") == -1 and string.find(myFile, ".ima") == -1 and string.find(myFile, ".dcm") == -1 ):
            readFormat = "-rf .ima"
        if( string.find(myFile, ".v") == -1 or self.ui.cb_set_repetition.isChecked() ):
            self.debugOutput("Converting " + myFile + " to vista...", True)
            outFile = myFile.rstrip("/")
            outFile = outFile.rstrip(".nii")
            outFile = outFile.rstrip(".v")
            outFile = outFile.split("/")[len(outFile.split("/"))-1]
            #outFile = "conv_" + outFile
            if(self.ui.cb_set_repetition.isChecked()):
                tr = self.ui.dsb_repetition_time.value()
                self.applyCommand("vvinidi -in " + myFile + " -out " + str(self.output_dir).rstrip("/") + "/" + outFile + ".v -tr " + str(tr) + " " + readFormat)
            else:
                self.applyCommand("vvinidi -in " + myFile + " -out " + str(self.output_dir).rstrip("/") + "/" + outFile + ".v " + readFormat)
            self.removeList.append(str(self.output_dir).rstrip("/") + "/" + outFile + ".v")
            return str(self.output_dir).rstrip("/") + "/" + outFile + ".v"
        else:
            return myFile
        
    def checkAll(self, myFile):
        #check for TR
        self.progress()
        if((self.ui.cb_temporal_filtering.isChecked() or self.ui.cb_movement_correction.isChecked()) and not self.ui.cb_set_repetition.isChecked()):
            if( not self.checkHeaderFor(myFile, "repetition_time") ):
                self.throwError("The repetition time in " + myFile + " is missing. Please set it manually.")
                return False
        #check for slicetime
        if( self.ui.cb_slicetime_correction.isChecked()):
            if( not self.checkHeaderFor(myFile, "slice_time") ):
                self.throwError("The slicetime information in " + myFile + " is missing. Please deselect slicetime correction.")
                return False
            
        return True

#################################################################################################################################

#Tatsaechliche Behandlungsschritte

    def doSliceTimeCorrection(self,file):
        self.progress()
        self.debugOutput("Applying slicetime correction to " + file + "...", True)
        outFile = str(self.output_dir).rstrip("/") + "/slicetime_" + file.split("/")[len(file.split("/"))-1]
        self.applyCommand("vslicetime -in " + str(file) + " -out " + str(outFile))
        self.removeList.append(outFile)
        return outFile

    def doSliceTimeCorrection_script(self,file):
        outFile = str(self.output_dir).rstrip("/") + "/slicetime_" + file.split("/")[len(file.split("/"))-1]
        self.applyCommand("vslicetime -in " + str(file) + " -out " + str(outFile))
        self.removeList.append(outFile)

    def doMovementCorrection(self,file):
        self.progress()
        self.debugOutput("Applying movement correction to " + file + "...", True)
        outFile = str(self.output_dir).rstrip("/") + "/movcorr_" + file.split("/")[len(file.split("/"))-1]
        self.applyCommand("vmovcorrection -in " + str(file) + " -out " + str(outFile))
        self.removeList.append(outFile)
        return outFile
    
    def doRegistration(self, file):
        self.progress()
        outFile = str(self.output_dir).rstrip("/") + "/reg_" + file.split("/")[len(file.split("/"))-1]
        #registration
        prealign = ""
        if(not self.ui.cb_prealign_images.isChecked()):
            prealign = " -prealign false"
        bound = self.ui.sb_max_deformation.text()
        iter_bspline = self.ui.sb_max_iterations_p3.value()
        iter_affine = self.ui.sb_max_iterations_p2.value()
        iter_rigid = self.ui.sb_max_iterations_p1.value()
        transform = "0"
        optimizer = "0"
        resolution = str(self.ui.le_output_resolution.text()).replace(",", " ", 3)
        max_iterations = str(iter_rigid)
        if(self.ui.cb_affine_registration.isChecked()):
            optimizer += " 0"
            transform += " 1"
            max_iterations += " " + str(iter_affine)
        if(self.ui.cb_deformable_registration.isChecked()):
            optimizer += " 2"
            transform += " 2"
            max_iterations += " " + str(iter_bspline)
        interpolator = self.ui.comboBox_interpol_func.currentText()
        #check if an anatomical image was specified
        origFile = str(self.myFileList[self.currentImageIndex])
        movingFile = file
        anatomicalFile = ""
        ana=True
        try:
            anatomicalFile = self.anatomicalImageDict[str(origFile)]
        except:
            ana=False
            pass

        if(ana):
            self.debugOutput("Registration of anatomical image " + anatomicalFile + " to functional image " + movingFile, True)
            self.applyCommand("valign3d -ref " + movingFile + " -in " + anatomicalFile + " -trans ana_to_func.nii")
            self.debugOutput("Resampling anatomical image", True)
            self.applyCommand("vdotrans3d -ref " + movingFile + " -in " + anatomicalFile + " -trans ana_to_func.nii -res 1 -out ana_to_func.v")
            self.debugOutput("Registration of anatomical image to template " + str(self.ui.comboBox_template.currentText()), True)
            self.applyCommand("valign3d -ref " + self.templateDict[str(self.ui.comboBox_template.currentText())] + " -in ana_to_func.v -trans trans.nii -transform " + transform +" -optimizer " + optimizer + " -bound " + str(bound) + " " + prealign +  " -iter " +  str(max_iterations) + " -v")
        else:
            self.debugOutput("Registration of " + movingFile + " on " + str(self.ui.comboBox_template.currentText()) + "..." , True)
            self.applyCommand("valign3d -ref " + self.templateDict[str(self.ui.comboBox_template.currentText())] + " -in " + movingFile + " -trans trans.nii -transform " + transform + " -optimizer " + optimizer + " -bound " + str(bound) + " " + prealign + " -iter " + str(max_iterations) + " -v")
        #resampling
        if(self.ui.cb_show_registration_results.isChecked() and ana):
            self.progress()
            self.debugOutput("Resampling the image to check the registration result...", True)
            self.applyCommand("vdotrans3d -ref " + self.templateDict[str(self.ui.comboBox_template.currentText())] + " -in ana_to_func.v -trans trans.nii -out regResult.v")
            self.debugOutput("Opening viewer to show the registration results. Close it to continue!", True)
            self.applyCommand("vlv " + self.templateDict[str(self.ui.comboBox_template.currentText())] + " & ")
            self.applyCommand("vlv regResult.v")
            
        self.debugOutput("Resampling the image " + outFile + "...", True)
        self.progress() 
        self.applyCommand("vdotrans3d -ref " + self.templateDict[str(self.ui.comboBox_template.currentText())] + " -in " + file + " -trans trans.nii -res " + resolution + " -fmri -out " + outFile + " -interpolator " + str(interpolator))
        self.removeList.append(outFile)
        self.removeListEver.append("trans.nii")
        self.removeListEver.append("ana_to_func.v")
        self.removeListEver.append("ana_to_func.nii")
        self.removeListEver.append("regResult.v")
        return outFile


    def doSpatialFiltering(self,file):
        self.progress()
        outFile = str(self.output_dir).rstrip("/") + "/sfilter_" + file.split("/")[len(file.split("/"))-1]
        self.debugOutput("Applying spatial filter to " + file + "...", True)
        self.applyCommand("vpreprocess -in " + file + " -out " + outFile + " -fwhm " + str(self.ui.sb_fwhm.value()))
        self.removeList.append(outFile)
        return outFile
        
    def doTemporalFiltering(self,file):
        self.progress()
        outFile = str(self.output_dir).rstrip("/") + "/tfilter_" + file.split("/")[len(file.split("/"))-1]
        self.debugOutput("Applying temporal filter to " + file + "...", True)
        highString=lowString=""
        if(self.ui.cb_high_pass.isChecked()):
            highString=" -high " + str(self.ui.sb_hp_cutoff.value())
        if(self.ui.cb_low_pass.isChecked()):
            lowString=" -low " + str(self.ui.sb_lp_cutoff.value())
        self.applyCommand("vpreprocess -in " + file + "  -out " + outFile + highString + lowString)
        self.removeList.append(outFile)
        return outFile

    def doCreateMaskFromFile(self,file,origName):
        self.progress()
        maskFile = str(self.output_dir).rstrip("/") + "/mask_" + origName.split("/")[len(origName.split("/"))-1]
        self.debugOutput("Creating mask for image " + origName + "...", True)
        self.applyCommand("vtimestep -in " + file + " -out tmpTimeStep.v")
        self.createMask("tmpTimeStep.v", maskFile)
        
    def doCreateMaskAverage(self,imageList):
        self.progress()
        imageString = ""
        index=0
        timestepList = []
        for file in imageList:
            self.applyCommand("vtimestep -in " + file + " -out " + str(index) + ".v")
            timestepList.append(str(index) + ".v")
            self.removeListEver.append(str(index) + ".v")
            imageString += str(index) + ".v "
            index+=1
        self.applyCommand("vave -in " + imageString + " -out tmpAverage.v")
        self.removeTmpFiles()
        self.createMask("tmpAverage.v", str(self.output_dir).rstrip("/") + "/" + "mask.v")
        self.removeListEver.append("tmpAverage.v")
        
    def createMask(self,input,output):
        self.debugOutput("Creating mask...", True)
        threshold = 70
        maxvoxel = int(self.ui.sb_max_num_voxel.text())
        voxelcount = maxvoxel + 1
        self.removeListEver.append("tmpMask.v")
        self.removeListEver.append("tmpMaskSmoothed.v")
        self.removeListEver.append("tmpMaskFloat.v")
        self.removeListEver.append("volumeinfo.tmp")
        while(voxelcount > maxvoxel):
            self.applyCommand("vbinarize -in " + input + " -out tmpMask.v -min "+ str(threshold))
            self.applyCommand("vsmooth3d -in tmpMask.v -out tmpMaskSmoothed.v -iter 1000")
            self.applyCommand("vconvert -in tmpMaskSmoothed.v -out tmpMaskFloat.v -repn float")
            os.system("volumeinfo -in tmpMaskSmoothed.v 2> volumeinfo.tmp")
            volumefile = open("volumeinfo.tmp")
            lines = volumefile.readlines()
            for line in lines:
                if(string.find(line, "0:") != -1):
                    voxelcount =  float((line.split(":")[1].split(",")[1]).rstrip("\n"))
            threshold+=1
            if(threshold == 255):
                self.throwError("Creating of mask failed!")
                return False
        if(self.ui.cb_show_mask.isChecked()):
            self.applyCommand("vlv -in " + input + " -z tmpMaskFloat.v")
        self.applyCommand("mv tmpMaskSmoothed.v " + output)

################################################################################################################################## 

    def throwError(self, msg):
        QtGui.QMessageBox.critical(self, "Error", msg)

    def calculateProgressBar(self):
        maxProgress=0
        self.ui.progressBar.setMaximum(maxProgress)
        #converting + check:
        maxProgress+=len(self.myFileList)*2
        if(self.ui.cb_slicetime_correction.isChecked()):
            maxProgress+=len(self.myFileList)
        if(self.ui.cb_movement_correction.isChecked()):
            maxProgress+=len(self.myFileList)
        if(self.ui.cb_atlas_registration.isChecked()):
            maxProgress+=len(self.myFileList)*2
        if(self.ui.cb_show_registration_results.isChecked()):
            maxProgress+=len(self.myFileList)
        if(self.ui.cb_spatial_filtering.isChecked()):
            maxProgress+=len(self.myFileList)
        if(self.ui.cb_temporal_filtering.isChecked()):
            maxProgress+=len(self.myFileList)
        if(self.ui.cb_create_mask.isChecked() and self.ui.rb_create_mask_subject.isChecked()):
            maxProgress+=len(self.myFileList)
        if(self.ui.cb_create_mask.isChecked() and self.ui.rb_create_average_mask.isChecked()):
            maxProgress+=1
        self.ui.progressBar.setMaximum(maxProgress)
        

    def checkHeaderFor(self, file, attribute):
        self.debugOutput("Checking " + file + " for attribute " + attribute, True)
        os.system("less " + str(file) + " > check")
        checkFile = open("check")
        for line in checkFile.readlines():
            if(string.find(line, attribute) != -1):
                checkFile.close()
                os.remove("check")
                return True
        return False
        
    def progress(self, size=1):
        value = self.ui.progressBar.value() + size
        self.ui.progressBar.setValue(value)
        self.app.processEvents()

    def debugOutput(self, outString, statusBar):
        if(self.ui.cb_debug_output.isChecked()):
            print outString
        if(statusBar):
            self.statusBar().showMessage(outString)
            self.app.processEvents()

    def generateScript(self):
        scriptName = QtGui.QFileDialog.getSaveFileName(self, "Save Shell script", self.homePath, ("*.sh"))
        regExp = QtCore.QRegExp(QtCore.QString("*.sh"))
        regExp.setPatternSyntax(QtCore.QRegExp.Wildcard)
        if(not scriptName.isEmpty()):
            if not regExp.exactMatch(scriptName):
                scriptName.append('.sh')
            self.script = open(scriptName, 'w')
            os.system(str("chmod +x " + scriptName))
            self.script.write("#! /bin/sh\n")
        else:
            self.throwError("Please specify a filename")
            generateScript()
            
    def applyCommand(self, command):
        if (self.ui.cb_debug_output.isChecked()):
            print "-> " + command
            os.system(str(command))
        else:
            os.system(str(command) + " > tmpOut 2> tmpOut")
        if (self.ui.cb_script.isChecked() and self.script != None):
            self.script.write("\n" + command)
            
    def removeTmpFiles(self):
        for fileToRemove in self.removeListEver:
            try:
                os.remove(fileToRemove)
            except:
                pass
            
    def exit_program(self):
        self.removeTmpFiles()
        self.debugOutput("Removing temporary files. Please standby...", True)
        if(not self.ui.cb_write_logfile.isChecked()):
            for fileToRemove in self.removeList:
                try:
                    os.remove(fileToRemove)
                except:
                    pass           
        try:
            os.remove("tmpOut")
        except:
            pass
        print "Good bye!"