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
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]
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]
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)
def __init__(self): self.dc = DistanceCalc()