#include "BDScalar.h"
#include <RawData/RawBeamMonBlock.h>
#include <RawData/RawBeamData.h>

#include "MessageService/MsgService.h"
CVSID("$Id: BDScalar.cxx,v 1.3 2005/04/27 17:36:10 minoscvs Exp $");

BDScalar::BDScalar(float max_dev, int nspills, const char* device_name)
    : fMaxDev(max_dev), fDeviceName(device_name)
{
    this->SetSpillQueueSize(nspills);
}
BDScalar::~BDScalar()
{
}

void BDScalar::SetDevice(const char* device_name)
{
    fDeviceName = device_name;
}

void BDScalar::SetSpill(const RawBeamMonHeaderBlock& rbmhb,
			const RawBeamMonBlock& rbmb)
{
    double value = this->GetScalar(rbmhb,rbmb);
    fBeamChanged = false;
    if (fPastSpills.SampleDeviation(value) > fMaxDev)
	fBeamChanged = true;
    
    fPastSpills.Add(value);
    
}

bool BDScalar::BeamChanged()
{
    return fBeamChanged;
}


void BDScalar::SetSpillQueueSize(int nspills)
{
    fPastSpills.SetSampleSize(nspills);
}

void BDScalar::SetAllowedSpillDeviation(float max_dev)
{
    fMaxDev = max_dev;
}

double BDScalar::GetValue() const
{
    return fPastSpills.LastSample();
}

double BDScalar::GetScalar(const RawBeamMonHeaderBlock& ,
			   const RawBeamMonBlock& rbmb)
{
    if (!fDeviceName) return 0.0;

    const RawBeamData* dev = rbmb[fDeviceName];
    double value = 0;
    if (!dev) {
	MSG("BD",Msg::kWarning)
	<< "No "<<fDeviceName<<" in the data\n";
    }
    else if (! dev->GetDataLength()) {
	MSG("BD",Msg::kWarning)
	    << fDeviceName<<" exists but w/out data\n";
    }
    else value = dev->GetData()[0];
    
    return value;
}

