00001 #include "TsMultTriggerTool.h"
00002
00003 #include "Conventions/Detectors.h"
00004 #include "Conventions/Trigger.h"
00005 #include "Conventions/Site.h"
00006
00007 #include "Event/ElecCrateHeader.h"
00008 #include "Event/ElecFeeCrate.h"
00009
00010 #include "Event/SimTrigCommand.h"
00011 #include "Event/SimTrigCommandHeader.h"
00012 #include "Event/SimTrigCommandCollection.h"
00013
00014
00015 TsMultTriggerTool::TsMultTriggerTool(const std::string& type,
00016 const std::string& name,
00017 const IInterface* parent)
00018 : GaudiTool(type,name,parent)
00019 {
00020 declareInterface< ITsTriggerTool >(this) ;
00021
00022 m_detectorsToProcess.push_back("DayaBayAD1");
00023 m_detectorsToProcess.push_back("DayaBayAD2");
00024 m_detectorsToProcess.push_back("DayaBayIWS");
00025 m_detectorsToProcess.push_back("DayaBayOWS");
00026 m_detectorsToProcess.push_back("LingAoAD1");
00027 m_detectorsToProcess.push_back("LingAoAD2");
00028 m_detectorsToProcess.push_back("LingAoIWS");
00029 m_detectorsToProcess.push_back("LingAoOWS");
00030 m_detectorsToProcess.push_back("FarAD1");
00031 m_detectorsToProcess.push_back("FarAD2");
00032 m_detectorsToProcess.push_back("FarAD3");
00033 m_detectorsToProcess.push_back("FarAD4");
00034 m_detectorsToProcess.push_back("FarIWS");
00035 m_detectorsToProcess.push_back("FarOWS");
00036
00037 m_NHitThresholdMap["DayaBayAD1"]=DayaBay::Trigger::kADthreshold;
00038 m_NHitThresholdMap["DayaBayAD2"]=DayaBay::Trigger::kADthreshold;
00039 m_NHitThresholdMap["DayaBayIWS"]=DayaBay::Trigger::kNearIWSthreshold;
00040 m_NHitThresholdMap["DayaBayOWS"]=DayaBay::Trigger::kNearOWSthreshold;
00041 m_NHitThresholdMap["LingAoAD1"]=DayaBay::Trigger::kADthreshold;
00042 m_NHitThresholdMap["LingAoAD2"]=DayaBay::Trigger::kADthreshold;
00043 m_NHitThresholdMap["LingAoIWS"]=DayaBay::Trigger::kNearIWSthreshold;
00044 m_NHitThresholdMap["LingAoOWS"]=DayaBay::Trigger::kNearOWSthreshold;
00045 m_NHitThresholdMap["FarAD1"]=DayaBay::Trigger::kADthreshold;
00046 m_NHitThresholdMap["FarAD2"]=DayaBay::Trigger::kADthreshold;
00047 m_NHitThresholdMap["FarAD3"]=DayaBay::Trigger::kADthreshold;
00048 m_NHitThresholdMap["FarAD4"]=DayaBay::Trigger::kADthreshold;
00049 m_NHitThresholdMap["FarIWS"]=DayaBay::Trigger::kFarIWSthreshold;
00050 m_NHitThresholdMap["FarOWS"]=DayaBay::Trigger::kFarOWSthreshold;
00051
00052
00053 declareProperty("DetectorsToProcess",m_detectorsToProcess,
00054 "List of detectors to process with this tool");
00055 declareProperty("RecoveryTime",m_recoveryCycles=8,
00056 "Number of nhit (80MHz) clock cycles for trigger dead time");
00057 declareProperty("NHitTriggerThreshold",m_NHitThresholdMap,
00058 "Map indexed by detector name with Nhit Thresold");
00059
00060 declareProperty("ADThreshold",
00061 m_ADThreshold = DayaBay::Trigger::kADthreshold,
00062 "DEPRICATED NHit threshold for AD Multiplicty Trigger");
00063 declareProperty("FarIWSThreshold",
00064 m_FarIWSThreshold=DayaBay::Trigger::kFarIWSthreshold,
00065 "DEPRICATED NHit threshold for FarIWS Multiplicity Trigger");
00066 declareProperty("FarOWSThreshold",
00067 m_FarOWSThreshold=DayaBay::Trigger::kFarOWSthreshold,
00068 "DEPRICATED NHit threshold for FarOWS Multiplicity Trigger");
00069 declareProperty("NearIWSThreshold",
00070 m_NearIWSThreshold=DayaBay::Trigger::kNearIWSthreshold,
00071 "NHit threshold for NearIWS Multiplicity Trigger");
00072 declareProperty("NearOWSThreshold",
00073 m_NearOWSThreshold=DayaBay::Trigger::kNearOWSthreshold,
00074 "DEPRICATED NHit threshold for NearOWS Multiplicity Trigger");
00075 }
00076
00077 TsMultTriggerTool::~TsMultTriggerTool(){}
00078
00079 StatusCode TsMultTriggerTool::initialize()
00080 {
00081 std::vector<std::string>::iterator it;
00082
00083
00084 for(it = m_detectorsToProcess.begin();
00085 it != m_detectorsToProcess.end();
00086 ++it){
00087 short int detId = DayaBay::Detector::siteDetPackedFromString(*it);
00088 DayaBay::Detector det(detId);
00089 info() << det
00090 << " is setup with threshold "
00091 << getThreshold(det)
00092 << endreq;
00093 }
00094
00095 if(m_ADThreshold != (int) DayaBay::Trigger::kADthreshold){
00096 warning() << "ADThreshold Depricated use NHitTriggerThreshold"
00097 << endreq;
00098 }
00099 if(m_NearIWSThreshold != (int) DayaBay::Trigger::kNearIWSthreshold){
00100 warning() << "NearIWSThreshold Depricated use NHitTriggerThreshold"
00101 << endreq;
00102 }
00103 if(m_NearOWSThreshold != (int) DayaBay::Trigger::kNearOWSthreshold){
00104 warning() << "NearOWSThreshold Depricated use NHitTriggerThreshold"
00105 << endreq;
00106 }
00107 if(m_FarIWSThreshold != (int) DayaBay::Trigger::kFarIWSthreshold){
00108 warning() << "FarIWSThreshold Depricated use NHitTriggerThreshold"
00109 << endreq;
00110 }
00111 if(m_FarOWSThreshold != (int) DayaBay::Trigger::kFarOWSthreshold){
00112 warning() << "FarOWSThreshold Depricated use NHitTriggerThreshold"
00113 << endreq;
00114 }
00115
00116 return StatusCode::SUCCESS;
00117 }
00118
00119 StatusCode TsMultTriggerTool::finalize()
00120 {
00121 return StatusCode::SUCCESS;
00122 }
00123
00124 StatusCode TsMultTriggerTool::fillTriggers(DayaBay::SimTrigHeader* trigHeader,
00125 const DayaBay::ElecHeader& elecHeader)
00126 {
00127 debug() << "running fillTriggers()" << endreq;
00128 DayaBay::SimTrigCommandHeader* trigCH
00129 = const_cast<DayaBay::SimTrigCommandHeader*>(trigHeader->commandHeader());
00130
00131 const DayaBay::ElecCrateHeader* crateHeader = elecHeader.crateHeader();
00132 DayaBay::ElecCrateHeader::CrateMap cmap = crateHeader->crates();
00133 DayaBay::ElecCrateHeader::CrateMap::iterator detIterator;
00134
00135 std::vector<std::string>::iterator it;
00136 debug() << "processing " << m_detectorsToProcess.size() << " detectors." << endreq;
00137
00138
00139 for(it = m_detectorsToProcess.begin();
00140 it != m_detectorsToProcess.end();
00141 ++it){
00142 short int detId = DayaBay::Detector::siteDetPackedFromString(*it);
00143 DayaBay::Detector det(detId);
00144 verbose() << "Processing " << *it << " which is " << det << endreq;
00145
00146 const DayaBay::SimTrigCommandHeader::detCollMap trigCollMap = trigCH->collections();
00147
00148 detIterator = cmap.find(det);
00149 if(detIterator != cmap.end()){
00150
00151 debug() << "A crate was found for " << det
00152 << " processing..." << endreq;
00153
00154
00155
00156 if(trigCollMap.find(det) == trigCollMap.end()){
00157 DayaBay::SimTrigCommandCollection *tcc = new DayaBay::SimTrigCommandCollection();
00158 tcc->setHeader(trigCH);
00159 tcc->setDetector(det);
00160 trigCH->addCollection(tcc);
00161 }
00162
00163 DayaBay::ElecFeeCrate *crate
00164 = dynamic_cast<DayaBay::ElecFeeCrate*>(cmap[det]);
00165
00166 DayaBay::ElecFeeCrate::DigitalMap hits = crate->nhit();
00167 DayaBay::ElecFeeCrate::DigitalMap::iterator brIt;
00168 DayaBay::DigitalSignal bSum;
00169
00170
00171 for(brIt = hits.begin(); brIt != hits.end(); ++brIt){
00172 if(bSum.empty()) bSum.resize((brIt->second).size(),0);
00173 DayaBay::DigitalSignal bSig= brIt->second;
00174
00175 for(size_t i = 0; i != bSig.size(); ++i){
00176
00177 bSum.at(i)+=bSig.at(i);
00178 }
00179 }
00180
00181 unsigned int threshold = getThreshold(det);
00182 verbose() << "Trigger Threshold " << threshold
00183 << " Board Sum Size " << bSum.size() << endreq;
00184
00185
00186 int maxNsum = -1;
00187 for(unsigned int i=0; i < bSum.size(); ++i){
00188 if( maxNsum < bSum[i] ) maxNsum = bSum[i];
00189 }
00190 debug() << "Max multiplicity for " << det << " is " << maxNsum << endreq;
00191
00192
00193 for(unsigned int i=0; i < bSum.size(); ++i){
00194 verbose() << "Board sum entry for cycle #"<< i << "\t is " << bSum[i] << endreq;
00195 if ( (unsigned int)bSum[i] >= threshold ){
00196 DayaBay::Trigger::TriggerType_t type = getTriggerType(det);
00199 DayaBay::SimTrigCommand *tc = new DayaBay::SimTrigCommand(det,type,i,bSum[i],0,0);
00200 debug() << "Adding Trigger at cycle\t" << i
00201 << " With type " << type << endreq;
00202 verbose() << "Waiting " << m_recoveryCycles << " cycles to recover" << endreq;
00203 i += m_recoveryCycles;
00204 trigCH->addCommand(tc);
00205 }
00206 }
00207
00208 }
00209 }
00210 return StatusCode::SUCCESS;
00211 }
00212
00213
00214 StatusCode TsMultTriggerTool::mutate(DayaBay::SimTrigHeader* trigHeader,
00215 const DayaBay::ElecHeader& elecHeader)
00216 {
00217 return fillTriggers(trigHeader,elecHeader);
00218 }
00219
00220
00221
00222 unsigned int TsMultTriggerTool::getThreshold(DayaBay::Detector det){
00223 if( m_NHitThresholdMap.find(det.detName())
00224 != m_NHitThresholdMap.end() ){
00225 return m_NHitThresholdMap[det.detName()];
00226 }
00227 warning() << "Requesting a NHit threshold for " << det.detName()
00228 << " but none was specified in input map " << endreq;
00229 warning() << "Using default value as defined in Conventions/Trigger.h"
00230 << endreq;
00231 if(det.detectorId() == DetectorId::kAD1 ||
00232 det.detectorId() == DetectorId::kAD2 ||
00233 det.detectorId() == DetectorId::kAD3 ||
00234 det.detectorId() == DetectorId::kAD4 ){
00235 return DayaBay::Trigger::kADthreshold;
00236 }
00237 if(det.detectorId() == DetectorId::kIWS){
00238 if(det.site() == Site::kFar){
00239 return DayaBay::Trigger::kFarIWSthreshold;
00240 }else{
00241 return DayaBay::Trigger::kNearIWSthreshold;
00242 }
00243 }
00244 if(det.detectorId() == DetectorId::kOWS){
00245 if(det.site() == Site::kFar){
00246 return DayaBay::Trigger::kFarOWSthreshold;
00247 }else{
00248 return DayaBay::Trigger::kNearOWSthreshold;
00249 }
00250 }
00251 return 0;
00252 }
00253
00254 DayaBay::Trigger::TriggerType_t TsMultTriggerTool::getTriggerType(DayaBay::Detector det){
00255 DayaBay::Trigger::TriggerType_t type = DayaBay::Trigger::kUnknown;
00256 if(det.detectorId() == DetectorId::kAD1) type = DayaBay::Trigger::kAD1;
00257 if(det.detectorId() == DetectorId::kAD2) type = DayaBay::Trigger::kAD2;
00258 if(det.detectorId() == DetectorId::kAD3) type = DayaBay::Trigger::kAD3;
00259 if(det.detectorId() == DetectorId::kAD4) type = DayaBay::Trigger::kAD4;
00260 if(det.detectorId() == DetectorId::kIWS) type = DayaBay::Trigger::kIWS;
00261 if(det.detectorId() == DetectorId::kOWS) type = DayaBay::Trigger::kOWS;
00262 return DayaBay::Trigger::TriggerType_t(DayaBay::Trigger::kMult | type);
00263 }