SNAP Library , Developer Reference  2013-01-07 14:03:36
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
gnuplot.h
Go to the documentation of this file.
00001 #ifndef gnuplot_h
00002 #define gnuplot_h
00003 
00005 // GNU-Plot-Chart
00006 typedef enum {
00007   gpsNoAuto, gpsAuto, gpsLog, gpsLog2X, gpsLog2Y, gpsLog2XY, gpsLog10X,
00008   gpsLog10Y, gpsLog10XY
00009 } TGpScaleTy;
00010 
00011 typedef enum {
00012   gpwUndef, gpwLines, gpwPoints, gpwLinesPoints, gpwImpulses, gpwDots,
00013   gpwSteps, gpwFSteps, gpwHiSteps, gpwBoxes, gpwErrBars, gpwFilledCurves, gpwMax
00014 } TGpSeriesTy;
00015 
00016 class TGnuPlot {
00017 public:
00018   static TStr DefPlotFNm;
00019   static TStr DefDataFNm;
00020 private:
00021   class TGpSeries {
00022   public:
00023     TGpSeriesTy SeriesTy;
00024     TFltKdV XYValV;
00025     TFltV ZValV; // error bar and 3d plots
00026     TStr Label, WithStyle, DataFNm;
00027     int XCol, YCol, ZCol;
00028   public:
00029     TGpSeries() : SeriesTy(gpwLines), XYValV(), ZValV(), Label(), WithStyle(), DataFNm(), XCol(0), YCol(0), ZCol(0) { }
00030     TGpSeries(const TGpSeries& Gps);
00031     TGpSeries& operator = (const TGpSeries& Gps);
00032     bool operator < (const TGpSeries& Gps) const;
00033     bool SaveXVals() const { return (YCol-XCol)==1; }
00034   };
00035   class TGpSeriesCmp {
00036   private:
00037     const TVec<TGpSeries>& SeriesV;
00038   public:
00039     TGpSeriesCmp(const TVec<TGpSeries>& _SeriesV) : SeriesV(_SeriesV) { }
00040     bool operator () (const int& Left, const int& Right) const {
00041       return SeriesV[Left] > SeriesV[Right]; }
00042   };
00043 private:
00044   static int Tics42;        // 1 - "set ticks", 0 - "set ticscale", -1 - unknown
00045   TStr DataFNm, PlotFNm;
00046   TStr Title, LblX, LblY;
00047   TGpScaleTy ScaleTy;
00048   TFltPr YRange, XRange;
00049   bool SetGrid, SetPause;
00050   TVec<TGpSeries> SeriesV;
00051   TStrV MoreCmds;
00052   static int GetTics42();
00053 public:
00054   TStr GetSeriesPlotStr(const int& PlotN);
00055   int IsSameXCol(const int& CurId, const int& PrevId) const;
00056   void CreatePlotFile(const TStr& Comment = TStr());
00057   void RunGnuPlot() const;
00058 public:
00059   TGnuPlot(const TStr& FileNm="gplot", const TStr& PlotTitle=TStr(), const bool& Grid=true);
00060   TGnuPlot(const TStr& DataFileNm, const TStr& PlotFileNm, const TStr& PlotTitle, const bool& Grid);
00061   TGnuPlot(const TGnuPlot& GnuPlot);
00062   TGnuPlot& operator = (const TGnuPlot& GnuPlot);
00063   
00064   void SetTitle(const TStr& PlotTitle) { Title = PlotTitle; }
00065   void SetXLabel(const TStr& XLabel) { LblX = XLabel; }
00066   void SetYLabel(const TStr& YLabel) { LblY = YLabel; }
00067   void SetXYLabel(const TStr& XLabel, const TStr& YLabel) { LblX = XLabel;  LblY = YLabel; }
00068   void SetDataPlotFNm(const TStr& DatFNm, const TStr& PltFNm) { DataFNm = DatFNm;  PlotFNm = PltFNm; }
00069   
00070   void ShowGrid(const bool& Show) { SetGrid = Show; }
00071   void Pause(const bool& DoPause) { SetPause = DoPause; }
00072   void SetScale(const TGpScaleTy& GpScaleTy) { ScaleTy = GpScaleTy;}
00073   void SetXRange(const double& Min, const double& Max) { XRange = TFltPr(Min, Max); }
00074   void SetYRange(const double& Min, const double& Max) { YRange = TFltPr(Min, Max); }
00075   void AddCmd(const TStr& Cmd) { MoreCmds.Add(Cmd); }
00076   TStr GetLineStyle(const int& PlotId) const { return SeriesV[PlotId].WithStyle; }
00077   void SetLineStyle(const int& PlotId, const TStr& StyleStr) { SeriesV[PlotId].WithStyle = StyleStr; }
00078 
00079   int AddFunc(const TStr& FuncStr, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00080   int AddPlot(const TIntV& YValV, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00081   int AddPlot(const TFltV& YValV, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00082   int AddPlot(const TFltV& XValV, const TFltV& YValV, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00083   int AddPlot(const TIntPrV& XYValV, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00084   int AddPlot(const TFltPrV& XYValV, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00085   int AddPlot(const TIntKdV& XYValV, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00086   int AddPlot(const TFltKdV& XYValV, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00087   int AddPlot(const TIntFltKdV& XYValV, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00088   int AddPlot(const TIntFltPrV& XYValV, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00089   int AddPlot(const TStr& DataFNm, const int& ColY, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00090   int AddPlot(const TStr& DataFNm, const int& ColX, const int& ColY, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr());
00091   template<class TKey, class TDat, class THashFunc>
00092   int AddPlot(const THash<TKey, TDat, THashFunc>& XYValH, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr(), const bool& ExpBucket = false);
00093   template<class TKey, class THashFunc>
00094   int AddPlot(const THash<TKey, TMom, THashFunc>& ValMomH, const TGpSeriesTy& SeriesTy=gpwLinesPoints, const TStr& Label=TStr(), const TStr& Style=TStr(),
00095     bool PlotAvg=true, bool PlotMed=true, bool PlotMin=false, bool PlotMax=false, bool PlotSDev=false, bool PlotStdErr=false, const bool& ExpBucket=false);
00096 
00097   int AddErrBar(const TFltTrV& XYDValV, const TStr& Label=TStr());
00098   int AddErrBar(const TFltTrV& XYDValV, const TStr& DatLabel, const TStr& ErrLabel);
00099   int AddErrBar(const TFltV& YValV, const TFltV& DeltaYV, const TStr& Label=TStr());
00100   int AddErrBar(const TFltV& XValV, const TFltV& YValV, const TFltV& DeltaYV, const TStr& Label=TStr());
00101   int AddErrBar(const TFltPrV& XYValV, const TFltV& DeltaYV, const TStr& Label=TStr());
00102   int AddErrBar(const TFltKdV& XYValV, const TFltV& DeltaYV, const TStr& Label=TStr());
00103   int AddErrBar(const TFltPrV& XYValV, const TFltV& DeltaYV, const TStr& DatLabel, const TStr& ErrLabel);
00104 
00105   int AddLinFit(const int& PlotId, const TGpSeriesTy& SeriesTy=gpwLines, const TStr& Style=TStr());
00106   int AddPwrFit(const int& PlotId, const TGpSeriesTy& SeriesTy=gpwLines, const TStr& Style=TStr());
00107   int AddPwrFit1(const int& PlotId, const TGpSeriesTy& SeriesTy=gpwLines, const TStr& Style=TStr());
00108   int AddPwrFit2(const int& PlotId, const TGpSeriesTy& SeriesTy=gpwLines, const double& MinX=-1.0, const TStr& Style=TStr());
00109   int AddPwrFit3(const int& PlotId, const TGpSeriesTy& SeriesTy=gpwLines, const double& MinX=-1.0, const TStr& Style=TStr());
00110   int AddPwrFit3(const int& PlotId, const TGpSeriesTy& SeriesTy, const double& MinX, const TStr& Style, double& Intercept, double& Slope, double& R2);
00111   int AddLogFit(const int& PlotId, const TGpSeriesTy& SeriesTy=gpwLines, const TStr& Style=TStr());
00112   int AddExpFit(const int& PlotId, const TGpSeriesTy& SeriesTy=gpwLines, const double& FitXOffset=0.0, const TStr& Style=TStr());
00113 
00114   void SavePng(const int& SizeX=1000, const int& SizeY=800, const TStr& Comment=TStr()) {
00115     SavePng(PlotFNm.GetFMid()+".png", SizeX, SizeY, Comment); }
00116   void SavePng(const TStr& FNm, const int& SizeX=1000, const int& SizeY=800, const TStr& Comment=TStr(), const TStr& Terminal=TStr());
00117   void SaveEps(const int& FontSz=30, const TStr& Comment=TStr()) {
00118     SaveEps(PlotFNm.GetFMid()+".eps", FontSz, Comment); }
00119   void SaveEps(const TStr& FNm, const int& FontSz=30, const TStr& Comment=TStr());
00120   void Plot(const TStr& Comment=TStr()) { CreatePlotFile(Comment);  RunGnuPlot(); }
00121 
00122   static void MakeExpBins(const TFltPrV& XYValV, TFltPrV& ExpXYValV,
00123     const double& BinFactor = 2, const double& MinYVal = 1);
00124   static void MakeExpBins(const TFltKdV& XYValV, TFltKdV& ExpXYValV,
00125     const double& BinFactor = 2, const double& MinYVal = 1);
00126   static void LoadTs(const TStr& FNm, TStrV& ColNmV, TVec<TFltKdV>& ColV);
00127 
00128   static TStr GetScaleStr(const TGpScaleTy& ScaleTy);
00129   static TStr GetSeriesTyStr(const TGpSeriesTy& SeriesTy);
00130 
00131   // save tab separated
00132   static void SaveTs(const TIntKdV& KdV, const TStr& FNm, const TStr& HeadLn = TStr());
00133   static void SaveTs(const TIntFltKdV& KdV, const TStr& FNm, const TStr& HeadLn = TStr());
00134   template <class TVal1, class TVal2>
00135   static void SaveTs(const TVec<TPair<TVal1, TVal2> >& ValV, const TStr& FNm, const TStr& HeadLn = TStr());
00136   template <class TVal1, class TVal2, class TVal3>
00137   static void SaveTs(const TVec<TTriple<TVal1, TVal2, TVal3> >& ValV, const TStr& FNm, const TStr& HeadLn = TStr());
00138   template <class TVal, int Vals>
00139   static void SaveTs(const TVec<TTuple<TVal, Vals> >& ValV, const TStr& FNm, const TStr& HeadLn = TStr());
00140   static void Test();
00141 
00142   // plot value-count tables, and pair vectors
00143   template <class TVal1, class TVal2>
00144   static void PlotValV(const TVec<TPair<TVal1, TVal2> >& ValV, const TStr& OutFNmPref, const TStr& Desc="",
00145    const TStr& XLabel="", const TStr& YLabel="", const TGpScaleTy& ScaleTy=gpsAuto, const bool& PowerFit=false, 
00146    const TGpSeriesTy& SeriesTy=gpwLinesPoints);
00147   template <class TVal1, class TVal2>
00148   static void PlotValV(const TVec<TPair<TVal1, TVal2> >& ValV1, const TStr& Name1,
00149     const TVec<TPair<TVal1, TVal2> >& ValV2, const TStr& Name2, const TStr& OutFNmPref, const TStr& Desc="",
00150    const TStr& XLabel="", const TStr& YLabel="", const TGpScaleTy& ScaleTy=gpsAuto, const bool& PowerFit=false, 
00151    const TGpSeriesTy& SeriesTy=gpwLinesPoints);
00152   template <class TVal1>
00153   static void PlotValV(const TVec<TVal1>& ValV, const TStr& OutFNmPref, const TStr& Desc="",
00154    const TStr& XLabel="", const TStr& YLabel="", const TGpScaleTy& ScaleTy=gpsAuto, const bool& PowerFit=false, 
00155    const TGpSeriesTy& SeriesTy=gpwLinesPoints);
00156   template <class TKey, class TVal, class THashFunc>
00157   static void PlotValCntH(const THash<TKey, TVal, THashFunc>& ValCntH, const TStr& OutFNmPref, const TStr& Desc="",
00158    const TStr& XLabel="", const TStr& YLabel="", const TGpScaleTy& ScaleTy=gpsAuto, const bool& PowerFit=false, 
00159    const TGpSeriesTy& SeriesTy=gpwLinesPoints, const bool& PlotNCDF=false, const bool& ExpBucket=false);
00160   template <class TKey, class TVal, class THashFunc>
00161   static void PlotValCntH(const THash<TKey, TVal, THashFunc>& ValCntH1, const TStr& Label1, 
00162     const THash<TKey, TVal, THashFunc>& ValCntH2, const TStr& Label2, 
00163     const TStr& OutFNmPref, const TStr& Desc, const TStr& XLabel, const TStr& YLabel, 
00164     const TGpScaleTy& ScaleTy=gpsAuto, const TGpSeriesTy& SeriesTy=gpwLinesPoints);
00165   template <class TKey, class TVal, class THashFunc>
00166   static void PlotValCntH(const THash<TKey, TVal, THashFunc>& ValCntH1, const TStr& Label1, 
00167     const THash<TKey, TVal, THashFunc>& ValCntH2, const TStr& Label2, 
00168     const THash<TKey, TVal, THashFunc>& ValCntH3, const TStr& Label3, 
00169     const TStr& OutFNmPref, const TStr& Desc, const TStr& XLabel, const TStr& YLabel, 
00170     const TGpScaleTy& ScaleTy=gpsAuto, const TGpSeriesTy& SeriesTy=gpwLinesPoints);
00171   template <class TVal1>
00172   static void PlotValMomH(const THash<TVal1, TMom>& ValMomH, const TStr& OutFNmPref, const TStr& Desc="",
00173    const TStr& XLabel="", const TStr& YLabel="", const TGpScaleTy& ScaleTy=gpsAuto, const TGpSeriesTy& SeriesTy=gpwLinesPoints,
00174    bool PlotAvg=true, bool PlotMed=true, bool PlotMin=false, bool PlotMax=false, bool PlotSDev=false, bool PlotStdErr=true, bool PlotScatter=false);
00175   
00176 };
00177 
00178 //---------------------------------------------------------
00179 // useful commands
00180 // set terminal png small size 800,600
00181 // set terminal postscript enhanced eps 22
00182 // set output 'hopsasa.png'
00183 // set size 1,0.5
00184 // set pointsize 0.9
00185 // set key right bottom Left
00186 // set style fill solid 0.2
00187 // set ticscale 3 1   # longer axis tics
00188 // plot ... with points pointtype 6 pointsize 1
00189 // 1   +           7  (f) circle
00190 // 2  cross        8  (o) triangle
00191 // 3  *            9  (f) triangle
00192 // 4  (o) square  10  (o) inverse-triangle
00193 // 5  (f) square  11  (f) inverse-triangle
00194 // 6  (o) circle  12  (o) diamond
00195 //                13  (f) diamond
00196 // set label "Text" at 23,47000
00197 // set arrow from 28,45000 to 28,31000 lw 3
00198 // axes x1y2: http://t16web.lanl.gov/Kawano/gnuplot/plot1-e.html#5.2
00199 
00200 template <class TVal1, class TVal2>
00201 void TGnuPlot::SaveTs(const TVec<TPair<TVal1, TVal2> >& ValV, const TStr& FNm, const TStr& HeadLn) {
00202   FILE *F = fopen(FNm.CStr(), "wt");
00203   EAssert(F);
00204   if (! HeadLn.Empty()) { fprintf(F, "# %s\n", HeadLn.CStr()); }
00205   for (int i = 0; i < ValV.Len(); i++) {
00206     fprintf(F, "%g\t%g\n", double(ValV[i].Val1), double(ValV[i].Val2)); }
00207   fclose(F);
00208 }
00209 
00210 template <class TVal1, class TVal2, class TVal3>
00211 void TGnuPlot::SaveTs(const TVec<TTriple<TVal1, TVal2, TVal3> >& ValV, const TStr& FNm, const TStr& HeadLn) {
00212   FILE *F = fopen(FNm.CStr(), "wt");
00213   EAssert(F);
00214   if (! HeadLn.Empty()) { fprintf(F, "# %s\n", HeadLn.CStr()); }
00215   for (int i = 0; i < ValV.Len(); i++) {
00216     fprintf(F, "%g\t%g\t%g\n", double(ValV[i].Val1), double(ValV[i].Val2), double(ValV[i].Val3)); }
00217   fclose(F);
00218 }
00219 
00220 template <class TVal, int Vals>
00221 void TGnuPlot::SaveTs(const TVec<TTuple<TVal, Vals> >& ValV, const TStr& FNm, const TStr& HeadLn) {
00222   FILE *F = fopen(FNm.CStr(), "wt");
00223   EAssert(F);
00224   if (! HeadLn.Empty()) { fprintf(F, "# %s\n", HeadLn.CStr()); }
00225   for (int i = 0; i < ValV.Len(); i++) {
00226     fprintf(F, "%g", double(ValV[i][0]));
00227     for (int v = 1; v < Vals; v++) {
00228       fprintf(F, "\t%g", double(ValV[i][v])); }
00229     fprintf(F, "\n");
00230   }
00231   fclose(F);
00232 }
00233 
00234 template<class TKey, class TDat, class THashFunc>
00235 int TGnuPlot::AddPlot(const THash<TKey, TDat, THashFunc>& XYValH, const TGpSeriesTy& SeriesTy, const TStr& Label, const TStr& Style, const bool& ExpBucket) {
00236   TFltPrV XYFltValV(XYValH.Len(), 0);  
00237   for (int k = XYValH.FFirstKeyId();  XYValH.FNextKeyId(k); ) { 
00238     XYFltValV.Add(TFltPr(TFlt(XYValH.GetKey(k)), TFlt(XYValH[k]))); 
00239   }  
00240   XYFltValV.Sort();
00241   if (ExpBucket) {
00242     TFltPrV BucketV;
00243     TGnuPlot::MakeExpBins(XYFltValV, BucketV);
00244     BucketV.Swap(XYFltValV);
00245   }
00246   return AddPlot(XYFltValV, SeriesTy, Label, Style); 
00247 }
00248 
00249 template<class TKey, class THashFunc>
00250 int TGnuPlot::AddPlot(const THash<TKey, TMom, THashFunc>& ValMomH, const TGpSeriesTy& SeriesTy, const TStr& Label, const TStr& Style, bool PlotAvg, bool PlotMed, bool PlotMin, bool PlotMax, bool PlotSDev, bool PlotStdErr, const bool& ExpBucket) {
00251   TFltTrV AvgV, StdErrV;
00252   TFltPrV AvgV2, MedV, MinV, MaxV, BucketV;
00253   for (int i = ValMomH.FFirstKeyId(); ValMomH.FNextKeyId(i); ) {
00254     TMom Mom(ValMomH[i]);
00255     if (! Mom.IsDef()) { Mom.Def(); }
00256     const double x = ValMomH.GetKey(i);
00257     if (PlotAvg) { 
00258       if (PlotSDev) { 
00259         AvgV.Add(TFltTr(x, Mom.GetMean(), Mom.GetSDev())); } // std deviation
00260       else { 
00261         AvgV2.Add(TFltPr(x, Mom.GetMean())); 
00262       }
00263       if (PlotStdErr) {
00264         StdErrV.Add(TFltTr(x, Mom.GetMean(), Mom.GetSDev()/sqrt((double)Mom.GetVals()))); 
00265       }
00266     }
00267     if (PlotMed) { MedV.Add(TFltPr(x, Mom.GetMedian())); }
00268     if (PlotMin) { MinV.Add(TFltPr(x, Mom.GetMn())); }
00269     if (PlotMax) { MaxV.Add(TFltPr(x, Mom.GetMx())); }
00270   }
00271   AvgV.Sort();  AvgV2.Sort();
00272   MedV.Sort();  MinV.Sort();  MaxV.Sort(); 
00273   int PlotId=0;
00274   // exponential bucketing
00275   if (! AvgV2.Empty()) { TGnuPlot::MakeExpBins(AvgV2, BucketV);  BucketV.Swap(AvgV2); }
00276   if (! MedV.Empty()) { TGnuPlot::MakeExpBins(MedV, BucketV);  BucketV.Swap(MedV); }
00277   if (! MinV.Empty()) { TGnuPlot::MakeExpBins(MinV, BucketV);  BucketV.Swap(MinV); }
00278   if (! MaxV.Empty()) { TGnuPlot::MakeExpBins(MaxV, BucketV);  BucketV.Swap(MaxV); }
00279   // plot
00280   if (! AvgV.Empty()) { PlotId = AddErrBar(AvgV, Label+" Average", "StdDev"); }
00281   if (! AvgV2.Empty()) { PlotId = AddPlot(AvgV2, SeriesTy, Label+" Average", Style); }
00282   if (! MedV.Empty()) { PlotId = AddPlot(MedV, SeriesTy, Label+" Median", Style); }
00283   if (! MinV.Empty()) { PlotId = AddPlot(MinV, SeriesTy, Label+" Min", Style); }
00284   if (! MaxV.Empty()) { PlotId = AddPlot(MaxV, SeriesTy, Label+" Max", Style); }
00285   if (! StdErrV.Empty()) { PlotId = AddErrBar(StdErrV, Label+" Standard error", Style); }
00286   return PlotId;
00287 }
00288 
00289 // plot value-count tables, and pair vectors
00290 template <class TKey, class TVal, class THashFunc>
00291 void TGnuPlot::PlotValCntH(const THash<TKey, TVal, THashFunc>& ValCntH, const TStr& OutFNmPref, const TStr& Desc,
00292  const TStr& XLabel, const TStr& YLabel, const TGpScaleTy& ScaleTy, const bool& PowerFit, const TGpSeriesTy& SeriesTy, 
00293  const bool& PlotNCDF, const bool& ExpBucket) {
00294   TFltPrV IdCntV(ValCntH.Len(), 0), BucketV;
00295   for (int i = ValCntH.FFirstKeyId(); ValCntH.FNextKeyId(i); ) {
00296     IdCntV.Add(TFltPr(double(ValCntH.GetKey(i)), double(ValCntH[i]))); }
00297   IdCntV.Sort();
00298   if (ExpBucket) { 
00299     TGnuPlot::MakeExpBins(IdCntV, BucketV);
00300     BucketV.Swap(IdCntV);
00301   }
00302   if (PlotNCDF) { 
00303     TFltPrV NCdfV = IdCntV;
00304     for (int i = NCdfV.Len()-2; i >= 0; i--) {
00305       NCdfV[i].Val2 = NCdfV[i].Val2 + NCdfV[i+1].Val2; 
00306     }
00307     PlotValV(NCdfV, OutFNmPref, Desc, "NCDF "+XLabel, "NCDF "+YLabel, ScaleTy, PowerFit, SeriesTy);
00308   } else {
00309     PlotValV(IdCntV, OutFNmPref, Desc, XLabel, YLabel, ScaleTy, PowerFit, SeriesTy); 
00310   }
00311 }
00312 
00313 template <class TKey, class TVal, class THashFunc>
00314 void TGnuPlot::PlotValCntH(const THash<TKey, TVal, THashFunc>& ValCntH1, const TStr& Label1, 
00315                            const THash<TKey, TVal, THashFunc>& ValCntH2, const TStr& Label2, 
00316                            const TStr& OutFNmPref, const TStr& Desc, const TStr& XLabel, const TStr& YLabel, 
00317                            const TGpScaleTy& ScaleTy, const TGpSeriesTy& SeriesTy) {
00318   PlotValCntH(ValCntH1, Label1, ValCntH2, Label2, THash<TKey, TVal, THashFunc>(), "", OutFNmPref, Desc, XLabel, YLabel,
00319     ScaleTy, SeriesTy);
00320 }
00321 
00322 template <class TKey, class TVal, class THashFunc>
00323 void TGnuPlot::PlotValCntH(const THash<TKey, TVal, THashFunc>& ValCntH1, const TStr& Label1, 
00324                            const THash<TKey, TVal, THashFunc>& ValCntH2, const TStr& Label2, 
00325                            const THash<TKey, TVal, THashFunc>& ValCntH3, const TStr& Label3, 
00326                            const TStr& OutFNmPref, const TStr& Desc, const TStr& XLabel, const TStr& YLabel, 
00327                            const TGpScaleTy& ScaleTy, const TGpSeriesTy& SeriesTy) {
00328   TFltPrV IdCntV1(ValCntH1.Len(), 0), IdCntV2(ValCntH2.Len(), 0), IdCntV3(ValCntH3.Len(), 0);
00329   for (int i = ValCntH1.FFirstKeyId(); ValCntH1.FNextKeyId(i); ) {
00330     IdCntV1.Add(TFltPr(double(ValCntH1.GetKey(i)), double(ValCntH1[i]))); }
00331   for (int i = ValCntH2.FFirstKeyId(); ValCntH2.FNextKeyId(i); ) {
00332     IdCntV2.Add(TFltPr(double(ValCntH2.GetKey(i)), double(ValCntH2[i]))); }
00333   for (int i = ValCntH3.FFirstKeyId(); ValCntH3.FNextKeyId(i); ) {
00334     IdCntV3.Add(TFltPr(double(ValCntH3.GetKey(i)), double(ValCntH3[i]))); }
00335   IdCntV1.Sort();
00336   IdCntV2.Sort();
00337   IdCntV3.Sort();
00338   TGnuPlot GP(OutFNmPref, Desc);
00339   GP.SetXYLabel(XLabel, YLabel);
00340   GP.SetScale(ScaleTy);
00341   if (! IdCntV1.Empty()) { GP.AddPlot(IdCntV1, SeriesTy, Label1); }
00342   if (! IdCntV2.Empty()) { GP.AddPlot(IdCntV2, SeriesTy, Label2); }
00343   if (! IdCntV3.Empty()) { GP.AddPlot(IdCntV3, SeriesTy, Label3); }
00344   GP.SavePng();
00345 }
00346 
00347 template <class TVal1, class TVal2>
00348 void TGnuPlot::PlotValV(const TVec<TPair<TVal1, TVal2> >& ValV, const TStr& OutFNmPref, const TStr& Desc,
00349  const TStr& XLabel, const TStr& YLabel, const TGpScaleTy& ScaleTy, const bool& PowerFit, const TGpSeriesTy& SeriesTy) {
00350   TFltKdV IdCntV(ValV.Len(), 0);
00351   for (int i = 0; i < ValV.Len(); i++) {
00352     IdCntV.Add(TFltKd(double(ValV[i].Val1), double(ValV[i].Val2))); }
00353   if (IdCntV.Empty()) { printf("*** Empty plot %s\n", OutFNmPref.CStr());  return; }
00354   IdCntV.Sort();
00355   TGnuPlot GP(OutFNmPref, Desc);
00356   GP.SetXYLabel(XLabel, YLabel);
00357   GP.SetScale(ScaleTy);
00358   const int Id = GP.AddPlot(IdCntV, SeriesTy);
00359   if (PowerFit) { 
00360     GP.AddPwrFit3(Id);
00361     double MaxY = IdCntV.Last().Dat, MinY = IdCntV[0].Dat;
00362     if (MaxY < MinY) { Swap(MaxY, MinY); }
00363     //GP.SetYRange(MinY, pow(10.0, floor(log10(MaxY))+1.0));
00364     GP.AddCmd(TStr::Fmt("set yrange[%f:]", MinY));
00365   }
00366   GP.SavePng();
00367 }
00368 
00369 template <class TVal1, class TVal2>
00370 void TGnuPlot::PlotValV(const TVec<TPair<TVal1, TVal2> >& ValV1, const TStr& Name1, 
00371  const TVec<TPair<TVal1, TVal2> >& ValV2, const TStr& Name2, const TStr& OutFNmPref, const TStr& Desc,
00372  const TStr& XLabel, const TStr& YLabel, const TGpScaleTy& ScaleTy, const bool& PowerFit, const TGpSeriesTy& SeriesTy) {
00373   TFltKdV IdCntV1(ValV1.Len(), 0), IdCntV2(ValV2.Len(), 0);
00374   for (int i = 0; i < ValV1.Len(); i++) {
00375     IdCntV1.Add(TFltKd(double(ValV1[i].Val1), double(ValV1[i].Val2))); }
00376   for (int i = 0; i < ValV2.Len(); i++) {
00377     IdCntV2.Add(TFltKd(double(ValV2[i].Val1), double(ValV2[i].Val2))); }
00378   if (IdCntV1.Empty() || IdCntV2.Empty()) { printf("*** Empty plot %s\n", OutFNmPref.CStr());  return; }
00379   IdCntV1.Sort();
00380   IdCntV2.Sort();
00381   TGnuPlot GP(OutFNmPref, Desc);
00382   GP.SetXYLabel(XLabel, YLabel);
00383   GP.SetScale(ScaleTy);
00384   { const int Id = GP.AddPlot(IdCntV1, SeriesTy, Name1);
00385   if (PowerFit) { 
00386     GP.AddPwrFit3(Id);
00387     double MaxY = IdCntV1.Last().Dat, MinY = IdCntV1[0].Dat;
00388     if (MaxY < MinY) { Swap(MaxY, MinY); }
00389     GP.AddCmd(TStr::Fmt("set yrange[%f:]", MinY));
00390   } }
00391   { const int Id = GP.AddPlot(IdCntV2, SeriesTy, Name2);
00392   if (PowerFit) { 
00393     GP.AddPwrFit3(Id);
00394     double MaxY = IdCntV2.Last().Dat, MinY = IdCntV2[0].Dat;
00395     if (MaxY < MinY) { Swap(MaxY, MinY); }
00396     GP.AddCmd(TStr::Fmt("set yrange[%f:]", MinY));
00397   } }
00398   GP.SavePng();
00399 }
00400 
00401            
00402 
00403 template <class TVal1>
00404 void TGnuPlot::PlotValV(const TVec<TVal1>& ValV, const TStr& OutFNmPref, const TStr& Desc,
00405  const TStr& XLabel, const TStr& YLabel, const TGpScaleTy& ScaleTy, const bool& PowerFit, const TGpSeriesTy& SeriesTy) {
00406   TFltKdV IdCntV(ValV.Len(), 0);
00407   for (int i = 0; i < ValV.Len(); i++) {
00408     IdCntV.Add(TFltKd(double(i+1), double(ValV[i]))); }
00409   if (IdCntV.Empty()) { printf("*** Empty plot %s\n", OutFNmPref.CStr());  return; }
00410   IdCntV.Sort();
00411   TGnuPlot GP(OutFNmPref, Desc);
00412   GP.SetXYLabel(XLabel, YLabel);
00413   GP.SetScale(ScaleTy);
00414   const int Id = GP.AddPlot(IdCntV, SeriesTy);
00415   if (PowerFit) { 
00416     GP.AddPwrFit3(Id);
00417     double MaxY = IdCntV.Last().Dat, MinY = IdCntV[0].Dat;
00418     if (MaxY < MinY) { Swap(MaxY, MinY); }
00419     //GP.SetYRange(MinY, pow(10.0, floor(log10(MaxY))+1.0));
00420     GP.AddCmd(TStr::Fmt("set yrange[%f:]", MinY));
00421   }
00422   GP.SavePng();
00423 }
00424 
00425 template <class TVal1>
00426 void TGnuPlot::PlotValMomH(const THash<TVal1, TMom>& ValMomH, const TStr& OutFNmPref, const TStr& Desc,
00427  const TStr& XLabel, const TStr& YLabel, const TGpScaleTy& ScaleTy, const TGpSeriesTy& SeriesTy,
00428  bool PlotAvg, bool PlotMed, bool PlotMin, bool PlotMax, bool PlotSDev, bool PlotStdErr, bool PlotScatter) {
00429   TFltTrV AvgV, StdErrV;
00430   TFltPrV AvgV2, MedV, MinV, MaxV;
00431   TFltPrV ScatterV;
00432   for (int i = ValMomH.FFirstKeyId(); ValMomH.FNextKeyId(i); ) {
00433     TMom Mom(ValMomH[i]);
00434     if (! Mom.IsDef()) { Mom.Def(); }
00435     const double x = ValMomH.GetKey(i);
00436     if (PlotAvg) { 
00437       if (PlotSDev) { 
00438         AvgV.Add(TFltTr(x, Mom.GetMean(), Mom.GetSDev())); } // std deviation
00439       else { 
00440         AvgV2.Add(TFltPr(x, Mom.GetMean())); 
00441       }
00442       if (PlotStdErr) {
00443         StdErrV.Add(TFltTr(x, Mom.GetMean(), Mom.GetSDev()/sqrt((double)Mom.GetVals()))); 
00444       }
00445     }
00446     if (PlotMed) { MedV.Add(TFltPr(x, Mom.GetMedian())); }
00447     if (PlotMin) { MinV.Add(TFltPr(x, Mom.GetMn())); }
00448     if (PlotMax) { MaxV.Add(TFltPr(x, Mom.GetMx())); }
00449     if (PlotScatter) {
00450       THashSet<TFlt> PointSet;
00451       for (int xi = 0; xi < ValMomH[i].GetVals(); xi++) {
00452         PointSet.AddKey(ValMomH[i].GetVal(xi)); }
00453         //ScatterV.Add(TFltPr(x, ValMomH[i].GetVal(xi)));  }
00454       for (int xi = 0; xi < PointSet.Len(); xi++) {
00455         ScatterV.Add(TFltPr(x, PointSet[xi]));  }
00456       //printf("S%d %d %d.", ValMomH[i].GetVals(), PointSet.Len(), ScatterV.Len());
00457     }
00458   }
00459   AvgV.Sort();  AvgV2.Sort();
00460   MedV.Sort();  MinV.Sort();  MaxV.Sort();  StdErrV.Sort();
00461   TGnuPlot GP(OutFNmPref, Desc);
00462   GP.SetScale(ScaleTy);
00463   GP.SetXYLabel(XLabel, YLabel);
00464   if (! ScatterV.Empty()) { GP.AddPlot(ScatterV, gpwPoints, "Scatter"); }
00465   if (! AvgV.Empty()) { GP.AddErrBar(AvgV, "Average", "StdDev"); }
00466   if (! AvgV2.Empty()) { GP.AddPlot(AvgV2, SeriesTy, "Average"); }
00467   if (! MedV.Empty()) { GP.AddPlot(MedV, SeriesTy, "Median"); }
00468   if (! MinV.Empty()) { GP.AddPlot(MinV, SeriesTy, "Min"); }
00469   if (! MaxV.Empty()) { GP.AddPlot(MaxV, SeriesTy, "Max"); }
00470   if (! StdErrV.Empty()) { GP.AddErrBar(StdErrV, "Standard error"); }
00471   GP.SavePng();
00472 }
00473 
00474 #endif
00475