#include "HornModule.h"

#include "StripHist.h"

#include <JobControl/JobCModuleRegistry.h>
#include <JobControl/JobCResult.h>
#include <MessageService/MsgService.h>

#include <RawData/RawRecord.h>
#include <RawData/RawBeamMonBlock.h>
#include <RawData/RawBeamData.h>

#include <DataUtil/GetRecords.h>

#include <Conventions/Munits.h>

#include <TGraph.h>
#include <TCanvas.h>
#include <TH1F.h>
#include <TStyle.h>

#include <vector>

//ClassImp(HornModule)

using namespace std;

CVSID("$Id: HornModule.cxx,v 1.5 2005/06/01 17:01:47 thosieck Exp $");
JOBMODULE(HornModule,"MonHorn","Horn related histogramming for Monitoring");

static const char* get_name(int ind)
{
    const char* names[] = {
	"Total Horn Current",
	"Quadrant 1 Horn Current",
	"Quadrant 2 Horn Current",
	"Quadrant 3 Horn Current",
	"Quadrant 4 Horn Current",
	0
    };
    if (ind < 0 || ind > 4) return 0;
    return names[ind];
}
HornModule::HornModule()
{

    for (int ind=0; ind <5; ++ind) {

	StripHist* sh = 0;

	int max = 50;
	if (!ind) max = 200;
	sh = new StripHist(get_name(ind), get_name(ind), 2*max,-1.0*max,1.0*max);
	fStripHist[get_name(ind)] = sh;
	sh->SetStripRange(1*Munits::day);
	sh->GetHist().SetXTitle("Current (kAmp)");
	//sh->GetStrip().GetHistogram()->SetYTitle("Current (kAmp)");
    }
}
HornModule::~HornModule()
{
}

typedef std::map<std::string,StripHist*>  StripHistMap;
void HornModule::BeginJob()
{
    HistMan hm = this->GetHistMan();
    StripHistMap::iterator mit, done=fStripHist.end();
    for (mit=fStripHist.begin(); mit != done; ++mit) {
	StripHist* sh = mit->second;
	TCanvas* canvas = new TCanvas(mit->first.c_str(),sh->GetHist().GetTitle(),500,400);
	sh->Draw("AL");
	hm.Adopt("Horn",canvas);
    }
}

void HornModule::Fill(const RawBeamMonHeaderBlock& /*head*/, const RawBeamMonBlock& block)
{
    char dev[16] = "E:NSLIN ";
    double dae = 0, total = 0;
    for (int ind=4; ind>0; --ind) {
	dev[7] = 'A' + ind -1;	// Assume ASCII
	const RawBeamData* hc = block[dev];

	if (!(hc && hc->GetDataLength())) {
	    MSG("BD",Msg::kDebug)
		<< "No " << dev << " in the data\n";
	    continue;
	}

	StripHist* sh = fStripHist[get_name(ind)];

	double val = hc->GetData()[0];
	dae = hc->GetSeconds() + 1.0e-6*hc->GetMsecs();
	sh->Fill(dae,val);
	total += val;
    }
    fStripHist[get_name(0)]->Fill(dae,total);
}

