X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONTrackHitPattern.cxx;h=e609c96b630ef9bc97bdd93b1dbf355da1ba7292;hb=e3d9d3690b76e67227fe96c9b3f77a61540bcf62;hp=12b04848475b0ff1d7c5e574fbb236bb62f718d9;hpb=d72d7b9e70037d48d496b2bc979a2883c9a6c91c;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONTrackHitPattern.cxx b/MUON/AliMUONTrackHitPattern.cxx index 12b04848475..e609c96b630 100644 --- a/MUON/AliMUONTrackHitPattern.cxx +++ b/MUON/AliMUONTrackHitPattern.cxx @@ -23,14 +23,7 @@ /// searching for matching trigger tracks and fired strips. /// /// To each track, a hit pattern for trigger chambers is set. -/// The hit pattern is a UShort_t with 8 bits used: -///
-///            1  1  0  1    1  1  0  1
-///           |           |            |
-///            ----------- ------------
-/// chamber:  11 12 13 14 | 11 12 13 14
-/// cathode:    bending   | non-bending
-///                                                                      
+/// /// The main method is: /// * ExecuteValidation /// @@ -42,11 +35,11 @@ #include "AliMUONConstants.h" #include "AliMUONVDigit.h" -#include "AliMUONDigitMaker.h" -#include "AliMUONDigitStoreV1.h" +#include "AliMUONVDigitStore.h" #include "AliMUONGeometryTransformer.h" #include "AliMUONLocalTrigger.h" #include "AliMUONLocalTriggerBoard.h" +#include "AliMUONRecoParam.h" #include "AliMUONTrack.h" #include "AliMUONTrackExtrap.h" #include "AliMUONTrackParam.h" @@ -57,25 +50,25 @@ #include "AliMpVSegmentation.h" #include "AliMpDEManager.h" #include "AliMUONReconstructor.h" -#include "AliMUONRecoParam.h" #include "AliMUONTriggerTrack.h" #include "AliMUONVTriggerTrackStore.h" #include "AliMpConstants.h" -#include "AliMagF.h" #include "AliLog.h" #include "AliTracker.h" +#include "AliESDMuonTrack.h" #include #include -#include +#include #include #include #include #include #include #include +#include #include @@ -85,22 +78,17 @@ ClassImp(AliMUONTrackHitPattern) // Class implementation in ROOT context //______________________________________________________________________________ -AliMUONTrackHitPattern::AliMUONTrackHitPattern(const AliMUONGeometryTransformer& transformer, - const AliMUONDigitMaker& digitMaker) - : TObject(), - fTransformer(transformer), - fDigitMaker(digitMaker), - fDeltaZ(0.0), - fTrigCovariance(0x0), - fkMaxDistance(99999.) +AliMUONTrackHitPattern::AliMUONTrackHitPattern(const AliMUONRecoParam* recoParam, + const AliMUONGeometryTransformer& transformer, + const AliMUONVDigitStore& digitStore) +: TObject(), +fkRecoParam(recoParam), +fkTransformer(transformer), +fkDigitStore(digitStore), +fkMaxDistance(99999.) { /// Default constructor - InitMembers(); - - // Set magnetic field - const AliMagF* kField = AliTracker::GetFieldMap(); - if (!kField) AliFatal("No field available"); - AliMUONTrackExtrap::SetField(kField); + AliMUONTrackExtrap::SetField(); } @@ -108,33 +96,8 @@ AliMUONTrackHitPattern::AliMUONTrackHitPattern(const AliMUONGeometryTransformer& AliMUONTrackHitPattern::~AliMUONTrackHitPattern(void) { /// Destructor - delete fTrigCovariance; -} - - -//______________________________________________________________________________ -void AliMUONTrackHitPattern::InitMembers() -{ - // - /// Initialize data members - // - fDeltaZ = TMath::Abs(AliMUONConstants::DefaultChamberZ(12) - AliMUONConstants::DefaultChamberZ(10)); - - const Double_t kTrigNonBendReso = AliMUONConstants::TriggerNonBendingReso(); - const Double_t kTrigBendReso = AliMUONConstants::TriggerBendingReso(); - const Double_t kTrigSlopeBendReso = 1.414 * AliMUONConstants::TriggerBendingReso()/fDeltaZ; - const Double_t kTrigCovSlopeBend = - kTrigBendReso * kTrigBendReso / fDeltaZ; - - // Covariance matrix 3x3 (X,Y,slopeY) for trigger tracks - fTrigCovariance = new TMatrixD(3,3); - fTrigCovariance->Zero(); - (*fTrigCovariance)(0,0) = kTrigNonBendReso * kTrigNonBendReso; - (*fTrigCovariance)(1,1) = kTrigBendReso * kTrigBendReso; - (*fTrigCovariance)(2,2) = kTrigSlopeBendReso * kTrigSlopeBendReso; - (*fTrigCovariance)(1,2) = (*fTrigCovariance)(2,1) = kTrigCovSlopeBend; } - //_____________________________________________________________________________ void AliMUONTrackHitPattern::CheckConstants() const { @@ -147,7 +110,7 @@ void AliMUONTrackHitPattern::CheckConstants() const //______________________________________________________________________________ -void AliMUONTrackHitPattern::ExecuteValidation(AliMUONVTrackStore& trackStore, +void AliMUONTrackHitPattern::ExecuteValidation(const AliMUONVTrackStore& trackStore, const AliMUONVTriggerTrackStore& triggerTrackStore, const AliMUONVTriggerStore& triggerStore) const { @@ -157,10 +120,18 @@ void AliMUONTrackHitPattern::ExecuteValidation(AliMUONVTrackStore& trackStore, /// and searches for matching trigger tracks and digits // - AliMUONDigitStoreV1 digitStore; - TriggerDigits(triggerStore,digitStore); - + // Get the hit pattern for all trigger tracks + AliMUONTriggerTrack* triggerTrack; + TIter itTriggerTrack(triggerTrackStore.CreateIterator()); + while ( ( triggerTrack = static_cast(itTriggerTrack() ) ) ){ + UShort_t pattern = GetHitPattern(triggerTrack); + triggerTrack->SetHitsPatternInTrigCh(pattern); + AliDebug(1, Form("Hit pattern: hits 0x%x slat %2i board %3i effFlag %i", + pattern & 0xFF, AliESDMuonTrack::GetSlatOrInfo(pattern), + triggerTrack->GetLoTrgNum(), AliESDMuonTrack::GetEffFlag(pattern))); + } + // Match tracker tracks with trigger tracks. TIter itTrack(trackStore.CreateIterator()); AliMUONTrack* track; @@ -175,7 +146,13 @@ void AliMUONTrackHitPattern::ExecuteValidation(AliMUONVTrackStore& trackStore, AliMUONTriggerTrack *matchedTriggerTrack = MatchTriggerTrack(track, trackParam, triggerTrackStore, triggerStore); - UShort_t pattern = GetHitPattern(trackParam, matchedTriggerTrack, digitStore); + // Copy trigger tracks hit pattern if there is matching, + // otherwise calculate the hit pattern directly from tracker track: + // the obtained pattern is good for check, but not good for efficiency determination. + UShort_t pattern = matchedTriggerTrack ? + matchedTriggerTrack->GetHitsPatternInTrigCh() : + GetHitPattern(&trackParam); + track->SetHitsPatternInTrigCh(pattern); } } @@ -194,7 +171,7 @@ AliMUONTrackHitPattern::MatchTriggerTrack(AliMUONTrack* track, Int_t matchTrigger = 0; Int_t loTrgNum(-1); - Double_t distTriggerTrack[3], sigma2[3]; + TMatrixD paramDiff(3,1); Double_t chi2; Double_t chi2MatchTrigger = 0., minChi2MatchTrigger = 999.; Int_t doubleMatch = -1; // Check if track matches 2 trigger tracks @@ -202,67 +179,58 @@ AliMUONTrackHitPattern::MatchTriggerTrack(AliMUONTrack* track, AliMUONTriggerTrack* doubleTriggerTrack = 0x0; AliMUONTriggerTrack* matchedTriggerTrack = 0x0; - const TMatrixD& kParamCov = trackParam.GetCovariances(); - - Double_t xTrack = trackParam.GetNonBendingCoor(); - Double_t yTrack = trackParam.GetBendingCoor(); - Double_t ySlopeTrack = trackParam.GetBendingSlope(); - // Covariance matrix 3x3 (X,Y,slopeY) for tracker tracks + // Covariance matrix 3x3 (X,Y,slopeY) for trigger tracks TMatrixD trackCov(3,3); - trackCov.Zero(); - trackCov(0,0) = kParamCov(0,0); - trackCov(1,1) = kParamCov(2,2); - trackCov(2,2) = kParamCov(3,3); - trackCov(1,2) = kParamCov(2,3); - trackCov(2,1) = kParamCov(3,2); - - TMatrixD sumCov(trackCov,TMatrixD::kPlus,*fTrigCovariance); - - Bool_t isCovOK = kTRUE; - - if (sumCov.Determinant() != 0) { - sumCov.Invert(); - } else { - AliWarning(" Determinant = 0"); - isCovOK = kFALSE; - sigma2[0] = kParamCov(0,0); - sigma2[1] = kParamCov(2,2); - sigma2[2] = kParamCov(3,3); - // sigma of distributions (trigger-track) X,Y,slopeY - const Double_t kDistSigma[3]={AliMUONConstants::TriggerNonBendingReso(), - AliMUONConstants::TriggerBendingReso(), - 1.414 * AliMUONConstants::TriggerBendingReso()/fDeltaZ}; - for (Int_t iVar = 0; iVar < 3; iVar++) sigma2[iVar] += kDistSigma[iVar] * kDistSigma[iVar]; - } AliMUONTriggerTrack *triggerTrack; TIter itTriggerTrack(triggerTrackStore.CreateIterator()); while ( ( triggerTrack = static_cast(itTriggerTrack() ) ) ) { - distTriggerTrack[0] = triggerTrack->GetX11() - xTrack; - distTriggerTrack[1] = triggerTrack->GetY11() - yTrack; - distTriggerTrack[2] = TMath::Tan(triggerTrack->GetThetay()) - ySlopeTrack; - - if(isCovOK){ - TMatrixD paramDiff(3,1); - for(Int_t iVar = 0; iVar < 3; iVar++) - paramDiff(iVar,0) = distTriggerTrack[iVar]; - + AliMUONTrackExtrap::LinearExtrapToZCov(&trackParam, triggerTrack->GetZ11()); + const TMatrixD& kParamCov = trackParam.GetCovariances(); + + Double_t xTrack = trackParam.GetNonBendingCoor(); + Double_t yTrack = trackParam.GetBendingCoor(); + Double_t ySlopeTrack = trackParam.GetBendingSlope(); + + paramDiff(0,0) = triggerTrack->GetX11() - xTrack; + paramDiff(1,0) = triggerTrack->GetY11() - yTrack; + paramDiff(2,0) = triggerTrack->GetSlopeY() - ySlopeTrack; + + // Covariance matrix 3x3 (X,Y,slopeY) for tracker tracks + trackCov.Zero(); + trackCov(0,0) = kParamCov(0,0); + trackCov(1,1) = kParamCov(2,2); + trackCov(2,2) = kParamCov(3,3); + trackCov(1,2) = kParamCov(2,3); + trackCov(2,1) = kParamCov(3,2); + + // Covariance matrix 3x3 (X,Y,slopeY) for trigger tracks + TMatrixD trigCov(triggerTrack->GetCovariances()); + + TMatrixD sumCov(trackCov,TMatrixD::kPlus,trigCov); + if (sumCov.Determinant() != 0) { + sumCov.Invert(); + TMatrixD tmp(sumCov,TMatrixD::kMult,paramDiff); TMatrixD chi2M(paramDiff,TMatrixD::kTransposeMult,tmp); - chi2 = chi2M(0,0); - } - else { + chi2 = chi2M(0,0); + } else { + AliWarning(" Determinant = 0"); + Double_t sigma2 = 0.; chi2 = 0.; - for (Int_t iVar = 0; iVar < 3; iVar++) chi2 += distTriggerTrack[iVar]*distTriggerTrack[iVar]/sigma2[iVar]; + for (Int_t iVar = 0; iVar < 3; iVar++) { + sigma2 = trackCov(iVar,iVar) + trigCov(iVar,iVar); + chi2 += paramDiff(iVar,0) * paramDiff(iVar,0) / sigma2; + } } chi2 /= 3.; // Normalized Chi2: 3 degrees of freedom (X,Y,slopeY) - if (chi2 < AliMUONReconstructor::GetRecoParam()->GetMaxNormChi2MatchTrigger()) + if (chi2 < GetRecoParam()->GetMaxNormChi2MatchTrigger()) { Bool_t isDoubleTrack = (TMath::Abs(chi2 - minChi2MatchTrigger)<1.); - if (chi2 < minChi2MatchTrigger && chi2 < AliMUONReconstructor::GetRecoParam()->GetMaxNormChi2MatchTrigger()) + if (chi2 < minChi2MatchTrigger && chi2 < GetRecoParam()->GetMaxNormChi2MatchTrigger()) { if(isDoubleTrack) { @@ -301,20 +269,19 @@ AliMUONTrackHitPattern::MatchTriggerTrack(AliMUONTrack* track, } track->SetMatchTrigger(matchTrigger); - track->SetLoTrgNum(loTrgNum); track->SetChi2MatchTrigger(chi2MatchTrigger); AliMUONLocalTrigger* locTrg = static_cast(triggerStore.FindLocal(loTrgNum)); if (locTrg) { - Int_t deviation = locTrg->GetDeviation(); track->SetLocalTrigger(locTrg->LoCircuit(), locTrg->LoStripX(), locTrg->LoStripY(), - deviation, + locTrg->GetDeviation(), locTrg->LoLpt(), - locTrg->LoHpt()); + locTrg->LoHpt(), + locTrg->GetTriggerWithoutChamber()); } return matchedTriggerTrack; @@ -322,68 +289,45 @@ AliMUONTrackHitPattern::MatchTriggerTrack(AliMUONTrack* track, //______________________________________________________________________________ -UShort_t AliMUONTrackHitPattern::GetHitPattern(AliMUONTrackParam &trackParam, - AliMUONTriggerTrack* matchedTriggerTrack, - AliMUONVDigitStore& digitStore) const +UShort_t AliMUONTrackHitPattern::GetHitPattern(AliMUONTriggerTrack* matchedTriggerTrack) const { // - /// Get hit pattern on trigger chambers for the current track + /// Get hit pattern on trigger chambers for the current trigger track // UShort_t pattern = 0; - Bool_t isMatch[2]; - const Int_t kNTrackingCh = AliMUONConstants::NTrackingCh(); - - Bool_t patternFromTrigTrack = kFALSE; - - - // Calculate hit pattern from trigger track - if(matchedTriggerTrack){ - patternFromTrigTrack = PerformTrigTrackMatch(pattern, matchedTriggerTrack, digitStore); - } - - if(patternFromTrigTrack) return pattern; + PerformTrigTrackMatch(pattern, matchedTriggerTrack); + return pattern; +} - // Calculate hit pattern from tracker track propagation - // if hit pattern from trigger track failed +//______________________________________________________________________________ +UShort_t AliMUONTrackHitPattern::GetHitPattern(AliMUONTrackParam* trackParam) const +{ + // + /// Get hit pattern on trigger chambers for the current tracker track + // + UShort_t pattern = 0; + Bool_t isMatch[2]; + const Int_t kNTrackingCh = AliMUONConstants::NTrackingCh(); for(Int_t ch=0; ch<4; ++ch) { Int_t iChamber = kNTrackingCh+ch; - AliMUONTrackExtrap::ExtrapToZCov(&trackParam, AliMUONConstants::DefaultChamberZ(iChamber)); - FindPadMatchingTrack(digitStore, trackParam, isMatch, iChamber); + AliMUONTrackExtrap::ExtrapToZCov(trackParam, AliMUONConstants::DefaultChamberZ(iChamber)); + FindPadMatchingTrack(*trackParam, isMatch, iChamber); for(Int_t cath=0; cath<2; ++cath) { - if(isMatch[cath]) SetBit(pattern, cath, ch); + if(isMatch[cath]) AliESDMuonTrack::SetFiredChamber(pattern, cath, ch); } } - return pattern; -} + // pattern obtained by propagation of tracker track + // when it does not match the trigger. + AliESDMuonTrack::AddEffInfo(pattern, AliESDMuonTrack::kTrackerTrackPattern); -//______________________________________________________________________________ -void AliMUONTrackHitPattern::SetBit(UShort_t& pattern, Int_t cathode, Int_t chamber) const -{ - // - /// Set hits pattern - // - const Int_t kMask[2][4]= {{0x80, 0x40, 0x20, 0x10}, - {0x08, 0x04, 0x02, 0x01}}; - pattern |= kMask[cathode][chamber]; -} - - -//______________________________________________________________________________ -void AliMUONTrackHitPattern::AddEffInfo(UShort_t& pattern, Int_t slat, Int_t effType) const -{ - // - /// Set info on efficiency calculation - // - pattern += effType << 8; - pattern += slat << 10; + return pattern; } - //______________________________________________________________________________ void AliMUONTrackHitPattern::ApplyMCSCorrections(AliMUONTrackParam& trackParam) const @@ -394,7 +338,7 @@ AliMUONTrackHitPattern::ApplyMCSCorrections(AliMUONTrackParam& trackParam) const // const Float_t kZFilterOut = AliMUONConstants::MuonFilterZEnd(); - const Float_t kFilterThickness = TMath::Abs(kZFilterOut-AliMUONConstants::MuonFilterZBeg()); // cm + const Float_t kFilterThickness = kZFilterOut-AliMUONConstants::MuonFilterZBeg(); // cm AliMUONTrackExtrap::ExtrapToZCov(&trackParam, kZFilterOut); // Extrap to muon filter end AliMUONTrackExtrap::AddMCSEffect(&trackParam, kFilterThickness, AliMUONConstants::MuonFilterX0()); // Add MCS effects @@ -402,48 +346,9 @@ AliMUONTrackHitPattern::ApplyMCSCorrections(AliMUONTrackParam& trackParam) const } -//______________________________________________________________________________ -Bool_t -AliMUONTrackHitPattern::TriggerDigits(const AliMUONVTriggerStore& triggerStore, - AliMUONVDigitStore& digitStore) const -{ - // - /// make (S)Digit for trigger - // - - digitStore.Clear(); - - AliMUONLocalTrigger* locTrg; - TIter next(triggerStore.CreateLocalIterator()); - - while ( ( locTrg = static_cast(next()) ) ) - { - if (locTrg->IsNull()) continue; - - TArrayS xyPattern[2]; - locTrg->GetXPattern(xyPattern[0]); - locTrg->GetYPattern(xyPattern[1]); - - // do we need this ? (Ch.F.) -// for(Int_t cath=0; cath<2; ++cath) -// { -// for(Int_t ch=0; ch<4; ++ch) -// { -// if(xyPattern[cath][ch]==0) continue; -// } -// } - - Int_t nBoard = locTrg->LoCircuit(); - fDigitMaker.TriggerDigits(nBoard, xyPattern, digitStore); - } - return kTRUE; -} - - //______________________________________________________________________________ void -AliMUONTrackHitPattern::FindPadMatchingTrack(AliMUONVDigitStore& digitStore, - const AliMUONTrackParam& trackParam, +AliMUONTrackHitPattern::FindPadMatchingTrack(const AliMUONTrackParam& trackParam, Bool_t isMatch[2], Int_t iChamber) const { // @@ -458,7 +363,7 @@ AliMUONTrackHitPattern::FindPadMatchingTrack(AliMUONVDigitStore& digitStore, minMatchDist[cath]=fkMaxDistance/10.; } - TIter next(digitStore.CreateIterator()); + TIter next(fkDigitStore.CreateTriggerIterator()); AliMUONVDigit* mDigit; while ( ( mDigit = static_cast(next()) ) ) @@ -473,12 +378,13 @@ AliMUONTrackHitPattern::FindPadMatchingTrack(AliMUONVDigitStore& digitStore, const AliMpVSegmentation* seg = AliMpSegmentation::Instance() ->GetMpSegmentation(currDetElemId,AliMp::GetCathodType(cathode)); - AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE); - Float_t xlocal1 = pad.Position().X(); - Float_t ylocal1 = pad.Position().Y(); - Float_t dpx = pad.Dimensions().X(); - Float_t dpy = pad.Dimensions().Y(); - fTransformer.Local2Global(currDetElemId, xlocal1, ylocal1, 0, xpad, ypad, zpad); + AliMpPad pad = seg->PadByIndices(ix,iy,kTRUE); + Float_t xlocal1 = pad.GetPositionX(); + Float_t ylocal1 = pad.GetPositionY(); + Float_t dpx = pad.GetDimensionX(); + Float_t dpy = pad.GetDimensionY(); + + fkTransformer.Local2Global(currDetElemId, xlocal1, ylocal1, 0, xpad, ypad, zpad); Float_t matchDist = MinDistanceFromPad(xpad, ypad, zpad, dpx, dpy, trackParam); if(matchDist>minMatchDist[cathode])continue; isMatch[cathode] = kTRUE; @@ -499,12 +405,12 @@ AliMUONTrackHitPattern::MinDistanceFromPad(Float_t xPad, Float_t yPad, Float_t z // AliMUONTrackParam trackParamAtPadZ(trackParam); - AliMUONTrackExtrap::ExtrapToZCov(&trackParamAtPadZ, zPad); + AliMUONTrackExtrap::LinearExtrapToZCov(&trackParamAtPadZ, zPad); Float_t xTrackAtPad = trackParamAtPadZ.GetNonBendingCoor(); Float_t yTrackAtPad = trackParamAtPadZ.GetBendingCoor(); - const Float_t kNSigma = AliMUONReconstructor::GetRecoParam()->GetSigmaCutForTrigger(); + const Float_t kNSigma = GetRecoParam()->GetSigmaCutForTrigger(); const TMatrixD& kCovParam = trackParamAtPadZ.GetCovariances(); @@ -525,7 +431,7 @@ AliMUONTrackHitPattern::MinDistanceFromPad(Float_t xPad, Float_t yPad, Float_t z //_____________________________________________________________________________ -Int_t AliMUONTrackHitPattern::FindPadMatchingTrig(AliMUONVDigitStore& digitStore, Int_t &detElemId, +Int_t AliMUONTrackHitPattern::FindPadMatchingTrig(Int_t &detElemId, Float_t coor[2], Bool_t isMatch[2], TArrayI nboard[2], TArrayF &zRealMatch, Float_t y11) const { @@ -543,7 +449,13 @@ Int_t AliMUONTrackHitPattern::FindPadMatchingTrig(AliMUONVDigitStore& digitStore minMatchDist[cath] = fkMaxDistance/10.; padsInCheckArea[cath] = 0; } - Int_t iChamber = AliMpDEManager::GetChamberId(detElemId); + + Int_t iChamber = AliMpDEManager::GetChamberId(detElemId); + if ( iChamber < 0 ) { + AliErrorStream() << "Cannot get chamberId from detElemId=" << detElemId << endl; + return -1; + } + Int_t ch = iChamber-10; Float_t oldDeltaZ = AliMUONConstants::DefaultChamberZ(iChamber) - AliMUONConstants::DefaultChamberZ(10); Float_t y = coor[1]; @@ -553,7 +465,7 @@ Int_t AliMUONTrackHitPattern::FindPadMatchingTrig(AliMUONVDigitStore& digitStore Float_t foundZmatch=999.; Float_t yCoorAtPadZ=999.; - TIter next(digitStore.CreateIterator()); + TIter next(fkDigitStore.CreateTriggerIterator()); AliMUONVDigit* mDigit; Int_t idigit=0; @@ -573,13 +485,14 @@ Int_t AliMUONTrackHitPattern::FindPadMatchingTrig(AliMUONVDigitStore& digitStore const AliMpVSegmentation* seg = AliMpSegmentation::Instance() ->GetMpSegmentation(currDetElemId,AliMp::GetCathodType(cathode)); - AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE); - Float_t xlocal1 = pad.Position().X(); - Float_t ylocal1 = pad.Position().Y(); - Float_t dpx = pad.Dimensions().X(); - Float_t dpy = pad.Dimensions().Y(); - fTransformer.Local2Global(currDetElemId, xlocal1, ylocal1, 0, xpad, ypad, zpad); - AliDebug(2, Form("DetElemId = %i\tCathode = %i\t(x,y) Pad = (%i,%i) = (%.2f,%.2f)\tDim = (%.2f,%.2f)\tTrack = (%.2f,%.2f)\n",currDetElemId,cathode,ix,iy,xpad,ypad,dpx,dpy,coor[0],coor[1])); + AliMpPad pad = seg->PadByIndices(ix,iy,kTRUE); + Float_t xlocal1 = pad.GetPositionX(); + Float_t ylocal1 = pad.GetPositionY(); + Float_t dpx = pad.GetDimensionX(); + Float_t dpy = pad.GetDimensionY(); + + fkTransformer.Local2Global(currDetElemId, xlocal1, ylocal1, 0, xpad, ypad, zpad); + AliDebug(2, Form("\nDetElemId = %i Cathode = %i Pad = (%i,%i) = (%.2f,%.2f) Dim = (%.2f,%.2f) Track = (%.2f,%.2f)\n",currDetElemId,cathode,ix,iy,xpad,ypad,dpx,dpy,coor[0],coor[1])); // searching track intersection with chambers (second approximation) if(ch%2==1){ //if(iChamber%2==1){ @@ -597,26 +510,28 @@ Int_t AliMUONTrackHitPattern::FindPadMatchingTrig(AliMUONVDigitStore& digitStore yCoorAtPadZ=y; if(cathode==kBending) trigDigitBendPlane = idigit; for (Int_t loc=0; loc2) { - AliDebug(1, Form("padsInCheckArea[%i] = %i\n",cath,padsInCheckArea[cath])); - return -500; - } - } - if(isMatch[kBending] || isMatch[kNonBending]){ detElemId = foundDetElemId; zRealMatch[ch] = foundZmatch; coor[1] = yCoorAtPadZ; } + + // If track matches many pads, it is not good for effciency determination. + // However we still want to calculate the hit pattern. + for(Int_t cath=0; cath2) { + AliDebug(1, Form("padsInCheckArea[%i] = %i\n",cath,padsInCheckArea[cath])); + return -500; + } + } + return trigDigitBendPlane; } @@ -629,8 +544,9 @@ Float_t AliMUONTrackHitPattern::PadMatchTrack(Float_t xPad, Float_t yPad, /// Decides if the digit belongs to the trigger track. // - Float_t maxDist = 2.;//3. // cm - Float_t maxDistCheckArea = 6.; // cm + Float_t maxDist = GetRecoParam()->GetStripCutForTrigger() * 2. * TMath::Min(dpx,dpy); // cm + if(maxDist<2.) maxDist = 2.; + Float_t maxDistCheckArea = GetRecoParam()->GetMaxStripAreaForTrigger() * 2. * TMath::Min(dpx,dpy); // cm Float_t matchDist = fkMaxDistance; @@ -668,15 +584,15 @@ Int_t AliMUONTrackHitPattern::DetElemIdFromPos(Float_t x, Float_t y, ->GetMpSegmentation(detElemId,AliMp::GetCathodType(cathode)); if (!seg) continue; - Float_t deltax = seg->Dimensions().X(); - Float_t deltay = seg->Dimensions().Y(); + Float_t deltax = seg->GetDimensionX(); + Float_t deltay = seg->GetDimensionY(); Float_t xlocal1 = -deltax; Float_t ylocal1 = -deltay; Float_t xlocal2 = +deltax; Float_t ylocal2 = +deltay; Float_t xg01, yg01, zg1, xg02, yg02, zg2; - fTransformer.Local2Global(detElemId, xlocal1, ylocal1, 0, xg01, yg01, zg1); - fTransformer.Local2Global(detElemId, xlocal2, ylocal2, 0, xg02, yg02, zg2); + fkTransformer.Local2Global(detElemId, xlocal1, ylocal1, 0, xg01, yg01, zg1); + fkTransformer.Local2Global(detElemId, xlocal2, ylocal2, 0, xg02, yg02, zg2); Float_t xg1 = xg01, xg2 = xg02, yg1 = yg01, yg2 = yg02; @@ -718,26 +634,32 @@ void AliMUONTrackHitPattern::LocalBoardFromPos(Float_t x, Float_t y, for(Int_t loc=0; locGetMpSegmentation(detElemId,AliMp::GetCathodType(cathode)); - if (seg){ - AliMpPad pad = seg->PadByPosition(pos,kFALSE); - for (Int_t loc=0; locPadByPosition(xl,yl,kFALSE); + if ( ! pad.IsValid() ){ + AliWarning(Form("Pad not found! DetElemId %i position global (%f, %f, %f) local (%f, %f, %f)\n", detElemId, x, y, z, xl, yl, zl)); + return; + } + + AliDebug(2, Form("\nWould match: DetElemId = %i Pad = (%i,%i) = (%.2f,%.2f,%.2f) Board %3i\n",detElemId,pad.GetIx(),pad.GetIy(),xl,yl,zl,pad.GetLocalBoardId(0))); + + for (Int_t loc=0; locGetZ11(); + zMeanChamber[1] = matchedTrigTrack->GetZ11() + AliMUONConstants::DefaultChamberZ(11) - AliMUONConstants::DefaultChamberZ(10); + zMeanChamber[2] = matchedTrigTrack->GetZ21(); + zMeanChamber[3] = matchedTrigTrack->GetZ21() + AliMUONConstants::DefaultChamberZ(13) - AliMUONConstants::DefaultChamberZ(12); TArrayI digitPerTrack(fgkNcathodes); @@ -802,45 +724,43 @@ Bool_t AliMUONTrackHitPattern::PerformTrigTrackMatch(UShort_t &pattern, Bool_t isClearEvent = kTRUE; - //Float_t x11 = matchedTrigTrack->GetX11();// x position (info from non-bending plane) Float_t y11 = matchedTrigTrack->GetY11();// y position (info from bending plane) - Float_t thetaX = matchedTrigTrack->GetThetax(); - Float_t thetaY = matchedTrigTrack->GetThetay(); + Float_t slopeX = matchedTrigTrack->GetSlopeX(); + Float_t slopeY = matchedTrigTrack->GetSlopeY(); for(Int_t ch=0; ch=1) correctFactor[kNonBending] = zMeanChamber[0]/zRealMatch[0];// corrects x position - if(ch>=2) correctFactor[kBending] = (zMeanChamber[2] - zMeanChamber[0]) / (zRealMatch[2] - zRealMatch[0]);// corrects y position + AliDebug(3, Form("zMeanChamber[%i] = %.2f\tzRealMatch[0] = %.2f\n",currCh,zMeanChamber[currCh],zRealMatch[0])); // searching track intersection with chambers (first approximation) Float_t deltaZ = zMeanChamber[currCh] - zMeanChamber[0]; - trackIntersectCh[currCh][0] = zMeanChamber[currCh] * TMath::Tan(thetaX) * correctFactor[kNonBending];// x position (info from non-bending plane) - trackIntersectCh[currCh][1] = y11 + deltaZ * TMath::Tan(thetaY) * correctFactor[kBending];// y position (info from bending plane) + trackIntersectCh[currCh][0] = zMeanChamber[currCh] * slopeX; + trackIntersectCh[currCh][1] = y11 + deltaZ * slopeY; Int_t detElemIdFromTrack = DetElemIdFromPos(trackIntersectCh[currCh][0], trackIntersectCh[currCh][1], 11+currCh, 0); if(detElemIdFromTrack<0) { AliDebug(1, "Warning: trigger track outside trigger chamber\n"); + isClearEvent = kFALSE; + + // track is rejected since the extrapolated track + // does not match a slat (border effects) + AliESDMuonTrack::AddEffInfo(pattern, AliESDMuonTrack::kTrackOutsideGeometry); continue; } - triggeredDigits[currCh] = FindPadMatchingTrig(digitStore, detElemIdFromTrack, trackIntersectCh[currCh], isMatch, nboard, zRealMatch, y11); + triggeredDigits[currCh] = FindPadMatchingTrig(detElemIdFromTrack, trackIntersectCh[currCh], isMatch, nboard, zRealMatch, y11); // if FindPadMatchingTrig = -500 => too many digits matching pad => - // => Event not clear => Reject track + // => Event not clear => Do not use for efficiency calculation if(triggeredDigits[currCh]<-100){ isClearEvent = kFALSE; + // track is rejected since it matches many pads + AliESDMuonTrack::AddEffInfo(pattern, AliESDMuonTrack::kTrackMatchesManyPads); AliDebug(1, Form("Warning: track = %p (%i) matches many pads. Rejected!\n",(void *)matchedTrigTrack, detElemIdFromTrack)); - break; } for(Int_t cath=0; cath