]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONSegment.cxx
Formatting changes.
[u/mrichter/AliRoot.git] / MUON / AliMUONSegment.cxx
index 01671570e80cc2e02eb63c71086850806c7e275b..c9b3d59c42f1e1118af5367c2db4b0436163162b 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/*
-$Log$
-Revision 1.3  2000/06/25 13:06:39  hristov
-Inline functions moved from *.cxx to *.h files instead of forward declarations
+/* $Id$ */
 
-Revision 1.2  2000/06/15 07:58:48  morsch
-Code from MUON-dev joined
-
-Revision 1.1.2.4  2000/06/12 10:10:21  morsch
-Dummy copy constructor and assignment operator added
-
-Revision 1.1.2.3  2000/06/09 21:01:16  morsch
-Make includes consistent with new file structure.
-
-Revision 1.1.2.2  2000/06/09 12:58:05  gosset
-Removed comment beginnings in Log sections of .cxx files
-Suppressed most violations of coding rules
-
-Revision 1.1.2.1  2000/06/07 14:44:53  gosset
-Addition of files for track reconstruction in C++
-*/
-
-//__________________________________________________________________________
+///////////////////////////////////////////////////////////
 //
-// Segment for reconstruction in ALICE dimuon spectrometer:
+// Segment for reconstruction
+// in 
+// ALICE 
+// dimuon 
+// spectrometer:
 // two hits for reconstruction in the two chambers of one station
-//__________________________________________________________________________
+//
+///////////////////////////////////////////////////////////
 
 #include "AliMUONSegment.h" 
-
 #include "AliMUON.h"
 #include "AliMUONHitForRec.h" 
 #include "AliMUONTrackParam.h" 
-#include "AliMUONChamber.h" 
-#include "AliRun.h"
+#include "AliRun.h" // for gAlice
+#include "AliLog.h" 
 
+/// \cond CLASSIMP
 ClassImp(AliMUONSegment) // Class implementation in ROOT context
+/// \endcond
+
+  //__________________________________________________________________________
+AliMUONSegment::AliMUONSegment()
+  : TObject(),
+    fHitForRecPtr1(0x0),
+    fHitForRecPtr2(0x0),
+    fBendingCoor(0.),
+    fBendingSlope(0.),
+    fBendingCoorReso2(0.),
+    fBendingSlopeReso2(0.),
+    fBendingCoorSlopeReso2(0.),
+    fBendingImpact(0.),
+    fNonBendingCoor(0.),
+    fNonBendingSlope(0.),
+    fNonBendingCoorReso2(0.),
+    fNonBendingSlopeReso2(0.),
+    fNonBendingCoorSlopeReso2(0.),
+    fNonBendingImpact(0.),
+    fZ(0.),
+    fInTrack(kFALSE)
+{
+  /// Default constructor
+
+}
 
   //__________________________________________________________________________
 AliMUONSegment::AliMUONSegment(AliMUONHitForRec* Hit1, AliMUONHitForRec* Hit2)
