Index: trunk/FACT++/src/ratescan.cc
===================================================================
--- trunk/FACT++/src/ratescan.cc	(revision 12236)
+++ trunk/FACT++/src/ratescan.cc	(revision 12237)
@@ -81,4 +81,14 @@
     float fResolution;
 
+    enum reference_t
+    {
+        kCamera,
+        kBoard,
+        kPatch
+    };
+
+    reference_t fReference;
+    uint16_t    fReferenceIdx;
+
     pair<Time, int> GetNewState(DimStampedInfo &info) const
     {
@@ -153,7 +163,17 @@
                 fTriggersPatch[i] += sdata.fPatchRate[i];
 
-            if (sqrt(fTriggers)>fResolution*fTriggers && fSeconds<fSecondsMax)
+            double reference = fTriggers;
+            if (fReference==kBoard)
+                reference = fTriggersBoard[fReferenceIdx];
+            if (fReference==kPatch)
+                reference = fTriggersPatch[fReferenceIdx];
+
+            if (sqrt(reference)>fResolution*reference && fSeconds<fSecondsMax)
             {
-                cout << "Triggers so far: " << fTriggers << " (" << sqrt(fTriggers)/fTriggers << ")" << endl;
+                ostringstream out;
+                out << "Triggers so far: " << fTriggers;
+                if (reference>0)
+                    out << " (" << sqrt(reference)/reference << ")";
+                Info(out);
                 return;
             }
@@ -170,5 +190,5 @@
             sout3 << float(sdata.fOnTimeCounter-fOnTimeStart)/fSeconds/1000000;
 
-            cout << sout1.str() << sout3.str() << endl;
+            Info(sout1.str()+sout3.str());
 
 
@@ -220,4 +240,16 @@
     int StartRateScan()
     {
+        ofstream fout("ratescan.txt", ios::app);
+        fout << "# ----- " << Time() << " -----" << endl;
+        fout << "# Reference: ";
+        switch (fReference)
+        {
+        case kCamera: fout << "Camera";
+        case kBoard:  fout << "Board #" << fReferenceIdx;
+        case kPatch:  fout << "Patch #" << fReferenceIdx;
+        }
+        fout << '\n';
+        fout << "# -----" << endl;
+
         Dim::SendCommand("FAD_CONTROL/SET_FILE_FORMAT", uint16_t(0));
 
@@ -241,7 +273,48 @@
         //if (fStatusFTM.second==FTM::kTakingData)
 	{
-            Message("Stopping FTM");
+            //Message("Stopping FTM");
 	    //Dim::SendCommand("FTM_CONTROL/STOP_RUN");
         }
+
+        return GetCurrentState();
+    }
+
+    int SetReferenceCamera()
+    {
+        fReference = kCamera;
+
+        return GetCurrentState();
+    }
+
+    int SetReferenceBoard(const EventImp &evt)
+    {
+        if (!CheckEventSize(evt.GetSize(), "SetReferenceBoard", 4))
+            return kSM_FatalError;
+
+        if (evt.GetUInt()>39)
+        {
+            Error("SetReferenceBoard - Board index out of range [0;39]");
+            return GetCurrentState();
+        }
+
+        fReference    = kBoard;
+        fReferenceIdx = evt.GetUInt();
+
+        return GetCurrentState();
+    }
+
+    int SetReferencePatch(const EventImp &evt)
+    {
+        if (!CheckEventSize(evt.GetSize(), "SetReferencePatch", 4))
+            return kSM_FatalError;
+
+        if (evt.GetUInt()>159)
+        {
+            Error("SetReferencePatch - Patch index out of range [0;159]");
+            return GetCurrentState();
+        }
+
+        fReference    = kPatch;
+        fReferenceIdx = evt.GetUInt();
 
         return GetCurrentState();
@@ -309,4 +382,15 @@
             (bind(&StateMachineRateScan::StopRateScan, this))
             ("");
+
+        AddEvent("SET_REFERENCE_CAMERA", kStateDimNetworkNA, kStateDisconnected, kStateConnected)
+            (bind(&StateMachineRateScan::SetReferenceCamera, this))
+            ("");
+        AddEvent("SET_REFERENCE_BOARD", "I:1", kStateDimNetworkNA, kStateDisconnected, kStateConnected)
+            (bind(&StateMachineRateScan::SetReferenceBoard, this, placeholders::_1))
+            ("");
+        AddEvent("SET_REFERENCE_PATCH", "I:1", kStateDimNetworkNA, kStateDisconnected, kStateConnected)
+            (bind(&StateMachineRateScan::SetReferenceBoard, this, placeholders::_1))
+            ("");
+
 /*
         AddEvent("ENABLE_OUTPUT", "B:1")//, kStateIdle)
