27 for(std::list<int>::const_iterator iter = path.begin(); iter != path.end(); ++iter)
29 if(*iter < 0)
continue;
30 uniqueTrIDs.push_back(*iter);
37 for(
unsigned int i = 0; i <
NTRPLANES; ++i)
40 TB = TB + (((detectorID & 1) == 0) ? 1 : -1);
44 if(TB == -4)
return -1;
52 for(
unsigned int i = 0; i <
NTRPLANES; ++i)
58 uniqueTrIDs[i] = detectorID*1000 + elementID;
64 for(
unsigned int i = 0; i <
NTRPLANES; ++i)
66 if(uniqueTrIDs[i] != elem.uniqueTrIDs[i])
return false;
74 return sigWeight < elem.sigWeight;
80 for(
unsigned int i = 0; i < uniqueTrIDs.size(); ++i)
82 sid = sid + Form(
"%06d", uniqueTrIDs[i]);
90 os <<
"Trigger Road ID = " << road.roadID <<
", signal = " << road.sigWeight <<
", bkg = " << road.bkgRate <<
"\n ";
91 for(
unsigned int i = 0; i <
NTRPLANES; ++i)
93 os << road.uniqueTrIDs[i] <<
" == ";
103 _road_set_file_name(
"trigger_67.txt"),
106 _run_header(nullptr),
107 _event_header(nullptr),
132 int charge = (int) -1e3, roadID = -1;
133 int uIDs[
NTRPLANES] = { -1, -1, -1, -1 };
134 double pXmin = -1.e6, sigWeight = -1.e6, bkgRate = -1.e6;
136 std::ifstream fin(gSystem->ExpandPathName(_road_set_file_name.c_str()), std::ifstream::in);
138 while (getline(fin, line)) {
139 stringstream ss(line);
141 ss >> charge >> roadID;
144 ss >> pXmin >> sigWeight >> bkgRate;
154 roads[(-charge + 1) / 2].insert(
155 std::map<TString, DPTriggerRoad>::value_type(road.
getStringID(),
160 LogInfo(
"NIM Only mode NOT supported now.");
171 return GetNodes(topNode);
179 map<int, int> nhit_det;
180 for (Int_t ihit = 0; ihit < _hit_vector->
size(); ++ihit) {
201 bool nim1_on = _mode_nim1 ==
NIM_AND ? HYL && HYR : HYL || HYR;
202 bool nim2_on = _mode_nim2 ==
NIM_AND ? HXT && HXB : HXT || HXB;
209 for(Int_t ihit = 0; ihit < _hit_vector->
size(); ++ihit) {
210 SQHit *hit=_hit_vector->
at(ihit);
216 bool all_planes_have_hits =
true;
218 if (data[i].empty()) {
219 all_planes_have_hits =
false;
225 for(
int i = 0; i < 2; ++i) {
227 roads_found[i].clear();
228 if (all_planes_have_hits)
searchMatrix(matrix[i], 0, i);
236 int nHiPxPlusTop = 0;
237 int nHiPxPlusBot = 0;
238 int nHiPxMinusTop = 0;
239 int nHiPxMinusBot = 0;
241 for (std::list<DPTriggerRoad>::iterator iter = roads_found[0].begin();
242 iter != roads_found[0].end(); ++iter) {
243 if (iter->getTB() > 0) {
245 if (iter->getPxMin() > 3.) ++nHiPxPlusTop;
248 if (iter->getPxMin() > 3.) ++nHiPxPlusBot;
252 for (std::list<DPTriggerRoad>::iterator iter = roads_found[1].begin();
253 iter != roads_found[1].end(); ++iter) {
254 if (iter->getTB() > 0) {
256 if (iter->getPxMin() > 3.) ++nHiPxMinusTop;
259 if (iter->getPxMin() > 3.) ++nHiPxMinusBot;
263 bool fpga1_on = (nPlusTop > 0 && nMinusBot > 0) || (nPlusBot > 0 && nMinusTop > 0);
264 bool fpga2_on = (nPlusTop > 0 && nMinusTop > 0) || (nPlusBot > 0 && nMinusBot > 0);
265 bool fpga3_on = (nPlusTop > 0 && nPlusBot > 0) || (nMinusTop > 0 && nMinusBot > 0);
266 bool fpga4_on = nPlusTop > 0 || nMinusTop > 0 || nPlusBot > 0 || nMinusBot > 0 ;
267 bool fpga5_on = nHiPxPlusTop > 0 || nHiPxMinusTop > 0 || nHiPxPlusBot > 0 || nHiPxMinusBot > 0;
283 _event_header = findNode::getClass<SQEvent>(topNode,
"SQEvent");
284 if (!_event_header) {
289 _hit_vector = findNode::getClass<SQHitVector>(topNode,
"SQHitVector");
303 for (
int i = 0; i < 2; ++i) {
305 for (std::map<TString, DPTriggerRoad>::iterator iter = roads[i].begin(); iter != roads[i].end(); ++iter) {
307 parentNode[0] = matrix[i];
309 int uniqueID = iter->second.getTrID(j);
310 bool isNewNode =
true;
311 for (std::list<MatrixNode*>::iterator jter = parentNode[j]->children.begin(); jter != parentNode[j]->
children.end(); ++jter) {
312 if (uniqueID == (*jter)->uniqueID) {
313 parentNode[j + 1] = *jter;
322 parentNode[j]->
add(newNode);
323 parentNode[j + 1] = newNode;
338 if (roads[index].find(road_found.
getStringID()) != roads[index].end())
339 roads_found[index].push_back(road_found);
345 for (std::list<MatrixNode*>::iterator iter = node->
children.begin(); iter != node->
children.end(); ++iter) {
346 if (data[level].find((*iter)->uniqueID) == data[level].end())
354 if (node ==
NULL)
return;
356 for (std::list<MatrixNode*>::iterator iter = node->
children.begin(); iter != node->
children.end(); ++iter) {
364 for (
unsigned int i = 1; i <
NTRPLANES; ++i) {
365 std::cout <<
"Lv. " << i <<
": ";
366 for (std::set<int>::iterator iter = data[i].begin(); iter != data[i].end(); ++iter) {
367 std::cout << *iter <<
" ";
369 std::cout << std::endl;
374 std::cout <<
"Found one road: " << std::endl;
375 for (std::list<int>::iterator iter = path.begin(); iter != path.end(); ++iter) {
376 std::cout << *iter <<
" === ";
378 std::cout << std::endl;
390 children.push_back(child);
bool operator<(const DPTriggerRoad &elem) const
void printHitPattern()
Helper functions to print various things.
void setBkgRate(double rate)
int Init(PHCompositeNode *topNode)
void buildTriggerMatrix()
Build the trigger matrix by the input roads list.
void add(MatrixNode *child)
add a child
int End(PHCompositeNode *topNode)
Called at the end of all processing.
int InitRun(PHCompositeNode *topNode)
bool operator==(const DPTriggerRoad &elem) const
comparison
DPTriggerAnalyzer(const std::string &name="DPTriggerAnalyzer")
An SQ interface class to hold one detector hit.
int getTrElementID(unsigned int i) const
void searchMatrix(MatrixNode *node, int level, int index)
Test the trigger pattern.
void setSigWeight(double weight)
void flipTB()
flip the LR or TB
void deleteMatrix(MatrixNode *node)
Tree deletion.
void addTrElement(int uniqueID)
add one hit into the road
int process_event(PHCompositeNode *topNode)
std::basic_ostream< E, T > & operator<<(std::basic_ostream< E, T > &os, shared_ptr< Y > const &p)
std::list< MatrixNode * > children
virtual void set_trigger(const SQEvent::TriggerMask i, const bool a)=0
virtual const SQHit * at(const size_t idkey) const
virtual short get_detector_id() const
Return the detector ID of this hit.
virtual ~DPTriggerAnalyzer()
int getTB()
Get the sign of LR or TB.
static GeomSvc * instance()
singlton instance
virtual size_t size() const
int getDetectorID(const std::string &detectorName) const
Get the plane position.
virtual short get_element_id() const
Return the element ID of this hit.
void set_nim_mode(const NimMode nim1, const NimMode nim2)
void setPxMin(double pxmin)
void setRoadID(int id)
Sets.
int getTrDetectorID(unsigned int i) const
int getHodoStation(const int detectorID) const