#include <TH2F.h>
#include <TH3F.h>
#include <TProfile.h>
+#include <TF1.h>
#include <TList.h>
#include <TLorentzVector.h>
#include <TClonesArray.h>
#include "AliESDEvent.h"
#include "AliAODEvent.h"
#include "AliAODHandler.h"
+#include "AliAODExtension.h"
#include "AliAODTrack.h"
#include "AliAODJet.h"
#include "AliAODMCParticle.h"
// get info on how fastjet was configured
#include "fastjet/config.h"
+using std::vector;
ClassImp(AliAnalysisTaskJetCluster)
AliAnalysisTaskJetCluster::~AliAnalysisTaskJetCluster(){
+ //
+ // Destructor
+ //
+
delete fRef;
delete fRandom;
if(fTCAJetsOut)fTCAJetsOut->Delete();
delete fTCAJetsOut;
+
if(fTCAJetsOutRan)fTCAJetsOutRan->Delete();
delete fTCAJetsOutRan;
+
if(fTCARandomConesOut)fTCARandomConesOut->Delete();
delete fTCARandomConesOut;
+
if(fTCARandomConesOutRan)fTCARandomConesOutRan->Delete();
delete fTCARandomConesOutRan;
+
if(fAODJetBackgroundOut)fAODJetBackgroundOut->Reset();
delete fAODJetBackgroundOut;
}
-AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(): AliAnalysisTaskSE(),
+AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster():
+ AliAnalysisTaskSE(),
fAOD(0x0),
fAODExtension(0x0),
fRef(new TRefArray),
fUseAODTrackInput(kFALSE),
fUseAODMCInput(kFALSE),
- fUseGlobalSelection(kFALSE),
fUseBackgroundCalc(kFALSE),
+ fEventSelection(kFALSE),
fFilterMask(0),
+ fFilterMaskBestPt(0),
+ fFilterType(0),
+ fJetTypes(kJet),
fTrackTypeRec(kTrackUndef),
fTrackTypeGen(kTrackUndef),
fNSkipLeadingRan(0),
+ fNSkipLeadingCone(0),
fNRandomCones(0),
fAvgTrials(1),
- fExternalWeight(1),
+ fExternalWeight(1),
+ fTrackEtaWindow(0.9),
fRecEtaWindow(0.5),
fTrackPtCut(0.),
- fJetOutputMinPt(1),
+ fJetOutputMinPt(0.150),
+ fMaxTrackPtInJet(100.),
fJetTriggerPtCut(0),
+ fVtxZCut(8),
+ fVtxR2Cut(1),
fCentCutUp(0),
fCentCutLo(0),
fNonStdBranch(""),
fBackgroundBranch(""),
fNonStdFile(""),
+ fMomResH1(0x0),
+ fMomResH2(0x0),
+ fMomResH3(0x0),
+ fMomResH1Fit(0x0),
+ fMomResH2Fit(0x0),
+ fMomResH3Fit(0x0),
+ fhEffH1(0x0),
+ fhEffH2(0x0),
+ fhEffH3(0x0),
+ fUseTrPtResolutionSmearing(kFALSE),
+ fUseDiceEfficiency(kFALSE),
+ fDiceEfficiencyMinPt(0.),
+ fUseTrPtResolutionFromOADB(kFALSE),
+ fUseTrEfficiencyFromOADB(kFALSE),
+ fPathTrPtResolution(""),
+ fPathTrEfficiency(""),
+ fChangeEfficiencyFraction(0.),
fRparam(1.0),
fAlgorithm(fastjet::kt_algorithm),
fStrategy(fastjet::Best),
fh2PtNchNRan(0x0),
fh2TracksLeadingJetPhiPtRan(0x0),
fh2TracksLeadingJetPhiPtWRan(0x0),
+ fh2PtGenPtSmeared(0x0),
+ fp1Efficiency(0x0),
+ fp1PtResolution(0x0),
fHistList(0x0)
{
+ //
+ // Constructor
+ //
+
for(int i = 0;i<3;i++){
fh1BiARandomCones[i] = 0;
fh1BiARandomConesRan[i] = 0;
fRef(new TRefArray),
fUseAODTrackInput(kFALSE),
fUseAODMCInput(kFALSE),
- fUseGlobalSelection(kFALSE),
fUseBackgroundCalc(kFALSE),
- fFilterMask(0),
+ fEventSelection(kFALSE), fFilterMask(0),
+ fFilterMaskBestPt(0),
+ fFilterType(0),
+ fJetTypes(kJet),
fTrackTypeRec(kTrackUndef),
fTrackTypeGen(kTrackUndef),
fNSkipLeadingRan(0),
+ fNSkipLeadingCone(0),
fNRandomCones(0),
fAvgTrials(1),
fExternalWeight(1),
+ fTrackEtaWindow(0.9),
fRecEtaWindow(0.5),
fTrackPtCut(0.),
- fJetOutputMinPt(1),
+ fJetOutputMinPt(0.150),
+ fMaxTrackPtInJet(100.),
fJetTriggerPtCut(0),
+ fVtxZCut(8),
+ fVtxR2Cut(1),
fCentCutUp(0),
fCentCutLo(0),
fNonStdBranch(""),
fBackgroundBranch(""),
fNonStdFile(""),
+ fMomResH1(0x0),
+ fMomResH2(0x0),
+ fMomResH3(0x0),
+ fMomResH1Fit(0x0),
+ fMomResH2Fit(0x0),
+ fMomResH3Fit(0x0),
+ fhEffH1(0x0),
+ fhEffH2(0x0),
+ fhEffH3(0x0),
+ fUseTrPtResolutionSmearing(kFALSE),
+ fUseDiceEfficiency(kFALSE),
+ fDiceEfficiencyMinPt(0.),
+ fUseTrPtResolutionFromOADB(kFALSE),
+ fUseTrEfficiencyFromOADB(kFALSE),
+ fPathTrPtResolution(""),
+ fPathTrEfficiency(""),
+ fChangeEfficiencyFraction(0.),
fRparam(1.0),
fAlgorithm(fastjet::kt_algorithm),
fStrategy(fastjet::Best),
fh2PtNchNRan(0x0),
fh2TracksLeadingJetPhiPtRan(0x0),
fh2TracksLeadingJetPhiPtWRan(0x0),
+ fh2PtGenPtSmeared(0x0),
+ fp1Efficiency(0x0),
+ fp1PtResolution(0x0),
fHistList(0x0)
{
+ //
+ // named ctor
+ //
+
for(int i = 0;i<3;i++){
fh1BiARandomCones[i] = 0;
fh1BiARandomConesRan[i] = 0;
// Create a new branch for jets...
// -> cleared in the UserExec....
// here we can also have the case that the brnaches are written to a separate file
+
+ if(fJetTypes&kJet){
+ fTCAJetsOut = new TClonesArray("AliAODJet", 0);
+ fTCAJetsOut->SetName(fNonStdBranch.Data());
+ AddAODBranch("TClonesArray",&fTCAJetsOut,fNonStdFile.Data());
+ }
- fTCAJetsOut = new TClonesArray("AliAODJet", 0);
- fTCAJetsOut->SetName(fNonStdBranch.Data());
- AddAODBranch("TClonesArray",&fTCAJetsOut,fNonStdFile.Data());
-
-
- fTCAJetsOutRan = new TClonesArray("AliAODJet", 0);
- fTCAJetsOutRan->SetName(Form("%s_%s",fNonStdBranch.Data(),"random"));
- AddAODBranch("TClonesArray",&fTCAJetsOutRan,fNonStdFile.Data());
+ if(fJetTypes&kJetRan){
+ fTCAJetsOutRan = new TClonesArray("AliAODJet", 0);
+ fTCAJetsOutRan->SetName(Form("%s_%s",fNonStdBranch.Data(),"random"));
+ if(fUseDiceEfficiency || fUseTrPtResolutionSmearing)
+ fTCAJetsOutRan->SetName(Form("%s_%sDetector%d%dFr%d",fNonStdBranch.Data(),"random",fUseTrPtResolutionSmearing,fUseDiceEfficiency,(int)(fChangeEfficiencyFraction*100.)));
+ AddAODBranch("TClonesArray",&fTCAJetsOutRan,fNonStdFile.Data());
+ }
if(fUseBackgroundCalc){
if(!AODEvent()->FindListObject(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data()))){
fAODJetBackgroundOut = new AliAODJetEventBackground();
fAODJetBackgroundOut->SetName(Form("%s_%s",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data()));
+ if(fUseDiceEfficiency || fUseTrPtResolutionSmearing)
+ fAODJetBackgroundOut->SetName(Form("%s_%sDetector%d%dFr%d",AliAODJetEventBackground::StdBranchName(),fNonStdBranch.Data(),fUseTrPtResolutionSmearing,fUseDiceEfficiency,(int)(fChangeEfficiencyFraction*100.)));
+
AddAODBranch("AliAODJetEventBackground",&fAODJetBackgroundOut,fNonStdFile.Data());
}
}
// create the branch for the random cones with the same R
- TString cName = Form("%sRandomCone",fNonStdBranch.Data());
+ TString cName = Form("%sRandomConeSkip%02d",fNonStdBranch.Data(),fNSkipLeadingCone);
+ if(fUseDiceEfficiency || fUseTrPtResolutionSmearing)
+ cName = Form("%sDetector%d%dFr%d_RandomConeSkip%02d",fNonStdBranch.Data(),fUseTrPtResolutionSmearing,fUseDiceEfficiency,(int)(fChangeEfficiencyFraction*100.),fNSkipLeadingCone);
if(fNRandomCones>0){
- if(!AODEvent()->FindListObject(cName.Data())){
- fTCARandomConesOut = new TClonesArray("AliAODJet", 0);
- fTCARandomConesOut->SetName(cName.Data());
- AddAODBranch("TClonesArray",&fTCARandomConesOut,fNonStdFile.Data());
+ if(fJetTypes&kRC){
+ if(!AODEvent()->FindListObject(cName.Data())){
+ fTCARandomConesOut = new TClonesArray("AliAODJet", 0);
+ fTCARandomConesOut->SetName(cName.Data());
+ AddAODBranch("TClonesArray",&fTCARandomConesOut,fNonStdFile.Data());
+ }
}
// create the branch with the random for the random cones on the random event
- cName = Form("%sRandomCone_random",fNonStdBranch.Data());
- if(!AODEvent()->FindListObject(cName.Data())){
- fTCARandomConesOutRan = new TClonesArray("AliAODJet", 0);
- fTCARandomConesOutRan->SetName(cName.Data());
- AddAODBranch("TClonesArray",&fTCARandomConesOutRan,fNonStdFile.Data());
+ if(fJetTypes&kRCRan){
+ cName = Form("%sRandomCone_random",fNonStdBranch.Data());
+ if(!AODEvent()->FindListObject(cName.Data())){
+ fTCARandomConesOutRan = new TClonesArray("AliAODJet", 0);
+ fTCARandomConesOutRan->SetName(cName.Data());
+ AddAODBranch("TClonesArray",&fTCARandomConesOutRan,fNonStdFile.Data());
+ }
}
}
if(!fHistList)fHistList = new TList();
fHistList->SetOwner();
-
+ PostData(1, fHistList); // post data in any case once
+
Bool_t oldStatus = TH1::AddDirectoryStatus();
TH1::AddDirectory(kFALSE);
//
// Histogram
- const Int_t nBinPt = 200;
+ const Int_t nBinPt = 100;
Double_t binLimitsPt[nBinPt+1];
for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
if(iPt == 0){
binLimitsPt[iPt] = 0.0;
}
else {// 1.0
- binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
+ binLimitsPt[iPt] = binLimitsPt[iPt-1] + 2.0;
}
}
}
}
- const int nChMax = 4000;
+ const int nChMax = 5000;
fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
fh1PtJetsLeadingRecInRan = new TH1F("fh1PtJetsLeadingRecInRan","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
fh1PtJetConstRec = new TH1F("fh1PtJetsConstRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
fh1PtJetConstLeadingRec = new TH1F("fh1PtJetsConstLeadingRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
- fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
- fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
- fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
+ fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn",Form("Rec tracks P_T #eta < %1.2f;p_{T} (GeV/c)",fTrackEtaWindow),nBinPt,binLimitsPt);
+ fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn",Form("Rec tracks P_T #eta < %1.2f ;p_{T} (GeV/c)",fTrackEtaWindow),nBinPt,binLimitsPt);
+ fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn",Form("gen tracks P_T #eta < %1.2f ;p_{T} (GeV/c)",fTrackEtaWindow),nBinPt,binLimitsPt);
fh1Nch = new TH1F("fh1Nch","charged multiplicity; N_{ch}",nChMax,-0.5,nChMax-0.5);
fh1Centrality = new TH1F("fh1Centrality",";cent (%)",111,-0.5,110.5);
fh2TracksLeadingJetPhiPtWRan = new TH2F("fh2TracksLeadingJetPhiPtWRan","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
+ //Detector level effects histos
+ fh2PtGenPtSmeared = new TH2F("fh2PtGenPtSmeared","fh2PtGenPtSmeared",nBinPt,binLimitsPt,nBinPt,binLimitsPt);
+
+ fp1Efficiency = new TProfile("fp1Efficiency","fp1Efficiency",nBinPt,binLimitsPt);
+ fp1PtResolution = new TProfile("fp1PtResolution","fp1PtResolution",nBinPt,binLimitsPt);
+
+ fHistList->Add(fh2PtGenPtSmeared);
+ fHistList->Add(fp1Efficiency);
+ fHistList->Add(fp1PtResolution);
if(fNRandomCones>0&&fUseBackgroundCalc){
for(int i = 0;i<3;i++){
TH1::AddDirectory(oldStatus);
}
-void AliAnalysisTaskJetCluster::Init()
+void AliAnalysisTaskJetCluster::LocalInit()
{
//
// Initialization
if (fDebug > 1) printf("AnalysisTaskJetCluster::Init() \n");
-}
+ if(fUseTrPtResolutionFromOADB) LoadTrPtResolutionRootFileFromOADB();
+ if(fUseTrEfficiencyFromOADB) LoadTrEfficiencyRootFileFromOADB();
-void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
-{
- if(fUseGlobalSelection){
- // no selection by the service task, we continue
- if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
- PostData(1, fHistList);
- return;
- }
+ FitMomentumResolution();
+}
+void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
+{
// handle and reset the output jet branch
AliAODJetEventBackground* externalBackground = 0;
if(!externalBackground&&fBackgroundBranch.Length()){
externalBackground = (AliAODJetEventBackground*)(AODEvent()->FindListObject(fBackgroundBranch.Data()));
+ if((!externalBackground)&&fAODExtension)externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
}
//
Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODTrackInput);
return;
}
- // fethc the header
+ // fetch the header
}
else{
// assume that the AOD is in the general output...
fESD = dynamic_cast<AliESDEvent*> (InputEvent());
}
}
+
+ //Check if information is provided detector level effects
+ if(!fMomResH1 || !fMomResH2 || !fMomResH3) fUseTrPtResolutionSmearing = kFALSE;
+ if(!fhEffH1 || !fhEffH2 || !fhEffH3) fUseDiceEfficiency = kFALSE;
Bool_t selectEvent = false;
Bool_t physicsSelection = true;// handled by the framework(fInputHandler->IsEventSelected()&AliVEvent::kMB)==AliVEvent::kMB;
fh1ZPhySel->Fill(zVtx);
}
-
- if(vtxAOD->GetNContributors()>2&&!vtxTitle.Contains("TPCVertex")){
+ if(fEventSelection){
+ if(vtxAOD->GetNContributors()>2&&!vtxTitle.Contains("TPCVertex")){
Float_t yvtx = vtxAOD->GetY();
Float_t xvtx = vtxAOD->GetX();
Float_t r2 = yvtx*yvtx+xvtx*xvtx;
- if(TMath::Abs(zVtx)<8.&&r2<1.){ // apply vertex cut later on
+ if(TMath::Abs(zVtx)<fVtxZCut&&r2<fVtxR2Cut){ // apply vertex cut later on
if(physicsSelection){
selectEvent = true;
}
}
- }
- if(fCentCutUp>0){
- if(cent<fCentCutLo||cent>fCentCutUp){
- selectEvent = false;
}
+ if(fCentCutUp>0){
+ if(cent<fCentCutLo||cent>fCentCutUp){
+ selectEvent = false;
+ }
+ }
+ }else{
+ selectEvent = true;
}
-
}
+
+
if(!selectEvent){
PostData(1, fHistList);
return;
AliAODJet vTmpRan(1,0,0,1);
for(int i = 0; i < recParticles.GetEntries(); i++){
AliVParticle *vp = (AliVParticle*)recParticles.At(i);
+
// Carefull energy is not well determined in real data, should not matter for p_T scheme?
// we take total momentum here
- fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->P());
- jInp.set_user_index(i);
- inputParticlesRec.push_back(jInp);
+
+ if((!fUseTrPtResolutionSmearing) && (!fUseDiceEfficiency)) {
+ //Add particles to fastjet in case we are not running toy model
+ fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->P());
+ jInp.set_user_index(i);
+ inputParticlesRec.push_back(jInp);
+ }
+ else if(fUseDiceEfficiency) {
+
+ // Dice to decide if particle is kept or not - toy model for efficiency
+ //
+ Double_t rnd = fRandom->Uniform(1.);
+ Double_t pT = vp->Pt();
+ Double_t eff[3] = {0.};
+ Double_t pTtmp = pT;
+ if(pT>10.) pTtmp = 10.;
+ Double_t eff1 = fhEffH1->GetBinContent(fhEffH1->FindBin(pTtmp));
+ Double_t eff2 = fhEffH2->GetBinContent(fhEffH2->FindBin(pTtmp));
+ Double_t eff3 = fhEffH3->GetBinContent(fhEffH3->FindBin(pTtmp));
+ Int_t cat[3] = {0};
+ //Sort efficiencies from large to small
+ if(eff1>eff2 && eff1>eff3) {
+ eff[0] = eff1;
+ cat[0] = 1;
+ if(eff2>eff3) {
+ eff[1] = eff2;
+ eff[2] = eff3;
+ cat[1] = 2;
+ cat[2] = 3;
+ } else {
+ eff[1] = eff3;
+ eff[2] = eff2;
+ cat[1] = 3;
+ cat[2] = 2;
+ }
+ }
+ else if(eff2>eff1 && eff2>eff3) {
+ eff[0] = eff2;
+ cat[0] = 2;
+ if(eff1>eff3) {
+ eff[1] = eff1;
+ eff[2] = eff3;
+ cat[1] = 1;
+ cat[2] = 3;
+ } else {
+ eff[1] = eff3;
+ eff[2] = eff1;
+ cat[1] = 3;
+ cat[2] = 1;
+ }
+ }
+ else if(eff3>eff1 && eff3>eff2) {
+ eff[0] = eff3;
+ cat[0] = 3;
+ if(eff1>eff2) {
+ eff[1] = eff1;
+ eff[2] = eff2;
+ cat[1] = 1;
+ cat[2] = 2;
+ } else {
+ eff[1] = eff2;
+ eff[2] = eff1;
+ cat[1] = 2;
+ cat[2] = 1;
+ }
+ }
+
+ Double_t sumEff = eff[0]+eff[1]+eff[2];
+ fp1Efficiency->Fill(vp->Pt(),sumEff);
+ if(rnd>sumEff && pT > fDiceEfficiencyMinPt) continue;
+
+ if(fUseTrPtResolutionSmearing) {
+ //Smear momentum of generated particle
+ Double_t smear = 1.;
+ //Select hybrid track category
+ if(rnd<=eff[2])
+ smear = GetMomentumSmearing(cat[2],pT);
+ else if(rnd<=(eff[2]+eff[1]))
+ smear = GetMomentumSmearing(cat[1],pT);
+ else
+ smear = GetMomentumSmearing(cat[0],pT);
+
+ fp1PtResolution->Fill(vp->Pt(),smear);
+
+ Double_t sigma = vp->Pt()*smear;
+ Double_t pTrec = fRandom->Gaus(vp->Pt(),sigma);
+
+ Double_t phi = vp->Phi();
+ Double_t theta = 2.*TMath::ATan(TMath::Exp(-1.*(vp->Eta())));
+ Double_t pX = pTrec * TMath::Cos(phi);
+ Double_t pY = pTrec * TMath::Sin(phi);
+ Double_t pZ = pTrec/TMath::Tan(theta);
+ Double_t p=TMath::Sqrt(pTrec*pTrec+pZ*pZ);
+
+ fh2PtGenPtSmeared->Fill(vp->Pt(),pTrec);
+
+ fastjet::PseudoJet jInp(pX,pY,pZ,p);
+ jInp.set_user_index(i);
+ inputParticlesRec.push_back(jInp);
+
+ }
+ else {
+ fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->P());
+ jInp.set_user_index(i);
+ inputParticlesRec.push_back(jInp);
+
+ }
+
+ }
// the randomized input changes eta and phi, but keeps the p_T
if(i>=fNSkipLeadingRan){// eventually skip the leading particles
Double_t pT = vp->Pt();
- Double_t eta = 1.8 * fRandom->Rndm() - 0.9;
+ Double_t eta = 2.*fTrackEtaWindow * fRandom->Rndm() - fTrackEtaWindow;
Double_t phi = 2.* TMath::Pi() * fRandom->Rndm();
Double_t theta = 2.*TMath::ATan(TMath::Exp(-eta));
if(fTCAJetsOut){
if(i == 0){
fRef->Delete(); // make sure to delete before placement new...
- new(fRef) TRefArray(TProcessID::GetProcessWithUID(vp));
+ if((!fUseTrPtResolutionSmearing) && (!fUseDiceEfficiency)) {
+ new(fRef) TRefArray(TProcessID::GetProcessWithUID(vp)); //TRefArray does not work with toy model ...
+ }
}
- fRef->Add(vp);
+ if((!fUseTrPtResolutionSmearing) && (!fUseDiceEfficiency)) fRef->Add(vp); //TRefArray does not work with toy model ...
}
}// recparticles
// now create the object that holds info about ghosts
+ /*
if(!fUseBackgroundCalc&& fNonStdBranch.Length()==0){
// reduce CPU time...
fGhostArea = 0.5;
fActiveAreaRepeats = 0;
}
-
- fastjet::GhostedAreaSpec ghostSpec(fGhostEtamax, fActiveAreaRepeats, fGhostArea);
+ */
+
+ fastjet::GhostedAreaSpec ghostSpec(fGhostEtamax, fActiveAreaRepeats, fGhostArea);
fastjet::AreaType areaType = fastjet::active_area;
fastjet::AreaDefinition areaDef = fastjet::AreaDefinition(areaType,ghostSpec);
fastjet::JetDefinition jetDef(fAlgorithm, fRparam, fRecombScheme, fStrategy);
- vector <fastjet::PseudoJet> inclusiveJets, sortedJets;
fastjet::ClusterSequenceArea clustSeq(inputParticlesRec, jetDef,areaDef);
//range where to compute background
fastjet::RangeDefinition range(rapMin,rapMax, phiMin, phiMax);
+ const vector <fastjet::PseudoJet> &inclusiveJets = clustSeq.inclusive_jets();
+ const vector <fastjet::PseudoJet> &sortedJets = sorted_by_pt(inclusiveJets);
- inclusiveJets = clustSeq.inclusive_jets();
- sortedJets = sorted_by_pt(inclusiveJets);
fh1NJetsRec->Fill(sortedJets.size());
Float_t pTback = 0;
if(externalBackground){
// carefull has to be filled in a task before
- // todo, ReArrange to the botom
- pTback = externalBackground->GetBackground(1)*leadingJet.EffectiveAreaCharged();
+ // todo, ReArrange to the botom
+ pTback = externalBackground->GetBackground(2)*leadingJet.EffectiveAreaCharged();
}
pt = leadingJet.Pt() - pTback;
// correlation of leading jet with tracks
if(tmpPt>fJetOutputMinPt&&fTCAJetsOut){// cut on the non-background subtracted...
aodOutJet = new ((*fTCAJetsOut)[nAodOutJets++]) AliAODJet(tmpRec);
+ aodOutJet->GetRefTracks()->Clear();
Double_t area1 = clustSeq.area(sortedJets[j]);
aodOutJet->SetEffArea(area1,0);
fastjet::PseudoJet vecarea=clustSeq.area_4vector(sortedJets[j]);
vecareab.SetPxPyPzE(vecarea.px(),vecarea.py(),vecarea.pz(),vecarea.e());
aodOutJet->SetVectorAreaCharged(&vecareab);
-
-
}
if(tmpPt<0)tmpPt = 0; // avoid negative weights...
fh1PtJetsRecIn->Fill(tmpPt);
- // Fill Spectra with constituents
- vector<fastjet::PseudoJet> constituents = clustSeq.constituents(sortedJets[j]);
+ // Fill Spectra with constituentsemacs
+ const vector<fastjet::PseudoJet> &constituents = clustSeq.constituents(sortedJets[j]);
fh1NConstRec->Fill(constituents.size());
fh2PtNch->Fill(nCh,tmpPt);
fh2PtNchN->Fill(nCh,tmpPt,constituents.size());
fh2NConstPt->Fill(tmpPt,constituents.size());
// loop over constiutents and fill spectrum
-
- for(unsigned int ic = 0; ic < constituents.size();ic++){
- AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
- fh1PtJetConstRec->Fill(part->Pt());
- if(aodOutJet){
- aodOutJet->AddTrack(fRef->At(constituents[ic].user_index()));
- }
- if(j==0)fh1PtJetConstLeadingRec->Fill(part->Pt());
- }
-
+
+ AliVParticle *partLead = 0;
+ Float_t ptLead = -1;
+
+ for(unsigned int ic = 0; ic < constituents.size();ic++){
+ AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
+ if(!part) continue;
+ fh1PtJetConstRec->Fill(part->Pt());
+ if(aodOutJet){
+ if((!fUseTrPtResolutionSmearing) && (!fUseDiceEfficiency)) aodOutJet->AddTrack(fRef->At(constituents[ic].user_index()));
+ if(part->Pt()>fMaxTrackPtInJet){
+ aodOutJet->SetTrigger(AliAODJet::kHighTrackPtTriggered);
+ }
+ }
+ if(part->Pt()>ptLead){
+ ptLead = part->Pt();
+ partLead = part;
+ }
+ if(j==0)fh1PtJetConstLeadingRec->Fill(part->Pt());
+ }
+ //set pT of leading constituent of jet
+ aodOutJet->SetPtLeading(partLead->Pt());
+
+ AliAODTrack *aodT = 0;
+ if(partLead){
+ aodT = dynamic_cast<AliAODTrack*>(partLead);
+ if(aodT){
+ if(aodT->TestFilterBit(fFilterMaskBestPt)){
+ aodOutJet->SetTrigger(AliAODJet::kHighTrackPtBest);
+ }
+ }
+ }
+
// correlation
Float_t tmpPhi = tmpRec.Phi();
Float_t tmpEta = tmpRec.Eta();
// Add the random cones...
if(fNRandomCones>0&&fTCARandomConesOut){
// create a random jet within the acceptance
- Double_t etaMax = 0.8 - fRparam;
+ Double_t etaMax = fTrackEtaWindow - fRparam;
Int_t nCone = 0;
Int_t nConeRan = 0;
Double_t pTC = 1; // small number
Double_t pC = TMath::Sqrt(pTC*pTC+pZC*pZC);
AliAODJet tmpRecC (pXC,pYC,pZC, pC);
bool skip = false;
- for(int jj = 0; jj < TMath::Min(nRec,2);jj++){// test for overlap with leading jets
+ for(int jj = 0; jj < TMath::Min(nRec,fNSkipLeadingCone);jj++){// test for overlap with leading jets
AliAODJet jet (sortedJets[jj].px(), sortedJets[jj].py(), sortedJets[jj].pz(), sortedJets[jj].E());
if(jet.DeltaR(& tmpRecC)<2.*fRparam+0.2){
skip = true;
}
if(skip)continue;
tmpRecC.SetBgEnergy(0,0); // this is use as temporary storage of the summed p_T below
- if(fTCARandomConesOut)new ((*fTCARandomConesOut)[nConeRan++]) AliAODJet(tmpRecC);
- if(fTCARandomConesOutRan)new ((*fTCARandomConesOutRan)[nCone++]) AliAODJet(tmpRecC);
+ tmpRecC.SetPtLeading(-1.);
+ if(fTCARandomConesOut)new ((*fTCARandomConesOut)[nCone++]) AliAODJet(tmpRecC);
+ if(fTCARandomConesOutRan)new ((*fTCARandomConesOutRan)[nConeRan++]) AliAODJet(tmpRecC);
}// loop over random cones creation
for(int ir = 0;ir < fNRandomCones;ir++){
AliAODJet *jC = (AliAODJet*)fTCARandomConesOut->At(ir);
if(jC&&jC->DeltaR(vp)<fRparam){
+ if(vp->Pt()>fMaxTrackPtInJet)jC->SetTrigger(AliAODJet::kHighTrackPtTriggered);
jC->SetBgEnergy(jC->ChargedBgEnergy()+vp->Pt(),0);
+ if(vp->Pt() > jC->GetPtLeading()) jC->SetPtLeading(vp->Pt());
}
}
}// add up energy in cone
-
+
// the randomized input changes eta and phi, but keeps the p_T
if(i>=fNSkipLeadingRan){// eventually skip the leading particles
Double_t pTR = vp->Pt();
- Double_t etaR = 1.8 * fRandom->Rndm() - 0.9;
+ Double_t etaR = 2.*fTrackEtaWindow* fRandom->Rndm() - fTrackEtaWindow;
Double_t phiR = 2.* TMath::Pi() * fRandom->Rndm();
Double_t thetaR = 2.*TMath::ATan(TMath::Exp(-etaR));
for(int ir = 0;ir < fTCARandomConesOutRan->GetEntriesFast();ir++){
AliAODJet *jC = (AliAODJet*)fTCARandomConesOutRan->At(ir);
if(jC&&jC->DeltaR(&vTmpRanR)<fRparam){
+ if(vTmpRanR.Pt()>fMaxTrackPtInJet)jC->SetTrigger(AliAODJet::kHighTrackPtTriggered);
jC->SetBgEnergy(jC->ChargedBgEnergy()+vTmpRanR.Pt(),0);
+ if(vTmpRanR.Pt() > jC->GetPtLeading()) jC->SetPtLeading(vTmpRanR.Pt());
}
}
}
Float_t jetArea = fRparam*fRparam*TMath::Pi();
if(fTCARandomConesOut){
for(int ir = 0;ir < fTCARandomConesOut->GetEntriesFast();ir++){
- // rescale the momntum vectors for the random cones
+ // rescale the momentum vectors for the random cones
AliAODJet *rC = (AliAODJet*)fTCARandomConesOut->At(ir);
if(rC){
Double_t phiC = rC->Phi();
// massless jet, unit vector
pTC = rC->ChargedBgEnergy();
- if(pTC<=0)pTC = 0.1; // for almost empty events
+ if(pTC<=0)pTC = 0.001; // for almost empty events
Double_t thetaC = 2.*TMath::ATan(TMath::Exp(-etaC));
Double_t pZC = pTC/TMath::Tan(thetaC);
Double_t pXC = pTC * TMath::Cos(phiC);
}
}
}
- if(!fTCARandomConesOutRan){
+ if(fTCARandomConesOutRan){
for(int ir = 0;ir < fTCARandomConesOutRan->GetEntriesFast();ir++){
AliAODJet* rC = (AliAODJet*)fTCARandomConesOutRan->At(ir);
// same wit random
Double_t phiC = rC->Phi();
// massless jet, unit vector
pTC = rC->ChargedBgEnergy();
- if(pTC<=0)pTC = 0.1;// for almost empty events
+ if(pTC<=0)pTC = 0.001;// for almost empty events
Double_t thetaC = 2.*TMath::ATan(TMath::Exp(-etaC));
Double_t pZC = pTC/TMath::Tan(thetaC);
Double_t pXC = pTC * TMath::Cos(phiC);
}
// find the random jets
- vector <fastjet::PseudoJet> inclusiveJetsRan, sortedJetsRan;
+
fastjet::ClusterSequenceArea clustSeqRan(inputParticlesRecRan, jetDef, areaDef);
- inclusiveJetsRan = clustSeqRan.inclusive_jets();
- sortedJetsRan = sorted_by_pt(inclusiveJetsRan);
-
// fill the jet information from random track
+ const vector <fastjet::PseudoJet> &inclusiveJetsRan = clustSeqRan.inclusive_jets();
+ const vector <fastjet::PseudoJet> &sortedJetsRan = sorted_by_pt(inclusiveJetsRan);
fh1NJetsRecRan->Fill(sortedJetsRan.size());
Float_t tmpPt = tmpRec.Pt();
fh1PtJetsRecInRan->Fill(tmpPt);
// Fill Spectra with constituents
- vector<fastjet::PseudoJet> constituents = clustSeqRan.constituents(sortedJetsRan[j]);
+ const vector<fastjet::PseudoJet> &constituents = clustSeqRan.constituents(sortedJetsRan[j]);
fh1NConstRecRan->Fill(constituents.size());
fh2NConstPtRan->Fill(tmpPt,constituents.size());
fh2PtNchRan->Fill(nCh,tmpPt);
if(tmpPt>fJetOutputMinPt&&fTCAJetsOutRan){
aodOutJetRan = new ((*fTCAJetsOutRan)[nAodOutJetsRan++]) AliAODJet(tmpRec);
Double_t arearan=clustSeqRan.area(sortedJetsRan[j]);
-
+ aodOutJetRan->GetRefTracks()->Clear();
aodOutJetRan->SetEffArea(arearan,0);
fastjet::PseudoJet vecarearan=clustSeqRan.area_4vector(sortedJetsRan[j]);
vecarearanb.SetPxPyPzE(vecarearan.px(),vecarearan.py(),vecarearan.pz(),vecarearan.e());
}
-
-
-
- for(unsigned int ic = 0; ic < constituents.size();ic++){
- // AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
- // fh1PtJetConstRec->Fill(part->Pt());
- if(aodOutJetRan){
- aodOutJetRan->AddTrack(fRef->At(constituents[ic].user_index()));
- }
- }
-
-
-
-
// correlation
Float_t tmpPhi = tmpRec.Phi();
if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
}
}
}
-
+
if(select){
static AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
fh1CentralitySelect->Fill(cent);
aodH->SetFillAOD(kTRUE);
}
}
-
- if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
+ if (fDebug > 2){
+ if(fTCAJetsOut)Printf("%s:%d Rec Jets %d",(char*)__FILE__,__LINE__,fTCAJetsOut->GetEntriesFast());
+ if(fTCAJetsOutRan)Printf("%s:%d Rec Jets Ran %d",(char*)__FILE__,__LINE__,fTCAJetsOutRan->GetEntriesFast());
+ if(fTCARandomConesOut)Printf("%s:%d RC %d",(char*)__FILE__,__LINE__,fTCARandomConesOut->GetEntriesFast());
+ if(fTCARandomConesOutRan)Printf("%s:%d RC Ran %d",(char*)__FILE__,__LINE__,fTCARandomConesOutRan->GetEntriesFast());
+ }
PostData(1, fHistList);
}
void AliAnalysisTaskJetCluster::Terminate(Option_t */*option*/)
{
-// Terminate analysis
-//
+ //
+ // Terminate analysis
+ //
if (fDebug > 1) printf("AnalysisJetCluster: Terminate() \n");
+
+ if(fMomResH1Fit) delete fMomResH1Fit;
+ if(fMomResH2Fit) delete fMomResH2Fit;
+ if(fMomResH3Fit) delete fMomResH3Fit;
+
}
Int_t AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
+ //
+ // get list of tracks/particles for different types
+ //
+
if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
Int_t iCount = 0;
if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
else aod = AODEvent();
if(!aod){
+ if(fDebug>2)Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
return iCount;
}
+
for(int it = 0;it < aod->GetNumberOfTracks();++it){
AliAODTrack *tr = aod->GetTrack(it);
- if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
- if(TMath::Abs(tr->Eta())>0.9)continue;
- if(tr->Pt()<fTrackPtCut)continue;
+ Bool_t bGood = false;
+ if(fFilterType == 0)bGood = true;
+ else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
+ else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
+ if((fFilterMask>0)&&((!tr->TestFilterBit(fFilterMask)||(!bGood)))){
+ if(fDebug>10)Printf("%s:%d Not matching filter %d/%d %d/%d",(char*)__FILE__,__LINE__,it,aod->GetNumberOfTracks(),fFilterMask,tr->GetFilterMap());
+ continue;
+ }
+ if(TMath::Abs(tr->Eta())>fTrackEtaWindow){
+ if(fDebug>10)Printf("%s:%d Not matching eta %d/%d",(char*)__FILE__,__LINE__,it,aod->GetNumberOfTracks());
+ continue;
+ }
+ if(tr->Pt()<fTrackPtCut){
+ if(fDebug>10)Printf("%s:%d Not matching pt %d/%d",(char*)__FILE__,__LINE__,it,aod->GetNumberOfTracks());
+ continue;
+ }
+ if(fDebug>10)Printf("%s:%d MATCHED %d/%d",(char*)__FILE__,__LINE__,it,aod->GetNumberOfTracks());
list->Add(tr);
iCount++;
}
AliAODTrack *trackAOD = dynamic_cast<AliAODTrack*> (track);
if(!trackAOD)continue;
+ Bool_t bGood = false;
+ if(fFilterType == 0)bGood = true;
+ else if(fFilterType == 1)bGood = trackAOD->IsHybridTPCConstrainedGlobal();
+ else if(fFilterType == 2)bGood = trackAOD->IsHybridGlobalConstrainedGlobal();
+ if((fFilterMask>0)&&((!trackAOD->TestFilterBit(fFilterMask)||(!bGood))))continue;
+ if(TMath::Abs(trackAOD->Eta())>fTrackEtaWindow) continue;
if(trackAOD->Pt()<fTrackPtCut) continue;
list->Add(trackAOD);
iCount++;
list->Add(part);
}
else {
- if(TMath::Abs(part->Eta())>0.9)continue;
+ if(TMath::Abs(part->Eta())>fTrackEtaWindow)continue;
list->Add(part);
}
iCount++;
return iCount;
}
+void AliAnalysisTaskJetCluster::LoadTrPtResolutionRootFileFromOADB() {
+
+ TFile *f = new TFile(fPathTrPtResolution.Data());
+
+ TProfile *fProfPtPtSigma1PtGlobSt = (TProfile*)f->Get("fProfPtPtSigma1PtGlobSt");
+ TProfile *fProfPtPtSigma1PtGlobCnoITS = (TProfile*)f->Get("fProfPtPtSigma1PtGlobCnoITS");
+ TProfile *fProfPtPtSigma1PtGlobCnoSPD = (TProfile*)f->Get("fProfPtPtSigma1PtGlobCnoSPD");
+
+ SetSmearResolution(kTRUE);
+ SetMomentumResolutionHybrid(fProfPtPtSigma1PtGlobSt,fProfPtPtSigma1PtGlobCnoITS,fProfPtPtSigma1PtGlobCnoSPD);
+
+
+ if(f) delete f;
+
+}
+
+void AliAnalysisTaskJetCluster::LoadTrEfficiencyRootFileFromOADB() {
+
+ TFile *f = new TFile(fPathTrEfficiency.Data());
+
+ TH1D *hEffPosGlobSt = (TH1D*)f->Get("hEffPosGlobSt");
+ TH1D *hEffPosGlobCnoITS = (TH1D*)f->Get("hEffPosGlobCnoITS");
+ TH1D *hEffPosGlobCnoSPD = (TH1D*)f->Get("hEffPosGlobCnoSPD");
+
+ SetDiceEfficiency(kTRUE);
+
+ if(fChangeEfficiencyFraction>0.) {
+
+ TH1D *hEffPosGlobStMin = (TH1D*)hEffPosGlobSt->Clone("hEffPosGlobStMin");
+
+ for(int bin=1; bin<=hEffPosGlobSt->GetNbinsX(); bin++) {
+ Double_t content = hEffPosGlobSt->GetBinContent(bin);
+ hEffPosGlobStMin->SetBinContent(bin,content-fChangeEfficiencyFraction);
+ }
+
+ SetEfficiencyHybrid(hEffPosGlobStMin,hEffPosGlobCnoITS,hEffPosGlobCnoSPD);
+
+ }
+ else
+ SetEfficiencyHybrid(hEffPosGlobSt,hEffPosGlobCnoITS,hEffPosGlobCnoSPD);
+
+ if(f) delete f;
+
+}
+
+void AliAnalysisTaskJetCluster::SetMomentumResolutionHybrid(TProfile *p1, TProfile *p2, TProfile *p3) {
+
+ //
+ // set mom res profiles
+ //
+
+ fMomResH1 = (TProfile*)p1->Clone("fMomResH1");
+ fMomResH2 = (TProfile*)p2->Clone("fMomResH2");
+ fMomResH3 = (TProfile*)p3->Clone("fMomResH3");
+}
+
+void AliAnalysisTaskJetCluster:: SetEfficiencyHybrid(TH1 *h1, TH1 *h2, TH1 *h3) {
+ //
+ // set tracking efficiency histos
+ //
+
+ fhEffH1 = (TH1*)h1->Clone("fhEffH1");
+ fhEffH2 = (TH1*)h2->Clone("fhEffH2");
+ fhEffH3 = (TH1*)h3->Clone("fhEffH3");
+}
+
+Double_t AliAnalysisTaskJetCluster::GetMomentumSmearing(Int_t cat, Double_t pt) {
+
+ //
+ // Get smearing on generated momentum
+ //
+
+ //printf("GetMomentumSmearing for cat %d and pt = %f \n",cat,pt);
+
+ TProfile *fMomRes = 0x0;
+ if(cat==1) fMomRes = (TProfile*)fMomResH1->Clone("fMomRes");
+ if(cat==2) fMomRes = (TProfile*)fMomResH2->Clone("fMomRes");
+ if(cat==3) fMomRes = (TProfile*)fMomResH3->Clone("fMomRes");
+
+ if(!fMomRes) {
+ return 0.;
+ }
+
+
+ Double_t smear = 0.;
+
+ if(pt>20.) {
+ if(cat==1 && fMomResH1Fit) smear = fMomResH1Fit->Eval(pt);
+ if(cat==2 && fMomResH2Fit) smear = fMomResH2Fit->Eval(pt);
+ if(cat==3 && fMomResH3Fit) smear = fMomResH3Fit->Eval(pt);
+ }
+ else {
+
+ Int_t bin = fMomRes->FindBin(pt);
+
+ smear = fRandom->Gaus(fMomRes->GetBinContent(bin),fMomRes->GetBinError(bin));
+
+ }
+
+ if(fMomRes) delete fMomRes;
+
+ return smear;
+}
+
+void AliAnalysisTaskJetCluster::FitMomentumResolution() {
+ //
+ // Fit linear function on momentum resolution at high pT
+ //
+
+ if(!fMomResH1Fit && fMomResH1) {
+ fMomResH1Fit = new TF1("fMomResH1Fit","[0]+[1]*x",0.,200.);
+ fMomResH1->Fit(fMomResH1Fit,"LL V0","",5.,30.);
+ fMomResH1Fit ->SetRange(5.,100.);
+ }
+
+ if(!fMomResH2Fit && fMomResH2) {
+ fMomResH2Fit = new TF1("fMomResH2Fit","[0]+[1]*x",0.,200.);
+ fMomResH2->Fit(fMomResH2Fit,"LL V0","",5.,30.);
+ fMomResH2Fit ->SetRange(5.,100.);
+ }
+
+ if(!fMomResH3Fit && fMomResH3) {
+ fMomResH3Fit = new TF1("fMomResH3Fit","[0]+[1]*x",0.,200.);
+ fMomResH3->Fit(fMomResH3Fit,"LL V0","",5.,30.);
+ fMomResH3Fit ->SetRange(5.,100.);
+ }
+
+}
+
/*
Int_t AliAnalysisTaskJetCluster::AddParticlesFastJet(TList &particles,vector<fastjet::PseudoJet> &inputParticles){
for(int i = 0; i < particles.GetEntries(); i++){