/search.css" rel="stylesheet" type="text/css"/> /search.js">
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

ROsTriggerDataPackerTool.cc
Go to the documentation of this file.
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 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Fri May 16 2014 10:17:05 for ReadoutSim by doxygen 1.7.4