Improve trigger track determination: use geometry instead of default z position of...
authorivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 3 Dec 2009 14:24:03 +0000 (14:24 +0000)
committerivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 3 Dec 2009 14:24:03 +0000 (14:24 +0000)
(Diego)

14 files changed:
MUON/AliMUONConstants.cxx
MUON/AliMUONConstants.h
MUON/AliMUONESDInterface.cxx
MUON/AliMUONRecoParam.cxx
MUON/AliMUONTrack.cxx
MUON/AliMUONTrack.h
MUON/AliMUONTrackHitPattern.cxx
MUON/AliMUONTrackHitPattern.h
MUON/AliMUONTriggerCircuit.cxx
MUON/AliMUONTriggerCircuit.h
MUON/AliMUONTriggerTrack.cxx
MUON/AliMUONTriggerTrack.h
MUON/AliMUONVTrackReconstructor.cxx
MUON/AliMUONVTrackReconstructor.h

index 5f39ed1..01fec14 100644 (file)
@@ -99,8 +99,10 @@ const Double_t AliMUONConstants::fgkAbsZBeg = -90.;
 const Double_t AliMUONConstants::fgkAbsZEnd = -505.;
     
 // Default trigger chamber resolution (cm)
-const Double_t AliMUONConstants::fgkTriggerNonBendingReso = 1.;
-const Double_t AliMUONConstants::fgkTriggerBendingReso = 1.;
+// Warning: the resolution refers only to ALIGNMENT
+// For the total resolution the strip width should be taken into account!
+const Double_t AliMUONConstants::fgkTriggerNonBendingReso = 0.2;
+const Double_t AliMUONConstants::fgkTriggerBendingReso = 0.2;
 
 // Defaults parameters for muon filter (19/11/07)
 const Double_t AliMUONConstants::fgkMuonFilterZBeg = -1471.;
