KaliVeda
Toolkit for HIC analysis
Loading...
Searching...
No Matches
Release Notes for KaliVeda

Table of Contents

Last update: 2nd April 2024

On branch: dev

Release 1.14/02 (released: 2/4/2024 tag:1.14.2)

See full list of commits here

See milestone 1.14.2 for issues (bugfixes & enhancements) associated with this release.

Summary of other changes

Release 1.14/01 (released: 15/3/2023 tag:1.14.1)

See full list of commits for tag 1.14.1 here

See milestone 1.14.1 for issues (bugfixes & enhancements) associated with this release.

Summary of other changes

  • new doc for kaliveda-sim [Applications & GUI]
    • can now specify run number when filtering with ad hoc reaction kinematics
  • INDRA 2nd campaign CsI calibrations included for all rings (2-17)

Release 1.14/00 (released: 9/3/2023 tag:1.14.0)

See full list of commits for tag 1.14.0 here

Bugfixes & enhancements

See milestone 1.14.0 for issues (bugfixes & enhancements) associated with this release.

In addition:

Changes in Build System

Minimum cmake version is now 3.12.

E789: New INDRA CsI calibration [02/03/2023]

A full calibration of all INDRA CsI detectors is now available for E789 data. It is based on a scaling of the total light output compared to the 2nd campaign (1994) data for Ni+Ni. When analysing the existing reconstructed data, a patch (KVDataPatch_E789_INDRANewCsICalib) is applied to update the energies and status of all particles stopping in INDRA CsI detectors.

Any particle to which this patch is applied will have new parameters:

DATAPATCH.E789_INDRANewCsICalib.APPLIED = true
DATAPATCH.E789_INDRANewCsICalib.OLD_ECODE = [...]
DATAPATCH.E789_INDRANewCsICalib.OLD_ENERGY = [...]
DATAPATCH.E789_INDRANewCsICalib.OLD_CSI_ENERGY = [...]

Existing datasets removed from source repository [15/02/2023]

Existing experimental datasets are now stored in repositories separate from the source code, part of the https://gitlab.in2p3.fr/kaliveda-dev/datasets group on gitlab.in2p3.fr. This means that by default, when the sources are downloaded, no datasets are downloaded and therefore no datasets are installed or defined.

In order to add datasets to the build/installation, new build options

  • WITH_INDRA_DATASETS
  • WITH_FAZIA_DATASETS
  • WITH_INDRAFAZIA_DATASETS

are available and should be enabled as required (see Build options). This will handle the download of the required datasets automatically when cmake is run.

Note
The dataset directories are handled by git submodule. If, after having enabled one or more datasets, you update the source directory with git pull, and this update includes changes to the dataset directories, you have to manually update them with a further git submodule update command. See https://delicious-insights.com/en/posts/mastering-git-submodules/

New isoscaling analysis tool [09/11/2022]

[Data Analysis Tools]

Isoscaling corresponds to the scaling behaviour obtained from the ratio \( R_{21}(N,Z) \) of the same isotope measured with two colliding systems differing in their neutron-to-proton content, \( Y_{(1)}(N,Z) \) and \( Y_{(2)}(N,Z) \), where \( (2) \) stands for the neutron-rich system.

In a variety of HIC an exponential dependence of the ratio on N and Z is observed, such as

\[ R_{21}(N,Z) = \frac{Y_{(2)}(N,Z)}{Y_{(1)}(N,Z)} = C\,exp\left[ \alpha N + \beta Z \right] \]

where \( C \) is an overall normalization constant while \( \alpha \) and \( \beta \) are the isoscaling parameters.

KVIsoscaling, contributed by Quentin Fable (quent.nosp@m.in.f.nosp@m.able@.nosp@m.l2it.nosp@m..in2p.nosp@m.3.fr), is the class used to perform the isoscaling analyses in the recent INDRA-VAMOS paper Phys. Rev. C 106 024605 (2022).

