mri_lab_8_sd.py

mri_lab_8_sd.py

class MRI_SD_Widget(QDialog):
    def __init__(self,parent=None): #设定UI界面,包括按钮、菜单

[MRI Lab]-[Pulse Design]在这里插入图片描述

#menu
       self.createGradMenu() #已完成的部分
       self.createPulseMenu()
       self.createLoopMenu()
       '''
       self.createAmplMenu() #未完成的部分
       self.createAttenMenu()
       self.createGateMenu()
       self.createPhModMenu()
       '''

PulseMenu为例,对照可了解弹出菜单的做法(设置每一帧的属性)

def createPulseMenu(self):
       self.setContextMenuPolicy(Qt.CustomContextMenu)
       self.PulseMenu=QMenu(self)
       self.Pulseaction90=self.PulseMenu.addAction(self.pulse90Icon,u'| 90 Pulse')
       self.Pulseaction180X=self.PulseMenu.addAction(self.pulse180Icon,u'|180X+ Pulse')
       self.Pulseaction180Xminus=self.PulseMenu.addAction(self.pulse180Icon,u'|180X- Pulse')
       self.Pulseaction180Y=self.PulseMenu.addAction(self.pulse180Icon,u'|180Y+ Pulse')
       self.Pulseaction180Yminus=self.PulseMenu.addAction(self.pulse180Icon,u'|180Y- Pulse')
       self.PulseactionDesign=self.PulseMenu.addAction(u'|Design Pulse')
       self.PulseactionZero=self.PulseMenu.addAction(self.zeroIcon,u'|     zero')
       self.PulseactionShow=self.PulseMenu.addAction(u'|      show')
       self.Pulseaction90.triggered.connect(self.Pulseaction90Handler)
       self.Pulseaction180X.triggered.connect(self.Pulseaction180XHandler)
       self.Pulseaction180Xminus.triggered.connect(self.Pulseaction180XminusHandler)
       self.Pulseaction180Y.triggered.connect(self.Pulseaction180YHandler)
       self.Pulseaction180Yminus.triggered.connect(self.Pulseaction180YminusHandler)
       self.PulseactionDesign.triggered.connect(self.PulseactionDesignHandler)
       self.PulseactionZero.triggered.connect(self.PulseactionZeroHandler)
       self.PulseactionShow.triggered.connect(self.PulseactionShowHandler)

在这里插入图片描述

def tableWidget_set(self): #设置绘图区域的尺寸,包括:
self.headerVertical=["Time Delay /us",
                            "Pulse Sequence",
                       "Gradient X",
                       "Gradient Y",
                       "Gradient Z",
                       "Loop structure"]
#以及不同属性的显示(png格式图片)

默认参数从data.txt载入,导入self.flag[][]数组中:以前4列的数据为例

#open file
        fileObject=open('Pulse_design/data.txt','r')

15
6
100
100
500 //row 1
0
0
0
0
0
81
120 //row 2
0 //pulse sequence
0 //gradient X
0 //gradient Y
+Amplitude:0.01 Increase duration:1 Holding duration:119 Decrease duration:0 The END //gradient Z
0
87
120 //row 3
pulse90
0
0
+Amplitude:0.01 Increase duration:0 Holding duration:119 Decrease duration:1 The END
0
107
120 //row 4
0
+Amplitude:0.01 Increase duration:1 Holding duration:119 Decrease duration:0 The END
+Amplitude:0.01 Increase duration:1 Holding duration:119 Decrease duration:0 The END
-Amplitude:0.01 Increase duration:1 Holding duration:118 Decrease duration:1 The END
0
310

self.flags[k][i]=fileObject.readline().rstrip('\n')

具体写入如下:

