ATLAS Offline Software
Loading...
Searching...
No Matches
TrkDriftCircleMath::MdtSegmentT0Fitter Class Reference

#include <MdtSegmentT0Fitter.h>

Inheritance diagram for TrkDriftCircleMath::MdtSegmentT0Fitter:
Collaboration diagram for TrkDriftCircleMath::MdtSegmentT0Fitter:

Public Member Functions

 MdtSegmentT0Fitter (const std::string &, const std::string &, const IInterface *)
virtual ~MdtSegmentT0Fitter ()=default
virtual StatusCode initialize () override
virtual StatusCode finalize () override
virtual bool fit (Segment &result, const Line &line, const DCOnTrackVec &dcs, double t0Seed) const override
virtual bool fit (Segment &result, const Line &line, const DCOnTrackVec &dcs, const HitSelection &selection, double t0Seed) const override
virtual const DCSLFittergetFitter () const override
 fitter factory
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Static Public Member Functions

static const InterfaceID & interfaceID ()

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

SG::ReadCondHandleKey< MuonCalib::MdtCalibDataContainerm_calibDbKey
ServiceHandle< Muon::IMuonIdHelperSvcm_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
Gaudi::Property< bool > m_rejectWeakTopologies {this,"RejectWeakTopologies",true,"reject topolgies that do not have at least one +- combination in one multilayer"}
Gaudi::Property< bool > m_scaleErrors {this,"RescaleErrors",true,"rescale errors in fit"}
Gaudi::Property< bool > m_propagateErrors {this,"PropagateErrors",true,"propagate errors"}
Gaudi::Property< int > m_minHits {this,"MinimumHits",4,"minimum number of selected hits for t0 fit. Otherwise use default"}
Gaudi::Property< float > m_dRTol {this,"dRTolerance",0.1}
Gaudi::Property< bool > m_floatDir
std::atomic_uint m_ntotalCalls {0}
std::atomic_uint m_npassedNHits {0}
std::atomic_uint m_npassedSelectionConsistency {0}
std::atomic_uint m_npassedNSelectedHits {0}
std::atomic_uint m_npassedMinHits {0}
std::atomic_uint m_npassedMinuitFit {0}
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 25 of file MdtSegmentT0Fitter.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ MdtSegmentT0Fitter()

TrkDriftCircleMath::MdtSegmentT0Fitter::MdtSegmentT0Fitter ( const std::string & ty,
const std::string & na,
const IInterface * pa )

Definition at line 168 of file MdtSegmentT0Fitter.cxx.

169 : AthAlgTool(ty,na,pa),
170 DCSLFitter() {
171 declareInterface <IDCSLFitProvider> (this);
172 }
AthAlgTool()
Default constructor:

◆ ~MdtSegmentT0Fitter()

virtual TrkDriftCircleMath::MdtSegmentT0Fitter::~MdtSegmentT0Fitter ( )
virtualdefault

Member Function Documentation

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ finalize()

StatusCode TrkDriftCircleMath::MdtSegmentT0Fitter::finalize ( )
overridevirtual

Definition at line 179 of file MdtSegmentT0Fitter.cxx.

179 {
180
181 double scaleFactor = m_ntotalCalls != 0 ? 1./(double)m_ntotalCalls : 1.;
182
183 ATH_MSG_INFO( "Summarizing fitter statistics " << "\n"
184 << " Total fits " << std::setw(10) << m_ntotalCalls << " " << scaleFactor*m_ntotalCalls << "\n"
185 << " hits > 2 " << std::setw(10) << m_npassedNHits << " " << scaleFactor*m_npassedNHits << "\n"
186 << " hit consis. " << std::setw(10) << m_npassedSelectionConsistency << " " << scaleFactor*m_npassedSelectionConsistency << "\n"
187 << " sel. hits > 2 " << std::setw(10) << m_npassedNSelectedHits << " " << scaleFactor*m_npassedNSelectedHits << "\n"
188 << " Hits > min hits " << std::setw(10) << m_npassedMinHits << " " << scaleFactor*m_npassedMinHits << "\n"
189 << " Passed Fit " << std::setw(10) << m_npassedMinuitFit << " " << scaleFactor*m_npassedMinuitFit );
190 return StatusCode::SUCCESS;
191 }
#define ATH_MSG_INFO(x)

◆ fit() [1/2]