Generic event mixing algorithm for correlation studies [26/10/2022]

[Data Analysis Tools]

KVEventMixer is a generic implementation of the event mixing technique used to estimate the uncorrelated background for two-particle correlation functions. Events belonging to different user-defined event classes can be treated separately at the same time. Given events containing particles of type A and particles type B, it is assumed the user wants to construct some quantity which can be calculated from the properties of any pair (A,B), using both correlated and uncorrelated (mixed) pairs. The algorithm requires the user to provide:

  • iterators to perform loops over A and B particles in each event;
  • functions to treat each correlated and uncorrelated pair (A,B)

An example of use in an analysis class is given in ExampleCorrelationAnalysis.cpp

New hybrid SQLite/ROOT file for storing objects [6/9/2022]

[Databases]

KVSQLROOTFile is intended to solve a longstanding problem with ROOT files containing many (and possibly "large") objects: in order to make any selection of the objects based on their associated properties, or indeed just to list the objects according to their properties, requires to read into memory each of the objects in question, which can be very slow.

When objects are written to a KVSQLROOTFile, the object itself is written in a ROOT file with an automatically generated unique identifier, while a list of associated metadata (chosen by the user) is written in a separate SQLite database file (see KVSQLite::database).

It is then possible to list the metadata of all objects in the file without reading them into memory, just by consulting the SQLite database. Selected objects can also be retrieved from the ROOT file based on the stored metadata.

KVSQLROOTIDGridManager uses a KVSQLROOTFile back-end in order to vastly speed up loading of identification grids when analysing experimental data. See source code inside KVMultiDetArray::MakeMultiDetector().

Multi-gaussian fits to PID mass spectra [15/6/2022]

[Particle Identification]

New class KVMultiGaussIsotopeFit is now used by KVIDZAFromZGrid to fit PID mass spectra with a weighted sum of gaussians plus a background function. This is a huge improvement on the previous identification method of KVIDZAFromZGrid, as it allows to perform background suppression and also estimate the degree of confidence of mass identification.

General event iterators and new KVTemplateParticleCondition [31/5/2022]

[Nuclei & Events]

It is now possible to iterate over an arbitrary selection of particles in an event using a KVTemplateParticleCondition object (KVParticleCondition is now an alias for KVTemplateParticleCondition<KVNucleus>):

for(auto& rn : recev.ConditionalIterator({"Zid",[](const KVReconstructedNucleus* n){ return n->IsZMeasured(); }}))
{
// loop over reconstructed nuclei with identified Z
}
// OR:
KVEvent* e = &recev;
for(auto& rn : ReconEventIterator(e, {"Zid",[](const KVReconstructedNucleus* n){ return n->IsZMeasured(); }}))
{
// loop over reconstructed nuclei with identified Z
}
#define e(i)
Abstract base class container for multi-particle events.
Definition KVEvent.h:67
Event containing KVReconstructedNucleus nuclei reconstructed from hits in detectors.
Nuclei reconstructed from data measured by a detector array .
Wrapper class for iterating over nuclei in KVReconstructedEvent accessed through base pointer or refe...
const Int_t n

Note that the type of the pointer used in the lambda function argument must match the event particle type:

Event class Iterator wrapper Particle condition class lambda signature
KVNucleusEvent EventIterator KVTemplateParticleCondition<KVNucleus> bool [](const KVNucleus*)
KVReconstructedEvent ReconEventIterator KVTemplateParticleCondition<KVReconstructedNucleus> bool [](const KVReconstructedNucleus*)
KVSimEvent SimEventIterator KVTemplateParticleCondition<KVSimNucleus> bool [](const KVSimNucleus*)

Events can contain any KVParticle-derived class [19/5/2022]

[Nuclei & Events]

Previously, KVTemplateEvent could only be used with KVNucleus and derived classes. This condition has now been relaxed to include the KVParticle base class of KVNucleus. As a result, the behaviour of some old KVEvent methods has changed:

