recMuon2 = aodEv->GetTrack(jTrack);
AliAODDimuon *dimuon = new AliAODDimuon(recMuon1, recMuon2);
- if (dimuon->Charge()) continue;
+ if (dimuon->Charge()) {
+ delete dimuon;
+ continue;
+ }
// pt and mass all OS dimuons
fHistPtDimuonsOS -> Fill(dimuon->Pt());
fHistMassDimuonsOS -> Fill(dimuon->Mass());
+ delete dimuon;
+
// pt and mass J/psi dimuons
if (!isMuon1FromJpsi) continue;
if (recMuon2->GetLabel() >= 0) {
mcMuon2 = (AliAODMCParticle*) stackMC->At(recMuon2->GetLabel());
if (mcMuon2) {
if (mcMuon2->GetMother() == mcMuon1->GetMother()) {
- AliAODDimuon *dimuon = new AliAODDimuon;
- dimuon->SetMuons(recMuon1,recMuon2);
+ AliAODDimuon *dimuonJpsi = new AliAODDimuon;
+ dimuonJpsi->SetMuons(recMuon1,recMuon2);
Double_t pca[3]={0};
Double_t pcaQuality=0;
TLorentzVector kinem(0,0,0,0);
- if (!AliMFTAnalysisTools::CalculatePCA(dimuon, pca, pcaQuality, kinem)) continue;
+ if (!AliMFTAnalysisTools::CalculatePCA(dimuonJpsi, pca, pcaQuality, kinem)) {
+ delete dimuonJpsi;
+ continue;
+ }
fHistPtDimuonsJpsi -> Fill(kinem.Pt());
fHistMassDimuonsJpsi -> Fill(kinem.M());
fHistResidualXVtxJpsi -> Fill(1.e4*(pca[0] - fPrimaryVertex[0]));
fHistResidualYVtxJpsi -> Fill(1.e4*(pca[1] - fPrimaryVertex[1]));
fHistResidualZVtxJpsi -> Fill(1.e4*(pca[2] - fPrimaryVertex[2]));
- delete dimuon;
+ delete dimuonJpsi;
}
}
}
// We look for the above-defined PCA
- Double_t xPCA=0, yPCA=0, zPCA=0;
-
AliMUONTrackParam *param = new AliMUONTrackParam();
param -> SetNonBendingCoor(muon->XAtDCA());
param -> SetBendingCoor(muon->YAtDCA());
//====================================================================================================================================================
+Bool_t AliMFTAnalysisTools::IsCorrectMatch(AliAODTrack *muon) {
+
+ for (Int_t iPlane=0; iPlane<AliMFTConstants::fNMaxPlanes; iPlane++) if (IsWrongCluster(muon, iPlane)) return kFALSE;
+ return kTRUE;
+
+}
+
+//====================================================================================================================================================
+
+TString AliMFTAnalysisTools::GetGenerator(Int_t label, AliAODMCHeader* header) {
+
+ // get the name of the generator that produced a given particle
+
+ Int_t partCounter = 0;
+ TList *genHeaders = header->GetCocktailHeaders();
+ Int_t nGenHeaders = genHeaders->GetEntries();
+
+ for (Int_t i=0; i<nGenHeaders; i++){
+ AliGenEventHeader *gh = (AliGenEventHeader*) genHeaders->At(i);
+ TString genName = gh->GetName();
+ Int_t nPart = gh->NProduced();
+ if (label>=partCounter && label<(partCounter+nPart)) return genName;
+ partCounter += nPart;
+ }
+
+ TString empty="";
+ return empty;
+
+}
+
+//====================================================================================================================================================
+
+void AliMFTAnalysisTools::GetTrackPrimaryGenerator(AliAODTrack *track, AliAODMCHeader *header, TClonesArray *arrayMC, TString &nameGen) {
+
+ // method to check if a track comes from a given generator
+
+ Int_t label = TMath::Abs(track->GetLabel());
+ nameGen = GetGenerator(label,header);
+
+ // In case the particle is not primary nameGen will contain blank spaces. In this case, we search backward for the primary which originated the chain
+
+ while (nameGen.IsWhitespace()) {
+ AliAODMCParticle *mcPart = (AliAODMCParticle*) arrayMC->At(label);
+ if (!mcPart) {
+ printf("AliMFTAnalysisTools::GetTrackPrimaryGenerator - BREAK: No valid AliAODMCParticle at label %i\n",label);
+ break;
+ }
+ Int_t motherLabel = mcPart->GetMother();
+ if (motherLabel < 0) {
+ printf("AliMFTAnalysisTools::GetTrackPrimaryGenerator - BREAK: Reached primary particle without valid mother\n");
+ break;
+ }
+ label = motherLabel;
+ nameGen = GetGenerator(label,header);
+ }
+
+ return;
+
+}
+
+//====================================================================================================================================================
+
+Bool_t AliMFTAnalysisTools::IsTrackInjected(AliAODTrack *track, AliAODMCHeader *header, TClonesArray *arrayMC){
+
+ // method to check if a track comes from the signal event or from the underlying Hijing event
+
+ TString nameGen;
+
+ GetTrackPrimaryGenerator(track,header,arrayMC,nameGen);
+
+ if (nameGen.IsWhitespace() || nameGen.Contains("ijing")) return kFALSE;
+
+ return kTRUE;
+}
+
+//====================================================================================================================================================
+
#include "AliLog.h"
#include "TMatrixD.h"
#include "TClonesArray.h"
+#include "AliAODMCHeader.h"
+#include "AliGenEventHeader.h"
+#include "AliAODMCParticle.h"
//====================================================================================================================================================
else return !(muon->GetMFTClusterPattern() & (1<<(iPlane+AliMFTConstants::fNMaxPlanes)));
}
+ static Bool_t IsCorrectMatch(AliAODTrack *muon);
+
+ static TString GetGenerator(Int_t label, AliAODMCHeader* header);
+ static void GetTrackPrimaryGenerator(AliAODTrack *track, AliAODMCHeader *header, TClonesArray *arrayMC, TString &nameGen);
+ static Bool_t IsTrackInjected(AliAODTrack *track, AliAODMCHeader *header, TClonesArray *arrayMC);
+
static void ConvertCovMatrixMUON2AOD(const TMatrixD& covMUON, Double_t covAOD[21]);
static const TMatrixD ConvertCovMatrixAOD2MUON(AliAODTrack *muon);
cnv->Draw();
TH2D *h = new TH2D("tmp", GetName(),
- 1, fZCenter-0.5, fZCenter+0.5,
+ 1, fZCenter-1.1*(0.5*fThicknessSupport+fThicknessActive), fZCenter+1.1*(0.5*fThicknessSupport+fThicknessActive),
1, 1.1*GetSupportElement(0)->GetAxis(1)->GetXmin(), 1.1*GetSupportElement(0)->GetAxis(1)->GetXmax());
h->SetXTitle("z [cm]");
h->SetYTitle("y [cm]");