index 921b59c..aa56315 100644 (file)
@@ -84,9 +84,9 @@ class AliMUONConstants : public TObject {
     static Double_t ChamberThicknessInX0(Int_t chId) {return (chId >= 0 && chId < 10) ? fgChamberThicknessInX0[chId] : 0.;}
     /// Return Trigger ToF Limit (75 ns)
     static Float_t TriggerTofLimit() {return fgkTriggerTofLimit;}
-    /// Return default trigger chamber resolution in non bending direction
+    /// Return default trigger chamber resolution DUE TO ALIGNMENT ONLY in non bending direction
     static Double_t TriggerNonBendingReso() {return fgkTriggerNonBendingReso;}
-    /// Return default trigger chamber resolution in bending direction
+    /// Return default trigger chamber resolution DUE TO ALIGNMENT ONLY in bending direction
     static Double_t TriggerBendingReso() {return fgkTriggerBendingReso;}
     /// Return z-position of muon filter begining
     static Double_t MuonFilterZBeg() {return fgkMuonFilterZBeg;}
@@ -144,8 +144,8 @@ class AliMUONConstants : public TObject {
     static Int_t    fgMaxZoom;          ///< Maximum Zoom for event display
     static Float_t  fgkTriggerTofLimit; ///< Particle above this threshold are discarded in trigger algorithm
     
-    static const Double_t fgkTriggerNonBendingReso; ///< default trigger chamber resolution in the non-bending direction
-    static const Double_t fgkTriggerBendingReso; ///< default trigger chamber resolution in the bending direction
+    static const Double_t fgkTriggerNonBendingReso; ///< default trigger chamber resolution in the non-bending direction, DUE TO ALIGNMENT ONLY
+    static const Double_t fgkTriggerBendingReso; ///< default trigger chamber resolution in the bending direction, DUE TO ALIGNMENT ONLY 
     
     static const Double_t fgkMuonFilterZBeg; ///< z-position of the begining of the muon filter
     static const Double_t fgkMuonFilterZEnd; ///< z-position of the end of the muon filter
index 3571b8f..2a4c5ce 100644 (file)
@@ -679,7 +679,6 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONTrac
   track.SetVertexErrXY2(0.,0.);
   track.SetGlobalChi2(esdTrack.GetChi2());
   track.SetMatchTrigger(esdTrack.GetMatchTrigger());
-  track.SetLoTrgNum(-1);
   track.SetChi2MatchTrigger(esdTrack.GetChi2MatchTrigger());
   track.SetHitsPatternInTrigCh(esdTrack.GetHitsPatternInTrigCh());
   track.SetLocalTrigger(esdTrack.LoCircuit(), esdTrack.LoStripX(), esdTrack.LoStripY(),
@@ -950,6 +949,7 @@ void AliMUONESDInterface::MUONToESD(const AliMUONLocalTrigger& locTrg, AliESDMuo
     esdTrack.SetThetaYUncorrected(triggerTrack->GetThetay());
     esdTrack.SetNonBendingCoorUncorrected(triggerTrack->GetX11());
     esdTrack.SetBendingCoorUncorrected(triggerTrack->GetY11());
+    esdTrack.SetZUncorrected(triggerTrack->GetZ11());
   }
 }
 
index 5780d4f..60205fe 100644 (file)
@@ -183,10 +183,10 @@ void AliMUONRecoParam::SetLowFluxParam()
   fMaxBendingDistanceToTrack = 1.;
   fSigmaCutForTracking = 6.;
   fSigmaCutForImprovement = 5.;
-  fSigmaCutForTrigger = 8.;
+  fSigmaCutForTrigger = 4.;
   fStripCutForTrigger = 1.;
   fMaxStripAreaForTrigger = 3.;
-  fMaxNormChi2MatchTrigger = 16.;
+  fMaxNormChi2MatchTrigger = fSigmaCutForTrigger * fSigmaCutForTrigger;
   fCombinedClusterTrackReco = kFALSE;
   fTrackAllTracks = kTRUE;
   fRecoverTracks = kTRUE;
@@ -225,10 +225,10 @@ void AliMUONRecoParam::SetHighFluxParam()
   fMaxBendingDistanceToTrack = 1.;
   fSigmaCutForTracking = 6.;
   fSigmaCutForImprovement = 5.;
-  fSigmaCutForTrigger = 8.;
+  fSigmaCutForTrigger = 4.;
   fStripCutForTrigger = 1.;
   fMaxStripAreaForTrigger = 3.;
-  fMaxNormChi2MatchTrigger = 16.;
+  fMaxNormChi2MatchTrigger = fSigmaCutForTrigger * fSigmaCutForTrigger;
   fCombinedClusterTrackReco = kFALSE;
   fTrackAllTracks = kTRUE;
   fRecoverTracks = kTRUE;
@@ -268,10 +268,10 @@ void AliMUONRecoParam::SetCosmicParam()
   fMaxBendingDistanceToTrack = 1.;
   fSigmaCutForTracking = 7.;
   fSigmaCutForImprovement = 6.;
-  fSigmaCutForTrigger = 8.;
+  fSigmaCutForTrigger = 4.;
   fStripCutForTrigger = 1.5;
   fMaxStripAreaForTrigger = 3.;
-  fMaxNormChi2MatchTrigger = 16.;
+  fMaxNormChi2MatchTrigger = fSigmaCutForTrigger * fSigmaCutForTrigger;
   fPercentOfFullClusterInESD = 100.;
   fCombinedClusterTrackReco = kFALSE;
   fTrackAllTracks = kTRUE;
index 1b83b86..f1e32e0 100644 (file)
@@ -57,7 +57,6 @@ AliMUONTrack::AliMUONTrack()
     fGlobalChi2(-1.),
     fImproved(kFALSE),
     fMatchTrigger(-1),
-    floTrgNum(-1),
     fChi2MatchTrigger(0.),
     fTrackID(-1),
     fTrackParamAtVertex(0x0),
@@ -81,7 +80,6 @@ AliMUONTrack::AliMUONTrack(AliMUONObjectPair *segment, Double_t bendingVertexDis
     fGlobalChi2(0.),
     fImproved(kFALSE),
     fMatchTrigger(-1),
-    floTrgNum(-1),    
     fChi2MatchTrigger(0.),
     fTrackID(-1),
     fTrackParamAtVertex(0x0),
@@ -190,7 +188,6 @@ AliMUONTrack::AliMUONTrack(const AliMUONTrack& track)
     fGlobalChi2(track.fGlobalChi2),
     fImproved(track.fImproved),
     fMatchTrigger(track.fMatchTrigger),
-    floTrgNum(track.floTrgNum),    
     fChi2MatchTrigger(track.fChi2MatchTrigger),
     fTrackID(track.fTrackID),
     fTrackParamAtVertex(0x0),
@@ -275,7 +272,6 @@ AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& track)
   fGlobalChi2         =  track.fGlobalChi2;
   fImproved           =  track.fImproved;
   fMatchTrigger       =  track.fMatchTrigger;
-  floTrgNum           =  track.floTrgNum;
   fChi2MatchTrigger   =  track.fChi2MatchTrigger;
   fTrackID            =  track.fTrackID; 
   fHitsPatternInTrigCh = track.fHitsPatternInTrigCh;
@@ -320,7 +316,6 @@ void AliMUONTrack::Reset()
   fGlobalChi2 = -1.;
   fImproved = kFALSE;
   fMatchTrigger = -1;
-  floTrgNum = -1;
   fChi2MatchTrigger = 0.;
   fTrackID = -1;
   fHitsPatternInTrigCh = 0;
@@ -1186,7 +1181,7 @@ void AliMUONTrack::Print(Option_t*) const
 
   cout << "<AliMUONTrack> No.Clusters=" << setw(2)   << GetNClusters() << 
       ", Match2Trig=" << setw(1) << GetMatchTrigger()  << 
-      ", LoTrgNum=" << setw(3) << GetLoTrgNum()  << 
+      ", LoTrgNum=" << setw(3) << LoCircuit()  << 
     ", Chi2-tracking-trigger=" << setw(8) << setprecision(5) <<  GetChi2MatchTrigger();
   cout << Form(" HitTriggerPattern %x",fHitsPatternInTrigCh);
   cout << Form(" MClabel=%d",fTrackID) << endl;
index 203adc9..3b176d0 100644 (file)
@@ -77,12 +77,10 @@ class AliMUONTrack : public TObject
   
   /// return 1,2,3 if track matches with trigger track, 0 if not
   Int_t    GetMatchTrigger(void) const {return fMatchTrigger;}
-  /// returns the local trigger number corresponding to the trigger track 
-  Int_t    GetLoTrgNum(void) const {return floTrgNum;}
+  /// returns the local trigger number corresponding to the trigger track (obsolete)
+  Int_t    GetLoTrgNum(void) const {return LoCircuit();}
   /// set the flag telling whether track matches with trigger track or not
   void    SetMatchTrigger(Int_t matchTrigger) {fMatchTrigger = matchTrigger;}
-  /// set the local trigger number corresponding to the trigger track
-  void    SetLoTrgNum(Int_t loTrgNum) {floTrgNum = loTrgNum;}
   /// return the chi2 of trigger/track matching 
   Double_t GetChi2MatchTrigger(void) const {return fChi2MatchTrigger;}
   /// set the chi2 of trigger/track matching 
@@ -167,7 +165,6 @@ class AliMUONTrack : public TObject
                         ///<  1 track match but does not pass pt cut
                         ///<  2 track match Low pt cut
                         ///<  3 track match High pt cut
-  Int_t floTrgNum; ///< the number of the corresponding loTrg, -1 if no matching
   Double_t fChi2MatchTrigger; ///< chi2 of trigger/track matching 
   
   Int_t fTrackID; ///< Point to the corresponding MC track
@@ -185,7 +182,7 @@ class AliMUONTrack : public TObject
   void   ComputeMCSCovariances(TMatrixD& mcsCovariances) const;
   
   
-  ClassDef(AliMUONTrack, 8) // Reconstructed track in ALICE dimuon spectrometer
+  ClassDef(AliMUONTrack, 9) // Reconstructed track in ALICE dimuon spectrometer
 };
        
 #endif
index 0295ed8..2481179 100644 (file)
@@ -86,12 +86,9 @@ AliMUONTrackHitPattern::AliMUONTrackHitPattern(const AliMUONRecoParam* recoParam
 fkRecoParam(recoParam),
 fkTransformer(transformer),
 fkDigitMaker(digitMaker),
-fDeltaZ(0.0),
-fTrigCovariance(0x0),
 fkMaxDistance(99999.)
 {
     /// Default constructor
-    InitMembers();
     AliMUONTrackExtrap::SetField();
 }
 
@@ -100,31 +97,8 @@ fkMaxDistance(99999.)
 AliMUONTrackHitPattern::~AliMUONTrackHitPattern(void)
 {
   /// Destructor
-  delete fTrigCovariance;
 }
 
-
-//______________________________________________________________________________
-void AliMUONTrackHitPattern::InitMembers()
-{
-  //
-  /// Initialize data members
-  //
-  fDeltaZ = AliMUONConstants::DefaultChamberZ(10) - AliMUONConstants::DefaultChamberZ(12);
-
-  const Double_t kTrigNonBendReso = AliMUONConstants::TriggerNonBendingReso();
-  const Double_t kTrigBendReso = AliMUONConstants::TriggerBendingReso();
-
-  // 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) = 2. * (*fTrigCovariance)(1,1) / fDeltaZ / fDeltaZ;
-  (*fTrigCovariance)(1,2) = (*fTrigCovariance)(2,1) = (*fTrigCovariance)(1,1) / fDeltaZ;
-}
-
-
 //_____________________________________________________________________________
 void AliMUONTrackHitPattern::CheckConstants() const
 {
@@ -201,7 +175,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
@@ -209,60 +183,51 @@ 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<AliMUONTriggerTrack*>(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)
@@ -308,7 +273,6 @@ AliMUONTrackHitPattern::MatchTriggerTrack(AliMUONTrack* track,
   }
     
   track->SetMatchTrigger(matchTrigger);
-  track->SetLoTrgNum(loTrgNum);
   track->SetChi2MatchTrigger(chi2MatchTrigger);
 
   AliMUONLocalTrigger* locTrg = static_cast<AliMUONLocalTrigger*>(triggerStore.FindLocal(loTrgNum));
@@ -448,7 +412,7 @@ 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();
@@ -700,7 +664,6 @@ Bool_t AliMUONTrackHitPattern::PerformTrigTrackMatch(UShort_t &pattern,
   Int_t chOrder[fgkNchambers] = {0,2,1,3};
 
   TArrayF zRealMatch(fgkNchambers);
-  TArrayF correctFactor(fgkNcathodes);
 
   Bool_t isMatch[fgkNcathodes];
   for(Int_t cath=0; cath<fgkNcathodes; cath++){
@@ -708,9 +671,10 @@ Bool_t AliMUONTrackHitPattern::PerformTrigTrackMatch(UShort_t &pattern,
   }
 
   TArrayF zMeanChamber(fgkNchambers);
-  for(Int_t ch=0; ch<fgkNchambers; ch++){
-    zMeanChamber[ch] = AliMUONConstants::DefaultChamberZ(10+ch);
-  }
+  zMeanChamber[0] = matchedTrigTrack->GetZ11();
+  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);
 
@@ -754,26 +718,18 @@ 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<fgkNchambers; ch++) { // chamber loop
     Int_t currCh = chOrder[ch];
     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.;
-    }
-    // calculate corrections to trigger track theta
-    if(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
-
     // 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");
index f6b6102..1cd9367 100644 (file)
@@ -54,8 +54,6 @@ public:
 protected:
   void ApplyMCSCorrections(AliMUONTrackParam& trackParam) const;
   
-  void InitMembers();
-  
   // Methods for hit pattern from tracker track
   void FindPadMatchingTrack(const AliMUONVDigitStore& digitStore,
                            const AliMUONTrackParam& trackParam,
@@ -97,10 +95,6 @@ private:
   const AliMUONGeometryTransformer& fkTransformer; //!< geometry transformer
   const AliMUONDigitMaker& fkDigitMaker; //!< pointer to digit maker
 
-  Double_t fDeltaZ; //!< distance between stations
-
-  TMatrixD* fTrigCovariance; //!< Covariance matrix 3x3 (X,Y,slopeY) for trigger tracks
-
   const Float_t fkMaxDistance; //!< Maximum distance for reference
   static const Int_t fgkNcathodes=2; //!<Number of cathodes
   static const Int_t fgkNchambers=4; //!<Number of chambers
index cb8d350..53b9798 100644 (file)
@@ -65,6 +65,11 @@ AliMUONTriggerCircuit::AliMUONTriggerCircuit(const AliMUONGeometryTransformer* t
       fXpos11[i].Set(16); 
       fYpos11[i].Set(31);
       fYpos21[i].Set(63);
+      fZpos11[i].Set(31);
+      fZpos21[i].Set(63);
+      fXwidth11[i].Set(16); 
+      fYwidth11[i].Set(31);
+      fYwidth21[i].Set(63);
     }
 
     for (Int_t i = 1; i < AliMpConstants::NofLocalBoards()+1; ++i) { // board begins at 1
@@ -92,6 +97,11 @@ AliMUONTriggerCircuit::~AliMUONTriggerCircuit()
      fXpos11[i].Reset();
      fYpos11[i].Reset();
      fYpos21[i].Reset();
+     fZpos11[i].Reset();
+     fZpos21[i].Reset();
+     fXwidth11[i].Reset();
+     fYwidth11[i].Reset();
+     fYwidth21[i].Reset();
     }
 
 } 
@@ -110,6 +120,11 @@ AliMUONTriggerCircuit::AliMUONTriggerCircuit(const AliMUONTriggerCircuit& circui
       fXpos11[i] = circuit.fXpos11[i];
       fYpos11[i] = circuit.fYpos11[i];
       fYpos21[i] = circuit.fYpos21[i];
+      fZpos11[i] = circuit.fZpos11[i];
+      fZpos21[i] = circuit.fZpos21[i];
+      fXwidth11[i] = circuit.fXwidth11[i];
+      fYwidth11[i] = circuit.fYwidth11[i];
+      fYwidth21[i] = circuit.fYwidth21[i];
     }
 
 }
@@ -129,6 +144,11 @@ AliMUONTriggerCircuit& AliMUONTriggerCircuit::operator=(const AliMUONTriggerCirc
     fXpos11[i] = circuit.fXpos11[i];
     fYpos11[i] = circuit.fYpos11[i];
     fYpos21[i] = circuit.fYpos21[i];
+    fZpos11[i] = circuit.fZpos11[i];
+    fZpos21[i] = circuit.fZpos21[i];
+    fXwidth11[i] = circuit.fXwidth11[i];
+    fYwidth11[i] = circuit.fYwidth11[i];
+    fYwidth21[i] = circuit.fYwidth21[i];
   }
 
   return *this;
@@ -163,7 +183,7 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const localBoard)
   Int_t iStripCircuit = 0;
 
   FillXstrips(icol, iFirstStrip, iLastStrip, 
-             iStripCircuit, fYpos11[fCurrentLocalBoard]);
+             iStripCircuit, kTRUE);
   
   //--- second plane 
   ichamber = 12;
@@ -178,7 +198,7 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const localBoard)
   iStripCircuit = 8;
 
   FillXstrips(icol, iFirstStripMiddle, iLastStripMiddle,
-             iStripCircuit, fYpos21[fCurrentLocalBoard]);
+             iStripCircuit, kFALSE);
   
   // second plane upper part
   if (zeroUp == 0) { // something up
@@ -208,11 +228,15 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const localBoard)
     
     iStripCircuit = 24;
     FillXstrips(icolUp, iFirstStripUp, iLastStripUp,
-               iStripCircuit, fYpos21[fCurrentLocalBoard]);
+               iStripCircuit, kFALSE);
     
     // fill strip between middle and upper part
     fYpos21[fCurrentLocalBoard][47] = (fYpos21[fCurrentLocalBoard][46] + 
                                       fYpos21[fCurrentLocalBoard][48])/2.;
