]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONTrackLight.cxx
Adding more bins in QA (Alis)
[u/mrichter/AliRoot.git] / MUON / AliMUONTrackLight.cxx
index 30bf752a88688245c2df8b6c630100d024ae4833..1dd51a4d858ee5b7e42565cf660a058325a17bd4 100644 (file)
 // (authors: H.Woehri, A.de Falco)
 //-----------------------------------------------------------------------------
 
+// 13 Nov 2007:
+// Added a temporary fix to FindRefTrack to be able to handle reconstructed tracks
+// generated from ESD muon track information. The problem is that the ESD data at
+// the moment only contains the first hit on chamber 1. Hopefully in the near future
+// this will be fixed and all hit information will be available.
+//  - Artur Szostak <artursz@iafrica.com>
+
 #include "AliMUONTrackLight.h"
 #include "AliMUONTrack.h"
 #include "AliMUONConstants.h"
+#include "AliMUONVTrackStore.h"
+#include "AliMUONTrackParam.h"
 
 #include "AliESDMuonTrack.h"
-#include "AliRunLoader.h"
 #include "AliStack.h"
-#include "AliHeader.h"
-#include "AliMUONTrackExtrap.h"
+#include "AliLog.h"
 
 #include "TDatabasePDG.h"
-#include "TClonesArray.h"
 #include "TParticle.h"
 #include "TString.h"
 
+#include <cstdio>
+
 ClassImp(AliMUONTrackLight) 
 
 //===================================================================
@@ -119,8 +127,16 @@ AliMUONTrackLight::AliMUONTrackLight(AliESDMuonTrack* muonTrack)
     fWeight(1)
 { 
   /// constructor
-  //AliMUONTrackLight(); 
-  FillFromESD(muonTrack); 
+  fPgen.SetPxPyPzE(0.,0.,0.,0.); 
+  for (Int_t npar = 0; npar < fgkNParentsMax; npar++){
+    fParentPDGCode[npar] = -1; 
+    fParentPythiaLine[npar] = -1;
+  }
+  for (Int_t i = 0; i < 4; i++){
+    fQuarkPDGCode[i] = -1; 
+    fQuarkPythiaLine[i] = -1; 
+  }
+  FillFromESD(muonTrack);
 }
 
 //============================================
@@ -129,20 +145,58 @@ AliMUONTrackLight::~AliMUONTrackLight()
 /// Destructor
 } 
 
+//============================================
+AliMUONTrackLight& AliMUONTrackLight::operator=(const AliMUONTrackLight& muonCopy)
+{
+  // check assignment to self
+  if (this == &muonCopy) return *this;
+
+  // base class assignment
+  TObject::operator=(muonCopy);
+
+  // assignment operator
+  fPrec = muonCopy.fPrec; 
+  fIsTriggered = muonCopy.fIsTriggered;
+  fCharge = muonCopy.fCharge; 
+  fChi2 = muonCopy.fChi2; 
+  fCentr = muonCopy.fCentr;
+  fPgen = muonCopy.fPgen; 
+  fTrackPythiaLine = muonCopy.fTrackPythiaLine;
+  fTrackPDGCode = muonCopy.fTrackPDGCode;
+  fOscillation = muonCopy.fOscillation; 
+  fNParents = muonCopy.fNParents;
+  fWeight = muonCopy.fWeight;
+  
+  for (Int_t i=0; i<3; i++) fXYZ[i]=muonCopy.fXYZ[i]; 
+  for (Int_t npar = 0; npar < fgkNParentsMax; npar++){
+    fParentPDGCode[npar] = muonCopy.fParentPDGCode[npar]; 
+    fParentPythiaLine[npar] = muonCopy.fParentPythiaLine[npar];
+  }
+  for (Int_t i = 0; i < 4; i++){
+    fQuarkPDGCode[i] = muonCopy.fQuarkPDGCode[i]; 
+    fQuarkPythiaLine[i] = muonCopy.fQuarkPythiaLine[i]; 
+  }
+
+  return *this;
+}    
+
 //============================================
 
 void AliMUONTrackLight::FillFromAliMUONTrack(AliMUONTrack *trackReco,Double_t zvert){
   /// this method sets the muon reconstructed momentum according to the value given by AliMUONTrack
-  AliMUONTrackParam trPar(*((AliMUONTrackParam*) (trackReco->GetTrackParamAtHit()->First())));
-  //  AliMUONTrackParam *trPar  = trackReco->GetTrackParamAtVertex();
-  AliMUONTrackExtrap::ExtrapToVertex(&trPar,0.,0.,0.);
-  this->SetCharge(Int_t(TMath::Sign(1.,trPar.GetInverseBendingMomentum())));
-  this->SetPxPyPz(trPar.Px(),trPar.Py(), trPar.Pz()); 
+  AliMUONTrackParam* trPar = trackReco->GetTrackParamAtVertex();
+  if (!trPar) {
+    AliError("The track must contain the parameters at vertex");
+    return;
+  }
+  this->SetCharge(Int_t(TMath::Sign(1.,trPar->GetInverseBendingMomentum())));
+  this->SetPxPyPz(trPar->Px(),trPar->Py(), trPar->Pz()); 
   this->SetTriggered(trackReco->GetMatchTrigger()); 
   
-  Double_t xyz[3] = { trPar.GetNonBendingCoor(), 
-                     trPar.GetBendingCoor(),
-                     zvert};
+  Double_t xyz[3] = { trPar->GetNonBendingCoor(), 
+                     trPar->GetBendingCoor(),
+                     trPar->GetZ()};
+  if (zvert!=-9999) xyz[2] = zvert;
   this->SetVertex(xyz); 
 }
 
