(********************************************************************* Export.m Functions for storing simulated cross data in files compatible with Map Manager XP or Map Manager QT. \[Copyright] copyright Kenneth F. Manly, 1998,1999 Package design adapted from Roman E. Maeder: Programming in Mathematica, Second Edition, Addison-Wesley, 1991. *********************************************************************) (*:Title: Export *) (*:Author: Kenneth F. Manly*) (*:Copyright: \[Copyright] copyright Kenneth F. Manly, 1998 *) (*:Package Version: 2.2 *) (*:Mathematica Version: 3.0 *) (*:Summary: Functions for storing simulated genetic cross data in files compatible with Mapmaker, Map Manager XP or Map Manager QT *) (*:Keywords: biology, genetics, simulations, mapping, backcross, intercross, quantitative trait *) (*:Discussion: *) (*:Context: Genetics`Export` *) (*:Source: Kenneth F. Manly, Molecular & Cellular Biology, Roswell Park Cancer Institute, Buffalo, NY, 14263-0001 *) (*:History: 8/98 Add radiation hybrids to StoreMapManagerQT 4/99 Add advanced intercross and advanced backcross *) (*:Limitations: *) BeginPackage["Genetics`Export`", {"Genetics`Simulation`", "Genetics`MapFunctions`", "Genetics`GeneticSymbols`", "Genetics`SegregationAnalysis`"}]; If[NameQ["Genetics`Export`*"], Unprotect["Genetics`Export`*"]; Remove["Genetics`Export`*"]; ]; ModelNumber::usage = "ModelNumber[object] returns a segregation number, as used by Map Manager XP to identify segregation patterns. The \"object\" parameter can be a list of phenotypes, a segregation code, a Dataset or a descriptor list. In the first case, the number returned is based on the phenotypes and their frequencies. In the third and fourth cases, ModelNumber returns a segregation number if all loci in the dataset or all codes in the descriptor list are the same; otherwise, it returns 0."; StringDatasetXP::usage = "StringDatasetXP[] returns a list of the strings which Map Manager XP would store as locus records. The list contains one string per locus, but each string has embedded CR characters."; StoreMapManagerXP::usage = "StoreMapManagerXP[data, setname, filename] or StoreMapManagerXP[data, descriptorlist, setname, filename] stores a dataset of Mendelian markers in a file which can be read by Map Manager XP. The \"data\" parameter is a Dataset (such as returned by MakeDataset) or a list of Datasets. The optional \"descriptorlist\" parameter is the Descriptorlist used by MakeDataset to create the dataset (or a list of Descriptorlists, if the first parameter is a list of Datasets). The \"setname\" parameter is a string giving a name to identify this set of data, and the \"filename\" parameter is a string giving the file name. If StoreMapManagerXP is given a list of Datasets, it creates a file with one chromosome for each Dataset in the list."; StoreMapManagerQT::usage = "StoreMapManagerQT[data, qtls, setname, filename] stores the marker data and a list of quantitative traits for Map Manager QT. The \"data\" parameter is a Dataset (such as returned by MakeDataset) or a list of Datasets. The \"qtls\" is a Dataset with one or more lists of trait values. The \"setname\" parameter is a string giving a name to identify this set of data, and the \"filename\" parameter is a string giving the file name. If StoreMapManagerQT is given a list of Datasets, it creates a file with one chromosome for each Dataset in the list."; StoreMapmaker::usage = "StoreMapmaker[data, descList, setname, filename] stores a dataset of Mendelian markers in a file which can be read by Mapmaker. The \"data\" parameter is a Dataset (such as returned by MakeDataset). The optional \"descriptorlist\" parameter is the Descriptorlist used by MakeDataset to create the dataset. The \"setname\" parameter is a string giving a name to identify this set of data, and the \"filename\" parameter is a string giving the file name."; Export::badargs = "`` called with bad arguments."; Begin["`Private`"]; (* DateTimeString returns a 14-character string with numerical codes for the current year, month, day, hour, minute, and second. *) DateTimeString[] := Block[{d}, d = Date[]; ToString[SequenceForm[d[[1]], SequenceForm @@ Table[If[d[[i]]<10,SequenceForm[0,d[[i]]],d[[i]]], {i,2,5}]] ] ] (* AbbrevString is used in StoreMapManager to change the coding of backcrosses to match the convention of Map Manager Classic and Map Manager QT. Not needed for Map Manager XP and may not work for XP datasets because it assigns the coding based on the segregation pattern of one SDP. *) AbbrevString[sdp_List] := "UAHXCD" /; MatchQ[sdp, {(A|H|U)..}] AbbrevString[sdp_List] := "UHBXCD" /; MatchQ[sdp, {(B|H|U)..}] AbbrevString[sdp_List] := "UABHCD" (* The first version of ModelNumber returns a segregation model code for a descriptor if all segregation symbols in the descriptor are the same. If any segregation symbols are different, ModelNumber returns 0. The first version of ModelNumber returns a segregation model code for an advanced cross descriptor if all segregation symbols in the descriptor are the same (as they must be). This modelnumber incorporates the generation number in the way expected by Map Manager XP. If any segregation symbols are different, ModelNumber returns 0. The third version of ModelNumber assigns a segregation model code (used by Map Manager XP) for an sdp based on its segregation pattern. It assumes the backcross coding convention of Map Manager XP and normal segregation ratios. Map Manager QT files can use 0 because that program ignores the segregation model. Doubled haploid and selfed and sib-mated RI lines cannot be distinguished; ModelNumber will return whichever code is first in the list below. Advanced backcross and advanced intercross populations cannot be recognized. The fourth version of ModelNumber assigns a segregation model code to an entire dataset if all the loci in the dataset have sdps with identical patterns; if some loci have different patterns, ModelNumber returns 0. *) ModelNumber[desc_?DescriptorListQ] := Switch[desc, {{x_,_}..},ModelNumber[desc[[1,1]], {___},0]] ModelNumber[desc_?AdvancedCrossDescriptorQ] := 100*desc[[1,3]]+ModelNumber[desc[[1,1]]] ModelNumber[sdp_List] := 1 /; MatchQ[sdp, {(B|H|U)..}] (* backcross, codominant, maternal unique *) ModelNumber[sdp_List] := 2 /; MatchQ[sdp, {(A|H|U)..}] (* backcross, codominant, paternal unique *) ModelNumber[sdp_List] := 5 /; MatchQ[sdp, {(A|B|H|U)..}] (* f2 with codominant markers *) ModelNumber[sdp_List] := 3 /; MatchQ[sdp, {(D|B|U)..}] && (Count[sdp, D] < 2 Count[sdp, B]) (* backcross, maternal dominant marker *) ModelNumber[sdp_List] := 4 /; MatchQ[sdp, {(A|C|U)..}] && (Count[sdp, C] < 2 Count[sdp, A]) (* backcross, paternal dominant marker *) ModelNumber[sdp_List] := 6 /; MatchQ[sdp, {(D|B|U)..}] (* f2 with maternal dominant marker *) ModelNumber[sdp_List] := 7 /; MatchQ[sdp, {(A|C|U)..}] (* f2 with paternal dominant marker *) ModelNumber[sdp_List] := 8 /; MatchQ[sdp, {(A|B|U)..}] (* doubled haploid *) ModelNumber[sdp_List] := 9 /; MatchQ[sdp, {(A|B|U)..}] (* selfed recombinant inbred *) ModelNumber[sdp_List] := 10 /; MatchQ[sdp, {(A|B|U)..}] (* sib-mated recombinant inbred *) ModelNumber[sdp_List] := 0 (* not assigned *) ModelNumber[data_Dataset] := Block[{d}, d = ModelNumber /@ (List @@ data); Switch[d, {(x_)..},First[d], {___},0] ] ModelNumber[code_Symbol] := First[First[Position[{BC1,BC0,BD1,BD0,IC,ID1,ID0,DH,RI,RI,ABC1,ABC0,ABD0,ABD1,AIC,AID0,AID1}, code]]] (* AdjacentRecombinationFractions returns a list of strings giving genetic distances for all adjacent pairs of loci in a dataset. *) AdjacentRecombinationFractions[data_Dataset, descList_?AdvancedCrossDescriptorQ] := Append[Table[ ToString[RecombinationFraction[data[[i]],data[[i+1]],descList[[i,1]],descList[[i,3]]]], {i, Length[data]-1}], "-"] AdjacentRecombinationFractions[data_Dataset, descList_?DescriptorListQ] := Append[Table[ If[descList[[i,1]]===descList[[i+1,1]], ToString[RecombinationFraction[data[[i]],data[[i+1]],descList[[i,1]]]], ToString[RecombinationFraction[data[[i]],data[[i+1]],{descList[[i,1]],descList[[i+1,1]]}]]], {i, Length[data]-1}], "-"] (* StoreMapManagerXP creates a native-format data file for Map Manager XP. The Dataset should not contain QTL data and the descriptorList should not contain QTL descriptors. *) LocusStringXP[creationdate_String, locusname_String, sdp_List, modelnum_Integer] := Block[{str}, str = StringJoin["{lox\n", locusname, "\n", creationdate, "\n", creationdate, "\n", ToString[modelnum], "\n{sdp\n"]; For[chunk = 1; len = Length[sdp], chunk <= len, chunk = chunk + 255, str = str <> ToString[SequenceForm @@ Take[sdp, {chunk,Min[len,chunk+254]}]] <> "\n"]; str <> "}sdp\n{cmt\nrec frac not determined\n}cmt\n{ref\nSimulated data from Mathematica package Genetics`Simulation`\n}ref\n}lox\n" ] LocusStringXP[creationdate_String, locusname_String, sdp_List, modelnum_Integer, recfrac_String] := Block[{str}, str = StringJoin["{lox\n", locusname, "\n", creationdate, "\n", creationdate, "\n", ToString[modelnum], "\n{sdp\n"]; For[chunk = 1; len = Length[sdp], chunk <= len, chunk = chunk + 255, str = str <> ToString[SequenceForm @@ Take[sdp, {chunk,Min[len,chunk+254]}]] <> "\n"]; StringJoin[str, "}sdp\n{cmt\nrec frac = ", recfrac, "\n}cmt\n{ref\nSimulated data from Mathematica package Genetics`Simulation`\n}ref\n}lox\n"] ] StringDatasetXP[data_Dataset, setname_String] := Block[{datestring}, datestring = DateTimeString[]; Table[LocusStringXP[datestring, setname <> ToString[i], data[[i]], ModelNumber[data[[i]]]], {i, Length[data]}] ] StringDatasetXP[data:{_Dataset..}, setname_String] := Block[{t, datestring}, datestring = DateTimeString[]; t = Level[data, {2}]; Table[LocusStringXP[datestring, setname <> ToString[i], t[[i]], ModelNumber[t[[i]]]], {i, Length[t]}] ] StringDatasetXP[data_Dataset, descList_?DescriptorListQ, setname_String] := Block[{datestring, intervals}, datestring = DateTimeString[]; intervals = AdjacentRecombinationFractions[data, descList]; Table[LocusStringXP[datestring, setname <> ToString[i], data[[i]], ModelNumber[descList[[i,1]]], intervals[[i]]], {i, Length[data]}] ] StringDatasetXP[data_Dataset, descList_?AdvancedCrossDescriptorQ, setname_String] := Block[{datestring, intervals}, datestring = DateTimeString[]; intervals = AdjacentRecombinationFractions[data, descList]; Table[LocusStringXP[datestring, setname <> ToString[i], data[[i]], ModelNumber[descList], intervals[[i]]], {i, Length[data]}] ] StringDatasetXP[data:{_Dataset..}, descList:{_?DescriptorListQ..}, setname_String] := Block[{d,t, datestring}, datestring = DateTimeString[]; intervals = Level[Table[AdjacentRecombinationFractions[data[[i]], descList[[i]]], {i, Length[data]}], {2}]; d = Level[descList, {2}]; t = Level[data, {2}]; Table[LocusStringXP[datestring, setname <> ToString[i], t[[i]], ModelNumber[d[[i,1]]], intervals[[i]]], {i, Length[t]}] ] StringDatasetXP[data:{_Dataset..}, descList:{_?AdvancedCrossDescriptorQ..}, setname_String] := Block[{d,t, datestring}, datestring = DateTimeString[]; intervals = Level[Table[AdjacentRecombinationFractions[data[[i]], descList[[i]]], {i, Length[data]}], {2}]; d = Level[descList, {2}]; t = Level[data, {2}]; Table[LocusStringXP[datestring, setname <> ToString[i], t[[i]], ModelNumber[{d[[i]]}], intervals[[i]]], {i, Length[t]}] ] StoreMapManagerXP[data:{_String..}, setname_String, filename_String] := Block[{tmpout, prgy}, prgy = StringPosition[data[[1]], "}sdp"][[1,1]] - StringPosition[data[[1]], "{sdp"][[1,1]] - 6; tmpout = OpenWrite[filename, PageWidth->Infinity]; datestring = DateTimeString[]; WriteString[tmpout, "{set\n20\n20\n"]; WriteString[tmpout, datestring, "\n", datestring, "\n"]; WriteString[tmpout, setname, "\nMaternal\nPaternal\nUABHCD\n!\"#$%&\n{pgy\n"]; Write[tmpout, prgy]; Write[tmpout, #]& /@ Range[prgy]; WriteString[tmpout, "}pgy\n"]; WriteString[tmpout, "{chx\nOne\n"]; WriteString[tmpout, datestring, "\n", datestring, "\n0\n"]; Map[WriteString[tmpout, #]&, data]; WriteString[tmpout, "}chx\n}set\n"]; Close[tmpout] ] StoreMapManagerXP[data_Dataset, setname_String, filename_String] := Block[{tmpout, datestring}, tmpout = OpenWrite[filename, PageWidth->Infinity]; datestring = DateTimeString[]; WriteString[tmpout, "{set\n20\n20\n"]; WriteString[tmpout, datestring, "\n", datestring, "\n"]; WriteString[tmpout, setname, "\nMaternal\nPaternal\nUABHCD\n!\"#$%&\n{pgy\n"]; Write[tmpout, Length[data[[1]]]]; Write[tmpout, #]& /@ Range[Length[data[[1]]]]; WriteString[tmpout, "}pgy\n"]; WriteString[tmpout, "{chx\nOne\n"]; WriteString[tmpout, datestring, "\n", datestring, "\n0\n"]; MapIndexed[(locusname = setname <> ToString[#2[[1]]]; str = LocusStringXP[datestring, locusname, #1, ModelNumber[#1]]; WriteString[tmpout, str];)&, data]; WriteString[tmpout, "}chx\n}set\n"]; Close[tmpout] ] StoreMapManagerXP[data:{_Dataset..}, setname_String, filename_String] := Block[{tmpout, datestring}, tmpout = OpenWrite[filename, PageWidth->Infinity]; datestring = DateTimeString[]; WriteString[tmpout, "{set\n20\n20\n"]; WriteString[tmpout, datestring, "\n", datestring, "\n"]; WriteString[tmpout, setname, "\nMaternal\nPaternal\nUABHCD\n!\"#$%&\n{pgy\n"]; Write[tmpout, Length[data[[1,1]]]]; Write[tmpout, #]& /@ Range[Length[data[[1,1]]]]; WriteString[tmpout, "}pgy\n"]; locnum := 0; MapIndexed[(WriteString[tmpout, "{chx\nChr", ToString[#2[[1]]], "\n"]; WriteString[tmpout, datestring, "\n", datestring, "\n0\n"]; MapIndexed[(locusname = setname <> ToString[locnum + #2[[1]]]; str = LocusStringXP[datestring, locusname, #1, ModelNumber[#1]]; WriteString[tmpout, str];)&, #1]; locnum += Length[#1]; WriteString[tmpout, "}chx\n"])&, data]; WriteString[tmpout, "}set\n"]; Close[tmpout] ] StoreMapManagerXP[data_Dataset, descList:_?DescriptorListQ|_?AdvancedCrossDescriptorQ, setname_String, filename_String] := Block[{tmpout, datestring, intervals}, tmpout = OpenWrite[filename, PageWidth->Infinity]; datestring = DateTimeString[]; intervals = AdjacentRecombinationFractions[data, descList]; WriteString[tmpout, "{set\n20\n20\n"]; WriteString[tmpout, datestring, "\n", datestring, "\n"]; WriteString[tmpout, setname, "\nMaternal\nPaternal\nUABHCD\n!\"#$%&\n{pgy\n"]; Write[tmpout, Length[data[[1]]]]; Write[tmpout, #]& /@ Range[Length[data[[1]]]]; WriteString[tmpout, "}pgy\n"]; WriteString[tmpout, "{chx\nOne\n"]; WriteString[tmpout, datestring, "\n", datestring, "\n0\n"]; MapIndexed[(locusname = setname <> ToString[#2[[1]]]; str = LocusStringXP[datestring, locusname, #1, ModelNumber[{descList[[#2[[1]]]]}], intervals[[#2[[1]]]]]; WriteString[tmpout, str];)&, data]; WriteString[tmpout, "}chx\n}set\n"]; Close[tmpout] ] StoreMapManagerXP[data:{_Dataset..}, descList:{_?DescriptorListQ..|_?AdvancedCrossDescriptorQ..}, setname_String, filename_String] := Block[{tmpout, datestring, intervals, locnum, chrdesc}, tmpout = OpenWrite[filename, PageWidth->Infinity]; datestring = DateTimeString[]; WriteString[tmpout, "{set\n20\n20\n"]; WriteString[tmpout, datestring, "\n", datestring, "\n"]; WriteString[tmpout, setname, "\nMaternal\nPaternal\nUABHCD\n!\"#$%&\n{pgy\n"]; Write[tmpout, Length[data[[1,1]]]]; Write[tmpout, #]& /@ Range[Length[data[[1,1]]]]; WriteString[tmpout, "}pgy\n"]; locnum = 0; MapIndexed[(WriteString[tmpout, "{chx\nChr", ToString[#2[[1]]], "\n"]; WriteString[tmpout, datestring, "\n", datestring, "\n0\n"]; chrdesc = descList[[#2[[1]]]]; intervals = AdjacentRecombinationFractions[#1, chrdesc]; MapIndexed[(locusname = setname <> ToString[locnum + #2[[1]]]; str = LocusStringXP[datestring, locusname, #1, ModelNumber[{chrdesc[[#2[[1]]]]}], intervals[[#2[[1]]]]]; WriteString[tmpout, str];)&, #1]; locnum += Length[#1]; WriteString[tmpout, "}chx\n"])&, data]; WriteString[tmpout, "}set\n"]; Close[tmpout] ] LocusStringQT[creationdate_String, locusname_String, sdp_List] := Block[{str}, str = StringJoin["{loc\n", locusname, "\n", creationdate, "\n0\n{sdp\n"]; For[chunk = 1; len = Length[sdp], chunk <= len, chunk = chunk + 255, str = str <> ToString[SequenceForm @@ Take[sdp, {chunk,Min[len,chunk+254]}]] <> "\n"]; str <> "}sdp\n{ref\nSimulated data from Mathematica package Genetics`Simulation`\n}ref\n}loc\n" ] LocusStringQT[x_,y_,z_] := {Head[x], Head[y], Head[z]} LocusStringQT[___] := Null StoreMapManagerQT[data:(_Dataset|_RHData), setname_String, filename_String] := Block[{tmpout, datestring, vals, locusname, str}, tmpout = OpenWrite[filename, PageWidth->Infinity]; datestring = DateTimeString[]; WriteString[tmpout, "{set\n8\n9\n", setname, "\n"]; WriteString[tmpout, "Maternal\nPaternal\n", AbbrevString[data[[1]]], "\n!\"#$%&\n{pgy\n"]; Write[tmpout, Length[data[[1]]]]; Write[tmpout, #]& /@ Range[Length[data[[1]]]]; WriteString[tmpout, "}pgy\n"]; WriteString[tmpout, "{chr\nOne\n"]; MapIndexed[(locusname = setname <> ToString[#2[[1]]]; str = LocusStringQT[datestring, locusname, #1]; WriteString[tmpout, str])&, data]; WriteString[tmpout, "}chr\n}set\n"]; Close[tmpout] ] StoreMapManagerQT[data:({_Dataset..}|{_RHData..}), setname_String, filename_String] := Block[{tmpout, datestring, vals, chunk, len, locnum, ansdp}, tmpout = OpenWrite[filename, PageWidth->Infinity]; datestring = DateTimeString[]; ansdp = data[[1,1]]; WriteString[tmpout, "{set\n8\n9\n", setname, "\n"]; WriteString[tmpout, "Maternal\nPaternal\n", AbbrevString[ansdp], "\n!\"#$%&\n{pgy\n"]; Write[tmpout, Length[ansdp]]; Write[tmpout, #]& /@ Range[Length[ansdp]]; WriteString[tmpout, "}pgy\n"]; locnum = 0; MapIndexed[(WriteString[tmpout, "{chr\nChr", ToString[#2[[1]]], "\n"]; MapIndexed[(locusname = setname <> ToString[locnum + #2[[1]]]; str = LocusStringQT[datestring, locusname, #1]; WriteString[tmpout, str])&, #1]; locnum += Length[#1]; WriteString[tmpout, "}chr\n"])&, data]; WriteString[tmpout, "}set\n"]; Close[tmpout] ] StoreMapManagerQT[data_Dataset, qtls_?MatrixQ, setname_String, filename_String] := Block[{tmpout, datestring, vals, locusname, str}, tmpout = OpenWrite[filename, PageWidth->Infinity]; datestring = DateTimeString[]; WriteString[tmpout, "{set\n8\n9\n", setname, "\n"]; WriteString[tmpout, "Maternal\nPaternal\n", AbbrevString[data[[1]]], "\n!\"#$%&\n{pgy\n"]; Write[tmpout, Length[data[[1]]]]; Write[tmpout, #]& /@ Range[Length[data[[1]]]]; WriteString[tmpout, "}pgy\n"]; MapIndexed[(vals = Partition[Join[#1, Table[0, {9}]], 10]; WriteString[tmpout, "{qtt\n"]; WriteString[tmpout, SequenceForm["QTL", ToString[#2[[1]]], "\n"]]; WriteString[tmpout, datestring <> "\n"]; WriteString[tmpout, "0.0\n0.0\n0.0\n"]; Write[tmpout, 0]; (WriteString[tmpout, NumberForm[SequenceForm @@ #1, 6, NumberSigns->{" -"," "}], " \n"])& /@ vals; WriteString[tmpout, "{ref\nSimulated data from Mathematica package Genetics`Simulation`\n}ref\n}qtt\n"])&, qtls]; WriteString[tmpout, "{chr\nOne\n"]; MapIndexed[(locusname = setname <> ToString[#2[[1]]]; str = LocusStringQT[datestring, locusname, #1]; WriteString[tmpout, str])&, data]; WriteString[tmpout, "}chr\n}set\n"]; Close[tmpout] ] StoreMapManagerQT[data:{_Dataset..}, qtls_?MatrixQ, setname_String, filename_String] := Block[{tmpout, datestring, vals, chunk, len, locnum, ansdp}, tmpout = OpenWrite[filename, PageWidth->Infinity]; datestring = DateTimeString[]; ansdp = data[[1,1]]; WriteString[tmpout, "{set\n8\n9\n", setname, "\n"]; WriteString[tmpout, "Maternal\nPaternal\n", AbbrevString[ansdp], "\n!\"#$%&\n{pgy\n"]; Write[tmpout, Length[ansdp]]; Write[tmpout, #]& /@ Range[Length[ansdp]]; WriteString[tmpout, "}pgy\n"]; MapIndexed[(vals = Partition[Join[#1, Table[0, {9}]], 10]; WriteString[tmpout, "{qtt\n"]; WriteString[tmpout, SequenceForm["QTL", ToString[#2[[1]]], "\n"]]; WriteString[tmpout, datestring <> "\n"]; WriteString[tmpout, "0.0\n0.0\n0.0\n"]; Write[tmpout, 0]; (WriteString[tmpout, NumberForm[SequenceForm @@ #1, 6, NumberSigns->{" -"," "}], " \n"])& /@ vals; WriteString[tmpout, "{ref\nSimulated data from Mathematica package Genetics`Simulation`\n}ref\n}qtt\n"])&, qtls]; locnum = 0; MapIndexed[(WriteString[tmpout, "{chr\nChr", ToString[#2[[1]]], "\n"]; MapIndexed[(locusname = setname <> ToString[locnum + #2[[1]]]; str = LocusStringQT[datestring, locusname, #1]; WriteString[tmpout, str])&, #1]; locnum += Length[#1]; WriteString[tmpout, "}chr\n"])&, data]; WriteString[tmpout, "}set\n"]; Close[tmpout] ] LocusStringMM[locusname_String, sdp_List] := Block[{str}, str = StringJoin["*", locusname, "\t"]; For[chunk = 1; len = Length[sdp], chunk <= len, chunk = chunk + 255, str = str <> ToString[SequenceForm @@ Take[sdp, {chunk,Min[len,chunk+254]}]] <> "\n"]; str ] LocusStringMM[___] := "" StoreMapmaker[data_Dataset, setname_String, filename_String] := Block[{tmpout, model, vals, locusname, str}, model = Switch[ModelNumber[data], 1|2|3|4|8,"f2 backcross", 5|6|7,"f2 intercross", 9,"ri self", 10,"ri sib", _," "]; tmpout = OpenWrite[filename <> ".raw", PageWidth->Infinity]; WriteString[tmpout, "#\n# Simulated data from Mathematica package Genetics`Simulation`\n# File created by Mathematica package Genetics`Export`\n#\n"]; WriteString[tmpout, "data type " <> model <> "\n"]; WriteString[tmpout, ToString[Length[data[[1]]]] <> " " <> ToString[Length[data]] <> " 0 case symbols U=-\n"]; MapIndexed[(locusname = setname <> ToString[#2[[1]]]; str = LocusStringMM[locusname, #1]; WriteString[tmpout, str])&, data]; Close[tmpout] ] StoreMapmaker[data_Dataset, descList_?DescriptorListQ, setname_String, filename_String] := Block[{tmpout, model, vals, locusname, str}, model = Switch[ModelNumber[descList], 1|2|3|4|8,"f2 backcross", 5|6|7,"f2 intercross", 9,"ri self", 10,"ri sib", _," "]; tmpout = OpenWrite[filename <> ".raw", PageWidth->Infinity]; WriteString[tmpout, "#\n# Simulated data from Mathematica package Genetics`Simulation`\n# File craated by Mathematica package Genetics`Export`\n#\n"]; WriteString[tmpout, "data type " <> model <> "\n"]; WriteString[tmpout, ToString[Length[data[[1]]]] <> " " <> ToString[Length[data]] <> " 0 case symbols U=-\n"]; MapIndexed[(locusname = setname <> ToString[#2[[1]]]; str = LocusStringMM[locusname, #1]; WriteString[tmpout, str])&, data]; Close[tmpout] ] StoreMapManagerXP[___] := Message[Export::badargs, StoreMapManagerXP] StoreMapManagerQT[___] := Message[Export::badargs, StoreMapManagerQT] StoreMapmaker[___] := Message[Export::badargs, StoreMapmaker] End[]; (* end the private context *) Protect[ModelNumber, StringDatasetXP, StoreMapManagerXP, StoreMapManagerQT, StoreMapmaker]; EndPackage[]