* provided "as is" without express or implied warranty. *
**************************************************************************/
+// $Id$
+
+/// \ingroup macros
+/// \file MUONRecoCheck.C
+/// \brief Utility macro to check the muon reconstruction.
+///
+/// Reconstructed tracks are compared to reference tracks. The reference tracks
+/// are built from AliTrackReference for the hit in chamber (0..9) and from
+/// kinematics (TreeK) for the vertex parameters.
+///
+/// \author Jean-Pierre Cussonneau, Subatech
+
// ROOT includes
#include "TClonesArray.h"
#include "TH1.h"
#include "AliMUONRecoCheck.h"
#include "AliMUONTrackParam.h"
#include "AliMUONTrackExtrap.h"
-
#include "AliMUONVTrackStore.h"
Int_t TrackCheck( Bool_t *compTrack);
void MUONRecoCheck (Int_t nEvent = 1, char* geoFilename = "geometry.root",
- char * filenameSim="galice_sim.root", char * filename="galice.root"){
-
- // Utility macro to check the muon reconstruction. Reconstructed tracks are compared
- // to reference tracks. The reference tracks are built from AliTrackReference for the
- // hit in chamber (0..9) and from kinematics (TreeK) for the vertex parameters.
+ char * pathSim="./generated/", char * esdFileName="AliESDs.root")
+{
Bool_t *compTrack;
Bool_t compTrackOK[10];
- Int_t nHitOK = 0;
+ Int_t nClusterOk = 0;
Int_t testTrack = 0;
Int_t iTrack = 0;
AliMUONTrack* trackOK(0x0);
Int_t trackID = 0;
- Double_t sigma2Cut = 16; // 4 sigmas cut, sigma2Cut = 4*4
+ Double_t sigmaCut = 4.; // 4 sigmas cut
+ Double_t maxChi2 = 999.;
AliMUONTrackParam *trackParam;
- TClonesArray *trackParamAtHit;
Double_t x1,y1,z1,pX1,pY1,pZ1,p1;
Double_t x2,y2,z2,pX2,pY2,pZ2,p2;
TH1F *hReconstructible = new TH1F("hReconstructible"," Nb of reconstructible tracks ",15,-0.5,14.5);
TH1F *hReco = new TH1F("hReco"," Nb of reconstructed tracks / evt",15,-0.5,14.5);
- TH1F *hNHitComp = new TH1F("hNHitComp"," Nb of compatible hits / track ",15,-0.5,14.5);
+ TH1F *hNClusterComp = new TH1F("hNClusterComp"," Nb of compatible clusters / track ",15,-0.5,14.5);
TH1F *hTestTrack = new TH1F("hTestTrack"," Reconstruction requirement / track",15,-0.5,14.5);
TH1F *hTrackRefID = new TH1F("hTrackRefID"," track reference ID ",100,-0.5,99.5);
- TH1F *hResMomVertex = new TH1F("hMomVertex"," delta P vertex (GeV/c)",100,-10.,10);
- TH1F *hResMomFirstHit = new TH1F("hMomFirstHit"," delta P first hit (GeV/c)",100,-10.,10);
+ TH1F *hResMomVertex = new TH1F("hResMomVertex"," delta P vertex (GeV/c)",100,-10.,10);
+ TH1F *hResMomFirstCluster = new TH1F("hResMomFirstCluster"," delta P first cluster (GeV/c)",100,-10.,10);
// Import TGeo geometry (needed by AliMUONTrackExtrap::ExtrapToVertex)
if (!gGeoManager) {
// set the magnetic field for track extrapolations
AliMUONTrackExtrap::SetField(AliTracker::GetFieldMap());
- AliMUONRecoCheck rc(filename,filenameSim);
+ AliMUONRecoCheck rc(esdFileName, pathSim);
Int_t nevents = rc.NumberOfEvents();
while ( ( trackRef = static_cast<AliMUONTrack*>(next()) ) )
{
+ maxChi2 = 999.;
testTrack = 0;
trackOK = 0x0;
for (Int_t ch = 0; ch < AliMUONConstants::NTrackingCh(); ch++)
while ( ( trackReco = static_cast<AliMUONTrack*>(next2()) ) )
{
- // check if trackRef is compatible with trackReco
- compTrack = trackRef->CompatibleTrack(trackReco,sigma2Cut);
-
- iTrack = TrackCheck(compTrack);
+ // check if trackRef is compatible with trackReco
+ if (trackReco->GetNClusters() > 1) {
+
+ // check cluster by cluster if trackReco contain info at each cluster
+ compTrack = trackRef->CompatibleTrack(trackReco,sigmaCut);
+
+ iTrack = TrackCheck(compTrack);
+
+ if (iTrack > testTrack)
+ {
+ nClusterOk = 0;
+ for (Int_t ch = 0; ch < AliMUONConstants::NTrackingCh(); ch++)
+ {
+ if (compTrack[ch]) nClusterOk++;
+ compTrackOK[ch] = compTrack[ch];
+ }
+ testTrack = iTrack;
+ trackOK = trackReco;
+ }
+
+ } else {
+
+ // check only parameters at the z position of the first trackRef
+ AliMUONTrackParam *refParam = (AliMUONTrackParam*) trackRef->GetTrackParamAtCluster()->First();
+ AliMUONTrackParam recoParam(*((AliMUONTrackParam*) trackReco->GetTrackParamAtCluster()->First()));
+ AliMUONTrackExtrap::ExtrapToZCov(&recoParam, refParam->GetZ());
+ Double_t chi2;
+ if (refParam->CompatibleTrackParam(recoParam, sigmaCut, chi2)) {
+
+ if (chi2 < maxChi2) {
+ maxChi2 = chi2;
+ trackOK = trackReco;
+ }
+
+ }
+
+ }
- if (iTrack > testTrack)
- {
- nHitOK = 0;
- for (Int_t ch = 0; ch < AliMUONConstants::NTrackingCh(); ch++)
- {
- if (compTrack[ch]) nHitOK++;
- compTrackOK[ch] = compTrack[ch];
- }
- testTrack = iTrack;
- trackOK = trackReco;
- }
}
hTestTrack->Fill(testTrack);
trackID = trackRef->GetTrackID();
hTrackRefID->Fill(trackID);
- if (testTrack == 4) { // tracking requirements verified, track is found
+ if (testTrack == 4 || maxChi2 < 5.*sigmaCut*sigmaCut) { // tracking requirements verified, track is found
nReconstructibleTracksCheck++;
- hNHitComp->Fill(nHitOK);
+ hNClusterComp->Fill(nClusterOk);
trackParam = trackRef->GetTrackParamAtVertex();
x1 = trackParam->GetNonBendingCoor();
y1 = trackParam->GetBendingCoor();
// printf(" Ref. track at vertex: x,y,z: %f %f %f px,py,pz,p: %f %f %f %f \n",x1,y1,z1,pX1,pY1,pZ1,p1);
trackReco = trackOK;
- trackParam = new AliMUONTrackParam(*((AliMUONTrackParam*)(trackReco->GetTrackParamAtHit()->First())));
- AliMUONTrackExtrap::ExtrapToVertex(trackParam,x1,y1,z1);
+ trackParam = new AliMUONTrackParam(*((AliMUONTrackParam*)(trackReco->GetTrackParamAtCluster()->First())));
+ AliMUONTrackExtrap::ExtrapToVertex(trackParam,x1,y1,z1,0.,0.);
x2 = trackParam->GetNonBendingCoor();
y2 = trackParam->GetBendingCoor();
z2 = trackParam->GetZ();
hResMomVertex->Fill(p2-p1);
- trackParamAtHit = trackRef->GetTrackParamAtHit();
- trackParam = (AliMUONTrackParam*) trackParamAtHit->First();
+ trackParam = (AliMUONTrackParam*) trackRef->GetTrackParamAtCluster()->First();
x1 = trackParam->GetNonBendingCoor();
y1 = trackParam->GetBendingCoor();
z1 = trackParam->GetZ();
pY1 = trackParam->Py();
pZ1 = trackParam->Pz();
p1 = trackParam->P();
- // printf(" Ref. track at 1st hit: x,y,z: %f %f %f px,py,pz: %f %f %f \n",x1,y1,z1,pX1,pY1,pZ1);
- trackParamAtHit = trackOK->GetTrackParamAtHit();
- trackParam = (AliMUONTrackParam*) trackParamAtHit->First();
+ // printf(" Ref. track at 1st cluster: x,y,z: %f %f %f px,py,pz: %f %f %f \n",x1,y1,z1,pX1,pY1,pZ1);
+ trackParam = (AliMUONTrackParam*) trackOK->GetTrackParamAtCluster()->First();
x2 = trackParam->GetNonBendingCoor();
y2 = trackParam->GetBendingCoor();
z2 = trackParam->GetZ();
pY2 = trackParam->Py();
pZ2 = trackParam->Pz();
p2 = trackParam->P();
- // printf(" Reconst. track at 1st hit: x,y,z: %f %f %f px,py,pz: %f %f %f \n",x2,y2,z2,pX2,pY2,pZ2);
+ // printf(" Reconst. track at 1st cluster: x,y,z: %f %f %f px,py,pz: %f %f %f \n",x2,y2,z2,pX2,pY2,pZ2);
- hResMomFirstHit->Fill(p2-p1);
+ hResMomFirstCluster->Fill(p2-p1);
}
} // end loop track ref.
} // end loop on event
- delete field;
-
printf(" nb of reconstructible tracks: %d \n", nReconstructibleTracks);
printf(" nb of reconstructed tracks: %d \n", nReconstructedTracks);
printf(" nb of reconstructible tracks which are reconstructed: %d \n", nReconstructibleTracksCheck);
// Return number of validated conditions
// If all the tests are verified then TrackCheck = 4 (good track)
Int_t iTrack = 0;
- Int_t hitsInLastStations = 0;
+ Int_t nCompClustersInLastStations = 0;
// apply reconstruction requirements
- if (compTrack[0] || compTrack[1]) iTrack++; // at least one hit in st. 0
- if (compTrack[2] || compTrack[3]) iTrack++; // at least one hit in st. 1
- if (compTrack[4] || compTrack[5]) iTrack++; // at least one hit in st. 2
+ if (compTrack[0] || compTrack[1]) iTrack++; // at least one compatible cluster in st. 0
+ if (compTrack[2] || compTrack[3]) iTrack++; // at least one compatible cluster in st. 1
+ if (compTrack[4] || compTrack[5]) iTrack++; // at least one compatible cluster in st. 2
for (Int_t ch = 6; ch < AliMUONConstants::NTrackingCh(); ch++) {
- if (compTrack[ch]) hitsInLastStations++;
+ if (compTrack[ch]) nCompClustersInLastStations++;
}
- if (hitsInLastStations > 2) iTrack++; // at least 3 hits in st. 3 & 4
+ if (nCompClustersInLastStations > 2) iTrack++; // at least 3 compatible clusters in st. 3 & 4
return iTrack;
}
-
-
-
-
-
-