bool TrkDriftCircleMath::MdtSegmentT0Fitter::fit ( Segment & result,
const Line & line,
const DCOnTrackVec & dcs,
const HitSelection & selection,
double t0Seed ) const
overridevirtual

Normalize the mean positions

go to coordinates centered at the average of the hits

Reimplemented from TrkDriftCircleMath::DCSLFitter.

Definition at line 193 of file MdtSegmentT0Fitter.cxx.

193 {
195 const MdtIdHelper& id_helper{m_idHelperSvc->mdtIdHelper()};
196 ATH_MSG_DEBUG("New seg: ");
197 const EventContext& ctx{Gaudi::Hive::currentContext()};
198 SG::ReadCondHandle<MuonCalib::MdtCalibDataContainer> calibData{m_calibDbKey, ctx};
199 if (!calibData.isValid()) {
200 ATH_MSG_FATAL("Failed to retrieve Mdt calibration object "<<m_calibDbKey.fullKey());
201 return false;
202 }
203 std::array<const MuonCalib::MdtRtRelation*, 2> rtRelations{};
204 {
205 unsigned int nRel{0};
206 for (unsigned int i = 0; i < dcs.size() ; ++i) {
207 const Identifier id = dcs[i].rot()->identify();
208 const int mlIdx = id_helper.multilayer(id) -1;
209 if (rtRelations[mlIdx]) continue;
210 rtRelations[mlIdx] = calibData->getCalibData(id, msgStream())->rtRelation.get();
211 ++nRel;
212 if (nRel == 2) break;
213 }
214 }
215 const DCOnTrackVec& dcs_keep = dcs;
216
217 unsigned int N = dcs_keep.size();
218
219 result.setT0Shift(-99999,-99999);
220
221 if(N<2) {
222 return false;
223 }
225 if( selection.size() != N ) {
226 ATH_MSG_ERROR("MdtSegmentT0Fitter.cxx:fit with t0 <bad HitSelection>");
227 return false;
228 }
230 int used=0;
231 for(unsigned int i=0;i<N;++i){
232 if( selection[i] == 0 ) ++used;
233 }
234 if(used < 2){
235 ATH_MSG_DEBUG("TOO FEW HITS SELECTED");
236 return false;
237 }
239
240 if(used < m_minHits) {
241 ATH_MSG_DEBUG("FEWER THAN Minimum HITS N " << m_minHits << " total hits " <<N<<" used " << used);
242
243 //
244 // Copy driftcircles and reset the drift radii as they might have been overwritten
245 // after a succesfull t0 fit
246 //
247
248 DCOnTrackVec dcs_new;
249 dcs_new.reserve(dcs.size());
250
251 double chi2p = 0.;
252 int n_elements = dcs.size();
253 for(int i=0; i< n_elements; ++i ){
254 const DriftCircle* ds = & dcs[i];
255 if(std::abs(ds->r()-ds->rot()->driftRadius())>m_dRTol) ATH_MSG_DEBUG("Different radii on dc " << ds->r() << " rot " << ds->rot()->driftRadius());
256
257 DriftCircle dc_keep(ds->position(), ds->rot()->driftRadius(), ds->dr(), ds->drPrecise(), ds->driftState(), ds->id(), ds->rot(), ds->index());
258 DCOnTrack dc_new(dc_keep, 0., 0.);
259
260 dc_new.state(dcs[i].state());
261 dcs_new.push_back( dc_new );
262 if( selection[i] == 0 ){
263 double t = ds->rot()->driftTime();
264 const unsigned int mlIdx = id_helper.multilayer(ds->rot()->identify()) - 1;
265 const MuonCalib::MdtRtRelation *rtInfo = rtRelations[mlIdx];
266
267 double tUp = rtInfo->rt()->tUpper();
268 double tLow = rtInfo->rt()->tLower();
269
270 if(t<tLow) chi2p += sq(t-tLow)*0.1;
271 else if(t>tUp) chi2p += sq(t-tUp)*0.1;
272 }
273 }
274
275 if(chi2p>0) ATH_MSG_DEBUG("NO Minuit Fit TOO few hits Chi2 penalty " << chi2p);
276
277 bool oldrefit = DCSLFitter::fit( result, line, dcs_new, selection );
278
279 chi2p += result.chi2();
280 // add chi2 penalty for too large or too small driftTimes t < 0 or t> t upper
281 result.set(chi2p, result.ndof(), result.dtheta(), result.dy0());
282 int iok = 0;
283 if(oldrefit) iok = 1;
284 ATH_MSG_DEBUG(" chi2 total " << result.chi2() << " angle " << result.line().phi() << " y0 " << result.line().y0() << " nhits "<< selection.size() << " refit ok " << iok);
285 return oldrefit;
286
287 }
288
289 ATH_MSG_DEBUG("FITTING FOR T0 N "<<N<<" used " << used);
290
291
293
294
295 ATH_MSG_DEBUG(" in MdtSegmentT0Fitter::fit with N dcs "<< N << " hit selection size " << selection.size());
296 ATH_MSG_DEBUG("in fit "<<result.hasT0Shift()<< " " <<result.t0Shift());
297
298
299 double Zc{0.}, Yc{0.}, S{0.}, Sz{0.}, Sy{0};
300
301 std::vector<HitCoords> hits{};
302 hits.reserve(N);
303 FunctionToMinimize minFunct(used);
304
305 {
306 unsigned int ii{0};
307 for(const DCOnTrack& keep_me : dcs_keep ){
308 const Muon::MdtDriftCircleOnTrack *roto = keep_me.rot();
309 const unsigned int mlIdx = id_helper.multilayer(roto->identify()) - 1;
310 const MuonCalib::MdtRtRelation *rtInfo = rtRelations[mlIdx];
311
312 const double newerror = m_scaleErrors ? keep_me.drPrecise() : keep_me.dr();
313 const double w = newerror >0. ? sq(1./newerror) : 0.;
314 hits.emplace_back(keep_me.x(), roto->driftTime(), keep_me.y(), w, std::abs(roto->driftRadius()), rtInfo->rt());
315 HitCoords& coords = hits.back();
316 coords.dr = keep_me.dr();
317 coords.rejected = selection[ii];
318 ATH_MSG_DEBUG("DC: (" << coords.y << "," << coords.z << ") R = " << coords.r << " W " << coords.w
319 <<" t " <<coords.t<< " id: "<<keep_me.id()<<" sel " <<coords.rejected);
320 if (!coords.rejected) {
321 S += coords.w;
322 Sz+= coords.z* coords.w;
323 Sy+= coords.y * coords.w;
324 }
325 ++ii;
326 }
327 }
328
330 const double inv_S = 1. / S;
331 Zc = Sz*inv_S;
332 Yc = Sy*inv_S;
333
334 ATH_MSG_DEBUG("Yc " << Yc << " Zc " << Zc);
335
337 for(HitCoords& coords : hits) {
338 coords.y -= Yc;
339 coords.z -= Zc;
340 }
341
342 int selcount{0};
343
344 // replicate for the case where the external rt is used...
345 // each hit has an rt function with some range...we want to fit such that
346 // tlower_i < ti - t0 < tupper_i
347 double min_tlower{std::numeric_limits<float>::max()}, max_tupper{-std::numeric_limits<float>::max()};
348
349 double t0seed=0; // the average t0 of the hit
350 double st0 = 0; // the std deviation of the hit t0s
351 double min_t0 = 1e10; // the smallest t0 seen
352
353 for(HitCoords& coords : hits) {
354 if(coords.rejected) continue;
355
356 double r2tval = r2t_ext(coords.rt, coords.r) ;
357 const double tl = coords.rt->tLower();
358 const double th = coords.rt->tUpper();
359 const double tee0 = coords.t - r2tval;
360
361 min_tlower = std::min(min_tlower, coords.t - tl);
362 max_tupper = std::max(max_tupper, coords.t - th);
363
364
365 ATH_MSG_DEBUG(" z "<<coords.z <<" y "<<coords.y<<" r "<<coords.r
366 <<" t "<<coords.t<<" t0 "<<tee0<<" tLower "<<tl<<" tUpper "<<th);
367 t0seed += tee0;
368 st0 += sq(tee0);
369 if(tee0 < min_t0 && std::abs(r2tval) < R2TSPURIOUS) min_t0 = tee0;
370
371 minFunct.addCoords(coords);
372
373 selcount++;
374
375 }
376 t0seed /= selcount;
377 st0 = st0/selcount - t0seed*t0seed;
378 st0 = st0 > 0. ? std::sqrt(st0) : 0.;
379
380 ATH_MSG_DEBUG(" t0seed "<<t0seed<<" sigma "<<st0<< " min_t0 "<<min_t0);
381
382 // ************************* seed the parameters
383 const double theta = line.phi();
384 double cosin = std::cos(theta);
385 double sinus = std::sin(theta);
386
387 if ( sinus < 0.0 ) {
388 sinus = -sinus;
389 cosin = -cosin;
390 } else if ( sinus == 0.0 && cosin < 0.0 ) {
391 cosin = -cosin;
392 }
393
394 ATH_MSG_DEBUG("before fit theta "<<theta<<" sinus "<<sinus<< " cosin "<< cosin);
395
396 double d = line.y0() + Zc*sinus-Yc*cosin;
397
398
399 ATH_MSG_DEBUG(" line x y "<<line.position().x()<<" "<<line.position().y());
400 ATH_MSG_DEBUG(" Zc Yc "<< Zc <<" "<<Yc);
401 ATH_MSG_DEBUG(" line x0 y0 "<<line.x0()<<" "<<line.y0());
402 ATH_MSG_DEBUG(" hit shift " << -Zc*sinus+Yc*cosin);
403
404// Calculate signed radii
405
406 int nml1p{0}, nml2p{0}, nml1n{0}, nml2n{0};
407 int ii{-1};
408 for(const DCOnTrack& keep_me : dcs_keep){
409 ++ii;
410 const HitCoords& coords = hits[ii];
411 if(coords.rejected) continue;
412 const double sdist = d*cosin + coords.z*sinus - coords.y*cosin; // same thing as |a*z - y + b|/sqrt(1. + a*a);
413 nml1p+=(keep_me.id().ml()==0&&sdist > 0);
414 nml1n+=(keep_me.id().ml()==0&&sdist < 0);
415 nml2p+=(keep_me.id().ml()==1&&sdist > 0);
416 nml2n+=(keep_me.id().ml()==1&&sdist < 0);
417 }
418
419// Define t0 constraint in Minuit
420 int t0Error = STRONG_TOPO_T0ERROR;
421 if (nml1p+nml2p < 2 || nml1n+nml2n < 2) t0Error = WEAK_TOPO_T0ERROR;
422
423 minFunct.setT0Error(t0Error);
424
425// Reject topologies where in one of the Multilayers no +- combination is present
426 if((nml1p<1||nml1n<1)&&(nml2p<1||nml2n<1)&&m_rejectWeakTopologies) {
427 ATH_MSG_DEBUG("Combination rejected for positive radii ML1 " << nml1p << " ML2 " << nml2p << " negative radii ML1 " << nml1n << " ML " << nml2n << " used hits " << used << " t0 Error " << t0Error);
428 DCOnTrackVec::const_iterator it = dcs.begin();
429 DCOnTrackVec::const_iterator it_end = dcs.end();
430 double chi2p = 0.;
431 DCOnTrackVec dcs_new;
432 dcs_new.reserve(dcs.size());
433 for(int i=0; it!=it_end; ++it, ++i ){
434 const DriftCircle* ds = & dcs[i];
435 if(std::abs(ds->r()-ds->rot()->driftRadius())>m_dRTol) ATH_MSG_DEBUG("Different radii on dc " << ds->r() << " rot " << ds->rot()->driftRadius());
436 DriftCircle dc_keep(ds->position(), ds->rot()->driftRadius(), ds->dr(), ds->drPrecise(), ds->driftState(), ds->id(), ds->rot(), ds->index() );
437 DCOnTrack dc_new(dc_keep, 0., 0.);
438 dc_new.state(dcs[i].state());
439 dcs_new.push_back( std::move(dc_new) );
440 if( selection[i] == 0 ){
441 double t = ds->rot()->driftTime();
442 const unsigned int mlIdx = id_helper.multilayer(ds->rot()->identify()) - 1;
443 const MuonCalib::MdtRtRelation *rtInfo = rtRelations[mlIdx];
444 double tUp = rtInfo->rt()->tUpper();
445 double tLow = rtInfo->rt()->tLower();
446 if(t<tLow) chi2p += sq(t-tLow)*0.1;
447 if(t>tUp) chi2p += sq(t-tUp)*0.1;
448 }
449 }
450 if(chi2p>0) ATH_MSG_DEBUG(" Rejected weak topology Chi2 penalty " << chi2p);
451 bool oldrefit = DCSLFitter::fit( result, line, dcs_new, selection );
452 chi2p += result.chi2();
453// add chi2 penalty for too large or too small driftTimes t < 0 or t> t upper
454 result.set( chi2p, result.ndof(), result.dtheta(), result.dy0() );
455 return oldrefit;
456 } // end rejection of weak topologies
457
458 ATH_MSG_DEBUG("positive radii ML1 " << nml1p << " ML2 " << nml2p << " negative radii ML1 " << nml1n << " ML " << nml2n << " used hits " << used << " t0 Error " << t0Error);
459
460 constexpr std::array<Double_t,3> step{0.01 , 0.01 , 0.1 };
461 // starting point
462 std::array<Double_t,3> variable{theta,d,0};
463 // if t0Seed value from outside use this
464 if(t0Seed > -999.) variable[2] = t0Seed;
465
466 ROOT::Minuit2::Minuit2Minimizer minimum("algoName");
467 minimum.SetMaxFunctionCalls(10000);
468 minimum.SetTolerance(0.001);
469 minimum.SetPrintLevel(-1);
470 if(msgLvl(MSG::VERBOSE)) minimum.SetPrintLevel(1);
471
472 if (m_floatDir){
473 minimum.SetVariable(0,"a",variable[0], step[0]);
474 minimum.SetVariable(1,"b",variable[1], step[1]);
475 } else {
476 minimum.SetFixedVariable(0,"a", variable[0]);
477 minimum.SetFixedVariable(1,"b", variable[1]);
478 }
479
480 minimum.SetVariable(2,"t0",variable[2], step[2]);
481
482 minimum.SetFunction(minFunct);
483
484 // do the minimization
485 minimum.Minimize();
486
487 const double *results = minimum.X();
488 const double *errors = minimum.Errors();
489 ATH_MSG_DEBUG("Minimum: f(" << results[0] << "+-" << errors[0] << "," << results[1]<< "+-" << errors[1]<< "," << results[2] << "+-" << errors[2]<< "): " << minimum.MinValue());
490
492
493 // Get the fit values
494 double aret=results[0];
495 double aErr=errors[0];
496 double dtheta = aErr;
497 double tana = std::tan(aret); // tangent of angle
498 double ang = aret; // between zero and pi
499 cosin = std::cos(ang);
500 sinus = std::sin(ang);
501 if ( sinus < 0.0 ) {
502 sinus = -sinus;
503 cosin = -cosin;
504 } else if ( sinus == 0.0 && cosin < 0.0 ) {
505 cosin = -cosin;
506 }
507 ang = std::atan2(sinus, cosin);
508 double b=results[1];
509 double bErr=errors[1];
510 double t0=results[2];
511 double t0Err=errors[2];
512 double dy0 = cosin * bErr - b * sinus * aErr;
513
514 const double del_t = std::abs(hits[0].rt->radius((t0+t0Err)) - hits[0].rt->radius(t0)) ;
515
516
517 ATH_MSG_DEBUG("____________FINAL VALUES________________" );
518 ATH_MSG_DEBUG("Values: a "<<tana<<" d "<<b * cosin <<" t0 "<<t0);
519 ATH_MSG_DEBUG("Errors: a "<<aErr<<" b "<<dy0 <<" t0 "<<t0Err);
520
521 d = b * cosin;
522 if(msg().level() <=MSG::DEBUG) {
523 msg() << MSG::DEBUG <<"COVAR ";
524 for(int it1=0; it1<3; it1++) {
525 for(int it2=0; it2<3; it2++) {
526 msg() << MSG::DEBUG <<minimum.CovMatrix(it1,it2)<<" ";
527 }
528 msg() << MSG::DEBUG << endmsg;
529 }
530 }
531
532 result.dcs().clear();
533 result.clusters().clear();
534 result.emptyTubes().clear();
535
536 ATH_MSG_DEBUG("after fit theta "<<ang<<" sinus "<<sinus<< " cosin "<< cosin);
537
538 double chi2 = 0;
539 unsigned int nhits(0);
540
541 // calculate predicted hit positions from track parameters
542
543 ATH_MSG_DEBUG("------NEW HITS------");
544 int i{-1};
545 for(const HitCoords& coords : hits){
546 ++i;
547 const DCOnTrack& keep_me{dcs_keep[i]};
548 const double uppercut = coords.rt->tUpper();
549 const double lowercut = coords.rt->tLower();
550
551 double rad = coords.rt->radius(coords.t-t0);
552 if(coords.t-t0<lowercut) rad = coords.rt->radius(lowercut);
553 if(coords.t-t0>uppercut) rad = coords.rt->radius(uppercut);
554 if (coords.w==0) {
555 ATH_MSG_WARNING("coords.w==0, continuing");
556 continue;
557 }
558 double drad = 1.0/std::sqrt(coords.w) ;
559
560 double yl = (coords.y - tana*coords.z - b);
561
562 ATH_MSG_DEBUG("i "<<i<<" ");
563
564
565 double dth = -(sinus*coords.y + cosin*coords.z)*dtheta;
566 double residuals = std::abs(yl)/std::sqrt(1+tana*tana) - rad;
567
568 ATH_MSG_DEBUG(" dth "<<dth<<" dy0 "<<dy0<<" del_t "<<del_t);
569
570
571 double errorResiduals = std::hypot(dth, dy0, del_t);
572
573 // derivatives of the residual 'R'
574 std::array<double,3> deriv{};
575 // del R/del theta
576 double dd = coords.z * sinus + b *cosin - coords.y * cosin;
577 deriv[0] = sign(dd) * (coords.z * cosin - b * sinus + coords.y * sinus);
578 // del R / del b
579 deriv[1] = sign(dd) * cosin ;
580 // del R / del t0
581
582 deriv[2] = -1* coords.rt->driftVelocity(coords.t-t0);
583
584 double covsq=0;
585 for(int rr=0; rr<3; rr++) {
586 for(int cc=0; cc<3; cc++) {
587 covsq += deriv[rr]*minimum.CovMatrix(rr,cc)* deriv[cc];
588 }
589 }
590 ATH_MSG_DEBUG(" covsquared " << covsq);
591 if( covsq < 0. && msgLvl(MSG::DEBUG)){
592 for(int rr=0; rr<3; rr++) {
593 for(int cc=0; cc<3; cc++) {
594 double dot = deriv[rr]*minimum.CovMatrix(rr,cc)* deriv[cc];
595 ATH_MSG_DEBUG(" adding term " << dot << " dev1 " << deriv[rr] << " cov " << minimum.CovMatrix(rr,cc) << " dev2 " << deriv[cc]);
596 }
597 }
598 }
599
600 covsq = covsq > 0. ? std::sqrt(covsq) : 0.;
601 const DriftCircle* ds = & keep_me;
602 if (m_propagateErrors) drad = coords.dr;
603
604 DriftCircle dc_newrad(keep_me.position(), rad, drad, ds->driftState(), keep_me.id(), ds->rot(), keep_me.index() );
605 DCOnTrack dc_new(dc_newrad, residuals, covsq);
606 dc_new.state(keep_me.state());
607
608 ATH_MSG_DEBUG("T0 Segment hit res "<<residuals<<" eres "<<errorResiduals<<" covsq "<<covsq<<" ri " << coords.r<<" ro "<<rad<<" drad "<<drad << " sel "<<selection[i]<< " inv error " << coords.w);
609
610 if(!coords.rejected) {
611 ++nhits;
612 if (!m_propagateErrors) {
613 chi2 += sq(residuals)*coords.w;
614 } else {
615 chi2 += sq(residuals)/sq(drad);
616 }
617 ATH_MSG_DEBUG("T0 Segment hit res "<<residuals<<" eres "<<errorResiduals<<" covsq "<<covsq<<" ri " << coords.r<<" radius after t0 "<<rad<<" radius error "<< drad << " original error " << coords.dr);
618// Put chi2 penalty for drift times outside window
619 if (coords.t-t0> uppercut ) { // too large
620 chi2 += sq(coords.t-t0-uppercut)*0.1;
621 }else if (coords.t-t0 < lowercut ) {// too small
622 chi2 += sq(coords.t-t0-lowercut)*0.1;
623 }
624 }
625 result.dcs().push_back( dc_new );
626 }
627
628 double oldshift = result.t0Shift();
629 ATH_MSG_DEBUG("end fit old "<<oldshift<< " new " <<t0);
630 // Final Minuit Fit result
631 if(nhits==NUMPAR) {
632 nhits++;
633 chi2 += 1.;
634 }
635 result.set( chi2, nhits-NUMPAR, dtheta, -1.*dy0 );
636 result.line().set( LocVec2D( Zc - sinus*d, Yc + cosin*d ), ang );
637 if(t0==0.) t0=0.00001;
638 result.setT0Shift(t0,t0Err);
639
640 ATH_MSG_DEBUG("Minuit Fit complete: Chi2 " << chi2 << " angle " << result.line().phi() << " nhits "<< nhits << " t0result " << t0);
641 ATH_MSG_DEBUG("Minuit Fit complete: Chi2 " << chi2 << " angle " << result.line().phi() << " nhits "<<nhits<<" numpar "<<NUMPAR << " per dof " << chi2/(nhits-NUMPAR));
642 ATH_MSG_DEBUG("Fit complete: Chi2 " << chi2 <<" nhits "<<nhits<<" numpar "<<NUMPAR << " per dof " << chi2/(nhits-NUMPAR)<<(chi2/(nhits-NUMPAR) > 5 ? " NOT ":" ")<< "GOOD");
643 ATH_MSG_DEBUG("chi2 "<<chi2<<" per dof "<<chi2/(nhits-NUMPAR));
644
645 return true;
646 }
const boost::regex rr(r_r)
Scalar theta() const
theta method
#define endmsg
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
#define sq(x)
static Double_t t0
int sign(int a)
bool msgLvl(const MSG::Level lvl) const
MsgStream & msg() const
int multilayer(const Identifier &id) const
Access to components of the ID.
virtual double tLower() const =0
Returns the lower time covered by the r-t.
virtual double radius(double t) const =0
returns drift radius for a given time
virtual double tUpper() const =0
Returns the upper time covered by the r-t.
virtual double driftVelocity(double t) const =0
Returns the drift velocity for a given time.
const IRtRelation * rt() const
rt relation
double driftRadius() const
Returns the value of the drift radius.
double driftTime() const
Returns the value of the drift time used to obtain the drift radius.
virtual bool fit(Segment &result, const Line &line, const DCOnTrackVec &dcs, double t0Seed=-99999.) const
Gaudi::Property< bool > m_rejectWeakTopologies
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
SG::ReadCondHandleKey< MuonCalib::MdtCalibDataContainer > m_calibDbKey
Identifier identify() const
return the identifier -extends MeasurementBase
double chi2(TH1 *h0, TH1 *h1)
const std::string selection
std::vector< DCOnTrack > DCOnTrackVec
Definition DCOnTrack.h:59
dot(G, fn, nodesToHighlight=[])
Definition dot.py:5

