![]() |
![]() |
00001 #include "SimCalorimetry/HcalZeroSuppressionAlgos/interface/HcalZeroSuppressionAlgo.h" 00002 #include "Geometry/HcalTowerAlgo/interface/HcalTrigTowerGeometry.h" 00003 00004 HcalZeroSuppressionAlgo::HcalZeroSuppressionAlgo(ZSMode mode) : m_mode(mode) { 00005 } 00006 00007 00008 void HcalZeroSuppressionAlgo::suppress(const HBHEDigiCollection& input, HBHEDigiCollection& output) { 00009 HBHEDigiCollection::const_iterator i; 00010 if (m_mode==zs_SingleChannel) { 00011 for (i=input.begin(); i!=input.end(); ++i) 00012 if (shouldKeep(*i)) output.push_back(*i); 00013 } else if (m_mode==zs_TriggerTowerOR || m_mode==zs_AllDepthsOR) { 00014 HcalTrigTowerGeometry ttg; 00015 std::set<HcalTrigTowerDetId> passed; 00016 // get list of above-threshold trigger tower ids 00017 for (i=input.begin(); i!=input.end(); ++i) 00018 if (shouldKeep(*i)) { 00019 std::vector<HcalTrigTowerDetId> tids=ttg.towerIds(i->id()); 00020 if (!tids.empty()) passed.insert(tids[0]); // only use the first (order is stable for all channels) 00021 } 00022 // loop over digis again, checking to see if trig tower had passed 00023 for (i=input.begin(); i!=input.end(); ++i) { 00024 std::vector<HcalTrigTowerDetId> tids=ttg.towerIds(i->id()); 00025 if (!tids.empty() && passed.find(tids[0])!=passed.end()) output.push_back(*i); 00026 } 00027 } 00028 } 00029 00030 void HcalZeroSuppressionAlgo::suppress(const HFDigiCollection& input, HFDigiCollection& output) { 00031 HFDigiCollection::const_iterator i; 00032 if (m_mode==zs_SingleChannel) { 00033 for (i=input.begin(); i!=input.end(); ++i) 00034 if (shouldKeep(*i)) output.push_back(*i); 00035 } else if (m_mode==zs_TriggerTowerOR) { 00036 HcalTrigTowerGeometry ttg; 00037 std::set<HcalTrigTowerDetId> passed; 00038 // get list of above-threshold trigger tower ids 00039 for (i=input.begin(); i!=input.end(); ++i) 00040 if (shouldKeep(*i)) { 00041 std::vector<HcalTrigTowerDetId> tids=ttg.towerIds(i->id()); 00042 if (!tids.empty()) passed.insert(tids[0]); // only use the first (order is stable for all channels) 00043 } 00044 // loop over digis again, checking to see if trig tower had passed 00045 for (i=input.begin(); i!=input.end(); ++i) { 00046 std::vector<HcalTrigTowerDetId> tids=ttg.towerIds(i->id()); 00047 if (!tids.empty() && passed.find(tids[0])!=passed.end()) output.push_back(*i); 00048 } 00049 } else if (m_mode==zs_AllDepthsOR) { 00050 std::set<HcalDetId> passed; 00051 // get list of above-threshold trigger tower ids 00052 for (i=input.begin(); i!=input.end(); ++i) 00053 if (shouldKeep(*i)) { 00054 passed.insert(i->id()); 00055 } 00056 // loop over digis again, checking to see if trig tower had passed 00057 for (i=input.begin(); i!=input.end(); ++i) { 00058 HcalDetId a(HcalForward,i->id().ieta(),i->id().iphi(),1); // depth 1 00059 HcalDetId b(HcalForward,i->id().ieta(),i->id().iphi(),2); // depth 2 00060 if (passed.find(a)!=passed.end() || passed.find(b)!=passed.end()) output.push_back(*i); 00061 } 00062 } 00063 } 00064 00065 void HcalZeroSuppressionAlgo::suppress(const HODigiCollection& input, HODigiCollection& output) { 00066 if (m_mode==zs_SingleChannel || m_mode==zs_TriggerTowerOR || m_mode==zs_AllDepthsOR) { 00067 HODigiCollection::const_iterator i; 00068 for (i=input.begin(); i!=input.end(); ++i) 00069 if (shouldKeep(*i)) output.push_back(*i); 00070 } 00071 } 00072 00073 00074 00075