Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions PWGJE/Core/JetFindingUtilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -284,12 +284,11 @@ bool analyseV0s(std::vector<fastjet::PseudoJet>& inputParticles, T const& v0s, f
* @param doHFJetFinding set whether only jets containing a HF candidate are saved
*/
template <typename T, typename U, typename V>
void findJets(JetFinder& jetFinder, std::vector<fastjet::PseudoJet>& inputParticles, float jetPtMin, float jetPtMax, std::vector<double> jetRadius, float jetAreaFractionMin, T const& collision, U& jetsTable, V& constituentsTable, const std::shared_ptr<THn>& thnSparseJet, bool fillThnSparse, bool doCandidateJetFinding = false)
void findJets(JetFinder& jetFinder, std::vector<fastjet::PseudoJet>& inputParticles, float jetPtMin, float jetPtMax, const std::vector<double>& jetRadius, float jetAreaFractionMin, T const& collision, U& jetsTable, V& constituentsTable, const std::shared_ptr<THn>& thnSparseJet, bool fillThnSparse, bool doCandidateJetFinding = false)
{
auto jetRValues = static_cast<std::vector<double>>(std::move(jetRadius));
jetFinder.jetPtMin = jetPtMin;
jetFinder.jetPtMax = jetPtMax;
for (auto R : jetRValues) {
for (auto R : jetRadius) {
jetFinder.jetR = R;
std::vector<fastjet::PseudoJet> jets;
fastjet::ClusterSequenceArea clusterSeq(jetFinder.findJets(inputParticles, jets));
Expand Down
4 changes: 2 additions & 2 deletions PWGJE/Core/JetTaggingUtilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -997,8 +997,8 @@ int vertexClustering(AnyCollision const& collision, AnalysisJet const& jet, AnyT
trkLabels["trkOrigin"].push_back(0); // mismatched coll track
} else {
int orig = RecoDecay::getParticleOrigin(particles, particle, searchUpToQuark);
trkLabels["trkOrigin"].push_back((orig != RecoDecay::OriginType::None) ? static_cast<int>(orig) : (trkLabels["trkVtxIndex"][trkIdx] == 0) ? 3
: 4); // 1: charm, 2: beauty, 3: primary, 4: other secondary
trkLabels["trkOrigin"].push_back((orig != RecoDecay::OriginType::None) ? orig : (trkLabels["trkVtxIndex"][trkIdx] == 0) ? 3
: 4); // 1: charm, 2: beauty, 3: primary, 4: other secondary
}
}

Expand Down
16 changes: 8 additions & 8 deletions PWGJE/JetFinders/jetFinder.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,13 +127,13 @@ struct JetFinderTask {

void init(o2::framework::InitContext const&)
{
hadronicCorrectionTypesVec = (std::vector<int>)hadronicCorrectionTypes;
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast<std::string>(eventSelections));
hadronicCorrectionTypesVec = hadronicCorrectionTypes;
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections);
triggerMaskBits = jetderiveddatautilities::initialiseTriggerMaskBits(triggerMasks);
trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast<std::string>(trackSelections));
particleSelection = static_cast<std::string>(particleSelections);
trackSelection = jetderiveddatautilities::initialiseTrackSelection(trackSelections);
particleSelection = particleSelections;

clusterDefinitionsVec = jetderiveddatautilities::initialiseClusterDefinitions(clusterDefinitions.value);
clusterDefinitionsVec = jetderiveddatautilities::initialiseClusterDefinitions(clusterDefinitions);

jetFinder.etaMin = trackEtaMin;
jetFinder.etaMax = trackEtaMax;
Expand Down Expand Up @@ -164,16 +164,16 @@ struct JetFinderTask {
jetFinder.jetEtaDefault = true;
}

jetFinder.algorithm = static_cast<fastjet::JetAlgorithm>(static_cast<int>(jetAlgorithm));
jetFinder.recombScheme = static_cast<fastjet::RecombinationScheme>(static_cast<int>(jetRecombScheme));
jetFinder.algorithm = static_cast<fastjet::JetAlgorithm>(jetAlgorithm.value);
jetFinder.recombScheme = static_cast<fastjet::RecombinationScheme>(jetRecombScheme.value);
jetFinder.ghostArea = jetGhostArea;
jetFinder.ghostRepeatN = ghostRepeat;
if (DoTriggering) {
jetFinder.isTriggering = true;
}
jetFinder.fastjetExtraParam = jetExtraParam;

auto jetRadiiBins = (std::vector<double>)jetRadius;
auto jetRadiiBins = jetRadius.value;
if (jetRadiiBins.size() > 1) {
jetRadiiBins.push_back(jetRadiiBins[jetRadiiBins.size() - 1] + (TMath::Abs(jetRadiiBins[jetRadiiBins.size() - 1] - jetRadiiBins[jetRadiiBins.size() - 2])));
} else {
Expand Down
14 changes: 7 additions & 7 deletions PWGJE/JetFinders/jetFinderHF.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,11 @@ struct JetFinderHFTask {

void init(o2::framework::InitContext const&)
{
trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast<std::string>(trackSelections));
trackSelection = jetderiveddatautilities::initialiseTrackSelection(trackSelections);
triggerMaskBits = jetderiveddatautilities::initialiseTriggerMaskBits(triggerMasks);
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast<std::string>(eventSelections));
particleSelection = static_cast<std::string>(particleSelections);
clusterDefinition = o2::aod::emcalcluster::getClusterDefinitionFromString(clusterDefinitionS.value);
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections);
particleSelection = particleSelections;
clusterDefinition = o2::aod::emcalcluster::getClusterDefinitionFromString(clusterDefinitionS);

jetFinder.etaMin = trackEtaMin;
jetFinder.etaMax = trackEtaMax;
Expand Down Expand Up @@ -168,16 +168,16 @@ struct JetFinderHFTask {
if (jetEtaMin < -98.0) {
jetFinder.jetEtaDefault = true;
}
jetFinder.algorithm = static_cast<fastjet::JetAlgorithm>(static_cast<int>(jetAlgorithm));
jetFinder.recombScheme = static_cast<fastjet::RecombinationScheme>(static_cast<int>(jetRecombScheme));
jetFinder.algorithm = static_cast<fastjet::JetAlgorithm>(jetAlgorithm.value);
jetFinder.recombScheme = static_cast<fastjet::RecombinationScheme>(jetRecombScheme.value);
jetFinder.ghostArea = jetGhostArea;
jetFinder.ghostRepeatN = ghostRepeat;
if (DoTriggering) {
jetFinder.isTriggering = true;
}
jetFinder.fastjetExtraParam = jetExtraParam;

auto jetRadiiBins = (std::vector<double>)jetRadius;
auto jetRadiiBins = jetRadius.value;
if (jetRadiiBins.size() > 1) {
jetRadiiBins.push_back(jetRadiiBins[jetRadiiBins.size() - 1] + (TMath::Abs(jetRadiiBins[jetRadiiBins.size() - 1] - jetRadiiBins[jetRadiiBins.size() - 2])));
} else {
Expand Down
14 changes: 7 additions & 7 deletions PWGJE/JetFinders/jetFinderHFHFBar.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,10 @@ struct JetFinderHFHFBarTask {

void init(o2::framework::InitContext const&)
{
trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast<std::string>(trackSelections));
trackSelection = jetderiveddatautilities::initialiseTrackSelection(trackSelections);
triggerMaskBits = jetderiveddatautilities::initialiseTriggerMaskBits(triggerMasks);
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast<std::string>(eventSelections));
particleSelection = static_cast<std::string>(particleSelections);
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections);
particleSelection = particleSelections;

jetFinder.etaMin = trackEtaMin;
jetFinder.etaMax = trackEtaMax;
Expand Down Expand Up @@ -165,16 +165,16 @@ struct JetFinderHFHFBarTask {
if (jetEtaMin < -98.0) {
jetFinder.jetEtaDefault = true;
}
jetFinder.algorithm = static_cast<fastjet::JetAlgorithm>(static_cast<int>(jetAlgorithm));
jetFinder.recombScheme = static_cast<fastjet::RecombinationScheme>(static_cast<int>(jetRecombScheme));
jetFinder.algorithm = static_cast<fastjet::JetAlgorithm>(jetAlgorithm.value);
jetFinder.recombScheme = static_cast<fastjet::RecombinationScheme>(jetRecombScheme.value);
jetFinder.ghostArea = jetGhostArea;
jetFinder.ghostRepeatN = ghostRepeat;
if (DoTriggering) {
jetFinder.isTriggering = true;
}
jetFinder.fastjetExtraParam = jetExtraParam;

auto jetRadiiBins = (std::vector<double>)jetRadius;
auto jetRadiiBins = jetRadius.value;
if (jetRadiiBins.size() > 1) {
jetRadiiBins.push_back(jetRadiiBins[jetRadiiBins.size() - 1] + (TMath::Abs(jetRadiiBins[jetRadiiBins.size() - 1] - jetRadiiBins[jetRadiiBins.size() - 2])));
} else {
Expand All @@ -192,7 +192,7 @@ struct JetFinderHFHFBarTask {
registry.add("hJetMCP", "sparse for mcp jets", {o2::framework::HistType::kTHnD, {{jetRadiiBins, ""}, {jetPtBinNumber, jetPtMinDouble, jetPtMaxDouble}, {40, -1.0, 1.0}, {18, 0.0, 7.0}}});
}

o2::aod::EMCALClusterDefinition clusterDefinition = o2::aod::emcalcluster::getClusterDefinitionFromString(clusterDefinitionS.value);
o2::aod::EMCALClusterDefinition clusterDefinition = o2::aod::emcalcluster::getClusterDefinitionFromString(clusterDefinitionS);
o2::framework::expressions::Filter collisionFilter = (nabs(o2::aod::jcollision::posZ) < vertexZCut && o2::aod::jcollision::centFT0M >= centralityMin && o2::aod::jcollision::centFT0M < centralityMax && o2::aod::jcollision::trackOccupancyInTimeRange <= trackOccupancyInTimeRangeMax);
o2::framework::expressions::Filter mcCollisionFilter = (nabs(o2::aod::jmccollision::posZ) < vertexZCut);
o2::framework::expressions::Filter trackCuts = (o2::aod::jtrack::pt >= trackPtMin && o2::aod::jtrack::pt < trackPtMax && o2::aod::jtrack::eta >= trackEtaMin && o2::aod::jtrack::eta <= trackEtaMax && o2::aod::jtrack::phi >= trackPhiMin && o2::aod::jtrack::phi <= trackPhiMax && (phiExclusionMin < -998.0 || (o2::aod::jtrack::phi <= phiExclusionMin || o2::aod::jtrack::phi >= phiExclusionMax)));
Expand Down
12 changes: 6 additions & 6 deletions PWGJE/JetFinders/jetFinderV0.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,10 @@ struct JetFinderV0Task {

void init(o2::framework::InitContext const&)
{
trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast<std::string>(trackSelections));
trackSelection = jetderiveddatautilities::initialiseTrackSelection(trackSelections);
triggerMaskBits = jetderiveddatautilities::initialiseTriggerMaskBits(triggerMasks);
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast<std::string>(eventSelections));
particleSelection = static_cast<std::string>(particleSelections);
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections);
particleSelection = particleSelections;

jetFinder.etaMin = trackEtaMin;
jetFinder.etaMax = trackEtaMax;
Expand Down Expand Up @@ -149,8 +149,8 @@ struct JetFinderV0Task {
if (jetEtaMin < -98.0) {
jetFinder.jetEtaDefault = true;
}
jetFinder.algorithm = static_cast<fastjet::JetAlgorithm>(static_cast<int>(jetAlgorithm));
jetFinder.recombScheme = static_cast<fastjet::RecombinationScheme>(static_cast<int>(jetRecombScheme));
jetFinder.algorithm = static_cast<fastjet::JetAlgorithm>(jetAlgorithm.value);
jetFinder.recombScheme = static_cast<fastjet::RecombinationScheme>(jetRecombScheme.value);
jetFinder.ghostArea = jetGhostArea;
jetFinder.ghostRepeatN = ghostRepeat;
if (DoTriggering) {
Expand All @@ -165,7 +165,7 @@ struct JetFinderV0Task {
candIndex = 1;
}

auto jetRadiiBins = (std::vector<double>)jetRadius;
auto jetRadiiBins = jetRadius.value;
if (jetRadiiBins.size() > 1) {
jetRadiiBins.push_back(jetRadiiBins[jetRadiiBins.size() - 1] + (TMath::Abs(jetRadiiBins[jetRadiiBins.size() - 1] - jetRadiiBins[jetRadiiBins.size() - 2])));
} else {
Expand Down
6 changes: 3 additions & 3 deletions PWGJE/TableProducer/eventwiseConstituentSubtractor.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,9 @@ struct eventWiseConstituentSubtractorTask {

void init(o2::framework::InitContext&)
{
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast<std::string>(eventSelections));
trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast<std::string>(trackSelections));
particleSelection = static_cast<std::string>(particleSelections);
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections);
trackSelection = jetderiveddatautilities::initialiseTrackSelection(trackSelections);
particleSelection = particleSelections;

eventWiseConstituentSubtractor.setDoRhoMassSub(doRhoMassSub);
eventWiseConstituentSubtractor.setConstSubAlphaRMax(alpha, rMax);
Expand Down
26 changes: 13 additions & 13 deletions PWGJE/TableProducer/jetTaggerHF.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -376,46 +376,46 @@ struct JetTaggerHFTask {
// Set up the resolution function
switch (resoFuncMatch) {
case 0:
vecParamsData = (std::vector<float>)paramsResoFuncData;
vecParamsCharmJetMC = (std::vector<float>)paramsResoFuncCharmJetMC;
vecParamsBeautyJetMC = (std::vector<float>)paramsResoFuncBeautyJetMC;
vecParamsLfJetMC = (std::vector<float>)paramsResoFuncLfJetMC;
vecParamsData = paramsResoFuncData;
vecParamsCharmJetMC = paramsResoFuncCharmJetMC;
vecParamsBeautyJetMC = paramsResoFuncBeautyJetMC;
vecParamsLfJetMC = paramsResoFuncLfJetMC;
LOG(info) << "defined parameters of resolution function: custom";
break;
case 1:
vecParamsData = (std::vector<float>)paramsResoFuncData;
vecParamsIncJetMC = (std::vector<float>)paramsResoFuncIncJetMC;
vecParamsData = paramsResoFuncData;
vecParamsIncJetMC = paramsResoFuncIncJetMC;
useResoFuncFromIncJet = true;
LOG(info) << "defined parameters of resolution function: custom & use inclusive distribution";
break;
case 2: // TODO
vecParamsData = (std::vector<float>)paramsResoFuncData;
vecParamsData = paramsResoFuncData;
vecParamsCharmJetMC = {282119.753, -0.065, 0.893, 11.608, 0.945, 8.029, 0.131, 6.244, 0.027};
vecParamsBeautyJetMC = {74901.583, -0.082, 0.874, 10.332, 0.941, 7.352, 0.097, 6.220, 0.022};
vecParamsLfJetMC = {1539435.343, -0.061, 0.896, 13.272, 1.034, 5.884, 0.004, 7.843, 0.090};
LOG(info) << "defined parameters of resolution function: PYTHIA8, MB, LHC23d1k";
break;
case 3: // TODO
vecParamsData = (std::vector<float>)paramsResoFuncData;
vecParamsData = paramsResoFuncData;
vecParamsIncJetMC = {1908803.027, -0.059, 0.895, 13.467, 1.005, 8.867, 0.098, 6.929, 0.011};
LOG(info) << "defined parameters of resolution function: PYTHIA8, MB, LHC23d1k & use inclusive distribution";
useResoFuncFromIncJet = true;
break;
case 4: // TODO
vecParamsData = (std::vector<float>)paramsResoFuncData;
vecParamsData = paramsResoFuncData;
vecParamsCharmJetMC = {743719.121, -0.960, -0.240, 13.765, 1.314, 10.761, 0.293, 8.538, 0.052};
vecParamsBeautyJetMC = {88888.418, 0.256, 1.003, 10.185, 0.740, 8.216, 0.147, 7.228, 0.040};
vecParamsLfJetMC = {414860.372, -1.000, 0.285, 14.561, 1.464, 11.693, 0.339, 9.183, 0.052};
LOG(info) << "defined parameters of resolution function: PYTHIA8, JJ, weighted, LHC24g4";
break;
case 5: // TODO
vecParamsData = (std::vector<float>)paramsResoFuncData;
vecParamsData = paramsResoFuncData;
vecParamsIncJetMC = {2211391.862, 0.360, 1.028, 13.019, 0.650, 11.151, 0.215, 9.462, 0.044};
LOG(info) << "defined parameters of resolution function: PYTHIA8, JJ, weighted, LHC24g4 & use inclusive distribution";
useResoFuncFromIncJet = true;
break;
case 6: // TODO
vecParamsData = (std::vector<float>)paramsResoFuncData;
vecParamsData = paramsResoFuncData;
for (size_t j = 0; j < resoFuncIncCCDB.size(); j++) {
std::vector<float> params;
if (resoFuncIncCCDB[j]) {
Expand All @@ -429,7 +429,7 @@ struct JetTaggerHFTask {
useResoFuncFromIncJet = true;
break;
case 7: // TODO
vecParamsData = (std::vector<float>)paramsResoFuncData;
vecParamsData = paramsResoFuncData;
for (size_t j = 0; j < resoFuncBeautyCCDB.size(); j++) {
std::vector<float> params;
if (resoFuncBeautyCCDB[j]) {
Expand Down Expand Up @@ -558,7 +558,7 @@ struct JetTaggerHFTask {

int nSVs = analysisJet.template secondaryVertices_as<SecondaryVertices>().size();

jettaggingutilities::BJetParams jetparam = {analysisJet.pt(), analysisJet.eta(), analysisJet.phi(), static_cast<int>(tracksParams.size()), static_cast<int>(nSVs), analysisJet.mass()};
jettaggingutilities::BJetParams jetparam = {analysisJet.pt(), analysisJet.eta(), analysisJet.phi(), static_cast<int>(tracksParams.size()), nSVs, analysisJet.mass()};
tracksParams.resize(nJetConst); // resize to the number of inputs of the ML
svsParams.resize(nJetConst); // resize to the number of inputs of the ML

Expand Down
2 changes: 1 addition & 1 deletion PWGJE/TableProducer/mcOutlierRejector.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ struct McOutlierRejectorTask {
std::vector<bool> collisionFlag;
std::vector<bool> mcCollisionFlag;

int trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast<std::string>(trackSelections));
int trackSelection = jetderiveddatautilities::initialiseTrackSelection(trackSelections);

void processSetupCollisionSelection(aod::JCollisions const& collisions)
{
Expand Down
2 changes: 1 addition & 1 deletion PWGJE/TableProducer/quarkGluonJetsProducer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ struct QuarkGluonJetsProducer {

void init(InitContext const&)
{
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast<std::string>(eventSelections));
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections);
}

template <typename TrackT>
Expand Down
4 changes: 2 additions & 2 deletions PWGJE/TableProducer/slimTablesProducer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,8 @@ struct SlimTablesProducer {
histos.add("Ntracks_pT", "track pT distribution;#it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{200, -0.5, 199.5}}}, doSumw2);
histos.add("Nparticles_pT", "particle pT distribution;#it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{200, -0.5, 199.5}}}, doSumw2);

eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast<std::string>(eventSelections));
trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast<std::string>(trackSelections));
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections);
trackSelection = jetderiveddatautilities::initialiseTrackSelection(trackSelections);
}

Produces<o2::aod::SlimCollisions> slimCollisions;
Expand Down
4 changes: 2 additions & 2 deletions PWGJE/Tasks/bjetCentMult.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,8 @@ struct BjetCentMultTask {
{
numberOfJetFlavourSpecies = static_cast<int>(numFlavourSpecies);

eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast<std::string>(eventSelections));
trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast<std::string>(trackSelections));
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections);
trackSelection = jetderiveddatautilities::initialiseTrackSelection(trackSelections);
// Axis
AxisSpec axisJetFlavour = {binJetFlavour, "Jet flavour"};
AxisSpec axisJetPt = {binJetPt, "#it{p}_{T, jet}"};
Expand Down
6 changes: 3 additions & 3 deletions PWGJE/Tasks/bjetTaggingGnn.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -246,16 +246,16 @@ struct BjetTaggingGnn {

void init(InitContext const&)
{
jetRadiiValues = (std::vector<double>)jetRadii;
jetRadiiValues = jetRadii;

eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast<std::string>(eventSelections));
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections);
eventSelectionBitsTVX = jetderiveddatautilities::initialiseEventSelectionBits("TVX");
eventSelectionBitsSel8 = jetderiveddatautilities::initialiseEventSelectionBits("sel8");
eventSelectionBitsSelMC = jetderiveddatautilities::initialiseEventSelectionBits("selMC");
eventSelectionBitsSel8Full = jetderiveddatautilities::initialiseEventSelectionBits("sel8Full");
eventSelectionBitsSel8FullGood = jetderiveddatautilities::initialiseEventSelectionBits("sel8Full+IsGoodZvtxFT0vsPV");

trackSelectionBits = jetderiveddatautilities::initialiseTrackSelection(static_cast<std::string>(trackSelections));
trackSelectionBits = jetderiveddatautilities::initialiseTrackSelection(trackSelections);

if (doprocessDataJetsTrig) {
zorroSummary.setObject(zorro.getZorroSummary());
Expand Down
Loading
Loading