19 #include "TDecompChol.h"
31 : m_recoTrack(recoTrack) {
35 std::cout <<
"BEGIN MuonResidualsFromTrack" << std::endl;
53 std::cout <<
"Tracker Hit " << iT <<
" is found. Add to refit. Dimension: " <<
hit->dimension() << std::endl;
55 recHitsForRefit.push_back(theTrackerRecHitBuilder->
build(&*
hit));
64 <<
" is found. We do not add muon hits to refit. Dimension: " <<
hit->dimension() << std::endl;
68 std::cout <<
"Muon Hit in DT wheel " << chamberId.wheel() <<
" station " << chamberId.station()
69 <<
" sector " << chamberId.sector() <<
"." << std::endl;
73 std::cout <<
"Muon hit in CSC endcap " << cscDetId.endcap() <<
" station " << cscDetId.station() <<
" ring "
74 << cscDetId.ring() <<
" chamber " << cscDetId.chamber() <<
"." << std::endl;
77 std::cout <<
"Muon Hit in RPC" << std::endl;
80 std::cout <<
"Warning! Muon Hit not in DT or CSC or RPC" << std::endl;
92 double lastTrackerTsosGlobalPositionR = 0.0;
94 std::vector<TrajectoryMeasurement> vTrajMeasurement = traj->
measurements();
96 std::cout <<
" Size of vector of TrajectoryMeasurements: " << vTrajMeasurement.size() << std::endl;
97 int nTrajMeasurement = 0;
98 for (std::vector<TrajectoryMeasurement>::const_iterator iTrajMeasurement = vTrajMeasurement.begin();
99 iTrajMeasurement != vTrajMeasurement.end();
100 ++iTrajMeasurement) {
103 std::cout <<
" TrajectoryMeasurement #" << nTrajMeasurement << std::endl;
113 std::cout <<
" TrajectoryMeasurement TSOS validity: " << tsos.
isValid() << std::endl;
118 std::cout <<
" TrajectoryMeasurement TSOS localPosition"
121 std::cout <<
" TrajectoryMeasurement TSOS globalPosition"
123 <<
" R: " << tsosGlobalPositionR <<
" z: " << tsos.
globalPosition().
z() << std::endl;
125 if (tsosGlobalPositionR > lastTrackerTsosGlobalPositionR) {
126 lastTrackerTsos = tsos;
127 lastTrackerTsosGlobalPositionR = tsosGlobalPositionR;
133 std::cout <<
" TrajectoryMeasurement hit validity: " << trajMeasurementHit->
isValid() << std::endl;
134 if (trajMeasurementHit->
isValid()) {
136 int trajMeasurementHitDim = trajMeasurementHit->
dimension();
139 std::cout <<
" TrajectoryMeasurement hit Det: Tracker" << std::endl;
141 std::cout <<
" TrajectoryMeasurement hit dimension: " << trajMeasurementHitDim << std::endl;
157 std::cout <<
" TrajectoryMeasurement hit Det: Muon" << std::endl;
162 std::cout <<
" TrajectoryMeasurement hit subDet: DT wheel " << chamberId.wheel() <<
" station "
163 << chamberId.station() <<
" sector " << chamberId.sector() << std::endl;
182 int residualDT13IsAdded =
false;
183 int residualDT2IsAdded =
false;
188 std::cout <<
"AR: pushing back chamber: " << chamberId << std::endl;
196 std::cout <<
" TrajectoryMeasurement hit dimension: " << trajMeasurementHitDim << std::endl;
197 if (trajMeasurementHitDim > 1) {
198 std::vector<const TrackingRecHit*> vDTSeg2D = trajMeasurementHit->
recHits();
200 std::cout <<
" vDTSeg2D size: " << vDTSeg2D.size() << std::endl;
201 for (std::vector<const TrackingRecHit*>::const_iterator itDTSeg2D = vDTSeg2D.begin();
202 itDTSeg2D != vDTSeg2D.end();
204 std::vector<const TrackingRecHit*> vDTHits1D = (*itDTSeg2D)->recHits();
206 std::cout <<
" vDTHits1D size: " << vDTHits1D.size() << std::endl;
207 for (std::vector<const TrackingRecHit*>::const_iterator itDTHits1D = vDTHits1D.begin();
208 itDTHits1D != vDTHits1D.end();
212 std::cout <<
" hit dimension: " <<
hit->dimension() << std::endl;
214 DetId hitId =
hit->geographicalId();
218 std::cout <<
" hit superLayerId: " << superLayerId.superLayer() << std::endl;
220 std::cout <<
" hit layerId: " << layerId.layer() << std::endl;
222 if (superLayerId.superlayer() == 2 && vDTHits1D.size() >= 3) {
228 std::cout <<
" This is first appearance of the DT with hits in superlayer 2"
231 m_dt2[chamberId]->addResidual(prop, &tsos,
hit, chamber_width, chamber_length);
232 residualDT2IsAdded =
true;
234 }
else if ((superLayerId.superlayer() == 1 || superLayerId.superlayer() == 3) &&
235 vDTHits1D.size() >= 6) {
241 std::cout <<
" This is first appearance of the DT with hits in superlayers 1 and 3"
244 m_dt13[chamberId]->addResidual(prop, &tsos,
hit, chamber_width, chamber_length);
245 residualDT13IsAdded =
true;
251 if (residualDT13IsAdded ==
true && residualDT2IsAdded ==
true && chamberId.wheel() == 0 &&
252 chamberId.station() == 2 && chamberId.sector() == 7) {
254 std::cout <<
"MYMARK " << tsosX <<
" " << hitX <<
" " << tsosX - hitX <<
" "
255 <<
m_dt13[chamberId]->trackx() <<
" " <<
m_dt13[chamberId]->residual() <<
" " << tsosY <<
" "
256 << hitY <<
" " << tsosY - hitY <<
" " <<
m_dt2[chamberId]->tracky() <<
" "
257 <<
m_dt2[chamberId]->residual() <<
" " << tsosF.localPosition().x() <<
" "
258 << tsosF.localPosition().y() <<
" " << tsosF.localPosition().z() <<
" "
269 const CSCDetId chamberId2(cscDetId.endcap(), cscDetId.station(), cscDetId.ring(), cscDetId.chamber());
271 std::cout <<
" TrajectoryMeasurement hit subDet: CSC endcap " << cscDetId.endcap() <<
" station "
272 << cscDetId.station() <<
" ring " << cscDetId.ring() <<
" chamber " << cscDetId.chamber()
275 std::cout <<
" TrajectoryMeasurement hit dimension: " << trajMeasurementHitDim << std::endl;
277 if (trajMeasurementHitDim == 4) {
278 std::vector<const TrackingRecHit*> vCSCHits2D = trajMeasurementHit->
recHits();
280 std::cout <<
" vCSCHits2D size: " << vCSCHits2D.size() << std::endl;
281 if (vCSCHits2D.size() >= 5) {
282 for (std::vector<const TrackingRecHit*>::const_iterator itCSCHits2D = vCSCHits2D.begin();
283 itCSCHits2D != vCSCHits2D.end();
290 std::cout <<
" hit dimension: " <<
hit->dimension() << std::endl;
292 DetId hitId =
hit->geographicalId();
295 std::cout <<
" hit layer: " << cscDetId.layer() << std::endl;
298 if (cscDetId.layer() == 0)
309 std::cout <<
" This is first appearance of the CSC with hits QQQ" << std::endl;
312 m_csc[chamberId2]->addResidual(prop, &tsos,
hit, 250.0, 250.0);
318 std::cout <<
" TrajectoryMeasurement hit subDet: UNKNOWN" << std::endl;
320 std::cout <<
"AR: trajMeasurementHitId.det(): " << trajMeasurementHitId.
subdetId() << std::endl;
324 std::cout <<
" TrajectoryMeasurement hit det: UNKNOWN" << std::endl;
326 std::cout <<
"AR: trajMeasurementHitId.det(): " << trajMeasurementHitId.
det() << std::endl;
333 int iT2 = 0, iM2 = 0;
335 if (hit2->isValid()) {
336 DetId hitId2 = hit2->geographicalId();
340 std::cout <<
"Tracker Hit " << iT2 <<
" is found. We don't calcualte Tsos for it" << std::endl;
348 std::cout <<
"Muon Hit " << iM2 <<
" is found. Dimension: " << hit2->dimension() << std::endl;
352 std::cout <<
"Muon Hit in DT wheel " << chamberId.wheel() <<
" station " << chamberId.station()
353 <<
" sector " << chamberId.sector() << std::endl;
359 if (hit2->dimension() > 1) {
361 std::vector<TrackingRecHit*> vDTSeg2D = hit2->recHits();
364 std::cout <<
" vDTSeg2D size: " << vDTSeg2D.size() << std::endl;
370 for (std::vector<TrackingRecHit*>::const_iterator itDTSeg2D = vDTSeg2D.begin(); itDTSeg2D != vDTSeg2D.end();
373 std::vector<TrackingRecHit*> vDTHits1D = (*itDTSeg2D)->recHits();
375 std::cout <<
" vDTHits1D size: " << vDTHits1D.size() << std::endl;
379 for (std::vector<TrackingRecHit*>::const_iterator itDTHits1D = vDTHits1D.begin();
380 itDTHits1D != vDTHits1D.end();
385 std::cout <<
" hit dimension: " <<
hit->dimension() << std::endl;
387 DetId hitId =
hit->geographicalId();
391 std::cout <<
" hit superLayerId: " << superLayerId.superLayer() << std::endl;
393 std::cout <<
" hit layerId: " << layerId.layer() << std::endl;
395 if (superLayerId.superlayer() == 2 && vDTHits1D.size() >= 3) {
401 std::cout <<
" This is first appearance of the DT with hits in superlayer 2"
415 std::cout <<
" extrapolation localPosition()"
420 m_dt2[chamberId]->addResidual(prop, &extrapolation,
hit, chamber_width, chamber_length);
424 }
else if ((superLayerId.superlayer() == 1 || superLayerId.superlayer() == 3) &&
425 vDTHits1D.size() >= 6) {
431 std::cout <<
" This is first appearance of the DT with hits in superlayers 1 and 3"
445 std::cout <<
" extrapolation localPosition()"
450 m_dt13[chamberId]->addResidual(prop, &extrapolation,
hit, chamber_width, chamber_length);
482 const CSCDetId chamberId(cscDetId2.endcap(), cscDetId2.station(), cscDetId2.ring(), cscDetId2.chamber());
484 std::cout <<
"Muon hit in CSC endcap " << cscDetId2.endcap() <<
" station " << cscDetId2.station()
485 <<
" ring " << cscDetId2.ring() <<
" chamber " << cscDetId2.chamber() <<
"." << std::endl;
487 if (hit2->dimension() == 4) {
489 std::vector<TrackingRecHit*> vCSCHits2D = hit2->recHits();
491 std::cout <<
" vCSCHits2D size: " << vCSCHits2D.size() << std::endl;
492 if (vCSCHits2D.size() >= 5) {
497 for (std::vector<TrackingRecHit*>::const_iterator itCSCHits2D = vCSCHits2D.begin();
498 itCSCHits2D != vCSCHits2D.end();
507 std::cout <<
" hit dimension: " <<
hit->dimension() << std::endl;
509 DetId hitId =
hit->geographicalId();
513 std::cout <<
" hit layer: " << cscDetId.layer() << std::endl;
516 <<
" x: " <<
hit->localPosition().
x() <<
" y: " <<
hit->localPosition().
y()
517 <<
" z: " <<
hit->localPosition().
z() << std::endl;
526 if (cscDetId.layer() == 0)
531 std::cout <<
"Have we seen this chamber before?";
534 std::cout <<
" NO. m_csc.count() = " <<
m_csc.count(chamberId) << std::endl;
538 std::cout <<
" This is first appearance of the CSC with hits m_csc.count() = "
539 <<
m_csc.count(chamberId) << std::endl;
544 std::cout <<
" YES. m_csc.count() = " <<
m_csc.count(chamberId) << std::endl;
548 std::cout <<
" lastTrackerTsos localPosition"
552 std::cout <<
" lastTrackerTsos globalPosition"
556 std::cout <<
" Do extrapolation from lastTrackerTsos to hit surface" << std::endl;
561 std::cout <<
" extrapolation.isValid() = " << extrapolation.
isValid() << std::endl;
565 std::cout <<
" extrapolation localPosition()"
570 m_csc[chamberId]->addResidual(prop, &extrapolation,
hit, 250.0, 250.0);
578 std::cout <<
"Muon Hit in RPC" << std::endl;
581 std::cout <<
"Warning! Muon Hit not in DT or CSC or RPC" << std::endl;
591 std::cout <<
"END MuonResidualsFromTrack" << std::endl << std::endl;
599 bool m_debug =
false;
621 for (std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch =
m_recoMuon->
matches().begin();
627 for (std::vector<reco::MuonSegmentMatch>::const_iterator segMatch = chamberMatch->segmentMatches.begin();
628 segMatch != chamberMatch->segmentMatches.end();
636 const DTChamberId chamberId(chamberMatch->id.rawId());
640 if (segment ==
nullptr)
643 if (segment->
hasPhi() && fabs(chamberMatch->x - segMatch->x) > maxResidual)
645 if (segment->
hasZed() && fabs(chamberMatch->y - segMatch->y) > maxResidual)
659 std::cout <<
"multi segment match to tmuon: dt2 -- should not happen!" << std::endl;
660 m_dt2[chamberId]->setSegmentResidual(&(*chamberMatch), &(*segMatch));
668 std::cout <<
"multi segment match to tmuon: dt13 -- should not happen!" << std::endl;
669 m_dt13[chamberId]->setSegmentResidual(&(*chamberMatch), &(*segMatch));
674 const CSCDetId cscDetId(chamberMatch->id.rawId());
675 const CSCDetId chamberId(cscDetId.chamberId());
677 if (fabs(chamberMatch->x - segMatch->x) > maxResidual)
687 std::cout <<
"multi segment match to tmuon: csc -- should not happen!" << std::endl;
688 m_csc[chamberId]->setSegmentResidual(&(*chamberMatch), &(*segMatch));
697 for (std::map<DetId, MuonChamberResidual*>::const_iterator residual =
m_dt13.begin(); residual !=
m_dt13.end();
699 delete residual->second;
701 for (std::map<DetId, MuonChamberResidual*>::const_iterator residual =
m_dt2.begin(); residual !=
m_dt2.end();
703 delete residual->second;
705 for (std::map<DetId, MuonChamberResidual*>::const_iterator residual =
m_csc.begin(); residual !=
m_csc.end();
707 delete residual->second;
743 return m_dt2[chamberId];
747 return m_csc[chamberId];
754 TMatrixDSym cov44(4);
756 int subs[4] = {3, 4, 1, 2};
757 for (
int i = 0;
i < 4;
i++)
758 for (
int j = 0;
j < 4;
j++)
759 cov44(
i,
j) = cov55(subs[
i], subs[
j]);
764 bool m_debug =
false;
768 std::cout <<
"MuonResidualsFromTrack:: cov initial:" << std::endl;
772 std::cout <<
"MuonResidualsFromTrack:: cov does not exist!" << std::endl;
778 std::cout <<
"MuonResidualsFromTrack:: cov before:" << std::endl;
784 r_err =
m_csc[chamberId]->residual_error();
785 result(0, 0) += r_err * r_err;
786 r_err =
m_csc[chamberId]->resslope_error();
787 result(2, 2) += r_err * r_err;
790 r_err =
m_dt13[chamberId]->residual_error();
791 result(0, 0) += r_err * r_err;
792 r_err =
m_dt13[chamberId]->resslope_error();
793 result(2, 2) += r_err * r_err;
796 r_err =
m_dt2[chamberId]->residual_error();
797 result(1, 1) += r_err * r_err;
798 r_err =
m_dt2[chamberId]->resslope_error();
799 result(3, 3) += r_err * r_err;
802 std::cout <<
"MuonResidualsFromTrack:: cov after:" << std::endl;
809 bool m_debug =
false;
812 TMatrixDSym cov44 =
covMatrix(chamberId);
815 TDecompChol decomp(cov44);
818 std::cout <<
"MuonResidualsFromTrack:: corr after:" << std::endl;
822 std::cout <<
"MuonResidualsFromTrack:: cov inversion failed!" << std::endl;
827 bool m_debug =
false;
833 TDecompChol decomp(corr44);
834 bool ok = decomp.Decompose();
838 std::cout <<
"MuonResidualsFromTrack:: corr cholesky after:" << std::endl;
842 std::cout <<
"MuonResidualsFromTrack:: corr decomposition failed!" << std::endl;