Skip to content

Commit bd8fe01

Browse files
feat: improve event building for zero-torus data (#1085)
* add solenoid/torus * remove sampling fraction from trigger electron id for zero torus * different electron pid for zero-torus * add 500 MeV ECAL requirement * latest rgl yaml from Mathieu * reassign electron momentum from sampling fraction * call it * remove copy/paste mistake * use EBHB reassigned electron momentum to initialize TB tracking for straigth tracks * ignore HB/TB type for zero-field * restore rgl yaml --------- Co-authored-by: Raffaella De Vita <devita@ge.infn.it>
1 parent c67ad71 commit bd8fe01

File tree

7 files changed

+83
-10
lines changed

7 files changed

+83
-10
lines changed

common-tools/clas-reco/src/main/java/org/jlab/clas/detector/DetectorHeader.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public class DetectorHeader {
1818
private float livetime = -1;
1919
private short eventCategory = 0;
2020
private short eventCategoryFT = 0;
21+
private float torus = 0.0f;
22+
private float solenoid = 0.0f;
2123

2224
public DetectorHeader() {
2325
}
@@ -113,4 +115,10 @@ public void setLiveTime(float livetime) {
113115
public void setEventCategory(short evcat) {
114116
this.eventCategory = evcat;
115117
}
118+
119+
public void setTorus(float t) { torus = t; }
120+
public void setSolenoid(float s) {solenoid = s; }
121+
public float getTorus() { return torus; }
122+
public float getSolenoid() { return solenoid; }
123+
116124
}

reconstruction/dc/src/main/java/org/jlab/service/dc/DCTBEngine.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.jlab.clas.tracking.kalmanfilter.zReference.StateVecs;
4444
import org.jlab.clas.tracking.utilities.MatrixOps.Libr;
4545
import org.jlab.clas.tracking.utilities.RungeKuttaDoca;
46+
import org.jlab.detector.base.DetectorType;
4647

4748
public class DCTBEngine extends DCEngine {
4849

@@ -200,6 +201,24 @@ public boolean processDataEvent(DataEvent event) {
200201
if(TrackArray==null) {
201202
return true; // HB tracks not saved correctly
202203
}
204+
if(Math.abs(Swimmer.getTorScale()) < 0.001 &&
205+
event.hasBank(this.getBanks().getRecPartBank()) &&
206+
event.hasBank(this.getBanks().getRecTrackBank())){
207+
DataBank trackBank = event.getBank(this.getBanks().getRecTrackBank());
208+
DataBank partBank = event.getBank(this.getBanks().getRecPartBank());
209+
for (int i = 0; i < trackBank.rows(); i++) {
210+
if (trackBank.getByte("detector", i) == DetectorType.DC.getDetectorId()) {
211+
int pindex = trackBank.getShort("pindex", i);
212+
if(partBank.getInt("pid", i) == 11) {
213+
Track HBtrk = TrackArray[trackBank.getShort("index", i)];
214+
HBtrk.set_pAtOrig(new Vector3D(partBank.getFloat("px", pindex),
215+
partBank.getFloat("py", pindex),
216+
partBank.getFloat("pz", pindex)));
217+
HBtrk.set_P(HBtrk.get_pAtOrig().mag());
218+
}
219+
}
220+
}
221+
}
203222
for(Segment seg : segments) {
204223
if(seg.get(0).get_AssociatedHBTrackID()>0) {
205224
TrackArray[seg.get(0).get_AssociatedHBTrackID()-1].get_ListOfHBSegments().add(seg);

reconstruction/eb/src/main/java/org/jlab/rec/eb/EBUtil.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,28 @@ public static boolean isSimpleElectron(DetectorParticle p,EBCCDBConstants ccdb)
9999

100100
return true;
101101
}
102+
103+
/**
104+
* Perform a basic true/false identification for electrons.
105+
*/
106+
public static boolean isZeroFieldElectron(DetectorParticle p,EBCCDBConstants ccdb) {
107+
108+
// require ECAL:
109+
final int sector = p.getSector(DetectorType.ECAL);
110+
if (sector<1) return false;
111+
112+
// requre HTCC photoelectrons:
113+
final double nphe = p.getNphe(DetectorType.HTCC);
114+
if (nphe < ccdb.getDouble(EBCCDBEnum.HTCC_NPHE_CUT)) return false;
115+
116+
// require PCAL minimum energy:
117+
final double minPcalEnergy = ccdb.getSectorDouble(EBCCDBEnum.ELEC_PCAL_min_energy,sector);
118+
final double pcalEnergy = p.getEnergy(DetectorType.ECAL,DetectorLayer.PCAL);
119+
if (pcalEnergy < minPcalEnergy) return false;
120+
121+
// require PCAL+ECAL minimum energy 500 MeV:
122+
return p.getEnergy(DetectorType.ECAL) > 0.5;
123+
}
102124

103125
/**
104126
* Calculate timing resolution from EventBuilder constants:

reconstruction/eb/src/main/java/org/jlab/service/eb/EBAnalyzer.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,17 @@ else if (p.hasHit(DetectorType.CND) || p.hasHit(DetectorType.CTOF) || p.hasHit(D
307307
}
308308
}
309309

310+
public void assignElectronMomenta(DetectorEvent de) {
311+
final int np = de.getParticles().size();
312+
for (int ii=0; ii<np; ii++) {
313+
DetectorParticle p = de.getParticle(ii);
314+
if (abs(p.getPid()) == 11) {
315+
p.vector().setMag(p.getEnergy(DetectorType.ECAL) /
316+
SamplingFractions.getMean(11,p,ccdb));
317+
}
318+
}
319+
}
320+
310321
public void assignBetas(DetectorEvent event,final boolean useStartTimeFromFT){
311322

312323
final double startTime = useStartTimeFromFT ?
@@ -350,7 +361,7 @@ public void assignBetas(DetectorEvent event,final boolean useStartTimeFromFT){
350361
}
351362
public void assignPids(DetectorEvent event,final boolean useStartTimeFromFT) {
352363

353-
PIDHypothesis pidHyp = new PIDHypothesis();
364+
PIDHypothesis pidHyp = new PIDHypothesis(event.getEventHeader().getTorus());
354365
pidHyp.setEvent(event);
355366
pidHyp.setUseStartTimeFromFT(useStartTimeFromFT);
356367

@@ -382,12 +393,13 @@ else if (p.getCharge()<0) {
382393

383394
public class PIDHypothesis {
384395

396+
private float torus = 0;
385397
private int theoryPID = -1;
386398
private double PIDquality = 0.0;
387399
private DetectorEvent event;
388400
private boolean useStartTimeFromFT = false;
389401

390-
public PIDHypothesis() {}
402+
public PIDHypothesis(float t) {torus=t;}
391403

392404
public void setEvent(DetectorEvent e) {event = e;}
393405

@@ -405,7 +417,9 @@ public void PIDMatch(DetectorParticle p, int pid) {
405417

406418
final boolean pidFromTimingCheck = pid==pidFromTiming && p.getTheoryBeta(pid)>0;
407419

408-
final boolean isElectron = EBUtil.isSimpleElectron(p,ccdb);
420+
final boolean isElectron = Math.abs(torus)>1e-8 ?
421+
EBUtil.isSimpleElectron(p,ccdb) :
422+
EBUtil.isZeroFieldElectron(p, ccdb);
409423

410424
final boolean htccSignalCheck = p.getNphe(DetectorType.HTCC)>ccdb.getDouble(EBCCDBEnum.HTCC_NPHE_CUT);
411425
final boolean ltccSignalCheck = p.getNphe(DetectorType.LTCC)>ccdb.getDouble(EBCCDBEnum.LTCC_NPHE_CUT);

reconstruction/eb/src/main/java/org/jlab/service/eb/EBEngine.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.jlab.service.eb;
22

3-
import java.util.Collections;
43
import java.util.List;
54
import java.util.logging.Logger;
65

@@ -171,6 +170,10 @@ public boolean processDataEvent(DataEvent de,EBScalers ebs) {
171170
EBAnalyzer analyzer = new EBAnalyzer(ccdb,rf);
172171
analyzer.processEvent(eb.getEvent());
173172

173+
// Overwrite electron momentum for zero-field:
174+
if (Math.abs(head.getTorus()) < 1e-8)
175+
analyzer.assignElectronMomenta(eb.getEvent());
176+
174177
// Add Forward Tagger particles:
175178
eb.processForwardTagger(de);
176179

reconstruction/eb/src/main/java/org/jlab/service/eb/EBio.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public static DetectorHeader readHeader(DataEvent event, EBScalers ebs, EBCCDBCo
3232
dHeader.setRun(bank.getInt("run", 0));
3333
dHeader.setEvent(bank.getInt("event", 0));
3434
dHeader.setTrigger(bank.getLong("trigger", 0));
35+
dHeader.setTorus(bank.getFloat("torus", 0));
36+
dHeader.setSolenoid(bank.getFloat("solenoid", 0));
3537
}
3638

3739
// helicity:

reconstruction/eb/src/main/java/org/jlab/service/eb/EventBuilder.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -467,22 +467,27 @@ public void setCharge(int ch) {
467467
this.charge = ch;
468468
}
469469

470-
public int getSoftwareTriggerScore(DetectorParticle p,EBCCDBConstants ccdb) {
470+
public int getSoftwareTriggerScore(DetectorParticle p,EBCCDBConstants ccdb,float torus) {
471471

472472
int score = 0;
473473

474474
final double npheCut = ccdb.getDouble(EBCCDBEnum.HTCC_NPHE_CUT);
475475
if(p.getNphe(DetectorType.HTCC) > npheCut){
476476
score += 10;
477477
}
478-
478+
479479
final int sector = p.getSector(DetectorType.ECAL);
480480
if (sector > 0) {
481481
final double nSigmaCut = ccdb.getSectorDouble(EBCCDBEnum.ELEC_SF_nsigma,sector);
482-
final double sfNSigma = SamplingFractions.getNSigma(11,p,ccdb);
482+
final double nsigma = SamplingFractions.getNSigma(11,p,ccdb);
483483
final double minPcalEnergy = ccdb.getSectorDouble(EBCCDBEnum.ELEC_PCAL_min_energy,sector);
484-
if(abs(sfNSigma) < nSigmaCut &&
485-
p.getEnergy(DetectorType.ECAL,1) > minPcalEnergy) {
484+
if (Math.abs(torus) <1e-8) {
485+
if (p.getEnergy(DetectorType.ECAL,1) > minPcalEnergy &&
486+
p.getEnergy(DetectorType.ECAL) > 0.5) {
487+
score += 100;
488+
}
489+
}
490+
else if (abs(nsigma) < nSigmaCut && p.getEnergy(DetectorType.ECAL,1) > minPcalEnergy) {
486491
score += 100;
487492
}
488493
}
@@ -503,7 +508,7 @@ public boolean assignSoftwareTrigger(DetectorEvent event,EBCCDBConstants ccdb) {
503508
int maxScore = 0;
504509
for (int i=0; i<npart; i++) {
505510
DetectorParticle p = event.getParticle(i);
506-
final int score = getSoftwareTriggerScore(p,ccdb);
511+
final int score = getSoftwareTriggerScore(p,ccdb,event.getEventHeader().getTorus());
507512
if(score >= this.score_requirement) {
508513
if (this.charge==p.getCharge()) {
509514
p.setPid(this.id);

0 commit comments

Comments
 (0)