<commit_before>/*************************************************************************
 *                                                                       *
 * Task for Jet Chemistry Analysis in PWG-JE Jet Task Force Train        *
 *                                                                       *
 *                                                                       *
 *  contact:                                                             *
 *  <NAME>                                                     *
 *  <EMAIL>                                   *
 *                                                                       *
 *                                                                       *  
 *                                                                       *
 *                                                                       *
 *************************************************************************/
   

#ifndef ALIANALYSISTASKJETCHEM_H
#define ALIANALYSISTASKJETCHEM_H

/* Copyright(c) 1998-2016, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */

class AliAODv0;
class AliAODVertex;
class AliAnalysisCentralitySelector;
class AliPIDResponse;
class TString;
class TList;
class AliAODMCParticle;
class AliAODTrack;
class TRandom3;

#include "AliAnalysisTaskFragmentationFunction.h"
#include "AliPID.h"
#include "AliAnalysisTaskSE.h"
#include "AliAODMCHeader.h"

class AliAnalysisTaskJetChem : public AliAnalysisTaskFragmentationFunction {

 public:
  
  //----------------------------------------
  class AliFragFuncHistosInvMass : public TObject
  {
    
    public:
    
    AliFragFuncHistosInvMass(const char* name = "FFIMhistos", 
			     Int_t nJetPt = 0, Float_t jetPtMin = 0, Float_t jetPtMax = 0,
			     Int_t nInvMass = 0, Float_t invMassMin=0, Float_t invMassMax=0,  
			     Int_t nPt = 0, Float_t ptMin = 0, Float_t ptMax = 0,
			     Int_t nXi = 0, Float_t xiMin = 0, Float_t xiMax = 0,
			     Int_t nZ  = 0, Float_t zMin  = 0, Float_t zMax  = 0);
    AliFragFuncHistosInvMass(const AliFragFuncHistosInvMass& copy);
    AliFragFuncHistosInvMass& operator=(const AliFragFuncHistosInvMass &o);
    virtual ~AliFragFuncHistosInvMass();
    
    virtual void DefineHistos();
    virtual void FillFF(Float_t trackPt, Float_t invM, Float_t jetPt,Bool_t incrementJetPt);
    virtual void AddToOutput(TList* list) const;




  private:

    Int_t   fNBinsJetPt;    // FF histos bins
    Float_t fJetPtMin;      // FF histos limits
    Float_t fJetPtMax;      // FF histos limits
    Int_t   fNBinsInvMass;  // FF histos bins
    Float_t fInvMassMin;    // FF histos limits
    Float_t fInvMassMax;    // FF histos limits
    Int_t   fNBinsPt;       // FF histos bins
    Float_t fPtMin;         // FF histos limits
    Float_t fPtMax;         // FF histos limits
    Int_t   fNBinsXi;       // FF histos bins
    Float_t fXiMin;         // FF histos limits
    Float_t fXiMax;         // FF histos limits
    Int_t   fNBinsZ;        // FF histos bins
    Float_t fZMin;          // FF histos limits
    Float_t fZMax;          // FF histos limits
  


    TH3F*   fh3TrackPt;     //! FF: track transverse momentum 
    TH3F*   fh3Xi;          //! FF: xi 
    TH3F*   fh3Z;           //! FF: z  
    TH1F*   fh1JetPt;       //! jet pt of all jets 

    TString fNameFF;        // histo names prefix
    
    ClassDef(AliFragFuncHistosInvMass, 1);
  };
  
  
  //----------------------------------------

  AliAnalysisTaskJetChem(); 
  AliAnalysisTaskJetChem(const char *name);
  AliAnalysisTaskJetChem(const  AliAnalysisTaskJetChem &copy);
  AliAnalysisTaskJetChem& operator=(const  AliAnalysisTaskJetChem &o);
  virtual ~AliAnalysisTaskJetChem();
  
  virtual void   UserCreateOutputObjects();
  virtual void   UserExec(Option_t *option);

  enum { kV0TypeUndef =0, kOnFly, kOnFlyPID, kOnFlydEdx, kOnFlyPrim, kOffl, kOfflPID, kOffldEdx, kOfflPrim, kV0AODMCExtraonlyCuts};// v0 rec. type 
  enum { kK0, kLambda, kAntiLambda };// particletype 