for i in range(self.CountColumn):
            for k in range(1,self.CountRow): #对于gradient的3行
                self.labels[k][i].setMinimumSize(3,3)
                self.labels[k][i].setScaledContents(True)
                self.tableWidget.setItem(k,i,QTableWidgetItem(" "))
                if self.flags[k][i][0]=='0':
                    self.labels[k][i].setPixmap(self.zeroScaled) 
                    #推测这个函数的功能是以点阵格式载入png文件(1152*648)到这个单元
                elif self.flags[k][i][0]=='+':
                    self.labels[k][i].setPixmap(self.highScaled)
                elif self.flags[k][i][0]=='-':
                    self.labels[k][i].setPixmap(self.lowScaled)
                elif self.flags[k][i][0]=='?' or self.flags[k][i][0:6]=="Spiral":
                    self.labels[k][i].setPixmap(self.funcScaled)
                elif self.flags[k][i]=="pulse90":
                    self.labels[k][i].setPixmap(self.pulse90Scaled)
                    self.tableWidget.setItem(k,i,QTableWidgetItem("90°"))
                    self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
                elif self.flags[k][i]=="pulse180X+":
                    self.labels[k][i].setPixmap(self.pulse180Scaled)
                    self.tableWidget.setItem(k,i,QTableWidgetItem("180°X+"))
                    self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
                elif self.flags[k][i]=="pulse180X-":
                    self.labels[k][i].setPixmap(self.pulse180Scaled)
                    self.tableWidget.setItem(k,i,QTableWidgetItem("180°X-"))
                    self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
                elif self.flags[k][i]=="pulse180Y+":
                    self.labels[k][i].setPixmap(self.pulse180Scaled)
                    self.tableWidget.setItem(k,i,QTableWidgetItem("180°Y+"))
                    self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
                elif self.flags[k][i]=="pulse180Y-":
                    self.labels[k][i].setPixmap(self.pulse180Scaled)
                    self.tableWidget.setItem(k,i,QTableWidgetItem("180°Y-"))
                    self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
                elif self.flags[k][i][0:9]=="loopStart":
                    self.labels[k][i].setPixmap(self.loopStartScaled)
                    self.tableWidget.setItem(k,i,QTableWidgetItem(self.flags[k][i][9:]))
                    self.LoopTime=self.flags[k][i][9:]
                    self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
                elif self.flags[k][i]=="loopEnd":
                    self.labels[k][i].setPixmap(self.loopEndScaled)
                    self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
                else:
                    self.labels[k][i].setPixmap(self.funcScaled)

问题:函数QPixmap等未定义?是没做完还是在别的文件里调用了库?

设置右侧3个按钮的功能,以[Add Column]为例:

 def AddColumnBtnClicked(self):
        self.CountColumn+=1
        y=self.CountColumn-1 #原列数
        self.tableWidget.setColumnCount(self.CountColumn)
        self.tableWidget.setColumnWidth(y,self.ColumnWidth)
        self.tableWidget.setItem(0,y,QTableWidgetItem("5"))
        self.tableWidget.item(0,y).setTextAlignment(QtCore.Qt.AlignCenter)
        for i in range(1,self.CountRow):
            self.labels[i][y].setPixmap(self.zeroScaled)
            self.flags[i][y]="0"
            self.tableWidget.setCellWidget(i,y,self.labels[i][y])
            self.labels[i][y].setScaledContents(True)

再以[save]为例:

 def SaveBtnClicked(self):
        fileObject=open('Pulse_design/data.txt','w')#写入之前那个文件,貌似不能新建
        fileObject.write(str(self.CountColumn))
        fileObject.write('\n')
        fileObject.write(str(self.CountRow))
        fileObject.write('\n')
        fileObject.write(str(self.rangeMax))
        fileObject.write('\n')
        for i in range(self.CountColumn):
            fileObject.write(str(self.tableWidget.columnWidth(i)))
            fileObject.write('\n')
            fileObject.write(self.tableWidget.item(0,i).text())
            fileObject.write('\n')
            for k in range(1,self.CountRow):
                fileObject.write(self.flags[k][i])
                fileObject.write('\n')
        fileObject.close()

而[create]是重头戏,创建学生使用的序列,以汇编语言写入txt文件:

