Пример #1
0
class Gait(FeatureExtractorAbstract):
    def __init__(self):
        self.dc = DistanceCalc()

    def getCSVheader(self):
        return ["gaitPeriodX", "gaitErrorX", "gaitPeriodY", "gaitErrorY", "gaitPeriodZ", "gaitErrorZ"]

    def extract(self, experiment, type, indiv):
        filepath = experiment[2] + os.path.sep + PathConfig.traceFolderNormal + os.path.sep + indiv[0] + ".trace"

        if not os.path.isfile(filepath):
            filepath = experiment[2] + os.path.sep + PathConfig.traceFoldersAlt[type] + os.path.sep + indiv[
                0] + ".trace"
            if not os.path.isfile(filepath):
                return ['NA'] * 3

        with open(filepath) as fh:
            xs = []
            ys = []
            zs = []
            for line in fh:
                linesplit = line.split("\t")
                if not self.dc.isValidLine(linesplit):
                    linesplit = line.split(" ")
                    if not self.dc.isValidLine(linesplit):
                        continue

                xs.append(linesplit[-3])
                ys.append(linesplit[-2])
                zs.append(linesplit[-1])
	
	xs = map(float,xs)
	ys = map(float,ys)
	zs = map(float,zs)
	xPeriod, xError = self._getPeriod(xs)
        yPeriod, yError = self._getPeriod(ys)
	zPeriod, zError = self._getPeriod(zs)
	return xPeriod, xError, yPeriod, yError, zPeriod, zError

    @staticmethod
    def _getPeriod(signal):
        if len(signal) == 0:
            return 'NA'
        signal = np.array(signal)
        fft = np.fft.rfft(signal).real
        fft = fft[:len(fft) / 2 + 1]
        fft[1:] = fft[1:] / (len(signal)/2)
        fft[0] = fft[0]/len(signal)

        period = np.argmax(fft[1:]) + 1
        period_value = fft[1:].max()
      
        linspace = np.linspace(0,len(signal), len(signal))
        mse = np.average(signal - (period_value * np.sin(period*linspace+np.average(signal)))**2)
        return period, mse
Пример #2
0
    def extract(self, experiment, type, indiv):
        errorReturnVal = ['NA'] * 2
        filepath = experiment[2] + os.path.sep + PathConfig.traceFolderNormal + os.path.sep + indiv[0] + ".trace"
        dc = DistanceCalc()
        if not os.path.isfile(filepath):
            filepath = experiment[2] + os.path.sep + PathConfig.traceFoldersAlt[type] + os.path.sep + indiv[
                0] + ".trace"
            if not os.path.isfile(filepath):
                return errorReturnVal
        with open(filepath, 'r') as inputFile:
            traceLines = []
            lines = []
            for line in inputFile:
                lines.append(line)
                if len(lines) == 110:
                    break

            if len(lines) < 20:
                return errorReturnVal

            for line in lines[-10:]:
                lineSplit = line.split("\t")
                if not dc.isValidLine(lineSplit):
                    lineSplit = line.split(" ")
                    if not dc.isValidLine(lineSplit):
                        continue
                traceLines.append(
                    (float(lineSplit[2]), float(lineSplit[2]))
                )
        if len(traceLines) < 6:
            return errorReturnVal

        self._setPoints(traceLines[0], traceLines[3], traceLines[5])
        self._getCenter()
        self._getRadius()
        self._getCircumference()
        dist = dc.distanceStep(filepath, "euclidean")
        percentCircle = dist / self.circumference

        return [self.radius, percentCircle]
Пример #3
0
    def extract(self, experiment, type, indiv):
        filepath = experiment[2] + os.path.sep + PathConfig.traceFolderNormal + os.path.sep + indiv[0] + ".trace"
        dc = DistanceCalc()
        if not os.path.isfile(filepath):
            filepath = (
                experiment[2] + os.path.sep + PathConfig.traceFoldersAlt[type] + os.path.sep + indiv[0] + ".trace"
            )
            if not os.path.isfile(filepath):
                return ["NA"]
        with open(filepath, "r") as inputFile:
            monotonyUp = 0
            monotonyDown = 0
            monotonyLeft = 0
            monotonyRight = 0

            firstLine = True
            xy = (0.0, 0.0)
            for line in inputFile:
                lineSplit = line.split("\t")
                if not dc.isValidLine(lineSplit):
                    lineSplit = line.split(" ")
                    if not dc.isValidLine(lineSplit):
                        continue
                if firstLine:
                    firstLine = False
                    xy = (lineSplit[2], lineSplit[3])
                else:
                    xyNew = (lineSplit[2], lineSplit[3])
                    if xyNew[1] > xy[1]:
                        monotonyUp += 1
                    if xyNew[1] < xy[1]:
                        monotonyDown += 1
                    if xyNew[0] > xy[0]:
                        monotonyRight += 1
                    if xyNew[0] < xy[0]:
                        monotonyLeft += 1
                    xy = xyNew

        return [monotonyRight - monotonyLeft, monotonyUp - monotonyDown]
