X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONTrackLight.cxx;h=1dd51a4d858ee5b7e42565cf660a058325a17bd4;hb=e742b9b00f6e8da7fdce797baf9a99a41d3fb407;hp=8ed53348da27372b09ca8194a5dbe7739cbc62ee;hpb=933daf4c46494345c305597119cfd3da8c168ec3;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONTrackLight.cxx b/MUON/AliMUONTrackLight.cxx index 8ed53348da2..1dd51a4d858 100644 --- a/MUON/AliMUONTrackLight.cxx +++ b/MUON/AliMUONTrackLight.cxx @@ -40,18 +40,18 @@ #include "AliMUONTrack.h" #include "AliMUONConstants.h" #include "AliMUONVTrackStore.h" -#include "AliMUONTrackExtrap.h" #include "AliMUONTrackParam.h" #include "AliESDMuonTrack.h" -#include "AliRunLoader.h" #include "AliStack.h" -#include "AliHeader.h" +#include "AliLog.h" #include "TDatabasePDG.h" #include "TParticle.h" #include "TString.h" +#include + ClassImp(AliMUONTrackLight) //=================================================================== @@ -127,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); } //============================================ @@ -137,23 +145,57 @@ 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; - if (trackReco->GetTrackParamAtVertex()) trPar = *(trackReco->GetTrackParamAtVertex()); - else { - trPar = *((AliMUONTrackParam*) trackReco->GetTrackParamAtCluster()->First()); - AliMUONTrackExtrap::ExtrapToVertex(&trPar,0.,0.,0.,0.,0.); + 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->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(), - trPar.GetZ()}; + Double_t xyz[3] = { trPar->GetNonBendingCoor(), + trPar->GetBendingCoor(), + trPar->GetZ()}; if (zvert!=-9999) xyz[2] = zvert; this->SetVertex(xyz); } @@ -191,81 +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, AliMUONVTrackStore* trackRefArray, - AliStack* stack) -{ - /// Find the Monte Carlo (MC) particle that corresponds to a given reconstructed track. - /// @param trackReco This is the reconstructed track for which we want to find a - /// corresponding MC particle. - /// @param trackRefArray The list of MC reference tracks as generated by - /// AliMUONRecoCheck::ReconstructedTracks for example. - /// @param stack The MC stack of simulated particles. - - TParticle *part = 0; - const Double_t kSigmaCut = 4; // 4 sigmas cut - Int_t compPart = 0; - Bool_t compTrack; - - TIter next(trackRefArray->CreateIterator()); - AliMUONTrack* trackRef; - while ( (trackRef = static_cast(next())) ) { - // check if trackRef is compatible with trackReco: - compTrack = kFALSE; - - if (trackReco->GetNClusters() > 1) { - - // check cluster by cluster if trackReco contain info at each cluster - Bool_t compTrackArray[10]; - trackRef->CompatibleTrack(trackReco,kSigmaCut,compTrackArray); - if (TrackCheck(compTrackArray) == 4) compTrack = kTRUE; - - } else { - - // otherwise 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, kSigmaCut, chi2)) compTrack = kTRUE; - - } - - if (compTrack) { - compPart++; - Int_t trackID = trackRef->GetTrackID(); - this->SetTrackPythiaLine(trackID); - part = stack->Particle(trackID); - fTrackPDGCode = part->GetPdgCode(); - } - } - if (compPart>1) { - AliFatal("More than one particle compatible with the reconstructed track."); - } - 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(AliStack *stack, TParticle *part){ /// scans the muon history to determine parents pdg code and pythia line @@ -385,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 @@ -398,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()); @@ -450,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;