  enum {kTrackUndef=0, kTrackAOD, kTrackAODQualityCuts, kTrackAODCuts,                                       
	kTrackAODExtra, kTrackAODExtraonly, kTrackAODExtraCuts, kTrackAODExtraonlyCuts,
        kTrackAODMCExtraonlyCharged,kTrackAODMCExtraonlyChargedCuts, 
	kTrackKineAll, kTrackKineCharged, kTrackKineChargedAcceptance, 
	kTrackAODMCAll, kTrackAODMCCharged, kTrackAODMCChargedAcceptance, kTrackAODMCChargedSecS, kTrackAODMCChargedSecNS, kTrackAOCMCChargedPrimAcceptance}; //track type
  enum {kJetsUndef=0, kJetsRec, kJetsRecAcceptance, kJetsGen, kJetsGenAcceptance, kJetsKine, kJetsKineAcceptance,kJetsEmbedded};// jet type


  static  void   SetProperties(TH3F* h,const char* x, const char* y,const char* z);

  //Bool_t IsAccepteddEdx(Double_t mom, Double_t signal, AliPID::EParticleType n, Double_t cutnSig) const;//not used anymore

  Bool_t IsK0InvMass(Double_t mass) const; 
  Int_t  GetListOfV0s(TList *list, Int_t type, Int_t particletype, Int_t tracktype, AliAODVertex* primVertex, AliAODEvent* aod);
  Int_t  GetListOfParticles(TList *list, Int_t type, Int_t particletype, AliAODVertex* primVertex);
  Int_t  GetListOfMCParticles(TList *outputlist, Int_t particletype, AliAODEvent* mcaodevent);
  void   GetTracksInCone(TList* inputlist, TList* outputlist, const AliAODJet* jet, Double_t radius, Double_t& sumPt, Double_t minPt, Double_t maxPt, Bool_t& isBadPt);
  void   GetTracksInPerpCone(TList* inputlist, TList* outputlist, const AliAODJet* jet, Double_t radius, Double_t& sumPerpPt);
  Bool_t MCLabelCheck(AliAODv0* v0, Int_t particletype, const AliAODTrack* trackNeg, const AliAODTrack* trackPos, TList *listmc, Int_t& negDaughterpdg, Int_t& posDaughterpdg, Int_t& motherType, Int_t& v0Label, Double_t& MCPt, Bool_t& fPhysicalPrimary, Int_t& MCv0PDGCode, TString& generatorName, Bool_t& isinjected);
  Bool_t IsParticleMatching(const AliAODMCParticle* mcp0, Int_t v0Label);
  Bool_t DaughterTrackCheck(AliAODv0* v0, Int_t& nnum, Int_t& pnum);
  //Int_t  SplitCocktail(AliAODMCParticle *mcv0,  Int_t v0Label, AliAODMCHeader *header, TClonesArray *arrayMC);
  TString GetGenerator(Int_t label, AliAODMCHeader* header);
  void GetTrackPrimaryGenerator(Int_t lab, AliAODMCHeader *header,TClonesArray *arrayMC,TString &nameGen);
  Bool_t IsTrackInjected(Int_t lab, AliAODMCHeader *header,TClonesArray *arrayMC, TString &nameGen);
  Double_t SmearJetPt(Double_t jetPt, Double_t& jetPtSmear);
  Bool_t IsParticleInCone(const AliVParticle* part1, const AliVParticle* part2, Double_t dRMax) const;
  Bool_t IsRCJCOverlap(TList* recjetlist, const AliVParticle* part, Double_t dDistance) const;
  AliAODJet* GetRandomCone(TList* jetlist, Double_t dEtaConeMax, Double_t dDistance) const;
  void FillEmbeddedHistos(const AliAODJet* embeddedJet, const AliAODJet* matchedJet, Int_t nK0s, Int_t nLa, Int_t nALa, TList* Jettracklist);


  AliAODJet* GetMedianCluster();
  Double_t AreaCircSegment(Double_t dRadius, Double_t dDistance) const;  