Пример #4
0
    def dataCollector(self):
        listing = glob.glob(self.pattern)
        td = TraceDistance()
        dc = DistanceCalc()
        with open(self.outputFile, "w") as csvfile:
            headersWritten = False
            print listing  # Testing
            for nestFile in listing:
                print "Experiment folder: " + nestFile  # Testing
                expFolder = nestFile[-2:]
                experimentNumber = str(expFolder)
                popListing = glob.glob(nestFile + "/population/*.vxa")
                for path in popListing:
                    indNumber = path[27:-8]
                    print "Population path: " + path  # Testing
                    print "Ind. ID: " + indNumber  # Testing
                    backupBasePath = nestFile + "/population_{condition}/" + indNumber + "_vox.vxa"
                    backup_path = os.path.abspath(backupBasePath.format(condition="beforePL"))
                    if not os.path.isfile(backup_path):
                        backup_path = os.path.abspath(backupBasePath.format(condition="MUT"))
                        if not os.path.isfile(backup_path):
                            backup_path = False
                    print "Backups path: " + backup_path  # Testing
                    voxProbability, voxLifetime, voxCounts = self.voxCounter(experimentNumber, path, indNumber)
                    voxProb_orig, voxProbLife_orig, voxCounts_orig = self.voxCounter(
                        experimentNumber, backup_path, indNumber
                    )

                    traceFilename = os.path.abspath(nestFile + "/traces_afterPP/" + indNumber + ".trace")
                    mutatedBasePath = nestFile + "/traces_{condition}/" + indNumber + ".trace"
                    NOMUT_traceFilename = os.path.abspath(mutatedBasePath.format(condition="MUT"))
                    variant = "mut"

                    if not os.path.isfile(NOMUT_traceFilename):
                        NOMUT_traceFilename = os.path.abspath(mutatedBasePath.format(condition="NOMUT"))
                        variant = "nomut"
                        if not os.path.isfile(NOMUT_traceFilename):
                            NOMUT_traceFilename = False

                    if variant == "nomut":
                        fieldnames = [
                            "Ind_ID",
                            "birthtime",
                            "Exp_Num",
                            "probability",
                            "euclideanStep",
                            "manhattanStep",
                            "euclideanTotal",
                            "manhattanTotal",
                            "lifetime",
                            "size",
                            "totalMuscles",
                            "totalFat",
                            "totalBone",
                            "diseasedMuscle",
                            "diseasedFat",
                            "diseasedBone",
                            "diseasedEuclideanStep",
                            "diseasedManhattanStep",
                            "diseasedEuclideanTotal",
                            "diseasedManhattanTotal",
                        ]
                    else:
                        fieldnames = [
                            "Ind_ID",
                            "birthtime",
                            "Exp_Num",
                            "probability",
                            "euclideanStep",
                            "manhattanStep",
                            "euclideanTotal",
                            "manhattanTotal",
                            "lifetime",
                            "size",
                            "totalMuscles",
                            "totalFat",
                            "totalBone",
                            "originalMuscle",
                            "originalFat",
                            "originalBone",
                            "originalEuclideanStep",
                            "originalManhattanStep",
                            "originalEuclideanTotal",
                            "originalManhattanTotal",
                        ]

                    if not headersWritten:
                        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                        writer.writeheader()
                        headersWritten = True

                    if os.path.isfile(traceFilename):
                        distances = td.calcDistance(traceFilename)
                        birthtime = dc.getBirthTime(traceFilename)
                        if not birthtime:
                            birthtime = "NA"
                        print distances  # Testing
                        print "Born at: " + str(birthtime)
                    else:
                        distances = ["NA", "NA", "NA", "NA", "NA"]  # Batman
                        birthtime = ["NA"]
                        print indNumber + " trace file missing in /traces_afterPP/ of experiment " + experimentNumber

                    if NOMUT_traceFilename:
                        NOMUT_distances = td.calcDistance(NOMUT_traceFilename)
                        print NOMUT_distances
                    else:
                        NOMUT_distances = ["NA", "NA", "NA", "NA", "NA"]  # Batman
                        print indNumber + " trace file missing in /traces_NOMUT/ of experiment " + experimentNumber

                    if variant == "mut":
                        columnNames = {
                            "Ind_ID": indNumber,
                            "birthtime": birthtime,
                            "Exp_Num": experimentNumber,
                            "probability": voxProbability,
                            "euclideanStep": distances[0],
                            "manhattanStep": distances[1],
                            "euclideanTotal": distances[2],
                            "manhattanTotal": distances[3],
                            "lifetime": voxLifetime,
                            "size": voxCounts[4],
                            "totalMuscles": voxCounts[3],
                            "totalFat": voxCounts[1],
                            "totalBone": voxCounts[2],
                            "originalMuscle": voxCounts_orig[3],
                            "originalFat": voxCounts_orig[1],
                            "originalBone": voxCounts_orig[2],
                            "originalEuclideanStep": NOMUT_distances[0],
                            "originalManhattanStep": NOMUT_distances[1],
                            "originalEuclideanTotal": NOMUT_distances[2],
                            "originalManhattanTotal": NOMUT_distances[3],
                        }
                    elif variant == "nomut":
                        columnNames = {
                            "Ind_ID": indNumber,
                            "birthtime": birthtime,
                            "Exp_Num": experimentNumber,
                            "probability": voxProbability,
                            "euclideanStep": distances[0],
                            "manhattanStep": distances[1],
                            "euclideanTotal": distances[2],
                            "manhattanTotal": distances[3],
                            "lifetime": voxLifetime,
                            "size": voxCounts[4],
                            "totalMuscles": voxCounts[3],
                            "totalFat": voxCounts[1],
                            "totalBone": voxCounts[2],
                            "diseasedMuscle": voxCounts_orig[3],
                            "diseasedFat": voxCounts_orig[1],
                            "diseasedBone": voxCounts_orig[2],
                            "diseasedEuclideanStep": NOMUT_distances[0],
                            "diseasedManhattanStep": NOMUT_distances[1],
                            "diseasedEuclideanTotal": NOMUT_distances[2],
                            "diseasedManhattanTotal": NOMUT_distances[3],
                        }
                    else:
                        print "File reading (mut/nomut) error!"
                        break
                    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                    writer.writerow(columnNames)
Пример #5
0
 def __init__(self):
     self.dc = DistanceCalc()