◆ fit() [2/2]

bool TrkDriftCircleMath::MdtSegmentT0Fitter::fit ( Segment & result,
const Line & line,
const DCOnTrackVec & dcs,
double t0Seed ) const
inlineoverridevirtual

Reimplemented from TrkDriftCircleMath::DCSLFitter.

Definition at line 63 of file MdtSegmentT0Fitter.h.

63 {
64 HitSelection selection(dcs.size(),0);
65 return fit( result, line, dcs, selection, t0Seed );
66 }
virtual bool fit(Segment &result, const Line &line, const DCOnTrackVec &dcs, double t0Seed) const override
std::vector< bool > HitSelection
Definition HitSelection.h:9

◆ getFitter()

virtual const DCSLFitter * TrkDriftCircleMath::MdtSegmentT0Fitter::getFitter ( ) const
inlineoverridevirtual

fitter factory

Returns
provides pointer to fitter, ownsership not passed to client

Implements Muon::IDCSLFitProvider.

Definition at line 36 of file MdtSegmentT0Fitter.h.

36{ return this; }

◆ initialize()

StatusCode TrkDriftCircleMath::MdtSegmentT0Fitter::initialize ( )
overridevirtual

Definition at line 174 of file MdtSegmentT0Fitter.cxx.

174 {
175 ATH_CHECK(m_calibDbKey.initialize());
176 return StatusCode::SUCCESS;
177 }
#define ATH_CHECK
Evaluate an expression and check for errors.

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ interfaceID()

