27 const std::string& name,
28 const IInterface* parent)
32 declareInterface<ITrackCollectionProvider>(
this);
51 return StatusCode::SUCCESS;
71 m_tree =
new TTree(
"MSMomentumConstraint",
"MSMomentumConstraint");
179 success =
m_tree->Write();
181 return success>0 ? StatusCode::SUCCESS : StatusCode::FAILURE;
189 return StatusCode::SUCCESS;
195 const Trk::Perigee* IDTrkMeasuredPerigee =
dynamic_cast<const Trk::Perigee*
>(& (it->inDetTrackParticle()->definingParameters()));
196 if(!IDTrkMeasuredPerigee){
197 ATH_MSG_DEBUG(
"NO inDetTrackParticle or no IDTrkMeasuredPerigee");
201 const Trk::Perigee* METrkMeasuredPerigee =
dynamic_cast<const Trk::Perigee*
>(&(it->muonExtrapolatedTrackParticle()->definingParameters()));
202 if(!METrkMeasuredPerigee){
203 ATH_MSG_DEBUG(
"NO muonExtrapolatedTrackParticle or no METrkMeasuredPerigee");
207 const double pt = fabs(it->pt())/1000.;
208 const double eta = fabs(it->eta());
213 (
eta > 0.8 &&
eta < 1.2) ){
214 ATH_MSG_DEBUG(
" this combinedMuon not pass basic pt and eta cuts --- pt: "<< pt <<
" eta: " <<
eta);
218 const int nPixHits = it->numberOfPixelHits();
219 const int nSCTHits = it->numberOfSCTHits();
220 const int nTRTHits = it->numberOfTRTHits();
228 const double idQoverPatIP = IDTrkMeasuredPerigee->parameters()[
Trk::qOverP] * 1000.;
229 const double idz0atIP = IDTrkMeasuredPerigee->parameters()[
Trk::z0];
230 const double idd0atIP = IDTrkMeasuredPerigee->parameters()[
Trk::d0];
231 double ptIDatIP = 0.;
232 if ( idQoverPatIP != 0 ) ptIDatIP = fabs(1.0/idQoverPatIP)*sin(IDTrkMeasuredPerigee->parameters()[
Trk::theta]);
243 ATH_MSG_DEBUG(
"this combined muon not pass ID cuts --- nPixHits: " << nPixHits <<
" nSCTHits: " << nSCTHits <<
244 "nTRTHits: " << nTRTHits <<
" idd0atIP: " << idd0atIP <<
" idz0atIP: " << idz0atIP <<
" ptIDatIP: " << ptIDatIP );
250 const int nMDTHits = it->numberOfMDTHits();
251 const int nRPCPhiHits = it->numberOfRPCPhiHits();
252 const int nTGCPhiHits = it->numberOfTGCPhiHits();
254 const double msQoverPatIP = METrkMeasuredPerigee->parameters()[
Trk::qOverP] * 1000.;
255 const double msz0atIP = METrkMeasuredPerigee->parameters()[
Trk::z0];
256 const double msd0atIP = METrkMeasuredPerigee->parameters()[
Trk::d0];
258 double ptMSatIP = 0.;
259 if ( msQoverPatIP != 0 ) ptMSatIP = fabs(1.0/msQoverPatIP)*sin(METrkMeasuredPerigee->parameters()[
Trk::theta]);
272 ATH_MSG_DEBUG(
"this combined muon not pass MS cuts --- nMDTHits: " << nMDTHits <<
" nRPCPhiHits: " << nRPCPhiHits <<
273 " nTGCPhiHits: " << nTGCPhiHits <<
" msd0atIP: " << msd0atIP <<
274 " msz0atIP: " << msz0atIP <<
" pMSatIP:" << ptMSatIP);
283 if (aTrackParticle) aTrack = aTrackParticle->
originalTrack();
285 if (aTrack && aTrack != it->inDetTrkTrack()) {
290 std::vector<const Muon::MuonSegment*> segments;
291 unsigned int nSeg = it->numberOfSegments();
292 segments.reserve(nSeg);
293 for(
unsigned int si=0; si<nSeg; ++si ){
295 if( seg ) segments.push_back(seg);
301 const int sectors = summary.sectors.size();
302 const int phiLayers = summary.phiLayers.size();
303 const int stationLayers = summary.stationLayers.size();
310 ATH_MSG_DEBUG(
"this combined muon not pass muonHitSummary cuts --- sectors: "<< sectors <<
" phiLayers: "<< phiLayers <<
" stationLayers: " << stationLayers);
315 m_pID = it->inDetTrackParticle()->p();
316 m_pMS = it->muonExtrapolatedTrackParticle()->p();
317 m_ptID = it->inDetTrackParticle()->pt();
318 m_ptMS = it->muonExtrapolatedTrackParticle()->pt();
319 m_charge = it->inDetTrackParticle()->charge();
322 m_IDEta = it->inDetTrackParticle()->eta();
324 m_IDPhi = it->inDetTrackParticle()->phi();
348 originalTracks =
nullptr;
353 ATH_MSG_WARNING(
"One probability is that you are not running on ESD/DESD ");
357 if (!trackContainer.
isValid()){
358 originalTracks =
nullptr;
361 originalTracks = trackContainer.
cptr();
365 return StatusCode::SUCCESS;
371 Analysis::MuonContainer::const_iterator combinedTrackIt =
muonContainer->begin();
372 Analysis::MuonContainer::const_iterator combinedTrackItE =
muonContainer->end();
373 int goodQualityCombinedMuon = 0;
375 for ( ; combinedTrackIt != combinedTrackItE; ++combinedTrackIt ) {
378 if (
muon->isCombinedMuon() &&
muon->hasMuonExtrapolatedTrackParticle() &&
muon->hasInDetTrackParticle() ){
381 ATH_MSG_DEBUG(
"have good quality combined Muons of the event: " << ++goodQualityCombinedMuon);
383 const Trk::Perigee* METrkMeasuredPerigee =
dynamic_cast<const Trk::Perigee*
>(&(
muon->muonExtrapolatedTrackParticle()->definingParameters()));
384 if(!METrkMeasuredPerigee){
385 ATH_MSG_DEBUG(
"NO muonExtrapolatedTrackParticle or no METrkMeasuredPerigee");
396 if(!IDTrkMeasuredPerigee){
397 ATH_MSG_DEBUG(
"NO inDetTrackParticle or no IDTrkMeasuredPerigee");
403 std::vector<Trk::DefinedParameter> parFromMSVec;
404 parFromMSVec.push_back( qOverPFromMS) ;
409 auto pmot = std::make_unique<Trk::PseudoMeasurementOnTrack>(
412 auto trackStateOnSurfaces = std::make_unique<Trk::TrackStates>();
413 trackStateOnSurfaces->reserve(
muon->inDetTrackParticle()->originalTrack()->trackStateOnSurfaces()->size() + 1);
416 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes>
type;
419 const Perigee* IDPerigeeParameters =
muon->inDetTrackParticle()->originalTrack()->perigeeParameters();
421 auto IDPerigeeParametersClone =
422 (IDPerigeeParameters)
423 ? std::make_unique<Perigee>(*IDPerigeeParameters)
426 if(IDPerigeeParameters && IDPerigeeParametersClone ){
427 trackStateOnSurfaces->push_back(
new const Trk::TrackStateOnSurface(std::move(pmot), std::move(IDPerigeeParametersClone),
nullptr,
type));
429 for ( ; sb !=
muon->inDetTrackParticle()->originalTrack()->trackStateOnSurfaces()->end(); ++sb) trackStateOnSurfaces->push_back((**sb).clone());
432 muon->inDetTrackParticle()->originalTrack()->info(),
433 std::move(trackStateOnSurfaces),
440 if(!MSConstraintFittedTrack){
445 ATH_MSG_WARNING(
"Try to push the originalIDTrack into the trackCollection");
447 if(IDOriginalTrackClone){
451 "IDOriginalTrackClone parameters --- pt: "
452 << fabs(1. / (aMeasPerClone->parameters()[
Trk::qOverP])) *
454 <<
" d0: " << aMeasPerClone->parameters()[
Trk::d0]);
457 if(!IDOriginalTrackClone){
474 delete MSConstraintFittedTrackClone;
485 ATH_MSG_WARNING(
"failed in IDPerigeeParameters or IDPerigeeParametersClone !");
493 ATH_MSG_WARNING(
"problem with recording MSMomentumConstraintTracks to StoreGate!");
494 return StatusCode::SUCCESS;
503 return StatusCode::SUCCESS;
511 *
m_logStream<<
"*************************************************************"<<std::endl;
512 *
m_logStream<<
"****** MSConstraintTracksProvider Summary ******"<<std::endl;
Scalar eta() const
pseudorapidity method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
xAOD::MuonContainer * muonContainer
The ATLAS Muon object - see doxygen, physics workbookd and the Muon Combined Performance WG's pages f...
ServiceHandle< StoreGateSvc > & evtStore()
DataModel_detail::const_iterator< DataVector > const_iterator
size_type size() const noexcept
Returns the number of elements in the collection.
This is the common class for 3D segments used in the muon spectrometer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
std::ostream * m_logStream
logfile output stream
Gaudi::Property< double > m_maxIDz0
Gaudi::Property< double > m_maxIDd0
Gaudi::Property< int > m_minStationLayers
double m_ptID_constrained
Gaudi::Property< RunOutlierRemoval > m_runOutlierRemoval
bool combinedMuonSelection(const Analysis::Muon *)
int m_nCBMuonsPassSelection
Gaudi::Property< int > m_maxNumberOfSectors
Gaudi::Property< int > m_minTRTHits
Gaudi::Property< int > m_minNumberOfPhiLayers
int m_nCBMuonsFailedRefit
MSConstraintTracksProvider(const std::string &type, const std::string &name, const IInterface *parent)
Gaudi::Property< int > m_minTGCPhiHits
Gaudi::Property< double > m_maxMSd0
Gaudi::Property< int > m_minSCTHits
StatusCode fillNtuple()
writes tree to ntuple
Gaudi::Property< double > m_minPt
Gaudi::Property< int > m_minRPCPhiHits
Gaudi::Property< int > m_minMDTHits
Gaudi::Property< double > m_maxMSz0
Gaudi::Property< int > m_minPIXHits
Gaudi::Property< bool > m_useMSConstraintTrkOnly
ToolHandle< IGlobalTrackFitter > m_trackFitter
virtual ~MSConstraintTracksProvider()
void setNtuple(TFile *ntuple)
sets ntuple
SG::ReadHandleKey< TrackCollection > m_trackContainerKey
Gaudi::Property< bool > m_doTree
ToolHandle< Muon::IMuonHitSummaryTool > m_muonHitSummaryTool
double m_IDEta_constrained
virtual StatusCode finalize()
virtual void printSummary()
Print statistical summary to logfile.
SG::ReadHandleKey< Analysis::MuonContainer > m_muonContainerKey
Gaudi::Property< double > m_minMSPt
virtual StatusCode trackCollection(const TrackCollection *&tracks)
Gaudi::Property< double > m_minIDPt
double m_IDPhi_constrained
virtual StatusCode initialize()
virtual const S & associatedSurface() const override final
Access to the Surface method.
Abstract Base Class for tracking surfaces.
const Track * originalTrack() const
Return pointer to associated track.
represents the track state (measurement, material, fit parameters and quality) at a surface.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
const Perigee * perigeeParameters() const
return Perigee.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Ensure that the ATLAS eigen extensions are properly loaded.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
std::pair< double, ParamDefs > DefinedParameter
Typedef to of a std::pair<double, ParamDefs> to identify a passed-through double as a specific type o...