def CreateBtnClicked(self):
        #create time and xyz program
        fileObject=open('sequence/sig/myPulse.txt','w')
        print("creating TimePulse")
        fileObject.write("J C"+'\n')
        fileObject.write("LOOP_CTR = "+hex(int(self.LoopTime))+'\n')  # no LOOP now
        fileObject.write("CMD1 = 0x0"+'\n')
        fileObject.write("CMD2 = 0x0"+'\n')
        fileObject.write("CMD3 = 0x2"+'\n')
        fileObject.write("CMD4 = 0x0"+'\n')
        fileObject.write("CMD5 = TX_GATE | TX_PULSE | RX_PULSE"+'\n')
        ....

J C
LOOP_CTR = 0x1
CMD1 = 0x0
CMD2 = 0x0
CMD3 = 0x2
CMD4 = 0x0
CMD5 = TX_GATE | TX_PULSE | RX_PULSE
CMD6 = TX_GATE | TX_PULSE
CMD7 = GRAD_PULSE | RX_PULSE
CMD8 = GRAD_PULSE
CMD9 = TX_GATE | TX_PULSE | RX_PULSE | GRAD_PULSE
CMD10 = TX_GATE | TX_PULSE | GRAD_PULSE
LD64 2, LOOP_CTR
LD64 3, CMD3
LD64 4, CMD4
LD64 5, CMD5
LD64 6, CMD6
LD64 7, CMD7
LD64 8, CMD8
LD64 9, CMD9
LD64 10, CMD10 #以上是对板子的初始化
PR 3, 500 #从单元属性,到一维数组元素的值,再到写入的汇编语言,复杂的对应关系
PR 7, 120
TXOFFSET 0
PR 9, 120
PR 7, 420
PR 3, 300
PR 7, 120
TXOFFSET 1000
PR 9, 120
PR 5, 60
PR 3, 60
PR 7, 400
HALT

另一个有待完成的功能是读取学生编程的cpp文件。写入cpp文件的代码如下:

#X Y Z design的cpp
        fileObject=open("server/PulseProgram.cpp","w")
        fileObject.write("#include <stdio.h>"+'\n')
        fileObject.write("#include <stdlib.h>"+'\n')
        fileObject.write("#include <stdint.h>"+'\n')
        ...
 #fRO还没偶定义**************
  #fROprestep还没有定义****************************