  virtual void SetK0Type(Int_t i){ fK0Type = i; }
  virtual void SetFilterMaskK0(UInt_t i) {fFilterMaskK0 = i;}

  Bool_t IsLaInvMass(Double_t mass) const; //La and ALa mass check
  virtual void SetLaType(Int_t i){ fLaType = i; }
  virtual void SetFilterMaskLa(UInt_t i) {fFilterMaskLa = i;}

  virtual void SetALaType(Int_t i){ fALaType = i; }
  virtual void SetFilterMaskALa(UInt_t i) {fFilterMaskALa = i;}

  virtual void SetSelectArmenteros(Bool_t b) {IsArmenterosSelected = b;}
  virtual void SetUseNJEvents(Bool_t b)        { fUseNJEvents = b;}
  virtual void UseExtraTracks()        { fUseExtraTracks =  1;}
  virtual void UseExtraonlyTracks()    { fUseExtraTracks = -1;}
  virtual void SetUseExtraJetPt(Bool_t ut) { fUseExtraJetPt = ut;}
  virtual void SetUseEmbeddedJetPt(Bool_t ut) { fUseEmbeddedJetPt = ut;}

  virtual void SetUseStandardV0s(Bool_t bo) { fUseStandard = bo;}
    
  virtual void SetUsePosV0Eta(Bool_t ps) { fusePosV0Eta = ps;}
  virtual void SetUseNegV0Eta(Bool_t ng) { fuseNegV0Eta = ng;}
  virtual void SetUsePosMCV0Eta(Bool_t pmc) { fusePosV0Eta = pmc;}
  virtual void SetUseNegMCV0Eta(Bool_t nmc) { fuseNegV0Eta = nmc;}
    
  void CalculateInvMass(AliAODv0* v0vtx, Int_t particletype, Double_t& invM, Double_t& trackPt);
  
  Bool_t AcceptBetheBloch(AliAODv0 *v0, AliPIDResponse *PIDResponse, Int_t particletype); //don't use this method for MC Analysis

  Double_t MyRapidity(Double_t rE, Double_t rPz) const;

  //-- K0s

  void   SetFFInvMassHistoBins(Int_t nJetPt = 19, Float_t jetPtMin = 5., Float_t jetPtMax = 100., //previous 19, 5.,100.
			       Int_t nInvM = 400, Float_t invMMin = 0.3,  Float_t invMMax = 0.7, //previous 0.4 to 0.6
			       Int_t nPt = 200, Float_t ptMin = 0., Float_t ptMax = 20.,         //previous 0. to 10.
			       Int_t nXi = 35, Float_t xiMin = 0., Float_t xiMax = 7.,
			       Int_t nZ = 11,  Float_t zMin = 0.,  Float_t zMax = 1.1)
  { fFFIMNBinsJetPt = nJetPt; fFFIMJetPtMin = jetPtMin; fFFIMJetPtMax = jetPtMax; 
    fFFIMNBinsInvM = nInvM; fFFIMInvMMin = invMMin; fFFIMInvMMax = invMMax; fFFIMNBinsPt = nPt; fFFIMPtMin = ptMin; fFFIMPtMax = ptMax; 
    fFFIMNBinsXi = nXi; fFFIMXiMin = xiMin; fFFIMXiMax = xiMax; fFFIMNBinsZ  = nZ;  fFFIMZMin  = zMin;  fFFIMZMax  = zMax; }


  
  // --La and ALa

