22import java .io .File ;
33import java .util .ArrayList ;
44import java .util .Arrays ;
5+ import java .util .Collections ;
6+ import java .util .HashMap ;
57import java .util .List ;
8+ import java .util .Map ;
69import java .util .logging .Level ;
710import java .util .logging .Logger ;
811import 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 ("\n Merging 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 ;
0 commit comments