- #include <algorithm>
-
- // Boost
- #include <boost/filesystem.hpp>
-
- // Gaudi
- #include "GaudiKernel/IEventProcessor.h"
-
- // Tb/TbKernel
- #include "TbKernel/TbFunctors.h"
-
- // Local
- #include "TbCombatBuilder.h"
-
- DECLARE_ALGORITHM_FACTORY(TbCombatBuilder)
-
- namespace fs = boost::filesystem;
-
- //=============================================================================
- // Standard constructor
- //=============================================================================
- TbCombatBuilder::TbCombatBuilder(const std::string& name,
- ISvcLocator* pSvcLocator)
- : TbAlgorithm(name, pSvcLocator),
- m_nPixels(256),
- m_nEvents(0),
- m_neof(true) {
-
- declareProperty("CombatInputFile0", m_fileName0);
- declareProperty("CombatInputFile1", m_fileName1 = "DefaultFileName1.dat");
- declareProperty("HitLocation", m_hitLocation = LHCb::TbHitLocation::Default);
- declareProperty("MinPlanesWithHits", m_nMinPlanesWithHits = 1); // TODO
- declareProperty("SkipEvents", m_skipEvents = 0); // TODO
- declareProperty("PrintFreq", m_printFreq = 100);
- declareProperty("ReadoutFormat", m_readoutFormat);
- declareProperty("FakeTime", m_fakeTime = 1);
- declareProperty("NumberArms", m_nArms);
- }
-
- //=============================================================================
- // Destructor
- //=============================================================================
- TbCombatBuilder::~TbCombatBuilder() {}
-
- //=============================================================================
- // Initialisation
- //=============================================================================
- StatusCode TbCombatBuilder::initialize() {
-
- // Initialise the base class.
- StatusCode sc = TbAlgorithm::initialize();
- if (sc.isFailure()) return sc;
-
- // Prepare the hit containers.
- m_hits.resize(m_nPlanes, NULL);
-
- // Open the hit files.
- m_dataStream0.open(m_fileName0.c_str());
- if (!m_dataStream0.is_open()) {
- error() << "Cannot open file name: " << m_fileName0 << endmsg;
- return StatusCode::FAILURE;
- }
-
- if (m_nArms == 2 && m_readoutFormat=="Pixelman") {
- m_dataStream1.open(m_fileName1.c_str());
- if (!m_dataStream1.is_open()) {
- error() << "Cannot open file name: " << m_fileName1 << endmsg;
- return StatusCode::FAILURE;
- }
- }
-
- return StatusCode::SUCCESS;
- }
-
- //=============================================================================
- // Main execution
- //=============================================================================
- StatusCode TbCombatBuilder::execute() {
- // Printing.
- if (m_nEvents % m_printFreq == 0)
- info() << "Loading event: " << m_nEvents << endmsg;
-
- // Create containers for hits.
- for (unsigned int i = 0; i < m_nPlanes; ++i) {
- const std::string ext = std::to_string(i);
- m_hits[i] = new LHCb::TbHits();
- put(m_hits[i], m_hitLocation + ext);
- }
-
-
- if(m_readoutFormat=="Pixelman"){
- if (m_nArms == 1) {
- fillEventFromPixelmanFile(0);
- } else if (m_nArms == 2) {
- fillEventFromPixelmanFile(0);
- fillEventFromPixelmanFile(1);
- }
- }
- else if(m_readoutFormat=="RelaxD"){
- fillEventFromRelaxDFile();
- }
-
- // Check whether there are any events left.
- if (!m_neof) {
- // Terminate.
- SmartIF<IEventProcessor> app(serviceLocator()->service("ApplicationMgr"));
- if (app) app->stopRun();
- } else {
- // Ordering.
- for (unsigned int i = 0; i < m_nPlanes; i++) {
- std::sort(m_hits[i]->begin(), m_hits[i]->end(),
- TbFunctors::GreaterByToT<const LHCb::TbHit*>());
- }
- m_nEvents++;
- }
-
- // Prepare for the next event.
- return StatusCode::SUCCESS;
- }
-
- //=============================================================================
- // Finalisation
- //=============================================================================
- StatusCode TbCombatBuilder::finalize() { return TbAlgorithm::finalize(); }
-
- //=============================================================================
- // Event filling handling Pixelman files
- //=============================================================================
- void TbCombatBuilder::fillEventFromPixelmanFile(const int armID) {
- // Check we havent reached the next event.
- bool sameEvent = true;
- while (sameEvent) {
- std::string line;
- if (armID == 0)
- m_neof = std::getline(m_dataStream0, line);
- else
- m_neof = std::getline(m_dataStream1, line);
- if (!m_neof) break;
- if (line.substr(0, 1) == "#")
- sameEvent = false;
- else
- fillHit(line, armID);
- }
- }
-
- //=============================================================================
- // Event filling handling RelaxD files
- //=============================================================================
- void TbCombatBuilder::fillEventFromRelaxDFile() {
-
- //For the RelaxD files, in one event the first series of hits come from the upper arm and the second from the downstream arm.
- for(int iArm=0;iArm<m_nArms;iArm++){
- // Check we havent reached the next event.
- bool sameEvent = true;
- bool frameStart = false;
- while (sameEvent) {
- std::string line;
- m_neof = std::getline(m_dataStream0, line);
- if (!m_neof) break;
- if (line.substr(0,1) != "#"){
- frameStart= true;
- fillHit(line, iArm);
- }
- if (line.substr(0, 1) == "#"&& frameStart==true)
- sameEvent = false;
- }
- }
- }
- //=============================================================================
- // Event filling
- //=============================================================================
- void TbCombatBuilder::fillHit(std::string line, int armID) {
- std::stringstream lineStream;
- lineStream << line;
- int rowTemp, colTemp, ToT;
- lineStream >> colTemp >> rowTemp >> ToT;
-
- int plane;
- if (colTemp > 255) {
- if (rowTemp > 255)
- plane = 1;
- else
- plane = 3;
- } else {
- if (rowTemp > 255)
- plane = 0;
- else
- plane = 2;
- }
-
- // Arm modification.
- if (armID == 1) plane += 4;
-
- // Make the hit.
- LHCb::TbHit* hit = new LHCb::TbHit();
- hit->setRow(rowTemp % m_nPixels);
- hit->setCol(colTemp % m_nPixels);
- hit->setToT(ToT);
- hit->setPixelAddress(hit->row() + hit->col() * m_nPixels);
- hit->setTime(m_fakeTime);
- hit->setHtime(timingSvc()->globalToLocal(hit->time()));
-
- m_hits[plane]->insert(hit);
- }
-
- //=============================================================================
- // End
- //=============================================================================