+    fZpos21[fCurrentLocalBoard][47] = (fZpos21[fCurrentLocalBoard][46] + 
+                                      fZpos21[fCurrentLocalBoard][48])/2.;
+    fYwidth21[fCurrentLocalBoard][47] = (fYwidth21[fCurrentLocalBoard][46] + 
+                                        fYwidth21[fCurrentLocalBoard][48])/2.;
   } // end of something up
   
   // restore current detElemId & segmentation
@@ -253,11 +277,15 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const localBoard)
     
     iStripCircuit = 0;
     FillXstrips(icolDo, iFirstStripDo, iLastStripDo,
-               iStripCircuit, fYpos21[fCurrentLocalBoard]);
+               iStripCircuit, kFALSE);
     
     // fill strip between middle and upper part
     fYpos21[fCurrentLocalBoard][15] = (fYpos21[fCurrentLocalBoard][14] + 
                                       fYpos21[fCurrentLocalBoard][16])/2.;
+    fZpos21[fCurrentLocalBoard][15] = (fZpos21[fCurrentLocalBoard][14] + 
+                                      fZpos21[fCurrentLocalBoard][16])/2.;
+    fYwidth21[fCurrentLocalBoard][15] = (fYwidth21[fCurrentLocalBoard][14] + 
+                                        fYwidth21[fCurrentLocalBoard][16])/2.;
   } // end of something down
   
 }