@@ -179,64 +233,6 @@ void AliMUONTrackLight::SetPxPyPz(Double_t px, Double_t py, Double_t pz){
   fPrec.SetPxPyPzE(px,py,pz,energy);
 }
 
-//============================================
-TParticle* AliMUONTrackLight::FindRefTrack(AliMUONTrack* trackReco, TClonesArray* trackRefArray, AliRunLoader *runLoader){ 
-  /// find the MC particle that corresponds to a given rec track
-  TParticle *part = 0; 
-  const Double_t kSigma2Cut = 16;  // 4 sigmas cut, kSigma2Cut = 4*4
-  Int_t nTrackRef = trackRefArray->GetEntriesFast();
-  Int_t compPart = 0; 
-  for (Int_t iref = 0; iref < nTrackRef; iref++) {
-    AliMUONTrack *trackRef = (AliMUONTrack *)trackRefArray->At(iref);
-    // check if trackRef is compatible with trackReco:
-    //routine returns for each chamber a yes/no information if the
-    //hit of rec. track and hit of referenced track are compatible
-    Bool_t *compTrack = trackRef->CompatibleTrack(trackReco,kSigma2Cut);
-    Int_t iTrack = this->TrackCheck(compTrack); //returns number of validated conditions 
-    if (iTrack==4) { 
-      compPart++; 
-      Int_t trackID = trackRef->GetTrackID();
-      this->SetTrackPythiaLine(trackID);
-      part = ((AliStack *)(((AliHeader *) runLoader->GetHeader())->Stack()))->Particle(trackID);
-      fTrackPDGCode = part->GetPdgCode();
-    }
-  }
-  if (compPart>1) { 
-    printf ("<AliMUONTrackLight::FindRefTrack> ERROR: more than one particle compatible to the reconstructed track.\n"); 
-    Int_t i=0, j=1/i; 
-    printf ("j=%d \n",j); 
-  } 
-  return part; 
-}
-
-//============================================
-Int_t AliMUONTrackLight::TrackCheck(Bool_t *compTrack){
-  /// Apply reconstruction requirements
-  /// Return number of validated conditions 
-  /// If all the tests are verified then TrackCheck = 4 (good track)
-  Int_t iTrack = 0;
-  Int_t hitsInLastStations = 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
-  for (Int_t ch = 6; ch < AliMUONConstants::NTrackingCh(); ch++) {
-    if (compTrack[ch]) hitsInLastStations++; 
-  }
-  if (hitsInLastStations > 2) iTrack++; // at least 3 hits in st. 3 & 4
-  return iTrack;
-}
-
-//============================================
-void AliMUONTrackLight::FillMuonHistory(AliRunLoader *runLoader, TParticle *part){
-  /// scans the muon history to determine parents pdg code and pythia line
-  // kept for backward compatibility
-  // see the overloaded method FillMuonHistory(AliStack *stack, TParticle *part)
-  AliStack *stack = runLoader->GetHeader()->Stack();
-  FillMuonHistory(stack,part);
-}
-
 //============================================
 void AliMUONTrackLight::FillMuonHistory(AliStack *stack, TParticle *part){
   /// scans the muon history to determine parents pdg code and pythia line
@@ -288,8 +284,12 @@ void AliMUONTrackLight::FillMuonHistory(AliStack *stack, TParticle *part){
   if(this->GetQuarkPythiaLine(countP) > -1 && (this->GetParentFlavour(0)==4 || this->GetParentFlavour(0)==5)){
     if(this->GetParentFlavour(0) != TMath::Abs(this->GetQuarkPDGCode(countP))){
 
-      printf("quark flavour of parent and that of quark do not correspond: %d %d --> correcting\n", this->GetParentFlavour(0), TMath::Abs(this->GetQuarkPDGCode(countP)));
-      Int_t pdg = this->GetQuarkPDGCode(countP), line = this->GetQuarkPythiaLine(countP);
+      AliWarning(Form("quark flavour of parent and that of quark do not correspond: %d %d --> correcting\n",
+          this->GetParentFlavour(0), TMath::Abs(this->GetQuarkPDGCode(countP)))
+        );
+      
+      pdg = this->GetQuarkPDGCode(countP);
+      Int_t line = this->GetQuarkPythiaLine(countP);
       this->ResetQuarkInfo();
       while(TMath::Abs(pdg) != this->GetParentFlavour(0)){//pdg of q,g in Pythia listing following the wrong string end
                                                         //must coincide with the flavour of the last fragmented mother
@@ -352,7 +352,7 @@ Int_t AliMUONTrackLight::GetParentFlavour(Int_t idParent) const {
 }
 
 //====================================
-void AliMUONTrackLight::PrintInfo(Option_t* opt){
+void AliMUONTrackLight::PrintInfo(const Option_t* opt){
   /// prints information about the track: 
   /// - "H" muon's decay history
   /// - "K" muon kinematics
@@ -365,22 +365,22 @@ void AliMUONTrackLight::PrintInfo(Option_t* opt){
     TString pdg = "", line = "";
     for(int i = 3; i >= 0; i--){
       if(this->GetQuarkPythiaLine(i)>= 0){
-       sprintf(name, "%4d --> ", this->GetQuarkPythiaLine(i));
+       snprintf(name, 100, "%4d --> ", this->GetQuarkPythiaLine(i));
        line += name;
-       sprintf(name, "%4d --> ", this->GetQuarkPDGCode(i));
+       snprintf(name, 100, "%4d --> ", this->GetQuarkPDGCode(i));
        pdg += name;
       }
     }
     for(int i = 0; i < fNParents; i++){ 
       if(this->GetParentPythiaLine(i)>= 0){
-       sprintf(name, "%7d --> ", this->GetParentPythiaLine(i));
+       snprintf(name, 100, "%7d --> ", this->GetParentPythiaLine(i));
        line += name;
-       sprintf(name, "%7d --> ", this->GetParentPDGCode(i));
+       snprintf(name, 100, "%7d --> ", this->GetParentPDGCode(i));
        pdg += name;
       }
     }
-    sprintf(name, "%4d", this->GetTrackPythiaLine()); line += name;
-    sprintf(name, "%4d", this->GetTrackPDGCode()); pdg += name;
+    snprintf(name, 100, "%4d", this->GetTrackPythiaLine()); line += name;
+    snprintf(name, 100, "%4d", this->GetTrackPDGCode()); pdg += name;
 
     printf("\nmuon's decay history:\n");
     printf(" PDG: %s\n", pdg.Data());
@@ -417,7 +417,7 @@ Bool_t AliMUONTrackLight::IsParentPionOrKaon(Int_t idparent){
   else return kFALSE;
 }
 //====================================
-Bool_t AliMUONTrackLight::IsDiquark(Int_t pdg){
+Bool_t AliMUONTrackLight::IsDiquark(Int_t pdg) const{
   /// check if the provided pdg code corresponds to a diquark 
   pdg = TMath::Abs(pdg);
   if((pdg > 1000) && (pdg%100 < 10)) return kTRUE;