# Class for parsing cluster.out.sort # # Written by k-fleak # class ParseClusterOutOrig def initialize(filename) @input = open(filename, "r") @pointData, @pairData, @triData, @tetraData = getClusterData end def getPointData # pointData: key=>Original index, sublattice @pointData end def getPairData # pairData: key=>Original index, distance, subattice, pair-index @pairData end def getTriData # triData: key=>Original index, pair-index, sublattice, tri-index @triData end def getTetraData # tetraData: key=>Original index, tri-index, sublattice @tetraData end def getData return @pointData, @pairData, @triData, @tetraData end private def getClusterData flagArray = [0, 0, 0, 0] pointData = Hash.new pairData = Hash.new triData = Hash.new tetraData = Hash.new @input.each do |lines| case lines when /Point Cluster/ flagArray[0] = 1 when /2 body Cluster/ flagArray[0] = 0 flagArray[1] = 1 when /3 body Cluster/ flagArray[1] = 0 flagArray[2] = 1 when /4 body Cluster/ flagArray[2] = 0 flagArray[3] = 1 end if flagArray[0] == 1 then pointTmp = Array.new unless lines.strip.empty? or /index/ =~ lines or /Cluster/ =~ lines then lineArr = lines.strip.split(/:/) lineArr.size.times do |i| pointTmp.push(lineArr[i].strip.split) end pointTmp[1].flatten! pointData[pointTmp[1]] = pointTmp[0] end end if flagArray[1] == 1 then pairTmp = Array.new unless lines.strip.empty? or /index/ =~ lines or /body/ =~ lines then lineArr = lines.strip.split(/:/) lineArr.size.times do |i| pairTmp.push(lineArr[i].strip.split) end pairTmp[3].flatten! pairData[pairTmp[3]] = pairTmp[0..2] end end if flagArray[2] == 1 then triTmp = Array.new unless lines.strip.empty? or /index/ =~ lines or /body/ =~ lines then lineArr = lines.strip.split(/:/) lineArr.size.times do |i| triTmp.push(lineArr[i].strip.split) end triTmp[3].flatten! triData[triTmp[3]] = triTmp[0..2] end end if flagArray[3] == 1 then tetraTmp = Array.new unless lines.strip.empty? or /index/ =~ lines or /body/ =~ lines then lineArr = lines.strip.split(/:/) lineArr.size.times do |i| tetraTmp.push(lineArr[i].strip.split) end tetraTmp[2].flatten! tetraData[tetraTmp[2]] = tetraTmp[0..1] end end end return pointData, pairData, triData, tetraData end end #parse = ParseClusterOutOrig.new("cluster.out.sort.bulk") #p parse.getTetraData[["34"]] class ParseClusterOutSearch attr_reader :maxClusterNew def initialize(filename) @input = open(filename, "r") @pointData, @pairData, @triData, @tetraData = getClusterData end def getPointData # pointData: key=>sublattice, original index, new index @pointData end def getPairData # pairData: key=>distance, sublattice, pair-index, orig index @pairData end def getTriData @triData end def getTetraData @tetraData end def getData return @pointData, @pairData, @triData, @tetraData end def getIndexRelation # new index, [old index] @indexRelation end private def getClusterData flagArray = [0, 0, 0, 0] pointData = Hash.new pairData = Hash.new triData = Hash.new tetraData = Hash.new @indexRelation = Hash.new @indexRelation[0] = ["0"] newIndex = 1 @input.each do |lines| case lines when /Point Cluster/ flagArray[0] = 1 when /2 body Cluster/ flagArray[0] = 0 flagArray[1] = 1 when /3 body Cluster/ flagArray[1] = 0 flagArray[2] = 1 when /4 body Cluster/ flagArray[2] = 0 flagArray[3] = 1 end if flagArray[0] == 1 then pointTmp = Array.new unless lines.strip.empty? or /index/ =~ lines or /Cluster/ =~ lines then lineArr = lines.strip.split(/:/) lineArr.size.times do |i| pointTmp.push(lineArr[i].strip.split) end pointTmp[0].flatten! pointTmp.push(newIndex) pointData[pointTmp[0]] = pointTmp[1..2] @indexRelation[newIndex] = pointTmp[1] newIndex += 1 end end if flagArray[1] == 1 then pairTmp = Array.new unless lines.strip.empty? or /index/ =~ lines or /body/ =~ lines then lineArr = lines.strip.split(/:/) lineArr.size.times do |i| pairTmp.push(lineArr[i].strip.split) end pairTmp[0].flatten! unless pairData.has_key?(pairTmp[0]) then tmp = Array.new pairData[pairTmp[0]] = tmp end pairTmp.push(newIndex) pairData[pairTmp[0]].push(pairTmp[1..4]) @indexRelation[newIndex] = pairTmp[3] newIndex += 1 end end if flagArray[2] == 1 then triTmp = Array.new unless lines.strip.empty? or /index/ =~ lines or /body/ =~ lines then lineArr = lines.strip.split(/:/) lineArr.size.times do |i| triTmp.push(lineArr[i].strip.split) end triTmp[0].flatten! triTmp.push(newIndex) triData[triTmp[0]] = triTmp[1..4] @indexRelation[newIndex] = triTmp[3] newIndex += 1 end end if flagArray[3] == 1 then tetraTmp = Array.new unless lines.strip.empty? or /index/ =~ lines or /body/ =~ lines then lineArr = lines.strip.split(/:/) lineArr.size.times do |i| tetraTmp.push(lineArr[i].strip.split) end tetraTmp[0].flatten! tetraTmp.push(newIndex) tetraData[tetraTmp[0]] = tetraTmp[1..3] @indexRelation[newIndex] = tetraTmp[2] newIndex += 1 end end end @maxClusterNew = newIndex return pointData, pairData, triData, tetraData end end #parse2 = ParseClusterOutSearch.new("cluster.out.sort.surf") #ir = parse2.getIndexRelation #ir.each do |ir2| # p ir2 #end