@@ -265,10 +293,14 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const localBoard)
 //----------------------------------------------------------------------
 void AliMUONTriggerCircuit::FillXstrips(const Int_t icol, 
                                        const Int_t iFirstStrip, const Int_t iLastStrip, 
-                                       Int_t liStripCircuit, TArrayF& ypos)
+                                       Int_t liStripCircuit, const Bool_t is11)
 {    
 /// fill 
-  Double_t xyGlobal[2] = {0.};
+  TArrayF& ypos   = (is11) ? fYpos11[fCurrentLocalBoard] : fYpos21[fCurrentLocalBoard];
+  TArrayF& zpos   = (is11) ? fZpos11[fCurrentLocalBoard] : fZpos21[fCurrentLocalBoard];
+  TArrayF& ywidth = (is11) ? fYwidth11[fCurrentLocalBoard] : fYwidth21[fCurrentLocalBoard];
+
+  Double_t xyGlobal[3] = {0.};
   for (Int_t istrip = iFirstStrip; istrip < iLastStrip; ++istrip) {
 
     AliMpPad pad = fkCurrentSeg->PadByIndices(icol-1,istrip,kTRUE);
@@ -283,7 +315,13 @@ void AliMUONTriggerCircuit::FillXstrips(const Int_t icol,
     XYGlobal(pad,xyGlobal);
     
     ypos[2*liStripCircuit] = xyGlobal[1];
-    if (istrip != (iLastStrip - 1)) ypos[2*liStripCircuit+1] = xyGlobal[1] + yDim;
+    zpos[2*liStripCircuit] = xyGlobal[2];
+    ywidth[2*liStripCircuit] = 2. * yDim;
+    if (istrip != (iLastStrip - 1)) {
+      ypos[2*liStripCircuit+1] = xyGlobal[1] + yDim;
+      zpos[2*liStripCircuit+1] = xyGlobal[2];
+      ywidth[2*liStripCircuit+1] = 2. * yDim;
+    }
     liStripCircuit++;
   }    
 }
@@ -348,7 +386,7 @@ void AliMUONTriggerCircuit::FillYstrips(const Int_t iFirstStrip, const Int_t iLa
                                        const Bool_t doubling)
 {    
 /// fill
-  Double_t xyGlobal[2] = {0.};
+  Double_t xyGlobal[3] = {0.};
 
   for (Int_t istrip = iFirstStrip; istrip < iLastStrip; ++istrip) {
 
@@ -367,14 +405,17 @@ void AliMUONTriggerCircuit::FillYstrips(const Int_t iFirstStrip, const Int_t iLa
     
     if (!doubling) {   
       fXpos11[fCurrentLocalBoard].AddAt(xyGlobal[0], liStripCircuit);
+      fXwidth11[fCurrentLocalBoard].AddAt(2. * xDim, liStripCircuit);
     } else if (doubling) {
 
       fXpos11[fCurrentLocalBoard].AddAt(TMath::Sign(1.,xyGlobal[0]) * 
                                  (TMath::Abs(xyGlobal[0]) - xDim/2.), 2*liStripCircuit);
+      fXwidth11[fCurrentLocalBoard].AddAt(2. * xDim, 2*liStripCircuit);
 
       fXpos11[fCurrentLocalBoard].AddAt(TMath::Sign(1.,xyGlobal[0]) *
                                  (TMath::Abs(fXpos11[fCurrentLocalBoard][2*liStripCircuit]) + xDim),
                                        2*liStripCircuit + 1); 
+      fXwidth11[fCurrentLocalBoard].AddAt(2. * xDim, 2*liStripCircuit + 1);
     }
 
     liStripCircuit++;
@@ -391,17 +432,22 @@ void AliMUONTriggerCircuit::XYGlobal(const AliMpPad& pad,
   // get the pad position and dimensions
   Double_t xl1 = pad.GetPositionX();
   Double_t yl1 = pad.GetPositionY();
-  Double_t zg1 = 0;
   
   // positions from local to global 
   fkTransformer->Local2Global(fCurrentDetElem, xl1, yl1, 0, 
-                                 xyGlobal[0], xyGlobal[1], zg1);
+                                 xyGlobal[0], xyGlobal[1], xyGlobal[2]);
 }
 
 
 //----------------------------------------------------------------------
 //--- methods which return member data related info
 //----------------------------------------------------------------------
+//----------------------------------------------------------------------
+Float_t AliMUONTriggerCircuit::GetX11Pos(Int_t localBoardId, Int_t istrip) const 
+{
+/// returns X position of Y strip istrip in MC11
+  return fXpos11[localBoardId][istrip];
+}
 Float_t AliMUONTriggerCircuit::GetY11Pos(Int_t localBoardId, Int_t istrip) const 
 {
 /// returns Y position of X strip istrip in MC11
@@ -414,10 +460,32 @@ Float_t AliMUONTriggerCircuit::GetY21Pos(Int_t localBoardId, Int_t istrip) const
   return fYpos21[localBoardId][istrip];
 }
 //----------------------------------------------------------------------
-Float_t AliMUONTriggerCircuit::GetX11Pos(Int_t localBoardId, Int_t istrip) const 
+Float_t AliMUONTriggerCircuit::GetZ11Pos(Int_t localBoardId, Int_t istrip) const 
 {
-/// returns X position of Y strip istrip in MC11
-  return fXpos11[localBoardId][istrip];
+/// returns Z position of X strip istrip in MC11
+  return fZpos11[localBoardId][istrip];
+}
+//----------------------------------------------------------------------
+Float_t AliMUONTriggerCircuit::GetZ21Pos(Int_t localBoardId, Int_t istrip) const 
+{
+/// returns Z position of X strip istrip in MC21
+  return fZpos21[localBoardId][istrip];
+}
+Float_t AliMUONTriggerCircuit::GetX11Width(Int_t localBoardId, Int_t istrip) const 
+{
+/// returns width of Y strip istrip in MC11
+  return fXwidth11[localBoardId][istrip];
+}
+Float_t AliMUONTriggerCircuit::GetY11Width(Int_t localBoardId, Int_t istrip) const 
+{
+/// returns width of X strip istrip in MC11
+  return fYwidth11[localBoardId][istrip];
+}
+//----------------------------------------------------------------------
+Float_t AliMUONTriggerCircuit::GetY21Width(Int_t localBoardId, Int_t istrip) const 
+{
+/// returns width of X strip istrip in MC21
+  return fYwidth21[localBoardId][istrip];
 }
 
 //----------------------------------------------------------------------
index 03fc501..5b22602 100644 (file)
@@ -31,9 +31,14 @@ public:
   AliMUONTriggerCircuit& operator=(const AliMUONTriggerCircuit& AliMUONTriggerCircuit); 
 
   //--- methods which return member data related info
+  Float_t GetX11Pos(Int_t localBoardId, Int_t istrip) const;
   Float_t GetY11Pos(Int_t localBoardId, Int_t istrip) const;
   Float_t GetY21Pos(Int_t localBoardId, Int_t istrip) const;
-  Float_t GetX11Pos(Int_t localBoardId, Int_t istrip) const;
+  Float_t GetZ11Pos(Int_t localBoardId, Int_t istrip) const;
+  Float_t GetZ21Pos(Int_t localBoardId, Int_t istrip) const;
+  Float_t GetX11Width(Int_t localBoardId, Int_t istrip) const;
+  Float_t GetY11Width(Int_t localBoardId, Int_t istrip) const;
+  Float_t GetY21Width(Int_t localBoardId, Int_t istrip) const;
 
   //  void Print(Option_t* opt="") const;
   //  void dump(const char* what, const Float_t* array, Int_t size);
@@ -54,7 +59,7 @@ private:
 
   void FillXstrips(const Int_t icol, 
                    const Int_t iFirstStrip, const Int_t iLastStrip,
-                   Int_t liStripCircuit, TArrayF& ypos);
+                   Int_t liStripCircuit, const Bool_t is11);
   
   void FillYstrips(const Int_t iFirstStrip,
                    const Int_t iLastStrip, Int_t liStripCircuit,
@@ -68,6 +73,11 @@ private:
   TArrayF fXpos11[235];         ///< X position of Y strips in MC11
   TArrayF fYpos11[235];         ///< Y position of X strips in MC11
   TArrayF fYpos21[235];         ///< Y position of X strips in MC21
+  TArrayF fZpos11[235];         ///< Z position of X strips in MC11
+  TArrayF fZpos21[235];         ///< Z position of X strips in MC21
+  TArrayF fXwidth11[235];         ///< width of Y strips in MC11
+  TArrayF fYwidth11[235];         ///< width of X strips in MC11
+  TArrayF fYwidth21[235];         ///< width of X strips in MC21
 
   const AliMUONGeometryTransformer* fkTransformer; //!< pointer to transformation
   const AliMpVSegmentation* fkCurrentSeg;          //!< current segmentation
@@ -75,6 +85,6 @@ private:
   Int_t fCurrentDetElem;                          //!< current detection elt id
   Int_t fCurrentLocalBoard;                       //!< current local board id
 
-  ClassDef(AliMUONTriggerCircuit,1) // Trigger Circuit class
+  ClassDef(AliMUONTriggerCircuit,2) // Trigger Circuit class
 };
 #endif
index 1ccd47c..5a65466 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "AliMUONTriggerTrack.h"
 #include "AliMUONTrackReconstructor.h" 
+#include "TString.h"
 #include <Riostream.h>
 #include "AliLog.h"
 
@@ -38,30 +39,35 @@ AliMUONTriggerTrack::AliMUONTriggerTrack()
   : TObject(),
     fx11(0),
     fy11(0),
-    fthetax(0),
-    fthetay(0),
+    fz11(0.),
+    fz21(0.),
+    fSlopeX(0),
+    fSlopeY(0),
     floTrgNum(0),
     fGTPattern(0),
-    fHitsPatternInTrigCh(0)
-
+    fHitsPatternInTrigCh(0),
+    fCovariances(0x0)
 {
   /// default ctr
       AliDebug(1,Form("this=%p",this));
 }
 //__________________________________________________________________________
-AliMUONTriggerTrack::AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t thetax, Float_t thetay, Int_t loTrgNum, Long_t theGTPattern, UShort_t hitsPatternInTrigCh)
+AliMUONTriggerTrack::AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t z11, Float_t z21, Float_t slopeX, Float_t slopeY, Int_t loTrgNum, Long_t theGTPattern, UShort_t hitsPatternInTrigCh)
     : TObject(),
       fx11(x11),
       fy11(y11),
