#include <cstdlib>
#include <TRandom.h>
-using std::vector;
-using std::deque;
-
const char* kPairClassNamesTG[7] = {
"unlike",
"like_pp",
fVemtmp(0x0),
fVeptmp(0x0),
fdconvphiv(acos(-1.0)),
+ fdconvMee(100),
fdop(0),
fbz(0),
- fdv0mixing(kTRUE)
+ fdv0mixing(kTRUE),
+ fBGRejUnlike(kFALSE),
+ fBGRejLike(kTRUE)
{
//
// Constructor
fVemtmp(0x0),
fVeptmp(0x0),
fdconvphiv(acos(-1.0)),
+ fdconvMee(100),
fdop(0),
fbz(0),
- fdv0mixing(kTRUE)
+ fdv0mixing(kTRUE),
+ fBGRejUnlike(kFALSE),
+ fBGRejLike(kTRUE)
{
//
// Constructor
die->SaveDebugTree();
AliDielectronMixingHandler *mix=die->GetMixingHandler();
// printf("\n\n\n===============\ncall mix in Terminate: %p (%p)\n=================\n\n",mix,die);
- if (mix) mix->MixRemaining(die);
+ if(!mix) continue;
+ for (Int_t ipool=0; ipool<mix->GetNumberOfBins(); ++ipool){
+ mix->MixRemaining(die, ipool);
+ }
}
PostData(1, &fListHistos);
PostData(2, &fListCF);
for(int i1=0; i1<(int)e1.size(); i1++){
reject = false;
for(int i2=i1+1; i2<(int)e1.size(); i2++){
- if( fabs(e1[i1]->Phi() - e1[i2]->Phi())<0.01 ){
+ if( fabs(e1[i1]->Phi() - e1[i2]->Phi())<0.01 &&
+ fabs(e1[i1]->Eta() - e1[i2]->Eta())<0.005
+ ){
reject = true;
e1[i2]->SetGstFlag(0);
}
}
}
+//_________________________________________________________________________________
+Bool_t AliAnalysisTaskMultiDielectronTG::CheckGhost(vector<AliDielectronSingleTG*> e1, vector<AliDielectronSingleTG*> e2)
+{
+ ////// To be sure whether there are no ghost pairs in h event mixing
+
+ if(e1.size()>0 && e2.size()>0){
+ for(int i1=0; i1<(int)e1.size(); i1++){
+ for(int i2=0; i2<(int)e2.size(); i2++){
+ if( fabs(e1[i1]->Phi() - e2[i2]->Phi())<0.01 &&
+ fabs(e1[i1]->Eta() - e2[i2]->Eta())<0.005
+ ){
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
//_________________________________________________________________________________
void AliAnalysisTaskMultiDielectronTG::RandomizePool(vector<AliDielectronSingleTG*> e1, vector<AliDielectronSingleTG*> e2)
{
nmixed = 0;
for(int ibuf=0;(nmixed<fgkNMix);ibuf++) {
int ntry = 0;
- while(ntry<fgkMAXTRY) {
+ while((fBGRejUnlike && CheckGhost(ve1, fvem[ibuf][idie][izbin][icent][irp])) && ntry<fgkMAXTRY) {
ReshuffleBuffer(fvem[ibuf][idie][izbin][icent][irp],fpoolm[idie][izbin][icent][irp]);
ntry++;
}
nmixed = 0;
for(int ibuf=0;(nmixed<fgkNMix);ibuf++) {
int ntry = 0;
- while(ntry<fgkMAXTRY) {
+ while((fBGRejUnlike && CheckGhost(ve2, fvep[ibuf][idie][izbin][icent][irp])) && ntry<fgkMAXTRY) {
ReshuffleBuffer(fvep[ibuf][idie][izbin][icent][irp],fpoolp[idie][izbin][icent][irp]);
ntry++;
}
nmixed = 0;
for(int ibuf=0;(nmixed<fgkNMix);ibuf++) {
int ntry = 0;
- while(ntry<fgkMAXTRY) {
+ while((fBGRejLike && CheckGhost(ve1, fvep[ibuf][idie][izbin][icent][irp])) && ntry<fgkMAXTRY) {
ReshuffleBuffer(fvep[ibuf][idie][izbin][icent][irp],fpoolp[idie][izbin][icent][irp]);
ntry++;
}
nmixed = 0;
for(int ibuf=0;(nmixed<fgkNMix);ibuf++) {
int ntry = 0;
- while(ntry<fgkMAXTRY) {
+ while((fBGRejLike && CheckGhost(ve2, fvem[ibuf][idie][izbin][icent][irp])) && ntry<fgkMAXTRY) {
ReshuffleBuffer(fvem[ibuf][idie][izbin][icent][irp],fpoolm[idie][izbin][icent][irp]);
ntry++;
}
Bool_t pairClass1=fHistos->GetHistogramList()->FindObject(className1.Data())!=0x0;
Bool_t pairClass2=fHistos->GetHistogramList()->FindObject(className2.Data())!=0x0;
- if (pairClass1 && PairTrackcut(dphiv, dcos, idie)==true){
+ if (pairClass1 && PairTrackcut(dphiv, dcos, dmass, idie)==true){
///import pair variables to values!!
values[AliDielectronVarManager::kPx] = dpxpair;
values[AliDielectronVarManager::kPy] = dpypair;
values[AliDielectronVarManager::kPhivPair] = dphiv;
values[AliDielectronVarManager::kPhi] = dphipair;
values[AliDielectronVarManager::kOpeningAngle] = dcos;
+ values[AliDielectronVarManager::kCosPointingAngle] = TMath::Abs(TMath::ATan2(TMath::Sin(iep->Phi()-iem->Phi()),TMath::Cos(iep->Phi()-iem->Phi())));
fHistos->FillClass(className1, AliDielectronVarManager::kNMaxValues, values);
}
- if (pairClass2 && PairTrackcut(dphiv, dopeningangle, idie)==true){
+ if (pairClass2 && PairTrackcut(dphiv, dopeningangle, dv0mass, idie)==true){
values[AliDielectronVarManager::kPx] = dv0pxpair;
values[AliDielectronVarManager::kPy] = dv0pypair;
values[AliDielectronVarManager::kPz] = dv0pzpair;
values[AliDielectronVarManager::kPhivPair] = dphivpair;
values[AliDielectronVarManager::kPhi] = dv0phipair;
values[AliDielectronVarManager::kOpeningAngle] = dopeningangle;
+ values[AliDielectronVarManager::kCosPointingAngle] = TMath::Abs(TMath::ATan2(TMath::Sin(iep->Phi()-iem->Phi()),TMath::Cos(iep->Phi()-iem->Phi())));
fHistos->FillClass(className2, AliDielectronVarManager::kNMaxValues, values);
}
}
//_________________________________________________________________________________
-bool AliAnalysisTaskMultiDielectronTG::PairTrackcut(double phiv, double op, int idie)
+bool AliAnalysisTaskMultiDielectronTG::PairTrackcut(double phiv, double op, double mass, int idie)
{
//
if(fRejectPairFlag[idie] == 1 || fRejectPairFlag[idie] == 2 ||
fRejectPairFlag[idie] == 3 || fRejectPairFlag[idie] == 4 ){
if(fRejectPairFlag[idie] == 2 || fRejectPairFlag[idie] == 4 ){
- if(fbz>0 && phiv>fdconvphiv){
+ if(fbz>0 && (phiv>fdconvphiv && mass < fdconvMee) ){
pairOK = false;
- }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv){
+ }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv && mass < fdconvMee){
pairOK = false;
}
}else if(fRejectPairFlag[idie] == 1 || fRejectPairFlag[idie] == 3){
+ sqrt(me*me+iem->Px()*iem->Px()+iem->Py()*iem->Py()+iem->Pz()*iem->Pz());
mass = e*e-px*px-py*py-pz*pz;
- if(mass<0){
- mass = mass;
- }else{
+ if(mass>=0){
mass = sqrt(mass);
}
}
}else if(fRejectPairFlag[idie]==2){
Double_t phiv = GetPhiv(e1[i1], e2[i2]);
- if(fbz>0 && phiv>fdconvphiv){
+ Double_t mee = GetMass(e1[i1], e2[i2]);
+ if(fbz>0 && ( phiv>fdconvphiv && mee < fdconvMee) ){
e1[i1]->SetConvFlag(0);
e2[i2]->SetConvFlag(0);
- }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv){
+ }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv && mee < fdconvMee){
e1[i1]->SetConvFlag(0);
e2[i2]->SetConvFlag(0);
}
}
}
}
-
if(e1.size()>0){
for(int i1=0; i1<(int)e1.size(); i1++){
for(int i2=i1+1; i2<(int)e1.size(); i2++){
}
}else if(fRejectPairFlag[idie]==2){
Double_t phiv = GetPhiv(e1[i1], e1[i2]);
- if(fbz>0 && phiv>fdconvphiv){
+ Double_t mee = GetMass(e1[i1], e1[i2]);
+ if(fbz>0 && phiv>fdconvphiv && mee < fdconvMee){
e1[i1]->SetConvFlag(0);
e1[i2]->SetConvFlag(0);
- }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv){
+ }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv && mee < fdconvMee){
e1[i1]->SetConvFlag(0);
e1[i2]->SetConvFlag(0);
}
}
}else if(fRejectPairFlag[idie]==2){
Double_t phiv = GetPhiv(e2[i1], e2[i2]);
- if(fbz>0 && phiv>fdconvphiv){
+ Double_t mee = GetMass(e2[i1], e2[i2]);
+ if(fbz>0 && phiv>fdconvphiv && mee < fdconvMee){
e2[i1]->SetConvFlag(0);
e2[i2]->SetConvFlag(0);
- }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv){
+ }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv && mee < fdconvMee){
e2[i1]->SetConvFlag(0);
e2[i2]->SetConvFlag(0);
}
Double_t AliAnalysisTaskMultiDielectronTG::GetPhiv(AliDielectronSingleTG* e1, AliDielectronSingleTG* e2){
//////////////////////
- //////// calculate pairs and get opening angle
+ //////// calculate pairs and get phiv
//////////////////////
double dmass, dphiv, dpxpair, dpypair, dpzpair;
return dphiv;
}
+
+//_________________________________________________________________________________
+Double_t AliAnalysisTaskMultiDielectronTG::GetMass(AliDielectronSingleTG* e1, AliDielectronSingleTG* e2){
+
+ //////////////////////
+ //////// calculate pairs and get mass
+ //////////////////////
+
+ double dmass, dphiv, dpxpair, dpypair, dpzpair;
+ double dptpair, depair, dphipair, detapair, dcos, dpsi;
+
+ CalcVars(e1, e2, dmass, dphiv, dpxpair, dpypair, dpzpair,
+ dptpair, depair, dphipair, detapair, dcos, dpsi);
+
+ return dmass;
+}