00001 #include "TsExternalTriggerTool.h"
00002
00003 #include "Conventions/Site.h"
00004
00005 #include "Event/ElecCrateHeader.h"
00006 #include "Event/ElecFeeCrate.h"
00007
00008 #include "Event/SimTrigCommand.h"
00009 #include "Event/SimTrigCommandHeader.h"
00010 #include "Event/SimTrigCommandCollection.h"
00011 #include "CLHEP/Units/SystemOfUnits.h"
00012
00013 TsExternalTriggerTool::TsExternalTriggerTool(const std::string& type,
00014 const std::string& name,
00015 const IInterface* parent)
00016 : GaudiTool(type,name,parent)
00017 {
00018 declareInterface< ITsTriggerTool >(this) ;
00019
00020 m_detectorsToProcess.push_back("DayaBayAD1");
00021 m_detectorsToProcess.push_back("DayaBayAD2");
00022 m_detectorsToProcess.push_back("DayaBayIWS");
00023 m_detectorsToProcess.push_back("DayaBayOWS");
00024 m_detectorsToProcess.push_back("LingAoAD1");
00025 m_detectorsToProcess.push_back("LingAoAD2");
00026 m_detectorsToProcess.push_back("LingAoIWS");
00027 m_detectorsToProcess.push_back("LingAoOWS");
00028 m_detectorsToProcess.push_back("FarAD1");
00029 m_detectorsToProcess.push_back("FarAD2");
00030 m_detectorsToProcess.push_back("FarAD3");
00031 m_detectorsToProcess.push_back("FarAD4");
00032 m_detectorsToProcess.push_back("FarIWS");
00033 m_detectorsToProcess.push_back("FarOWS");
00034
00035 declareProperty("DetectorsToProcess",m_detectorsToProcess,
00036 "List of detectors to process with this tool");
00037 declareProperty("TriggerOffset",m_triggerOffset=24,
00038 "Adjustable trigger offset for external triggering, in trigger clock cycles");
00039 declareProperty("Frequency",m_frequency=1.0*CLHEP::hertz,
00040 "Frequency of external triggering");
00041 declareProperty("AutoSet",m_autoSet=true,
00042 "Auto-set the external triggering based on electronics simulation input");
00043 }
00044
00045 TsExternalTriggerTool::~TsExternalTriggerTool(){}
00046
00047 StatusCode TsExternalTriggerTool::initialize()
00048 {
00049 return StatusCode::SUCCESS;
00050 }
00051
00052 StatusCode TsExternalTriggerTool::finalize()
00053 {
00054 return StatusCode::SUCCESS;
00055 }
00056
00057 StatusCode TsExternalTriggerTool::mutate(DayaBay::SimTrigHeader* trigHeader,
00058 const DayaBay::ElecHeader& elecHeader)
00059 {
00060 debug() << "running mutate()" << endreq;
00061 DayaBay::SimTrigCommandHeader* trigCH
00062 = const_cast<DayaBay::SimTrigCommandHeader*>(trigHeader->commandHeader());
00063
00064 const DayaBay::ElecCrateHeader* crateHeader = elecHeader.crateHeader();
00065 DayaBay::ElecCrateHeader::CrateMap cmap = crateHeader->crates();
00066 DayaBay::ElecCrateHeader::CrateMap::iterator detIterator;
00067
00068 std::vector<std::string>::iterator it;
00069 debug() << "processing " << m_detectorsToProcess.size()
00070 << " detectors." << endreq;
00071
00072
00073 for(it = m_detectorsToProcess.begin();
00074 it != m_detectorsToProcess.end();
00075 ++it){
00076 short int detId = DayaBay::Detector::siteDetPackedFromString(*it);
00077 DayaBay::Detector det(detId);
00078 debug() << "Processing " << *it << " which is " << det << endreq;
00079
00080
00081 DayaBay::SimTrigCommandCollection *tcc
00082 = new DayaBay::SimTrigCommandCollection();
00083 tcc->setHeader(trigCH);
00084 tcc->setDetector(det);
00085 trigCH->addCollection(tcc);
00086 detIterator = cmap.find(det);
00087 if(detIterator != cmap.end()){
00088
00089 debug() << "A crate was found for " << det
00090 << " processing..." << endreq;
00091
00092 int i = 0;
00093 if(m_autoSet){
00094 i = 0;
00095 }else{
00096
00097 error() << "Non-auto external triggering not yet implemented."
00098 << endreq;
00099 }
00100
00101 DayaBay::Trigger::TriggerType_t type = getTriggerType(det);
00102 i += m_triggerOffset;
00103 DayaBay::SimTrigCommand *tc = new DayaBay::SimTrigCommand(det,type,i,0,0,0);
00104 trigCH->addCommand(tc);
00105 debug() << "Adding Trigger at cycle\t" << i
00106 << " With type " << type << endreq;
00107 }
00108 }
00109 return StatusCode::SUCCESS;
00110 }
00111
00112 DayaBay::Trigger::TriggerType_t TsExternalTriggerTool::getTriggerType(DayaBay::Detector det){
00113 DayaBay::Trigger::TriggerType_t type = DayaBay::Trigger::kUnknown;
00114 if(det.detectorId() == DetectorId::kAD1) type = DayaBay::Trigger::kAD1;
00115 if(det.detectorId() == DetectorId::kAD2) type = DayaBay::Trigger::kAD2;
00116 if(det.detectorId() == DetectorId::kAD3) type = DayaBay::Trigger::kAD3;
00117 if(det.detectorId() == DetectorId::kAD4) type = DayaBay::Trigger::kAD4;
00118 if(det.detectorId() == DetectorId::kIWS) type = DayaBay::Trigger::kIWS;
00119 if(det.detectorId() == DetectorId::kOWS) type = DayaBay::Trigger::kOWS;
00120 return DayaBay::Trigger::TriggerType_t(DayaBay::Trigger::kExternal | type);
00121 }