Commit d6e87cf0 authored by karius's avatar karius

another day another dolla

parent 6b86917b
This diff is collapsed.
......@@ -106,7 +106,7 @@ struct SMrcHeader {
int extra2[42];
//
// ('origin', [ # Origin of image
// ('x', 'f4'),
// ('x', 'f4'),float
// ('y', 'f4'),
// ('z', 'f4')
// ]),
......@@ -135,10 +135,16 @@ public:
SMrcHeader header;
std::string mrc_file_name;
std::vector<float> data;
float * pdata;
virtual ~CMrcReader();
void readHeader(std::string mrc_file_name);
void printHeader(void);
void printHeader(std::string mrc_file_name);
void readData(void);
void purgeData(void);
void dataHostToDevice(std::string mrc_file_name,float * deviceData);
void oink(std::string to);
private:
bool x_HeaderRead = false;
};
#endif /* CMRCREADER_H_ */
......@@ -177,7 +183,7 @@ public:
// ('Y-Stage', 'f8'),
// ('Z-Stage', 'f8'),
// ('Tilt axis angle', 'f8'),
// ('Dual axis rotation', 'f8'),
// ('Dual axis rotation', 'f8'),float
// ('Pixel size X', 'f8'),
// ('Pixel size Y', 'f8'),
// ('Unused range', 'S48'),
......
No preview for this file type
No preview for this file type
#include <stdio.h>
#include <CudaTest.h>
// 2D float texture
texture<float, cudaTextureType2D, cudaReadModeElementType> texRef;
texture<float, cudaTextureType1D, cudaReadModeElementType> texRef;
const float feat_R_to_sigma = 0.42466090014400953;
const float inv_sqrt_2_pi = 0.3989422804014327;
__constant__ float DSHIFT[sizeof(float) * 3];
__constant__ float DSIZE[sizeof(int) * 3];
// Simple transformation kernel
__global__ void transformKernel(float* output, int width, int height,
float theta) {
__global__ void transformKernel(float* output, int total, int per_thread,
int per_block) {
// Calculate normalized texture coordinates
unsigned int x = blockIdx.x * blockDim.x + threadIdx.x;
unsigned int y = blockIdx.y * blockDim.y + threadIdx.y;
//blockIdx.x signifies z dimension
//threadIdx.x signifies y dimension
// unsigned int x = blockIdx.x * blockDim.x + threadIdx.x;
// unsigned int y = blockIdx.y * blockDim.y + threadIdx.y;
//
// float u = x / (float) width;
// float v = y / (float) height;
//
int z_index = threadIdx.x / 16;
// int i = per_thread*threadIdx.x;
for (int i = per_thread * threadIdx.x; i < per_thread * (threadIdx.x + 1);
i++) {
int y_index = i / 256;
int x_index = i % 256;
output[i] = (float) x_index + y_index + z_index;
}
// // Transform coordinates
// u -= 0.5f;
// v -= 0.5f;
// float tu = u * cosf(theta) - v * sinf(theta) + 0.5f;
// float tv = v * cosf(theta) + u * sinf(theta) + 0.5f;
//
// // Read from texture and write to global memory
// output[y * width + x] = tex2D(texRef, tu, tv);
}
float u = x / (float) width;
float v = y / (float) height;
size_t getSizeGaussian(float feat_R, float data_R, int cutoff_sigma) {
// 1. convert feat_R to sigma
// 2. calculate 3-sigma-distance
// 3. calculate arraysize
// Transform coordinates
u -= 0.5f;
v -= 0.5f;
float tu = u * cosf(theta) - v * sinf(theta) + 0.5f;
float tv = v * cosf(theta) + u * sinf(theta) + 0.5f;
size_t ret = 0;
float cutoff_sigma_dist = cutoff_sigma * feat_R_to_sigma * feat_R;
ret = (size_t) cutoff_sigma_dist / data_R;
return ret;
}
// Read from texture and write to global memory
output[y * width + x] = tex2D(texRef, tu, tv);
float * getRotationMatrix(float * q) {
float * matrix;
matrix = (float *) malloc(9 * sizeof(float));
// 0 1 2
// 3 4 5 --> 0 1 2 3 4 5 6 7 8
// 6 7 8
matrix[0] = 1 - 2 * q[2] * q[2] - 2 * q[3] * q[3];
matrix[1] = 2 * q[1] * q[2] - 2 * q[0] * q[3];
matrix[2] = 2 * q[1] * q[3] + 2 * q[0] * q[2];
matrix[3] = 2 * q[2] * q[1] + 2 * q[0] * q[3];
matrix[4] = 1 - 2 * q[3] * q[3] - 2 * q[1] * q[1];
matrix[5] = 2 * q[2] * q[3] - 2 * q[0] * q[1];
matrix[6] = 2 * q[3] * q[1] - 2 * q[0] * q[2];
matrix[7] = 2 * q[3] * q[2] + 2 * q[0] * q[1];
matrix[8] = 1 - 2 * q[1] * q[1] - 2 * q[2] * q[2];
return matrix;
}
// Host code
int main() {
int width = 3, height = 3;
float * getRotationMatrices(std::string quat_file) {
float * matrices;
std::ifstream fs;
fs.open(quat_file, std::fstream::in);
std::string line = "";
bool found_start = false;
std::vector<std::string> strs;
size_t n_rotations;
while (!fs.eof()) {
std::getline(fs, line);
// std::cout << line << std::endl;
if (line.find("format") != std::string::npos) {
//skip parameter lines
std::getline(fs, line);
std::getline(fs, line);
boost::split(strs, line, boost::is_any_of(" \t"),
boost::token_compress_on);
std::cout<<strs[0]<<std::endl;
n_rotations = std::stoi(strs[0]);
found_start = true;
break;
}
}
matrices = (float *)malloc(n_rotations*9*sizeof(float));
float * matrix = (float *)malloc(9*sizeof(float));
float * quat = (float*) malloc(4 * sizeof(float));
if (found_start) {
int rot_offset = 0;
while (!fs.eof()) {
std::getline(fs, line);
boost::trim(line);
if (line.size() != 0) {
boost::split(strs, line, boost::is_any_of(" \t"),
boost::token_compress_on);
if (strs.size() >= 4) {
for (int i = 0; i < 4; i++) {
quat[i] = std::stof(strs[i]);
}
}
matrix = getRotationMatrix(quat);
std::cout << quat[0] << "|" << quat[1] << "|" << quat[2] << "|"
<< quat[3] << std::endl;
}
for (int i=0;i<9;i++){
matrices[rot_offset+i] = matrix[i];
}
rot_offset += 9;
}
}
return matrices;
}
float h_data[3][3];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
h_data[i][j] = i * j;
void createGaussian(float *gaussian, float feat_R, int cutoff_sigma, int charge,
int array_size) {
// 5. fill array acccording to Topf(2008)
// phi(d) = Z/(sqrt(2*pi)*sigma)*exp(-1/(2*sigma**2)*d**2)
// phi(d) = f1*exp(f2*d**2)
float sigma = feat_R_to_sigma * feat_R;
float cutoff_sigma_dist = cutoff_sigma * sigma;
float f1 = charge * inv_sqrt_2_pi * sigma;
float f2 = (-0.5f) / (sigma * sigma);
float step_size = cutoff_sigma_dist / array_size;
for (int i = 0; i < array_size; i++) {
gaussian[i] = f1 * expf(f2 * (i * step_size) * (i * step_size));
}
}
int size = width * height * sizeof(float);
// Host code
int main() {
CMrcReader mrc;
mrc.oink("Conor");
std::string fname = "test/TauA_3.47A_map.mrc";
mrc.printHeader(fname);
float * deviceData;
// cudaMalloc((void**) &data,
// mrc.dataHostToDevice(fname, deviceData);
getRotationMatrices("./cffk-orientation-dc8bb42/data/c48u1.quat");
// while (true) {
// }
// int width = 3, height = 3;
// int N = 256;
//
// int mx = 300;
// float xlen = 312.3f;
// float host_DSHIFT[sizeof(float) * 3];
// host_DSHIFT[0] = xlen / mx;
// host_DSHIFT[1] = xlen / mx;
// host_DSHIFT[2] = xlen / mx;
//
// float host_DSIZE[sizeof(int) * 3];
// host_DSIZE[0] = N;
// host_DSIZE[1] = N;
// host_DSIZE[2] = N;
// cudaMemcpyToSymbol(DSIZE, host_DSIZE, sizeof(int) * 3);
//TODO:sanity check on user inputs
// float data_R = 1.041f;
// float feat_R = 1.5f;
// int cutoff_sigma = 3;
// int charge = 6; //carbon
// size_t array_size = getSizeGaussian(feat_R, data_R, cutoff_sigma);
//TODO: sanity check on size
// float* gaussian;
// gaussian = (float *) malloc(array_size * sizeof(float));
// createGaussian(gaussian, feat_R, cutoff_sigma, charge, array_size);
// float h_data[3][3];
// for (int i = 0; i < 3; i++)
// for (int j = 0; j < 3; j++)
// h_data[i][j] = i * j;
// int size = width * height * sizeof(float);
// Allocate CUDA array in device memory
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0,
cudaChannelFormatKindFloat);
cudaArray* cuArray;
cudaMallocArray(&cuArray, &channelDesc, width, height);
// cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0,
// cudaChannelFormatKindFloat);
// cudaArray* cuArray;
// cudaMallocArray(&cuArray, &channelDesc, array_size);
// Copy to device memory some data located at address h_data
// in host memory
cudaMemcpyToArray(cuArray, 0, 0, h_data, size, cudaMemcpyHostToDevice);
// cudaMemcpyToArray(cuArray, 0, 0, gaussian, array_size,
// cudaMemcpyHostToDevice);
// Set texture reference parameters
texRef.addressMode[0] = cudaAddressModeWrap;
texRef.addressMode[1] = cudaAddressModeWrap;
texRef.filterMode = cudaFilterModeLinear;
texRef.normalized = true;
// Bind the array to the texture reference
cudaBindTextureToArray(texRef, cuArray, channelDesc);
// Allocate result of transformation in device memory
float* output;
cudaMalloc(&output, width * height * sizeof(float));
// Invoke kernel
dim3 dimBlock(16, 16);
dim3 dimGrid((width + dimBlock.x - 1) / dimBlock.x,
(height + dimBlock.y - 1) / dimBlock.y);
transformKernel<<<dimGrid, dimBlock>>>(output, width, height,
90);
printf ("\n After operation \n ");
for ( int i =0 ; i<3 ; i++ )
{
for ( int j = 0 ; j<3; j++ )
printf ("%f ", h_data [i][j] );
printf ("\n");
}
// Free device memory
cudaFreeArray(cuArray);
cudaFree(output);
// texRef.addressMode[0] = cudaAddressModeWrap;
// texRef.addressMode[1] = cudaAddressModeWrap;
// texRef.filterMode = cudaFilterModeLinear;
// texRef.normalized = true;
//
// // Bind the array to the texture reference
// cudaBindTextureToArray(texRef, cuArray, channelDesc);
//
// float* host_output;
// host_output = (float *) malloc(N*N*N*sizeof(float));
// float* output;
// cudaMalloc(&output, N * N * N * sizeof(float));
//
// // Allocate result of transformation in device memory
// float* output;
// cudaMalloc(&output, width * height * sizeof(float));
//
// // Invoke kernel
// int total = N*N*N;
// int per_thread = N*16;
// int per_block = N*N*16;
// printf("Up to here\n");
// transformKernel<<<16, 256>>>(output,total,per_thread,per_block);
// printf("Even here\n");
//
// printf ("\n After operation \n ");
// for ( int i =0 ; i<3 ; i++ )
// {
// for ( int j = 0 ; j<3; j++ )
// printf ("%f ", h_data [i][j] );
//
// printf ("\n");
// }
//
// // Free device memory
// cudaFreeArray(cuArray);
// cudaMemcpy(host_output,output,total*sizeof(float),cudaMemcpyDeviceToHost);
// printf("And here\n");
// printf ("output[0]:%f\n",host_output[257]);
// printf("But not here\n");
// cudaFree(output);
// free(host_output);
return 0;
}
......@@ -8,6 +8,13 @@
#ifndef CUDATEST_H_
#define CUDATEST_H_
#include <CMrcReader.h>
#include <cuda_runtime.h>
#include <fstream>
#include <string>
#include <iostream>
#include <boost/algorithm/string.hpp>
class CudaTest {
public:
CudaTest();
......
File deleted
CC=nvcc
CFLAGS=-I.
CC=gcc
NVCC=nvcc
CFLAGS=-I. -I./cuda_util_include
LFLAGS=-L.
all: CudaTest.cu CMrcReader.o
$(NVCC) $(LFLAGS) $(CFLAGS) -o CudaTest CudaTest.cu CMrcReader.o
CMrcReader.o: CMrcReader.cpp
$(NVCC) -c -o $@ $< $(CFLAGS)
all: CudaTest.cu
$(CC) -o CudaTest CudaTest.cu
\ No newline at end of file
......@@ -11,6 +11,7 @@ void ProjectManager::createIMPTopologyAlternatives(
boost::filesystem::path out_dir, std::string prefix) {
std::list<std::string> pdb_config_ids =
x_GeneratePbdAlternativeConfigurations();
std::cout << pdb_config_ids.size() << std::endl;
int c = 0;
boost::filesystem::path filepath;
if (pdb_config_ids.size() != 0) {
......@@ -154,7 +155,7 @@ ProjectManager::ProjectManager(const boost::filesystem::path& source) :
m_PdbIt = m_PdbList.begin();
mfsa_list = ProjectManager::GET_FILE_LIST(source, FSA_EXTENSION);
mfsa_it = mfsa_list.begin();
//TODO: add option recognitation for diverting fasta names
//TODO: add option recognition for diverting fasta names
while (mfsa_it != mfsa_list.end()) {
if (mfsa_it->filename().string() == SEQUENCE_FASTA_FILE_NAME) {
m_base_seqs = *mfsa_it;
......
No preview for this file type
File deleted
......@@ -206,9 +206,10 @@ int CBlastDemoApplication::Run(void) {
// xlr.addXlinkFile(p);
// xlr.addXlinkFile(p2);
// xlr.showSeqEntryRegister();
// ProjectManager pm(
// "/home/kkarius/git/PFCmodeling/topological_modeling/data/");
// pm.alignPdbs();
ProjectManager pm(
"/home/kkarius/git/PFCmodeling/topological_modeling/data/");
pm.alignPdbs();
pm.createIMPTopologyFile("chunky","/home/kkarius/topology.txt");
// pm.addManualPdbLocation("lcl|NHistagPaf1w",
// boost::filesystem::path(
// "/home/kkarius/git/PFCmodeling/topological_modeling/data/pdb/Paf1_Leo1.6gmh.pdb"),"C",371,492);
......@@ -224,11 +225,11 @@ int CBlastDemoApplication::Run(void) {
// "Ctr9_Cdc73_Paf1_model_on6af0.autoSwissModel.half2.pdb" } });
// pm.addAlternatives( { { "Paf1_Leo1.6gmh.pdb" }, {
// "Paf1_Leo1.autoSwissModel_on4m6t.pdb" } });
CMrcReader mrcreader;
mrcreader.readHeader("/data/eclipse-workspace/fitter/test/TauA_3.47A_map.mrc");
mrcreader.printHeader();
mrcreader.readData();
// pm.createIMPTopologyAlternatives(boost::filesystem::path("/home/kkarius/git/PFCmodeling/topological_modeling/topology_files/test/"),"all_combis_22.05.19");
// CMrcReader mrcreader;
// mrcreader.readHeader("/data/eclipse-workspace/fitter/test/TauA_3.47A_map.mrc");
// mrcreader.printHeader();
// mrcreader.readData();
// pm.createIMPTopologyAlternatives(boost::filesystem::path("/home/kkarius/git/PFCmodeling/topological_modeling/topology_files/"),"all_combis_24.07.19");
// pm.printPdbLocations();
// pm.printPdbConfiguration("Chd1_conformation2_3mwy.pdb_Ctr9.on6gmh_P_autoSwissModel.pdb_Paf1_Leo1.6gmh.pdb_");
// pm.addXlinkfile("/home/kkarius/git/PFCmodeling/topological_modeling/data/xls/PFC_all_merged.renumbered.csv");
......
No preview for this file type
This diff is collapsed.
The MIT License (MIT)
Copyright (c) 2006-2015, Charles Karney, SRI International
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy,
modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
This diff is collapsed.
This diff is collapsed.
# Orientation set c48n309, number = 7416, radius = 9.72 degrees
# For more information, See https://github.com/cffk/orientation
format grid
0.15167 1.86 7416 309 18 9.72 1.91567
0 0 0 1.306034 9.71 1
1 1 1 1.299137 9.72 8
2 0 0 1.295494 9.71 6
2 2 0 1.286298 9.71 12
2 2 2 1.278379 9.69 8
3 1 1 1.275516 9.71 24
3 3 1 1.257225 9.70 24
3 3 3 1.243716 9.63 8
4 0 0 1.207999 9.71 6
4 2 0 1.146278 9.70 24
4 2 2 1.134520 9.69 24
4 4 0 0.942946 9.68 12
4 4 2 1.094391 9.65 24
4 4 4 0.657023 9.56 8
5 1 1 0.763803 9.71 24
5 3 1 0.713317 9.67 48
5 3 3 0.746191 9.61 24
5 5 1 0.742777 9.62 24
This diff is collapsed.
# Orientation set c48n527, number = 12648, radius = 8.17 degrees
# For more information, See https://github.com/cffk/orientation
format grid
0.12599 1.86 12648 527 28 8.17 1.94334
0 0 0 1.278280 8.07 1
1 1 1 1.273783 8.07 8
2 0 0 1.271631 8.07 6
2 2 0 1.265621 8.07 12
2 2 2 1.260228 8.05 8
3 1 1 1.259201 8.07 24
3 3 1 1.247166 8.06 24
3 3 3 1.237488 8.02 8
4 0 0 1.244238 8.07 6
4 2 0 1.240146 8.06 24
4 2 2 1.236599 8.06 24
4 4 0 1.220487 8.05 12
4 4 2 1.218575 8.04 24
4 4 4 1.205529 7.98 8
5 1 1 1.130036 8.07 24
5 3 1 1.156550 8.17 48
5 3 3 1.085679 8.03 24
5 5 1 1.028885 8.03 24
5 5 3 1.035980 8.13 24
5 5 5 0.524725 8.13 8
6 0 0 0.646901 8.07 6
6 2 0 0.747815 8.06 24
6 2 2 0.763884 8.17 24
6 4 0 0.765459 8.03 24
6 4 2 0.715898 8.17 48
6 4 4 0.699244 7.96 24
6 6 0 0.452039 8.12 12
6 6 2 0.607823 8.13 24
This diff is collapsed.
This diff is collapsed.
# Orientation set c48n9, number = 216, radius = 36.47 degrees
# For more information, See https://github.com/cffk/orientation
format grid
0.26091 7.00 216 9 2 36.47 2.89689
0 0 0 0.303584 24.84 1
1 1 1 1.087052 36.47 8
This diff is collapsed.
# Orientation set c48u1, number = 24, radius = 62.80 degrees
# For more information, See https://github.com/cffk/orientation
format euler
24 62.80 1.57514
-0.000000000 0.000000000 0.000000000 1.000000
-3.141592654 3.141592654 0.000000000 1.000000
-0.000000000 3.141592654 0.000000000 1.000000
-3.141592654 0.000000000 0.000000000 1.000000
0.000000000 1.570796327 1.570796327 1.000000
-1.570796327 1.570796327 0.000000000 1.000000
-1.570796327 1.570796327 3.141592654 1.000000
3.141592654 1.570796327 1.570796327 1.000000
1.570796327 1.570796327 0.000000000 1.000000
0.000000000 1.570796327 -1.570796327 1.000000
3.141592654 1.570796327 -1.570796327 1.000000
1.570796327 1.570796327 3.141592654 1.000000
-1.570796327 1.570796327 1.570796327 1.000000
1.570796327 1.570796327 -1.570796327 1.000000
0.000000000 1.570796327 0.000000000 1.000000
-3.141592654 1.570796327 3.141592654 1.000000
1.570796327 0.000000000 0.000000000 1.000000
-1.570796327 0.000000000 0.000000000 1.000000
-1.570796327 3.141592654 0.000000000 1.000000
1.570796327 3.141592654 0.000000000 1.000000
0.000000000 1.570796327 3.141592654 1.000000
-3.141592654 1.570796327 0.000000000 1.000000
1.570796327 1.570796327 1.570796327 1.000000
-1.570796327 1.570796327 -1.570796327 1.000000
# Orientation set c48u1, number = 24, radius = 62.80 degrees
# For more information, See https://github.com/cffk/orientation
format grid
0.70000 0.00 24 1 1 62.80 1.57514
0 0 0 1.000000 62.80 1
# Orientation setKAI c48u1, number = 24, radius = 62.80 degrees
# For more information, See https://github.com/cffk/orientation
format quaternion
24 62.80 1.57514
1.000000000 0.000000000 0.000000000 0.000000000 1.000000
0.000000000 1.000000000 0.000000000 0.000000000 1.000000
0.000000000 0.000000000 1.000000000 0.000000000 1.000000
0.000000000 0.000000000 0.000000000 1.000000000 1.000000
0.500000000 0.500000000 0.500000000 0.500000000 1.000000
0.500000000 0.500000000 0.500000000 -0.500000000 1.000000
0.500000000 0.500000000 -0.500000000 0.500000000 1.000000
0.500000000 0.500000000 -0.500000000 -0.500000000 1.000000
0.500000000 -0.500000000 0.500000000 0.500000000 1.000000
0.500000000 -0.500000000 0.500000000 -0.500000000 1.000000
0.500000000 -0.500000000 -0.500000000 0.500000000 1.000000
0.500000000 -0.500000000 -0.500000000 -0.500000000 1.000000
0.707106781 0.707106781 0.000000000 0.000000000 1.000000
0.707106781 -0.707106781 0.000000000 0.000000000 1.000000
0.707106781 0.000000000 0.707106781 0.000000000 1.000000
0.707106781 0.000000000 -0.707106781 0.000000000 1.000000
0.707106781 0.000000000 0.000000000 0.707106781 1.000000
0.707106781 0.000000000 0.000000000 -0.707106781 1.000000
0.000000000 0.707106781 0.707106781 0.000000000 1.000000
0.000000000 0.707106781 -0.707106781 0.000000000 1.000000
0.000000000 0.707106781 0.000000000 0.707106781 1.000000
0.000000000 0.707106781 0.000000000 -0.707106781 1.000000
0.000000000 0.000000000 0.707106781 0.707106781 1.000000
0.000000000 0.000000000 0.707106781 -0.707106781 1.000000
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
# Orientation set c48u1153, number = 27672, radius = 6.60 degrees
# For more information, See https://github.com/cffk/orientation
format grid
0.10330 0.00 27672 1153 50 6.60 2.23735
0 0 0 1.530484 6.59 1
1 1 1 1.506528 6.59 8
2 0 0 1.498668 6.59 6
2 2 0 1.467830 6.57 12
2 2 2 1.437930 6.53 8
3 1 1 1.445322 6.55 24
3 3 1 1.387760 6.49 24
3 3 3 1.333556 6.39 8
4 0 0 1.408946 6.50 6
4 2 0 1.380813 6.48 24
4 2 2 1.353511 6.43 24
4 4 0 1.301287 6.38 12
4 4 2 1.276288 6.34 24
4 4 4 1.205466 6.21 8
5 1 1 1.333581 6.41 24
5 3 1 1.282482 6.35 48
5 3 3 1.234251 6.27 24
5 5 1 1.188711 6.23 24
5 5 3 1.145605 6.14 24