The JetsWithoutJets package is based on the physics described in: Jet Observables Without Jet Algorithms Daniele Bertolini, Tucker Chan, and Jesse Thaler arXiv: 13xx.xxxx --- ---------------------- Shape Trimming ---------------------- * Shape trimming is implemented as a Selector, in analogy with other grooming procedures in FastJet. SelectorShapeTrimming takes four arguments in its constructor. double Rjet; // jet radius double pTcut; // jet pT cut double Rsub; // subjet radius double fcut; // fractional cut on pTsub/pTjet Selector trimmer=SelectorShapeTrimming(Rjet,pTcut,Rsub,fcut); * The trimmer works by taking every particle i, and only keeping particles that satisfy the criteria pTi,Rsub > fcut * pTi,Rjet. Here, pTi,R is the radiation contained within a radius R of particle i. * Alternatively, one can use trimming as a jet shape, which acts as a Transformer: JetShapeTrimmer jetShapeTrimmer(Rsub,fcut); Here the pT used to apply the fcut criteria is the sum pT of the jet consistuents. ---------------------- Jet-like Event Shapes ---------------------- * The various event shapes described in the physics paper derive from JetLikeEventShape. The included examples are: ShapeJetMultiplicity: "counts" the number of jets ShapeScalarPt: a.k.a. HT = sum_i pTjet_i ShapeScalarPtToN: sum_i (pTjet_i)^N ShapeSummedMass: Sum of invariant masses ShapeSummedMassSquared: Sum of invariant mass-squared ShapeMissingPt: Magnitude of missing transverse momentum ShapeTrimmedSubjetMultiplicity: "counts" number of kept trimmed subjets Other functions will be added upon request. * All of the JetLikeEventShapes can be called using two constructors, one that gives the default version of the event shape that only has a jet radius Rjet and pT threshold pTcut: ShapeJetMultiplicity Nj(Rjet,pTcut); and one that includes trimming built-in: ShapeJetMultiplicity Nj_trim(Rjet,pTcut,Rsub,fcut); Once constructed they can be used using the () or result() command acting on a vector. * Note that Nj_trim(inputs) is not the same as Nj(trimmer(input)). In the case of the built-in trimming, the trimming criteria are implemented as theta functions in the event shape, so quantities like pTi,R are untrimmed. In the case of the external trimmer, particles are removed prior to calculating pT values, so pTi,R is already trimmed. We have left in both versions of the algorithm, since it is not clear a priori which method will be better when combined with area subtraction. For cases like ShapeSummedMass which are quadratic in input particles, we find that applying trimming first gives better performance. ---------------------- Variable pT and variable R ---------------------- * As described in the physics paper, it is possible to vary the pT or R values without having to fully recalculate the event shapes. At the moment, only variable pT cuts have been implemented as a general class JetLikeEventShape_VariablePtCut. After using the set_input() function on a vector, you can find the eventShapeFor() a given value of the pT cut, or the ptCutFor() a given value of the event shape. It is also possible to get the full array of pTcut and eventShape values. * For the case of jet multiplicity, there is a pre-built class for ShapeJetMultiplicity_VariablePtCut. This includes an offset value by default, such that ptCutFor(n) gives the value of the event shape at (n - 0.5), as explained in the physics paper. This offset can be changed in the constructor. * The only variable R event shape at the moment is ShapeJetMultiplicity_VariableR. For this class, there is only eventShapeFor() a given value of pT cut, because the inverse function is not single-valued. One can still get the full array of R and eventShape values. Because of the computational costs of doing the variable R procedure, we have not implemented this as a general class. ---------------------- Axes Finding through Event Shape Density ---------------------- * Though the event shapes themselves do not have a clustering interpretation, we can assign particles to jets using a hybrid event shape density. The class EventShapeDensity_JetAxes implements this functionality. It takes Rjet and ptcut as inputs, and after set_inputs() is called, axes() returns the jet axes as determined by a winner-take-all recombination scheme. Note that this axis is *not* the sum of its constituents. * In the future, we plan to include the option of outputting the constituents of a jet axis. * This is the least developed part of the code (and the least developed part of the theory), and is likely to evolve significantly. Correspondingly, the user should treat these results with more caution. The ---------------------- Technical Details ---------------------- * All of the jet-like event shapes ultimately derive from "MyFunctionOfVectorOfPseudoJets". This class is similar to fastjet::FunctionOfPseudoJet, except it returns the result() acting on a vector. We anticipate that this functionality will be added to FastJet in the future, hence the "My" prefix to avoid naming conflicts in the future. * To build one's own JetLikeEventShape, all one needs to write is a function acting on the constituents of a jet, written as a functor derived from MyFunctionOfVectorOfPseudoJets. For example, FunctorJetCount was used to build ShapeJetMultiplicity. * At present, JetLikeEventShape only returns a double. This means that cases like ShapeMissingPt (which are fundamentally based on a transverse vector) have to be coded separately. In the future, we may add the option for JetLikeEventShape to return an arbitrary class. * The WinnerTakeAllRecombiner is a recombination scheme that is valid in its own right, and could be used in ordinary jet clustering. In the physics paper, we compare the results of EventShapeDensity_JetAxes to anti-kT clustering with WinnerTakeAllRecombiner. * To improve the speed of various aspects of the program, we have a JWJStorageArray, which finds 2R x 2R overlapping blocks of particles to limit the number of computations that need to be done. By default, this is always used, but can be turned off in the JetLikeEventShapes or in EventShapeDensity_JetAxes using setUseStorageArray(). (Typically, there is no reason to turn it off, unless you mistrust our code!) At present, it cannot be turned off for Shape Trimming, though we can add that option if users request it. We have not yet implemented it for JetLikeEventShape_VariablePtCut or ShapeJetMultiplicity_VariableR. Again, we will be motivated to add that functionality on request.