/* This file is part of MAUS: http://micewww.pp.rl.ac.uk:8080/projects/maus
*
* MAUS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MAUS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MAUS. If not, see .
*
*/
#include "src/input/InputCppDAQData/UnpackEventLib.hh"
namespace MAUS {
int V1290DataProcessor::Process(MDdataContainer* aPartEventPtr) {
// Cast the argument to structure it points to.
// This process should be called only with MDfragmentV1290 argument
if ( typeid(*aPartEventPtr) != typeid(MDpartEventV1290) ) return CastError;
MDpartEventV1290* xV1290Evnt = static_cast(aPartEventPtr);
Json::Value pBoardDoc;
Json::Value pTdcHit;
string xDetector = "unknown";
if ( !xV1290Evnt->IsValid() )
return GenericError;
int xLdc, xGeo, xEquip, xPartEv;
// Put static data into the Json
pBoardDoc["ldc_id"] = xLdc = this->GetLdcId();
pBoardDoc["equip_type"] = xEquip = this->GetEquipmentType();
pBoardDoc["time_stamp"] = this->GetTimeStamp();
pBoardDoc["phys_event_number"] = this->GetPhysEventNumber();
pBoardDoc["part_event_number"] = xPartEv = this->GetPartEventNumber();
pBoardDoc["geo"] = xGeo = xV1290Evnt->GetGeo();
pBoardDoc["trigger_time_tag"] = xV1290Evnt->GetTriggerTimeTag();
// Loop over all the channels
for (unsigned int xCh = 0; xCh < V1290_NCHANNELS; xCh++) {
pTdcHit = pBoardDoc;
// Get the number of leading edge hits.
int xHitsL = xV1290Evnt->GetNHits(xCh, 'l');
// Get the number of trailing edge hits.
int xHitsT = xV1290Evnt->GetNHits(xCh, 't');
// By definition the number of the leading edge hits has to be equal
// to the number of the trailing edge hits but some times this is not true
int xMaxHits = MAX(xHitsL, xHitsT);
// Loop over all leading and trailing hits in this channel.
int xLT, xTT; // Lead and Trail times
for (int j = 0; j < xMaxHits; j++) {
if (j < xHitsL) {
xLT = xV1290Evnt->GetHitMeasurement(j, // Hit ID
xCh, // Channel ID
'l');
} else {
// If no leading edge hit set the value og time to -99.
xLT = -99;
}
if (j < xHitsT) {
xTT = xV1290Evnt->GetHitMeasurement(j, // Hit ID
xCh, // Channel ID
't');
} else {
// If no trailing edge hit set the value og time to -99.
xTT = -99;
}
int xBunchID = xV1290Evnt->GetBunchID(xCh/8);
Json::Value xTdcHit;
pTdcHit["bunch_id"] = xBunchID;
pTdcHit["channel"] = xCh;
pTdcHit["leading_time"] = xLT;
pTdcHit["trailing_time"] = xTT;
DAQChannelKey* xKey = _chMap->find(xLdc, xGeo, xCh, xEquip);
if (xKey) {
pTdcHit["channel_key"] = xKey->str();
xDetector = xKey->detector();
pTdcHit["detector"] = xDetector;
} else {
pTdcHit["detector"] = xDetector = "unknown";
}
( *_docSpill )[xDetector][ xPartEv ][_equipment.c_str()].append(pTdcHit);
}
}
return OK;
}
int V1290CppDataProcessor::Process(MDdataContainer* aPartEventPtr) {
/**
* Cast the argument to structure it points to.
* This process should be called only with MDfragmentV1290 argument.
*/
if ( typeid(*aPartEventPtr) != typeid(MDpartEventV1290) ) return CastError;
MDpartEventV1290* xV1290Evnt = static_cast(aPartEventPtr);
// xV1290Evnt->Dump();
// string xDetector = "emr";
if ( !xV1290Evnt->IsValid() )
return GenericError;
unsigned int xPartEv = this->GetPartEventNumber();
// cerr << "This is V1290CppDataProcessor::Process " << xPartEv << endl;
if (xPartEv+1 > _tof0_spill.size()) {
_tof0_spill.resize(xPartEv+1);
_tof1_spill.resize(xPartEv+1);
_tof2_spill.resize(xPartEv+1);
_tr_spill.resize(xPartEv+1);
_tr_req_spill.resize(xPartEv+1);
_unknown_spill.resize(xPartEv+1);
}
// Put static data into the Data Structure.
MAUS::V1290 xV1290hit;
int xLdc, xGeo, xEquip;
// Put static data
xV1290hit.SetLdcId(xLdc = this->GetLdcId());
xV1290hit.SetEquipType(xEquip = this->GetEquipmentType());
xV1290hit.SetTimeStamp(this->GetTimeStamp());
xV1290hit.SetPhysEventNumber(this->GetPhysEventNumber());
xV1290hit.SetPartEventNumber(xPartEv);
xV1290hit.SetGeo(xGeo = xV1290Evnt->GetGeo());
xV1290hit.SetTriggerTimeTag(xV1290Evnt->GetTriggerTimeTag());
// Loop over all the channels
for (unsigned int xCh = 0; xCh < V1290_NCHANNELS; xCh++) {
// Get the number of leading edge hits.
int xHitsL = xV1290Evnt->GetNHits(xCh, 'l');
// Get the number of trailing edge hits.
int xHitsT = xV1290Evnt->GetNHits(xCh, 't');
// By definition the number of the leading edge hits has to be equal
// to the number of the trailing edge hits but some times this is not true
int xMaxHits = MAX(xHitsL, xHitsT);
// Loop over all leading and trailing hits in this channel.
int xLT, xTT; // Lead and Trail times
for (int j = 0; j < xMaxHits; j++) {
if (j < xHitsL) {
xLT = xV1290Evnt->GetHitMeasurement(j, // Hit ID
xCh, // Channel ID
'l');
} else {
// If no leading edge hit set the value og time to -99.
xLT = -99;
}
if (j < xHitsT) {
xTT = xV1290Evnt->GetHitMeasurement(j, // Hit ID
xCh, // Channel ID
't');
} else {
// If no trailing edge hit set the value og time to -99.
xTT = -99;
}
int xBunchID = xV1290Evnt->GetBunchID(xCh/8);
xV1290hit.SetBunchId(xBunchID);
xV1290hit.SetChannel(xCh);
xV1290hit.SetLeadingTime(xLT);
xV1290hit.SetTrailingTime(xTT);
string xDetector;
DAQChannelKey* xKey = _chMap->find(xLdc, xGeo, xCh, xEquip);
if (xKey) {
xV1290hit.SetChannelKey(xKey->str());
xDetector = xKey->detector();
} else {
xV1290hit.SetChannelKey("unknown");
xDetector = "unknown";
}
xV1290hit.SetDetector(xDetector);
if (xDetector == "tof0")
_tof0_spill[xPartEv].push_back(xV1290hit);
else if (xDetector == "tof1")
_tof1_spill[xPartEv].push_back(xV1290hit);
else if (xDetector == "tof2")
_tof2_spill[xPartEv].push_back(xV1290hit);
else if (xDetector == "trigger")
_tr_spill[xPartEv].push_back(xV1290hit);
else if (xDetector == "trigger_request")
_tr_req_spill[xPartEv].push_back(xV1290hit);
else
_unknown_spill[xPartEv].push_back(xV1290hit);
}
}
return OK;
}
void V1290CppDataProcessor::fill_daq_data() {
unsigned int npe = _tof1_spill.size();
if (_daq_data->GetTOF0DaqArraySize() != npe)
_daq_data->GetTOF0DaqArrayPtr()->resize(npe);
if (_daq_data->GetTOF1DaqArraySize() != npe)
_daq_data->GetTOF1DaqArrayPtr()->resize(npe);
if (_daq_data->GetTOF2DaqArraySize() != npe)
_daq_data->GetTOF2DaqArrayPtr()->resize(npe);
if (_daq_data->GetTriggerRequestArraySize() != npe)
_daq_data->GetTriggerRequestArrayPtr()->resize(npe);
if (_daq_data->GetTriggerArraySize() != npe)
_daq_data->GetTriggerArrayPtr()->resize(npe);
if (_daq_data->GetUnknownArraySize() != npe)
_daq_data->GetUnknownArrayPtr()->resize(npe);
for (unsigned int ipe = 0; ipe < npe; ipe++) {
MAUS::TOFDaq *tof0_daq = _daq_data->GetTOF0DaqArrayElement(ipe);
if (!tof0_daq)
(*_daq_data->GetTOF0DaqArrayPtr())[ipe] = new MAUS::TOFDaq;
_daq_data->GetTOF0DaqArrayElement(ipe)->SetV1290Array(_tof0_spill[ipe]);
MAUS::TOFDaq *tof1_daq = _daq_data->GetTOF1DaqArrayElement(ipe);
if (!tof1_daq)
(*_daq_data->GetTOF1DaqArrayPtr())[ipe] = new MAUS::TOFDaq;
_daq_data->GetTOF1DaqArrayElement(ipe)->SetV1290Array(_tof1_spill[ipe]);
MAUS::TOFDaq *tof2_daq = _daq_data->GetTOF2DaqArrayElement(ipe);
if (!tof2_daq)
(*_daq_data->GetTOF2DaqArrayPtr())[ipe] = new MAUS::TOFDaq;
_daq_data->GetTOF2DaqArrayElement(ipe)->SetV1290Array(_tof2_spill[ipe]);
MAUS::Trigger *tr_daq = _daq_data->GetTriggerArrayElement(ipe);
if (!tr_daq)
(*_daq_data->GetTriggerArrayPtr())[ipe] = new MAUS::Trigger;
_daq_data->GetTriggerArrayElement(ipe)->SetV1290Array(_tr_spill[ipe]);
MAUS::TriggerRequest *tr_req_daq = _daq_data->GetTriggerRequestArrayElement(ipe);
if (!tr_req_daq)
(*_daq_data->GetTriggerRequestArrayPtr())[ipe] = new MAUS::TriggerRequest;
_daq_data->GetTriggerRequestArrayElement(ipe)->SetV1290Array(_tr_req_spill[ipe]);
MAUS::Unknown *unknown = _daq_data->GetUnknownArrayElement(ipe);
if (!unknown)
(*_daq_data->GetUnknownArrayPtr())[ipe] = new MAUS::Unknown;
_daq_data->GetUnknownArrayElement(ipe)->SetV1290Array(_unknown_spill[ipe]);
}
}
void V1290CppDataProcessor::reset() {
_tof0_spill.clear();
_tof1_spill.clear();
_tof2_spill.clear();
_tr_spill.clear();
_tr_req_spill.clear();
_unknown_spill.clear();
}
////////////////////////////////////////////////////////////////////////////////
int V1724DataProcessor::Process(MDdataContainer* aPartEventPtr) {
// Cast the argument to structure it points to.
// This process should be called only with MDfragmentV1724 argument.
if ( typeid(*aPartEventPtr) != typeid(MDpartEventV1724) ) return CastError;
MDpartEventV1724* xV1724Evnt = static_cast(aPartEventPtr);
Json::Value pBoardDoc;
Json::Value xfAdcHit;
int xLdc, xGeo, xEquip, xPartEv;
string xDetector = "unknown";
if ( !xV1724Evnt->IsValid() )
return GenericError;
// Put static data into the Json
pBoardDoc["ldc_id"] = xLdc = this->GetLdcId();
pBoardDoc["equip_type"] = xEquip = this->GetEquipmentType();
pBoardDoc["time_stamp"] = this->GetTimeStamp();
pBoardDoc["phys_event_number"] = this->GetPhysEventNumber();
pBoardDoc["part_event_number"] = xPartEv = this->GetPartEventNumber();
pBoardDoc["geo"] = xGeo = xV1724Evnt->GetGeo();
pBoardDoc["trigger_time_tag"] = xV1724Evnt->GetTriggerTimeTag();
// Loop over all the channels
for (unsigned int xCh = 0; xCh < V1724_NCHANNELS; xCh++) {
unsigned int xSamples = ( xV1724Evnt->GetLength(xCh) )*V1724_SAMPLES_PER_WORD;
for (unsigned int j = 0; j < xSamples; j++) {
int sample = xV1724Evnt->GetSampleData(xCh, // Channel ID
j); // Sample ID
_data.push_back(sample);
}
xfAdcHit = pBoardDoc;
this->set_pedestal();
int charge_mm = this->get_charge(ceaMinMax);
if ( !_zero_suppression ||
(_zero_suppression && charge_mm > _zs_threshold) ) {
xfAdcHit["charge_mm"] = charge_mm;
xfAdcHit["charge_pm"] = this->get_charge(ceaPedMax);
xfAdcHit["position_max"] = this->get_max_position();
xfAdcHit["pedestal"] = this->get_pedestal();
DAQChannelKey* xKey = _chMap->find(xLdc, xGeo, xCh, xEquip);
if (xKey) {
xDetector = xKey->detector();
xfAdcHit["channel_key"] = xKey->str();
xfAdcHit["detector"] = xDetector;
} else {
xfAdcHit["detector"] = xDetector = "unknown";
}
xfAdcHit["channel"] = xCh;
( *_docSpill )[xDetector][ xPartEv ][_equipment].append(xfAdcHit);
}
_data.resize(0);
}
return OK;
}
int V1724CppDataProcessor::Process(MDdataContainer* aPartEventPtr) {
/**
* Cast the argument to structure it points to.
* This process should be called only with MDfragmentV1724 argument.
*/
// cout << "This is V1724CppDataProcessor::Process" << endl;
if ( typeid(*aPartEventPtr) != typeid(MDpartEventV1724) ) return CastError;
MDpartEventV1724* xV1724Evnt = static_cast(aPartEventPtr);
// xV1724Evnt->Dump();
if ( !xV1724Evnt->IsValid() )
return GenericError;
unsigned int xEvCounter = xV1724Evnt->GetEventCounter(); // starts from 1.
if (xEvCounter > _tof0_spill.size()) {
_tof0_spill.resize(xEvCounter);
_tof1_spill.resize(xEvCounter);
_tof2_spill.resize(xEvCounter);
_kl_spill.resize(xEvCounter);
_tag_spill.resize(xEvCounter);
_unknown_spill.resize(xEvCounter);
}
// Put static data into the Data Structure.
MAUS::V1724 xV1724hit;
int xLdc = this->GetLdcId();
int xGeo = xV1724Evnt->GetGeo();
int xEquip = this->GetEquipmentType();
xV1724hit.SetLdcId(xLdc);
xV1724hit.SetGeo(xGeo);
xV1724hit.SetEquipType(xEquip);
// Loop over all the channels
for (unsigned int xCh = 0; xCh < V1724_NCHANNELS; xCh++) {
if (xV1724Evnt->GetLength(xCh) == 0) continue;
unsigned int xSamples = ( xV1724Evnt->GetLength(xCh) )*V1724_SAMPLES_PER_WORD;
for (unsigned int j = 0; j < xSamples; j++) {
int sample = xV1724Evnt->GetSampleData(xCh, // Channel ID
j); // Sample ID
_data.push_back(sample);
}
xV1724hit.SetSampleArray(_data);
this->set_pedestal();
int charge_mm = this->get_charge(ceaMinMax);
if ( !_zero_suppression ||
(_zero_suppression && charge_mm > _zs_threshold) ) {
xV1724hit.SetChannel(xCh);
string xDetector;
DAQChannelKey* xKey = _chMap->find(xLdc, xGeo, xCh, xEquip);
if (xKey) {
xV1724hit.SetChannelKey(xKey->str());
xDetector = xKey->detector();
} else {
xDetector = "unknown";
}
xV1724hit.SetDetector(xDetector);
xV1724hit.SetPartEventNumber(xV1724Evnt->GetEventCount());
xV1724hit.SetPhysEventNumber(this->GetPhysEventNumber());
xV1724hit.SetTimeStamp(this->GetTimeStamp());
xV1724hit.SetChargeMm(this->get_charge(ceaMinMax));
xV1724hit.SetChargePm(this->get_charge(ceaPedMax));
int max_position = 0;
xV1724hit.SetPulseArea(this->get_pos_signal_area(max_position));
xV1724hit.SetPositionMin(this->get_min_position());
xV1724hit.SetPositionMax(max_position);
xV1724hit.SetArrivalTime(this->get_arrival_time());
xV1724hit.SetTriggerTimeTag(xV1724Evnt->GetTriggerTimeTag());
xV1724hit.SetPedestal(this->get_pedestal());
xV1724hit.SetSampleArray(_data);
if (xDetector == "tof0")
_tof0_spill[xEvCounter-1].push_back(xV1724hit);
else if (xDetector == "tof1")
_tof1_spill[xEvCounter-1].push_back(xV1724hit);
else if (xDetector == "tof2")
_tof2_spill[xEvCounter-1].push_back(xV1724hit);
else if (xDetector == "kl")
_kl_spill[xEvCounter-1].push_back(xV1724hit);
else if (xDetector == "tag")
_tag_spill[xEvCounter-1].push_back(xV1724hit);
else
_unknown_spill[xEvCounter-1].push_back(xV1724hit);
}
_data.resize(0);
}
return OK;
}
void V1724CppDataProcessor::fill_daq_data() {
unsigned int npe = _tof1_spill.size();
if (_daq_data->GetTOF0DaqArraySize() != npe)
_daq_data->GetTOF0DaqArrayPtr()->resize(npe);
if (_daq_data->GetTOF1DaqArraySize() != npe)
_daq_data->GetTOF1DaqArrayPtr()->resize(npe);
if (_daq_data->GetTOF2DaqArraySize() != npe)
_daq_data->GetTOF2DaqArrayPtr()->resize(npe);
if (_daq_data->GetKLArraySize() != npe)
_daq_data->GetKLArrayPtr()->resize(npe);
if (_daq_data->GetTagArraySize() != npe)
_daq_data->GetTagArrayPtr()->resize(npe);
if (_daq_data->GetUnknownArraySize() != npe)
_daq_data->GetUnknownArrayPtr()->resize(npe);
for (unsigned int ipe = 0; ipe < npe; ipe++) {
MAUS::TOFDaq *tof0_daq = _daq_data->GetTOF0DaqArrayElement(ipe);
if (!tof0_daq)
(*_daq_data->GetTOF0DaqArrayPtr())[ipe] = new MAUS::TOFDaq;
_daq_data->GetTOF0DaqArrayElement(ipe)->SetV1724Array(_tof0_spill[ipe]);
MAUS::TOFDaq *tof1_daq = _daq_data->GetTOF1DaqArrayElement(ipe);
if (!tof1_daq)
(*_daq_data->GetTOF1DaqArrayPtr())[ipe] = new MAUS::TOFDaq;
_daq_data->GetTOF1DaqArrayElement(ipe)->SetV1724Array(_tof1_spill[ipe]);
MAUS::TOFDaq *tof2_daq = _daq_data->GetTOF2DaqArrayElement(ipe);
if (!tof2_daq)
(*_daq_data->GetTOF2DaqArrayPtr())[ipe] = new MAUS::TOFDaq;
_daq_data->GetTOF2DaqArrayElement(ipe)->SetV1724Array(_tof2_spill[ipe]);
MAUS::KLDaq *kl_daq = _daq_data->GetKLArrayElement(ipe);
if (!kl_daq)
(*_daq_data->GetKLArrayPtr())[ipe] = new MAUS::KLDaq;
_daq_data->GetKLArrayElement(ipe)->SetV1724Array(_kl_spill[ipe]);
MAUS::Tag *tag_daq = _daq_data->GetTagArrayElement(ipe);
if (!tag_daq)
(*_daq_data->GetTagArrayPtr())[ipe] = new MAUS::Tag;
_daq_data->GetTagArrayElement(ipe)->SetV1724Array(_tag_spill[ipe]);
MAUS::Unknown *unknown = _daq_data->GetUnknownArrayElement(ipe);
if (!unknown)
(*_daq_data->GetUnknownArrayPtr())[ipe] = new MAUS::Unknown;
_daq_data->GetUnknownArrayElement(ipe)->SetV1724Array(_unknown_spill[ipe]);
}
}
void V1724CppDataProcessor::reset() {
_tof0_spill.clear();
_tof1_spill.clear();
_tof2_spill.clear();
_kl_spill.clear();
_tag_spill.clear();
_unknown_spill.clear();
}
////////////////////////////////////////////////////////////////////////////////
int V1731DataProcessor::Process(MDdataContainer* aPartEventPtr) {
// Cast the argument to structure it points to.
// This process should be called only with MDfragmentV1731 argument.
if ( typeid(*aPartEventPtr) != typeid(MDpartEventV1731) ) return CastError;
MDpartEventV1731* xV1731Evnt = static_cast(aPartEventPtr);
Json::Value pBoardDoc;
Json::Value xfAdcHit;
int xLdc, xGeo, xEquip, xPartEv;
string xDetector = "unknown";
if ( !xV1731Evnt->IsValid() )
return GenericError;
// Put static data into the Json
pBoardDoc["ldc_id"] = xLdc = this->GetLdcId();
pBoardDoc["equip_type"] = xEquip = this->GetEquipmentType();
pBoardDoc["time_stamp"] = this->GetTimeStamp();
pBoardDoc["phys_event_number"] = this->GetPhysEventNumber();
pBoardDoc["part_event_number"] = xPartEv = this->GetPartEventNumber();
pBoardDoc["geo"] = xGeo = xV1731Evnt->GetGeo();
pBoardDoc["trigger_time_tag"] = xV1731Evnt->GetTriggerTimeTag();
// Loop over all the channels
for (unsigned int xCh = 0; xCh < V1731_NCHANNELS; xCh++) {
unsigned int xSamples = ( xV1731Evnt->GetLength(xCh) )*V1731_SAMPLES_PER_WORD;
for (unsigned int j = 0; j < xSamples; j++) {
int sample = xV1731Evnt->GetSampleData(xCh, // Channel ID
j); // Sample ID
_data.push_back(sample);
}
xfAdcHit = pBoardDoc;
this->set_pedestal();
int charge_mm = this->get_charge(ceaMinMax);
if ( !_zero_suppression ||
(_zero_suppression && charge_mm > _zs_threshold) ) {
xfAdcHit["charge_mm"] = charge_mm;
xfAdcHit["charge_pm"] = this->get_charge(ceaPedMin);
int position_min = 0;
xfAdcHit["pulse_area"] = this->get_neg_signal_area(position_min);
xfAdcHit["position_min"] = position_min;
xfAdcHit["position_max"] = this->get_max_position();
xfAdcHit["arrival_time"] = this->get_arrival_time();
xfAdcHit["pedestal"] = this->get_pedestal();
xfAdcHit["samples"] = this ->get_samples();
DAQChannelKey* xKey = _chMap->find(xLdc, xGeo, xCh, xEquip);
if (xKey) {
xDetector = xKey->detector();
xfAdcHit["channel_key"] = xKey->str();
xfAdcHit["detector"] = xDetector;
} else {
xfAdcHit["detector"] = xDetector = "unknown";
xfAdcHit["channel_key"] = "unknown";
}
xfAdcHit["channel"] = xCh;
( *_docSpill )[xDetector][ xPartEv ][_equipment].append(xfAdcHit);
}
_data.resize(0);
}
return OK;
}
int V1731CppDataProcessor::Process(MDdataContainer* aPartEventPtr) {
/**
* Cast the argument to structure it points to.
* This process should be called only with MDfragmentV1731 argument.
*/
// cout << "This is V1731CppDataProcessor::Process" << endl;
if ( typeid(*aPartEventPtr) != typeid(MDpartEventV1731) ) return CastError;
MDpartEventV1731* xV1731Evnt = static_cast(aPartEventPtr);
// xV1731Evnt->Dump();
// string xDetector = "emr";
if ( !xV1731Evnt->IsValid() )
return GenericError;
unsigned int xEvCounter = xV1731Evnt->GetEventCounter(); // starts from 1.
if (xEvCounter > _emr_spill.size()) {
_emr_spill.resize(xEvCounter);
_ckov_spill.resize(xEvCounter);
_unknown_spill.resize(xEvCounter);
}
// Put static data into the Data Structure.
MAUS::V1731 xV1731hit;
int xLdc = this->GetLdcId();
int xGeo = xV1731Evnt->GetGeo();
int xEquip = this->GetEquipmentType();
xV1731hit.SetLdcId(xLdc);
xV1731hit.SetGeo(xGeo);
xV1731hit.SetEquipType(xEquip);
// Loop over all the channels
for (unsigned int xCh = 0; xCh < V1731_NCHANNELS; xCh++) {
if ( xV1731Evnt->GetLength(xCh) ) {
unsigned int xSamples = ( xV1731Evnt->GetLength(xCh) )*V1731_SAMPLES_PER_WORD;
for (unsigned int j = 0; j < xSamples; j++) {
int sample = xV1731Evnt->GetSampleData(xCh, // Channel ID
j); // Sample ID
_data.push_back(sample);
}
xV1731hit.SetSampleArray(_data);
this->set_pedestal();
xV1731hit.SetChannel(xCh);
string xDetector;
DAQChannelKey* xKey = _chMap->find(xLdc, xGeo, xCh, xEquip);
if (xKey) {
xV1731hit.SetChannelKey(xKey->str());
xDetector = xKey->detector();
} else {
xDetector = "unknown";
}
xV1731hit.SetDetector(xDetector);
xV1731hit.SetPartEventNumber(xV1731Evnt->GetEventCount());
xV1731hit.SetPhysEventNumber(this->GetPhysEventNumber());
xV1731hit.SetTimeStamp(this->GetTimeStamp());
xV1731hit.SetChargeMm(this->get_charge(ceaMinMax));
xV1731hit.SetChargePm(this->get_charge(ceaPedMin));
int min_position = 0;
xV1731hit.SetPulseArea(this->get_neg_signal_area(min_position));
xV1731hit.SetPositionMin(min_position);
xV1731hit.SetPositionMax(this->get_max_position());
xV1731hit.SetArrivalTime(this->get_arrival_time());
xV1731hit.SetTriggerTimeTag(xV1731Evnt->GetTriggerTimeTag());
xV1731hit.SetPedestal(this->get_pedestal());
xV1731hit.SetSampleArray(_data);
if (xDetector == "emr")
_emr_spill[xEvCounter-1].push_back(xV1731hit);
else if (xDetector == "ckov")
_ckov_spill[xEvCounter-1].push_back(xV1731hit);
else
_unknown_spill[xEvCounter-1].push_back(xV1731hit);
}
_data.resize(0);
}
return OK;
}
void V1731CppDataProcessor::fill_daq_data() {
unsigned int npe = _emr_spill.size();
_daq_data->GetEMRDaqPtr()->SetV1731PartEventArray(_emr_spill);
if (_daq_data->GetCkovArraySize() != npe)
_daq_data->GetCkovArrayPtr()->resize(npe);
if (_daq_data->GetUnknownArraySize() != npe)
_daq_data->GetUnknownArrayPtr()->resize(npe);
for (unsigned int ipe = 0; ipe < npe; ipe++) {
MAUS::CkovDaq *ckov_daq = _daq_data->GetCkovArrayElement(ipe);
if (!ckov_daq)
(*_daq_data->GetCkovArrayPtr())[ipe] = new MAUS::CkovDaq;
_daq_data->GetCkovArrayElement(ipe)->SetV1731Array(_ckov_spill[ipe]);
MAUS::Unknown *unknown = _daq_data->GetUnknownArrayElement(ipe);
if (!unknown)
(*_daq_data->GetUnknownArrayPtr())[ipe] = new MAUS::Unknown;
_daq_data->GetUnknownArrayElement(ipe)->SetV1731Array(_unknown_spill[ipe]);
}
}
void V1731CppDataProcessor::reset() {
_emr_spill.clear();
_ckov_spill.clear();
_unknown_spill.clear();
}
////////////////////////////////////////////////////////////////////////////////
int V830DataProcessor::Process(MDdataContainer* aFragPtr) {
// Cast the argument to structure it points to.
// This process should be called only with MDfragmentV830 argument.
if ( typeid(*aFragPtr) != typeid(MDfragmentV830) ) return CastError;
MDfragmentV830* xV830Fragment = static_cast(aFragPtr);
Json::Value pBoardDoc;
if ( !xV830Fragment->IsValid() )
return GenericError;
pBoardDoc["ldc_id"] = this->GetLdcId();
pBoardDoc["equip_type"] = this->GetEquipmentType();
pBoardDoc["time_stamp"] = this->GetTimeStamp();
pBoardDoc["phys_event_number"] = this->GetPhysEventNumber();
pBoardDoc["channels"] = Json::Value();
uint32_t * ptr = xV830Fragment->Get32bWordPtr(0);
MDdataWordV830 xDataWord(ptr);
unsigned int xWordCount(0);
// Loop over all the channels
while ( xWordCount < xV830Fragment->GetWordCount() ) {
uint32_t dt= xDataWord.GetDataType();
switch ( dt ) {
case DWV830_Measurement:
{
// Convert the channel number into a channel number string!
stringstream xConv;
xConv << "ch" << xDataWord.GetChannel();
unsigned int xValue = xDataWord.GetMeasurement();
pBoardDoc["channels"][xConv.str()] = Json::Value(xValue);
break;
}
case DWV830_Header:
{
pBoardDoc["geo"] = Json::Value(xDataWord.GetGeo());
break;
}
}
xWordCount++;
xDataWord.SetDataPtr(++ptr);
}
(*_docSpill)[_equipment] = pBoardDoc;
return OK;
}
#define V830_NCHANNELS 32
int V830CppDataProcessor::Process(MDdataContainer* aFragPtr) {
/**
* Cast the argument to structure it points to.
* This process should be called only with MDfragmentV830 argument.
*/
// cerr << "This is V830CppDataProcessor::Process " << endl;
if ( typeid(*aFragPtr) != typeid(MDfragmentV830) ) return CastError;
MDfragmentV830* xV830Fragment = static_cast(aFragPtr);
if ( !xV830Fragment->IsValid() )
return GenericError;
_v830_spill.SetLdcId(this->GetLdcId());
_v830_spill.SetEquipType(this->GetEquipmentType());
_v830_spill.SetTimeStamp(this->GetTimeStamp());
_v830_spill.SetPhysEventNumber(this->GetPhysEventNumber());
MAUS::Channels xChannels;
uint32_t * ptr = xV830Fragment->Get32bWordPtr(0);
MDdataWordV830 xDataWord(ptr);
unsigned int xWordCount(0);
// Loop over all the channels
while ( xWordCount < xV830Fragment->GetWordCount() ) {
uint32_t dt= xDataWord.GetDataType();
switch ( dt ) {
case DWV830_Measurement:
{
int xCh = xDataWord.GetChannel();
int xValue = xDataWord.GetMeasurement();
xChannels.SetCh(xCh, xValue);
break;
}
case DWV830_Header:
{
_v830_spill.SetGeo(xDataWord.GetGeo());
break;
}
}
xWordCount++;
xDataWord.SetDataPtr(++ptr);
}
_v830_spill.SetChannels(xChannels);
return OK;
}
void V830CppDataProcessor::fill_daq_data() {
_daq_data->SetV830(_v830_spill);
}
void V830CppDataProcessor::reset() {
MAUS::Channels ch;
_v830_spill.SetChannels(ch);
}
////////////////////////////////////////////////////////////////////////////////
int VLSBDataProcessor::Process(MDdataContainer* aFragPtr) {
// Cast the argument to structure it points to.
// This process should be called only with MDfragmentVLSB_C argument.
if ( typeid(*aFragPtr) != typeid(MDfragmentVLSB) ) {
std::cout << "CASTERROR: " << typeid(*aFragPtr).name() << " != " <<
typeid(MDfragmentVLSB).name() << std::endl;
return CastError;
}
std::cerr << "ED: VLSBDataProcessor::Process called" << std::endl;
MDfragmentVLSB* xVLSBFragment = static_cast(aFragPtr);
Json::Value pBoardDoc, xVLSB_CHit;
if ( !xVLSBFragment->IsValid() )
return GenericError;
int xLdc, xAdc, xPartEv;
string xDetector;
// Put static data into the Json
pBoardDoc["ldc_id"] = xLdc = this->GetLdcId();
if (xLdc == 0)
xDetector = "tracker1";
if (xLdc == 2)
xDetector = "tracker2";
if (xLdc == 3)
xDetector = "single_station";
pBoardDoc["detector"] = xDetector;
pBoardDoc["equip_type"] = this->GetEquipmentType();
pBoardDoc["time_stamp"] = this->GetTimeStamp();
pBoardDoc["phys_event_number"] = this->GetPhysEventNumber();
pBoardDoc["bank_id"] = xVLSBFragment->GetBoardID();
// pBoardDoc["bank_size"] = xVLSBFragment->GetPayLoadWordCount();
// Get the number of data words.
uint32_t nDataWords = xVLSBFragment->GetPayLoadWordCount();
// Loop over the data.
uint32_t xWordCount(0);
while (xWordCount < nDataWords) {
xVLSB_CHit = pBoardDoc;
xVLSB_CHit["adc"] = xAdc = xVLSBFragment->GetAdc(xWordCount);
if (!_zero_suppression ||
(_zero_suppression && xAdc > _zs_threshold) ) {
xVLSB_CHit["part_event_number"] = xPartEv = xVLSBFragment->GetEventNum(xWordCount)-1;
xVLSB_CHit["channel"] = xVLSBFragment->GetChannel(xWordCount);
xVLSB_CHit["tdc"] = xVLSBFragment->GetTdc(xWordCount);
xVLSB_CHit["discriminator"] = xVLSBFragment->GetDiscriBit(xWordCount);
( *_docSpill )[xDetector][xPartEv][_equipment].append(xVLSB_CHit);
}
xWordCount++;
}
return OK;
}
int VLSBCppDataProcessor::Process(MDdataContainer* aFragPtr) {
// Cast the argument to structure it points to.
// This process should be called only with MDfragmentVLSB_C argument.
if ( typeid(*aFragPtr) != typeid(MDfragmentVLSB) )
return CastError;
// std::cerr << "VLSBDataProcessor::Process" << std::endl;
MDfragmentVLSB* xVLSBFragment = static_cast(aFragPtr);
if ( !xVLSBFragment->IsValid() )
return GenericError;
MAUS::VLSB xVLSBhit;
int xLdc, xAdc, xTimeStamp, xPhysEvNum;
int xPartEv;
string xDetector;
xLdc = this->GetLdcId();
xTimeStamp = this->GetTimeStamp();
xPhysEvNum = this->GetPhysEventNumber();
int xGeo = xVLSBFragment->GetBoardID();
// Get the number of data words.
uint32_t nDataWords = xVLSBFragment->GetPayLoadWordCount();
// std::cout << "PhysEvNum: " << xPhysEvNum << " nDataWords: " << nDataWords << endl;
// Loop over the data.
uint32_t xWordCount(0);
while (xWordCount < nDataWords) {
xPartEv = xVLSBFragment->GetEventNum(xWordCount)-1;
// std::cout << *xVLSBFragment->Get32bWordPtr(xWordCount) << std::endl;
// std::cout << xWordCount << " PartEv:" << xPartEv << " LDC: " << xLdc
// << " Geo: " << xGeo << endl;
if ( xPartEv == _current_pEvent+1 ||
(xPartEv == 0 && xPartEv != _current_pEvent) ) {
_current_pEvent = xPartEv;
if ( _is_first ) {
_n_pEvent = xPartEv+1;
_tracker1_spill.resize(xPartEv+1);
_tracker0_spill.resize(xPartEv+1);
}
} else if (xPartEv != _current_pEvent) {
stringstream ss;
ss << "ERORR in VLSBCppDataProcessor::Process : "<< endl;
ss << "in LDC " << xLdc << " Bank " << xGeo;
ss << " Inconsistent Particle event number (" << xPartEv << ") ";
throw MDexception(ss.str());
// cout << ss.str() << endl;
}
if (_n_pEvent <= xPartEv) {
stringstream ss;
ss << "ERROR in VLSBCppDataProcessor::Process : " << endl;
ss << "in LDC " << xLdc << " Bank " << xGeo;
ss << " Particle event number exceeds the limit (";
ss << xPartEv << ">" << _n_pEvent-1 << ")";
throw MDexception(ss.str());
}
xAdc = xVLSBFragment->GetAdc(xWordCount);
// std::cerr << xWordCount << " adc: " << xAdc << endl;
int xChan = xVLSBFragment->GetChannel(xWordCount);
double xPed = _calibration[xGeo][xChan].first;
double xGain = _calibration[xGeo][xChan].second;
double xPE = (xAdc-xPed)/xGain;
if (!_zero_suppression ||
(_zero_suppression && xPE >= _zs_threshold) ) {
xVLSBhit.SetLdcId(xLdc);
xVLSBhit.SetEquipType(this->GetEquipmentType());
xVLSBhit.SetTimeStamp(xTimeStamp);
xVLSBhit.SetPhysEventNumber(xPhysEvNum);
xVLSBhit.SetBankID(xGeo);
xVLSBhit.SetADC(xAdc);
xVLSBhit.SetPartEventNumber(xPartEv);
xVLSBhit.SetChannel(xVLSBFragment->GetChannel(xWordCount));
xVLSBhit.SetTDC(xVLSBFragment->GetTdc(xWordCount));
xVLSBhit.SetDiscriminator(xVLSBFragment->GetDiscriBit(xWordCount));
if (xLdc == 3 || xLdc == 0) {
xDetector = "tracker0";
xVLSBhit.SetDetector(xDetector);
_tracker0_spill[xPartEv].push_back(xVLSBhit);
} else if (xLdc == 4) {
xDetector = "tracker1";
xVLSBhit.SetDetector(xDetector);
_tracker1_spill[xPartEv].push_back(xVLSBhit);
}
}
xWordCount++;
}
_is_first = false;
return OK;
}
void VLSBCppDataProcessor::fill_daq_data() {
unsigned int npe = _tracker1_spill.size();
if (_daq_data->GetTracker0DaqArraySize() != npe)
_daq_data->GetTracker0DaqArrayPtr()->resize(npe);
if (_daq_data->GetTracker1DaqArraySize() != npe)
_daq_data->GetTracker1DaqArrayPtr()->resize(npe);
for (unsigned int ipe = 0; ipe < npe; ipe++) {
MAUS::TrackerDaq *tracker0_daq = _daq_data->GetTracker0DaqArrayElement(ipe);
if (!tracker0_daq)
(*_daq_data->GetTracker0DaqArrayPtr())[ipe] = new MAUS::TrackerDaq;
_daq_data->GetTracker0DaqArrayElement(ipe)->SetVLSBArray(_tracker0_spill[ipe]);
MAUS::TrackerDaq *tracker1_daq = _daq_data->GetTracker1DaqArrayElement(ipe);
if (!tracker1_daq)
(*_daq_data->GetTracker1DaqArrayPtr())[ipe] = new MAUS::TrackerDaq;
_daq_data->GetTracker1DaqArrayElement(ipe)->SetVLSBArray(_tracker1_spill[ipe]);
}
}
void VLSBCppDataProcessor::reset() {
_current_pEvent = -1;
_n_pEvent = 0;
_is_first = true;
_tracker1_spill.clear();
_tracker0_spill.clear();
// _single_st_spill.clear();
}
////////////////////////////////////////////////////////////////////////////////
int VLSB_CDataProcessor::Process(MDdataContainer* aFragPtr) {
// Cast the argument to structure it points to.
// This process should be called only with MDfragmentVLSB_C argument.
if ( typeid(*aFragPtr) != typeid(MDfragmentVLSB_C) )
return CastError;
MDfragmentVLSB_C* xVLSB_CFragment = static_cast(aFragPtr);
Json::Value pBoardDoc, xVLSB_CHit;
if ( !xVLSB_CFragment->IsValid() )
return GenericError;
int xLdc, xAdc, xPartEv;
string xDetector;
// Put static data into the Json
pBoardDoc["ldc_id"] = xLdc = this->GetLdcId();
if (xLdc == 0)
xDetector = "tracker1";
if (xLdc == 2)
xDetector = "tracker2";
pBoardDoc["detector"] = xDetector;
pBoardDoc["equip_type"] = this->GetEquipmentType();
pBoardDoc["time_stamp"] = this->GetTimeStamp();
pBoardDoc["phys_event_number"] = this->GetPhysEventNumber()-1;
pBoardDoc["geo"] = xVLSB_CFragment->GetGeo();
MDdataWordVLSB xDataWord;
uint32_t * dataPtr = xVLSB_CFragment->UserPayLoadPtr();
for (unsigned int iban = 0; iban < 4; iban++) {
for (unsigned int iw =0; iw < xVLSB_CFragment->GetBankLength(iban); iw++) {
xVLSB_CHit = pBoardDoc;
xDataWord.SetDataPtr(dataPtr);
xVLSB_CHit["adc"] = xAdc = xDataWord.GetAdc();
if ( !_zero_suppression ||
(_zero_suppression && xAdc > _zs_threshold) ) {
xVLSB_CHit["part_event_number"] = xPartEv = xDataWord.GetEventNum()-1;
xVLSB_CHit["bank"] = iban;
xVLSB_CHit["channel"] = xDataWord.GetChannel();
xVLSB_CHit["tdc"] = xDataWord.GetTdc();
xVLSB_CHit["discriminator"] = xDataWord.GetDiscriBit();
( *_docSpill )[xDetector][xPartEv][_equipment].append(xVLSB_CHit);
}
dataPtr++;
}
}
return OK;
}
////////////////////////////////////////////////////////////////////////////////
int DBBDataProcessor::Process(MDdataContainer* aFragPtr) {
// Cast the argument to structure it points to.
// This process should be called only with MDfragmentDBB argument.
if ( typeid(*aFragPtr) != typeid(MDfragmentDBB) )
return CastError;
MDfragmentDBB* xDBBFragment = static_cast(aFragPtr);
Json::Value pBoardDoc;
Json::Value xDBBHit;
int xLdc, xGeo, xEquip;
string xDetector = "emr";
if ( !xDBBFragment->IsValid() )
return GenericError;
// Put static data into the Json
pBoardDoc["detector"] = xDetector;
pBoardDoc["ldc_id"] = xLdc = this->GetLdcId();
pBoardDoc["equip_type"] = xEquip = this->GetEquipmentType();
pBoardDoc["time_stamp"] = this->GetTimeStamp();
pBoardDoc["spill_number"] = xDBBFragment->GetSpillNumber();
pBoardDoc["spill_width"] = xDBBFragment->GetSpillWidth();
pBoardDoc["geo"] = xGeo = xDBBFragment->GetGeo();
pBoardDoc["trigger_count"] = xDBBFragment->GetTriggerCount();
pBoardDoc["hit_count"] = xDBBFragment->GetHitCount();
// Loop over all the channels
for (unsigned int xCh = 0; xCh < DBB_NCHANNELS; xCh++) {
// Get the number of leading edge hits.
int xHitsL = xDBBFragment->GetNLeadingEdgeHits(xCh);
// Get the number of trailing edge hits.
int xHitsT = xDBBFragment->GetNTrailingEdgeHits(xCh);
// By definition the number of the leading edge hits has to be equal
// to the number of the trailing edge hits but some times this is not true.
int xMaxHits = MAX(xHitsL, xHitsT);
// Loop over all leading and trailing hits in this channel.
int xLT, xTT; // Lead and Trail times
for (int j = 0; j < xMaxHits; j++) {
if (j < xHitsL) {
xLT = xDBBFragment->GetHitMeasurement(j, // Hit ID
xCh, // Channel ID
'l');
} else {
// If no trailing edge hit set the value og time to -99.
xLT = -99;
}
if (j < xHitsT) {
xTT = xDBBFragment->GetHitMeasurement(j, // Hit ID
xCh, // Channel ID
't');
} else {
// If no trailing edge hit set the value og time to -99.
xTT = -99;
}
xDBBHit["channel"] = xCh;
xDBBHit["leading_time"] = xLT;
xDBBHit["trailing_time"] = xTT;
DAQChannelKey xKey(xLdc, xGeo, xCh, xEquip, xDetector);
xDBBHit["channel_key"] = xKey.str();
pBoardDoc["hits"].append(xDBBHit);
}
}
( *_docSpill )[xDetector][_equipment].append(pBoardDoc);
return OK;
}
int DBBCppDataProcessor::Process(MDdataContainer* aFragPtr) {
// Cast the argument to structure it points to.
// This process should be called only with MDfragmentDBB argument.
// cout << "This is DBBCppDataProcessor::Process" << endl;
if ( typeid(*aFragPtr) != typeid(MDfragmentDBB) ) return CastError;
MDfragmentDBB* xDBBFragment = static_cast(aFragPtr);
if ( !xDBBFragment->IsValid() )
return GenericError;
// xDBBFragment->Dump();
MAUS::DBBSpillData xDBBSpill;
xDBBSpill.SetLdcId(this->GetLdcId());
xDBBSpill.SetTimeStamp(this->GetTimeStamp());
set_spill_data(xDBBFragment, &xDBBSpill);
_spill.push_back(xDBBSpill);
return OK;
}
void DBBCppDataProcessor::set_spill_data(MDfragmentDBB *fragment, MAUS::DBBSpillData *dbb_spill) {
int xLdc, xGeo;
string xDetector = "emr";
dbb_spill->SetDetector(xDetector);
xGeo = fragment->GetGeo();
xLdc = dbb_spill->GetLdcId();
dbb_spill->SetDBBId(xGeo);
dbb_spill->SetLdcId(xLdc);
dbb_spill->SetSpillNumber(fragment->GetSpillNumber());
dbb_spill->SetSpillWidth(fragment->GetSpillWidth());
dbb_spill->SetTriggerCount(fragment->GetTriggerCount());
dbb_spill->SetHitCount(fragment->GetHitCount());
MAUS::DBBHitsArray hits;
MAUS::DBBHitsArray triggers;
// Loop over all the channels
for (unsigned int xCh = 0; xCh < DBB_NCHANNELS; xCh++) {
// Get the number of leading edge hits.
int xHitsL = fragment->GetNLeadingEdgeHits(xCh);
// Get the number of trailing edge hits.
int xHitsT = fragment->GetNTrailingEdgeHits(xCh);
// By definition the number of the leading edge hits has to be equal
// to the number of the trailing edge hits but some times this is not true.
int xMaxHits = MAX(xHitsL, xHitsT);
int xLT, xTT; // Lead and Trail times
for (int xHit = 0; xHit < xMaxHits; xHit++) {
MAUS::DBBHit hit;
hit.SetLDC(xLdc);
hit.SetGEO(xGeo);
hit.SetChannel(xCh);
if (xHit < xHitsL) {
xLT = fragment->GetHitMeasurement(xHit, // Hit ID
xCh, // Channel ID
'l');
} else {
// If no trailing edge hit set the value og time to -99.
xLT = 0;
}
if (xHit < xHitsT) {
xTT = fragment->GetHitMeasurement(xHit, // Hit ID
xCh, // Channel ID
't');
} else {
// If no trailing edge hit set the value og time to -99.
xTT = 0;
}
hit.SetLTime(xLT);
hit.SetTTime(xTT);
if (xCh == DBB_TRIGGER_CHANNEL)
triggers.push_back(hit);
else
hits.push_back(hit);
}
}
dbb_spill->SetDBBHitsArray(hits);
dbb_spill->SetDBBTriggersArray(triggers);
}
void DBBCppDataProcessor::fill_daq_data() {
_daq_data->GetEMRDaqPtr()->SetDBBArray(_spill);
}
#define DBB_TRIGGER_CHANNEL 4
int DBBChainCppDataProcessor::Process(MDdataContainer* aFragPtr) {
/** Cast the argument to structure it points to.
This process should be called only with MDfragmentDBB argument. */
// cout << "This is DBBChainCppDataProcessor::Process" << endl;
if ( typeid(*aFragPtr) != typeid(MDfragmentDBBChain) )
return CastError;
MDfragmentDBBChain* xDBBChainFragment = static_cast(aFragPtr);
/** Loop over the elements of the chain */
for (int i = 0; i < DBBS_IN_CHAIN; i++) {
MDfragmentDBB* xDBBFragment = xDBBChainFragment->getFragmentDBB(i);
if ( !xDBBFragment->IsValid() )
return GenericError;
// xDBBFragment->Dump();
MAUS::DBBSpillData xDBBSpill;
/** Fill into the data structure */
xDBBSpill.SetLdcId(this->GetLdcId());
xDBBSpill.SetTimeStamp(this->GetTimeStamp());
DBBCppDataProcessor::set_spill_data(xDBBFragment, &xDBBSpill);
_spill.push_back(xDBBSpill);
}
return OK;
}
void DBBChainCppDataProcessor::fill_daq_data() {
_daq_data->GetEMRDaqPtr()->SetDBBArray(_spill);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////