#include <TMath.h>
#include <TObject.h>
-#include <AliESDEvent.h>
-#include <AliESDtrack.h>
#include <AliKFParticle.h>
#include <AliEventplane.h>
fPdgLeg2(11),
fSignalsMC(0x0),
fNoPairing(kFALSE),
+ fUseKF(kTRUE),
+ fHistoArray(0x0),
fHistos(0x0),
fPairCandidates(new TObjArray(11)),
fCfManagerPair(0x0),
fPdgLeg2(11),
fSignalsMC(0x0),
fNoPairing(kFALSE),
+ fUseKF(kTRUE),
+ fHistoArray(0x0),
fHistos(0x0),
fPairCandidates(new TObjArray(11)),
fCfManagerPair(0x0),
//
// Default destructor
//
+ if (fHistoArray) delete fHistoArray;
if (fHistos) delete fHistos;
if (fPairCandidates) delete fPairCandidates;
if (fDebugTree) delete fDebugTree;
if(fVZERORecenteringFilename.Contains(".root")) AliDielectronVarManager::SetVZERORecenteringFile(fVZERORecenteringFilename.Data());
if (fMixing) fMixing->Init(this);
+ if (fHistoArray) {
+ fHistoArray->SetSignalsMC(fSignalsMC);
+ fHistoArray->Init();
+ }
}
//________________________________________________________________
// TPC event plane correction
AliEventplane *cevplane = new AliEventplane();
- if (ev1 && fPreFilterEventPlane && ( fEventPlanePreFilter.GetCuts()->GetEntries()>0 || fEventPlanePOIPreFilter.GetCuts()->GetEntries()>0))
+ if (ev1 && cevplane && fPreFilterEventPlane && ( fEventPlanePreFilter.GetCuts()->GetEntries()>0 || fEventPlanePOIPreFilter.GetCuts()->GetEntries()>0))
EventPlanePreFilter(0, 1, fTracks[0], fTracks[1], ev1, cevplane);
-
+
if (!fNoPairing){
// create pairs and fill pair candidate arrays
for (Int_t itrackArr1=0; itrackArr1<4; ++itrackArr1){
}
//in case there is a histogram manager, fill the QA histograms
+ if (fHistos && fSignalsMC) FillMCHistograms(ev1);
if (fHistos) FillHistograms(ev1);
+
// clear arrays
if (!fDontClearArrays) ClearArrays();
AliDielectronVarManager::SetTPCEventPlane(0x0);
if(!fSignalsMC) return;
//loop over all MC data and Fill the CF container if it exist
- if (!fCfManagerPair) return;
- fCfManagerPair->SetPdgMother(fPdgMother);
- if(!fCfManagerPair->GetStepForMCtruth()) return;
+ if (!fCfManagerPair && !fHistoArray) return;
+ if(fCfManagerPair) fCfManagerPair->SetPdgMother(fPdgMother);
+
+ Bool_t bFillCF = (fCfManagerPair ? fCfManagerPair->GetStepForMCtruth() : kFALSE);
+ Bool_t bFillHF = (fHistoArray ? fHistoArray->GetStepForMCGenerated() : kFALSE);
+ if(!bFillCF && !bFillHF) return;
// signals to be studied
Int_t nSignals = fSignalsMC->GetEntries();
// mix the particles which satisfy only one of the signal branches
for(Int_t i1=0;i1<indexes1[isig];++i1) {
for(Int_t i2=0;i2<indexes2[isig];++i2) {
- fCfManagerPair->FillMC(labels1[isig][i1], labels2[isig][i2], isig);
+ if(bFillCF) fCfManagerPair->FillMC(labels1[isig][i1], labels2[isig][i2], isig);
+ if(bFillHF) fHistoArray->Fill(labels1[isig][i1], labels2[isig][i2], isig);
}
}
// mix the particles which satisfy both branches
for(Int_t i1=0;i1<indexes12[isig];++i1) {
for(Int_t i2=0; i2<i1; ++i2) {
- fCfManagerPair->FillMC(labels12[isig][i1], labels12[isig][i2], isig);
+ if(bFillCF) fCfManagerPair->FillMC(labels12[isig][i1], labels12[isig][i2], isig);
+ if(bFillHF) fHistoArray->Fill(labels12[isig][i1], labels12[isig][i2], isig);
}
}
} // end loop over signals
for (Int_t itrack=0; itrack<ntracks; ++itrack){
//get particle
AliVParticle *particle=ev->GetTrack(itrack);
- //TODO: temporary solution, perhaps think about a better implementation
- // This is needed to use AliESDpidCuts, which relies on the ESD event
- // is set as a AliESDtrack attribute... somehow ugly!
- if (ev->IsA()==AliESDEvent::Class()){
- AliESDtrack *track=static_cast<AliESDtrack*>(particle);
- track->SetESDEvent(static_cast<AliESDEvent*>(ev)); //only in trunk...
- }
//apply track cuts
if (fTrackFilter.IsSelected(particle)!=selectedMask) continue;
Int_t ntrack1=arrTracks1.GetEntriesFast();
Int_t ntrack2=arrTracks2.GetEntriesFast();
AliDielectronPair candidate;
+ candidate.SetKFUsage(fUseKF);
UInt_t selectedMask=(1<<fEventPlanePOIPreFilter.GetCuts()->GetEntries())-1;
for (Int_t itrack1=0; itrack1<ntrack1; ++itrack1){
Int_t ntrack1=arrTracks1.GetEntriesFast();
Int_t ntrack2=arrTracks2.GetEntriesFast();
AliDielectronPair candidate;
-
+ candidate.SetKFUsage(fUseKF);
// flag arrays for track removal
Bool_t *bTracks1 = new Bool_t[ntrack1];
for (Int_t itrack1=0; itrack1<ntrack1; ++itrack1) bTracks1[itrack1]=kFALSE;
Int_t ntrack2=arrTracks2.GetEntriesFast();
AliDielectronPair *candidate=new AliDielectronPair;
+ candidate->SetKFUsage(fUseKF);
UInt_t selectedMask=(1<<fPairFilter.GetCuts()->GetEntries())-1;
//CF manager for the pair
if (fCfManagerPair) fCfManagerPair->Fill(cutMask,candidate);
+ //histogram array for the pair
+ if (fHistoArray) fHistoArray->Fill(pairIndex,candidate);
//apply cut
if (cutMask!=selectedMask) continue;
PairArray(pairIndex)->Add(candidate);
//get a new candidate
candidate=new AliDielectronPair;
+ candidate->SetKFUsage(fUseKF);
}
}
//delete the surplus candidate
while ( fTrackRotator->NextCombination() ){
AliDielectronPair candidate;
+ candidate.SetKFUsage(fUseKF);
candidate.SetTracks(&fTrackRotator->GetKFTrackP(), &fTrackRotator->GetKFTrackN(),
fTrackRotator->GetVTrackP(),fTrackRotator->GetVTrackN());
candidate.SetType(kEv1PMRot);
//CF manager for the pair
if (fCfManagerPair) fCfManagerPair->Fill(cutMask,&candidate);
+ //histogram array for the pair
+ if (fHistoArray) fHistoArray->Fill((Int_t)kEv1PMRot,&candidate);
//apply cut
if (cutMask==selectedMask) {
}
fSignalsMC->Add(signal);
}
+//________________________________________________________________
+void AliDielectron::FillMCHistograms(const AliVEvent *ev) {
+ //
+ // fill QA MC histograms for pairs and legs of all added mc signals
+ //
+
+ if (!fSignalsMC) return;
+ TString className,className2;
+ Double_t values[AliDielectronVarManager::kNMaxValues]={0.};
+ AliDielectronVarManager::Fill(ev, values); // get event informations
+ //loop over all added mc signals
+ for(Int_t isig=0; isig<fSignalsMC->GetEntries(); isig++) {
+
+ className.Form("Pair_%s",fSignalsMC->At(isig)->GetName());
+ className2.Form("Track_Legs_%s",fSignalsMC->At(isig)->GetName());
+ Bool_t pairClass=fHistos->GetHistogramList()->FindObject(className.Data())!=0x0;
+ Bool_t legClass=fHistos->GetHistogramList()->FindObject(className2.Data())!=0x0;
+ if(!pairClass && !legClass) return;
+
+ Int_t ntracks=PairArray(AliDielectron::kEv1PM)->GetEntriesFast(); // only SE +-
+ for (Int_t ipair=0; ipair<ntracks; ++ipair){
+ AliDielectronPair *pair=static_cast<AliDielectronPair*>(PairArray(AliDielectron::kEv1PM)->UncheckedAt(ipair));
+
+ Bool_t isMCtruth = AliDielectronMC::Instance()->IsMCTruth(pair, (AliDielectronSignalMC*)fSignalsMC->At(isig));
+ if(isMCtruth) {
+ //fill pair information
+ if (pairClass){
+ AliDielectronVarManager::Fill(pair, values);
+ fHistos->FillClass(className, AliDielectronVarManager::kNMaxValues, values);
+ }
+ //fill leg information, both + and - in the same histo
+ if (legClass){
+ AliDielectronVarManager::Fill(pair->GetFirstDaughter(),values);
+ fHistos->FillClass(className2, AliDielectronVarManager::kNMaxValues, values);
+ AliDielectronVarManager::Fill(pair->GetSecondDaughter(),values);
+ fHistos->FillClass(className2, AliDielectronVarManager::kNMaxValues, values);
+ }
+ } //is signal
+ } //loop: pairs
+ } //loop: MCsignals
+
+}