Skip to content

Commit da9f4d8

Browse files
raffaelladevitabaltzell
authored andcommitted
added functionality to merge background for individual DC regions, plus bug fixed and some cleanup
1 parent 86dc443 commit da9f4d8

File tree

3 files changed

+113
-52
lines changed

3 files changed

+113
-52
lines changed

common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/ADCTDCMerger.java

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class ADCTDCMerger {
2929
private EventMergerConstants constants;
3030

3131
private DataEvent event;
32-
private List<DataEvent[]> bgEvents;
32+
private List<DataEvent>[] bgEvents;
3333
private int run;
3434

3535
/**
@@ -39,13 +39,12 @@ public class ADCTDCMerger {
3939
* @param signal physics events
4040
* @param bgs background events
4141
*/
42-
public ADCTDCMerger(EventMergerConstants constants, DataEvent signal, DataEvent[]... bgs) {
42+
public ADCTDCMerger(EventMergerConstants constants, DataEvent signal, List<DataEvent>... bgs) {
4343
this.constants = constants;
4444
this.event = signal;
45-
this.bgEvents = new ArrayList<>();
46-
this.bgEvents.addAll(Arrays.asList(bgs));
47-
if(!bgEvents.isEmpty() && bgEvents.get(0)[0].hasBank("RUN::config"))
48-
run = bgEvents.get(0)[0].getBank("RUN::config").getInt("run", 0);
45+
this.bgEvents = bgs;
46+
if(bgEvents.length!=0 && !bgEvents[0].isEmpty() && bgEvents[0].get(0).hasBank("RUN::config"))
47+
run = bgEvents[0].get(0).getBank("RUN::config").getInt("run", 0);
4948
}
5049

5150
/**
@@ -122,16 +121,17 @@ public List<DGTZ> readTDCs(DetectorType detector, DataBank bank) {
122121
}
123122

124123
/**
125-
* Merge ADC banks for data (signal) and background events for selected detector
124+
* Merge ADC banks for data (signal) and background events for the selected detector and layers
126125
* In case of multiple hit on same detector element, only first hit in time is kept
127126
* unless the double-hit suppression flag, suppressDoubleHits, is set to false
128127
*
129128
* @param detector
129+
* @param layers
130130
* @return
131131
*/
132-
public DataBank mergeADCs(DetectorType detector){
132+
public DataBank mergeADCs(DetectorType detector, List<Integer> layers){
133133

134-
DataEvent[] bgs = bgEvents.get(0);
134+
List<DataEvent> bgs = bgEvents[0];
135135

136136
String ADCString = detector.getName()+"::adc";
137137
for(DataEvent bg : bgs) {
@@ -142,7 +142,10 @@ public DataBank mergeADCs(DetectorType detector){
142142

143143
List<DGTZ> bgADCs = new ArrayList<>();
144144
for(DataEvent bg : bgs) {
145-
bgADCs.addAll(readADCs(detector,bg.getBank(ADCString)));
145+
for(DGTZ dgtz : readADCs(detector,bg.getBank(ADCString))) {
146+
if(layers==null || layers.contains(dgtz.getLayer()))
147+
bgADCs.add((ADC) dgtz);
148+
}
146149
}
147150
List<DGTZ> ADCs = readADCs(detector,event.getBank(ADCString));
148151

@@ -153,16 +156,17 @@ public DataBank mergeADCs(DetectorType detector){
153156
}
154157

155158
/**
156-
* Merge TDC banks for data (signal) and background events for selected detector
159+
* Merge TDC banks for data (signal) and background events for the selected detector and layers
157160
* Use two background events shifted in time to extend the time range of the backgrounds
158161
* Multiple hits on the same components are kept if time distance exceed the holdoff time
159162
*
160163
* @param detector
164+
* @param layers
161165
* @return
162166
*/
163-
public DataBank mergeTDCs(DetectorType detector){
167+
public DataBank mergeTDCs(DetectorType detector, List<Integer> layers){
164168

165-
DataEvent[] bgs = bgEvents.get(0);
169+
List<DataEvent> bgs = bgEvents[0];
166170

167171
String TDCString = detector+"::tdc";
168172

@@ -178,19 +182,21 @@ public DataBank mergeTDCs(DetectorType detector){
178182
if(!event.hasBank(TDCString)) bgSize = 1;
179183
// collect bg hits
180184
List<DGTZ> bgTDCs = new ArrayList<>();
181-
for(int i=0; i<Math.min(bgSize, bgEvents.size()); i++) {
182-
for(DataEvent bg : bgEvents.get(i)) {
185+
for(int i=0; i<Math.min(bgSize, bgEvents.length); i++) {
186+
for(DataEvent bg : bgEvents[i]) {
183187
if(bg.hasBank(TDCString)) {
184188
// get TDCs, correct them for jitter and shift them in time
185189
int jitter = this.getTDCJitter(detector, bg);
186190
for(DGTZ dgtz : readTDCs(detector, bg.getBank(TDCString))) {
187191
TDC tdc = (TDC) dgtz;
188192
int layer = tdc.getLayer();
189193
int comp = tdc.getComponent();
190-
int offset = constants.getInt(run, detector, EventMergerEnum.READOUT_WINDOW, 0, layer, comp);
191-
tdc.shift(jitter-i*offset);
192-
bgTDCs.add(tdc);
193-
}
194+
if(layers==null || layers.contains(layer)) {
195+
int offset = constants.getInt(run, detector, EventMergerEnum.READOUT_WINDOW, 0, layer, comp);
196+
tdc.shift(jitter-i*offset);
197+
bgTDCs.add(tdc);
198+
}
199+
}
194200
}
195201
}
196202
}

common-tools/clas-analysis/src/main/java/org/jlab/analysis/eventmerger/EventMerger.java

Lines changed: 85 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
import java.io.File;
33
import java.util.ArrayList;
44
import java.util.Arrays;
5+
import java.util.Collections;
6+
import java.util.HashMap;
57
import java.util.List;
8+
import java.util.Map;
69
import java.util.logging.Level;
710
import java.util.logging.Logger;
811
import org.jlab.detector.banks.RawBank;
@@ -36,16 +39,17 @@ public class EventMerger {
3639
private boolean preserveHitOrder = true;
3740
private EventMergerConstants constants = new EventMergerConstants();
3841

39-
private List<DetectorType> detectors;
42+
private Map<DetectorType,List<Integer>> detectors;
4043
private OrderType[] orders;
4144

4245
private List<String> bgFileNames;
4346
private boolean reuseBgEvents = false;
47+
private int bgScale = 1;
4448
private int bgFileIndex = 0;
4549
private HipoDataSource bgReader;
4650

4751
public EventMerger() {
48-
detectors = Arrays.asList(DetectorType.DC, DetectorType.FTOF);
52+
detectors = this.getDetectors(DetectorType.DC.getName(), DetectorType.FTOF.getName());
4953
orders = this.getOrders(OrderType.NOMINAL.name(),OrderType.BGADDED_NOMINAL.name(),OrderType.BGREMOVED.name());
5054
printConfiguration();
5155
}
@@ -58,16 +62,41 @@ public EventMerger(String[] dets, String[] types, boolean dhits, boolean ohits)
5862
printConfiguration();
5963
}
6064

61-
private List<DetectorType> getDetectors(String[] dets) {
62-
List<DetectorType> all = new ArrayList<>();
65+
private Map<DetectorType,List<Integer>> getDetectors(String... dets) {
66+
Map<DetectorType,List<Integer>> all = new HashMap<>();
6367
if(dets.length==1 && dets[0].equals("ALL")) {
64-
all.addAll(EventMergerConstants.ADCs);
65-
for(DetectorType t : EventMergerConstants.TDCs) {
66-
if(!all.contains(t)) all.add(t);
68+
for(DetectorType t : EventMergerConstants.ADCs) {
69+
all.put(t, null);
70+
}
71+
for(DetectorType d : EventMergerConstants.TDCs) {
72+
if(!all.containsKey(d)) all.put(d, null);
6773
}
6874
}
6975
else {
70-
for(String d : dets) all.add(DetectorType.getType(d));
76+
for(String d : dets) {
77+
String[] dn = d.split("(?<=\\D)(?=\\d)");
78+
DetectorType type = dn.length>0 ? DetectorType.getType(dn[0]) : DetectorType.UNDEFINED;
79+
if(type == DetectorType.UNDEFINED) {
80+
throw new IllegalArgumentException("Unknown detector type " + type);
81+
}
82+
else if(dn.length==2 && type==DetectorType.DC && dn[1].matches("[1-3]+")) {
83+
int region = Integer.parseInt(dn[1]);
84+
if(!all.containsKey(DetectorType.DC))
85+
all.put(DetectorType.DC, new ArrayList<>());
86+
for(int il=0; il<12; il++) {
87+
int layer = (region-1)*12+il+1;
88+
if(!all.get(DetectorType.DC).contains(layer))
89+
all.get(DetectorType.DC).add(layer);
90+
}
91+
}
92+
else {
93+
all.put(type, null);
94+
}
95+
}
96+
for(DetectorType type : all.keySet()) {
97+
if(all.get(type)!=null)
98+
Collections.sort(all.get(type));
99+
}
71100
}
72101
return all;
73102
}
@@ -85,8 +114,8 @@ private OrderType[] getOrders(String... type) {
85114
return null;
86115
}
87116

88-
public boolean setBgFiles(List<String> filenames, boolean reuse) {
89-
bgFileNames = filenames;
117+
public boolean setBgFiles(List<String> filenames, int scale, boolean reuse) {
118+
bgFileNames = new ArrayList<>();
90119
for (String filename : filenames) {
91120
File f = new File(filename);
92121
if (!f.exists() || !f.isFile() || !f.canRead()) {
@@ -96,6 +125,7 @@ public boolean setBgFiles(List<String> filenames, boolean reuse) {
96125
Logger.getLogger(EventMerger.class.getName()).log(Level.INFO,"Background files: reading {0}",filename);
97126
bgFileNames.add(filename);
98127
}
128+
if(scale>0) bgScale = scale;
99129
reuseBgEvents = reuse;
100130
return true;
101131
}
@@ -117,14 +147,14 @@ private boolean openNextFile() {
117147
return true;
118148
}
119149

120-
synchronized public DataEvent[] getBackgroundEvents(int n) {
121-
DataEvent[] events = new DataEvent[n];
150+
synchronized public List<DataEvent> getBackgroundEvents(int n) {
151+
List<DataEvent> events = new ArrayList<>();
122152
for(int i=0; i<n; i++) {
123-
if (!bgReader.hasEvent()) {
153+
if (bgReader==null || !bgReader.hasEvent()) {
124154
if(!openNextFile())
125155
return null;
126156
}
127-
events[i] = bgReader.getNextEvent();
157+
events.add(bgReader.getNextEvent());
128158
}
129159
return events;
130160
}
@@ -138,7 +168,21 @@ private void printConfiguration() {
138168

139169
private void printDetectors() {
140170
System.out.print("\nMerging activated for detectors: ");
141-
for(DetectorType det : detectors) System.out.print(det.getName() + " ");
171+
for(DetectorType det : detectors.keySet()) {
172+
System.out.print(det.getName());
173+
if(detectors.get(det)!=null) {
174+
System.out.print("(layers: ");
175+
for(int il=0; il<detectors.get(det).size(); il++) {
176+
int layer = detectors.get(det).get(il);
177+
if(il<detectors.get(det).size()-1)
178+
System.out.print(layer + ",");
179+
else
180+
System.out.print(layer + ") ");
181+
}
182+
}
183+
else
184+
System.out.print(" ");
185+
}
142186
System.out.println("\n");
143187
}
144188

@@ -148,35 +192,40 @@ private void printOrders() {
148192
System.out.println("\n");
149193
}
150194

151-
private void mergeEvents(DataEvent event, DataEvent[] bg1, DataEvent[] bg2) {
195+
private void mergeEvents(DataEvent event, List<DataEvent> bgs) {
152196

153197
if(!event.hasBank("RUN::config"))
154198
return;
155-
if(bg1.length != bg2.length)
199+
if(!bgs.isEmpty() && bgs.size()%2==0)
156200
return;
157-
for(int i=0; i<bg1.length; i++)
158-
if(!bg1[i].hasBank("RUN::config") || bg1[i].hasBank("RUN::config"))
201+
for(DataEvent bg : bgs)
202+
if(!bg.hasBank("RUN::config"))
159203
return;
160204

161205
if(event.hasBank("DC::doca")) event.removeBank("DC::doca");
162206

207+
int nbg = bgs.size()/2;
208+
List<DataEvent> bg1 = bgs.subList(1, nbg-1);
209+
List<DataEvent> bg2 = bgs.subList(nbg, 2*nbg-1);
163210
ADCTDCMerger merger = new ADCTDCMerger(constants, event, bg1, bg2);
164211
merger.setSuppressDoubleHits(suppressDoubleHits);
165212
merger.setPreserveHitOrder(preserveHitOrder);
166213
merger.setSelectedOrders(orders);
167214

168-
for(DetectorType det : detectors) {
215+
for(DetectorType det : detectors.keySet()) {
169216

170217
List<DataBank> banks = new ArrayList<>();
171218
List<String> names = new ArrayList<>();
172219

220+
List<Integer> layers = detectors.get(det);
221+
173222
if(EventMergerConstants.ADCs.contains(det)) {
174223
names.add(det.getName()+"::adc");
175-
banks.add(merger.mergeADCs(det));
224+
banks.add(merger.mergeADCs(det, layers));
176225
}
177226
if(EventMergerConstants.TDCs.contains(det)) {
178227
names.add(det.getName()+"::tdc");
179-
banks.add(merger.mergeTDCs(det));
228+
banks.add(merger.mergeTDCs(det, layers));
180229
}
181230
if(banks.isEmpty())
182231
System.out.println("Unknown detector:" + det);
@@ -191,17 +240,21 @@ private void mergeEvents(DataEvent event, DataEvent[] bg1, DataEvent[] bg2) {
191240
* Append merged banks to hipo event
192241
*
193242
* @param event
194-
* @param nBgEvents
195243
* @return
196244
*/
197-
public boolean mergeEvents(DataEvent event, int nBgEvents) {
245+
public boolean mergeEvents(DataEvent event) {
246+
247+
return this.mergeEvents(event, bgScale);
248+
}
249+
250+
251+
private boolean mergeEvents(DataEvent event, int scale) {
198252

199-
DataEvent[] eventBg1 = this.getBackgroundEvents(nBgEvents);
200-
DataEvent[] eventBg2 = this.getBackgroundEvents(nBgEvents);
253+
List<DataEvent> eventsBg = this.getBackgroundEvents(2*scale);
201254

202-
if(eventBg1==null || eventBg2==null) return false;
255+
if(eventsBg==null) return false;
203256

204-
this.mergeEvents(event, eventBg1, eventBg2);
257+
this.mergeEvents(event,eventsBg);
205258
return true;
206259
}
207260

@@ -214,7 +267,7 @@ public static void main(String[] args) {
214267
parser.addRequired("-i" ,"signal event file");
215268
parser.setRequiresInputList(true);
216269
parser.addOption("-n" ,"-1", "maximum number of events to process");
217-
parser.addOption("-d" ,"DC,FTOF", "list of detectors, for example \"DC,FTOF,HTCC\" or \"ALL\" for all available detectors");
270+
parser.addOption("-d" ,"DC,FTOF", "list of detectors, for example \"DC,FTOF,HTCC\" or \"ALL\" for all available detectors. Use DC1, DC2 or DC3 to select the DC region");
218271
parser.addOption("-r" ,"1", "reuse background events: 0-false, 1-true");
219272
parser.addOption("-s" ,"1", "suppress double TDC hits on the same component, 0-no suppression, 1-suppression");
220273
parser.addOption("-l" ,"1", "preserve initial hit order (for compatibility with truth matching, 0-false, 1-true");
@@ -232,13 +285,13 @@ public static void main(String[] args) {
232285
String detectors = parser.getOption("-d").stringValue();
233286
String ordertypes = parser.getOption("-t").stringValue();
234287
boolean doubleHits = (parser.getOption("-s").intValue()==1);
235-
int nBG = parser.getOption("-x").intValue();
288+
int bgScale = parser.getOption("-x").intValue();
236289
boolean reuseBG = (parser.getOption("-r").intValue()==1);
237290
boolean hitOrder = (parser.getOption("-l").intValue()==1);
238291

239292

240293
EventMerger merger = new EventMerger(detectors.split(","),ordertypes.split(","),doubleHits,hitOrder);
241-
if(!merger.setBgFiles(bgFiles, reuseBG))
294+
if(!merger.setBgFiles(bgFiles, bgScale, reuseBG))
242295
System.exit(1);
243296

244297
int counter = 0;
@@ -260,7 +313,7 @@ public static void main(String[] args) {
260313
//System.out.println("************************************************************* ");
261314
DataEvent eventData = readerData.getNextEvent();
262315

263-
if(merger.mergeEvents(eventData, nBG))
316+
if(merger.mergeEvents(eventData))
264317
writer.writeEvent(eventData);
265318
else
266319
maxEvents = counter;

reconstruction/bg/src/main/java/org/jlab/service/bg/BackgroundEngine.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class BackgroundEngine extends ReconstructionEngine {
2222
public static final String CONF_SUPPRESS_DOUBLES = "suppressDoubles";
2323
public static final String CONF_PRESERVE_ORDER = "preserveOrder";
2424
public static final String CONF_REUSE_EVENTS = "reuseEvents";
25+
public static final String CONF_BG_SCALE = "bgScale";
2526

2627
static final Logger logger = Logger.getLogger(BackgroundEngine.class.getName());
2728

@@ -45,8 +46,9 @@ public boolean init(String... filenames) {
4546
boolean suppressDoubles = Boolean.valueOf(getEngineConfigString(CONF_SUPPRESS_DOUBLES,"true"));
4647
boolean preserveOrder = Boolean.valueOf(getEngineConfigString(CONF_PRESERVE_ORDER,"true"));
4748
boolean reuseEvents = Boolean.valueOf(getEngineConfigString(CONF_REUSE_EVENTS,"false"));
49+
int bgScale = Integer.valueOf(getEngineConfigString(CONF_BG_SCALE,"1"));
4850
bgmerger = new EventMerger(detectors.split(","), orders.split(","), suppressDoubles, preserveOrder);
49-
return bgmerger.setBgFiles(Arrays.asList(filenames), reuseEvents);
51+
return bgmerger.setBgFiles(Arrays.asList(filenames), bgScale, reuseEvents);
5052
}
5153

5254
@Override

0 commit comments

Comments
 (0)