diff --git a/vegas.mm b/vegas.mm index 9e15ac4f20a4fe61ce0154c0b884ca77a756fe10..ad152e29f01a7433cbbbbaeec12467551bac521e 100644 --- a/vegas.mm +++ b/vegas.mm @@ -420,15 +420,45 @@ ReadFortran[stream_,type_]:=Module[{len,ans,len2}, If[Length[ans]==1,First[ans],ans] ] +GuessVegasVersion[stream_, intsize_:4]:=Module[{nrq, nrbins, inttype, time, magic,version}, + SetStreamPosition[stream,0]; + magic = StringJoin @@ Select[BinaryReadList[stream, "Character8", 17], # != "\000" &]; + If[magic === "\t McMule \t", + version=StringJoin @@ ReadFortran[stream, "Character8"]; + version = First@StringCases[ + version, + RegularExpression["v(\\d+)([NL])"] :> { + ToExpression["$1"], + "Integer" <> ToString[8 If["$2" == "L", 8, 4]] + } + ]; + SetStreamPosition[stream,0]; + Return[version, Module]; + ]; + + inttype = "Integer"<>ToString[8 intsize]; + (* Test v1 vs. v2 *) + SetStreamPosition[stream,6893 + 3 intsize]; + {nrq, nrbins} = ReadFortran[stream, inttype]; + SetStreamPosition[stream,6925 + 5 intsize + 22 nrq + 16 nrbins nrq]; + time=ReadFortran[stream, "Real64"]; + SetStreamPosition[stream,0]; + If[FailureQ[time], + Return[{1,inttype}, Module], + (*else*) + Return[{2,inttype}, Module] + ]; +] + + importeverything=False; importer[stream_InputStream,intsize_:4, opts___]:=Module[{ len,len2,ans, sha,it,ndo,si,swgt,schi,xi,randy,nrq,nrbins,quant,minv,maxv,names, X, delta, msg, version, - inttype + inttype, namelen }, - inttype = "Integer"<>ToString[8 intsize]; - + {version, inttype} = GuessVegasVersion[stream, intsize]; sha=StringJoin@@ReadFortran[stream,"Character8"]; it=ReadFortran[stream,inttype];ndo=ReadFortran[stream,inttype]; si=ReadFortran[stream,"Real64"];swgt=ReadFortran[stream,"Real64"];schi=ReadFortran[stream,"Real64"]; @@ -441,16 +471,12 @@ importer[stream_InputStream,intsize_:4, opts___]:=Module[{ names=StringTrim[StringJoin@@@Partition[ReadFortran[stream,"Character8"],6]]; quant=ReadFortran[stream,"Real64"]; - If[Or[ - FailureQ[time=ReadFortran[stream,"Real64"]], - FailureQ[msg=StringJoin@@ReadFortran[stream,"Character8"]] - ], - version=1 - ]; If[version>1, - If[Or[StringContainsQ[msg,"Warning"],MemberQ[$LoadVerbosity,"msg"]], - Print[StringTrim[msg]] - ]; + time=ReadFortran[stream,"Real64"]; + msg=StringJoin@@ReadFortran[stream,"Character8"]; + If[Or[StringContainsQ[msg,"Warning"],MemberQ[$LoadVerbosity,"msg"]], + Print[StringTrim[msg]] + ]; ]; Flatten[{