Index: /trunk/FACT++/gui/FactGui.h
===================================================================
--- /trunk/FACT++/gui/FactGui.h	(revision 12294)
+++ /trunk/FACT++/gui/FactGui.h	(revision 12295)
@@ -430,4 +430,6 @@
     DimStampedInfo fDimFeedbackReference;
 
+    DimStampedInfo fDimRateScan;
+
     map<string, DimInfo*> fServices;
 
@@ -1997,4 +1999,6 @@
         }
 
+        const bool b = fBoardRatesEnabled->isChecked();
+
         valarray<double> dat(0., 1440);
 
@@ -2003,8 +2007,5 @@
         {
             const int ihw = fPixelMap.index(i).hw()/9;
-            dat[i] = sdata.fPatchRate[ihw];
-
-            // Was this meant for something?
-            //fRatesCanv->SetEnable(ihw, fFtuStatus[ihw/4]);
+            dat[i] = b ? sdata.fBoardRate[ihw/4] : sdata.fPatchRate[ihw];
         }
 
@@ -2014,4 +2015,9 @@
 
     int64_t fTimeStamp0;
+
+    void on_fBoardRatesEnabled_toggled(bool)
+    {
+        UpdateRatesCam(fTriggerRates);
+    }
 
     void UpdateRatesGraphs(const FTM::DimTriggerRates &sdata)
@@ -2158,4 +2164,7 @@
             fGraphBoardRate[fRateBoard2->value()].Draw("PL");
         }
+
+        c->Modified();
+        c->Update();
 #endif
     }
@@ -2602,4 +2611,97 @@
     }
 
+    // ======================= Rate Scan ====================================
+
+    TGraph fGraphRateScan[201];
+
+    void UpdateRateScan(uint32_t th, const float *rates)
+    {
+#ifdef HAVE_ROOT
+        TCanvas *c = fRateScanCanv->GetCanvas();
+
+        TH1 *h = (TH1*)c->FindObject("Frame");
+
+        if (fGraphRateScan[0].GetN()==0 || th<=fGraphRateScan[0].GetX()[0])
+        {
+            for (int i=0; i<201; i++)
+                fGraphRateScan[i].Set(0);
+
+            h->SetBins(1, th-10, th+10);
+            h->SetMinimum(1);
+            h->SetMaximum(rates[0]*2);
+
+            c->SetGrid();
+            c->SetLogy();
+
+            for (int i=0; i<201; i++)
+                fGraphRateScan[i].SetPoint(fGraphRateScan[i].GetN(), th, rates[i]);
+
+            c->Modified();
+            c->Update();
+            return;
+        }
+
+        const double dac = h->GetXaxis()->GetXmin();
+        h->SetBins(h->GetNbinsX()+1, dac, th+10);
+
+        for (int i=0; i<201; i++)
+            fGraphRateScan[i].SetPoint(fGraphRateScan[i].GetN(), th, rates[i]);
+
+        c->Modified();
+        c->Update();
+#endif
+    }
+
+    void DisplayRateScan()
+    {
+#ifdef HAVE_ROOT
+        TCanvas *c = fRateScanCanv->GetCanvas();
+
+        while (c->FindObject("PatchRate"))
+            c->GetListOfPrimitives()->Remove(c->FindObject("PatchRate"));
+
+        while (c->FindObject("BoardRate"))
+            c->GetListOfPrimitives()->Remove(c->FindObject("BoardRate"));
+
+        c->cd();
+
+        if (fRateScanPatch1->value()>=0)
+        {
+            fGraphRateScan[fRateScanPatch1->value()+41].SetLineColor(kRed);
+            fGraphRateScan[fRateScanPatch1->value()+41].SetMarkerColor(kRed);
+            fGraphRateScan[fRateScanPatch1->value()+41].Draw("PL");
+        }
+        if (fRateScanPatch2->value()>=0)
+        {
+            fGraphRateScan[fRateScanPatch2->value()+41].SetLineColor(kGreen);
+            fGraphRateScan[fRateScanPatch2->value()+41].SetMarkerColor(kGreen);
+            fGraphRateScan[fRateScanPatch2->value()+41].Draw("PL");
+        }
+        if (fRateScanBoard1->value()>=0)
+        {
+            fGraphRateScan[fRateScanBoard1->value()+1].SetLineColor(kMagenta);
+            fGraphRateScan[fRateScanBoard1->value()+1].SetMarkerColor(kMagenta);
+            fGraphRateScan[fRateScanBoard1->value()+1].Draw("PL");
+        }
+        if (fRateScanBoard2->value()>=0)
+        {
+            fGraphRateScan[fRateScanBoard2->value()+1].SetLineColor(kCyan);
+            fGraphRateScan[fRateScanBoard2->value()+1].SetMarkerColor(kCyan);
+            fGraphRateScan[fRateScanBoard2->value()+1].Draw("PL");
+        }
+
+        c->Modified();
+        c->Update();
+#endif
+    }
+
+    void handleRateScan(const DimData &d)
+    {
+        if (!CheckSize(d, 204*sizeof(float)))
+            return;
+
+        UpdateRateScan(d.get<uint32_t>(), d.ptr<float>(12));
+    }
+
     // ========================== FSC =======================================
 