-      fthetax(thetax),
-      fthetay(thetay),
+      fz11(z11),
+      fz21(z21),
+      fSlopeX(slopeX),
+      fSlopeY(slopeY),
       floTrgNum(loTrgNum),
       fGTPattern(theGTPattern),
-      fHitsPatternInTrigCh(hitsPatternInTrigCh)
+      fHitsPatternInTrigCh(hitsPatternInTrigCh),
+      fCovariances(0x0)
 {
 /// ctor from local trigger output
-        AliDebug(1,Form("this=%p x11=%f y11=%f thetax=%f thetay=%f loTrgNum=%d GTPattern=%ld HitsPatternInTrigCh %i",
-                        this,x11,y11,thetax,thetay,loTrgNum,theGTPattern,fHitsPatternInTrigCh));
+        AliDebug(1,Form("this=%p x11=%f y11=%f z11=%f z21=%f slopeX=%f slopeY=%f loTrgNum=%d GTPattern=%ld HitsPatternInTrigCh %i",
+                        this,x11,y11,z11,z21,slopeX,slopeY,loTrgNum,theGTPattern,fHitsPatternInTrigCh));
 
 }
 
@@ -70,6 +76,10 @@ AliMUONTriggerTrack::~AliMUONTriggerTrack()
 {
   /// Destructor
   AliDebug(1,Form("this=%p",this));
+  if (fCovariances) {
+    delete fCovariances;
+    fCovariances = 0x0;
+  }
 }
 
 //__________________________________________________________________________
