fReader->SetEvent(fEVT);
// get global event pars and apply global cuts
+ if(!fSelector->SelectedEvtTrigger(fEVT)) return;
Float_t cent = fReader->GetMultiplicity(); // use multiplicity in p-p
Float_t zvtx = fReader->GetVertex();
Int_t cBin = fSelector->GetBin(centr,cent);
exit(-1);
}
if(IsESDEvt(fEVT)){
- Double_t v[3];
- ((AliESDEvent*)fEVT)->GetVertex()->GetXYZ(v);
- return v[2];
+ return ((AliESDEvent*)fEVT)->GetPrimaryVertex()->GetZ();
+// Double_t v[3];
+// ((AliESDEvent*)fEVT)->GetVertex()->GetXYZ(v);
+// return v[2];
} else {
return ((AliAODEvent*)fEVT)->GetVertex(0)->GetZ();
}
ClassImp(AliJetCorrelSelector)
AliJetCorrelSelector::AliJetCorrelSelector() :
- fNumCorrel(0), fPoolDepth(0), fCorrelType(NULL), fGenQA(kFALSE),
+ fGenQA(kFALSE), fNumCorrel(0), nEvtTriggs(0), fPoolDepth(0), fCorrelType(NULL), fEvtTriggs(NULL),
minTriggPt(0), maxTriggPt(0), bwTriggPt(0), minAssocPt(0), maxAssocPt(0), bwAssocPt(0),
- fITSRefit(kFALSE), fTPCRefit(kFALSE), fTRDRefit(kFALSE), fRejectKinkChild(kFALSE),
- fMaxNsigmaVtx(0), fMaxITSChi2(0), fMaxTPCChi2(0), fMinNClusITS(0), fMinNClusTPC(0) {
+ fITSRefit(kFALSE), fTPCRefit(kFALSE), fTRDRefit(kFALSE), fRejectKinkChild(kFALSE), fMaxEta(0),
+ fMaxNsigmaVtx(0), fMaxTrkVtx(0), fMaxITSChi2(0), fMaxTPCChi2(0), fMinNClusITS(0), fMinNClusTPC(0), trkMinProx(0) {
// (default) constructor
fNumBins[centr] = 0; fBinning[centr] = NULL;
fNumBins[zvert] = 0; fBinning[zvert] = NULL;
// destructor
if(fCorrelType) delete [] fCorrelType;
fNumCorrel = 0;
+ if(fEvtTriggs) delete [] fEvtTriggs;
+ nEvtTriggs = 0;
if(fBinning[centr]) delete [] fBinning[centr];
fNumBins[centr] = 0;
if(fBinning[zvert]) delete [] fBinning[zvert];
}
}
+void AliJetCorrelSelector::SetTriggers(UInt_t s, TString * const v){
+ // fills the array of event triggers
+ if(s<1){std::cerr<<"AliJetCorrelSelector::SetTriggers - empty array"<<std::endl; exit(-1);}
+ if(s>9){std::cerr<<"AliJetCorrelSelector: event trigger array too big!"<<std::endl; exit(-1);}
+ nEvtTriggs = s;
+ fEvtTriggs = new TString[nEvtTriggs];
+ for(UInt_t k=0; k<nEvtTriggs; k++){
+ if(!v[k].IsAscii()){
+ std::cerr<<"AliJetCorrelSelector::SetTriggers - read error? val["<<k<<"]="<<v[k]<<std::endl;
+ exit(-1);
+ }
+ else fEvtTriggs[k] = ToUpper(v[k]);
+ }
+}
+
+
void AliJetCorrelSelector::SetBinningCentr(UInt_t s, Float_t * const v){
// fills array of centrality bins
if(s<1){std::cerr<<"AliJetCorrelSelector::SetBinningCentr - empty array"<<std::endl; exit(-1);}
std::cout<<"Generic selections: "<<std::endl<<" PoolDepth="<<fPoolDepth;
std::cout<<std::endl<<" Correlation Types: ";
for(UInt_t k=0; k<fNumCorrel; k++) std::cout<<fCorrelType[k]<<" ";
+ std::cout<<std::endl<<" Event Triggers: ";
+ for(UInt_t k=0; k<nEvtTriggs; k++) std::cout<<fEvtTriggs[k]<<" ";
std::cout<<std::endl<<" Centrality/Multiplicity binning: ";
for(UInt_t k=0; k<fNumBins[centr]; k++) std::cout<<fBinning[centr][k]<<" ";
std::cout<<std::endl<<" Vertex binning: ";
for(UInt_t k=0; k<fNumBins[zvert]; k++) std::cout<<fBinning[zvert][k]<<" ";
std::cout<<std::endl<<" Trigg binning:"<<minTriggPt<<"->"<<maxTriggPt<<"/"<<bwTriggPt;
std::cout<<std::endl<<" Assoc binning:"<<minAssocPt<<"->"<<maxAssocPt<<"/"<<bwAssocPt;
- std::cout<<std::endl<<"Track selections: "<<std::endl<<" MaxNsigmaVtx="<<fMaxNsigmaVtx<<std::endl
+ std::cout<<std::endl<<"Track selections: "<<std::endl
+ <<" MaxEta="<<fMaxEta<<" MaxTrkVtx="<<fMaxTrkVtx<<" MaxNsigmaVtx="<<fMaxNsigmaVtx<<std::endl
<<" MaxITSChi2="<<fMaxITSChi2<<" MaxTPCChi2="<<fMaxTPCChi2<<std::endl
<<" MinNClusITS="<<fMinNClusITS<<" MinNClusTPC="<<fMinNClusTPC<<std::endl
<<" ITSRefit="<<fITSRefit<<" TPCRefit="<<fTPCRefit<<" TRDRefit="<<fTRDRefit<<std::endl
- <<" RejectKinkChild="<<fRejectKinkChild<<std::endl;
+ <<" RejectKinkChild="<<fRejectKinkChild<<" minTrackPairTPCDist="<<trkMinProx<<std::endl;
}
Float_t AliJetCorrelSelector::BinBorder(BinType_t cType, UInt_t k){
// returns bin margins
if(k<=NoOfBins(cType)) return fBinning[cType][k];
- else {std::cerr<<"BinBorder Error: bin of type "<<cType<<" outside range "<<k<<std::endl; exit(0);}
+ else {std::cerr<<"BinBorder Error: bin of type "<<cType<<" outside range "<<k<<std::endl; exit(0);}
}
Int_t AliJetCorrelSelector::GetBin(BinType_t cType, Float_t val){
// Cutting Methods
/////////////////////////////////////////////////////////
-Bool_t AliJetCorrelSelector::GoodTrackPair(CorrelTrack_t *t1, CorrelTrack_t *t2){
- // meant for two-track cuts (like TPC entrance); but hopes are that single-track cuts,
- // like a high no of TPC clusters, will avoid double counting of split tracks...
- t1->Show(); t2->Show();
+Bool_t AliJetCorrelSelector::SelectedEvtTrigger(AliVEvent *fEVT){
+ // matches the event trigger classes with the user trigger classes
+ if(fEVT->InheritsFrom("AliESDEvent")){
+ const AliESDEvent *esd = (AliESDEvent*)fEVT;
+ TString trigClass = esd->GetFiredTriggerClasses();
+ if(nEvtTriggs==1 && fEvtTriggs[0].Contains("ALL")) return kTRUE;
+ for(UInt_t k=0; k<nEvtTriggs; k++)
+ if(trigClass.Contains(fEvtTriggs[k])) return kTRUE;
+ return kFALSE;
+ } else {std::cerr<<"AliJetCorrelSelector::SelectedEvtTrigger ERROR: not an ESD event!"<<std::endl; exit(0);}
+}
+
+Bool_t AliJetCorrelSelector::CloseTrackPair(Float_t dist){
+ // applies two-track cut (dist at TPC entrance); it is possible that single-track cuts,
+ // like fraction of shared TPC clusters, will avoid inclusion of split tracks...
+ if(dist>trkMinProx) return kFALSE;
return kTRUE;
}
Bool_t AliJetCorrelSelector::LowQualityTrack(AliESDtrack* track){
// selects low quality tracks
+ if(track->Eta()>fMaxEta) return kTRUE;
UInt_t status = track->GetStatus();
if(fITSRefit && !(status & AliESDtrack::kITSrefit)) return kTRUE;
if(fTPCRefit && !(status & AliESDtrack::kTPCrefit)) return kTRUE;
- UInt_t nClusITS = track->GetITSclusters(0);
+// UInt_t nClusITS = track->GetITSclusters(0);
+// if(nClusITS<fMinNClusITS) return kTRUE;
+// Float_t chi2ITS=-1.;
+// if(nClusITS!=0) chi2ITS = track->GetITSchi2()/Float_t(nClusITS);
+// if(chi2ITS<0 || chi2ITS>fMaxITSChi2) return kTRUE;
+
UInt_t nClusTPC = track->GetTPCclusters(0); // or track->GetTPCNcls() ?
- if(nClusITS<fMinNClusITS) return kTRUE;
if(nClusTPC<fMinNClusTPC) return kTRUE;
-
- Float_t chi2ITS=-1., chi2TPC=-1.;
- if(nClusITS!=0) chi2ITS = track->GetITSchi2()/Float_t(nClusITS);
+ Float_t chi2TPC=-1.;
if(nClusTPC!=0) chi2TPC = track->GetTPCchi2()/Float_t(nClusTPC);
- if(chi2ITS<0 || chi2ITS>fMaxITSChi2) return kTRUE;
if(chi2TPC<0 || chi2TPC>fMaxTPCChi2) return kTRUE;
if(fRejectKinkChild && track->GetKinkIndex(0)>0) return kTRUE;
- if(GetSigmaToVertex(track)>fMaxNsigmaVtx) return kTRUE;
+// Float_t sigTrkVtx = GetSigmaToVertex(track);
+// if(sigTrkVtx<0 || sigTrkVtx>fMaxNsigmaVtx) return kTRUE;
+ // instead of track-vertex DCA sigma cut, apply value-cut:
+ Float_t b[2], bCov[3];
+ track->GetImpactParameters(b,bCov);
+ if((b[0]*b[0]+b[1]*b[1])>(fMaxTrkVtx*fMaxTrkVtx)) return kTRUE;
return kFALSE;
}
void SetBinningZvert(UInt_t s, Float_t * const v);
void SetBinningTrigg(Float_t min, Float_t max, Float_t bw);
void SetBinningAssoc(Float_t min, Float_t max, Float_t bw);
+ void SetTriggers(UInt_t s, TString * const v);
void SetITSRefit(Bool_t v) {fITSRefit=v;}
void SetTPCRefit(Bool_t v) {fTPCRefit=v;}
void SetTRDRefit(Bool_t v) {fTRDRefit=v;}
+ void SetMaxEta(Float_t v) {fMaxEta=v;}
void SetMaxITSChi2(Float_t v) {fMaxITSChi2=v;}
void SetMaxTPCChi2(Float_t v) {fMaxTPCChi2=v;}
void SetMinNClusITS(UInt_t v) {fMinNClusITS=v;}
void SetMinNClusTPC(UInt_t v) {fMinNClusTPC=v;}
void SetMaxNsigmaVtx(Float_t v) {fMaxNsigmaVtx=v;}
+ void SetMaxTrkVtx(Float_t v) {fMaxTrkVtx=v;}
void SetRejectKinkChild(Bool_t v) {fRejectKinkChild=v;}
void SetQA(Bool_t v) {fGenQA=v;}
+ void SetTrkProximityCut(Float_t v) {trkMinProx=v;}
// Cutting methods:
Bool_t IsAssoc(Float_t pT) {return (pT>=minAssocPt && pT<=maxAssocPt);}
Bool_t IsTrigg(Float_t pT) {return (pT>=minTriggPt && pT<=maxTriggPt);}
- Bool_t GoodTrackPair(CorrelTrack_t* t1, CorrelTrack_t* t2);
+ Bool_t SelectedEvtTrigger(AliVEvent * const fEVT);
+ Bool_t CloseTrackPair(Float_t dist);
Bool_t LowQualityTrack(AliESDtrack* t);
Bool_t PassPID(AliESDtrack* t, PartType_t pType);
Float_t GetSigmaToVertex(AliESDtrack* trk);
private:
// Generic Selections:
- UInt_t fNumCorrel, fPoolDepth; // number of correlations, pool depth
+ Bool_t fGenQA; // generate QA histos
+ UInt_t fNumCorrel, nEvtTriggs, fPoolDepth; // number of correlations, event triggers, pool depth
UInt_t *fCorrelType; // array of correlation types
+ TString *fEvtTriggs; // array of event triggers
UInt_t fNumBins[2]; // number of bins: centr, zvert
Float_t* fBinning[2]; // bin margins: centr, zvert
- Bool_t fGenQA; // generate QA histos
Float_t minTriggPt, maxTriggPt, bwTriggPt; // trigg Pt binning
Float_t minAssocPt, maxAssocPt, bwAssocPt; // assoc Pt binning
// Track Selections:
Bool_t fITSRefit, fTPCRefit, fTRDRefit, fRejectKinkChild; // on/off cuts
- Float_t fMaxNsigmaVtx;
- Float_t fMaxITSChi2, fMaxTPCChi2;
- UInt_t fMinNClusITS, fMinNClusTPC;
+ Float_t fMaxEta; // single-particle eta cut
+ Float_t fMaxNsigmaVtx; // track-primary vertex cut (sigma)
+ Float_t fMaxTrkVtx; // track-primary vertex cut (value)
+ Float_t fMaxITSChi2, fMaxTPCChi2; // ITS/TPC Chi2/cluster cut
+ UInt_t fMinNClusITS, fMinNClusTPC; // ITS/TPC number of clusters cut
+ Float_t trkMinProx; // two-track proximity cut (dist at TPC entrance)
// disable (make private) copy constructor, and assignment operator:
AliJetCorrelSelector(const AliJetCorrelSelector&);
if(fabs(ptt-pta)<kEPS && fabs(phit-phia)<kEPS && fabs(etat-etaa)<kEPS) return; // don't auto-correlate
// store track pair proximity
- if(fSelector->GenQA())
- if(Trigg->ID()==hadron && Assoc->ID()==hadron){
- CorrelTrack_t* trk1 = dynamic_cast<CorrelTrack_t*>(Trigg);
- CorrelTrack_t* trk2 = dynamic_cast<CorrelTrack_t*>(Assoc);
- if(!trk1 || !trk2)
- {std::cerr<<"AliJetCorrelWriter::FillCorrelations: failed casting!"<<std::endl; exit(-1);}
- hTrkProx[fTyp][cBin]->Fill(trk1->Dist(trk2),ptt,pta);
- }
+ if(Trigg->ID()==hadron && Assoc->ID()==hadron){
+ CorrelTrack_t* trk1 = dynamic_cast<CorrelTrack_t*>(Trigg);
+ CorrelTrack_t* trk2 = dynamic_cast<CorrelTrack_t*>(Assoc);
+ if(!trk1 || !trk2)
+ {std::cerr<<"AliJetCorrelWriter::FillCorrelations: failed casting!"<<std::endl; exit(-1);}
+ Float_t pairDist = trk1->Dist(trk2);
+ if(fSelector->CloseTrackPair(pairDist)) return; // proximity cut
+ if(fSelector->GenQA()) hTrkProx[fTyp][cBin]->Fill(pairDist,ptt,pta);
+ }
+
// Fill correlation histograms:
Float_t dphi = DeltaPhi(phit,phia);
Float_t deta = etat-etaa;
using namespace JetCorrelHD;
gROOT->LoadMacro("$ALICE_ROOT/PWG4/macros/ConfigJetCorrel.C");
- AliJetCorrelSelector* Selector = JetCorrelSelector();
+ AliJetCorrelSelector* Selector = ConfigJetCorrel();
AliAnalysisTaskJetCorrel *task = new AliAnalysisTaskJetCorrel(Selector);
//add the task to the current analysis manager
//----------------------
AliAnalysisDataContainer *output =
mgr->CreateContainer("JetCorrelHistos", TList::Class(),
- AliAnalysisManager::kOutputContainer,"JetCorrelHistos.root");
+ AliAnalysisManager::kOutputContainer,"JetCorrelHistos.root");
+ AliAnalysisDataContainer *dummy = mgr->CreateContainer("cdummy", TTree::Class(),
+ AliAnalysisManager::kExchangeContainer);
+
mgr->ConnectInput(task,0,mgr->GetCommonInputContainer());
- mgr->ConnectOutput(task,0,mgr->GetCommonOutputContainer());
+ mgr->ConnectOutput(task,0,dummy);
mgr->ConnectOutput(task,1,output);
return task;
-AliJetCorrelSelector* JetCorrelSelector(){
+AliJetCorrelSelector* ConfigJetCorrel(){
///////////////////////////////////
// set correlation input parameters
///////////////////////////////////
// set generic selections:
- UInt_t PoolDepth = 10;
- UInt_t CorrelTypes[] = {0};
- Float_t TriggBins[] = {5.,7.,10.,15.,25.};
- Float_t AssocBins[] = {0.3,0.5,1.,2.,5.,7.};
- Float_t CentrBins[] = {0.,50.,200.,500.};
- Float_t ZVertBins[] = {-30.,-15.,-5.,-1.,1.,5.,15.,30.};
+ Bool_t kUseQA = kTRUE; // generate QA histos
+ UInt_t poolDepth = 100;
+ UInt_t correlTypes[] = {0}; // 0=dihadron, 1=pi0-hadron, 2=photon-hadron, 3=Z0-hadron
+ Float_t centrBins[] = {1,30,300};
+ Float_t zVertBins[] = {-12,-8,-5,-3,-1,1,3,5,8,12};
+ Float_t bwTriggPt = 1; Float_t minTriggPt = 2; Float_t maxTriggPt = 20; // 18 bins
+ Float_t bwAssocPt = 0.5; Float_t minAssocPt = 0.5; Float_t maxAssocPt = 10; // 19 bins
+ //TString sTrigg[] = {"ALL"}; // selects events where one of the strings is matched; "ALL"=no cut
+ TString sTrigg[] = {"CINT1B-"};
// set track selections:
- Bool_t ITSRefit = kTRUE;
- Bool_t TPCRefit = kTRUE;
- Bool_t TRDRefit = kTRUE; // used only for electron tracks
- UInt_t MinNClusITS = 1;
- UInt_t MinNClusTPC = 50;
- Float_t MaxITSChi2 = 3.5; // max track Chi2 per ITS cluster
- Float_t MaxTPCChi2 = 3.5; // max track Chi2 per TPC cluster
- Float_t MaxNsigVtx = 3.5; // max dist to primary vertex
- Bool_t RejectKinkChild = kTRUE; // reject track comming from a kink
+ Bool_t itsRefit = kTRUE;
+ Bool_t tpcRefit = kTRUE;
+ Bool_t trdRefit = kTRUE; // used only for electron tracks
+ Float_t maxEta = 0.9;
+ UInt_t minNClusTPC = 80;
+ Float_t maxTPCChi2 = 3.5; // max track Chi2 per TPC cluster
+ Bool_t rejectKinkChild = kTRUE; // reject track comming from a kink
+ Float_t trkPairCut = 0.; // track pair proximity cut (dist at TPC entrance)
+ // code that applies next 3 cuts (NClusITS,ITSChi2,NsigVtx) currently commented out
+ UInt_t minNClusITS = 0;
+ Float_t maxITSChi2 = 35; // max track Chi2 per ITS cluster
+ Float_t maxNsigVtx = 35; // max dist to primary vertex (sigma)
+ Float_t maxTrkVtx = 3; // max dist to primary vertex (absolute) - temporarily instead of sigma
//////////////////////////////////
// load them into selector object:
//////////////////////////////////
- AliJetCorrelSelector* Selector = new AliJetCorrelSelector();
- Selector->SetPoolDepth(PoolDepth);
- Selector->SetCorrelTypes(sizeof(CorrelTypes)/sizeof(Int_t),CorrelTypes);
- Selector->SetBinningTrigg(sizeof(TriggBins)/sizeof(Float_t),TriggBins);
- Selector->SetBinningAssoc(sizeof(AssocBins)/sizeof(Float_t),AssocBins);
- Selector->SetBinningCentr(sizeof(CentrBins)/sizeof(Float_t),CentrBins);
- Selector->SetBinningZvert(sizeof(ZVertBins)/sizeof(Float_t),ZVertBins);
- Selector->SetITSRefit(ITSRefit); Selector->SetTPCRefit(TPCRefit);
- Selector->SetTRDRefit(TRDRefit);
- Selector->SetMinNClusITS(MinNClusITS); Selector->SetMinNClusTPC(MinNClusTPC);
- Selector->SetMaxITSChi2(MaxITSChi2); Selector->SetMaxTPCChi2(MaxTPCChi2);
- Selector->SetMaxNsigmaVtx(MaxNsigVtx);
- Selector->SetRejectKinkChild(RejectKinkChild);
- Selector->Print();
+ AliJetCorrelSelector* selector = new AliJetCorrelSelector();
+ selector->SetQA(kUseQA);
+ selector->SetPoolDepth(poolDepth);
+ selector->SetCorrelTypes(sizeof(correlTypes)/sizeof(UInt_t),correlTypes);
+ selector->SetBinningCentr(sizeof(centrBins)/sizeof(Float_t),centrBins);
+ selector->SetBinningZvert(sizeof(zVertBins)/sizeof(Float_t),zVertBins);
+ selector->SetBinningTrigg(minTriggPt,maxTriggPt,bwTriggPt);
+ selector->SetBinningAssoc(minAssocPt,maxAssocPt,bwAssocPt);
+ selector->SetTriggers(sizeof(sTrigg)/sizeof(TString),sTrigg);
+ selector->SetITSRefit(itsRefit);
+ selector->SetTPCRefit(tpcRefit);
+ selector->SetTRDRefit(trdRefit);
+ selector->SetMaxEta(maxEta);
+ selector->SetMinNClusITS(minNClusITS);
+ selector->SetMinNClusTPC(minNClusTPC);
+ selector->SetMaxITSChi2(maxITSChi2);
+ selector->SetMaxTPCChi2(maxTPCChi2);
+ selector->SetMaxNsigmaVtx(maxNsigVtx);
+ selector->SetMaxTrkVtx(maxTrkVtx);
+ selector->SetRejectKinkChild(rejectKinkChild);
+ selector->SetTrkProximityCut(trkPairCut);
+ selector->Show();
- return Selector;
+ return selector;
}