* 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;
}
//__________________________________________________________________________
-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
}
//__________________________________________________________________________
-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
}
//__________________________________________________________________________
-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
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;
}
// 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();
+ }
+}