@@ -77,16 +87,20 @@ AliMUONTriggerTrack::AliMUONTriggerTrack (const AliMUONTriggerTrack& theMUONTrig
     : TObject(theMUONTriggerTrack),
       fx11(theMUONTriggerTrack.fx11),
       fy11(theMUONTriggerTrack.fy11),
-      fthetax(theMUONTriggerTrack.fthetax),
-      fthetay(theMUONTriggerTrack.fthetay),
+      fz11(theMUONTriggerTrack.fz11),
+      fz21(theMUONTriggerTrack.fz21),
+      fSlopeX(theMUONTriggerTrack.fSlopeX),
+      fSlopeY(theMUONTriggerTrack.fSlopeY),
       floTrgNum(theMUONTriggerTrack.floTrgNum),
       fGTPattern(theMUONTriggerTrack.fGTPattern),
-      fHitsPatternInTrigCh(theMUONTriggerTrack.fHitsPatternInTrigCh)  
+      fHitsPatternInTrigCh(theMUONTriggerTrack.fHitsPatternInTrigCh),
+      fCovariances(0x0)
 {
 ///
 /// copy ctor
 ///
-        AliDebug(1,Form("this=%p copy ctor",this));
+  if (theMUONTriggerTrack.fCovariances) fCovariances = new TMatrixD(*(theMUONTriggerTrack.fCovariances));
+  AliDebug(1,Form("this=%p copy ctor",this));
 
 }
       
@@ -105,21 +119,67 @@ theMUONTriggerTrack)
 
     fx11 = theMUONTriggerTrack.fx11;
     fy11 = theMUONTriggerTrack.fy11;
-    fthetax = theMUONTriggerTrack.fthetax;
-    fthetay = theMUONTriggerTrack.fthetay;
+    fz11 = theMUONTriggerTrack.fz11;
+    fz21 = theMUONTriggerTrack.fz21;
+    fSlopeX = theMUONTriggerTrack.fSlopeX;
+    fSlopeY = theMUONTriggerTrack.fSlopeY;
     floTrgNum = theMUONTriggerTrack.floTrgNum;
     fGTPattern = theMUONTriggerTrack.fGTPattern;
     fHitsPatternInTrigCh = theMUONTriggerTrack.fHitsPatternInTrigCh;
 
+    if (theMUONTriggerTrack.fCovariances) {
+      if (fCovariances) *fCovariances = *(theMUONTriggerTrack.fCovariances);
+      else fCovariances = new TMatrixD(*(theMUONTriggerTrack.fCovariances));
+    } else {
+      delete fCovariances;
+      fCovariances = 0x0;
+    }
+
     return *this;
 }
 
 //__________________________________________________________________________
 void
-AliMUONTriggerTrack::Print(Option_t*) const
+AliMUONTriggerTrack::Print(Option_t* opt) const
 {
 /// Printing
+  TString optString(opt);
+  optString.ToUpper();
+  if ( optString.Contains("FULL") ) optString = "PARAM COV";
+
+  if ( optString.Contains("PARAM"))
+    cout << Form("(X,Y,Z)11=(%7.2f,%7.2f,%7.2f) Z21=%7.2f Slope(X,Y)=(%7.2f,%7.2f) LocalBoard #%3d GlobalTriggerPattern %x HitsPatternInTrigCh %x",
+                fx11,fy11,fz11,fz21,fSlopeX,fSlopeY,floTrgNum,fGTPattern,fHitsPatternInTrigCh) << endl;
+
+  if ( optString.Contains("COV") ){
+    if ( ! fCovariances ) cout << "Covariances not initialized " << endl;
+    else fCovariances->Print();
+  }
+}
 
