/search.css" rel="stylesheet" type="text/css"/> /search.js">
00001 #include "ROsTriggerDataPackerTool.h" 00002 00003 #include "Conventions/Electronics.h" 00004 #include "Event/SimTrigCommand.h" 00005 #include "Event/SimRpcTrigCommand.h" 00006 #include "Event/SimTrigCommandHeader.h" 00007 #include "Event/SimTrigCommandCollection.h" 00008 #include "Event/ReadoutTriggerDataPkg.h" 00009 #include "Event/ReadoutTriggerDataFrame.h" 00010 00011 #include "CLHEP/Units/SystemOfUnits.h" 00012 00013 #include <vector> 00014 #include <map> 00015 00016 ROsTriggerDataPackerTool::ROsTriggerDataPackerTool(const std::string& type, 00017 const std::string& name, 00018 const IInterface* parent) 00019 : GaudiTool(type,name,parent) 00020 { 00021 declareInterface< IROsTriggerDataPackerTool >(this) ; 00022 declareProperty("RecoveryTime",m_recoveryCycles=12, 00023 "Number of (80 MHz) clock cycles for trigger recovery time"); 00024 //declareProperty("ReadoutCycles",m_roCycles, 00025 // "Clock Cycles to readout relative to reference"); 00026 } 00027 00028 ROsTriggerDataPackerTool::~ROsTriggerDataPackerTool(){} 00029 00030 StatusCode ROsTriggerDataPackerTool::initialize() 00031 { 00032 debug() << "Initializing Trigger Data Packer" << endreq; 00033 return StatusCode::SUCCESS; 00034 } 00035 00036 StatusCode ROsTriggerDataPackerTool::finalize() 00037 { 00038 debug() << "Finalizing Trigger Data Packer" << endreq; 00039 return StatusCode::SUCCESS; 00040 } 00041 00042 StatusCode ROsTriggerDataPackerTool::fillDataPackages(std::vector<DayaBay::ReadoutTriggerDataPkg*>& dataPkgs, 00043 const DayaBay::SimTrigHeader& trigHeader) 00044 { 00045 debug() << "Packing Trigger Data" << endreq; 00046 00048 const DayaBay::SimTrigCommandHeader *tch = trigHeader.commandHeader(); 00049 const DayaBay::SimTrigCommandHeader::detCollMap trigCollMap = tch->collections(); 00050 00051 DayaBay::SimTrigCommandHeader::detCollMap::const_iterator trigIt; 00052 00054 for(trigIt = trigCollMap.begin(); trigIt != trigCollMap.end(); ++trigIt) 00055 { 00056 DayaBay::Detector det(trigIt->first); 00057 debug() << "found " << (trigIt->second)->commands().size() << " commands for " << det.detName() << endreq; 00058 00059 DayaBay::SimTrigCommandCollection *triggerColl = trigIt->second ; 00060 const DayaBay::SimTrigCommandCollection::CommandContainer& detTriggers = triggerColl->commands(); 00061 DayaBay::SimTrigCommandCollection::CommandContainer::const_iterator tcIt; 00062 00063 DayaBay::ReadoutTriggerDataPkg *tdpkg = 0; 00064 int prevCycle=0; 00065 00066 if (!det.isRPC()) { // treat RPC triggers separately 00067 for(tcIt=detTriggers.begin();tcIt!=detTriggers.end();++tcIt){ 00068 verbose() << "Trigger: " << **tcIt << endreq; 00069 verbose() << "Creating Trigger Data Frame" << endreq; 00071 00072 DayaBay::ReadoutTriggerDataFrame *tdf = new DayaBay::ReadoutTriggerDataFrame(); 00073 tdf->setCycle((*tcIt)->clockCycle()); 00074 TimeStamp triggerTime( trigHeader.earliest() ); 00075 triggerTime.Add((*tcIt)->clockCycle() / double(DayaBay::NhitFrequencyHz)); 00076 tdf->setTriggerTime(triggerTime); 00077 tdf->setTriggerType((*tcIt)->type()); 00078 tdf->setNhit((*tcIt)->nhit()); 00079 tdf->setEsumAdc((*tcIt)->esumAdc()); 00080 tdf->setEsumComp((*tcIt)->esumComp()); 00081 00082 //tdf->setReadoutType(); 00083 //tdf->setCrossSource(); 00084 //tdf->setSeqNumber(); 00085 00086 // done by addFrame() so don't set package here 00087 // tdf->setPackage() 00088 00089 int thiscycle = (*tcIt)->clockCycle(); 00090 unsigned int dt = (unsigned int) (thiscycle-prevCycle); 00091 bool shouldBeMasked = dt < m_recoveryCycles; 00092 00094 if ( ! tdpkg || ! shouldBeMasked ){ 00096 verbose() << "Creating a new trigger data package" << endreq; 00097 tdpkg = new DayaBay::ReadoutTriggerDataPkg(); 00098 tdpkg->setDetector(det); 00099 tdpkg->addFrame(tdf); 00100 dataPkgs.push_back(tdpkg); 00101 prevCycle=thiscycle; 00102 }else{ 00105 debug() << "Adding a masked trigger" << endreq; 00106 if(!tdpkg){ 00107 fatal() << "This should never happen!!!\n" 00108 << "A trigger frame was produced " 00109 << "with not package to put it in" 00110 << endreq; 00111 return StatusCode::FAILURE; 00112 } 00113 tdpkg->addFrame(tdf); 00114 } 00115 verbose() << "Done Packing Detector " << *tdpkg << endreq; 00116 } 00117 } else { // we do RPC stuff 00118 // Q: is any RPC command masked? 00119 // A: don't think so 00120 // Q: how to treat different clock frequencies? 00121 // A: simply implement it. 00122 00123 // Loop over trigger commands for RPCs 00124 for(tcIt=detTriggers.begin();tcIt!=detTriggers.end();++tcIt){ 00125 const DayaBay::SimRpcTrigCommand* rtc = dynamic_cast<const DayaBay::SimRpcTrigCommand*>(*tcIt); 00126 if (!rtc) { 00127 return StatusCode::FAILURE; 00128 // FIXME: treat case when the trigger command is not RPC, 00129 // but still in the RPC detector. (Which should never happen) 00130 } 00131 00132 // Create and fill trigger data frame 00133 DayaBay::ReadoutRpcTriggerDataFrame *tdf = new DayaBay::ReadoutRpcTriggerDataFrame(); 00134 tdf->setIsRpc(true); 00135 tdf->setCycle(rtc->clockCycle()); 00136 00137 TimeStamp triggerTime( trigHeader.earliest() ); 00138 triggerTime.Add(rtc->clockCycle() / double(DayaBay::BaseFrequencyHz)); 00139 00140 tdf->setTriggerTime(triggerTime); 00141 tdf->setTriggerType((*tcIt)->type()); 00142 tdf->setInTriggers(rtc->inTriggers()); 00143 tdf->setOutTriggers(rtc->outTriggers()); 00144 00145 // create, fill, and register trigger data package 00146 tdpkg = new DayaBay::ReadoutTriggerDataPkg(); 00147 tdpkg->setDetector(det); 00148 tdpkg->addFrame(tdf); 00149 dataPkgs.push_back(tdpkg); 00150 tdpkg = 0; 00151 } 00152 } 00153 debug() << "Done Packing Triggers. " << endreq; 00154 } 00155 00156 return StatusCode::SUCCESS; 00157 } 00158