+  : TObject(),
+    fHitForRecPtr1(Hit1),
+    fHitForRecPtr2(Hit2),
+    fBendingCoor(Hit1->GetBendingCoor()),
+    fBendingSlope(0.),
+    fBendingCoorReso2(Hit1->GetBendingReso2()),
+    fBendingSlopeReso2(0.),
+    fBendingCoorSlopeReso2(0.),
+    fBendingImpact(0.),
+    fNonBendingCoor(Hit1->GetNonBendingCoor()),
+    fNonBendingSlope(0.),
+    fNonBendingCoorReso2(Hit1->GetNonBendingReso2()),
+    fNonBendingSlopeReso2(0.),
+    fNonBendingCoorSlopeReso2(0.),
+    fNonBendingImpact(0.),
+    fZ(Hit1->GetZ()),
+    fInTrack(kFALSE)
 {
-  // Constructor for AliMUONSegment from two HitForRec's,
-  // one, in the first chamber of the station, pointed to by "Hit1",
-  // the other one, in the second chamber of the station, pointed to by "Hit1".
-  // Fills the pointers to both hits,
-  // the slope, the covariance for (coordinate in first chamber, slope),
-  // and the impact parameter at vertex (Z=0),
-  // in bending and non bending planes.
-  // Puts the "fInTrack" flag to "kFALSE".
+  /// Constructor for AliMUONSegment from two HitForRec's,
+  /// one, in the first chamber of the station, pointed to by "Hit1",
+  /// the other one, in the second chamber of the station, pointed to by "Hit1".
+  /// Fills the pointers to both hits,
+  /// the slope, the covariance for (coordinate in first chamber, slope),
+  /// and the impact parameter at vertex (Z=0),
+  /// in bending and non bending planes.
+  /// Puts the "fInTrack" flag to "kFALSE".
+
   Double_t dz;
-  // pointers to HitForRec's
-  fHitForRecPtr1 = Hit1;
-  fHitForRecPtr2 = Hit2;
   dz = Hit1->GetZ() - Hit2->GetZ();
+
   // bending plane
-  fBendingCoor = Hit1->GetBendingCoor();
   fBendingSlope = (fBendingCoor - Hit2->GetBendingCoor()) / dz;
   fBendingImpact = fBendingCoor - Hit1->GetZ() * fBendingSlope;
-  fBendingCoorReso2 = Hit1->GetBendingReso2();
   fBendingSlopeReso2 = ( Hit1->GetBendingReso2() +
                         Hit2->GetBendingReso2() ) / dz / dz;
   fBendingCoorSlopeReso2 = Hit1->GetBendingReso2() / dz;
   // non bending plane
-  fNonBendingCoor = Hit1->GetNonBendingCoor();
   fNonBendingSlope = (fNonBendingCoor - Hit2->GetNonBendingCoor()) / dz;
   fNonBendingImpact = fNonBendingCoor - Hit1->GetZ() * fNonBendingSlope;
-  fNonBendingCoorReso2 = Hit1->GetNonBendingReso2();
   fNonBendingSlopeReso2 = ( Hit1->GetNonBendingReso2() +
                            Hit2->GetNonBendingReso2() ) / dz / dz;
   fNonBendingCoorSlopeReso2 = Hit1->GetNonBendingReso2() / dz;
-  // "fInTrack" flag to "kFALSE"
-  fInTrack = kFALSE;
   return;
 }
 
-AliMUONSegment::AliMUONSegment (const AliMUONSegment& MUONSegment)
-{
-// Dummy copy constructor
-}
-
-AliMUONSegment & AliMUONSegment::operator=(const AliMUONSegment& MUONSegment)
-{
-// Dummy assignment operator
-    return *this;
-}
-
   //__________________________________________________________________________
-Int_t AliMUONSegment::Compare(TObject* Segment)
+Int_t AliMUONSegment::Compare(const TObject* Segment) const
 {
-  // "Compare" function to sort with increasing absolute value
-  // of the "impact parameter" in bending plane.
-  // Returns -1 (0, +1) if |impact parameter| of current Segment
-  // is smaller than (equal to, larger than) |impact parameter| of Segment
-  if (TMath::Abs(((AliMUONSegment*)this)->fBendingSlope)
-      < TMath::Abs(((AliMUONSegment*)Segment)->fBendingSlope))
+  /// "Compare" function to sort with increasing absolute value
+  /// of the "impact parameter" in bending plane.
+  /// Returns -1 (0, +1) if |impact parameter| of current Segment
+  /// is smaller than (equal to, larger than) |impact parameter| of Segment
+
+  if (TMath::Abs(((AliMUONSegment*)this)->fBendingImpact)
+      < TMath::Abs(((AliMUONSegment*)Segment)->fBendingImpact))
     return(-1);
   // continuous parameter, hence no need for testing equal case
   else return(+1);
 }
 
   //__________________________________________________________________________