-  cout << Form("(X,Y)11=(%7.2f,%7.2f) Theta(X,Y)=(%7.2f,%7.2f) LocalBoard #%3d GlobalTriggerPattern %x HitsPatternInTrigCh %x",
-               fx11,fy11,fthetax,fthetay,floTrgNum,fGTPattern,fHitsPatternInTrigCh) << endl;
+//__________________________________________________________________________
+void AliMUONTriggerTrack::SetCovariances(const TMatrixD& covariances)
+{
+  /// Set the covariance matrix
+  if (fCovariances) *fCovariances = covariances;
+  else fCovariances = new TMatrixD(covariances);
+}
+
+//__________________________________________________________________________
+void AliMUONTriggerTrack::SetCovariances(const Double_t matrix[3][3])
+{
+  /// Set the covariance matrix
+  if (fCovariances) fCovariances->SetMatrixArray(&(matrix[0][0]));
+  else fCovariances = new TMatrixD(3,3,&(matrix[0][0]));
+}
+
+//__________________________________________________________________________
+const TMatrixD& AliMUONTriggerTrack::GetCovariances() const
+{
+  /// Return the covariance matrix (create it before if needed)
+  if (!fCovariances) {
+    fCovariances = new TMatrixD(3,3);
+    fCovariances->Zero();
+  }
+  return *fCovariances;
 }
index 4623532..541e381 100644 (file)
@@ -12,6 +12,8 @@
 /// \author Philippe Crochet
 
 #include <TObject.h>
+#include <TMatrixD.h>
+#include <TMath.h>
 
 class AliMUONTrackReconstructor;
 
@@ -22,7 +24,8 @@ class AliMUONTriggerTrack : public TObject
     virtual ~AliMUONTriggerTrack(); // Destructor
     AliMUONTriggerTrack (const AliMUONTriggerTrack& AliMUONTriggerTrack); // copy constructor
     AliMUONTriggerTrack& operator=(const AliMUONTriggerTrack& AliMUONTriggerTrack); // assignment operator
-    AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t thetax, Float_t thetay,
+    AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t z11, Float_t z21,
+                       Float_t slopeX, Float_t slopeY,
                        Int_t iloTrg, Long_t theGTPattern, UShort_t hitsPatternInTrigCh=0); 
     
     // getters
@@ -31,10 +34,18 @@ class AliMUONTriggerTrack : public TObject
     Float_t GetX11()    const {return fx11;}
     /// Return y position of fired X strip in MC11
     Float_t GetY11()    const {return fy11;}
+    /// Return z position of fired X strip in MC11
+    Float_t GetZ11()    const {return fz11;}
+    /// Return z position of fired X strip in MC21
+    Float_t GetZ21()    const {return fz21;}
     /// Return track theta angle in X 
-    Float_t GetThetax() const {return fthetax;}
+    Float_t GetThetax() const {return TMath::ATan(fSlopeX);}
     /// Return track theta angle in Y
-    Float_t GetThetay() const {return fthetay;}
+    Float_t GetThetay() const {return TMath::ATan(fSlopeY);}
+    /// Return track slope in X 
+    Float_t GetSlopeX() const {return fSlopeX;}
+    /// Return track slope in Y
+    Float_t GetSlopeY() const {return fSlopeY;}
     /// Return local trigger number
     Int_t   GetLoTrgNum() const {return floTrgNum;}    
 
@@ -44,10 +55,14 @@ class AliMUONTriggerTrack : public TObject
     void SetX11(Float_t x)     {fx11 = x;}
     /// Set y position of fired X strip in MC11
     void SetY11(Float_t y)     {fy11 = y;}
-    /// Set track theta angle in X 
-    void SetThetax(Float_t tx) {fthetax = tx;}
-    /// Set track theta angle in Y
-    void SetThetay(Float_t ty) {fthetay = ty;}
+    /// Set z position of fired X strip in MC11
+    void SetZ11(Float_t z)     {fz11 = z;}
+    /// Set z position of fired X strip in MC21
+    void SetZ21(Float_t z)     {fz21 = z;}
+    /// Set track slope in X 
+    void SetSlopeX(Float_t slopeX) {fSlopeX = slopeX;}
+    /// Set track slope in Y
+    void SetSlopeY(Float_t slopeY) {fSlopeY = slopeY;}
     /// Set local trigger number
     void SetLoTrgNum(Int_t loTrgNum) {floTrgNum = loTrgNum;}    
 
@@ -61,19 +76,26 @@ class AliMUONTriggerTrack : public TObject
     /// set word telling which trigger chambers where hit by track
     void     SetHitsPatternInTrigCh(UShort_t hitsPatternInTrigCh) {fHitsPatternInTrigCh = hitsPatternInTrigCh;}
     
-    virtual void Print(Option_t* opt="") const;
+    virtual void Print(Option_t* opt="FULL") const;
+
+    const TMatrixD& GetCovariances() const;
+    void  SetCovariances(const TMatrixD& covariances);
+    void  SetCovariances(const Double_t matrix[3][3]);
     
 protected:
   private:
   Float_t fx11;    ///< x position of fired Y strip in MC11
   Float_t fy11;    ///< y position of fired X strip in MC11
-  Float_t fthetax; ///< track theta angle in X   
-  Float_t fthetay; ///< track theta angle in Y
+  Float_t fz11;    ///< z position of fired X strip in MC11
+  Float_t fz21;    ///< z position of fired X strip in MC21
+  Float_t fSlopeX; ///< track slope in X   
+  Float_t fSlopeY; ///< track slope in Y
   Int_t   floTrgNum; ///< local trigger number
   UChar_t fGTPattern; ///< Global trigger pattern  (do not work with static statement)
   UShort_t fHitsPatternInTrigCh; ///< Word containing info on the hits left in trigger chambers
+  mutable TMatrixD *fCovariances; ///< Covariance matrix of track parameters 
 
-  ClassDef(AliMUONTriggerTrack, 5) // Reconstructed trigger track in ALICE dimuon spectrometer
+  ClassDef(AliMUONTriggerTrack, 6) // Reconstructed trigger track in ALICE dimuon spectrometer
     };
        
 #endif
index dfeafab..2f7bc46 100644 (file)
 #include "AliMpDEManager.h"
 #include "AliMpArea.h"
 
+#include "AliMpDDLStore.h"
+#include "AliMpVSegmentation.h"
+#include "AliMpSegmentation.h"
+#include "AliMpPad.h"
+
 #include "AliLog.h"
 #include "AliCodeTimer.h"
 #include "AliTracker.h"
