Index: trunk/FACT++/src/ratescan.cc
===================================================================
--- trunk/FACT++/src/ratescan.cc	(revision 12291)
+++ trunk/FACT++/src/ratescan.cc	(revision 12294)
@@ -65,4 +65,6 @@
     DimStampedInfo fRates;
 
+    DimDescribedService fDimData;
+
     int fCounter;
     int fSeconds;
@@ -73,10 +75,9 @@
     int fThresholdStep;
 
-    uint64_t fTriggers;
-    uint64_t fTriggersBoard[40];
-    uint64_t fTriggersPatch[160];
-
-    float fElapsedTime;
-    float fOnTime;
+    double fRate;
+    double fRateBoard[40];
+    double fRatePatch[160];
+
+    double fOnTime;
 
     float fResolution;
@@ -151,37 +152,34 @@
             if (fSeconds==0)
             {
-                fTriggers = 0;
-
-                memset(fTriggersBoard, 0,  40*sizeof(uint64_t));
-                memset(fTriggersPatch, 0, 160*sizeof(uint64_t));
+                fRate = 0;
+
+                memset(fRateBoard, 0,  40*sizeof(double));
+                memset(fRatePatch, 0, 160*sizeof(double));
 
                 fOnTime = 0;
-                fElapsedTime = 0;
                 return;
             }
 
-            fTriggers += sdata.fTriggerRate;
+            fRate += sdata.fTriggerRate;
             for (int i=0; i<40; i++)
-                fTriggersBoard[i] += sdata.fBoardRate[i];
-            for (int i=0; i<40; i++)
-                fTriggersPatch[i] += sdata.fPatchRate[i];
-
-            double reference = fTriggers;
+                fRateBoard[i] += sdata.fBoardRate[i];
+            for (int i=0; i<160; i++)
+                fRatePatch[i] += sdata.fPatchRate[i];
+
+            double reference = fRate;
             if (fReference==kBoard)
-                reference = fTriggersBoard[fReferenceIdx];
+                reference = fRateBoard[fReferenceIdx];
             if (fReference==kPatch)
-                reference = fTriggersPatch[fReferenceIdx];
-
-            fOnTime      += sdata.fOnTime;
-            fElapsedTime += sdata.fElapsedTime;
-
-            reference *= fElapsedTime*10;
-
-            cout << fElapsedTime << " " << fOnTime << endl;
+                reference = fRatePatch[fReferenceIdx];
+
+            fOnTime += sdata.fOnTime;
+
+            // FIXME:
+            reference *= sdata.fElapsedTime;
 
             if ((reference==0 || sqrt(reference)>fResolution*reference) && fSeconds<fSecondsMax)
             {
                 ostringstream out;
-                out << "Triggers so far: " << fTriggers;
+                out << "Triggers so far: " << reference;
                 if (reference>0)
                     out << " (" << sqrt(reference)/reference << ")";
@@ -191,20 +189,35 @@
             }
 
+            const double   time = sdata.fElapsedTime*fSeconds;
+            const uint32_t th   = fThresholdMin+fCounter*fThresholdStep;
+
+            float data[3+1+40+160];
+            memcpy(data, &th, 4);
+            data[1] = time;         // total elapsed time
+            data[2] = fOnTime/time; // relative on time
+            data[3] = fRate/fSeconds;
+            for (int i=0; i<40; i++)
+                data[i+4] = fRateBoard[i]/fSeconds;
+            for (int i=0; i<160; i++)
+                data[i+4] = fRatePatch[i]/fSeconds;
+
             ostringstream sout1, sout2, sout3;
 
-            sout1 << fThresholdMin+fCounter*fThresholdStep << " ";
-            sout1 << float(fTriggers)/fSeconds << " ";
+            sout1 << th << " ";
+            sout1 << data[3] << " ";
             for (int i=0; i<40; i++)
-                sout2 << float(fTriggersBoard[i])/fSeconds << " ";
+                sout2 << data[i+4] << " ";
             for (int i=0; i<160; i++)
-                sout2 << float(fTriggersPatch[i])/fSeconds << " ";
-            sout3 << fElapsedTime << " " << fOnTime;
+                sout2 << data[i+44] << " ";
+            sout3 << data[1] << " " << data[2];
 
             Info(sout1.str());
-
 
             ofstream fout("ratescan.txt", ios::app);
             fout << sout1.str() << sout2.str() << sout3.str() << endl;
 
+            fDimData.setQuality(fCommand=="FTM_CONTROL/SET_THRESHOLD");
+            fDimData.setData(data, 204*sizeof(float));
+            fDimData.Update();
 
             fCounter++;
@@ -228,6 +241,6 @@
             fSeconds = -2;  // FIXME: In principle one missed report is enough
 
-            const int32_t data[2] = { -1, fThresholdMin+fCounter*fThresholdStep };
-            DimClient::sendCommandNB(fCommand.c_str(), (void*)data, 8);
+            const int32_t cmd[2] = { -1, fThresholdMin+fCounter*fThresholdStep };
+            DimClient::sendCommandNB(fCommand.c_str(), (void*)cmd, 8);
         }
     }
@@ -388,4 +401,5 @@
         fFTM("FTM_CONTROL/STATE",       (void*)NULL, 0, this),
         fRates("FTM_CONTROL/TRIGGER_RATES", (void*)NULL, 0, this),
+        fDimData("RATE_SCAN/DATA", "I:1;F:1;F:1;F:1;F:40;F:160", ""),
         fCounter(-1), fReference(kCamera), fReferenceIdx(0)
     {