-Double_t AliMUONSegment::NormalizedChi2WithSegment(AliMUONSegment* Segment, Double_t Sigma2Cut)
+Double_t AliMUONSegment::NormalizedChi2WithSegment(AliMUONSegment* Segment, Double_t Sigma2Cut) const
 {
-  // Calculate the normalized Chi2 between the current Segment (this)
-  // and the Segment pointed to by "Segment",
-  // i.e. the square deviations between the coordinates and the slopes,
-  // in both the bending and the non bending plane,
-  // divided by the variance of the same quantities and by "Sigma2Cut".
-  // Returns 5 if none of the 4 quantities is OK,
-  // something smaller than or equal to 4 otherwise.
-  // Would it be more correct to use a real chi square
-  // including the non diagonal term ????
+  /// Calculate the normalized Chi2 between the current Segment (this)
+  /// and the Segment pointed to by "Segment",
+  /// i.e. the square deviations between the coordinates and the slopes,
+  /// in both the bending and the non bending plane,
+  /// divided by the variance of the same quantities and by "Sigma2Cut".
+  /// Returns 5 if none of the 4 quantities is OK,
+  /// something smaller than or equal to 4 otherwise.
+  /// Would it be more correct to use a real chi square
+  /// including the non diagonal term ????
+
   Double_t chi2, chi2Max, diff, normDiff;
   chi2 = 0.0;
   chi2Max = 5.0;
@@ -156,23 +167,23 @@ Double_t AliMUONSegment::NormalizedChi2WithSegment(AliMUONSegment* Segment, Doub
 }
 
   //__________________________________________________________________________
-AliMUONSegment* AliMUONSegment::CreateSegmentFromLinearExtrapToStation (Int_t Station, Double_t MCSfactor)
+AliMUONSegment* AliMUONSegment::CreateSegmentFromLinearExtrapToStation ( Double_t z, Double_t MCSfactor) const
 {
-  // Extrapolates linearly the current Segment (this) to station (0..) "Station".
-  // Multiple Coulomb scattering calculated from "MCSfactor"
-  // corresponding to one chamber,
-  // with one chamber for the coordinate, two chambers for the angle,
-  // due to the arrangement in stations.
-  // Valid from station(1..) 4 to 5 or vice versa.
-  // Returns the pointer to the created AliMUONSegment object
-  // corresponding to this extrapolation.
-  // The caller has the responsibility to delete this object.
+  /// Extrapolates linearly the current Segment (this) to station (0..) "Station".
+  /// Multiple Coulomb scattering calculated from "MCSfactor"
+  /// corresponding to one chamber,
+  /// with one chamber for the coordinate, two chambers for the angle,
+  /// due to the arrangement in stations.
+  /// Valid from station(1..) 4 to 5 or vice versa.
+  /// Returns the pointer to the created AliMUONSegment object
+  /// corresponding to this extrapolation.
+  /// The caller has the responsibility to delete this object.
+
   AliMUONSegment* extrapSegment = new AliMUONSegment(); // creates empty new segment
   // dZ from first hit of current Segment to first chamber of station "Station"
-  AliMUON *pMUON = (AliMUON*) gAlice->GetModule("MUON"); // necessary ????
-  Double_t dZ =
-    (&(pMUON->Chamber(2 * Station)))->Z() - (this->fHitForRecPtr1)->GetZ();
+  Double_t dZ =  z - this->GetZ();
   // Data in bending plane
+  extrapSegment->fZ = z;
   //  coordinate
   extrapSegment->fBendingCoor = this->fBendingCoor + this->fBendingSlope * dZ;
   //  slope
@@ -200,21 +211,21 @@ AliMUONSegment* AliMUONSegment::CreateSegmentFromLinearExtrapToStation (Int_t St
 }
 
   //__________________________________________________________________________
-AliMUONHitForRec* AliMUONSegment::CreateHitForRecFromLinearExtrapToChamber (Int_t Chamber, Double_t MCSfactor)
+AliMUONHitForRec* AliMUONSegment::CreateHitForRecFromLinearExtrapToChamber ( Double_t z, Double_t MCSfactor) const
 {
-  // Extrapolates linearly the current Segment (this) to chamber(0..) "Chamber".
-  // Multiple Coulomb scattering calculated from "MCSfactor"
-  // corresponding to one chamber.
-  // Valid from station(1..) 4 to 5 or vice versa.
-  // Returns the pointer to the created AliMUONHitForRec object
-  // corresponding to this extrapolation.
-  // The caller has the responsibility to delete this object.
+  /// Extrapolates linearly the current Segment (this) to chamber(0..) "Chamber".
+  /// Multiple Coulomb scattering calculated from "MCSfactor"
+  /// corresponding to one chamber.
+  /// Valid from station(1..) 4 to 5 or vice versa.
+  /// Returns the pointer to the created AliMUONHitForRec object
+  /// corresponding to this extrapolation.
+  /// The caller has the responsibility to delete this object.
+
   AliMUONHitForRec* extrapHitForRec = new AliMUONHitForRec(); // creates empty new HitForRec
   // dZ from first hit of current Segment to chamber
-  AliMUON *pMUON = (AliMUON*) gAlice->GetModule("MUON"); // necessary ????
-  Double_t dZ =
-    (&(pMUON->Chamber(Chamber)))->Z() - (this->fHitForRecPtr1)->GetZ();
+  Double_t dZ = z - this->GetZ();
   // Data in bending plane
+  extrapHitForRec->SetZ(z);
   //  coordinate
   extrapHitForRec->SetBendingCoor(this->fBendingCoor + this->fBendingSlope * dZ);
   //  covariance, including multiple Coulomb scattering over dZ due to one chamber
@@ -232,39 +243,49 @@ AliMUONHitForRec* AliMUONSegment::CreateHitForRecFromLinearExtrapToChamber (Int_
 }
 
   //__________________________________________________________________________
-void AliMUONSegment::UpdateFromStationTrackParam(AliMUONTrackParam *TrackParam, Double_t MCSfactor, Double_t Dz1, Double_t Dz2, Double_t Dz3, Int_t Station, Double_t InverseMomentum)
+void AliMUONSegment::UpdateFromStationTrackParam(AliMUONTrackParam *TrackParam, Double_t /*MCSfactor*/, Double_t /*Dz1*/, Double_t /*Dz2*/, Double_t /*Dz3*/, Int_t Station, Double_t InverseMomentum)
 {
-  // Fill data members with values calculated from the array of track parameters
-  // pointed to by "TrackParam" (index = 0 and 1 for first and second chambers
-  // of the station, respectively).
-  // Multiple Coulomb scattering is taking into account with "MCSfactor"
-  // corresponding to one chamber,
-  // with one chamber for the coordinate, two chambers for the angle,
-  // due to the arrangement in stations.
-  // Resolution coming from:
-  // coordinate in closest station at "Dz1" from current "Station",
-  // slope between closest stations, with "Dz2" interval between them,
-  // interval "Dz3" between chambers of closest station,
-  // extrapolation over "Dz1" from closest station,
-  // "InverseMomentum".
-  // When called, "fBendingCoorReso2" and "fNonBendingCoorReso2"
-  // are assumed to be filled
-  // with the variance on bending and non bending coordinates.
-  // The "road" is parametrized from the old reco_muon.F
-  // with 8 cm between stations.
+  /// Fill data members with values calculated from the array of track parameters
+  /// pointed to by "TrackParam" (index = 0 and 1 for first and second chambers
+  /// of the station, respectively).
+  /// Multiple Coulomb scattering is taking into account with "MCSfactor"
+  /// corresponding to one chamber,
+  /// with one chamber for the coordinate, two chambers for the angle,
+  /// due to the arrangement in stations.
+  /// Resolution coming from:
+  /// coordinate in closest station at "Dz1" from current "Station",
+  /// slope between closest stations, with "Dz2" interval between them,
+  /// interval "Dz3" between chambers of closest station,
+  /// extrapolation over "Dz1" from closest station,
+  /// "InverseMomentum".
+  /// When called, "fBendingCoorReso2" and "fNonBendingCoorReso2"
+  /// are assumed to be filled
+  /// with the variance on bending and non bending coordinates.
+  /// The "road" is parametrized from the old reco_muon.F
+  /// with 8 cm between stations.
+
   AliMUONTrackParam *param0;
-  Double_t cReso2, sReso2;
+//   Double_t cReso2, sReso2;
   // parameters to define the widths of the searching roads in station 0,1,2
   // width = p0 + p1/ (momentum)^2
   //                  station number:        0         1          2
-  static Double_t p0BendingCoor[3] =     { 6.43e-2, 1.64e-2,   0.034 };   
-  static Double_t p1BendingCoor[3] =     {    986.,    821.,    446. };  
-  static Double_t p0BendingSlope[3] =    { 3.54e-6, 3.63e-6,  3.6e-6 };  
-  static Double_t p1BendingSlope[3] =    { 4.49e-3,  4.8e-3,   0.011 };  
-  static Double_t p0NonBendingCoor[3] =  { 4.66e-2, 4.83e-2,   0.049 };   
-  static Double_t p1NonBendingCoor[3] =  {   1444.,    866.,    354. };  
-  static Double_t p0NonBendingSlope[3] = { 6.14e-4, 6.49e-4, 6.85e-4 };  
-  static Double_t p1NonBendingSlope[3] = {      0.,      0.,      0. };  
+//   static Double_t p0BendingCoor[3] =     { 6.43e-2, 1.64e-2,   0.034 };   
+//   static Double_t p1BendingCoor[3] =     {    986.,    821.,    446. };  
+//   static Double_t p0BendingSlope[3] =    { 3.54e-6, 3.63e-6,  3.6e-6 };  
+//   static Double_t p1BendingSlope[3] =    { 4.49e-3,  4.8e-3,   0.011 };  
+//   static Double_t p0NonBendingCoor[3] =  { 4.66e-2, 4.83e-2,   0.049 };   
+//   static Double_t p1NonBendingCoor[3] =  {   1444.,    866.,    354. };  
+//   static Double_t p0NonBendingSlope[3] = { 6.14e-4, 6.49e-4, 6.85e-4 };  
+//   static Double_t p1NonBendingSlope[3] = {      0.,      0.,      0. };
+  
+  static Double_t p0BendingCoor[3] =     { 6.43e-2, 6.43e-2,   6.43e-2  };   
+  static Double_t p1BendingCoor[3] =     {    986.,    986.,       986. };  
+  static Double_t p0BendingSlope[3] =    {   3.6e-6,   3.6e-6,     3.6e-6  };  
+  static Double_t p1BendingSlope[3] =    {  1.1e-2,  1.1e-2,    1.1e-2  };  
+  static Double_t p0NonBendingCoor[3] =  {   0.049,   0.049,     0.049  };   
+  static Double_t p1NonBendingCoor[3] =  {   1444.,   1444.,      1444. };  
+  static Double_t p0NonBendingSlope[3] = {   6.8e-4,   6.8e-4,     6.8e-4  };  
+  static Double_t p1NonBendingSlope[3] = {      0.,      0.,         0. };  
   param0 = &(TrackParam[0]);
 
 // OLD version
@@ -291,20 +312,22 @@ void AliMUONSegment::UpdateFromStationTrackParam(AliMUONTrackParam *TrackParam,
   fNonBendingCoor = param0->GetNonBendingCoor(); // coordinate
   fNonBendingSlope = param0->GetNonBendingSlope(); // slope
 
+  fZ = param0->GetZ(); // z
+
   // Resolutions
   // cReso2 and sReso2 have to be subtracted here from the parametrization
   // because they are added in the functions "NormalizedChi2WithSegment"
   // and "NormalizedChi2WithHitForRec"
   // Bending plane
-  cReso2 = fBendingCoorReso2;
-  sReso2 = (2. * cReso2 )/ (Dz3*Dz3) ;
-  fBendingCoorReso2 = p0BendingCoor[Station] + p1BendingCoor[Station]*InverseMomentum*InverseMomentum - cReso2;
-  fBendingSlopeReso2 = p0BendingSlope[Station] + p1BendingSlope[Station]*InverseMomentum*InverseMomentum - sReso2;
+//   cReso2 = fBendingCoorReso2;
+//   sReso2 = (2. * cReso2 )/ (Dz3*Dz3) ;
+  fBendingCoorReso2 = p0BendingCoor[Station] + p1BendingCoor[Station]*InverseMomentum*InverseMomentum ;  // - cReso2
+  fBendingSlopeReso2 = p0BendingSlope[Station] + p1BendingSlope[Station]*InverseMomentum*InverseMomentum; //  - sReso2;
   // Non bending plane
-  cReso2 = fNonBendingCoorReso2;
-  sReso2 =  (2. * cReso2 )/ (Dz3*Dz3) ;
-  fNonBendingCoorReso2 = p0NonBendingCoor[Station] + p1NonBendingCoor[Station]*InverseMomentum*InverseMomentum - cReso2;
-  fNonBendingSlopeReso2 = p0NonBendingSlope[Station] + p1NonBendingSlope[Station]*InverseMomentum*InverseMomentum - sReso2;
+//   cReso2 = fNonBendingCoorReso2;
+//   sReso2 =  (2. * cReso2 )/ (Dz3*Dz3) ;
+  fNonBendingCoorReso2 = p0NonBendingCoor[Station] + p1NonBendingCoor[Station]*InverseMomentum*InverseMomentum; // - cReso2;
+  fNonBendingSlopeReso2 = p0NonBendingSlope[Station] + p1NonBendingSlope[Station]*InverseMomentum*InverseMomentum; //  - sReso2;
   return;
 }
 
@@ -347,3 +370,35 @@ void AliMUONSegment::UpdateFromStationTrackParam(AliMUONTrackParam *TrackParam,
 //   fNonBendingSlopeReso2 = sReso2 + 2.0 * MCSfactor;
 //   return;
 // }
+
+//_____________________________________________________________________________
+void
+AliMUONSegment::Print(Option_t*) const
+{
+  /// Printing
+
+  cout.precision(5);
+  cout.width(5);
+  
+  cout << "<AliMUONSegment>" 
+    << "(Coor,Slope,Impact)Bending=("
+    << fBendingCoor << "," << fBendingSlope << "," << fBendingImpact
+    << ")" << endl
+    << "(Coor,Slope,Impact)NonBending=("
+    << fNonBendingCoor << "," << fNonBendingSlope << "," << fNonBendingImpact
+    << ")" << endl
+    << "Cov (coor,slope,coor & slope)Bending=("
+    << fBendingCoorReso2 << "," << fBendingSlopeReso2 << "," << fBendingCoorSlopeReso2 << endl
+    << "Cov (coor,slope,coor & slope)NonBending=("
+    << fNonBendingCoorReso2 << "," << fNonBendingSlopeReso2 << "," << fNonBendingCoorSlopeReso2 << endl;
+  if ( fHitForRecPtr1 ) 
+  {
+    cout << "HitForRec1=";
+    fHitForRecPtr1->Print();
+  }
+  if ( fHitForRecPtr2 ) 
+  {
+    cout << "HitForRec2=";
+    fHitForRecPtr2->Print();
+  }
+}