KVEvent* p_ev = &recev;
recev.AddParticle(); // returns KVReconstructedNucleus*
p_ev->AddParticle(); // return KVParticle* (used to be KVNucleus*)
recev.GetParticle(1); // returns KVReconstructedNucleus*
p_ev->GetParticle(1); // return KVParticle* (used to be KVNucleus*)
recev.GetNextParticle(); // returns KVReconstructedNucleus*
p_ev->GetNextParticle(); // return KVParticle* (used to be KVNucleus*)
virtual KVParticle * GetNextParticle(Option_t *="") const =0
virtual KVParticle * AddParticle()=0
virtual KVParticle * GetParticle(Int_t npart) const =0
Particle * GetParticle(Int_t npart) const
Particle * GetNextParticle(Option_t *opt="") const
Particle * AddParticle()

New methods have been added which return KVNucleus pointers:

recev.AddNucleus(); // returns KVNucleus*
p_ev->AddNucleus(); // returns KVNucleus*
KVNucleus * AddNucleus()
Definition KVEvent.cpp:109

If the event does not contain particles derived from KVNucleus, these methods return nullptr:

partev.AddNucleus(); // returns nullptr
partev.GetNucleus(1); // returns nullptr
partev.GetParticle(1); // returns KVParticle* pointer to particle
KVNucleus * GetNucleus(Int_t npart) const
Definition KVEvent.cpp:92
Base class for event classes (containers for different types of particle objects)

New data quality auditing tools [5/8/2021]

[Data Analysis Infrastructure]

KVDataQualityAudit is a simple class which can contain many essential informations about experimental data identification and calibrations, which can be used:

  • to assess the quality of newly-reconstructed & calibrated data;
  • to implement an accurate replica of experimental identification capabilites, when filtering simulated data.

Data can be audited using the new dedicated analysis task, "Prepare data quality audits", run by KVDataQualityAuditSelector. We provide also KVDataQualityAuditReportMaker to help with the production of graphs and histograms from the audit.

Improvements to Global Variables [24/6/2021]

[Global Variables]

The following improvements have been made:

  • All global variables can now 'tag' the particles which pass their selection criteria, by creating groups which, by default have the name of the variable (an alternative name can be given). This is handled by KVVarGlob::SetDefineGroup(), which can be used as in the following example:
