30 #include <fastjet/ClusterSequence.hh> 31 #include <fastjet/JetDefinition.hh> 32 #include <fastjet/PseudoJet.hh> 33 #include <fastjet/contrib/SoftDrop.hh> 40 #include "AliAnalysisManager.h" 41 #include "AliAODInputHandler.h" 46 #include "AliInputEventHandler.h" 50 #include "AliVCluster.h" 51 #include "AliVTrack.h" 55 using namespace
PWGJE::EMCALJetTasks;
59 fBinningMode(kSDModeINT7),
60 fTriggerBits(AliVEvent::kAny),
62 fUseDownscaleWeight(false),
65 fReclusterizer(kCAAlgo),
66 fUseChargedConstituents(kTRUE),
67 fUseNeutralConstituents(kTRUE),
74 AliAnalysisTaskEmcalSoftDropData::AliAnalysisTaskEmcalSoftDropData(
const char *name) :
76 fBinningMode(kSDModeINT7),
77 fTriggerBits(AliVEvent::kAny),
79 fUseDownscaleWeight(false),
82 fReclusterizer(kCAAlgo),
83 fUseChargedConstituents(kTRUE),
84 fUseNeutralConstituents(kTRUE),
111 fHistos->
CreateTH1(
"hEventCounterWeighted",
"Event counter, weighted", 1., 0., 1.);
119 if(!(fInputHandler->IsEventSelected() &
fTriggerBits))
return false;
121 if(!fInputEvent->GetFiredTriggerClasses().Contains(
fTriggerString))
return false;
134 AliErrorStream() <<
"Jet container not found" << std::endl;
139 AliErrorStream() <<
"Cluster container not found, but neutral constituents requested" << std::endl;
143 AliErrorStream() <<
"Track container not found, but charged constituent requested." << std::endl;
151 for(
auto jet : jets->accepted()){
153 auto zgparams =
MakeSoftdrop(*jet, jets->GetJetRadius(), tracks, clusters);
163 else if(
fTriggerString ==
"EJ1") triggerclass =
"CEMC7EJ1-B-NOPF-CENTNOTRD";
164 else if(
fTriggerString ==
"EJ2") triggerclass =
"CEMC7EJ1-B-NOPF-CENT";
173 binning->SetMinimum(20);
174 binning->AddStep(40., 5.);
175 binning->AddStep(60., 10.);
176 binning->AddStep(80., 20.);
177 binning->AddStep(120., 40.);
181 binning->SetMinimum(80.);
182 binning->AddStep(120., 5.);
183 binning->AddStep(160., 10.);
184 binning->AddStep(200., 20.);
188 binning->SetMinimum(70.);
189 binning->AddStep(100., 5.);
190 binning->AddStep(120., 10.);
191 binning->AddStep(140., 20.);
202 binning->AddStep(0.5, 0.05);
207 const int kClusterOffset = 30000;
208 std::vector<fastjet::PseudoJet> constituents;
210 AliDebugStream(2) <<
"Make new jet substrucutre for " << (isMC ?
"MC" :
"data") <<
" jet: Number of tracks " << jet.
GetNumberOfTracks() <<
", clusters " << jet.
GetNumberOfClusters() << std::endl;
212 AliDebugStream(1) <<
"Jet substructure: Using charged constituents" << std::endl;
214 auto track = jet.
TrackAt(itrk, tracks->GetArray());
217 fastjet::PseudoJet constituentTrack(track->Px(), track->Py(), track->Pz(), track->E());
218 constituentTrack.set_user_index(jet.
TrackAt(itrk));
219 constituents.push_back(constituentTrack);
224 AliDebugStream(1) <<
"Jet substructure: Using neutral constituents" << std::endl;
226 auto cluster = jet.
ClusterAt(icl, clusters->GetArray());
227 TLorentzVector clustervec;
229 fastjet::PseudoJet constituentCluster(clustervec.Px(), clustervec.Py(), clustervec.Pz(), cluster->GetHadCorrEnergy());
230 constituentCluster.set_user_index(jet.
ClusterAt(icl) + kClusterOffset);
231 constituents.push_back(constituentCluster);
235 AliDebugStream(3) <<
"Found " << constituents.size() <<
" constituents for jet with pt=" << jet.
Pt() <<
" GeV/c" << std::endl;
236 if(!constituents.size()){
237 AliErrorStream() <<
"Jet has 0 constituents." << std::endl;
241 fastjet::JetDefinition jetdef(fastjet::antikt_algorithm, jetradius*2, static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
242 fastjet::ClusterSequence jetfinder(constituents, jetdef);
243 std::vector<fastjet::PseudoJet> outputjets = jetfinder.inclusive_jets(0);
244 auto sdjet = outputjets[0];
245 fastjet::contrib::SoftDrop softdropAlgorithm(
fBeta,
fZcut);
246 softdropAlgorithm.set_verbose_structure(kTRUE);
247 fastjet::JetAlgorithm reclusterizingAlgorithm;
249 case kCAAlgo: reclusterizingAlgorithm = fastjet::cambridge_aachen_algorithm;
break;
250 case kKTAlgo: reclusterizingAlgorithm = fastjet::kt_algorithm;
break;
251 case kAKTAlgo: reclusterizingAlgorithm = fastjet::antikt_algorithm;
break;
253 #if FASTJET_VERSION_NUMBER >= 30302 254 fastjet::Recluster reclusterizer(reclusterizingAlgorithm, 1, fastjet::Recluster::keep_only_hardest);
256 fastjet::contrib::Recluster reclusterizer(reclusterizingAlgorithm, 1,
true);
258 softdropAlgorithm.set_reclustering(kTRUE, &reclusterizer);
259 AliDebugStream(4) <<
"Jet has " << sdjet.constituents().size() <<
" constituents" << std::endl;
260 auto groomed = softdropAlgorithm(sdjet);
261 auto softdropstruct = groomed.structure_of<fastjet::contrib::SoftDrop>();
263 std::vector<double> result ={softdropstruct.symmetry(),
265 softdropstruct.delta_R(),
268 static_cast<double>(softdropstruct.dropped_count())};
276 AliInputEventHandler *inputhandler =
static_cast<AliInputEventHandler *
>(mgr->GetInputEventHandler());
278 if(inputhandler->IsA() == AliAODInputHandler::Class()){
279 std::cout <<
"Analysing AOD events\n";
282 std::cout <<
"Analysing ESD events\n";
286 std::stringstream taskname;
287 taskname <<
"SoftdropDataMaker_R" << std::setw(2) << std::setfill(
'0') << int(jetradius*10) << trigger;
289 datamaker->SelectCollisionCandidates(AliVEvent::kINT7);
290 mgr->AddTask(datamaker);
295 std::cout <<
"Track container name: " << tracks->GetName() << std::endl;
296 tracks->SetMinPt(0.15);
300 std::cout <<
"Using full or neutral jets ..." << std::endl;
302 std::cout <<
"Cluster container name: " << clusters->GetName() << std::endl;
306 std::cout <<
"Using charged jets ... " << std::endl;
316 datajets->SetName(
"detLevel");
320 std::string jettypestring;
325 default: jettypestring =
"Undef";
329 UInt_t triggerbits(AliVEvent::kINT7);
330 std::string triggerstring(trigger);
331 if(triggerstring ==
"EJ1") {
333 triggerbits = AliVEvent::kEMCEJE;
334 }
else if(triggerstring ==
"EJ2") {
336 triggerbits = AliVEvent::kEMCEJE;
341 std::stringstream outputfile, histname;
342 outputfile << mgr->GetCommonFileName() <<
":SoftDropResponse_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
343 histname <<
"SoftDropResponseHistos_" << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(jetradius * 10.) <<
"_" << trigger;
344 mgr->ConnectInput(datamaker, 0, mgr->GetCommonInputContainer());
345 mgr->ConnectOutput(datamaker, 1, mgr->CreateContainer(histname.str().data(), AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outputfile.str().data()));
Bool_t fUseDownscaleWeight
Usage of downscale weights.
Bool_t fUseChargedConstituents
Use also charged constituents.
TBinning * GetZgBinning() const
AliJetContainer * GetJetContainer(Int_t i=0) const
virtual Bool_t IsTriggerSelected()
Selection of a hardware trigger.
Container with name, TClonesArray and cuts for particles.
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
Fill a 2D histogram within the container.
TString fTriggerString
Trigger selection string.
Int_t ClusterAt(Int_t idx) const
static AliEmcalDownscaleFactorsOCDB * Instance()
AliJetContainer * AddJetContainer(const char *n, TString defaultCutType, Float_t jetRadius=0.4)
virtual void CreateBinEdges(TArrayD &binedges) const =0
Double_t GetDownscaleFactorForTriggerClass(const TString &trigger) const
UInt_t fTriggerBits
Trigger selection bits.
Interface for binnings used by the histogram handler.
AliClusterContainer * AddClusterContainer(const char *n)
Create new cluster container and attach it to the task.
Double_t fJetPtMax
! Max. jet pt (truncation)
Container for particles within the EMCAL framework.
Int_t GetDefaultClusterEnergy() const
Int_t TrackAt(Int_t idx) const
EBinningMode_t fBinningMode
Binning adapted to trigger.
UShort_t GetNumberOfTracks() const
TPC fiducial acceptance (each eta edge narrowed by jet R)
virtual ~AliAnalysisTaskEmcalSoftDropData()
static AliAnalysisTaskEmcalSoftDropData * AddTaskEmcalSoftDropData(Double_t jetradius, AliJetContainer::EJetType_t jettype, AliJetContainer::ERecoScheme_t recombinationScheme, const char *trigger)
void SetRun(int runnumber)
TH2 * CreateTH2(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt="")
Create a new TH2 within the container.
UShort_t GetNumberOfClusters() const
void SetJetPtCut(Float_t cut)
virtual Bool_t Run()
Run function. This is the core function of the analysis and contains the user code. Therefore users have to implement this function.
THashList * GetListOfHistograms() const
Get the list of histograms.
virtual void RunChanged(Int_t newrun)
Process tasks relevant when a file with a different run number is processed.
Double_t GetDownscaleWeight() const
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Create a new TH1 within the container.
AliClusterContainer * GetClusterContainer(Int_t i=0) const
Get cluster container attached to this task.
Helper class creating user defined custom binning.
TBinning * fPtBinning
Detector level pt binning.
AliAnalysisTaskEmcalSoftDropData()
virtual void UserCreateOutputObjects()
void SetBinningMode(EBinningMode_t binmode)
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
Fill a 1D histogram within the container.
EReclusterizer_t fReclusterizer
Reclusterizer.
AliEmcalList * fOutput
!output list
std::vector< double > MakeSoftdrop(const AliEmcalJet &jet, double jetradius, const AliParticleContainer *tracks, const AliClusterContainer *clusters) const
Double_t fVertex[3]
!event vertex
AliTrackContainer * AddTrackContainer(const char *n)
Create new track container and attach it to the task.
AliTrackContainer * GetTrackContainer(Int_t i=0) const
Base task in the EMCAL jet framework.
Represent a jet reconstructed using the EMCal jet framework.
Container class for histograms.
void UserCreateOutputObjects()
Main initialization function on the worker.
Double_t fJetPtMin
! Min. jet pt (truncation)
void SetDefaultClusterEnergy(Int_t d)
TBinning * GetDefaultPtBinning() const
void SetMaxTrackPt(Float_t b)
THistManager * fHistos
! Histogram handler
Container structure for EMCAL clusters.
Container for MC-true particles within the EMCAL framework.
Bool_t fUseNeutralConstituents
Use also neutral constituents.
EMCal fiducial acceptance (each eta, phi edge narrowed by jet R)
Container for jet within the EMCAL jet framework.
void SetClusHadCorrEnergyCut(Double_t cut)
void SetMinimum(Double_t min)
static TString ClusterContainerNameFactory(Bool_t isAOD)
Get name of the default cluster container.
static TString TrackContainerNameFactory(Bool_t isAOD)
Get name of the default track container.