// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // ! This script is provided "as is" by Applied Maths. ! // ! You are free to use and modify this script for your own needs. ! // ! Redistribution or reproduction of the script is prohibited. ! // ! DISCLAIMER: ! // ! Improper use of scripts may corrupt your database. ! // ! Running this script is entirely at your own responsibility. ! // ! Applied Maths accepts no lialibility for any consequences ! // ! resulting from its use. ! // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! integer i,j,resol,first; float startpos,endpos,maxval,xp,yp,vl; float s0[],s1[],s2[],mean[],stdev[]; string experlist,expername,key,showtype,str_from,str_to,st,st2; FPRINT fpr; DIALOG dlg; showtype="Average & standard deviation"; DlgAddText(dlg,"Display type:",15,15,150,14); DlgAddList(dlg,"Average & standard deviation All curves",showtype,15,35,180,80,"DROP"); str_from="0";str_to="100"; DlgAddText(dlg,"From",15,80,30,14);DlgAddEdit(dlg,str_from,50,80,40,18);DlgAddText(dlg,"%",100,80,20,14); DlgAddText(dlg,"To",15,120,30,14);DlgAddEdit(dlg,str_to,50,120,40,18);DlgAddText(dlg,"%",100,120,20,14); for i=1 to DbGetExperCount do if DbGetExperClass(i)="FPR" then { if expername="" then expername=DbGetExperName(i); experlist=experlist+DbGetExperName(i)+" "; } DlgAddList(dlg,experlist,expername,15,165,150,100,"LIST"); if (not(dlgshow(dlg,"Display fingerprint curves",290,290))) then stop; startpos=val(str_from); endpos=val(str_to); setbusy("Scanning curves - pass 1"); maxval=1; for i=1 to DbGetEntryCount do { key=DbGetEntryKey(i); if DbGetSel(key) then { if (FprLoadNorm(fpr,key,expername)) then { resol=FprGetCurveResol(fpr); for j=0 to resol-1 do { vl=FprGetCurveVal(fpr,j); s0[j]=s0[j]+1; s1[j]=s1[j]+vl; s2[j]=s2[j]+vl*vl; if (j/(resol-1)*100>=startpos) and (j/(resol-1)*100<=endpos) then if vl>maxval then maxval=vl; } } } } maxval=maxval*1.05; setbusy("Scanning curves - pass 2"); PrnStartScreen(16,13); PrnLinestyle(0.02,0,0,0); PrnMoveTo(1.8,10.3);PrnLineto(15.2,10.3);PrnLineto(15.2,0.7);PrnLineto(1.8,0.7);PrnLineto(1.8,10.3); PrnTextstyle("arial",0.3,0,0,0,0); st=PrnScaleDiv(startpos,endpos); while st<>"" do { xp=2+val(splitstring(st,";"))*13; st2=splitstring(st," "); if st2="" then { PrnMoveto(xp,10.3);PrnLineto(xp,10.2); PrnMoveto(xp,0.7);PrnLineto(xp,0.8); } else { PrnMoveto(xp,10.3);PrnLineto(xp,10.1); PrnMoveto(xp,0.7);PrnLineto(xp,0.9); PrnText(xp-PrnTextSizeX(st2)/2,10.6,st2); } } if showtype="All curves" then { for i=1 to DbGetEntryCount do { key=DbGetEntryKey(i); if DbGetSel(key) then { if FprLoadNorm(fpr,key,expername) then { resol=FprGetCurveResol(fpr); first=1;PrnLinestyle(0.005,0,0,0); for j=0 to resol-1 do if (j/(resol-1)*100>=startpos) and (j/(resol-1)*100<=endpos) then { xp=2+(j/(resol-1)*100-startpos)/(endpos-startpos)*13; yp=10-FprGetCurveVal(fpr,j)/maxval*9; if first then PrnMoveto(xp,yp); else PrnLineto(xp,yp); first=0; } } } } } if showtype="Average & standard deviation" then { maxval=1; for j=0 to resol-1 do { mean[j]=s1[j]/s0[j]; stdev[j]=s2[j]/s0[j]-(s1[j]*s1[j])/(s0[j]*s0[j]); if stdev[j]>0 then stdev[j]=stdev[j]^0.5; if (j/(resol-1)*100>=startpos) and (j/(resol-1)*100<=endpos) then if mean[j]+stdev[j]>maxval then maxval=mean[j]+stdev[j]; } maxval=maxval*1.05; for j=0 to resol-1 do if (j/(resol-1)*100>=startpos) and (j/(resol-1)*100<=endpos) then { xp=2+(j/(resol-1)*100-startpos)/(endpos-startpos)*13; yp=10-(mean[j]+stdev[j])/maxval*9; PrnPolygonPoint(xp,yp); } j=resol-1; while j>=0 do { if (j/(resol-1)*100>=startpos) and (j/(resol-1)*100<=endpos) then { xp=2+(j/(resol-1)*100-startpos)/(endpos-startpos)*13; yp=10-(mean[j]-stdev[j])/maxval*9; if yp>10 then yp=10; PrnPolygonPoint(xp,yp); } j=j-1; } PrnLinestyle(0.002,75,75,75); PrnPolygonDraw(75,75,75); first=1;PrnLinestyle(0.02,0,0,0); for j=0 to resol-1 do if (j/(resol-1)*100>=startpos) and (j/(resol-1)*100<=endpos) then { xp=2+(j/(resol-1)*100-startpos)/(endpos-startpos)*13; yp=10-mean[j]/maxval*9; if first then PrnMoveto(xp,yp); else PrnLineto(xp,yp); first=0; } } setbusy(""); PrnEnd;