Skip to content
Snippets Groups Projects
Commit 902eceea authored by batyuk's avatar batyuk
Browse files

The package is updated to the latest version. A new structure

adviced by maintainers is implemented.
See README to get more info.
parent 548e7e58
No related branches found
No related tags found
No related merge requests found
Showing
with 249 additions and 114 deletions
......@@ -4,59 +4,40 @@
#pragma link off all classes;
#pragma link off all functions;
// Main MpdFemtoMaker classes
#pragma link C++ class MpdFemtoMultiTrackCut+;
#pragma link C++ class TpcLocalTransform+;
#pragma link C++ class MpdFemtoMaker+;
#pragma link C++ class MpdFemtoModelWeightGeneratorLednicky+;
#pragma link C++ class MpdFemtoManager+;
// Analyses
#pragma link C++ class MpdFemtoAnalysis+;
#pragma link C++ class MpdFemtoLikeSignAnalysis+;
#pragma link C++ class MpdFemtoReactionPlaneAnalysis+;
#pragma link C++ class MpdFemtoVertexAnalysis+;
#pragma link C++ class MpdFemtoVertexMultAnalysis+;
// Base classes
#pragma link C++ class MpdFemtoBaseAnalysis+;
#pragma link C++ class MpdFemtoBaseEventReader+;
#pragma link C++ class MpdFemtoBaseEventCut+;
#pragma link C++ class MpdFemtoBaseTrackCut+;
#pragma link C++ class MpdFemtoBaseV0Cut+;
#pragma link C++ class MpdFemtoBaseXiCut+;
#pragma link C++ class MpdFemtoBaseKinkCut+;
#pragma link C++ class MpdFemtoBaseParticleCut+;
#pragma link C++ class MpdFemtoBasePairCut+;
#pragma link C++ class MpdFemtoModelGausLCMSFreezeOutGenerator+;
#pragma link C++ class MpdFemtoXi+;
#pragma link C++ class MpdFemtoModelManager+;
#pragma link C++ class MpdFemtoHelix+;
#pragma link C++ class MpdFemtoCutMonitorHandler+;
#pragma link C++ class MpdFemtoBaseCutMonitor+;
#pragma link C++ class MpdFemtoBaseCorrFctn+;
#pragma link C++ class MpdFemtoBaseModelFreezeOutGenerator+;
#pragma link C++ class MpdFemtoModelHiddenInfo+;
#pragma link C++ class MpdFemtoBaseModelWeightGenerator+;
// Cuts and
#pragma link C++ class MpdFemtoMultiTrackCut+;
#pragma link C++ class MpdFemtoCutMonitorHandler+;
// Main classes
#pragma link C++ class MpdFemtoPicoEvent+;
#pragma link C++ class MpdFemtoBaseModelFreezeOutGenerator+;
#pragma link C++ class MpdFemtoTriplet+;
#pragma link C++ class MpdFemtoPicoEventCollectionVectorHideAway+;
#pragma link C++ class MpdFemtoAnalysis+;
#pragma link C++ class MpdFemtoBaseCorrFctn+;
#pragma link C++ class MpdFemtoBaseEventReader+;
#pragma link C++ class MpdFemtoEvent+;
#pragma link C++ class MpdFemtoTrack+;
#pragma link C++ class MpdFemtoV0+;
#pragma link C++ class MpdFemtoKink+;
#pragma link C++ class MpdFemtoXi+;
#pragma link C++ class MpdFemtoTriplet+;
#pragma link C++ class MpdFemtoParticle+;
#pragma link C++ class MpdFemtoLikeSignAnalysis+;
#pragma link C++ class MpdFemtoPair+;
// Internal PicoEvent and PicoCollection
#pragma link C++ class MpdFemtoPicoEvent+;
#pragma link C++ class MpdFemtoPicoEventCollectionVectorHideAway+;
// Monte Carlo weights
#pragma link C++ class MpdFemtoModelHiddenInfo+;
#pragma link C++ class MpdFemtoModelGausLCMSFreezeOutGenerator+;
#pragma link C++ class MpdFemtoModelManager+;
#pragma link C++ class MpdFemtoModelWeightGeneratorLednicky+;
// StarClassLibrary adopted classes
#pragma link C++ class MpdFemtoHelix+;
#pragma link C++ class MpdFemtoParticle+;
#pragma link C++ class MpdFemtoPhysicalHelix+;
#pragma link C++ class MpdFemtoTrack+;
#pragma link C++ class MpdFemtoV0+;
#pragma link C++ class MpdFemtoBaseParticleCut+;
#pragma link C++ class MpdFemtoBasePairCut+;
#pragma link C++ class MpdFemtoBaseTrackCut+;
#pragma link C++ class MpdFemtoBaseEventCut+;
#pragma link C++ class MpdFemtoBaseAnalysis+;
#endif
# Create a library called "MpdFemtoMaker"
set(INCLUDE_DIRECTORIES
${BASE_INCLUDE_DIRECTORIES}
${CMAKE_SOURCE_DIR}/mcstack
......@@ -8,10 +10,8 @@ set(INCLUDE_DIRECTORIES
${CMAKE_SOURCE_DIR}/tpc
${CMAKE_SOURCE_DIR}/lhetrack
${CMAKE_SOURCE_DIR}/kalman
${CMAKE_SOURCE_DIR}/physics/femto
${CMAKE_SOURCE_DIR}/physics/femto/base
${CMAKE_SOURCE_DIR}/mpddst/mcDst
)
${CMAKE_SOURCE_DIR}/physics/femto/MpdFemtoMaker
)
Set(SYSTEM_INCLUDE_DIRECTORIES
${ROOT_INCLUDE_DIR}
......@@ -32,42 +32,39 @@ link_directories(${LINK_DIRECTORIES})
# List of source files
set(SRCS
MpdFemtoMultiTrackCut.cxx
TpcLocalTransform.cxx
MpdFemtoMaker.cxx
MpdFemtoModelWeightGeneratorLednicky.cxx
MpdFemtoManager.cxx
MpdFemtoModelGausLCMSFreezeOutGenerator.cxx
MpdFemtoXi.cxx
MpdFemtoModelManager.cxx
MpdFemtoHelix.cxx
MpdFemtoCutMonitorHandler.cxx
MpdFemtoBaseCutMonitor.cxx
MpdFemtoModelHiddenInfo.cxx
MpdFemtoBaseModelWeightGenerator.cxx
MpdFemtoPicoEvent.cxx
MpdFemtoBaseModelFreezeOutGenerator.cxx
MpdFemtoTriplet.cxx
MpdFemtoPicoEventCollectionVectorHideAway.cxx
MpdFemtoAnalysis.cxx
MpdFemtoBaseCorrFctn.cxx
MpdFemtoBaseCutMonitor.cxx
MpdFemtoBaseEventReader.cxx
MpdFemtoBaseModelFreezeOutGenerator.cxx
MpdFemtoBaseModelWeightGenerator.cxx
MpdFemtoCutMonitorHandler.cxx
MpdFemtoEvent.cxx
MpdFemtoHelix.cxx
MpdFemtoKink.cxx
MpdFemtoLikeSignAnalysis.cxx
MpdFemtoMaker.cxx
MpdFemtoManager.cxx
MpdFemtoModelGausLCMSFreezeOutGenerator.cxx
MpdFemtoModelHiddenInfo.cxx
MpdFemtoModelManager.cxx
MpdFemtoModelWeightGeneratorLednicky.cxx
MpdFemtoMultiTrackCut.cxx
MpdFemtoPair.cxx
MpdFemtoParticle.cxx
MpdFemtoPhysicalHelix.cxx
MpdFemtoPicoEvent.cxx
MpdFemtoPicoEventCollectionVectorHideAway.cxx
MpdFemtoReactionPlaneAnalysis.cxx
MpdFemtoTriplet.cxx
MpdFemtoVertexAnalysis.cxx
MpdFemtoVertexMultAnalysis.cxx
MpdFemtoXi.cxx
TpcLocalTransform.cxx
MpdFemtoKink.cxx
MpdFemtoTrack.cxx
MpdFemtoV0.cxx
)
Set(HEADERS)
Set(LINKDEF LinkDef.h)
Set(LIBRARY_NAME MpdFemtoBase)
Set(DEPENDENCIES Core Base Physics MpdBase MpdFsiTools)
Set(LINKDEF BaseLinkDef.h)
Set(LIBRARY_NAME MpdFemtoMaker)
Set(DEPENDENCIES Core Base MpdBase MpdFsiTools)
GENERATE_LIBRARY()
......@@ -6,6 +6,9 @@
#include <string>
#include <iostream>
#include <iterator>
#include <numeric>
#include <algorithm>
#include <random>
// MpdFemtoMaker headers
// Base
......@@ -50,17 +53,122 @@ MpdFemtoBaseCorrFctn* copyTheCorrFctn(MpdFemtoBaseCorrFctn*);
template <class TrackCollectionType, class TrackCutType>
void doFillParticleCollection(TrackCutType *cut,
TrackCollectionType *track_collection,
MpdFemtoParticleCollection *output) {
MpdFemtoParticleCollection *output, char doReshuffle) {
MpdFemtoParticleCollection* initPartCollection = new MpdFemtoParticleCollection();
for (const auto &track : *track_collection) {
const Bool_t track_passes = cut->pass(track);
cut->fillCutMonitor(track, track_passes);
if (track_passes) {
if (doReshuffle == 2)
initPartCollection->push_back(new MpdFemtoParticle(track, cut->mass()));
else
output->push_back(new MpdFemtoParticle(track, cut->mass()));
} //if (track_passes)
} //for (const auto &track : *track_collection)
//reshuffling implementation by means of reshuffling initPartCollection iterators in vector iterColl
if (initPartCollection && doReshuffle == 2) {
unsigned int collectionSize = initPartCollection->size();
std::vector<MpdFemtoParticleIterator>* iterColl = new std::vector<MpdFemtoParticleIterator>(collectionSize);
std::iota(iterColl->begin(), iterColl->end(), initPartCollection->begin()); //fill iterColl by iterators
// debug---->
// unsigned int iterCollSize = iterColl->size();
// if(collectionSize!=iterCollSize){
// std::cout<<"[ERROR]: Size of particles collection and size of iterators for this collection are different"<<
// "\nSomthing is wrong with function std::iota ..."<<std::endl;
// initPartCollection->clear();
// return;
// }
// <----debug
// Random generator initialization
std::random_device rd;
// Random generator initialization
std::mt19937 gen(rd());
std::shuffle(iterColl->begin(), iterColl->end(), gen);
// debug---->
// iterCollSize = iterColl->size();
// if(collectionSize!=iterCollSize){
// std::cout<<"[ERROR]: Size of iterators vector is changed after reshuffling"<<
// "\nSomthing is wrong with function std::reshuffle..."<<std::endl;
// initPartCollection->clear();
// return;
// }
// <----debug
for (vector <MpdFemtoParticleIterator>::iterator i = iterColl->begin(); i != iterColl->end(); i++) {
output->push_back((*(*i)));
}
// debug---->
// unsigned int outputSize = output->size();
// if(collectionSize!=outputSize){
// std::cout<<"[ERROR]: Size of particles collection is changed\n"<<
// "during convertion from iterators vector to result particles collection"<<std::endl;
// initPartCollection->clear();
// return;
// }
// <----debug
// debug printing BEGIN
// Let's check we don't lose any particle because of reshuffling process
// WARNING: Plain and really slow realization! Uncomment for debugging only
// Idea: at first we verify that resulting collection contains all poiners MpdFemtoParticle*
// from initial collection.
// If it's right reshuffling process is correct, if it's not we should check vector of
// iterators that participate
// in reshuffling: 1. vector should be filled correctly; 2. all iterators are in this
// vector after reshuffling algorithm.
// //Sizes of all collections have been already checked in code wrapped by "//debug---> //<---debug"
// bool found=0;
// unsigned int k=0, l=0;
// std::cout<<"Reshuffling result:"<<std::endl;
// for(MpdFemtoParticleIterator i = initPartCollection->begin(); i != initPartCollection->end(); i++){
// found=0;
// l=0;
// for(MpdFemtoParticleIterator j = output->begin(); j != output->end(); j++){
// if((*i)==(*j)){
// std::cout<<k<<"-"<<l<<" ";
// found=1;
// break;
// }
// l++;
// }//for(MpdFemtoParticleIterator j = output->begin(); j != output->end(); j++)
// if(found==0){
// std::cout<<"[ERROR]: "<<k<<" particle can't be found. Let's check inner processes...'"<<std::endl;
// break;
// }
// k++;
// }//for(MpdFemtoParticleIterator i = initPartCollection->begin(); i != initPartCollection->end(); i++)
// std::cout<<std::endl;
// if(found==0){
// //Vector of iterators verification
// k=0;
// for(MpdFemtoParticleIterator i = initPartCollection->begin(); i != initPartCollection->end(); i++){
// if((*i) != *(iterColl->at(k)) ){
// std::cout<<"[ERROR]: Wrong filling of iterators vector. Broken at "<<k<<" particle"<<
// "\nSomthing is wrong with function std::iota ..."<<std::endl;
// initPartCollection->clear();
// return;
// }
// k++;
// }//for(unsigned int i=0; i<collectionSize;i++)
// //If this point is reached it means some problems are in std::shuffle.
// std::cout<<"[ERROR]: std::shuffle loses some particles.\nYou lose."<<std::endl;
// }//if(found==0)
// else{
// std::cout<<"You win!\nReshuffling process is ok.\n"<<std::endl;
// }
// //debug printing END
initPartCollection->clear();
}//if(initPartCollection && doReshuffle==2)
}
/// This little function is used to apply ParticleCuts (TrackCuts or V0Cuts) and
......@@ -72,45 +180,36 @@ void doFillParticleCollection(TrackCutType *cut,
void fillHbtParticleCollection(MpdFemtoBaseParticleCut* partCut,
MpdFemtoEvent* hbtEvent,
MpdFemtoParticleCollection* partCollection) {
MpdFemtoParticleCollection* partCollection, char doReshuffle) {
// Selection of the particle types: Track, V0, Kink
switch (partCut->type()) {
case hbtTrack:
{
// Cut is cutting on Tracks
doFillParticleCollection((MpdFemtoBaseTrackCut*) partCut,
hbtEvent->trackCollection(),
partCollection);
}
partCollection, doReshuffle);
break;
case hbtV0:
{
// Cut is cutting on V0s
doFillParticleCollection((MpdFemtoBaseV0Cut*) partCut,
hbtEvent->v0Collection(),
partCollection);
}
partCollection, doReshuffle);
break;
case hbtXi:
{
// Cut is cutting on Xis
doFillParticleCollection((MpdFemtoBaseXiCut*) partCut,
hbtEvent->xiCollection(),
partCollection);
}
partCollection, doReshuffle);
break;
case hbtKink:
{
// Cut is cutting on Kinks
doFillParticleCollection((MpdFemtoBaseKinkCut*) partCut,
hbtEvent->kinkCollection(),
partCollection);
}
partCollection, doReshuffle);
break;
default:
std::cout << "fillHbtParticleCollection function (in MpdFemtoAnalysis.cxx): "
......@@ -128,7 +227,8 @@ mPairCut(nullptr), mCorrFctnCollection(nullptr),
mEventCut(nullptr), mFirstParticleCut(nullptr),
mSecondParticleCut(nullptr), mMixingBuffer(nullptr),
mPicoEvent(nullptr), mNumEventsToMix(0), mNeventsProcessed(0),
mMinSizePartCollection(0), mVerbose(false) {
mMinSizePartCollection(0), mReshuffle(1),
mVerbose(false) {
// Default constructor
mCorrFctnCollection = new MpdFemtoCorrFctnCollection;
mMixingBuffer = new MpdFemtoPicoEventCollection;
......@@ -148,6 +248,7 @@ mPicoEvent(nullptr),
mNumEventsToMix(a.mNumEventsToMix),
mNeventsProcessed(0),
mMinSizePartCollection(a.mMinSizePartCollection),
mReshuffle(a.mReshuffle),
mVerbose(a.mVerbose) {
// Copy constructor
const char msg_template[] = " MpdFemtoAnalysis::MpdFemtoAnalysis(const MpdFemtoAnalysis& a) - %s";
......@@ -308,6 +409,7 @@ MpdFemtoAnalysis& MpdFemtoAnalysis::operator=(const MpdFemtoAnalysis& ana) {
// Copy some numbers
mNumEventsToMix = ana.mNumEventsToMix;
mMinSizePartCollection = ana.mMinSizePartCollection;
mReshuffle = ana.mReshuffle;
mVerbose = ana.mVerbose;
} //if ( this != &ana )
......@@ -371,6 +473,33 @@ MpdFemtoBaseCorrFctn* MpdFemtoAnalysis::corrFctn(int n) {
return *iter;
}
//_________________________
MpdFemtoString MpdFemtoAnalysis::reshReport() {
string temp = "\nParticles reshuffling: ";
switch (MpdFemtoAnalysis::reshuffle()) {
case 0:
{
temp += "OFF";
break;
}
case 1:
{
temp += "ON, swapping particles in pairs\n";
break;
}
case 2:
{
temp += "ON, Fisher-Yates algorithm for particle collection\n";
break;
}
default:
temp += "[ERROR] MpdFemtoAnalsysis::mReshuffle has invalid value\n";
}
MpdFemtoString returnThis = temp;
return returnThis;
}
//_________________
MpdFemtoString MpdFemtoAnalysis::report() {
......@@ -379,6 +508,7 @@ MpdFemtoString MpdFemtoAnalysis::report() {
std::cout << "MpdFemtoAnalysis - constructing Report..."
<< std::endl;
string temp = "-----------\nHbt Analysis Report:\n";
temp += reshReport();
temp += "\nEvent Cuts:\n";
temp += mEventCut->report();
temp += "\nParticle Cuts - First Particle:\n";
......@@ -424,7 +554,6 @@ void MpdFemtoAnalysis::processEvent(const MpdFemtoEvent* hbtEvent) {
eventEnd(hbtEvent);
return;
}
// Analysis likes the event -- build a pico event from it, using tracks the
// analysis likes. This is what we will make pairs from and put in Mixing
// Buffer.
......@@ -434,7 +563,6 @@ void MpdFemtoAnalysis::processEvent(const MpdFemtoEvent* hbtEvent) {
MpdFemtoParticleCollection *collection1 = mPicoEvent->firstParticleCollection();
MpdFemtoParticleCollection *collection2 = mPicoEvent->secondParticleCollection();
// Sanity check that both collections exist
if (collection1 == nullptr || collection2 == nullptr) {
std::cout << "MpdFemtoAnalysis::processEvent - new PicoEvent is missing particle collections!"
......@@ -443,17 +571,16 @@ void MpdFemtoAnalysis::processEvent(const MpdFemtoEvent* hbtEvent) {
delete mPicoEvent;
return;
}
// Subroutine fills fPicoEvent'a FirstParticleCollection with tracks from
// hbtEvent which pass mFirstParticleCut. Uses cut's "type()" to determine
// which track collection to pull from hbtEvent.
fillHbtParticleCollection(mFirstParticleCut, (MpdFemtoEvent*) hbtEvent,
mPicoEvent->firstParticleCollection());
fillHbtParticleCollection(mFirstParticleCut, (MpdFemtoEvent*) hbtEvent,
mPicoEvent->firstParticleCollection(), mReshuffle);
// In case of non-identical particles
if (!(analyzeIdenticalParticles())) {
fillHbtParticleCollection(mSecondParticleCut, (MpdFemtoEvent*) hbtEvent,
mPicoEvent->secondParticleCollection());
mPicoEvent->secondParticleCollection(), mReshuffle);
}
if (mVerbose) {
......@@ -480,7 +607,6 @@ void MpdFemtoAnalysis::processEvent(const MpdFemtoEvent* hbtEvent) {
}
//------ Make real pairs. If identical, make pairs for one collection ------//
if (analyzeIdenticalParticles()) {
makePairs("real", mPicoEvent->firstParticleCollection());
} else {
......@@ -496,7 +622,6 @@ void MpdFemtoAnalysis::processEvent(const MpdFemtoEvent* hbtEvent) {
MpdFemtoPicoEvent* storedEvent;
MpdFemtoPicoEventIterator mPicoEventIter;
for (mPicoEventIter = mixingBuffer()->begin();
mPicoEventIter != mixingBuffer()->end(); mPicoEventIter++) {
......@@ -543,12 +668,8 @@ void MpdFemtoAnalysis::makePairs(const char* typeIn,
// specfied, make pairs within first particle collection.
const string type = typeIn;
// Used to swap particle 1 & 2 in identical-particle analysis
// to avoid any implicit ordering in the event collection
// "Seed" this here.
bool swpart = mNeventsProcessed % 2;
// Create the pair outside the loop
MpdFemtoPair* ThePair = new MpdFemtoPair;
......@@ -587,15 +708,13 @@ void MpdFemtoAnalysis::makePairs(const char* typeIn,
}
// If we have two collections - set the first track
if (partCollection2 != nullptr) {
if (mReshuffle != 1 || partCollection2 != nullptr) {
ThePair->setTrack1(*PartIter1);
}
// Start the inner loop
for (PartIter2 = StartInnerLoop; PartIter2 != EndInnerLoop; PartIter2++) {
// If we have two collections - only set the second track
if (partCollection2 != nullptr) {
//If we have two collections - only set the second track
if (mReshuffle != 1 || partCollection2 != nullptr) {
ThePair->setTrack2(*PartIter2);
} else {
// Swap between first and second particles to avoid biased ordering
......@@ -603,9 +722,9 @@ void MpdFemtoAnalysis::makePairs(const char* typeIn,
ThePair->setTrack2(swpart ? *PartIter1 : *PartIter2);
swpart = !swpart;
}
// Check if the pair passes the cut
bool tmpPassPair = mPairCut->pass(ThePair);
mPairCut->fillCutMonitor(ThePair, tmpPassPair);
// If pair passes cut, loop over CF's and add pair to real/mixed
......@@ -635,6 +754,28 @@ void MpdFemtoAnalysis::makePairs(const char* typeIn,
//_________________
void MpdFemtoAnalysis::setReshuffle(unsigned int type) {
if (type > 2) {
std::cout << "[WARNING] MpdFemtoAnalsysis::setReshuffle -- Bad reshuffling value \n Resetting...\n";
mReshuffle = 1;
} else {
if (type == 0) {
mReshuffle = 0;
return;
}
if (type == 1) {
mReshuffle = 1;
return;
}
if (type == 2) {
mReshuffle = 2;
return;
}
}
}
//_________________
void MpdFemtoAnalysis::eventBegin(const MpdFemtoEvent* ev) {
// Perform initialization operations at the beginning of the event processing
......@@ -778,5 +919,3 @@ TList* MpdFemtoAnalysis::getOutputList() {
return tOutputList;
}
ClassImp(MpdFemtoAnalysis)
......@@ -38,6 +38,7 @@
#include "MpdFemtoBaseEventCut.h"
#include "MpdFemtoBaseParticleCut.h"
#include "MpdFemtoBaseCorrFctn.h"
// Infrustructure classes
#include "MpdFemtoCorrFctnCollection.h"
#include "MpdFemtoPicoEventCollection.h"
......@@ -127,12 +128,18 @@ public:
void setMinSizePartCollection(unsigned int& minSize) {
mMinSizePartCollection = minSize;
}
/// Set Reshuffling mode for particles
/// \par 0 as is (do not swap of reshuffle particles)
/// \par 1 swap particles from pair
/// \par 2 reshuffle using Fisher Yates algorythm
void setReshuffle(unsigned int type = 1);
/// Set verbose mode
void setVerboseMode(const bool& isVerbose) {
mVerbose = isVerbose;
}
/// Return size of the event buffer to mix
unsigned int numEventsToMix() {
......@@ -163,7 +170,13 @@ public:
bool analyzeIdenticalParticles() {
return (mFirstParticleCut == mSecondParticleCut);
}
///Returns particles reshuffling type
char reshuffle() {
return mReshuffle;
}
/// Returns report of reshuffle settings
MpdFemtoString reshReport();
/// Returns reports of all cuts applied and correlation functions being done
virtual MpdFemtoString report();
/// Return list of cut settings for the analysis
......@@ -241,6 +254,13 @@ protected:
unsigned int mNeventsProcessed;
/// Minimum # particles in ParticleCollection
unsigned int mMinSizePartCollection;
/// Particles Reshuffling
///0 - no reshuffling
///1 - swapping particles in pairs
///2 - Fisher–Yates shuffling algorithm for particle collection
/// default: mReshuffle=1
char mReshuffle;
/// Print info
bool mVerbose;
......
......@@ -5,7 +5,6 @@
#include "MpdFemtoBaseCorrFctn.h"
//_________________
MpdFemtoBaseCorrFctn::MpdFemtoBaseCorrFctn() :
mBaseAnalysis(nullptr),
mPairCut(nullptr) {
......
......@@ -14,7 +14,6 @@
#include "MpdFemtoEvent.h"
//_________________
MpdFemtoBaseEventReader::MpdFemtoBaseEventReader() :
mEventCut(nullptr),
mTrackCut(nullptr),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment