40 for(
int i = 0; selectionTypeStringToEnumMap[
i].
label && (!
found); ++
i)
41 if (! strcmp(label.c_str(), selectionTypeStringToEnumMap[
i].
label)) {
43 value = selectionTypeStringToEnumMap[
i].
value;
47 if (! found)
throw cms::Exception(
"MuonSelectorError") << label <<
" is not a recognized SelectionType";
53 double maxChamberDist,
54 double maxChamberDistPull,
57 unsigned int theMask = 0;
59 for(
int stationIdx = 1; stationIdx < 5; ++stationIdx)
60 for(
int detectorIdx = 1; detectorIdx < 3; ++detectorIdx)
61 if(muon.
trackDist(stationIdx,detectorIdx,arbitrationType) < maxChamberDist &&
62 muon.
trackDist(stationIdx,detectorIdx,arbitrationType)/muon.
trackDistErr(stationIdx,detectorIdx,arbitrationType) < maxChamberDistPull)
63 theMask += 1<<((stationIdx-1)+4*(detectorIdx-1));
75 bool use_weight_regain_at_chamber_boundary =
true;
76 bool use_match_dist_penalty =
true;
78 int nr_of_stations_crossed = 0;
79 int nr_of_stations_with_segment = 0;
80 std::vector<int> stations_w_track(8);
81 std::vector<int> station_has_segmentmatch(8);
82 std::vector<int> station_was_crossed(8);
83 std::vector<float> stations_w_track_at_boundary(8);
84 std::vector<float> station_weight(8);
85 int position_in_stations = 0;
86 float full_weight = 0.;
88 for(
int i = 1;
i<=8; ++
i) {
93 if( muon.
trackDist(
i,1,arbitrationType) < 999999 ) {
94 ++nr_of_stations_crossed;
95 station_was_crossed[
i-1] = 1;
96 if(muon.
trackDist(
i,1,arbitrationType) > -10. ) stations_w_track_at_boundary[
i-1] = muon.
trackDist(
i,1,arbitrationType);
97 else stations_w_track_at_boundary[
i-1] = 0.;
99 if( muon.
segmentX(
i,1,arbitrationType) < 999999 ) {
100 ++nr_of_stations_with_segment;
101 station_has_segmentmatch[
i-1] = 1;
105 if( muon.
trackDist(
i-4,2,arbitrationType) < 999999 ) {
106 ++nr_of_stations_crossed;
107 station_was_crossed[
i-1] = 1;
108 if(muon.
trackDist(
i-4,2,arbitrationType) > -10. ) stations_w_track_at_boundary[
i-1] = muon.
trackDist(
i-4,2,arbitrationType);
109 else stations_w_track_at_boundary[
i-1] = 0.;
111 if( muon.
segmentX(
i-4,2,arbitrationType) < 999999 ) {
112 ++nr_of_stations_with_segment;
113 station_has_segmentmatch[
i-1] = 1;
132 const float attenuate_weight_regain = 0.5;
134 for(
int i = 1;
i<=8; ++
i) {
140 if( station_was_crossed[
i-1] > 0 ) {
146 ++position_in_stations;
148 switch ( nr_of_stations_crossed ) {
150 station_weight[
i-1] = 1.;
153 if ( position_in_stations == 1 ) station_weight[
i-1] = 0.33;
154 else station_weight[
i-1] = 0.67;
157 if ( position_in_stations == 1 ) station_weight[
i-1] = 0.23;
158 else if( position_in_stations == 2 ) station_weight[
i-1] = 0.33;
159 else station_weight[
i-1] = 0.44;
162 if ( position_in_stations == 1 ) station_weight[
i-1] = 0.10;
163 else if( position_in_stations == 2 ) station_weight[
i-1] = 0.20;
164 else if( position_in_stations == 3 ) station_weight[
i-1] = 0.30;
165 else station_weight[
i-1] = 0.40;
172 station_weight[
i-1] = 1./nr_of_stations_crossed;
175 if( use_weight_regain_at_chamber_boundary ) {
176 if(station_has_segmentmatch[
i-1] <= 0 && stations_w_track_at_boundary[
i-1] != 0. ) {
180 station_weight[
i-1] = station_weight[
i-1]*attenuate_weight_regain*0.5*(TMath::Erf(stations_w_track_at_boundary[
i-1]/6.)+1.);
182 else if(station_has_segmentmatch[
i-1] <= 0 && stations_w_track_at_boundary[
i-1] == 0.) {
184 station_weight[
i-1] = 0.;
188 if(station_has_segmentmatch[
i-1] <= 0) station_weight[
i-1] = 0.;
191 if( station_has_segmentmatch[
i-1] > 0 && 42 == 42 ) {
193 if( muon.
dY(
i,1,arbitrationType) < 999999 && muon.
dX(
i,1,arbitrationType) < 999999) {
195 TMath::Sqrt(TMath::Power(muon.
pullX(
i,1,arbitrationType),2.)+TMath::Power(muon.
pullY(
i,1,arbitrationType),2.))> 1. ) {
197 if(use_match_dist_penalty) {
199 if(TMath::Sqrt(TMath::Power(muon.
dX(
i,1,arbitrationType),2.)+TMath::Power(muon.
dY(
i,1,arbitrationType),2.)) < 3. && TMath::Sqrt(TMath::Power(muon.
pullX(
i,1,arbitrationType),2.)+TMath::Power(muon.
pullY(
i,1,arbitrationType),2.)) > 3. ) {
200 station_weight[
i-1] *= 1./TMath::Power(
201 TMath::Max((
double)TMath::Sqrt(TMath::Power(muon.
dX(
i,1,arbitrationType),2.)+TMath::Power(muon.
dY(
i,1,arbitrationType),2.)),(
double)1.),.25);
204 station_weight[
i-1] *= 1./TMath::Power(
205 TMath::Sqrt(TMath::Power(muon.
pullX(
i,1,arbitrationType),2.)+TMath::Power(muon.
pullY(
i,1,arbitrationType),2.)),.25);
210 else if (muon.
dY(
i,1,arbitrationType) >= 999999) {
211 if( muon.
pullX(
i,1,arbitrationType) > 1. ) {
213 if(use_match_dist_penalty) {
215 if( muon.
dX(
i,1,arbitrationType) < 3. && muon.
pullX(
i,1,arbitrationType) > 3. ) {
216 station_weight[
i-1] *= 1./TMath::Power(
TMath::Max((
double)muon.
dX(
i,1,arbitrationType),(double)1.),.25);
219 station_weight[
i-1] *= 1./TMath::Power(muon.
pullX(
i,1,arbitrationType),.25);
225 if( muon.
pullY(
i,1,arbitrationType) > 1. ) {
227 if(use_match_dist_penalty) {
229 if( muon.
dY(
i,1,arbitrationType) < 3. && muon.
pullY(
i,1,arbitrationType) > 3. ) {
230 station_weight[
i-1] *= 1./TMath::Power(
TMath::Max((
double)muon.
dY(
i,1,arbitrationType),(double)1.),.25);
233 station_weight[
i-1] *= 1./TMath::Power(muon.
pullY(
i,1,arbitrationType),.25);
241 TMath::Sqrt(TMath::Power(muon.
pullX(
i-4,2,arbitrationType),2.)+TMath::Power(muon.
pullY(
i-4,2,arbitrationType),2.)) > 1. ) {
243 if(use_match_dist_penalty) {
245 if(TMath::Sqrt(TMath::Power(muon.
dX(
i-4,2,arbitrationType),2.)+TMath::Power(muon.
dY(
i-4,2,arbitrationType),2.)) < 3. && TMath::Sqrt(TMath::Power(muon.
pullX(
i-4,2,arbitrationType),2.)+TMath::Power(muon.
pullY(
i-4,2,arbitrationType),2.)) > 3. ) {
246 station_weight[
i-1] *= 1./TMath::Power(
247 TMath::Max((
double)TMath::Sqrt(TMath::Power(muon.
dX(
i-4,2,arbitrationType),2.)+TMath::Power(muon.
dY(
i-4,2,arbitrationType),2.)),(
double)1.),.25);
250 station_weight[
i-1] *= 1./TMath::Power(
251 TMath::Sqrt(TMath::Power(muon.
pullX(
i-4,2,arbitrationType),2.)+TMath::Power(muon.
pullY(
i-4,2,arbitrationType),2.)),.25);
264 station_weight[
i-1] = 0.;
268 full_weight += station_weight[
i-1];
274 if( nr_of_stations_crossed == 0 ) {
289 double minCompatibility,
292 bool goodMuon =
false;
298 else goodMuon =
false;
311 int minNumberOfMatches,
316 double maxChamberDist,
317 double maxChamberDistPull,
319 bool syncMinNMatchesNRequiredStationsInBarrelOnly,
320 bool applyAlsoAngularCuts)
323 bool goodMuon =
false;
328 if(minNumberOfMatches == 0)
return true;
330 unsigned int theStationMask = muon.
stationMask(arbitrationType);
331 unsigned int theRequiredStationMask =
RequiredStationMask(muon, maxChamberDist, maxChamberDistPull, arbitrationType);
335 int numRequiredStations = 0;
336 for(
int it = 0; it < 8; ++it) {
337 if(theStationMask & 1<<it) ++numSegs;
338 if(theRequiredStationMask & 1<<it) ++numRequiredStations;
343 if (syncMinNMatchesNRequiredStationsInBarrelOnly) {
345 if (fabs(muon.
eta()) < 1.2) {
346 if(minNumberOfMatches > numRequiredStations)
347 minNumberOfMatches = numRequiredStations;
348 if(minNumberOfMatches < 1)
349 minNumberOfMatches = 1;
352 if(minNumberOfMatches > numRequiredStations)
353 minNumberOfMatches = numRequiredStations;
354 if(minNumberOfMatches < 1)
355 minNumberOfMatches = 1;
358 if(numSegs >= minNumberOfMatches) goodMuon = 1;
365 if(theRequiredStationMask) {
366 for(
int stationIdx = 7; stationIdx >= 0; --stationIdx)
367 if(theRequiredStationMask & 1<<stationIdx){
368 if(theStationMask & 1<<stationIdx) {
369 lastSegBit = stationIdx;
378 for(
int stationIdx = 7; stationIdx >= 0; --stationIdx)
379 if(theStationMask & 1<<stationIdx) {
380 lastSegBit = stationIdx;
385 if(!goodMuon)
return false;
389 station = lastSegBit < 4 ? lastSegBit+1 : lastSegBit-3;
390 detector = lastSegBit < 4 ? 1 : 2;
393 if(fabs(muon.
pullX(station,detector,arbitrationType,1)) > maxAbsPullX &&
394 fabs(muon.
dX(station,detector,arbitrationType)) > maxAbsDx)
397 if(applyAlsoAngularCuts && fabs(muon.
pullDxDz(station,detector,arbitrationType,1)) > maxAbsPullX)
401 if (maxAbsDy < 999999) {
405 if(fabs(muon.
pullY(station,2,arbitrationType,1)) > maxAbsPullY &&
406 fabs(muon.
dY(station,2,arbitrationType)) > maxAbsDy)
409 if(applyAlsoAngularCuts && fabs(muon.
pullDyDz(station,2,arbitrationType,1)) > maxAbsPullY)
427 for (
int stationIdx = station; stationIdx > 0; --stationIdx) {
428 if(! (theStationMask & 1<<(stationIdx-1)))
431 if(muon.
dY(stationIdx,1,arbitrationType) > 999998)
434 if(fabs(muon.
pullY(stationIdx,1,arbitrationType,1)) > maxAbsPullY &&
435 fabs(muon.
dY(stationIdx,1,arbitrationType)) > maxAbsDy) {
439 if(applyAlsoAngularCuts && fabs(muon.
pullDyDz(stationIdx,1,arbitrationType,1)) > maxAbsPullY)
462 unsigned int theStationMask = muon.
stationMask(arbitrationType);
465 if (! theStationMask)
return false;
472 bool existsGoodDTSegX =
false;
473 bool existsDTSegY =
false;
477 for(
int stationIdx = 0; stationIdx <= 7; ++stationIdx)
478 if(theStationMask & 1<<stationIdx) {
479 station = stationIdx < 4 ? stationIdx+1 : stationIdx-3;
480 detector = stationIdx < 4 ? 1 : 2;
482 if((fabs(muon.
pullX(station,detector,arbitrationType,1)) > maxAbsPullX &&
483 fabs(muon.
dX(station,detector,arbitrationType)) > maxAbsDx) ||
484 (applyAlsoAngularCuts && fabs(muon.
pullDxDz(station,detector,arbitrationType,1)) > maxAbsPullX))
486 else if (detector == 1)
487 existsGoodDTSegX =
true;
490 if (maxAbsDy < 999999) {
492 if((fabs(muon.
pullY(station,2,arbitrationType,1)) > maxAbsPullY &&
493 fabs(muon.
dY(station,2,arbitrationType)) > maxAbsDy) ||
494 (applyAlsoAngularCuts && fabs(muon.
pullDyDz(station,2,arbitrationType,1)) > maxAbsPullY))
498 if(muon.
dY(station,1,arbitrationType) > 999998)
503 if((fabs(muon.
pullY(station,1,arbitrationType,1)) > maxAbsPullY &&
504 fabs(muon.
dY(station,1,arbitrationType)) > maxAbsDy) ||
505 (applyAlsoAngularCuts && fabs(muon.
pullDyDz(station,1,arbitrationType,1)) > maxAbsPullY)) {
522 if (maxAbsDy < 999999) {
525 else if (existsGoodDTSegX)
571 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,
true,
false);
574 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,
true,
false);
577 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,
false,
false);
580 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,
false,
false);
583 if (muon.
pt() < 8. && fabs(muon.
eta()) < 1.2)
584 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,
false,
false);
586 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,
false,
false);
589 if (muon.
pt() < 8. && fabs(muon.
eta()) < 1.2)
590 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,
false,
false);
592 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,
false,
false);
612 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,
false,
true);
615 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,
false,
true);
618 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,
false,
true);
621 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,
false,
true);
624 if (muon.
pt() < 8. && fabs(muon.
eta()) < 1.2)
625 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,1E9,1E9,1E9,1E9,arbitrationType,
false,
false);
627 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,1E9,1E9,-3,-3,arbitrationType,
true,
false);
630 if (muon.
pt() < 8. && fabs(muon.
eta()) < 1.2)
631 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMOneStation,1,3,3,3,3,1E9,1E9,arbitrationType,
false,
false);
633 return muon.
isTrackerMuon() &&
isGoodMuon(muon,
TMLastStation,2,3,3,3,3,-3,-3,arbitrationType,
true,
false);
641 double pullX,
double pullY,
bool checkAdjacentChambers)
645 unsigned int betterMuon = ( muon1.
pt() > muon2.
pt() ? 1 : 2 );
646 for ( std::vector<reco::MuonChamberMatch>::const_iterator chamber1 = muon1.
matches().begin();
647 chamber1 != muon1.
matches().end(); ++chamber1 )
648 for ( std::vector<reco::MuonChamberMatch>::const_iterator chamber2 = muon2.
matches().begin();
649 chamber2 != muon2.
matches().end(); ++chamber2 )
656 if ( chamber1->id == chamber2->id ){
658 if ( fabs(chamber1->x-chamber2->x) <
659 pullX *
sqrt(chamber1->xErr*chamber1->xErr+chamber2->xErr*chamber2->xErr) )
661 if ( betterMuon == 1 )
665 if ( nMatches1==0 || nMatches2==0 )
return true;
668 if ( fabs(chamber1->y-chamber2->y) <
669 pullY *
sqrt(chamber1->yErr*chamber1->yErr+chamber2->yErr*chamber2->yErr) )
671 if ( betterMuon == 1 )
675 if ( nMatches1==0 || nMatches2==0 )
return true;
678 if ( ! checkAdjacentChambers )
continue;
686 if ( id1.
ring() != id2.
ring() )
continue;
694 if ( fabs(chamber1->edgeX) > chamber1->xErr*pullX )
continue;
695 if ( fabs(chamber2->edgeX) > chamber2->xErr*pullX )
continue;
696 if ( chamber1->x * chamber2->x < 0 ) {
697 if ( betterMuon == 1 )
701 if ( nMatches1==0 || nMatches2==0 )
return true;
716 bool hits = muon.
innerTrack()->hitPattern().trackerLayersWithMeasurement() > 5 &&
717 muon.
innerTrack()->hitPattern().numberOfValidPixelHits() > 0;
722 return muID && hits && ip;
733 if(!muID)
return false;
735 bool layers = muon.
innerTrack()->hitPattern().trackerLayersWithMeasurement() > 5 &&
736 muon.
innerTrack()->hitPattern().pixelLayersWithMeasurement() > 0;
742 return layers && ip && ishighq;
749 if(!muID)
return false;
756 bool momQuality = cktTrack->ptError()/cktTrack->pt() < 0.3;
759 bool hits = muon.
innerTrack()->hitPattern().trackerLayersWithMeasurement() > 5 && muon.
innerTrack()->hitPattern().numberOfValidPixelHits() > 0;
763 bool ip = fabs(cktTrack->dxy(vtx.
position())) < 0.2 && fabs(cktTrack->dz(vtx.
position())) < 0.5;
767 return muID && hits && momQuality && ip;}
773 bool hits = muon.
innerTrack()->hitPattern().trackerLayersWithMeasurement() > 8 && muon.
innerTrack()->hitPattern().numberOfValidPixelHits() > 0;
775 bool ip = fabs(cktTrack->dxy(vtx.
position())) < 0.2 && fabs(cktTrack->dz(vtx.
position())) < 0.5;
777 return muID && hits && ip;}
787 for(std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch = mu.
matches().begin();
788 chamberMatch != mu.
matches().end(); ++chamberMatch) {
789 if (chamberMatch->segmentMatches.empty())
continue;
790 for(std::vector<reco::MuonChamberMatch>::const_iterator chamberMatch2 = mu2.
matches().begin();
791 chamberMatch2 != mu2.
matches().end(); ++chamberMatch2) {
792 if (chamberMatch2->segmentMatches.empty())
continue;
793 if (chamberMatch2->id() != chamberMatch->id())
continue;
794 for(std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin();
795 segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch) {
796 if (!segmentMatch->isMask(segmentArbitrationMask))
continue;
797 for(std::vector<reco::MuonSegmentMatch>::const_iterator segmentMatch2 = chamberMatch2->segmentMatches.begin();
798 segmentMatch2 != chamberMatch2->segmentMatches.end(); ++segmentMatch2) {
799 if (!segmentMatch2->isMask(segmentArbitrationMask))
continue;
800 if ((segmentMatch->cscSegmentRef.isNonnull() && segmentMatch->cscSegmentRef == segmentMatch2->cscSegmentRef) ||
801 (segmentMatch-> dtSegmentRef.isNonnull() && segmentMatch-> dtSegmentRef == segmentMatch2-> dtSegmentRef) ) {
float trackDistErr(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
virtual TrackRef innerTrack() const
bool isTrackerMuon() const
bool isGlobalMuon() const
float trkKink
value of the kink algorithm applied to the inner track stub
bool isMatchesValid() const
float dY(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
bool isStandAloneMuon() const
float trkRelChi2
chi2 value for the inner track stub with respect to the global track
const Point & position() const
position
virtual double eta() const
momentum pseudorapidity
float caloCompatibility(const reco::Muon &muon)
bool isLooseMuon(const reco::Muon &)
SelectionType
Selector type.
bool overlap(const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
bool isSoftMuon(const reco::Muon &, const reco::Vertex &)
virtual TrackRef muonBestTrack() const
ArbitrationType
define arbitration schemes
MuonQuality combinedQuality() const
get energy deposition information
float pullDxDz(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
float segmentCompatibility(const reco::Muon &muon, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
bool isQualityValid() const
unsigned int stationMask(ArbitrationType type=SegmentAndTrackArbitration) const
virtual TrackRef outerTrack() const
reference to Track reconstructed in the muon detector only
float pullY(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
float segmentX(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
bool isGoodMuon(const reco::Muon &muon, SelectionType type, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
main GoodMuon wrapper call
int numberOfMatches(ArbitrationType type=SegmentAndTrackArbitration) const
get number of chambers with matched segments
float staRelChi2
chi2 value for the outer track stub with respect to the global track
int sharedSegments(const reco::Muon &muon1, const reco::Muon &muon2, unsigned int segmentArbitrationMask=reco::MuonSegmentMatch::BestInChamberByDR)
SelectionType selectionTypeFromString(const std::string &label)
virtual double pt() const
transverse momentum
a lightweight "map" for selection type string label and enum value
unsigned int RequiredStationMask(const reco::Muon &muon, double maxChamberDist, double maxChamberDistPull, reco::Muon::ArbitrationType arbitrationType)
std::vector< MuonChamberMatch > & matches()
get muon matching information
float trackDist(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
float dX(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration) const
int numberOfMatchedStations(ArbitrationType type=SegmentAndTrackArbitration) const
reco::Muon::MuonTrackTypePair tevOptimized(const reco::TrackRef &combinedTrack, const reco::TrackRef &trackerTrack, const reco::TrackRef &tpfmsTrack, const reco::TrackRef &pickyTrack, const double ptThreshold=200., const double tune1=4., const double tune2=6., const double dptcut=-1.)
bool isHighPtMuon(const reco::Muon &, const reco::Vertex &, reco::TunePType)
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
float caloCompatibility() const
float pullDyDz(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const
virtual TrackRef globalTrack() const
reference to Track reconstructed in both tracked and muon detector
float pullX(int station, int muonSubdetId, ArbitrationType type=SegmentAndTrackArbitration, bool includeSegmentError=true) const