Skip to content

Commit 22e6afc

Browse files
authored
EventSelector modifications for new MC waveform hits (#330)
* Adjust EventSelector logic to handle MC waveforms Another downstream tool modification to adjust how the tool uses MC hits that are coming from the waveform generator. * Update README.md Added config variable that tells EventSelector to use MC waveform hits rather than the default MC hits. * Update EventSelector.cpp Added skip event for PMTWaveformSim * Update EventSelector.cpp Cleaned up logic * Update EventSelector.cpp - code condensed by merging data and MC logic together - removed the event skipping check
1 parent 49a9530 commit 22e6afc

File tree

3 files changed

+107
-93
lines changed

3 files changed

+107
-93
lines changed

UserTools/EventSelector/EventSelector.cpp

Lines changed: 105 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ bool EventSelector::Initialise(std::string configfile, DataModel &data){
1414

1515
fPMTMRDOffset = false;
1616
fIsMC = true;
17+
fMCWaveform = false;
1718
fPMTMRDOffset = 755;
1819
fRecoPDG = -1;
1920

@@ -50,6 +51,7 @@ bool EventSelector::Initialise(std::string configfile, DataModel &data){
5051
}
5152
m_variables.Get("SaveStatusToStore", fSaveStatusToStore);
5253
m_variables.Get("IsMC",fIsMC);
54+
m_variables.Get("PMTWaveformSim",fMCWaveform);
5355
m_variables.Get("RecoPDG",fRecoPDG);
5456
m_variables.Get("TriggerExtendedWindow",fTriggerExtended);
5557
m_variables.Get("BeamOK",fBeamOK);
@@ -94,7 +96,7 @@ bool EventSelector::Execute(){
9496
Log("EventSelector Tool: No ANNIEEvent store!",v_error,verbosity);
9597
return false;
9698
};
97-
99+
98100
// ANNIE Event number
99101
m_data->Stores.at("ANNIEEvent")->Get("EventNumber",fEventNumber);
100102

@@ -631,12 +633,12 @@ bool EventSelector::EventSelectionByMCProjectedMRDHit() {
631633

632634
bool EventSelector::EventSelectionByPMTMRDCoinc() {
633635

634-
if (fIsMC){
635-
bool has_clustered_pmt = m_data->CStore.Get("ClusterMapMC",m_all_clusters_MC);
636-
if (not has_clustered_pmt) { Log("EventSelector Tool: Error retrieving ClusterMapMC from CStore, did you run ClusterFinder beforehand?",v_error,verbosity); return false; }
636+
if (!fIsMC || fMCWaveform) {
637+
bool has_clustered_pmt = m_data->CStore.Get("ClusterMap",m_all_clusters);
638+
if (not has_clustered_pmt) { Log("EventSelector Tool: MCWaveform - Error retrieving ClusterMap from CStore, did you run ClusterFinder beforehand?",v_error,verbosity); return false; }
637639
} else {
638-
bool has_clustered_pmt = m_data->CStore.Get("ClusterMap",m_all_clusters);
639-
if (not has_clustered_pmt) { Log("EventSelector Tool: Error retrieving ClusterMap from CStore, did you run ClusterFinder beforehand?",v_error,verbosity); return false; }
640+
bool has_clustered_pmt = m_data->CStore.Get("ClusterMapMC",m_all_clusters_MC);
641+
if (not has_clustered_pmt) { Log("EventSelector Tool: Error retrieving ClusterMapMC from CStore, did you run ClusterFinder beforehand?",v_error,verbosity); return false; }
640642
}
641643

642644
bool has_clustered_mrd = m_data->CStore.Get("MrdTimeClusters",MrdTimeClusters);
@@ -649,8 +651,12 @@ bool EventSelector::EventSelectionByPMTMRDCoinc() {
649651
}
650652

651653
int pmt_cluster_size;
652-
if (fIsMC) pmt_cluster_size = (int) m_all_clusters_MC->size();
653-
else pmt_cluster_size = (int) m_all_clusters->size();
654+
if (!fIsMC || fMCWaveform) {
655+
pmt_cluster_size = (int) m_all_clusters->size();
656+
} else {
657+
pmt_cluster_size = (int) m_all_clusters_MC->size();
658+
}
659+
654660
m_data->Stores["RecoEvent"]->Set("NumPMTClusters",pmt_cluster_size);
655661
vec_pmtclusters_charge->clear();
656662
vec_pmtclusters_time->clear();
@@ -667,7 +673,42 @@ bool EventSelector::EventSelectionByPMTMRDCoinc() {
667673

668674
pmt_time = -1;
669675

670-
if (fIsMC){
676+
// MC Waveform or Data
677+
if (!fIsMC || fMCWaveform) {
678+
if (m_all_clusters->size()){
679+
double cluster_time;
680+
for(std::pair<double,std::vector<Hit>>&& apair : *m_all_clusters){
681+
std::vector<Hit>&Hits = apair.second;
682+
double time_temp = 0;
683+
double charge_temp = 0;
684+
for (unsigned int i_hit = 0; i_hit < Hits.size(); i_hit++){
685+
time_temp+=Hits.at(i_hit).GetTime();
686+
int tube = Hits.at(i_hit).GetTubeId();
687+
// check if PMT is present in the map before accessing it
688+
auto it = ChannelNumToTankPMTSPEChargeMap->find(tube);
689+
if (it != ChannelNumToTankPMTSPEChargeMap->end()) {
690+
double charge_pe = Hits.at(i_hit).GetCharge() / it->second;
691+
charge_temp += charge_pe;
692+
} else {
693+
std::cerr << "PMT channel with hit not found in ChannelNumToTankPMTSPEChargeMap. Skipping this hit." << std::endl;
694+
continue;
695+
}
696+
}
697+
if (Hits.size()>0) time_temp/=Hits.size();
698+
vec_pmtclusters_charge->push_back(charge_temp);
699+
vec_pmtclusters_time->push_back(time_temp);
700+
if (time_temp > 2000.) continue; //not a prompt event
701+
if (charge_temp > max_charge){
702+
max_charge = charge_temp;
703+
prompt_cluster = true;
704+
pmt_time = time_temp;
705+
n_hits = int(Hits.size());
706+
}
707+
}
708+
}
709+
710+
// MC (parametric)
711+
} else {
671712
if (m_all_clusters_MC->size()){
672713
double cluster_time;
673714
for(std::pair<double,std::vector<MCHit>>&& apair : *m_all_clusters_MC){
@@ -690,38 +731,6 @@ bool EventSelector::EventSelectionByPMTMRDCoinc() {
690731
}
691732
}
692733
}
693-
} else {
694-
if (m_all_clusters->size()){
695-
double cluster_time;
696-
for(std::pair<double,std::vector<Hit>>&& apair : *m_all_clusters){
697-
std::vector<Hit>&Hits = apair.second;
698-
double time_temp = 0;
699-
double charge_temp = 0;
700-
for (unsigned int i_hit = 0; i_hit < Hits.size(); i_hit++){
701-
time_temp+=Hits.at(i_hit).GetTime();
702-
int tube = Hits.at(i_hit).GetTubeId();
703-
// check if PMT is present in the map before accessing it
704-
auto it = ChannelNumToTankPMTSPEChargeMap->find(tube);
705-
if (it != ChannelNumToTankPMTSPEChargeMap->end()) {
706-
double charge_pe = Hits.at(i_hit).GetCharge() / it->second;
707-
charge_temp += charge_pe;
708-
} else {
709-
std::cerr << "PMT channel with hit not found in ChannelNumToTankPMTSPEChargeMap. Skipping this hit." << std::endl;
710-
continue;
711-
}
712-
}
713-
if (Hits.size()>0) time_temp/=Hits.size();
714-
vec_pmtclusters_charge->push_back(charge_temp);
715-
vec_pmtclusters_time->push_back(time_temp);
716-
if (time_temp > 2000.) continue; //not a prompt event
717-
if (charge_temp > max_charge){
718-
max_charge = charge_temp;
719-
prompt_cluster = true;
720-
pmt_time = time_temp;
721-
n_hits = int(Hits.size());
722-
}
723-
}
724-
}
725734
}
726735

727736
if (verbosity > 1) {
@@ -762,10 +771,14 @@ bool EventSelector::EventSelectionByPMTMRDCoinc() {
762771
}
763772
m_data->Stores["RecoEvent"]->Set("MRDClustersTime",vec_mrdclusters_time, true);
764773

765-
if (fIsMC){
766-
if (MrdTimeClusters.size() == 0 || m_all_clusters_MC->size() == 0) return false;
774+
if (fIsMC) {
775+
if (MrdTimeClusters.size() == 0 || (fMCWaveform ? m_all_clusters->size() == 0 : m_all_clusters_MC->size() == 0)) {
776+
return false;
777+
}
767778
} else {
768-
if (MrdTimeClusters.size() == 0 || m_all_clusters->size() == 0) return false;
779+
if (MrdTimeClusters.size() == 0 || m_all_clusters->size() == 0) {
780+
return false;
781+
}
769782
}
770783

771784
pmtmrd_coinc_min = fPMTMRDOffset - 50;
@@ -1026,12 +1039,12 @@ bool EventSelector::FindPaddleChankey(double x, double y, int layer, unsigned lo
10261039

10271040
bool EventSelector::EventSelectionByRecoPDG(int recoPDG, std::vector<double> & cluster_reco_pdg){
10281041

1029-
if (fIsMC){
1030-
bool has_clustered_pmt = m_data->CStore.Get("ClusterMapMC",m_all_clusters_MC);
1031-
if (not has_clustered_pmt) { Log("EventSelector Tool: Error retrieving ClusterMapMC from CStore, did you run ClusterFinder beforehand?",v_error,verbosity); return false; }
1042+
if (!fIsMC || fMCWaveform) {
1043+
bool has_clustered_pmt = m_data->CStore.Get("ClusterMap",m_all_clusters);
1044+
if (not has_clustered_pmt) { Log("EventSelector Tool: Error retrieving ClusterMap from CStore, did you run ClusterFinder beforehand?",v_error,verbosity); return false; }
10321045
} else {
1033-
bool has_clustered_pmt = m_data->CStore.Get("ClusterMap",m_all_clusters);
1034-
if (not has_clustered_pmt) { Log("EventSelector Tool: Error retrieving ClusterMap from CStore, did you run ClusterFinder beforehand?",v_error,verbosity); return false; }
1046+
bool has_clustered_pmt = m_data->CStore.Get("ClusterMapMC",m_all_clusters_MC);
1047+
if (not has_clustered_pmt) { Log("EventSelector Tool: Error retrieving ClusterMapMC from CStore, did you run ClusterFinder beforehand?",v_error,verbosity); return false; }
10351048
}
10361049

10371050
std::map<double,double> ClusterMaxPEs;
@@ -1045,52 +1058,51 @@ bool EventSelector::EventSelectionByRecoPDG(int recoPDG, std::vector<double> & c
10451058
bool found_pdg = false;
10461059

10471060
if (fabs(recoPDG)==2112){
1048-
if (fIsMC){
1049-
if (m_all_clusters_MC->size()){
1050-
for(std::pair<double,std::vector<MCHit>>&& apair : *m_all_clusters_MC){
1051-
double cluster_time = apair.first;
1052-
double charge_balance = ClusterChargeBalances.at(cluster_time);
1053-
std::vector<MCHit>&MCHits = apair.second;
1054-
double time_temp = 0;
1055-
double charge_temp = 0;
1056-
for (unsigned int i_hit = 0; i_hit < MCHits.size(); i_hit++){
1057-
time_temp+=MCHits.at(i_hit).GetTime();
1058-
charge_temp+=MCHits.at(i_hit).GetCharge();
1059-
}
1060-
if (cluster_time > 10000 && charge_balance < 0.4 && charge_temp < 120) {
1061-
cluster_reco_pdg.push_back(cluster_time);
1062-
found_pdg = true;
1063-
std::cout <<"Found neutron candidate for cluster at time = "<<cluster_time<<", with CB = "<<charge_balance <<" and charge "<<charge_temp<<"!!!"<<std::endl;
1064-
} else {
1065-
std::cout <<"Did not pass neutron candidate cuts!!! Time = "<<cluster_time <<", CB = "<<charge_balance << " and charge "<<charge_temp<<"!!!"<<std::endl;
1066-
}
1067-
}
1068-
}
1069-
} else {
1070-
if (m_all_clusters->size()){
1071-
double cluster_time;
1072-
for(std::pair<double,std::vector<Hit>>&& apair : *m_all_clusters){
1073-
double cluster_time = apair.first;
1074-
double charge_balance = ClusterChargeBalances.at(cluster_time);
1075-
std::vector<Hit>&Hits = apair.second;
1076-
double time_temp = 0;
1077-
double charge_temp = 0;
1078-
for (unsigned int i_hit = 0; i_hit < Hits.size(); i_hit++){
1079-
time_temp+=Hits.at(i_hit).GetTime();
1080-
int tube = Hits.at(i_hit).GetTubeId();
1081-
double charge_pe = Hits.at(i_hit).GetCharge()/ChannelNumToTankPMTSPEChargeMap->at(tube);
1082-
charge_temp+=charge_pe;
1083-
}
1084-
if (cluster_time > 10000 && charge_balance < 0.4 && charge_temp < 120) {
1085-
cluster_reco_pdg.push_back(cluster_time);
1086-
found_pdg = true;
1087-
std::cout <<"Found neutron candidate for cluster at time = "<<cluster_time<<", with CB = "<<charge_balance <<"and charge "<<charge_temp<<"!!!"<<std::endl;
1088-
} else {
1089-
std::cout <<"Did not pass neutron candidate cuts!!! Time = "<<cluster_time <<", CB = "<<charge_balance << " and charge "<<charge_temp<<"!!!"<<std::endl;
1061+
if (!fIsMC || fMCWaveform) { // data-like
1062+
if (m_all_clusters->size()){
1063+
for(std::pair<double,std::vector<Hit>>&& apair : *m_all_clusters){
1064+
double cluster_time = apair.first;
1065+
double charge_balance = ClusterChargeBalances.at(cluster_time);
1066+
std::vector<Hit>&Hits = apair.second;
1067+
double time_temp = 0;
1068+
double charge_temp = 0;
1069+
for (unsigned int i_hit = 0; i_hit < Hits.size(); i_hit++){
1070+
time_temp+=Hits.at(i_hit).GetTime();
1071+
int tube = Hits.at(i_hit).GetTubeId();
1072+
double charge_pe = Hits.at(i_hit).GetCharge()/ChannelNumToTankPMTSPEChargeMap->at(tube);
1073+
charge_temp+=charge_pe;
1074+
}
1075+
if (cluster_time > 10000 && charge_balance < 0.4 && charge_temp < 120) {
1076+
cluster_reco_pdg.push_back(cluster_time);
1077+
found_pdg = true;
1078+
std::cout <<"Found neutron candidate for cluster at time = "<<cluster_time<<", with CB = "<<charge_balance <<"and charge "<<charge_temp<<"!!!"<<std::endl;
1079+
} else {
1080+
std::cout <<"Did not pass neutron candidate cuts!!! Time = "<<cluster_time <<", CB = "<<charge_balance << " and charge "<<charge_temp<<"!!!"<<std::endl;
1081+
}
1082+
}
1083+
}
1084+
} else { // MCHits
1085+
if (m_all_clusters_MC->size()){
1086+
for(std::pair<double,std::vector<MCHit>>&& apair : *m_all_clusters_MC){
1087+
double cluster_time = apair.first;
1088+
double charge_balance = ClusterChargeBalances.at(cluster_time);
1089+
std::vector<MCHit>&MCHits = apair.second;
1090+
double time_temp = 0;
1091+
double charge_temp = 0;
1092+
for (unsigned int i_hit = 0; i_hit < MCHits.size(); i_hit++){
1093+
time_temp+=MCHits.at(i_hit).GetTime();
1094+
charge_temp+=MCHits.at(i_hit).GetCharge();
1095+
}
1096+
if (cluster_time > 10000 && charge_balance < 0.4 && charge_temp < 120) {
1097+
cluster_reco_pdg.push_back(cluster_time);
1098+
found_pdg = true;
1099+
std::cout <<"Found neutron candidate for cluster at time = "<<cluster_time<<", with CB = "<<charge_balance <<" and charge "<<charge_temp<<"!!!"<<std::endl;
1100+
} else {
1101+
std::cout <<"Did not pass neutron candidate cuts!!! Time = "<<cluster_time <<", CB = "<<charge_balance << " and charge "<<charge_temp<<"!!!"<<std::endl;
1102+
}
10901103
}
10911104
}
1092-
}
1093-
}
1105+
}
10941106
}
10951107

10961108
return found_pdg;

UserTools/EventSelector/EventSelector.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ class EventSelector: public Tool {
249249
bool fThroughGoing = false;
250250
bool fEventCutStatus;
251251
bool fIsMC;
252+
bool fMCWaveform;
252253
int fTriggerWord;
253254
int fRecoPDG;
254255
bool fTriggerExtended = false;

UserTools/EventSelector/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,5 +106,6 @@ ThroughGoing
106106
TriggerWord
107107
RecoPDG
108108
IsMC
109+
PMTWaveformSim
109110
SaveStatusToStore
110111
```

0 commit comments

Comments
 (0)