Skip to content

Commit c677c84

Browse files
jdbriceplexoos
andauthored
Add Fwd tracks to StMuDST (#538)
- Adds StMuFwdTrack to MuDST, - minor updates to StFwdTrackMaker (control material effects + debug tools/ttree) - Add StRoot/StFwdUtils : contains example fwd analysis maker --------- Co-authored-by: Dmitri Smirnov <[email protected]>
1 parent 7fd7f97 commit c677c84

27 files changed

+1434
-252
lines changed

StRoot/StFwdTrackMaker/StFwdTrackMaker.cxx

Lines changed: 163 additions & 82 deletions
Large diffs are not rendered by default.

StRoot/StFwdTrackMaker/StFwdTrackMaker.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ struct FwdTreeData {
6262
vector<float> fstX, fstY, fstZ;
6363
vector<int> fstTrackId;
6464

65+
int fcsN;
66+
vector<float> fcsX, fcsY, fcsZ;
67+
vector<int> fcsDet;
68+
6569
// RC tracks
6670
int rcN;
6771
vector<float> rcPt, rcEta, rcPhi, rcQuality;
@@ -89,6 +93,7 @@ struct FwdTreeData {
8993
int thdN;
9094
vector<float> thdX, thdY, thaX, thaY, thaZ;
9195

96+
bool saveCrit = false;
9297
std::map<string, std::vector<float>> Crits;
9398
std::map<string, std::vector<int>> CritTrackIds;
9499

StRoot/StFwdTrackMaker/include/Tracker/FwdTracker.h

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class GenfitTrackResult {
7373
this->trackSeed = seedTrack;
7474

7575
try {
76-
this->track = new genfit::Track(*track);
76+
this->track = track;
7777
this->status = *(this->track->getFitStatus());
7878
this->trackRep = this->track->getCardinalRep();
7979

@@ -86,9 +86,10 @@ class GenfitTrackResult {
8686
this->nPV = this->track->getNumPoints() - (nFTT + nFST);
8787

8888
this->momentum = this->trackRep->getMom( this->track->getFittedState(0, this->trackRep) );
89+
LOG_DEBUG << "GenfitTrackResult::set Track successful" << endm;
8990

9091
} catch ( genfit::Exception &e ) {
91-
LOG_ERROR << "CANNOT GET TRACK" << endm;
92+
LOG_ERROR << "GenfitTrackResult cannot get track" << endm;
9293
this->track = nullptr;
9394
this->trackRep = nullptr;
9495

@@ -109,11 +110,14 @@ class GenfitTrackResult {
109110
}
110111

111112
void setFst( Seed_t &seedFst, genfit::Track *track ){
113+
LOG_DEBUG << "GenfitTrackResult::setFSt" << endm;
112114
nFST = seedFst.size();
113115
fstSeed = seedFst;
114116

115117
try {
116118
this->fstTrack = new genfit::Track(*track);
119+
// make sure the McTrackId is set correctly
120+
this->fstTrack->setMcTrackId( this->track->getMcTrackId() );
117121
this->fstStatus = *(this->fstTrack->getFitStatus());
118122
this->fstTrackRep = this->fstTrack->getCardinalRep();
119123

@@ -125,7 +129,7 @@ class GenfitTrackResult {
125129
this->fstMomentum = this->fstTrackRep->getMom( this->fstTrack->getFittedState(0, this->fstTrackRep) );
126130

127131
} catch ( genfit::Exception &e ) {
128-
LOG_ERROR << "CANNOT GET TRACK" << endm;
132+
LOG_ERROR << "CANNOT GET FST TRACK" << endm;
129133
this->fstTrack = nullptr;
130134
this->fstTrackRep = nullptr;
131135

@@ -528,6 +532,7 @@ class ForwardTrackMaker {
528532
if (mConfig.get<bool>("TrackFitter:refitSi", true)) {
529533
addSiHitsMc();
530534
} else {
535+
LOG_DEBUG << "Skipping FST Hits" << endm;
531536
// skip Si refit
532537
}
533538
/***********************************************/
@@ -656,13 +661,13 @@ class ForwardTrackMaker {
656661
}
657662

658663

659-
GenfitTrackResult gtr( track.size(), 0, track, mTrackFitter->getTrack() );
664+
genTrack = new genfit::Track(*mTrackFitter->getTrack());
665+
genTrack->setMcTrackId(idt);
666+
GenfitTrackResult gtr( track.size(), 0, track, genTrack );
660667

661668
// assign the fit results to be saved
662669
fitStatus = mTrackFitter->getStatus();
663-
genTrack = new genfit::Track(*mTrackFitter->getTrack());
664670
trackRep = mTrackFitter->getTrackRep()->clone(); // Clone the track rep
665-
genTrack->setMcTrackId(idt);
666671

667672
if ( mGenHistograms && genTrack->getFitStatus(genTrack->getCardinalRep())->isFitConverged() && p.Perp() > 1e-3) {
668673
mHist["FitStatus"]->Fill("GoodCardinal", 1);
@@ -679,6 +684,7 @@ class ForwardTrackMaker {
679684

680685
mTrackResults.push_back( gtr );
681686

687+
LOG_DEBUG << "FwdTracker::fitTrack complete" << endm;
682688
} // if (mDoTrackFitting && !bailout)
683689
}
684690

@@ -774,6 +780,9 @@ class ForwardTrackMaker {
774780
*/
775781
vector<Seed_t> doTrackingOnHitmapSubset( size_t iIteration, FwdDataSource::HitMap_t &hitmap ) {
776782
long long itStart = FwdTrackerUtils::nowNanoSecond();
783+
784+
std::vector<Seed_t> acceptedTracks;
785+
std::vector<Seed_t> rejectedTracks;
777786
/*************************************************************/
778787
// Step 2
779788
// build 2-hit segments (setup parent child relationships)
@@ -812,6 +821,11 @@ class ForwardTrackMaker {
812821
LOG_DEBUG << TString::Format( "nSegments=%lu", automaton.getSegments().size() ).Data() << endm;
813822
LOG_DEBUG << TString::Format( "nConnections=%u", automaton.getNumberOfConnections() ).Data() << endm;
814823

824+
if (automaton.getNumberOfConnections() > 900 ){
825+
LOG_ERROR << "Got too many connections, bailing out of tracking" << endm;
826+
return acceptedTracks;
827+
}
828+
815829
// at any point we can get a list of tracks out like this:
816830
// std::vector < std::vector< KiTrack::IHit* > > tracks = automaton.getTracks();
817831
// we can apply an optional parameter <nHits> to only get tracks with >=nHits in them
@@ -853,7 +867,7 @@ class ForwardTrackMaker {
853867
duration = (FwdTrackerUtils::nowNanoSecond() - itStart) * 1e-6; // milliseconds
854868
if (mGenHistograms)
855869
mHist["Step3Duration"]->Fill( duration );
856-
if (duration > 200){
870+
if (duration > 200 || automaton.getNumberOfConnections() > 900){
857871
LOG_WARN << "The Three Hit Criteria took more than 200ms to process, duration: " << duration << " ms" << endm;
858872
LOG_WARN << "bailing out (skipping subset HNN)" << endm;
859873
std::vector<Seed_t> acceptedTracks;
@@ -878,8 +892,6 @@ class ForwardTrackMaker {
878892

879893
// only for debug really
880894
bool findSubsets = mConfig.get<bool>(subsetPath + ":active", true);
881-
std::vector<Seed_t> acceptedTracks;
882-
std::vector<Seed_t> rejectedTracks;
883895

884896
if (findSubsets) {
885897
size_t minHitsOnTrack = mConfig.get<size_t>(subsetPath + ":min-hits-on-track", 7);
@@ -1023,13 +1035,14 @@ class ForwardTrackMaker {
10231035
void addSiHitsMc() {
10241036
FwdDataSource::HitMap_t hitmap = mDataSource->getFstHits();
10251037

1026-
for (size_t i = 0; i < mGlobalTracks.size(); i++) {
1027-
1028-
if (mGlobalTracks[i]->getFitStatus(mGlobalTracks[i]->getCardinalRep())->isFitConverged() == false || mFitMoms[i].Perp() < 1e-3) {
1038+
for (size_t i = 0; i < mTrackResults.size(); i++) {
1039+
GenfitTrackResult &gtr = mTrackResults[i];
1040+
1041+
if ( gtr.status.isFitConverged() == false || gtr.momentum.Perp() < 1e-3) {
1042+
LOG_DEBUG << "Skipping addSiHitsMc, fit failed" << endm;
10291043
return;
10301044
}
10311045

1032-
10331046
if ( mGenHistograms){
10341047
mHist["FitStatus"]->Fill("PossibleReFit", 1);
10351048
}
@@ -1038,7 +1051,7 @@ class ForwardTrackMaker {
10381051

10391052
for (size_t j = 0; j < 3; j++) {
10401053
for (auto h0 : hitmap[j]) {
1041-
if (dynamic_cast<FwdHit *>(h0)->_tid == mGlobalTracks[i]->getMcTrackId()) {
1054+
if (dynamic_cast<FwdHit *>(h0)->_tid == gtr.track->getMcTrackId()) {
10421055
si_hits_for_this_track[j] = h0;
10431056
break;
10441057
}
@@ -1049,6 +1062,7 @@ class ForwardTrackMaker {
10491062
if ( si_hits_for_this_track[0] != nullptr ) nSiHitsFound++;
10501063
if ( si_hits_for_this_track[1] != nullptr ) nSiHitsFound++;
10511064
if ( si_hits_for_this_track[2] != nullptr ) nSiHitsFound++;
1065+
LOG_DEBUG << "Found " << nSiHitsFound << " FST Hits on this track (MC lookup)" << endm;
10521066

10531067
if ( mGenHistograms ){
10541068
this->mHist[ "nSiHitsFound" ]->Fill( 1, ( si_hits_for_this_track[0] != nullptr ? 1 : 0 ) );
@@ -1060,14 +1074,15 @@ class ForwardTrackMaker {
10601074
if ( mGenHistograms ){
10611075
mHist["FitStatus"]->Fill("AttemptReFit", 1);
10621076
}
1063-
TVector3 p = mTrackFitter->refitTrackWithSiHits(mGlobalTracks[i], si_hits_for_this_track);
1077+
TVector3 p = mTrackFitter->refitTrackWithSiHits(gtr.track, si_hits_for_this_track);
10641078

10651079
if ( mGenHistograms ){
10661080
if (p.Perp() == mFitMoms[i].Perp()) {
10671081
mHist["FitStatus"]->Fill("BadReFit", 1);
1068-
1082+
LOG_DEBUG << "refitTrackWithSiHits failed refit" << endm;
10691083
} else {
10701084
mHist["FitStatus"]->Fill("GoodReFit", 1);
1085+
gtr.setFst( si_hits_for_this_track, mTrackFitter->getTrack() );
10711086
}
10721087
}
10731088

StRoot/StFwdTrackMaker/include/Tracker/TrackFitter.h

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,23 @@ class TrackFitter {
7474
gMan = gGeoManager;
7575
// Set up the material interface and set material effects on/off from the config
7676
genfit::MaterialEffects::getInstance()->init(new genfit::TGeoMaterialInterface());
77-
genfit::MaterialEffects::getInstance()->setNoEffects(mConfig.get<bool>("TrackFitter::noMaterialEffects", false)); // false means defaul ON
7877

78+
// Set Material Stepper debug level
79+
genfit::MaterialEffects::getInstance()->setDebugLvl( mConfig.get<int>("TrackFitter.MaterialEffects:DebugLvl", 0) );
80+
81+
genfit::MaterialEffects::getInstance()->setEnergyLossBetheBloch( mConfig.get<int>("TrackFitter.MaterialEffects.EnergyLossBetheBloch", true) );
82+
genfit::MaterialEffects::getInstance()->setNoiseBetheBloch( mConfig.get<int>("TrackFitter.MaterialEffects.NoiseBetheBloch", true) );
83+
genfit::MaterialEffects::getInstance()->setNoiseCoulomb( mConfig.get<int>("TrackFitter.MaterialEffects.NoiseCoulomb", true) );
84+
genfit::MaterialEffects::getInstance()->setEnergyLossBrems( mConfig.get<int>("TrackFitter.MaterialEffects.EnergyLossBrems", true) );
85+
genfit::MaterialEffects::getInstance()->setNoiseBrems( mConfig.get<int>("TrackFitter.MaterialEffects.NoiseBrems", true) );
86+
genfit::MaterialEffects::getInstance()->ignoreBoundariesBetweenEqualMaterials( mConfig.get<int>("TrackFitter.MaterialEffects.ignoreBoundariesBetweenEqualMaterials", true) );
87+
88+
// do this last to override
89+
genfit::MaterialEffects::getInstance()->setNoEffects( !mConfig.get<bool>("TrackFitter:MaterialEffects", false)); // negated, true means defaul is all effects on (noEffects off)
90+
if (!mConfig.get<bool>("TrackFitter:MaterialEffects", false)){
91+
LOG_INFO << "Turning OFF GenFit Material Effects in stepper" << endm;
92+
}
93+
7994
// Determine which Magnetic field to use
8095
// Either constant field or real field from StarFieldAdaptor
8196
if (mConfig.get<bool>("TrackFitter:constB", false)) {
@@ -171,7 +186,7 @@ class TrackFitter {
171186
// Now load FTT
172187
// mConfig.getVector<>(...) requires a default, hence the
173188
mFTTZLocations = fwdGeoUtils.fttZ(
174-
mConfig.getVector<double>("TrackFitter.Geometry:ftt", {0.0f, 0.0f, 0.0f, 0.0f})
189+
mConfig.getVector<double>("TrackFitter.Geometry:ftt", {281.082,304.062,325.058,348.068})
175190
);
176191

177192
if ( fwdGeoUtils.fttZ( 0 ) < 1.0 ) { // returns 0.0 on failure
@@ -772,8 +787,8 @@ class TrackFitter {
772787
}
773788

774789
// create the track representations
775-
auto trackRepPos = new genfit::RKTrackRep(mPdgPositron);
776-
auto trackRepNeg = new genfit::RKTrackRep(mPdgElectron);
790+
auto trackRepPos = new genfit::RKTrackRep(mPdgMuon);
791+
auto trackRepNeg = new genfit::RKTrackRep(mPdgAntiMuon);
777792

778793
// Create the track
779794
mFitTrack = new genfit::Track(trackRepPos, seedPos, seedMom);
@@ -950,6 +965,8 @@ class TrackFitter {
950965
const int mPdgPiMinus = -211;
951966
const int mPdgPositron = 11;
952967
const int mPdgElectron = -11;
968+
const int mPdgMuon = 13;
969+
const int mPdgAntiMuon = -13;
953970

954971

955972
// det z locations loaded from geom or config
Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<config>
33
<Output url="fast_track.root" />
4-
<Geometry>fGeom.root</Geometry>
5-
<Source ftt="GEANT" fttFilter="true" />
4+
<Source ftt="GEANT" fttFilter="false" />
5+
66
<!-- Missing <TrackFinder> means use MC Track finding -->
77

8-
<TrackFitter refitSi="true" mcSeed="true" refitGBL="true" >
9-
<Vertex sigmaXY="0.002" sigmaZ="1.0" includeInFit="true" smearMcVertex="true" />
8+
<TrackFitter refitSi="true" mcSeed="true" refitGBL="false" MaterialEffects="false" >
9+
<MaterialEffects DebugLvl="0" >
10+
<EnergyLossBetheBloch>false</EnergyLossBetheBloch>
11+
<NoiseBetheBloch>false</NoiseBetheBloch>
12+
<NoiseCoulomb>false</NoiseCoulomb>
13+
<EnergyLossBrems>false</EnergyLossBrems>
14+
<NoiseBrems>false</NoiseBrems>
15+
<ignoreBoundariesBetweenEqualMaterials>true</ignoreBoundariesBetweenEqualMaterials>
16+
</MaterialEffects>
17+
<Vertex sigmaXY="0.001" sigmaZ="0.1" includeInFit="true" smearMcVertex="false" />
1018
</TrackFitter>
1119
</config>

StRoot/StFwdTrackMaker/macro/sim/full_track.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<config>
33
<Output url="full_track.root" />
4-
<Geometry>fGeom.root</Geometry>
4+
<!-- <Geometry>fGeom.root</Geometry> -->
55
<Source ftt="GEANT" fttFilter="true" />
66

77
<TrackFinder nIterations="1">
@@ -33,7 +33,7 @@
3333
<HitRemover active="true" />
3434
</TrackFinder>
3535

36-
<TrackFitter refitSi="true" mcSeed="true" >
37-
<Vertex sigmaXY="0.002" sigmaZ="1.0" includeInFit="false" smearMcVertex="true" />
36+
<TrackFitter refitSi="true" mcSeed="false" MaterialEffects="false" >
37+
<Vertex sigmaXY="1" sigmaZ="70.0" includeInFit="true" smearMcVertex="true" />
3838
</TrackFitter>
3939
</config>

0 commit comments

Comments
 (0)