@@ -86,7 +86,7 @@ public List<DGTZ> readADCs(DetectorType detector,DataBank bank) {
8686 ADC adcData = new ADC (detector );
8787 adcData .readFromBank (bank , i );
8888
89- if (!adcData .isGood ()) adcData .remove ();
89+ if (!adcData .isGood ()) adcData .skip ();
9090
9191 adcStore .add (adcData );
9292 }
@@ -105,110 +105,116 @@ public List<DGTZ> readADCs(DetectorType detector,DataBank bank) {
105105 */
106106 public List <DGTZ > readTDCs (DetectorType detector , DataBank bank ) {
107107 List <DGTZ > tdcStore = new ArrayList <>();
108-
108+
109109 if (bank !=null ) {
110+ boolean tot = false ;
111+ for (String column : bank .getColumnList ()) {
112+ if (column .equals ("ToT" )) {
113+ tot = true ;
114+ break ;
115+ }
116+ }
110117 for (int i = 0 ; i < bank .rows (); i ++) {
111118 TDC tdcData = new TDC (detector );
112119 tdcData .readFromBank (bank , i );
113-
114- if (!tdcData .isGood ()) tdcData .remove ();
115-
120+ if (tot ) {
121+ tdcData .readToT (bank , i );
122+ }
123+
124+ if (!tdcData .isGood ()) tdcData .skip ();
125+
116126 tdcStore .add (tdcData );
117127 }
118128 }
119129 return tdcStore ;
120130 }
121131
132+
122133 /**
123134 * Merge ADC banks for data (signal) and background events for the selected detector and layers
124135 * In case of multiple hit on same detector element, only first hit in time is kept
125136 * unless the double-hit suppression flag, suppressDoubleHits, is set to false
126137 *
127138 * @param detector
128139 * @param layers
140+ * @param banks
129141 * @return
130142 */
131- public DataBank mergeADCs (DetectorType detector , List <Integer > layers ){
143+ public DataBank mergeADCs (DetectorType detector , List <Integer > layers , List <String > banks ){
144+
145+ String bank = banks .get (0 );
146+
147+ List <DGTZ > ADCs = new ArrayList <>();
148+ ADCs .addAll (readADCs (detector ,event .getBank (bank )));
132149
133150 List <DataEvent > bgs = bgEvents [0 ];
134-
135- String ADCString = detector .getName ()+"::adc" ;
136- for (DataEvent bg : bgs ) {
137- if (!bg .hasBank (ADCString )) {
138- return event .getBank (ADCString );
139- }
140- }
141-
142151 List <DGTZ > bgADCs = new ArrayList <>();
143152 for (DataEvent bg : bgs ) {
144- for (DGTZ dgtz : readADCs (detector ,bg .getBank (ADCString ))) {
153+ if (!bg .hasBank (bank ))
154+ continue ;
155+ for (DGTZ dgtz : readADCs (detector ,bg .getBank (bank ))) {
145156 if (layers ==null || layers .contains (dgtz .getLayer ()))
146157 bgADCs .add ((ADC ) dgtz );
147158 }
148159 }
149- List <DGTZ > ADCs = readADCs (detector ,event .getBank (ADCString ));
150-
151- DataBank bank = this .writeToBank (event , ADCString , this .merge (ADCs , bgADCs ));
152-
153- return bank ;
154-
160+ if (bgADCs .isEmpty ())
161+ return this .writeToBank (detector , ADCs , bank );
162+ else
163+ return this .writeToBank (detector , this .merge (ADCs , bgADCs ), bank );
155164 }
156165
157166 /**
158167 * Merge TDC banks for data (signal) and background events for the selected detector and layers
159168 * Use two background events shifted in time to extend the time range of the backgrounds
160- * Multiple hits on the same components are kept if time distance exceed the holdoff time
169+ * Multiple hits on the same components are kept if the time distance exceeds the holdoff time
161170 *
162171 * @param detector
163172 * @param layers
173+ * @param banks
164174 * @return
165175 */
166- public DataBank mergeTDCs (DetectorType detector , List <Integer > layers ){
167-
168- List <DataEvent > bgs = bgEvents [0 ];
169-
170- String TDCString = detector +"::tdc" ;
176+ public DataBank mergeTDCs (DetectorType detector , List <Integer > layers , List <String > banks ){
171177
172- // if the primary background event has no detector bank then keep the event bank
173- for (DataEvent bg : bgs ) {
174- if (!bg .hasBank (TDCString )) {
175- return event .getBank (TDCString );
178+ // get physics event hits
179+ List <DGTZ > TDCs = new ArrayList <>();
180+ for (String bank : banks ) {
181+ if (event .hasBank (bank )) {
182+ TDCs .addAll (readTDCs (detector , event .getBank (bank )));
176183 }
177184 }
178- // if the primary background events has the detector bank, then proceed with merging
179- // get background hits using multiple events dependending on detector
180- int bgSize = constants .getInt (detector , EventMergerEnum .MERGE_SIZE );
181- if (! event . hasBank ( TDCString )) bgSize = 1 ;
185+
186+ // get background hits using multiple events dependending on detector
187+ int bgSize = constants .getInt (detector , EventMergerEnum .MERGE_SIZE );
188+ if (TDCs . isEmpty ( )) bgSize = 1 ;
182189 // collect bg hits
183190 List <DGTZ > bgTDCs = new ArrayList <>();
184191 for (int i =0 ; i <Math .min (bgSize , bgEvents .length ); i ++) {
185192 for (DataEvent bg : bgEvents [i ]) {
186- if (bg .hasBank (TDCString )) {
187- // get TDCs, correct them for jitter and shift them in time
188- int jitter = this .getTDCJitter (detector , bg );
189- for (DGTZ dgtz : readTDCs (detector , bg .getBank (TDCString ))) {
190- TDC tdc = (TDC ) dgtz ;
191- int layer = tdc .getLayer ();
192- int comp = tdc .getComponent ();
193- if (layers ==null || layers .contains (layer )) {
194- int offset = constants .getInt (run , detector , EventMergerEnum .READOUT_WINDOW , 0 , layer , comp );
195- tdc .shift (jitter -i *offset );
196- bgTDCs .add (tdc );
197- }
193+ for (String bank : banks ) {
194+ if (bg .hasBank (bank )) {
195+ // get TDCs, correct them for jitter and shift them in time
196+ int jitter = this .getTDCJitter (detector , bg );
197+ for (DGTZ dgtz : readTDCs (detector , bg .getBank (bank ))) {
198+ TDC tdc = (TDC ) dgtz ;
199+ int layer = tdc .getLayer ();
200+ int comp = tdc .getComponent ();
201+ if (layers ==null || layers .contains (layer )) {
202+ int offset = constants .getInt (run , detector , EventMergerEnum .READOUT_WINDOW , 0 , layer , comp );
203+ tdc .shift (jitter -i *offset );
204+ bgTDCs .add (tdc );
205+ }
206+ }
198207 }
199208 }
200209 }
201210 }
202-
203- // get physics event hits hits
204- List <DGTZ > TDCs = readTDCs (detector , event .getBank (TDCString ));
205-
206- // merge physics and bg hit
207- List <DGTZ > mergedTDCs = this .merge (TDCs , bgTDCs );
208-
209- // create output bank
210- return this .writeToBank (event , TDCString , mergedTDCs );
211-
211+ // if no backkground hits were found, return signal event banks
212+ if (bgTDCs .isEmpty ())
213+ return this .writeToBank (detector , TDCs , banks .get (0 ));
214+ else {
215+ // merge physics and bg hit
216+ return this .writeToBank (detector , this .merge (TDCs , bgTDCs ), banks .get (0 ));
217+ }
212218 }
213219
214220 /**
@@ -230,7 +236,7 @@ public final List<DGTZ> merge(List<DGTZ> signal, List<DGTZ> background) {
230236
231237 for (int i = 0 ; i < all .size (); i ++) {
232238 DGTZ dgtz = all .get (i );
233- if (dgtz .isRemoved ()) {
239+ if (dgtz .isRemoved () || ! dgtz . isGood () ) {
234240 continue ;
235241 }
236242 else if (merged .isEmpty ()) {
@@ -269,21 +275,27 @@ else if(merged.isEmpty()) {
269275
270276 /**
271277 * Write list of hits to bank based on hit status
272- * @param event hipo event
273- * @param name bank name
278+ * @param detector detector type
274279 * @param dgtzs list of hits
280+ * @param name bank name
275281 * @return hipo bank
276282 */
277- public final DataBank writeToBank (DataEvent event , String name , List <DGTZ > dgtzs ) {
283+ public final DataBank writeToBank (DetectorType detector , List <DGTZ > dgtzs , String name ) {
278284 int size = 0 ;
279285 for (DGTZ dgtz : dgtzs ) {
280286 if (dgtz .status ()) size ++;
281287 }
288+ if (size ==0 ) return null ;
289+
290+ boolean tot = name .endsWith ("tot" );
282291 DataBank bank = event .createBank (name , size );
283292 int row = 0 ;
284293 for (DGTZ dgtz : dgtzs ) {
285- if (dgtz .status ())
286- dgtz .addToBank (bank , row ++);
294+ if (dgtz .status ()) {
295+ dgtz .addToBank (bank , row );
296+ if (tot ) ((TDC ) dgtz ).addToT (bank , row );
297+ row ++;
298+ }
287299 }
288300 return bank ;
289301 }
@@ -350,9 +362,9 @@ public int getAmplitude() {
350362 @ Override
351363 public boolean isGood () {
352364 if (this .getType ()==DetectorType .BST || this .getType ()==DetectorType .BMT )
353- return true ;
365+ return super . isGood () ;
354366 else
355- return this .adc >0 ;
367+ return super . isGood () && this .adc >0 ;
356368 }
357369
358370 @ Override
@@ -411,7 +423,8 @@ public void show() {
411423
412424 public class TDC extends DGTZ {
413425
414- private int tdc ;
426+ private int tdc = 0 ;
427+ private int tot = -1 ;
415428
416429 public TDC (DetectorType detector ) {
417430 super (detector );
@@ -424,14 +437,14 @@ public int getTdc() {
424437 public void setTdc (int tdc ) {
425438 this .tdc = tdc ;
426439 }
427-
440+
428441 public void shift (int offset ) {
429442 this .tdc += offset ;
430443 }
431444
432445 @ Override
433446 public boolean isGood () {
434- return this .tdc >0 ;
447+ return super . isGood () && this .tdc >0 ;
435448 }
436449
437450 @ Override
@@ -440,12 +453,19 @@ public void addToBank(DataBank bank, int row) {
440453 bank .setInt ("TDC" , row , tdc );
441454 }
442455
456+ public void addToT (DataBank bank , int row ) {
457+ bank .setShort ("ToT" , row , (short ) tot );
458+ }
459+
443460 @ Override
444461 public void readFromBank (DataBank bank , int row ) {
445462 super .readFromBank (bank , row );
446463 this .tdc = bank .getInt ("TDC" , row );
447- }
464+ }
448465
466+ public void readToT (DataBank bank , int row ) {
467+ this .tot = bank .getShort ("ToT" , row );
468+ }
449469
450470 @ Override
451471 public boolean pilesUp (DGTZ other ){
@@ -493,7 +513,8 @@ public class DGTZ extends DetectorDescriptor {
493513
494514 private boolean background = false ;
495515 private boolean removed = false ;
496-
516+ private boolean skip = false ;
517+
497518 public DGTZ (DetectorType detector ) {
498519 super (detector );
499520 }
@@ -504,23 +525,33 @@ public DGTZ(DetectorType detector, byte sector, byte layer, short component, byt
504525 this .setOrderAndType (order );
505526 }
506527
507- public void setOrderAndType (int order ) {
528+ public final void setOrderAndType (int order ) {
508529 OrderType type = OrderType .getType (order );
509530 this .setOrder (order - type .getTypeId ());
510- if (type ==OrderType .BGREMOVED )
531+ if (type ==OrderType .DECREMOVED )
532+ this .skip = true ;
533+ else if (type ==OrderType .DECREMOVED_BG ) {
534+ this .skip = true ;
535+ this .background = true ;
536+ }
537+ else if (type ==OrderType .BGREMOVED )
511538 this .removed = true ;
512- if (type ==OrderType .BGADDED_NOMINAL )
539+ else if (type ==OrderType .BGADDED_NOMINAL )
513540 this .background = true ;
514- if (type ==OrderType .BGREMOVED_BG ) {
541+ else if (type ==OrderType .BGREMOVED_BG ) {
515542 this .removed = true ;
516543 this .background = true ;
517544 }
518545 }
519546
520547 public boolean isGood () {
521- return true ;
548+ return ! skip ;
522549 }
523550
551+ public void skip () {
552+ this .skip = true ;
553+ }
554+
524555 public boolean isRemoved () {
525556 return removed ;
526557 }
@@ -550,7 +581,11 @@ public boolean status() {
550581 }
551582
552583 public RawBank .OrderType getOrderType () {
553- if (this .isBackground () && this .isRemoved ())
584+ if (this .isBackground () && !this .isGood ())
585+ return OrderType .DECREMOVED_BG ;
586+ else if (!this .isGood ())
587+ return OrderType .DECREMOVED ;
588+ else if (this .isBackground () && this .isRemoved ())
554589 return OrderType .BGREMOVED_BG ;
555590 else if (this .isBackground ())
556591 return OrderType .BGADDED_NOMINAL ;
0 commit comments