<think>好的,用户遇到了错误信息“Error: /bin/bash: mri_converter: command not found”,我需要帮他们分析可能的原因并提供解决方案。首先,我得理解这个错误是什么意思。看起来用户试图在Bash中运行一个名为mri_converter的命令,但系统找不到这个命令。可能的情况有几个: 1. **命令名称拼写错误**:用户可能输入了错误的命令名,比如大小写错误或者拼写错误。比如,正确的命令是否是mri_convert而不是mri_converter?或者有没有多余的字母? 2. **命令未安装**:用户可能没有安装包含这个命令的软件包。比如,mri_convert是FreeSurfer工具的一部分,用户是否安装了FreeSurfer并且正确配置了环境变量? 3. **路径问题**:即使安装了,如果命令所在的目录没有加入系统的PATH环境变量中,Bash也无法找到。比如,FreeSurfer的安装路径是否在PATH里? 4. **脚本权限问题**:如果用户是在运行自己的脚本,可能脚本没有执行权限,或者脚本内部调用了mri_converter但路径不对。 接下来,我需要考虑用户可能的背景。用户之前提到将Bash代码保存到.m文件导致无法运行,现在又遇到命令未找到的错误。可能他们正在尝试使用FreeSurfer工具处理MRI数据,但环境配置有问题。用户可能对Linux系统和环境变量配置不太熟悉,需要逐步指导。 需要分步骤引导用户检查: - 首先确认命令的正确拼写,是否存在大小写错误或拼写错误。 - 检查是否安装了对应的软件(如FreeSurfer),安装路径是否正确。 - 确认命令所在的目录是否在PATH中,或者使用绝对路径来执行命令。 - 检查脚本是否有执行权限,或者是否在正确的目录下运行。 另外,用户可能在Windows上使用WSL或者Cygwin,或者在Linux/macOS上操作,需要针对不同系统给出建议。例如,在FreeSurfer的情况下,通常需要先运行设置脚本来配置环境变量,用户可能漏掉了这一步。 可能还需要提醒用户,如果命令是脚本,需要确保脚本所在的目录在PATH中,或者使用./script.sh的方式运行。同时,权限问题也需要检查,使用chmod +x来添加执行权限。 最后,要给出具体的命令示例,让用户可以直接复制粘贴进行测试,这样更容易解决问题。例如,如何检查命令是否存在,如何添加路径到环境变量,如何运行FreeSurfer的设置脚本等。 总结,我需要将这些问题点分步骤列出,并提供对应的解决方法和验证步骤,确保用户能够一步步排查问题所在,并最终解决命令未找到的错误。</think>--- ### **错误分析** 错误信息 `Error: /bin/bash: mri_converter: command not found` 表明系统在以下位置找不到 `mri_converter` 命令: 1. 当前目录(若未指定路径) 2. 环境变量 `PATH` 包含的目录 --- ### **可能原因及解决方案** #### **1. 命令名称拼写错误** - ❌ 错误行为:输入了错误的命令名称(例如 `mri_converter` 应为 `mri_convert`)。 - ✅ 验证方法: ```bash # 检查 FreeSurfer 中是否有 mri_convert ls /home/xtx/Desktop/freesurfer/bin/mri_convert ``` - ✅ 修复方法:使用正确命令名称(如 `mri_convert`)。 --- #### **2. 未安装 FreeSurfer** - ❌ 错误现象:未安装 FreeSurfer 或安装路径错误。 - ✅ 验证方法: ```bash # 检查 FreeSurfer 安装目录是否存在 ls /home/xtx/Desktop/freesurfer ``` - ✅ 修复方法: - 安装 FreeSurfer(参考[官方文档](https://surfer.nmr.mgh.harvard.edu/fswiki/DownloadAndInstall))。 - 确保安装路径与脚本中 `freesurfer_bin` 变量一致。 --- #### **3. 环境变量未配置** - ❌ 错误原因:FreeSurfer 的 `bin` 目录未添加到 `PATH` 环境变量。 - ✅ 验证方法: ```bash # 检查环境变量 PATH echo $PATH ``` - ✅ 修复方法: - 在终端运行 FreeSurfer 的初始化脚本(每次打开终端时需执行): ```bash source /home/xtx/Desktop/freesurfer/SetUpFreeSurfer.sh ``` - 或直接在脚本中添加路径: ```bash export PATH="/home/xtx/Desktop/freesurfer/bin:$PATH" ``` --- #### **4. 未使用绝对路径调用命令** - ❌ 错误行为:直接调用 `mri_converter` 而非完整路径。 - ✅ 修复方法:使用绝对路径调用命令: ```bash /home/xtx/Desktop/freesurfer/bin/mri_convert input.mgz output.nii ``` --- ### **具体操作步骤** 1. **确认命令名称和路径** ```bash # 检查命令是否存在 ls /home/xtx/Desktop/freesurfer/bin/mri_convert ``` 2. **配置环境变量** ```bash # 临时生效(仅当前终端) export FREESURFER_HOME=/home/xtx/Desktop/freesurfer source $FREESURFER_HOME/SetUpFreeSurfer.sh # 永久生效(添加到 ~/.bashrc 文件) echo "export FREESURFER_HOME=/home/xtx/Desktop/freesurfer" >> ~/.bashrc echo "source \$FREESURFER_HOME/SetUpFreeSurfer.sh" >> ~/.bashrc source ~/.bashrc ``` 3. **在脚本中显式指定路径** 修改脚本中的命令调用方式: ```bash # 原错误写法 mri_converter $input $output # 正确写法 /home/xtx/Desktop/freesurfer/bin/mri_convert $input $output ``` --- ### **附加说明** - **FreeSurfer 依赖项**:确保系统已安装 FreeSurfer 的依赖库(如 `tcsh`, `libjpeg` 等)。 - **Windows 用户**:若在 WSL 中运行,需通过 Linux 环境安装 FreeSurfer,而非原生 Windows。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值