13 InitJANAPlugin(locApplication);
36 TDirectory* locOriginalDir = gDirectory;
37 gDirectory->mkdir(
"bcal_hadronic_eff")->cd();
40 for(
int locLayer = 1; locLayer <= 4; ++locLayer)
42 ostringstream locHistName, locHistTitle;
45 locHistName <<
"HitFound_Layer" << locLayer <<
"_Upstream";
46 locHistTitle <<
"Hit Found, Layer " << locLayer <<
", Upstream;Sector";
47 dHistMap_HitFound[locLayer][
true] =
new TH1I(locHistName.str().c_str(), locHistTitle.str().c_str(), 192, 0.5, 192.5);
51 locHistName <<
"HitTotal_Layer" << locLayer <<
"_Upstream";
53 locHistTitle <<
"Hit Total, Layer " << locLayer <<
", Upstream;Sector";
54 dHistMap_HitTotal[locLayer][
true] =
new TH1I(locHistName.str().c_str(), locHistTitle.str().c_str(), 192, 0.5, 192.5);
58 locHistName <<
"HitFound_Layer" << locLayer <<
"_Downstream";
60 locHistTitle <<
"Hit Found, Layer " << locLayer <<
", Downstream;Sector";
61 dHistMap_HitFound[locLayer][
false] =
new TH1I(locHistName.str().c_str(), locHistTitle.str().c_str(), 192, 0.5, 192.5);
65 locHistName <<
"HitTotal_Layer" << locLayer <<
"_Downstream";
67 locHistTitle <<
"Hit Total, Layer " << locLayer <<
", Downstream;Sector";
68 dHistMap_HitTotal[locLayer][
false] =
new TH1I(locHistName.str().c_str(), locHistTitle.str().c_str(), 192, 0.5, 192.5);
90 locTreeBranchRegister.
Register_Single<Float_t>(
"TrackDeltaPhiToShower");
93 locTreeBranchRegister.
Register_Single<UChar_t>(
"TrackProjectedBCALSector");
104 locTreeBranchRegister.
Register_Single<UChar_t>(
"ProjectedBCALSectors_Layer1");
105 locTreeBranchRegister.
Register_Single<UChar_t>(
"NearestBCALSectors_Layer1_Downstream");
106 locTreeBranchRegister.
Register_Single<UChar_t>(
"NearestBCALSectors_Layer1_Upstream");
107 locTreeBranchRegister.
Register_Single<Float_t>(
"NearestBCALEnergy_Layer1_Downstream");
108 locTreeBranchRegister.
Register_Single<Float_t>(
"NearestBCALEnergy_Layer1_Upstream");
110 locTreeBranchRegister.
Register_Single<UChar_t>(
"ProjectedBCALSectors_Layer2");
111 locTreeBranchRegister.
Register_Single<UChar_t>(
"NearestBCALSectors_Layer2_Downstream");
112 locTreeBranchRegister.
Register_Single<UChar_t>(
"NearestBCALSectors_Layer2_Upstream");
113 locTreeBranchRegister.
Register_Single<Float_t>(
"NearestBCALEnergy_Layer2_Downstream");
114 locTreeBranchRegister.
Register_Single<Float_t>(
"NearestBCALEnergy_Layer2_Upstream");
116 locTreeBranchRegister.
Register_Single<UChar_t>(
"ProjectedBCALSectors_Layer3");
117 locTreeBranchRegister.
Register_Single<UChar_t>(
"NearestBCALSectors_Layer3_Downstream");
118 locTreeBranchRegister.
Register_Single<UChar_t>(
"NearestBCALSectors_Layer3_Upstream");
119 locTreeBranchRegister.
Register_Single<Float_t>(
"NearestBCALEnergy_Layer3_Downstream");
120 locTreeBranchRegister.
Register_Single<Float_t>(
"NearestBCALEnergy_Layer3_Upstream");
122 locTreeBranchRegister.
Register_Single<UChar_t>(
"ProjectedBCALSectors_Layer4");
123 locTreeBranchRegister.
Register_Single<UChar_t>(
"NearestBCALSectors_Layer4_Downstream");
124 locTreeBranchRegister.
Register_Single<UChar_t>(
"NearestBCALSectors_Layer4_Upstream");
125 locTreeBranchRegister.
Register_Single<Float_t>(
"NearestBCALEnergy_Layer4_Downstream");
126 locTreeBranchRegister.
Register_Single<Float_t>(
"NearestBCALEnergy_Layer4_Upstream");
170 locEventLoop->GetSingle(locTrigger);
175 vector<const DBCALGeometry *> BCALGeomVec;
176 locEventLoop->Get(BCALGeomVec);
177 if(BCALGeomVec.size() == 0)
178 throw JException(
"Could not load locBCALGeometry object!");
182 vector<const DFCALShower*> locFCALShowers;
183 locEventLoop->Get(locFCALShowers);
185 double locTotalFCALEnergy = 0.0;
186 for(
auto& locShower : locFCALShowers)
187 locTotalFCALEnergy += locShower->getEnergy();
191 bool locBCALRequiredForTriggerFlag =
true;
192 if(((locTriggerBits & 2) == 2) || ((locTriggerBits & 32) == 32) || ((locTriggerBits & 64) == 64))
193 locBCALRequiredForTriggerFlag =
false;
194 if(((locTriggerBits & 1) == 1) && (locTotalFCALEnergy > 1.0))
195 locBCALRequiredForTriggerFlag =
false;
196 if(locBCALRequiredForTriggerFlag)
200 locEventLoop->GetSingle(locEventRFBunch);
204 vector<const DChargedTrack*> locChargedTracks;
205 locEventLoop->Get(locChargedTracks);
208 locEventLoop->GetSingle(locParticleID);
211 locEventLoop->GetSingle(locDetectorMatches);
213 vector<const DBCALUnifiedHit*> locBCALUnifiedHits;
214 locEventLoop->Get(locBCALUnifiedHits);
216 vector<const DBCALPoint*> locBCALPoints;
217 locEventLoop->Get(locBCALPoints);
219 vector<const DBCALShower*> locBCALShowers;
220 locEventLoop->Get(locBCALShowers);
223 map<int, map<int, set<const DBCALPoint*> > > locSortedPoints;
224 for(
const auto& locPoint : locBCALPoints)
226 int locSector = (locPoint->module() - 1)*4 + locPoint->sector();
227 locSortedPoints[locPoint->layer()][locSector].insert(locPoint);
231 map<int, map<int, set<const DBCALUnifiedHit*> > > locSortedHits_Upstream, locSortedHits_Downstream;
232 for(
const auto& locUnifiedHit : locBCALUnifiedHits)
234 int locSector = (locUnifiedHit->module - 1)*4 + locUnifiedHit->sector;
236 locSortedHits_Upstream[locUnifiedHit->layer][locSector].insert(locUnifiedHit);
238 locSortedHits_Downstream[locUnifiedHit->layer][locSector].insert(locUnifiedHit);
242 set<const DChargedTrackHypothesis*> locBestTracks;
243 for(
auto& locChargedTrack : locChargedTracks)
247 double locBestTrackingFOM = -1.0;
248 for(
auto& locChargedTrackHypothesis : locChargedTrack->dChargedTrackHypotheses)
250 if((locChargedTrackHypothesis->PID() ==
Electron) || (locChargedTrackHypothesis->PID() ==
Positron))
253 if(locChargedTrackHypothesis->position().Perp() >
dMaxVertexR)
270 unsigned int locNumTrackHits = locTrackTimeBased->
Ndof + 5;
274 if(locTrackTimeBased->FOM < locBestTrackingFOM)
277 locBestTrackingFOM = locTrackTimeBased->FOM;
278 locBestChargedTrackHypothesis = locChargedTrackHypothesis;
282 if(locBestChargedTrackHypothesis !=
nullptr)
283 locBestTracks.insert(locBestChargedTrackHypothesis);
288 map<int, map<bool, vector<int> > > locHitMap_HitFound, locHitMap_HitTotal;
291 for(
auto& locChargedTrackHypothesis : locBestTracks)
293 auto locTrackTimeBased = locChargedTrackHypothesis->Get_TrackTimeBased();
298 auto locBCALShowerMatchParams = locChargedTrackHypothesis->Get_BCALShowerMatchParams();
299 if(locBCALShowerMatchParams == NULL)
309 vector<const DBCALCluster*> locClusters;
310 locBCALShowerMatchParams->dBCALShower->Get(locClusters);
311 if(locClusters.size() > 1)
316 vector<const DBCALPoint*> locClusterBCALPoints = locCluster->
points();
317 vector<pair<const DBCALUnifiedHit*, double> > locClusterBCALHits = locCluster->
hits();
321 set<const DBCALPoint*> locClusterPointSet;
322 map<int, map<int, set<const DBCALPoint*> > > locSortedClusterPoints;
323 for(
const auto& locPoint : locClusterBCALPoints)
325 locClusterPointSet.insert(locPoint);
326 int locSector = (locPoint->module() - 1)*4 + locPoint->sector();
327 locSortedClusterPoints[locPoint->layer()][locSector].insert(locPoint);
332 if(locSortedClusterPoints.size() < 2)
337 set<const DBCALUnifiedHit*> locClusterUnifiedHitSet;
338 map<int, map<int, set<const DBCALUnifiedHit*> > > locSortedClusterHits_Upstream, locSortedClusterHits_Downstream;
339 for(
const auto& locUnifiedHitPair : locClusterBCALHits)
342 locClusterUnifiedHitSet.insert(locUnifiedHit);
344 int locSector = (locUnifiedHit->
module - 1)*4 + locUnifiedHit->
sector;
346 locSortedClusterHits_Upstream[locUnifiedHit->
layer][locSector].insert(locUnifiedHit);
348 locSortedClusterHits_Downstream[locUnifiedHit->
layer][locSector].insert(locUnifiedHit);
352 UChar_t locClusterLayers = 0;
353 for(
auto& locLayerPair : locSortedClusterPoints)
354 locClusterLayers |= (1 << (locLayerPair.first - 1));
355 for(
auto& locLayerPair : locSortedClusterHits_Upstream)
356 locClusterLayers |= (1 << (locLayerPair.first + 4 - 1));
357 for(
auto& locLayerPair : locSortedClusterHits_Downstream)
358 locClusterLayers |= (1 << (locLayerPair.first + 4 - 1));
363 map<int, UChar_t> locProjectedSectorsMap, locNearestSectorsMap_Downstream, locNearestSectorsMap_Upstream;
364 map<int, Float_t> locNearestHitEnergy_Upstream, locNearestHitEnergy_Downstream;
367 UChar_t locIsHitInClusterBits = 0;
370 for(
int locLayer = 1; locLayer <= 4; ++locLayer)
373 locProjectedSectorsMap[locLayer] = 0;
374 locNearestSectorsMap_Downstream[locLayer] = 0;
375 locNearestSectorsMap_Upstream[locLayer] = 0;
376 locNearestHitEnergy_Upstream[locLayer] = 0;
377 locNearestHitEnergy_Downstream[locLayer] = 0;
382 auto locClusterPointsIterator = locSortedClusterPoints.find(locLayer);
383 if((locClusterPointsIterator != locSortedClusterPoints.end()) && (locSortedClusterPoints.size() <= 2))
400 int locProjectedSectorInt = int(locProjectedSector + 0.5);
403 locProjectedSectorsMap[locLayer] = UChar_t(locProjectedSectorInt);
404 locHitMap_HitTotal[locLayer][
true].push_back(locProjectedSectorInt);
405 locHitMap_HitTotal[locLayer][
false].push_back(locProjectedSectorInt);
413 auto locPointsIterator = locSortedPoints.find(locLayer);
414 pair<const DBCALPoint*, double> locNearestPoint(NULL, 999.0);
415 if(locPointsIterator != locSortedPoints.end())
416 locNearestPoint =
Find_NearestPoint(locProjectedSector, locPointsIterator->second, locCluster, 8.0);
419 pair<const DBCALUnifiedHit*, double> locNearestHit_Upstream(NULL, 999.0);
420 auto locHitsIterator = locSortedHits_Upstream.find(locLayer);
421 if(locHitsIterator != locSortedHits_Upstream.end())
422 locNearestHit_Upstream =
Find_NearestHit(locProjectedSector, locHitsIterator->second, locCluster, locBCALGeom, 20.0);
425 pair<const DBCALUnifiedHit*, double> locNearestHit_Downstream(NULL, 999.0);
426 locHitsIterator = locSortedHits_Downstream.find(locLayer);
427 if(locHitsIterator != locSortedHits_Downstream.end())
428 locNearestHit_Downstream =
Find_NearestHit(locProjectedSector, locHitsIterator->second, locCluster, locBCALGeom, 20.0);
433 if((locNearestPoint.first !=
nullptr) || (locNearestHit_Upstream.first !=
nullptr))
435 bool locUsePointFlag = (locNearestPoint.second <= locNearestHit_Upstream.second);
437 int locFoundSector = 0;
438 bool locIsInClusterFlag =
false;
439 float locFoundE = 0.;
442 locFoundSector = (locNearestPoint.first->module() - 1)*4 + locNearestPoint.first->sector();
443 locIsInClusterFlag = (locClusterPointSet.find(locNearestPoint.first) != locClusterPointSet.end());
444 locFoundE = locNearestPoint.first->E();
448 locFoundSector = (locNearestHit_Upstream.first->module - 1)*4 + locNearestHit_Upstream.first->sector;
449 locIsInClusterFlag = (locClusterUnifiedHitSet.find(locNearestHit_Upstream.first) != locClusterUnifiedHitSet.end());
450 locFoundE = locNearestHit_Upstream.first->E;
453 locNearestSectorsMap_Upstream[locLayer] = UChar_t(locFoundSector);
454 locNearestHitEnergy_Upstream[locLayer] = (Float_t) locFoundE;
455 if(locIsInClusterFlag)
456 locIsHitInClusterBits |= (1 << (locLayer - 1));
458 int locDeltaSector = Calc_DeltaSector<int>(locFoundSector, locProjectedSectorInt);
460 locHitMap_HitFound[locLayer][
true].push_back(locProjectedSectorInt);
464 if((locNearestPoint.first !=
nullptr) || (locNearestHit_Downstream.first !=
nullptr))
466 bool locUsePointFlag = (locNearestPoint.second <= locNearestHit_Downstream.second);
468 int locFoundSector = 0;
469 bool locIsInClusterFlag =
false;
470 float locFoundE = 0.;
473 locFoundSector = (locNearestPoint.first->module() - 1)*4 + locNearestPoint.first->sector();
474 locIsInClusterFlag = (locClusterPointSet.find(locNearestPoint.first) != locClusterPointSet.end());
475 locFoundE = locNearestPoint.first->E();
479 locFoundSector = (locNearestHit_Downstream.first->module - 1)*4 + locNearestHit_Downstream.first->sector;
480 locIsInClusterFlag = (locClusterUnifiedHitSet.find(locNearestHit_Downstream.first) != locClusterUnifiedHitSet.end());
481 locFoundE = locNearestHit_Downstream.first->E;
484 locNearestSectorsMap_Downstream[locLayer] = UChar_t(locFoundSector);;
485 locNearestHitEnergy_Downstream[locLayer] = (Float_t) locFoundE;
486 if(locIsInClusterFlag)
487 locIsHitInClusterBits |= (1 << (locLayer - 1 + 4));
489 int locDeltaSector = Calc_DeltaSector<int>(locFoundSector, locProjectedSectorInt);
491 locHitMap_HitFound[locLayer][
false].push_back(locProjectedSectorInt);
496 unsigned int locPredictedSurfaceModule = 0, locPredictedSurfaceSector = 0;
497 DVector3 locPredictedSurfacePosition;
498 locParticleID->
PredictBCALWedge(locTrackTimeBased->extrapolations.at(
SYS_BCAL), locPredictedSurfaceModule, locPredictedSurfaceSector, &locPredictedSurfacePosition);
499 unsigned int locTrackProjectedBCALSector = 4*(locPredictedSurfaceModule - 1) + locPredictedSurfaceSector;
506 DVector3 locDP3 = locChargedTrackHypothesis->momentum();
507 TVector3 locP3(locDP3.X(), locDP3.Y(), locDP3.Z());
514 dTreeFillData.
Fill_Single<Float_t>(
"TrackDeltaPhiToShower", 180.0*locBCALShowerMatchParams->dDeltaPhiToShower/TMath::Pi());
556 japp->RootFillLock(
this);
559 for(
auto& locLayerPair : locHitMap_HitFound)
561 for(
auto& locEndPair : locLayerPair.second)
563 for(
int& locSector : locEndPair.second)
569 for(
auto& locLayerPair : locHitMap_HitTotal)
571 for(
auto& locEndPair : locLayerPair.second)
573 for(
int& locSector : locEndPair.second)
578 japp->RootFillUnLock(
this);
589 if((locLayer == 2) || (locLayer == 3))
592 vector<double> locSectors;
593 auto locLayerIterator = locSortedPoints.find(locLayer - 1);
594 if(locLayerIterator != locSortedPoints.end())
597 locLayerIterator = locSortedPoints.find(locLayer + 1);
598 if(locLayerIterator != locSortedPoints.end())
602 if(locSectors.size() == 1)
603 return locSectors[0];
605 double locProjectedSector = locSectors[0] + locSectors[1];
606 if(abs(locSectors[0] - locSectors[1]) > 96.0)
607 locProjectedSector += 192.0;
608 locProjectedSector /= 2.0;
609 while(locProjectedSector >= 193.0)
610 locProjectedSector -= 192.0;
611 return locProjectedSector;
613 else if(locLayer == 1)
615 auto locLayerIterator = locSortedPoints.find(2);
616 if(locLayerIterator != locSortedPoints.end())
623 auto locLayerIterator = locSortedPoints.find(3);
624 if(locLayerIterator != locSortedPoints.end())
634 if(locBCALPoints.empty())
638 vector<pair<double, double> > locSectors;
639 bool locHasLowPhiHits =
false, locHasHighPhiHits =
false;
640 for(
auto& locPointPair : locBCALPoints)
643 double locEnergySum = 0.0;
644 for(
auto& locPoint : locPointPair.second)
645 locEnergySum += locPoint->E();
647 locSectors.push_back(pair<double, double>(
double(locPointPair.first), locEnergySum));
648 if(locPointPair.first <= 12.0)
649 locHasLowPhiHits =
true;
650 else if(locPointPair.first >= 179)
651 locHasHighPhiHits =
true;
655 double locNumerator = 0.0, locDenominator = 0.0;
656 for(
auto& locSectorPair : locSectors)
658 double locWeight = 1.0/(locSectorPair.second*locSectorPair.second);
660 double locSector = locSectorPair.first;
661 if(locHasLowPhiHits && locHasHighPhiHits && (locSector < 96.0))
663 locNumerator += locSector*locWeight;
665 locDenominator += locWeight;
669 double locAverageSector = locNumerator/locDenominator;
670 while(locAverageSector >= 193.0)
671 locAverageSector -= 192.0;
674 return locAverageSector;
682 double locBestDeltaSector = 999.0;
684 for(
auto& locPointPair : locLayerBCALPoints)
688 if(locBCALPoint == NULL)
691 double locDeltaSector = Calc_DeltaSector<double>(locPointPair.first, locProjectedSector);
692 if(fabs(locDeltaSector) >= fabs(locBestDeltaSector))
694 locBestDeltaSector = locDeltaSector;
695 locBestBCALPoint = locBCALPoint;
698 return pair<const DBCALPoint*, double>(locBestBCALPoint, locBestDeltaSector);
707 double locBestDeltaSector = 999.0;
709 for(
auto& locHitPair : locLayerUnifiedHits)
715 double locDeltaSector = Calc_DeltaSector<double>(locHitPair.first, locProjectedSector);
716 if(fabs(locDeltaSector) >= fabs(locBestDeltaSector))
718 locBestDeltaSector = locDeltaSector;
719 locBestBCALHit = locHit;
722 return pair<const DBCALUnifiedHit*, double>(locBestBCALHit, locBestDeltaSector);
727 if(locPoints.empty())
729 if(locTimeCut <= 0.0)
730 return *(locPoints.begin());
733 for(
auto& locPoint : locPoints)
735 double locDeltaT = fabs(locBCALCluster->
t() - locPoint->t());
736 if(locDeltaT > locTimeCut)
740 locTimeCut = locDeltaT;
741 locBestPoint = locPoint;
752 if(locTimeCut <= 0.0)
753 return *(locHits.begin());
757 for(
auto& locHit : locHits)
770 int channel_calib = 16*(locHit->module - 1) + 4*(locHit->layer - 1) + locHit->sector - 1;
772 double locDeltaT = fabs(locCorrectedHitTime - locBCALCluster->
t());
775 if(locDeltaT > locTimeCut)
777 locTimeCut = locDeltaT;
789 double locDeltaT = locChargedTrackHypothesis->
time() - locChargedTrackHypothesis->
t0();
DTreeInterface * dTreeInterface
pair< const DBCALPoint *, double > Find_NearestPoint(double locProjectedSector, const map< int, set< const DBCALPoint * > > &locLayerBCALPoints, const DBCALCluster *locBCALCluster, double locTimeCut=-1.0)
uint32_t Get_L1TriggerBits(void) const
int dMinHitRingsPerCDCSuperlayer
void Register_Single(string locBranchName)
double Calc_AverageSector(const map< int, set< const DBCALPoint * > > &locBCALPoints)
const DBCALPoint * Find_ClosestTimePoint(const set< const DBCALPoint * > &locPoints, const DBCALCluster *locBCALCluster, double locTimeCut)
const DTrackTimeBased * Get_TrackTimeBased(void) const
bool Create_Branches(const DTreeBranchRegister &locTreeBranchRegister)
uint32_t Get_L1FrontPanelTriggerBits(void) const
vector< double > effective_velocities
static int PDGtype(Particle_t p)
jerror_t evnt(jana::JEventLoop *locEventLoop, uint64_t locEventNumber)
Called every event.
jerror_t fini(void)
Called after last event of last event source has been processed.
jerror_t init(void)
Called once at program start.
float GetBCAL_length() const
void Fill(DTreeFillData &locTreeFillData)
static DTreeInterface * Create_DTreeInterface(string locTreeName, string locFileName)
map< int, map< bool, TH1I * > > dHistMap_HitTotal
unsigned int dMinNumTrackHits
int dMinHitPlanesPerFDCPackage
DGeometry * GetDGeometry(unsigned int run_number)
pair< const DBCALUnifiedHit *, double > Find_NearestHit(double locProjectedSector, const map< int, set< const DBCALUnifiedHit * > > &locLayerUnifiedHits, const DBCALCluster *locBCALCluster, const DBCALGeometry *locBCALGeom, double locTimeCut=-1.0)
vector< pair< const DBCALUnifiedHit *, double > > hits() const
DCutAction_TrackHitPattern * dCutAction_TrackHitPattern
int Ndof
Number of degrees of freedom in the fit.
vector< const DBCALPoint * > points() const
map< int, map< bool, TH1I * > > dHistMap_HitFound
double Calc_ProjectedSector(int locLayer, const map< int, map< int, set< const DBCALPoint * > > > &locSortedPoints)
jerror_t brun(jana::JEventLoop *locEventLoop, int locRunNumber)
Called every time a new run number is detected.
float GetBCAL_center() const
bool Cut_TrackHitPattern(const DParticleID *locParticleID, const DKinematicData *locTrack) const
static thread_local DTreeFillData dTreeFillData
const DBCALUnifiedHit * Find_ClosestTimeHit(const set< const DBCALUnifiedHit * > &locHits, const DBCALCluster *locBCALCluster, double locTimeCut, const DBCALGeometry *locBCALGeom)
jerror_t erun(void)
Called every time run number changes, provided brun has been called.
int dHistFoundDeltaSector
bool Cut_BCALTiming(const DChargedTrackHypothesis *locChargedTrackHypothesis)
unsigned int dNumParticleVotes
DetectorSystem_t t1_detector(void) const
bool PredictBCALWedge(const DReferenceTrajectory *rt, unsigned int &module, unsigned int §or, DVector3 *intersection=nullptr) const
bool GetTargetZ(double &z_target) const
z-location of center of target
bool Get_IsMatchedToDetector(const DTrackingData *locTrack, DetectorSystem_t locDetectorSystem) const
void Fill_Single(string locBranchName, const DType &locData)