]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/MUONRecoCheck.C
Revision of macros documentation
[u/mrichter/AliRoot.git] / MUON / MUONRecoCheck.C
index 1a15a00655e415b1a5d7dc55179427f7ea1f1353..6217c3de00dcaec0a9eb76d8bdf48f00fed986be 100644 (file)
 * 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;
   
@@ -63,12 +71,12 @@ void MUONRecoCheck (Int_t nEvent = 1, char* geoFilename = "geometry.root",
   
   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) {
@@ -87,7 +95,7 @@ void MUONRecoCheck (Int_t nEvent = 1, char* geoFilename = "geometry.root",
   // set the magnetic field for track extrapolations
   AliMUONTrackExtrap::SetField(AliTracker::GetFieldMap());
     
-  AliMUONRecoCheck rc(filename,filenameSim);
+  AliMUONRecoCheck rc(esdFileName, pathSim);
   
   Int_t nevents = rc.NumberOfEvents();
   
@@ -116,6 +124,7 @@ void MUONRecoCheck (Int_t nEvent = 1, char* geoFilename = "geometry.root",
     
     while ( ( trackRef = static_cast<AliMUONTrack*>(next()) ) )
     {
+      maxChi2 = 999.;
       testTrack = 0;
       trackOK = 0x0;
       for (Int_t ch = 0; ch < AliMUONConstants::NTrackingCh(); ch++) 
@@ -128,31 +137,53 @@ void MUONRecoCheck (Int_t nEvent = 1, char* geoFilename = "geometry.root",
       
       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();
@@ -164,8 +195,8 @@ void MUONRecoCheck (Int_t nEvent = 1, char* geoFilename = "geometry.root",
         
         //     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();
@@ -178,8 +209,7 @@ void MUONRecoCheck (Int_t nEvent = 1, char* geoFilename = "geometry.root",
         
         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();
@@ -187,9 +217,8 @@ void MUONRecoCheck (Int_t nEvent = 1, char* geoFilename = "geometry.root",
         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();
@@ -197,17 +226,15 @@ void MUONRecoCheck (Int_t nEvent = 1, char* geoFilename = "geometry.root",
         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);
@@ -223,24 +250,18 @@ Int_t TrackCheck( Bool_t *compTrack)
   // 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;
   
 }
 
-
-
-
-
-
-