@@ -1241,7 +1246,7 @@ void AliMUONVTrackReconstructor::EventReconstructTrigger(const AliMUONTriggerCir
   /// To make the trigger tracks from Local Trigger
   AliDebug(1, "");
   AliCodeTimerAuto("",0);
-  
+
   AliMUONGlobalTrigger* globalTrigger = triggerStore.Global();
   
   UChar_t gloTrigPat = 0;
@@ -1254,57 +1259,61 @@ void AliMUONVTrackReconstructor::EventReconstructTrigger(const AliMUONTriggerCir
   TIter next(triggerStore.CreateIterator());
   AliMUONLocalTrigger* locTrg(0x0);
 
-  Float_t z11 = AliMUONConstants::DefaultChamberZ(10);
-  Float_t z21 = AliMUONConstants::DefaultChamberZ(12);
+  const Double_t kTrigNonBendReso = AliMUONConstants::TriggerNonBendingReso();
+  const Double_t kTrigBendReso = AliMUONConstants::TriggerBendingReso();
+  const Double_t kSqrt12 = TMath::Sqrt(12.);
       
   AliMUONTriggerTrack triggerTrack;
+  TMatrixD trigCov(3,3);
   
   while ( ( locTrg = static_cast<AliMUONLocalTrigger*>(next()) ) )
   {
-    Bool_t xTrig=locTrg->IsTrigX();
-    Bool_t yTrig=locTrg->IsTrigY();
-    
-    Int_t localBoardId = locTrg->LoCircuit();
-    
-    if (xTrig && yTrig) 
+    if ( locTrg->IsTrigX() && locTrg->IsTrigY() ) 
     { // make Trigger Track if trigger in X and Y
-      
+
+      Int_t localBoardId = locTrg->LoCircuit();
+
       Float_t y11 = circuit.GetY11Pos(localBoardId, locTrg->LoStripX()); 
+      Float_t z11 = circuit.GetZ11Pos(localBoardId, locTrg->LoStripX());
       // need first to convert deviation to [0-30] 
       // (see AliMUONLocalTriggerBoard::LocalTrigger)
       Int_t deviation = locTrg->GetDeviation(); 
       Int_t stripX21 = locTrg->LoStripX()+deviation+1;
       Float_t y21 = circuit.GetY21Pos(localBoardId, stripX21);       
+      Float_t z21 = circuit.GetZ21Pos(localBoardId, stripX21);
       Float_t x11 = circuit.GetX11Pos(localBoardId, locTrg->LoStripY());
       
-      AliDebug(1, Form(" MakeTriggerTrack %d %d %d %d %f %f %f \n",locTrg->LoCircuit(),
-                       locTrg->LoStripX(),locTrg->LoStripX()+locTrg->LoDev()+1,locTrg->LoStripY(),y11, y21, x11));
-      
-      Float_t thetax = TMath::ATan2( x11 , z11 );
-      Float_t thetay = TMath::ATan2( (y21-y11) , (z21-z11) );
+      AliDebug(1, Form(" MakeTriggerTrack %3d %2d %2d %2d (%f %f %f) (%f %f)\n",locTrg->LoCircuit(),
+                       locTrg->LoStripX(),locTrg->LoStripX()+deviation+1,locTrg->LoStripY(),x11, y11, z11, y21, z21));
 
-      CorrectThetaRange(thetax);
-      CorrectThetaRange(thetay);
+      Double_t deltaZ = z11 - z21;
       
+      Float_t slopeX = x11/z11;
+      Float_t slopeY = (y11-y21) / deltaZ;
+
+      Float_t sigmaX = circuit.GetX11Width(localBoardId, locTrg->LoStripY()) / kSqrt12;
+      Float_t sigmaY = circuit.GetY11Width(localBoardId, locTrg->LoStripX()) / kSqrt12;
+      Float_t sigmaY21 = circuit.GetY21Width(localBoardId, locTrg->LoStripX()) / kSqrt12;
+
+      trigCov.Zero();
+      trigCov(0,0) = kTrigNonBendReso * kTrigNonBendReso + sigmaX * sigmaX;
+      trigCov(1,1) = kTrigBendReso * kTrigBendReso + sigmaY * sigmaY;
+      trigCov(2,2) = 
+       (2. * kTrigBendReso * kTrigBendReso + sigmaY * sigmaY + sigmaY21 * sigmaY21 ) / deltaZ / deltaZ;
+      trigCov(1,2) = trigCov(2,1) = trigCov(1,1) / deltaZ;
+
       triggerTrack.SetX11(x11);
       triggerTrack.SetY11(y11);
-      triggerTrack.SetThetax(thetax);
-      triggerTrack.SetThetay(thetay);
+      triggerTrack.SetZ11(z11);
+      triggerTrack.SetZ21(z21);
+      triggerTrack.SetSlopeX(slopeX);
+      triggerTrack.SetSlopeY(slopeY);
       triggerTrack.SetGTPattern(gloTrigPat);
       triggerTrack.SetLoTrgNum(localBoardId);
-      
+      triggerTrack.SetCovariances(trigCov);
+
       triggerTrackStore.Add(triggerTrack);
     } // board is fired 
   } // end of loop on Local Trigger
 }
-
-//__________________________________________________________________________
-void AliMUONVTrackReconstructor::CorrectThetaRange(Float_t& theta)
-{
-  /// The angles of the trigger tracks, obtained with ATan2, 
-  /// have values around +pi and -pi. On the contrary, the angles 
-  /// used in the tracker tracks have values around 0.
-  /// This function sets the same range for the trigger tracks angles.
-  if (theta < -TMath::PiOver2()) theta += TMath::Pi();
-  else if(theta > TMath::PiOver2()) theta -= TMath::Pi();
-}
index 90721cd..8e0b127 100644 (file)
@@ -108,8 +108,6 @@ class AliMUONVTrackReconstructor : public TObject {
   Bool_t FollowLinearTrackInChamber(AliMUONTrack &trackCandidate, const AliMUONVClusterStore& clusterStore, Int_t nextChamber);
   Bool_t FollowLinearTrackInStation(AliMUONTrack &trackCandidate, const AliMUONVClusterStore& clusterStore, Int_t nextStation);
 
-  void CorrectThetaRange(Float_t&);
-
  private:
   
   // Functions