[in the InitAnalysis() method of some analysis class]
auto gv = AddGV("KVMult","alpha");
gv->SetSelection({"ALPHA", [](const KVNucleus* n){
return dynamic_cast<const KVReconstructedNucleus*>(n)->IsAMeasured()
&& n->IsIsotope(2,4); // count isotopically identified alpha particles
};
gv->SetDefineGroup(); // create group "alpha" for these particles
[in the Analysis() method of the class]
for(auto& n : ReconEventGroupIterator(GetEvent(), "alpha"))
{
// loop over the isotopically identified alpha particles
}
Multiplicity of all nuclei in event (including )
Definition KVMult.h:15
Description of properties and kinematics of atomic nuclei.
Definition KVNucleus.h:126
Wrapper class for iterating over groups of nuclei in KVReconstructedEvent accessed through base point...
  • Note that it was previously stated in the class documentation for KVSource that the variable tagged each particle used to reconstruct the source: in fact this was not true, but has now been correctly implemented. The tagging is done by default, there is no need to call KVVarGlob::SetDefineGroup() for this variable (unless you want to change the default name used for the group).
  • It is now possible to classify events using mathematical expressions involving the different values of multi-valued global variables with KVEventClassifier. For example, for a KVSource global variable, which provides the values "Ex" and "A" (excitation energy and mass of the reconstructed source) it is now possible to sort events according to excitation energy per nucleon by doing the following:
KVGVList list_of_variables;
list_of_variables.AddGV("KVSource", "QP");
auto ec = list_of_variables.AddEventClassifier("QP", "Ex/A");
#define KVGVLIST_OPTIMIZE_GVLIST
Definition KVGVList.h:227
KVEventClassifier * AddEventClassifier(const TString &varname, const TString &value="")
Definition KVGVList.cpp:612
KVVarGlob * AddGV(const Char_t *class_name, const Char_t *name)
Definition KVGVList.cpp:705

Major improvements to handling of kinematical frames [21/6/2021]

[Nuclei & Events]

Including:

  • Bugfix : when a nucleus was accessed in a reference frame that was not its default frame, attributing a group to the particle would only affect the specific frame, and not the nucleus per se: this affected especially global variable classes whose KVVarGlob::fill() method acts on a pointer to the nucleus in the reference frame given by KVVarGlob::SetFrame() method. This has now been solved, so that all non-kinematical properties of particles (associated parameters, groups) are now the same in all reference frames.
  • It is now possible to access the default kinematics of a particle using any of its defined kinematical frames, using KVParticle::GetCurrentDefaultKinematics().

Handling rotational energy in KVGemini [29/5/2021]

[Modelling and Simulation Tools]

In the KVGemini interface to the GEMINI++ statistical decay code, we now add systematically any rotational energy of the nuclei to deexcite to their internal excitation energy (which normally only accounts for thermal excitation) before calculating the decay. This is because GEMINI++ expects \(E*=U+E_{rot}\) and subtracts \(E_{rot}\) from \(E*\) in order to calculate the thermal excitation energy \(U\) available for decay. To ensure consistency the \(E_{rot}\) added by KVGemini is calculated according to the GEMINI++ prescription.

See methods KVGemini::DecayEvent() and KVGemini::DecaySingleNucleus().

Templated event classes [28/5/2021]

[Nuclei & Events]

In the C++ standard library, containers are generally used to store values and objects whose type is defined at compile time through template parameters: std::vector<int>, std::unordered_map<std::string, std::thread>, etc.

In ROOT (and in KaliVeda), containers such as TList handle pointers to objects which may be of any type derived from TObject, and the actual type of the objects in any list is usually determined at runtime.

A great advantage of the standard containers is they provide iterators which make it possible to loop very simply over their contents, with a range-based for loop:

std::vector<int> V;
for(auto v : V) { std::cout << v << std::endl; }
v

The type of the auto v variable is the type of the objects in the vector (int in this case).

STL-style iterators were already added to KVEvent some time ago to enable the use of range-based for loops with all event classes, but they had the following small drawback:

for(auto& n : R) { std::cout << n.GetIDCode() << std::endl; }
constexpr Double_t R()

This code would not compile, because although we would expect n to be of type KVReconstructedNucleus&, in fact for all event classes the iterators returned base class references KVNucleus&.

This has now been resolved by realising that the event classes are in fact STL-style containers for particle/nucleus types: a KVReconstructedEvent contains KVReconstructedNucleus objects, a KVSimEvent contains KVSimNucleus objects. Regarding the original KVEvent base class for all events, it is now an abstract base class and KVEvent objects cannot be instantiated. An event of KVNucleus objects is now called KVNucleusEvent - this could be a major code-breaker but was necessary to ensure backwards compatibility (still able to read existing data).

See Nuclei & Events for a full explanation of how to use the new event classes and iterators.

New multicore "batch" system [3/5/2021]

[Data Analysis Tools Infrastructure]

On multicore machines, PROOFLite can be used for analysis of any data contained in a TTree (e.g. reconstructed data). However raw data is usually contained in some other type of file and PROOFLite cannot be used. New "batch" system KVXtermBatch has been developed to remedy this.

When analysing or reconstructing raw data not contained in a TFile on a multicore machine, KaliVedaGUI will automatically switch to the new batch system in order to exploit all cores of the PC. When N runs are to be analysed on an M-core machine, this batch system will run M jobs concurrently with the N runs shared as evenly as possible among the jobs.

Version 1.12/06 (Released: 28/03/2022 Tag: release-1.12.06)

Changes in FAZIA Data Analysis : Bugfix for raw FAZIA data analysis

When analysing raw FAZIA data, detectors were not reset before reading a new event, leading to a steadily increasing number of fired detectors with each new event. A small change to KVMultiDetArray::prepare_to_handle_new_raw_data() fixes this.

Version 1.12/05 (Released: 23/03/2022 Tag: release-1.12.05)

Changes in Build System

Starting from v1.12/05, we require a minimum ROOT version of 6.18, minimum cmake version 3.5, and a compiler (the same as that used to compile ROOT) with at least support for C++14.

New methods and symbols to handle identification/calibration codes

[INDRA-specific Data Analysis Tools / FAZIA Data Analysis / INDRAFAZIA Data Analysis]

New symbolic names (enumerations) have been added to clarify the meanings of the different identification and calibration codes for reconstructed particles detected in different arrays. See KVINDRA::IDCodes and KVFAZIA::IDCodes.

There are also some new methods to facilitate selection of appropriate codes for analysis of data in user's KVEventSelector::InitRun() method:

Rejecting events based on DAQ trigger conditions (E789)

[INDRAFAZIA Data Analysis]

FAZIA trigger conditions for each run of E789 have now been implemented. Calling SetTriggerConditionsForRun() in the InitRun() method of an analysis class used on E789 data will now reject any event which does not have a FAZIA trigger bit pattern compatible with that which is expected for the data.

In concrete terms, this means that for analysis of physics runs (for which FAZIA trigger conditions were "M>=2" and "M>=1" downscaled by 100), only events for which the "M>=2" trigger pattern fired are accepted. Note that for the FAZIA trigger pattern to be acceptable, FAZIA must be part of the event, i.e. we also reject the (very rare) spurious cases where only INDRA is present.

See KVFAZIATrigger, KVINDRAFAZIAE789TriggerConditions, KVFAZIA::SetTriggerPatternsForDataSet(), KVFAZIA::GetTriggerForCurrentRun(), KVFAZIA::ReadTriggerPatterns.

Dummy global variables

[Global Variables]

A KVDummyGV can be added to a KVGVList of global variables, not to calculate anything, but just to perform a selection of events with the KVVarGlob::TestEventSelection() mechanism.

To use, simply add a KVDummyGV to the list of global variables in your analysis, and define the required event selection by calling method KVVarGlob::SetEventSelection() with a lambda function having the required 'bool (const KVVarGlob*)' signature.

Version 1.12/03 (Released: 04/5/2021 Tag: release-1.12.03)

Bugfixes

  • correct bug in KVParticleCondition when using (old-style) pseudo-code (not lambdas);
  • fix bug in KVEvent::MakeEventBranch which could either explode or (silently) not write any events in a TTree;
  • fix (potential) bug with gamma multiplicities in reconstructed events.

Versions 1.12/01 (Released: 19/2/2021) & 1.12/02 (Released: 01/4/2021 Tag: release-1.12.01)

Reusable analysis classes [19/2/2021]

[Data Analysis Tools]

As part of ongoing efforts to make analysis classes more flexible and efficient, it is now possible to use the same analysis class to analyse several different types of data. Any analysis derived from KVReconEventSelector (generic reconstructed event analysis class) can now be used:

  • analyse generic reconstructed data [this was already the case];
  • analyse reconstructed INDRA data [previously only possible with a specific class derived from KVINDRAEventSelector];
  • analyse filtered simulated data

Rejecting events based on DAQ trigger conditions [28/1/2021]

[Data Analysis Tools]

Rejection of reconstructed events which are not consistent with the online DAQ trigger of each run is now handled by a new class KVTriggerConditions. This is in order to be able to handle situations which are more complicated than a simple minimum global multiplicity.

In analysis classes, the rejection is handled by calling KVEventSelector::SetTriggerConditionsForRun() in the InitRun() method of the analysis class. This replaces the condition

if( !GetEvent()->IsOK() ) return kFALSE;
constexpr Bool_t kFALSE

which was previously used at the beginning of the Analysis() method. The new mechanism is implemented by default in the new examples and templates for automatically-generated user analysis classes. For the moment, trigger conditions for INDRA data are handled; the implementation for other data will follow shortly.

Changes to global variables [22/1/2021]

[Global Variables]

Modification required to plugin declaration for any user-defined global variable classes, constructor with const char* argument (variable name) must be used, like so:

+Plugin.KVVarGlob: MyNewVarGlob MyNewVarGlob MyNewVarGlob.cpp+ "MyNewVarGlob(const char*)"

Definition of new frames using global variables [11/12/2020]

[Global Variables]

Global variables in a KVGVList can be used to define new kinematical reference frames which are available for all variables which come later in the list.

As an example of use, imagine that KVZmax is used to find the heaviest (largest Z) fragment in the forward CM hemisphere, then the velocity of this fragment is used to define a "QP_FRAME" in order to calculate the KVFlowTensor in this frame:

KVGVList vglist;
auto vg = vglist.AddGV("KVZmax", "zmax");
vg->SetFrame("CM");
vg->SetSelection( {"V>0", [](const KVNucleus* n){ return n->GetVpar()>0; }} );
vg->SetNewFrameDefinition(
[](KVEvent* e, const KVVarGlob* v){
e->SetFrame("QP_FRAME", static_cast<const KVZmax*>(v)->GetZmax(0)->GetVelocity());
});
vg = AddGV("KVFlowTensor", "qp_tensor");
vg->SetFrame("QP_FRAME"); // frame will have been defined before tensor is filled
Base class for all global variable implementations.
Definition KVVarGlob.h:233
void SetFrame(const Char_t *ref)
Definition KVVarGlob.h:505
Global variable used to sort particles in order of decreasing atomic number
Definition KVZmax.h:35

Event selection using global variables [21/9/2020]

[Global Variables]

Event selection can be performed automatically based on the values of the global variables in a KVGVList. This is implemented for example in KVEventSelector, the base class for all analysis classes. This can improve the speed of analyses, as the conditions are tested for each global variable as soon as they are calculated, and processing of the event aborted if it fails. Variables used for event selection should added to the list of gobal variables before any others in order to optimise the speed of analysis.

For example, to retain for analysis only events with a total measured charge in the forward c.m. hemisphere which is at least equal to 80% of the charge of the projectile:

int UserAnalysis::fZproj;// member variable (in .h file)
void UserAnalysis::InitAnalysis()
{
auto vg = AddGV("KVZtot", "ztot");
vg->SetFrame("cm");
vg->SetSelection("Vcm>0", [](const KVNucleus* n){ return n->GetVpar()>0; });
// note capture by reference in order to use value of fZproj (not defined yet)
vg->SetEventSelection([&](const KVVarGlob* v){ return v->GetValue()>0.8*fZproj; });
}
void UserAnalysis::InitRun()
{
// initialize fZproj for current run
fZproj = GetCurrentRun()->GetSystem()->GetZproj();
}

Changes to Core classes [11/8/2020]

[Core ROOT classes]

Added STL-style iterator to KVNameValueList. It is now possible to do the following (with C++11 support enabled):

p.SetValue("X",3.6);
p.SetValue("Y",false);
p.SetValue("Z","hello");
for(auto& d:p) { d.Print(); }
Info in <KVNamedParameter::Print>: Name = X type = Double_t value = 3.600000
Info in <KVNamedParameter::Print>: Name = Y type = Bool_t value = false
Info in <KVNamedParameter::Print>: Name = Z type = string value = hello
std::string hello(std::string who, std::string msg)
#define d(i)
bool Bool_t
double Double_t
#define X(type, name)
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
void Info(const char *location, const char *fmt,...)
const char * Name

Major rewrite of global variable classes [9/8/2020]

[Global Variables]

Previously, there was much source of confusion as different variables could have specific ways of defining which nuclei they would include, in which frame, etc., while the base methods of KVVarGlob for defining particle selection and kinematical frames were not always respected by all classes.

Now, the same logic is applied to all global variable classes:

  • individual variable classes define only how they are filled from nuclei by overriding KVVarGlob::fill(), KVVarGlob::fill2() or KVVarGlob::fillN() method, depending on whether they are 1-, 2- or \(N\)-body observables, respectively;
  • particle selection is handled only by use of KVVarGlob::SetSelection() and (new) KVVarGlob::AddSelection() methods; the latter adds a selection which will operate in addition to any existing selection (logical AND);
  • kinematic frame selection is handled only by use of KVVarGlob::SetFrame(); note that the same frame will also be used for any kinematic quantities used to select particles.

As an example, consider the KVEtrans variable, which calculates the sum of transverse kinetic energies for each event. Without writing a new class, the same variable can be used in very different ways:

KVEtrans e1("et"); // total transverse energy of all particles
KVEtrans e2("et_imf");
e2.SetSelection("_NUC_->GetZ()>2"); // total transverse energy of fragments
KVEtrans e3("et_imf_fwcm");
e3.SetSelection("_NUC_->GetZ()>2");
e3.AddSelection("_NUC_->GetVpar()>0");
e3.SetFrame("CM"); // total transverse energy of fragments in forward CM hemisphere
Sum of transverse kinetic energies in event.
Definition KVEtrans.h:17

In addition, as part of this rationalization, all existing global variables calculating multiplicities, or sums or mean values of scalar quantities have been reimplemented using KVVGSum, which vastly reduces code replication.

All 'Av' variants (calculating various multiplicities or sums in the "forward" hemisphere) have been removed, as they can all be implemented using existing classes just by applying particle selection criterion

vg.AddSelection([](const KVNucleus*n){ n->GetVpar()>0; }

and optionally defining the correct frame in which to apply it:

vg.SetFrame("CM");

Removed classes : KVZboundMean, KVTenseur3, KVTensP, KVTensE, KVTensPCM, KVMultAv, KVMultLegAv, KVMultIMFAv, KVZtotAv, KVRisoAv

ALL EXISTING USER GLOBAL VARIABLES NEED TO BE REWRITTEN TO RESPECT THE NEW FRAMEWORK


Event iterator bugfix [7/8/2020]

[Nuclei & Events]

Changes to KVEvent::Iterator

  • there was a bug with the implementation of the iterator, methods pointer() and reference() clashed with implicitly-declared member types from std::iterator. Names of methods changed to KVEvent::Iterator::get_pointer() and KVEvent::Iterator::get_reference().

Particle selection using lambda captures (C++11..) [27/7/2020]

[Data Analysis Tools]

KVParticleCondition has been extended to use lambda expressions (if KaliVeda is compiled with ROOT version 6 or later)

The lambda must take a const KVNucleus* pointer as argument and return a boolean:

KVParticleCondition l1("Z>2", [](const KVNucleus* nuc){ return nuc->GetZ()>2; });
KVParticleCondition l2("Vpar>0", [](const KVNucleus* nuc){ return nuc->GetVpar()>0; });
Int_t GetZ() const
Return the number of proton / atomic number.
Double_t GetVpar() const
Definition KVParticle.h:675

Note the first argument to the constructor is a name which the user is free to define in order to remember what the condition does.

Like any lambda expressions, variables can be 'captured' from the surrounding scope, which can be useful in some situations. For example, given the following definitions:

int zmin = 3;
KVParticleCondition l3("Z>zmin", [&](const KVNucleus* nuc){ return nuc->GetZ()>=zmin; });

then the limit for the selection can be changed dynamically like so:

KVNucleus N("7Li");
l3.Test(&N); ==> returns true
zmin=5;
l3.Test(&N); ==> returns false
#define N

Version 1.11/00

Released: 9th March 2020