  void   SetFFInvMassLaHistoBins(Int_t nJetPt = 19, Float_t jetPtMin = 5., Float_t jetPtMax = 100., //La
				 //Int_t nInvM = 140, Float_t invMMin = 1.06,  Float_t invMMax = 1.2,//original inv. mass range, now I shifted to Vits slightly larger mass window
			       Int_t nInvM = 200, Float_t invMMin = 1.05,  Float_t invMMax = 1.25,
			       Int_t nPt = 200, Float_t ptMin = 0., Float_t ptMax = 20., 
			       Int_t nXi = 35, Float_t xiMin = 0., Float_t xiMax = 7.,<commit_msg>bugfix fusePosMCV0Eta in setter<commit_after>/*************************************************************************
 *                                                                       *
 * Task for Jet Chemistry Analysis in PWG-JE Jet Task Force Train        *
 *                                                                       *
 *                                                                       *
 *  contact:                                                             *
 *  <NAME>                                                     *
 *  <EMAIL>                                   *
 *                                                                       *
 *                                                                       *  
 *                                                                       *
 *                                                                       *
 *************************************************************************/
   

#ifndef ALIANALYSISTASKJETCHEM_H
#define ALIANALYSISTASKJETCHEM_H

/* Copyright(c) 1998-2016, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */

class AliAODv0;
class AliAODVertex;
class AliAnalysisCentralitySelector;
class AliPIDResponse;
class TString;
class TList;
class AliAODMCParticle;
class AliAODTrack;
class TRandom3;

#include "AliAnalysisTaskFragmentationFunction.h"
#include "AliPID.h"
#include "AliAnalysisTaskSE.h"
#include "AliAODMCHeader.h"

class AliAnalysisTaskJetChem : public AliAnalysisTaskFragmentationFunction {

 public:
  
  //----------------------------------------
  class AliFragFuncHistosInvMass : public TObject
  {
    
    public:
    
    AliFragFuncHistosInvMass(const char* name = "FFIMhistos", 
			     Int_t nJetPt = 0, Float_t jetPtMin = 0, Float_t jetPtMax = 0,
			     Int_t nInvMass = 0, Float_t invMassMin=0, Float_t invMassMax=0,  
			     Int_t nPt = 0, Float_t ptMin = 0, Float_t ptMax = 0,
			     Int_t nXi = 0, Float_t xiMin = 0, Float_t xiMax = 0,
			     Int_t nZ  = 0, Float_t zMin  = 0, Float_t zMax  = 0);
    AliFragFuncHistosInvMass(const AliFragFuncHistosInvMass& copy);
    AliFragFuncHistosInvMass& operator=(const AliFragFuncHistosInvMass &o);
    virtual ~AliFragFuncHistosInvMass();
    
    virtual void DefineHistos();
    virtual void FillFF(Float_t trackPt, Float_t invM, Float_t jetPt,Bool_t incrementJetPt);
    virtual void AddToOutput(TList* list) const;




  private:

    Int_t   fNBinsJetPt;    // FF histos bins
    Float_t fJetPtMin;      // FF histos limits
    Float_t fJetPtMax;      // FF histos limits
    Int_t   fNBinsInvMass;  // FF histos bins
    Float_t fInvMassMin;    // FF histos limits
    Float_t fInvMassMax;    // FF histos limits
    Int_t   fNBinsPt;       // FF histos bins
    Float_t fPtMin;         // FF histos limits
    Float_t fPtMax;         // FF histos limits
    Int_t   fNBinsXi;       // FF histos bins
    Float_t fXiMin;         // FF histos limits
    Float_t fXiMax;         // FF histos limits
    Int_t   fNBinsZ;        // FF histos bins
    Float_t fZMin;          // FF histos limits
    Float_t fZMax;          // FF histos limits
  


    TH3F*   fh3TrackPt;     //! FF: track transverse momentum 
    TH3F*   fh3Xi;          //! FF: xi 
    TH3F*   fh3Z;           //! FF: z  
    TH1F*   fh1JetPt;       //! jet pt of all jets 

    TString fNameFF;        // histo names prefix
    
    ClassDef(AliFragFuncHistosInvMass, 1);
  };
  
  
  //----------------------------------------

  AliAnalysisTaskJetChem(); 
  AliAnalysisTaskJetChem(const char *name);
  AliAnalysisTaskJetChem(const  AliAnalysisTaskJetChem &copy);
  AliAnalysisTaskJetChem& operator=(const  AliAnalysisTaskJetChem &o);
  virtual ~AliAnalysisTaskJetChem();
  
  virtual void   UserCreateOutputObjects();
  virtual void   UserExec(Option_t *option);

  enum { kV0TypeUndef =0, kOnFly, kOnFlyPID, kOnFlydEdx, kOnFlyPrim, kOffl, kOfflPID, kOffldEdx, kOfflPrim, kV0AODMCExtraonlyCuts};// v0 rec. type 
  enum { kK0, kLambda, kAntiLambda };// particletype 

  enum {kTrackUndef=0, kTrackAOD, kTrackAODQualityCuts, kTrackAODCuts,                                       
	kTrackAODExtra, kTrackAODExtraonly, kTrackAODExtraCuts, kTrackAODExtraonlyCuts,
        kTrackAODMCExtraonlyCharged,kTrackAODMCExtraonlyChargedCuts, 
	kTrackKineAll, kTrackKineCharged, kTrackKineChargedAcceptance, 
	kTrackAODMCAll, kTrackAODMCCharged, kTrackAODMCChargedAcceptance, kTrackAODMCChargedSecS, kTrackAODMCChargedSecNS, kTrackAOCMCChargedPrimAcceptance}; //track type
  enum {kJetsUndef=0, kJetsRec, kJetsRecAcceptance, kJetsGen, kJetsGenAcceptance, kJetsKine, kJetsKineAcceptance,kJetsEmbedded};// jet type


  static  void   SetProperties(TH3F* h,const char* x, const char* y,const char* z);

  //Bool_t IsAccepteddEdx(Double_t mom, Double_t signal, AliPID::EParticleType n, Double_t cutnSig) const;//not used anymore

  Bool_t IsK0InvMass(Double_t mass) const; 
  Int_t  GetListOfV0s(TList *list, Int_t type, Int_t particletype, Int_t tracktype, AliAODVertex* primVertex, AliAODEvent* aod);
  Int_t  GetListOfParticles(TList *list, Int_t type, Int_t particletype, AliAODVertex* primVertex);
  Int_t  GetListOfMCParticles(TList *outputlist, Int_t particletype, AliAODEvent* mcaodevent);
  void   GetTracksInCone(TList* inputlist, TList* outputlist, const AliAODJet* jet, Double_t radius, Double_t& sumPt, Double_t minPt, Double_t maxPt, Bool_t& isBadPt);
  void   GetTracksInPerpCone(TList* inputlist, TList* outputlist, const AliAODJet* jet, Double_t radius, Double_t& sumPerpPt);
  Bool_t MCLabelCheck(AliAODv0* v0, Int_t particletype, const AliAODTrack* trackNeg, const AliAODTrack* trackPos, TList *listmc, Int_t& negDaughterpdg, Int_t& posDaughterpdg, Int_t& motherType, Int_t& v0Label, Double_t& MCPt, Bool_t& fPhysicalPrimary, Int_t& MCv0PDGCode, TString& generatorName, Bool_t& isinjected);
  Bool_t IsParticleMatching(const AliAODMCParticle* mcp0, Int_t v0Label);
  Bool_t DaughterTrackCheck(AliAODv0* v0, Int_t& nnum, Int_t& pnum);
  //Int_t  SplitCocktail(AliAODMCParticle *mcv0,  Int_t v0Label, AliAODMCHeader *header, TClonesArray *arrayMC);
  TString GetGenerator(Int_t label, AliAODMCHeader* header);
  void GetTrackPrimaryGenerator(Int_t lab, AliAODMCHeader *header,TClonesArray *arrayMC,TString &nameGen);
  Bool_t IsTrackInjected(Int_t lab, AliAODMCHeader *header,TClonesArray *arrayMC, TString &nameGen);
  Double_t SmearJetPt(Double_t jetPt, Double_t& jetPtSmear);
  Bool_t IsParticleInCone(const AliVParticle* part1, const AliVParticle* part2, Double_t dRMax) const;
  Bool_t IsRCJCOverlap(TList* recjetlist, const AliVParticle* part, Double_t dDistance) const;
  AliAODJet* GetRandomCone(TList* jetlist, Double_t dEtaConeMax, Double_t dDistance) const;
  void FillEmbeddedHistos(const AliAODJet* embeddedJet, const AliAODJet* matchedJet, Int_t nK0s, Int_t nLa, Int_t nALa, TList* Jettracklist);


  AliAODJet* GetMedianCluster();
  Double_t AreaCircSegment(Double_t dRadius, Double_t dDistance) const;  

  virtual void SetK0Type(Int_t i){ fK0Type = i; }
  virtual void SetFilterMaskK0(UInt_t i) {fFilterMaskK0 = i;}

  Bool_t IsLaInvMass(Double_t mass) const; //La and ALa mass check
  virtual void SetLaType(Int_t i){ fLaType = i; }
  virtual void SetFilterMaskLa(UInt_t i) {fFilterMaskLa = i;}

  virtual void SetALaType(Int_t i){ fALaType = i; }
  virtual void SetFilterMaskALa(UInt_t i) {fFilterMaskALa = i;}

  virtual void SetSelectArmenteros(Bool_t b) {IsArmenterosSelected = b;}
  virtual void SetUseNJEvents(Bool_t b)        { fUseNJEvents = b;}
  virtual void UseExtraTracks()        { fUseExtraTracks =  1;}
  virtual void UseExtraonlyTracks()    { fUseExtraTracks = -1;}
  virtual void SetUseExtraJetPt(Bool_t ut) { fUseExtraJetPt = ut;}
  virtual void SetUseEmbeddedJetPt(Bool_t ut) { fUseEmbeddedJetPt = ut;}

  virtual void SetUseStandardV0s(Bool_t bo) { fUseStandard = bo;}
    
  virtual void SetUsePosV0Eta(Bool_t ps) { fusePosV0Eta = ps;}
  virtual void SetUseNegV0Eta(Bool_t ng) { fuseNegV0Eta = ng;}
  virtual void SetUsePosMCV0Eta(Bool_t pmc) { fusePosMCV0Eta = pmc;}
  virtual void SetUseNegMCV0Eta(Bool_t nmc) { fuseNegMCV0Eta = nmc;}
    
  void CalculateInvMass(AliAODv0* v0vtx, Int_t particletype, Double_t& invM, Double_t& trackPt);
  
  Bool_t AcceptBetheBloch(AliAODv0 *v0, AliPIDResponse *PIDResponse, Int_t particletype); //don't use this method for MC Analysis

  Double_t MyRapidity(Double_t rE, Double_t rPz) const;

  //-- K0s

  void   SetFFInvMassHistoBins(Int_t nJetPt = 19, Float_t jetPtMin = 5., Float_t jetPtMax = 100., //previous 19, 5.,100.
			       Int_t nInvM = 400, Float_t invMMin = 0.3,  Float_t invMMax = 0.7, //previous 0.4 to 0.6
			       Int_t nPt = 200, Float_t ptMin = 0., Float_t ptMax = 20.,         //previous 0. to 10.
			       Int_t nXi = 35, Float_t xiMin = 0., Float_t xiMax = 7.,
			       Int_t nZ = 11,  Float_t zMin = 0.,  Float_t zMax = 1.1)
  { fFFIMNBinsJetPt = nJetPt; fFFIMJetPtMin = jetPtMin; fFFIMJetPtMax = jetPtMax; 
    fFFIMNBinsInvM = nInvM; fFFIMInvMMin = invMMin; fFFIMInvMMax = invMMax; fFFIMNBinsPt = nPt; fFFIMPtMin = ptMin; fFFIMPtMax = ptMax; 
    fFFIMNBinsXi = nXi; fFFIMXiMin = xiMin; fFFIMXiMax = xiMax; fFFIMNBinsZ  = nZ;  fFFIMZMin  = zMin;  fFFIMZMax  = zMax; }


  
  // --La and ALa

  void   SetFFInvMassLaHistoBins(Int_t nJetPt = 19, Float_t jetPtMin = 5., Float_t jetPtMax = 100., //La
				 //Int_t nInvM = 140, Float_t invMMin = 1.06,  Float_t invMMax = 1.2,//original inv. mass range, now I shifted to Vits slightly larger mass window
			       Int_t nInvM = 200, Float_t invMMin = 1.05,  Float_t invMMax = 1.25,
			       Int_t nPt = 200, Float_t ptMin = 0., Float_t ptMax = 20., 
			       Int_t nXi = 35, Float_t xiMin = 0., Float_t xiMax = 7.,
{'fraction_non_alphanumeric': 0.10365915808786057, 'fraction_numerical': 0.015441850983589848, 'mean_word_length': 2.76930464848252, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 54, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4325226', 'n_tokens_mistral': 7401, 'n_tokens_neox': 6749, 'n_words': 1646}