--- a/IO.cpp
+++ b/IO.cpp
@@ -227,6 +227,30 @@
          return true;
     }
     return false;
+}
+bool IO::getRationalNumber(float n, CString &rational_number)
+{
+	rational_number = "";
+	//get sign
+	if((!is_equal(n, 0, 0.001)) && (n < 0)) rational_number = "-";
+
+	//test 1,0,  1/2, 1/3, 2/3, 1/4, 2/4, 3/4, 1/6, 2/6, 3/6, 4/6, 5/6
+	if(is_equal(n, 1, 0.001)) rational_number += "1";
+	if(is_equal(n, 0, 0.001)) rational_number += "0";
+	if(is_equal(n, 0.5, 0.001)) rational_number += "1/2";
+	if(is_equal(n, 1.0/3.0, 0.001)) rational_number += "1/3";
+	if(is_equal(n, 2.0/3.0, 0.001)) rational_number += "2/3";
+	if(is_equal(n, 1.0/4.0, 0.001)) rational_number += "1/4";
+	if(is_equal(n, 2.0/4.0, 0.001)) rational_number += "2/4";
+	if(is_equal(n, 3.0/4.0, 0.001)) rational_number += "3/4";
+	if(is_equal(n, 1.0/6.0, 0.001)) rational_number += "1/6";
+	if(is_equal(n, 2.0/6.0, 0.001)) rational_number += "2/6";
+	if(is_equal(n, 3.0/6.0, 0.001)) rational_number += "3/6";
+	if(is_equal(n, 4.0/6.0, 0.001)) rational_number += "4/6";
+	if(is_equal(n, 5.0/6.0, 0.001)) rational_number += "5/6";
+
+	if((rational_number.IsEmpty()) || (rational_number.Compare("-")!=0)) return false;
+	else return true;
 }
 bool IO::ReadFouFile(CString filename, UnitCell *pUnit, VoxelMap *pMap)
 {
@@ -2445,6 +2469,34 @@
     ar.Close();
 	f.Close();
 }
+bool IO::SaveCif(CString filename, UnitCell *pUnit, std::vector<Atom> &peaks)
+{
+	if(pUnit==0) return;
+
+	char szBuffer[250];
+	CFile f( filename, CFile::modeCreate | CFile::modeWrite);
+	CArchive ar(&f,CArchive::store);
+	CString tmp;
+	tmp =  "#######################################################################\n";
+	tmp += "#\n";
+	tmp += "#                 This file was created by MCE\n";
+	tmp += "#\n";
+	tmp += "#######################################################################\n\n";
+	ar.WriteString(tmp);
+	ar.WriteString("data_I\n");
+	ar.WriteString("_symmetry_space_group_name_H-M   ");
+	ar.WriteString(pUnit->getSpaceGroup()+"\n");
+	//ar.WriteString("\n");
+
+	for (int i=0;i<peaks.size();i++) {  
+        if(!peaks[i].visible) continue;
+        sprintf(szBuffer,"Q%d        1  1     1.000000 %.6f %.6f %.6f\n 0.040000 0.000000 0.000000 0.000000 0.000000 0.000000      0000000000\n", i, peaks[i].X, peaks[i].Y, peaks[i].Z);        
+		ar.WriteString(szBuffer);
+	}	
+    ar.Close();
+	f.Close();
+    return true;
+}
 bool IO::SavePeaks_m40(CString filename, std::vector<Atom> peaks)
 {
     char szBuffer[250];