const InterfaceID & Muon::IDCSLFitProvider::interfaceID ( )
inlinestaticinherited

Definition at line 21 of file IDCSLFitProvider.h.

21 {
22 static const InterfaceID IID_IDCSLFitProvider("Muon::IDCSLFitProvider",1,0);
23 return IID_IDCSLFitProvider;
24 }

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ m_calibDbKey

SG::ReadCondHandleKey<MuonCalib::MdtCalibDataContainer> TrkDriftCircleMath::MdtSegmentT0Fitter::m_calibDbKey
private
Initial value:
{this, "CalibDataKey", "MdtCalibConstants",
"Conditions object containing the calibrations"}

Definition at line 40 of file MdtSegmentT0Fitter.h.

40 {this, "CalibDataKey", "MdtCalibConstants",
41 "Conditions object containing the calibrations"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_dRTol

Gaudi::Property<float> TrkDriftCircleMath::MdtSegmentT0Fitter::m_dRTol {this,"dRTolerance",0.1}
private

Definition at line 49 of file MdtSegmentT0Fitter.h.

49{this,"dRTolerance",0.1};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_floatDir

Gaudi::Property<bool> TrkDriftCircleMath::MdtSegmentT0Fitter::m_floatDir
private
Initial value:
{this, "FloatSegDirection", false,
"If set to true, the line of the segment is simultaenously fitted with t0"}

Definition at line 51 of file MdtSegmentT0Fitter.h.

51 {this, "FloatSegDirection", false,
52 "If set to true, the line of the segment is simultaenously fitted with t0"};

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> TrkDriftCircleMath::MdtSegmentT0Fitter::m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
private

Definition at line 43 of file MdtSegmentT0Fitter.h.

43{this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};

◆ m_minHits

Gaudi::Property<int> TrkDriftCircleMath::MdtSegmentT0Fitter::m_minHits {this,"MinimumHits",4,"minimum number of selected hits for t0 fit. Otherwise use default"}
private

Definition at line 48 of file MdtSegmentT0Fitter.h.

48{this,"MinimumHits",4,"minimum number of selected hits for t0 fit. Otherwise use default"};

◆ m_npassedMinHits

std::atomic_uint TrkDriftCircleMath::MdtSegmentT0Fitter::m_npassedMinHits {0}
mutableprivate

Definition at line 58 of file MdtSegmentT0Fitter.h.

58{0};

◆ m_npassedMinuitFit

std::atomic_uint TrkDriftCircleMath::MdtSegmentT0Fitter::m_npassedMinuitFit {0}
mutableprivate

Definition at line 59 of file MdtSegmentT0Fitter.h.

59{0};

◆ m_npassedNHits

std::atomic_uint TrkDriftCircleMath::MdtSegmentT0Fitter::m_npassedNHits {0}
mutableprivate

Definition at line 55 of file MdtSegmentT0Fitter.h.

55{0};

◆ m_npassedNSelectedHits

std::atomic_uint TrkDriftCircleMath::MdtSegmentT0Fitter::m_npassedNSelectedHits {0}
mutableprivate

Definition at line 57 of file MdtSegmentT0Fitter.h.

57{0};

◆ m_npassedSelectionConsistency

std::atomic_uint TrkDriftCircleMath::MdtSegmentT0Fitter::m_npassedSelectionConsistency {0}
mutableprivate

Definition at line 56 of file MdtSegmentT0Fitter.h.

56{0};

◆ m_ntotalCalls

std::atomic_uint TrkDriftCircleMath::MdtSegmentT0Fitter::m_ntotalCalls {0}
mutableprivate

Definition at line 54 of file MdtSegmentT0Fitter.h.

54{0};

◆ m_propagateErrors

Gaudi::Property<bool> TrkDriftCircleMath::MdtSegmentT0Fitter::m_propagateErrors {this,"PropagateErrors",true,"propagate errors"}
private

Definition at line 47 of file MdtSegmentT0Fitter.h.

47{this,"PropagateErrors",true,"propagate errors"};

◆ m_rejectWeakTopologies

Gaudi::Property<bool> TrkDriftCircleMath::MdtSegmentT0Fitter::m_rejectWeakTopologies {this,"RejectWeakTopologies",true,"reject topolgies that do not have at least one +- combination in one multilayer"}
private

Definition at line 45 of file MdtSegmentT0Fitter.h.

45{this,"RejectWeakTopologies",true,"reject topolgies that do not have at least one +- combination in one multilayer"};

◆ m_scaleErrors

Gaudi::Property<bool> TrkDriftCircleMath::MdtSegmentT0Fitter::m_scaleErrors {this,"RescaleErrors",true,"rescale errors in fit"}
private

Definition at line 46 of file MdtSegmentT0Fitter.h.

46{this,"RescaleErrors",true,"rescale errors in fit"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files: