#include "AliMUONGeometryTransformer.h"
#include "AliMUONLocalTrigger.h"
#include "AliMUONLocalTriggerBoard.h"
+#include "AliMUONRecoParam.h"
#include "AliMUONTrack.h"
#include "AliMUONTrackExtrap.h"
#include "AliMUONTrackParam.h"
#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"
//______________________________________________________________________________
-AliMUONTrackHitPattern::AliMUONTrackHitPattern(const AliMUONGeometryTransformer& transformer,
+AliMUONTrackHitPattern::AliMUONTrackHitPattern(const AliMUONRecoParam* recoParam,
+ const AliMUONGeometryTransformer& transformer,
const AliMUONDigitMaker& digitMaker)
- : TObject(),
- fTransformer(transformer),
- fDigitMaker(digitMaker),
- fDeltaZ(0.0),
- fTrigCovariance(0x0),
- fkMaxDistance(99999.)
+: TObject(),
+fkRecoParam(recoParam),
+fkTransformer(transformer),
+fkDigitMaker(digitMaker),
+fDeltaZ(0.0),
+fTrigCovariance(0x0),
+fkMaxDistance(99999.)
{
/// Default constructor
InitMembers();
-
- // Set magnetic field
- const AliMagF* kField = AliTracker::GetFieldMap();
- if (!kField) AliFatal("No field available");
- AliMUONTrackExtrap::SetField(kField);
+ AliMUONTrackExtrap::SetField();
}
//______________________________________________________________________________
-void AliMUONTrackHitPattern::ExecuteValidation(AliMUONVTrackStore& trackStore,
+void AliMUONTrackHitPattern::ExecuteValidation(const AliMUONVTrackStore& trackStore,
const AliMUONVTriggerTrackStore& triggerTrackStore,
const AliMUONVTriggerStore& triggerStore) const
{
//
AliMUONDigitStoreV1 digitStore;
- TriggerDigits(triggerStore,digitStore);
+ fkDigitMaker.TriggerToDigitsStore(triggerStore,digitStore);
TIter itTrack(trackStore.CreateIterator());
AliMUONTriggerTrack *matchedTriggerTrack = MatchTriggerTrack(track, trackParam, triggerTrackStore, triggerStore);
- UShort_t pattern = GetHitPattern(trackParam, matchedTriggerTrack, digitStore);
+ UShort_t pattern = GetHitPattern(matchedTriggerTrack, digitStore, &trackParam);
track->SetHitsPatternInTrigCh(pattern);
}
}
}
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)
{
if (locTrg)
{
- Int_t deviation = locTrg->LoDev();
- Int_t sign = 0;
- if ( !locTrg->LoSdev() && deviation ) sign=-1;
- if ( !locTrg->LoSdev() && !deviation ) sign= 0;
- if ( locTrg->LoSdev() == 1 ) sign=+1;
- deviation *= sign;
- deviation += 15;
+ Int_t deviation = locTrg->GetDeviation();
track->SetLocalTrigger(locTrg->LoCircuit(),
locTrg->LoStripX(),
locTrg->LoStripY(),
//______________________________________________________________________________
-UShort_t AliMUONTrackHitPattern::GetHitPattern(AliMUONTrackParam &trackParam,
- AliMUONTriggerTrack* matchedTriggerTrack,
- AliMUONVDigitStore& digitStore) const
+UShort_t AliMUONTrackHitPattern::GetHitPattern(AliMUONTriggerTrack* matchedTriggerTrack,
+ AliMUONVDigitStore& digitStore,
+ AliMUONTrackParam* trackParam) const
{
//
/// Get hit pattern on trigger chambers for the current track
// Calculate hit pattern from tracker track propagation
- // if hit pattern from trigger track failed
+ // if hit pattern from trigger track failed and track parameters are provided
+
+ if(!trackParam) return 0;
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(digitStore, *trackParam, isMatch, iChamber);
for(Int_t cath=0; cath<2; ++cath)
{
if(isMatch[cath]) SetBit(pattern, cath, ch);
}
-//______________________________________________________________________________
-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<AliMUONLocalTrigger*>(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,
+AliMUONTrackHitPattern::FindPadMatchingTrack(const AliMUONVDigitStore& digitStore,
const AliMUONTrackParam& trackParam,
Bool_t isMatch[2], Int_t iChamber) const
{
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);
+ 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;
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();
//_____________________________________________________________________________
-Int_t AliMUONTrackHitPattern::FindPadMatchingTrig(AliMUONVDigitStore& digitStore, Int_t &detElemId,
+Int_t AliMUONTrackHitPattern::FindPadMatchingTrig(const AliMUONVDigitStore& digitStore, Int_t &detElemId,
Float_t coor[2], Bool_t isMatch[2],
TArrayI nboard[2], TArrayF &zRealMatch, Float_t y11) const
{
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]));
+ 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){
/// 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;
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;
localBoard[loc]=-1;
}
Float_t xl, yl, zl;
- fTransformer.Global2Local(detElemId, x, y, 0, xl, yl, zl);
+ fkTransformer.Global2Local(detElemId, x, y, 0, xl, yl, zl);
TVector2 pos(xl,yl);
const AliMpVSegmentation* seg =
AliMpSegmentation::Instance()
//_____________________________________________________________________________
Bool_t AliMUONTrackHitPattern::PerformTrigTrackMatch(UShort_t &pattern,
- AliMUONTriggerTrack *matchedTrigTrack,
+ const AliMUONTriggerTrack* matchedTrigTrack,
AliMUONVDigitStore& digitStore) const
{
//
for(Int_t ch=0; ch<fgkNchambers; ch++) { // chamber loop
Int_t currCh = chOrder[ch];
- AliDebug(2, Form("zMeanChamber[%i] = %.2f\tzRealMatch[0] = %.2f\n",currCh,zMeanChamber[currCh],zRealMatch[0]));
+ AliDebug(3, Form("zMeanChamber[%i] = %.2f\tzRealMatch[0] = %.2f\n",currCh,zMeanChamber[currCh],zRealMatch[0]));
for(Int_t cath=0; cath<fgkNcathodes; cath++){
correctFactor[cath]=1.;