@@ -3193,4 +3295,7 @@
         if (getInfo()==&fDimFeedbackDeviation)
             return PostInfoHandler(&FactGui::handleFeedbackDeviation);
+
+        if (getInfo()==&fDimRateScan)
+            return PostInfoHandler(&FactGui::handleRateScan);
 
 //        if (getInfo()==&fDimFadFiles)
@@ -3760,4 +3865,6 @@
         fDimFeedbackReference  ("FEEDBACK/REFERENCE",             (void*)NULL, 0, this),
         //-
+        fDimRateScan           ("RATE_SCAN/DATA",                 (void*)NULL, 0, this),
+        //-
         fEventData(0), fDrsCalibration(1440*1024*6),
 	fTimeStamp0(0)
@@ -3972,4 +4079,46 @@
 
         fGraphFeedbackCmd.Draw("LP");
+
+        // --------------------------------------------------------------------------
+
+        c = fRateScanCanv->GetCanvas();
+        //c->SetBit(TCanvas::kNoContextMenu);
+        c->SetBorderMode(0);
+        c->SetFrameBorderMode(0);
+        c->SetFillColor(kWhite);
+        c->SetRightMargin(0.03);
+        c->SetTopMargin(0.03);
+        c->SetGrid();
+        c->cd();
+
+        TH1F *h=new TH1F("Frame", "", 1, 0, 1);
+        h->SetDirectory(0);
+        h->SetBit(kCanDelete);
+        h->SetStats(kFALSE);
+        h->SetXTitle("Threshold [DAC]");
+        h->SetYTitle("Rate [Hz]");
+        h->GetXaxis()->CenterTitle();
+	h->GetYaxis()->CenterTitle();
+	h->GetXaxis()->SetLabelSize(0.025);
+	h->GetYaxis()->SetLabelSize(0.025);
+        h->GetYaxis()->SetTitleOffset(1.2);
+        h->Draw();
+
+        fGraphRateScan[0].SetName("CameraRate");
+        for (int i=0; i<40; i++)
+        {
+            fGraphRateScan[i+1].SetName("BoardRate");
+            fGraphRateScan[i+1].SetMarkerStyle(kFullDotMedium);
+        }
+        for (int i=0; i<160; i++)
+        {
+            fGraphRateScan[i+41].SetName("PatchRate");
+            fGraphRateScan[i+41].SetMarkerStyle(kFullDotMedium);
+        }
+
+        fGraphRateScan[0].SetLineColor(kBlue);
+        fGraphRateScan[0].SetMarkerColor(kBlue);
+        fGraphRateScan[0].SetMarkerStyle(kFullDotSmall);
+        fGraphRateScan[0].Draw("LP");
 
         // --------------------------------------------------------------------------
